Skip to content

fix: controls console + tuner polish - #73

Merged
tamirelazar merged 6 commits into
devfrom
fix/controls-console-polish
Jun 25, 2026
Merged

fix: controls console + tuner polish#73
tamirelazar merged 6 commits into
devfrom
fix/controls-console-polish

Conversation

@tamirelazar

Copy link
Copy Markdown
Owner

Impeccable critique pass over the Controls "Instrument" surfaces (6 console categories + tuner), live-verified via the QA harness.

Console

  • Drop the cramped per-row gauges from the master list; clean label column, readable unfocused rows.
  • Fixed panel height to the tallest category (APP, 10 params) so it no longer jumps as you cycle categories.
  • Inline value state-tag (was a fixed-column gutter); numeric axis ▲ marks the current value (default = notch on the bar).
  • Remove the restating placeholder description line.
  • Dedupe enum value display: dropped the ◈ <value> line that duplicated the value already shown with the cycle hint (Gaussian, Wind, Theme, Palette, all 12 enums).
  • Center the legend; legend hugs the bottom border with breathing room moved into the body.
  • Title box reads CONTROLS; the active tab dot names the category.

Tuner (ambient modal)

  • Label + value render legibly (were muted to the point of looking disabled).
  • Per-kind affordance + footer verb via ParamKind on TuneView (actions show ↵ run, not a misleading tune hint).
  • Footer hints centered across tuner / notification / pause cards.

Deferred (owner's call)

  • Accent unification (green selection vs orange accent).
  • Title-box fill loudness (signature chrome).

Gate: 1182 lib tests, clippy --all-targets, fmt clean.

tamirelazar and others added 6 commits June 24, 2026 22:37
Every modal action-hint footer now reads the same instrument voice:
lowercase verbs, compact glyph keys (↵ esc ↑↓ ←→ del), and a ' · '
separator. Previously each surface hand-wrote its own grammar
("Enter: Save    Esc: Cancel", "↑/↓: Navigate  Enter: Load", ...),
so wording drifted per overlay.

Introduce footer_hints(&[(key, verb)]) in render/panel.rs as the single
source of truth and route every footer through it: config save/browser
(live ratatui_adapter path), preset comparison, dirty guard, tuner hint,
palette editor save/load sub-dialogs, error notification, and both
chrome footer states. Collapse the two-line browser/load footers to one
line and make the palette load footer empty-aware.
A long notification (e.g. the dither dev-only toast, 53 chars) was hard
clamped to the modal's 51-column message area with chars().take(...),
amputating the trailing word — "…on GitHub" rendered as "…on GitH".

Add a greedy word-wrap helper (wrap_words) that breaks on spaces and
never mid-word (hard-breaking only a single oversized word as a last
resort), and emit one message row per wrapped line. The icon stays on
the first row and continuation rows align under the text. The modal's
height is already content-driven, so it grows to fit.
Console:
- Drop the cramped 6-cell per-row gauges from the master list; it now reads
  as a clean label column with readable (text_secondary) unfocused rows.
- Size the panel to the active category (floored) instead of padding every
  category to the fattest one, so sparse categories (SYS, PRF) no longer show
  a tall empty void.
- Tie the value state-tag to the value width instead of a fixed column gutter.
- The numeric axis triangle now marks the current value (default is already
  shown by the notch on the bar), not a duplicate default marker.
- Remove the restating placeholder description line; the header and kind widget
  already convey the parameter.
- Center the legend strip; drop its trailing blank row and give that breathing
  room to the bottom of the master-detail pane instead.
- Title box reads 'CONTROLS'; the active tab dot below names the category.

Tuner (ambient modal):
- Label and value render legibly (were muted to the point of looking disabled).
- Thread ParamKind through TuneView so the affordance and footer verb match the
  kind: actions show a bright 'enter run' instead of a misleading 'tune' hint.
- Center the footer hints across the tuner, notification, and pause cards.
- Pin the panel body to a fixed height (the tallest category, APP at 10 params)
  instead of sizing to the active category, so the panel no longer jumps as you
  cycle categories. Sparser categories pad with blank rows.
- Drop the redundant '◈ <value>' widget line for enum params: the current value
  already renders in the value row with the cycle hint, so the second line just
  duplicated it (Diffusion/Gaussian, Wind, Theme, Palette, etc.).
- Align numeric detail ▲ axis marker with the gauge's default notch
  (round(ratio·(gw-1)), clamp to bar range) so they coincide at default
  instead of splitting a column apart.
- Add shared value_color() helper; route both the ambient tuner value and
  the console numeric value through it so ParamState→color is decided in
  one place (console no longer uses accent_active / drops the Cli case).
- Correct the stale module doc that described a dynamic-height contract
  and a nonexistent MIN_BODY_ROWS constant.
- Remove the orphaned pub fn value_state (last caller deleted this branch).
- Fix the ? keyboard-hints overlay clipping its bottom on terminals under
  ~40 rows: calculate_position now centers on the real rendered height and
  top-anchors when the overlay is taller than the terminal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nd modals

Two visual-noise fixes for the windowed overlay experience:

1. Status bar now appears only when paused AND no overlay is open. Previously
   it showed whenever paused OR any overlay was open, cluttering the screen
   behind modals. on_pause() no longer expands chrome while an overlay is open,
   and on_modal_open() leaves the default (Minimal) base chrome collapsed
   instead of forcing ModalPane (persistent Expanded chrome is unchanged).

2. When a modal panel overlaps the window-frame border, the simulation and
   frame are wiped to a clean matte behind it so the panel is the sole focus.
   Panels fully contained within the sim interior leave the sim showing, so the
   blanking only kicks in when the frame would otherwise poke out as noise.
   Added FrameBuffer::fill_background and TerminalRenderer::modal_overlaps_frame,
   wired into both the single- and multi-species render paths.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@tamirelazar
tamirelazar merged commit f415bcf into dev Jun 25, 2026
2 of 3 checks passed
tamirelazar added a commit that referenced this pull request Jun 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant