git.lucas.co / cce-fonts
font browser

commit615183df4d26417af87d5aec40378e8727e14e71
parentb39035a426
authorLucas Galante <[email protected]>
date2026-06-28 05:22
Remove sidebar and keybindings page, make Browse page fill the layout

 src/main.rs | 583 ++++++++++++++++++++++--------------------------------------
 1 file changed, 213 insertions(+), 370 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 0a90871..05794b8 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,36 +6,11 @@ use cce_ui::engine::{Application, EngineState, LogicalPosition, LogicalSize, Win
 use cce_ui::widget::{
     MouseButton, ElementState, MouseScrollDelta, KeyEvent, TextItem, Element,
     TextBox, Button, TextLabel, Key, NamedKey, ScrollingList, Dropdown, Slider,
-    Paginator, Backplate, Plate, PageSelector, MenuController
+    Backplate, Plate
 };
 use cce_ui::widget::focus::link_parent_child;
 
-#[derive(Debug, Clone, Copy, PartialEq, Eq)]
-pub enum Page {
-    Browse,
-    Keybindings,
-}
 
-impl Page {
-    pub const ALL: [Page; 2] = [
-        Page::Browse,
-        Page::Keybindings,
-    ];
-
-    pub fn label(self) -> &'static str {
-        match self {
-            Page::Browse => "Browse",
-            Page::Keybindings => "Keys",
-        }
-    }
-
-    pub fn icon(self) -> &'static str {
-        match self {
-            Page::Browse => "🔤",
-            Page::Keybindings => "⌨",
-        }
-    }
-}
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 pub enum BrowseNavigation {
@@ -47,7 +22,6 @@ pub enum BrowseNavigation {
 #[allow(dead_code)]
 enum AppMessage {
     Exit,
-    SwitchPage(Page),
     SelectFamily(usize),
     SelectStyle(usize),
     FontSizeChanged,
@@ -58,9 +32,6 @@ enum AppMessage {
 }
 
 struct TypefaceApp {
-    // Sidebar
-    paginator: Paginator,
-
     // Browse panel
     search_box: TextBox,
     font_list: ScrollingList,
@@ -83,7 +54,6 @@ struct TypefaceApp {
     click_timer: f32,
 
     // State
-    current_page: Page,
     all_fonts: Vec<pages::FontEntry>,
     families: Vec<String>,
     filtered: Vec<String>,
@@ -168,7 +138,6 @@ impl TypefaceApp {
         self.bottom_bar.clear_children(ctx);
 
         // 1. Link active page-level containers to root
-        link_parent_child(&mut self.root_window, &mut self.paginator, ctx);
         link_parent_child(&mut self.root_window, &mut self.left_panel, ctx);
         link_parent_child(&mut self.root_window, &mut self.mid_panel, ctx);
         link_parent_child(&mut self.root_window, &mut self.right_panel, ctx);
@@ -177,36 +146,34 @@ impl TypefaceApp {
             link_parent_child(&mut self.root_window, &mut self.bottom_bar, ctx);
         }
 
-        if self.current_page == Page::Browse {
-            // Left Panel (Browse list)
-            link_parent_child(&mut self.left_panel, &mut self.search_box, ctx);
-            link_parent_child(&mut self.left_panel, &mut self.font_list, ctx);
-            
-            // Scrolling list buttons
-            for btn in &mut self.font_buttons {
-                if btn.rect().0 > -9000.0 {
-                    link_parent_child(&mut self.left_panel, btn, ctx);
-                }
+        // Left Panel (Browse list)
+        link_parent_child(&mut self.left_panel, &mut self.search_box, ctx);
+        link_parent_child(&mut self.left_panel, &mut self.font_list, ctx);
+        
+        // Scrolling list buttons
+        for btn in &mut self.font_buttons {
+            if btn.rect().0 > -9000.0 {
+                link_parent_child(&mut self.left_panel, btn, ctx);
             }
+        }
 
-            // Middle Panel (Preview)
-            if self.selected_family.is_some() {
-                link_parent_child(&mut self.mid_panel, &mut self.style_dropdown, ctx);
-                link_parent_child(&mut self.mid_panel, &mut self.size_slider, ctx);
-                link_parent_child(&mut self.mid_panel, &mut self.preview_box, ctx);
-            }
+        // Middle Panel (Preview)
+        if self.selected_family.is_some() {
+            link_parent_child(&mut self.mid_panel, &mut self.style_dropdown, ctx);
+            link_parent_child(&mut self.mid_panel, &mut self.size_slider, ctx);
+            link_parent_child(&mut self.mid_panel, &mut self.preview_box, ctx);
+        }
 
-            // Right Panel (Details)
-            if self.selected_family.is_some() {
-                link_parent_child(&mut self.right_panel, &mut self.btn_open_folder, ctx);
-                link_parent_child(&mut self.right_panel, &mut self.btn_remove_font, ctx);
-            }
+        // Right Panel (Details)
+        if self.selected_family.is_some() {
+            link_parent_child(&mut self.right_panel, &mut self.btn_open_folder, ctx);
+            link_parent_child(&mut self.right_panel, &mut self.btn_remove_font, ctx);
+        }
 
-            // Bottom bar
-            if self.select_mode {
-                link_parent_child(&mut self.bottom_bar, &mut self.select_cancel_btn, ctx);
-                link_parent_child(&mut self.bottom_bar, &mut self.select_confirm_btn, ctx);
-            }
+        // Bottom bar
+        if self.select_mode {
+            link_parent_child(&mut self.bottom_bar, &mut self.select_cancel_btn, ctx);
+            link_parent_child(&mut self.bottom_bar, &mut self.select_confirm_btn, ctx);
         }
     }
 
@@ -328,7 +295,6 @@ impl TypefaceApp {
         let font_system = &mut self.font_system;
 
         // Ensure all widgets have their text prepared/shaped
-        self.paginator.prepare_text(font_system);
         self.search_box.prepare_text(font_system);
         self.font_list.prepare_text(font_system);
         for btn in &mut self.font_buttons {
@@ -344,142 +310,80 @@ impl TypefaceApp {
 
         let mut labels = Vec::new();
 
-        // 1. Sidebar Page Buttons
-        labels.extend(self.paginator.text_labels_with_bounds(&self.ui_context));
+        // Page Content
+        labels.extend(self.left_panel.text_labels_with_bounds(&self.ui_context));
+        labels.extend(self.mid_panel.text_labels_with_bounds(&self.ui_context));
+        labels.extend(self.right_panel.text_labels_with_bounds(&self.ui_context));
 
-        // 2. Page Content
-        if self.current_page == Page::Browse {
-            labels.extend(self.left_panel.text_labels_with_bounds(&self.ui_context));
-            labels.extend(self.mid_panel.text_labels_with_bounds(&self.ui_context));
-            labels.extend(self.right_panel.text_labels_with_bounds(&self.ui_context));
+        if self.select_mode {
+            labels.extend(self.bottom_bar.text_labels_with_bounds(&self.ui_context));
+        }
 
-            if self.select_mode {
-                labels.extend(self.bottom_bar.text_labels_with_bounds(&self.ui_context));
+        // Render Dropdown popover labels if open
+        if self.style_dropdown.open && self.selected_family.is_some() {
+            let mut pc = cce_ui::layout::PopoverCollector::new();
+            self.style_dropdown.render_popover(&mut pc);
+            for (content, size, tx, ty, color, _font, _bounds) in pc.texts {
+                let color_u8 = [
+                    (color[0] * 255.0).clamp(0.0, 255.0) as u8,
+                    (color[1] * 255.0).clamp(0.0, 255.0) as u8,
+                    (color[2] * 255.0).clamp(0.0, 255.0) as u8,
+                ];
+                labels.push((TextLabel {
+                    text: content,
+                    x: tx,
+                    y: ty,
+                    font_size: size,
+                    color: color_u8,
+                }, None));
             }
+        }
 
-            // Render Dropdown popover labels if open
-            if self.style_dropdown.open && self.selected_family.is_some() {
-                let mut pc = cce_ui::layout::PopoverCollector::new();
-                self.style_dropdown.render_popover(&mut pc);
-                for (content, size, tx, ty, color, _font, _bounds) in pc.texts {
-                    let color_u8 = [
-                        (color[0] * 255.0).clamp(0.0, 255.0) as u8,
-                        (color[1] * 255.0).clamp(0.0, 255.0) as u8,
-                        (color[2] * 255.0).clamp(0.0, 255.0) as u8,
-                    ];
-                    labels.push((TextLabel {
-                        text: content,
-                        x: tx,
-                        y: ty,
-                        font_size: size,
-                        color: color_u8,
-                    }, None));
+        // Alphabet preview
+        if let Some(ref family) = self.selected_family {
+            let font_size = self.size_slider.get_scaled_value();
+            let mut style_val = None;
+            let mut weight_val = None;
+            if let Some(ref style) = self.selected_style {
+                let sl = style.to_lowercase();
+                if sl.contains("italic") || sl.contains("oblique") {
+                    style_val = Some(glyphon::Style::Italic);
                 }
-            }
-
-            // Alphabet preview
-            if let Some(ref family) = self.selected_family {
-                let font_size = self.size_slider.get_scaled_value();
-                let mut style_val = None;
-                let mut weight_val = None;
-                if let Some(ref style) = self.selected_style {
-                    let sl = style.to_lowercase();
-                    if sl.contains("italic") || sl.contains("oblique") {
-                        style_val = Some(glyphon::Style::Italic);
-                    }
-                    if sl.contains("bold") {
-                        weight_val = Some(glyphon::Weight::BOLD);
-                    } else if sl.contains("light") {
-                        weight_val = Some(glyphon::Weight::LIGHT);
-                    } else if sl.contains("medium") {
-                        weight_val = Some(glyphon::Weight::MEDIUM);
-                    }
+                if sl.contains("bold") {
+                    weight_val = Some(glyphon::Weight::BOLD);
+                } else if sl.contains("light") {
+                    weight_val = Some(glyphon::Weight::LIGHT);
+                } else if sl.contains("medium") {
+                    weight_val = Some(glyphon::Weight::MEDIUM);
                 }
-
-                let alphabet_text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n0123456789\n!@#$%^&*()_+-=[]{}|;':\",./<>";
-                let alph_buf = make_text_buffer_with_font(
-                    font_system,
-                    alphabet_text,
-                    (font_size * 0.55).clamp(8.0, 36.0),
-                    Some(family),
-                    style_val,
-                    weight_val,
-                );
-                
-                let mid_panel_w = self.right_panel.base.base.x - 12.0 - self.mid_panel.base.base.x;
-                let preview_box_x = self.mid_panel.base.base.x + 10.0;
-                let preview_box_w = mid_panel_w - 20.0;
-                let alphabet_box_y = if self.select_mode { 320.0 } else { 380.0 };
-                let alphabet_box_h = if self.select_mode { 102.0 } else { 120.0 };
-
-                self.text_items.push(TextItem {
-                    buffer: preview_text_buffer_clamped(alph_buf, font_system, mid_panel_w - 40.0),
-                    x: self.mid_panel.base.base.x + 20.0,
-                    y: alphabet_box_y + 12.0,
-                    color: glyphon::Color::rgb(0x88, 0x88, 0x99),
-                    bounds: Some([preview_box_x, alphabet_box_y, preview_box_x + preview_box_w, alphabet_box_y + alphabet_box_h]),
-                });
             }
-        } else if self.current_page == Page::Keybindings {
-            labels.push((TextLabel {
-                text: "Keybindings".to_string(),
-                x: 220.0,
-                y: 30.0,
-                font_size: 18.0,
-                color: [0x5c, 0x90, 0x60],
-            }, None));
 
-            let sections: [(&str, &[(&str, &str)]); 3] = [
-                ("🧭 Navigation", &[
-                    ("Ctrl + F", "Search fonts"),
-                    ("Up / Down", "Navigate font list"),
-                    ("Enter", "Select font"),
-                    ("Ctrl + 1-2", "Switch page"),
-                ]),
-                ("👁 Preview", &[
-                    ("+ / -", "Increase / decrease font size"),
-                    ("Ctrl + E", "Edit preview text"),
-                ]),
-                ("⚡ Actions", &[
-                    ("Ctrl + O", "Open font folder"),
-                    ("Delete", "Remove user font"),
-                    ("Ctrl + R / F5", "Refresh font list"),
-                ]),
-            ];
+            let alphabet_text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\nabcdefghijklmnopqrstuvwxyz\n0123456789\n!@#$%^&*()_+-=[]{}|;':\",./<>";
+            let alph_buf = make_text_buffer_with_font(
+                font_system,
+                alphabet_text,
+                (font_size * 0.55).clamp(8.0, 36.0),
+                Some(family),
+                style_val,
+                weight_val,
+            );
+            
+            let mid_panel_w = self.right_panel.base.base.x - 12.0 - self.mid_panel.base.base.x;
+            let preview_box_x = self.mid_panel.base.base.x + 10.0;
+            let preview_box_w = mid_panel_w - 20.0;
+            let alphabet_box_y = if self.select_mode { 320.0 } else { 380.0 };
+            let alphabet_box_h = if self.select_mode { 102.0 } else { 120.0 };
 
-            let mut y_offset = 70.0;
-            for (sec_title, bindings) in &sections {
-                labels.push((TextLabel {
-                    text: sec_title.to_string(),
-                    x: 220.0,
-                    y: y_offset,
-                    font_size: 14.0,
-                    color: [0xdd, 0xdd, 0xe2],
-                }, None));
-                y_offset += 24.0;
-
-                for (keys, action) in *bindings {
-                    labels.push((TextLabel {
-                        text: keys.to_string(),
-                        x: 230.0,
-                        y: y_offset,
-                        font_size: 12.0,
-                        color: [0x5c, 0x90, 0x60],
-                    }, None));
-                    labels.push((TextLabel {
-                        text: action.to_string(),
-                        x: 370.0,
-                        y: y_offset,
-                        font_size: 12.0,
-                        color: [0x88, 0x88, 0x99],
-                    }, None));
-                    y_offset += 20.0;
-                }
-                y_offset += 16.0;
-            }
+            self.text_items.push(TextItem {
+                buffer: preview_text_buffer_clamped(alph_buf, font_system, mid_panel_w - 40.0),
+                x: self.mid_panel.base.base.x + 20.0,
+                y: alphabet_box_y + 12.0,
+                color: glyphon::Color::rgb(0x88, 0x88, 0x99),
+                bounds: Some([preview_box_x, alphabet_box_y, preview_box_x + preview_box_w, alphabet_box_y + alphabet_box_h]),
+            });
         }
 
-        if self.current_page == Page::Browse && self.select_mode {
+        if self.select_mode {
             let left_panel_x = self.left_panel.base.base.x;
             let bar_y = self.height as f32 - 48.0 - 10.0;
             labels.push((TextLabel {
@@ -539,11 +443,6 @@ impl Application for TypefaceApp {
         let args: Vec<String> = std::env::args().collect();
         let select_mode = args.iter().any(|arg| arg == "--select");
 
-        let paginator = Paginator::new(vec![
-            "Browse".to_string(),
-            "Keys".to_string(),
-        ]);
-
         let mut search_box = TextBox::new(String::new()).with_multiline(false).with_draw_bg_border(true);
         search_box.font_size = 12.0;
 
@@ -565,7 +464,6 @@ impl Application for TypefaceApp {
 
         let all_fonts = pages::fetch_fonts();
         let mut app = Self {
-            paginator,
             search_box,
             font_list,
             font_buttons: Vec::new(),
@@ -579,7 +477,6 @@ impl Application for TypefaceApp {
             select_mode,
             last_click_idx: None,
             click_timer: 0.0,
-            current_page: Page::Browse,
             all_fonts: all_fonts.clone(),
             families: Vec::new(),
             filtered: Vec::new(),
@@ -681,16 +578,6 @@ impl Application for TypefaceApp {
             AppMessage::Exit => {
                 *exit = true;
             }
-            AppMessage::SwitchPage(page) => {
-                self.current_page = page;
-                let page_idx = match page {
-                    Page::Browse => 0,
-                    Page::Keybindings => 1,
-                };
-                self.paginator.set_selected_page(page_idx);
-                *needs_rebuild = true;
-                self.needs_rebuild = true;
-            }
             AppMessage::SelectFamily(idx) => {
                 if idx < self.filtered.len() {
                     self.selected_idx = Some(idx);
@@ -774,17 +661,13 @@ impl Application for TypefaceApp {
         }
     }
 
-    fn tick(&mut self, dt: f32, needs_rebuild: &mut bool) {
+    fn tick(&mut self, dt: f32, _needs_rebuild: &mut bool) {
         if self.click_timer > 0.0 {
             self.click_timer -= dt;
         }
-        if self.paginator.tick(dt, &mut self.ui_context) {
-            *needs_rebuild = true;
-            self.needs_rebuild = true;
-        }
     }
 
-    fn view(&mut self, quads: &mut Vec<(f32, f32, f32, f32, [f32; 4])>, size: LogicalSize, scale: f64) {
+        fn view(&mut self, quads: &mut Vec<(f32, f32, f32, f32, [f32; 4])>, size: LogicalSize, scale: f64) {
         let size_changed = self.width != size.width as u32 || self.height != size.height as u32 || self.scale_factor != scale;
         if self.needs_rebuild || size_changed {
             self.width = size.width as u32;
@@ -795,8 +678,7 @@ impl Application for TypefaceApp {
         let w_f32 = self.width as f32;
         let h_f32 = self.height as f32;
 
-        let sidebar_w = self.paginator.sidebar_w();
-        let left_panel_x = sidebar_w + 10.0;
+        let left_panel_x = 10.0;
         let left_panel_w = 270.0;
         let right_panel_w = 286.0;
         let right_panel_x = w_f32 - 10.0 - right_panel_w;
@@ -815,7 +697,6 @@ impl Application for TypefaceApp {
             self.root_window.set_rect(0.0, 0.0, w_f32, h_f32);
             self.root_window.background_color = Some(cce_ui::colors::page_low_color());
             self.root_window.radius = cce_ui::colors::backplate_corner_radius();
-            self.paginator.set_rect(0.0, 0.0, sidebar_w, h_f32);
 
             // Position panel Plates
             self.left_panel.set_rect(left_panel_x, 10.0, left_panel_w, content_h);
@@ -823,52 +704,50 @@ impl Application for TypefaceApp {
             self.right_panel.set_rect(right_panel_x, 10.0, right_panel_w, content_h);
 
             let bar_y = h_f32 - select_bar_h - 10.0;
-            self.bottom_bar.set_rect(left_panel_x, bar_y, w_f32 - 76.0, select_bar_h);
+            self.bottom_bar.set_rect(left_panel_x, bar_y, w_f32 - 20.0, select_bar_h);
 
             // Configure Plate visibility
-            self.left_panel.visible = self.current_page == Page::Browse;
-            self.mid_panel.visible = self.current_page == Page::Browse;
-            self.right_panel.visible = self.current_page == Page::Browse;
-            self.bottom_bar.visible = self.current_page == Page::Browse && self.select_mode;
-
-            if self.current_page == Page::Browse {
-                // Search box
-                self.search_box.set_rect(left_panel_x + 10.0, 10.0, left_panel_w - 20.0, 26.0);
-
-                // Scrolling List
-                let list_x = left_panel_x + 10.0;
-                let list_y = 60.0;
-                let list_w = left_panel_w - 20.0;
-                let list_h = (content_h - 50.0).max(100.0);
-                self.font_list.set_rect(list_x, list_y, list_w, list_h);
-                self.font_list.update_bounds(self.filtered.len(), list_y, list_h);
-
-                // Layout list buttons
-                for (idx, btn) in self.font_buttons.iter_mut().enumerate() {
-                    if let Some(draw_y) = self.font_list.get_item_draw_y(idx, 0.0) {
-                        btn.set_rect(list_x + 4.0, draw_y, list_w - 8.0, 24.0);
-                    } else {
-                        btn.set_rect(-9999.0, -9999.0, 0.0, 0.0);
-                    }
+            self.left_panel.visible = true;
+            self.mid_panel.visible = true;
+            self.right_panel.visible = true;
+            self.bottom_bar.visible = self.select_mode;
+
+            // Search box
+            self.search_box.set_rect(left_panel_x + 10.0, 10.0, left_panel_w - 20.0, 26.0);
+
+            // Scrolling List
+            let list_x = left_panel_x + 10.0;
+            let list_y = 60.0;
+            let list_w = left_panel_w - 20.0;
+            let list_h = (content_h - 50.0).max(100.0);
+            self.font_list.set_rect(list_x, list_y, list_w, list_h);
+            self.font_list.update_bounds(self.filtered.len(), list_y, list_h);
+
+            // Layout list buttons
+            for (idx, btn) in self.font_buttons.iter_mut().enumerate() {
+                if let Some(draw_y) = self.font_list.get_item_draw_y(idx, 0.0) {
+                    btn.set_rect(list_x + 4.0, draw_y, list_w - 8.0, 24.0);
+                } else {
+                    btn.set_rect(-9999.0, -9999.0, 0.0, 0.0);
                 }
+            }
 
-                // Preview panel widgets
-                let style_dropdown_h = cce_ui::layout::dropdown_height() + cce_ui::widget::label_offset(&self.style_dropdown);
-                self.style_dropdown.set_rect(mid_panel_x + 10.0, 65.0, mid_panel_w - 20.0, style_dropdown_h);
+            // Preview panel widgets
+            let style_dropdown_h = cce_ui::layout::dropdown_height() + cce_ui::widget::label_offset(&self.style_dropdown);
+            self.style_dropdown.set_rect(mid_panel_x + 10.0, 65.0, mid_panel_w - 20.0, style_dropdown_h);
 
-                let size_slider_h = cce_ui::layout::slider_height() + cce_ui::widget::label_offset(&self.size_slider);
-                self.size_slider.set_rect(mid_panel_x + 10.0, 120.0, mid_panel_w - 20.0, size_slider_h);
-                let preview_box_h = if self.select_mode { 120.0 } else { 180.0 };
-                self.preview_box.set_rect(mid_panel_x + 10.0, 190.0, mid_panel_w - 20.0, preview_box_h);
+            let size_slider_h = cce_ui::layout::slider_height() + cce_ui::widget::label_offset(&self.size_slider);
+            self.size_slider.set_rect(mid_panel_x + 10.0, 120.0, mid_panel_w - 20.0, size_slider_h);
+            let preview_box_h = if self.select_mode { 120.0 } else { 180.0 };
+            self.preview_box.set_rect(mid_panel_x + 10.0, 190.0, mid_panel_w - 20.0, preview_box_h);
 
-                // Details panel buttons
-                self.btn_open_folder.set_rect(right_panel_x + 10.0, 200.0, 110.0, 28.0);
-                self.btn_remove_font.set_rect(right_panel_x + 130.0, 200.0, 110.0, 28.0);
+            // Details panel buttons
+            self.btn_open_folder.set_rect(right_panel_x + 10.0, 200.0, 110.0, 28.0);
+            self.btn_remove_font.set_rect(right_panel_x + 130.0, 200.0, 110.0, 28.0);
 
-                if self.select_mode {
-                    self.select_cancel_btn.set_rect(w_f32 - 190.0, bar_y + 10.0, 80.0, 28.0);
-                    self.select_confirm_btn.set_rect(w_f32 - 100.0, bar_y + 10.0, 80.0, 28.0);
-                }
+            if self.select_mode {
+                self.select_cancel_btn.set_rect(w_f32 - 190.0, bar_y + 10.0, 80.0, 28.0);
+                self.select_confirm_btn.set_rect(w_f32 - 100.0, bar_y + 10.0, 80.0, 28.0);
             }
 
             self.rebuild_hierarchy();
@@ -878,7 +757,6 @@ impl Application for TypefaceApp {
 
         let base_low = cce_ui::colors::page_low_color();
         let border_col = cce_ui::colors::color_borders_color();
-        let sidebar_bg = cce_ui::colors::sidebar_bg_color();
 
         // 1. General window background
         let bg_color = [
@@ -889,11 +767,7 @@ impl Application for TypefaceApp {
         ];
         quads.push((0.0, 0.0, w_f32, h_f32, bg_color));
 
-        // 2. Sidebar background panel
-        quads.push((0.0, 0.0, sidebar_w, h_f32, sidebar_bg));
-        quads.push((sidebar_w, 0.0, 1.0, h_f32, border_col)); // sidebar separator
-
-        // Draw active containers and all child widgets (including paginator and panel plates)
+        // Draw active containers and all child widgets (including panel plates)
         for &child_ptr in &self.root_window.children {
             unsafe {
                 if let Some(child) = child_ptr.as_ref() {
@@ -905,70 +779,62 @@ impl Application for TypefaceApp {
         }
 
         // 5. Page Content Outline Borders
-        if self.current_page == Page::Browse {
-            // Left Panel Borders
-            quads.push((left_panel_x, 10.0, left_panel_w, 1.0, border_col));
-            quads.push((left_panel_x, 10.0 + content_h, left_panel_w, 1.0, border_col));
-            quads.push((left_panel_x, 10.0, 1.0, content_h, border_col));
-            quads.push((left_panel_x + left_panel_w, 10.0, 1.0, content_h, border_col));
-
-            // Middle Panel Borders
-            quads.push((mid_panel_x, 10.0, mid_panel_w, 1.0, border_col));
-            quads.push((mid_panel_x, 10.0 + content_h, mid_panel_w, 1.0, border_col));
-            quads.push((mid_panel_x, 10.0, 1.0, content_h, border_col));
-            quads.push((mid_panel_x + mid_panel_w, 10.0, 1.0, content_h, border_col));
-
-            if self.selected_family.is_some() {
-                // Alphabet preview box background & borders
-                let preview_box_x = mid_panel_x + 10.0;
-                let preview_box_w = mid_panel_w - 20.0;
-                let alphabet_box_y = if self.select_mode { 320.0 } else { 380.0 };
-                let alphabet_box_h = if self.select_mode { 102.0 } else { 120.0 };
-
-                let alphabet_bg = [
-                    base_low[0] * 0.9,
-                    base_low[1] * 0.9,
-                    base_low[2] * 0.9,
-                    1.0,
-                ];
-                let alphabet_border = [
-                    border_col[0] * 0.85,
-                    border_col[1] * 0.85,
-                    border_col[2] * 0.85,
-                    1.0,
-                ];
+        // Left Panel Borders
+        quads.push((left_panel_x, 10.0, left_panel_w, 1.0, border_col));
+        quads.push((left_panel_x, 10.0 + content_h, left_panel_w, 1.0, border_col));
+        quads.push((left_panel_x, 10.0, 1.0, content_h, border_col));
+        quads.push((left_panel_x + left_panel_w, 10.0, 1.0, content_h, border_col));
+
+        // Middle Panel Borders
+        quads.push((mid_panel_x, 10.0, mid_panel_w, 1.0, border_col));
+        quads.push((mid_panel_x, 10.0 + content_h, mid_panel_w, 1.0, border_col));
+        quads.push((mid_panel_x, 10.0, 1.0, content_h, border_col));
+        quads.push((mid_panel_x + mid_panel_w, 10.0, 1.0, content_h, border_col));
+
+        if self.selected_family.is_some() {
+            // Alphabet preview box background & borders
+            let preview_box_x = mid_panel_x + 10.0;
+            let preview_box_w = mid_panel_w - 20.0;
+            let alphabet_box_y = if self.select_mode { 320.0 } else { 380.0 };
+            let alphabet_box_h = if self.select_mode { 102.0 } else { 120.0 };
+
+            let alphabet_bg = [
+                base_low[0] * 0.9,
+                base_low[1] * 0.9,
+                base_low[2] * 0.9,
+                1.0,
+            ];
+            let alphabet_border = [
+                border_col[0] * 0.85,
+                border_col[1] * 0.85,
+                border_col[2] * 0.85,
+                1.0,
+            ];
 
-                quads.push((preview_box_x, alphabet_box_y, preview_box_w, alphabet_box_h, alphabet_bg)); // alphabet box bg
-                quads.push((preview_box_x, alphabet_box_y, preview_box_w, 1.0, alphabet_border));
-                quads.push((preview_box_x, alphabet_box_y + alphabet_box_h, preview_box_w, 1.0, alphabet_border));
-                quads.push((preview_box_x, alphabet_box_y, 1.0, alphabet_box_h, alphabet_border));
-                quads.push((preview_box_x + preview_box_w, alphabet_box_y, 1.0, alphabet_box_h, alphabet_border));
-            }
+            quads.push((preview_box_x, alphabet_box_y, preview_box_w, alphabet_box_h, alphabet_bg)); // alphabet box bg
+            quads.push((preview_box_x, alphabet_box_y, preview_box_w, 1.0, alphabet_border));
+            quads.push((preview_box_x, alphabet_box_y + alphabet_box_h, preview_box_w, 1.0, alphabet_border));
+            quads.push((preview_box_x, alphabet_box_y, 1.0, alphabet_box_h, alphabet_border));
+            quads.push((preview_box_x + preview_box_w, alphabet_box_y, 1.0, alphabet_box_h, alphabet_border));
+        }
 
-            // Right Panel Borders
-            quads.push((right_panel_x, 10.0, right_panel_w, 1.0, border_col));
-            quads.push((right_panel_x, 10.0 + content_h, right_panel_w, 1.0, border_col));
-            quads.push((right_panel_x, 10.0, 1.0, content_h, border_col));
-            quads.push((right_panel_x + right_panel_w, 10.0, 1.0, content_h, border_col));
+        // Right Panel Borders
+        quads.push((right_panel_x, 10.0, right_panel_w, 1.0, border_col));
+        quads.push((right_panel_x, 10.0 + content_h, right_panel_w, 1.0, border_col));
+        quads.push((right_panel_x, 10.0, 1.0, content_h, border_col));
+        quads.push((right_panel_x + right_panel_w, 10.0, 1.0, content_h, border_col));
 
-            if self.select_mode {
-                let bar_y = h_f32 - select_bar_h - 10.0;
-                // Draw bottom bar separator and side borders
-                quads.push((left_panel_x, bar_y, w_f32 - 76.0, 1.0, border_col));
-                quads.push((left_panel_x, bar_y, 1.0, 48.0, border_col));
-                quads.push((w_f32 - 10.0, bar_y, 1.0, 48.0, border_col));
-            }
-        } else if self.current_page == Page::Keybindings {
-            // Keybindings page borders
-            quads.push((210.0, 10.0, w_f32 - 220.0, 1.0, border_col));
-            quads.push((210.0, h_f32 - 10.0, w_f32 - 220.0, 1.0, border_col));
-            quads.push((210.0, 10.0, 1.0, h_f32 - 20.0, border_col));
-            quads.push((w_f32 - 10.0, 10.0, 1.0, h_f32 - 20.0, border_col));
+        if self.select_mode {
+            let bar_y = h_f32 - select_bar_h - 10.0;
+            // Draw bottom bar separator and side borders
+            quads.push((left_panel_x, bar_y, w_f32 - 20.0, 1.0, border_col));
+            quads.push((left_panel_x, bar_y, 1.0, 48.0, border_col));
+            quads.push((w_f32 - 10.0, bar_y, 1.0, 48.0, border_col));
         }
     }
 
     fn overlay_quads(&mut self, quads: &mut Vec<(f32, f32, f32, f32, [f32; 4])>, _size: LogicalSize, _scale: f64) {
-        if self.current_page == Page::Browse && self.selected_family.is_some() {
+        if self.selected_family.is_some() {
             // Style Dropdown popover rendered on top of everything
             let mut pc = cce_ui::layout::PopoverCollector::new();
             self.style_dropdown.render_popover(&mut pc);
@@ -1046,59 +912,46 @@ impl Application for TypefaceApp {
             }
         }
 
-        // Process side effects / clicks
-        if let Some((new_page, _)) = self.paginator.menu_click() {
-            self.paginator.set_selected_page(new_page);
-            let target_page = match new_page {
-                0 => Page::Browse,
-                1 => Page::Keybindings,
-                _ => Page::Browse,
-            };
-            msg_out = Some(AppMessage::SwitchPage(target_page));
+        if self.selected_family.is_some() && self.style_dropdown.take_change() {
+            msg_out = Some(AppMessage::SelectStyle(self.style_dropdown.selected));
         }
 
-        if self.current_page == Page::Browse {
-            if self.selected_family.is_some() && self.style_dropdown.take_change() {
-                msg_out = Some(AppMessage::SelectStyle(self.style_dropdown.selected));
-            }
-
-            for (idx, btn) in self.font_buttons.iter_mut().enumerate() {
-                if btn.rect().0 > -9000.0 && btn.take_click() {
-                    if self.select_mode && self.last_click_idx == Some(idx) && self.click_timer > 0.0 {
-                        let selected = self.filtered[idx].clone();
-                        print!("{} {:.0}", selected, self.size_slider.get_scaled_value());
-                        std::process::exit(0);
-                    }
-                    self.last_click_idx = Some(idx);
-                    self.click_timer = 0.35;
-                    msg_out = Some(AppMessage::SelectFamily(idx));
-                    break;
+        for (idx, btn) in self.font_buttons.iter_mut().enumerate() {
+            if btn.rect().0 > -9000.0 && btn.take_click() {
+                if self.select_mode && self.last_click_idx == Some(idx) && self.click_timer > 0.0 {
+                    let selected = self.filtered[idx].clone();
+                    print!("{} {:.0}", selected, self.size_slider.get_scaled_value());
+                    std::process::exit(0);
                 }
+                self.last_click_idx = Some(idx);
+                self.click_timer = 0.35;
+                msg_out = Some(AppMessage::SelectFamily(idx));
+                break;
             }
+        }
 
-            let old_size = self.preview_box.font_size;
-            let new_size = self.size_slider.get_scaled_value();
-            if (new_size - old_size).abs() > 0.001 {
-                self.preview_box.font_size = new_size;
-                msg_out = Some(AppMessage::FontSizeChanged);
-            }
+        let old_size = self.preview_box.font_size;
+        let new_size = self.size_slider.get_scaled_value();
+        if (new_size - old_size).abs() > 0.001 {
+            self.preview_box.font_size = new_size;
+            msg_out = Some(AppMessage::FontSizeChanged);
+        }
 
-            if self.btn_open_folder.take_click() {
-                msg_out = Some(AppMessage::OpenFolder);
-            }
-            if self.btn_remove_font.take_click() {
-                msg_out = Some(AppMessage::RemoveFont);
-            }
+        if self.btn_open_folder.take_click() {
+            msg_out = Some(AppMessage::OpenFolder);
+        }
+        if self.btn_remove_font.take_click() {
+            msg_out = Some(AppMessage::RemoveFont);
+        }
 
-            if self.select_mode {
-                if self.select_cancel_btn.take_click() {
-                    std::process::exit(1);
-                }
-                if self.select_confirm_btn.take_click() {
-                    let selected = self.selected_family.clone().unwrap_or_default();
-                    print!("{} {:.0}", selected, self.size_slider.get_scaled_value());
-                    std::process::exit(0);
-                }
+        if self.select_mode {
+            if self.select_cancel_btn.take_click() {
+                std::process::exit(1);
+            }
+            if self.select_confirm_btn.take_click() {
+                let selected = self.selected_family.clone().unwrap_or_default();
+                print!("{} {:.0}", selected, self.size_slider.get_scaled_value());
+                std::process::exit(0);
             }
         }
 
@@ -1141,27 +994,17 @@ impl Application for TypefaceApp {
         if event.ctrl && event.state == ElementState::Pressed {
             if let Key::Character(ref ch) = event.logical_key {
                 match ch.to_lowercase().as_str() {
-                    "1" => {
-                        msg_out = Some(AppMessage::SwitchPage(Page::Browse));
-                        handled = true;
-                    }
-                    "2" => {
-                        msg_out = Some(AppMessage::SwitchPage(Page::Keybindings));
-                        handled = true;
-                    }
                     "r" => {
                         msg_out = Some(AppMessage::RefreshFonts);
                         handled = true;
                     }
                     "f" => {
-                        self.current_page = Page::Browse;
                         self.search_box.focus();
                         self.ui_context.set_focused(&mut self.search_box);
                         self.preview_box.unfocus();
                         handled = true;
                     }
                     "e" => {
-                        self.current_page = Page::Browse;
                         self.preview_box.focus();
                         self.ui_context.set_focused(&mut self.preview_box);
                         self.search_box.unfocus();
@@ -1204,7 +1047,7 @@ impl Application for TypefaceApp {
             }
         }
 
-        if !handled && self.current_page == Page::Browse {
+        if !handled {
             // Arrow navigation
             let direction = match event.logical_key {
                 Key::Named(NamedKey::ArrowUp) => Some(BrowseNavigation::Up),
@@ -1228,7 +1071,7 @@ impl Application for TypefaceApp {
         }
 
         // TextBox and other focused widgets input propagation
-        if !handled && self.current_page == Page::Browse {
+        if !handled {
             let old_search_text = if self.search_box.editing { self.search_box.edit_buffer.clone() } else { self.search_box.text.clone() };
             
             for &child_ptr in &self.root_window.children {