Skin generator

Nine colours, four typefaces and eight numbers. Everything else — every hover, active, foreground, tint, border and radius — follows from them, and anything that follows badly can be typed over one token at a time.

The skin applies to this whole site, not to a preview box, and it is still on tomorrow: read the button page, the tokens page, anything, and see it there. The button in the top bar takes it off again.

Northwind

Every order, in one place

This page is not documentation. It is an ordinary interface, built out of the library, so the skin you are making can be judged on something that looks like work rather than on a row of swatches.

Nothing here is real, and nothing is sent anywhere.

Revenue
1,284,309
Increased by+12.4%vs last month
Orders
3,401
Unchanged0.0%vs last month
Returns
86
Decreased by-3.1%vs last month

Two invoices are waiting for approval

They were raised this morning and nobody has looked yet.

Everything synced

Last run four minutes ago, 3,401 records, no conflicts.

ShippedBeta3 unreadWholesaleCtrl+K

New order

Start typing to search the ledger.

Enter a valid email address.

Delivery
Priority

This order

EG-2026-00841

Placed 8 August, paid by card

Customer
Ada Lovelace
Total
1,240.00

Packing — 62%

Warehouse capacity — 92 of 100 bays

92%
  1. Order placed

    Three items, paid by card.

  2. Shipped

  • Notify the customerOne email when the parcel moves
  • InvoicePDF, 84 kB

Everything arrived on the day it said it would.

A customer

August

Orders in August
CustomerStatusTotal
Ada LovelaceShipped1,240.00
Grace HopperPacking986.50
Karen Spärck JonesReturned312.00
Total2,538.50

Checkout

How long does delivery take?
Orders placed before 4pm leave the warehouse the same day.
Can I change the address after paying?
Until the parcel is picked, yes.

In the top layer

Which is where a menu, a tooltip and a dialog all end up.

Saves without leaving the page

Discard this order?

Nothing has been sent anywhere. This page is a demonstration.

Then hand-edit it

The derived values are arithmetic, and arithmetic does not know that the tint behind a danger banner is one step too loud. That is the point of exporting literals rather than a function call: every number is yours to move, and moving one does not silently move four others.

Paste the block into your own stylesheet, set data-skin on <html>, and you are done. The mode follows the reader unless you also set data-theme. There is nothing to register and nothing to rebuild.

Two things the editor will not write for you. It never sets color-scheme — that is the mode axis, and a skin that sets it breaks the light/dark toggle for everything inside it. And it leaves --target-size alone, because tokens/sizing.css raises it under a coarse pointer and a skin that overrode it would quietly take the touch floor away.

Skin

Every change lands on this page and on every other page of the site, and it is still there tomorrow. The button in the top bar takes it off.

Colour

Nine colours in light mode. The dark half of each one, and every hover, active, foreground and tint, is worked out from them — check the result under Contrast.

Shape

The radius scale and the two border widths. Everything that draws a corner reads one of these.

Density and text

Density is the one structural scale a skin may pull, and it multiplies every padding and gap in the library at once. One component's padding on its own is a job for Extra CSS below.

Typefaces

Four families. Which is used where is a component decision, not a skin one — headings read the primary, body copy the secondary.

  • system-ui — on the reader's machine
  • Onest — on the reader's machine
  • Georgia — on the reader's machine
  • ui-serif — on the reader's machine
  • ui-rounded — on the reader's machine
  • ui-monospace — on the reader's machine
  • Inter (sans) — downloaded
  • Roboto (sans) — downloaded
  • Open Sans (sans) — downloaded
  • Lato (sans) — downloaded
  • Montserrat (sans) — downloaded
  • Poppins (sans) — downloaded
  • Nunito (sans) — downloaded
  • Work Sans (sans) — downloaded
  • Rubik (sans) — downloaded
  • Manrope (sans) — downloaded
  • DM Sans (sans) — downloaded
  • Outfit (sans) — downloaded
  • Plus Jakarta Sans (sans) — downloaded
  • Figtree (sans) — downloaded
  • Space Grotesk (sans) — downloaded
  • Sora (sans) — downloaded
  • Karla (sans) — downloaded
  • IBM Plex Sans (sans) — downloaded
  • Bricolage Grotesque (sans) — downloaded
  • Playfair Display (serif) — downloaded
  • Merriweather (serif) — downloaded
  • Lora (serif) — downloaded
  • Source Serif 4 (serif) — downloaded
  • Libre Baskerville (serif) — downloaded
  • EB Garamond (serif) — downloaded
  • Bitter (serif) — downloaded
  • Crimson Pro (serif) — downloaded
  • Fraunces (serif) — downloaded
  • IBM Plex Serif (serif) — downloaded
  • JetBrains Mono (mono) — downloaded
  • IBM Plex Mono (mono) — downloaded
  • Source Code Pro (mono) — downloaded
  • Fira Code (mono) — downloaded
  • Space Mono (mono) — downloaded
  • Roboto Mono (mono) — downloaded
  • system-ui — on the reader's machine
  • Onest — on the reader's machine
  • Georgia — on the reader's machine
  • ui-serif — on the reader's machine
  • ui-rounded — on the reader's machine
  • ui-monospace — on the reader's machine
  • Inter (sans) — downloaded
  • Roboto (sans) — downloaded
  • Open Sans (sans) — downloaded
  • Lato (sans) — downloaded
  • Montserrat (sans) — downloaded
  • Poppins (sans) — downloaded
  • Nunito (sans) — downloaded
  • Work Sans (sans) — downloaded
  • Rubik (sans) — downloaded
  • Manrope (sans) — downloaded
  • DM Sans (sans) — downloaded
  • Outfit (sans) — downloaded
  • Plus Jakarta Sans (sans) — downloaded
  • Figtree (sans) — downloaded
  • Space Grotesk (sans) — downloaded
  • Sora (sans) — downloaded
  • Karla (sans) — downloaded
  • IBM Plex Sans (sans) — downloaded
  • Bricolage Grotesque (sans) — downloaded
  • Playfair Display (serif) — downloaded
  • Merriweather (serif) — downloaded
  • Lora (serif) — downloaded
  • Source Serif 4 (serif) — downloaded
  • Libre Baskerville (serif) — downloaded
  • EB Garamond (serif) — downloaded
  • Bitter (serif) — downloaded
  • Crimson Pro (serif) — downloaded
  • Fraunces (serif) — downloaded
  • IBM Plex Serif (serif) — downloaded
  • JetBrains Mono (mono) — downloaded
  • IBM Plex Mono (mono) — downloaded
  • Source Code Pro (mono) — downloaded
  • Fira Code (mono) — downloaded
  • Space Mono (mono) — downloaded
  • Roboto Mono (mono) — downloaded
  • system-ui — on the reader's machine
  • Onest — on the reader's machine
  • Georgia — on the reader's machine
  • ui-serif — on the reader's machine
  • ui-rounded — on the reader's machine
  • ui-monospace — on the reader's machine
  • Inter (sans) — downloaded
  • Roboto (sans) — downloaded
  • Open Sans (sans) — downloaded
  • Lato (sans) — downloaded
  • Montserrat (sans) — downloaded
  • Poppins (sans) — downloaded
  • Nunito (sans) — downloaded
  • Work Sans (sans) — downloaded
  • Rubik (sans) — downloaded
  • Manrope (sans) — downloaded
  • DM Sans (sans) — downloaded
  • Outfit (sans) — downloaded
  • Plus Jakarta Sans (sans) — downloaded
  • Figtree (sans) — downloaded
  • Space Grotesk (sans) — downloaded
  • Sora (sans) — downloaded
  • Karla (sans) — downloaded
  • IBM Plex Sans (sans) — downloaded
  • Bricolage Grotesque (sans) — downloaded
  • Playfair Display (serif) — downloaded
  • Merriweather (serif) — downloaded
  • Lora (serif) — downloaded
  • Source Serif 4 (serif) — downloaded
  • Libre Baskerville (serif) — downloaded
  • EB Garamond (serif) — downloaded
  • Bitter (serif) — downloaded
  • Crimson Pro (serif) — downloaded
  • Fraunces (serif) — downloaded
  • IBM Plex Serif (serif) — downloaded
  • JetBrains Mono (mono) — downloaded
  • IBM Plex Mono (mono) — downloaded
  • Source Code Pro (mono) — downloaded
  • Fira Code (mono) — downloaded
  • Space Mono (mono) — downloaded
  • Roboto Mono (mono) — downloaded
  • system-ui — on the reader's machine
  • Onest — on the reader's machine
  • Georgia — on the reader's machine
  • ui-serif — on the reader's machine
  • ui-rounded — on the reader's machine
  • ui-monospace — on the reader's machine
  • Inter (sans) — downloaded
  • Roboto (sans) — downloaded
  • Open Sans (sans) — downloaded
  • Lato (sans) — downloaded
  • Montserrat (sans) — downloaded
  • Poppins (sans) — downloaded
  • Nunito (sans) — downloaded
  • Work Sans (sans) — downloaded
  • Rubik (sans) — downloaded
  • Manrope (sans) — downloaded
  • DM Sans (sans) — downloaded
  • Outfit (sans) — downloaded
  • Plus Jakarta Sans (sans) — downloaded
  • Figtree (sans) — downloaded
  • Space Grotesk (sans) — downloaded
  • Sora (sans) — downloaded
  • Karla (sans) — downloaded
  • IBM Plex Sans (sans) — downloaded
  • Bricolage Grotesque (sans) — downloaded
  • Playfair Display (serif) — downloaded
  • Merriweather (serif) — downloaded
  • Lora (serif) — downloaded
  • Source Serif 4 (serif) — downloaded
  • Libre Baskerville (serif) — downloaded
  • EB Garamond (serif) — downloaded
  • Bitter (serif) — downloaded
  • Crimson Pro (serif) — downloaded
  • Fraunces (serif) — downloaded
  • IBM Plex Serif (serif) — downloaded
  • JetBrains Mono (mono) — downloaded
  • IBM Plex Mono (mono) — downloaded
  • Source Code Pro (mono) — downloaded
  • Fira Code (mono) — downloaded
  • Space Mono (mono) — downloaded
  • Roboto Mono (mono) — downloaded
Depth and motion

Shadows carry hierarchy in light mode and almost nothing in dark, which is why dark surfaces lighten instead. Motion at zero is not a preference this can override — `prefers-reduced-motion` already wins.

Every token 80

Type a value and that token stops following the controls above. Empty it and it starts following again. Colours are edited one mode at a time — switch modes with the control in the top bar.

Typography 4

Four families. Which is used where is a component decision.

Surfaces and content 8

Borders 3

Brand roles 12

Each with a hover, an active and a foreground.

Status roles 12

A solid colour, a foreground for it, and a tinted surface.

Utility 4

Shape 8

Structure 29

Not part of the skin contract. The density, text and depth controls write these.

Extra CSS

Rules, with their own selectors, added after the block above and outside the library's layer — so they win. This is where the per-component values go: --btn-padding-inline, --card-padding, --input-min-size. Every component page lists its own.

They need the component's selector, not the page's. A component declares its tokens on itself, and a declaration on an element beats the same one inherited from an ancestor — so --btn-padding-inline written on <html> reaches nothing, quietly.

Contrast

Every foreground against the surface it sits on, in both modes — a dark mode is not an inversion, and a colour that clears the floor on white routinely fails on near-black. 4.5 is the floor for body text, 3 for large text and for the edge of a control. Failures first.

    Export

    Becomes the selector: [data-skin="mine"]