The seven brand palettes
Swap the tokens, keep the motion. A component in this library never hard-codes a colour or a typeface — it takes a BrandTokens object and reads every fill, every label and every hairline out of it. That is the whole reason all 77 components carry a brand prop, and it is what lets one library produce video that looks like it was made for your brand rather than for a template store.
One exception, and it is deliberate: a colour that is not yours to choose. The handful of components that quote a platform read YouTube’s red from src/registry/platform.ts rather than from a palette, because a subscribe button that is not that red is not a subscribe button.
The strip below is one layout drawn once per palette. Same proportions, same type sizes, nothing changing but colour. It is markup rather than a render, and it uses only the five colours the catalog ships — a real component does the same thing with all fifteen fields.
A palette is a plain object you can author, diff and version — the same idea a closed tool exposes as an opaque design system setting, except here it sits in one file, is versioned with the code, and a change to it reads as a diff rather than as a support ticket. Adding a brand is one object with fifteen fields, and it touches no component.
The palettes
Each card shows the five colour roles the exported catalog carries, painted on that palette’s own canvas — because a swatch judged against the wrong background is a swatch you will pick wrongly.
Slate
brand="slate"Cool dark editorial. The registry default — reads as an edit suite.
The default of 51 of the 77 components.
bg
#0B1116
surface
#151E26
ink
#E6EDF3
accent
#4FB9DC
accentAlt
#E0A44E
Paper
brand="paper"High-contrast light neutral. For documentation and explainer work.
The default of 6 of the 77 components.
bg
#F5F6F7
surface
#FFFFFF
ink
#15191C
accent
#0A6E8C
accentAlt
#B0710F
Signal
brand="signal"Near-black with one saturated blue. Product launches, high contrast.
The default of 5 of the 77 components.
bg
#07080A
surface
#13161A
ink
#FFFFFF
accent
#2F6BFF
accentAlt
#00D2A8
Press
brand="press"Newsprint. Off-white, true black, vermilion — documentary and data journalism.
The default of 1 of the 77 components.
bg
#F2F0EC
surface
#FFFFFF
ink
#111111
accent
#D2341E
accentAlt
#1B4D8F
Circuit
brand="circuit"Deep indigo with electric accents. Developer tooling and infrastructure.
The default of 6 of the 77 components.
bg
#0A0A18
surface
#14142B
ink
#E8E8F5
accent
#7C5CFF
accentAlt
#38E0C0
Field
brand="field"Muted warm light with an olive accent. Calm, considered, non-technical brands.
The default of 1 of the 77 components.
bg
#EFEDE6
surface
#FBFAF7
ink
#23241F
accent
#5A6B35
accentAlt
#A8562A
Ledger
brand="ledger"Mint on near-black with a hot red for the downside. Finance and startup explainers.
The default of 7 of the 77 components.
bg
#141716
surface
#1C201E
ink
#FFFFFF
accent
#00E8BF
accentAlt
#FF292B
Every field, and what it is for
A palette is more than colour: the type stack and the corner radius travel with it, which is why Press renders with a narrow display face and 2px corners while Signal rounds to 12. Fill in all fifteen and every component in the catalogue can render against it.
| Field | What it is for | In the swatch |
|---|---|---|
| id | The key in BRANDS, and the string the brand prop takes. | No |
| name | The human label. It appears on this page and is never drawn into a frame. | No |
| description | What the palette is for. It is serialised into registry.json, so it is what an agent picks from. | No |
| bg | Full-frame canvas colour. | Yes |
| surface | Panels, cards, device chrome — one step off the canvas. | Yes |
| ink | Primary text and foreground marks. | Yes |
| inkMuted | Secondary text, captions, axis labels. | No |
| accent | The single emphasis colour. Used sparingly and deliberately. | Yes |
| accentInk | Text that sits on top of accent. | No |
| accentAlt | A second accent, for charts and two-series comparisons only. | Yes |
| rule | Hairlines, grids, dividers. | No |
| fontDisplay | Headlines and display type. | No |
| fontBody | Body copy and captions. | No |
| fontMono | Code, figures and small labels. | No |
| radius | Corner radius in px for surfaces. 0 is a legitimate value. | No |
Eight of the fifteen leave the file. The catalog serialises the id, the name, the description, and five of the eight colours as a swatch — [bg, surface, ink, accent, accentAlt] — which is enough to recognise a palette and not enough to render one. That is everything this page and registry.json know; a render reads the rest out of the module directly. The full object lives in src/registry/tokens.ts, which imports nothing and is therefore safe to read from server code. The three font fields are plain CSS stacks for the same reason — the actual font loading lives in src/registry/fonts.ts.
Using one
Set the prop. Nothing else in the call changes, and nothing about the timing changes — the same entrance, the same hold, the same exit, in somebody else’s colours.
{ id: "kinetic-headline", props: { headline: "Words, to videos", brand: "press" } }The prop is a string rather than an enum, and all 77 components read it as BRANDS[brand] with a fallback palette named on the same line — Slate for most of them. An id that is not in BRANDS therefore renders in that fallback rather than stopping the render: a typo costs you a clip in the wrong colours, not a job that dies partway through a batch.
Authoring your own
Copy any existing entry, change the values, keep the keys. The id becomes a legal value of the brand prop on all 77 components the moment it exists, and the next npm run export carries the new swatch into registry.json for agents to read.
// src/registry/tokens.ts — a new entry in BRANDS
acme: {
id: "acme",
name: "Acme",
description: "Warm dark with one orange. Product launches.",
bg: "#0C0A09",
surface: "#1A1614",
ink: "#FAF6F2",
inkMuted: "#9A8E85",
accent: "#FF5A1F",
accentInk: "#FFFFFF",
accentAlt: "#4CC3FF",
rule: "#2A2320",
fontDisplay: DISPLAY,
fontBody: BODY,
fontMono: MONO,
radius: 10,
},Why Slate is the default
DEFAULT_BRAND is Slate, and 51 of the 77 components name it as their own default. It is cool dark editorial — it reads as an edit suite, which is the room this work is finished in. A dark neutral ground is also the safest thing to composite over: it sits behind a talking head or a screen recording without competing, and it leaves one accent to do all the work, which is the restraint accent is written for.
The cost of that default is visible in the catalogue: 69 of 77components render on a dark ground when you browse them, because every preview is rendered at that component’s own default. Paper, Press and Field are the corrective, and every component takes one — a light version of any of them is a prop change, not a different component.