getComputedStyle() from the live screenshots visible here.
Color Palette
53 colors extracted via getComputedStyle(). Click any swatch to copy its hex value.
Background & Surface
Text & Content
Accent & Interactive
Border & Divider
Semantic States
Full Extracted Palette (+211)
Typography
All values extracted via getComputedStyle() — no estimation.
| Role | Font Family | Size / Weight | Line Height | Letter Spacing | Preview |
|---|---|---|---|---|---|
| Display Hero | Circular | 72px / w400 | 1 | normal | Display Hero |
| Sub-heading | Circular | 36px / w400 | 1.2 | normal | Sub-heading |
| Label Heading | Circular | 18px / w400 | 1.56 | normal | Label Heading |
| Label Heading | Circular | 16px / w400 | 1.5 | normal | Label Heading |
| Button | Circular | 14px / w400 | 1.43 | normal | Button |
| Button | Circular | 14px / w500 | 1.14 | normal | Button |
| Button Small | Circular | 12px / w400 | 1.33 | normal | Button Small |
Live Components
Rendered in real HTML using your extracted tokens — no screenshots.
Buttons
Form Inputs
Card
Badges & Labels
Spacing Scale
Border Radius
0px
6px
8px
12px
16px
32px
9999px
Component Specs
Extracted CSS values per component and variant state.
### Buttons
- Background: `#fdfdfd` `{colors.surface-2}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 4px 10px
- Radius: 6px
- Border: 1px solid rgb(212, 212, 212)
- Font: 12px weight 400
- Use: Bright CTA on dark sections
- Background: `transparent`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 4px 10px
- Radius: 6px
- Border: 1px solid rgba(0, 0, 0, 0)
- Font: 12px weight 400
- Use: Subtle action, toolbar, nav button
- Background: `#72e3ad` `{colors.primary}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 4px 10px
- Radius: 6px
- Border: 1px solid oklab(0.685565 -0.144466 0.057858 / 0.75)
- Font: 12px weight 400
- Use: Primary CTA / brand action
- Background: `#72e3ad` `{colors.primary}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px 16px
- Radius: 6px
- Border: 1px solid oklab(0.685565 -0.144466 0.057858 / 0.75)
- Font: 14px weight 400
- Use: Primary CTA / brand action
- Background: `#fdfdfd` `{colors.surface-2}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px 16px
- Radius: 6px
- Border: 1px solid rgb(212, 212, 212)
- Font: 14px weight 400
- Use: Bright CTA on dark sections
Cards & Containers
- Background: `#ffffff`
- Padding: 24px
- Radius: 16px
- Border: 1px solid rgb(223, 223, 223)
- Use: Content containers, listing items
Inputs & Forms
- Background: `#171717` `{colors.ink-muted}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px
- Radius: 6px
- Border: 1px solid rgb(199, 199, 199)
- Font: 14px weight 400
- Use: Text fields, search inputs
- Focus: boxShadow: `rgb(178, 178, 178) 0px 0px 0px 2px, rgb(243, 243, 243) 0px 0`, outline: `rgba(0, 0, 0, 0) none 2px`
Tabs
- Background: `#fdfdfd` `{colors.surface-2}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px 32px
- Radius: 9999px
- Border: 1px solid rgb(23, 23, 23)
- Font: 14px weight 400
- Use: Navigation tabs, filter tabs
Alerts
- Background: `#fcfcfc` `{colors.background}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 12px 20px
- Radius: 8px
- Border: 1px solid rgb(232, 232, 232)
- Font: 14px weight 400
- Use: System alert, banner notification, toast
Interaction State Narrative
- **Input**:
- - **focus:** shadow added
Buttons
- **DO NOT introduce new buttons variants** without justification
Cards & Containers
- **DO NOT introduce new cards & containers variants** without justification
Inputs & Forms
- **DO NOT introduce new inputs & forms variants** without justification
Tabs
- **DO NOT introduce new tabs variants** without justification
Alerts
- **DO NOT introduce new alerts variants** without justification
Visual Reference
Playwright screenshots captured during extraction — source of truth for all tokens.
Breakpoints
Elevation & Depth
Shadow levels rendered live — every value extracted directly from the design system.
rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.1) 0px 4px 6px -4px
Motion & Transitions
3 motion tokens — easing curves and durations.
| --ease-in | cubic-bezier(.4,0,1,1) |
| --ease-out | cubic-bezier(0,0,.2,1) |
| --ease-in-out | cubic-bezier(.4,0,.2,1) |
Motion Timeline
4 keyframe animations extracted from the live page. Preview 4 below — each block is animating right now with the actual extracted keyframes.
swipe-out
sonner-fade-in
sonner-fade-out
sonner-spin
Component States
Default → Hover → Focus → Active visual diff per component. Captured via Playwright state simulation.
| Component | States | |
|---|---|---|
| button |
default
button
bg rgba(0, 0, 0, 0)
fg rgb(82, 82, 82) | |
| input |
default
input
bg oklab(0.204404 0.00000931323 0.00000409782 / 0.026)
fg rgb(23, 23, 23) |
focus
input
bg transparent
fg inherit |
| link |
default
link
bg rgba(0, 0, 0, 0)
fg rgb(23, 23, 23) | |
| card |
default
card
bg rgb(255, 255, 255)
fg rgb(23, 23, 23) | |
| navLink |
default
navLink
bg rgba(0, 0, 0, 0)
fg rgb(23, 23, 23) |
Z-Index Stacking Context
100 z-index values detected. Top 20 ordered by stacking priority. ● 100+ (modals) · ● 10-99 (overlays) · ● 1-9 (UI chrome).
Export tokens
Copy these design tokens to any framework. Generated from supabase.com live extraction.
Clicks copy to clipboard AND download the file. All values from getComputedStyle() on the live page — no estimates.
DESIGN.md
Narrative design system document — paste directly into Claude Code, Cursor, or Bolt.
---
version: alpha
name: supabase.com
description: "Light product system built on #fcfcfc with #72e3ad as the primary CTA accent. Type anchored in Circular at 72px / weight 400. Extracted automatically from https://supabase.com/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
narrative: |
supabase.com is built on a pure-white canvas (rgb(252, 252, 252)).
The system uses rgb(114, 227, 173) as the accent for primary actions and brand signals.
Circular as the primary typeface.
Circular is paired with custom-font for secondary roles.
A restrained elevation system (2 distinct shadows) — shadows reserved for the few elements that must lift off the page.
Interactions are smoothed by transitions across many elements, with little or no keyframe animation.
colors:
background: "#fcfcfc"
surface-1: "#e8e8e8"
surface-2: "#fdfdfd"
ink: "#171717"
ink-muted: "rgba(23, 23, 23, 0.65)"
ink-subtle: "#8a8f98"
primary: "#72e3ad"
on-primary: "#111111"
primary-hover: "#3ecf8e"
hairline: "#dfdfdf"
semantic-error: "#e60000"
semantic-success: "#008a2e"
semantic-warning: "#fdf5d3"
semantic-info: "#0973dc"
typography:
display-xl:
fontFamily: "Circular, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
fontSize: 72px
fontWeight: 400
lineHeight: 1
letterSpacing: 0
display-md:
fontFamily: "Circular, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
fontSize: 36px
fontWeight: 400
lineHeight: 1.2
letterSpacing: 0
headline:
fontFamily: "Circular, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
fontSize: 18px
fontWeight: 400
lineHeight: 1.56
letterSpacing: 0
body:
fontFamily: "Circular, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
fontSize: 12px
fontWeight: 400
lineHeight: 1.33
letterSpacing: 0
button:
fontFamily: "Circular, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
fontSize: 14px
fontWeight: 400
lineHeight: 1.43
letterSpacing: 0
rounded:
none: 0px
xs: 6px
sm: 8px
md: 12px
lg: 16px
xl: 32px
pill: 9999px
spacing:
xxs: 2px
xs: 4px
sm: 8px
md: 16px
lg: 64px
xl: 72px
xxl: 88px
components:
button-light--invert:
backgroundColor: "{colors.surface-2}"
textColor: "{colors.ink-muted}"
typography: "{typography.body}"
rounded: "{rounded.xs}"
padding: 4px 10px
button-ghost:
backgroundColor: "transparent"
textColor: "{colors.ink-muted}"
typography: "{typography.body}"
rounded: "{rounded.xs}"
padding: 4px 10px
button-primary-brand:
backgroundColor: "{colors.primary}"
textColor: "{colors.ink-muted}"
typography: "{typography.body}"
rounded: "{rounded.xs}"
padding: 4px 10px
card-standard-card:
backgroundColor: "#ffffff"
typography: "{typography.headline}"
rounded: "{rounded.lg}"
padding: 24px
input-text-input:
backgroundColor: "{colors.ink-muted}"
textColor: "{colors.ink-muted}"
typography: "{typography.button}"
rounded: "{rounded.xs}"
padding: 8px
tab-pill-tab:
backgroundColor: "{colors.surface-2}"
textColor: "{colors.ink-muted}"
typography: "{typography.button}"
rounded: "{rounded.pill}"
padding: 8px 32px
alert-alert-banner:
backgroundColor: "{colors.background}"
textColor: "{colors.ink-muted}"
typography: "{typography.button}"
rounded: "{rounded.sm}"
padding: 12px 20px
extracted_at: "2026-06-11T05:43:51.116Z"
completeness: 90
scoreVersion: "v2"
---
# Design System — supabase.com
> Extracted automatically by Prism from https://supabase.com
> Date: 2026-06-11
> Viewport: Desktop 1440x900 + Mobile 390x844
> Values are extracted, not hand-written: rendered styles via getComputedStyle() + colors declared in CSS custom properties (token-only values are marked `(token)` and may not be painted).
## 0. Design DNA
**Density**: sparse | **Motion**: subtle | **Weight**: medium | **Aesthetic**: product-neutral
| Dimension | Value | Signal |
|---|---|---|
| Canvas | neutral | `#fcfcfc` |
| Type posture | sans-led (Circular) | "Build in a weekend" |
| Color assertion | dual-accent | #72e3ad |
| Whitespace | sparse | section rhythm 80px |
| Interaction | subtle | 4 keyframes, 16 transitions |
| Radius language | 6px-rounded | from token scale |
**Prism fingerprint**: `neutral-canvas · sans-display · dual-accent · 6px-rounded · subtle-motion`
> **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
>
> - **Canvas**: `rgb(252, 252, 252)` is the page background. Every component composits against this.
> - **Accent**: `rgb(114, 227, 173)` for primary CTAs ONLY. Never decorative.
> - **Body type**: 16px (token: `typography.body`). Default for ALL text not in a heading role.
> - **Section rhythm**: 80px between major bands. Card padding: 64px.
> - **Default radius**: 8px on buttons/inputs. Pills (`9999px`) only for icon-buttons or status chips.
>
> **Before generating UI**: import this DESIGN.md, scan §2 (Color Palette) + §4 (Components) + §10 (Agent Guide). Skip §11–12 unless extending.
## 1. Visual Theme & Atmosphere
supabase.com sits on a pure white canvas (`#fcfcfc`), a neutral foundation calibrated for sustained reading and component contrast.
Typography is anchored in **Circular**.
Body text reads in Near-Black (`#171717`) — softened from pure black, a small but deliberate detail that lowers reading friction. **#72e3ad** (`#72e3ad`) is the single high-saturation color in the system — it earns its presence only on interactive elements, making CTAs and links the unmistakable focal points against the otherwise neutral palette. Elevation comes from a small, deliberate set of shadows (2 distinct), each a multi-layer stack — several blurred layers at varying offsets — used sparingly rather than across the whole UI.
Motion design uses smooth easing curves for polished state transitions.
**Key Characteristics:**
- Background: Pure White (`#fcfcfc`)
- Primary typeface: custom-font
- Primary text: Near-Black (`#171717`)
- Accent: #72e3ad (`#72e3ad`)
- Display: 72px weight 400
- Shadow system: 2 distinct elevation levels
- Custom fonts loaded: custom-font
## 2. Color Palette & Roles
### Background & Surface
- **Pure White** (`#fcfcfc`): Page background (primary)
- **Border** (`#dfdfdf`): Surface / elevated background
- **Whitesmoke** (`#e8e8e8`): Surface / elevated background
- **Pure White** (`#fdfdfd`): Surface / elevated background
- **White** (`#ffffff`): Surface / elevated background
### Text & Content
- **Near-Black** (`#171717`): Primary body text
- **Black** (`#000000`): Secondary text
### Accent & Interactive
- **Brand 1100** (`#2b825b`): Accent / interactive (CSS var)
- **Brand 700** (`#8ed2af`): Accent / interactive (CSS var)
- **Brand 1000** (`#40bf86`): Accent / interactive (CSS var)
- **Brand 100** (`#fafefd`): Accent / interactive (CSS var)
- **Brand 1200** (`#122b20`): Accent / interactive (CSS var)
- **Brand 900** (`#3fcf8e`): Accent / interactive (CSS var)
- **Brand 800** (`#34b27b`): Accent / interactive (CSS var)
### Border & Divider
- **Light Grey** (`#d4d4d4`): Borders / dividers
- **Light Grey** (`#c7c7c7`): Borders / dividers
### Full Extracted Palette
**19 colors rendered on the page** + **200** more declared in design tokens (CSS custom properties — not necessarily painted). (16 categorized above + 203 additional below.)
Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.
- `#525252` — Charcoal
- `#3ecf8e` — #3ecf8e
- `#72e3ad` — #72e3ad
- `#707070` — Slate Grey
- `#b2b2b2` — Grey
- `#f3f3f3` — Off-White
- `#a9f1ca` — #a9f1ca
- `#ededed` — Whitesmoke
- `#00bb68` — Emerald
- `#f9f1fe` — Ghost White *(token)*
- `#add6ff` — Light Blue *(token)*
- `#f9d8ec` — Soft Pink *(token)*
- `#ffcca7` — Pink *(token)*
- `#fa934e` — Tangerine *(token)*
- `#5746af` — #5746af *(token)*
- `#96c7f2` — Baby Blue *(token)*
- `#be93e4` — Plum *(token)*
- `#fff4d5` — Beige *(token)*
- `#ccebd7` — #ccebd7 *(token)*
- `#e1f0ff` — Light Gray *(token)*
- `#eceef0` — Off-White *(token)*
- `#e93d82` — Cherry *(token)*
- `#687076` — Dim Gray *(token)*
- `#fdfdfc` — Pure White *(token)*
- `#eeeeee` — Off-White *(token)*
- `#e3ccf4` — Soft Pink *(token)*
- `#cd1d8d` — #cd1d8d *(token)*
- `#e4defc` — Light Gray *(token)*
- `#3d0d1d` — Near Black *(token)*
- `#30a46c` — Teal *(token)*
- `#fffcfd` — Pure White *(token)*
- `#0081f1` — #0081f1 *(token)*
- *…+171 more in `raw-css.json` (`desktop.allColors`).*
### CSS Custom Properties (Design Tokens)
**Font Family Token**
- `--font-family-body`: `Inter`
- `--default-font-family`: `Circular,custom-font,Helvetica Neue,Helvetica,Arial,sans-serif`
- `--default-mono-font-family`: `Source Code Pro,Office Code Pro,Menlo,monospace`
**Primary Brand Color**
- `--color-brand-600`: `hsl(156.5deg 86.5% 26.1%)`
- `--color-brand-300`: `hsl(147.5deg 72% 80.4%)`
- `--color-brand-200`: `hsl(147.6deg 72.5% 90%)`
- `--color-brand-1100`: `#2b825b`
**Shadow Token**
- `--tw-inset-ring-shadow`: `0 0 #0000`
- `--tw-inset-shadow`: `0 0 #0000`
- `--tw-shadow-alpha`: `100%`
- `--tw-ring-shadow`: `0 0 #0000`
**Warning**
- `--color-amber-300`: `#fff4d5`
- `--color-amber-1000`: `#ffa01c`
- `--color-yellow-1100`: `#946800`
- `--color-amber-100`: `#fefdfb`
**Spacing Token**
- `--spacing-scale`: `2px`
- `--tw-space-x-reverse`: `0`
- `--spacing-lg`: `32px`
- `--card-padding-x-md`: `1.5rem`
**Success**
- `--color-green-500`: `#ccebd7`
- `--color-green-900`: `#30a46c`
- `--color-green-400`: `#ddf3e4`
- `--color-green-100`: `#fbfefc`
**Border Radius Token**
- `--borderradius-lg`: `8px`
- `--radius-sm`: `.25rem`
- `--borderradius-sm`: `4px`
- `--radius-md`: `.375rem`
**Error / Destructive**
- `--color-red-1200`: `#381316`
- `--color-red-1100`: `#cd2b31`
- `--color-red-800`: `#eb9091`
- `--color-red-500`: `#fdd8d8`
**Border**
- `--color-border`: `hsl(0deg 0% 87.5%)`
**Motion Token**
- `--tw-animation-direction`: `normal`
- `--tw-animation-fill-mode`: `none`
- `--tw-animation-delay`: `0s`
**Font Weight Token**
- `--font-weight-extrabold`: `800`
- `--font-weight-medium`: `500`
- `--font-weight-normal`: `400`
- `--font-weight-bold`: `700`
**Z-Index Token**
- `--z-index`: `1`
**Other tokens**
- `--color-purple-300`: `#f9f1fe`
- `--colors-slate-light-alpha-200`: `#05294d08`
- `--colors-slate-dark-300`: `192deg 7.2% 13.5%`
- `--color-pink-500`: `#f9d8ec`
- `--color-orange-600`: `#ffcca7`
- `--color-orange-800`: `#fa934e`
- `--color-neutral-600`: `oklch(43.9% 0 0)`
- `--color-violet-1100`: `#5746af`
## 3. Typography Rules
### Font Families
- **Primary**: `Circular`
- **Secondary**: `custom-font`
- **Font 3**: `Source Code Pro`
### Custom Fonts Loaded
- **custom-font** weight 400 (normal)
- **custom-font** weight 500 (normal)
### Typography Hierarchy
| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| Display Hero | Circular | 72px | 400 | 1 | normal | Main headline (h1) |
| Sub-heading | Circular | 36px | 400 | 1.2 | normal | Third-level heading (h3) |
| Label Heading | Circular | 18px | 400 | 1.56 | normal | Small heading (H4) |
| Label Heading | Circular | 16px | 400 | 1.5 | normal | Small heading (H6) |
| Button | Circular | 14px | 400 | 1.43 | normal | Button label (14px) |
| Button | Circular | 14px | 500 | 1.14 | normal | Button label (14px) |
| Button Small | Circular | 12px | 400 | 1.33 | normal | Button label (12px) |
### Font Weight Scale
CSS custom properties define 6 explicit weight steps:
- `--font-weight-light`: `300` — Light
- `--font-weight-normal`: `400` — Regular
- `--font-weight-medium`: `500` — Medium
- `--font-weight-semibold`: `600` — SemiBold
- `--font-weight-bold`: `700` — Bold
- `--font-weight-extrabold`: `800` — ExtraBold
### Full Font Size Scale
Sizes detected in the design (descending): `72px`, `36px`, `24px`, `18px`, `16px`, `14px`, `12px`
> 1 size(s) detected outside the sampled hierarchy (24px). These appear on elements not in the sampled set — likely additional display sizes, marketing-section overrides, or third-party-widget styles.
## 4. Component Stylings
### Buttons
**Light / Invert**
- Background: `#fdfdfd` `{colors.surface-2}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 4px 10px
- Radius: 6px
- Border: 1px solid rgb(212, 212, 212)
- Font: 12px weight 400
- Use: Bright CTA on dark sections
**Ghost**
- Background: `transparent`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 4px 10px
- Radius: 6px
- Border: 1px solid rgba(0, 0, 0, 0)
- Font: 12px weight 400
- Use: Subtle action, toolbar, nav button
**Primary Brand**
- Background: `#72e3ad` `{colors.primary}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 4px 10px
- Radius: 6px
- Border: 1px solid oklab(0.685565 -0.144466 0.057858 / 0.75)
- Font: 12px weight 400
- Use: Primary CTA / brand action
**Primary Brand**
- Background: `#72e3ad` `{colors.primary}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px 16px
- Radius: 6px
- Border: 1px solid oklab(0.685565 -0.144466 0.057858 / 0.75)
- Font: 14px weight 400
- Use: Primary CTA / brand action
**Light / Invert**
- Background: `#fdfdfd` `{colors.surface-2}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px 16px
- Radius: 6px
- Border: 1px solid rgb(212, 212, 212)
- Font: 14px weight 400
- Use: Bright CTA on dark sections
### Cards & Containers
**Standard Card**
- Background: `#ffffff`
- Padding: 24px
- Radius: 16px
- Border: 1px solid rgb(223, 223, 223)
- Use: Content containers, listing items
### Inputs & Forms
**Text Input**
- Background: `#171717` `{colors.ink-muted}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px
- Radius: 6px
- Border: 1px solid rgb(199, 199, 199)
- Font: 14px weight 400
- Use: Text fields, search inputs
- Focus: boxShadow: `rgb(178, 178, 178) 0px 0px 0px 2px, rgb(243, 243, 243) 0px 0`, outline: `rgba(0, 0, 0, 0) none 2px`
### Tabs
**Pill Tab**
- Background: `#fdfdfd` `{colors.surface-2}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 8px 32px
- Radius: 9999px
- Border: 1px solid rgb(23, 23, 23)
- Font: 14px weight 400
- Use: Navigation tabs, filter tabs
### Alerts
**Alert Banner**
- Background: `#fcfcfc` `{colors.background}`
- Text: `#171717` `{colors.ink-muted}`
- Padding: 12px 20px
- Radius: 8px
- Border: 1px solid rgb(232, 232, 232)
- Font: 14px weight 400
- Use: System alert, banner notification, toast
## 4b. Component Behaviors (State Matrix)
### Interaction State Narrative
- **Input**:
- **focus:** shadow added
*State transitions extracted via Playwright simulation — exact values in the YAML matrix below.*
```yaml
component-behaviors:
button:
default:
bg: "rgba(0, 0, 0, 0)"
fg: "rgb(82, 82, 82)"
input:
default:
bg: "oklab(0.204404 0.00000931323 0.00000409782 / 0.026)"
fg: "rgb(23, 23, 23)"
border: "1px solid rgb(199, 199, 199)"
focus:
bg: "transparent"
fg: "inherit"
shadow: "rgb(178, 178, 178) 0px 0px 0px 2px, rgb(243, 243, 243) 0px 0"
link:
default:
bg: "rgba(0, 0, 0, 0)"
fg: "rgb(23, 23, 23)"
hover:
bg: "transparent"
fg: "inherit"
card:
default:
bg: "rgb(255, 255, 255)"
fg: "rgb(23, 23, 23)"
border: "1px solid rgb(223, 223, 223)"
navLink:
default:
bg: "rgba(0, 0, 0, 0)"
fg: "rgb(23, 23, 23)"
tab:
default:
bg: "rgb(253, 253, 253)"
fg: "rgb(23, 23, 23)"
border: "1px solid rgb(23, 23, 23)"
footerLink:
default:
bg: "rgba(0, 0, 0, 0)"
fg: "rgb(0, 187, 104)"
hover:
bg: "transparent"
fg: "inherit"
```
**Agent usage**: Validate generated components against this matrix. If your output's `:hover` state changes properties not listed here, you are off-brand.
## 4c. Component Vocabulary (Closed System)
*This brand uses ONLY the following component vocabulary. Introducing new variants without justification breaks the system's tonal coherence.*
### Buttons
- **3 shape(s)** in this system: `Light / Invert`, `Ghost`, `Primary Brand`
- **DO NOT introduce new buttons variants** without justification
### Cards & Containers
- **1 shape(s)** in this system: `Standard Card`
- **DO NOT introduce new cards & containers variants** without justification
### Inputs & Forms
- **1 shape(s)** in this system: `Text Input`
- **DO NOT introduce new inputs & forms variants** without justification
### Tabs
- **1 shape(s)** in this system: `Pill Tab`
- **DO NOT introduce new tabs variants** without justification
### Alerts
- **1 shape(s)** in this system: `Alert Banner`
- **DO NOT introduce new alerts variants** without justification
## 5. Layout Principles
### Layout Type
**top-nav + content**
### Grid
Single column, centered content
### Max Width
1128px
### Spacing System
Generous spacing — editorial breathing room
| Token | Value |
|-------|-------|
| xxs | 2px |
| xs | 4px |
| sm | 8px |
| md | 16px |
| base | 32px |
| lg | 64px |
| xl | 72px |
| 2xl | 80px |
| 3xl | 88px |
### Border Radius Scale
| Name | Value | Use |
|------|-------|-----|
| None | 0px | No rounding |
| Xs | 6px | Tiny corners (badges, micro elements) |
| Sm | 8px | Buttons, inputs, small elements |
| Md | 12px | Cards, containers |
| Lg | 16px | Large rounded elements, pill segments |
| Xl | 32px | Category strips, featured containers |
| Full | 9999px | Pills, avatars, circular elements |
### Shape Language
| Component | Border Radius |
|-----------|---------------|
| Buttons | `6px` |
| Cards & Containers | `16px` |
| Inputs & Forms | `6px` |
| Tabs | `9999px` |
| Alerts | `8px` |
| Page Body | `0px` |
| Navigation | `0px` |
| Primary Input | `6px` |
**Shape Personality**: Sharp + Pill Contrast — Angular precision with pill-shaped accents (status badges, tags). Creates strong visual hierarchy.
**Full Radius Spectrum**: 6px, 7px, 8px, 11px, 12px, 16px (from `allBorderRadii` scan)
## 5b. Spacing Rhythm Names
**Measured section padding**: bands use ~96px internal vertical padding (up to 128px) — **very airy / premium**. (Distinct from the gap *between* sections above.) Reproduce this generous vertical breathing room; cramped spacing is the #1 tell of a cheap clone.
*Named spacing tokens with explicit use cases. Use these names in YOUR code instead of raw pixels for consistency.*
| Name | Value | Use case |
|------|-------|----------|
| **hero** | `88px` | Top/bottom of full-bleed hero sections |
| **section** | `72px` | Between major bands (color change, content shift) |
| **subsection** | `64px` | Within a section, between content groups |
| **card** | `16px` | Card padding, list-item spacing |
| **compact** | `8px` | Form fields, tight clusters, badge padding |
| **micro** | `4px` | Icon-text gap, tag inner padding |
**Agent rule**: NEVER hardcode raw pixel values for spacing in generated UI. Always reference these named tokens (`spacing-rhythm.section`, etc.).
## 5c. Widget & Structure Library
Structural patterns extracted from the page DOM — these are the **blueprints** an agent should follow to reproduce the page architecture (not just CSS values).
**4/8 structural patterns detected.**
### Hero Pattern
- **Composition:** centered — Centered composition — heading + subheading + CTAs stacked vertically, content centered horizontally. Common for SaaS marketing pages.
- **Viewport coverage:** 608px tall (not full-viewport)
- **Heading:** "Build in a weekendScale to millions" — 72px center-aligned
- **Subheading:** "Supabase is the Postgres development platform. Start your project with a Postgres database, Authentication, instant APIs, Edge Functions, Realtime sub"
- **CTAs:** 2 (primary: "Start your project")
- **Clone instruction:** Reproduce the **centered** layout. Use the heading font-size token at the documented size. Pair the centered text with the hero’s decorative visual (gradient / SVG / hero image — see §9b), not bare text.
### Navigation Pattern
- **Position:** static (scrolls with page)
- **Layout:** logo-left-links-left — Logo and links both on the left (CTAs typically right)
- **Height:** 65px
- **Logo:** ✓ present
- **Nav links:** 3 primary items
- **CTAs in nav:** 3
- **Clone instruction:** Build a static logo left links left navigation. Reserve 3 slots for primary CTAs.
### Card Grid Pattern
- **Card count:** 3 cards detected
- **Columns (desktop):** 1-up grid
- **Card dimensions:** 1600×1080px (aspect 1.48:1)
- **Gap:** 0px between cards
- **Content:** ✓ image
- **Image position:** top
- **Clone instruction:** Build a 1-column grid (desktop) with cards at ~1.48:1 aspect ratio. Each card has an image at the top.
### Footer Pattern
- **Columns:** 2
- **Links:** 68 total
- **Height:** 1058px
- **Includes:** ✓ newsletter signup | ✓ social icons | ✓ copyright
- **Clone instruction:** Build a 2-column footer with ~34 links per column, newsletter signup, social media links, and a copyright line.
## 6. Depth & Elevation
| Level | Treatment | Use |
|-------|-----------|-----|
| Flat (Level 0) | No shadow | Page background, content blocks |
| Layered (Level 1) | <br>`rgba(0, 0, 0, 0.1) 0px 10px 15px -3px`,<br>`rgba(0, 0, 0, 0.1) 0px 4px 6px -4px` | Cards, elevated surfaces |
**Shadow Philosophy**: Multi-layered shadow system creating natural, atmospheric depth. Each shadow level combines multiple layers for realistic elevation.
## 7. Motion & Interaction
### Easing System
| CSS Variable | Curve | Semantic Name |
|--------------|-------|---------------|
| `--ease-in` | `cubic-bezier(.4,0,1,1)` | Custom Ease — Balanced |
| `--default-transition-timing-function` | `cubic-bezier(.4,0,.2,1)` | Ease Out — Decelerating |
| `--ease-out` | `cubic-bezier(0,0,.2,1)` | Ease Out — Decelerating |
| `--ease-in-out` | `cubic-bezier(.4,0,.2,1)` | Ease Out — Decelerating |
| `--tw-ease` | `cubic-bezier(0,0,.2,1)` | Ease Out — Decelerating |
### Duration Scale
| CSS Variable | Value | Tier |
|--------------|-------|------|
| `--default-transition-duration` | `.15s` | Fast |
| `--tw-duration` | `.2s` | Normal |
### Copy-Paste Transition Snippets
**Transform**
```css
transition: transform 0.4s, opacity 0.4s, height 0.4s, box-shadow 0.2s;
```
**Opacity**
```css
transition: opacity 0.4s;
```
**All Props**
```css
transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1);
```
**All Props**
```css
transition: 0.2s cubic-bezier(0, 0, 0.2, 1);
```
### Keyframe Animation Catalog
| Animation Name | Type | Animated Props | Use Hint |
|----------------|------|----------------|----------|
| `swipe-out` | Fade + Move | transform, opacity | Swipe gesture dismiss |
| `sonner-fade-in` | Fade + Move | opacity, transform | Element entrance |
| `sonner-fade-out` | Fade + Move | opacity, transform | Element exit |
| `sonner-spin` | Fade | opacity | Loading indicator |
### Motion Fingerprint
- **Speed Character**: Deliberate & Calm (median duration: `300ms`)
- **Dominant Easing**: custom cubic-bezier curves
- **Animation Library**: 4 unique animations (4 total including variants)
> This design moves with deliberate & calm timing using custom cubic-bezier curves, creating a UI that feels calm and controlled.
## 8. Do's and Don'ts
### Do
- Use Pure White (`#fcfcfc`) as the page background — it's intentionally not pure white
- Use Near-Black (`#171717`) for text — not pure black, it's warmer and more readable
- Use Circular as the primary typeface — it defines the brand personality
- Use the extracted shadow patterns for elevation — they are tuned to match the brand palette
- Use #72e3ad (`#72e3ad`) as the primary accent — it's the brand's signature interactive color
- Use 6px border-radius on buttons — the standard corner rounding for interactive elements
- Apply 24px padding inside cards — matches the design system's content breathing room
- Use 16px border-radius on cards — consistent with the grid card corners
- Style form inputs with a `1px solid rgb(199, 199, 199)` border — use border-based inputs, not floating labels or underline-only
- Maintain nav height at 65px — consistent vertical space for the navigation bar
- Respect the 4px–72px spacing range — the design uses a wide scale for visual breathing room
- Include exactly 2 CTAs in the hero (primary + secondary) — this design pattern is multi-action, not single-purpose
- Each card includes a top image — imagery is part of the card identity, not optional
- Include a newsletter signup in the footer — email capture is part of the conversion funnel
### Don't
- Don't use pure white (`#ffffff`) as a page background — the warm tone is part of the brand identity
- Don't use pure black (`#000000`) for text — the near-black adds warmth
- Don't substitute with generic sans-serif or serif — the custom font carries the brand
- Don't invent new shadow values — use only the extracted shadow levels
- Don't introduce additional saturated accent colors — the palette is intentionally controlled
- Don't remove the input border — the border is the primary affordance indicator for form fields
- Don't collapse or hide the nav on scroll without an explicit scroll-triggered animation — the design uses fixed nav presence
- Don't make the nav sticky — this design lets it scroll away to maximize content focus
## 7b. Enforceable Brand Rules
*Structured Do/Don't with reasoning and validation tests. Agents can programmatically verify generated UI.*
```yaml
rules:
- id: brand-canvas-001
type: do
rule: "Always use the page background `rgb(252, 252, 252)` as the base canvas"
why: "Every component is designed to composit against this exact tone"
test: "document.body.style.backgroundColor === 'rgb(252, 252, 252)'"
- id: brand-accent-001
type: do
rule: "Reserve `rgb(114, 227, 173)` for primary CTAs and brand-mark signals only"
why: "Single chromatic assertion device — overuse dilutes meaning"
test: "querySelectorAll('[style*=\"rgb(114, 227, 173)\"]').length <= 3 per fold"
```
## 9. Responsive Behavior
### Breakpoints
| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | 480px | Single column, compact spacing |
| Mobile Large | 520px | Expanded mobile layout |
| Mobile Large | 560px | Expanded mobile layout |
| Mobile Large | 720px | Expanded mobile layout |
| Tablet | 768px | Multi-column grids begin |
| Desktop | 1280px | Full feature layout |
### Token Diff — Desktop vs Mobile
| Element | Property | Desktop | Mobile |
|---------|----------|---------|--------|
| heading | font-size | `72px` | `36px` |
| heading | line-height | `72px` | `40px` |
| button | width | `auto` | `102px` |
| card | width | `auto` | `309.812px` |
### Collapsing Strategy
- Headlines: 72px → 36px on mobile
- Navigation: horizontal links → hamburger menu on mobile
- Cards: multi-column → stacked vertical on mobile
- Footer: multi-column → stacked single column on mobile
### Touch Targets
- Buttons: 0px padding
- Navigation: adequate spacing between items
- Interactive elements: minimum 44px touch target recommended
### Collapsing Narrative
How the structural patterns adapt from desktop to mobile (extracted from both viewport extractions):
- **Navigation collapses to hamburger** — 3 links visible on desktop, 0 on mobile (the rest hide behind a menu toggle).
- **Nav CTAs reduced** on mobile (3 → 0) — the design prioritizes content over conversion buttons at small sizes.
- **Footer columns collapse:** 2 columns (desktop) → 1 column (mobile).
## 7c. Visual Effects & Dynamic Behavior
*The live/dynamic layer beyond static CSS — reproduce these, not flat substitutes. This is often what separates a faithful clone from a wireframe.*
- **Glassmorphism** — 1 frosted/blur layer(s) (e.g. `blur(4px)`).
- **Clip-path shapes** — 8 non-rectangular cut(s).
- **CSS-variable animations** (1) — animated custom properties.
> **Motion fingerprint**: glassmorphism (1 layers), non-rectangular shapes (10)
## 9b. Visual Tone & Photography
**Tone:** Illustration-driven
The site relies primarily on illustrations, vector art, and decorative SVG elements rather than photography. Use commissioned illustrations, icon sets, or generated graphics for clones — stock photos will feel off-brand.
**Canonical Brand Image (OG):**
- https://supabase.com/images/og/supabase-og.png (800×600px)
*This is the image shown when the site is shared on social media — represents the brand visual essence.*
**Hero Image (above-fold dominant visual):**
- Aspect: 1:1 (square / portrait)
- Rendered size: 398×398px
- Alt text: "Supabase Postgres database"
- *Use this aspect ratio + composition for your clone's hero — mimicking the proportion preserves the visual hierarchy.*
**Aspect Ratio Distribution:**
- Landscape (1.15–2.3): 1 (9%)
- Portrait (<0.87): 8 (73%)
- Square (0.87–1.15): 2 (18%)
**Media Format Mix:**
- SVG: 17 (icons, illustrations, decorative geometry)
**Average rendered image size:** 283×364px
**Above-fold image count:** 4 / 11
**Decorative Patterns Detected:**
- 1 multi-stop linear gradient (mesh-like, 3+ color stops) — the brand leans on rich color transitions for visual depth
- 8 large decorative SVG shapes (≥200×200px, non-icon) — likely blob/illustration accents
- **Glassmorphism** detected (`backdrop-filter: blur`) — layered transparent surfaces with blur, modern OS-like aesthetic
**Clone instruction for decorative work:** Decorative SVG accents are part of the brand — generate or source blob/illustration shapes to scatter behind content.
**Imagery Guidance for clones:**
- Use vector illustration as the primary visual language — photos will read as off-brand.
- Maintain consistent illustration style (line weight, color palette) across the site.
## 10. Agent Prompt Guide
### Quick Reference
- Background: Pure White (`#fcfcfc`)
- Primary text: Near-Black (`#171717`)
- Accent: #72e3ad (`#72e3ad`)
- Border: Whitesmoke (`#dfdfdf`)
- Font: Circular
- Body: 16px weight 400
### Example Component Prompts
- "Create a hero section on Pure White background (#fcfcfc). Headline at 72px Circular weight 400, line-height 1, color #171717."
- "Create the primary CTA button: `#72e3ad` background, `#171717` text, 6px border-radius, 4px 10px padding, 500 weight, Circular font."
- "Design a card on `#ffffff` background. Border: 1px solid rgb(223, 223, 223). Radius: 16px. Shadow: none. Padding: 24px."
- "Build navigation: relative on `#fcfcfc`. Circular 16px weight 400 for links."
### Iteration Guide
1. **Canvas**: Set the light canvas to Pure White (`#fcfcfc`) — every component is composited against this exact base.
2. **Typography**: All type in Circular, weight range 300–800. Never exceed 800 — heavier weights break the brand's tonal restraint.
3. **Accent**: #72e3ad (`#72e3ad`) is the sole interactive color. On hover → #3ecf8e (`#3ecf8e`). Use CSS transitions, not opacity/brightness filters.
4. **Motion**: All transitions use `cubic-bezier(0.4,0,0.2,1)`. Timing: 150ms for micro-interactions, 200ms for layout changes. Never use linear for UI transitions — preserve the brand's easing personality.
5. **Shape**: CTAs at `6px`, cards at `16px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
6. **Spacing**: Use the `--ca-space-*` token scale (4px–72px). All padding, margin, and gap values are multiples from this scale — no magic numbers.
7. **Tokens**: Import from §11 CSS Export (`--ca-*` vars). Never hardcode hex values — always reference a token so theming remains consistent.
## 11. CSS Design Tokens Raw Export
*Copy-paste ready `:root {}` block — all values extracted directly from the live site.*
```css
/* Colors */
:root {
--ca-background: #fcfcfc;
--ca-surface-1: #e8e8e8;
--ca-surface-2: #fdfdfd;
--ca-ink-muted: #171717;
--ca-ink-subtle: #8a8f98;
--ca-primary: #72e3ad;
--ca-on-primary: #111111;
--ca-primary-hover: #3ecf8e;
--ca-hairline: #dfdfdf;
--ca-semantic-error: #e60000;
--ca-semantic-success: #008a2e;
--ca-semantic-warning: #fdf5d3;
--ca-semantic-info: #0973dc;
}
/* Typography */
:root {
--ca-font-primary: "Circular", system-ui, sans-serif;
--ca-text-display: 72px;
--ca-text-body: 12px;
--ca-text-button: 14px;
}
/* Spacing & Radius */
:root {
--ca-space-xxs: 2px;
--ca-space-xs: 4px;
--ca-space-sm: 8px;
--ca-space-md: 16px;
--ca-space-base: 32px;
--ca-space-lg: 64px;
--ca-space-xl: 72px;
--ca-space-2xl: 80px;
--ca-space-3xl: 88px;
--ca-radius-none: 0px;
--ca-radius-xs: 6px;
--ca-radius-sm: 8px;
--ca-radius-md: 12px;
--ca-radius-lg: 16px;
--ca-radius-xl: 32px;
--ca-radius-full: 9999px;
}
/* Motion */
:root {
--ca-ease-in: cubic-bezier(.4,0,1,1);
--ca-ease-out: cubic-bezier(0,0,.2,1);
--ca-ease-in-out: cubic-bezier(.4,0,.2,1);
}
```
## 13. Page Structure Skeleton
*The actual layout the source site uses. Reproduce these sections in order to match the site structure.*
```yaml
page-skeleton:
- section: hero
tag: div
height: 7738px
width: full-bleed
layout: block
children: 6
- section: hero
tag: div
classes: ["relative", "mt-[-65px]"]
height: 608px
width: full-bleed
layout: block
children: 1
vertical-padding: ~96px (airy)
- section: feature-section
tag: main
classes: ["relative"]
height: 6680px
width: full-bleed
layout: block
children: 12
vertical-padding: ~128px (airy)
- section: feature-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 608px
width: 1280px
layout: block
children: 1
vertical-padding: ~96px (airy)
padding: "96px 80px"
- section: logo-strip
tag: div
classes: ["pb-14", "md:pb-24"]
height: 196px
width: full-bleed
layout: block
children: 2
vertical-padding: ~48px
padding: "0px 0px 96px"
- section: pricing
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 952px
width: 1280px
layout: grid: 12-col gap=12px
children: 8
vertical-padding: ~48px
padding: "0px 80px 96px"
- section: unknown
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 282px
width: 1280px
layout: block
children: 1
vertical-padding: ~96px (airy)
padding: "96px 80px"
- section: feature-section
tag: div
classes: ["overflow-hidden", "pb-16", "md:pb-24"]
height: 854px
width: full-bleed
layout: block
children: 3
vertical-padding: ~48px
padding: "0px 0px 96px"
- section: feature-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 362px
width: 1280px
layout: flex-row justify=space-between
children: 2
vertical-padding: ~64px (generous)
padding: "96px 80px 32px"
- section: feature-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 293px
width: 1280px
layout: block
children: 1
vertical-padding: ~64px (generous)
padding: "128px 80px 0px"
- section: content-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 675px
width: 1400px
layout: block
children: 2
padding: "24px 80px 0px"
- section: feature-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 1124px
width: 1280px
layout: block
children: 2
vertical-padding: ~96px (airy)
padding: "96px 80px"
- section: feature-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 261px
width: 1280px
layout: flex-column justify=normal
children: 3
vertical-padding: ~48px
padding: "96px 80px 0px"
- section: content-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 524px
width: 1400px
layout: block
children: 3
padding: "24px 0px 0px"
- section: feature-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 429px
width: 1280px
layout: flex-column justify=normal
children: 3
vertical-padding: ~96px (airy)
padding: "96px 80px"
- section: feature-section
tag: div
classes: ["grid", "grid-cols-12", "items-center", "gap-4"]
height: 385px
width: full-bleed
layout: grid: 12-col gap=16px
children: 2
bg: "rgb(252, 252, 252)"
vertical-padding: ~128px (airy)
padding: "128px 64px"
- section: footer
tag: footer
height: 1058px
width: full-bleed
layout: block
children: 3
bg: "rgb(253, 253, 253)"
vertical-padding: ~96px (airy)
- section: unknown
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 100px
width: 1280px
layout: grid: 3-col gap=112px
children: 2
vertical-padding: ~40px
padding: "40px 80px"
- section: content-section
tag: div
classes: ["sm:py-18", "container", "relative", "mx-auto"]
height: 957px
width: 1280px
layout: block
children: 2
vertical-padding: ~96px (airy)
padding: "96px 80px"
```
**Agent rule**: rebuild sections in this order (sorted by vertical position). Match the layout primitive (grid N-col / flex direction / block).
## 14. Copy Library (Real Content from Source)
*Actual text content extracted from the live page. Use these strings verbatim when reproducing the site — they carry the brand voice.*
```yaml
copy:
section-headings:
- "Postgres Database"
- "Open source from day one"
sub-headings:
- "Trusted by the world’s most innovative companies."
- "Start building in seconds"
- "Stay productive and manage your app without leaving the dashboard"
ctas:
- "Accept"
- "Opt out"
- "Privacy settings"
- "Product"
- "Pricing"
- "104K"
- "Sign in"
- "Start your project"
navigation:
- "104K"
- "Pricing"
- "Docs"
- "Blog"
- "Sign in"
- "Start your project"
footer-links:
- "More on Security"
- "Twitter"
- "Pricing"
```
**Agent rule**: reuse these exact strings when generating UI. Do NOT translate or rephrase — brand voice is preserved through the original wording.
## 15. Asset Inventory (Image Roles & Ratios)
*Image inventory classified by role and aspect ratio. When reproducing the site, allocate this number of assets per role.*
```yaml
assets:
logo:
count: 43
avg-ratio: 2.17
common-aspect: "~16:9 landscape"
sample-alts:
- "mozilla"
- "github"
- "1password"
```
**Agent rule**: when generating placeholder images, match these counts and aspect ratios. Use neutral placeholder backgrounds for `product` (e.g. `#f5f5f5`), full-color photography hints for `hero` and `editorial`.
## 16. Component HTML Templates
*Suggested HTML markup for reproducing the key components — based on what was detected in the source DOM.*
### Button (primary action)
```html
<button class="btn btn-primary">
Accept
</button>
```
_Source pattern detected: padding `4px 10px` · radius `6px` · weight `400`_
### Generic Card
```html
<div class="card">
<!-- content -->
</div>
```
_Source pattern detected: padding `0px` · radius `0px` · shadow `none`_
**Agent rule**: use these markup skeletons as the structural baseline. Apply tokens from §2-3 for visual styling.
## 17. Content Architecture & Resources (Links by Purpose)
*The page's links classified by purpose — the information architecture to reproduce. Categories, featured images, devices and projects are extracted from the rendered DOM, not guessed.*
**By purpose:** **nav** 2 · **auth** 3 · **pricing** 7 · **docs** 17 · **blog** 1 · **project** 8 · **social** 14 · **legal** 1 · **footer** 4 · **other** 3
**Primary actions (conversion path):**
- Account access — "Authentication Add user sign ups and logins, sec" (login/signup) → `https://supabase.com/auth`
- Account access — "Sign in" (login/signup) → `https://supabase.com/dashboard`
- Account access — "Auth" (login/signup) → `https://supabase.com/auth`
**Projects / case studies detected** (clustered by URL + featured image):
*Docs* — medium confidence, 12 items:
| Title | Featured image | Link |
|---|---|---|
| Data APIs Instant ready-to-use Restful APIs. | `data-apis-lines-dark.svg` | https://supabase.com/docs/guides/api |
| Reactjs | — | https://supabase.com/docs/guides/getting-started/quickstarts/reactjs |
| Nextjs | — | https://supabase.com/docs/guides/getting-started/quickstarts/nextjs |
| Redwoodjs | — | https://supabase.com/docs/guides/getting-started/quickstarts/redwoodjs |
| Flutter | — | https://supabase.com/docs/guides/getting-started/quickstarts/flutter |
| Kotlin | — | https://supabase.com/docs/guides/getting-started/quickstarts/kotlin |
| Sveltekit | — | https://supabase.com/docs/guides/getting-started/quickstarts/sveltekit |
| Solidjs | — | https://supabase.com/docs/guides/getting-started/quickstarts/solidjs |
*Customers* — high confidence, 7 items:
| Title | Featured image | Link |
|---|---|---|
| Next Door Lending | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 4.11) | https://supabase.com/customers/next-door-lending |
| Maergo's Express Delivery: How Supabase Help | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 4.64) | https://supabase.com/customers/maergo |
| Shotgun | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 5.36) | https://supabase.com/customers/shotgun |
| Chatbase goes upmarket on Supabase | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 4.69) | https://supabase.com/customers/chatbase |
| Mobbin | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 7.11) | https://supabase.com/customers/mobbin |
| HappyTeams | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 4.49) | https://supabase.com/customers/happyteams |
| Scaling securely: one million users in 7 mon | `image?url=%2Fimages%2Fcustomers%2Flo` (ar 5.19) | https://supabase.com/customers/pebblely |
*Supabase* — medium confidence, 3 items:
| Title | Featured image | Link |
|---|---|---|
| 104K | — | https://github.com/supabase/supabase |
| Official GitHub library | — | https://github.com/supabase/supabase/tree/master/examples |
| Flutter User Management Get started with Sup | — | https://github.com/supabase/supabase/tree/master/examples/user-management/flutter-user-management |
*Supabase-Community* — medium confidence, 3 items:
| Title | Featured image | Link |
|---|---|---|
| Stripe Subscriptions Starter The all-in-one | — | https://github.com/supabase-community/nextjs-subscription-payments |
| AI Chatbot An open-source AI chatbot app tem | — | https://github.com/supabase-community/vercel-ai-chatbot |
| Expo React Native Starter An extended versio | — | https://github.com/supabase-community/create-t3-turbo |
**Signals:** 44/60 links carry a featured image · device mockups detected: tablet ×2 · dominant link roles: content-card (44), inline-link (8), footer-link (6).
---
## Extraction Completeness: 90/100 (A)
| Category | Score | Max | Detail |
|----------|-------|-----|--------|
| Colors & Palette | 22 | 25 | 16 named colors |
| Typography | 18 | 20 | 7 roles defined |
| Components | 20 | 20 | 5 specs extracted |
| Motion & Interaction | 15 | 15 | Keyframes, easing vars |
| CSS Custom Properties | 10 | 10 | 661 vars |
| Responsive Breakpoints | 5 | 5 | 6 breakpoints |
| Variable Fonts | 0 | 5 | None detected |
## 12. Known Gaps & Confidence
Explicit list of what this extraction could NOT capture. Agents should not invent values for these — either skip the feature or use the documented baseline + heuristic fallback.
*Auto-detected extraction limitations — understand before building:*
- **Licensed web fonts (custom-font)** — detected but not downloaded. Substitute with your licensed copy or a close fallback (see Typography section for metrics).
*✅ No critical extraction gaps detected — high-confidence reproduction expected.*
### Per-section confidence
| Section | Confidence | Reason |
|---------|------------|--------|
| §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
| §2 Colors | High | 661 CSS vars (semantic naming requires ≥20 for high) |
| §3 Typography | High | 7 typography roles inferred |
| §4 Components | High | 5 component variants captured |
| §7 Motion | High | Keyframes + transitions |
| §8 Do's/Don'ts | High | 22 rules generated; design-decisions.json has evidence per rule |
| §9 Responsive | High | 6 breakpoints detected |
| §9b Photography | High | 11 images, hero present |
## 11.1 CSS Implementation Guide (CSS Interception Engine v2.15+)
*Ready-to-use CSS from Prism's CSS Interception Engine — intercepted directly from the site's CSS files (bypasses CORS). Copy-paste into your `<style>` block.*
### Font Loading
2 font file(s) captured (52KB total). When running `prism add`, fonts are saved to `extractions/supabase.com/fonts/` and embedded as base64 in the output HTML.
**@font-face declarations to use:**
```css
@font-face {
font-family: 'custom-font';
/* src: url('/fonts/custom-font.woff2') format('woff2'); */
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'custom-font';
/* src: url('/fonts/custom-font.woff2') format('woff2'); */
font-weight: 500;
font-style: normal;
font-display: swap;
}
```
### Keyframe Animations (Intercepted from CSS)
**51 @keyframes found** — these are the real animation definitions:
```
@keyframes swiper-preloader-spin { ... }
@keyframes fadeIn { ... }
@keyframes fadeOut { ... }
@keyframes overlayContentShow { ... }
@keyframes overlayContentHide { ... }
@keyframes dropdownFadeIn { ... }
@keyframes dropdownFadeOut { ... }
@keyframes fadeInOverlayBg { ... }
@keyframes fadeOutOverlayBg { ... }
@keyframes slideDown { ... }
@keyframes slideUp { ... }
@keyframes slideDownNormal { ... }
@keyframes slideUpNormal { ... }
@keyframes panelSlideLeftOut { ... }
@keyframes panelSlideLeftIn { ... }
@keyframes panelSlideRightOut { ... }
@keyframes panelSlideRightIn { ... }
@keyframes lineLoading { ... }
@keyframes flash-code { ... }
@keyframes accordion-down { ... }
@keyframes accordion-up { ... }
@keyframes collapsible-down { ... }
@keyframes collapsible-up { ... }
@keyframes slideIn { ... }
@keyframes spinner { ... }
@keyframes marquee { ... }
@keyframes marquee-reverse { ... }
@keyframes marquee-vertical { ... }
@keyframes pulse-radar { ... }
@keyframes fadeInUp { ... }
@keyframes AnimationName { ... }
@keyframes spin { ... }
@keyframes transformSpin { ... }
@keyframes loader-dots1 { ... }
@keyframes loader-dots3 { ... }
@keyframes loader-dots2 { ... }
@keyframes pulse { ... }
@keyframes enter { ... }
@keyframes exit { ... }
@keyframes caret-blink { ... }
@keyframes bounce { ... }
@keyframes opacity-pulse { ... }
@keyframes opacity-pulse-full { ... }
@keyframes realtime_shape__jNtbQ { ... }
@keyframes realtime_button-text__T9tpg { ... }
@keyframes realtime_cursor-one__bZat8 { ... }
@keyframes realtime_cursor-two__48lJ2 { ... }
@keyframes realtime_cursor-two-comment__OnmOQ { ... }
@keyframes realtime_cursor-three__aSGNg { ... }
@keyframes realtime_cursor-three-comment__R2f06 { ... }
@keyframes customers_fadeIn__vxUyU { ... }
```
<details><summary>Full keyframes CSS (51 animations)</summary>
```css
@keyframes swiper-preloader-spin{0%{transform:rotate(0deg)}
@keyframes fadeIn{to{opacity:1}}
@keyframes fadeOut{0%{opacity:1;transform:scale(1)}
@keyframes overlayContentShow{0%{opacity:0;transform:translateY(-2%)scale(1)}
@keyframes overlayContentHide{0%{opacity:1;transform:translate(0)scale(1)}
@keyframes dropdownFadeIn{0%{opacity:0;transform:scale(.95)}
@keyframes dropdownFadeOut{0%{opacity:1;transform:scale(1)}
@keyframes fadeInOverlayBg{0%{opacity:0}
@keyframes fadeOutOverlayBg{0%{opacity:.75}
@keyframes slideDown{0%{opacity:0;height:0}
@keyframes slideUp{0%{height:var(--radix-accordion-content-height);opacity:1}
@keyframes slideDownNormal{0%{opacity:0;height:0}
@keyframes slideUpNormal{0%{height:inherit;opacity:1}
@keyframes panelSlideLeftOut{0%{opacity:0;transform:translate(-100%)}
@keyframes panelSlideLeftIn{0%{opacity:1;transform:translate(0)}
@keyframes panelSlideRightOut{0%{opacity:0;transform:translate(100%)}
@keyframes panelSlideRightIn{0%{opacity:1;transform:translate(0)}
@keyframes lineLoading{0%{width:80px;margin-left:-10%}25%{width:240px}50%{width:80px;margin-left:100%}75%{width:240px}
@keyframes flash-code{0%{background-color:#3fcf8e1a}
@keyframes accordion-down{0%{height:0}
@keyframes accordion-up{0%{height:var(--radix-accordion-content-height,var(--bits-accordion-content-height,var(--reka-accordion-content-height,var(--kb-accordion-content-height,var(--ngp-accordion-content-height,auto)))))}
@keyframes collapsible-down{0%{height:0}
@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height,var(--bits-collapsible-content-height,var(--reka-collapsible-content-height,var(--kb-collapsible-content-height,auto))))}
@keyframes slideIn{0%{transform:translateY(-100%)}
@keyframes spinner{0%{transform:rotate(0)}
@keyframes marquee{0%{transform:translate(0)}
@keyframes marquee-reverse{0%{transform:translate(-100%)}
@keyframes marquee-vertical{0%{transform:translateY(0)}
@keyframes pulse-radar{0%{opacity:0;transform:scale(0)}50%{opacity:.8}
@keyframes fadeInUp{to{opacity:1;transform:translate(0)}}
@keyframes AnimationName{0%{background-position:0}50%{background-position:100%}
@keyframes spin{to{transform:rotate(1turn)}}
@keyframes transformSpin{0%{transform:rotate(0)}
@keyframes loader-dots1{0%{transform:scale(0)}
@keyframes loader-dots3{0%{transform:scale(1)}
@keyframes loader-dots2{0%{transform:translate(0)}
@keyframes pulse{50%{opacity:.5}}
@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}
@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
@keyframes caret-blink{0%,70%,to{opacity:1}20%,50%{opacity:0}}
@keyframes bounce{0%{transform:translate3D(0,-5px,0)}
@keyframes opacity-pulse{0%{opacity:.4}
@keyframes opacity-pulse-full{0%{opacity:0}
@keyframes realtime_shape__jNtbQ{0%,5%{opacity:1;transform:scale(0);border-radius:0;border-color:hsla(153,60%,28%,1);box-shadow:none;border-width:3px}10%,37.3%{opacity:1;transform:scale(1);border-radius:0;border-color:hsla(153,60%,28%,1);box-shadow:none;border-width:3px}38%,42%{opacity:1;transform:scale(1);border-radius:0;border-color:#ffffff;box-shadow:none;border-width:3px}45%,48.2%{opacity:1;transform:scale(1);border-radius:10px;border-color:#ffffff;box-shadow:none;border-width:3px}49%,71.2%{opacity:1;transform:scale(1);border-radius:10px;border-color:hsla(153,60%,28%,1);box-shadow:none;border-width:3px}72%,74%{opacity:1;transform:scale(1);border-radius:10px;border-color:#ffffff;box-shadow:none;border-width:3px}76%,92%{opacity:1;transform:scale(1);border-radius:10px;border-color:#ffffff;box-shadow:0 7px 20px 0 rgba(0,0,0,.2);border-width:1.5px}94%,to{opacity:1;transform:scale(1);border-radius:10px;border-color:hsla(153,60%,28%,1);box-shadow:0 7px 20px 0 rgba(0,0,0,.2);border-width:1.5px}}
@keyframes realtime_button-text__T9tpg{0%,78.5%{opacity:0;font-family:Arial;background-color:transparent}79%,84%{opacity:1;font-family:Arial;background-color:transparent}84.5%,88%{opacity:1;font-family:Arial;background-color:rgba(0,0,0,.4)}88.1%,to{opacity:1;font-family:custom-font;background-color:transparent}}
@keyframes realtime_cursor-one__bZat8{0%{transform:translate(0)}2%,5%{transform:translate(-202px,-63px)}10%,11%{transform:translate(-16px,-15px)}13%,to{transform:translate(0)}}
@keyframes realtime_cursor-two__48lJ2{0%,17%{transform:scale(1) translate(-200px,300px)}20%,32%{transform:scale(1) translate(-85px,89px)}34%,37.1%{transform:scale(1) translate(0)}37.4%,37.7%{transform:scale(.95) translate(0)}38%,46%{transform:scale(1) translate(0)}49%,to{transform:scale(1) translate(-50px,100px)}}
@keyframes realtime_cursor-two-comment__OnmOQ{0%,22%{opacity:0;transform:scale(.95) translateY(5px)}24%,30%{opacity:1;transform:scale(1) translate(0)}32%,to{opacity:0;transform:scale(.95) translateY(5px)}}
@keyframes realtime_cursor-three__aSGNg{0%,50%{transform:scale(1) translate(50px,-250px)}53%,66%{transform:scale(1) translate(-40px,-120px)}68%,71%{transform:scale(1) translate(0)}71.3%,71.6%{transform:scale(.95) translate(0)}71.9%,80%{transform:scale(1) translate(0)}82%,84%{transform:scale(1) translate(-20px,10px)}84.5%,85%{transform:scale(.95) translate(-20px,10px)}85.5%,91%{transform:scale(1) translate(-20px,10px)}93%,to{transform:scale(1) translateY(-80px)}}
@keyframes realtime_cursor-three-comment__R2f06{0%,56%{opacity:0;transform:scale(.95) translateY(5px)}58%,64%{opacity:1;transform:scale(1) translate(0)}66%,to{opacity:0;transform:scale(.95) translateY(5px)}}
@keyframes customers_fadeIn__vxUyU{0%{opacity:0}
```
</details>
### Brand Gradient Palette
**20 complex gradients captured** from the site's CSS. The first few are the most prominent visual decorations:
```css
/* Gradient 1 */
background: linear-gradient(to bottom,transparent 0,hsl(var(--background-default);
/* Gradient 2 */
background: linear-gradient(to top,hsl(var(--background-alternative-default);
/* Gradient 3 */
background: linear-gradient(to top,transparent 0,transparent 50%,hsl(var(--background-default);
/* Gradient 4 */
background: linear-gradient(to top,transparent 0,transparent 50%,hsl(var(--background-surface-75);
/* Gradient 5 */
background: radial-gradient(50% 50% at 50% 50%,transparent 0,hsl(var(--background-default);
```
### Hover State CSS (Intercepted)
**2 hover rule lines** captured from CSS files. Key interactive transitions from real CSS (not inferred):
```css
.ch-code-browser-sidebar-file:hover{background-color:var(--ch-t-list-hoverBackground);color:var(--ch-t-list-hoverForeground)}
.ch-spotlight-tab:hover{border-color:#222}
.ch-code-label-annotation:hover{background:var(--ch-t-editor-lineHighlightBackground)}
.ch-code-label-annotation:hover .ch-code-label-annotation-text{display:block}
.ch-code-browser-sidebar-file:hover{background-color:var(--ch-hover-background);color:var(--ch-hover-foreground)}
.ch-spotlight-tab:hover,.ch-spotlight-tab[data-selected]{border-color:red}
```
> **Note**: All values above are extracted from the live site's CSS files. The font files are saved locally by Prism and embedded in the output HTML. Use them as-is for maximum fidelity.
## 11.2 Measured Reality (CDP Engine)
Captured directly from Chrome's engine across **all 2441 rendered nodes** — not a sample. These are the values the page *actually paints*, weighted by how often they appear.
### Real Responsive Breakpoints
**10 breakpoints** read from the live `@media` rules (not guessed):
`480px` · `520px` · `560px` · `600px` · `720px` · `768px` · `769px` · `960px` · `1280px` · `1535px`
### Measured Design Scale
**Type scale by usage** (× = paint count): `16px`×1819 · `14px`×456 · `12px`×110 · `36px`×27 · `18px`×19 · `72px`×5 · `24px`×4
**Radius scale** (× = paint count): `8px`×62 · `16px`×55 · `6px`×46 · `12px`×35 · `11px`×35
**Weights** (× = paint count): `400`×2292 · `500`×148
**Layout gaps** (× = paint count): `8px`×130 · `16px`×44 · `4px`×10 · `32px`×10 · `20px`×8 · `24px`×6 · `12px`×4 · `12px normal`×1
**Elevation (real shadows)**:
```css
rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.1) 0px 4px 6px -4px
```
### Provenance — measured styles on key elements
Read from the live CSSOM (includes runtime-injected CSS). This is *what actually styles the page*, by element:
```css
body { background-color:hsl(var(--background-default)); color:hsl(var(--foreground-default)) }
h1 { font-size:var(--text-4xl) }
h1 { color:hsl(var(--foreground-default)) }
@media (min-width: 40rem) h1 { font-size:var(--text-5xl) }
@media (min-width: 64rem) h1 { font-size:var(--text-7xl) }
button { color:hsl(var(--foreground-light)) }
input { border-radius:var(--radius-md) }
input { background-color:hsl(var(--foreground-default)) }
input { background-color:color-mix(in oklab,hsl(var(--foreground-default)) 2.6%,transparent) }
input { font-size:var(--text-xs) }
@media (min-width: 48rem) input { font-size:var(--text-sm) }
card { border-radius:var(--radius-2xl) }
```
> Selectors normalised to their semantic element — source class names are often build-hashed (`.bgDIHX`) and not reusable. The declarations + CSS vars are the transferable part.
---
*Generated by Prism — automated Playwright extraction + design analysis.*
*Source: https://supabase.com | 2026-06-11T05:43:51.357Z*
*Values extracted via getComputedStyle() (rendered) + CSS custom properties (tokens, marked `(token)`). Token-only values may not be painted — verify against the live site before shipping.*
Re-extract: clone-architect update supabase.com