Skip to content

feat(ui): Experiential Labs console, rebuilt with a fast style layer - #216

Merged
HTExplicit merged 14 commits into
mainfrom
ui/el-v0210
Sep 30, 2026
Merged

HTExplicit merged 14 commits into
mainfrom
ui/el-v0210

Conversation

@HTExplicit

Copy link
Copy Markdown
Owner

Summary

The console theme is redone in the Experiential Labs look (platform.experientiallabs.ai), written from scratch and approved by the owner on 2026-09-29 ("可以,按这版推到全站"; platform identity keeps platform colours, everything else colour only for status + accent; the approved two-line cell layouts stay; header not sticky). Frontend only. Theme off still renders upstream.

  • frontend/src/styles/console/: tokens, behaviour, shell, controls, data, overlays, and per-page files (accounts, dashboard-usage, users-groups-proxies-keys, settings-ops-public, ops-channels, user), imported from main.ts. Every selector is scoped under html.flat-theme.
  • Templates only gain static data-ui hooks. The two script changes are in DataTable.vue, where the actions-column probe now runs only when the wrapper width changes (a height-only resize, such as the selection tray opening, no longer toggles actions-expanded twice), and in the upstream v0.2.10 usage-trend metric toggle, which gets data-ui="seg" so it renders as the console's segmented control.

Performance

The first version styled elements through :has(), so one row click re-styled the whole document. This pass removes almost all :has(). The few that remain sit in the subject position on hooked anchors and were measured cheap. data-ui values are static, and no sibling rule is keyed on classes that change at runtime.

Event Timing (click to next paint, production build, real mouse clicks), accounts row checkbox with the tray opening / a plain tick / the tray closing:

build open tick close
first EL build (a6673f8) 476 ms 168 ms 444 ms
this PR 32 ms 24 ms 40 ms
production today (Apple theme) 216 ms 80 ms 216 ms

Every other measured interaction is as fast as or faster than a6673f8: users/proxies/redeem row select, account filters, pagination select, the create-account dialog, settings switches, dark-mode toggle.

Verification

  • Pixel identity against a6673f8: 33 states × light/dark, plus 390px user pages and login. Every non-zero diff was traced to dynamic content (live clock, Chart.js entry animation, the login canvas animation, a stale raster). Computed styles and box sizes are identical across 13 states × 2 themes. Theme off is identical to upstream.
  • Final-review regressions fixed. V3-10: the redeem page insets win again, and it now matches the pre-V3 frames. V3-11: plus two more 2px page-head offsets (channel monitor at 1440/390, risk control at 390).
  • Upstream v0.2.10 UI checked in the theme: the usage-trend metric toggle, the risk-control allowlist, and the use-key dialog client tabs.
  • Local: vue-tsc --noEmit exit 0 on this tree; the 10 spec files of components changed on both sides of the v0.2.10 merge pass (268 tests); on ui/el the specs of every component whose template changed pass; static_all.py reports 0 unscoped selectors, 0 cross-file conflicts, LF.

🤖 Generated with Claude Code

Codex and others added 14 commits September 28, 2026 21:15
Remove the Apple v2 look; new console layer files (tokens, behaviour,
shell, controls, data, overlays, pages) imported from main.ts; functional
fixes rewritten as layout-only behaviour rules; unscoped leaks reverted
to upstream; Geist + Geist Mono self-hosted, MiSans 400/500/600; Lucide
icons (lucide-static 0.469.0) while the console theme is on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…public pages

Experiential Labs console language built from live measurements:
headerless content row and 240px sidebar with Lucide icons; ink primary
buttons, 30px controls, native checkboxes, segmented controls; dense
single-line tables with mono uppercase headers, monochrome identity
chips, 76px KPI cards, reference chart defaults; light popovers, modal
and menu recipes with the reference shadows; accounts page toolbar in
two rows with category and bulk menus; signin-style auth pages with a
pixel grid; accounts columns in upstream order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…al chips, green switches, quiet tray

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shared layers: platform identity colours back (decision 2), two-line cells
active (decision 3), neutral callouts, muted table heads, dark selected-row
text, legend placement, empty-state centering, mobile page title.
Page files: accounts, dashboard-usage, users-groups-proxies-keys,
settings-ops-public, ops-channels (new), user (new); templates only gain
data-ui hooks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shared: recipe dark branches carry colours only; header descriptions wrap;
date inputs on the control tiers; charts get console defaults before
mount; settings-tab hover icon; hand-written dialogs take Modal metrics;
table details (checkbox centre, empty row line, head rules, sticky edge,
unframed pagination, dialog row heights, group dialog footers).
Pages: duplicate titles, toolbars, segmented sizes, table frames and
heads, empty states, mobile fixes. Select opens under labelled filter
pills (theme on only; data-ui="select-anchor").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d by rate limit)

Co-Authored-By: Claude <noreply@anthropic.com>
…d (pixel-identical to a6673f8, event->paint within budget)
…e-head offsets (channel monitor, risk control)
@HTExplicit
HTExplicit merged commit d8eb415 into main Sep 30, 2026
18 checks passed
@HTExplicit
HTExplicit deleted the ui/el-v0210 branch September 30, 2026 04:15
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