Skip to content

Own the AryaOS Cockpit theme (v1.2.0) - #1

Merged
ampledata merged 2 commits into
mainfrom
aryaos-theme
Jul 30, 2026
Merged

Own the AryaOS Cockpit theme (v1.2.0)#1
ampledata merged 2 commits into
mainfrom
aryaos-theme

Conversation

@ampledata

Copy link
Copy Markdown
Contributor

Eleven cockpit-* plugins each carried their own 143–308 line stylesheet defining an identical --aos-* palette. cockpit-dronecot and cockpit-lincot were byte-for-byte identical; charontak was a 308-line variant of the same thing; four more repos also shared an identical 230-line pkg/lib/page.scss.

None referenced the AryaOS Product Suite design tokens, so the console had drifted from the kit and from aryaos.org:

Cockpit shipped Kit says
accent #35a58f teal Signal Orange #E4610F
ok #74d8a4 #3F7D57
danger #ff8a7a #A32820
body font RedHatText Archivo
mono ui-monospace JetBrains Mono
cards 8px radius + 0 10px 30px shadow radius 0, no shadows

What the plugins already had right, and this preserves: the dark console theme, 48px (3rem) glove targets, and one 760px breakpoint with no strays anywhere. That part of the fleet sweep held.

Aliases, not a rewrite

--aos-* names are kept as aliases onto the kit tokens. Every plugin rule already says var(--aos-panel), so aliasing makes those rules kit-correct without rewriting hundreds of declarations. A plugin migrates by deleting its palette block and importing this.

The fonts are bundled, not just named

Cockpit renders in the operator's browser, not on the Pi — so installing Archivo on the box would do nothing. Measured on aryaos-4f11: fc-list finds 0 Archivo and 0 JetBrains faces. A bare font-family: Archivo would have silently fallen back to sans-serif: a rule that looks applied and isn't.

Per-plugin webfonts are already the established pattern here — PatternFly ships ~22 woff2 into every plugin and @font-faces them relatively (264 across the fleet). Ours add ~85 KB. OFL-1.1 licence and notices travel with them.

Two documented deviations

  1. --sns-target: 48px, not the kit's 44px — operator surfaces are used with gloves.
  2. Status colours lightened for the console, because the kit specifies them against Paper. Measured WCAG contrast of the kit values as text on #0B1512:
ok    #3F7D57  3.79:1  passes UI 3:1, FAILS body text 4.5:1
warn  #A8811C  5.15:1  passes -- would have been fine as-is
fault #A32820  2.55:1  FAILS outright

The hue stays anchored to the kit token and the console variant is derived with color-mix, so there's no second hardcoded palette to drift. Percentages put all three in one narrow band, because a triad lightened unevenly reads as mismatched: ok 65% → #7EA589 6.75:1, warn 75% → #BA9C4F 7.04:1, fault 50% → #CA8C84 6.72:1.

Scoping of radius-0 / no-shadow

Scoped to our own surfaces plus the PatternFly components we actually render — not a blanket * rule. PF uses radius meaningfully in switches, spinners and progress bars. .aos-dot keeps its 50% and says why: a 2px square status dot reads as a defect, not a state.

Verified

Compiles to 4839 bytes. Asserted on the compiled output: radius 0, target 48px, #e4610f, Archivo, JetBrains Mono, box-shadow: none, 760px and the woff2 URL all present — and the only non-zero radius emitted is the documented dot. Tests 6 passed, typecheck clean.

Next

This is the foundation only. The 11 plugin migrations (delete palette block, import theme, drop the shadow/radius rules) follow separately so each can be eyeballed on .13 rather than landing 11 repos blind.

🤖 Generated with Claude Code

https://claude.ai/code/session_0197da7dhvcPoHxYKamrYqyM

gba and others added 2 commits July 29, 2026 23:05
Eleven cockpit-* plugins each carried their own 143-308 line stylesheet
defining an identical --aos-* palette. cockpit-dronecot and cockpit-lincot
were BYTE-FOR-BYTE identical; charontak was a 308-line variant of the same
thing; four more repos also shared an identical 230-line pkg/lib/page.scss.
None of them referenced the AryaOS Product Suite design tokens, so the
console had drifted from the kit and from aryaos.org:

  accent     #35a58f teal  -> kit says Signal Orange #E4610F
  ok         #74d8a4       -> kit says #3F7D57
  danger     #ff8a7a       -> kit says #A32820
  body font  RedHatText    -> kit says Archivo
  mono       ui-monospace  -> kit says JetBrains Mono
  cards      8px radius + 0 10px 30px shadow -> kit says radius 0, no shadows

What the plugins already had RIGHT, and this preserves: the dark console
theme, 48px (3rem) targets for gloved use, and one 760px breakpoint, with
no stray breakpoints anywhere. That part of the 2026-07-14 fleet sweep held.

--aos-* names are kept as ALIASES onto the kit tokens, deliberately: every
plugin rule already says var(--aos-panel), so aliasing makes those rules
kit-correct without rewriting hundreds of declarations. A plugin migrates by
deleting its palette block and importing this.

The fonts are BUNDLED, not just named. Cockpit renders in the operator's
browser, not on the Pi, so installing Archivo on the box would do nothing --
measured on aryaos-4f11, fc-list finds 0 Archivo and 0 JetBrains faces, and
a bare `font-family: Archivo` would have silently fallen back to sans-serif.
A rule that looks applied and is not. Per-plugin webfonts are already the
established pattern: PatternFly ships ~22 woff2 into every plugin and
@font-face-s them relatively (264 across the fleet). Ours add ~85 KB.
OFL-1.1 licence and notices travel with them.

Two documented deviations from the kit:

  1. --sns-target is 48px, not 44px. Operator surfaces are used with gloves.
  2. Status colours are lightened for the console, because the kit specifies
     them against Paper. Measured WCAG contrast of the kit values as text on
     #0B1512:
         ok    #3F7D57  3.79:1  passes UI 3:1, FAILS body text 4.5:1
         warn  #A8811C  5.15:1  passes -- would have been fine as-is
         fault #A32820  2.55:1  FAILS outright
     The hue stays anchored to the kit token and the console variant is
     derived with color-mix, so there is no second hardcoded palette to
     drift. Percentages put all three in one narrow band, since a triad
     lightened unevenly reads as mismatched:
         ok 65% -> #7EA589 6.75:1, warn 75% -> #BA9C4F 7.04:1,
         fault 50% -> #CA8C84 6.72:1

radius-0 and no-shadow are scoped to our own surfaces plus the PatternFly
components we actually render, NOT a blanket `*` rule: PF uses radius
meaningfully in switches, spinners and progress bars. .aos-dot keeps its 50%
and says why -- a 2px square status dot reads as a defect, not a state.

Compiles to 4839 bytes. Asserted on the compiled output: radius 0, target
48px, #e4610f, Archivo, JetBrains Mono, box-shadow none, 760px, and the
woff2 URL all present; the only non-zero radius emitted is the documented
dot. Tests 6 passed, typecheck clean.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0197da7dhvcPoHxYKamrYqyM
I said this theme had the same orange-vs-danger collision as the AryaOS
portal. Measured on THIS surface, it does not:

  console panel #12211A      as text   min deltaE vs status
  Signal Orange #E4610F      4.78:1    51
  Okabe-Ito blue #56B4E9     7.23:1    46

The portal collision was orange sitting deltaE 5.3 from a saturated
vermillion danger colour. The console's status set is lightened pastels
(#7EA589 / #BA9C4F / #CA8C84), so orange is comfortably clear of it -- in
fact further than blue is. I asserted the collision without measuring this
surface.

The split is still made, on legibility rather than confusion: 4.78:1 is a
floor-scraping value for body text sitting next to 7.23:1, and an operator
reading a console for a whole shift should not have to work at it. Keeping
the two roles apart on every surface also means one rule to remember instead
of a per-surface exception.

  --sns-brand   Signal Orange: fills, rules, the mark. Never a label.
  --sns-accent  Okabe-Ito blue: interactive text and links.

--aos-accent keeps pointing at the interactive colour, because that is what
the plugins' existing rules use it for; fills ask for --aos-brand.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0197da7dhvcPoHxYKamrYqyM
@ampledata
ampledata merged commit 669f38b into main Jul 30, 2026
1 check passed
@ampledata
ampledata deleted the aryaos-theme branch July 30, 2026 21:27
ampledata pushed a commit that referenced this pull request Aug 1, 2026
The theme work reached main as a single squashed commit (#1), so the commits
it was built from are not ancestors of main and git saw src/theme.scss as an
add/add conflict against this branch, which contains the same work unsquashed.
Same trap as the readsb fork.

Only two files actually conflicted:

  * package.json  -- kept 1.3.0; this branch adds a component, so it is the
    next minor after the theme's 1.2.0.
  * theme.scss    -- kept the appended gateway-activity block; the other side
    added nothing at that point, so the rest merged identically.

Typecheck, eslint and 29 tests clean after the merge, and every --sns-*/--aos-*
variable referenced still resolves.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0197da7dhvcPoHxYKamrYqyM
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