MOTIONSTASH

The fourteen 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 148 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
Linen
Field
Ledger
Sky
Frost
Beacon
Ember
Notebook
Dusk

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 57 of the 148 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 12 of the 148 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 12 of the 148 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 7 of the 148 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 10 of the 148 components.

  • bg

    #0A0A18

  • surface

    #14142B

  • ink

    #E8E8F5

  • accent

    #7C5CFF

  • accentAlt

    #38E0C0

Linen

brand="linen"

Warm cream paper with a teal accent. Printed explainers, diagrams, editorial charts.

The default of 4 of the 148 components.

  • bg

    #F5EEE7

  • surface

    #FCF8F3

  • ink

    #201912

  • accent

    #10A27E

  • accentAlt

    #C4552C

Field

brand="field"

Muted warm light with an olive accent. Calm, considered, non-technical brands.

The default of 6 of the 148 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 11 of the 148 components.

  • bg

    #141716

  • surface

    #1C201E

  • ink

    #FFFFFF

  • accent

    #00E8BF

  • accentAlt

    #FF292B

Sky

brand="sky"

Pale sky blue with deep teal ink and a violet accent. Spoken-word explainers and product launch reels.

The default of 4 of the 148 components.

  • bg

    #E3EFFC

  • surface

    #FFFFFF

  • ink

    #05333F

  • accent

    #947CF4

  • accentAlt

    #1CA7C9

Frost

brand="frost"

Near-white lavender with deep teal ink, a violet accent and two arc colours. Explainer and launch typography.

The default of 9 of the 148 components.

  • bg

    #F8F7FE

  • surface

    #FFFFFF

  • ink

    #0B3240

  • accent

    #9979F7

  • accentAlt

    #2CA6FE

Beacon

brand="beacon"

White with an electric blue and a deep navy. Campaign and institutional film, full-bleed type.

The default of 4 of the 148 components.

  • bg

    #FFFFFF

  • surface

    #F4F6FF

  • ink

    #091F7C

  • accent

    #2352FE

  • accentAlt

    #11157B

Ember

brand="ember"

Neutral near-black with one hot orange. AI product launches, dark UI walkthroughs.

The default of 4 of the 148 components.

  • bg

    #0A0A0C

  • surface

    #18181A

  • ink

    #F9F9FB

  • accent

    #FB9B02

  • accentAlt

    #3FA7F5

Notebook

brand="notebook"

Cream stock, black and red type, a yellow highlighter. Explainer channels, reviews, field notes.

The default of 3 of the 148 components.

  • bg

    #F8F6F2

  • surface

    #FCF9F6

  • ink

    #1C1A18

  • accent

    #C83F32

  • accentAlt

    #FDD238

Dusk

brand="dusk"

Neutral near-black with a lavender accent. AI creative tools, dark product walkthroughs.

The default of 5 of the 148 components.

  • bg

    #08080A

  • surface

    #18181A

  • ink

    #EAEAEC

  • accent

    #A897FC

  • accentAlt

    #1EB7F0

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 148 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 148 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 57 of the 148 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: 97 of 148components 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, and a light version of any of them is a prop change, not a different component.