Shoreline: the TUI redesign, rebased onto main without the hitchhikers - #6258
Conversation
The terminal and the GPUI desktop window now cite one palette. Shoreline is the warm charcoal ground (`#211F23`), one raised plate (`#2B282E`), one restrained blue for action and selection (`#90B9FF`), Signal Gold for the human lane, and the whale's ivory ink — the same slots `codehwhale-gpui/src/workspace/mod.rs` installs into `Theme`. It ships as two presets (`shoreline`, `shoreline-light`), and it is the fresh-install default in `Settings::default`, the settings schema, the theme picker's reset value, and the malformed-selector fallback. The `underwater` theme keeps the painted water column, the ombre and the ambient life; it is a choice now, not the ground the product opens on. Shoreline is listed in `adapt::theme_remap_active`, so every direct terminal constant lands on the preset's slots instead of a navy-tuned value. Its mode badges keep the shipped mode ramp: a mode colour must differ from `accent_primary`, because `theme_semantic_foreground_role` resolves modes first and would otherwise read the action lane as `ModeAgent`. Evidence: - `cargo test -p codewhale-palette --lib --locked` — 81 passed, 0 failed. That includes `every_selectable_theme_clears_the_text_floor`, `every_selectable_theme_keeps_action_and_working_roles_distinct_on_ansi16`, `every_selectable_theme_keeps_mode_badges_distinct` and `every_selectable_theme_keeps_permission_lanes_distinct` over the two new presets. - `cargo build -p codewhale-cli --locked` — ok. - Real PTY capture of `target/debug/codewhale` on a fresh `CODEWHALE_HOME`: field `#211F23`, chrome `#1A181C`, plates `#2B282E`, accent `#90B9FF`, muted `#B0A7B2`, gold `#F6C453`. The braille whalemark is unchanged. - Not yet run: `codewhale-tui` tests. Expected fallout is the `theme_picker_*` goldens (two new rows) and tests asserting the old default string; reconciled in the next commit. (cherry picked from commit c1e89cb)
The repo's brand/mark.svg + wordmark traces were an earlier lower-fidelity trace of the C-curl whale (black currentColor instead of the navy family), and crates/tui/src/runtime_web/codewhale-192.png was still the retired diving-whale tile served by the embedded runtime web client. - brand/ and web/public/brand/ now carry byte-identical copies of the canonical family (codewhale-apps/packages/brand/svg/), adding the missing mark-mono and mark-reversed variants. - extensions/vscode/media/codewhale.svg uses the family mono mark. - runtime_web/codewhale-192.png is the canonical 192 tile (same bytes as codewhale-apps apps/web/public/icons/codewhale-192.png). - opengraph-image.tsx reads mark-reversed.svg (the family's white-on-navy variant) instead of string-replacing currentColor, which the family mark.svg does not contain; wordmark aspect corrected to the family's 1024x160 viewBox. - Deleted brand/mark-navy.svg (duplicate of the family navy mark), brand/wordmark0901.png + wordmarkinverted.png (only consumer was the retired generator; founder rasters preserved in codewhale-apps/packages/brand/source/), and scripts/brand/trace-brand.py (regenerated the retired trace; not referenced by CI). The founder brand sheet brand/codewhalemarkfinal.png stays as scripts/brand/braille-mark.py's input. - PRODUCT.md and the public-auth-routes provenance comment updated to name the canonical family home. Checks: npx tsc --noEmit (web) exit 0. Asset swap + comments; runtime_web route tests reference the icon path, not bytes. (cherry picked from commit 116a57b)
Two new presets mean the theme list is 17 rows where it was 15, and the fresh-install selector is `shoreline` where it was `underwater`. This is the expectation fallout, not a behaviour change: the picker's reset value, the digit-jump and wrap tests, the row-count assertions in both theme-list suites, and the four `theme_picker_*` / `edit_theme_*` golden buffers. The digit tests keep their intent. `3` now jumps to Shoreline (it still follows System and Terminal); the persistence test uses `9` -> Grayscale because Catppuccin Mocha moved past the 1-9 jump range. The theme-list test now anchors its boxed selection on index 6 (Blue Stage) since Shoreline and Shoreline Light sit ahead of Underwater. Evidence: - `CODEWHALE_BLESS_GOLDENS=1 ./scripts/dev-test.sh tui theme` — 56 tests run: 56 passed, 0 failed, 12424 skipped. The four goldens were deleted first because `assert_matches_golden` only blesses a *missing* file, never a drifted one. - Running the same filter as a bare `cargo test` (no hermetic HOME) failed two tests — `arrow_navigation_wraps_at_picker_edges` and `theme_picker_uses_shared_settings_controller` — because they read the real user theme directory and saw a `custom:` row. Both pass under the sanctioned wrapper; that flake is pre-existing, not introduced here, and is named in the handoff rather than papered over. - `crates/tui/src/tui/views/mod.rs` carried one line of another agent's in-flight work (`ModalKind::PetHabitat`). My three hunks in that file were staged apart from it; that peer has since committed them into `116a57b81` on this branch. The `PetHabitat` line is still unstaged and untouched. (cherry picked from commit dd1420e)
The settings stage and the config panel both render the theme list, so both
carry the two new rows. The stage anchors its boxed selection on index 6
(Blue Stage) rather than 4, which is now Underwater.
Evidence:
- `CODEWHALE_BLESS_GOLDENS=1 ./scripts/dev-test.sh tui views::` —
323 tests run: 322 passed, 1 failed. The one failure,
`tui::views::tests::every_settings_row_reaches_a_store`
("auto_compact_threshold_percent shows a row that settings.toml will not
take"), is pre-existing on `main` at the branch point: the schema row and
that exact assertion are both present in `4a85cb7877`, and
`Settings::set` has never accepted that key. It is not this change.
- `./scripts/dev-test.sh tui-integration palette_audit` — 3/3 passed.
- `python3 scripts/export-design-tokens.py --check` — up to date, 64 tokens.
The new `SHORELINE_*` constants are deliberately outside the exporter's
`(WHALE|LIGHT)_*` pattern, so the web's `tokens.css` is untouched.
(cherry picked from commit fe84f80)
`docs/design/TUI_REDESIGN.md` is the anchor for this branch: the Shoreline palette table and the three mechanisms that make the re-ink hold, the seven-project market survey and its convergent rules, the two things the survey says we already get right, and the two deliberately not done (the composer stays full width; the ocean is not deleted). It also names the remaining work with the seams already located: the one-status-row merge, and the interaction re-homing that has to land in the same commit or the slice ships a regression (the metrics line owns the `/model` and context-inspector pointer targets). `DESIGN.md` carried two defects this change exposed: - The palette owner was written as `crates/tui/src/palette/tokens.rs`. That path has not existed for some time; the owner is `crates/palette/src/tokens.rs`. - Anti-slop rule 2 stated that "the ocean column's field is the TUI's own chrome → bg descent". That was true of the TUI's default and is not any more — the default is Shoreline. The rule now says what is true: the column is the site's descent, and the navy water column is the terminal's selectable `underwater` theme. Also records, without fixing, the two failures that pre-date this branch on `main` at `4a85cb7877`, and the two picker tests that are order-dependent under a bare `cargo test` because they read the real user theme directory. Checks: `cargo test -p codewhale-palette --lib --locked` 81/81; `./scripts/dev-test.sh tui` 12461 run, 12459 passed, 2 failed (both pre-existing); `./scripts/dev-test.sh tui-integration palette_audit` 3/3; `python3 scripts/export-design-tokens.py --check` up to date. (cherry picked from commit cabdc0c)
|
Claude finished @Hmbown's task in 4m 4s —— View job Claude finished reviewing this PRTodo list
SummaryThis is a clean, well-executed rebase of the Shoreline redesign. The I found one real regression and a few small doc/dead-code loose ends from the rebase. 1. This file previously carried both an explanatory comment and 2. readFile(join(process.cwd(), "public/brand/mark-reversed.svg")),
...
return [mark.toString().replace("currentColor", "#ffffff"), ...
3.
4. Dangling references to the deleted This PR deletes Nit: "codehwhale-gpui" (transposed letters) appears in both Not reviewed / out of scopePer the task's offline-boundary and evidence policy, I didn't run |
The redesign half of #6222, cherry-picked onto current
main(200 commits newer than that branch's base). Shoreline becomes the fresh-install default.No-Issue: rescues the redesign commits from #6222, which stays open for its remaining work; see below for why this is a separate branch rather than a force-push.
Why #6222 looked unmergeable, and wasn't
tui-redesignreports 34 merge conflicts against main. Every single one is incrates/tui/plugins/computer-use/, and none of them is the redesign.That branch carries ten commits, and its own description says five "are not the redesign at all" — they were stranded on a local
mainthat was 129 behind and had never been pushed. The conflicts come entirely from those passengers:4517d294c031146342b9/pluginspage4a85cb7877web/lib/facts.generated.ts, a generated file48e03f74bb37b95e52f1Floatsetting kindDrop those five and the redesign applies almost cleanly. The headline commit —
feat(palette): add Shoreline, and open on it— cherry-picks onto today's main with no conflict at all.What is here
Shoreline is the fresh-install default, which is the part worth stating plainly since the commit subject buries it:
crates/config/src/settings_schema.rsand the setting's doc comment move with it.underwaterremains available, it is simply no longer what a new install opens on.The one real conflict, and how it was resolved
web/app/opengraph-image.tsx. Both sides were right about different things:fs.readFile.readFile(...).then(...)pattern — the exact shape main had just fixed — while renamingmark.svg→mark-reversed.svgfor the canonical vector family.Resolved by keeping main's lazy accessor and taking the branch's filename. Taking either side wholesale would have lost a real fix or a real rename.
Evidence
Both re-blessed goldens pass on the new base —
dock_tabs_match_80x24_goldenandwork_stage_matches_goldens_at_blocker_sizes— which is the check that would have caught a bad rebase.One untidiness, stated rather than hidden: the rebase surfaced a rustfmt difference in
themes.rs(main's toolchain collapses a match arm the old base wrapped as a block). The fix landed in the docs commit rather than the palette commit it belongs to. Behaviour-neutral; I left it rather than doing history surgery on someone else's commits.Not a force-push, deliberately
#6222 is someone else's branch and their draft. Force-pushing it would silently drop five commits they may still want — the runtime-api settings-schema route and the
Floatsetting kind are both clean and useful, and the Computer Use sync overlaps an open PR that should decide its own fate.So this is additive. If the owner of #6222 prefers, close it in favour of this and re-land the two clean passengers separately; #6222's own "what is left" list is unaffected either way.
🤖 Generated with Claude Code