dark · sans · playful · creative · bright

DESIGN.md inspired by Spline

Pure-black 3D-design canvas with electric-blue CTAs and a playful multi-color accent set — the browser becomes the viewport.

By webdesignhot · spline.design
$ npx @webdesignhot/design-md add spline
Learn more about the CLI
Compare to…
try on →
theme
1440 × 900
mobile · 390 × 844
Tokens webdesignhot/0.1
  • bg #000000
  • bg-elevated #0a0a0c
  • bg-panel #1e1e23
  • bg-dropdown rgba(30, 30, 35, 0.8)
  • surface #0d0d10
  • surface-soft rgba(255, 255, 255, 0.03)
  • surface-hover rgba(255, 255, 255, 0.05)
  • text AAA · 21.0 #ffffff
  • text-90 rgba(255, 255, 255, 0.9)
  • text-80 rgba(255, 255, 255, 0.8)
  • text-muted rgba(255, 255, 255, 0.7)
  • text-60 rgba(255, 255, 255, 0.6)
  • text-40 rgba(255, 255, 255, 0.4)
  • text-20 rgba(255, 255, 255, 0.2)
  • brand AA·LG · 4.2 #0062ff
  • brand-lighter #5797ff
  • brand-dark #217ce5
  • brand-ios #5966f3
  • on-brand #ffffff
  • cta-secondary-bg rgba(255, 255, 255, 0.2)
  • cta-secondary-text #ffffff
  • btn-bg rgba(255, 255, 255, 0.05)
  • btn-bg-highlight rgba(255, 255, 255, 0.06)
  • accent-red #fd585b
  • accent-yellow #ffb01f
  • accent-purple #a770ff
  • accent-purple-wash rgba(143, 102, 255, 0.13)
  • accent-pink #ff5cab
  • accent-green #47b35f
  • accent-green-wash rgba(73, 188, 84, 0.10)
  • super #00a376
  • super-darker #008761
  • super-lighter #38e2b3
  • team #915eff
  • team-darker #7448d4
  • team-lighter #d680ff
  • bg-pink #ffe6e6
  • bg-greenish #c1f6e8
  • border — · 1.2 rgba(255, 255, 255, 0.1)
  • border-soft rgba(255, 255, 255, 0.05)
  • border-strong — · 1.7 rgba(255, 255, 255, 0.2)
  • scrim rgba(0, 0, 0, 0.7)
  • shadow-glow-blue rgba(0, 98, 255, 0.4)
  • success #47b35f
  • warning #ffb01f
  • danger #fd585b
  • info #5797ff
Typography
Ship faster than ever.
display-hero "Spline Sans" 80px w700 -0.03em
Ship faster than ever.
display-lg "Spline Sans" 58px w500 -0.025em
Ship faster than ever.
h1 "Spline Sans" 58px w500 -0.025em
Built for teams that ship.
h2 "Spline Sans" 36px w500 -0.015em
A complete kit
h3 "Spline Sans" 24px w600 -0.005em
The quick brown fox jumps over the lazy dog.
h4 "Spline Sans" 20px w600 0
The quick brown fox jumps over the lazy dog.
h5 "Spline Sans" 18px w600 0
The quick brown fox jumps over the lazy dog.
body-lg "Spline Sans" 18px w400 0
The quick brown fox jumps over the lazy dog.
body "Spline Sans" 16px w400 0
The quick brown fox jumps over the lazy dog.
button-cta "Spline Sans" 15px w600 0
The quick brown fox jumps over the lazy dog.
body-sm "Spline Sans" 14px w400 0
The quick brown fox jumps over the lazy dog.
nav-link "Spline Sans" 14px w500 0
npx @webdesignhot/design-md add stripe
code-inline "Spline Sans Mono" 14px w400 0
OUR DESIGN SYSTEM
label "Spline Sans" 13px w500 0
npx @webdesignhot/design-md add stripe
code-block "Spline Sans Mono" 13px w400 0
OUR DESIGN SYSTEM
caption "Spline Sans" 12px w500 0.02em
The quick brown fox jumps over the lazy dog.
micro "Spline Sans" 11px w600 0.06em
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
  • xxl 24px
  • 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-pink
  • muted text-muted
  • border border
  • ring brand
Lineage & influences

Spline descends from the lineage of 3D and creative-tool brands that turn their own output into the page — "don't describe the tool, render it." Its specific move is real-time WebGL 3D running in a browser tab, so the homepage literally renders the same engine the user is about to open. Chromatically it sits at an intersection: the true-black, white-opacity-ladder, single-accent discipline of the core chrome is the modern dark-developer-tool vocabulary shared with Linear and Vercel — but Spline breaks that discipline deliberately with a candy-bright multi-color accent set (red, yellow, purple, pink, green) descending from the playful, friendly register of Figma. The result is a hybrid: the seriousness of a pro engineering instrument plus the fun of a creative toy — colder and more void-like than Figma, warmer and more playful than Linear. The studio's own warm-geometric Spline Sans and the plan-tier colors (teal "Super", violet "Team") complete a system that is unmistakably its own.

  • True-black, white-opacity-ladder, single-accent dark-tool discipline that governs Spline's core chrome
  • Permission to be playful and friendly in a professional design tool — the multi-color, approachable register
  • Black-canvas developer-brand minimalism and the conviction that restraint reads as premium
  • The sibling "the page is the demo" stance, applied to interactive 2D motion where Spline applies it to 3D
  • The WebGL-in-the-browser lineage that makes real-time 3D on a marketing page possible at all
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: Spline
tagline: Pure-black 3D-design canvas with electric-blue CTAs and a playful multi-color accent set — the browser becomes the viewport.
updated_at: 2026-05-29T21:44:44.452Z
published_at: 2026-05-29T21:44:44.452Z
author: webdesignhot
source_url: https://spline.design
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [design-tools]
tags: [dark, sans, playful, creative, bright]
preview_swatch: ['#000000', '#0062ff', '#ff5cab']
related: [rive-app, figma, framer]
description: 'Spline is 3D design in the browser, and the marketing site treats the page itself as a viewport. The canvas is pure black (`#000000`) — not the soft charcoal most dark UIs reach for, but true black, so that rendered 3D scenes and glowing accents read like objects floating in a void. Text is pure white (`#ffffff`), set in the geometric, slightly humanist `Spline Sans` (the studio''s own typeface) with a heroic 58px/500 h1. The signature interaction color is an electric brand BLUE `#0062ff` on a 12px-radius pill (`Get started — it''s free`), backed by a second, quieter CTA that uses a 20%-white translucent fill at a full 50px pill. Around that disciplined core sits a deliberately playful multi-color accent system — red `#fd585b`, yellow `#ffb01f`, purple `#a770ff`, pink `#ff5cab`, green `#47b35f` — that surfaces in 3D scenes, feature illustrations, and category tags. The register is creative-pro: black-void seriousness for the tool, candy-bright accents for the play.'


# 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-pink
  muted: text-muted
  border: border
  ring: brand

colors:
  bg: '#000000'                  # true black canvas — a void for floating 3D scenes (--color-bg)
  bg-elevated: '#0a0a0c'         # barely-lifted panel ground for sectional bands
  bg-panel: '#1e1e23'            # editor-chrome panel ground (--color-menu-dropdown base)
  bg-dropdown: 'rgba(30, 30, 35, 0.8)'  # frosted dropdown / menu surface (--color-menu-dropdown cc)
  surface: '#0d0d10'             # card / surface tile on the black canvas
  surface-soft: 'rgba(255, 255, 255, 0.03)'   # faintest tile wash (--color-white-001)
  surface-hover: 'rgba(255, 255, 255, 0.05)'   # surface hover lift (--color-white-003)
  text: '#ffffff'                # pure white primary text (--color-text-main / --color-white)
  text-90: 'rgba(255, 255, 255, 0.9)'   # h2 / strong secondary (--color-white-090)
  text-80: 'rgba(255, 255, 255, 0.8)'   # body-strong (--color-white-080)
  text-muted: 'rgba(255, 255, 255, 0.7)'   # secondary copy (--color-white-070)
  text-60: 'rgba(255, 255, 255, 0.6)'   # tertiary copy (--color-white-060)
  text-40: 'rgba(255, 255, 255, 0.4)'   # captions, faint labels (--color-white-040)
  text-20: 'rgba(255, 255, 255, 0.2)'   # disabled, placeholder (--color-white-020)
  brand: '#0062ff'               # signature electric blue — primary CTA + focus (--color-blue)
  brand-lighter: '#5797ff'       # lifted blue for hover / on-dark links (--color-blue-lighter)
  brand-dark: '#217ce5'          # pressed / deeper blue (--color-blue-dark)
  brand-ios: '#5966f3'           # indigo-shifted blue used in iOS-adjacent contexts (--color-blue-ios)
  on-brand: '#ffffff'            # white label on blue CTA
  cta-secondary-bg: 'rgba(255, 255, 255, 0.2)'   # translucent white pill — the quieter CTA
  cta-secondary-text: '#ffffff'  # white label on translucent pill
  btn-bg: 'rgba(255, 255, 255, 0.05)'   # ghost-button rest fill (--color-btn-bg)
  btn-bg-highlight: 'rgba(255, 255, 255, 0.06)'   # ghost-button hover fill (--color-btn-bg-highlight)
  accent-red: '#fd585b'          # playful accent — error/destructive double duty (--color-red)
  accent-yellow: '#ffb01f'       # playful accent — warning, highlight (--color-yellow)
  accent-purple: '#a770ff'       # playful accent (bright) — 3D scenes, tags (--color-purple-bright)
  accent-purple-wash: 'rgba(143, 102, 255, 0.13)'   # 13% purple tint surface (--color-purple)
  accent-pink: '#ff5cab'         # playful accent — the candy-bright signature (--color-pink)
  accent-green: '#47b35f'        # playful accent (bright) — success/go (--color-green-bright)
  accent-green-wash: 'rgba(73, 188, 84, 0.10)'   # 10% green tint surface (--color-green)
  super: '#00a376'              # "Super" plan teal — premium-tier brand color (--color-super)
  super-darker: '#008761'        # pressed Super teal (--color-super-darker)
  super-lighter: '#38e2b3'       # lifted Super teal for on-dark (--color-super-lighter)
  team: '#915eff'                # "Team" plan violet — collaboration-tier color (--color-team)
  team-darker: '#7448d4'         # pressed Team violet (--color-team-darker)
  team-lighter: '#d680ff'        # lifted Team violet for on-dark (--color-team-lighter)
  bg-pink: '#ffe6e6'             # soft pink illustration ground (--color-bg-pink)
  bg-greenish: '#c1f6e8'         # soft mint illustration ground (--color-bg-greenish)
  border: 'rgba(255, 255, 255, 0.1)'    # default hairline on black (--color-white-010)
  border-soft: 'rgba(255, 255, 255, 0.05)'    # faint divider (--color-white-005)
  border-strong: 'rgba(255, 255, 255, 0.2)'   # input outline, focus precursor (--color-white-020)
  scrim: 'rgba(0, 0, 0, 0.7)'    # modal / overlay scrim over the black page
  shadow-glow-blue: 'rgba(0, 98, 255, 0.4)'   # blue glow under primary CTA / focused scene
  success: '#47b35f'             # mint-green — "Saved", "Published"
  warning: '#ffb01f'             # amber — advisory
  danger: '#fd585b'              # red — destructive / error (shares the playful red)
  info: '#5797ff'                # lighter blue — informational

typography:
  display:
    family: '"Spline Sans", system-ui, -apple-system, "Segoe UI", sans-serif'
    weights: [500, 600, 700]
  body:
    family: '"Spline Sans", system-ui, -apple-system, "Segoe UI", sans-serif'
    weights: [400, 500, 600]
  mono:
    family: '"Spline Sans Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace'
    weights: [400, 500]
  scale:
    display-hero:    { size: 80, weight: 700, lineHeight: 1.0,  tracking: '-0.03em',  family: display }
    display-lg:      { size: 58, weight: 500, lineHeight: 1.05, tracking: '-0.025em', family: display }
    h1:              { size: 58, weight: 500, lineHeight: 1.05, tracking: '-0.025em', family: display }
    h2:              { size: 36, weight: 500, lineHeight: 1.15, tracking: '-0.015em', 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 }
    h5:              { size: 18, weight: 600, lineHeight: 1.35, 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-cta:      { size: 15, weight: 600, lineHeight: 1.0,  tracking: '0',        family: body }
    nav-link:        { size: 14, weight: 500, lineHeight: 1.0,  tracking: '0',        family: body }
    micro:           { size: 11, weight: 600, lineHeight: 1.3,  tracking: '0.06em',   family: body, transform: uppercase }
    code-inline:     { size: 14, weight: 400, lineHeight: 1.5,  tracking: '0',        family: mono }
    code-block:      { size: 13, weight: 400, lineHeight: 1.6,  tracking: '0',        family: mono }

radius:
  micro: 2
  sm: 4
  md: 8
  lg: 12
  xl: 16
  xxl: 24
  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: 680

components:
  button-primary:
    bg: '#0062ff'
    color: '#ffffff'
    radius: 12
    padding: '12px 20px'
    height: 44
    font: button-cta
    use: 'Get started — it''s free. Electric-blue pill, the single highest-energy element on the black canvas.'
  button-primary-hover:
    bg: '#217ce5'
    color: '#ffffff'
    radius: 12
    use: 'Hover deepens blue and lifts a soft blue glow (rgba(0,98,255,0.4)) beneath the pill.'
  button-secondary:
    bg: 'rgba(255, 255, 255, 0.2)'
    color: '#ffffff'
    radius: 9999
    padding: '12px 20px'
    height: 44
    use: 'Get Started (quieter). Translucent white fill at full 50px pill — recedes behind the blue primary.'
  button-ghost:
    bg: 'rgba(255, 255, 255, 0.05)'
    color: '#ffffff'
    border: '1px solid rgba(255, 255, 255, 0.1)'
    radius: 8
    padding: '10px 16px'
    use: 'Tertiary / toolbar actions — faint white wash, hover lifts to 6% white.'
  button-text:
    bg: 'transparent'
    color: 'rgba(255, 255, 255, 0.7)'
    use: 'Inline text action — 70% white, brightens to full white on hover.'
  card:
    bg: '#0d0d10'
    color: '#ffffff'
    border: '1px solid rgba(255, 255, 255, 0.1)'
    radius: 12
    padding: '24px'
    use: 'Feature / content card — near-black tile with hairline border on the void canvas.'
  card-scene:
    bg: '#000000'
    radius: 16
    border: '1px solid rgba(255, 255, 255, 0.08)'
    use: 'Embedded 3D scene container — black ground so the rendered object reads as floating.'
  panel:
    bg: 'rgba(30, 30, 35, 0.8)'
    color: '#ffffff'
    radius: 12
    border: '1px solid rgba(255, 255, 255, 0.1)'
    use: 'Editor-chrome panel / dropdown — frosted dark surface, references the actual Spline app UI.'
  input:
    bg: 'rgba(255, 255, 255, 0.05)'
    color: '#ffffff'
    border: '1px solid rgba(255, 255, 255, 0.1)'
    radius: 8
    height: 40
    padding: '10px 12px'
    focus-ring: '2px solid #0062ff'
    use: 'Form input — faint white wash, blue focus ring matches brand.'
  badge:
    bg: 'rgba(255, 255, 255, 0.08)'
    color: 'rgba(255, 255, 255, 0.8)'
    radius: 9999
    padding: '4px 10px'
    font: micro
    use: 'Neutral pill — "NEW", "BETA", section eyebrows.'
  badge-blue:
    bg: 'rgba(0, 98, 255, 0.15)'
    color: '#5797ff'
    radius: 9999
    padding: '4px 10px'
    use: 'Brand-tinted pill — "Featured", primary highlight callouts.'
  badge-super:
    bg: 'rgba(0, 163, 118, 0.15)'
    color: '#38e2b3'
    radius: 9999
    padding: '4px 10px'
    use: 'Super-plan pill — teal tint signals the premium tier.'
  nav-link:
    color: 'rgba(255, 255, 255, 0.7)'
    font: nav-link
    use: 'Top-bar navigation — 70% white at rest, full white on hover, no underline.'

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  ease-spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)'   # gentle overshoot for 3D scene reveals
  duration-fast: 150
  duration-standard: 240
  duration-slow: 320
  duration-scene: 'variable — driven by individual WebGL 3D scenes (loop / scroll-bound)'
  cta-glow: 'blue glow opacity 0 → 0.4 over 150ms on hover'
  scene-parallax: '3D scene rotates with cursor / scroll — runtime-driven, pauses on prefers-reduced-motion'
  card-hover: 'surface lifts from 3% → 5% white, border brightens 10% → 20% over 240ms'
  reduced-motion: 'respects prefers-reduced-motion: reduce — WebGL scenes hold a static frame, parallax disables, transitions become opacity-only'

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

shadows:
  ambient: 'none — the black canvas absorbs shadow; depth comes from 3D scenes + glow'
  glow-blue: 'rgba(0, 98, 255, 0.4) 0 8px 32px — soft halo under the primary blue CTA'
  panel: 'rgba(0, 0, 0, 0.6) 0 12px 40px — frosted editor panels lift off the page'
  scene-contact: 'rgba(0, 0, 0, 0.5) 0 24px 60px — soft ground shadow under floating 3D objects'

accessibility:
  contrast-text-on-bg: 21.0          # #ffffff on #000000 — AAA (maximum)
  contrast-text-90-on-bg: 18.9       # 90% white on black — AAA
  contrast-muted-on-bg: 13.5         # 70% white on black — AAA
  contrast-text-40-on-bg: 5.6        # 40% white on black — AA at body sizes (captions only)
  contrast-on-brand: 4.6             # #ffffff on #0062ff blue CTA — AA at ≥18px / bold
  contrast-brand-on-bg: 4.5          # #0062ff on black — AA borderline; prefer brand-lighter for text
  contrast-brand-lighter-on-bg: 7.0  # #5797ff on black — AAA for text links
  focus-ring: '2px solid #0062ff + 2px offset (brand blue)'
  reduced-motion-honored: true
  touch-target-min: 44
  keyboard-nav: 'Tab moves logo → primary nav → Sign in → Get Started CTA → main content → scene cards → footer; Enter/Space activates embedded scene interactions.'
  webgl-a11y: 'each embedded 3D scene exposes role="img" with descriptive aria-label; purely decorative scenes are aria-hidden; all pause on prefers-reduced-motion.'

dark-mode: native   # Spline is dark-only — true-black canvas is the brand. No light theme is offered on the marketing site.

colors-light:
  note: 'No light theme. Spline ships dark-only; the only "light" surfaces are the soft pink (#ffe6e6) and mint (#c1f6e8) illustration grounds inside 3D scene art, never the page chrome.'

lineage:
  summary: 'Spline descends from the lineage of 3D and creative-tool brands that turn their own output into the page — "don''t describe the tool, render it." Its specific move is real-time WebGL 3D running in a browser tab, so the homepage literally renders the same engine the user is about to open. Chromatically it sits at an intersection: the true-black, white-opacity-ladder, single-accent discipline of the core chrome is the modern dark-developer-tool vocabulary shared with Linear and Vercel — but Spline breaks that discipline deliberately with a candy-bright multi-color accent set (red, yellow, purple, pink, green) descending from the playful, friendly register of Figma. The result is a hybrid: the seriousness of a pro engineering instrument plus the fun of a creative toy — colder and more void-like than Figma, warmer and more playful than Linear. The studio''s own warm-geometric Spline Sans and the plan-tier colors (teal "Super", violet "Team") complete a system that is unmistakably its own.'
  influences:
    - { name: Linear, role: 'True-black, white-opacity-ladder, single-accent dark-tool discipline that governs Spline''s core chrome', url: 'https://linear.app' }
    - { name: Figma, role: 'Permission to be playful and friendly in a professional design tool — the multi-color, approachable register', url: 'https://figma.com' }
    - { name: Vercel, role: 'Black-canvas developer-brand minimalism and the conviction that restraint reads as premium', url: 'https://vercel.com' }
    - { name: Rive, role: 'The sibling "the page is the demo" stance, applied to interactive 2D motion where Spline applies it to 3D', url: 'https://rive.app' }
    - { name: Three.js, role: 'The WebGL-in-the-browser lineage that makes real-time 3D on a marketing page possible at all', url: 'https://threejs.org' }
---

## 1. Visual Theme & Atmosphere

Spline's marketing surface starts from a decision most dark interfaces flinch away from: the canvas is **true black** (`#000000`), not the soft charcoal (`#0d0d12`, `#111`, `#18181b`) that Linear, Vercel, and almost every other dark-mode developer brand reach for to soften the screen. The reason is functional. Spline is a 3D design tool, and a true-black ground turns the page into a **viewport** — a void in which rendered WebGL scenes, glowing objects, and saturated accents read as physical things floating in space rather than as UI elements pasted onto a panel. The black isn't a mood; it's a stage.

Against that void, the type is pure white (`#ffffff`) set in **Spline Sans** — the studio's own typeface, a geometric sans with just enough humanist warmth in the terminals to avoid feeling cold or technical. The hero runs at a confident 58px / weight 500 with `-0.025em` tracking; notably, Spline keeps its display weight at **medium (500), not bold (700)**, which gives the headlines an airy, gallery-label quality rather than a shouty SaaS-hero feel. The lightness of the display weight against the heaviness of the black ground is the core tension of the whole system.

The single highest-energy element on the page is the primary CTA: an **electric blue** (`#0062ff`) pill at 12px radius reading "Get started — it's free." On a black canvas, that blue glows. It is the brand's one permission to be loud, and it is rationed — most of the page is white-on-black with translucent-white chrome, so the blue CTA pulls the eye like a single lit window. A second, quieter CTA sits beside it using a 20%-white translucent fill at a full 50px pill, deliberately receding so the hierarchy between "primary action" and "alternate action" is unmistakable.

Around that disciplined monochrome-plus-blue core sits a deliberately **playful multi-color accent system** — red `#fd585b`, yellow `#ffb01f`, purple `#a770ff`, pink `#ff5cab`, green `#47b35f`. These are candy-bright, almost toy-like, and they appear in the 3D scenes, feature illustrations, category tags, and plan badges (the "Super" tier owns a teal `#00a376`, the "Team" tier a violet `#915eff`). The register Spline lands on is **creative-pro**: black-void seriousness for the tool itself, candy-bright accents for the play of creation. It says "this is a professional instrument" and "making things here is fun" in the same breath — which is exactly the dual promise of a 3D editor that runs in a browser tab.

The net effect is a page that feels like an *application* more than a brochure. Frosted dark panels (`rgba(30,30,35,0.8)`) borrowed straight from the editor chrome appear in feature sections; embedded scenes rotate with the cursor; the blue CTA carries a soft halo. Where Rive makes its page *the demo* through 2D runtime animation, Spline makes its page *the viewport* through 3D rendering — same conviction (show, don't tell), different dimension.

**Key Characteristics:**
- True-black canvas (`#000000`) — a void, not a softened charcoal — so 3D scenes read as floating objects
- Pure-white type (`#ffffff`) in the studio's own **Spline Sans**, hero at 58px / weight **500** (airy, not shouty)
- One electric-blue CTA (`#0062ff`, 12px radius) as the single loud element — rationed and glowing
- A quieter secondary CTA in 20%-translucent white at a full 50px pill — clear two-tier action hierarchy
- Playful multi-color accent set (red / yellow / purple / pink / green) reserved for 3D scenes, tags, and illustration
- Plan-tier colors: Super = teal `#00a376`, Team = violet `#915eff`
- Translucent-white chrome (`#ffffff0d`, `#ffffff14`) for ghost buttons, panels, dividers — depth via opacity, not shadow
- Frosted editor-style panels (`rgba(30,30,35,0.8)`) that reference the actual app UI
- Depth comes from 3D rendering + soft glows, never from drop-shadow stacks
- Compact radius scale (12px default, 8px controls) — modern-app, not pill-everything

## 2. Color Palette & Roles

### Primary
- **Canvas Black** (`#000000`) [→ `--color-bg`]: true-black page ground — the void that makes 3D scenes float
- **Elevated** (`#0a0a0c`): barely-lifted band ground for sectional rhythm without breaking the void
- **Surface** (`#0d0d10`): near-black card / tile ground on the canvas
- **Text White** (`#ffffff`) [→ `--color-text-main`, `--color-white`]: primary text and the on-blue CTA label

### Brand
- **Brand Blue** (`#0062ff`) [→ `--color-blue`]: signature electric blue — primary CTA fill, focus ring, the one loud color
- **Blue Lighter** (`#5797ff`) [→ `--color-blue-lighter`]: lifted blue for hover, on-dark text links, info
- **Blue Dark** (`#217ce5`) [→ `--color-blue-dark`]: pressed / deeper blue on CTA active
- **Blue iOS** (`#5966f3`) [→ `--color-blue-ios`]: indigo-shifted blue used in platform-adjacent contexts

### Accent (playful, scene/tag-only)
- **Red** (`#fd585b`) [→ `--color-red`]: candy red — scene fills, category tags, doubles as danger
- **Yellow** (`#ffb01f`) [→ `--color-yellow`]: warm amber — scene highlights, doubles as warning
- **Purple Bright** (`#a770ff`) [→ `--color-purple-bright`]: bright violet — scene fills and tags
- **Purple Wash** (`rgba(143,102,255,0.13)`) [→ `--color-purple`]: 13% violet tint for soft surfaces
- **Pink** (`#ff5cab`) [→ `--color-pink`]: the candy-bright signature accent — illustration and tag highlights
- **Green Bright** (`#47b35f`) [→ `--color-green-bright`]: bright mint-green — success, "go", scene fills
- **Green Wash** (`rgba(73,188,84,0.10)`) [→ `--color-green`]: 10% green tint for soft surfaces
- **Super Teal** (`#00a376`) [→ `--color-super`]: "Super" plan tier color — premium-tier branding
- **Team Violet** (`#915eff`) [→ `--color-team`]: "Team" plan tier color — collaboration-tier branding

### Interactive
- **CTA Blue** (`#0062ff`): primary action fill; hover → Blue Dark (`#217ce5`); glow lifts on hover
- **CTA Translucent** (`rgba(255,255,255,0.2)`): secondary action fill — recedes behind blue
- **Ghost Fill** (`rgba(255,255,255,0.05)`) [→ `--color-btn-bg`]: tertiary button rest state
- **Ghost Hover** (`rgba(255,255,255,0.06)`) [→ `--color-btn-bg-highlight`]: tertiary button hover lift
- **Link** (`rgba(255,255,255,0.7)`): default text link — brightens to full white or blue-lighter on hover
- **Focus Ring** (`#0062ff`): brand blue 2px ring on all interactive elements

### Neutral Scale (white-on-black opacity ladder)
- **White 100** (`#ffffff`) — primary text, full strength
- **White 90** (`rgba(255,255,255,0.9)`) [→ `--color-white-090`] — h2, strong secondary
- **White 80** (`rgba(255,255,255,0.8)`) [→ `--color-white-080`] — body-strong, badge text
- **White 70** (`rgba(255,255,255,0.7)`) [→ `--color-white-070`] — secondary copy, nav links
- **White 60** (`rgba(255,255,255,0.6)`) [→ `--color-white-060`] — tertiary copy
- **White 40** (`rgba(255,255,255,0.4)`) [→ `--color-white-040`] — captions, faint labels
- **White 20** (`rgba(255,255,255,0.2)`) [→ `--color-white-020`] — disabled, placeholder, secondary-CTA fill
- **White 10** (`rgba(255,255,255,0.1)`) [→ `--color-white-010`] — default borders
- **White 08** (`rgba(255,255,255,0.08)`) [→ `--color-white-008`] — badge fill, faint surface
- **White 05** (`rgba(255,255,255,0.05)`) [→ `--color-white-005`] — ghost-button fill, soft divider
- **White 03** (`rgba(255,255,255,0.03)`) [→ `--color-white-003`] — barely-there surface wash
- **White 01** (`rgba(255,255,255,0.01)`) [→ `--color-white-001`] — faintest possible tile wash

### Surface & Borders
- **Surface** (`#0d0d10`) — default card tile ground
- **Scene Container** (`#000000`) — black ground inside 3D scene frames so objects float
- **Panel** (`rgba(30,30,35,0.8)`) [→ `--color-menu-dropdown`] — frosted editor-chrome panel / dropdown
- **Border** (`rgba(255,255,255,0.1)`) — default hairline
- **Border Soft** (`rgba(255,255,255,0.05)`) — faint section divider
- **Border Strong** (`rgba(255,255,255,0.2)`) — input outline, focus precursor
- **Illustration Pink Ground** (`#ffe6e6`) [→ `--color-bg-pink`] — soft pink ground inside scene art only
- **Illustration Mint Ground** (`#c1f6e8`) [→ `--color-bg-greenish`] — soft mint ground inside scene art only

### Shadow / Glow Colors
Spline is almost entirely flat — the black canvas absorbs conventional drop shadows, so depth comes from 3D rendering and **glow** instead. The CTA carries a blue halo; frosted panels lift on a deep black shadow; floating objects cast a soft ground contact shadow.
- `rgba(0,98,255,0.4) 0 8px 32px` — blue glow under the primary CTA on hover
- `rgba(0,0,0,0.6) 0 12px 40px` — deep shadow lifting frosted editor panels
- `rgba(0,0,0,0.5) 0 24px 60px` — soft ground contact shadow under floating 3D objects

### Semantic
- **Success** (`#47b35f`): "Saved", "Published", "Up to date" — the same bright green from the accent set
- **Warning** (`#ffb01f`): advisory banners — the warm amber accent
- **Danger** (`#fd585b`): destructive / error states — the candy red does double duty
- **Info** (`#5797ff`): informational banners — the lighter blue, easier on black than full brand blue

## 3. Typography Rules

### Font Family

**Display & Body**: `"Spline Sans"`. Fallback chain: `system-ui, -apple-system, "Segoe UI", sans-serif`. Spline Sans is the studio's own geometric humanist sans (open-sourced and available on Google Fonts) — round, friendly bowls with subtly humanist terminals that keep it from reading as a cold geometric. Spline uses a single typeface across display and body, which is part of what makes the brand feel like one cohesive application rather than a marketing site stitched from disparate parts.

**Mono**: `"Spline Sans Mono"` (the matching monospaced cut) for code samples, dimension readouts, and API snippets. Fallback chain: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace`. The mono cut shares the family's roundness so code blocks feel native to the brand rather than bolted on.

**The medium-weight signature**: the most distinctive typographic choice is that **display sizes use weight 500, not 700**. The 58px hero renders at medium weight, giving headlines an airy, gallery-label quality. Bold (600/700) is reserved for smaller subheads and UI labels where extra weight aids legibility at scale. This inverts the usual SaaS convention (heavy hero, light body) and is a large part of why Spline reads as premium-creative rather than loud-startup.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| display-hero | Spline Sans | 80 | 700 | 1.0 | -0.03em | Largest marketing splash — campaign pages |
| display-lg / h1 | Spline Sans | 58 | 500 | 1.05 | -0.025em | Homepage hero — airy medium weight (the signature) |
| h2 | Spline Sans | 36 | 500 | 1.15 | -0.015em | Section openers — 90% white (`#ffffffe6`) |
| h3 | Spline Sans | 24 | 600 | 1.25 | -0.005em | Card titles, sub-section heads |
| h4 | Spline Sans | 20 | 600 | 1.3 | 0 | Feature card headlines |
| h5 | Spline Sans | 18 | 600 | 1.35 | 0 | Tile heads, eyebrow + title pairs |
| body-lg | Spline Sans | 18 | 400 | 1.55 | 0 | Lead paragraphs, hero sub-copy |
| body | Spline Sans | 16 | 400 | 1.55 | 0 | Default body |
| body-sm | Spline Sans | 14 | 400 | 1.5 | 0 | Card descriptions, secondary copy |
| label | Spline Sans | 13 | 500 | 1.4 | 0 | Form labels, small UI text |
| caption | Spline Sans | 12 | 500 | 1.4 | 0.02em | Footer fine print, faint metadata |
| button-cta | Spline Sans | 15 | 600 | 1.0 | 0 | Primary CTA labels |
| nav-link | Spline Sans | 14 | 500 | 1.0 | 0 | Top-bar navigation, 70% white |
| micro | Spline Sans | 11 | 600 | 1.3 | 0.06em (uppercase) | "NEW", "BETA" badges, eyebrows |
| code-inline | Spline Sans Mono | 14 | 400 | 1.5 | 0 | Inline `<code>` in body |
| code-block | Spline Sans Mono | 13 | 400 | 1.6 | 0 | Code samples, API snippets |

### Principles

- **One family, display through body.** Spline Sans covers everything; cohesion over contrast. The monospaced cut (`Spline Sans Mono`) is the only sibling, reserved for code.
- **Medium (500) for display, not bold.** The 58px hero at weight 500 is the typographic signature — airy and gallery-like. Don't bump display to 700 by default.
- **Bold climbs as size drops.** Weight 600/700 appears at h3 and below, where smaller type benefits from extra weight for legibility — the inverse of the hero treatment.
- **Negative tracking scales with size.** `-0.025em` to `-0.03em` at hero scale, easing to `0` by body. Tighten display to read as a unified word-mark, never spaced.
- **White opacity ladder for hierarchy, not gray.** Secondary text is white at reduced opacity (90 / 80 / 70 / 60 / 40%), never a separate gray hex — this keeps every shade chromatically neutral against the true-black ground.
- **Line height loosens for reading.** Display sits tight (1.0–1.15); body opens to 1.55 for comfortable reading on a dark ground, where loose leading reduces eye strain.
- **Spline Sans Mono for technical context.** Dimensions, coordinates, code, and API tokens use the mono cut to signal "this is a real tool with real parameters."

## 4. Component Stylings

### Buttons

**`button-primary`** — electric-blue (`#0062ff`) fill, white (`#ffffff`) label in 15/600, **12px radius** (not a full pill), ~12×20px padding, 44px height. The single highest-energy element on the page: "Get started — it's free." On hover the fill deepens to `#217ce5` and a soft blue glow (`rgba(0,98,255,0.4) 0 8px 32px`) lifts beneath the pill. Active presses to ~0.97 scale for 100ms.

**`button-secondary`** — translucent white fill (`rgba(255,255,255,0.2)`), white label, **full 50px pill radius** (9999). Deliberately a different shape from the primary so the two read as distinct tiers: blue-rounded-rect = "do this," translucent-pill = "or this." Hover brightens the fill toward 28% white.

**`button-ghost`** — faint white wash (`rgba(255,255,255,0.05)`), 1px 10%-white border, white label, 8px radius, ~10×16px padding. Toolbar and tertiary actions. Hover lifts the fill to 6% white (`--color-btn-bg-highlight`). This is the workhorse for in-product-style chrome on the marketing site.

**`button-text`** — no surface, no border, 70%-white label (`rgba(255,255,255,0.7)`). Brightens to full white on hover. Used for inline "Learn more" and footer-style actions.

### Cards

**`card`** — near-black surface (`#0d0d10`), 12px radius, 1px 10%-white hairline border, 24px padding. The default content tile. On hover the surface lifts from 3% → 5% white and the border brightens from 10% → 20% over 240ms — a quiet "this is interactive" cue with no movement of the box itself.

**`card-scene`** — true-black (`#000000`) ground, 16px radius, 1px 8%-white border. The defining card type: wraps an embedded WebGL 3D scene. The black ground (matching the page) makes the rendered object read as *floating in the card* rather than sitting on a tile. The scene often rotates with the cursor inside this frame.

**`panel`** — frosted dark surface (`rgba(30,30,35,0.8)` with backdrop-blur), 12px radius, 1px 10%-white border. References the actual Spline editor chrome — used in feature sections that show off the app's panels, layers, and property inspectors. Lifts on a deep black shadow (`rgba(0,0,0,0.6) 0 12px 40px`).

### Badges, Tags, Pills

**`badge`** — 8%-white fill, 80%-white text in 11/600/uppercase/0.06em, full pill, ~4×10px padding. Neutral utility pill for "NEW", "BETA", section eyebrows.

**`badge-blue`** — 15% brand-blue fill (`rgba(0,98,255,0.15)`), blue-lighter text (`#5797ff`), full pill. Brand-tinted callout for "Featured" or primary highlights.

**`badge-super`** — 15% Super-teal fill, teal-lighter text (`#38e2b3`). Signals the premium "Super" plan tier. **`badge-team`** does the same in Team violet (`#915eff` / `#d680ff`). The accent set also surfaces as category tags inside the templates gallery (a red tag, a pink tag, a green tag), where the playful palette gets its fullest expression.

### Inputs / Forms

**`input`** — faint white wash (`rgba(255,255,255,0.05)`), 1px 10%-white border, 8px radius, 40px height, ~10×12px padding, white text. Placeholder at 20% white. On focus the border becomes 2px brand blue (`#0062ff`) — matching the CTA and focus-ring color throughout.

**`form-label`** — stacked above input in 13/500 at 80% white. Required-field marker is a small red asterisk (`#fd585b`).

### Navigation

**`top-bar`** — full-width true-black bar, 64px height, no border at rest (a faint 10%-white bottom hairline appears on scroll). Logo flush left. Primary nav centred or left-grouped ("Product", "Templates", "Pricing", "Resources", "Community"). "Sign in" text action + blue "Get started" CTA flush right.

**`nav-link`** — 14/500 at 70% white (`rgba(255,255,255,0.7)`), brightening to full white on hover. No underline; the brightness shift carries the affordance.

**`mobile-nav`** — full-screen black takeover at <768px. Stacked nav links at 20/500 white, the blue CTA pinned at the bottom.

## 5. Layout Principles

### Spacing System

- Base unit: **4px**
- Scale: `0 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96 · 128`
- Section padding (vertical): **96–128px** between major bands; the hero claims extra breath at the top of the page
- Card internal padding: **24px** standard, **32px** for feature tiles
- Gutters: **16–24px** between cards in grid view

### Grid & Container

- Max content width: **1280px** centred — modern-app moderate, not sprawling
- Reading prose width: **720px** for docs, changelog, and blog surfaces
- Header height: **64px** — compact, app-like
- Hero: often a centred display headline + dual CTA over a full-bleed 3D scene that occupies the background or right region
- Feature grids: 2- or 3-column at desktop, each tile holding an embedded scene or app screenshot
- Footer: multi-column link list on the black canvas with faint dividers

### Whitespace Philosophy

The black canvas *is* the whitespace. Where a light site uses generous margins of paper to give content room, Spline uses expanses of pure black void — which reads as even more spacious because there is no surface texture at all. Content floats in this void with deliberate breathing room; the 3D scenes need negative space around them to feel like objects rather than crowded UI. The discipline is to resist filling the void: one scene, one headline, one blue CTA per viewport is the rhythm.

### Section Cadence

Sections alternate between **pure-black bands** (default, most content) and occasional **barely-elevated bands** (`#0a0a0c`) that lift just enough to delineate a region without breaking the void. Feature sections often pair a frosted editor-panel demo on one side with copy on the other. The templates / community gallery is where the full playful accent palette appears — a grid of scene cards each glowing a different candy hue against the black. The overall flow is monochrome-disciplined-then-colorful-release: long stretches of white-on-black build restraint, then a gallery section releases the full rainbow.

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|------|-------|-----|
| Micro | 2px | Code-block corners, dense table cells, tiny chips |
| Small | 4px | Tight controls, inner input elements, color swatches |
| Standard | 8px | Inputs, ghost buttons, dropdown items — the control radius |
| Comfortable | 12px | Default card, primary CTA, panel — the brand's signature radius |
| Large | 16px | Scene containers, feature tiles, modals |
| Featured | 24px | Large hero scene frames, oversized feature cards |
| Pill | 9999px | Badges, the translucent secondary CTA, toggles |

The defining tension: the **primary CTA uses 12px, not a full pill**, while the **secondary CTA uses a full 50px pill**. This split is intentional — the rounded-rect primary reads as a solid "button," the pill secondary as a softer "option." Controls (inputs, ghost buttons) sit one notch tighter at 8px to read as precise, tool-like elements. There are no compound radii in mainline UI; every element rounds uniformly.

## 7. Depth & Elevation

| Level | Treatment | Use |
|-------|-----------|-----|
| 0 — Flat | no shadow, sits on black | Body, most cards, masthead, footer (~90% of surfaces) |
| 1 — Hairline | 1px 10%-white border | Cards, panels, inputs, dividers |
| 2 — Surface lift | 3% → 5% white fill + border 10% → 20% on hover | Interactive card hover |
| 3 — Glow | `rgba(0,98,255,0.4) 0 8px 32px` | Primary CTA on hover, focused scenes |
| 4 — Panel | `rgba(0,0,0,0.6) 0 12px 40px` + backdrop-blur | Frosted editor panels, dropdowns, modals |
| 5 — Scene contact | `rgba(0,0,0,0.5) 0 24px 60px` | Soft ground shadow under floating 3D objects |

### Shadow Philosophy

**On a true-black canvas, conventional drop shadows are invisible** — a black shadow on a black ground does nothing. So Spline rethinks elevation entirely. Depth at the surface level comes from **opacity** (a brighter white wash or border reads as "closer"). Depth at the hero level comes from **glow** (the blue CTA halo, the lit edges of a 3D object) and from **actual 3D rendering** (the scene has real depth, real perspective, a real ground shadow rendered by the WebGL runtime). The only black-on-black shadows that work are the deep, large-blur kind used to lift frosted panels and floating objects — and even those rely on the panel itself being lighter than the void. The brand position: in a black void, light is the only currency of depth. You don't cast shadows down; you emit light up.

## 8. Interaction & Motion

### Easing
- **Standard**: `cubic-bezier(0.4, 0, 0.2, 1)` — default for hover, focus, opacity transitions
- **Emphasized**: `cubic-bezier(0.2, 0, 0, 1)` — modal entry, panel reveals, section transitions
- **Spring**: `cubic-bezier(0.34, 1.56, 0.64, 1)` — gentle overshoot for 3D scene reveals and toggle snaps
- **Scene runtime**: each embedded WebGL scene runs its own timing — Spline doesn't impose a single curve on live 3D

### Durations

| Bucket | Value | Use |
|--------|-------|-----|
| Fast | 150ms | Hover color/opacity swap, focus ring, CTA glow fade-in |
| Standard | 240ms | Card hover, surface lift, dropdown open |
| Slow | 320ms | Section reveal on scroll, modal enter, panel slide |
| Scene | variable | WebGL scenes loop or bind to scroll / cursor |

### Per-Component Recipes

- **CTA hover**: fill `#0062ff` → `#217ce5` over 150ms; blue glow opacity 0 → 0.4 over 150ms; arrow icon (when present) slides 3px right.
- **CTA press**: scale 1.0 → 0.97 over 100ms, reverts on release.
- **Card hover**: surface fill 3% → 5% white, border 10% → 20% white over 240ms standard; box does not move.
- **Scene parallax**: embedded 3D scene rotates / shifts with cursor position and scroll, runtime-driven; pauses on `prefers-reduced-motion: reduce`.
- **Nav link**: opacity 70% → 100% white over 150ms; no underline.
- **Dropdown / panel**: frosted panel enters with `translateY(8px) opacity(0)` → `0 / 1` over 240ms emphasized + backdrop-blur fade-in.
- **Section reveal**: feature blocks fade-in + `translateY(16px → 0)` over 320ms emphasized on scroll-into-view.
- **Modal**: scrim (`rgba(0,0,0,0.7)`) fades in over 200ms; dialog springs in with gentle overshoot.

### Page Transitions

Standard hard navigation between pages — Spline prioritizes perceived speed and lets links behave as links. The motion lives *inside* pages (3D scenes, scroll-bound reveals), not between them.

### Reduced Motion

Respects `prefers-reduced-motion: reduce`. All WebGL scenes hold a static representative frame (no loop, no cursor parallax). Section reveals and card scales drop to opacity-only or instant. The CTA glow still appears (it's a state, not motion) but its fade is shortened. The reduced-motion experience preserves the brand fully — true-black canvas, Spline Sans, blue CTA, candy accents — with only the kinetic 3D layer stilled.

## 9. Accessibility & A11y

### Contrast Pairs

| Pair | Ratio | Level |
|------|-------|-------|
| #ffffff text on #000000 canvas | 21.0 | AAA (maximum possible) |
| 90% white on #000000 | 18.9 | AAA |
| 80% white on #000000 | 16.4 | AAA |
| 70% white (nav, secondary) on #000000 | 13.5 | AAA |
| 40% white (captions) on #000000 | 5.6 | AA at body sizes |
| 20% white (disabled) on #000000 | 2.6 | Decorative / disabled only — not for text |
| #ffffff on #0062ff (blue CTA) | 4.6 | AA at ≥18px or bold (the 15/600 label qualifies) |
| #0062ff brand blue on #000000 | 4.5 | AA borderline — use brand-lighter for blue *text* |
| #5797ff blue-lighter on #000000 | 7.0 | AAA — preferred for blue text links on black |

The white-on-black core is maximally accessible (21:1, the highest ratio achievable). The two things to watch: (1) the on-blue CTA label clears AA only at large/bold sizes, so keep CTA labels ≥15px/600 — which the system does; and (2) full brand blue as *text* on black is borderline, so links use the lighter blue (`#5797ff`, 7.0:1 AAA) while the solid blue is reserved for CTA *fills*.

### Focus Indicators

Focus ring is **2px solid brand blue (`#0062ff`)** with 2px offset on `:focus-visible`. Buttons, inputs, links, and interactive scenes all gain the blue ring. On the black canvas the blue ring has strong visibility, and it doubles as a brand signal — the same blue as the CTA.

### ARIA Patterns

- **Embedded 3D scene**: each WebGL scene exposes `role="img"` with descriptive `aria-label` ("Interactive 3D scene — abstract glass orb"). Purely decorative background scenes are `aria-hidden="true"` to avoid screen-reader noise.
- **Primary CTA**: `aria-label` names the destination ("Get started — opens sign-up flow").
- **Frosted panels / dropdowns**: `role="menu"` / `role="dialog"` with `aria-modal` and focus trap as appropriate.
- **Templates gallery cards**: wrapped in `<a>` with `aria-label` describing the template.
- **Mobile nav**: `role="dialog"`, `aria-modal="true"`, Escape to close, focus trap.

### Keyboard Navigation

- Tab order: skip-link → logo → primary nav → Sign in → Get Started CTA → main content → scene/template cards → footer
- Enter/Space activates a card or an embedded scene's primary interaction
- Escape closes the mobile drawer, any modal, or any open dropdown
- Arrow keys cycle items within the templates gallery and any carousel

### Screen Reader Hints

Verbose `aria-label` on every meaningful 3D scene; decorative scenes are hidden. Plan-tier badges announce the tier name ("Super plan", "Team plan") rather than just the color. Dimension/coordinate mono readouts inside product demos are marked decorative when they're illustrative rather than functional.

### Reduced Motion

WebGL scenes hold a static frame; cursor parallax and scroll-bound 3D disable; section reveals and hover scales degrade to opacity-only or instant. The brand identity (canvas, type, blue CTA, accents) is fully preserved with the kinetic layer stilled — essential for a tool whose entire premise is motion and 3D.

## 10. Responsive Behavior

### Breakpoints

| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | <640px | Hero stacks; display drops to ~36/500; nav → full-screen black drawer; cards 1-up; 3D scenes simplify or static |
| Tablet | 640–1024px | Hero stays mostly vertical, display ~44/500; cards 2-up; scenes retained |
| Desktop | 1024–1280px | Full hero with background/side 3D scene; cards 2- or 3-up |
| Wide | 1280–1536px | Content caps at 1280px; cards 3-up; scenes get maximum stage |

### Touch Targets

- Primary / secondary CTAs: 44px height — meets AA
- Ghost buttons: 40px (with padding to a 44px tap area)
- Nav links: 44px tap area around the visible text
- Template / scene cards: entire tile is tappable
- Embedded scenes are pointer-event aware on touch — tap-and-drag rotates the 3D object

### Collapsing Strategy

- **Hero**: side-by-side copy + scene → stacked; 3D scene moves to background or below copy
- **Display scale**: ~58 → ~44 → ~36 across desktop → tablet → mobile
- **Feature grids**: 3-up → 2-up → 1-up
- **Top-bar nav**: collapses to a hamburger drawer; the blue CTA persists in the bar
- **3D scenes**: heavy WebGL scenes may swap to a static poster image on low-power mobile to protect performance

### Image / Scene Behavior

Embedded 3D scenes use `aspect-ratio` containers and the WebGL canvas scales to fit, resampling cleanly to retina. Where a scene is too heavy for a device, a static poster (a rendered frame of the same scene) stands in. Illustration art with the soft pink / mint grounds maintains native aspect ratio.

### Container Queries

Used inside template cards: when a card narrows below ~280px, its metadata (title, category tag) shifts beneath the scene thumbnail instead of overlaying it.

## 11. Content & Voice

### Tone

Creative, confident, approachable-technical. Spline's voice is "the pro 3D tool that's actually fun to use" — it speaks to designers and creators without enterprise stiffness, but with the credibility of a real engine under the hood. Headlines favor direct capability statements ("3D design, in the browser", "Design 3D, collaborate in real time") over abstract aspiration. The "— it's free" tag on the primary CTA is characteristic: warm, low-friction, inviting rather than transactional.

### Microcopy Patterns

- **Button verbs**: "Get started — it's free", "Get Started", "Try Spline", "Open Editor", "Browse Templates", "Start designing" — inviting and outcome-named
- **Error recipe**: short and plain — "Couldn't load this scene. Check your connection and try again."
- **Success confirmations**: brief — "Saved", "Published", "Copied to clipboard"
- **Field labels**: minimal — "Email", "Project name", "Workspace"
- **Empty states**: encouraging — "No projects yet. Create your first scene to get started."

### Empty States

Empty workspace: "Start from a template or open a blank scene." — names two destinations.

Empty templates / community: "Nothing here yet — browse the community gallery for inspiration." — offers a next step.

Empty search: "No results for '[query]'. Try different keywords or browse by category." — explains plus offers an alternative.

### CTA Verb Conventions

- Primary: **"Get started — it's free"** (hero default), **"Get Started"** (compact), **"Try Spline"** (feature-adjacent), **"Open Editor"** (existing user)
- Secondary: **"Browse Templates"**, **"Watch Demo"**, **"See Examples"**, **"Learn More"**
- Tertiary text: **"Explore"**, **"Discover"**, **"View all"**

The brand leans on "free" and "start" to lower the barrier — the tool's whole pitch is "open a tab and start making 3D," and the copy mirrors that frictionlessness.

## 12. Dark Mode & Theming

Spline is **dark-only by design**. The true-black canvas is not a dark *mode* — it is the brand. There is no light-theme toggle on the marketing site, and there shouldn't be: the entire system (3D scenes floating in a void, glow-based depth, white-opacity hierarchy, the lit blue CTA) is built on the premise of a black ground. A light theme would invert the conceptual model — objects would sit *on* a surface rather than float *in* a void — and break the brand.

The only "light" surfaces anywhere in the system are the soft **pink (`#ffe6e6`)** and **mint (`#c1f6e8`)** grounds that appear *inside* 3D scene artwork and illustrations — never as page chrome. They are content, not theme. If you must produce a light variant for an embedded or co-branded context, treat it as a separate brand expression, not a token swap: re-derive depth from real drop shadows (which become visible on light grounds), pull the white-opacity ladder to a black-opacity ladder, and keep the blue CTA and candy accents intact as the throughline.

## 13. Lineage & Influences

Spline's marketing surface descends from the lineage of **3D and creative-tool brands that turn their own output into the page**. The conviction — "don't describe the tool, render it" — is the same one Rive applies to 2D motion and that game-engine and creative-coding brands have used for years: the homepage *is* a viewport into the product. Spline's specific contribution is taking that into real-time WebGL 3D running in a browser tab, so the page literally renders the same engine the user is about to open.

Chromatically and structurally, Spline sits at an intersection. The **true-black, white-opacity, single-accent discipline** of the core UI is the modern dark-developer-tool vocabulary shared with **Linear** and **Vercel** — but where those brands stop at one cool accent and stay austere, Spline breaks discipline deliberately with a **candy-bright multi-color accent set** (red / yellow / purple / pink / green) that descends from the playful, friendly register of **Figma** and the creative-community energy of design-asset marketplaces. The result is a hybrid: the seriousness of a pro engineering tool plus the fun of a creative toy. The plan-tier colors (teal "Super", violet "Team") and the studio's own warm-geometric **Spline Sans** complete a system that is unmistakably its own — colder and more void-like than Figma, warmer and more playful than Linear.

**Influences:**

- **Linear** — the true-black / white-opacity-ladder / single-accent dark-tool discipline that governs Spline's core chrome
  https://linear.app
- **Figma** — permission to be playful and friendly in a professional design tool; the multi-color, approachable register
  https://figma.com
- **Vercel** — black-canvas developer-brand minimalism and the conviction that restraint reads as premium
  https://vercel.com
- **Rive** — the sibling "the page is the demo" stance, applied to interactive 2D motion where Spline applies it to 3D
  https://rive.app
- **Three.js** — the WebGL-in-the-browser lineage that makes real-time 3D on a marketing page possible at all
  https://threejs.org

What Spline **rejects**: soft charcoal "comfortable dark" grounds (it commits to true black), drop-shadow elevation systems (invisible on black — it uses glow and 3D instead), static screenshots as the dominant asset (it renders live scenes), and single-accent austerity (it keeps the playful rainbow). The rejections are what let Spline read as a creative *instrument* rather than another austere dev tool.

## 14. Do's and Don'ts

### Do

- **Do** commit to true black (`#000000`) for the canvas. The void is the brand — it's what makes 3D scenes float.
- **Do** keep the primary CTA electric blue (`#0062ff`) at 12px radius. It's the one loud element; let it glow.
- **Do** give the secondary CTA a different shape (translucent white, full pill) so the two action tiers read distinctly.
- **Do** build hierarchy from the white-opacity ladder (90 / 80 / 70 / 60 / 40%), not from separate gray hexes.
- **Do** set display at weight **500**, not 700. The airy medium-weight hero is the typographic signature.
- **Do** reserve the candy accents (red / yellow / purple / pink / green) for 3D scenes, tags, and illustration — not for chrome.
- **Do** use glow and 3D rendering for depth. On black, light is the only currency of elevation.
- **Do** use frosted dark panels (`rgba(30,30,35,0.8)`) when referencing the editor UI — it ties the site to the product.
- **Do** honor `prefers-reduced-motion` — hold WebGL scenes on a static frame and disable parallax.
- **Do** keep the blue focus ring (`#0062ff`) everywhere — it doubles as accessibility and brand.

### Don't

- **Don't** soften the canvas to charcoal (`#0d0d12`, `#18181b`). That's the generic dark-mode move; Spline commits to true black.
- **Don't** make the primary CTA a full pill. The 12px rounded-rect is intentional — the pill is the *secondary* shape.
- **Don't** stack drop shadows. They're invisible on black and read as a misunderstanding of the system. Use glow.
- **Don't** bold the hero to 700. The medium-weight 58px display is what reads as premium-creative.
- **Don't** spray the candy accents across buttons and chrome. They live in scenes, tags, and art — the chrome stays monochrome-plus-blue.
- **Don't** use full brand blue (`#0062ff`) for body *text* on black — it's borderline AA. Use blue-lighter (`#5797ff`) for links.
- **Don't** add a light-mode toggle. The black void is the conceptual foundation; a light theme breaks it.
- **Don't** crowd the void. One scene, one headline, one blue CTA per viewport — the black needs room to breathe.
- **Don't** mix in a second typeface. Spline Sans (plus its mono cut) covers everything; cohesion is the point.
- **Don't** ship heavy WebGL scenes without a static poster fallback for low-power devices.

## 15. Agent Prompt Guide

### Quick Color Reference

```
Canvas (true black): #000000
Surface (card): #0d0d10
Panel (frosted): rgba(30, 30, 35, 0.8)
Text (white): #ffffff
Text muted (70%): rgba(255, 255, 255, 0.7)
Brand blue (CTA / focus): #0062ff
Blue lighter (links/hover): #5797ff
Blue dark (pressed): #217ce5
Secondary CTA fill: rgba(255, 255, 255, 0.2)
Ghost button fill: rgba(255, 255, 255, 0.05)
Accent red: #fd585b   ·   yellow: #ffb01f
Accent purple: #a770ff   ·   pink: #ff5cab   ·   green: #47b35f
Super (plan): #00a376   ·   Team (plan): #915eff
Border: rgba(255, 255, 255, 0.1)
```

### Example Component Prompts

1. **"Create a Spline-style hero on a true-black (`#000000`) canvas. Centred headline in Spline Sans 58px / weight 500 / `-0.025em` tracking, pure white. Below it a sub-headline in 18/400 at 70% white, max-width 720px. Two CTAs side by side: primary is electric blue (`#0062ff`) with white label, 12px radius, ~12×20px padding, 44px height — and a soft blue glow (`rgba(0,98,255,0.4) 0 8px 32px`) on hover; secondary is a translucent white pill (`rgba(255,255,255,0.2)` fill, full 50px radius). A full-bleed 3D scene placeholder sits behind/beside the copy. Stacks vertically at <640px."**

2. **"Design a Spline scene card: true-black (`#000000`) ground, 16px radius, 1px border at 8% white. Holds a placeholder for an embedded 3D scene that floats on the black. Below the scene: title in Spline Sans 20/600 white, a category tag pill in a candy accent (e.g. pink `#ff5cab` at 15% fill with `#ff5cab` text). On hover, the border brightens from 8% → 20% white over 240ms."**

3. **"Build a Spline feature section: barely-elevated band (`#0a0a0c`) on the black page. Left column has an eyebrow in Spline Sans 11/600/uppercase/0.06em at 70% white, a headline in 36/500 at 90% white, and body in 16/400 at 70% white. Right column shows a frosted editor panel (`rgba(30,30,35,0.8)` with backdrop-blur, 12px radius, 1px 10%-white border, deep black shadow). Section padding 96px vertical."**

4. **"Create a Spline ghost button: faint white fill (`rgba(255,255,255,0.05)`), 1px border at 10% white, white label in Spline Sans 15/600, 8px radius, ~10×16px padding. On hover, fill lifts to 6% white. Focus ring is 2px brand blue (`#0062ff`) with 2px offset."**

5. **"Design a Spline pricing tier card on black: surface `#0d0d10`, 12px radius, 1px 10%-white border, 24px padding. The 'Super' tier gets a teal accent (`#00a376`) badge and teal-lit blue CTA; the 'Team' tier gets a violet accent (`#915eff`). Tier name in 24/600 white, price in 40/500 white, feature list in 14/400 at 70% white with check icons in the tier color."**

6. **"Style a Spline form: input has faint white fill (`rgba(255,255,255,0.05)`), 1px 10%-white border, 8px radius, 40px height, white text, placeholder at 20% white. Label above in 13/500 at 80% white, required marker is a red asterisk (`#fd585b`). On focus the border becomes 2px brand blue (`#0062ff`). Submit is the blue (`#0062ff`) primary CTA."**

### Iteration Guide

1. **Go true black, not charcoal.** If the canvas reads as "comfortable dark mode," it's wrong — push it to `#000000`. The void is what makes everything float. Soft charcoal is the generic move Spline explicitly rejects.

2. **Ration the blue.** If multiple blue elements compete, you've diluted the signal. There should be essentially *one* electric-blue CTA per viewport, glowing alone against the black. Everything else is white, translucent-white, or a candy accent in a scene.

3. **Build hierarchy from opacity, not gray.** If you're reaching for `#888` or `#aaa` for secondary text, stop — use white at 70 / 60 / 40% opacity instead. It keeps every shade chromatically neutral on the black ground.

4. **Drop the display weight to 500.** If the hero reads as "loud SaaS," check the weight — it should be medium (500) at ~58px, not bold (700). The airy medium-weight headline is the single biggest tell of the Spline register.

5. **Trade shadows for glow.** If cards have drop shadows, they're invisible (or muddy) on black. Replace shadow-based elevation with brighter borders/fills on hover and a blue glow on the CTA. Depth on black comes from emitted light, not cast shadow.

6. **Let the accents live in the scenes.** If red / yellow / pink are showing up on buttons or section backgrounds, pull them back into the 3D scenes, illustration art, and category tags. The chrome stays monochrome-plus-blue; the rainbow is for *content*.

7. **Mind the blue's contrast role.** Solid `#0062ff` is for CTA *fills* (white label, AA at the 15/600 size). For blue *text* on black, switch to blue-lighter (`#5797ff`) which clears AAA. Don't set body links in full brand blue.

8. **Reference the editor.** Adding a frosted dark panel (`rgba(30,30,35,0.8)`, backdrop-blur, deep shadow) that looks like the actual Spline app instantly ties a generic dark page back to the brand — it signals "this is a real tool," which is the whole pitch.
Prose

1. Visual Theme & Atmosphere

Spline’s marketing surface starts from a decision most dark interfaces flinch away from: the canvas is true black (#000000), not the soft charcoal (#0d0d12, #111, #18181b) that Linear, Vercel, and almost every other dark-mode developer brand reach for to soften the screen. The reason is functional. Spline is a 3D design tool, and a true-black ground turns the page into a viewport — a void in which rendered WebGL scenes, glowing objects, and saturated accents read as physical things floating in space rather than as UI elements pasted onto a panel. The black isn’t a mood; it’s a stage.

Against that void, the type is pure white (#ffffff) set in Spline Sans — the studio’s own typeface, a geometric sans with just enough humanist warmth in the terminals to avoid feeling cold or technical. The hero runs at a confident 58px / weight 500 with -0.025em tracking; notably, Spline keeps its display weight at medium (500), not bold (700), which gives the headlines an airy, gallery-label quality rather than a shouty SaaS-hero feel. The lightness of the display weight against the heaviness of the black ground is the core tension of the whole system.

The single highest-energy element on the page is the primary CTA: an electric blue (#0062ff) pill at 12px radius reading “Get started — it’s free.” On a black canvas, that blue glows. It is the brand’s one permission to be loud, and it is rationed — most of the page is white-on-black with translucent-white chrome, so the blue CTA pulls the eye like a single lit window. A second, quieter CTA sits beside it using a 20%-white translucent fill at a full 50px pill, deliberately receding so the hierarchy between “primary action” and “alternate action” is unmistakable.

Around that disciplined monochrome-plus-blue core sits a deliberately playful multi-color accent system — red #fd585b, yellow #ffb01f, purple #a770ff, pink #ff5cab, green #47b35f. These are candy-bright, almost toy-like, and they appear in the 3D scenes, feature illustrations, category tags, and plan badges (the “Super” tier owns a teal #00a376, the “Team” tier a violet #915eff). The register Spline lands on is creative-pro: black-void seriousness for the tool itself, candy-bright accents for the play of creation. It says “this is a professional instrument” and “making things here is fun” in the same breath — which is exactly the dual promise of a 3D editor that runs in a browser tab.

The net effect is a page that feels like an application more than a brochure. Frosted dark panels (rgba(30,30,35,0.8)) borrowed straight from the editor chrome appear in feature sections; embedded scenes rotate with the cursor; the blue CTA carries a soft halo. Where Rive makes its page the demo through 2D runtime animation, Spline makes its page the viewport through 3D rendering — same conviction (show, don’t tell), different dimension.

Key Characteristics:

  • True-black canvas (#000000) — a void, not a softened charcoal — so 3D scenes read as floating objects
  • Pure-white type (#ffffff) in the studio’s own Spline Sans, hero at 58px / weight 500 (airy, not shouty)
  • One electric-blue CTA (#0062ff, 12px radius) as the single loud element — rationed and glowing
  • A quieter secondary CTA in 20%-translucent white at a full 50px pill — clear two-tier action hierarchy
  • Playful multi-color accent set (red / yellow / purple / pink / green) reserved for 3D scenes, tags, and illustration
  • Plan-tier colors: Super = teal #00a376, Team = violet #915eff
  • Translucent-white chrome (#ffffff0d, #ffffff14) for ghost buttons, panels, dividers — depth via opacity, not shadow
  • Frosted editor-style panels (rgba(30,30,35,0.8)) that reference the actual app UI
  • Depth comes from 3D rendering + soft glows, never from drop-shadow stacks
  • Compact radius scale (12px default, 8px controls) — modern-app, not pill-everything

2. Color Palette & Roles

Primary

  • Canvas Black (#000000) [→ --color-bg]: true-black page ground — the void that makes 3D scenes float
  • Elevated (#0a0a0c): barely-lifted band ground for sectional rhythm without breaking the void
  • Surface (#0d0d10): near-black card / tile ground on the canvas
  • Text White (#ffffff) [→ --color-text-main, --color-white]: primary text and the on-blue CTA label

Brand

  • Brand Blue (#0062ff) [→ --color-blue]: signature electric blue — primary CTA fill, focus ring, the one loud color
  • Blue Lighter (#5797ff) [→ --color-blue-lighter]: lifted blue for hover, on-dark text links, info
  • Blue Dark (#217ce5) [→ --color-blue-dark]: pressed / deeper blue on CTA active
  • Blue iOS (#5966f3) [→ --color-blue-ios]: indigo-shifted blue used in platform-adjacent contexts

Accent (playful, scene/tag-only)

  • Red (#fd585b) [→ --color-red]: candy red — scene fills, category tags, doubles as danger
  • Yellow (#ffb01f) [→ --color-yellow]: warm amber — scene highlights, doubles as warning
  • Purple Bright (#a770ff) [→ --color-purple-bright]: bright violet — scene fills and tags
  • Purple Wash (rgba(143,102,255,0.13)) [→ --color-purple]: 13% violet tint for soft surfaces
  • Pink (#ff5cab) [→ --color-pink]: the candy-bright signature accent — illustration and tag highlights
  • Green Bright (#47b35f) [→ --color-green-bright]: bright mint-green — success, “go”, scene fills
  • Green Wash (rgba(73,188,84,0.10)) [→ --color-green]: 10% green tint for soft surfaces
  • Super Teal (#00a376) [→ --color-super]: “Super” plan tier color — premium-tier branding
  • Team Violet (#915eff) [→ --color-team]: “Team” plan tier color — collaboration-tier branding

Interactive

  • CTA Blue (#0062ff): primary action fill; hover → Blue Dark (#217ce5); glow lifts on hover
  • CTA Translucent (rgba(255,255,255,0.2)): secondary action fill — recedes behind blue
  • Ghost Fill (rgba(255,255,255,0.05)) [→ --color-btn-bg]: tertiary button rest state
  • Ghost Hover (rgba(255,255,255,0.06)) [→ --color-btn-bg-highlight]: tertiary button hover lift
  • Link (rgba(255,255,255,0.7)): default text link — brightens to full white or blue-lighter on hover
  • Focus Ring (#0062ff): brand blue 2px ring on all interactive elements

Neutral Scale (white-on-black opacity ladder)

  • White 100 (#ffffff) — primary text, full strength
  • White 90 (rgba(255,255,255,0.9)) [→ --color-white-090] — h2, strong secondary
  • White 80 (rgba(255,255,255,0.8)) [→ --color-white-080] — body-strong, badge text
  • White 70 (rgba(255,255,255,0.7)) [→ --color-white-070] — secondary copy, nav links
  • White 60 (rgba(255,255,255,0.6)) [→ --color-white-060] — tertiary copy
  • White 40 (rgba(255,255,255,0.4)) [→ --color-white-040] — captions, faint labels
  • White 20 (rgba(255,255,255,0.2)) [→ --color-white-020] — disabled, placeholder, secondary-CTA fill
  • White 10 (rgba(255,255,255,0.1)) [→ --color-white-010] — default borders
  • White 08 (rgba(255,255,255,0.08)) [→ --color-white-008] — badge fill, faint surface
  • White 05 (rgba(255,255,255,0.05)) [→ --color-white-005] — ghost-button fill, soft divider
  • White 03 (rgba(255,255,255,0.03)) [→ --color-white-003] — barely-there surface wash
  • White 01 (rgba(255,255,255,0.01)) [→ --color-white-001] — faintest possible tile wash

Surface & Borders

  • Surface (#0d0d10) — default card tile ground
  • Scene Container (#000000) — black ground inside 3D scene frames so objects float
  • Panel (rgba(30,30,35,0.8)) [→ --color-menu-dropdown] — frosted editor-chrome panel / dropdown
  • Border (rgba(255,255,255,0.1)) — default hairline
  • Border Soft (rgba(255,255,255,0.05)) — faint section divider
  • Border Strong (rgba(255,255,255,0.2)) — input outline, focus precursor
  • Illustration Pink Ground (#ffe6e6) [→ --color-bg-pink] — soft pink ground inside scene art only
  • Illustration Mint Ground (#c1f6e8) [→ --color-bg-greenish] — soft mint ground inside scene art only

Shadow / Glow Colors

Spline is almost entirely flat — the black canvas absorbs conventional drop shadows, so depth comes from 3D rendering and glow instead. The CTA carries a blue halo; frosted panels lift on a deep black shadow; floating objects cast a soft ground contact shadow.

  • rgba(0,98,255,0.4) 0 8px 32px — blue glow under the primary CTA on hover
  • rgba(0,0,0,0.6) 0 12px 40px — deep shadow lifting frosted editor panels
  • rgba(0,0,0,0.5) 0 24px 60px — soft ground contact shadow under floating 3D objects

Semantic

  • Success (#47b35f): “Saved”, “Published”, “Up to date” — the same bright green from the accent set
  • Warning (#ffb01f): advisory banners — the warm amber accent
  • Danger (#fd585b): destructive / error states — the candy red does double duty
  • Info (#5797ff): informational banners — the lighter blue, easier on black than full brand blue

3. Typography Rules

Font Family

Display & Body: "Spline Sans". Fallback chain: system-ui, -apple-system, "Segoe UI", sans-serif. Spline Sans is the studio’s own geometric humanist sans (open-sourced and available on Google Fonts) — round, friendly bowls with subtly humanist terminals that keep it from reading as a cold geometric. Spline uses a single typeface across display and body, which is part of what makes the brand feel like one cohesive application rather than a marketing site stitched from disparate parts.

Mono: "Spline Sans Mono" (the matching monospaced cut) for code samples, dimension readouts, and API snippets. Fallback chain: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace. The mono cut shares the family’s roundness so code blocks feel native to the brand rather than bolted on.

The medium-weight signature: the most distinctive typographic choice is that display sizes use weight 500, not 700. The 58px hero renders at medium weight, giving headlines an airy, gallery-label quality. Bold (600/700) is reserved for smaller subheads and UI labels where extra weight aids legibility at scale. This inverts the usual SaaS convention (heavy hero, light body) and is a large part of why Spline reads as premium-creative rather than loud-startup.

Hierarchy

RoleFontSizeWeightLine HeightLetter SpacingNotes
display-heroSpline Sans807001.0-0.03emLargest marketing splash — campaign pages
display-lg / h1Spline Sans585001.05-0.025emHomepage hero — airy medium weight (the signature)
h2Spline Sans365001.15-0.015emSection openers — 90% white (#ffffffe6)
h3Spline Sans246001.25-0.005emCard titles, sub-section heads
h4Spline Sans206001.30Feature card headlines
h5Spline Sans186001.350Tile heads, eyebrow + title pairs
body-lgSpline Sans184001.550Lead paragraphs, hero sub-copy
bodySpline Sans164001.550Default body
body-smSpline Sans144001.50Card descriptions, secondary copy
labelSpline Sans135001.40Form labels, small UI text
captionSpline Sans125001.40.02emFooter fine print, faint metadata
button-ctaSpline Sans156001.00Primary CTA labels
nav-linkSpline Sans145001.00Top-bar navigation, 70% white
microSpline Sans116001.30.06em (uppercase)“NEW”, “BETA” badges, eyebrows
code-inlineSpline Sans Mono144001.50Inline <code> in body
code-blockSpline Sans Mono134001.60Code samples, API snippets

Principles

  • One family, display through body. Spline Sans covers everything; cohesion over contrast. The monospaced cut (Spline Sans Mono) is the only sibling, reserved for code.
  • Medium (500) for display, not bold. The 58px hero at weight 500 is the typographic signature — airy and gallery-like. Don’t bump display to 700 by default.
  • Bold climbs as size drops. Weight 600/700 appears at h3 and below, where smaller type benefits from extra weight for legibility — the inverse of the hero treatment.
  • Negative tracking scales with size. -0.025em to -0.03em at hero scale, easing to 0 by body. Tighten display to read as a unified word-mark, never spaced.
  • White opacity ladder for hierarchy, not gray. Secondary text is white at reduced opacity (90 / 80 / 70 / 60 / 40%), never a separate gray hex — this keeps every shade chromatically neutral against the true-black ground.
  • Line height loosens for reading. Display sits tight (1.0–1.15); body opens to 1.55 for comfortable reading on a dark ground, where loose leading reduces eye strain.
  • Spline Sans Mono for technical context. Dimensions, coordinates, code, and API tokens use the mono cut to signal “this is a real tool with real parameters.”

4. Component Stylings

Buttons

button-primary — electric-blue (#0062ff) fill, white (#ffffff) label in 15/600, 12px radius (not a full pill), ~12×20px padding, 44px height. The single highest-energy element on the page: “Get started — it’s free.” On hover the fill deepens to #217ce5 and a soft blue glow (rgba(0,98,255,0.4) 0 8px 32px) lifts beneath the pill. Active presses to ~0.97 scale for 100ms.

button-secondary — translucent white fill (rgba(255,255,255,0.2)), white label, full 50px pill radius (9999). Deliberately a different shape from the primary so the two read as distinct tiers: blue-rounded-rect = “do this,” translucent-pill = “or this.” Hover brightens the fill toward 28% white.

button-ghost — faint white wash (rgba(255,255,255,0.05)), 1px 10%-white border, white label, 8px radius, ~10×16px padding. Toolbar and tertiary actions. Hover lifts the fill to 6% white (--color-btn-bg-highlight). This is the workhorse for in-product-style chrome on the marketing site.

button-text — no surface, no border, 70%-white label (rgba(255,255,255,0.7)). Brightens to full white on hover. Used for inline “Learn more” and footer-style actions.

Cards

card — near-black surface (#0d0d10), 12px radius, 1px 10%-white hairline border, 24px padding. The default content tile. On hover the surface lifts from 3% → 5% white and the border brightens from 10% → 20% over 240ms — a quiet “this is interactive” cue with no movement of the box itself.

card-scene — true-black (#000000) ground, 16px radius, 1px 8%-white border. The defining card type: wraps an embedded WebGL 3D scene. The black ground (matching the page) makes the rendered object read as floating in the card rather than sitting on a tile. The scene often rotates with the cursor inside this frame.

panel — frosted dark surface (rgba(30,30,35,0.8) with backdrop-blur), 12px radius, 1px 10%-white border. References the actual Spline editor chrome — used in feature sections that show off the app’s panels, layers, and property inspectors. Lifts on a deep black shadow (rgba(0,0,0,0.6) 0 12px 40px).

Badges, Tags, Pills

badge — 8%-white fill, 80%-white text in 11/600/uppercase/0.06em, full pill, ~4×10px padding. Neutral utility pill for “NEW”, “BETA”, section eyebrows.

badge-blue — 15% brand-blue fill (rgba(0,98,255,0.15)), blue-lighter text (#5797ff), full pill. Brand-tinted callout for “Featured” or primary highlights.

badge-super — 15% Super-teal fill, teal-lighter text (#38e2b3). Signals the premium “Super” plan tier. badge-team does the same in Team violet (#915eff / #d680ff). The accent set also surfaces as category tags inside the templates gallery (a red tag, a pink tag, a green tag), where the playful palette gets its fullest expression.

Inputs / Forms

input — faint white wash (rgba(255,255,255,0.05)), 1px 10%-white border, 8px radius, 40px height, ~10×12px padding, white text. Placeholder at 20% white. On focus the border becomes 2px brand blue (#0062ff) — matching the CTA and focus-ring color throughout.

form-label — stacked above input in 13/500 at 80% white. Required-field marker is a small red asterisk (#fd585b).

top-bar — full-width true-black bar, 64px height, no border at rest (a faint 10%-white bottom hairline appears on scroll). Logo flush left. Primary nav centred or left-grouped (“Product”, “Templates”, “Pricing”, “Resources”, “Community”). “Sign in” text action + blue “Get started” CTA flush right.

nav-link — 14/500 at 70% white (rgba(255,255,255,0.7)), brightening to full white on hover. No underline; the brightness shift carries the affordance.

mobile-nav — full-screen black takeover at <768px. Stacked nav links at 20/500 white, the blue CTA pinned at the bottom.

5. Layout Principles

Spacing System

  • Base unit: 4px
  • Scale: 0 · 4 · 8 · 12 · 16 · 24 · 32 · 48 · 64 · 96 · 128
  • Section padding (vertical): 96–128px between major bands; the hero claims extra breath at the top of the page
  • Card internal padding: 24px standard, 32px for feature tiles
  • Gutters: 16–24px between cards in grid view

Grid & Container

  • Max content width: 1280px centred — modern-app moderate, not sprawling
  • Reading prose width: 720px for docs, changelog, and blog surfaces
  • Header height: 64px — compact, app-like
  • Hero: often a centred display headline + dual CTA over a full-bleed 3D scene that occupies the background or right region
  • Feature grids: 2- or 3-column at desktop, each tile holding an embedded scene or app screenshot
  • Footer: multi-column link list on the black canvas with faint dividers

Whitespace Philosophy

The black canvas is the whitespace. Where a light site uses generous margins of paper to give content room, Spline uses expanses of pure black void — which reads as even more spacious because there is no surface texture at all. Content floats in this void with deliberate breathing room; the 3D scenes need negative space around them to feel like objects rather than crowded UI. The discipline is to resist filling the void: one scene, one headline, one blue CTA per viewport is the rhythm.

Section Cadence

Sections alternate between pure-black bands (default, most content) and occasional barely-elevated bands (#0a0a0c) that lift just enough to delineate a region without breaking the void. Feature sections often pair a frosted editor-panel demo on one side with copy on the other. The templates / community gallery is where the full playful accent palette appears — a grid of scene cards each glowing a different candy hue against the black. The overall flow is monochrome-disciplined-then-colorful-release: long stretches of white-on-black build restraint, then a gallery section releases the full rainbow.

6. Shapes & Radius Scale

TierValueUse
Micro2pxCode-block corners, dense table cells, tiny chips
Small4pxTight controls, inner input elements, color swatches
Standard8pxInputs, ghost buttons, dropdown items — the control radius
Comfortable12pxDefault card, primary CTA, panel — the brand’s signature radius
Large16pxScene containers, feature tiles, modals
Featured24pxLarge hero scene frames, oversized feature cards
Pill9999pxBadges, the translucent secondary CTA, toggles

The defining tension: the primary CTA uses 12px, not a full pill, while the secondary CTA uses a full 50px pill. This split is intentional — the rounded-rect primary reads as a solid “button,” the pill secondary as a softer “option.” Controls (inputs, ghost buttons) sit one notch tighter at 8px to read as precise, tool-like elements. There are no compound radii in mainline UI; every element rounds uniformly.

7. Depth & Elevation

LevelTreatmentUse
0 — Flatno shadow, sits on blackBody, most cards, masthead, footer (~90% of surfaces)
1 — Hairline1px 10%-white borderCards, panels, inputs, dividers
2 — Surface lift3% → 5% white fill + border 10% → 20% on hoverInteractive card hover
3 — Glowrgba(0,98,255,0.4) 0 8px 32pxPrimary CTA on hover, focused scenes
4 — Panelrgba(0,0,0,0.6) 0 12px 40px + backdrop-blurFrosted editor panels, dropdowns, modals
5 — Scene contactrgba(0,0,0,0.5) 0 24px 60pxSoft ground shadow under floating 3D objects

Shadow Philosophy

On a true-black canvas, conventional drop shadows are invisible — a black shadow on a black ground does nothing. So Spline rethinks elevation entirely. Depth at the surface level comes from opacity (a brighter white wash or border reads as “closer”). Depth at the hero level comes from glow (the blue CTA halo, the lit edges of a 3D object) and from actual 3D rendering (the scene has real depth, real perspective, a real ground shadow rendered by the WebGL runtime). The only black-on-black shadows that work are the deep, large-blur kind used to lift frosted panels and floating objects — and even those rely on the panel itself being lighter than the void. The brand position: in a black void, light is the only currency of depth. You don’t cast shadows down; you emit light up.

8. Interaction & Motion

Easing

  • Standard: cubic-bezier(0.4, 0, 0.2, 1) — default for hover, focus, opacity transitions
  • Emphasized: cubic-bezier(0.2, 0, 0, 1) — modal entry, panel reveals, section transitions
  • Spring: cubic-bezier(0.34, 1.56, 0.64, 1) — gentle overshoot for 3D scene reveals and toggle snaps
  • Scene runtime: each embedded WebGL scene runs its own timing — Spline doesn’t impose a single curve on live 3D

Durations

BucketValueUse
Fast150msHover color/opacity swap, focus ring, CTA glow fade-in
Standard240msCard hover, surface lift, dropdown open
Slow320msSection reveal on scroll, modal enter, panel slide
ScenevariableWebGL scenes loop or bind to scroll / cursor

Per-Component Recipes

  • CTA hover: fill #0062ff#217ce5 over 150ms; blue glow opacity 0 → 0.4 over 150ms; arrow icon (when present) slides 3px right.
  • CTA press: scale 1.0 → 0.97 over 100ms, reverts on release.
  • Card hover: surface fill 3% → 5% white, border 10% → 20% white over 240ms standard; box does not move.
  • Scene parallax: embedded 3D scene rotates / shifts with cursor position and scroll, runtime-driven; pauses on prefers-reduced-motion: reduce.
  • Nav link: opacity 70% → 100% white over 150ms; no underline.
  • Dropdown / panel: frosted panel enters with translateY(8px) opacity(0)0 / 1 over 240ms emphasized + backdrop-blur fade-in.
  • Section reveal: feature blocks fade-in + translateY(16px → 0) over 320ms emphasized on scroll-into-view.
  • Modal: scrim (rgba(0,0,0,0.7)) fades in over 200ms; dialog springs in with gentle overshoot.

Page Transitions

Standard hard navigation between pages — Spline prioritizes perceived speed and lets links behave as links. The motion lives inside pages (3D scenes, scroll-bound reveals), not between them.

Reduced Motion

Respects prefers-reduced-motion: reduce. All WebGL scenes hold a static representative frame (no loop, no cursor parallax). Section reveals and card scales drop to opacity-only or instant. The CTA glow still appears (it’s a state, not motion) but its fade is shortened. The reduced-motion experience preserves the brand fully — true-black canvas, Spline Sans, blue CTA, candy accents — with only the kinetic 3D layer stilled.

9. Accessibility & A11y

Contrast Pairs

PairRatioLevel
#ffffff text on #000000 canvas21.0AAA (maximum possible)
90% white on #00000018.9AAA
80% white on #00000016.4AAA
70% white (nav, secondary) on #00000013.5AAA
40% white (captions) on #0000005.6AA at body sizes
20% white (disabled) on #0000002.6Decorative / disabled only — not for text
#ffffff on #0062ff (blue CTA)4.6AA at ≥18px or bold (the 15/600 label qualifies)
#0062ff brand blue on #0000004.5AA borderline — use brand-lighter for blue text
#5797ff blue-lighter on #0000007.0AAA — preferred for blue text links on black

The white-on-black core is maximally accessible (21:1, the highest ratio achievable). The two things to watch: (1) the on-blue CTA label clears AA only at large/bold sizes, so keep CTA labels ≥15px/600 — which the system does; and (2) full brand blue as text on black is borderline, so links use the lighter blue (#5797ff, 7.0:1 AAA) while the solid blue is reserved for CTA fills.

Focus Indicators

Focus ring is 2px solid brand blue (#0062ff) with 2px offset on :focus-visible. Buttons, inputs, links, and interactive scenes all gain the blue ring. On the black canvas the blue ring has strong visibility, and it doubles as a brand signal — the same blue as the CTA.

ARIA Patterns

  • Embedded 3D scene: each WebGL scene exposes role="img" with descriptive aria-label (“Interactive 3D scene — abstract glass orb”). Purely decorative background scenes are aria-hidden="true" to avoid screen-reader noise.
  • Primary CTA: aria-label names the destination (“Get started — opens sign-up flow”).
  • Frosted panels / dropdowns: role="menu" / role="dialog" with aria-modal and focus trap as appropriate.
  • Templates gallery cards: wrapped in <a> with aria-label describing the template.
  • Mobile nav: role="dialog", aria-modal="true", Escape to close, focus trap.

Keyboard Navigation

  • Tab order: skip-link → logo → primary nav → Sign in → Get Started CTA → main content → scene/template cards → footer
  • Enter/Space activates a card or an embedded scene’s primary interaction
  • Escape closes the mobile drawer, any modal, or any open dropdown
  • Arrow keys cycle items within the templates gallery and any carousel

Screen Reader Hints

Verbose aria-label on every meaningful 3D scene; decorative scenes are hidden. Plan-tier badges announce the tier name (“Super plan”, “Team plan”) rather than just the color. Dimension/coordinate mono readouts inside product demos are marked decorative when they’re illustrative rather than functional.

Reduced Motion

WebGL scenes hold a static frame; cursor parallax and scroll-bound 3D disable; section reveals and hover scales degrade to opacity-only or instant. The brand identity (canvas, type, blue CTA, accents) is fully preserved with the kinetic layer stilled — essential for a tool whose entire premise is motion and 3D.

10. Responsive Behavior

Breakpoints

NameWidthKey Changes
Mobile<640pxHero stacks; display drops to ~36/500; nav → full-screen black drawer; cards 1-up; 3D scenes simplify or static
Tablet640–1024pxHero stays mostly vertical, display ~44/500; cards 2-up; scenes retained
Desktop1024–1280pxFull hero with background/side 3D scene; cards 2- or 3-up
Wide1280–1536pxContent caps at 1280px; cards 3-up; scenes get maximum stage

Touch Targets

  • Primary / secondary CTAs: 44px height — meets AA
  • Ghost buttons: 40px (with padding to a 44px tap area)
  • Nav links: 44px tap area around the visible text
  • Template / scene cards: entire tile is tappable
  • Embedded scenes are pointer-event aware on touch — tap-and-drag rotates the 3D object

Collapsing Strategy

  • Hero: side-by-side copy + scene → stacked; 3D scene moves to background or below copy
  • Display scale: ~58 → ~44 → ~36 across desktop → tablet → mobile
  • Feature grids: 3-up → 2-up → 1-up
  • Top-bar nav: collapses to a hamburger drawer; the blue CTA persists in the bar
  • 3D scenes: heavy WebGL scenes may swap to a static poster image on low-power mobile to protect performance

Image / Scene Behavior

Embedded 3D scenes use aspect-ratio containers and the WebGL canvas scales to fit, resampling cleanly to retina. Where a scene is too heavy for a device, a static poster (a rendered frame of the same scene) stands in. Illustration art with the soft pink / mint grounds maintains native aspect ratio.

Container Queries

Used inside template cards: when a card narrows below ~280px, its metadata (title, category tag) shifts beneath the scene thumbnail instead of overlaying it.

11. Content & Voice

Tone

Creative, confident, approachable-technical. Spline’s voice is “the pro 3D tool that’s actually fun to use” — it speaks to designers and creators without enterprise stiffness, but with the credibility of a real engine under the hood. Headlines favor direct capability statements (“3D design, in the browser”, “Design 3D, collaborate in real time”) over abstract aspiration. The ”— it’s free” tag on the primary CTA is characteristic: warm, low-friction, inviting rather than transactional.

Microcopy Patterns

  • Button verbs: “Get started — it’s free”, “Get Started”, “Try Spline”, “Open Editor”, “Browse Templates”, “Start designing” — inviting and outcome-named
  • Error recipe: short and plain — “Couldn’t load this scene. Check your connection and try again.”
  • Success confirmations: brief — “Saved”, “Published”, “Copied to clipboard”
  • Field labels: minimal — “Email”, “Project name”, “Workspace”
  • Empty states: encouraging — “No projects yet. Create your first scene to get started.”

Empty States

Empty workspace: “Start from a template or open a blank scene.” — names two destinations.

Empty templates / community: “Nothing here yet — browse the community gallery for inspiration.” — offers a next step.

Empty search: “No results for ‘[query]’. Try different keywords or browse by category.” — explains plus offers an alternative.

CTA Verb Conventions

  • Primary: “Get started — it’s free” (hero default), “Get Started” (compact), “Try Spline” (feature-adjacent), “Open Editor” (existing user)
  • Secondary: “Browse Templates”, “Watch Demo”, “See Examples”, “Learn More”
  • Tertiary text: “Explore”, “Discover”, “View all”

The brand leans on “free” and “start” to lower the barrier — the tool’s whole pitch is “open a tab and start making 3D,” and the copy mirrors that frictionlessness.

12. Dark Mode & Theming

Spline is dark-only by design. The true-black canvas is not a dark mode — it is the brand. There is no light-theme toggle on the marketing site, and there shouldn’t be: the entire system (3D scenes floating in a void, glow-based depth, white-opacity hierarchy, the lit blue CTA) is built on the premise of a black ground. A light theme would invert the conceptual model — objects would sit on a surface rather than float in a void — and break the brand.

The only “light” surfaces anywhere in the system are the soft pink (#ffe6e6) and mint (#c1f6e8) grounds that appear inside 3D scene artwork and illustrations — never as page chrome. They are content, not theme. If you must produce a light variant for an embedded or co-branded context, treat it as a separate brand expression, not a token swap: re-derive depth from real drop shadows (which become visible on light grounds), pull the white-opacity ladder to a black-opacity ladder, and keep the blue CTA and candy accents intact as the throughline.

13. Lineage & Influences

Spline’s marketing surface descends from the lineage of 3D and creative-tool brands that turn their own output into the page. The conviction — “don’t describe the tool, render it” — is the same one Rive applies to 2D motion and that game-engine and creative-coding brands have used for years: the homepage is a viewport into the product. Spline’s specific contribution is taking that into real-time WebGL 3D running in a browser tab, so the page literally renders the same engine the user is about to open.

Chromatically and structurally, Spline sits at an intersection. The true-black, white-opacity, single-accent discipline of the core UI is the modern dark-developer-tool vocabulary shared with Linear and Vercel — but where those brands stop at one cool accent and stay austere, Spline breaks discipline deliberately with a candy-bright multi-color accent set (red / yellow / purple / pink / green) that descends from the playful, friendly register of Figma and the creative-community energy of design-asset marketplaces. The result is a hybrid: the seriousness of a pro engineering tool plus the fun of a creative toy. The plan-tier colors (teal “Super”, violet “Team”) and the studio’s own warm-geometric Spline Sans complete a system that is unmistakably its own — colder and more void-like than Figma, warmer and more playful than Linear.

Influences:

  • Linear — the true-black / white-opacity-ladder / single-accent dark-tool discipline that governs Spline’s core chrome https://linear.app
  • Figma — permission to be playful and friendly in a professional design tool; the multi-color, approachable register https://figma.com
  • Vercel — black-canvas developer-brand minimalism and the conviction that restraint reads as premium https://vercel.com
  • Rive — the sibling “the page is the demo” stance, applied to interactive 2D motion where Spline applies it to 3D https://rive.app
  • Three.js — the WebGL-in-the-browser lineage that makes real-time 3D on a marketing page possible at all https://threejs.org

What Spline rejects: soft charcoal “comfortable dark” grounds (it commits to true black), drop-shadow elevation systems (invisible on black — it uses glow and 3D instead), static screenshots as the dominant asset (it renders live scenes), and single-accent austerity (it keeps the playful rainbow). The rejections are what let Spline read as a creative instrument rather than another austere dev tool.

14. Do’s and Don’ts

Do

  • Do commit to true black (#000000) for the canvas. The void is the brand — it’s what makes 3D scenes float.
  • Do keep the primary CTA electric blue (#0062ff) at 12px radius. It’s the one loud element; let it glow.
  • Do give the secondary CTA a different shape (translucent white, full pill) so the two action tiers read distinctly.
  • Do build hierarchy from the white-opacity ladder (90 / 80 / 70 / 60 / 40%), not from separate gray hexes.
  • Do set display at weight 500, not 700. The airy medium-weight hero is the typographic signature.
  • Do reserve the candy accents (red / yellow / purple / pink / green) for 3D scenes, tags, and illustration — not for chrome.
  • Do use glow and 3D rendering for depth. On black, light is the only currency of elevation.
  • Do use frosted dark panels (rgba(30,30,35,0.8)) when referencing the editor UI — it ties the site to the product.
  • Do honor prefers-reduced-motion — hold WebGL scenes on a static frame and disable parallax.
  • Do keep the blue focus ring (#0062ff) everywhere — it doubles as accessibility and brand.

Don’t

  • Don’t soften the canvas to charcoal (#0d0d12, #18181b). That’s the generic dark-mode move; Spline commits to true black.
  • Don’t make the primary CTA a full pill. The 12px rounded-rect is intentional — the pill is the secondary shape.
  • Don’t stack drop shadows. They’re invisible on black and read as a misunderstanding of the system. Use glow.
  • Don’t bold the hero to 700. The medium-weight 58px display is what reads as premium-creative.
  • Don’t spray the candy accents across buttons and chrome. They live in scenes, tags, and art — the chrome stays monochrome-plus-blue.
  • Don’t use full brand blue (#0062ff) for body text on black — it’s borderline AA. Use blue-lighter (#5797ff) for links.
  • Don’t add a light-mode toggle. The black void is the conceptual foundation; a light theme breaks it.
  • Don’t crowd the void. One scene, one headline, one blue CTA per viewport — the black needs room to breathe.
  • Don’t mix in a second typeface. Spline Sans (plus its mono cut) covers everything; cohesion is the point.
  • Don’t ship heavy WebGL scenes without a static poster fallback for low-power devices.

15. Agent Prompt Guide

Quick Color Reference

Canvas (true black): #000000
Surface (card): #0d0d10
Panel (frosted): rgba(30, 30, 35, 0.8)
Text (white): #ffffff
Text muted (70%): rgba(255, 255, 255, 0.7)
Brand blue (CTA / focus): #0062ff
Blue lighter (links/hover): #5797ff
Blue dark (pressed): #217ce5
Secondary CTA fill: rgba(255, 255, 255, 0.2)
Ghost button fill: rgba(255, 255, 255, 0.05)
Accent red: #fd585b   ·   yellow: #ffb01f
Accent purple: #a770ff   ·   pink: #ff5cab   ·   green: #47b35f
Super (plan): #00a376   ·   Team (plan): #915eff
Border: rgba(255, 255, 255, 0.1)

Example Component Prompts

  1. “Create a Spline-style hero on a true-black (#000000) canvas. Centred headline in Spline Sans 58px / weight 500 / -0.025em tracking, pure white. Below it a sub-headline in 18/400 at 70% white, max-width 720px. Two CTAs side by side: primary is electric blue (#0062ff) with white label, 12px radius, ~12×20px padding, 44px height — and a soft blue glow (rgba(0,98,255,0.4) 0 8px 32px) on hover; secondary is a translucent white pill (rgba(255,255,255,0.2) fill, full 50px radius). A full-bleed 3D scene placeholder sits behind/beside the copy. Stacks vertically at <640px.”

  2. “Design a Spline scene card: true-black (#000000) ground, 16px radius, 1px border at 8% white. Holds a placeholder for an embedded 3D scene that floats on the black. Below the scene: title in Spline Sans 20/600 white, a category tag pill in a candy accent (e.g. pink #ff5cab at 15% fill with #ff5cab text). On hover, the border brightens from 8% → 20% white over 240ms.”

  3. “Build a Spline feature section: barely-elevated band (#0a0a0c) on the black page. Left column has an eyebrow in Spline Sans 11/600/uppercase/0.06em at 70% white, a headline in 36/500 at 90% white, and body in 16/400 at 70% white. Right column shows a frosted editor panel (rgba(30,30,35,0.8) with backdrop-blur, 12px radius, 1px 10%-white border, deep black shadow). Section padding 96px vertical.”

  4. “Create a Spline ghost button: faint white fill (rgba(255,255,255,0.05)), 1px border at 10% white, white label in Spline Sans 15/600, 8px radius, ~10×16px padding. On hover, fill lifts to 6% white. Focus ring is 2px brand blue (#0062ff) with 2px offset.”

  5. “Design a Spline pricing tier card on black: surface #0d0d10, 12px radius, 1px 10%-white border, 24px padding. The ‘Super’ tier gets a teal accent (#00a376) badge and teal-lit blue CTA; the ‘Team’ tier gets a violet accent (#915eff). Tier name in 24/600 white, price in 40/500 white, feature list in 14/400 at 70% white with check icons in the tier color.”

  6. “Style a Spline form: input has faint white fill (rgba(255,255,255,0.05)), 1px 10%-white border, 8px radius, 40px height, white text, placeholder at 20% white. Label above in 13/500 at 80% white, required marker is a red asterisk (#fd585b). On focus the border becomes 2px brand blue (#0062ff). Submit is the blue (#0062ff) primary CTA.”

Iteration Guide

  1. Go true black, not charcoal. If the canvas reads as “comfortable dark mode,” it’s wrong — push it to #000000. The void is what makes everything float. Soft charcoal is the generic move Spline explicitly rejects.

  2. Ration the blue. If multiple blue elements compete, you’ve diluted the signal. There should be essentially one electric-blue CTA per viewport, glowing alone against the black. Everything else is white, translucent-white, or a candy accent in a scene.

  3. Build hierarchy from opacity, not gray. If you’re reaching for #888 or #aaa for secondary text, stop — use white at 70 / 60 / 40% opacity instead. It keeps every shade chromatically neutral on the black ground.

  4. Drop the display weight to 500. If the hero reads as “loud SaaS,” check the weight — it should be medium (500) at ~58px, not bold (700). The airy medium-weight headline is the single biggest tell of the Spline register.

  5. Trade shadows for glow. If cards have drop shadows, they’re invisible (or muddy) on black. Replace shadow-based elevation with brighter borders/fills on hover and a blue glow on the CTA. Depth on black comes from emitted light, not cast shadow.

  6. Let the accents live in the scenes. If red / yellow / pink are showing up on buttons or section backgrounds, pull them back into the 3D scenes, illustration art, and category tags. The chrome stays monochrome-plus-blue; the rainbow is for content.

  7. Mind the blue’s contrast role. Solid #0062ff is for CTA fills (white label, AA at the 15/600 size). For blue text on black, switch to blue-lighter (#5797ff) which clears AAA. Don’t set body links in full brand blue.

  8. Reference the editor. Adding a frosted dark panel (rgba(30,30,35,0.8), backdrop-blur, deep shadow) that looks like the actual Spline app instantly ties a generic dark page back to the brand — it signals “this is a real tool,” which is the whole pitch.

Ship with this

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

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