MOTIONSTASH

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.

Slate
Paper
Signal
Press
Circuit
Field
Ledger

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.

The fields of BrandTokens
FieldWhat it is forIn the swatch
idThe key in BRANDS, and the string the brand prop takes.No
nameThe human label. It appears on this page and is never drawn into a frame.No
descriptionWhat the palette is for. It is serialised into registry.json, so it is what an agent picks from.No
bgFull-frame canvas colour.Yes
surfacePanels, cards, device chrome — one step off the canvas.Yes
inkPrimary text and foreground marks.Yes
inkMutedSecondary text, captions, axis labels.No
accentThe single emphasis colour. Used sparingly and deliberately.Yes
accentInkText that sits on top of accent.No
accentAltA second accent, for charts and two-series comparisons only.Yes
ruleHairlines, grids, dividers.No
fontDisplayHeadlines and display type.No
fontBodyBody copy and captions.No
fontMonoCode, figures and small labels.No
radiusCorner 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.

a shot in a shot list
{ 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.

tokens.ts
// 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.