Skip to content

nilam · नीलम · hue 285 · 7,430 assertions

Colour, proven.

Every lightness on this page was found by inverting a contrast requirement, not chosen. The semantic hues were selected to maximise separation under three kinds of colour blindness. Nothing here is hand-tuned.

The signature

One hue, two brand moments. A filled button inverts the polarity of the page it sits on, so step 9 differs by mode — and --brand-ink follows it. The two cards below are on the same page: one forced light, one forced dark, with no token redeclared.

glow · dark mode · #8a7ef7 · L 0.660 · dark ink
solid · light mode · #755cf5 · L 0.585 · white ink
Zima Blue is L 0.667 · Telepathy accent L 0.657

forced light

Body text, and a link.

forced dark

Body text, and a link.

The assertion nobody else ships

The four status solids, as four different readers see them. Where two chips become one colour the palette says so out loud, and proveStatusChannels() fails the build unless those components carry a glyph as well as a hue. Every badge and note below has one, and that is why.

The solved scales

1 page · 2 subtle · 3–5 component rest/hover/active · 6–8 border subtle/normal/hover · 9–10 solid/hover · 11–12 text. Radix's role model, with the roles as contracts a solver satisfies rather than labels on chosen swatches.

123456789101112

Buttons

Disabled uses legible tokens rather than opacity, which fades the label below 4.5:1.

Forms

We only use this for receipts.

Enter a valid email address.



Status

Every glyph is required, not decorative — see the simulation above.

Payment received. Your next invoice is on 1 September.
i
Info carries no hue at all. The state that means nothing is wrong does not need one — and spending a hue on it collided with the brand.
!
Card expires next month. Update it before 1 September.
×
Last charge failed. The bank declined the transaction.
Pro Active !Expiring ×Failed iTrial Neutral

Overlays

Native throughout. <dialog> for the modal — focus trap, Esc and an inert background with no library. The menu and tooltip are the Popover API plus CSS anchor positioning, which reached Baseline in 2026: the popover anchors itself to the button that opened it, so there is no Floating UI and no JS.

Positioned by CSS, not by JavaScript.

Delete workspace

This removes every project and cannot be undone. Type the workspace name to confirm.

Disclosure and tabs

<details name> makes the accordion exclusive with no state to manage.

Why is info achromatic?
Because the brand took that region of hue space. With a violet brand at 285, the best blue available was 0.052 from it under deuteranopia — the same colour to that reader. Info means "nothing is wrong", so it does not need to shout.
Why is step 9 different in each mode?
A filled button inverts the polarity of its page. Dark object with light text on a light page; light object with dark text on a dark one.
What is not derived?
GLOW_L = 0.66. Four derivations were tried and none produce it. It is measured off Zima Blue and an accent that works.

Revenue by channel

Table

AccountOwnerStatusMRR
NorthwindNWActive£4,200
ContosoCO!Expiring£2,750
InitechIN×Failed£1,980
UmbrellaUMiTrial£0
GlobexGXActive£6,410

Loading

Four, because they answer four different questions. Prefer the skeleton wherever the shape is predictable — a spinner tells the reader nothing about what is arriving. Under prefers-reduced-motion these keep animating on opacity alone: a frozen spinner reads as a hung app, not as reduced motion.

spinner · unknown duration

Checking your card…

dots · inline thinking

Generating

progress · known proportion

62%

bar · unknown duration

skeleton · shape is known