An avatar filled with a chart colour drew its initials in white, on the
assumption that every tint is dark enough to carry it. Measured, white
clears AA on two of the ten tint-and-mode combinations: a palette is
tuned so series stay distinct from each other, and dark mode lifts every
tint to stay visible against the dark ground, which puts all five out of
reach. The reported 3.4:1 assistant avatar was dark chart-1, at 3.36.
Each tint now names its own foreground, chosen by measurement — worst
chosen pair 5.32:1. Consumers read them with a white fallback, so a theme
that has not defined them renders exactly as it did.
--popover sat at card alpha, but a card and a menu are not the same kind
of surface: a card rests on the page background, while a menu floats over
whatever happens to be underneath it. In dark mode, over the aurora field
at its most saturated, the text behind a dropdown read straight through
the list of items — the two most-used menus in Canvas (the chat switcher
and the account menu) looked broken every time they opened.
Raised to 0.94/0.95. The backdrop blur still carries the depth, so the
glass reads as glass; it just stops being transparent. Every app that
defines --popover for a surface variant already used a fully opaque
value, so this only aligns the default with what each of them had
already decided independently.
Root font-size 18px moved behind html[data-font-scale=lg] so theme switches
are restyle-only. Conforms to the v1 token contract.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two color-coherence fixes driven by me.sky-ai.com's UI review:
- The premium button gradient was a fixed 290→350 sweep that ended in
hot pink, so CTAs read magenta against violet nav/links — and ignored
the data-palette accents entirely. It now derives from var(--primary)
with a subtle ±12° hue sweep (relative color syntax; degrades to the
solid primary fill on older browsers). Dark mode needs no override —
it follows dark's --primary. Affects all Prism consumers.
- The calm background variant (consumer surfaces) narrows from the full
rainbow (violet/pink/cyan/mint corners) to an analogous violet family
(periwinkle 245 → lavender 280 → violet 295 → pink 330), light + dark,
including calm-specific aurora drift blobs. The cyan/green corners sat
opposite the violet brand and made pages read as four brands at once.
Full-strength drift is untouched.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full-strength drift floods short consumer pages — the white glass
surfaces cluster and the app reads as a card floating on a poster
(diagnosed on me.sky-ai.com). Calm keeps the same hue story at about
half the stain: corner gradients ~45% alpha, drift blobs at 0.4. Dark
mode keeps its standard gradients (already calm); only the drift layer
eases to 0.7.
Opt-in per consumer app; drift stays the default.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Distinct names (mirroring --font-heading/--font-sans) so a consuming app's @theme inline can indirect to them without colliding with Tailwind's own font-* namespace.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Light + dark `[data-palette=...]` blocks. Violet stays default.
Overrides only Prism-defined vars (primary/accent/ring/chart-1/
sidebar-*/chat-user-bg/syntax-keyword) — avoids carrying Avalon-
only vars. Consumed by arcadia-personal-cloud-web's accent picker.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Five tokens (light + dark) for the chat bubble contract consumed by
lib-agent-chat-ui / lib-agent-dock-ui: --chat-user-bg/-fg and
--chat-assistant-bg/-fg/-border. User bubble is a filled, deep,
high-contrast panel with light text; assistant bubble is card-like
with a hairline border.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lifted from skyai-finance into a standalone theme once the choices
stabilised. New name earns itself twice: the literal glass refraction,
and the hue spectrum the corner glows span (lavender → peach → cyan → mint).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>