Own the AryaOS Cockpit theme (v1.2.0) - #1
Merged
Merged
Conversation
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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Eleven
cockpit-*plugins each carried their own 143–308 line stylesheet defining an identical--aos-*palette.cockpit-dronecotandcockpit-lincotwere byte-for-byte identical; charontak was a 308-line variant of the same thing; four more repos also shared an identical 230-linepkg/lib/page.scss.None referenced the AryaOS Product Suite design tokens, so the console had drifted from the kit and from aryaos.org:
#35a58fteal#E4610F#74d8a4#3F7D57#ff8a7a#A32820ui-monospace0 10px 30pxshadowWhat 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 saysvar(--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-listfinds 0 Archivo and 0 JetBrains faces. A barefont-family: Archivowould 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
--sns-target: 48px, not the kit's 44px — operator surfaces are used with gloves.#0B1512: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-dotkeeps its50%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
.13rather than landing 11 repos blind.🤖 Generated with Claude Code
https://claude.ai/code/session_0197da7dhvcPoHxYKamrYqyM