dark · bold · sans · ai · image · cinematic · monochrome

DESIGN.md inspired by Leonardo.Ai

A pure-black cinematic canvas where ufficioDisplay headlines and white full-pill CTAs frame generative imagery — a film studio's title card, Canva-owned.

By webdesignhot · leonardo.ai
$ npx @webdesignhot/design-md add leonardo-ai
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
theme: dark
  • bg #000000
  • bg-alt #0a0a0a
  • surface #111111
  • surface-deep #080808
  • surface-raised #1a1a1a
  • text AAA · 21.0 #ffffff
  • text-strong #ffffff
  • text-body #ededed
  • text-muted #a1a1a1
  • text-soft #cfcfcf
  • text-faint AA·LG · 3.9 #6b6b6b
  • brand AAA · 21.0 #ffffff
  • brand-deep #e5e5e5
  • brand-soft #1a1a1a
  • on-brand #000000
  • accent-violet #8b5cf6
  • accent-violet-soft #1e1633
  • accent-cyan #22d3ee
  • link #ffffff
  • link-hover #cfcfcf
  • link-visited #a1a1a1
  • selected #1a1a1a
  • disabled #2a2a2a
  • neutral-50 #fafafa
  • neutral-100 #ededed
  • neutral-300 #a1a1a1
  • neutral-500 #6b6b6b
  • neutral-700 #2a2a2a
  • neutral-900 #111111
  • border — · 1.3 #1f1f1f
  • border-strong — · 1.5 #2e2e2e
  • border-subtle #141414
  • shadow-ambient rgba(0,0,0,0.5)
  • shadow-deep rgba(0,0,0,0.75)
  • shadow-glow rgba(255,255,255,0.06)
  • success #22c55e
  • success-bg #0b1f12
  • success-text #86efac
  • warning #f59e0b
  • warning-bg #231803
  • warning-text #fcd34d
  • danger #ef4444
  • danger-bg #230b0b
  • danger-text #fca5a5
  • info #22d3ee
  • info-bg #04222a
  • info-text #a5f3fc
Typography
Ship faster than ever.
display-hero ufficioDisplay 80px w700 -0.03em
Ship faster than ever.
display-lg ufficioDisplay 56px w700 -0.02em
Ship faster than ever.
h1 ufficioDisplay 40px w700 -0.018em
Built for teams that ship.
h2 ufficioDisplay 32px w600 -0.012em
A complete kit
h3 ufficioDisplay 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h4 canvaSans 20px w600 0
The quick brown fox jumps over the lazy dog.
body-lg canvaSans 18px w400 0
The quick brown fox jumps over the lazy dog.
body canvaSans 16px w400 0
The quick brown fox jumps over the lazy dog.
button canvaSans 15px w600 0
The quick brown fox jumps over the lazy dog.
nav-link canvaSans 15px w500 0
The quick brown fox jumps over the lazy dog.
body-sm canvaSans 14px w400 0
OUR DESIGN SYSTEM
label canvaSans 13px w500 0
npx @webdesignhot/design-md add stripe
code ui-monospace 13px w400 0
OUR DESIGN SYSTEM
caption canvaSans 12px w500 0.02em
Spacing
  • step-0 0px
  • step-1 4px
  • step-2 8px
  • step-3 12px
  • step-4 16px
  • step-5 24px
  • step-6 32px
  • step-7 48px
  • step-8 64px
  • step-9 96px
  • step-10 128px
Radius
  • micro 2px
  • sm 4px
  • md 8px
  • lg 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-violet
  • muted text-muted
  • border border
  • ring border-strong
Lineage & influences

Leonardo.Ai's marketing surface belongs to the cinematic-dark AI register pioneered by Runway and shared with Midjourney — but where Midjourney sits at a cosmic navy-violet and Runway leans editorial, Leonardo commits to **pure black** (`#000000`) as a film studio's title card. The canvas is the void; generative imagery — images, art, video — supplies every colour. Headlines run in **ufficioDisplay**, a confident display sans with a faintly condensed, slightly cinematic cut, set in weights 500–700 with tight negative tracking so titles read like a film logotype. Body copy is **canvaSans**, the humanist workhorse Leonardo inherited when **Canva acquired the company in 2024** — the same family that anchors Canva's own product, which quietly signals the parent brand without a co-logo. The defining interactive move is the **white full-pill CTA**: `Log in` and `Sign up` render as `#ffffff` capsules with `#000000` text and a 9999 radius, the single brightest object on the page and a direct nod to the white-pill convention Apple, Vercel, and Canva all use to mark the one action that matters. Everything else stays monochrome — white text, grey metadata, hairline borders on black — so the chrome never competes with the work it frames.

  • Parent company since 2024; canvaSans body family and white-pill CTA convention inherited directly.
  • Cinematic-dark generative-video register — black canvas, imagery-as-colour, film-studio restraint.
  • Dark-canvas image-AI marketing rhythm; imagery carries colour while chrome stays neutral.
  • Pure-black canvas with white high-contrast CTA and hairline borders — the monochrome dark register.
  • White full-pill primary action on dark product pages; the brightest-object-is-the-CTA discipline.
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: Leonardo.Ai
tagline: A pure-black cinematic canvas where ufficioDisplay headlines and white full-pill CTAs frame generative imagery — a film studio's title card, Canva-owned.
updated_at: 2026-05-29T00:00:00.000Z
published_at: 2026-05-28T23:11:29.264Z
author: webdesignhot
source_url: https://leonardo.ai
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [ai, media]
tags: [dark, bold, sans, ai, image, cinematic, monochrome]
preview_swatch: ['#000000', '#ffffff', '#8b5cf6']
related: [midjourney]
description: 'Leonardo.Ai''s site is a film studio''s title card. The canvas is pure black `#000000`, headlines are typeset in ufficioDisplay — a confident, slightly condensed display sans — and body copy runs in canvaSans, the humanist workhorse Leonardo inherited when Canva acquired it. The signature interactive element is the white full-pill CTA (`Log in`, `Sign up`): a high-contrast capsule of `#ffffff` on black with `#000000` text, the brightest object on a deliberately cinematic-dark page. Generative imagery — images, art, video — supplies all the colour; the chrome stays monochrome so the work never competes with the frame.'


# 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-violet
  muted: text-muted
  border: border
  ring: border-strong

themes:
  default: dark
  available: [dark]
  switch-via: 'Single dark register only. The pure-black cinematic ground is the brand; there is no light variant. White is the brand interactive colour, violet a single accent note for generative pulses.'

colors:
  dark:
    bg: '#000000'                   # pure-black cinematic ground
    bg-alt: '#0a0a0a'               # barely-lifted secondary band
    surface: '#111111'             # raised card / panel
    surface-deep: '#080808'        # inset zone, near-black
    surface-raised: '#1a1a1a'      # hover-raised card
    text: '#ffffff'                # display white on black
    text-strong: '#ffffff'
    text-body: '#ededed'           # near-white body on black
    text-muted: '#a1a1a1'          # captions, metadata
    text-soft: '#cfcfcf'
    text-faint: '#6b6b6b'          # disabled / placeholder
    brand: '#ffffff'               # white — the CTA pill, the interactive colour
    brand-deep: '#e5e5e5'          # pressed white
    brand-soft: '#1a1a1a'          # dark fill behind ghost brand controls
    on-brand: '#000000'            # black text on the white pill
    accent-violet: '#8b5cf6'       # single generative accent (status, pulses)
    accent-violet-soft: '#1e1633'  # tinted violet panel
    accent-cyan: '#22d3ee'         # rare status indicator
    link: '#ffffff'                # links are white, underline-on-hover
    link-hover: '#cfcfcf'
    link-visited: '#a1a1a1'
    selected: '#1a1a1a'            # selected list-item background
    disabled: '#2a2a2a'            # disabled control fill
    neutral-50: '#fafafa'
    neutral-100: '#ededed'
    neutral-300: '#a1a1a1'
    neutral-500: '#6b6b6b'
    neutral-700: '#2a2a2a'
    neutral-900: '#111111'
    border: '#1f1f1f'              # hairline divider on black
    border-strong: '#2e2e2e'       # visible divider
    border-subtle: '#141414'       # whisper-line
    shadow-ambient: 'rgba(0,0,0,0.5)'
    shadow-deep: 'rgba(0,0,0,0.75)'
    shadow-glow: 'rgba(255,255,255,0.06)'
    success: '#22c55e'
    success-bg: '#0b1f12'
    success-text: '#86efac'
    warning: '#f59e0b'
    warning-bg: '#231803'
    warning-text: '#fcd34d'
    danger: '#ef4444'
    danger-bg: '#230b0b'
    danger-text: '#fca5a5'
    info: '#22d3ee'
    info-bg: '#04222a'
    info-text: '#a5f3fc'

typography:
  display:
    family: 'ufficioDisplay, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif'
    weights: [500, 600, 700]
  body:
    family: 'canvaSans, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif'
    weights: [400, 500, 600]
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 80, weight: 700, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-lg:      { size: 56, weight: 700, lineHeight: 1.05, tracking: '-0.02em',  family: display }
    h1:              { size: 40, weight: 700, lineHeight: 1.1,  tracking: '-0.018em', family: display }
    h2:              { size: 32, weight: 600, lineHeight: 1.2,  tracking: '-0.012em', family: display }
    h3:              { size: 24, weight: 600, lineHeight: 1.25, tracking: '-0.005em', family: display }
    h4:              { size: 20, weight: 600, lineHeight: 1.3,  tracking: '0',        family: body }
    body-lg:         { size: 18, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body:            { size: 16, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body-sm:         { 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 }
    button:          { size: 15, weight: 600, lineHeight: 1.0,  tracking: '0',        family: body }
    nav-link:        { size: 15, weight: 500, lineHeight: 1.0,  tracking: '0',        family: body }
    code:            { size: 13, weight: 400, lineHeight: 1.5,  tracking: '0',        family: mono }

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

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

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

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

shadows:
  ambient: 'rgba(0,0,0,0.5) 0 1px 2px'
  standard: 'rgba(0,0,0,0.6) 0 8px 24px'
  elevated: 'rgba(0,0,0,0.7) 0 24px 48px -16px'
  deep: 'rgba(0,0,0,0.8) 0 36px 72px -24px'
  ring: '0 0 0 2px #ffffff'
  glow: '0 0 32px rgba(255,255,255,0.10)'

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 — transitions degrade to opacity-only fades; no transforms or parallax'

accessibility:
  contrast-text-on-bg: 21.0          # white on #000000, AAA (maximum)
  contrast-text-on-brand: 21.0       # black on #ffffff pill, AAA (maximum)
  contrast-body-on-surface: 17.4     # #ededed on #111111, AAA
  contrast-muted-on-bg: 8.9          # #a1a1a1 on #000000, AAA
  focus-ring: '2px solid #ffffff with 2px offset'
  focus-ring-offset-color: '#000000'
  reduced-motion-honored: true
  keyboard-nav: 'standard tab order; ESC closes modals; arrow keys traverse generation grid'

components:
  button-primary:
    bg: '#ffffff'
    text: '#000000'
    border: 'none'
    radius: 9999
    padding: '12px 24px'
    font: 'canvaSans 15/1.0 weight 600'
    hover: 'bg #ededed'
    active: 'bg #e5e5e5'
    focus: '2px ring #ffffff + 2px offset'
  button-ghost:
    bg: 'transparent'
    text: '#ffffff'
    border: '1px solid #2e2e2e'
    radius: 9999
    padding: '12px 24px'
    font: 'canvaSans 15/1.0 weight 500'
    hover: 'border #ffffff66, bg #ffffff0a'
    active: 'bg #ffffff14'
  button-secondary:
    bg: '#1a1a1a'
    text: '#ffffff'
    border: 'none'
    radius: 9999
    padding: '12px 24px'
    font: 'canvaSans 15/1.0 weight 600'
    hover: 'bg #2a2a2a'
    active: 'bg #111111'
  button-danger:
    bg: '#ef4444'
    text: '#ffffff'
    border: 'none'
    radius: 9999
    padding: '12px 24px'
    font: 'canvaSans 15/1.0 weight 600'
    hover: 'bg #f87171'
    active: 'bg #dc2626'
  card:
    bg: '#111111'
    border: '1px solid #1f1f1f'
    radius: 12
    padding: '24px'
    shadow: 'ambient'
    hover: 'shadow standard, border #2e2e2e'
  input:
    bg: '#0a0a0a'
    text: '#ffffff'
    placeholder: '#6b6b6b'
    border: '1px solid #2e2e2e'
    radius: 8
    padding: '10px 14px'
    font: 'canvaSans 16/1.55 weight 400'
    focus: 'border #ffffff, ring 2px #ffffff'
  badge:
    bg: '#1a1a1a'
    text: '#ededed'
    border: '1px solid #2e2e2e'
    radius: 9999
    padding: '4px 12px'
    font: 'canvaSans 12/1.4 weight 500 tracking 0.02em'

lineage:
  summary: |
    Leonardo.Ai's marketing surface belongs to the cinematic-dark AI
    register pioneered by Runway and shared with Midjourney — but where
    Midjourney sits at a cosmic navy-violet and Runway leans editorial,
    Leonardo commits to **pure black** (`#000000`) as a film studio's
    title card. The canvas is the void; generative imagery — images,
    art, video — supplies every colour. Headlines run in **ufficioDisplay**,
    a confident display sans with a faintly condensed, slightly
    cinematic cut, set in weights 500–700 with tight negative tracking
    so titles read like a film logotype. Body copy is **canvaSans**, the
    humanist workhorse Leonardo inherited when **Canva acquired the
    company in 2024** — the same family that anchors Canva's own
    product, which quietly signals the parent brand without a co-logo.
    The defining interactive move is the **white full-pill CTA**: `Log in`
    and `Sign up` render as `#ffffff` capsules with `#000000` text and a
    9999 radius, the single brightest object on the page and a direct
    nod to the white-pill convention Apple, Vercel, and Canva all use to
    mark the one action that matters. Everything else stays monochrome —
    white text, grey metadata, hairline borders on black — so the chrome
    never competes with the work it frames.
  influences:
    - name: Canva
      role: Parent company since 2024; canvaSans body family and white-pill CTA convention inherited directly.
      url: https://www.canva.com
    - name: Runway
      role: Cinematic-dark generative-video register — black canvas, imagery-as-colour, film-studio restraint.
      url: https://runwayml.com
    - name: Midjourney
      role: Dark-canvas image-AI marketing rhythm; imagery carries colour while chrome stays neutral.
      url: https://www.midjourney.com
    - name: Vercel
      role: Pure-black canvas with white high-contrast CTA and hairline borders — the monochrome dark register.
      url: https://vercel.com
    - name: Apple
      role: White full-pill primary action on dark product pages; the brightest-object-is-the-CTA discipline.
      url: https://www.apple.com

dark-mode: native        # Leonardo is dark-by-default; the pure-black ground is the brand
---

## 1. Visual Theme & Atmosphere

Leonardo.Ai's marketing surface is a film studio's title card. The canvas drops to pure black `#000000` — not a soft charcoal, not a tinted navy, but the absolute void — and the wordmark and headlines sit on it in **ufficioDisplay**, a display sans with a faintly condensed, cinematic cut. Set in weights 500–700 with tight negative tracking, the titles read less like SaaS marketing and more like a film logotype rolling up on a black screen. The page opens like a cold open: black, then a single bright line of white.

The atmosphere is deliberately cinematic-dark. This is the register Runway pioneered and Midjourney shares, but Leonardo commits harder to the void than either — there is no cosmic violet undertone, no editorial off-white panel, just black and the work that floats on it. Generative outputs — images, concept art, video frames — are the only colour on the page. The chrome refuses to compete: text is paper-white, metadata greys down, dividers are hairlines barely a shade off black. The product's entire colour argument is *we make the colour, the frame stays out of the way*.

Body copy switches register to **canvaSans**, a humanist workhorse with open counters and a warm, legible rhythm. This is not a neutral choice: Leonardo was acquired by Canva in 2024, and canvaSans is the same family that anchors Canva's own product. Using it here is a quiet inheritance signal — no co-logo, no "a Canva company" badge in the hero, just the typography carrying the lineage for anyone who recognises it. The duet of a cinematic display face over a friendly humanist body keeps the page from feeling cold despite the black.

The defining interactive element is the **white full-pill CTA**. `Log in` and `Sign up` render as `#ffffff` capsules with `#000000` text and a 9999-radius — the single brightest object on the entire surface. On a pure-black page, a white pill is unmissable; it pulls the eye the way a lit doorway pulls it in a dark room. This is the white-pill convention shared by Apple, Vercel, and Canva itself: the brightest object is the one action that matters. Everything secondary stays ghost — transparent with a hairline border — so the hierarchy is unambiguous.

The sensory metaphor is a darkened screening room: lights down, attention forward, a single bright control to start the show. Cards rise from the black as barely-lifted panels (`#111111`). Accent colour, when it appears at all, is a single violet note (`#8b5cf6`) used for generative status pulses — never a gradient, never a marketing flare. The void does the heavy lifting.

**Key Characteristics**

- Pure-black canvas (`#000000`) — the absolute void, no tint, no charcoal softening
- ufficioDisplay headlines in weights 500–700 with tight negative tracking — film-logotype cadence
- canvaSans body — Canva-inherited humanist sans, the quiet parent-brand signal
- White full-pill CTA (`#ffffff` on black, black text, 9999 radius) as the brightest object on the page
- Imagery-as-colour: generative outputs supply all hue; chrome stays monochrome
- Ghost secondary buttons (transparent + hairline) keep CTA hierarchy unambiguous
- Single violet accent note (`#8b5cf6`) for generative status — never blended, never a gradient
- Hairline borders on black (`#1f1f1f`) instead of cast shadows for separation
- Cinematic-dark register shared with Runway and Midjourney, committed harder to true black
- Spacious vertical rhythm; screening-room calm over SaaS density

## 2. Color Palette & Roles

### Canvas (Primary)

- **bg** (`#000000`) [→ `body` background]: page ground; pure-black cinematic void, the brand's defining surface
- **bg-alt** (`#0a0a0a`): barely-lifted secondary band for alternating sections
- **text** (`#ffffff`) [→ `h1` color]: pure-white display copy, the brightest text tier
- **text-body** (`#ededed`): near-white body copy on black for long-form reading comfort

### Brand

- **brand** (`#ffffff`): white — the interactive colour; the CTA pill, focus rings, primary action fills
- **brand-deep** (`#e5e5e5`): pressed/active white on the pill
- **brand-soft** (`#1a1a1a`): dark neutral fill behind ghost-brand controls
- **on-brand** (`#000000`) [→ CTA `color`]: black text on the white pill — maximum contrast

### Accent (single-note)

- **accent-violet** (`#8b5cf6`): the one generative accent — status pulses, render-progress, active markers
- **accent-violet-soft** (`#1e1633`): tinted-violet panel behind violet status zones
- **accent-cyan** (`#22d3ee`): rare secondary status indicator (info/live)

### Interactive

- **link** (`#ffffff`): default link colour; underline appears on hover, not at rest
- **link-hover** (`#cfcfcf`): dimmed white on hover
- **link-visited** (`#a1a1a1`): greyed visited state
- **selected** (`#1a1a1a`): selected list-item / active tab background
- **disabled** (`#2a2a2a`): disabled control fill

### Neutral Scale

- **neutral-50** (`#fafafa`): brightest highlight, rare light-on-light press zone
- **neutral-100** (`#ededed`): body-tier near-white
- **neutral-300** (`#a1a1a1`): muted captions and metadata
- **neutral-500** (`#6b6b6b`): faint text, placeholders
- **neutral-700** (`#2a2a2a`): disabled fills, deep dividers
- **neutral-900** (`#111111`): raised card surface

### Surface

- **surface** (`#111111`): raised card / panel surface on the black ground
- **surface-deep** (`#080808`): inset zones, near-black wells
- **surface-raised** (`#1a1a1a`): hover-raised card / elevated panel

### Borders

- **border** (`#1f1f1f`): default hairline divider on black
- **border-strong** (`#2e2e2e`): visible divider / input border
- **border-subtle** (`#141414`): whisper-line, barely-there separation

### Shadow Colors

- **shadow-ambient** (`rgba(0,0,0,0.5)`): base resting-card shadow
- **shadow-deep** (`rgba(0,0,0,0.75)`): modal / lightbox elevation
- **shadow-glow** (`rgba(255,255,255,0.06)`): faint white halo on focused interactive elements

### Semantic

- **success** (`#22c55e`) on **success-bg** (`#0b1f12`) with **success-text** (`#86efac`)
- **warning** (`#f59e0b`) on **warning-bg** (`#231803`) with **warning-text** (`#fcd34d`)
- **danger** (`#ef4444`) on **danger-bg** (`#230b0b`) with **danger-text** (`#fca5a5`)
- **info** (`#22d3ee`) on **info-bg** (`#04222a`) with **info-text** (`#a5f3fc`)

## 3. Typography Rules

### Font Family

- **Display & Headline**: `ufficioDisplay, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif` — weights 500, 600, 700. A confident, faintly condensed display sans used for the wordmark and all headlines with tight negative tracking for a film-logotype cadence.
- **Body**: `canvaSans, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif` — weights 400, 500, 600. The humanist family inherited from Canva; carries all prose, labels, and UI copy.
- **Mono companion**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace` — weights 400, 500. Used only for the rare code snippet, prompt token, or seed value.
- **OpenType**: default ligatures on in body; tight kerning enabled on ufficioDisplay headlines; tabular figures (`tnum`) for any numeric column in product UI.

### Hierarchy

| Role         | Font    | Size | Weight | Line H | Tracking  | Notes |
|--------------|---------|------|--------|--------|-----------|-------|
| display-hero | display | 80   | 700    | 1.00   | -0.03em   | landing hero; film-logotype scale |
| display-lg   | display | 56   | 700    | 1.05   | -0.02em   | section openers |
| h1           | display | 40   | 700    | 1.10   | -0.018em  | page title |
| h2           | display | 32   | 600    | 1.20   | -0.012em  | feature heads |
| h3           | display | 24   | 600    | 1.25   | -0.005em  | sub-section heads |
| h4           | body    | 20   | 600    | 1.30   | 0         | switches to canvaSans |
| body-lg      | body    | 18   | 400    | 1.55   | 0         | hero supporting copy |
| body         | body    | 16   | 400    | 1.55   | 0         | default body |
| body-sm      | body    | 14   | 400    | 1.50   | 0         | secondary copy |
| label        | body    | 13   | 500    | 1.40   | 0         | form labels, ui meta |
| caption      | body    | 12   | 500    | 1.40   | 0.02em    | image captions, metadata |
| button       | body    | 15   | 600    | 1.00   | 0         | CTA pill label |
| nav-link     | body    | 15   | 500    | 1.00   | 0         | top nav links |
| code         | mono    | 13   | 400    | 1.50   | 0         | prompt tokens, seeds |
| badge        | body    | 12   | 500    | 1.40   | 0.02em    | pill chips, version tags |

### Principles

- **Display for titles, body for everything else**: ufficioDisplay carries only the wordmark and h1–h3 headlines. Once you drop to h4 and below, canvaSans takes over — the cinematic face never appears in prose.
- **Negative tracking is the display signature**: headlines tighten from `-0.005em` at h3 to `-0.03em` at the hero. The tightening is what gives titles their film-logotype density; never set ufficioDisplay loose.
- **canvaSans stays neutral-tracked**: body copy runs at 0 tracking. Only captions and badges gain a slight `0.02em` for small-size legibility.
- **Weight discipline**: 700 is reserved for hero and h1–h2; 600 carries h3–h4, buttons, and secondary fills; 500 handles labels, nav, and badges; 400 is the body default. There is no 800/900 — the brand never shouts past 700.
- **Line-height inverts with size**: hero copy runs near 1.0 (titles are objects, not paragraphs); body opens to 1.55 for reading comfort. The gap is intentional.
- **Two families, no third**: ufficioDisplay and canvaSans only. No serif, no mono in marketing copy, no decorative face. Mono appears only inside product chrome for technical values.
- **Size ceiling is the hero at 80**: the brand will reach a full 80px on the landing hero — larger than Midjourney's restraint — because the cinematic register rewards a big, confident title against black.

## 4. Component Stylings

### Buttons

**button-primary** — the white full-pill CTA (the signature)
- Background: `#ffffff`
- Text: `#000000`, canvaSans 15/1.0, weight 600
- Padding: `12px 24px`
- Radius: `9999` (full pill)
- Border: none
- Hover: bg dims to `#ededed`
- Active: bg drops to `#e5e5e5`
- Focus: 2px ring `#ffffff` with 2px offset on the black ground
- Use: `Log in`, `Sign up`, `Start creating` — the single most important action per view

**button-ghost** — the dark-mode quiet button
- Background: transparent
- Text: `#ffffff`, canvaSans 15/1.0, weight 500
- Border: `1px solid #2e2e2e`
- Radius: `9999` (full pill, matches primary)
- Padding: `12px 24px`
- Hover: border lifts to `#ffffff66`, bg `#ffffff0a`
- Active: bg `#ffffff14`
- Use: secondary actions ("Explore", "View gallery"), nav-adjacent buttons

**button-secondary** — the dark-fill alternative
- Background: `#1a1a1a`
- Text: `#ffffff`, canvaSans 15/1.0, weight 600
- Radius: `9999`
- Padding: `12px 24px`
- Hover: bg lifts to `#2a2a2a`
- Active: bg drops to `#111111`
- Use: in-app secondary primaries where a white pill would over-shout

**button-danger** — the destructive
- Background: `#ef4444`
- Text: `#ffffff`, canvaSans 15/1.0, weight 600
- Radius: `9999`
- Hover: bg `#f87171`
- Active: bg `#dc2626`
- Use: "Delete generation", "Cancel subscription"

### Cards

**Generation card** (gallery / feed):
- Background: `#111111`
- Border: `1px solid #1f1f1f`
- Radius: `12px`
- Padding: `24px` (or 0 when the image is full-bleed inside the card)
- Shadow: ambient `rgba(0,0,0,0.5) 0 1px 2px`
- Hover: shadow lifts to standard, border brightens to `#2e2e2e`, image scales 1.02

**Feature card** (marketing):
- Background: `#0a0a0a`
- Border: `1px solid #1f1f1f`
- Radius: `16px`
- Padding: `32px`
- Hover: border `#2e2e2e`, no transform

### Badges / Tags / Pills

- Background: `#1a1a1a`
- Text: `#ededed`, canvaSans 12/1.4, weight 500, tracking 0.02em
- Border: `1px solid #2e2e2e`
- Radius: `9999` (pill)
- Padding: `4px 12px`
- Use: model version tags ("Phoenix", "PhotoReal"), feature labels, "New"

### Inputs / Forms

**Text input**:
- Background: `#0a0a0a`
- Text: `#ffffff`, canvaSans 16/1.55, weight 400
- Placeholder: `#6b6b6b`
- Border: `1px solid #2e2e2e`
- Radius: `8px`
- Padding: `10px 14px`
- Focus: border `#ffffff`, ring 2px `#ffffff`

**Prompt composer** (product chrome):
- Background: `#0a0a0a`
- Border: `1px solid #2e2e2e`
- Radius: `12px`
- Padding: `12px 16px`
- Generate button: white pill, hard-right, `#ffffff` on `#000000`

### Navigation

- Top bar: 64px, transparent over the black ground, no border at rest; a `#1f1f1f` hairline appears on scroll
- Wordmark: hard-left, ufficioDisplay 20/1.0 weight 700, white, tight tracking
- Link list: center or hard-right, canvaSans 15/1.0 weight 500, gap 24px, white at `0.9` opacity
- Hover: opacity to `1.0`
- Auth cluster: hard-right — ghost `Log in` next to a white-pill `Sign up`
- Mobile: hamburger collapses into a full-bleed black sheet (`#000000`)

### Decorative

- **Hairline divider**: `1px solid #1f1f1f` between sections; the primary separation device
- **Violet status dot**: 8px circle at `#8b5cf6` marking active generations / render pulses
- **Image frames**: 12px radius wrapping generated outputs in cards; full-bleed (0 radius) in hero

## 5. Layout Principles

### Spacing System

Base unit is 4px. Scale: `0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128`. Section padding lands at 64 or 96 (128 for the hero band); component gap lands at 16 or 24; card padding at 24 or 32. The density is restrained — the black void wants room to breathe, and crowding it kills the cinematic calm.

### Grid & Container

- Page max width: **1280px**, centered
- Prose max width: **720px**
- Hero takes full bleed; copy lives in a centered or left-floated column
- Feature grids: 12-column, 24px gutters
- Generation gallery: masonry or fixed grid, 16px gutters, columns adapt 2/3/4 across breakpoints

### Whitespace Philosophy

Section padding is generous (`64–96px` vertical between bands; 128 around the hero). The black ground reads as negative space by default, so whitespace and canvas are the same colour — separation comes from rhythm and hairlines, not contrast. Headlines get 24–32px of breathing room above sub-copy.

### Section Cadence

Pages alternate between full-black bands (`#000000`) and barely-lifted panels (`#0a0a0a`) — a difference so subtle it reads as a tonal shift rather than a hard band. Generation showcases break out full-width with imagery supplying the only colour. The rhythm is black-black-(showcase)-black; light press zones do not exist.

## 6. Shapes & Radius Scale

| Tier        | px    | Use |
|-------------|-------|-----|
| Micro       | 2     | inline code, tiny chips |
| Standard    | 4     | small controls, checkboxes |
| Comfortable | 8     | inputs, secondary controls |
| Relaxed     | 12    | cards, generation tiles, composer |
| Featured    | 16    | feature cards, hero panels |
| Pill        | 9999  | all buttons, badges, avatars |

The shape language is rounded and friendly — inherited from Canva's softer geometry — but the buttons go all the way to full-pill (9999), which is the dominant shape memory of the brand. Cards stay at a moderate 12px. No compound radii.

## 7. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| 0 | Flat, no shadow | bg, full-bleed sections |
| 1 | Tonal step (`#0a0a0a` / `#111111` panel on `#000000`) | inset zones, cards at rest |
| 2 | Hairline border `#1f1f1f` | card separation on black |
| 3 | `ambient` shadow `rgba(0,0,0,0.5) 0 1px 2px` | resting raised cards |
| 4 | `standard` shadow `rgba(0,0,0,0.6) 0 8px 24px` | hover-raised cards |
| 5 | `deep` `rgba(0,0,0,0.8) 0 36px 72px -24px` | modals, lightbox |

### Shadow Philosophy

On a pure-black canvas, cast shadows are nearly invisible — black-on-black has nothing to darken. So Leonardo separates surfaces primarily through **hairline borders** (`#1f1f1f`, `#2e2e2e`) and **tonal lifts** (`#000000` → `#0a0a0a` → `#111111` → `#1a1a1a`), reserving shadows for genuine overlay elements (modals, dropdowns, lightboxes) where the layer floats above content rather than sitting inline. When a focused interactive element needs to read as "live," a faint white glow (`rgba(255,255,255,0.06)`) does what a shadow cannot on black. The depth model is *borders and tonal steps first, shadows only for true overlays*.

## 8. Interaction & Motion

### Easing

- `ease-standard` `cubic-bezier(0.4, 0, 0.2, 1)` — default for hover/focus
- `ease-emphasized` `cubic-bezier(0.2, 0, 0, 1)` — entrance and reveal
- `ease-out` `cubic-bezier(0, 0, 0.2, 1)` — exits
- `ease-in` `cubic-bezier(0.4, 0, 1, 1)` — rare; quick dismissals

### Durations

- `duration-fast` **150ms** — micro hover lifts, focus rings, button state shifts
- `duration-standard` **240ms** — card hovers, dropdown open
- `duration-slow` **320ms** — panel reveals, modal open, image scale
- `duration-page` **480ms** — hero loads, section fades

### Per-Component Micro-States

- **White-pill hover**: bg dims `#ffffff` → `#ededed` over 150ms `ease-standard`; no transform — the pill stays planted, it just cools slightly
- **Ghost button hover**: border brightens to `#ffffff66` and a faint `#ffffff0a` fill washes in over 150ms
- **Card hover**: shadow intensifies from `ambient` to `standard` over 240ms, border lifts to `#2e2e2e`, contained image scales 1.02 over 320ms `ease-emphasized`
- **Link hover**: underline draws in over 150ms; colour cools `#ffffff` → `#cfcfcf`
- **Generation reveal**: new outputs crossfade in over 320ms with a 40ms stagger across the grid; a violet status dot pulses while rendering
- **Modal open**: 320ms `ease-emphasized` scale-95→100 with opacity 0→1; backdrop fades to `rgba(0,0,0,0.75)` over 240ms

### Page Transitions

Section reveals use `IntersectionObserver` to fade-up content over 480ms `ease-emphasized` with 8px transform-y. The hero is largely static — the cinematic gravity comes from contrast and scale, not parallax — though generated showcase imagery may slowly crossfade.

### Reduced Motion

Respects `prefers-reduced-motion: reduce`. All transforms (scale, translate, parallax) are dropped; transitions degrade to opacity-only fades capped at 200ms. The render-progress violet pulse is reduced to a static dot. Focus rings still animate (functional, not decorative).

## 9. Accessibility & A11y

### Contrast Pairs

- White (`#ffffff`) on `#000000` bg: **21.0:1** — AAA (the maximum possible ratio)
- Black (`#000000`) on `#ffffff` pill: **21.0:1** — AAA (maximum; the CTA is the most legible element on the page)
- `#ededed` body on `#111111` card: **17.4:1** — AAA
- `#a1a1a1` muted on `#000000` bg: **8.9:1** — AAA
- `#8b5cf6` violet accent on `#000000` bg: **4.6:1** — AA (large text / non-text indicators only; pair with white text when used as a fill)

### Focus Indicators

- 2px solid `#ffffff` ring with 2px offset
- Offset color matches surface (`#000000` on ground, `#111111` on cards)
- Never removed — `:focus-visible` only suppresses the ring for mouse pointer interaction

### ARIA Patterns

- **Combobox**: prompt input uses `role="combobox"` with `aria-expanded`, `aria-controls`, `aria-activedescendant`
- **Listbox**: model selector ("Phoenix", "PhotoReal") uses `role="listbox"` with `role="option"` children
- **Dialog**: generation lightbox uses `role="dialog"` `aria-modal="true"` with `aria-labelledby` pointing to the prompt/title
- **Status**: render progress uses `role="status"` with `aria-live="polite"`

### Keyboard Navigation

- Tab order follows visual order strictly; the white-pill CTA is an early, prominent tab stop
- ESC closes lightbox, modal, dropdown
- Arrow keys traverse the generation grid and model selector
- Enter activates the focused generation; Space toggles select
- `/` shortcut focuses the prompt composer

### Screen Reader Hints

- All generated images carry `alt` derived from prompt text
- Decorative hairlines and violet status dots use `aria-hidden="true"`
- Icon-only buttons (download, upscale, variation) require `aria-label`
- The white-pill CTA uses visible text (no aria-label override needed)

### Reduced Motion

All decorative motion (scale, translate, render pulse, crossfade) is disabled under `prefers-reduced-motion: reduce`. Functional motion (focus, modal-open) is retained but capped at 200ms opacity-only.

## 10. Responsive Behavior

| Breakpoint | px        | Behavior |
|------------|-----------|----------|
| mobile     | 0–639     | single-column, stacked nav (hamburger), 16px gutters |
| tablet     | 640–1023  | 2-column gallery, condensed top bar |
| desktop    | 1024–1279 | 3-column gallery, full nav |
| wide       | 1280+     | 4-column grid, 1280 max width |

### Touch Targets

Minimum 44×44px for all interactive elements on mobile. The white pill grows its vertical padding so it never drops below 44px tall. Tag chips remain 28px tall but gain 12px tap padding.

### Collapsing Strategy

- **Nav**: full-link list + auth cluster above 1024; hamburger sheet (full-bleed black) below
- **Gallery**: 4→3→2→1 columns at 1280/1024/640
- **Hero copy**: centered/left-floated column → top-stacked full-width below 1024; hero type scales 80→56→40
- **Cards**: padding shrinks 24→16 below 640

### Image Behavior

Generated outputs are served at native aspect ratios; the gallery grid never crops mid-image. `loading="lazy"` on all below-the-fold imagery. `srcset` provides 1x/2x/3x for retina. Hero showcase imagery may use `<picture>` with art-directed crops per breakpoint.

### Container Queries

Generation cards use `@container` queries to adapt action visibility — under 240px wide, the action row (download / upscale / variation) collapses to a single overflow menu; under 180px, only the image and a select checkbox remain.

## 11. Content & Voice

### Tone

Confident, creative, and accessible — Leonardo speaks to creators, not engineers. The voice is warmer than Midjourney's research-paper restraint (the Canva inheritance shows) but stays clean of hype: "Create production-quality visual assets" rather than "Unleash unlimited creativity!" It treats the user as a maker with a job to do.

### Microcopy Patterns

- **Buttons**: "Log in", "Sign up", "Start creating", "Generate", "Upscale" — verbs are direct imperatives or simple nouns
- **Errors**: "Generation failed. Try again." — plain, no blame, no "Oops!"
- **Success**: "Saved to your library." — confirmation with destination, no exclamation
- **Loading**: "Generating…" — present participle with ellipsis; a violet dot pulses

### Empty States

- Library empty: "Nothing here yet. Create your first image." — invitation, not apology
- Search empty: "No results. Try a different prompt." — recovery suggestion
- Error empty: "Couldn't load. Refresh to retry." — present-tense fix

### CTA Verb Conventions

- "Sign up" (not "Get started free", not "Try it now")
- "Log in" (not "Sign in" — Leonardo says log in)
- "Start creating" (not "Launch app")
- "Generate" (not "Create" inside the composer — generate is the product verb)
- "Upgrade" for plan changes (the one place an aspirational verb is allowed)

The voice's signature is **approachable confidence**: no exclamation spam, no second-person hype stacking, but warmer and more inviting than the colder research-lab register of its peers. The product is a creative tool, and the copy treats it like one.

## 12. Dark Mode & Theming

Leonardo is **dark-by-default and dark-only**. The pure-black ground (`#000000`) is the brand — a light variant would dissolve the cinematic screening-room metaphor entirely, and there is no `prefers-color-scheme: light` override.

White is the *interactive* colour, not a theme: it appears as the CTA pill, focus rings, and primary text, always against black. The single violet accent (`#8b5cf6`) is theme-invariant — it marks generative status in the same hue regardless of context.

There is no light register, not even an editorial one. Where Midjourney occasionally flips a press essay to warm paper, Leonardo never breaks the black. The void is total, and that totality is the point: the work is the colour, the canvas is the dark.

## 13. Lineage & Influences

Leonardo.Ai's surface belongs to the **cinematic-dark AI register** that Runway pioneered for generative video and that Midjourney shares for image generation — a black or near-black canvas where the generated work is the only colour and the chrome stays out of the way. Leonardo commits harder to true black than either peer: where Midjourney sits at a cosmic navy-violet `#06051d` and Runway leans editorial, Leonardo drops all the way to `#000000`, treating the page like a film studio's title card. Headlines in **ufficioDisplay** with tight negative tracking read like a logotype rolling up on a dark screen; the big 80px hero scale (larger than Midjourney's deliberate restraint) is pure cinematic confidence.

The second, quieter inheritance is **Canva**, which acquired Leonardo in 2024. The body face is **canvaSans** — the same humanist family that anchors Canva's own product — and the **white full-pill CTA** is the Canva (and Apple, and Vercel) convention of making the single brightest object the one action that matters. There is no co-logo in the hero; the typography and the pill carry the lineage for anyone who recognises them. What Leonardo rejects is the loud SaaS gradient hero (it has no gradient at all), the multi-accent palette (one violet note, used sparingly), and any light theme (the void is total). The result is a surface that feels like a darkened screening room with one lit doorway — and the doorway is white.

**Named influences:**

- Canva — `https://www.canva.com` — parent company (2024); canvaSans body, white-pill CTA convention
- Runway — `https://runwayml.com` — cinematic-dark generative register, imagery-as-colour
- Midjourney — `https://www.midjourney.com` — dark-canvas image-AI marketing rhythm
- Vercel — `https://vercel.com` — pure-black canvas, white high-contrast CTA, hairline borders
- Apple — `https://www.apple.com` — white full-pill primary action on dark product pages

## 14. Do's and Don'ts

### Do

- Keep the canvas at pure `#000000` — the absolute void is the brand; don't soften it to charcoal
- Render the primary CTA as a white full-pill (`#ffffff` bg, `#000000` text, 9999 radius) — the brightest object on the page
- Typeset headlines in ufficioDisplay with tight negative tracking (`-0.005em` to `-0.03em`) for the film-logotype cadence
- Carry all prose, labels, and UI copy in canvaSans — the Canva-inherited body face
- Let generative imagery supply all the colour; keep the chrome monochrome
- Separate surfaces with hairline borders (`#1f1f1f`) and tonal lifts before reaching for shadows
- Match secondary buttons to the pill shape (9999) as ghost (transparent + hairline) so hierarchy stays clear
- Reserve the violet accent (`#8b5cf6`) for a single role — generative status / render pulses
- Scale the hero big (up to 80px) — the cinematic register rewards a confident title against black
- Reserve shadows for true overlays (modals, lightboxes) where they actually read
- Keep section padding generous (64–96px, 128 around the hero); the void needs room
- Use the warmer, creator-friendly voice — confident but never hype-stacked

### Don't

- Tint the black to navy or charcoal — `#000000` exact is the cinematic commitment
- Give the white pill a coloured or gradient fill — its power is that it's pure white
- Set ufficioDisplay loose — without the negative tracking it loses its logotype density
- Use ufficioDisplay for body copy — it stops at h3; canvaSans carries everything below
- Add a second accent alongside violet — one note only, and used sparingly
- Apply cast shadows for card separation on black — they're invisible; use borders and tonal steps
- Introduce a gradient hero — Leonardo has no gradient; the contrast is the drama
- Offer a light theme — the void is total and there is no light register
- Stack exclamation marks or second-person hype — the voice is warm, not loud
- Crop generated images mid-frame in the gallery — respect native aspect ratios
- Drop the white-pill CTA below 44px tall on mobile — it must stay tappable
- Mix the ghost and primary pills at the same visual weight — only one white pill per view

## 15. Agent Prompt Guide

### Quick Color Reference

```
bg:            #000000   (pure-black cinematic void)
text:          #ffffff   (display white)
text-body:     #ededed   (near-white body)
text-muted:    #a1a1a1   (captions, metadata)
brand:         #ffffff   (the white CTA pill)
on-brand:      #000000   (black text on the pill)
surface:       #111111   (raised card)
border:        #1f1f1f   (hairline on black)
border-strong: #2e2e2e   (visible divider / input)
accent-violet: #8b5cf6   (generative status, single note)
ring:          #ffffff
```

### Example Component Prompts

1. **"Create a hero on a pure `#000000` background with an ufficioDisplay headline at 80px weight 700, tracking -0.03em, reading 'Create anything you can imagine.', a canvaSans 18px sub-copy at `#a1a1a1`, and a white full-pill CTA (`#ffffff` bg, `#000000` text, 9999 radius, canvaSans 15/600, padding 12px 24px) reading 'Start creating'. No gradient, no glow at rest — let the black and the white pill carry the contrast."**

2. **"Design a generation gallery card at `#111111` with a 12px radius and a 1px `#1f1f1f` hairline border, a generated image filling the top at native aspect ratio, a canvaSans 12/500 caption at `#a1a1a1` below, and an action row of three icon buttons (download, upscale, variation). On hover, lift the border to `#2e2e2e` and scale the image 1.02 over 320ms."**

3. **"Build the auth cluster for a top nav: a ghost `Log in` button (transparent, 1px `#2e2e2e` border, white text, 9999 radius) next to a white full-pill `Sign up` button (`#ffffff` bg, `#000000` text, 9999 radius). Both canvaSans 15px, padding 12px 24px, 12px gap. Only the Sign up pill is white."**

4. **"Compose a prompt composer at the bottom of a black page: `#0a0a0a` background, 1px `#2e2e2e` border, 12px radius, 12px 16px padding, canvaSans 16px white input text with `#6b6b6b` placeholder reading 'Describe what you want to create…', and a hard-right white-pill 'Generate' button. A violet `#8b5cf6` status dot pulses while rendering."**

5. **"Make a model-selector row: pill chips at `#1a1a1a` bg, `#ededed` text, 1px `#2e2e2e` border, canvaSans 12/500 tracking 0.02em, 9999 radius, 4px 12px padding, reading 'Phoenix', 'PhotoReal', 'Lightning'. The active chip flips to `#ffffff` bg with `#000000` text."**

6. **"Design a dark modal: `#111111` panel, 16px radius, 32px padding, `0 36px 72px -24px rgba(0,0,0,0.8)` deep shadow over a `rgba(0,0,0,0.75)` backdrop, ufficioDisplay 32/1.2/600 title with -0.012em tracking, canvaSans 16/1.55 body at `#ededed`, ghost 'Cancel' button + white-pill 'Confirm' hard-right."**

### Iteration Guide

1. **Paint the black first**: everything starts on `#000000`. The void is load-bearing — add panels and cards only after the ground is pure black.
2. **One white pill per view**: if you have two white pills competing, you have one too many. Demote the secondary to ghost (transparent + hairline) at the same 9999 radius.
3. **Tighten the display tracking**: if an ufficioDisplay headline looks loose or generic, pull the tracking negative (`-0.02em` and beyond) — that density is the film-logotype signature.
4. **Separate with borders, not shadows**: on black, a cast shadow does nothing. If two surfaces blur together, add a `#1f1f1f` hairline or step the tone (`#0a0a0a` → `#111111`).
5. **Keep the accent to one note**: violet (`#8b5cf6`) marks generative status only. If you find yourself adding a second accent colour, the module is doing two jobs — split it.
6. **Let imagery be the colour**: if the page feels monotone, the fix is more generated imagery, not more chrome colour. The work supplies hue; the frame stays grey-on-black.
7. **Scale the hero up, not down**: this register rewards a big, confident title (up to 80px). If the hero reads timid, enlarge it before adding decoration.
8. **Check the warmth in the copy**: Leonardo is creator-friendly, not research-cold. If microcopy reads clinical, warm it a half-step — but never reach for exclamation marks.

---

*Theme-toggle audit: score=0, signals=[none]*
Prose

1. Visual Theme & Atmosphere

Leonardo.Ai’s marketing surface is a film studio’s title card. The canvas drops to pure black #000000 — not a soft charcoal, not a tinted navy, but the absolute void — and the wordmark and headlines sit on it in ufficioDisplay, a display sans with a faintly condensed, cinematic cut. Set in weights 500–700 with tight negative tracking, the titles read less like SaaS marketing and more like a film logotype rolling up on a black screen. The page opens like a cold open: black, then a single bright line of white.

The atmosphere is deliberately cinematic-dark. This is the register Runway pioneered and Midjourney shares, but Leonardo commits harder to the void than either — there is no cosmic violet undertone, no editorial off-white panel, just black and the work that floats on it. Generative outputs — images, concept art, video frames — are the only colour on the page. The chrome refuses to compete: text is paper-white, metadata greys down, dividers are hairlines barely a shade off black. The product’s entire colour argument is we make the colour, the frame stays out of the way.

Body copy switches register to canvaSans, a humanist workhorse with open counters and a warm, legible rhythm. This is not a neutral choice: Leonardo was acquired by Canva in 2024, and canvaSans is the same family that anchors Canva’s own product. Using it here is a quiet inheritance signal — no co-logo, no “a Canva company” badge in the hero, just the typography carrying the lineage for anyone who recognises it. The duet of a cinematic display face over a friendly humanist body keeps the page from feeling cold despite the black.

The defining interactive element is the white full-pill CTA. Log in and Sign up render as #ffffff capsules with #000000 text and a 9999-radius — the single brightest object on the entire surface. On a pure-black page, a white pill is unmissable; it pulls the eye the way a lit doorway pulls it in a dark room. This is the white-pill convention shared by Apple, Vercel, and Canva itself: the brightest object is the one action that matters. Everything secondary stays ghost — transparent with a hairline border — so the hierarchy is unambiguous.

The sensory metaphor is a darkened screening room: lights down, attention forward, a single bright control to start the show. Cards rise from the black as barely-lifted panels (#111111). Accent colour, when it appears at all, is a single violet note (#8b5cf6) used for generative status pulses — never a gradient, never a marketing flare. The void does the heavy lifting.

Key Characteristics

  • Pure-black canvas (#000000) — the absolute void, no tint, no charcoal softening
  • ufficioDisplay headlines in weights 500–700 with tight negative tracking — film-logotype cadence
  • canvaSans body — Canva-inherited humanist sans, the quiet parent-brand signal
  • White full-pill CTA (#ffffff on black, black text, 9999 radius) as the brightest object on the page
  • Imagery-as-colour: generative outputs supply all hue; chrome stays monochrome
  • Ghost secondary buttons (transparent + hairline) keep CTA hierarchy unambiguous
  • Single violet accent note (#8b5cf6) for generative status — never blended, never a gradient
  • Hairline borders on black (#1f1f1f) instead of cast shadows for separation
  • Cinematic-dark register shared with Runway and Midjourney, committed harder to true black
  • Spacious vertical rhythm; screening-room calm over SaaS density

2. Color Palette & Roles

Canvas (Primary)

  • bg (#000000) [→ body background]: page ground; pure-black cinematic void, the brand’s defining surface
  • bg-alt (#0a0a0a): barely-lifted secondary band for alternating sections
  • text (#ffffff) [→ h1 color]: pure-white display copy, the brightest text tier
  • text-body (#ededed): near-white body copy on black for long-form reading comfort

Brand

  • brand (#ffffff): white — the interactive colour; the CTA pill, focus rings, primary action fills
  • brand-deep (#e5e5e5): pressed/active white on the pill
  • brand-soft (#1a1a1a): dark neutral fill behind ghost-brand controls
  • on-brand (#000000) [→ CTA color]: black text on the white pill — maximum contrast

Accent (single-note)

  • accent-violet (#8b5cf6): the one generative accent — status pulses, render-progress, active markers
  • accent-violet-soft (#1e1633): tinted-violet panel behind violet status zones
  • accent-cyan (#22d3ee): rare secondary status indicator (info/live)

Interactive

  • link (#ffffff): default link colour; underline appears on hover, not at rest
  • link-hover (#cfcfcf): dimmed white on hover
  • link-visited (#a1a1a1): greyed visited state
  • selected (#1a1a1a): selected list-item / active tab background
  • disabled (#2a2a2a): disabled control fill

Neutral Scale

  • neutral-50 (#fafafa): brightest highlight, rare light-on-light press zone
  • neutral-100 (#ededed): body-tier near-white
  • neutral-300 (#a1a1a1): muted captions and metadata
  • neutral-500 (#6b6b6b): faint text, placeholders
  • neutral-700 (#2a2a2a): disabled fills, deep dividers
  • neutral-900 (#111111): raised card surface

Surface

  • surface (#111111): raised card / panel surface on the black ground
  • surface-deep (#080808): inset zones, near-black wells
  • surface-raised (#1a1a1a): hover-raised card / elevated panel

Borders

  • border (#1f1f1f): default hairline divider on black
  • border-strong (#2e2e2e): visible divider / input border
  • border-subtle (#141414): whisper-line, barely-there separation

Shadow Colors

  • shadow-ambient (rgba(0,0,0,0.5)): base resting-card shadow
  • shadow-deep (rgba(0,0,0,0.75)): modal / lightbox elevation
  • shadow-glow (rgba(255,255,255,0.06)): faint white halo on focused interactive elements

Semantic

  • success (#22c55e) on success-bg (#0b1f12) with success-text (#86efac)
  • warning (#f59e0b) on warning-bg (#231803) with warning-text (#fcd34d)
  • danger (#ef4444) on danger-bg (#230b0b) with danger-text (#fca5a5)
  • info (#22d3ee) on info-bg (#04222a) with info-text (#a5f3fc)

3. Typography Rules

Font Family

  • Display & Headline: ufficioDisplay, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif — weights 500, 600, 700. A confident, faintly condensed display sans used for the wordmark and all headlines with tight negative tracking for a film-logotype cadence.
  • Body: canvaSans, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif — weights 400, 500, 600. The humanist family inherited from Canva; carries all prose, labels, and UI copy.
  • Mono companion: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace — weights 400, 500. Used only for the rare code snippet, prompt token, or seed value.
  • OpenType: default ligatures on in body; tight kerning enabled on ufficioDisplay headlines; tabular figures (tnum) for any numeric column in product UI.

Hierarchy

RoleFontSizeWeightLine HTrackingNotes
display-herodisplay807001.00-0.03emlanding hero; film-logotype scale
display-lgdisplay567001.05-0.02emsection openers
h1display407001.10-0.018empage title
h2display326001.20-0.012emfeature heads
h3display246001.25-0.005emsub-section heads
h4body206001.300switches to canvaSans
body-lgbody184001.550hero supporting copy
bodybody164001.550default body
body-smbody144001.500secondary copy
labelbody135001.400form labels, ui meta
captionbody125001.400.02emimage captions, metadata
buttonbody156001.000CTA pill label
nav-linkbody155001.000top nav links
codemono134001.500prompt tokens, seeds
badgebody125001.400.02empill chips, version tags

Principles

  • Display for titles, body for everything else: ufficioDisplay carries only the wordmark and h1–h3 headlines. Once you drop to h4 and below, canvaSans takes over — the cinematic face never appears in prose.
  • Negative tracking is the display signature: headlines tighten from -0.005em at h3 to -0.03em at the hero. The tightening is what gives titles their film-logotype density; never set ufficioDisplay loose.
  • canvaSans stays neutral-tracked: body copy runs at 0 tracking. Only captions and badges gain a slight 0.02em for small-size legibility.
  • Weight discipline: 700 is reserved for hero and h1–h2; 600 carries h3–h4, buttons, and secondary fills; 500 handles labels, nav, and badges; 400 is the body default. There is no 800/900 — the brand never shouts past 700.
  • Line-height inverts with size: hero copy runs near 1.0 (titles are objects, not paragraphs); body opens to 1.55 for reading comfort. The gap is intentional.
  • Two families, no third: ufficioDisplay and canvaSans only. No serif, no mono in marketing copy, no decorative face. Mono appears only inside product chrome for technical values.
  • Size ceiling is the hero at 80: the brand will reach a full 80px on the landing hero — larger than Midjourney’s restraint — because the cinematic register rewards a big, confident title against black.

4. Component Stylings

Buttons

button-primary — the white full-pill CTA (the signature)

  • Background: #ffffff
  • Text: #000000, canvaSans 15/1.0, weight 600
  • Padding: 12px 24px
  • Radius: 9999 (full pill)
  • Border: none
  • Hover: bg dims to #ededed
  • Active: bg drops to #e5e5e5
  • Focus: 2px ring #ffffff with 2px offset on the black ground
  • Use: Log in, Sign up, Start creating — the single most important action per view

button-ghost — the dark-mode quiet button

  • Background: transparent
  • Text: #ffffff, canvaSans 15/1.0, weight 500
  • Border: 1px solid #2e2e2e
  • Radius: 9999 (full pill, matches primary)
  • Padding: 12px 24px
  • Hover: border lifts to #ffffff66, bg #ffffff0a
  • Active: bg #ffffff14
  • Use: secondary actions (“Explore”, “View gallery”), nav-adjacent buttons

button-secondary — the dark-fill alternative

  • Background: #1a1a1a
  • Text: #ffffff, canvaSans 15/1.0, weight 600
  • Radius: 9999
  • Padding: 12px 24px
  • Hover: bg lifts to #2a2a2a
  • Active: bg drops to #111111
  • Use: in-app secondary primaries where a white pill would over-shout

button-danger — the destructive

  • Background: #ef4444
  • Text: #ffffff, canvaSans 15/1.0, weight 600
  • Radius: 9999
  • Hover: bg #f87171
  • Active: bg #dc2626
  • Use: “Delete generation”, “Cancel subscription”

Cards

Generation card (gallery / feed):

  • Background: #111111
  • Border: 1px solid #1f1f1f
  • Radius: 12px
  • Padding: 24px (or 0 when the image is full-bleed inside the card)
  • Shadow: ambient rgba(0,0,0,0.5) 0 1px 2px
  • Hover: shadow lifts to standard, border brightens to #2e2e2e, image scales 1.02

Feature card (marketing):

  • Background: #0a0a0a
  • Border: 1px solid #1f1f1f
  • Radius: 16px
  • Padding: 32px
  • Hover: border #2e2e2e, no transform

Badges / Tags / Pills

  • Background: #1a1a1a
  • Text: #ededed, canvaSans 12/1.4, weight 500, tracking 0.02em
  • Border: 1px solid #2e2e2e
  • Radius: 9999 (pill)
  • Padding: 4px 12px
  • Use: model version tags (“Phoenix”, “PhotoReal”), feature labels, “New”

Inputs / Forms

Text input:

  • Background: #0a0a0a
  • Text: #ffffff, canvaSans 16/1.55, weight 400
  • Placeholder: #6b6b6b
  • Border: 1px solid #2e2e2e
  • Radius: 8px
  • Padding: 10px 14px
  • Focus: border #ffffff, ring 2px #ffffff

Prompt composer (product chrome):

  • Background: #0a0a0a
  • Border: 1px solid #2e2e2e
  • Radius: 12px
  • Padding: 12px 16px
  • Generate button: white pill, hard-right, #ffffff on #000000
  • Top bar: 64px, transparent over the black ground, no border at rest; a #1f1f1f hairline appears on scroll
  • Wordmark: hard-left, ufficioDisplay 20/1.0 weight 700, white, tight tracking
  • Link list: center or hard-right, canvaSans 15/1.0 weight 500, gap 24px, white at 0.9 opacity
  • Hover: opacity to 1.0
  • Auth cluster: hard-right — ghost Log in next to a white-pill Sign up
  • Mobile: hamburger collapses into a full-bleed black sheet (#000000)

Decorative

  • Hairline divider: 1px solid #1f1f1f between sections; the primary separation device
  • Violet status dot: 8px circle at #8b5cf6 marking active generations / render pulses
  • Image frames: 12px radius wrapping generated outputs in cards; full-bleed (0 radius) in hero

5. Layout Principles

Spacing System

Base unit is 4px. Scale: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128. Section padding lands at 64 or 96 (128 for the hero band); component gap lands at 16 or 24; card padding at 24 or 32. The density is restrained — the black void wants room to breathe, and crowding it kills the cinematic calm.

Grid & Container

  • Page max width: 1280px, centered
  • Prose max width: 720px
  • Hero takes full bleed; copy lives in a centered or left-floated column
  • Feature grids: 12-column, 24px gutters
  • Generation gallery: masonry or fixed grid, 16px gutters, columns adapt 2/3/4 across breakpoints

Whitespace Philosophy

Section padding is generous (64–96px vertical between bands; 128 around the hero). The black ground reads as negative space by default, so whitespace and canvas are the same colour — separation comes from rhythm and hairlines, not contrast. Headlines get 24–32px of breathing room above sub-copy.

Section Cadence

Pages alternate between full-black bands (#000000) and barely-lifted panels (#0a0a0a) — a difference so subtle it reads as a tonal shift rather than a hard band. Generation showcases break out full-width with imagery supplying the only colour. The rhythm is black-black-(showcase)-black; light press zones do not exist.

6. Shapes & Radius Scale

TierpxUse
Micro2inline code, tiny chips
Standard4small controls, checkboxes
Comfortable8inputs, secondary controls
Relaxed12cards, generation tiles, composer
Featured16feature cards, hero panels
Pill9999all buttons, badges, avatars

The shape language is rounded and friendly — inherited from Canva’s softer geometry — but the buttons go all the way to full-pill (9999), which is the dominant shape memory of the brand. Cards stay at a moderate 12px. No compound radii.

7. Depth & Elevation

LevelTreatmentUse
0Flat, no shadowbg, full-bleed sections
1Tonal step (#0a0a0a / #111111 panel on #000000)inset zones, cards at rest
2Hairline border #1f1f1fcard separation on black
3ambient shadow rgba(0,0,0,0.5) 0 1px 2pxresting raised cards
4standard shadow rgba(0,0,0,0.6) 0 8px 24pxhover-raised cards
5deep rgba(0,0,0,0.8) 0 36px 72px -24pxmodals, lightbox

Shadow Philosophy

On a pure-black canvas, cast shadows are nearly invisible — black-on-black has nothing to darken. So Leonardo separates surfaces primarily through hairline borders (#1f1f1f, #2e2e2e) and tonal lifts (#000000#0a0a0a#111111#1a1a1a), reserving shadows for genuine overlay elements (modals, dropdowns, lightboxes) where the layer floats above content rather than sitting inline. When a focused interactive element needs to read as “live,” a faint white glow (rgba(255,255,255,0.06)) does what a shadow cannot on black. The depth model is borders and tonal steps first, shadows only for true overlays.

8. Interaction & Motion

Easing

  • ease-standard cubic-bezier(0.4, 0, 0.2, 1) — default for hover/focus
  • ease-emphasized cubic-bezier(0.2, 0, 0, 1) — entrance and reveal
  • ease-out cubic-bezier(0, 0, 0.2, 1) — exits
  • ease-in cubic-bezier(0.4, 0, 1, 1) — rare; quick dismissals

Durations

  • duration-fast 150ms — micro hover lifts, focus rings, button state shifts
  • duration-standard 240ms — card hovers, dropdown open
  • duration-slow 320ms — panel reveals, modal open, image scale
  • duration-page 480ms — hero loads, section fades

Per-Component Micro-States

  • White-pill hover: bg dims #ffffff#ededed over 150ms ease-standard; no transform — the pill stays planted, it just cools slightly
  • Ghost button hover: border brightens to #ffffff66 and a faint #ffffff0a fill washes in over 150ms
  • Card hover: shadow intensifies from ambient to standard over 240ms, border lifts to #2e2e2e, contained image scales 1.02 over 320ms ease-emphasized
  • Link hover: underline draws in over 150ms; colour cools #ffffff#cfcfcf
  • Generation reveal: new outputs crossfade in over 320ms with a 40ms stagger across the grid; a violet status dot pulses while rendering
  • Modal open: 320ms ease-emphasized scale-95→100 with opacity 0→1; backdrop fades to rgba(0,0,0,0.75) over 240ms

Page Transitions

Section reveals use IntersectionObserver to fade-up content over 480ms ease-emphasized with 8px transform-y. The hero is largely static — the cinematic gravity comes from contrast and scale, not parallax — though generated showcase imagery may slowly crossfade.

Reduced Motion

Respects prefers-reduced-motion: reduce. All transforms (scale, translate, parallax) are dropped; transitions degrade to opacity-only fades capped at 200ms. The render-progress violet pulse is reduced to a static dot. Focus rings still animate (functional, not decorative).

9. Accessibility & A11y

Contrast Pairs

  • White (#ffffff) on #000000 bg: 21.0:1 — AAA (the maximum possible ratio)
  • Black (#000000) on #ffffff pill: 21.0:1 — AAA (maximum; the CTA is the most legible element on the page)
  • #ededed body on #111111 card: 17.4:1 — AAA
  • #a1a1a1 muted on #000000 bg: 8.9:1 — AAA
  • #8b5cf6 violet accent on #000000 bg: 4.6:1 — AA (large text / non-text indicators only; pair with white text when used as a fill)

Focus Indicators

  • 2px solid #ffffff ring with 2px offset
  • Offset color matches surface (#000000 on ground, #111111 on cards)
  • Never removed — :focus-visible only suppresses the ring for mouse pointer interaction

ARIA Patterns

  • Combobox: prompt input uses role="combobox" with aria-expanded, aria-controls, aria-activedescendant
  • Listbox: model selector (“Phoenix”, “PhotoReal”) uses role="listbox" with role="option" children
  • Dialog: generation lightbox uses role="dialog" aria-modal="true" with aria-labelledby pointing to the prompt/title
  • Status: render progress uses role="status" with aria-live="polite"

Keyboard Navigation

  • Tab order follows visual order strictly; the white-pill CTA is an early, prominent tab stop
  • ESC closes lightbox, modal, dropdown
  • Arrow keys traverse the generation grid and model selector
  • Enter activates the focused generation; Space toggles select
  • / shortcut focuses the prompt composer

Screen Reader Hints

  • All generated images carry alt derived from prompt text
  • Decorative hairlines and violet status dots use aria-hidden="true"
  • Icon-only buttons (download, upscale, variation) require aria-label
  • The white-pill CTA uses visible text (no aria-label override needed)

Reduced Motion

All decorative motion (scale, translate, render pulse, crossfade) is disabled under prefers-reduced-motion: reduce. Functional motion (focus, modal-open) is retained but capped at 200ms opacity-only.

10. Responsive Behavior

BreakpointpxBehavior
mobile0–639single-column, stacked nav (hamburger), 16px gutters
tablet640–10232-column gallery, condensed top bar
desktop1024–12793-column gallery, full nav
wide1280+4-column grid, 1280 max width

Touch Targets

Minimum 44×44px for all interactive elements on mobile. The white pill grows its vertical padding so it never drops below 44px tall. Tag chips remain 28px tall but gain 12px tap padding.

Collapsing Strategy

  • Nav: full-link list + auth cluster above 1024; hamburger sheet (full-bleed black) below
  • Gallery: 4→3→2→1 columns at 1280/1024/640
  • Hero copy: centered/left-floated column → top-stacked full-width below 1024; hero type scales 80→56→40
  • Cards: padding shrinks 24→16 below 640

Image Behavior

Generated outputs are served at native aspect ratios; the gallery grid never crops mid-image. loading="lazy" on all below-the-fold imagery. srcset provides 1x/2x/3x for retina. Hero showcase imagery may use <picture> with art-directed crops per breakpoint.

Container Queries

Generation cards use @container queries to adapt action visibility — under 240px wide, the action row (download / upscale / variation) collapses to a single overflow menu; under 180px, only the image and a select checkbox remain.

11. Content & Voice

Tone

Confident, creative, and accessible — Leonardo speaks to creators, not engineers. The voice is warmer than Midjourney’s research-paper restraint (the Canva inheritance shows) but stays clean of hype: “Create production-quality visual assets” rather than “Unleash unlimited creativity!” It treats the user as a maker with a job to do.

Microcopy Patterns

  • Buttons: “Log in”, “Sign up”, “Start creating”, “Generate”, “Upscale” — verbs are direct imperatives or simple nouns
  • Errors: “Generation failed. Try again.” — plain, no blame, no “Oops!”
  • Success: “Saved to your library.” — confirmation with destination, no exclamation
  • Loading: “Generating…” — present participle with ellipsis; a violet dot pulses

Empty States

  • Library empty: “Nothing here yet. Create your first image.” — invitation, not apology
  • Search empty: “No results. Try a different prompt.” — recovery suggestion
  • Error empty: “Couldn’t load. Refresh to retry.” — present-tense fix

CTA Verb Conventions

  • “Sign up” (not “Get started free”, not “Try it now”)
  • “Log in” (not “Sign in” — Leonardo says log in)
  • “Start creating” (not “Launch app”)
  • “Generate” (not “Create” inside the composer — generate is the product verb)
  • “Upgrade” for plan changes (the one place an aspirational verb is allowed)

The voice’s signature is approachable confidence: no exclamation spam, no second-person hype stacking, but warmer and more inviting than the colder research-lab register of its peers. The product is a creative tool, and the copy treats it like one.

12. Dark Mode & Theming

Leonardo is dark-by-default and dark-only. The pure-black ground (#000000) is the brand — a light variant would dissolve the cinematic screening-room metaphor entirely, and there is no prefers-color-scheme: light override.

White is the interactive colour, not a theme: it appears as the CTA pill, focus rings, and primary text, always against black. The single violet accent (#8b5cf6) is theme-invariant — it marks generative status in the same hue regardless of context.

There is no light register, not even an editorial one. Where Midjourney occasionally flips a press essay to warm paper, Leonardo never breaks the black. The void is total, and that totality is the point: the work is the colour, the canvas is the dark.

13. Lineage & Influences

Leonardo.Ai’s surface belongs to the cinematic-dark AI register that Runway pioneered for generative video and that Midjourney shares for image generation — a black or near-black canvas where the generated work is the only colour and the chrome stays out of the way. Leonardo commits harder to true black than either peer: where Midjourney sits at a cosmic navy-violet #06051d and Runway leans editorial, Leonardo drops all the way to #000000, treating the page like a film studio’s title card. Headlines in ufficioDisplay with tight negative tracking read like a logotype rolling up on a dark screen; the big 80px hero scale (larger than Midjourney’s deliberate restraint) is pure cinematic confidence.

The second, quieter inheritance is Canva, which acquired Leonardo in 2024. The body face is canvaSans — the same humanist family that anchors Canva’s own product — and the white full-pill CTA is the Canva (and Apple, and Vercel) convention of making the single brightest object the one action that matters. There is no co-logo in the hero; the typography and the pill carry the lineage for anyone who recognises them. What Leonardo rejects is the loud SaaS gradient hero (it has no gradient at all), the multi-accent palette (one violet note, used sparingly), and any light theme (the void is total). The result is a surface that feels like a darkened screening room with one lit doorway — and the doorway is white.

Named influences:

  • Canva — https://www.canva.com — parent company (2024); canvaSans body, white-pill CTA convention
  • Runway — https://runwayml.com — cinematic-dark generative register, imagery-as-colour
  • Midjourney — https://www.midjourney.com — dark-canvas image-AI marketing rhythm
  • Vercel — https://vercel.com — pure-black canvas, white high-contrast CTA, hairline borders
  • Apple — https://www.apple.com — white full-pill primary action on dark product pages

14. Do’s and Don’ts

Do

  • Keep the canvas at pure #000000 — the absolute void is the brand; don’t soften it to charcoal
  • Render the primary CTA as a white full-pill (#ffffff bg, #000000 text, 9999 radius) — the brightest object on the page
  • Typeset headlines in ufficioDisplay with tight negative tracking (-0.005em to -0.03em) for the film-logotype cadence
  • Carry all prose, labels, and UI copy in canvaSans — the Canva-inherited body face
  • Let generative imagery supply all the colour; keep the chrome monochrome
  • Separate surfaces with hairline borders (#1f1f1f) and tonal lifts before reaching for shadows
  • Match secondary buttons to the pill shape (9999) as ghost (transparent + hairline) so hierarchy stays clear
  • Reserve the violet accent (#8b5cf6) for a single role — generative status / render pulses
  • Scale the hero big (up to 80px) — the cinematic register rewards a confident title against black
  • Reserve shadows for true overlays (modals, lightboxes) where they actually read
  • Keep section padding generous (64–96px, 128 around the hero); the void needs room
  • Use the warmer, creator-friendly voice — confident but never hype-stacked

Don’t

  • Tint the black to navy or charcoal — #000000 exact is the cinematic commitment
  • Give the white pill a coloured or gradient fill — its power is that it’s pure white
  • Set ufficioDisplay loose — without the negative tracking it loses its logotype density
  • Use ufficioDisplay for body copy — it stops at h3; canvaSans carries everything below
  • Add a second accent alongside violet — one note only, and used sparingly
  • Apply cast shadows for card separation on black — they’re invisible; use borders and tonal steps
  • Introduce a gradient hero — Leonardo has no gradient; the contrast is the drama
  • Offer a light theme — the void is total and there is no light register
  • Stack exclamation marks or second-person hype — the voice is warm, not loud
  • Crop generated images mid-frame in the gallery — respect native aspect ratios
  • Drop the white-pill CTA below 44px tall on mobile — it must stay tappable
  • Mix the ghost and primary pills at the same visual weight — only one white pill per view

15. Agent Prompt Guide

Quick Color Reference

bg:            #000000   (pure-black cinematic void)
text:          #ffffff   (display white)
text-body:     #ededed   (near-white body)
text-muted:    #a1a1a1   (captions, metadata)
brand:         #ffffff   (the white CTA pill)
on-brand:      #000000   (black text on the pill)
surface:       #111111   (raised card)
border:        #1f1f1f   (hairline on black)
border-strong: #2e2e2e   (visible divider / input)
accent-violet: #8b5cf6   (generative status, single note)
ring:          #ffffff

Example Component Prompts

  1. “Create a hero on a pure #000000 background with an ufficioDisplay headline at 80px weight 700, tracking -0.03em, reading ‘Create anything you can imagine.’, a canvaSans 18px sub-copy at #a1a1a1, and a white full-pill CTA (#ffffff bg, #000000 text, 9999 radius, canvaSans 15/600, padding 12px 24px) reading ‘Start creating’. No gradient, no glow at rest — let the black and the white pill carry the contrast.”

  2. “Design a generation gallery card at #111111 with a 12px radius and a 1px #1f1f1f hairline border, a generated image filling the top at native aspect ratio, a canvaSans 12/500 caption at #a1a1a1 below, and an action row of three icon buttons (download, upscale, variation). On hover, lift the border to #2e2e2e and scale the image 1.02 over 320ms.”

  3. “Build the auth cluster for a top nav: a ghost Log in button (transparent, 1px #2e2e2e border, white text, 9999 radius) next to a white full-pill Sign up button (#ffffff bg, #000000 text, 9999 radius). Both canvaSans 15px, padding 12px 24px, 12px gap. Only the Sign up pill is white.”

  4. “Compose a prompt composer at the bottom of a black page: #0a0a0a background, 1px #2e2e2e border, 12px radius, 12px 16px padding, canvaSans 16px white input text with #6b6b6b placeholder reading ‘Describe what you want to create…’, and a hard-right white-pill ‘Generate’ button. A violet #8b5cf6 status dot pulses while rendering.”

  5. “Make a model-selector row: pill chips at #1a1a1a bg, #ededed text, 1px #2e2e2e border, canvaSans 12/500 tracking 0.02em, 9999 radius, 4px 12px padding, reading ‘Phoenix’, ‘PhotoReal’, ‘Lightning’. The active chip flips to #ffffff bg with #000000 text.”

  6. “Design a dark modal: #111111 panel, 16px radius, 32px padding, 0 36px 72px -24px rgba(0,0,0,0.8) deep shadow over a rgba(0,0,0,0.75) backdrop, ufficioDisplay 32/1.2/600 title with -0.012em tracking, canvaSans 16/1.55 body at #ededed, ghost ‘Cancel’ button + white-pill ‘Confirm’ hard-right.”

Iteration Guide

  1. Paint the black first: everything starts on #000000. The void is load-bearing — add panels and cards only after the ground is pure black.
  2. One white pill per view: if you have two white pills competing, you have one too many. Demote the secondary to ghost (transparent + hairline) at the same 9999 radius.
  3. Tighten the display tracking: if an ufficioDisplay headline looks loose or generic, pull the tracking negative (-0.02em and beyond) — that density is the film-logotype signature.
  4. Separate with borders, not shadows: on black, a cast shadow does nothing. If two surfaces blur together, add a #1f1f1f hairline or step the tone (#0a0a0a#111111).
  5. Keep the accent to one note: violet (#8b5cf6) marks generative status only. If you find yourself adding a second accent colour, the module is doing two jobs — split it.
  6. Let imagery be the colour: if the page feels monotone, the fix is more generated imagery, not more chrome colour. The work supplies hue; the frame stays grey-on-black.
  7. Scale the hero up, not down: this register rewards a big, confident title (up to 80px). If the hero reads timid, enlarge it before adding decoration.
  8. Check the warmth in the copy: Leonardo is creator-friendly, not research-cold. If microcopy reads clinical, warm it a half-step — but never reach for exclamation marks.

Theme-toggle audit: score=0, signals=[none]

Ship with this

Drop leonardo-ai into your project, then ship the actual sections in an afternoon.

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