diff --git a/assets/icons/star.svg b/assets/icons/star.svg
index 71d4f3f7cc..fd1502ede8 100644
--- a/assets/icons/star.svg
+++ b/assets/icons/star.svg
@@ -1 +1,3 @@
-
+
diff --git a/assets/icons/star_filled.svg b/assets/icons/star_filled.svg
index 4aaad4b7fd..89b03ded29 100644
--- a/assets/icons/star_filled.svg
+++ b/assets/icons/star_filled.svg
@@ -1 +1,3 @@
-
+
diff --git a/crates/rules_library/src/rules_library.rs b/crates/rules_library/src/rules_library.rs
index 084650d5f6..e1ff7062a7 100644
--- a/crates/rules_library/src/rules_library.rs
+++ b/crates/rules_library/src/rules_library.rs
@@ -261,6 +261,7 @@ impl PickerDelegate for RulePickerDelegate {
let rule = self.matches.get(ix)?;
let default = rule.default;
let prompt_id = rule.id;
+
let element = ListItem::new(ix)
.inset(true)
.spacing(ListItemSpacing::Sparse)
@@ -272,9 +273,10 @@ impl PickerDelegate for RulePickerDelegate {
.child(Label::new(rule.title.clone().unwrap_or("Untitled".into()))),
)
.end_slot::(default.then(|| {
- IconButton::new("toggle-default-rule", IconName::SparkleFilled)
+ IconButton::new("toggle-default-rule", IconName::StarFilled)
.toggle_state(true)
.icon_color(Color::Accent)
+ .icon_size(IconSize::Small)
.shape(IconButtonShape::Square)
.tooltip(Tooltip::text("Remove from Default Rules"))
.on_click(cx.listener(move |_, _, _, cx| {
@@ -283,7 +285,7 @@ impl PickerDelegate for RulePickerDelegate {
}))
.end_hover_slot(
h_flex()
- .gap_2()
+ .gap_1()
.child(if prompt_id.is_built_in() {
div()
.id("built-in-rule")
@@ -299,8 +301,9 @@ impl PickerDelegate for RulePickerDelegate {
})
.into_any()
} else {
- IconButton::new("delete-rule", IconName::Trash)
+ IconButton::new("delete-rule", IconName::TrashAlt)
.icon_color(Color::Muted)
+ .icon_size(IconSize::Small)
.shape(IconButtonShape::Square)
.tooltip(Tooltip::text("Delete Rule"))
.on_click(cx.listener(move |_, _, _, cx| {
@@ -309,16 +312,27 @@ impl PickerDelegate for RulePickerDelegate {
.into_any_element()
})
.child(
- IconButton::new("toggle-default-rule", IconName::Sparkle)
+ IconButton::new("toggle-default-rule", IconName::Star)
.toggle_state(default)
- .selected_icon(IconName::SparkleFilled)
+ .selected_icon(IconName::StarFilled)
.icon_color(if default { Color::Accent } else { Color::Muted })
+ .icon_size(IconSize::Small)
.shape(IconButtonShape::Square)
- .tooltip(Tooltip::text(if default {
- "Remove from Default Rules"
- } else {
- "Add to Default Rules"
- }))
+ .map(|this| {
+ if default {
+ this.tooltip(Tooltip::text("Remove from Default Rules"))
+ } else {
+ this.tooltip(move |window, cx| {
+ Tooltip::with_meta(
+ "Add to Default Rules",
+ None,
+ "Always included in every thread.",
+ window,
+ cx,
+ )
+ })
+ }
+ })
.on_click(cx.listener(move |_, _, _, cx| {
cx.emit(RulePickerEvent::ToggledDefault { prompt_id })
})),
@@ -1008,216 +1022,180 @@ impl RulesLibrary {
.size_full()
.relative()
.overflow_hidden()
- .pl(DynamicSpacing::Base16.rems(cx))
- .pt(DynamicSpacing::Base08.rems(cx))
.on_click(cx.listener(move |_, _, window, _| {
window.focus(&focus_handle);
}))
.child(
h_flex()
.group("active-editor-header")
- .pr(DynamicSpacing::Base16.rems(cx))
- .pt(DynamicSpacing::Base02.rems(cx))
- .pb(DynamicSpacing::Base08.rems(cx))
+ .pt_2()
+ .px_2p5()
+ .gap_2()
.justify_between()
.child(
- h_flex().gap_1().child(
- div()
- .max_w_80()
- .on_action(cx.listener(Self::move_down_from_title))
- .border_1()
- .border_color(transparent_black())
- .rounded_sm()
- .group_hover("active-editor-header", |this| {
- this.border_color(
- cx.theme().colors().border_variant,
- )
- })
- .child(EditorElement::new(
- &rule_editor.title_editor,
- EditorStyle {
- background: cx.theme().system().transparent,
- local_player: cx.theme().players().local(),
- text: TextStyle {
- color: cx
- .theme()
- .colors()
- .editor_foreground,
- font_family: settings
- .ui_font
- .family
- .clone(),
- font_features: settings
- .ui_font
- .features
- .clone(),
- font_size: HeadlineSize::Large
- .rems()
- .into(),
- font_weight: settings.ui_font.weight,
- line_height: relative(
- settings.buffer_line_height.value(),
- ),
- ..Default::default()
- },
- scrollbar_width: Pixels::ZERO,
- syntax: cx.theme().syntax().clone(),
- status: cx.theme().status().clone(),
- inlay_hints_style:
- editor::make_inlay_hints_style(cx),
- inline_completion_styles:
- editor::make_suggestion_styles(cx),
- ..EditorStyle::default()
+ div()
+ .w_full()
+ .on_action(cx.listener(Self::move_down_from_title))
+ .border_1()
+ .border_color(transparent_black())
+ .rounded_sm()
+ .group_hover("active-editor-header", |this| {
+ this.border_color(cx.theme().colors().border_variant)
+ })
+ .child(EditorElement::new(
+ &rule_editor.title_editor,
+ EditorStyle {
+ background: cx.theme().system().transparent,
+ local_player: cx.theme().players().local(),
+ text: TextStyle {
+ color: cx.theme().colors().editor_foreground,
+ font_family: settings.ui_font.family.clone(),
+ font_features: settings
+ .ui_font
+ .features
+ .clone(),
+ font_size: HeadlineSize::Large.rems().into(),
+ font_weight: settings.ui_font.weight,
+ line_height: relative(
+ settings.buffer_line_height.value(),
+ ),
+ ..Default::default()
},
- )),
- ),
+ scrollbar_width: Pixels::ZERO,
+ syntax: cx.theme().syntax().clone(),
+ status: cx.theme().status().clone(),
+ inlay_hints_style: editor::make_inlay_hints_style(
+ cx,
+ ),
+ inline_completion_styles:
+ editor::make_suggestion_styles(cx),
+ ..EditorStyle::default()
+ },
+ )),
)
.child(
h_flex()
.h_full()
- .child(
- h_flex()
- .h_full()
- .gap(DynamicSpacing::Base16.rems(cx))
- .child(div()),
- )
- .child(
- h_flex()
- .h_full()
- .gap(DynamicSpacing::Base16.rems(cx))
- .children(rule_editor.token_count.map(
- |token_count| {
- let token_count: SharedString =
- token_count.to_string().into();
- let label_token_count: SharedString =
- token_count.to_string().into();
+ .flex_shrink_0()
+ .gap(DynamicSpacing::Base04.rems(cx))
+ .children(rule_editor.token_count.map(|token_count| {
+ let token_count: SharedString =
+ token_count.to_string().into();
+ let label_token_count: SharedString =
+ token_count.to_string().into();
- h_flex()
- .id("token_count")
- .tooltip(move |window, cx| {
- let token_count =
- token_count.clone();
-
- Tooltip::with_meta(
- format!(
- "{} tokens",
- token_count.clone()
- ),
- None,
- format!(
- "Model: {}",
- model
- .as_ref()
- .map(|model| model
- .name()
- .0)
- .unwrap_or_default()
- ),
- window,
- cx,
- )
- })
- .child(
- Label::new(format!(
- "{} tokens",
- label_token_count.clone()
- ))
- .color(Color::Muted),
- )
- },
- ))
- .child(if prompt_id.is_built_in() {
- div()
- .id("built-in-rule")
- .child(
- Icon::new(IconName::FileLock)
- .color(Color::Muted),
- )
- .tooltip(move |window, cx| {
- Tooltip::with_meta(
- "Built-in rule",
- None,
- BUILT_IN_TOOLTIP_TEXT,
- window,
- cx,
- )
- })
- .into_any()
- } else {
- IconButton::new("delete-rule", IconName::Trash)
- .size(ButtonSize::Large)
- .style(ButtonStyle::Transparent)
- .shape(IconButtonShape::Square)
- .size(ButtonSize::Large)
- .tooltip(move |window, cx| {
- Tooltip::for_action(
- "Delete Rule",
- &DeleteRule,
- window,
- cx,
- )
- })
- .on_click(|_, window, cx| {
- window.dispatch_action(
- Box::new(DeleteRule),
- cx,
- );
- })
- .into_any_element()
+ div()
+ .id("token_count")
+ .mr_1()
+ .flex_shrink_0()
+ .tooltip(move |window, cx| {
+ Tooltip::with_meta(
+ "Token Estimation",
+ None,
+ format!(
+ "Model: {}",
+ model
+ .as_ref()
+ .map(|model| model.name().0)
+ .unwrap_or_default()
+ ),
+ window,
+ cx,
+ )
})
.child(
- IconButton::new(
- "duplicate-rule",
- IconName::BookCopy,
- )
- .size(ButtonSize::Large)
- .style(ButtonStyle::Transparent)
- .shape(IconButtonShape::Square)
- .size(ButtonSize::Large)
- .tooltip(move |window, cx| {
- Tooltip::for_action(
- "Duplicate Rule",
- &DuplicateRule,
- window,
- cx,
- )
- })
- .on_click(|_, window, cx| {
- window.dispatch_action(
- Box::new(DuplicateRule),
- cx,
- );
- }),
- )
- .child(
- IconButton::new(
- "toggle-default-rule",
- IconName::Sparkle,
- )
- .style(ButtonStyle::Transparent)
- .toggle_state(rule_metadata.default)
- .selected_icon(IconName::SparkleFilled)
- .icon_color(if rule_metadata.default {
- Color::Accent
- } else {
- Color::Muted
- })
- .shape(IconButtonShape::Square)
- .size(ButtonSize::Large)
- .tooltip(Tooltip::text(
- if rule_metadata.default {
- "Remove from Default Rules"
- } else {
- "Add to Default Rules"
- },
+ Label::new(format!(
+ "{} tokens",
+ label_token_count.clone()
))
- .on_click(|_, window, cx| {
- window.dispatch_action(
- Box::new(ToggleDefaultRule),
- cx,
- );
- }),
- ),
+ .color(Color::Muted),
+ )
+ }))
+ .child(if prompt_id.is_built_in() {
+ div()
+ .id("built-in-rule")
+ .child(
+ Icon::new(IconName::FileLock)
+ .color(Color::Muted),
+ )
+ .tooltip(move |window, cx| {
+ Tooltip::with_meta(
+ "Built-in rule",
+ None,
+ BUILT_IN_TOOLTIP_TEXT,
+ window,
+ cx,
+ )
+ })
+ .into_any()
+ } else {
+ IconButton::new("delete-rule", IconName::TrashAlt)
+ .icon_size(IconSize::Small)
+ .tooltip(move |window, cx| {
+ Tooltip::for_action(
+ "Delete Rule",
+ &DeleteRule,
+ window,
+ cx,
+ )
+ })
+ .on_click(|_, window, cx| {
+ window
+ .dispatch_action(Box::new(DeleteRule), cx);
+ })
+ .into_any_element()
+ })
+ .child(
+ IconButton::new("duplicate-rule", IconName::BookCopy)
+ .icon_size(IconSize::Small)
+ .tooltip(move |window, cx| {
+ Tooltip::for_action(
+ "Duplicate Rule",
+ &DuplicateRule,
+ window,
+ cx,
+ )
+ })
+ .on_click(|_, window, cx| {
+ window.dispatch_action(
+ Box::new(DuplicateRule),
+ cx,
+ );
+ }),
+ )
+ .child(
+ IconButton::new("toggle-default-rule", IconName::Star)
+ .icon_size(IconSize::Small)
+ .toggle_state(rule_metadata.default)
+ .selected_icon(IconName::StarFilled)
+ .icon_color(if rule_metadata.default {
+ Color::Accent
+ } else {
+ Color::Muted
+ })
+ .map(|this| {
+ if rule_metadata.default {
+ this.tooltip(Tooltip::text(
+ "Remove from Default Rules",
+ ))
+ } else {
+ this.tooltip(move |window, cx| {
+ Tooltip::with_meta(
+ "Add to Default Rules",
+ None,
+ "Always included in every thread.",
+ window,
+ cx,
+ )
+ })
+ }
+ })
+ .on_click(|_, window, cx| {
+ window.dispatch_action(
+ Box::new(ToggleDefaultRule),
+ cx,
+ );
+ }),
),
),
)
@@ -1228,7 +1206,14 @@ impl RulesLibrary {
.on_action(cx.listener(Self::move_up_from_body))
.flex_grow()
.h_full()
- .child(rule_editor.body_editor.clone()),
+ .child(
+ h_flex()
+ .py_2()
+ .pl_2p5()
+ .h_full()
+ .flex_1()
+ .child(rule_editor.body_editor.clone()),
+ ),
),
)
}))