Polish vertical tab lifecycle: hover ≠ active, close as a coin

Active and hover used the same ACTIVE_NAV_BG, so a selected row gave
no feedback when the cursor crossed it — the contrast ladder was a
single rung. Replace it with a four-state ladder shared by the home
anchor, launcher rows, and tab rows:

  rest   → transparent   (HOVER_NAV_BG hover)
  active → ACTIVE_NAV_BG (ACTIVE_NAV_BG_HOVER hover)

The choice lives in nav_row_palette(active) so the ladder cannot
silently disagree across the three callers. Close (×) becomes an
18 px circular coin (was a 16 px square) with the warm-dark hover
wash from CLOSE_HOVER_BG, shared by both row variants via a single
render_row_close_button recipe — the button now reads as something
to press, not a glyph in a square.

Hoist sidebar_chrome.rs alongside sidebar.rs to host the shared
constants/helpers and keep both files under the 500-line ceiling
(444 / 198). cargo test ely_app --bin ely_app: 103 passed.
This commit is contained in:
2026-05-10 01:28:39 -04:00
parent 7c27f7308c
commit 25ff653d83
3 changed files with 304 additions and 222 deletions
+2 -1
View File
@@ -11,6 +11,7 @@ pub(crate) mod plugin_detail_view;
pub(crate) mod plugin_labels;
pub(crate) mod settings_layout;
pub(crate) mod sidebar;
pub(crate) mod sidebar_chrome;
pub(crate) mod sidebar_header;
pub(crate) mod split_pane;
pub(crate) mod topbar;
@@ -23,7 +24,7 @@ pub(crate) use command_overlay::render_command_overlay;
pub(crate) use home::render_home_page;
pub(crate) use plugin_detail_view::render_plugin_detail_view;
pub(crate) use settings_layout::render_settings_shell;
pub(crate) use sidebar::{panel_bg, panel_shadow};
pub(crate) use sidebar_chrome::{panel_bg, panel_shadow};
pub(crate) use sidebar_header::{
WorkspaceDisclosureAnchor, render_sidebar_header, render_workspace_disclosure,
render_workspace_disclosure_backdrop,