Merge remote-tracking branch 'origin/main' into settings-ui-elements

Anthony created

Change summary

assets/keymaps/default-linux.json              |    2 
assets/keymaps/default-macos.json              |    2 
assets/keymaps/default-windows.json            |    2 
crates/onboarding/src/editing_page.rs          |    7 
crates/remote/src/transport/ssh.rs             |   13 
crates/settings_ui/src/page_data.rs            | 5003 +++++++++----------
crates/settings_ui/src/settings_ui.rs          |  362 +
crates/ui/src/components/button/button.rs      |    1 
crates/ui/src/components/button/button_like.rs |    8 
crates/ui/src/components/keybinding_hint.rs    |   17 
crates/ui/src/components/tree_view_item.rs     |   11 
crates/ui_input/src/font_picker.rs             |   11 
crates/ui_input/src/number_field.rs            |  258 
crates/ui_input/src/ui_input.rs                |    4 
crates/zed/src/zed/app_menus.rs                |   18 
15 files changed, 2,692 insertions(+), 3,027 deletions(-)

Detailed changes

assets/keymaps/default-linux.json 🔗

@@ -1249,6 +1249,8 @@
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-w": "workspace::CloseWindow",
+      "escape": "workspace::CloseWindow",
+      "ctrl-m": "settings_editor::Minimize",
       "ctrl-f": "search::FocusSearch",
       "ctrl-shift-e": "settings_editor::ToggleFocusNav",
       // todo(settings_ui): cut this down based on the max files and overflow UI

assets/keymaps/default-macos.json 🔗

@@ -1354,6 +1354,8 @@
     "use_key_equivalents": true,
     "bindings": {
       "cmd-w": "workspace::CloseWindow",
+      "escape": "workspace::CloseWindow",
+      "cmd-m": "settings_editor::Minimize",
       "cmd-f": "search::FocusSearch",
       "cmd-shift-e": "settings_editor::ToggleFocusNav",
       // todo(settings_ui): cut this down based on the max files and overflow UI

assets/keymaps/default-windows.json 🔗

@@ -1270,6 +1270,8 @@
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-w": "workspace::CloseWindow",
+      "escape": "workspace::CloseWindow",
+      "ctrl-m": "settings_editor::Minimize",
       "ctrl-f": "search::FocusSearch",
       "ctrl-shift-e": "settings_editor::ToggleFocusNav",
       // todo(settings_ui): cut this down based on the max files and overflow UI

crates/onboarding/src/editing_page.rs 🔗

@@ -11,7 +11,7 @@ use ui::{
     ButtonLike, PopoverMenu, SwitchField, ToggleButtonGroup, ToggleButtonGroupStyle,
     ToggleButtonSimple, ToggleState, Tooltip, prelude::*,
 };
-use ui_input::{NumericStepper, font_picker};
+use ui_input::{NumberField, font_picker};
 
 use crate::{ImportCursorSettings, ImportVsCodeSettings, SettingsImportState};
 
@@ -411,7 +411,7 @@ fn font_picker_stepper(
     write_font_size: fn(Pixels, &mut App),
     window: &mut Window,
     cx: &mut App,
-) -> NumericStepper<u32> {
+) -> NumberField<u32> {
     window.with_id(id, |window| {
         let optimistic_font_size: gpui::Entity<Option<u32>> = window.use_state(cx, |_, _| None);
         optimistic_font_size.update(cx, |optimistic_font_size, _| {
@@ -426,7 +426,7 @@ fn font_picker_stepper(
             .read(cx)
             .unwrap_or_else(|| font_size.into());
 
-        NumericStepper::new(
+        NumberField::new(
             SharedString::new(format!("{}-stepper", id)),
             stepper_font_size,
             window,
@@ -437,7 +437,6 @@ fn font_picker_stepper(
             write_font_size(Pixels::from(*new_value), cx);
         })
         .format(|value| format!("{value}px"))
-        .style(ui_input::NumericStepperStyle::Outlined)
         .tab_index({
             *tab_index += 2;
             *tab_index - 2

crates/remote/src/transport/ssh.rs 🔗

@@ -1026,7 +1026,7 @@ fn build_command(
 ) -> Result<CommandTemplate> {
     use std::fmt::Write as _;
 
-    let mut exec = String::from("exec env -C ");
+    let mut exec = String::new();
     if let Some(working_dir) = working_dir {
         let working_dir = RemotePathBuf::new(working_dir, ssh_path_style).to_string();
 
@@ -1035,13 +1035,14 @@ fn build_command(
         const TILDE_PREFIX: &'static str = "~/";
         if working_dir.starts_with(TILDE_PREFIX) {
             let working_dir = working_dir.trim_start_matches("~").trim_start_matches("/");
-            write!(exec, "\"$HOME/{working_dir}\" ",).unwrap();
+            write!(exec, "cd \"$HOME/{working_dir}\" && ",).unwrap();
         } else {
-            write!(exec, "\"{working_dir}\" ",).unwrap();
+            write!(exec, "cd \"{working_dir}\" && ",).unwrap();
         }
     } else {
-        write!(exec, "\"$HOME\" ").unwrap();
+        write!(exec, "cd && ").unwrap();
     };
+    write!(exec, "exec env ").unwrap();
 
     for (k, v) in input_env.iter() {
         if let Some((k, v)) = shlex::try_quote(k).ok().zip(shlex::try_quote(v).ok()) {
@@ -1106,7 +1107,7 @@ mod tests {
                 "-p",
                 "2222",
                 "-t",
-                "exec env -C \"$HOME/work\" INPUT_VA=val remote_program arg1 arg2"
+                "cd \"$HOME/work\" && exec env INPUT_VA=val remote_program arg1 arg2"
             ]
         );
         assert_eq!(command.env, env);
@@ -1137,7 +1138,7 @@ mod tests {
                 "-L",
                 "1:foo:2",
                 "-t",
-                "exec env -C \"$HOME\" INPUT_VA=val /bin/fish -l"
+                "cd && exec env INPUT_VA=val /bin/fish -l"
             ]
         );
         assert_eq!(command.env, env);

crates/settings_ui/src/page_data.rs 🔗

@@ -3,11 +3,11 @@ use std::sync::Arc;
 use ui::{IntoElement, SharedString};
 
 use crate::{
-    SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem, SubPageLink,
-    sub_page_stack,
+    LOCAL, SettingField, SettingItem, SettingsFieldMetadata, SettingsPage, SettingsPageItem,
+    SubPageLink, USER, sub_page_stack,
 };
 
-pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
+pub(crate) fn settings_data() -> Vec<SettingsPage> {
     vec![
         SettingsPage {
             title: "General",
@@ -21,6 +21,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.workspace.confirm_quit,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Restore On Startup",
@@ -32,6 +33,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Restore File State",
@@ -43,6 +45,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Close on File Delete",
@@ -54,6 +57,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "When Closing With No Tabs",
@@ -67,6 +71,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "On Last Window Closed",
@@ -78,6 +83,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Use System Path Prompts",
@@ -91,6 +97,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Use System Prompts",
@@ -102,9 +109,11 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 // SettingsPageItem::SectionHeader("Scoped Settings"),
                 // todo(settings_ui): Implement another setting item type that just shows an edit in settings.json
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Preview Channel",
                 //     description: "Which settings should be activated only in Preview build of Zed",
@@ -116,6 +125,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                 //     }),
                 //     metadata: None,
                 // }),
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Settings Profiles",
                 //     description: "Any number of settings profiles that are temporarily applied on top of your existing user settings.",
@@ -147,6 +157,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Telemetry Metrics",
@@ -164,6 +175,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
             ],
         },
@@ -172,6 +184,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
             items: vec![
                 // SettingsPageItem::SectionHeader("Theme"),
                 // todo(settings_ui): Figure out how we want to add these
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Theme Mode",
                 //     description: "How to select the theme",
@@ -181,6 +194,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                 //     }),
                 //     metadata: None,
                 // }),
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Icon Theme",
                 //     // todo(settings_ui)
@@ -201,6 +215,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.theme.buffer_font_family,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Buffer Font Size",
@@ -210,6 +225,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.theme.buffer_font_size,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Buffer Font Weight",
@@ -219,8 +235,10 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.theme.buffer_font_weight,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 // todo(settings_ui): This needs custom ui
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Buffer Line Height",
                 //     description: "Line height for editor text",
@@ -238,6 +256,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.theme.ui_font_family,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "UI Font Size",
@@ -247,6 +266,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.theme.ui_font_size,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "UI Font Weight",
@@ -256,6 +276,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.theme.ui_font_weight,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SectionHeader("Keymap"),
                 SettingsPageItem::SettingItem(SettingItem {
@@ -266,6 +287,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.base_keymap,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 // todo(settings_ui): Vim/Helix Mode should be apart of one type because it's undefined
                 // behavior to have them both enabled at the same time
@@ -277,6 +299,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.vim_mode,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Helix Mode",
@@ -286,6 +309,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.helix_mode,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Multi Cursor Modifier",
@@ -297,6 +321,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SectionHeader("Cursor"),
                 SettingsPageItem::SettingItem(SettingItem {
@@ -307,6 +332,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.editor.cursor_blink,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Cursor Shape",
@@ -316,6 +342,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.editor.cursor_shape,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Hide Mouse",
@@ -325,6 +352,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.editor.hide_mouse,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SectionHeader("Highlighting"),
                 SettingsPageItem::SettingItem(SettingItem {
@@ -337,6 +365,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Current Line Highlight",
@@ -348,6 +377,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Selection Highlight",
@@ -359,6 +389,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Rounded Selection",
@@ -368,6 +399,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.editor.rounded_selection,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SectionHeader("Guides"),
                 SettingsPageItem::SettingItem(SettingItem {
@@ -390,29 +422,26 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER | LOCAL,
                 }),
                 // todo(settings_ui): This needs a custom component
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Wrap Guides",
-                //     description: "Character counts at which to show wrap guides",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| {
-                //             &settings_content
-                //                 .project
-                //                 .all_languages
-                //                 .defaults
-                //                 .wrap_guides
-                //         },
-                //         pick_mut: |settings_content| {
-                //             &mut settings_content
-                //                 .project
-                //                 .all_languages
-                //                 .defaults
-                //                 .wrap_guides
-                //         },
-                //     }),
-                //     metadata: None,
-                // }),
+                SettingsPageItem::SettingItem(SettingItem {
+                    title: "Wrap Guides",
+                    description: "Character counts at which to show wrap guides",
+                    field: Box::new(
+                        SettingField {
+                            pick: |settings_content| {
+                                &settings_content.project.all_languages.defaults.wrap_guides
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.project.all_languages.defaults.wrap_guides
+                            },
+                        }
+                        .unimplemented(),
+                    ),
+                    metadata: None,
+                    files: USER | LOCAL,
+                }),
                 SettingsPageItem::SectionHeader("Whitespace"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Show Whitespace",
@@ -434,6 +463,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER | LOCAL,
                 }),
                 SettingsPageItem::SectionHeader("Layout"),
                 SettingsPageItem::SettingItem(SettingItem {
@@ -446,7 +476,9 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Centered Layout Left Padding",
                 //     description: "Left padding for centered layout",
@@ -472,6 +504,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                 //     }),
                 //     metadata: None,
                 // }),
+                // files: USER,
                 // SettingsPageItem::SettingItem(SettingItem {
                 //     title: "Centered Layout Right Padding",
                 //     description: "Right padding for centered layout",
@@ -505,6 +538,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         pick_mut: |settings_content| &mut settings_content.workspace.zoomed_padding,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Use System Window Tabs",
@@ -516,6 +550,7 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SectionHeader("Window"),
                 // todo(settings_ui): Should we filter by platform?
@@ -529,3947 +564,3457 @@ pub(crate) fn user_settings_data() -> Vec<SettingsPage> {
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
             ],
         },
         SettingsPage {
             title: "Editor",
+            items: {
+                let mut items = vec![
+                    SettingsPageItem::SectionHeader("Search"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Search Wrap",
+                        description: "Whether the editor search results will loop",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.search_wrap,
+                            pick_mut: |settings_content| &mut settings_content.editor.search_wrap,
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Seed Search Query From Cursor",
+                        description: "When to populate a new search's query based on the text under the cursor",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.seed_search_query_from_cursor
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.seed_search_query_from_cursor
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Use Smartcase Search",
+                        description: "Whether to use smartcase (i.e., case-sensitive) search",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.use_smartcase_search,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.use_smartcase_search
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Editor Behavior"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Redact Private Values",
+                        description: "Hide the values of variables in private files",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.redact_private_values,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.redact_private_values
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Middle Click Paste",
+                        description: "Whether to enable middle-click paste on Linux",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.middle_click_paste,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.middle_click_paste
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Double Click In Multibuffer",
+                        description: "What to do when multibuffer is double-clicked in some of its excerpts",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.double_click_in_multibuffer
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.double_click_in_multibuffer
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Go To Definition Fallback",
+                        description: "Whether to follow-up empty go to definition responses from the language server",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.go_to_definition_fallback
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.go_to_definition_fallback
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Expand Excerpt Lines",
+                        description: "How many lines to expand the multibuffer excerpts by default",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.expand_excerpt_lines,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.expand_excerpt_lines
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Excerpt Context Lines",
+                        description: "How many lines of context to provide in multibuffer excerpts by default",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.excerpt_context_lines,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.excerpt_context_lines
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Minimum Contrast For Highlights",
+                        description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.minimum_contrast_for_highlights
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.minimum_contrast_for_highlights
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Scrolling"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Scroll Beyond Last Line",
+                        description: "Whether the editor will scroll beyond the last line",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.scroll_beyond_last_line
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.scroll_beyond_last_line
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Vertical Scroll Margin",
+                        description: "The number of lines to keep above/below the cursor when auto-scrolling",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.vertical_scroll_margin
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.vertical_scroll_margin
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Horizontal Scroll Margin",
+                        description: "The number of characters to keep on either side when scrolling with the mouse",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.horizontal_scroll_margin
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.horizontal_scroll_margin
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Scroll Sensitivity",
+                        description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.scroll_sensitivity,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.scroll_sensitivity
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Fast Scroll Sensitivity",
+                        description: "Fast Scroll sensitivity multiplier for both horizontal and vertical scrolling",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.fast_scroll_sensitivity
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.fast_scroll_sensitivity
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Autoscroll On Clicks",
+                        description: "Whether to scroll when clicking near the edge of the visible text area",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.autoscroll_on_clicks,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.autoscroll_on_clicks
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Signature Help"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Auto Signature Help",
+                        description: "Whether to automatically show a signature help pop-up or not",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.auto_signature_help,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.auto_signature_help
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Signature Help After Edits",
+                        description: "Whether to show the signature help pop-up after completions or bracket pairs inserted",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                &settings_content.editor.show_signature_help_after_edits
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.show_signature_help_after_edits
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Snippet Sort Order",
+                        description: "Determines how snippets are sorted relative to other completion items",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.snippet_sort_order,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.snippet_sort_order
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Hover"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Hover Popover Enabled",
+                        description: "Whether to show the informational hover box when moving the mouse over symbols in the editor",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.hover_popover_enabled,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.hover_popover_enabled
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    // todo(settings ui): add units to this number input
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Hover Popover Delay",
+                        description: "Time to wait in milliseconds before showing the informational hover box",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.hover_popover_delay,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.hover_popover_delay
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Code Actions"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Inline Code Actions",
+                        description: "Whether to show code action button at start of buffer line",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.inline_code_actions,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.inline_code_actions
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Selection"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Drag And Drop Selection",
+                        description: "Whether to enable drag and drop selection",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(drag_and_drop) =
+                                    &settings_content.editor.drag_and_drop_selection
+                                {
+                                    &drag_and_drop.enabled
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .drag_and_drop_selection
+                                    .get_or_insert_default()
+                                    .enabled
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Drag And Drop Selection Delay",
+                        description: "Delay in milliseconds before drag and drop selection starts",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(drag_and_drop) =
+                                    &settings_content.editor.drag_and_drop_selection
+                                {
+                                    &drag_and_drop.delay
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .drag_and_drop_selection
+                                    .get_or_insert_default()
+                                    .delay
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Gutter"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Line Numbers",
+                        description: "Whether to show line numbers in the gutter",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(gutter) = &settings_content.editor.gutter {
+                                    &gutter.line_numbers
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .gutter
+                                    .get_or_insert_default()
+                                    .line_numbers
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Relative Line Numbers",
+                        description: "Whether the line numbers on editors gutter are relative or not",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| &settings_content.editor.relative_line_numbers,
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.relative_line_numbers
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Runnables",
+                        description: "Whether to show runnable buttons in the gutter",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(gutter) = &settings_content.editor.gutter {
+                                    &gutter.runnables
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .gutter
+                                    .get_or_insert_default()
+                                    .runnables
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Breakpoints",
+                        description: "Whether to show breakpoints in the gutter",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(gutter) = &settings_content.editor.gutter {
+                                    &gutter.breakpoints
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .gutter
+                                    .get_or_insert_default()
+                                    .breakpoints
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Folds",
+                        description: "Whether to show code folding controls in the gutter",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(gutter) = &settings_content.editor.gutter {
+                                    &gutter.folds
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.gutter.get_or_insert_default().folds
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Min Line Number Digits",
+                        description: "Minimum number of characters to reserve space for in the gutter.",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(gutter) = &settings_content.editor.gutter {
+                                    &gutter.min_line_number_digits
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .gutter
+                                    .get_or_insert_default()
+                                    .min_line_number_digits
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Scrollbar"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show",
+                        description: "When to show the scrollbar in the editor",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.show
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .show
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Cursors",
+                        description: "Whether to show cursor positions in the scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.cursors
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .cursors
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Git Diff",
+                        description: "Whether to show git diff indicators in the scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.git_diff
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .git_diff
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Search Results",
+                        description: "Whether to show buffer search result indicators in the scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.search_results
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .search_results
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Selected Text",
+                        description: "Whether to show selected text occurrences in the scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.selected_text
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .selected_text
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Selected Symbol",
+                        description: "Whether to show selected symbol occurrences in the scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.selected_symbol
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .selected_symbol
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Diagnostics",
+                        description: "Which diagnostic indicators to show in the scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    &scrollbar.diagnostics
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .diagnostics
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Horizontal Scrollbar",
+                        description: "When false, forcefully disables the horizontal scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    if let Some(axes) = &scrollbar.axes {
+                                        &axes.horizontal
+                                    } else {
+                                        &None
+                                    }
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .axes
+                                    .get_or_insert_default()
+                                    .horizontal
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Vertical Scrollbar",
+                        description: "When false, forcefully disables the vertical scrollbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(scrollbar) = &settings_content.editor.scrollbar {
+                                    if let Some(axes) = &scrollbar.axes {
+                                        &axes.vertical
+                                    } else {
+                                        &None
+                                    }
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .scrollbar
+                                    .get_or_insert_default()
+                                    .axes
+                                    .get_or_insert_default()
+                                    .vertical
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Minimap"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show",
+                        description: "When to show the minimap in the editor",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(minimap) = &settings_content.editor.minimap {
+                                    &minimap.show
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.editor.minimap.get_or_insert_default().show
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Display In",
+                        description: "Where to show the minimap in the editor",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(minimap) = &settings_content.editor.minimap {
+                                    &minimap.display_in
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .minimap
+                                    .get_or_insert_default()
+                                    .display_in
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Thumb",
+                        description: "When to show the minimap thumb",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(minimap) = &settings_content.editor.minimap {
+                                    &minimap.thumb
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .minimap
+                                    .get_or_insert_default()
+                                    .thumb
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Thumb Border",
+                        description: "Border style for the minimap's scrollbar thumb",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(minimap) = &settings_content.editor.minimap {
+                                    &minimap.thumb_border
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .minimap
+                                    .get_or_insert_default()
+                                    .thumb_border
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Current Line Highlight",
+                        description: "How to highlight the current line in the minimap",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(minimap) = &settings_content.editor.minimap
+                                    && minimap.current_line_highlight.is_some()
+                                {
+                                    &minimap.current_line_highlight
+                                } else {
+                                    &settings_content.editor.current_line_highlight
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .minimap
+                                    .get_or_insert_default()
+                                    .current_line_highlight
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Max Width Columns",
+                        description: "Maximum number of columns to display in the minimap",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(minimap) = &settings_content.editor.minimap {
+                                    &minimap.max_width_columns
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .minimap
+                                    .get_or_insert_default()
+                                    .max_width_columns
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SectionHeader("Tabs"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Tab Bar",
+                        description: "Whether or not to show the tab bar in the editor",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(tab_bar) = &settings_content.tab_bar {
+                                    &tab_bar.show
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.tab_bar.get_or_insert_default().show
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show Git Status In Tabs",
+                        description: "Whether to show the Git file status on a tab item",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(tabs) = &settings_content.tabs {
+                                    &tabs.git_status
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.tabs.get_or_insert_default().git_status
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Show File Icons In Tabs",
+                        description: "Whether to show the file icon for a tab",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(tabs) = &settings_content.tabs {
+                                    &tabs.file_icons
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.tabs.get_or_insert_default().file_icons
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Tab Close Position",
+                        description: "Position of the close button in a tab",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(tabs) = &settings_content.tabs {
+                                    &tabs.close_position
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content.tabs.get_or_insert_default().close_position
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    // files: USER,
+                    // SettingsPageItem::SettingItem(SettingItem {
+                    //     title: "Maximum Tabs",
+                    //     description: "Maximum open tabs in a pane. Will not close an unsaved tab",
+                    //     // todo(settings_ui): The default for this value is null and it's use in code
+                    //     // is complex, so I'm going to come back to this later
+                    //     field: Box::new(SettingField {
+                    //         pick: |settings_content| &settings_content.workspace.max_tabs,
+                    //         pick_mut: |settings_content| &mut settings_content.workspace.max_tabs,
+                    //     }),
+                    //     metadata: None,
+                    // }),
+                    SettingsPageItem::SectionHeader("Toolbar"),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Breadcrumbs",
+                        description: "Whether to show breadcrumbs",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(toolbar) = &settings_content.editor.toolbar {
+                                    &toolbar.breadcrumbs
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .toolbar
+                                    .get_or_insert_default()
+                                    .breadcrumbs
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Quick Actions",
+                        description: "Whether to show quick action buttons (e.g., search, selection, editor controls, etc.)",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(toolbar) = &settings_content.editor.toolbar {
+                                    &toolbar.quick_actions
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .toolbar
+                                    .get_or_insert_default()
+                                    .quick_actions
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Selections Menu",
+                        description: "Whether to show the selections menu in the editor toolbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(toolbar) = &settings_content.editor.toolbar {
+                                    &toolbar.selections_menu
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .toolbar
+                                    .get_or_insert_default()
+                                    .selections_menu
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Agent Review",
+                        description: "Whether to show agent review buttons in the editor toolbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(toolbar) = &settings_content.editor.toolbar {
+                                    &toolbar.agent_review
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .toolbar
+                                    .get_or_insert_default()
+                                    .agent_review
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                    SettingsPageItem::SettingItem(SettingItem {
+                        title: "Code Actions",
+                        description: "Whether to show code action buttons in the editor toolbar",
+                        field: Box::new(SettingField {
+                            pick: |settings_content| {
+                                if let Some(toolbar) = &settings_content.editor.toolbar {
+                                    &toolbar.code_actions
+                                } else {
+                                    &None
+                                }
+                            },
+                            pick_mut: |settings_content| {
+                                &mut settings_content
+                                    .editor
+                                    .toolbar
+                                    .get_or_insert_default()
+                                    .code_actions
+                            },
+                        }),
+                        metadata: None,
+                        files: USER,
+                    }),
+                ];
+                items.extend(language_settings_data());
+                items
+            },
+        },
+        SettingsPage {
+            title: "Languages",
+            items: vec![
+                SettingsPageItem::SectionHeader(LANGUAGES_SECTION_HEADER),
+                SettingsPageItem::SubPageLink(SubPageLink {
+                    title: "JSON",
+                    files: USER | LOCAL,
+                    render: Arc::new(|this, window, cx| {
+                        this.render_page_items(language_settings_data().iter(), window, cx)
+                            .into_any_element()
+                    }),
+                }),
+                SettingsPageItem::SubPageLink(SubPageLink {
+                    title: "JSONC",
+                    files: USER | LOCAL,
+                    render: Arc::new(|this, window, cx| {
+                        this.render_page_items(language_settings_data().iter(), window, cx)
+                            .into_any_element()
+                    }),
+                }),
+                SettingsPageItem::SubPageLink(SubPageLink {
+                    title: "Rust",
+                    files: USER | LOCAL,
+                    render: Arc::new(|this, window, cx| {
+                        this.render_page_items(language_settings_data().iter(), window, cx)
+                            .into_any_element()
+                    }),
+                }),
+                SettingsPageItem::SubPageLink(SubPageLink {
+                    title: "Python",
+                    files: USER | LOCAL,
+                    render: Arc::new(|this, window, cx| {
+                        this.render_page_items(language_settings_data().iter(), window, cx)
+                            .into_any_element()
+                    }),
+                }),
+                SettingsPageItem::SubPageLink(SubPageLink {
+                    title: "TSX",
+                    files: USER | LOCAL,
+                    render: Arc::new(|this, window, cx| {
+                        this.render_page_items(language_settings_data().iter(), window, cx)
+                            .into_any_element()
+                    }),
+                }),
+            ],
+        },
+        SettingsPage {
+            title: "Workbench & Window",
             items: vec![
-                SettingsPageItem::SectionHeader("Indentation"),
+                SettingsPageItem::SectionHeader("Status Bar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Tab Size",
-                    description: "How many columns a tab should occupy",
+                    title: "Active Language Button",
+                    description: "Whether to show the active language button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.tab_size
+                            if let Some(status_bar) = &settings_content.status_bar {
+                                &status_bar.active_language_button
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.tab_size
+                            &mut settings_content
+                                .status_bar
+                                .get_or_insert_default()
+                                .active_language_button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hard Tabs",
-                    description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
+                    title: "Cursor Position Button",
+                    description: "Whether to show the cursor position button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.hard_tabs
+                            if let Some(status_bar) = &settings_content.status_bar {
+                                &status_bar.cursor_position_button
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.hard_tabs
+                            &mut settings_content
+                                .status_bar
+                                .get_or_insert_default()
+                                .cursor_position_button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Indent",
-                    description: "Whether indentation should be adjusted based on the context whilst typing",
+                    title: "Terminal Button",
+                    description: "Whether to show the terminal button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.auto_indent
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.button
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.auto_indent
+                            &mut settings_content.terminal.get_or_insert_default().button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Indent On Paste",
-                    description: "Whether indentation of pasted content should be adjusted based on the context",
+                    title: "Diagnostics Button",
+                    description: "Whether to show the project diagnostics button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .auto_indent_on_paste
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                &diagnostics.button
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .auto_indent_on_paste
+                            &mut settings_content.diagnostics.get_or_insert_default().button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Wrapping"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Preferred Line Length",
-                    description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
+                    title: "Project Search Button",
+                    description: "Whether to show the project search button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .preferred_line_length
+                            if let Some(search) = &settings_content.editor.search {
+                                &search.button
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .preferred_line_length
+                                .editor
+                                .search
+                                .get_or_insert_default()
+                                .button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Tab Bar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Soft Wrap",
-                    description: "How to soft-wrap long lines of text",
+                    title: "Editor Tabs",
+                    description: "Whether or not to show the tab bar in the editor",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.soft_wrap
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.soft_wrap
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Search"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Search Wrap",
-                    description: "Whether the editor search results will loop",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.search_wrap,
-                        pick_mut: |settings_content| &mut settings_content.editor.search_wrap,
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Seed Search Query From Cursor",
-                    description: "When to populate a new search's query based on the text under the cursor",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content.editor.seed_search_query_from_cursor
+                            if let Some(tab_bar) = &settings_content.tab_bar {
+                                &tab_bar.show
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.seed_search_query_from_cursor
+                            &mut settings_content.tab_bar.get_or_insert_default().show
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use Smartcase Search",
-                    description: "Whether to use smartcase (i.e., case-sensitive) search",
+                    title: "Show Navigation History Buttons",
+                    description: "Whether or not to show the navigation history buttons in the tab bar",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.use_smartcase_search,
+                        pick: |settings_content| {
+                            if let Some(tab_bar) = &settings_content.tab_bar {
+                                &tab_bar.show_nav_history_buttons
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.use_smartcase_search
+                            &mut settings_content
+                                .tab_bar
+                                .get_or_insert_default()
+                                .show_nav_history_buttons
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Editor Behavior"),
+                SettingsPageItem::SectionHeader("Title Bar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Redact Private Values",
-                    description: "Hide the values of variables in private files",
+                    title: "Show Branch Icon",
+                    description: "Whether to show the branch icon beside branch switcher in the titlebar",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.redact_private_values,
+                        pick: |settings_content| {
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_branch_icon
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.redact_private_values
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_branch_icon
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Middle Click Paste",
-                    description: "Whether to enable middle-click paste on Linux",
+                    title: "Show Branch Name",
+                    description: "Whether to show the branch name button in the titlebar",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.middle_click_paste,
+                        pick: |settings_content| {
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_branch_name
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.middle_click_paste
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_branch_name
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Double Click In Multibuffer",
-                    description: "What to do when multibuffer is double-clicked in some of its excerpts",
+                    title: "Show Project Items",
+                    description: "Whether to show the project host and name in the titlebar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.editor.double_click_in_multibuffer
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_project_items
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.double_click_in_multibuffer
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_project_items
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Go To Definition Fallback",
-                    description: "Whether to follow-up empty go to definition responses from the language server",
+                    title: "Show Onboarding Banner",
+                    description: "Whether to show onboarding banners in the titlebar",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.go_to_definition_fallback,
+                        pick: |settings_content| {
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_onboarding_banner
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.go_to_definition_fallback
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_onboarding_banner
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Expand Excerpt Lines",
-                    description: "How many lines to expand the multibuffer excerpts by default",
+                    title: "Show User Picture",
+                    description: "Whether to show user picture in the titlebar",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.expand_excerpt_lines,
+                        pick: |settings_content| {
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_user_picture
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.expand_excerpt_lines
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_user_picture
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Excerpt Context Lines",
-                    description: "How many lines of context to provide in multibuffer excerpts by default",
+                    title: "Show Sign In",
+                    description: "Whether to show the sign in button in the titlebar",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.excerpt_context_lines,
+                        pick: |settings_content| {
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_sign_in
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.excerpt_context_lines
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_sign_in
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Minimum Contrast For Highlights",
-                    description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds",
+                    title: "Show Menus",
+                    description: "Whether to show the menus in the titlebar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.editor.minimum_contrast_for_highlights
+                            if let Some(title_bar) = &settings_content.title_bar {
+                                &title_bar.show_menus
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.minimum_contrast_for_highlights
+                            &mut settings_content
+                                .title_bar
+                                .get_or_insert_default()
+                                .show_menus
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Scrolling"),
+                SettingsPageItem::SectionHeader("Tab Settings"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Scroll Beyond Last Line",
-                    description: "Whether the editor will scroll beyond the last line",
+                    title: "Activate On Close",
+                    description: "What to do after closing the current tab",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.scroll_beyond_last_line,
+                        pick: |settings_content| {
+                            if let Some(tabs) = &settings_content.tabs {
+                                &tabs.activate_on_close
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.scroll_beyond_last_line
+                            &mut settings_content
+                                .tabs
+                                .get_or_insert_default()
+                                .activate_on_close
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Vertical Scroll Margin",
-                    description: "The number of lines to keep above/below the cursor when auto-scrolling",
+                    title: "Tab Show Diagnostics",
+                    description: "Which files containing diagnostic errors/warnings to mark in the tabs",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.vertical_scroll_margin,
+                        pick: |settings_content| {
+                            if let Some(tabs) = &settings_content.tabs {
+                                &tabs.show_diagnostics
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.vertical_scroll_margin
+                            &mut settings_content
+                                .tabs
+                                .get_or_insert_default()
+                                .show_diagnostics
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Horizontal Scroll Margin",
-                    description: "The number of characters to keep on either side when scrolling with the mouse",
+                    title: "Show Close Button",
+                    description: "Controls the appearance behavior of the tab's close button",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.horizontal_scroll_margin,
+                        pick: |settings_content| {
+                            if let Some(tabs) = &settings_content.tabs {
+                                &tabs.show_close_button
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.horizontal_scroll_margin
+                            &mut settings_content
+                                .tabs
+                                .get_or_insert_default()
+                                .show_close_button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Preview Tabs"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Scroll Sensitivity",
-                    description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling",
+                    title: "Preview Tabs Enabled",
+                    description: "Whether to show opened editors as preview tabs",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.scroll_sensitivity,
+                        pick: |settings_content| {
+                            if let Some(preview_tabs) = &settings_content.preview_tabs {
+                                &preview_tabs.enabled
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.scroll_sensitivity
+                            &mut settings_content
+                                .preview_tabs
+                                .get_or_insert_default()
+                                .enabled
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Fast Scroll Sensitivity",
-                    description: "Fast Scroll sensitivity multiplier for both horizontal and vertical scrolling",
+                    title: "Enable Preview From File Finder",
+                    description: "Whether to open tabs in preview mode when selected from the file finder",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.fast_scroll_sensitivity,
+                        pick: |settings_content| {
+                            if let Some(preview_tabs) = &settings_content.preview_tabs {
+                                &preview_tabs.enable_preview_from_file_finder
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.fast_scroll_sensitivity
+                            &mut settings_content
+                                .preview_tabs
+                                .get_or_insert_default()
+                                .enable_preview_from_file_finder
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Autoscroll On Clicks",
-                    description: "Whether to scroll when clicking near the edge of the visible text area",
+                    title: "Enable Preview From Code Navigation",
+                    description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab",
                     field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.autoscroll_on_clicks,
+                        pick: |settings_content| {
+                            if let Some(preview_tabs) = &settings_content.preview_tabs {
+                                &preview_tabs.enable_preview_from_code_navigation
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.autoscroll_on_clicks
+                            &mut settings_content
+                                .preview_tabs
+                                .get_or_insert_default()
+                                .enable_preview_from_code_navigation
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Auto Actions"),
+                SettingsPageItem::SectionHeader("Search Settings"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use Autoclose",
-                    description: "Whether to automatically type closing characters for you",
+                    title: "Whole Word",
+                    description: "Whether to search for whole words by default",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_autoclose
+                            if let Some(search) = &settings_content.editor.search {
+                                &search.whole_word
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_autoclose
+                                .editor
+                                .search
+                                .get_or_insert_default()
+                                .whole_word
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use Auto Surround",
-                    description: "Whether to automatically surround text with characters for you",
+                    title: "Case Sensitive",
+                    description: "Whether to search case-sensitively by default",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_auto_surround
+                            if let Some(search) = &settings_content.editor.search {
+                                &search.case_sensitive
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_auto_surround
+                                .editor
+                                .search
+                                .get_or_insert_default()
+                                .case_sensitive
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use On Type Format",
-                    description: "Whether to use additional LSP queries to format the code after every trigger symbol input",
+                    title: "Include Ignored",
+                    description: "Whether to include ignored files in search results by default",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_on_type_format
+                            if let Some(search) = &settings_content.editor.search {
+                                &search.include_ignored
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_on_type_format
+                                .editor
+                                .search
+                                .get_or_insert_default()
+                                .include_ignored
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Always Treat Brackets As Autoclosed",
-                    description: "Controls how the editor handles the autoclosed characters",
+                    title: "Regex",
+                    description: "Whether to use regex search by default",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .always_treat_brackets_as_autoclosed
+                            if let Some(search) = &settings_content.editor.search {
+                                &search.regex
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .always_treat_brackets_as_autoclosed
+                            &mut settings_content.editor.search.get_or_insert_default().regex
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Formatting"),
+                SettingsPageItem::SectionHeader("File Finder"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Remove Trailing Whitespace On Save",
-                    description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
+                    title: "File Icons",
+                    description: "Whether to show file icons in the file finder",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .remove_trailing_whitespace_on_save
+                            if let Some(file_finder) = &settings_content.file_finder {
+                                &file_finder.file_icons
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .remove_trailing_whitespace_on_save
+                                .file_finder
+                                .get_or_insert_default()
+                                .file_icons
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Ensure Final Newline On Save",
-                    description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
+                    title: "Modal Max Width",
+                    description: "Determines how much space the file finder can take up in relation to the available window width",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .ensure_final_newline_on_save
+                            if let Some(file_finder) = &settings_content.file_finder {
+                                &file_finder.modal_max_width
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .ensure_final_newline_on_save
+                                .file_finder
+                                .get_or_insert_default()
+                                .modal_max_width
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Extend Comment On Newline",
-                    description: "Whether to start a new line with a comment when a previous line is a comment as well",
+                    title: "Skip Focus For Active In Search",
+                    description: "Whether the file finder should skip focus for the active file in search results",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .extend_comment_on_newline
+                            if let Some(file_finder) = &settings_content.file_finder {
+                                &file_finder.skip_focus_for_active_in_search
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .extend_comment_on_newline
+                                .file_finder
+                                .get_or_insert_default()
+                                .skip_focus_for_active_in_search
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Language Server Completions"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Completions On Input",
-                    description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
+                    title: "Git Status",
+                    description: "Whether to show the git status in the file finder",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completions_on_input
+                            if let Some(file_finder) = &settings_content.file_finder {
+                                &file_finder.git_status
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completions_on_input
+                                .file_finder
+                                .get_or_insert_default()
+                                .git_status
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                // todo: null by default
+                // files: USER,
+                // SettingsPageItem::SettingItem(SettingItem {
+                //     title: "Include Ignored",
+                //     description: "Whether to use gitignored files when searching",
+                //     field: Box::new(SettingField {
+                //         pick: |settings_content| {
+                //             if let Some(file_finder) = &settings_content.file_finder {
+                //                 &file_finder.include_ignored
+                //             } else {
+                //                 &None
+                //             }
+                //         },
+                //         pick_mut: |settings_content| {
+                //             &mut settings_content
+                //                 .file_finder
+                //                 .get_or_insert_default()
+                //                 .include_ignored
+                //         },
+                //     }),
+                //     metadata: None,
+                // }),
+            ],
+        },
+        SettingsPage {
+            title: "Panels",
+            items: vec![
+                SettingsPageItem::SectionHeader("Project Panel"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Completion Documentation",
-                    description: "Whether to display inline and alongside documentation for items in the completions menu",
+                    title: "Project Panel Button",
+                    description: "Whether to show the project panel button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completion_documentation
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.button
+                            } else {
+                                &None
+                            }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completion_documentation
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Signature Help",
-                    description: "Whether to automatically show a signature help pop-up or not",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.auto_signature_help,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.auto_signature_help
+                                .project_panel
+                                .get_or_insert_default()
+                                .button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Signature Help After Edits",
-                    description: "Whether to show the signature help pop-up after completions or bracket pairs inserted",
+                    title: "Project Panel Dock",
+                    description: "Where to dock the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            &settings_content.editor.show_signature_help_after_edits
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.show_signature_help_after_edits
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Snippet Sort Order",
-                    description: "Determines how snippets are sorted relative to other completion items",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.snippet_sort_order,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.snippet_sort_order
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Hover"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hover Popover Enabled",
-                    description: "Whether to show the informational hover box when moving the mouse over symbols in the editor",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.hover_popover_enabled,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.hover_popover_enabled
-                        },
-                    }),
-                    metadata: None,
-                }),
-                // todo(settings ui): add units to this numeric stepper
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hover Popover Delay",
-                    description: "Time to wait in milliseconds before showing the informational hover box",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.hover_popover_delay,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.hover_popover_delay
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.dock
+                            } else {
+                                &None
+                            }
                         },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Code Actions"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Code Actions",
-                    description: "Whether to show code action button at start of buffer line",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.inline_code_actions,
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.inline_code_actions
+                            &mut settings_content.project_panel.get_or_insert_default().dock
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Selection"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Drag And Drop Selection",
-                    description: "Whether to enable drag and drop selection",
+                    title: "Project Panel Default Width",
+                    description: "Default width of the project panel in pixels",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(drag_and_drop) =
-                                &settings_content.editor.drag_and_drop_selection
-                            {
-                                &drag_and_drop.enabled
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.default_width
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .drag_and_drop_selection
+                                .project_panel
                                 .get_or_insert_default()
-                                .enabled
+                                .default_width
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Drag And Drop Selection Delay",
-                    description: "Delay in milliseconds before drag and drop selection starts",
+                    title: "Hide .gitignore",
+                    description: "Whether to hide the gitignore entries in the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(drag_and_drop) =
-                                &settings_content.editor.drag_and_drop_selection
-                            {
-                                &drag_and_drop.delay
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.hide_gitignore
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .drag_and_drop_selection
+                                .project_panel
                                 .get_or_insert_default()
-                                .delay
+                                .hide_gitignore
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Gutter"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Line Numbers",
-                    description: "Whether to show line numbers in the gutter",
+                    title: "Entry Spacing",
+                    description: "Spacing between worktree entries in the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(gutter) = &settings_content.editor.gutter {
-                                &gutter.line_numbers
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.entry_spacing
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .gutter
+                                .project_panel
                                 .get_or_insert_default()
-                                .line_numbers
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Relative Line Numbers",
-                    description: "Whether the line numbers on editors gutter are relative or not",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.relative_line_numbers,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.relative_line_numbers
+                                .entry_spacing
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Runnables",
-                    description: "Whether to show runnable buttons in the gutter",
+                    title: "File Icons",
+                    description: "Whether to show folder icons or chevrons for directories in the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(gutter) = &settings_content.editor.gutter {
-                                &gutter.runnables
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.file_icons
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .gutter
+                                .project_panel
                                 .get_or_insert_default()
-                                .runnables
+                                .file_icons
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Breakpoints",
-                    description: "Whether to show breakpoints in the gutter",
+                    title: "Folder Icons",
+                    description: "Whether to show folder icons or chevrons for directories in the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(gutter) = &settings_content.editor.gutter {
-                                &gutter.breakpoints
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.folder_icons
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .gutter
+                                .project_panel
                                 .get_or_insert_default()
-                                .breakpoints
+                                .folder_icons
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Folds",
-                    description: "Whether to show code folding controls in the gutter",
+                    title: "Git Status",
+                    description: "Whether to show the git status in the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(gutter) = &settings_content.editor.gutter {
-                                &gutter.folds
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.git_status
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.gutter.get_or_insert_default().folds
+                            &mut settings_content
+                                .project_panel
+                                .get_or_insert_default()
+                                .git_status
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Min Line Number Digits",
-                    description: "Minimum number of characters to reserve space for in the gutter.",
+                    title: "Indent Size",
+                    description: "Amount of indentation for nested items",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(gutter) = &settings_content.editor.gutter {
-                                &gutter.min_line_number_digits
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.indent_size
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .gutter
+                                .project_panel
                                 .get_or_insert_default()
-                                .min_line_number_digits
+                                .indent_size
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Scrollbar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show",
-                    description: "When to show the scrollbar in the editor",
+                    title: "Auto Reveal Entries",
+                    description: "Whether to reveal it in the project panel automatically when a corresponding project entry becomes active",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.show
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.auto_reveal_entries
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .show
+                                .auto_reveal_entries
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Cursors",
-                    description: "Whether to show cursor positions in the scrollbar",
+                    title: "Starts Open",
+                    description: "Whether the project panel should open on startup",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.cursors
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.starts_open
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .cursors
+                                .starts_open
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Git Diff",
-                    description: "Whether to show git diff indicators in the scrollbar",
+                    title: "Auto Fold Directories",
+                    description: "Whether to fold directories automatically and show compact folders when a directory has only one subdirectory inside",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.git_diff
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.auto_fold_dirs
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .git_diff
+                                .auto_fold_dirs
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Search Results",
-                    description: "Whether to show buffer search result indicators in the scrollbar",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.search_results
-                            } else {
-                                &None
-                            }
-                        },
+                // files: USER,
+                // SettingsPageItem::SettingItem(SettingItem {
+                //     title: "Scrollbar Show",
+                //     description: "When to show the scrollbar in the project panel",
+                //     field: Box::new(SettingField {
+                //         pick: |settings_content| {
+                //             if let Some(project_panel) = &settings_content.project_panel {
+                //                 if let Some(scrollbar) = &project_panel.scrollbar {
+                //                     &scrollbar.show
+                //                 } else {
+                //                     &None
+                //                 }
+                //             } else {
+                //                 &None
+                //             }
+                //         },
+                //         pick_mut: |settings_content| {
+                //             &mut settings_content
+                //                 .project_panel
+                //                 .get_or_insert_default()
+                //                 .scrollbar
+                //         },
+                //     }),
+                //     metadata: None,
+                // }),
+                SettingsPageItem::SettingItem(SettingItem {
+                    title: "Show Diagnostics",
+                    description: "Which files containing diagnostic errors/warnings to mark in the project panel",
+                    field: Box::new(SettingField {
+                        pick: |settings_content| {
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.show_diagnostics
+                            } else {
+                                &None
+                            }
+                        },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .search_results
+                                .show_diagnostics
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Selected Text",
-                    description: "Whether to show selected text occurrences in the scrollbar",
+                    title: "Sticky Scroll",
+                    description: "Whether to stick parent directories at top of the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.selected_text
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.sticky_scroll
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .selected_text
+                                .sticky_scroll
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                // files: USER,
+                // SettingsPageItem::SettingItem(SettingItem {
+                //     title: "Indent Guides Show",
+                //     description: "When to show indent guides in the project panel",
+                //     field: Box::new(SettingField {
+                //         pick: |settings_content| {
+                //             if let Some(project_panel) = &settings_content.project_panel {
+                //                 if let Some(indent_guides) = &project_panel.indent_guides {
+                //                     &indent_guides.show
+                //                 } else {
+                //                     &None
+                //                 }
+                //             } else {
+                //                 &None
+                //             }
+                //         },
+                //         pick_mut: |settings_content| {
+                //             &mut settings_content
+                //                 .project_panel
+                //                 .get_or_insert_default()
+                //                 .indent_guides
+                //                 .get_or_insert_default()
+                //                 .show
+                //         },
+                //     }),
+                //     metadata: None,
+                // }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Selected Symbol",
-                    description: "Whether to show selected symbol occurrences in the scrollbar",
+                    title: "Drag and Drop",
+                    description: "Whether to enable drag-and-drop operations in the project panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.selected_symbol
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.drag_and_drop
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .selected_symbol
+                                .drag_and_drop
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Diagnostics",
-                    description: "Which diagnostic indicators to show in the scrollbar",
+                    title: "Hide Root",
+                    description: "Whether to hide the root entry when only one folder is open in the window",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                &scrollbar.diagnostics
+                            if let Some(project_panel) = &settings_content.project_panel {
+                                &project_panel.hide_root
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
+                                .project_panel
                                 .get_or_insert_default()
-                                .diagnostics
+                                .hide_root
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Terminal Panel"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Horizontal Scrollbar",
-                    description: "When false, forcefully disables the horizontal scrollbar",
+                    title: "Terminal Dock",
+                    description: "Where to dock the terminal panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                if let Some(axes) = &scrollbar.axes {
-                                    &axes.horizontal
-                                } else {
-                                    &None
-                                }
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.dock
+                            } else {
+                                &None
+                            }
+                        },
+                        pick_mut: |settings_content| {
+                            &mut settings_content.terminal.get_or_insert_default().dock
+                        },
+                    }),
+                    metadata: None,
+                    files: USER,
+                }),
+                SettingsPageItem::SettingItem(SettingItem {
+                    title: "Default Width",
+                    description: "Default width when the terminal is docked to the left or right",
+                    field: Box::new(SettingField {
+                        pick: |settings_content| {
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.default_width
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
-                                .get_or_insert_default()
-                                .axes
+                                .terminal
                                 .get_or_insert_default()
-                                .horizontal
+                                .default_width
                         },
                     }),
                     metadata: None,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Vertical Scrollbar",
-                    description: "When false, forcefully disables the vertical scrollbar",
+                    title: "Default Height",
+                    description: "Default height when the terminal is docked to the bottom",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(scrollbar) = &settings_content.editor.scrollbar {
-                                if let Some(axes) = &scrollbar.axes {
-                                    &axes.vertical
-                                } else {
-                                    &None
-                                }
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.default_height
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .scrollbar
-                                .get_or_insert_default()
-                                .axes
+                                .terminal
                                 .get_or_insert_default()
-                                .vertical
+                                .default_height
                         },
                     }),
                     metadata: None,
                 }),
-                SettingsPageItem::SectionHeader("Minimap"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show",
-                    description: "When to show the minimap in the editor",
+                    title: "Blinking",
+                    description: "Sets the cursor blinking behavior in the terminal",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(minimap) = &settings_content.editor.minimap {
-                                &minimap.show
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.blinking
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.minimap.get_or_insert_default().show
+                            &mut settings_content.terminal.get_or_insert_default().blinking
                         },
                     }),
                     metadata: None,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Display In",
-                    description: "Where to show the minimap in the editor",
+                    title: "Cursor Shape",
+                    description: "Default cursor shape for the terminal",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(minimap) = &settings_content.editor.minimap {
-                                &minimap.display_in
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.cursor_shape
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .minimap
+                                .terminal
                                 .get_or_insert_default()
-                                .display_in
+                                .cursor_shape
                         },
                     }),
                     metadata: None,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Thumb",
-                    description: "When to show the minimap thumb",
+                    title: "Alternate Scroll",
+                    description: "Sets whether Alternate Scroll mode is active by default",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(minimap) = &settings_content.editor.minimap {
-                                &minimap.thumb
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.alternate_scroll
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .minimap
+                                .terminal
                                 .get_or_insert_default()
-                                .thumb
+                                .alternate_scroll
                         },
                     }),
                     metadata: None,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Thumb Border",
-                    description: "Border style for the minimap's scrollbar thumb",
+                    title: "Option As Meta",
+                    description: "Sets whether the option key behaves as the meta key",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(minimap) = &settings_content.editor.minimap {
-                                &minimap.thumb_border
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.option_as_meta
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .minimap
+                                .terminal
                                 .get_or_insert_default()
-                                .thumb_border
+                                .option_as_meta
                         },
                     }),
                     metadata: None,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Current Line Highlight",
-                    description: "How to highlight the current line in the minimap",
+                    title: "Copy On Select",
+                    description: "Whether selecting text in the terminal automatically copies to clipboard",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(minimap) = &settings_content.editor.minimap
-                                && minimap.current_line_highlight.is_some()
-                            {
-                                &minimap.current_line_highlight
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.copy_on_select
                             } else {
-                                &settings_content.editor.current_line_highlight
+                                &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .minimap
+                                .terminal
                                 .get_or_insert_default()
-                                .current_line_highlight
+                                .copy_on_select
                         },
                     }),
                     metadata: None,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Max Width Columns",
-                    description: "Maximum number of columns to display in the minimap",
+                    title: "Keep Selection On Copy",
+                    description: "Whether to keep the text selection after copying it to the clipboard",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(minimap) = &settings_content.editor.minimap {
-                                &minimap.max_width_columns
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.keep_selection_on_copy
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .minimap
+                                .terminal
                                 .get_or_insert_default()
-                                .max_width_columns
+                                .keep_selection_on_copy
                         },
                     }),
                     metadata: None,
                 }),
-                SettingsPageItem::SectionHeader("Tabs"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Tab Bar",
-                    description: "Whether or not to show the tab bar in the editor",
+                    title: "Max Scroll History Lines",
+                    description: "The maximum number of lines to keep in the scrollback history",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tab_bar) = &settings_content.tab_bar {
-                                &tab_bar.show
+                            if let Some(terminal) = &settings_content.terminal {
+                                &terminal.max_scroll_history_lines
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.tab_bar.get_or_insert_default().show
+                            &mut settings_content
+                                .terminal
+                                .get_or_insert_default()
+                                .max_scroll_history_lines
                         },
                     }),
                     metadata: None,
                 }),
+                SettingsPageItem::SectionHeader("Outline Panel"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Git Status In Tabs",
-                    description: "Whether to show the Git file status on a tab item",
+                    title: "Outline Panel Button",
+                    description: "Whether to show the outline panel button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tabs) = &settings_content.tabs {
-                                &tabs.git_status
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.button
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.tabs.get_or_insert_default().git_status
+                            &mut settings_content
+                                .outline_panel
+                                .get_or_insert_default()
+                                .button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show File Icons In Tabs",
-                    description: "Whether to show the file icon for a tab",
+                    title: "Outline Panel Dock",
+                    description: "Where to dock the outline panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tabs) = &settings_content.tabs {
-                                &tabs.file_icons
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.dock
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.tabs.get_or_insert_default().file_icons
+                            &mut settings_content.outline_panel.get_or_insert_default().dock
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Tab Close Position",
-                    description: "Position of the close button in a tab",
+                    title: "Outline Panel Default Width",
+                    description: "Default width of the outline panel in pixels",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tabs) = &settings_content.tabs {
-                                &tabs.close_position
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.default_width
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.tabs.get_or_insert_default().close_position
+                            &mut settings_content
+                                .outline_panel
+                                .get_or_insert_default()
+                                .default_width
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Maximum Tabs",
-                //     description: "Maximum open tabs in a pane. Will not close an unsaved tab",
-                //     // todo(settings_ui): The default for this value is null and it's use in code
-                //     // is complex, so I'm going to come back to this later
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| &settings_content.workspace.max_tabs,
-                //         pick_mut: |settings_content| &mut settings_content.workspace.max_tabs,
-                //     }),
-                //     metadata: None,
-                // }),
-                SettingsPageItem::SectionHeader("Toolbar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Breadcrumbs",
-                    description: "Whether to show breadcrumbs",
+                    title: "File Icons",
+                    description: "Whether to show file icons in the outline panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(toolbar) = &settings_content.editor.toolbar {
-                                &toolbar.breadcrumbs
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.file_icons
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .toolbar
+                                .outline_panel
                                 .get_or_insert_default()
-                                .breadcrumbs
+                                .file_icons
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Quick Actions",
-                    description: "Whether to show quick action buttons (e.g., search, selection, editor controls, etc.)",
+                    title: "Folder Icons",
+                    description: "Whether to show folder icons or chevrons for directories in the outline panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(toolbar) = &settings_content.editor.toolbar {
-                                &toolbar.quick_actions
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.folder_icons
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .toolbar
+                                .outline_panel
                                 .get_or_insert_default()
-                                .quick_actions
+                                .folder_icons
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Selections Menu",
-                    description: "Whether to show the selections menu in the editor toolbar",
+                    title: "Git Status",
+                    description: "Whether to show the git status in the outline panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(toolbar) = &settings_content.editor.toolbar {
-                                &toolbar.selections_menu
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.git_status
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .toolbar
+                                .outline_panel
                                 .get_or_insert_default()
-                                .selections_menu
+                                .git_status
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Agent Review",
-                    description: "Whether to show agent review buttons in the editor toolbar",
+                    title: "Indent Size",
+                    description: "Amount of indentation for nested items",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(toolbar) = &settings_content.editor.toolbar {
-                                &toolbar.agent_review
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.indent_size
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .toolbar
+                                .outline_panel
                                 .get_or_insert_default()
-                                .agent_review
+                                .indent_size
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Code Actions",
-                    description: "Whether to show code action buttons in the editor toolbar",
+                    title: "Auto Reveal Entries",
+                    description: "Whether to reveal when a corresponding outline entry becomes active",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(toolbar) = &settings_content.editor.toolbar {
-                                &toolbar.code_actions
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.auto_reveal_entries
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .toolbar
+                                .outline_panel
                                 .get_or_insert_default()
-                                .code_actions
+                                .auto_reveal_entries
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-            ],
-        },
-        SettingsPage {
-            title: "Languages & Frameworks",
-            items: {
-                let mut items = vec![
-                    SettingsPageItem::SectionHeader(LANGUAGES_SECTION_HEADER),
-                    SettingsPageItem::SubPageLink(SubPageLink {
-                        title: "JSON",
-                        render: Arc::new(|this, window, cx| {
-                            this.render_page_items(language_settings_data().iter(), window, cx)
-                                .into_any_element()
-                        }),
-                    }),
-                    SettingsPageItem::SubPageLink(SubPageLink {
-                        title: "JSONC",
-                        render: Arc::new(|this, window, cx| {
-                            this.render_page_items(language_settings_data().iter(), window, cx)
-                                .into_any_element()
-                        }),
-                    }),
-                    SettingsPageItem::SubPageLink(SubPageLink {
-                        title: "Rust",
-                        render: Arc::new(|this, window, cx| {
-                            this.render_page_items(language_settings_data().iter(), window, cx)
-                                .into_any_element()
-                        }),
-                    }),
-                    SettingsPageItem::SubPageLink(SubPageLink {
-                        title: "Python",
-                        render: Arc::new(|this, window, cx| {
-                            this.render_page_items(language_settings_data().iter(), window, cx)
-                                .into_any_element()
-                        }),
-                    }),
-                    SettingsPageItem::SubPageLink(SubPageLink {
-                        title: "TSX",
-                        render: Arc::new(|this, window, cx| {
-                            this.render_page_items(language_settings_data().iter(), window, cx)
-                                .into_any_element()
-                        }),
-                    }),
-                ];
-
-                items.push(SettingsPageItem::SectionHeader("Default Language Settings"));
-                items.extend(language_settings_data());
-
-                items
-            },
-        },
-        SettingsPage {
-            title: "Workbench & Window",
-            items: vec![
-                SettingsPageItem::SectionHeader("Status Bar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Active Language Button",
-                    description: "Whether to show the active language button in the status bar",
+                    title: "Auto Fold Directories",
+                    description: "Whether to fold directories automatically when a directory has only one directory inside",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(status_bar) = &settings_content.status_bar {
-                                &status_bar.active_language_button
+                            if let Some(outline_panel) = &settings_content.outline_panel {
+                                &outline_panel.auto_fold_dirs
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .status_bar
+                                .outline_panel
                                 .get_or_insert_default()
-                                .active_language_button
+                                .auto_fold_dirs
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                // files: USER,
+                // SettingsPageItem::SettingItem(SettingItem {
+                //     title: "Indent Guides Show",
+                //     description: "When to show indent guides in the outline panel",
+                //     field: Box::new(SettingField {
+                //         pick: |settings_content| {
+                //             if let Some(outline_panel) = &settings_content.outline_panel {
+                //                 if let Some(indent_guides) = &outline_panel.indent_guides {
+                //                     &indent_guides.show
+                //                 } else {
+                //                     &None
+                //                 }
+                //             } else {
+                //                 &None
+                //             }
+                //         },
+                //         pick_mut: |settings_content| {
+                //             &mut settings_content
+                //                 .outline_panel
+                //                 .get_or_insert_default()
+                //                 .indent_guides
+                //                 .get_or_insert_default()
+                //                 .show
+                //         },
+                //     }),
+                //     metadata: None,
+                // }),
+                SettingsPageItem::SectionHeader("Git Panel"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Cursor Position Button",
-                    description: "Whether to show the cursor position button in the status bar",
+                    title: "Button",
+                    description: "Whether to show the git panel button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(status_bar) = &settings_content.status_bar {
-                                &status_bar.cursor_position_button
+                            if let Some(git_panel) = &settings_content.git_panel {
+                                &git_panel.button
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .status_bar
-                                .get_or_insert_default()
-                                .cursor_position_button
+                            &mut settings_content.git_panel.get_or_insert_default().button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Terminal Button",
-                    description: "Whether to show the terminal button in the status bar",
+                    title: "Dock",
+                    description: "Where to dock the git panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.button
+                            if let Some(git_panel) = &settings_content.git_panel {
+                                &git_panel.dock
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.terminal.get_or_insert_default().button
+                            &mut settings_content.git_panel.get_or_insert_default().dock
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Diagnostics Button",
-                    description: "Whether to show the project diagnostics button in the status bar",
+                    title: "Default Width",
+                    description: "Default width of the git panel in pixels",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                &diagnostics.button
+                            if let Some(git_panel) = &settings_content.git_panel {
+                                &git_panel.default_width
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.diagnostics.get_or_insert_default().button
+                            &mut settings_content
+                                .git_panel
+                                .get_or_insert_default()
+                                .default_width
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Notification Panel"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Project Search Button",
-                    description: "Whether to show the project search button in the status bar",
+                    title: "Notification Panel Button",
+                    description: "Whether to show the notification panel button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(search) = &settings_content.editor.search {
-                                &search.button
+                            if let Some(notification_panel) = &settings_content.notification_panel {
+                                &notification_panel.button
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .search
+                                .notification_panel
                                 .get_or_insert_default()
                                 .button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Tab Bar"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Editor Tabs",
-                    description: "Whether or not to show the tab bar in the editor",
+                    title: "Notification Panel Dock",
+                    description: "Where to dock the notification panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tab_bar) = &settings_content.tab_bar {
-                                &tab_bar.show
+                            if let Some(notification_panel) = &settings_content.notification_panel {
+                                &notification_panel.dock
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.tab_bar.get_or_insert_default().show
+                            &mut settings_content
+                                .notification_panel
+                                .get_or_insert_default()
+                                .dock
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Navigation History Buttons",
-                    description: "Whether or not to show the navigation history buttons in the tab bar",
+                    title: "Notification Panel Default Width",
+                    description: "Default width of the notification panel in pixels",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tab_bar) = &settings_content.tab_bar {
-                                &tab_bar.show_nav_history_buttons
+                            if let Some(notification_panel) = &settings_content.notification_panel {
+                                &notification_panel.default_width
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .tab_bar
+                                .notification_panel
                                 .get_or_insert_default()
-                                .show_nav_history_buttons
+                                .default_width
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Title Bar"),
+                SettingsPageItem::SectionHeader("Collaboration Panel"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Branch Icon",
-                    description: "Whether to show the branch icon beside branch switcher in the titlebar",
+                    title: "Collaboration Panel Button",
+                    description: "Whether to show the collaboration panel button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_branch_icon
+                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
+                            {
+                                &collaboration_panel.button
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .title_bar
+                                .collaboration_panel
                                 .get_or_insert_default()
-                                .show_branch_icon
+                                .button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Branch Name",
-                    description: "Whether to show the branch name button in the titlebar",
+                    title: "Collaboration Panel Dock",
+                    description: "Where to dock the collaboration panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_branch_name
+                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
+                            {
+                                &collaboration_panel.dock
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .title_bar
+                                .collaboration_panel
                                 .get_or_insert_default()
-                                .show_branch_name
+                                .dock
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Project Items",
-                    description: "Whether to show the project host and name in the titlebar",
+                    title: "Collaboration Panel Default Width",
+                    description: "Default width of the collaboration panel in pixels",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_project_items
+                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
+                            {
+                                &collaboration_panel.default_width
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .title_bar
+                                .collaboration_panel
                                 .get_or_insert_default()
-                                .show_project_items
+                                .default_width
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+            ],
+        },
+        SettingsPage {
+            title: "Version Control",
+            items: vec![
+                SettingsPageItem::SectionHeader("Git"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Onboarding Banner",
-                    description: "Whether to show onboarding banners in the titlebar",
+                    title: "Git Gutter",
+                    description: "Control whether git status is shown in the editor's gutter",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_onboarding_banner
+                            if let Some(git) = &settings_content.git {
+                                &git.git_gutter
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .title_bar
-                                .get_or_insert_default()
-                                .show_onboarding_banner
+                            &mut settings_content.git.get_or_insert_default().git_gutter
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                // todo(settings_ui): Figure out the right default for this value in default.json
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show User Picture",
-                    description: "Whether to show user picture in the titlebar",
+                    title: "Gutter Debounce",
+                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_user_picture
+                            if let Some(git) = &settings_content.git {
+                                &git.gutter_debounce
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .title_bar
-                                .get_or_insert_default()
-                                .show_user_picture
+                            &mut settings_content.git.get_or_insert_default().gutter_debounce
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Sign In",
-                    description: "Whether to show the sign in button in the titlebar",
+                    title: "Inline Git Blame",
+                    description: "Whether or not to show git blame data inline in the currently focused line",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_sign_in
+                            if let Some(git) = &settings_content.git {
+                                if let Some(inline_blame) = &git.inline_blame {
+                                    &inline_blame.enabled
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .title_bar
+                                .git
                                 .get_or_insert_default()
-                                .show_sign_in
+                                .inline_blame
+                                .get_or_insert_default()
+                                .enabled
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Menus",
-                    description: "Whether to show the menus in the titlebar",
+                    title: "Inline Git Blame Delay",
+                    description: "The delay after which the inline blame information is shown",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(title_bar) = &settings_content.title_bar {
-                                &title_bar.show_menus
+                            if let Some(git) = &settings_content.git {
+                                if let Some(inline_blame) = &git.inline_blame {
+                                    &inline_blame.delay_ms
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .title_bar
+                                .git
                                 .get_or_insert_default()
-                                .show_menus
+                                .inline_blame
+                                .get_or_insert_default()
+                                .delay_ms
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Tab Settings"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Activate On Close",
-                    description: "What to do after closing the current tab",
+                    title: "Inline Git Blame Padding",
+                    description: "Padding between the end of the source line and the start of the inline blame in columns",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tabs) = &settings_content.tabs {
-                                &tabs.activate_on_close
+                            if let Some(git) = &settings_content.git {
+                                if let Some(inline_blame) = &git.inline_blame {
+                                    &inline_blame.padding
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .tabs
+                                .git
                                 .get_or_insert_default()
-                                .activate_on_close
-                        },
+                                .inline_blame
+                                .get_or_insert_default()
+                                .padding
+                        },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Tab Show Diagnostics",
-                    description: "Which files containing diagnostic errors/warnings to mark in the tabs",
+                    title: "Inline Git Blame Min Column",
+                    description: "The minimum column number to show the inline blame information at",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tabs) = &settings_content.tabs {
-                                &tabs.show_diagnostics
+                            if let Some(git) = &settings_content.git {
+                                if let Some(inline_blame) = &git.inline_blame {
+                                    &inline_blame.min_column
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .tabs
+                                .git
                                 .get_or_insert_default()
-                                .show_diagnostics
+                                .inline_blame
+                                .get_or_insert_default()
+                                .min_column
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Close Button",
-                    description: "Controls the appearance behavior of the tab's close button",
+                    title: "Show Commit Summary",
+                    description: "Whether to show commit summary as part of the inline blame",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(tabs) = &settings_content.tabs {
-                                &tabs.show_close_button
+                            if let Some(git) = &settings_content.git {
+                                if let Some(inline_blame) = &git.inline_blame {
+                                    &inline_blame.show_commit_summary
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .tabs
+                                .git
                                 .get_or_insert_default()
-                                .show_close_button
+                                .inline_blame
+                                .get_or_insert_default()
+                                .show_commit_summary
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Preview Tabs"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Preview Tabs Enabled",
-                    description: "Whether to show opened editors as preview tabs",
+                    title: "Show Avatar",
+                    description: "Whether to show the avatar of the author of the commit",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(preview_tabs) = &settings_content.preview_tabs {
-                                &preview_tabs.enabled
+                            if let Some(git) = &settings_content.git {
+                                if let Some(blame) = &git.blame {
+                                    &blame.show_avatar
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .preview_tabs
+                                .git
                                 .get_or_insert_default()
-                                .enabled
+                                .blame
+                                .get_or_insert_default()
+                                .show_avatar
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Enable Preview From File Finder",
-                    description: "Whether to open tabs in preview mode when selected from the file finder",
+                    title: "Show Author Name In Branch Picker",
+                    description: "Whether to show author name as part of the commit information in branch picker",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(preview_tabs) = &settings_content.preview_tabs {
-                                &preview_tabs.enable_preview_from_file_finder
+                            if let Some(git) = &settings_content.git {
+                                if let Some(branch_picker) = &git.branch_picker {
+                                    &branch_picker.show_author_name
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .preview_tabs
+                                .git
                                 .get_or_insert_default()
-                                .enable_preview_from_file_finder
+                                .branch_picker
+                                .get_or_insert_default()
+                                .show_author_name
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Enable Preview From Code Navigation",
-                    description: "Whether a preview tab gets replaced when code navigation is used to navigate away from the tab",
+                    title: "Hunk Style",
+                    description: "How git hunks are displayed visually in the editor",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(preview_tabs) = &settings_content.preview_tabs {
-                                &preview_tabs.enable_preview_from_code_navigation
+                            if let Some(git) = &settings_content.git {
+                                &git.hunk_style
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .preview_tabs
-                                .get_or_insert_default()
-                                .enable_preview_from_code_navigation
+                            &mut settings_content.git.get_or_insert_default().hunk_style
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("Search Settings"),
+            ],
+        },
+        SettingsPage {
+            title: "System & Network",
+            items: vec![
+                SettingsPageItem::SectionHeader("Network"),
+                // todo(settings_ui): Proxy needs a default
+                // files: USER,
+                // SettingsPageItem::SettingItem(SettingItem {
+                //     title: "Proxy",
+                //     description: "The proxy to use for network requests",
+                //     field: Box::new(SettingField {
+                //         pick: |settings_content| &settings_content.proxy,
+                //         pick_mut: |settings_content| &mut settings_content.proxy,
+                //     }),
+                //     metadata: Some(Box::new(SettingsFieldMetadata {
+                //         placeholder: Some("socks5h://localhost:10808"),
+                //     })),
+                // }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Whole Word",
-                    description: "Whether to search for whole words by default",
+                    title: "Server URL",
+                    description: "The URL of the Zed server to connect to",
                     field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(search) = &settings_content.editor.search {
-                                &search.whole_word
-                            } else {
-                                &None
-                            }
-                        },
+                        pick: |settings_content| &settings_content.server_url,
+                        pick_mut: |settings_content| &mut settings_content.server_url,
+                    }),
+                    metadata: Some(Box::new(SettingsFieldMetadata {
+                        placeholder: Some("https://zed.dev"),
+                    })),
+                    files: USER,
+                }),
+                SettingsPageItem::SectionHeader("System"),
+                SettingsPageItem::SettingItem(SettingItem {
+                    title: "Auto Update",
+                    description: "Whether or not to automatically check for updates",
+                    field: Box::new(SettingField {
+                        pick: |settings_content| &settings_content.auto_update,
+                        pick_mut: |settings_content| &mut settings_content.auto_update,
+                    }),
+                    metadata: None,
+                    files: USER,
+                }),
+            ],
+        },
+        SettingsPage {
+            title: "Diagnostics & Errors",
+            items: vec![
+                SettingsPageItem::SectionHeader("Filtering"),
+                SettingsPageItem::SettingItem(SettingItem {
+                    title: "Max Severity",
+                    description: "Which level to use to filter out diagnostics displayed in the editor",
+                    field: Box::new(SettingField {
+                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .editor
-                                .search
-                                .get_or_insert_default()
-                                .whole_word
+                            &mut settings_content.editor.diagnostics_max_severity
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Case Sensitive",
-                    description: "Whether to search case-sensitively by default",
+                    title: "Include Warnings",
+                    description: "Whether to show warnings or not by default",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(search) = &settings_content.editor.search {
-                                &search.case_sensitive
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                &diagnostics.include_warnings
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .search
+                                .diagnostics
                                 .get_or_insert_default()
-                                .case_sensitive
+                                .include_warnings
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Inline"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Include Ignored",
-                    description: "Whether to include ignored files in search results by default",
+                    title: "Inline Diagnostics Enabled",
+                    description: "Whether to show diagnostics inline or not",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(search) = &settings_content.editor.search {
-                                &search.include_ignored
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                if let Some(inline) = &diagnostics.inline {
+                                    &inline.enabled
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .editor
-                                .search
+                                .diagnostics
                                 .get_or_insert_default()
-                                .include_ignored
+                                .inline
+                                .get_or_insert_default()
+                                .enabled
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Regex",
-                    description: "Whether to use regex search by default",
+                    title: "Inline Update Debounce",
+                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(search) = &settings_content.editor.search {
-                                &search.regex
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                if let Some(inline) = &diagnostics.inline {
+                                    &inline.update_debounce_ms
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.editor.search.get_or_insert_default().regex
+                            &mut settings_content
+                                .diagnostics
+                                .get_or_insert_default()
+                                .inline
+                                .get_or_insert_default()
+                                .update_debounce_ms
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                SettingsPageItem::SectionHeader("File Finder"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "File Icons",
-                    description: "Whether to show file icons in the file finder",
+                    title: "Inline Padding",
+                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(file_finder) = &settings_content.file_finder {
-                                &file_finder.file_icons
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                if let Some(inline) = &diagnostics.inline {
+                                    &inline.padding
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .file_finder
+                                .diagnostics
                                 .get_or_insert_default()
-                                .file_icons
+                                .inline
+                                .get_or_insert_default()
+                                .padding
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Modal Max Width",
-                    description: "Determines how much space the file finder can take up in relation to the available window width",
+                    title: "Inline Min Column",
+                    description: "The minimum column to display inline diagnostics",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(file_finder) = &settings_content.file_finder {
-                                &file_finder.modal_max_width
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                if let Some(inline) = &diagnostics.inline {
+                                    &inline.min_column
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .file_finder
+                                .diagnostics
                                 .get_or_insert_default()
-                                .modal_max_width
+                                .inline
+                                .get_or_insert_default()
+                                .min_column
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Performance"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Skip Focus For Active In Search",
-                    description: "Whether the file finder should skip focus for the active file in search results",
+                    title: "LSP Pull Diagnostics Enabled",
+                    description: "Whether to pull for language server-powered diagnostics or not",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(file_finder) = &settings_content.file_finder {
-                                &file_finder.skip_focus_for_active_in_search
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
+                                    &lsp_pull.enabled
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .file_finder
+                                .diagnostics
                                 .get_or_insert_default()
-                                .skip_focus_for_active_in_search
+                                .lsp_pull_diagnostics
+                                .get_or_insert_default()
+                                .enabled
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                // todo(settings_ui): Needs unit
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Git Status",
-                    description: "Whether to show the git status in the file finder",
+                    title: "LSP Pull Debounce",
+                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(file_finder) = &settings_content.file_finder {
-                                &file_finder.git_status
+                            if let Some(diagnostics) = &settings_content.diagnostics {
+                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
+                                    &lsp_pull.debounce_ms
+                                } else {
+                                    &None
+                                }
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .file_finder
+                                .diagnostics
                                 .get_or_insert_default()
-                                .git_status
+                                .lsp_pull_diagnostics
+                                .get_or_insert_default()
+                                .debounce_ms
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                // todo: null by default
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Include Ignored",
-                //     description: "Whether to use gitignored files when searching",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| {
-                //             if let Some(file_finder) = &settings_content.file_finder {
-                //                 &file_finder.include_ignored
-                //             } else {
-                //                 &None
-                //             }
-                //         },
-                //         pick_mut: |settings_content| {
-                //             &mut settings_content
-                //                 .file_finder
-                //                 .get_or_insert_default()
-                //                 .include_ignored
-                //         },
-                //     }),
-                //     metadata: None,
-                // }),
             ],
         },
         SettingsPage {
-            title: "Panels",
+            title: "Debugger",
             items: vec![
-                SettingsPageItem::SectionHeader("Project Panel"),
+                SettingsPageItem::SectionHeader("General"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Project Panel Button",
-                    description: "Whether to show the project panel button in the status bar",
+                    title: "Stepping Granularity",
+                    description: "Determines the stepping granularity for debug operations",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.button
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.stepping_granularity
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project_panel
+                                .debugger
                                 .get_or_insert_default()
-                                .button
+                                .stepping_granularity
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Project Panel Dock",
-                    description: "Where to dock the project panel",
+                    title: "Save Breakpoints",
+                    description: "Whether breakpoints should be reused across Zed sessions",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.dock
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.save_breakpoints
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content.project_panel.get_or_insert_default().dock
+                            &mut settings_content
+                                .debugger
+                                .get_or_insert_default()
+                                .save_breakpoints
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Project Panel Default Width",
-                    description: "Default width of the project panel in pixels",
+                    title: "Timeout",
+                    description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.default_width
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.timeout
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .default_width
+                            &mut settings_content.debugger.get_or_insert_default().timeout
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hide .gitignore",
-                    description: "Whether to hide the gitignore entries in the project panel",
+                    title: "Dock",
+                    description: "The dock position of the debug panel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.hide_gitignore
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.dock
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .hide_gitignore
+                            &mut settings_content.debugger.get_or_insert_default().dock
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Entry Spacing",
-                    description: "Spacing between worktree entries in the project panel",
+                    title: "Log DAP Communications",
+                    description: "Whether to log messages between active debug adapters and Zed",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.entry_spacing
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.log_dap_communications
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project_panel
+                                .debugger
                                 .get_or_insert_default()
-                                .entry_spacing
+                                .log_dap_communications
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "File Icons",
-                    description: "Whether to show folder icons or chevrons for directories in the project panel",
+                    title: "Format DAP Log Messages",
+                    description: "Whether to format DAP messages when adding them to debug adapter logger",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.file_icons
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.format_dap_log_messages
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project_panel
+                                .debugger
                                 .get_or_insert_default()
-                                .file_icons
+                                .format_dap_log_messages
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Folder Icons",
-                    description: "Whether to show folder icons or chevrons for directories in the project panel",
+                    title: "Button",
+                    description: "Whether to show the debug button in the status bar",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.folder_icons
+                            if let Some(debugger) = &settings_content.debugger {
+                                &debugger.button
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .folder_icons
+                            &mut settings_content.debugger.get_or_insert_default().button
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+            ],
+        },
+        SettingsPage {
+            title: "Collaboration",
+            items: vec![
+                SettingsPageItem::SectionHeader("Calls"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Git Status",
-                    description: "Whether to show the git status in the project panel",
+                    title: "Mute On Join",
+                    description: "Whether the microphone should be muted when joining a channel or a call",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.git_status
+                            if let Some(calls) = &settings_content.calls {
+                                &calls.mute_on_join
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .git_status
+                            &mut settings_content.calls.get_or_insert_default().mute_on_join
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Indent Size",
-                    description: "Amount of indentation for nested items",
+                    title: "Share On Join",
+                    description: "Whether your current project should be shared when joining an empty channel",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.indent_size
+                            if let Some(calls) = &settings_content.calls {
+                                &calls.share_on_join
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .indent_size
+                            &mut settings_content.calls.get_or_insert_default().share_on_join
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
+                SettingsPageItem::SectionHeader("Experimental"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Reveal Entries",
-                    description: "Whether to reveal it in the project panel automatically when a corresponding project entry becomes active",
+                    title: "Rodio Audio",
+                    description: "Opt into the new audio system",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.auto_reveal_entries
+                            if let Some(audio) = &settings_content.audio {
+                                &audio.rodio_audio
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .auto_reveal_entries
+                            &mut settings_content.audio.get_or_insert_default().rodio_audio
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Starts Open",
-                    description: "Whether the project panel should open on startup",
+                    title: "Auto Microphone Volume",
+                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.starts_open
+                            if let Some(audio) = &settings_content.audio {
+                                &audio.auto_microphone_volume
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project_panel
+                                .audio
                                 .get_or_insert_default()
-                                .starts_open
+                                .auto_microphone_volume
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Fold Directories",
-                    description: "Whether to fold directories automatically and show compact folders when a directory has only one subdirectory inside",
+                    title: "Auto Speaker Volume",
+                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.auto_fold_dirs
+                            if let Some(audio) = &settings_content.audio {
+                                &audio.auto_speaker_volume
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project_panel
+                                .audio
                                 .get_or_insert_default()
-                                .auto_fold_dirs
+                                .auto_speaker_volume
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Scrollbar Show",
-                //     description: "When to show the scrollbar in the project panel",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| {
-                //             if let Some(project_panel) = &settings_content.project_panel {
-                //                 if let Some(scrollbar) = &project_panel.scrollbar {
-                //                     &scrollbar.show
-                //                 } else {
-                //                     &None
-                //                 }
-                //             } else {
-                //                 &None
-                //             }
-                //         },
-                //         pick_mut: |settings_content| {
-                //             &mut settings_content
-                //                 .project_panel
-                //                 .get_or_insert_default()
-                //                 .scrollbar
-                //         },
-                //     }),
-                //     metadata: None,
-                // }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Diagnostics",
-                    description: "Which files containing diagnostic errors/warnings to mark in the project panel",
+                    title: "Denoise",
+                    description: "Remove background noises (requires Rodio Audio)",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.show_diagnostics
+                            if let Some(audio) = &settings_content.audio {
+                                &audio.denoise
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .show_diagnostics
+                            &mut settings_content.audio.get_or_insert_default().denoise
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Sticky Scroll",
-                    description: "Whether to stick parent directories at top of the project panel",
+                    title: "Legacy Audio Compatible",
+                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.sticky_scroll
+                            if let Some(audio) = &settings_content.audio {
+                                &audio.legacy_audio_compatible
                             } else {
                                 &None
                             }
                         },
                         pick_mut: |settings_content| {
                             &mut settings_content
-                                .project_panel
+                                .audio
                                 .get_or_insert_default()
-                                .sticky_scroll
-                        },
-                    }),
-                    metadata: None,
-                }),
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Indent Guides Show",
-                //     description: "When to show indent guides in the project panel",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| {
-                //             if let Some(project_panel) = &settings_content.project_panel {
-                //                 if let Some(indent_guides) = &project_panel.indent_guides {
-                //                     &indent_guides.show
-                //                 } else {
-                //                     &None
-                //                 }
-                //             } else {
-                //                 &None
-                //             }
-                //         },
-                //         pick_mut: |settings_content| {
-                //             &mut settings_content
-                //                 .project_panel
-                //                 .get_or_insert_default()
-                //                 .indent_guides
-                //                 .get_or_insert_default()
-                //                 .show
-                //         },
-                //     }),
-                //     metadata: None,
-                // }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Drag and Drop",
-                    description: "Whether to enable drag-and-drop operations in the project panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.drag_and_drop
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .drag_and_drop
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hide Root",
-                    description: "Whether to hide the root entry when only one folder is open in the window",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(project_panel) = &settings_content.project_panel {
-                                &project_panel.hide_root
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project_panel
-                                .get_or_insert_default()
-                                .hide_root
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Terminal Panel"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Terminal Dock",
-                    description: "Where to dock the terminal panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.dock
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.terminal.get_or_insert_default().dock
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Default Width",
-                    description: "Default width when the terminal is docked to the left or right",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.default_width
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .default_width
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Default Height",
-                    description: "Default height when the terminal is docked to the bottom",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.default_height
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .default_height
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Blinking",
-                    description: "Sets the cursor blinking behavior in the terminal",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.blinking
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.terminal.get_or_insert_default().blinking
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Cursor Shape",
-                    description: "Default cursor shape for the terminal",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.cursor_shape
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .cursor_shape
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Alternate Scroll",
-                    description: "Sets whether Alternate Scroll mode is active by default",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.alternate_scroll
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .alternate_scroll
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Option As Meta",
-                    description: "Sets whether the option key behaves as the meta key",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.option_as_meta
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .option_as_meta
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Copy On Select",
-                    description: "Whether selecting text in the terminal automatically copies to clipboard",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.copy_on_select
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .copy_on_select
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Keep Selection On Copy",
-                    description: "Whether to keep the text selection after copying it to the clipboard",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.keep_selection_on_copy
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .keep_selection_on_copy
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Max Scroll History Lines",
-                    description: "The maximum number of lines to keep in the scrollback history",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(terminal) = &settings_content.terminal {
-                                &terminal.max_scroll_history_lines
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .terminal
-                                .get_or_insert_default()
-                                .max_scroll_history_lines
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Outline Panel"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Outline Panel Button",
-                    description: "Whether to show the outline panel button in the status bar",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.button
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .button
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Outline Panel Dock",
-                    description: "Where to dock the outline panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.dock
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.outline_panel.get_or_insert_default().dock
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Outline Panel Default Width",
-                    description: "Default width of the outline panel in pixels",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.default_width
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .default_width
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "File Icons",
-                    description: "Whether to show file icons in the outline panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.file_icons
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .file_icons
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Folder Icons",
-                    description: "Whether to show folder icons or chevrons for directories in the outline panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.folder_icons
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .folder_icons
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Git Status",
-                    description: "Whether to show the git status in the outline panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.git_status
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .git_status
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Indent Size",
-                    description: "Amount of indentation for nested items",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.indent_size
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .indent_size
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Reveal Entries",
-                    description: "Whether to reveal when a corresponding outline entry becomes active",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.auto_reveal_entries
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .auto_reveal_entries
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Fold Directories",
-                    description: "Whether to fold directories automatically when a directory has only one directory inside",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(outline_panel) = &settings_content.outline_panel {
-                                &outline_panel.auto_fold_dirs
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .outline_panel
-                                .get_or_insert_default()
-                                .auto_fold_dirs
-                        },
-                    }),
-                    metadata: None,
-                }),
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Indent Guides Show",
-                //     description: "When to show indent guides in the outline panel",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| {
-                //             if let Some(outline_panel) = &settings_content.outline_panel {
-                //                 if let Some(indent_guides) = &outline_panel.indent_guides {
-                //                     &indent_guides.show
-                //                 } else {
-                //                     &None
-                //                 }
-                //             } else {
-                //                 &None
-                //             }
-                //         },
-                //         pick_mut: |settings_content| {
-                //             &mut settings_content
-                //                 .outline_panel
-                //                 .get_or_insert_default()
-                //                 .indent_guides
-                //                 .get_or_insert_default()
-                //                 .show
-                //         },
-                //     }),
-                //     metadata: None,
-                // }),
-                SettingsPageItem::SectionHeader("Git Panel"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Button",
-                    description: "Whether to show the git panel button in the status bar",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git_panel) = &settings_content.git_panel {
-                                &git_panel.button
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.git_panel.get_or_insert_default().button
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Dock",
-                    description: "Where to dock the git panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git_panel) = &settings_content.git_panel {
-                                &git_panel.dock
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.git_panel.get_or_insert_default().dock
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Default Width",
-                    description: "Default width of the git panel in pixels",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git_panel) = &settings_content.git_panel {
-                                &git_panel.default_width
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git_panel
-                                .get_or_insert_default()
-                                .default_width
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Notification Panel"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Notification Panel Button",
-                    description: "Whether to show the notification panel button in the status bar",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(notification_panel) = &settings_content.notification_panel {
-                                &notification_panel.button
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .notification_panel
-                                .get_or_insert_default()
-                                .button
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Notification Panel Dock",
-                    description: "Where to dock the notification panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(notification_panel) = &settings_content.notification_panel {
-                                &notification_panel.dock
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .notification_panel
-                                .get_or_insert_default()
-                                .dock
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Notification Panel Default Width",
-                    description: "Default width of the notification panel in pixels",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(notification_panel) = &settings_content.notification_panel {
-                                &notification_panel.default_width
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .notification_panel
-                                .get_or_insert_default()
-                                .default_width
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Collaboration Panel"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Collaboration Panel Button",
-                    description: "Whether to show the collaboration panel button in the status bar",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
-                            {
-                                &collaboration_panel.button
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .collaboration_panel
-                                .get_or_insert_default()
-                                .button
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Collaboration Panel Dock",
-                    description: "Where to dock the collaboration panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
-                            {
-                                &collaboration_panel.dock
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .collaboration_panel
-                                .get_or_insert_default()
-                                .dock
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Collaboration Panel Default Width",
-                    description: "Default width of the collaboration panel in pixels",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(collaboration_panel) = &settings_content.collaboration_panel
-                            {
-                                &collaboration_panel.default_width
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .collaboration_panel
-                                .get_or_insert_default()
-                                .default_width
-                        },
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "Version Control",
-            items: vec![
-                SettingsPageItem::SectionHeader("Git"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Git Gutter",
-                    description: "Control whether git status is shown in the editor's gutter",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                &git.git_gutter
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.git.get_or_insert_default().git_gutter
-                        },
-                    }),
-                    metadata: None,
-                }),
-                // todo(settings_ui): Figure out the right default for this value in default.json
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Gutter Debounce",
-                    description: "Debounce threshold in milliseconds after which changes are reflected in the git gutter",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                &git.gutter_debounce
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.git.get_or_insert_default().gutter_debounce
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Git Blame",
-                    description: "Whether or not to show git blame data inline in the currently focused line",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(inline_blame) = &git.inline_blame {
-                                    &inline_blame.enabled
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .inline_blame
-                                .get_or_insert_default()
-                                .enabled
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Git Blame Delay",
-                    description: "The delay after which the inline blame information is shown",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(inline_blame) = &git.inline_blame {
-                                    &inline_blame.delay_ms
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .inline_blame
-                                .get_or_insert_default()
-                                .delay_ms
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Git Blame Padding",
-                    description: "Padding between the end of the source line and the start of the inline blame in columns",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(inline_blame) = &git.inline_blame {
-                                    &inline_blame.padding
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .inline_blame
-                                .get_or_insert_default()
-                                .padding
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Git Blame Min Column",
-                    description: "The minimum column number to show the inline blame information at",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(inline_blame) = &git.inline_blame {
-                                    &inline_blame.min_column
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .inline_blame
-                                .get_or_insert_default()
-                                .min_column
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Commit Summary",
-                    description: "Whether to show commit summary as part of the inline blame",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(inline_blame) = &git.inline_blame {
-                                    &inline_blame.show_commit_summary
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .inline_blame
-                                .get_or_insert_default()
-                                .show_commit_summary
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Avatar",
-                    description: "Whether to show the avatar of the author of the commit",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(blame) = &git.blame {
-                                    &blame.show_avatar
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .blame
-                                .get_or_insert_default()
-                                .show_avatar
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Author Name In Branch Picker",
-                    description: "Whether to show author name as part of the commit information in branch picker",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                if let Some(branch_picker) = &git.branch_picker {
-                                    &branch_picker.show_author_name
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .git
-                                .get_or_insert_default()
-                                .branch_picker
-                                .get_or_insert_default()
-                                .show_author_name
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hunk Style",
-                    description: "How git hunks are displayed visually in the editor",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(git) = &settings_content.git {
-                                &git.hunk_style
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.git.get_or_insert_default().hunk_style
-                        },
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "System & Network",
-            items: vec![
-                SettingsPageItem::SectionHeader("Network"),
-                // todo(settings_ui): Proxy needs a default
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Proxy",
-                //     description: "The proxy to use for network requests",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| &settings_content.proxy,
-                //         pick_mut: |settings_content| &mut settings_content.proxy,
-                //     }),
-                //     metadata: Some(Box::new(SettingsFieldMetadata {
-                //         placeholder: Some("socks5h://localhost:10808"),
-                //     })),
-                // }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Server URL",
-                    description: "The URL of the Zed server to connect to",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.server_url,
-                        pick_mut: |settings_content| &mut settings_content.server_url,
-                    }),
-                    metadata: Some(Box::new(SettingsFieldMetadata {
-                        placeholder: Some("https://zed.dev"),
-                    })),
-                }),
-                SettingsPageItem::SectionHeader("System"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Update",
-                    description: "Whether or not to automatically check for updates",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.auto_update,
-                        pick_mut: |settings_content| &mut settings_content.auto_update,
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "Diagnostics & Errors",
-            items: vec![
-                SettingsPageItem::SectionHeader("Filtering"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Max Severity",
-                    description: "Which level to use to filter out diagnostics displayed in the editor",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.editor.diagnostics_max_severity,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.editor.diagnostics_max_severity
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Include Warnings",
-                    description: "Whether to show warnings or not by default",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                &diagnostics.include_warnings
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .include_warnings
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Inline"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Diagnostics Enabled",
-                    description: "Whether to show diagnostics inline or not",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                if let Some(inline) = &diagnostics.inline {
-                                    &inline.enabled
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .inline
-                                .get_or_insert_default()
-                                .enabled
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Update Debounce",
-                    description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                if let Some(inline) = &diagnostics.inline {
-                                    &inline.update_debounce_ms
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .inline
-                                .get_or_insert_default()
-                                .update_debounce_ms
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Padding",
-                    description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                if let Some(inline) = &diagnostics.inline {
-                                    &inline.padding
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .inline
-                                .get_or_insert_default()
-                                .padding
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Inline Min Column",
-                    description: "The minimum column to display inline diagnostics",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                if let Some(inline) = &diagnostics.inline {
-                                    &inline.min_column
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .inline
-                                .get_or_insert_default()
-                                .min_column
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Performance"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "LSP Pull Diagnostics Enabled",
-                    description: "Whether to pull for language server-powered diagnostics or not",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
-                                    &lsp_pull.enabled
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .lsp_pull_diagnostics
-                                .get_or_insert_default()
-                                .enabled
-                        },
-                    }),
-                    metadata: None,
-                }),
-                // todo(settings_ui): Needs unit
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "LSP Pull Debounce",
-                    description: "Minimum time to wait before pulling diagnostics from the language server(s)",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(diagnostics) = &settings_content.diagnostics {
-                                if let Some(lsp_pull) = &diagnostics.lsp_pull_diagnostics {
-                                    &lsp_pull.debounce_ms
-                                } else {
-                                    &None
-                                }
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .diagnostics
-                                .get_or_insert_default()
-                                .lsp_pull_diagnostics
-                                .get_or_insert_default()
-                                .debounce_ms
-                        },
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "Debugger",
-            items: vec![
-                SettingsPageItem::SectionHeader("General"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Stepping Granularity",
-                    description: "Determines the stepping granularity for debug operations",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.stepping_granularity
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .debugger
-                                .get_or_insert_default()
-                                .stepping_granularity
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Save Breakpoints",
-                    description: "Whether breakpoints should be reused across Zed sessions",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.save_breakpoints
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .debugger
-                                .get_or_insert_default()
-                                .save_breakpoints
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Timeout",
-                    description: "Time in milliseconds until timeout error when connecting to a TCP debug adapter",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.timeout
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.debugger.get_or_insert_default().timeout
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Dock",
-                    description: "The dock position of the debug panel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.dock
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.debugger.get_or_insert_default().dock
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Log DAP Communications",
-                    description: "Whether to log messages between active debug adapters and Zed",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.log_dap_communications
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .debugger
-                                .get_or_insert_default()
-                                .log_dap_communications
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Format DAP Log Messages",
-                    description: "Whether to format DAP messages when adding them to debug adapter logger",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.format_dap_log_messages
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .debugger
-                                .get_or_insert_default()
-                                .format_dap_log_messages
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Button",
-                    description: "Whether to show the debug button in the status bar",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(debugger) = &settings_content.debugger {
-                                &debugger.button
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.debugger.get_or_insert_default().button
-                        },
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "Collaboration",
-            items: vec![
-                SettingsPageItem::SectionHeader("Calls"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Mute On Join",
-                    description: "Whether the microphone should be muted when joining a channel or a call",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(calls) = &settings_content.calls {
-                                &calls.mute_on_join
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.calls.get_or_insert_default().mute_on_join
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Share On Join",
-                    description: "Whether your current project should be shared when joining an empty channel",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(calls) = &settings_content.calls {
-                                &calls.share_on_join
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.calls.get_or_insert_default().share_on_join
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Experimental"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Rodio Audio",
-                    description: "Opt into the new audio system",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(audio) = &settings_content.audio {
-                                &audio.rodio_audio
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.audio.get_or_insert_default().rodio_audio
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Microphone Volume",
-                    description: "Automatically adjust microphone volume (requires Rodio Audio)",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(audio) = &settings_content.audio {
-                                &audio.auto_microphone_volume
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .audio
-                                .get_or_insert_default()
-                                .auto_microphone_volume
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Speaker Volume",
-                    description: "Automatically adjust volume of other call members (requires Rodio Audio)",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(audio) = &settings_content.audio {
-                                &audio.auto_speaker_volume
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .audio
-                                .get_or_insert_default()
-                                .auto_speaker_volume
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Denoise",
-                    description: "Remove background noises (requires Rodio Audio)",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(audio) = &settings_content.audio {
-                                &audio.denoise
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.audio.get_or_insert_default().denoise
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Legacy Audio Compatible",
-                    description: "Use audio parameters compatible with previous versions (requires Rodio Audio)",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            if let Some(audio) = &settings_content.audio {
-                                &audio.legacy_audio_compatible
-                            } else {
-                                &None
-                            }
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .audio
-                                .get_or_insert_default()
-                                .legacy_audio_compatible
-                        },
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "AI",
-            items: vec![
-                SettingsPageItem::SectionHeader("General"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Disable AI",
-                    description: "Whether to disable all AI features in Zed",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.disable_ai,
-                        pick_mut: |settings_content| &mut settings_content.disable_ai,
-                    }),
-                    metadata: None,
-                }),
-            ],
-        },
-    ]
-}
-
-pub(crate) fn project_settings_data() -> Vec<SettingsPage> {
-    vec![
-        SettingsPage {
-            title: "Project",
-            items: vec![
-                SettingsPageItem::SectionHeader("Worktree Settings Content"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Project Name",
-                    description: "The displayed name of this project. If not set, the root directory name",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| &settings_content.project.worktree.project_name,
-                        pick_mut: |settings_content| {
-                            &mut settings_content.project.worktree.project_name
-                        },
-                    }),
-                    metadata: Some(Box::new(SettingsFieldMetadata {
-                        placeholder: Some("A new name"),
-                    })),
-                }),
-            ],
-        },
-        SettingsPage {
-            title: "Appearance & Behavior",
-            items: vec![
-                SettingsPageItem::SectionHeader("Guides"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Wrap Guides",
-                    description: "Whether to show wrap guides (vertical rulers)",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_wrap_guides
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_wrap_guides
-                        },
-                    }),
-                    metadata: None,
-                }),
-                // todo(settings_ui): This needs a custom component
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Wrap Guides",
-                //     description: "Character counts at which to show wrap guides",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| {
-                //             &settings_content
-                //                 .project
-                //                 .all_languages
-                //                 .defaults
-                //                 .wrap_guides
-                //         },
-                //         pick_mut: |settings_content| {
-                //             &mut settings_content
-                //                 .project
-                //                 .all_languages
-                //                 .defaults
-                //                 .wrap_guides
-                //         },
-                //     }),
-                //     metadata: None,
-                // }),
-                SettingsPageItem::SectionHeader("Whitespace"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Whitespace",
-                    description: "Whether to show tabs and spaces",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_whitespaces
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_whitespaces
+                                .legacy_audio_compatible
                         },
                     }),
                     metadata: None,
+                    files: USER,
                 }),
             ],
         },
         SettingsPage {
-            title: "Editing",
+            title: "AI",
             items: vec![
-                SettingsPageItem::SectionHeader("Indentation"),
-                // todo(settings_ui): Needs numeric stepper
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Tab Size",
-                //     description: "How many columns a tab should occupy",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| &settings_content.project.all_languages.defaults.tab_size,
-                //         pick_mut: |settings_content| &mut settings_content.project.all_languages.defaults.tab_size,
-                //     }),
-                //     metadata: None,
-                // }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Hard Tabs",
-                    description: "Whether to indent lines using tab characters, as opposed to multiple spaces",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.hard_tabs
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.hard_tabs
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Indent",
-                    description: "Whether indentation should be adjusted based on the context whilst typing",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.auto_indent
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.auto_indent
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Auto Indent On Paste",
-                    description: "Whether indentation of pasted content should be adjusted based on the context",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .auto_indent_on_paste
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .auto_indent_on_paste
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Wrapping"),
-                // todo(settings_ui): Needs numeric stepper
-                // SettingsPageItem::SettingItem(SettingItem {
-                //     title: "Preferred Line Length",
-                //     description: "The column at which to soft-wrap lines, for buffers where soft-wrap is enabled",
-                //     field: Box::new(SettingField {
-                //         pick: |settings_content| &settings_content.project.all_languages.defaults.preferred_line_length,
-                //         pick_mut: |settings_content| &mut settings_content.project.all_languages.defaults.preferred_line_length,
-                //     }),
-                //     metadata: None,
-                // }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Soft Wrap",
-                    description: "How to soft-wrap long lines of text",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content.project.all_languages.defaults.soft_wrap
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content.project.all_languages.defaults.soft_wrap
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Auto Actions"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use Autoclose",
-                    description: "Whether to automatically type closing characters for you",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_autoclose
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_autoclose
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use Auto Surround",
-                    description: "Whether to automatically surround text with characters for you",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_auto_surround
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_auto_surround
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Use On Type Format",
-                    description: "Whether to use additional LSP queries to format the code after every trigger symbol input",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_on_type_format
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .use_on_type_format
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Always Treat Brackets As Autoclosed",
-                    description: "Controls how the editor handles the autoclosed characters",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .always_treat_brackets_as_autoclosed
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .always_treat_brackets_as_autoclosed
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Formatting"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Remove Trailing Whitespace On Save",
-                    description: "Whether or not to remove any trailing whitespace from lines of a buffer before saving it",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .remove_trailing_whitespace_on_save
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .remove_trailing_whitespace_on_save
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Ensure Final Newline On Save",
-                    description: "Whether or not to ensure there's a single newline at the end of a buffer when saving it",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .ensure_final_newline_on_save
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .ensure_final_newline_on_save
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Extend Comment On Newline",
-                    description: "Whether to start a new line with a comment when a previous line is a comment as well",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .extend_comment_on_newline
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .extend_comment_on_newline
-                        },
-                    }),
-                    metadata: None,
-                }),
-                SettingsPageItem::SectionHeader("Completions"),
-                SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Completions On Input",
-                    description: "Whether to pop the completions menu while typing in an editor without explicitly requesting it",
-                    field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completions_on_input
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completions_on_input
-                        },
-                    }),
-                    metadata: None,
-                }),
+                SettingsPageItem::SectionHeader("General"),
                 SettingsPageItem::SettingItem(SettingItem {
-                    title: "Show Completion Documentation",
-                    description: "Whether to display inline and alongside documentation for items in the completions menu",
+                    title: "Disable AI",
+                    description: "Whether to disable all AI features in Zed",
                     field: Box::new(SettingField {
-                        pick: |settings_content| {
-                            &settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completion_documentation
-                        },
-                        pick_mut: |settings_content| {
-                            &mut settings_content
-                                .project
-                                .all_languages
-                                .defaults
-                                .show_completion_documentation
-                        },
+                        pick: |settings_content| &settings_content.disable_ai,
+                        pick_mut: |settings_content| &mut settings_content.disable_ai,
                     }),
                     metadata: None,
+                    files: USER,
                 }),
             ],
         },

crates/settings_ui/src/settings_ui.rs 🔗

@@ -29,10 +29,10 @@ use std::{
     sync::{Arc, LazyLock, RwLock, atomic::AtomicBool},
 };
 use ui::{
-    ButtonLike, ContextMenu, Divider, DropdownMenu, DropdownStyle, IconButtonShape,
-    KeybindingPosition, PopoverMenu, Switch, SwitchColor, TreeViewItem, WithScrollbar, prelude::*,
+    ContextMenu, Divider, DropdownMenu, DropdownStyle, IconButtonShape, KeyBinding, KeybindingHint,
+    PopoverMenu, Switch, SwitchColor, TreeViewItem, WithScrollbar, prelude::*,
 };
-use ui_input::{NumericStepper, NumericStepperStyle, NumericStepperType};
+use ui_input::{NumberField, NumberFieldType};
 use util::{ResultExt as _, paths::PathStyle, rel_path::RelPath};
 use zed_actions::OpenSettingsEditor;
 
@@ -46,6 +46,8 @@ const CONTENT_GROUP_TAB_INDEX: isize = 3;
 actions!(
     settings_editor,
     [
+        /// Minimizes the settings UI window.
+        Minimize,
         /// Toggles focus between the navbar and the main content.
         ToggleFocusNav,
         /// Focuses the next file in the file list.
@@ -375,31 +377,31 @@ fn init_renderers(cx: &mut App) {
             render_dropdown(*settings_field, file, window, cx)
         })
         .add_renderer::<f32>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<u32>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<u64>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<usize>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<NonZero<usize>>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<NonZeroU32>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<CodeFade>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<FontWeight>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<settings::MinimumContrast>(|settings_field, file, _, window, cx| {
-            render_numeric_stepper(*settings_field, file, window, cx)
+            render_number_field(*settings_field, file, window, cx)
         })
         .add_renderer::<settings::ShowScrollbar>(|settings_field, file, _, window, cx| {
             render_dropdown(*settings_field, file, window, cx)
@@ -439,6 +441,20 @@ fn init_renderers(cx: &mut App) {
 }
 
 pub fn open_settings_editor(cx: &mut App) -> anyhow::Result<WindowHandle<SettingsWindow>> {
+    let existing_window = cx
+        .windows()
+        .into_iter()
+        .find_map(|window| window.downcast::<SettingsWindow>());
+
+    if let Some(existing_window) = existing_window {
+        existing_window
+            .update(cx, |_, window, _| {
+                window.activate_window();
+            })
+            .ok();
+        return Ok(existing_window);
+    }
+
     cx.open_window(
         WindowOptions {
             titlebar: Some(TitlebarOptions {
@@ -488,6 +504,7 @@ pub struct SettingsWindow {
     list_handle: UniformListScrollHandle,
     search_matches: Vec<Vec<bool>>,
     scroll_handle: ScrollHandle,
+    focus_handle: FocusHandle,
     navbar_focus_handle: FocusHandle,
     content_focus_handle: FocusHandle,
     files_focus_handle: FocusHandle,
@@ -665,6 +682,55 @@ struct SettingItem {
     description: &'static str,
     field: Box<dyn AnySettingField>,
     metadata: Option<Box<SettingsFieldMetadata>>,
+    files: FileMask,
+}
+
+#[derive(PartialEq, Eq, Clone, Copy)]
+struct FileMask(u8);
+
+impl std::fmt::Debug for FileMask {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "FileMask(")?;
+        let mut items = vec![];
+
+        if self.contains(USER) {
+            items.push("USER");
+        }
+        if self.contains(LOCAL) {
+            items.push("LOCAL");
+        }
+        if self.contains(SERVER) {
+            items.push("SERVER");
+        }
+
+        write!(f, "{})", items.join(" | "))
+    }
+}
+
+const USER: FileMask = FileMask(1 << 0);
+const LOCAL: FileMask = FileMask(1 << 2);
+const SERVER: FileMask = FileMask(1 << 3);
+
+impl std::ops::BitAnd for FileMask {
+    type Output = Self;
+
+    fn bitand(self, other: Self) -> Self {
+        Self(self.0 & other.0)
+    }
+}
+
+impl std::ops::BitOr for FileMask {
+    type Output = Self;
+
+    fn bitor(self, other: Self) -> Self {
+        Self(self.0 | other.0)
+    }
+}
+
+impl FileMask {
+    fn contains(&self, other: FileMask) -> bool {
+        self.0 & other.0 != 0
+    }
 }
 
 impl PartialEq for SettingItem {
@@ -682,6 +748,7 @@ impl PartialEq for SettingItem {
 #[derive(Clone)]
 struct SubPageLink {
     title: &'static str,
+    files: FileMask,
     render: Arc<
         dyn Fn(&mut SettingsWindow, &mut Window, &mut Context<SettingsWindow>) -> AnyElement
             + 'static
@@ -705,14 +772,6 @@ enum SettingsUiFile {
 }
 
 impl SettingsUiFile {
-    fn pages(&self) -> Vec<SettingsPage> {
-        match self {
-            SettingsUiFile::User => page_data::user_settings_data(),
-            SettingsUiFile::Local(_) => page_data::project_settings_data(),
-            SettingsUiFile::Server(_) => page_data::user_settings_data(),
-        }
-    }
-
     fn name(&self) -> SharedString {
         match self {
             SettingsUiFile::User => SharedString::new_static("User"),
@@ -740,6 +799,14 @@ impl SettingsUiFile {
             SettingsUiFile::Server(_) => settings::SettingsFile::Server,
         }
     }
+
+    fn mask(&self) -> FileMask {
+        match self {
+            SettingsUiFile::User => USER,
+            SettingsUiFile::Local(_) => LOCAL,
+            SettingsUiFile::Server(_) => SERVER,
+        }
+    }
 }
 
 impl SettingsWindow {
@@ -787,6 +854,7 @@ impl SettingsWindow {
             search_task: None,
             search_matches: vec![],
             scroll_handle: ScrollHandle::new(),
+            focus_handle: cx.focus_handle(),
             navbar_focus_handle: cx
                 .focus_handle()
                 .tab_index(NAVBAR_CONTAINER_TAB_INDEX)
@@ -827,6 +895,24 @@ impl SettingsWindow {
     }
 
     fn build_navbar(&mut self) {
+        let mut prev_navbar_state = HashMap::new();
+        let mut root_entry = "";
+        let mut prev_selected_entry = None;
+        for (index, entry) in self.navbar_entries.iter().enumerate() {
+            let sub_entry_title;
+            if entry.is_root {
+                sub_entry_title = None;
+                root_entry = entry.title;
+            } else {
+                sub_entry_title = Some(entry.title);
+            }
+            let key = (root_entry, sub_entry_title);
+            if index == self.navbar_entry {
+                prev_selected_entry = Some(key);
+            }
+            prev_navbar_state.insert(key, entry.expanded);
+        }
+
         let mut navbar_entries = Vec::with_capacity(self.navbar_entries.len());
         for (page_index, page) in self.pages.iter().enumerate() {
             navbar_entries.push(NavBarEntry {
@@ -850,6 +936,27 @@ impl SettingsWindow {
                 });
             }
         }
+
+        let mut root_entry = "";
+        let mut found_nav_entry = false;
+        for (index, entry) in navbar_entries.iter_mut().enumerate() {
+            let sub_entry_title;
+            if entry.is_root {
+                root_entry = entry.title;
+                sub_entry_title = None;
+            } else {
+                sub_entry_title = Some(entry.title);
+            };
+            let key = (root_entry, sub_entry_title);
+            if Some(key) == prev_selected_entry {
+                self.navbar_entry = index;
+                found_nav_entry = true;
+            }
+            entry.expanded = *prev_navbar_state.get(&key).unwrap_or(&false);
+        }
+        if !found_nav_entry {
+            self.navbar_entry = 0;
+        }
         self.navbar_entries = navbar_entries;
     }
 
@@ -891,6 +998,45 @@ impl SettingsWindow {
         })
     }
 
+    fn filter_matches_to_file(&mut self) {
+        let current_file = self.current_file.mask();
+        for (page, page_filter) in std::iter::zip(&self.pages, &mut self.search_matches) {
+            let mut header_index = 0;
+            let mut any_found_since_last_header = true;
+
+            for (index, item) in page.items.iter().enumerate() {
+                match item {
+                    SettingsPageItem::SectionHeader(_) => {
+                        if !any_found_since_last_header {
+                            page_filter[header_index] = false;
+                        }
+                        header_index = index;
+                        any_found_since_last_header = false;
+                    }
+                    SettingsPageItem::SettingItem(setting_item) => {
+                        if !setting_item.files.contains(current_file) {
+                            page_filter[index] = false;
+                        } else {
+                            any_found_since_last_header = true;
+                        }
+                    }
+                    SettingsPageItem::SubPageLink(sub_page_link) => {
+                        if !sub_page_link.files.contains(current_file) {
+                            page_filter[index] = false;
+                        } else {
+                            any_found_since_last_header = true;
+                        }
+                    }
+                }
+            }
+            if let Some(last_header) = page_filter.get_mut(header_index)
+                && !any_found_since_last_header
+            {
+                *last_header = false;
+            }
+        }
+    }
+
     fn update_matches(&mut self, cx: &mut Context<SettingsWindow>) {
         self.search_task.take();
         let query = self.search_bar.read(cx).text(cx);
@@ -898,6 +1044,7 @@ impl SettingsWindow {
             for page in &mut self.search_matches {
                 page.fill(true);
             }
+            self.filter_matches_to_file();
             cx.notify();
             return;
         }
@@ -963,6 +1110,7 @@ impl SettingsWindow {
                     page[header_index] = true;
                     page[item_index] = true;
                 }
+                this.filter_matches_to_file();
                 let first_navbar_entry_index = this
                     .visible_navbar_entries()
                     .next()
@@ -984,13 +1132,13 @@ impl SettingsWindow {
     }
 
     fn build_ui(&mut self, cx: &mut Context<SettingsWindow>) {
-        self.pages = self.current_file.pages();
+        if self.pages.is_empty() {
+            self.pages = page_data::settings_data();
+        }
         self.build_search_matches();
         self.build_navbar();
 
-        if !self.search_bar.read(cx).is_empty(cx) {
-            self.update_matches(cx);
-        }
+        self.update_matches(cx);
 
         cx.notify();
     }
@@ -1055,27 +1203,46 @@ impl SettingsWindow {
             return;
         }
         self.current_file = self.files[ix].0.clone();
-        self.navbar_entry = 0;
+        // self.navbar_entry = 0;
         self.build_ui(cx);
     }
 
-    fn render_files(&self, _window: &mut Window, cx: &mut Context<SettingsWindow>) -> Div {
-        h_flex().gap_1().children(self.files.iter().enumerate().map(
-            |(ix, (file, focus_handle))| {
-                Button::new(ix, file.name())
-                    .toggle_state(file == &self.current_file)
-                    .selected_style(ButtonStyle::Tinted(ui::TintColor::Accent))
-                    .track_focus(focus_handle)
-                    .on_click(
-                        cx.listener(move |this, evt: &gpui::ClickEvent, window, cx| {
-                            this.change_file(ix, cx);
-                            if evt.is_keyboard() {
-                                this.focus_first_nav_item(window, cx);
-                            }
-                        }),
-                    )
-            },
-        ))
+    fn render_files(
+        &self,
+        _window: &mut Window,
+        cx: &mut Context<SettingsWindow>,
+    ) -> impl IntoElement {
+        h_flex()
+            .w_full()
+            .gap_1()
+            .justify_between()
+            .child(
+                h_flex()
+                    .id("file_buttons_container")
+                    .w_64() // Temporary fix until long-term solution is a fixed set of buttons representing a file location (User, Project, and Remote)
+                    .gap_1()
+                    .overflow_x_scroll()
+                    .children(
+                        self.files
+                            .iter()
+                            .enumerate()
+                            .map(|(ix, (file, focus_handle))| {
+                                Button::new(ix, file.name())
+                                    .toggle_state(file == &self.current_file)
+                                    .selected_style(ButtonStyle::Tinted(ui::TintColor::Accent))
+                                    .track_focus(focus_handle)
+                                    .on_click(cx.listener(
+                                        move |this, evt: &gpui::ClickEvent, window, cx| {
+                                            this.change_file(ix, cx);
+                                            if evt.is_keyboard() {
+                                                this.focus_first_nav_item(window, cx);
+                                            }
+                                        },
+                                    ))
+                            }),
+                    ),
+            )
+            .child(Button::new("temp", "Edit in settings.json").style(ButtonStyle::Outlined)) // This should be replaced by the actual, functioning button
     }
 
     fn render_search(&self, _window: &mut Window, cx: &mut App) -> Div {
@@ -1098,6 +1265,11 @@ impl SettingsWindow {
     ) -> impl IntoElement {
         let visible_count = self.visible_navbar_entries().count();
         let nav_background = cx.theme().colors().panel_background;
+        let focus_keybind_label = if self.navbar_focus_handle.contains_focused(window, cx) {
+            "Focus Content"
+        } else {
+            "Focus Navbar"
+        };
 
         v_flex()
             .w_64()
@@ -1190,23 +1362,21 @@ impl SettingsWindow {
                     .vertical_scrollbar_for(self.list_handle.clone(), window, cx),
             )
             .child(
-                h_flex().w_full().justify_center().bg(nav_background).child(
-                    Button::new(
-                        "nav-key-hint",
-                        if self.navbar_focus_handle.contains_focused(window, cx) {
-                            "Focus Content"
-                        } else {
-                            "Focus Navbar"
-                        },
-                    )
-                    .key_binding(ui::KeyBinding::for_action_in(
-                        &ToggleFocusNav,
-                        &self.navbar_focus_handle,
-                        window,
-                        cx,
-                    ))
-                    .key_binding_position(KeybindingPosition::Start),
-                ),
+                h_flex()
+                    .w_full()
+                    .p_2()
+                    .pb_0p5()
+                    .border_t_1()
+                    .border_color(cx.theme().colors().border_variant)
+                    .children(
+                        KeyBinding::for_action(&ToggleFocusNav, window, cx).map(|this| {
+                            KeybindingHint::new(
+                                this,
+                                cx.theme().colors().surface_background.opacity(0.5),
+                            )
+                            .suffix(focus_keybind_label)
+                        }),
+                    ),
             )
     }
 
@@ -1331,7 +1501,7 @@ impl SettingsWindow {
         let page_content;
 
         if sub_page_stack().len() == 0 {
-            page_header = self.render_files(window, cx);
+            page_header = self.render_files(window, cx).into_any_element();
             page_content = self
                 .render_page_items(self.page_items(), window, cx)
                 .into_any_element();
@@ -1347,7 +1517,8 @@ impl SettingsWindow {
                             this.pop_sub_page(cx);
                         })),
                 )
-                .child(self.render_sub_page_breadcrumbs());
+                .child(self.render_sub_page_breadcrumbs())
+                .into_any_element();
 
             let active_page_render_fn = sub_page_stack().last().unwrap().link.render.clone();
             page_content = (active_page_render_fn)(self, window, cx);
@@ -1445,12 +1616,10 @@ impl Render for SettingsWindow {
         div()
             .id("settings-window")
             .key_context("SettingsWindow")
-            .flex()
-            .flex_row()
-            .size_full()
-            .font(ui_font)
-            .bg(cx.theme().colors().background)
-            .text_color(cx.theme().colors().text)
+            .track_focus(&self.focus_handle)
+            .on_action(|_: &Minimize, window, _cx| {
+                window.minimize_window();
+            })
             .on_action(cx.listener(|this, _: &search::FocusSearch, window, cx| {
                 this.search_bar.focus_handle(cx).focus(window);
             }))
@@ -1483,6 +1652,12 @@ impl Render for SettingsWindow {
             .on_action(|_: &menu::SelectPrevious, window, _| {
                 window.focus_prev();
             })
+            .flex()
+            .flex_row()
+            .size_full()
+            .font(ui_font)
+            .bg(cx.theme().colors().background)
+            .text_color(cx.theme().colors().text)
             .child(self.render_nav(window, cx))
             .child(self.render_page(window, cx))
     }
@@ -1622,40 +1797,28 @@ fn render_font_picker(
         )
     });
 
-    div()
-        .child(
-            PopoverMenu::new("font-picker")
-                .menu(move |_window, _cx| Some(font_picker.clone()))
-                .trigger(
-                    ButtonLike::new("font-family-button")
-                        .style(ButtonStyle::Outlined)
-                        .size(ButtonSize::Medium)
-                        .full_width()
-                        .tab_index(0_isize)
-                        .child(
-                            h_flex()
-                                .w_full()
-                                .justify_between()
-                                .child(Label::new(current_value))
-                                .child(
-                                    Icon::new(IconName::ChevronUpDown)
-                                        .color(Color::Muted)
-                                        .size(IconSize::XSmall),
-                                ),
-                        ),
-                )
-                .full_width(true)
-                .anchor(gpui::Corner::TopLeft)
-                .offset(gpui::Point {
-                    x: px(0.0),
-                    y: px(4.0),
-                })
-                .with_handle(ui::PopoverMenuHandle::default()),
+    PopoverMenu::new("font-picker")
+        .menu(move |_window, _cx| Some(font_picker.clone()))
+        .trigger(
+            Button::new("font-family-button", current_value)
+                .tab_index(0_isize)
+                .style(ButtonStyle::Outlined)
+                .size(ButtonSize::Medium)
+                .icon(IconName::ChevronUpDown)
+                .icon_color(Color::Muted)
+                .icon_size(IconSize::Small)
+                .icon_position(IconPosition::End),
         )
+        .anchor(gpui::Corner::TopLeft)
+        .offset(gpui::Point {
+            x: px(0.0),
+            y: px(2.0),
+        })
+        .with_handle(ui::PopoverMenuHandle::default())
         .into_any_element()
 }
 
-fn render_numeric_stepper<T: NumericStepperType + Send + Sync>(
+fn render_number_field<T: NumberFieldType + Send + Sync>(
     field: SettingField<T>,
     file: SettingsUiFile,
     window: &mut Window,
@@ -1663,7 +1826,7 @@ fn render_numeric_stepper<T: NumericStepperType + Send + Sync>(
 ) -> AnyElement {
     let (_, value) = SettingsStore::global(cx).get_value_from_file(file.to_settings(), field.pick);
     let value = value.copied().unwrap_or_else(T::min_value);
-    NumericStepper::new("numeric_stepper", value, window, cx)
+    NumberField::new("numeric_stepper", value, window, cx)
         .on_change({
             move |value, _window, cx| {
                 let value = *value;
@@ -1674,7 +1837,6 @@ fn render_numeric_stepper<T: NumericStepperType + Send + Sync>(
             }
         })
         .tab_index(0)
-        .style(NumericStepperStyle::Outlined)
         .into_any_element()
 }
 
@@ -1816,6 +1978,7 @@ mod test {
     impl SettingsPageItem {
         fn basic_item(title: &'static str, description: &'static str) -> Self {
             SettingsPageItem::SettingItem(SettingItem {
+                files: USER,
                 title,
                 description,
                 field: Box::new(SettingField {
@@ -1902,6 +2065,7 @@ mod test {
             search_matches: vec![],
             search_task: None,
             scroll_handle: ScrollHandle::new(),
+            focus_handle: cx.focus_handle(),
             navbar_focus_handle: cx.focus_handle(),
             content_focus_handle: cx.focus_handle(),
             files_focus_handle: cx.focus_handle(),

crates/ui/src/components/button/button.rs 🔗

@@ -474,7 +474,6 @@ impl RenderOnce for Button {
     }
 }
 
-// View this component preview using `workspace: open component-preview`
 impl Component for Button {
     fn scope() -> ComponentScope {
         ComponentScope::Input

crates/ui/src/components/button/button_like.rs 🔗

@@ -625,7 +625,13 @@ impl RenderOnce for ButtonLike {
                     |refinement: StyleRefinement| refinement.bg(hovered_style.background);
                 this.cursor(self.cursor_style)
                     .hover(focus_color)
-                    .focus(focus_color)
+                    .map(|this| {
+                        if matches!(self.style, ButtonStyle::Outlined) {
+                            this.focus(|s| s.border_color(cx.theme().colors().border_focused))
+                        } else {
+                            this.focus(focus_color)
+                        }
+                    })
                     .active(|active| active.bg(style.active(cx).background))
             })
             .when_some(

crates/ui/src/components/keybinding_hint.rs 🔗

@@ -1,5 +1,5 @@
 use crate::KeyBinding;
-use crate::{h_flex, prelude::*};
+use crate::prelude::*;
 use gpui::{AnyElement, App, BoxShadow, FontStyle, Hsla, IntoElement, Window, point};
 use theme::Appearance;
 
@@ -206,20 +206,23 @@ impl KeybindingHint {
 
 impl RenderOnce for KeybindingHint {
     fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement {
-        let colors = cx.theme().colors().clone();
+        let colors = cx.theme().colors();
         let is_light = cx.theme().appearance() == Appearance::Light;
 
         let border_color =
             self.background_color
                 .blend(colors.text.alpha(if is_light { 0.08 } else { 0.16 }));
-        let bg_color =
-            self.background_color
-                .blend(colors.text.alpha(if is_light { 0.06 } else { 0.12 }));
+
+        let bg_color = self
+            .background_color
+            .blend(colors.text_accent.alpha(if is_light { 0.05 } else { 0.1 }));
+
         let shadow_color = colors.text.alpha(if is_light { 0.04 } else { 0.08 });
 
         let size = self
             .size
             .unwrap_or(TextSize::Small.rems(cx).to_pixels(window.rem_size()));
+
         let kb_size = size - px(2.0);
 
         let mut base = h_flex();
@@ -228,15 +231,13 @@ impl RenderOnce for KeybindingHint {
             .get_or_insert_with(Default::default)
             .font_style = Some(FontStyle::Italic);
 
-        base.items_center()
-            .gap_0p5()
+        base.gap_1()
             .font_buffer(cx)
             .text_size(size)
             .text_color(colors.text_disabled)
             .children(self.prefix)
             .child(
                 h_flex()
-                    .items_center()
                     .rounded_sm()
                     .px_0p5()
                     .mr_0p5()

crates/ui/src/components/tree_view_item.rs 🔗

@@ -152,6 +152,7 @@ impl RenderOnce for TreeViewItem {
                     .when_some(self.tab_index, |this, index| this.tab_index(index))
                     .map(|this| {
                         let label = self.label;
+
                         if self.root_item {
                             this.h(item_size)
                                 .px_1()
@@ -159,11 +160,11 @@ impl RenderOnce for TreeViewItem {
                                 .gap_2p5()
                                 .rounded_sm()
                                 .border_1()
-                                .focus(|s| s.border_color(focused_border))
                                 .border_color(transparent_border)
                                 .when(self.selected, |this| {
                                     this.border_color(selected_border).bg(selected_bg)
                                 })
+                                .focus(|s| s.border_color(focused_border))
                                 .hover(|s| s.bg(cx.theme().colors().element_hover))
                                 .child(
                                     Disclosure::new("toggle", self.expanded)
@@ -190,11 +191,11 @@ impl RenderOnce for TreeViewItem {
                                     .rounded_sm()
                                     .border_1()
                                     .focusable()
-                                    .in_focus(|s| s.border_color(focused_border))
                                     .border_color(transparent_border)
                                     .when(self.selected, |this| {
                                         this.border_color(selected_border).bg(selected_bg)
                                     })
+                                    .in_focus(|s| s.border_color(focused_border))
                                     .hover(|s| s.bg(cx.theme().colors().element_hover))
                                     .child(
                                         Label::new(label)
@@ -211,10 +212,12 @@ impl RenderOnce for TreeViewItem {
                                 && let Some(on_toggle) = self.on_toggle.clone()
                             {
                                 this.on_click(move |event, window, cx| {
-                                    if !event.is_keyboard() {
+                                    if event.is_keyboard() {
+                                        on_click(event, window, cx);
+                                        on_toggle(event, window, cx);
+                                    } else {
                                         on_click(event, window, cx);
                                     }
-                                    on_toggle(event, window, cx);
                                 })
                             } else {
                                 this.on_click(on_click)

crates/ui_input/src/font_picker.rs 🔗

@@ -1,7 +1,7 @@
 use std::sync::Arc;
 
 use fuzzy::{StringMatch, StringMatchCandidate};
-use gpui::{AnyElement, App, Context, SharedString, Task, Window};
+use gpui::{AnyElement, App, Context, DismissEvent, SharedString, Task, Window};
 use picker::{Picker, PickerDelegate};
 use theme::FontFamilyCache;
 use ui::{ListItem, ListItemSpacing, prelude::*};
@@ -139,7 +139,12 @@ impl PickerDelegate for FontPickerDelegate {
         }
     }
 
-    fn dismissed(&mut self, _window: &mut Window, _cx: &mut Context<FontPicker>) {}
+    fn dismissed(&mut self, window: &mut Window, cx: &mut Context<FontPicker>) {
+        cx.defer_in(window, |picker, window, cx| {
+            picker.set_query("", window, cx);
+        });
+        cx.emit(DismissEvent);
+    }
 
     fn render_match(
         &self,
@@ -172,5 +177,5 @@ pub fn font_picker(
     Picker::uniform_list(delegate, window, cx)
         .show_scrollbar(true)
         .width(rems_from_px(210.))
-        .max_height(Some(rems(20.).into()))
+        .max_height(Some(rems(18.).into()))
 }

crates/ui_input/src/numeric_stepper.rs → crates/ui_input/src/number_field.rs 🔗

@@ -9,25 +9,16 @@ use editor::{Editor, EditorStyle};
 use gpui::{ClickEvent, Entity, FocusHandle, Focusable, FontWeight, Modifiers};
 
 use settings::{CodeFade, MinimumContrast};
-use ui::{IconButtonShape, prelude::*};
+use ui::prelude::*;
 
 #[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
-pub enum NumericStepperStyle {
-    Outlined,
-    #[default]
-    Ghost,
-}
-
-#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
-pub enum NumericStepperMode {
+pub enum NumberFieldMode {
     #[default]
     Read,
     Edit,
 }
 
-pub trait NumericStepperType:
-    Display + Copy + Clone + Sized + PartialOrd + FromStr + 'static
-{
+pub trait NumberFieldType: Display + Copy + Clone + Sized + PartialOrd + FromStr + 'static {
     fn default_format(value: &Self) -> String {
         format!("{}", value)
     }
@@ -40,7 +31,7 @@ pub trait NumericStepperType:
     fn saturating_sub(self, rhs: Self) -> Self;
 }
 
-impl NumericStepperType for gpui::FontWeight {
+impl NumberFieldType for gpui::FontWeight {
     fn default_step() -> Self {
         FontWeight(10.0)
     }
@@ -64,7 +55,7 @@ impl NumericStepperType for gpui::FontWeight {
     }
 }
 
-impl NumericStepperType for settings::CodeFade {
+impl NumberFieldType for settings::CodeFade {
     fn default_step() -> Self {
         CodeFade(0.10)
     }
@@ -88,7 +79,7 @@ impl NumericStepperType for settings::CodeFade {
     }
 }
 
-impl NumericStepperType for settings::MinimumContrast {
+impl NumberFieldType for settings::MinimumContrast {
     fn default_step() -> Self {
         MinimumContrast(1.0)
     }
@@ -114,7 +105,7 @@ impl NumericStepperType for settings::MinimumContrast {
 
 macro_rules! impl_numeric_stepper_int {
     ($type:ident) => {
-        impl NumericStepperType for $type {
+        impl NumberFieldType for $type {
             fn default_step() -> Self {
                 1
             }
@@ -148,7 +139,7 @@ macro_rules! impl_numeric_stepper_int {
 
 macro_rules! impl_numeric_stepper_nonzero_int {
     ($nonzero:ty, $inner:ty) => {
-        impl NumericStepperType for $nonzero {
+        impl NumberFieldType for $nonzero {
             fn default_step() -> Self {
                 <$nonzero>::new(1).unwrap()
             }
@@ -184,7 +175,7 @@ macro_rules! impl_numeric_stepper_nonzero_int {
 
 macro_rules! impl_numeric_stepper_float {
     ($type:ident) => {
-        impl NumericStepperType for $type {
+        impl NumberFieldType for $type {
             fn default_format(value: &Self) -> String {
                 format!("{:.2}", value)
             }
@@ -234,12 +225,11 @@ impl_numeric_stepper_nonzero_int!(NonZeroU64, u64);
 impl_numeric_stepper_nonzero_int!(NonZero<usize>, usize);
 
 #[derive(RegisterComponent)]
-pub struct NumericStepper<T = usize> {
+pub struct NumberField<T = usize> {
     id: ElementId,
     value: T,
-    style: NumericStepperStyle,
     focus_handle: FocusHandle,
-    mode: Entity<NumericStepperMode>,
+    mode: Entity<NumberFieldMode>,
     format: Box<dyn FnOnce(&T) -> String>,
     large_step: T,
     small_step: T,
@@ -251,12 +241,12 @@ pub struct NumericStepper<T = usize> {
     tab_index: Option<isize>,
 }
 
-impl<T: NumericStepperType> NumericStepper<T> {
+impl<T: NumberFieldType> NumberField<T> {
     pub fn new(id: impl Into<ElementId>, value: T, window: &mut Window, cx: &mut App) -> Self {
         let id = id.into();
 
         let (mode, focus_handle) = window.with_id(id.clone(), |window| {
-            let mode = window.use_state(cx, |_, _| NumericStepperMode::default());
+            let mode = window.use_state(cx, |_, _| NumberFieldMode::default());
             let focus_handle = window.use_state(cx, |_, cx| cx.focus_handle());
             (mode, focus_handle)
         });
@@ -266,7 +256,6 @@ impl<T: NumericStepperType> NumericStepper<T> {
             mode,
             value,
             focus_handle: focus_handle.read(cx).clone(),
-            style: NumericStepperStyle::default(),
             format: Box::new(T::default_format),
             large_step: T::large_step(),
             step: T::default_step(),
@@ -309,11 +298,6 @@ impl<T: NumericStepperType> NumericStepper<T> {
         self
     }
 
-    pub fn style(mut self, style: NumericStepperStyle) -> Self {
-        self.style = style;
-        self
-    }
-
     pub fn on_reset(
         mut self,
         on_reset: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static,
@@ -333,7 +317,7 @@ impl<T: NumericStepperType> NumericStepper<T> {
     }
 }
 
-impl<T: NumericStepperType> IntoElement for NumericStepper<T> {
+impl<T: NumberFieldType> IntoElement for NumberField<T> {
     type Element = gpui::Component<Self>;
 
     fn into_element(self) -> Self::Element {
@@ -341,12 +325,8 @@ impl<T: NumericStepperType> IntoElement for NumericStepper<T> {
     }
 }
 
-impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
+impl<T: NumberFieldType> RenderOnce for NumberField<T> {
     fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement {
-        let shape = IconButtonShape::Square;
-        let icon_size = IconSize::Small;
-
-        let is_outlined = matches!(self.style, NumericStepperStyle::Outlined);
         let mut tab_index = self.tab_index;
 
         let get_step = {
@@ -371,8 +351,7 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
             .when_some(self.on_reset, |this, on_reset| {
                 this.child(
                     IconButton::new("reset", IconName::RotateCcw)
-                        .shape(shape)
-                        .icon_size(icon_size)
+                        .icon_size(IconSize::Small)
                         .when_some(tab_index.as_mut(), |this, tab_index| {
                             *tab_index += 1;
                             this.tab_index(*tab_index - 1)
@@ -382,18 +361,6 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
             })
             .child(
                 h_flex()
-                    .gap_1()
-                    .rounded_sm()
-                    .map(|this| {
-                        if is_outlined {
-                            this.overflow_hidden()
-                                .bg(cx.theme().colors().surface_background)
-                                .border_1()
-                                .border_color(cx.theme().colors().border_variant)
-                        } else {
-                            this.px_1().bg(cx.theme().colors().editor_background)
-                        }
-                    })
                     .map(|decrement| {
                         let decrement_handler = {
                             let value = self.value;
@@ -408,50 +375,42 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
                             }
                         };
 
-                        if is_outlined {
-                            decrement.child(
-                                h_flex()
-                                    .id("decrement_button")
-                                    .p_1p5()
-                                    .size_full()
-                                    .justify_center()
-                                    .hover(|s| {
-                                        s.bg(cx.theme().colors().element_hover)
-                                            .cursor(gpui::CursorStyle::PointingHand)
-                                    })
-                                    .border_r_1()
-                                    .border_color(cx.theme().colors().border_variant)
-                                    .child(Icon::new(IconName::Dash).size(IconSize::Small))
-                                    .when_some(tab_index.as_mut(), |this, tab_index| {
-                                        *tab_index += 1;
-                                        this.tab_index(*tab_index - 1).focus(|style| {
-                                            style.bg(cx.theme().colors().element_hover)
-                                        })
-                                    })
-                                    .on_click(decrement_handler),
-                            )
-                        } else {
-                            decrement.child(
-                                IconButton::new("decrement", IconName::Dash)
-                                    .shape(shape)
-                                    .icon_size(icon_size)
-                                    .when_some(tab_index.as_mut(), |this, tab_index| {
-                                        *tab_index += 1;
-                                        this.tab_index(*tab_index - 1)
+                        decrement.child(
+                            h_flex()
+                                .id("decrement_button")
+                                .cursor(gpui::CursorStyle::PointingHand)
+                                .p_1p5()
+                                .size_full()
+                                .justify_center()
+                                .overflow_hidden()
+                                .rounded_tl_sm()
+                                .rounded_bl_sm()
+                                .border_1()
+                                .border_color(cx.theme().colors().border_variant)
+                                .bg(cx.theme().colors().surface_background)
+                                .hover(|s| s.bg(cx.theme().colors().element_hover))
+                                .child(Icon::new(IconName::Dash).size(IconSize::Small))
+                                .when_some(tab_index.as_mut(), |this, tab_index| {
+                                    *tab_index += 1;
+                                    this.tab_index(*tab_index - 1).focus(|style| {
+                                        style
+                                            .border_color(cx.theme().colors().border_focused)
+                                            .bg(cx.theme().colors().element_hover)
                                     })
-                                    .on_click(decrement_handler),
-                            )
-                        }
+                                })
+                                .on_click(decrement_handler),
+                        )
                     })
                     .child(
                         h_flex()
                             .min_w_16()
-                            .w_full()
-                            .border_1()
-                            .border_color(cx.theme().colors().border_transparent)
+                            .size_full()
+                            .border_y_1()
+                            .border_color(cx.theme().colors().border_variant)
+                            .bg(cx.theme().colors().surface_background)
                             .in_focus(|this| this.border_color(cx.theme().colors().border_focused))
                             .child(match *self.mode.read(cx) {
-                                NumericStepperMode::Read => h_flex()
+                                NumberFieldMode::Read => h_flex()
                                     .id("numeric_stepper_label")
                                     .px_1()
                                     .flex_1()
@@ -460,7 +419,9 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
                                     .when_some(tab_index.as_mut(), |this, tab_index| {
                                         *tab_index += 1;
                                         this.tab_index(*tab_index - 1).focus(|style| {
-                                            style.bg(cx.theme().colors().element_hover)
+                                            style
+                                                .border_color(cx.theme().colors().border_focused)
+                                                .bg(cx.theme().colors().element_hover)
                                         })
                                     })
                                     .on_click({
@@ -468,12 +429,12 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
                                         move |click, _, _cx| {
                                             if click.click_count() == 2 || click.is_keyboard() {
                                                 // Edit mode is disabled until we implement center text alignment for editor
-                                                // mode.write(cx, NumericStepperMode::Edit);
+                                                // mode.write(cx, NumberFieldMode::Edit);
                                             }
                                         }
                                     })
                                     .into_any_element(),
-                                NumericStepperMode::Edit => h_flex()
+                                NumberFieldMode::Edit => h_flex()
                                     .flex_1()
                                     .child(window.use_state(cx, {
                                         |window, cx| {
@@ -508,7 +469,7 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
                                                         }
                                                         on_change(&new_value, window, cx);
                                                     };
-                                                    mode.write(cx, NumericStepperMode::Read);
+                                                    mode.write(cx, NumberFieldMode::Read);
                                                 }
                                             })
                                             .detach();
@@ -539,52 +500,43 @@ impl<T: NumericStepperType> RenderOnce for NumericStepper<T> {
                             }
                         };
 
-                        if is_outlined {
-                            increment.child(
-                                h_flex()
-                                    .id("increment_button")
-                                    .p_1p5()
-                                    .size_full()
-                                    .justify_center()
-                                    .hover(|s| {
-                                        s.bg(cx.theme().colors().element_hover)
-                                            .cursor(gpui::CursorStyle::PointingHand)
-                                    })
-                                    .border_l_1()
-                                    .border_color(cx.theme().colors().border_variant)
-                                    .child(Icon::new(IconName::Plus).size(IconSize::Small))
-                                    .when_some(tab_index.as_mut(), |this, tab_index| {
-                                        *tab_index += 1;
-                                        this.tab_index(*tab_index - 1).focus(|style| {
-                                            style.bg(cx.theme().colors().element_hover)
-                                        })
-                                    })
-                                    .on_click(increment_handler),
-                            )
-                        } else {
-                            increment.child(
-                                IconButton::new("increment", IconName::Plus)
-                                    .shape(shape)
-                                    .icon_size(icon_size)
-                                    .when_some(tab_index.as_mut(), |this, tab_index| {
-                                        *tab_index += 1;
-                                        this.tab_index(*tab_index - 1)
+                        increment.child(
+                            h_flex()
+                                .id("increment_button")
+                                .cursor(gpui::CursorStyle::PointingHand)
+                                .p_1p5()
+                                .size_full()
+                                .justify_center()
+                                .overflow_hidden()
+                                .rounded_tr_sm()
+                                .rounded_br_sm()
+                                .border_1()
+                                .border_color(cx.theme().colors().border_variant)
+                                .bg(cx.theme().colors().surface_background)
+                                .hover(|s| s.bg(cx.theme().colors().element_hover))
+                                .child(Icon::new(IconName::Plus).size(IconSize::Small))
+                                .when_some(tab_index.as_mut(), |this, tab_index| {
+                                    *tab_index += 1;
+                                    this.tab_index(*tab_index - 1).focus(|style| {
+                                        style
+                                            .border_color(cx.theme().colors().border_focused)
+                                            .bg(cx.theme().colors().element_hover)
                                     })
-                                    .on_click(increment_handler),
-                            )
-                        }
+                                })
+                                .on_click(increment_handler),
+                        )
                     }),
             )
     }
 }
 
-impl Component for NumericStepper<usize> {
+impl Component for NumberField<usize> {
     fn scope() -> ComponentScope {
         ComponentScope::Input
     }
 
     fn name() -> &'static str {
-        "Numeric Stepper"
+        "Number Field"
     }
 
     fn sort_name() -> &'static str {
@@ -592,50 +544,30 @@ impl Component for NumericStepper<usize> {
     }
 
     fn description() -> Option<&'static str> {
-        Some("A button used to increment or decrement a numeric value.")
+        Some("A numeric input element with increment and decrement buttons.")
     }
 
     fn preview(window: &mut Window, cx: &mut App) -> Option<AnyElement> {
-        let first_stepper = window.use_state(cx, |_, _| 100usize);
-        let second_stepper = window.use_state(cx, |_, _| 100.0);
+        let stepper_example = window.use_state(cx, |_, _| 100.0);
+
         Some(
             v_flex()
                 .gap_6()
-                .children(vec![example_group_with_title(
-                    "Styles",
-                    vec![
-                        single_example(
-                            "Default",
-                            NumericStepper::new(
-                                "numeric-stepper-component-preview",
-                                *first_stepper.read(cx),
-                                window,
-                                cx,
-                            )
-                            .on_change({
-                                let first_stepper = first_stepper.clone();
-                                move |value, _, cx| first_stepper.write(cx, *value)
-                            })
-                            .into_any_element(),
-                        ),
-                        single_example(
-                            "Outlined",
-                            NumericStepper::new(
-                                "numeric-stepper-with-border-component-preview",
-                                *second_stepper.read(cx),
-                                window,
-                                cx,
-                            )
-                            .on_change({
-                                let second_stepper = second_stepper.clone();
-                                move |value, _, cx| second_stepper.write(cx, *value)
-                            })
-                            .min(1.0)
-                            .max(100.0)
-                            .style(NumericStepperStyle::Outlined)
-                            .into_any_element(),
-                        ),
-                    ],
+                .children(vec![single_example(
+                    "Default Numeric Stepper",
+                    NumberField::new(
+                        "numeric-stepper-component-preview",
+                        *stepper_example.read(cx),
+                        window,
+                        cx,
+                    )
+                    .on_change({
+                        let stepper_example = stepper_example.clone();
+                        move |value, _, cx| stepper_example.write(cx, *value)
+                    })
+                    .min(1.0)
+                    .max(100.0)
+                    .into_any_element(),
                 )])
                 .into_any_element(),
         )

crates/ui_input/src/ui_input.rs 🔗

@@ -5,13 +5,13 @@
 //! It can't be located in the `ui` crate because it depends on `editor`.
 //!
 mod font_picker;
-mod numeric_stepper;
+mod number_field;
 
 use component::{example_group, single_example};
 use editor::{Editor, EditorElement, EditorStyle};
 pub use font_picker::*;
 use gpui::{App, Entity, FocusHandle, Focusable, FontStyle, Hsla, Length, TextStyle};
-pub use numeric_stepper::*;
+pub use number_field::*;
 use settings::Settings;
 use std::sync::Arc;
 use theme::ThemeSettings;

crates/zed/src/zed/app_menus.rs 🔗

@@ -63,22 +63,26 @@ pub fn app_menus(cx: &mut App) -> Vec<Menu> {
                 MenuItem::submenu(Menu {
                     name: "Settings".into(),
                     items: vec![
-                        MenuItem::action("Open Settings", super::OpenSettings),
-                        MenuItem::action("Open Key Bindings", zed_actions::OpenKeymapEditor),
+                        MenuItem::action("Open Settings", zed_actions::OpenSettingsEditor),
+                        MenuItem::action("Open Settings JSON", super::OpenSettings),
+                        MenuItem::action("Open Project Settings", super::OpenProjectSettings),
                         MenuItem::action("Open Default Settings", super::OpenDefaultSettings),
+                        MenuItem::separator(),
+                        MenuItem::action("Open Keymap Editor", zed_actions::OpenKeymapEditor),
+                        MenuItem::action("Open Keymap JSON", zed_actions::OpenKeymap),
                         MenuItem::action(
                             "Open Default Key Bindings",
                             zed_actions::OpenDefaultKeymap,
                         ),
-                        MenuItem::action("Open Project Settings", super::OpenProjectSettings),
-                        MenuItem::action(
-                            "Select Settings Profile...",
-                            zed_actions::settings_profile_selector::Toggle,
-                        ),
+                        MenuItem::separator(),
                         MenuItem::action(
                             "Select Theme...",
                             zed_actions::theme_selector::Toggle::default(),
                         ),
+                        MenuItem::action(
+                            "Select Icon Theme...",
+                            zed_actions::icon_theme_selector::Toggle::default(),
+                        ),
                     ],
                 }),
                 MenuItem::separator(),