dark · minimal · sans · ai · video · cinematic · monochrome

DESIGN.md inspired by Luma AI

A cinematic black screening room that opens into a white studio — Graphik set tight, every CTA a full white pill.

By webdesignhot · lumalabs.ai
$ npx @webdesignhot/design-md add luma
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #ffffff
  • bg-dark #000000
  • bg-near #0a0a0a
  • text AAA · 21.0 #000000
  • text-invert #ffffff
  • text-muted #666666
  • text-soft #999999
  • text-muted-dark #a3a3a3
  • brand AAA · 21.0 #000000
  • brand-invert #ffffff
  • on-brand #ffffff
  • accent-ink #000000
  • accent-snow #ffffff
  • accent-graphite #171717
  • accent-fog #f5f5f5
  • link #000000
  • link-hover #666666
  • link-invert #ffffff
  • link-invert-hover #cccccc
  • selected #f0f0f0
  • disabled #cccccc
  • neutral-0 #ffffff
  • neutral-50 #fafafa
  • neutral-100 #f5f5f5
  • neutral-200 #e5e5e5
  • neutral-300 #d4d4d4
  • neutral-400 #a3a3a3
  • neutral-500 #737373
  • neutral-600 #525252
  • neutral-700 #404040
  • neutral-800 #262626
  • neutral-900 #171717
  • neutral-950 #0a0a0a
  • neutral-1000 #000000
  • surface #ffffff
  • surface-fog #f5f5f5
  • surface-dark #0a0a0a
  • surface-graphite #171717
  • border — · 1.3 #e5e5e5
  • border-strong — · 1.5 #d4d4d4
  • border-dark #ffffff1f
  • border-dark-soft #ffffff0d
  • ring #000000
  • ring-invert #ffffff
  • shadow-ambient rgba(0,0,0,0.06)
  • shadow-standard rgba(0,0,0,0.10)
  • shadow-elevated rgba(0,0,0,0.16)
  • shadow-dark rgba(0,0,0,0.6)
  • success #16a34a
  • success-bg #f0fdf4
  • success-text #15803d
  • warning #d97706
  • warning-bg #fffbeb
  • warning-text #b45309
  • danger #dc2626
  • danger-bg #fef2f2
  • danger-text #b91c1c
  • info #2563eb
  • info-bg #eff6ff
  • info-text #1d4ed8
Typography
Ship faster than ever.
display-hero "__graphik_7126cf" 80px w600 -0.03em
Ship faster than ever.
display-large "__graphik_7126cf" 64px w600 -0.025em
Ship faster than ever.
h1 "__graphik_7126cf" 52px w500 -0.02em
Built for teams that ship.
h2 "__graphik_7126cf" 40px w600 -0.018em
A complete kit
h3 "__graphik_7126cf" 32px w600 -0.012em
The quick brown fox jumps over the lazy dog.
h4 "__graphik_7126cf" 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h5 "__graphik_7126cf" 20px w600 0
The quick brown fox jumps over the lazy dog.
body-large "__graphik_7126cf" 18px w400 0
The quick brown fox jumps over the lazy dog.
body "__graphik_7126cf" 16px w400 0
The quick brown fox jumps over the lazy dog.
button "__graphik_7126cf" 15px w500 -0.005em
The quick brown fox jumps over the lazy dog.
body-small "__graphik_7126cf" 14px w400 0
The quick brown fox jumps over the lazy dog.
nav-link "__graphik_7126cf" 14px w500 0
OUR DESIGN SYSTEM
label "__graphik_7126cf" 13px w500 0
OUR DESIGN SYSTEM
mono ui-monospace 13px w400 0
OUR DESIGN SYSTEM
caption "__graphik_7126cf" 12px w500 0.02em
The quick brown fox jumps over the lazy dog.
overline "__graphik_7126cf" 11px w600 0.08em
Spacing
  • step-0 0px
  • step-1 4px
  • step-2 8px
  • step-3 12px
  • step-4 16px
  • step-5 24px
  • step-6 32px
  • step-7 40px
  • step-8 48px
  • step-9 64px
  • step-10 80px
  • step-11 96px
  • step-12 128px
  • step-13 160px
Radius
  • micro 2px
  • sm 4px
  • md 8px
  • lg 12px
  • card 12px
  • xl 16px
  • pill 9999px
Components
Text link →
Card preview A complete kit — everything your product needs. Hero, pricing, FAQ, dashboard, docs — every layout your product needs.
New Stable v1.0
Design roles 8/8 mapped · webdesignhot/0.1

Maps the 8 canonical role names to this entry's actual tokens. Use these to plug the design into role-aware tools — shadcn/ui themes, role-aware Tailwind plugins, atelier-lint — without hard-coding token names.

  • background bg
  • foreground text
  • primary brand
  • primary-foreground on-brand
  • accent accent-ink
  • muted text-muted
  • border border
  • ring ring
Lineage & influences

Luma is a screening room that opens into a studio. The hero is cinematic black `#000000` with white **Graphik** headlines (52px, weight 500) floating over generated video — then the page resolves into a bright white `#ffffff` content surface with pure black body type. The two-act monochrome is the brand's structural move: the dark register frames the work like a theatre, the light register presents it like a gallery wall. There is no chromatic accent in the chrome — the only saturation on the page comes from the model's own output. Graphik (Commercial Type's neo-grotesque workhorse) carries everything from hero to footer at a single quiet voice; weight does the hierarchy, never colour. Every call to action is a full white pill ("Try Luma") that inverts to black-on-white once it crosses into the light register. The result reads like Apple's product-film register crossed with a film studio's press kit: maximal contrast, minimal hue, the chrome silent so the frames can speak.

  • Graphik neo-grotesque as the single editorial voice across display and body.
  • Product-film register — pure black/white maximal contrast, chrome quiet so the work dominates.
  • AI-video peer — near-black screening-room hero, no chromatic accent, generated frames carry the colour.
  • Film-studio editorial mood — cinematic dark frames, restrained typographic chrome.
  • High-contrast monochrome marketing surface — black/white discipline, full-pill CTAs.
Export 4 formats · paste-ready
Tailwind

theme.extend block for tailwind.config.js

tailwind.config.js
CSS variables

:root { --bg, --text, --brand, … } you can paste anywhere

design.css
DTCG JSON

W3C Design Tokens Community Group format

design.tokens.json
Figma Variables

Importable into Figma → Variables → Import

figma-variables.json
The file
---
name: Luma AI
tagline: A cinematic black screening room that opens into a white studio — Graphik set tight, every CTA a full white pill.
updated_at: 2026-05-29T00:00:00.000Z
published_at: 2026-05-28T23:11:02.842Z
author: webdesignhot
source_url: https://lumalabs.ai
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [ai, media]
tags: [dark, minimal, sans, ai, video, cinematic, monochrome]
preview_swatch: ['#ffffff', '#000000', '#0a0a0a']
related: [runway-ml, pika, openai]
description: 'Luma''s site runs a two-act monochrome: a cinematic near-black hero where white **Graphik** headlines (52px, weight 500) float over generated video, opening into a bright white `#ffffff` content studio with pure black `#000000` body type. There is no chromatic accent — the only colour is the model output itself. Every CTA is a full-pill ("Try Luma" white-on-dark, then black-on-white in the light register), and the chrome stays minimal so the generated frames carry the page.'

# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
  background: bg
  foreground: text
  primary: brand
  primary-foreground: on-brand
  accent: accent-ink
  muted: text-muted
  border: border
  ring: ring

colors:
  # Primary
  bg: '#ffffff'                   # white content studio — the light register
  bg-dark: '#000000'              # cinematic black hero/footer — the dark register
  bg-near: '#0a0a0a'              # near-black panel, slightly off pure black
  text: '#000000'                 # pure black body on white
  text-invert: '#ffffff'          # white display on the dark hero
  text-muted: '#666666'           # mid-grey secondary / caption on white
  text-soft: '#999999'            # quiet UI label / metadata on white
  text-muted-dark: '#a3a3a3'      # muted copy on the dark register

  # Brand & Dark
  brand: '#000000'                # the brand has no chromatic accent — cinematic black is the brand
  brand-invert: '#ffffff'         # white as the inverse brand register
  on-brand: '#ffffff'             # text on black fills

  # Accent (chromatic accents are intentionally absent)
  accent-ink: '#000000'           # black-on-white emphasis
  accent-snow: '#ffffff'          # white-on-black emphasis
  accent-graphite: '#171717'      # raised dark surface
  accent-fog: '#f5f5f5'           # faint grey wash on white

  # Interactive
  link: '#000000'                 # black link on white, subtle underline
  link-hover: '#666666'           # softens to mid-grey
  link-invert: '#ffffff'          # white link on dark
  link-invert-hover: '#cccccc'    # softens on dark
  selected: '#f0f0f0'             # selected row bg on white
  disabled: '#cccccc'             # muted disabled foreground

  # Neutral scale
  neutral-0: '#ffffff'
  neutral-50: '#fafafa'
  neutral-100: '#f5f5f5'
  neutral-200: '#e5e5e5'
  neutral-300: '#d4d4d4'
  neutral-400: '#a3a3a3'
  neutral-500: '#737373'
  neutral-600: '#525252'
  neutral-700: '#404040'
  neutral-800: '#262626'
  neutral-900: '#171717'
  neutral-950: '#0a0a0a'
  neutral-1000: '#000000'

  # Surface & Borders
  surface: '#ffffff'              # default card on white ground
  surface-fog: '#f5f5f5'          # faint grey inset on white
  surface-dark: '#0a0a0a'         # raised panel on the dark register
  surface-graphite: '#171717'     # deeper dark surface
  border: '#e5e5e5'               # hairline divider on white
  border-strong: '#d4d4d4'        # visible divider on white
  border-dark: '#ffffff1f'        # 12% white hairline on dark
  border-dark-soft: '#ffffff0d'   # 5% white hairline on dark
  ring: '#000000'                 # focus ring on white
  ring-invert: '#ffffff'          # focus ring on dark

  # Shadow colors
  shadow-ambient: 'rgba(0,0,0,0.06)'
  shadow-standard: 'rgba(0,0,0,0.10)'
  shadow-elevated: 'rgba(0,0,0,0.16)'
  shadow-dark: 'rgba(0,0,0,0.6)'

  # Semantic
  success: '#16a34a'
  success-bg: '#f0fdf4'
  success-text: '#15803d'
  warning: '#d97706'
  warning-bg: '#fffbeb'
  warning-text: '#b45309'
  danger: '#dc2626'
  danger-bg: '#fef2f2'
  danger-text: '#b91c1c'
  info: '#2563eb'
  info-bg: '#eff6ff'
  info-text: '#1d4ed8'

typography:
  display:
    family: '"__graphik_7126cf", Graphik, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif'
    weights: [500, 600, 700]
  body:
    family: '"__graphik_7126cf", Graphik, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif'
    weights: [400, 500, 600]
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 80, weight: 600, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-large:   { size: 64, weight: 600, lineHeight: 1.04, tracking: '-0.025em', family: display }
    h1:              { size: 52, weight: 500, lineHeight: 1.06, tracking: '-0.02em',  family: display }
    h2:              { size: 40, weight: 600, lineHeight: 1.1,  tracking: '-0.018em', family: display }
    h3:              { size: 32, weight: 600, lineHeight: 1.2,  tracking: '-0.012em', family: display }
    h4:              { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
    h5:              { size: 20, weight: 600, lineHeight: 1.3,  tracking: '0',        family: body }
    body-large:      { size: 18, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body:            { size: 16, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body-small:      { size: 14, weight: 400, lineHeight: 1.5,  tracking: '0',        family: body }
    label:           { size: 13, weight: 500, lineHeight: 1.4,  tracking: '0',        family: body }
    caption:         { size: 12, weight: 500, lineHeight: 1.4,  tracking: '0.02em',   family: body }
    overline:        { size: 11, weight: 600, lineHeight: 1.3,  tracking: '0.08em',   family: body }
    button:          { size: 15, weight: 500, lineHeight: 1.0,  tracking: '-0.005em', family: body }
    nav-link:        { size: 14, weight: 500, lineHeight: 1.0,  tracking: '0',        family: body }
    mono:            { size: 13, weight: 400, lineHeight: 1.5,  tracking: '0',        family: mono }

radius:
  micro: 2
  sm: 4
  md: 8
  lg: 12
  xl: 16
  card: 12
  pill: 9999

spacing:
  base: 4
  scale: [0, 4, 8, 12, 16, 24, 32, 40, 48, 64, 80, 96, 128, 160]

layout:
  page-width: 1280
  prose-width: 720
  header-height: 64
  hero-min-height: 720

breakpoints:
  mobile: 640
  tablet: 1024
  desktop: 1280
  wide: 1536

shadows:
  ambient: 'rgba(0,0,0,0.06) 0 1px 2px'
  standard: 'rgba(0,0,0,0.10) 0 4px 16px -2px'
  elevated: 'rgba(0,0,0,0.16) 0 16px 32px -8px'
  dark: 'rgba(0,0,0,0.6) 0 24px 48px -12px'
  ring: '0 0 0 2px #000000'
  ring-invert: '0 0 0 2px #ffffff'

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  ease-out: 'cubic-bezier(0, 0, 0.2, 1)'
  ease-in: 'cubic-bezier(0.4, 0, 1, 1)'
  duration-fast: 150
  duration-standard: 240
  duration-slow: 320
  duration-page: 480
  reduced-motion: 'respects prefers-reduced-motion: reduce — video autoplay disabled, parallax and transforms degrade to opacity-only fades'

accessibility:
  contrast-text-on-bg: 21.0           # #000 on #ffffff, AAA (maximum)
  contrast-invert-on-dark: 21.0       # #ffffff on #000000, AAA (maximum)
  contrast-muted-on-bg: 5.7           # #666666 on #ffffff, AA
  contrast-soft-on-bg: 2.8            # #999999 on #ffffff, fails AA — decorative metadata only
  contrast-muted-on-dark: 8.9         # #a3a3a3 on #000000, AAA at large
  focus-ring: '2px solid #000000 with 2px offset on white; 2px solid #ffffff on dark'
  focus-ring-offset-color: '#ffffff'
  reduced-motion-honored: true
  keyboard-nav: 'full tab traversal; ESC closes lightbox/menu; arrow keys advance gallery; Space toggles video playback when focused'

components:
  button-primary:
    bg: '#000000'
    text: '#ffffff'
    border: 'none'
    radius: 9999
    padding: '12px 24px'
    font: 'body 15/1.0 weight 500 tracking -0.005em'
    hover: 'bg #171717'
    active: 'bg #262626'
    focus: '2px ring #000000 + 2px offset'
  button-invert:
    bg: '#ffffff'
    text: '#000000'
    border: 'none'
    radius: 9999
    padding: '12px 24px'
    font: 'body 15/1.0 weight 500 tracking -0.005em'
    hover: 'bg #f0f0f0'
    active: 'bg #e5e5e5'
    focus: '2px ring #ffffff + 2px offset (on dark hero)'
  button-ghost:
    bg: 'transparent'
    text: '#000000'
    border: '1px solid #e5e5e5'
    radius: 9999
    padding: '12px 24px'
    font: 'body 15/1.0 weight 500'
    hover: 'border #000000, bg #fafafa'
    active: 'bg #f0f0f0'
  button-ghost-dark:
    bg: 'transparent'
    text: '#ffffff'
    border: '1px solid #ffffff1f'
    radius: 9999
    padding: '12px 24px'
    font: 'body 15/1.0 weight 500'
    hover: 'border #ffffff5f, bg #ffffff0d'
    active: 'bg #ffffff14'
  card:
    bg: '#ffffff'
    border: '1px solid #e5e5e5'
    radius: 12
    padding: '24px'
    shadow: 'ambient'
    hover: 'shadow standard, border #d4d4d4'
  card-dark:
    bg: '#0a0a0a'
    border: '1px solid #ffffff0d'
    radius: 12
    padding: '24px'
    shadow: 'none'
    hover: 'border #ffffff1f'
  input:
    bg: '#ffffff'
    text: '#000000'
    placeholder: '#999999'
    border: '1px solid #e5e5e5'
    radius: 8
    padding: '10px 14px'
    font: 'body 15/1.5 weight 400'
    focus: 'border #000000, ring 2px #000000'
  badge:
    bg: '#f5f5f5'
    text: '#000000'
    border: 'none'
    radius: 9999
    padding: '4px 12px'
    font: 'body 12/1.4 weight 500 tracking 0.02em'
  badge-dark:
    bg: 'transparent'
    text: '#ffffff'
    border: '1px solid #ffffff3f'
    radius: 9999
    padding: '4px 12px'
    font: 'body 12/1.4 weight 500 tracking 0.02em'

lineage:
  summary: |
    Luma is a screening room that opens into a studio. The hero is
    cinematic black `#000000` with white **Graphik** headlines (52px,
    weight 500) floating over generated video — then the page resolves
    into a bright white `#ffffff` content surface with pure black body
    type. The two-act monochrome is the brand's structural move: the
    dark register frames the work like a theatre, the light register
    presents it like a gallery wall. There is no chromatic accent in
    the chrome — the only saturation on the page comes from the model's
    own output. Graphik (Commercial Type's neo-grotesque workhorse)
    carries everything from hero to footer at a single quiet voice;
    weight does the hierarchy, never colour. Every call to action is a
    full white pill ("Try Luma") that inverts to black-on-white once it
    crosses into the light register. The result reads like Apple's
    product-film register crossed with a film studio's press kit:
    maximal contrast, minimal hue, the chrome silent so the frames can
    speak.
  influences:
    - name: Commercial Type (Graphik)
      role: Graphik neo-grotesque as the single editorial voice across display and body.
      url: https://commercialtype.com/catalog/graphik
    - name: Apple
      role: Product-film register — pure black/white maximal contrast, chrome quiet so the work dominates.
      url: https://apple.com
    - name: Runway
      role: AI-video peer — near-black screening-room hero, no chromatic accent, generated frames carry the colour.
      url: https://runwayml.com
    - name: A24
      role: Film-studio editorial mood — cinematic dark frames, restrained typographic chrome.
      url: https://a24films.com
    - name: Vercel
      role: High-contrast monochrome marketing surface — black/white discipline, full-pill CTAs.
      url: https://vercel.com

dark-mode: dual        # Luma alternates a cinematic dark hero/footer with a white content body — neither is a "theme toggle"
---

## 1. Visual Theme & Atmosphere

Luma is a screening room that opens into a studio. The page begins in cinematic black `#000000` — a full-bleed dark hero where a white **Graphik** headline (52px, weight 500) floats low over generated video, the way a film title sits over an establishing shot. There is no panel, no card, no gradient scrim; the headline is simply white-on-black, and the only colour on the screen is the motion behind it. Then, as you scroll, the page resolves into a bright white `#ffffff` content surface with pure black `#000000` body type — the work pinned to a gallery wall in maximum contrast. This two-act monochrome is the entire brand.

The chrome refuses to compete with the work. Buttons are stark pills — a white "Try Luma" on the dark hero, inverting to black-on-white once the page crosses into the light register. Links are quiet black underlines that soften to grey on hover. There is no brand hue anywhere in the wrapper: no accent blue, no gradient, no glow. The discipline is total, and it is the point — every pixel of saturation on a Luma page comes from the model's own output, the generated frames and B-roll, never from the interface around them.

Where many AI-creative sites reach for neon and aurora gradients to signal "generative," Luma reaches for the opposite: the restraint of a product film. The contrast is maximal (21:1 both directions, white-on-black and black-on-white), the hue is zero, and the typography is a single neo-grotesque held at one quiet voice from hero to footer. Hierarchy is carried by weight and scale, never by colour. The effect is closer to an Apple keynote slide or an A24 title card than to a typical SaaS dashboard.

The sensory metaphor is the cut between theatre and gallery. The dark register is the auditorium — lights down, frame lit, attention forward. The light register is the lobby afterward — bright, clean, the stills hung in rows for close inspection. A Luma page moves between the two registers within a single scroll, and the seam between black and white is where the rhythm lives. The chrome stays silent on both sides so the generated video can carry the page.

**Key Characteristics**

- Two-act monochrome: cinematic black `#000000` hero/footer opening into white `#ffffff` content body
- White Graphik headlines (52px, weight 500) floating over generated video in the dark register
- Pure black `#000000` body type on white in the light register — maximum 21:1 contrast both ways
- No chromatic accent anywhere in the chrome — saturation comes from model output only
- Full-pill CTAs (radius 9999): white-on-dark in the hero, black-on-white in the light body
- Single-family typography — Graphik carries display and body; hierarchy by weight, never colour
- Minimal, cinematic atmosphere — product-film register, not dashboard register
- Generous whitespace; full-bleed video; chrome held quiet
- Hierarchy by weight (500/600/700) and scale, never by hue
- Hairline borders (`#e5e5e5` on white, 5–12% white on dark) instead of heavy shadows

## 2. Color Palette & Roles

### Primary

- **bg** (`#ffffff`): the white content studio — the light register where body copy lives
- **bg-dark** (`#000000`): cinematic black hero and footer — the dark register
- **bg-near** (`#0a0a0a`): near-black panel, a half-step off pure black for inset zones
- **text** (`#000000`): pure black body type on the white surface
- **text-invert** (`#ffffff`): white display copy on the dark hero (the live h1 colour)

### Brand & Dark

- **brand** (`#000000`): the brand has no chromatic accent — cinematic black IS the brand
- **brand-invert** (`#ffffff`): white as the inverse brand register, used on the dark hero
- **on-brand** (`#ffffff`): text on black fills (primary button label)

### Accent (intentionally non-chromatic)

- **accent-ink** (`#000000`): black-on-white emphasis, the only "accent" in the light register
- **accent-snow** (`#ffffff`): white-on-black emphasis in the dark register
- **accent-graphite** (`#171717`): raised dark surface / primary button hover
- **accent-fog** (`#f5f5f5`): faint grey wash for insets on white

The accent set is monochromatic by intent. Luma's only saturation is in the imagery — generated video, model stills, B-roll. The interface itself has no hue. If a Luma page shows colour, it is coming from the work, not the wrapper.

### Interactive

- **link** (`#000000`): default black link on white, subtle underline
- **link-hover** (`#666666`): softens to mid-grey on hover
- **link-invert** (`#ffffff`): white link on the dark register
- **link-invert-hover** (`#cccccc`): softens on hover over dark
- **selected** (`#f0f0f0`): selected list-item background on white
- **disabled** (`#cccccc`): muted disabled foreground

### Neutral Scale

A pure neutral ladder runs `#ffffff` → `#fafafa` → `#f5f5f5` → `#e5e5e5` → `#d4d4d4` → `#a3a3a3` → `#737373` → `#525252` → `#404040` → `#262626` → `#171717` → `#0a0a0a` → `#000000`. The ramp is strictly achromatic — no warm or cool bias — because any hue tint would read as a brand colour, which Luma refuses. `#666666` is the signature secondary-text grey on white; `#a3a3a3` is its counterpart on dark.

### Surface & Borders

- **surface** (`#ffffff`): default card on the white ground
- **surface-fog** (`#f5f5f5`): faint grey inset / quiet panel on white
- **surface-dark** (`#0a0a0a`): raised panel on the dark register
- **surface-graphite** (`#171717`): deeper dark surface
- **border** (`#e5e5e5`): hairline divider on white — never heavy
- **border-strong** (`#d4d4d4`): visible divider on white, card hover edge
- **border-dark** (`#ffffff1f`): 12% white hairline on dark
- **border-dark-soft** (`#ffffff0d`): 5% white hairline on dark
- **ring** (`#000000`) / **ring-invert** (`#ffffff`): focus rings, black on white / white on dark

### Shadow Colors

- **shadow-ambient** (`rgba(0,0,0,0.06)`): the lightest card lift on white
- **shadow-standard** (`rgba(0,0,0,0.10)`): hover lift on white cards
- **shadow-elevated** (`rgba(0,0,0,0.16)`): popovers, menus on white
- **shadow-dark** (`rgba(0,0,0,0.6)`): modal elevation over the dark register

Shadows are used sparingly and softly on the white surface; on the dark register, depth is tonal (`#000000` → `#0a0a0a` → `#171717`) rather than cast. The interface prefers a hairline border to a heavy shadow.

### Semantic

- **success** (`#16a34a`) — green, in-product only; never marketing
- **warning** (`#d97706`) — amber for system messages
- **danger** (`#dc2626`) — destructive actions only, never marketing
- **info** (`#2563eb`) — system info; the rare blue is functional, not brand

## 3. Typography Rules

### Font Family

- **Display & Body**: `"__graphik_7126cf", Graphik, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif` — weights 400/500/600/700. **Graphik** is Commercial Type's neo-grotesque; the `__graphik_7126cf` token is the production webfont hash. A single family carries the entire site.
- **Mono**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", monospace` — weights 400/500, reserved for technical metadata
- **OpenType**: default ligatures and kerning on; tabular figures (`tnum`) in any numeric/metric columns; no decorative stylistic sets

### Hierarchy

| Role          | Font    | Size | Weight | Line H | Tracking   | Notes |
|---------------|---------|------|--------|--------|------------|-------|
| display-hero  | Graphik | 80   | 600    | 1.00   | -0.03em    | rare full-bleed marquee |
| display-large | Graphik | 64   | 600    | 1.04   | -0.025em   | major section heads |
| h1            | Graphik | 52   | 500    | 1.06   | -0.02em    | the canonical Luma hero headline (white on black) |
| h2            | Graphik | 40   | 600    | 1.10   | -0.018em   | feature heads |
| h3            | Graphik | 32   | 600    | 1.20   | -0.012em   | sub-section heads |
| h4            | Graphik | 24   | 600    | 1.25   | -0.005em   | card titles |
| h5            | Graphik | 20   | 600    | 1.30   | 0          | small label heads |
| body-large    | Graphik | 18   | 400    | 1.55   | 0          | hero supporting copy |
| body          | Graphik | 16   | 400    | 1.55   | 0          | default body (the live body token) |
| body-small    | Graphik | 14   | 400    | 1.50   | 0          | secondary copy |
| label         | Graphik | 13   | 500    | 1.40   | 0          | form labels, UI |
| caption       | Graphik | 12   | 500    | 1.40   | 0.02em     | image captions |
| overline      | Graphik | 11   | 600    | 1.30   | 0.08em     | section eyebrow, uppercase |
| button        | Graphik | 15   | 500    | 1.00   | -0.005em   | CTA label |
| nav-link      | Graphik | 14   | 500    | 1.00   | 0          | top nav |
| mono          | mono    | 13   | 400    | 1.50   | 0          | model versions, technical IDs |

### Principles

- **One family, one voice**: Graphik carries display and body. There is no second sans, no serif, no display face. The voice stays consistent from hero to footer.
- **Weight is the hierarchy**: display uses 500–700, body uses 400, labels use 500. Emphasis comes from weight and scale — never from colour, because there is no brand colour to reach for.
- **The hero is weight 500, not 700**: the live h1 sits at 52px / weight 500 — a confident medium, not a heavy bold. Graphik's even neo-grotesque rhythm reads cleanly at 500 on black.
- **Tracking tightens as size grows**: display heads pull `-0.02em` to `-0.03em`; body sits at 0; the caption/overline open up to positive `+0.02em` to `+0.08em` for small-cap legibility.
- **Body breathes at 1.55 line-height**: long-form copy on the white surface uses a generous 1.55 leading. Display copy compresses toward 1.0–1.1.
- **Mono is metadata only**: model versions, render IDs, technical captions. Never marketing copy.
- **No italics, no decorative case**: emphasis is structural — weight, scale, and the black/white register flip. Uppercase appears only in the overline eyebrow and caption.
- **Contrast over colour**: at 21:1 in both registers, type never needs colour to separate from ground. The maximal contrast is the legibility strategy.

## 4. Component Stylings

### Buttons

All buttons are **full pills** (radius 9999) — the live CTA radius (`3.35e7px`) is a full-pill artifact. Padding `12px 24px`, label Graphik 15/1.0 weight 500.

**button-primary** — the black pill on white (light register)
- Background: `#000000`
- Text: `#ffffff`, Graphik 15/1.0 weight 500, tracking `-0.005em`
- Border: none
- Radius: 9999 (full pill)
- Padding: `12px 24px`
- Hover: bg `#171717`
- Active: bg `#262626`
- Focus: 2px black ring + 2px offset
- Use: "Try Luma", "Get started" in the white content body

**button-invert** — the white pill on the dark hero (the live CTA)
- Background: `#ffffff`
- Text: `#000000`, Graphik 15/1.0 weight 500
- Border: none
- Radius: 9999
- Padding: `12px 24px`
- Hover: bg `#f0f0f0`
- Active: bg `#e5e5e5`
- Focus: 2px white ring + 2px offset (on `#000000`)
- Use: the hero "Try Luma" — white-on-black over the cinematic video

**button-ghost** — outlined pill on white
- Background: transparent
- Text: `#000000`, Graphik 15/1.0 weight 500
- Border: `1px solid #e5e5e5`
- Radius: 9999
- Hover: border lifts to `#000000`, bg `#fafafa`
- Active: bg `#f0f0f0`
- Use: secondary actions ("Learn more", "Watch") in the light register

**button-ghost-dark** — outlined pill on the dark hero
- Background: transparent
- Text: `#ffffff`, Graphik 15/1.0 weight 500
- Border: `1px solid #ffffff1f`
- Radius: 9999
- Hover: border `#ffffff5f`, bg `#ffffff0d`
- Active: bg `#ffffff14`
- Use: secondary CTA beside the white pill in the hero ("Watch the film")

### Cards

**White card** (feature, gallery on light):
- Background: `#ffffff`
- Border: `1px solid #e5e5e5`
- Radius: 12px
- Padding: `24px`
- Shadow: ambient `rgba(0,0,0,0.06) 0 1px 2px`
- Hover: shadow lifts to standard, border darkens to `#d4d4d4`

**Dark card** (panel on the cinematic register):
- Background: `#0a0a0a`
- Border: `1px solid #ffffff0d`
- Radius: 12px
- Padding: `24px`
- Shadow: none — depth is tonal
- Hover: border lifts to `#ffffff1f`

### Badges / Tags / Pills

**Light badge:**
- Background: `#f5f5f5`
- Text: `#000000`, Graphik 12/1.4 weight 500 tracking 0.02em
- Border: none
- Radius: 9999
- Padding: `4px 12px`
- Use: feature tags, "New" on the white surface

**Dark badge:**
- Background: transparent
- Text: `#ffffff`, Graphik 12/1.4 weight 500
- Border: `1px solid #ffffff3f`
- Radius: 9999
- Padding: `4px 12px`
- Use: model versions ("Ray2", "Dream Machine") on the dark hero

### Inputs / Forms

**Text input:**
- Background: `#ffffff`
- Text: `#000000`, Graphik 15/1.5
- Placeholder: `#999999`
- Border: `1px solid #e5e5e5`
- Radius: 8px
- Padding: `10px 14px`
- Focus: border `#000000`, 2px black ring

On the dark register, inputs invert: bg `#0a0a0a`, text `#ffffff`, border `#ffffff1f`, placeholder `#666666`, focus ring `#ffffff`.

### Navigation

- Top bar: 64px tall; transparent over the dark hero, white `#ffffff` with a `1px #e5e5e5` bottom rule once scrolled into the light register
- Wordmark: hard-left, Graphik weight 600, inherits the register's foreground (white on dark, black on white)
- Link list: hard-right, Graphik 14/1.0 weight 500, gap 24–32px
- Primary CTA pill sits at the far right (white pill on dark, black pill on white)
- Mobile: hamburger collapses into a full-bleed sheet that matches the active register

## 5. Layout Principles

### Spacing System

Base 4px. Scale: `0, 4, 8, 12, 16, 24, 32, 40, 48, 64, 80, 96, 128, 160`. Section padding lands at 96 or 128 in the marketing flow; component internal padding clusters at 16–24. The rhythm is generous — Luma gives the work room to breathe rather than packing density.

### Grid & Container

- Page max width: **1280px**, with full-bleed video sections breaking the container
- Prose max width: **720px** for long-form copy in the light register
- Hero is full-bleed video at `#000000` with the headline floated low-left in a narrow column (typically 560–720px)
- Feature grids: 12-column, 24–32px gutters; gallery tiles serve generated video at native aspect ratio
- Footer returns to the dark register, full-bleed

### Whitespace Philosophy

Whitespace is structural, not decorative. The hero gives the headline a large quiet margin so the video reads clearly behind it. In the light register, sections separate with generous 96–128px vertical padding and the white surface itself acts as breathing room. Density is low; the frames are the content, and they need air.

### Section Cadence

A Luma page alternates registers: a cinematic black hero → a white content band (features, capabilities) → a full-bleed dark video showcase → a white grid of model outputs → a dark footer. The register flip between sections is the rhythm. Each dark band is a screening; each white band is the lobby. The seam between `#000000` and `#ffffff` is intentional and frequent.

## 6. Shapes & Radius Scale

| Tier        | px    | Use |
|-------------|-------|-----|
| Micro       | 2     | inline chips, tight metadata |
| Standard    | 4     | small controls, tags |
| Comfortable | 8     | inputs, in-product chrome |
| Relaxed     | 12    | cards, gallery tiles |
| Large       | 16    | featured panels, media frames |
| Pill        | 9999  | all buttons, badges, status pills |

The signature is the **full-pill button** (9999) against **soft-relaxed cards** (12–16). There is no hard-brutalist 0 corner here — even media frames carry a gentle 12–16px radius — and there is no SaaS-default 6px. The contrast is between the pill and the gently rounded card. Buttons are pills or nothing.

## 7. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| 0 | Flat, no shadow | bg surfaces, full-bleed video, hero |
| 1 | `ambient` shadow `rgba(0,0,0,0.06) 0 1px 2px` | resting white cards |
| 2 | `standard` shadow `rgba(0,0,0,0.10) 0 4px 16px -2px` | white card hover, raised panels |
| 3 | Tonal step (`#0a0a0a` / `#171717` on `#000000`) | dark inset panels — no shadow |
| 4 | `elevated` shadow `rgba(0,0,0,0.16) 0 16px 32px -8px` | popovers, menus on white |
| 5 | `dark` shadow `rgba(0,0,0,0.6) 0 24px 48px -12px` | modals, lightbox over dark |

### Shadow Philosophy

Elevation is handled two different ways depending on register. On the white surface, shadows are soft, low-opacity, and short-throw — a card barely lifts off the page (0.06–0.16 alpha). On the dark register, depth is achieved through **tonal stepping** (`#000000` → `#0a0a0a` → `#171717`) and hairline white borders rather than cast shadow, because a shadow disappears against black. The interface prefers a `1px` hairline to a heavy shadow in both registers; depth reads as restraint, never as plastic lift.

## 8. Interaction & Motion ✨

### Easing

- `ease-standard` `cubic-bezier(0.4, 0, 0.2, 1)` — default for hovers and state changes
- `ease-emphasized` `cubic-bezier(0.2, 0, 0, 1)` — entrances, reveals, register transitions
- `ease-out` `cubic-bezier(0, 0, 0.2, 1)` — exits, dismissals
- `ease-in` `cubic-bezier(0.4, 0, 1, 1)` — rare, for elements leaving the viewport

### Durations

- `duration-fast` **150ms** — focus rings, micro hovers, button state
- `duration-standard` **240ms** — card hovers, menu opens, nav background fade
- `duration-slow` **320ms** — reveals, modal opens
- `duration-page` **480ms** — section reveals, video crossfades, register transitions

### Per-Component Micro-States

- **Button hover**: bg shifts in 150ms `ease-standard`. Black primary lifts to `#171717`; white invert drops to `#f0f0f0`. No scale, no glow.
- **Card hover (white)**: shadow lifts from ambient to standard over 240ms; border darkens `#e5e5e5` → `#d4d4d4`. Nested media may scale 1.02 over 320ms `ease-emphasized`.
- **Card hover (dark)**: border lifts from `#ffffff0d` to `#ffffff1f` over 240ms — tonal only.
- **Link hover**: black underline softens to `#666666` (white to `#cccccc` on dark) over 150ms; no colour shift to a brand hue.
- **Hero video**: autoplays muted, loops full-bleed; scenes crossfade over 480ms.
- **Nav on scroll**: background fades from transparent to `#ffffff` (with a `1px #e5e5e5` rule) over 240ms as the page leaves the dark hero.

### Page Transitions

Section content reveals via `IntersectionObserver` — a fade-up over 480ms `ease-emphasized` with a 16px transform-y. The register flip (black ↔ white band) is a hard cut between sections, not a gradient; the contrast itself is the transition. Hero video autoplays muted and loops; gallery tiles reveal in staggered fade-up.

### Reduced Motion

Respects `prefers-reduced-motion: reduce`. Video autoplay is disabled and a still poster frame is shown. All transforms (scale, translate-y, parallax) are dropped; transitions degrade to opacity-only fades capped at 200ms. This matters because Luma's surface leans on motion — the reduced-motion path must stay coherent with static frames.

## 9. Accessibility & A11y ✨

### Contrast Pairs

- `#000000` on `#ffffff` (body on white): **21.0:1** — AAA, the theoretical maximum
- `#ffffff` on `#000000` (hero h1 on black): **21.0:1** — AAA, the maximum, in the opposite direction
- `#666666` on `#ffffff` (muted secondary on white): **5.7:1** — AA at all sizes
- `#999999` on `#ffffff` (soft metadata on white): **2.8:1** — fails AA; reserve for decorative/non-essential labels only, or darken to `#666666` for any readable text
- `#a3a3a3` on `#000000` (muted on dark): **8.9:1** — AAA at large sizes
- `#000000` pill on `#ffffff` ground (primary button): **21.0:1** label-to-ground — AAA

Because the brand runs pure black and pure white, both primary registers clear AAA with margin to spare. The only contrast risk is the soft grey `#999999` — keep it off essential text.

### Focus Indicators

- 2px solid `#000000` ring with 2px offset on the white surface
- 2px solid `#ffffff` ring with 2px offset on the dark register
- Never removed; `:focus-visible` only so mouse users don't see rings

### ARIA Patterns

- **Dialog**: lightbox/video modal uses `role="dialog"` `aria-modal="true"` with `aria-labelledby`
- **Status**: video/generation loading uses `role="status"` with `aria-live="polite"`
- **Listbox / grid**: gallery of model outputs uses appropriate `role="list"` / `role="listitem"` with arrow-key traversal
- **Region**: each register band is a `<section>` with an accessible name

### Keyboard Navigation

- Tab order follows visual flow, register to register
- ESC closes lightbox, modal, and the mobile menu sheet
- Arrow keys advance gallery items
- Enter activates a gallery tile / opens the lightbox
- Space toggles video play/pause when a video element is focused

### Screen Reader Hints

- Generated/demo videos carry a descriptive `aria-label`; decorative B-roll uses `aria-hidden="true"`
- Mono labels (model versions, render IDs) read as visible text — no `aria-label` override
- Icon-only buttons require an `aria-label`
- The register flip is purely visual and carries no semantic meaning — do not announce it

### Reduced Motion

Video autoplay disabled (poster frame shown). All decorative motion (scale, translate, parallax) suppressed. Functional motion (focus, modal) capped at 200ms opacity-only.

## 10. Responsive Behavior

| Breakpoint | px       | Behavior |
|------------|----------|----------|
| mobile     | 0–639    | single column, stacked nav (hamburger), 16px gutters; hero headline drops to ~32px |
| tablet     | 640–1023 | 2-column feature grid, condensed nav, headline ~40px |
| desktop    | 1024–1279| 3-column gallery, full nav, headline ~52px |
| wide       | 1280+    | full layout at 1280 max; full-bleed video breaks the container; headline up to 80px on marquee |

### Touch Targets

44×44px minimum on mobile. Pill buttons retain a ~44px tap height and gain horizontal padding on touch surfaces. Gallery tile tap zones expand to fill the cell.

### Collapsing Strategy

- **Nav**: full-link list above 1024; hamburger sheet (matching the active register) below
- **Hero**: headline tracking relaxes slightly below 768 to avoid character collision; video stays full-bleed, aspect-ratio adapts 16:9 → 4:5 on portrait mobile
- **Feature grid**: 3-col → 2-col → 1-col as width drops; gutters tighten 32 → 16
- **Prose**: 720px max above 1024; full-width with 16–24px horizontal padding below

### Image / Video Behavior

Generated video and model output is served at native aspect ratio. `loading="lazy"` on below-the-fold media; `<video>` uses `preload="metadata"` with a poster frame; `srcset` for retina stills. The dark register's full-bleed video is the LCP element and should be prioritized.

### Container Queries

Gallery tiles use `@container` queries to switch from a horizontal media-plus-caption layout to a stacked layout under ~480px container width.

## 11. Content & Voice ✨

### Tone

Confident, plain, cinematic. Luma writes like a film studio describing its tools — short declarative statements, no hype, no exclamation. The product is "AI Agents for Creative Work"; the sentences stay that clean and direct. The voice trusts the work to be impressive and refuses to oversell it in words.

### Microcopy Patterns

- **Buttons**: "Try Luma", "Get started", "Watch", "Learn more" — single clear verbs, never "Get started for free!"
- **Errors**: "Generation failed. Try again." — terminal period, no apology
- **Success**: "Done." / "Saved." — single word, period
- **Loading**: "Generating…" / "Rendering…" — present participle, ellipsis

### Empty States

- Gallery empty: "Nothing here yet." — plain, no recovery copy
- Search empty: "No results." — two words
- Error empty: "Something went wrong." — calm, no blame

### CTA Verb Conventions

- "Try Luma" (the canonical CTA — product name as object, not "Sign up")
- "Get started" (single allowed marketing verb)
- "Watch" (single verb, not "Watch the demo video")
- "Learn more" (secondary, restrained)
- "Open" (in-product transition)

The voice's signature is restraint: declarative statements where SaaS would use imperative-with-promise, full stops where SaaS would use exclamation. Marketing intensifiers ("powerful", "revolutionary", "magical") are absent — the generated frames make that argument.

## 12. Dark Mode & Theming ✨

Luma is **dual-register by design** — not a light theme with a dark toggle, and not a dark-by-default app. The cinematic black `#000000` hero and footer and the bright white `#ffffff` content body are two halves of a single composition that always appear together. A page is meant to flip between them as you scroll.

Neither register is a user-selectable theme. There is no `prefers-color-scheme` toggle that swaps the whole page light or dark; the registers are authored, fixed bands. The dark register frames the work like a theatre; the light register presents it like a gallery wall. Both run pure monochrome, so the only thing that changes across the seam is which of black and white is foreground.

If you implement a Luma-style page, build both registers and place the flip at the section boundary — do not collapse the page to a single tone. The contrast between the two acts is the brand. A dark-only or white-only Luma page misses the screening-room-into-studio move that defines it.

## 13. Lineage & Influences

Luma's surface inherits from three traditions.

**The product-film register** — Apple's keynote slides, the dark-frame-with-white-headline establishing shot, and A24's title cards. Luma's cinematic black hero with white Graphik floating over generated video is the same move: lights down, frame lit, type quiet and confident. The maximal black/white contrast and the refusal of any brand hue both trace to this product-film discipline, where the work on screen is the only colour allowed.

**The AI-video peer set** — Runway above all, and the broader generative-video field. The near-black screening-room hero, the no-chromatic-accent chrome, and the principle that the generated frames carry all the saturation are shared DNA across the category. Luma differs by leaning harder into the *white studio* second act — Runway oscillates into a warm paper register, while Luma flips to pure white. Vercel contributes the high-contrast monochrome marketing surface and the full-pill CTA grammar.

What Luma rejects: the neon/aurora gradients that signal "generative AI" elsewhere, any brand colour in the chrome, glows on buttons, and dense SaaS-dashboard layouts. The page stays minimal and cinematic so the model output can speak.

**Named influences:**

- Commercial Type (Graphik) — `https://commercialtype.com/catalog/graphik` — the single neo-grotesque editorial voice
- Apple — `https://apple.com` — product-film register, maximal monochrome contrast
- Runway — `https://runwayml.com` — AI-video screening-room hero, no chromatic accent
- A24 — `https://a24films.com` — cinematic film-studio editorial mood
- Vercel — `https://vercel.com` — high-contrast monochrome surface, full-pill CTA grammar

## 14. Do's and Don'ts

### Do

- Build the page as two registers — a cinematic black hero/footer and a white content body — and flip between them at section seams
- Float white Graphik headlines (52px, weight 500) low over full-bleed generated video in the hero
- Keep body type pure black `#000000` on pure white `#ffffff` in the light register — the 21:1 contrast is the brand
- Make every CTA a full pill (radius 9999): white-on-dark in the hero, black-on-white in the body
- Carry hierarchy with weight (500/600/700) and scale, never with colour
- Let the generated frames be the only saturation on the page
- Use Graphik for everything — display and body, one voice from hero to footer
- Keep borders hairline (`#e5e5e5` on white; 5–12% white on dark) instead of heavy shadows
- Keep section padding generous (96–128px) so the work breathes
- Honor reduced-motion by disabling video autoplay and showing a poster frame
- Use terminal periods in microcopy; refuse exclamation marks
- Soften links to grey on hover, never to a brand hue

### Don't

- Introduce a brand colour — saturation belongs to the model output, not the chrome
- Add neon/aurora gradients to signal "generative AI" — Luma deliberately rejects them
- Collapse the page to a single register — a dark-only or white-only Luma misses the screening-room-into-studio move
- Use a second typeface — Graphik carries the whole site
- Make the hero headline bold (700) — it is weight 500; medium, not heavy
- Use 0 (hard brutalist) or 6px (SaaS default) on buttons — they are full pills or nothing
- Apply heavy drop shadows; on white keep them soft (≤0.16 alpha), on dark use tonal steps
- Tint the neutral ramp warm or cool — any hue reads as an unwanted brand colour
- Use `#999999` for readable body text — it fails AA on white; darken to `#666666`
- Animate decoratively under reduced-motion
- Use SaaS-CTA verbs ("Get started for free", "Sign up free", "Try it now!")
- Crop the generated video to a thumbnail in the hero — it is full-bleed or nothing

## 15. Agent Prompt Guide

### Quick Color Reference

```
bg (light):     #ffffff   (white content studio)
bg (dark):      #000000   (cinematic hero/footer)
near-black:     #0a0a0a   (dark inset panel)
text:           #000000   (body on white)
text-invert:    #ffffff   (hero headline on black)
muted:          #666666   (secondary on white, AA)
soft:           #999999   (decorative metadata only — fails AA)
muted-dark:     #a3a3a3   (muted on black, AAA large)
border:         #e5e5e5   (hairline on white)
border-dark:    #ffffff1f (12% white on dark)
graphite:       #171717   (primary button hover)
ring:           #000000 / #ffffff (focus, by register)
```

### Example Component Prompts

1. **"Create a cinematic hero on `#000000` with a full-bleed muted-autoplay generated video, a white Graphik headline at 52px weight 500 line-height 1.06 tracking `-0.02em` floated low-left in a 640px column reading 'AI Agents for Creative Work', an 18px supporting line in `#a3a3a3`, and a white full-pill button 'Try Luma' with `#000000` text beside a ghost-dark pill 'Watch the film'."**

2. **"Design a white content section at `#ffffff`: a 720px prose column, a Graphik h2 at 40/1.1 weight 600 tracking `-0.018em` in `#000000`, body at 16/1.55 in `#000000`, secondary lines in `#666666`, and a black full-pill button 'Get started' with `#ffffff` text."**

3. **"Build a gallery grid on `#ffffff`: three white cards at 12px radius with `1px #e5e5e5` border and a soft `rgba(0,0,0,0.06)` shadow, each holding a generated video at native aspect ratio on top, a Graphik h4 at 24/1.25 weight 600, and a `#666666` caption. Hover lifts the shadow to `rgba(0,0,0,0.10)` and scales the video 1.02."**

4. **"Make a top nav, transparent over the dark hero: Graphik wordmark weight 600 in white hard-left, link list 14/1.0 weight 500 in white hard-right (Research, Dream Machine, Pricing, Sign in) with a white full-pill 'Try Luma' at the far right. On scroll past the hero, fade the background to `#ffffff` with a `1px #e5e5e5` bottom rule and flip the foreground to `#000000`."**

5. **"Compose a dark showcase band on `#000000`: a full-bleed looping video, a small transparent badge with `1px #ffffff3f` border reading 'Ray2' in white 12px, and a white Graphik h3 at 32/1.2 weight 600 caption beneath. No shadow — depth is tonal."**

6. **"Design a model-output lightbox: a `role=dialog` modal over a 0.6-alpha black scrim, the generated video centered at 16px radius, a mono `13px` render-ID label in `#a3a3a3`, ESC to close, white focus ring on the close button."**

### Iteration Guide

1. **Build both registers first**: if your page is all-white or all-black, you've missed the brand. Add the opposite-register band and flip at the section seam.
2. **Refuse colour**: when a CTA or section looks weak, do not add an accent hue — strengthen contrast or weight. The white/black pill is the answer.
3. **Drop the headline to weight 500**: if the hero reads heavy or shouty, it's probably at 700 — pull it to 500. Graphik medium is the Luma voice.
4. **Let the video carry the saturation**: if the page feels flat, the fix is more/better generated video, not a gradient behind the text.
5. **Pill or nothing on buttons**: if you're reaching for 6px or 8px button radius, you're in SaaS register — go to full pill (9999).
6. **Keep shadows soft on white, tonal on dark**: a heavy drop shadow reads as plastic. On white cap alpha at 0.16; on black use `#0a0a0a`/`#171717` steps and a hairline border instead.
7. **Darken `#999999` for any real text**: it fails AA on white. Reserve it for decoration; use `#666666` where copy must be read.
8. **Strip the adjectives**: if you wrote "powerful", "magical", or "revolutionary", cut them. State what it does and let the frames argue.
Prose

1. Visual Theme & Atmosphere

Luma is a screening room that opens into a studio. The page begins in cinematic black #000000 — a full-bleed dark hero where a white Graphik headline (52px, weight 500) floats low over generated video, the way a film title sits over an establishing shot. There is no panel, no card, no gradient scrim; the headline is simply white-on-black, and the only colour on the screen is the motion behind it. Then, as you scroll, the page resolves into a bright white #ffffff content surface with pure black #000000 body type — the work pinned to a gallery wall in maximum contrast. This two-act monochrome is the entire brand.

The chrome refuses to compete with the work. Buttons are stark pills — a white “Try Luma” on the dark hero, inverting to black-on-white once the page crosses into the light register. Links are quiet black underlines that soften to grey on hover. There is no brand hue anywhere in the wrapper: no accent blue, no gradient, no glow. The discipline is total, and it is the point — every pixel of saturation on a Luma page comes from the model’s own output, the generated frames and B-roll, never from the interface around them.

Where many AI-creative sites reach for neon and aurora gradients to signal “generative,” Luma reaches for the opposite: the restraint of a product film. The contrast is maximal (21:1 both directions, white-on-black and black-on-white), the hue is zero, and the typography is a single neo-grotesque held at one quiet voice from hero to footer. Hierarchy is carried by weight and scale, never by colour. The effect is closer to an Apple keynote slide or an A24 title card than to a typical SaaS dashboard.

The sensory metaphor is the cut between theatre and gallery. The dark register is the auditorium — lights down, frame lit, attention forward. The light register is the lobby afterward — bright, clean, the stills hung in rows for close inspection. A Luma page moves between the two registers within a single scroll, and the seam between black and white is where the rhythm lives. The chrome stays silent on both sides so the generated video can carry the page.

Key Characteristics

  • Two-act monochrome: cinematic black #000000 hero/footer opening into white #ffffff content body
  • White Graphik headlines (52px, weight 500) floating over generated video in the dark register
  • Pure black #000000 body type on white in the light register — maximum 21:1 contrast both ways
  • No chromatic accent anywhere in the chrome — saturation comes from model output only
  • Full-pill CTAs (radius 9999): white-on-dark in the hero, black-on-white in the light body
  • Single-family typography — Graphik carries display and body; hierarchy by weight, never colour
  • Minimal, cinematic atmosphere — product-film register, not dashboard register
  • Generous whitespace; full-bleed video; chrome held quiet
  • Hierarchy by weight (500/600/700) and scale, never by hue
  • Hairline borders (#e5e5e5 on white, 5–12% white on dark) instead of heavy shadows

2. Color Palette & Roles

Primary

  • bg (#ffffff): the white content studio — the light register where body copy lives
  • bg-dark (#000000): cinematic black hero and footer — the dark register
  • bg-near (#0a0a0a): near-black panel, a half-step off pure black for inset zones
  • text (#000000): pure black body type on the white surface
  • text-invert (#ffffff): white display copy on the dark hero (the live h1 colour)

Brand & Dark

  • brand (#000000): the brand has no chromatic accent — cinematic black IS the brand
  • brand-invert (#ffffff): white as the inverse brand register, used on the dark hero
  • on-brand (#ffffff): text on black fills (primary button label)

Accent (intentionally non-chromatic)

  • accent-ink (#000000): black-on-white emphasis, the only “accent” in the light register
  • accent-snow (#ffffff): white-on-black emphasis in the dark register
  • accent-graphite (#171717): raised dark surface / primary button hover
  • accent-fog (#f5f5f5): faint grey wash for insets on white

The accent set is monochromatic by intent. Luma’s only saturation is in the imagery — generated video, model stills, B-roll. The interface itself has no hue. If a Luma page shows colour, it is coming from the work, not the wrapper.

Interactive

  • link (#000000): default black link on white, subtle underline
  • link-hover (#666666): softens to mid-grey on hover
  • link-invert (#ffffff): white link on the dark register
  • link-invert-hover (#cccccc): softens on hover over dark
  • selected (#f0f0f0): selected list-item background on white
  • disabled (#cccccc): muted disabled foreground

Neutral Scale

A pure neutral ladder runs #ffffff#fafafa#f5f5f5#e5e5e5#d4d4d4#a3a3a3#737373#525252#404040#262626#171717#0a0a0a#000000. The ramp is strictly achromatic — no warm or cool bias — because any hue tint would read as a brand colour, which Luma refuses. #666666 is the signature secondary-text grey on white; #a3a3a3 is its counterpart on dark.

Surface & Borders

  • surface (#ffffff): default card on the white ground
  • surface-fog (#f5f5f5): faint grey inset / quiet panel on white
  • surface-dark (#0a0a0a): raised panel on the dark register
  • surface-graphite (#171717): deeper dark surface
  • border (#e5e5e5): hairline divider on white — never heavy
  • border-strong (#d4d4d4): visible divider on white, card hover edge
  • border-dark (#ffffff1f): 12% white hairline on dark
  • border-dark-soft (#ffffff0d): 5% white hairline on dark
  • ring (#000000) / ring-invert (#ffffff): focus rings, black on white / white on dark

Shadow Colors

  • shadow-ambient (rgba(0,0,0,0.06)): the lightest card lift on white
  • shadow-standard (rgba(0,0,0,0.10)): hover lift on white cards
  • shadow-elevated (rgba(0,0,0,0.16)): popovers, menus on white
  • shadow-dark (rgba(0,0,0,0.6)): modal elevation over the dark register

Shadows are used sparingly and softly on the white surface; on the dark register, depth is tonal (#000000#0a0a0a#171717) rather than cast. The interface prefers a hairline border to a heavy shadow.

Semantic

  • success (#16a34a) — green, in-product only; never marketing
  • warning (#d97706) — amber for system messages
  • danger (#dc2626) — destructive actions only, never marketing
  • info (#2563eb) — system info; the rare blue is functional, not brand

3. Typography Rules

Font Family

  • Display & Body: "__graphik_7126cf", Graphik, system-ui, -apple-system, "Segoe UI", Helvetica, Arial, sans-serif — weights 400/500/600/700. Graphik is Commercial Type’s neo-grotesque; the __graphik_7126cf token is the production webfont hash. A single family carries the entire site.
  • Mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", monospace — weights 400/500, reserved for technical metadata
  • OpenType: default ligatures and kerning on; tabular figures (tnum) in any numeric/metric columns; no decorative stylistic sets

Hierarchy

RoleFontSizeWeightLine HTrackingNotes
display-heroGraphik806001.00-0.03emrare full-bleed marquee
display-largeGraphik646001.04-0.025emmajor section heads
h1Graphik525001.06-0.02emthe canonical Luma hero headline (white on black)
h2Graphik406001.10-0.018emfeature heads
h3Graphik326001.20-0.012emsub-section heads
h4Graphik246001.25-0.005emcard titles
h5Graphik206001.300small label heads
body-largeGraphik184001.550hero supporting copy
bodyGraphik164001.550default body (the live body token)
body-smallGraphik144001.500secondary copy
labelGraphik135001.400form labels, UI
captionGraphik125001.400.02emimage captions
overlineGraphik116001.300.08emsection eyebrow, uppercase
buttonGraphik155001.00-0.005emCTA label
nav-linkGraphik145001.000top nav
monomono134001.500model versions, technical IDs

Principles

  • One family, one voice: Graphik carries display and body. There is no second sans, no serif, no display face. The voice stays consistent from hero to footer.
  • Weight is the hierarchy: display uses 500–700, body uses 400, labels use 500. Emphasis comes from weight and scale — never from colour, because there is no brand colour to reach for.
  • The hero is weight 500, not 700: the live h1 sits at 52px / weight 500 — a confident medium, not a heavy bold. Graphik’s even neo-grotesque rhythm reads cleanly at 500 on black.
  • Tracking tightens as size grows: display heads pull -0.02em to -0.03em; body sits at 0; the caption/overline open up to positive +0.02em to +0.08em for small-cap legibility.
  • Body breathes at 1.55 line-height: long-form copy on the white surface uses a generous 1.55 leading. Display copy compresses toward 1.0–1.1.
  • Mono is metadata only: model versions, render IDs, technical captions. Never marketing copy.
  • No italics, no decorative case: emphasis is structural — weight, scale, and the black/white register flip. Uppercase appears only in the overline eyebrow and caption.
  • Contrast over colour: at 21:1 in both registers, type never needs colour to separate from ground. The maximal contrast is the legibility strategy.

4. Component Stylings

Buttons

All buttons are full pills (radius 9999) — the live CTA radius (3.35e7px) is a full-pill artifact. Padding 12px 24px, label Graphik 15/1.0 weight 500.

button-primary — the black pill on white (light register)

  • Background: #000000
  • Text: #ffffff, Graphik 15/1.0 weight 500, tracking -0.005em
  • Border: none
  • Radius: 9999 (full pill)
  • Padding: 12px 24px
  • Hover: bg #171717
  • Active: bg #262626
  • Focus: 2px black ring + 2px offset
  • Use: “Try Luma”, “Get started” in the white content body

button-invert — the white pill on the dark hero (the live CTA)

  • Background: #ffffff
  • Text: #000000, Graphik 15/1.0 weight 500
  • Border: none
  • Radius: 9999
  • Padding: 12px 24px
  • Hover: bg #f0f0f0
  • Active: bg #e5e5e5
  • Focus: 2px white ring + 2px offset (on #000000)
  • Use: the hero “Try Luma” — white-on-black over the cinematic video

button-ghost — outlined pill on white

  • Background: transparent
  • Text: #000000, Graphik 15/1.0 weight 500
  • Border: 1px solid #e5e5e5
  • Radius: 9999
  • Hover: border lifts to #000000, bg #fafafa
  • Active: bg #f0f0f0
  • Use: secondary actions (“Learn more”, “Watch”) in the light register

button-ghost-dark — outlined pill on the dark hero

  • Background: transparent
  • Text: #ffffff, Graphik 15/1.0 weight 500
  • Border: 1px solid #ffffff1f
  • Radius: 9999
  • Hover: border #ffffff5f, bg #ffffff0d
  • Active: bg #ffffff14
  • Use: secondary CTA beside the white pill in the hero (“Watch the film”)

Cards

White card (feature, gallery on light):

  • Background: #ffffff
  • Border: 1px solid #e5e5e5
  • Radius: 12px
  • Padding: 24px
  • Shadow: ambient rgba(0,0,0,0.06) 0 1px 2px
  • Hover: shadow lifts to standard, border darkens to #d4d4d4

Dark card (panel on the cinematic register):

  • Background: #0a0a0a
  • Border: 1px solid #ffffff0d
  • Radius: 12px
  • Padding: 24px
  • Shadow: none — depth is tonal
  • Hover: border lifts to #ffffff1f

Badges / Tags / Pills

Light badge:

  • Background: #f5f5f5
  • Text: #000000, Graphik 12/1.4 weight 500 tracking 0.02em
  • Border: none
  • Radius: 9999
  • Padding: 4px 12px
  • Use: feature tags, “New” on the white surface

Dark badge:

  • Background: transparent
  • Text: #ffffff, Graphik 12/1.4 weight 500
  • Border: 1px solid #ffffff3f
  • Radius: 9999
  • Padding: 4px 12px
  • Use: model versions (“Ray2”, “Dream Machine”) on the dark hero

Inputs / Forms

Text input:

  • Background: #ffffff
  • Text: #000000, Graphik 15/1.5
  • Placeholder: #999999
  • Border: 1px solid #e5e5e5
  • Radius: 8px
  • Padding: 10px 14px
  • Focus: border #000000, 2px black ring

On the dark register, inputs invert: bg #0a0a0a, text #ffffff, border #ffffff1f, placeholder #666666, focus ring #ffffff.

  • Top bar: 64px tall; transparent over the dark hero, white #ffffff with a 1px #e5e5e5 bottom rule once scrolled into the light register
  • Wordmark: hard-left, Graphik weight 600, inherits the register’s foreground (white on dark, black on white)
  • Link list: hard-right, Graphik 14/1.0 weight 500, gap 24–32px
  • Primary CTA pill sits at the far right (white pill on dark, black pill on white)
  • Mobile: hamburger collapses into a full-bleed sheet that matches the active register

5. Layout Principles

Spacing System

Base 4px. Scale: 0, 4, 8, 12, 16, 24, 32, 40, 48, 64, 80, 96, 128, 160. Section padding lands at 96 or 128 in the marketing flow; component internal padding clusters at 16–24. The rhythm is generous — Luma gives the work room to breathe rather than packing density.

Grid & Container

  • Page max width: 1280px, with full-bleed video sections breaking the container
  • Prose max width: 720px for long-form copy in the light register
  • Hero is full-bleed video at #000000 with the headline floated low-left in a narrow column (typically 560–720px)
  • Feature grids: 12-column, 24–32px gutters; gallery tiles serve generated video at native aspect ratio
  • Footer returns to the dark register, full-bleed

Whitespace Philosophy

Whitespace is structural, not decorative. The hero gives the headline a large quiet margin so the video reads clearly behind it. In the light register, sections separate with generous 96–128px vertical padding and the white surface itself acts as breathing room. Density is low; the frames are the content, and they need air.

Section Cadence

A Luma page alternates registers: a cinematic black hero → a white content band (features, capabilities) → a full-bleed dark video showcase → a white grid of model outputs → a dark footer. The register flip between sections is the rhythm. Each dark band is a screening; each white band is the lobby. The seam between #000000 and #ffffff is intentional and frequent.

6. Shapes & Radius Scale

TierpxUse
Micro2inline chips, tight metadata
Standard4small controls, tags
Comfortable8inputs, in-product chrome
Relaxed12cards, gallery tiles
Large16featured panels, media frames
Pill9999all buttons, badges, status pills

The signature is the full-pill button (9999) against soft-relaxed cards (12–16). There is no hard-brutalist 0 corner here — even media frames carry a gentle 12–16px radius — and there is no SaaS-default 6px. The contrast is between the pill and the gently rounded card. Buttons are pills or nothing.

7. Depth & Elevation

LevelTreatmentUse
0Flat, no shadowbg surfaces, full-bleed video, hero
1ambient shadow rgba(0,0,0,0.06) 0 1px 2pxresting white cards
2standard shadow rgba(0,0,0,0.10) 0 4px 16px -2pxwhite card hover, raised panels
3Tonal step (#0a0a0a / #171717 on #000000)dark inset panels — no shadow
4elevated shadow rgba(0,0,0,0.16) 0 16px 32px -8pxpopovers, menus on white
5dark shadow rgba(0,0,0,0.6) 0 24px 48px -12pxmodals, lightbox over dark

Shadow Philosophy

Elevation is handled two different ways depending on register. On the white surface, shadows are soft, low-opacity, and short-throw — a card barely lifts off the page (0.06–0.16 alpha). On the dark register, depth is achieved through tonal stepping (#000000#0a0a0a#171717) and hairline white borders rather than cast shadow, because a shadow disappears against black. The interface prefers a 1px hairline to a heavy shadow in both registers; depth reads as restraint, never as plastic lift.

8. Interaction & Motion ✨

Easing

  • ease-standard cubic-bezier(0.4, 0, 0.2, 1) — default for hovers and state changes
  • ease-emphasized cubic-bezier(0.2, 0, 0, 1) — entrances, reveals, register transitions
  • ease-out cubic-bezier(0, 0, 0.2, 1) — exits, dismissals
  • ease-in cubic-bezier(0.4, 0, 1, 1) — rare, for elements leaving the viewport

Durations

  • duration-fast 150ms — focus rings, micro hovers, button state
  • duration-standard 240ms — card hovers, menu opens, nav background fade
  • duration-slow 320ms — reveals, modal opens
  • duration-page 480ms — section reveals, video crossfades, register transitions

Per-Component Micro-States

  • Button hover: bg shifts in 150ms ease-standard. Black primary lifts to #171717; white invert drops to #f0f0f0. No scale, no glow.
  • Card hover (white): shadow lifts from ambient to standard over 240ms; border darkens #e5e5e5#d4d4d4. Nested media may scale 1.02 over 320ms ease-emphasized.
  • Card hover (dark): border lifts from #ffffff0d to #ffffff1f over 240ms — tonal only.
  • Link hover: black underline softens to #666666 (white to #cccccc on dark) over 150ms; no colour shift to a brand hue.
  • Hero video: autoplays muted, loops full-bleed; scenes crossfade over 480ms.
  • Nav on scroll: background fades from transparent to #ffffff (with a 1px #e5e5e5 rule) over 240ms as the page leaves the dark hero.

Page Transitions

Section content reveals via IntersectionObserver — a fade-up over 480ms ease-emphasized with a 16px transform-y. The register flip (black ↔ white band) is a hard cut between sections, not a gradient; the contrast itself is the transition. Hero video autoplays muted and loops; gallery tiles reveal in staggered fade-up.

Reduced Motion

Respects prefers-reduced-motion: reduce. Video autoplay is disabled and a still poster frame is shown. All transforms (scale, translate-y, parallax) are dropped; transitions degrade to opacity-only fades capped at 200ms. This matters because Luma’s surface leans on motion — the reduced-motion path must stay coherent with static frames.

9. Accessibility & A11y ✨

Contrast Pairs

  • #000000 on #ffffff (body on white): 21.0:1 — AAA, the theoretical maximum
  • #ffffff on #000000 (hero h1 on black): 21.0:1 — AAA, the maximum, in the opposite direction
  • #666666 on #ffffff (muted secondary on white): 5.7:1 — AA at all sizes
  • #999999 on #ffffff (soft metadata on white): 2.8:1 — fails AA; reserve for decorative/non-essential labels only, or darken to #666666 for any readable text
  • #a3a3a3 on #000000 (muted on dark): 8.9:1 — AAA at large sizes
  • #000000 pill on #ffffff ground (primary button): 21.0:1 label-to-ground — AAA

Because the brand runs pure black and pure white, both primary registers clear AAA with margin to spare. The only contrast risk is the soft grey #999999 — keep it off essential text.

Focus Indicators

  • 2px solid #000000 ring with 2px offset on the white surface
  • 2px solid #ffffff ring with 2px offset on the dark register
  • Never removed; :focus-visible only so mouse users don’t see rings

ARIA Patterns

  • Dialog: lightbox/video modal uses role="dialog" aria-modal="true" with aria-labelledby
  • Status: video/generation loading uses role="status" with aria-live="polite"
  • Listbox / grid: gallery of model outputs uses appropriate role="list" / role="listitem" with arrow-key traversal
  • Region: each register band is a <section> with an accessible name

Keyboard Navigation

  • Tab order follows visual flow, register to register
  • ESC closes lightbox, modal, and the mobile menu sheet
  • Arrow keys advance gallery items
  • Enter activates a gallery tile / opens the lightbox
  • Space toggles video play/pause when a video element is focused

Screen Reader Hints

  • Generated/demo videos carry a descriptive aria-label; decorative B-roll uses aria-hidden="true"
  • Mono labels (model versions, render IDs) read as visible text — no aria-label override
  • Icon-only buttons require an aria-label
  • The register flip is purely visual and carries no semantic meaning — do not announce it

Reduced Motion

Video autoplay disabled (poster frame shown). All decorative motion (scale, translate, parallax) suppressed. Functional motion (focus, modal) capped at 200ms opacity-only.

10. Responsive Behavior

BreakpointpxBehavior
mobile0–639single column, stacked nav (hamburger), 16px gutters; hero headline drops to ~32px
tablet640–10232-column feature grid, condensed nav, headline ~40px
desktop1024–12793-column gallery, full nav, headline ~52px
wide1280+full layout at 1280 max; full-bleed video breaks the container; headline up to 80px on marquee

Touch Targets

44×44px minimum on mobile. Pill buttons retain a ~44px tap height and gain horizontal padding on touch surfaces. Gallery tile tap zones expand to fill the cell.

Collapsing Strategy

  • Nav: full-link list above 1024; hamburger sheet (matching the active register) below
  • Hero: headline tracking relaxes slightly below 768 to avoid character collision; video stays full-bleed, aspect-ratio adapts 16:9 → 4:5 on portrait mobile
  • Feature grid: 3-col → 2-col → 1-col as width drops; gutters tighten 32 → 16
  • Prose: 720px max above 1024; full-width with 16–24px horizontal padding below

Image / Video Behavior

Generated video and model output is served at native aspect ratio. loading="lazy" on below-the-fold media; <video> uses preload="metadata" with a poster frame; srcset for retina stills. The dark register’s full-bleed video is the LCP element and should be prioritized.

Container Queries

Gallery tiles use @container queries to switch from a horizontal media-plus-caption layout to a stacked layout under ~480px container width.

11. Content & Voice ✨

Tone

Confident, plain, cinematic. Luma writes like a film studio describing its tools — short declarative statements, no hype, no exclamation. The product is “AI Agents for Creative Work”; the sentences stay that clean and direct. The voice trusts the work to be impressive and refuses to oversell it in words.

Microcopy Patterns

  • Buttons: “Try Luma”, “Get started”, “Watch”, “Learn more” — single clear verbs, never “Get started for free!”
  • Errors: “Generation failed. Try again.” — terminal period, no apology
  • Success: “Done.” / “Saved.” — single word, period
  • Loading: “Generating…” / “Rendering…” — present participle, ellipsis

Empty States

  • Gallery empty: “Nothing here yet.” — plain, no recovery copy
  • Search empty: “No results.” — two words
  • Error empty: “Something went wrong.” — calm, no blame

CTA Verb Conventions

  • “Try Luma” (the canonical CTA — product name as object, not “Sign up”)
  • “Get started” (single allowed marketing verb)
  • “Watch” (single verb, not “Watch the demo video”)
  • “Learn more” (secondary, restrained)
  • “Open” (in-product transition)

The voice’s signature is restraint: declarative statements where SaaS would use imperative-with-promise, full stops where SaaS would use exclamation. Marketing intensifiers (“powerful”, “revolutionary”, “magical”) are absent — the generated frames make that argument.

12. Dark Mode & Theming ✨

Luma is dual-register by design — not a light theme with a dark toggle, and not a dark-by-default app. The cinematic black #000000 hero and footer and the bright white #ffffff content body are two halves of a single composition that always appear together. A page is meant to flip between them as you scroll.

Neither register is a user-selectable theme. There is no prefers-color-scheme toggle that swaps the whole page light or dark; the registers are authored, fixed bands. The dark register frames the work like a theatre; the light register presents it like a gallery wall. Both run pure monochrome, so the only thing that changes across the seam is which of black and white is foreground.

If you implement a Luma-style page, build both registers and place the flip at the section boundary — do not collapse the page to a single tone. The contrast between the two acts is the brand. A dark-only or white-only Luma page misses the screening-room-into-studio move that defines it.

13. Lineage & Influences

Luma’s surface inherits from three traditions.

The product-film register — Apple’s keynote slides, the dark-frame-with-white-headline establishing shot, and A24’s title cards. Luma’s cinematic black hero with white Graphik floating over generated video is the same move: lights down, frame lit, type quiet and confident. The maximal black/white contrast and the refusal of any brand hue both trace to this product-film discipline, where the work on screen is the only colour allowed.

The AI-video peer set — Runway above all, and the broader generative-video field. The near-black screening-room hero, the no-chromatic-accent chrome, and the principle that the generated frames carry all the saturation are shared DNA across the category. Luma differs by leaning harder into the white studio second act — Runway oscillates into a warm paper register, while Luma flips to pure white. Vercel contributes the high-contrast monochrome marketing surface and the full-pill CTA grammar.

What Luma rejects: the neon/aurora gradients that signal “generative AI” elsewhere, any brand colour in the chrome, glows on buttons, and dense SaaS-dashboard layouts. The page stays minimal and cinematic so the model output can speak.

Named influences:

  • Commercial Type (Graphik) — https://commercialtype.com/catalog/graphik — the single neo-grotesque editorial voice
  • Apple — https://apple.com — product-film register, maximal monochrome contrast
  • Runway — https://runwayml.com — AI-video screening-room hero, no chromatic accent
  • A24 — https://a24films.com — cinematic film-studio editorial mood
  • Vercel — https://vercel.com — high-contrast monochrome surface, full-pill CTA grammar

14. Do’s and Don’ts

Do

  • Build the page as two registers — a cinematic black hero/footer and a white content body — and flip between them at section seams
  • Float white Graphik headlines (52px, weight 500) low over full-bleed generated video in the hero
  • Keep body type pure black #000000 on pure white #ffffff in the light register — the 21:1 contrast is the brand
  • Make every CTA a full pill (radius 9999): white-on-dark in the hero, black-on-white in the body
  • Carry hierarchy with weight (500/600/700) and scale, never with colour
  • Let the generated frames be the only saturation on the page
  • Use Graphik for everything — display and body, one voice from hero to footer
  • Keep borders hairline (#e5e5e5 on white; 5–12% white on dark) instead of heavy shadows
  • Keep section padding generous (96–128px) so the work breathes
  • Honor reduced-motion by disabling video autoplay and showing a poster frame
  • Use terminal periods in microcopy; refuse exclamation marks
  • Soften links to grey on hover, never to a brand hue

Don’t

  • Introduce a brand colour — saturation belongs to the model output, not the chrome
  • Add neon/aurora gradients to signal “generative AI” — Luma deliberately rejects them
  • Collapse the page to a single register — a dark-only or white-only Luma misses the screening-room-into-studio move
  • Use a second typeface — Graphik carries the whole site
  • Make the hero headline bold (700) — it is weight 500; medium, not heavy
  • Use 0 (hard brutalist) or 6px (SaaS default) on buttons — they are full pills or nothing
  • Apply heavy drop shadows; on white keep them soft (≤0.16 alpha), on dark use tonal steps
  • Tint the neutral ramp warm or cool — any hue reads as an unwanted brand colour
  • Use #999999 for readable body text — it fails AA on white; darken to #666666
  • Animate decoratively under reduced-motion
  • Use SaaS-CTA verbs (“Get started for free”, “Sign up free”, “Try it now!”)
  • Crop the generated video to a thumbnail in the hero — it is full-bleed or nothing

15. Agent Prompt Guide

Quick Color Reference

bg (light):     #ffffff   (white content studio)
bg (dark):      #000000   (cinematic hero/footer)
near-black:     #0a0a0a   (dark inset panel)
text:           #000000   (body on white)
text-invert:    #ffffff   (hero headline on black)
muted:          #666666   (secondary on white, AA)
soft:           #999999   (decorative metadata only — fails AA)
muted-dark:     #a3a3a3   (muted on black, AAA large)
border:         #e5e5e5   (hairline on white)
border-dark:    #ffffff1f (12% white on dark)
graphite:       #171717   (primary button hover)
ring:           #000000 / #ffffff (focus, by register)

Example Component Prompts

  1. “Create a cinematic hero on #000000 with a full-bleed muted-autoplay generated video, a white Graphik headline at 52px weight 500 line-height 1.06 tracking -0.02em floated low-left in a 640px column reading ‘AI Agents for Creative Work’, an 18px supporting line in #a3a3a3, and a white full-pill button ‘Try Luma’ with #000000 text beside a ghost-dark pill ‘Watch the film’.”

  2. “Design a white content section at #ffffff: a 720px prose column, a Graphik h2 at 40/1.1 weight 600 tracking -0.018em in #000000, body at 16/1.55 in #000000, secondary lines in #666666, and a black full-pill button ‘Get started’ with #ffffff text.”

  3. “Build a gallery grid on #ffffff: three white cards at 12px radius with 1px #e5e5e5 border and a soft rgba(0,0,0,0.06) shadow, each holding a generated video at native aspect ratio on top, a Graphik h4 at 24/1.25 weight 600, and a #666666 caption. Hover lifts the shadow to rgba(0,0,0,0.10) and scales the video 1.02.”

  4. “Make a top nav, transparent over the dark hero: Graphik wordmark weight 600 in white hard-left, link list 14/1.0 weight 500 in white hard-right (Research, Dream Machine, Pricing, Sign in) with a white full-pill ‘Try Luma’ at the far right. On scroll past the hero, fade the background to #ffffff with a 1px #e5e5e5 bottom rule and flip the foreground to #000000.”

  5. “Compose a dark showcase band on #000000: a full-bleed looping video, a small transparent badge with 1px #ffffff3f border reading ‘Ray2’ in white 12px, and a white Graphik h3 at 32/1.2 weight 600 caption beneath. No shadow — depth is tonal.”

  6. “Design a model-output lightbox: a role=dialog modal over a 0.6-alpha black scrim, the generated video centered at 16px radius, a mono 13px render-ID label in #a3a3a3, ESC to close, white focus ring on the close button.”

Iteration Guide

  1. Build both registers first: if your page is all-white or all-black, you’ve missed the brand. Add the opposite-register band and flip at the section seam.
  2. Refuse colour: when a CTA or section looks weak, do not add an accent hue — strengthen contrast or weight. The white/black pill is the answer.
  3. Drop the headline to weight 500: if the hero reads heavy or shouty, it’s probably at 700 — pull it to 500. Graphik medium is the Luma voice.
  4. Let the video carry the saturation: if the page feels flat, the fix is more/better generated video, not a gradient behind the text.
  5. Pill or nothing on buttons: if you’re reaching for 6px or 8px button radius, you’re in SaaS register — go to full pill (9999).
  6. Keep shadows soft on white, tonal on dark: a heavy drop shadow reads as plastic. On white cap alpha at 0.16; on black use #0a0a0a/#171717 steps and a hairline border instead.
  7. Darken #999999 for any real text: it fails AA on white. Reserve it for decoration; use #666666 where copy must be read.
  8. Strip the adjectives: if you wrote “powerful”, “magical”, or “revolutionary”, cut them. State what it does and let the frames argue.
Ship with this

Drop luma into your project, then ship the actual sections in an afternoon.

1 · install design
npx @webdesignhot/design-md add luma
2 · ship landing page
npx agentkit init --design luma
How AgentKit reads DESIGN.md