Skip to content

feat(fleet-tui-poc): full iOS design (Spotlight + context menu + action sheet + session switcher)#8

Merged
NagyVikt merged 2 commits into
mainfrom
claude/ios-design-implement-spotlight-overlays
May 14, 2026
Merged

feat(fleet-tui-poc): full iOS design (Spotlight + context menu + action sheet + session switcher)#8
NagyVikt merged 2 commits into
mainfrom
claude/ios-design-implement-spotlight-overlays

Conversation

@NagyVikt

Copy link
Copy Markdown
Contributor

Summary

Implements the four iOS surfaces from the design at https://api.anthropic.com/v1/design/h/MnT9tqrbyJornGQ6jFA3mA — the user's exact Implement: index.html i want this style eactly request. Extends the bare-bones POC from PR #4 into a full ratatui mockup.

What's in

Press 1 / 2 / 3 / 4 in the running POC to switch overlays. q to quit.

Key Overlay Maps to design
1 Context menu PaletteContextMenu — long-press style, hairlines, ▭ pane title bar, destructive red Kill
2 Spotlight PaletteSpotlight — search bar w/ ⌘K chip, Top Hit pill on IOS_TINT, grouped PANE/SESSION/FLEET, footer ↵ open · ⌥↵ in all panes · esc cancel
3 Action sheet PaletteActionSheet — bottom sheet, grouped, iOS Cancel hallmark
4 Session switcher PaletteSessionSwitcher — app-switcher cards w/ Focus/Queue/Pause/Kill

Palette parity

Uses the exact iOS dark UIKit values from the design's GLASS object:

Const Hex Design name
IOS_TINT Rgb(10,132,255) systemBlue dark #0a84ff
IOS_DESTRUCTIVE Rgb(255,69,58) systemRed dark #ff453a
IOS_GREEN Rgb(48,209,88) #30d158
IOS_ORANGE Rgb(255,159,10) #ff9f0a
IOS_FG Rgb(242,242,247) #f2f2f7

Test plan

  • cargo build --release -p fleet-tui-poc clean
  • cargo run --release -p fleet-tui-poc renders all four overlays
  • Operator visually compares each overlay to the source design (/tmp/design/terminal-ios-style/project/palettes.jsx)
  • Operator runs the binary inside a fleet tmux pane and confirms the iOS chrome composes correctly with style-tabs.sh

Follow-ups

  • Once parity is signed off, the four overlay renderers become the basis for sub-13 of fleet-tui-ratatui-port-2026-05-14 — they move out of fleet-tui-poc into the production fleet-ui::overlay module with real keypress wiring inside fleet-watcher / fleet-state / fleet-plan-tree / fleet-waves binaries.

🤖 Generated with Claude Code

NagyVikt and others added 2 commits May 14, 2026 16:47
…xt menu, action sheet, session switcher)

Implements the design at api.anthropic.com/v1/design/h/MnT9tqrbyJornGQ6jFA3mA
(README in /tmp/design/terminal-ios-style/), extending the bare-bones POC
into a full ratatui mockup of all four iOS surfaces:

  * Spotlight palette — search-first, Top Hit pill (IOS_TINT #0a84ff bg,
    white bold, tmux·h badge), grouped sections (PANE / SESSION / FLEET)
    with 30×30 icon tiles, footer `↵ open · ⌥↵ in all panes · esc cancel`
  * iOS context menu — pinned long-press menu, sectioned with hairlines,
    destructive-red Kill row, ▭ pane / %id title bar with green live dot
  * Action sheet — bottom-anchored grouped sheet with iOS Cancel hallmark
  * Session switcher — app-switcher cards (one per codex worker) with
    Focus/Queue/Pause/Kill action row

Press 1/2/3/4 to switch overlays, q to quit.

Palette: iOS dark UIKit values match the design's GLASS object —
IOS_TINT = Rgb(10,132,255), IOS_DESTRUCTIVE = Rgb(255,69,58),
IOS_GREEN = Rgb(48,209,88), IOS_ORANGE = Rgb(255,159,10),
IOS_FG = Rgb(242,242,247). Fonts default to terminal monospace.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds App.card_buttons hit-test registry. render_session_card pushes a
Rect for each Focus / Queue / Pause / Kill button per card; the New
worker pill registers as a NewWorker action. On MouseDown(Left) inside
SessionSwitcher the App.dispatch_card_click walks the registry and
sets App.last_action with a human-readable line ("✓ Focus → pane 1
(would: tmux select-pane -t codex-fleet:overview.1)") that flashes in
the footer area until the next click.

Card sizing also tightened: strip height now caps at 70% of the
available vertical space and centers between header and footer,
matching artboard D in /tmp/design/terminal-ios-style/project/
palettes.jsx (artboard shows ~78%; we leave 8% for the flash row).
card_w 30→28 + gap 2→1 so a wider set of cards fits in modest kitty
sizes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@NagyVikt NagyVikt merged commit eb54a2a into main May 14, 2026
NagyVikt pushed a commit that referenced this pull request May 14, 2026
…gration)

Lands sub-6 through sub-13 of fleet-tui-ratatui-port-2026-05-14 in
one squashable PR. The four bin crates use fleet-ui (Wave 2) + the
new fleet-data layer to render their dashboards; full-bringup.sh
now launches them by default and falls back to the bash *-anim.sh
when FLEET_DASHBOARD_RENDERER=bash.

WAVE 3 — fleet-data (sub-6/7/8):
  * plan.rs — serde Plan + Subtask structs + load() + newest_plan()
    + parse_trailing_date(). Tests: deserialise minimum-schema +
    trailing-date math + missing-plans-dir gracefully None.
  * accounts.rs — codex-auth list parser → Vec<Account>. Tests:
    real-world block + drops without-email + drops missing-percent.
  * panes.rs — tmux list-panes + capture-pane wrapper + PaneState
    classifier with explicit ordering (cap > approval > boot >
    working > polling > idle). 7 classifier tests.
  * thiserror added as fleet-data dep for PlanError.

WAVE 4 — bin crates (sub-9/10/11/12):
  * fleet-watcher — header banner + 4 stat cards (PANES/CAPPED/
    SWAPPED/RANKED) via fleet-ui::card + chip + per-pane table
    placeholder.
  * fleet-state — iOS cockpit; ACTIVE table composes status_chip +
    progress_rail for 5h% and weekly% per account.
  * fleet-plan-tree — Kahn topological levels (waves()) over Subtask
    depends_on; renders W1..Wn rows of chips.
  * fleet-waves — vertical wave flow, sub-task chips per line.
  * Each bin renders an in-binary tab strip at the top and handles
    its own MouseDown(Left) → tmux select-window dispatch. This is
    the canonical click-routing fix referenced in acceptance #8 of
    the plan — every tab click works regardless of tmux's
    MouseDown1Status state.

WAVE 5 — bringup + docs (sub-13):
  * full-bringup.sh: FLEET_DASHBOARD_RENDERER env (default 'rust')
    routes window creation to Rust binaries when built, falls back
    to bash automatically if the bins are missing. open_window
    helper auto-detects .sh-vs-executable launch shape.
  * skills/codex-fleet/SKILL.md: Canonical visual design table
    extended with the Rust renderer column. Palette table updated
    to the iOS dark UIKit hex set (was the light variants).
  * Image-2 overlays (context menu / spotlight / action sheet /
    session switcher) remain in fleet-tui-poc — the bins consume
    them via fleet-ui::overlay once we lift the renders out of
    main.rs in a follow-up (covered by openspec out-of-scope).

cargo test --workspace: 29/29 pass (13 fleet-data + 16 fleet-ui).
cargo build --release: clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
NagyVikt added a commit that referenced this pull request May 14, 2026
…gration) (#11)

Lands sub-6 through sub-13 of fleet-tui-ratatui-port-2026-05-14 in
one squashable PR. The four bin crates use fleet-ui (Wave 2) + the
new fleet-data layer to render their dashboards; full-bringup.sh
now launches them by default and falls back to the bash *-anim.sh
when FLEET_DASHBOARD_RENDERER=bash.

WAVE 3 — fleet-data (sub-6/7/8):
  * plan.rs — serde Plan + Subtask structs + load() + newest_plan()
    + parse_trailing_date(). Tests: deserialise minimum-schema +
    trailing-date math + missing-plans-dir gracefully None.
  * accounts.rs — codex-auth list parser → Vec<Account>. Tests:
    real-world block + drops without-email + drops missing-percent.
  * panes.rs — tmux list-panes + capture-pane wrapper + PaneState
    classifier with explicit ordering (cap > approval > boot >
    working > polling > idle). 7 classifier tests.
  * thiserror added as fleet-data dep for PlanError.

WAVE 4 — bin crates (sub-9/10/11/12):
  * fleet-watcher — header banner + 4 stat cards (PANES/CAPPED/
    SWAPPED/RANKED) via fleet-ui::card + chip + per-pane table
    placeholder.
  * fleet-state — iOS cockpit; ACTIVE table composes status_chip +
    progress_rail for 5h% and weekly% per account.
  * fleet-plan-tree — Kahn topological levels (waves()) over Subtask
    depends_on; renders W1..Wn rows of chips.
  * fleet-waves — vertical wave flow, sub-task chips per line.
  * Each bin renders an in-binary tab strip at the top and handles
    its own MouseDown(Left) → tmux select-window dispatch. This is
    the canonical click-routing fix referenced in acceptance #8 of
    the plan — every tab click works regardless of tmux's
    MouseDown1Status state.

WAVE 5 — bringup + docs (sub-13):
  * full-bringup.sh: FLEET_DASHBOARD_RENDERER env (default 'rust')
    routes window creation to Rust binaries when built, falls back
    to bash automatically if the bins are missing. open_window
    helper auto-detects .sh-vs-executable launch shape.
  * skills/codex-fleet/SKILL.md: Canonical visual design table
    extended with the Rust renderer column. Palette table updated
    to the iOS dark UIKit hex set (was the light variants).
  * Image-2 overlays (context menu / spotlight / action sheet /
    session switcher) remain in fleet-tui-poc — the bins consume
    them via fleet-ui::overlay once we lift the renders out of
    main.rs in a follow-up (covered by openspec out-of-scope).

cargo test --workspace: 29/29 pass (13 fleet-data + 16 fleet-ui).
cargo build --release: clean.

Co-authored-by: NagyVikt <nagy.viktordp@gmail.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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