The wing
At rest. Lifts on hover.
Look 02, the kit sheet
Everything in its place. Everything the look is made of, on one page. Every block below is the real markup from sections/ and components/, so if a page built from the look disagrees with this sheet, this sheet wins.
Palette
--bg --surface --surface-2 --text --accent#050505#111111#171717#F4F2EC#C8FF3F#0F1A05#9ED9A8#E8D9A0#E58A8ADecoration only. The light field and grain behind everything, the pool under the wing, and the two wings. Never behind text. The mark is its own thing: RADIO in chrome, an svg symbol from assets/mark.svg.
radial-gradient(ellipse 58% 60% at 50% 100%, rgba(200, 255, 63, 0.12), rgba(200, 255, 63, …var(--pool)inlinedinlinedradial-gradient(70% 46% at 50% -6%, rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0) 70%)…inlinedlinear-gradient(112deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.08) 22%, rgba(…linear-gradient(100deg, rgba(255, 255, 255, 0) 30%, rgba(255, 255, 255, 0.28) 50%, rgba(25…Type
Radio Chrome is the original face drawn for this look and ships in fonts/. The scale is closed: eyebrow, display, h2, lede, body, meta, price.
Everything in its place.
Six ways to hang it.
$125one of fifty
A look for sites built with Claude Code. A black stage, one centre line, one wing lit from behind, and one lit edge per screen.
Raised is a thick slab of frosted glass with a lit rim and a sheen. Recessed is the well it sits in. There is no third material, and state is depth, never a colour.
Look 02, an edition of fifty
an edition of fifty, then gone
Materials
Icons
48-unit grid, one marker stroke each, 2.2 stroke, round caps, currentColor. They draw themselves on when an ancestor gets .is-in. Use inline as <svg class="bl-icon bl-icon--hand"><use href="#i-name"/></svg> or as the files in assets/icons/.
Motion
Headlines rise word by word (.bl-words). Blocks rise into place (.bl-reveal, staggered by .bl-stagger). Eyebrows and ledes follow (.bl-rise). The wing arrives and then drifts (.bl-place). Hand notes write themselves on (.bl-hand). Icons draw themselves on (.bl-icon--hand). Keys sweep a light on hover. Reduced motion lands everything instantly.
.bl-reveal .bl-words .bl-rise .bl-rise--late .bl-place .bl-hand .bl-icon--handReplay an edition of fifty, then gone
Everything in its place.
Click to play it again.
.bl-skeleton .bl-spinner .bl-progressComponents
Helper classes (.is-hover, .is-focus, .is-active, .is-selected, .is-disabled, .is-loading, .is-invalid, .is-open, .is-checked) draw each state without a pointer. theme.css styles the helper and the real pseudo-class identically.
Buttons are glass keys. The primary carries the lit green edge and is the one hit per screen. Pressed is recessed. Hover lifts the key and sweeps a light across it. Loading swaps the label for a spinner.
components/buttons.htmlFields are recessed wells. Focus brightens the rim. Invalid swaps the rim for the error colour and shows a help line. Select and checkbox share the well.
components/inputs.htmlThat does not look like an email.
No mailing list. We only write back.
Cards are glass. Media is a recessed well with the wing in it. Hover lifts (.bl-hover-lift). Selected is recessed, with the sheen off.
components/cards.htmlAt rest. Lifts on hover.
Hover, drawn.
Selected, recessed.
Badges are small glass pills in the body face. The plain badge is for labels. The three status badges are the only place the status colours appear besides toasts and field errors.
components/badges.htmlTabs sit in a glass pill group. The active tab is recessed. Hover brightens the label; focus draws the ring; disabled fades.
components/tabs.htmlThe accordion uses details and summary in glass. The open item is recessed. The plus turns into a dash when open. .is-open draws the open state without interaction.
components/accordion.htmlFifty sites get to wear Radio. Yours is one of them, with its own edition number and licence key.
CLAUDE.md is a set of rules with teeth. If a part does not exist, Claude stops and says so.
Something has to hang on the black.
The modal is a glass panel over a blurred scrim. The close key sits in the corner; the actions sit right, with the primary last. .bl-modal--static renders it inline over a well.
components/modal.htmlWhen the fiftieth edition sells, Radio is retired for good and a new look takes its rank. This cannot be undone.
Toasts are glass pills that float at the bottom centre. A dot carries the status; the copy stays plain. .bl-toast--static renders them inline.
components/toast.htmlTables sit in a recessed well. Headers are tracked caps; rows are separated by hairlines. Hover brightens the row; the selected row is recessed a step deeper. Numbers are tabular and right-aligned.
components/table.html| Look | Status | Editions | Left |
|---|---|---|---|
| Aura Glow | Live | 50 | 43 |
| Radio | Live | 50 | 50 |
| Slow Dance | Ten left | 50 | 9 |
| Ground Control | Sold out | 50 | 0 |
Sections
Variant A is what the demo uses. Variant B is the alternative for the same job. Page recipes are in CLAUDE.md.
Variant A
Variant B
The opening screen. A is the stage: headline on the centre line, the wing lit from behind (the motion clip when it is there, the still otherwise), the chrome mark beneath it. B is the split hero, headline left and the folded wing right, for inner pages and launches. Headlines use .bl-words so they rise on load.
sections/hero.htmlVariant A
Look 02 an edition of fifty, then gone
A look for sites built with Claude Code. A black stage, one centre line, one wing lit from behind, and one lit edge per screen. Fifty copies, then it is gone.
Variant B
Look 02 the folded one
The split hero for inner pages. Headline on the left, the folded wing on the right, one lit key.
Three or six things the product does. A is the ranked grid: cards in rows of one, two and three, each with a hand-drawn icon in a well. B is the numbered two-column list, for pages that already carry icons elsewhere.
sections/feature-grid.htmlVariant A
What comes in the box
Every section is symmetrical about it. Nothing hangs left, nothing hangs right.
Raised is a black key with a lit edge. Recessed is the well. Pressed is recessed. There is no third.
An original angular face, drawn from octagons with no curves. Headlines use it plain. The mark alone gets the chrome.
One wing, lit from behind, placed once per screen. It is the only image in the look.
Things take their places on the centre line. The wing drifts as if it were hanging. Reduced motion lands everything at once.
The accent is the wing's green on the edge of one key per screen. It appears nowhere else.
Variant B
What comes in the box
Every section is symmetrical about it.
Frosted glass, and the well it sits in.
Radio Chrome for headlines, Radio Hand for notes.
One image, placed once per screen.
Hand-drawn, one stroke each, and they draw themselves on.
The green, on one key per screen.
The parts, laid out unevenly. A is the wide materials tile plus the scheme tile and the rules tile. B is three even glass tiles, each with a wing in a well.
sections/bento.htmlVariant A
The parts
The whole look, drawn once. Three keys: at rest, lit, pressed. A well, with the wing in it. Every colour, edge, shadow and duration on this page is a custom property.
Dark is native: the wing on a black stage. Light is one attribute away: paper, and the chrome goes to gunmetal.
CLAUDE.md is the product. Claude reads it before it touches a file, and stops when a token it needs does not exist.
Variant B
The parts
The open wing, in a well.
The second wing, mid-stroke.
Faded, for empty states.
Work, products or presets. A is six tiles, the wing six ways. B is wide tiles, two per row, for landscape work.
sections/gallery.htmlVariant A
Variant B
Formations
Plans. A is three plans with the middle one chosen (recessed) and carrying the lit key. B is two plans, for a simpler offer. The chosen plan is always recessed; only it gets the primary button.
sections/pricing.htmlVariant A
Editions
$125Radio
$300any three
$425any five
Variant B
Editions
$125Radio
$300any three
One voice. A is a single quote at display size on a glass slab, with the signal icon. B is three short quotes in glass cards. The starter prompt is real copy that fits here on the demo; on a client site use a real quote.
sections/testimonial.htmlVariant A
Dress this site in the look at ./looks/radio. Read its CLAUDE.md first and obey it.
Variant B
Everything landed on the centre line. I did not touch a pixel.
The glass is the first thing anyone mentions.
Claude read the rules and stopped when it should have.
Questions. A is the split with the accordion (the open item recessed). B is the two-column grid with every answer visible.
sections/faq.htmlVariant A
Questions
Fifty sites get to wear Radio. Yours is one of them, with its own edition number and licence key. When the fiftieth sells, the look is retired for good.
CLAUDE.md is a set of rules with teeth: tokens only, two materials, one lit edge per screen. If a token, section or component does not exist, Claude stops and says so instead of inventing one.
Something has to hang on the black. A wing lit from behind is the whole record cover in one object. One was enough. Two looked like a logo.
Two faces were drawn for Radio and ship as woff2 with their licence: Radio Chrome for headlines and the mark, Radio Hand for the notes, the same hand that drew the icons. Neither is sold on its own.
Variant B
Questions
Fifty sites get to wear Radio. Yours is one of them, with its own edition number and licence key.
CLAUDE.md is a set of rules with teeth. If a part does not exist, Claude stops and says so.
Something has to hang on the black. A wing lit from behind is the whole record cover in one object.
Radio Chrome and Radio Hand ship as woff2 with their licence, for sites wearing Radio only.
The ask. A is the big glass slab with the folded wing hanging out of the bottom of it. B is the compact bar: one line, one key. Either way, one lit edge.
sections/cta.htmlVariant A
Look 02
One command. no redesign meetings
Get the look, $125Variant B
Variant A
Variant B
Write to us. A is the split: headline left, fields right. B is the form inside a glass card, stacked. Fields are recessed wells; the submit is the lit key.
sections/contact-form.htmlVariant A
Write to us
We answer in a day or two. If it is about a licence key, write from the email you bought with.
Variant B
Tokens
Native values first; the light scheme overrides only the colour tokens. The same list is in theme.json.
| Token | Group | Native | light |
|---|---|---|---|
| --bg | canvas | #050505 | #F2F0EA |
| --surface | canvas | #111111 | #FFFFFF |
| --surface-2 | canvas | #171717 | #F8F7F3 |
| --text | canvas | #F4F2EC | #0A0A0A |
| --text-2 | canvas | rgba(244, 242, 236, 0.62) | rgba(10, 10, 10, 0.62) |
| --text-3 | canvas | rgba(244, 242, 236, 0.38) | rgba(10, 10, 10, 0.40) |
| --line | canvas | rgba(244, 242, 236, 0.10) | rgba(10, 10, 10, 0.10) |
| --accent | accent | #C8FF3F | #5C8F00 |
| --accent-ink | accent | #0F1A05 | #FFFFFF |
| --accent-line | other | rgba(200, 255, 63, 0.42) | rgba(92, 143, 0, 0.38) |
| --mark-ratio | other | 4.7921 | |
| --grain-opacity | other | 0.16 | 0.22 |
| --pool | aura | radial-gradient(ellipse 58% 60% at 50% 100%, rgba(200, 255, 63, 0.12), rgba(200, 255, 63, … | radial-gradient(ellipse 60% 55% at 50% 100%, rgba(10, 10, 10, 0.08), rgba(10, 10, 10, 0) 7… |
| --pattern | aura | var(--pool) | |
| --wing | aura | file assets/wing.webp | |
| --wing-ratio | aura | 1200 / 1025 | |
| --wing-2 | aura | file assets/wing-2.webp | |
| --wing-2-ratio | aura | 1200 / 674 | |
| --light | aura | radial-gradient(70% 46% at 50% -6%, rgba(255, 255, 255, 0.13), rgba(255, 255, 255, 0) 70%)… | radial-gradient(70% 46% at 50% -6%, rgba(255, 255, 255, 0.9), rgba(255, 255, 255, 0) 70%),… |
| --grain | aura | url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='2… | |
| --sheen | aura | linear-gradient(112deg, rgba(255, 255, 255, 0.26) 0%, rgba(255, 255, 255, 0.08) 22%, rgba(… | linear-gradient(112deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.3) 22%, rgba(25… |
| --sweep | aura | linear-gradient(100deg, rgba(255, 255, 255, 0) 30%, rgba(255, 255, 255, 0.28) 50%, rgba(25… | linear-gradient(100deg, rgba(255, 255, 255, 0) 30%, rgba(255, 255, 255, 0.9) 50%, rgba(255… |
| --ok | status | #9ED9A8 | |
| --warn | status | #E8D9A0 | |
| --err | status | #E58A8A | |
| --blur | materials | 26px | |
| --raised-bg | materials | linear-gradient(158deg, rgba(255, 255, 255, 0.17) 0%, rgba(255, 255, 255, 0.07) 34%, rgba(… | linear-gradient(158deg, rgba(255, 255, 255, 0.86) 0%, rgba(255, 255, 255, 0.55) 34%, rgba(… |
| --raised-line | materials | rgba(255, 255, 255, 0.17) | rgba(255, 255, 255, 0.9) |
| --raised-shadow | materials | inset 0 1px 0 rgba(255, 255, 255, 0.55), inset 0 -1px 0 rgba(0, 0, 0, 0.65), inset 1px 0 0… | inset 0 1px 0 #FFFFFF, inset 0 -1px 0 rgba(10, 10, 10, 0.10), inset 1px 0 0 rgba(255, 255,… |
| --raised-shadow-up | materials | inset 0 1px 0 rgba(255, 255, 255, 0.70), inset 0 -1px 0 rgba(0, 0, 0, 0.65), inset 1px 0 0… | inset 0 1px 0 #FFFFFF, inset 0 -1px 0 rgba(10, 10, 10, 0.10), inset 1px 0 0 rgba(255, 255,… |
| --raised-hit | materials | inset 0 1px 0 var(--accent), inset 0 -1px 0 rgba(0, 0, 0, 0.65), inset 1px 0 0 rgba(200, 2… | inset 0 1px 0 var(--accent), inset 0 -1px 0 rgba(10, 10, 10, 0.10), inset 1px 0 0 rgba(92,… |
| --recessed-bg | materials | rgba(0, 0, 0, 0.52) | rgba(10, 10, 10, 0.06) |
| --recessed-line | materials | rgba(0, 0, 0, 0.6) | rgba(10, 10, 10, 0.06) |
| --recessed-shadow | materials | inset 0 3px 14px rgba(0, 0, 0, 0.92), inset 0 -1px 0 rgba(255, 255, 255, 0.07), 0 1px 0 rg… | inset 0 3px 10px rgba(10, 10, 10, 0.16), inset 0 -1px 0 #FFFFFF, 0 1px 0 #FFFFFF |
| --scrim | materials | rgba(5, 5, 5, 0.72) | rgba(10, 10, 10, 0.42) |
| --chevron | materials | url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><… | url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'><… |
| --font-display | type | "Radio Chrome", "Helvetica Neue", Arial, sans-serif | |
| --font-body | type | "DM Sans", "Helvetica Neue", Arial, sans-serif | |
| --font-hand | type | "Radio Hand", "Bradley Hand", "Segoe Script", cursive | |
| --text-hand | type | 1.25rem | |
| --display-stretch | type | 100% | |
| --display-weight | type | 800 | |
| --text-xs | type | 0.75rem | |
| --text-sm | type | 0.875rem | |
| --text-md | type | 1.0625rem | |
| --text-lg | type | 1.1875rem | |
| --text-xl | type | 1.5rem | |
| --text-h2 | type | clamp(2.25rem, 4.6vw, 4rem) | |
| --text-display | type | clamp(3rem, 7.6vw, 6.75rem) | |
| --track-caps | type | 0.22em | |
| --leading-tight | type | 0.96 | |
| --leading-body | type | 1.5 | |
| --radius | shape | 18px | |
| --radius-sm | shape | 12px | |
| --radius-pill | shape | 999px | |
| --rule | shape | 1px | |
| --space-1 | space | 0.25rem | |
| --space-2 | space | 0.5rem | |
| --space-3 | space | 0.75rem | |
| --space-4 | space | 1rem | |
| --space-5 | space | 1.5rem | |
| --space-6 | space | 2rem | |
| --space-7 | space | 3rem | |
| --space-8 | space | 4.5rem | |
| --space-9 | space | 7rem | |
| --wrap | space | 1180px | |
| --control | space | 48px | |
| --control-sm | space | 36px | |
| --icon | space | 20px | |
| --dur-fast | motion | 160ms | |
| --dur | motion | 420ms | |
| --dur-slow | motion | 900ms | |
| --ease | motion | cubic-bezier(0.2, 0.8, 0.2, 1) | |
| --ease-place | motion | cubic-bezier(0.16, 1, 0.3, 1) | |
| --reveal-y | motion | 14px |