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.
Compare to…
- 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
- 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
- micro
2px - sm
4px - md
8px - lg
12px - card
12px - xl
16px - pill
9999px
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
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.
theme.extend block for tailwind.config.js
:root { --bg, --text, --brand, … } you can paste anywhere
W3C Design Tokens Community Group format
Importable into Figma → Variables → Import
---
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.
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
#000000hero/footer opening into white#ffffffcontent body - White Graphik headlines (52px, weight 500) floating over generated video in the dark register
- Pure black
#000000body 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 (
#e5e5e5on 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_7126cftoken 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.02emto-0.03em; body sits at 0; the caption/overline open up to positive+0.02emto+0.08emfor 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
#ffffffwith a1px #e5e5e5bottom 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
#000000with 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-standardcubic-bezier(0.4, 0, 0.2, 1)— default for hovers and state changesease-emphasizedcubic-bezier(0.2, 0, 0, 1)— entrances, reveals, register transitionsease-outcubic-bezier(0, 0, 0.2, 1)— exits, dismissalsease-incubic-bezier(0.4, 0, 1, 1)— rare, for elements leaving the viewport
Durations
duration-fast150ms — focus rings, micro hovers, button stateduration-standard240ms — card hovers, menu opens, nav background fadeduration-slow320ms — reveals, modal opensduration-page480ms — 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 320msease-emphasized. - Card hover (dark): border lifts from
#ffffff0dto#ffffff1fover 240ms — tonal only. - Link hover: black underline softens to
#666666(white to#ccccccon 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 a1px #e5e5e5rule) 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
#000000on#ffffff(body on white): 21.0:1 — AAA, the theoretical maximum#ffffffon#000000(hero h1 on black): 21.0:1 — AAA, the maximum, in the opposite direction#666666on#ffffff(muted secondary on white): 5.7:1 — AA at all sizes#999999on#ffffff(soft metadata on white): 2.8:1 — fails AA; reserve for decorative/non-essential labels only, or darken to#666666for any readable text#a3a3a3on#000000(muted on dark): 8.9:1 — AAA at large sizes#000000pill on#ffffffground (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
#000000ring with 2px offset on the white surface - 2px solid
#ffffffring with 2px offset on the dark register - Never removed;
:focus-visibleonly so mouse users don’t see rings
ARIA Patterns
- Dialog: lightbox/video modal uses
role="dialog"aria-modal="true"witharia-labelledby - Status: video/generation loading uses
role="status"witharia-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 usesaria-hidden="true" - Mono labels (model versions, render IDs) read as visible text — no
aria-labeloverride - 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
#000000on pure white#ffffffin 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 (
#e5e5e5on 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
#999999for 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
-
“Create a cinematic hero on
#000000with a full-bleed muted-autoplay generated video, a white Graphik headline at 52px weight 500 line-height 1.06 tracking-0.02emfloated 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#000000text beside a ghost-dark pill ‘Watch the film’.” -
“Design a white content section at
#ffffff: a 720px prose column, a Graphik h2 at 40/1.1 weight 600 tracking-0.018emin#000000, body at 16/1.55 in#000000, secondary lines in#666666, and a black full-pill button ‘Get started’ with#fffffftext.” -
“Build a gallery grid on
#ffffff: three white cards at 12px radius with1px #e5e5e5border and a softrgba(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#666666caption. Hover lifts the shadow torgba(0,0,0,0.10)and scales the video 1.02.” -
“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
#ffffffwith a1px #e5e5e5bottom rule and flip the foreground to#000000.” -
“Compose a dark showcase band on
#000000: a full-bleed looping video, a small transparent badge with1px #ffffff3fborder reading ‘Ray2’ in white 12px, and a white Graphik h3 at 32/1.2 weight 600 caption beneath. No shadow — depth is tonal.” -
“Design a model-output lightbox: a
role=dialogmodal over a 0.6-alpha black scrim, the generated video centered at 16px radius, a mono13pxrender-ID label in#a3a3a3, ESC to close, white focus ring on the close button.”
Iteration Guide
- 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.
- 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.
- 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.
- Let the video carry the saturation: if the page feels flat, the fix is more/better generated video, not a gradient behind the text.
- 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).
- 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/#171717steps and a hairline border instead. - Darken
#999999for any real text: it fails AA on white. Reserve it for decoration; use#666666where copy must be read. - Strip the adjectives: if you wrote “powerful”, “magical”, or “revolutionary”, cut them. State what it does and let the frames argue.
Drop luma into your project, then ship the actual sections in an afternoon.
npx @webdesignhot/design-md add luma npx agentkit init --design luma