diff --git a/app/src/search/ai_context_menu/styles.rs b/app/src/search/ai_context_menu/styles.rs index 309c4425..5ef33f9f 100644 --- a/app/src/search/ai_context_menu/styles.rs +++ b/app/src/search/ai_context_menu/styles.rs @@ -3,3 +3,4 @@ pub const MARGIN_RIGHT: f32 = 8.0; pub const ESTIMATED_RESULT_HEIGHT: f32 = 24.0; pub const MENU_ITEM_HORIZONTAL_PADDING: f32 = 16.0; pub const MENU_ITEM_VERTICAL_PADDING: f32 = 4.0; +pub const MENU_ITEM_HIGHLIGHT_CORNER_RADIUS: f32 = 8.0; diff --git a/app/src/search/ai_context_menu/view.rs b/app/src/search/ai_context_menu/view.rs index 67413af5..5333e92b 100644 --- a/app/src/search/ai_context_menu/view.rs +++ b/app/src/search/ai_context_menu/view.rs @@ -1287,8 +1287,11 @@ impl AIContextMenu { return self.render_no_results(app); } + let last_display_index = filtered_categories.len().saturating_sub(1); for (display_index, category) in filtered_categories.iter().enumerate() { let is_selected = display_index == self.state.selected_category_index; + let is_first = display_index == 0; + let is_last = display_index == last_display_index; let text_color = if is_selected { theme.main_text_color(theme.accent()).into_solid() } else { @@ -1347,11 +1350,20 @@ impl AIContextMenu { let accent_color = theme.accent(); let accent_overlay_color = theme.accent_overlay(); + let highlight_radius = Radius::Pixels(styles::MENU_ITEM_HIGHLIGHT_CORNER_RADIUS); + let highlight_corner_radius = match (is_first, is_last) { + (true, true) => CornerRadius::with_all(highlight_radius), + (true, false) => CornerRadius::with_top(highlight_radius), + (false, true) => CornerRadius::with_bottom(highlight_radius), + (false, false) => CornerRadius::default(), + }; + let category_clone_for_click = *category; let category_row = Hoverable::new(hover_state, move |hover_state| { let mut container = Container::new(row) .with_horizontal_padding(styles::MENU_ITEM_HORIZONTAL_PADDING) - .with_vertical_padding(styles::MENU_ITEM_VERTICAL_PADDING); + .with_vertical_padding(styles::MENU_ITEM_VERTICAL_PADDING) + .with_corner_radius(highlight_corner_radius); if is_selected { container = container.with_background(accent_color); } else if hover_state.is_hovered() { diff --git a/app/src/terminal/input.rs b/app/src/terminal/input.rs index c54779f5..5e5d1af8 100644 --- a/app/src/terminal/input.rs +++ b/app/src/terminal/input.rs @@ -3429,6 +3429,12 @@ impl Input { if let Some(ai_context_menu) = self.editor.as_ref(app).render_ai_context_menu() { let position = position_id_for_cursor(self.editor.id()); + let y_anchor = if self.is_cloud_mode_input_v2_composing(app) { + AnchorPair::new(YAxisAnchor::Bottom, YAxisAnchor::Top) + } else { + menu_positioning.completion_suggestions_y_anchor() + }; + stack.add_positioned_overlay_child( ai_context_menu, OffsetPositioning::from_axes( @@ -3442,7 +3448,7 @@ impl Input { &position, PositionedElementOffsetBounds::Unbounded, OffsetType::Pixel(0.), - menu_positioning.completion_suggestions_y_anchor(), + y_anchor, ), ), ); diff --git a/app/src/terminal/input/agent.rs b/app/src/terminal/input/agent.rs index b416e7b7..f8f64238 100644 --- a/app/src/terminal/input/agent.rs +++ b/app/src/terminal/input/agent.rs @@ -333,7 +333,7 @@ impl Input { let menu_positioning = self.menu_positioning(app); let model = self.model.lock(); - let mut stack = Stack::new().with_constrain_absolute_children(); + let mut stack = Stack::new(); // Apply the V2 gutter symmetrically (left + right) so the floating // input keeps equal breathing room on both sides as the pane shrinks.