Skip to content

feat(ui): softer palette (zinc/graphite) and stacked table cells that fit the screen - #219

Merged
HTExplicit merged 6 commits into
mainfrom
ui/tune
Oct 1, 2026
Merged

HTExplicit merged 6 commits into
mainfrom
ui/tune

Conversation

@HTExplicit

@HTExplicit HTExplicit commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

Summary

Two owner-approved changes (2026-09-30, from full-size previews on real pages), plus one small fix:

  1. Less black, readable text (palette C). Light mode moves to shadcn zinc neutrals. Dark mode moves to Linear-like layered graphite (canvas #1a1a1d / surface #212125), so there is no near-black base any more.

    • Primary actions and the current page use brand green. Segmented controls get a raised white pill on a grey track.
    • Usage records get a real hierarchy: model and cost in ink; token numbers, keys and accounts one step softer; token icons back in upstream hues.
    • Chart series 1 is blue (no more all-black or all-white donut). Dark tables no longer use pure white text.
    • Implemented with role tokens in tokens.css (--ui-solid*, --ui-track, --ui-thumb*, …) that about 58 former ink-fill rules now read. CSS only.
  2. Tables fit the width (option B). Related columns become lines inside one cell, in upstream column order, and every part keeps its own sort control. Accounts is always stacked; usage records and error requests (admin) are stacked below 1800 px; user usage and error requests and IP management below 1400 px; keys, users, channels and groups are fixed at 1280.

    • Horizontal overflow is 0 at 1280/1440/1920 on every listed table, including all 21 accounts columns (before: accounts 1192/1142/662 px). Rows are taller; nothing is hidden.
    • Changes: DataTable stack support, column definitions, the new styles/console/tables.css, and theme rules migrated to the stacked lines. Stacked headers darken only the hovered label, and an unsorted part no longer wraps an empty sort box.
  3. i18n fix. The proxy copy-format label escapes @ ({'@'}), which vue-i18n otherwise reads as a linked message. This failed localesMessageCompile, which CI does not run.

  4. axios 1.20.0. Seven high advisories for axios < 1.20.0 were published on 2026-09-30, and they fail the frontend-security audit gate on every branch. The bump keeps the same dependency set; only the lockfile's axios entries change.

Verification

  • Each track was implemented, independently reviewed and fixed. The merged tree then passed an acceptance run:
    • Overflow is 0 on every table at 1280/1440/1920, light and dark.
    • Contrast: 156 page states (78 scenes, light and dark), 34,840 visible text nodes, 0 below WCAG AA (lowest 4.52 light / 4.70 dark).
    • Element-level style diff against the approved previews: 0.
    • Sorting on sub-headers sends the right GET query, and column settings and the selection tray still work.
    • Theme off is identical to production when flat_theme_enabled is false.
  • Event Timing on a production build vs production, accounts tray open / tick / close: 40/24/24 ms vs 36/24/32 ms. More-actions panel and create dialog are equal.
  • vue-tsc exit 0; eslint on changed files exit 0; specs pass: DataTable, AccountsView (9 files), OpsErrorLogTable, i18n key and compile specs, ProxiesView.

🤖 Generated with Claude Code

Codex and others added 6 commits October 1, 2026 01:51
…ys scrolling

Console theme, option B of the ui-tune table-width round (owner-approved
2026-09-30): related columns become lines of one cell, each part keeping its
own cell slot, header label, sort control and help tip. Nothing is hidden;
rows may grow taller.

- DataTable: Column.stack / stackLayout / cellLabel / stackBelow. A stacked
  host draws its parts' header labels (a sortable part sorts on a click on its
  label or with its own sort button, whose name carries the order) and its
  cell lines. Parts are columns again from stackBelow up and whenever the
  theme is off (upstream's column order); phone cards are unchanged.
- columnStack.ts: stackColumns() applies the column settings to stacked
  tables (a hidden part drops its line, a hidden host keeps its parts' lines).
- Accounts always stacked (9 columns; the 5 optional columns join cells);
  admin usage and the admin error list below 1800px, the ops error dialog at
  every width (it is at most 1240px wide); user usage, user errors and IP
  management below 1400px; API keys use the compact recipe up to 1440px.
- tables.css (after the page files): the layout rules, all under
  html.flat-theme; existing rules keyed on a merged column also name its line.
- Account names and e-mails break at word joins, model ids only after a slash
  (an outlier part over 32 characters also after its hyphens); without the
  theme both render as upstream.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Implements the owner-approved palette C (preview of 2026-09-30) in the
console theme styles; templates and scripts are unchanged and every rule
stays under html.flat-theme, so theme off still renders upstream.

- tokens: zinc neutrals in light, layered graphite in dark (canvas
  #1a1a1d, surface #212125), zinc text greys and dark-* family, dark
  identity and accent soft fills recomputed for the new surface, chart
  series 1 blue; fill roles (--ui-solid*, --ui-on-solid, --ui-track,
  --ui-thumb*, --ui-choice-edge) replace the ink fills and the unused
  --ui-on-ink override is dropped
- the rules that painted rgb(var(--ui-ink)) fills read the roles: a
  primary action is solid green, a segmented control is a grey track with
  a raised pill, chosen options and the current page take the accent tint
  and edge, marks take the accent
- style.css recipes: .btn-primary, .tabs / .tab-active, .switch-active;
  calmer weights (buttons, tabs, filter pills, field labels 500, table
  headers 400, KPI values 500)
- usage records: model and billed cost in ink, token figures and names in
  the soft ink, token glyphs in their upstream hues
- dark tables: text-white reads the ink instead of pure white
- selected rows: in dark, secondary text takes the soft ink and danger
  text red-300 (4.70 and 4.88:1 on the hovered selected fill; the muted
  grey and #f69898 fell to 4.31 and 4.35), stacked cell-line labels
  included; in light the hovered selected fill mixes 3 % ink instead of
  4 %, so red, amber and green text keep 4.5:1 (4.45-4.48 before)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vue-i18n reads a bare @ as the start of a linked message, so the
"username:password@host:port" label failed to compile
(localesMessageCompile spec, which CI does not run). Use the literal {'@'}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rt box line

Hovering a part label darkened the host label too (the whole-cell hover
rule), so it was unclear which column a click sorts; an unsorted part kept an
empty 11px sort box that wrapped onto a line of its own in narrow headers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GHSA-c29m-xwm3-cm6r, -mghh-pgcx-3jjj, -x97p-jq2g-jp4f, -3pq3-5fj3-cg6v,
-542g-h47m-68v8, -m8m8-qj5v-23w3 and -r4gj-5m52-g5wh affect axios < 1.20.0
and fail the frontend-security audit gate for every branch. 1.20.0 keeps the
same dependency set (form-data ^4.0.6 is already locked at 4.0.6).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@HTExplicit
HTExplicit merged commit 3fa9b52 into main Oct 1, 2026
18 checks passed
@HTExplicit
HTExplicit deleted the ui/tune branch October 1, 2026 01:37
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