edit predictions: Improve copywriting (#24689)

Danilo Leal created

Change summary

assets/icons/zed_predict_bg.svg                                 |  4 
crates/inline_completion_button/src/inline_completion_button.rs | 48 ++
crates/ui/src/components/context_menu.rs                        | 11 
crates/zeta/src/onboarding_modal.rs                             | 23 
4 files changed, 55 insertions(+), 31 deletions(-)

Detailed changes

assets/icons/zed_predict_bg.svg 🔗

@@ -1,6 +1,6 @@
-<svg width="440" height="128" xmlns="http://www.w3.org/2000/svg">
+<svg width="480" height="128" xmlns="http://www.w3.org/2000/svg">
   <defs>
-    <pattern id="tilePattern" width="22" height="22" patternUnits="userSpaceOnUse">
+    <pattern id="tilePattern" width="23" height="23" patternUnits="userSpaceOnUse">
       <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
         <path d="M12 5L14 8L12 11" stroke="black" stroke-width="1.5"/>
         <path d="M10 6.5L11 8L10 9.5" stroke="black" stroke-width="1.5"/>

crates/inline_completion_button/src/inline_completion_button.rs 🔗

@@ -406,7 +406,7 @@ impl InlineCompletionButton {
 
         if let Some(editor_focus_handle) = self.editor_focus_handle.clone() {
             menu = menu.toggleable_entry(
-                "This File",
+                "This Buffer",
                 self.editor_show_predictions,
                 IconPosition::Start,
                 Some(Box::new(ToggleEditPrediction)),
@@ -451,33 +451,41 @@ impl InlineCompletionButton {
                 let enabled = data_collection.is_enabled();
                 let is_open_source = data_collection.is_project_open_source();
                 let is_collecting = data_collection.is_enabled();
+                let (icon_name, icon_color) = if is_open_source && is_collecting {
+                    (IconName::Check, Color::Success)
+                } else {
+                    (IconName::Check, Color::Accent)
+                };
 
                 menu = menu.item(
-                    ContextMenuEntry::new("Share Training Data")
+                    ContextMenuEntry::new("Training Data Collection")
                         .toggleable(IconPosition::Start, data_collection.is_enabled())
-                        .icon_color(if is_open_source && is_collecting {
-                            Color::Success
-                        } else {
-                            Color::Accent
-                        })
+                        .icon(icon_name)
+                        .icon_color(icon_color)
                         .documentation_aside(move |cx| {
                             let (msg, label_color, icon_name, icon_color) = match (is_open_source, is_collecting) {
                                 (true, true) => (
-                                    "Project identified as open-source, and you're sharing data.",
+                                    "Project identified as open source, and you're sharing data.",
                                     Color::Default,
                                     IconName::Check,
                                     Color::Success,
                                 ),
                                 (true, false) => (
-                                    "Project identified as open-source, but you're not sharing data.",
+                                    "Project identified as open source, but you're not sharing data.",
+                                    Color::Muted,
+                                    IconName::Close,
                                     Color::Muted,
-                                    IconName::XCircle,
+                                ),
+                                (false, true) => (
+                                    "Project not identified as open source. No data captured.",
+                                    Color::Muted,
+                                    IconName::Close,
                                     Color::Muted,
                                 ),
-                                (false, _) => (
-                                    "Project not identified as open-source. No data captured.",
+                                (false, false) => (
+                                    "Project not identified as open source, and setting turned off.",
                                     Color::Muted,
-                                    IconName::XCircle,
+                                    IconName::Close,
                                     Color::Muted,
                                 ),
                             };
@@ -485,7 +493,7 @@ impl InlineCompletionButton {
                                 .gap_2()
                                 .child(
                                     Label::new(indoc!{
-                                        "Help us improve our open model by sharing data from open source repositories. \
+                                        "Help us improve our open dataset model by sharing data from open source repositories. \
                                         Zed must detect a license file in your repo for this setting to take effect."
                                     })
                                 )
@@ -516,6 +524,16 @@ impl InlineCompletionButton {
                             }
                         })
                 );
+
+                if is_collecting && !is_open_source {
+                    menu = menu.item(
+                        ContextMenuEntry::new("No data captured.")
+                            .disabled(true)
+                            .icon(IconName::Close)
+                            .icon_color(Color::Error)
+                            .icon_size(IconSize::Small),
+                    );
+                }
             }
         }
 
@@ -556,7 +574,7 @@ impl InlineCompletionButton {
             language::EditPredictionsMode::EagerPreview => true,
         };
         menu = menu.separator().toggleable_entry(
-            "Eager Preview",
+            "Eager Preview Mode",
             is_eager_preview_enabled,
             IconPosition::Start,
             None,

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

@@ -598,6 +598,7 @@ impl Render for ContextMenu {
                                         }) => {
                                             let handler = handler.clone();
                                             let menu = cx.entity().downgrade();
+
                                             let icon_color = if *disabled {
                                                 Color::Muted
                                             } else if toggle.is_some() {
@@ -605,16 +606,18 @@ impl Render for ContextMenu {
                                             } else {
                                                 icon_color.unwrap_or(Color::Default)
                                             };
+
                                             let label_color = if *disabled {
                                                 Color::Muted
                                             } else {
                                                 Color::Default
                                             };
+
                                             let label_element = if let Some(icon_name) = icon {
                                                 h_flex()
                                                     .gap_1p5()
                                                     .when(
-                                                        *icon_position == IconPosition::Start,
+                                                        *icon_position == IconPosition::Start && toggle.is_none(),
                                                         |flex| {
                                                             flex.child(
                                                                 Icon::new(*icon_name)
@@ -643,8 +646,10 @@ impl Render for ContextMenu {
                                                     .color(label_color)
                                                     .into_any_element()
                                             };
+
                                             let documentation_aside_callback =
                                                 documentation_aside.clone();
+
                                             div()
                                                 .id(("context-menu-child", ix))
                                                 .when_some(
@@ -675,7 +680,7 @@ impl Render for ContextMenu {
                                                             |list_item, (position, toggled)| {
                                                                 let contents =
                                                                     div().flex_none().child(
-                                                                        Icon::new(IconName::Check)
+                                                                        Icon::new(icon.unwrap_or(IconName::Check))
                                                                             .color(icon_color)
                                                                             .size(*icon_size)
                                                                     )
@@ -778,7 +783,7 @@ impl Render for ContextMenu {
                                         }
                                     }
                                 },
-                            ))),
+                            )))
                     ),
             )
     }

crates/zeta/src/onboarding_modal.rs 🔗

@@ -168,7 +168,7 @@ impl Render for ZedPredictModal {
             .id("edit-prediction-onboarding")
             .key_context("ZedPredictModal")
             .relative()
-            .w(px(440.))
+            .w(px(480.))
             .h_full()
             .max_h(max_height)
             .p_4()
@@ -201,7 +201,7 @@ impl Render for ZedPredictModal {
                         svg()
                             .path("icons/zed_predict_bg.svg")
                             .text_color(cx.theme().colors().icon_disabled)
-                            .w(px(418.))
+                            .w(px(460.))
                             .h(px(128.))
                             .overflow_hidden(),
                     ),
@@ -354,7 +354,7 @@ impl Render for ZedPredictModal {
                                         "training-data-checkbox",
                                         self.data_collection_opted_in.into(),
                                     )
-                                    .label("Optionally share training data (OSS-only).")
+                                    .label("Open source repos: optionally share training data.")
                                     .fill()
                                     .on_click(cx.listener(
                                         move |this, state, _window, cx| {
@@ -391,26 +391,27 @@ impl Render for ZedPredictModal {
                                     .border_color(cx.theme().colors().border_variant)
                                     .child(
                                         div().child(
-                                            Label::new("To improve edit predictions, help fine-tune Zed's model by sharing data from the open-source projects you work on.")
+                                            Label::new("To improve edit predictions, please consider contributing to our open dataset based on your interactions within open source repositories.")
                                                 .mb_1()
                                         )
                                     )
                                     .child(info_item(
-                                        "We ask this exclusively for open-source projects.",
+                                        "We ask this exclusively for open source projects.",
                                     ))
                                     .child(info_item(
-                                        "Zed automatically detects if your project is open-source.",
-                                    ))
-                                    .child(info_item(
-                                        "This setting is valid for all OSS projects you open in Zed.",
+                                        "Zed automatically detects if your project is open source.",
                                     ))
                                     .child(info_item("Toggle it anytime via the status bar menu."))
                                     .child(multiline_info_item(
-                                        "Files with sensitive data, like `.env`, are excluded",
+                                        "If turned on, this setting is valid for all open source projects",
+                                        label_item("you open in Zed.")
+                                    ))
+                                    .child(multiline_info_item(
+                                        "Files with sensitive data, like `.env`, are excluded by default",
                                         h_flex()
                                             .w_full()
                                             .flex_wrap()
-                                            .child(label_item("by default via the"))
+                                            .child(label_item("via the"))
                                             .child(
                                                 Button::new("doc-link", "disabled_globs").on_click(
                                                     cx.listener(Self::inline_completions_doc),