Skip to content

feat(web): terminal material — cctrace's design language, ccx's bones - #31

Open
lroolle wants to merge 2 commits into
mainfrom
feat/web-terminal-material
Open

feat(web): terminal material — cctrace's design language, ccx's bones#31
lroolle wants to merge 2 commits into
mainfrom
feat/web-terminal-material

Conversation

@lroolle

@lroolle lroolle commented Jul 29, 2026

Copy link
Copy Markdown
Member

Summary

Eric's verdict: cctrace's session UI is the taste reference; ccx web's "color/font, layouts, interactions, details are looking bad". This ports cctrace's design language onto ccx's existing markup — every selector and JS hook kept, values rewritten — so the diff is a material swap, not a rewrite. Second commit ports cctrace's clamp mechanic.

  • Type: 13px ui-monospace body (was 17px system sans; 'Courier New' led the old mono stack), 10/11/12/13 sub-scale, 18px page h1
  • Palette: warm-tinted neutrals (kiln: tint neutrals toward brand hue — light #fcfbfa, dark #131110), terracotta as the single accent (deepened to #c65d3e light / #e08662 dark for contrast), and a five-hue semantic set (green/red/amber/purple/blue). All ~12 stray hues (#e9a, #a80, #5a9, #fa0, #d55, #86c, blue/violet/cyan context accents...) collapsed onto tokens
  • Surfaces: pastel role bubbles → hairline material with faint washes; user turns get cctrace's anchor mechanic (extra space above + accent-washed header row in a hairline box); thinking becomes muted italic
  • Interactions: long tool outputs clamp with a fade mask + explicit "show all" expander instead of an inner scrollbar — the wheel never gets trapped inside a pane. Progressive enhancement: panes inside collapsed details clamp lazily on first open; no JS = old scroll behavior
  • Side-stripe purge round 2 (kiln permanent anti-pattern; the 0.11 pass missed these): tool blocks (2px blue), outline active item (2px cyan), agent turns (2px purple), doctor/memory/settings cards (3px)
  • Chrome: thin scrollbars, accent selection, :focus-visible outlines, two tinted shadow tokens, radius scale 6/4/999
  • Correctness detail: uppercase role labels exempt command names and agent types (/init must not render /INIT)

Deliberate choice: terracotta stays the accent rather than copying cctrace's GitHub blue — the badness was hue-scatter + pastels, not the brand hue, and warm neutrals under a warm accent keep ccx's identity instead of cloning cctrace. Rationale + decision table in docs/devlog/2026-07-29-web-terminal-material.org.

Follow-up candidates (not in this PR): replay transport, tabular-nums pass on stat rows.

Will trivially conflict with #26/#28 on the CHANGELOG [Unreleased] header — keep all entries.

Test plan

  • go build ./... clean, go test ./... green (web tests cover template rendering)
  • Live smoke: ccx web served the sessions index and the f8e49d74 session view at 200; served HTML carries the new tokens, the turn-user/turn-role markup the new rules target, and the clamp module
  • Visual review is host-gated (no browser in the deva container) — screenshots on Eric's side

🤖 Generated with Claude Code

lroolle and others added 2 commits July 29, 2026 00:23
The web UI read as a pastel chat app: 17px system sans, role-tinted
bubbles, ~12 stray hues, 'Courier New' leading the mono stack, radii
3-12px, black shadows. cctrace's session UI is the taste reference:
a well-kept terminal.

Material swap in place — every selector and JS hook kept, values
rewritten:
- 13px ui-monospace body, 10/11/12/13 sub-scale, 18px page h1
- warm-tinted neutrals (light #fcfbfa, dark #131110), terracotta as
  the ONE accent, semantic set green/red/amber/purple/blue; provider
  and event tokens ride the set
- bubbles -> hairline surfaces; user turns get the cctrace anchor
  mechanic (space above + accent-washed header row); thinking is
  muted italic
- side-stripe purge round 2: tool blocks, outline active item, agent
  turns, doctor/memory/settings cards — hairline full borders now
- chrome details: thin scrollbars, accent selection, :focus-visible,
  tinted shadow tokens, radius scale 6/4/999
- uppercase role labels exempt command names and agent types

Devlog: docs/devlog/2026-07-29-web-terminal-material.org

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tool outputs, results, and compact-content panes used inner
scrollbars (max-height + overflow:auto), which trap the mouse wheel
mid-page — cctrace's msg-clamp mechanic replaces them: overflow gets
a fade mask and a "show all" row.

Progressive enhancement: JS measures each pane and only clamps real
overflow (>40px past the limit); panes inside closed <details>
measure as zero, so a capture-phase toggle listener clamps them
lazily on first open; without JS the old scroll behavior remains.
The show-tools toggle hides a result pane's expander together with
the pane.

Co-Authored-By: Claude Fable 5 <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