settings_ui: Add some design tweaks (#40818)

Danilo Leal created

- Improves the UI for subfields of dynamic items
- Makes description writing more consistent (add period at the end of
every sentence, fix capitalization of proper names, ensure description
is always in sentence case)
- Other small details, mostly around spacing/padding

Release Notes:

- N/A

Change summary

crates/settings_ui/src/page_data.rs   | 224 ++++++++++++++--------------
crates/settings_ui/src/settings_ui.rs | 124 +++++++++------
2 files changed, 186 insertions(+), 162 deletions(-)

Detailed changes

crates/settings_ui/src/page_data.rs 🔗

@@ -28,7 +28,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SettingItem(SettingItem {
                     files: LOCAL,
                     title: "Project Name",
-                    description: "The Displayed Name Of This Project. If Left Empty, The Root Directory Name Will Be Displayed",
+                    description: "The displayed name of this project. If left empty, the root directory name will be displayed.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {
@@ -43,7 +43,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "When Closing With No Tabs",
-                    description: "What to do when using the 'close active item' action with no tabs",
+                    description: "What to do when using the 'close active item' action with no tabs.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -60,7 +60,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "On Last Window Closed",
-                    description: "What to do when the last window is closed",
+                    description: "What to do when the last window is closed.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.workspace.on_last_window_closed.as_ref()
@@ -74,7 +74,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Use System Path Prompts",
-                    description: "Use native OS dialogs for 'Open' and 'Save As'",
+                    description: "Use native OS dialogs for 'Open' and 'Save As'.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.workspace.use_system_path_prompts.as_ref()
@@ -88,7 +88,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Use System Prompts",
-                    description: "Use native OS dialogs for confirmations",
+                    description: "Use native OS dialogs for confirmations.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.workspace.use_system_prompts.as_ref()
@@ -102,7 +102,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Redact Private Values",
-                    description: "Hide the values of variables in private files",
+                    description: "Hide the values of variables in private files.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.redact_private_values.as_ref()
@@ -116,7 +116,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Private Files",
-                    description: "Globs to match against file paths to determine if a file is private",
+                    description: "Globs to match against file paths to determine if a file is private.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {
@@ -134,7 +134,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Workspace Restoration"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Restore Unsaved Buffers",
-                    description: "Whether or not to restore unsaved buffers on restart",
+                    description: "Whether or not to restore unsaved buffers on restart.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -154,7 +154,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Restore On Startup",
-                    description: "What to restore from the previous session when opening Zed",
+                    description: "What to restore from the previous session when opening Zed.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.workspace.restore_on_startup.as_ref()
@@ -171,7 +171,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     // todo(settings_ui): Implement another setting item type that just shows an edit in settings.json
                     files: USER,
                     title: "Preview Channel",
-                    description: "Which settings should be activated only in Preview build of Zed",
+                    description: "Which settings should be activated only in Preview build of Zed.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {
@@ -188,7 +188,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SettingItem(SettingItem {
                     files: USER,
                     title: "Settings Profiles",
-                    description: "Any number of settings profiles that are temporarily applied on top of your existing user settings",
+                    description: "Any number of settings profiles that are temporarily applied on top of your existing user settings.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {
@@ -205,7 +205,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Privacy"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Telemetry Diagnostics",
-                    description: "Send debug information like crash reports",
+                    description: "Send debug information like crash reports.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -225,7 +225,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Telemetry Metrics",
-                    description: "Send anonymized usage data like what languages you're using Zed with",
+                    description: "Send anonymized usage data like what languages you're using Zed with.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -243,7 +243,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Auto Update"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Auto Update",
-                    description: "Whether or not to automatically check for updates",
+                    description: "Whether or not to automatically check for updates.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.auto_update.as_ref(),
                         write: |settings_content, value| {
@@ -263,7 +263,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     discriminant: SettingItem {
                         files: USER,
                         title: "Theme Mode",
-                        description: "How to select the theme",
+                        description: "Choose a static, fixed theme or dynamically select themes based on appearance and light/dark modes.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 Some(&dynamic_variants::<settings::ThemeSelection>()[
@@ -320,7 +320,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Theme Name",
-                                    description: "The Name Of The Theme To Use",
+                                    description: "The name of your selected theme.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.theme.as_ref() {
@@ -347,7 +347,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Mode",
-                                    description: "How To Determine Whether to Use a Light or Dark Theme",
+                                    description: "Choose whether to use the selected light or dark theme or to follow your OS appearance configuration.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.theme.as_ref() {
@@ -372,7 +372,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Light Theme",
-                                    description: "The Theme To Use When Mode Is Set To Light, Or When Mode Is Set To System And The System Is In Light Mode",
+                                    description: "The theme to use when mode is set to light, or when mode is set to system and it is in light mode.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.theme.as_ref() {
@@ -397,7 +397,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Dark Theme",
-                                    description: "The Theme To Use When Mode Is Set To Dark, Or When Mode Is Set To System And The System Is In Dark Mode",
+                                    description: "The theme to use when mode is set to dark, or when mode is set to system and it is in dark mode.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.theme.as_ref() {
@@ -427,7 +427,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     discriminant: SettingItem {
                         files: USER,
                         title: "Icon Theme",
-                        description: "The Icon Theme Zed Will Associate With Files And Directories",
+                        description: "The custom set of icons Zed will associate with files and directories.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 Some(&dynamic_variants::<settings::IconThemeSelection>()[
@@ -484,7 +484,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Icon Theme Name",
-                                    description: "The Name Of The Icon Theme To Use",
+                                    description: "The name of your selected icon theme.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.icon_theme.as_ref() {
@@ -511,7 +511,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Mode",
-                                    description: "How To Determine Whether to Use a Light or Dark Icon Theme",
+                                    description: "Choose whether to use the selected light or dark icon theme or to follow your OS appearance configuration.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.icon_theme.as_ref() {
@@ -536,7 +536,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Light Icon Theme",
-                                    description: "The Icon Theme To Use When Mode Is Set To Light, Or When Mode Is Set To System And The System Is In Light Mode",
+                                    description: "The icon theme to use when mode is set to light, or when mode is set to system and it is in light mode.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.icon_theme.as_ref() {
@@ -561,7 +561,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Dark Icon Theme",
-                                    description: "The Icon Theme To Use When Mode Is Set To Dark, Or When Mode Is Set To System And The System Is In Dark Mode",
+                                    description: "The icon theme to use when mode is set to dark, or when mode is set to system and it is in dark mode.",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.icon_theme.as_ref() {
@@ -590,7 +590,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Buffer Font"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Font Family",
-                    description: "Font family for editor text",
+                    description: "Font family for editor text.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.theme.buffer_font_family.as_ref(),
                         write: |settings_content, value|{  settings_content.theme.buffer_font_family = value;},
@@ -600,7 +600,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Font Size",
-                    description: "Font size for editor text",
+                    description: "Font size for editor text.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.theme.buffer_font_size.as_ref(),
                         write: |settings_content, value|{  settings_content.theme.buffer_font_size = value;},
@@ -610,7 +610,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Font Weight",
-                    description: "Font weight for editor text (100-900)",
+                    description: "Font weight for editor text (100-900).",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.theme.buffer_font_weight.as_ref(),
                         write: |settings_content, value|{  settings_content.theme.buffer_font_weight = value;},
@@ -622,7 +622,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     discriminant: SettingItem {
                         files: USER,
                         title: "Line Height",
-                        description: "Line height for editor text",
+                        description: "Line height for editor text.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 Some(&dynamic_variants::<settings::BufferLineHeight>()[
@@ -666,7 +666,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                 SettingItem {
                                     files: USER,
                                     title: "Custom Line Height",
-                                    description: "Custom line height value (must be at least 1.0)",
+                                    description: "Custom line height value (must be at least 1.0).",
                                     field: Box::new(SettingField {
                                         pick: |settings_content| {
                                             match settings_content.theme.buffer_line_height.as_ref() {
@@ -731,7 +731,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("UI Font"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Font Family",
-                    description: "Font family for UI elements",
+                    description: "Font family for UI elements.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.theme.ui_font_family.as_ref(),
                         write: |settings_content, value|{  settings_content.theme.ui_font_family = value;},
@@ -741,7 +741,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Font Size",
-                    description: "Font size for UI elements",
+                    description: "Font size for UI elements.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.theme.ui_font_size.as_ref(),
                         write: |settings_content, value|{  settings_content.theme.ui_font_size = value;},
@@ -751,7 +751,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Font Weight",
-                    description: "Font weight for UI elements (100-900)",
+                    description: "Font weight for UI elements (100-900).",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.theme.ui_font_weight.as_ref(),
                         write: |settings_content, value|{  settings_content.theme.ui_font_weight = value;},
@@ -762,7 +762,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SettingItem(SettingItem {
                     files: USER,
                     title: "Font Features",
-                    description: "The OpenType features to enable for rendering in UI elements.",
+                    description: "The Opentype features to enable for rendering in UI elements.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {
@@ -814,7 +814,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Buffer Font Size",
-                    description: "Font size for user messages text in the agent panel",
+                    description: "Font size for user messages text in the agent panel.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -834,7 +834,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Cursor"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Multi Cursor Modifier",
-                    description: "Modifier key for adding multiple cursors",
+                    description: "Modifier key for adding multiple cursors.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.multi_cursor_modifier.as_ref()
@@ -849,7 +849,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Cursor Blink",
-                    description: "Whether the cursor blinks in the editor",
+                    description: "Whether the cursor blinks in the editor.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.editor.cursor_blink.as_ref(),
                         write: |settings_content, value|{  settings_content.editor.cursor_blink = value;},
@@ -859,7 +859,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Cursor Shape",
-                    description: "Cursor shape for the editor",
+                    description: "Cursor shape for the editor.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.editor.cursor_shape.as_ref(),
                         write: |settings_content, value|{  settings_content.editor.cursor_shape = value;},
@@ -869,7 +869,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Hide Mouse",
-                    description: "When to hide the mouse cursor",
+                    description: "When to hide the mouse cursor.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.editor.hide_mouse.as_ref(),
                         write: |settings_content, value|{  settings_content.editor.hide_mouse = value;},
@@ -880,7 +880,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Highlighting"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Unnecessary Code Fade",
-                    description: "How much to fade out unused code (0.0 - 0.9)",
+                    description: "How much to fade out unused code (0.0 - 0.9).",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.theme.unnecessary_code_fade.as_ref()
@@ -895,7 +895,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Current Line Highlight",
-                    description: "How to highlight the current line",
+                    description: "How to highlight the current line.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.current_line_highlight.as_ref()
@@ -910,7 +910,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Selection Highlight",
-                    description: "Highlight all occurrences of selected text",
+                    description: "Highlight all occurrences of selected text.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.selection_highlight.as_ref()
@@ -925,7 +925,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Rounded Selection",
-                    description: "Whether the text selection should have rounded corners",
+                    description: "Whether the text selection should have rounded corners.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.editor.rounded_selection.as_ref(),
                         write: |settings_content, value|{  settings_content.editor.rounded_selection = value;},
@@ -935,7 +935,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Minimum Contrast For Highlights",
-                    description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds",
+                    description: "The minimum APCA perceptual contrast to maintain when rendering text over highlight backgrounds.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -954,7 +954,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Guides"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Show Wrap Guides",
-                    description: "Show wrap guides (vertical rulers)",
+                    description: "Show wrap guides (vertical rulers).",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -979,7 +979,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 // todo(settings_ui): This needs a custom component
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Wrap Guides",
-                    description: "Character counts at which to show wrap guides",
+                    description: "Character counts at which to show wrap guides.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {
@@ -1008,7 +1008,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Base Keymap"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Base Keymap",
-                    description: "The name of a base set of key bindings to use",
+                    description: "The name of a base set of key bindings to use.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.base_keymap.as_ref(),
                         write: |settings_content, value| {
@@ -1026,7 +1026,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 // behavior to have them both enabled at the same time
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Vim Mode",
-                    description: "Enable vim modes and key bindings",
+                    description: "Enable Vim mode and key bindings.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.vim_mode.as_ref(),
                         write: |settings_content, value| {
@@ -1038,7 +1038,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Helix Mode",
-                    description: "Enable helix modes and key bindings",
+                    description: "Enable Helix mode and key bindings.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.helix_mode.as_ref(),
                         write: |settings_content, value| {
@@ -1059,7 +1059,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                         discriminant: SettingItem {
                             files: USER,
                             title: "Auto Save Mode",
-                            description: "When to Auto Save Buffer Changes",
+                            description: "When to auto save buffer changes.",
                             field: Box::new(SettingField {
                                 pick: |settings_content| {
                                     Some(&dynamic_variants::<settings::AutosaveSetting>()[
@@ -1108,7 +1108,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                                     SettingItem {
                                         files: USER,
                                         title: "Delay (milliseconds)",
-                                        description: "Save after inactivity period (in milliseconds)",
+                                        description: "Save after inactivity period (in milliseconds).",
                                         field: Box::new(SettingField {
                                             pick: |settings_content| {
                                                 match settings_content.workspace.autosave.as_ref() {
@@ -1139,7 +1139,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Multibuffer"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Double Click In Multibuffer",
-                        description: "What to do when multibuffer is double-clicked in some of its excerpts",
+                        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.as_ref()
@@ -1153,7 +1153,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Expand Excerpt Lines",
-                        description: "How many lines to expand the multibuffer excerpts by default",
+                        description: "How many lines to expand the multibuffer excerpts by default.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.expand_excerpt_lines.as_ref()
@@ -1167,7 +1167,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Excerpt Context Lines",
-                        description: "How many lines of context to provide in multibuffer excerpts by default",
+                        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.as_ref()
@@ -1181,7 +1181,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Expand Outlines With Depth",
-                        description: "Default depth to expand outline items in the current file",
+                        description: "Default depth to expand outline items in the current file.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1204,7 +1204,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Scrolling"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Scroll Beyond Last Line",
-                        description: "Whether the editor will scroll beyond the 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.as_ref()
@@ -1218,7 +1218,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Vertical Scroll Margin",
-                        description: "The number of lines to keep above/below the cursor when auto-scrolling",
+                        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.as_ref()
@@ -1232,7 +1232,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Horizontal Scroll Margin",
-                        description: "The number of characters to keep on either side when scrolling with the mouse",
+                        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.as_ref()
@@ -1246,7 +1246,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Scroll Sensitivity",
-                        description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling",
+                        description: "Scroll sensitivity multiplier for both horizontal and vertical scrolling.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.scroll_sensitivity.as_ref()
@@ -1260,7 +1260,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Fast Scroll Sensitivity",
-                        description: "Fast Scroll sensitivity multiplier for both horizontal and vertical scrolling",
+                        description: "Fast scroll sensitivity multiplier for both horizontal and vertical scrolling.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.fast_scroll_sensitivity.as_ref()
@@ -1274,7 +1274,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Autoscroll On Clicks",
-                        description: "Whether to scroll when clicking near the edge of the visible text area",
+                        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.as_ref()
@@ -1289,7 +1289,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Signature Help"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Auto Signature Help",
-                        description: "Automatically show a signature help pop-up",
+                        description: "Automatically show a signature help pop-up.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.auto_signature_help.as_ref()
@@ -1303,7 +1303,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show Signature Help After Edits",
-                        description: "Show the signature help pop-up after completions or bracket pairs are inserted",
+                        description: "Show the signature help pop-up after completions or bracket pairs are inserted.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1320,7 +1320,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Snippet Sort Order",
-                        description: "Determines how snippets are sorted relative to other completion items",
+                        description: "Determines how snippets are sorted relative to other completion items.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.snippet_sort_order.as_ref()
@@ -1335,7 +1335,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Hover Popover"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Enabled",
-                        description: "Show the informational hover box when moving the mouse over symbols in the editor",
+                        description: "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.as_ref()
@@ -1350,7 +1350,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     // todo(settings ui): add units to this number input
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Delay",
-                        description: "Time to wait in milliseconds before showing the informational hover box",
+                        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.as_ref()
@@ -1365,7 +1365,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Drag And Drop Selection"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Enabled",
-                        description: "Enable drag and drop selection",
+                        description: "Enable drag and drop selection.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1387,7 +1387,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Delay",
-                        description: "Delay in milliseconds before drag and drop selection starts",
+                        description: "Delay in milliseconds before drag and drop selection starts.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1410,7 +1410,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Gutter"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show Line Numbers",
-                        description: "Show line numbers in the gutter",
+                        description: "Show line numbers in the gutter.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1432,7 +1432,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Relative Line Numbers",
-                        description: "Whether the line numbers in the editor's gutter are relative or not",
+                        description: "Whether the line numbers in the editor's gutter are relative or not.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.relative_line_numbers.as_ref()
@@ -1446,7 +1446,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show Runnables",
-                        description: "Show runnable buttons in the gutter",
+                        description: "Show runnable buttons in the gutter.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1468,7 +1468,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show Breakpoints",
-                        description: "Show breakpoints in the gutter",
+                        description: "Show breakpoints in the gutter.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1490,7 +1490,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show Folds",
-                        description: "Show code folding controls in the gutter",
+                        description: "Show code folding controls in the gutter.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1509,7 +1509,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Min Line Number Digits",
-                        description: "Minimum number of characters to reserve space for in the gutter",
+                        description: "Minimum number of characters to reserve space for in the gutter.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1531,7 +1531,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Inline Code Actions",
-                        description: "Show code action button at start of buffer line",
+                        description: "Show code action button at start of buffer line.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.inline_code_actions.as_ref()
@@ -1546,7 +1546,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Scrollbar"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show",
-                        description: "When to show the scrollbar in the editor",
+                        description: "When to show the scrollbar in the editor.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.scrollbar.as_ref()?.show.as_ref()
@@ -1564,7 +1564,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Cursors",
-                        description: "Show cursor positions in the scrollbar",
+                        description: "Show cursor positions in the scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.scrollbar.as_ref()?.cursors.as_ref()
@@ -1582,7 +1582,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Git Diff",
-                        description: "Show git diff indicators in the scrollbar",
+                        description: "Show Git diff indicators in the scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1605,7 +1605,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Search Results",
-                        description: "Show buffer search result indicators in the scrollbar",
+                        description: "Show buffer search result indicators in the scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1628,7 +1628,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Selected Text",
-                        description: "Show selected text occurrences in the scrollbar",
+                        description: "Show selected text occurrences in the scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1651,7 +1651,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Selected Symbol",
-                        description: "Show selected symbol occurrences in the scrollbar",
+                        description: "Show selected symbol occurrences in the scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1674,7 +1674,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Diagnostics",
-                        description: "Which diagnostic indicators to show in the scrollbar",
+                        description: "Which diagnostic indicators to show in the scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1697,7 +1697,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Horizontal Scrollbar",
-                        description: "When false, forcefully disables the horizontal scrollbar",
+                        description: "When false, forcefully disables the horizontal scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1724,7 +1724,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Vertical Scrollbar",
-                        description: "When false, forcefully disables the vertical scrollbar",
+                        description: "When false, forcefully disables the vertical scrollbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1752,7 +1752,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Minimap"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Show",
-                        description: "When to show the minimap in the editor",
+                        description: "When to show the minimap in the editor.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.minimap.as_ref()?.show.as_ref()
@@ -1767,7 +1767,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Display In",
-                        description: "Where to show the minimap in the editor",
+                        description: "Where to show the minimap in the editor.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1790,7 +1790,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Thumb",
-                        description: "When to show the minimap thumb",
+                        description: "When to show the minimap thumb.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.editor.minimap.as_ref()?.thumb.as_ref()
@@ -1808,7 +1808,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Thumb Border",
-                        description: "Border style for the minimap's scrollbar thumb",
+                        description: "Border style for the minimap's scrollbar thumb.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1831,7 +1831,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Current Line Highlight",
-                        description: "How to highlight the current line in the minimap",
+                        description: "How to highlight the current line in the minimap.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1854,7 +1854,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Max Width Columns",
-                        description: "Maximum number of columns to display in the minimap",
+                        description: "Maximum number of columns to display in the minimap.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1878,7 +1878,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Toolbar"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Breadcrumbs",
-                        description: "Show breadcrumbs",
+                        description: "Show breadcrumbs.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1901,7 +1901,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Quick Actions",
-                        description: "Show quick action buttons (e.g., search, selection, editor controls, etc.)",
+                        description: "Show quick action buttons (e.g., search, selection, editor controls, etc.).",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1924,7 +1924,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Selections Menu",
-                        description: "Show the selections menu in the editor toolbar",
+                        description: "Show the selections menu in the editor toolbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1947,7 +1947,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Agent Review",
-                        description: "Show agent review buttons in the editor toolbar",
+                        description: "Show agent review buttons in the editor toolbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -1970,7 +1970,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Code Actions",
-                        description: "Show code action buttons in the editor toolbar",
+                        description: "Show code action buttons in the editor toolbar.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content
@@ -2005,7 +2005,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("File Types"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "File Type Associations",
-                        description: "A Mapping from Languages to files and file extensions that should be treated as that language",
+                        description: "A mapping from languages to files and file extensions that should be treated as that language.",
                         field: Box::new(
                             SettingField {
                                 pick: |settings_content| {
@@ -2027,7 +2027,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Diagnostics"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Max Severity",
-                        description: "Which level to use to filter out diagnostics displayed in the editor",
+                        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.as_ref(),
                             write: |settings_content, value| {
@@ -2040,7 +2040,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Include Warnings",
-                        description: "Whether to show warnings or not by default",
+                        description: "Whether to show warnings or not by default.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.diagnostics.as_ref()?.include_warnings.as_ref()
@@ -2060,7 +2060,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("Inline Diagnostics"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Enabled",
-                        description: "Whether to show diagnostics inline or not",
+                        description: "Whether to show diagnostics inline or not.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.diagnostics.as_ref()?.inline.as_ref()?.enabled.as_ref()
@@ -2081,7 +2081,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Update Debounce",
-                        description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update",
+                        description: "The delay in milliseconds to show inline diagnostics after the last diagnostic update.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.diagnostics.as_ref()?.inline.as_ref()?.update_debounce_ms.as_ref()
@@ -2102,7 +2102,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Padding",
-                        description: "The amount of padding between the end of the source line and the start of the inline diagnostic",
+                        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| {
                                 settings_content.diagnostics.as_ref()?.inline.as_ref()?.padding.as_ref()
@@ -2123,7 +2123,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     }),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Minimum Column",
-                        description: "The minimum column at which to display inline diagnostics",
+                        description: "The minimum column at which to display inline diagnostics.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.diagnostics.as_ref()?.inline.as_ref()?.min_column.as_ref()
@@ -2145,7 +2145,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("LSP Pull Diagnostics"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Enabled",
-                        description: "Whether to pull for language server-powered diagnostics or not",
+                        description: "Whether to pull for language server-powered diagnostics or not.",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.diagnostics.as_ref()?.lsp_pull_diagnostics.as_ref()?.enabled.as_ref()
@@ -2167,7 +2167,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     // todo(settings_ui): Needs unit
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Debounce",
-                        description: "Minimum time to wait before pulling diagnostics from the language server(s)",
+                        description: "Minimum time to wait before pulling diagnostics from the language server(s).",
                         field: Box::new(SettingField {
                             pick: |settings_content| {
                                 settings_content.diagnostics.as_ref()?.lsp_pull_diagnostics.as_ref()?.debounce_ms.as_ref()
@@ -2189,7 +2189,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                     SettingsPageItem::SectionHeader("LSP Highlights"),
                     SettingsPageItem::SettingItem(SettingItem {
                         title: "Debounce",
-                        description: "The debounce delay before querying highlights from the language",
+                        description: "The debounce delay before querying highlights from the language.",
                         field: Box::new(SettingField {
                             pick: |settings_content| settings_content.editor.lsp_highlight_debounce.as_ref(),
                             write: |settings_content, value| {
@@ -2232,7 +2232,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 SettingsPageItem::SectionHeader("Search"),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Whole Word",
-                    description: "Search for whole words by default",
+                    description: "Search for whole words by default.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.search.as_ref()?.whole_word.as_ref()
@@ -2250,7 +2250,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Case Sensitive",
-                    description: "Search case-sensitively by default",
+                    description: "Search case-sensitively by default.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -2273,7 +2273,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Use Smartcase Search",
-                    description: "Whether to automatically enable case-sensitive search based on the search query",
+                    description: "Whether to automatically enable case-sensitive search based on the search query.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.use_smartcase_search.as_ref()
@@ -2287,7 +2287,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Include Ignored",
-                    description: "Include ignored files in search results by default",
+                    description: "Include ignored files in search results by default.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content
@@ -2310,7 +2310,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Regex",
-                    description: "Use regex search by default",
+                    description: "Use regex search by default.",
                     field: Box::new(SettingField {
                         pick: |settings_content| {
                             settings_content.editor.search.as_ref()?.regex.as_ref()
@@ -2324,7 +2324,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Search Wrap",
-                    description: "Whether the editor search results will loop",
+                    description: "Whether the editor search results will loop.",
                     field: Box::new(SettingField {
                         pick: |settings_content| settings_content.editor.search_wrap.as_ref(),
                         write: |settings_content, value| {
@@ -2336,7 +2336,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 }),
                 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",
+                    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
@@ -2355,7 +2355,7 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
                 // todo: null by default
                 SettingsPageItem::SettingItem(SettingItem {
                     title: "Include Ignored in Search",
-                    description: "Use gitignored files when searching",
+                    description: "Use gitignored files when searching.",
                     field: Box::new(
                         SettingField {
                             pick: |settings_content| {

crates/settings_ui/src/settings_ui.rs 🔗

@@ -630,6 +630,7 @@ impl SettingsPageItem {
         cx: &mut Context<SettingsWindow>,
     ) -> AnyElement {
         let file = settings_window.current_file.clone();
+
         let border_variant = cx.theme().colors().border_variant;
         let apply_padding = |element: Stateful<Div>| -> Stateful<Div> {
             let element = element.pt_4();
@@ -639,12 +640,14 @@ impl SettingsPageItem {
                 element.pb_4().border_b_1().border_color(border_variant)
             }
         };
+
         let mut render_setting_item_inner =
-            |setting_item: &SettingItem, cx: &mut Context<SettingsWindow>| {
+            |setting_item: &SettingItem, padding: bool, cx: &mut Context<SettingsWindow>| {
                 let renderer = cx.default_global::<SettingFieldRenderer>().clone();
                 let (_, found) = setting_item.field.file_set_in(file.clone(), cx);
 
                 let renderers = renderer.renderers.borrow();
+
                 let field_renderer =
                     renderers.get(&AnySettingField::type_id(setting_item.field.as_ref()));
                 let field_renderer_or_warning =
@@ -683,8 +686,15 @@ impl SettingsPageItem {
                     ),
                 };
 
-                (field.map(apply_padding), field_renderer_or_warning.is_ok())
+                let field = if padding {
+                    field.map(apply_padding)
+                } else {
+                    field
+                };
+
+                (field, field_renderer_or_warning.is_ok())
             };
+
         match self {
             SettingsPageItem::SectionHeader(header) => v_flex()
                 .w_full()
@@ -698,15 +708,13 @@ impl SettingsPageItem {
                 .child(Divider::horizontal().color(DividerColor::BorderFaded))
                 .into_any_element(),
             SettingsPageItem::SettingItem(setting_item) => {
-                render_setting_item_inner(setting_item, cx)
-                    .0
-                    .into_any_element()
+                let (field_with_padding, _) = render_setting_item_inner(setting_item, true, cx);
+                field_with_padding.into_any_element()
             }
             SettingsPageItem::SubPageLink(sub_page_link) => h_flex()
                 .id(sub_page_link.title.clone())
                 .w_full()
                 .min_w_0()
-                .gap_2()
                 .justify_between()
                 .map(apply_padding)
                 .child(
@@ -725,7 +733,7 @@ impl SettingsPageItem {
                     .icon_position(IconPosition::End)
                     .icon_color(Color::Muted)
                     .icon_size(IconSize::Small)
-                    .style(ButtonStyle::Outlined)
+                    .style(ButtonStyle::OutlinedGhost)
                     .size(ButtonSize::Medium)
                     .on_click({
                         let sub_page_link = sub_page_link.clone();
@@ -760,18 +768,42 @@ impl SettingsPageItem {
                 let discriminant = SettingsStore::global(cx)
                     .get_value_from_file(file, *pick_discriminant)
                     .1;
+
                 let (discriminant_element, rendered_ok) =
-                    render_setting_item_inner(discriminant_setting_item, cx);
-                let mut content = v_flex()
-                    .gap_2()
-                    .id("dynamic-item")
-                    .child(discriminant_element);
+                    render_setting_item_inner(discriminant_setting_item, true, cx);
+
+                let has_sub_fields =
+                    rendered_ok && discriminant.map(|d| !fields[d].is_empty()).unwrap_or(false);
+
+                let discriminant_element = if has_sub_fields {
+                    discriminant_element.pb_4().border_b_0()
+                } else {
+                    discriminant_element
+                };
+
+                let mut content = v_flex().id("dynamic-item").child(discriminant_element);
+
                 if rendered_ok {
                     let discriminant =
                         discriminant.expect("This should be Some if rendered_ok is true");
                     let sub_fields = &fields[discriminant];
-                    for field in sub_fields {
-                        content = content.child(render_setting_item_inner(field, cx).0.pl_6());
+                    let sub_field_count = sub_fields.len();
+
+                    for (index, field) in sub_fields.iter().enumerate() {
+                        let is_last_sub_field = index == sub_field_count - 1;
+                        let (raw_field, _) = render_setting_item_inner(field, false, cx);
+
+                        content = content.child(
+                            raw_field
+                                .p_4()
+                                .border_x_1()
+                                .border_t_1()
+                                .when(is_last_sub_field, |this| this.border_b_1())
+                                .when(is_last_sub_field && is_last, |this| this.mb_8())
+                                .border_dashed()
+                                .border_color(cx.theme().colors().border_variant)
+                                .bg(cx.theme().colors().element_background.opacity(0.2)),
+                        );
                     }
                 }
 
@@ -795,7 +827,6 @@ fn render_settings_item(
     h_flex()
         .id(setting_item.title)
         .min_w_0()
-        .gap_2()
         .justify_between()
         .child(
             v_flex()
@@ -1831,12 +1862,6 @@ impl SettingsWindow {
         };
 
         v_flex()
-            .w_56()
-            .p_2p5()
-            .when(cfg!(target_os = "macos"), |c| c.pt_10())
-            .h_full()
-            .flex_none()
-            .border_r_1()
             .key_context("NavigationMenu")
             .on_action(cx.listener(|this, _: &CollapseNavEntry, window, cx| {
                 let Some(focused_entry) = this.focused_nav_entry(window, cx) else {
@@ -1954,6 +1979,12 @@ impl SettingsWindow {
                     cx,
                 );
             }))
+            .w_56()
+            .h_full()
+            .p_2p5()
+            .when(cfg!(target_os = "macos"), |this| this.pt_10())
+            .flex_none()
+            .border_r_1()
             .border_color(cx.theme().colors().border)
             .bg(cx.theme().colors().panel_background)
             .child(self.render_search(window, cx))
@@ -2194,6 +2225,20 @@ impl SettingsWindow {
             .child(Label::new(last))
     }
 
+    fn render_empty_state(&self, search_query: SharedString) -> impl IntoElement {
+        v_flex()
+            .size_full()
+            .items_center()
+            .justify_center()
+            .gap_1()
+            .child(Label::new("No Results"))
+            .child(
+                Label::new(search_query)
+                    .size(LabelSize::Small)
+                    .color(Color::Muted),
+            )
+    }
+
     fn render_page_items(
         &mut self,
         page_index: usize,
@@ -2208,18 +2253,7 @@ impl SettingsWindow {
         if has_no_results {
             let search_query = self.search_bar.read(cx).text(cx);
             page_content = page_content.child(
-                v_flex()
-                    .size_full()
-                    .items_center()
-                    .justify_center()
-                    .gap_1()
-                    .child(div().child("No Results"))
-                    .child(
-                        div()
-                            .text_sm()
-                            .text_color(cx.theme().colors().text_muted)
-                            .child(format!("No settings match \"{}\"", search_query)),
-                    ),
+                self.render_empty_state(format!("No settings match \"{}\"", search_query).into()),
             )
         } else {
             let last_non_header_index = self
@@ -2249,6 +2283,7 @@ impl SettingsWindow {
                             })
                             .into_any_element();
                     }
+
                     let mut visible_items = this.visible_page_items();
                     let Some((actual_item_index, item)) = visible_items.nth(index - 1) else {
                         return gpui::Empty.into_any_element();
@@ -2258,6 +2293,7 @@ impl SettingsWindow {
                         .next()
                         .map(|(_, item)| matches!(item, SettingsPageItem::SectionHeader(_)))
                         .unwrap_or(false);
+
                     let is_last = Some(actual_item_index) == last_non_header_index;
 
                     let item_focus_handle =
@@ -2307,18 +2343,7 @@ impl SettingsWindow {
         if has_no_results {
             let search_query = self.search_bar.read(cx).text(cx);
             page_content = page_content.child(
-                v_flex()
-                    .size_full()
-                    .items_center()
-                    .justify_center()
-                    .gap_1()
-                    .child(div().child("No Results"))
-                    .child(
-                        div()
-                            .text_sm()
-                            .text_color(cx.theme().colors().text_muted)
-                            .child(format!("No settings match \"{}\"", search_query)),
-                    ),
+                self.render_empty_state(format!("No settings match \"{}\"", search_query).into()),
             )
         } else {
             let last_non_header_index = items
@@ -2412,11 +2437,6 @@ impl SettingsWindow {
 
         return v_flex()
             .id("Settings-ui-page")
-            .flex_1()
-            .pt_6()
-            .pb_8()
-            .px_8()
-            .bg(cx.theme().colors().editor_background)
             .on_action(cx.listener(|this, _: &menu::SelectNext, window, cx| {
                 if !sub_page_stack().is_empty() {
                     window.focus_next();
@@ -2484,6 +2504,10 @@ impl SettingsWindow {
                 this.vertical_scrollbar_for(self.sub_page_scroll_handle.clone(), window, cx)
             })
             .track_focus(&self.content_focus_handle.focus_handle(cx))
+            .flex_1()
+            .pt_6()
+            .px_8()
+            .bg(cx.theme().colors().editor_background)
             .child(
                 div()
                     .size_full()