---
version: alpha
name: fly.io
description: "Light product system built on #ffffff with #7c3aed as the primary CTA accent. Type anchored in Mackinac at 64px / weight 500. Extracted automatically from https://fly.io/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
narrative: |
  fly.io is built on a pure-white canvas (rgb(255,255,255)).
  The system uses rgb(124, 58, 237) as the high-saturation accent for primary actions.
  Sharp 0px corners on CTAs — architectural restraint, engineering precision alongside Mackinac as the primary typeface.
  A layered elevation system (11 distinct shadows) building a clear front-to-back hierarchy.
  Motion is a first-class concern — 17 keyframe animations plus transition-driven interactions.

colors:
  background: "#ffffff"
  surface-1: "#ffffff"
  surface-2: "rgba(255, 255, 255, 0.75)"
  ink: "rgba(40, 25, 80, 0.75)"
  ink-subtle: "#202237"
  primary: "#7c3aed"
  on-primary: "#ffffff"
  primary-hover: "rgba(40, 25, 80, 0.75)"
  hairline: "rgba(255, 255, 255, 0)"

typography:
  display-xl:
    fontFamily: "Mackinac, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 64px
    fontWeight: 500
    lineHeight: 1.15
    letterSpacing: -2.88px
  body:
    fontFamily: "Fricolage Grotesque, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 16px
    fontWeight: 325
    lineHeight: 1.5
    letterSpacing: 0
  button:
    fontFamily: "Fricolage Grotesque, 'SF Pro Display', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif"
    fontSize: 15.5px
    fontWeight: 450
    lineHeight: 1.5
    letterSpacing: 0

rounded:
  none: 0px
  xs: 8px
  sm: 10px
  md: 16px
  lg: 9999px
  xl: 10007px
  pill: 9999px

spacing:
  xxs: 2px
  xs: 6px
  sm: 20px
  md: 32px
  lg: 48px
  xl: 56px
  xxl: 72px

components:
  button-pill:
    backgroundColor: "{colors.hairline}"
    textColor: "{colors.primary-hover}"
    typography: "{typography.button}"
    rounded: "{rounded.lg}"
  button-ghost:
    backgroundColor: "{colors.hairline}"
    textColor: "{colors.primary-hover}"
    typography: "{typography.button}"
    rounded: "{rounded.none}"
    padding: 10px 12px
  button-pill-2:
    backgroundColor: "{colors.on-primary}"
    textColor: "{colors.ink-subtle}"
    typography: "{typography.button}"
    rounded: "{rounded.md}"
    padding: 0px 10px 0px 12px
  navigation-main-nav:
    backgroundColor: "{colors.hairline}"
    typography: "{typography.button}"
    rounded: "{rounded.none}"
    padding: 0px 32px

extracted_at: "2026-06-11T06:09:49.647Z"
completeness: 71
scoreVersion: "v2"

---

# Design System — fly.io
> Extracted automatically by Prism from https://fly.io
> 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 &nbsp;|&nbsp; **Motion**: expressive &nbsp;|&nbsp; **Weight**: medium &nbsp;|&nbsp; **Aesthetic**: soft-rounded

| Dimension | Value | Signal |
|---|---|---|
| Canvas | neutral | `#ffffff` |
| Type posture | sans-led (Fricolage Grotesque) | "Build fast. Run any code" |
| Color assertion | dual-accent | #7c3aed |
| Whitespace | sparse | section rhythm 70px |
| Interaction | expressive | 17 keyframes, 12 transitions |
| Radius language | soft-pill | from token scale |

**Prism fingerprint**: `neutral-canvas · sans-display · dual-accent · soft-pill · expressive-motion`

> **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
>
> - **Canvas**: `rgb(255,255,255)` is the page background. Every component composits against this.
> - **Accent**: `rgb(124, 58, 237)` for primary CTAs ONLY. Never decorative.
> - **Body type**: 16px (token: `typography.body`). Default for ALL text not in a heading role.
> - **Section rhythm**: 70px between major bands. Card padding: 48px.
> - **Default radius**: 10px 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

**Signature:** a gradient wash in the hero. This is the brand's most recognizable visual — reproduce it, don't replace it with a generic card or flat panel.

fly.io uses a pure-white canvas (`#ffffff`), letting typography, color and imagery carry the visual weight. 

Headlines are set in **Mackinac**, a sans-serif display face (the dominant type signature, e.g. "Build fast. Run any code" at 64px). Body text is set in **Fricolage Grotesque**. Negative letter-spacing at display sizes (-2.88px at 64px) compresses headlines into engineered blocks, dense and precise. 

Body text reads in Translucent #281950 (75%) (`rgba(40, 25, 80, 0.75)`) — softened from pure black, a small but deliberate detail that lowers reading friction. **Violet** (`#7c3aed`) 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 is built from multi-layer shadow stacks (11 distinct) — each combines several blurred layers at varying offsets to build a clear front-to-back hierarchy. 
Border radius varies from pill-shaped (fully rounded) to moderately rounded elements, creating visual rhythm. Motion design uses smooth easing curves for polished state transitions. The site uses a variable font with OPSZ axes, enabling precise weight/width control across the type hierarchy. 

**Key Characteristics:**
- Background: Pure White (`#ffffff`)
- Primary typeface: Fricolage Grotesque
- Primary text: Translucent #281950 (75%) (`rgba(40, 25, 80, 0.75)`)
- Accent: Violet (`#7c3aed`)
- Display: 64px weight 500, letter-spacing -2.88px
- Shadow system: 11 distinct elevation levels
- Custom fonts loaded: Fricolage Grotesque, Mackinac, Fragment Mono, FragmentMono

## 2. Color Palette & Roles

### Background & Surface
- **Pure White** (`#ffffff`): Page background (primary)
- **Light Gray** (`#e7e6f4`): Surface / elevated background
- **Transparent** (`transparent`): Surface / elevated background
- **Off-White** (`#f1f2f9`): Surface / elevated background
- **Light Gray** (`#e1e4ef`): Surface / elevated background

### Text & Content
- **Translucent #281950 (75%)** (`rgba(40, 25, 80, 0.75)`): Primary body text
- **Pure Black** (`#000000`): Secondary text
- **Warm Brown** (`#202237`): Secondary text
- **Charcoal** (`#443635`): Secondary text
- **#cc0000** (`#cc0000`): Secondary text

### Accent & Interactive
- **Violet** (`#7c3aed`): Interactive / accent
- **Slate Gray** (`#676b89`): Interactive / accent
- **#ca7ff8** (`#ca7ff8`): Interactive / accent
- **Cool Gray** (`#a39ac1`): Interactive / accent
- **Emerald** (`#10b981`): Interactive / accent
- **Ring Blue** (`#3b82f6`): Interactive / accent
- **#f97316** (`#f97316`): Interactive / accent

### Border & Divider
- **Light Blue** (`#ccd0e0`): Borders / dividers

### Full Extracted Palette
**27 colors rendered on the page** + **5** more declared in design tokens (CSS custom properties — not necessarily painted). (18 categorized above + 14 additional below.)
Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.

- `#f59e0b` — #f59e0b
- `#8b5cf6` — #8b5cf6
- `#fd4f00` — Bright Orange
- `#0091e2` — Sky Bright
- `#092e20` — Near Black
- `#6d28d9` — Violet
- `rgba(91, 33, 182, 0.125)` — Translucent #5b21b6 (13%)
- `rgba(219, 39, 119, 0.2)` — Translucent Cherry (20%)
- `rgba(2, 132, 199, 0.2)` — Translucent #0284c7 (20%)
- `#191034` — Deep Navy
- `#fbcfe8` — Soft Pink *(token)*
- `#ddd6fe` — #ddd6fe *(token)*
- `#c7d2fe` — Lavender *(token)*
- `#4338ca` — #4338ca *(token)*

### Gradients & Decorative Fills

- `linear-gradient(to right bottom, rgba(18, 18, 38, 0.5), rgba(34, 24, 60, 0.5), rgba(25, 16, 52, 0.5)…` — (footer)

### CSS Custom Properties (Design Tokens)

**Shadow Token**
- `--tw-ring-offset-shadow`: `0 0 #0000`
- `--tw-ring-shadow`: `0 0 #0000`
- `--tw-shadow`: `0 0 #0000`
- `--tw-shadow-colored`: `0 0 #0000`

**Spacing Token**
- `--tw-numeric-spacing`: ``
- `--tw-border-spacing-x`: `0`
- `--tw-border-spacing-y`: `0`

**Other tokens**
- `--tw-ring-color`: `rgb(59 130 246 / 0.5)`
- `--tw-ring-offset-color`: `#fff`
- `--btn-border-color`: `rgb(255 255 255 / 0)`
- `--tw-text-opacity`: `1`
- `--btn-ring-color`: `rgb(255 255 255 / .1)`
- `--btn-bg-color-active`: `#6d28d9`
- `--btn-bg-color`: `#7c3aed`
- `--btn-text-color`: `white`

## 3. Typography Rules

### Font Families
- **Primary**: `Fricolage Grotesque`
- **Secondary**: `Mackinac`
- **Font 3**: `Fragment Mono`
- **Font 4**: `FragmentMono`

### Custom Fonts Loaded
- **Fricolage Grotesque** weight 100 900 (normal)
- **Mackinac** weight 500 (normal)
- **Mackinac** weight 700 (normal)
- **Fragment Mono** weight 400 (normal)
- **FragmentMono** weight 400 (normal)

### Typography Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|------|------|------|--------|-------------|----------------|-------|
| Display Hero | Mackinac | 64px | 500 | 1.15 | -2.88px | Main headline (h1) |
| Body | Fricolage Grotesque | 16px | 325 | 1.5 | normal | Standard reading text |
| Button | Fricolage Grotesque | 15.5px | 450 | 1.5 | normal | Button label (15.5px) |
| Button | Fricolage Grotesque | 14.5px | 450 | 1.5 | normal | Button label (14.5px) |
| Button | Fricolage Grotesque | 14.5px | 500 | 1.5 | normal | Button label (14.5px) |

### Full Font Size Scale

Sizes detected in the design (descending): `64px`, `36px`, `22px`, `19px`, `18px`, `17px`, `16px`, `15.50px`, `14.50px`, `12px`

> 6 size(s) detected outside the sampled hierarchy (36px, 22px, 19px, 18px, 17px, 12px). These appear on elements not in the sampled set — likely additional display sizes, marketing-section overrides, or third-party-widget styles.

### OpenType & Variable Font Features

**Variable font axes:**
- OPSZ axis

## 4. Component Stylings

### Buttons

**Pill**
- Background: `transparent` `{colors.hairline}`
- Text: `#281950` `{colors.primary-hover}`
- Padding: 0px
- Radius: 9999px
- Font: 14.5px weight 450
- Use: Status pills, tags, chips

**Ghost**
- Background: `transparent` `{colors.hairline}`
- Text: `#281950` `{colors.primary-hover}`
- Padding: 10px 12px
- Radius: 0px
- Font: 14.5px weight 500
- Use: Subtle action, toolbar, nav button

**Pill**
- Background: `rgba(255, 255, 255, 0.4)` `{colors.on-primary}`
- Text: `#202237` `{colors.ink-subtle}`
- Padding: 0px 10px 0px 12px
- Radius: 20px 8px 8px 20px
- Border: 1px solid rgba(255, 255, 255, 0.9)
- Shadow: `rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px`
- Font: 14.5px weight 450
- Use: Status pills, tags, chips

**Primary Brand**
- Background: `#7c3aed` `{colors.primary}`
- Text: `#ffffff` `{colors.on-primary}`
- Padding: 0px 12px 0px 10px
- Radius: 8px 20px 20px 8px
- Shadow: `rgba(67, 56, 202, 0.25) 0px 0px 0px 1px inset`
- Font: 14.5px weight 450
- Use: Primary CTA / brand action

**Outline**
- Background: `transparent` `{colors.hairline}`
- Text: `#ffffff` `{colors.on-primary}`
- Padding: 32px 16px
- Radius: 16px
- Border: 1px solid rgba(255, 255, 255, 0.25)
- Shadow: `rgba(91, 33, 182, 0.1) 0px 5px 5px -2px, rgba(91, 33, 182, 0.1) 0px 2px 4px -2px`
- Font: 16px weight 450
- Use: Secondary action with border

### Navigation

**Main Nav**
- Background: `transparent` `{colors.hairline}`
- Padding: 0px 32px
- Radius: none
- Font: 14.5px weight 450
- Use: Fixed/sticky flex nav — N/A items


## 4b. Component Behaviors (State Matrix)

### Interaction State Narrative


*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(40, 25, 80)"
  link:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(40, 25, 80)"
  navLink:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(40, 25, 80)"
  badge:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgba(40, 25, 80, 0.75)"
  footerLink:
    default:
      bg: "rgba(0, 0, 0, 0)"
      fg: "rgb(163, 154, 193)"
```

**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
- **4 shape(s)** in this system: `Pill`, `Ghost`, `Primary Brand`, `Outline`
- **DO NOT introduce new buttons variants** without justification

### Navigation
- **1 shape(s)** in this system: `Main Nav`
- **DO NOT introduce new navigation variants** without justification

## 5. Layout Principles

### Layout Type
**top-nav + content**

### Grid
Single column, centered content

### Max Width
1200px

### Spacing System
Generous spacing — editorial breathing room

| Token | Value |
|-------|-------|
| xxs | 2px |
| xs | 6px |
| sm | 20px |
| md | 32px |
| base | 40px |
| lg | 48px |
| xl | 56px |
| 2xl | 70px |
| 3xl | 72px |

### Border Radius Scale
| Name | Value | Use |
|------|-------|-----|
| None | 0px | No rounding |
| Xs | 8px | Tiny corners (badges, micro elements) |
| Sm | 10px | Buttons, inputs, small elements |
| Md | 16px | Cards, containers |
| Lg | 9999px | Large rounded elements, pill segments |
| Xl | 10007px | Category strips, featured containers |
| Full | 9999px | Pills, avatars, circular elements |

### Shape Language

| Component | Border Radius |
|-----------|---------------|
| Buttons | `9999px` |
| Navigation | `none` |
| Page Body | `0px` |

**Shape Personality**: Sharp + Pill Contrast — Angular precision with pill-shaped accents (status badges, tags). Creates strong visual hierarchy.

**Full Radius Spectrum**: 4px, 8px, 10px, 16px, 20px, full/pill (from `allBorderRadii` scan)


## 5b. Spacing Rhythm Names

**Measured section padding**: bands use ~128px internal vertical padding (up to 198px) — **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** | `72px` | Top/bottom of full-bleed hero sections |
| **section** | `56px` | Between major bands (color change, content shift) |
| **subsection** | `48px` | Within a section, between content groups |
| **card** | `32px` | Card padding, list-item spacing |
| **compact** | `20px` | Form fields, tight clusters, badge padding |
| **micro** | `6px` | 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).

**5/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:** full-viewport hero (≥70% screen height)
- **Heading:** "Build fast. Run any code fearlessly." — 64px center-aligned
- **Subheading:** "The platform for devs who just want to ship. Powered by sandboxes that let you deploy any code with confidence."
- **Media:** present, positioned top
- **CTAs:** 1 (primary: "Deploy your app")
- **Clone instruction:** Reproduce the **centered** layout. Use the heading font-size token at the documented size. Place media top of text.

### Navigation Pattern

- **Position:** static (scrolls with page)
- **Layout:** unknown — Layout not classified
- **Height:** 36px
- **Logo:** ✓ present
- **Nav links:** 0 primary items
- **CTAs in nav:** 0 (no buttons — links only)
- **Clone instruction:** Build a static unknown navigation. Link-only — no button styling needed.

### Card Grid Pattern

- **Card count:** 4 cards detected
- **Columns (desktop):** 3-up grid
- **Card dimensions:** 536×122px (aspect 4.41:1)
- **Gap:** 64px between cards
- **Content:** ✗ no image + icon
- **Clone instruction:** Build a 3-column grid (desktop) with cards at ~4.41:1 aspect ratio. Text/icon-only cards (no photography).

### CTA Banner Pattern

- **Banner count:** 5
- **Position:** multiple
- **Visual treatment:** ✓ contrasting background✓ gradient fill
- **Primary CTA text:** "Check Em Out!"
- **Clone instruction:** Place multiple CTA banners across page sections. Use gradient background.

### Footer Pattern

- **Columns:** 2
- **Links:** 23 total
- **Height:** 408px
- **Includes:** ✗ no newsletter | ✓ social icons |  ✓ copyright
- **Clone instruction:** Build a 2-column footer with ~12 links per column, 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(32, 34, 55, 0.075) 0px 0px 0px 1px`,<br>`rgba(32, 34, 55, 0.05) 0px 10px 15px -3px`,<br>`rgba(32, 34, 55, 0.05) 0px 4px 6px -4px` | Cards, elevated surfaces |
| Layered (Level 2) | <br>`rgba(0, 0, 0, 0.1) 0px 1px 3px 0px`,<br>`rgba(0, 0, 0, 0.1) 0px 1px 2px -1px` | Cards, elevated surfaces |
| Inset (Level 3) | <br>`rgba(67, 56, 202, 0.25) 0px 0px 0px 1px inset` | Buttons, pressed-state elements |
| Layered (Level 4) | <br>`rgba(86, 75, 128, 0.1) 1px 0px 0px 0px` | 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

### Dominant Easing Curves

| Curve | Semantic Name |
|-------|---------------|
| `cubic-bezier(0.4,0,0.2,1)` | Material Standard — Balanced |
| `cubic-bezier(0,0,0.2,1)` | Material Decelerate — Entrance |

### Duration Scale

| Value | Tier | Typical Use |
|-------|------|-------------|
| `150ms` | Fast | Hover states, micro-interactions |
| `200ms` | Normal | Panel open/close, navigation |
| `300ms` | Normal | Panel open/close, navigation |
| `400ms` | Slow | Hero animations, page transitions |
| `500ms` | Slow | Hero animations, page transitions |

### Copy-Paste Transition Snippets

**Color / Background**
```css
transition: color 0.15s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.15s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.15s cub...;
```

**Transform**
```css
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
```

**All Props**
```css
transition: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
```

**Color / Background**
```css
transition: color 0.3s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.3s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.3s cubic-...;
```

### Keyframe Animation Catalog

| Animation Name | Type | Animated Props | Use Hint |
|----------------|------|----------------|----------|
| `fpFadeInDown` | Fade + Move | opacity, transform | Element entrance |
| `ping-badge` | Fade + Move | transform, opacity | Attention / status |
| `dot-one` | Fade + Move | transform, opacity | UI transition |
| `dot-two` | Slide | transform | UI transition |
| `dot-three` | Fade + Move | transform, opacity | UI transition |
| `shimmer` | Slide | transform | Loading placeholder |
| `spin` | Rotate / Spin | transform | Loading indicator |
| `bounce` | Slide | transform, animation-timing-function | Playful feedback |
| `fade` | Fade | opacity | UI transition |
| `slideY` | Slide | transform | UI transition |
| `infinite-scroll` | Slide | transform | UI transition |
| `ping` | Fade + Move | transform, opacity | Attention / status |
| `pulse` | Fade | opacity | Attention / status |
| `blink-animation` | Custom | visibility | Attention / status |
| `subtle-ping` | Fade + Move | opacity, transform | Attention / status |
| `progress-bar-stripes` | Custom | background-position-x, background-position-y | UI transition |
| `indeterminate` | Slide | transform | UI transition |

### Motion Fingerprint

- **Speed Character**: Deliberate & Calm (median duration: `300ms`)
- **Dominant Easing**: custom cubic-bezier curves
- **Animation Library**: 17 unique animations (17 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 Translucent #281950 (75%) (`rgba(40, 25, 80, 0.75)`) for text — not pure black, it's warmer and more readable
- Use Fricolage Grotesque as the primary typeface — it defines the brand personality
- Keep font weights between 325-500 — the system uses a narrow weight range for subtle hierarchy
- Use negative letter-spacing (-2.88px) at display sizes for compressed, editorial headlines
- Use the extracted shadow patterns for elevation — they are tuned to match the brand palette
- Use full-pill radius (9999px) only for specific elements (avatars, pills, toggles)
- Use Violet (`#7c3aed`) as the primary accent — it's the brand's signature interactive color
- Use 8px 20px 20px 8px border-radius on buttons — the standard corner rounding for interactive elements
- Respect the 6px–56px spacing range — the design uses a wide scale for visual breathing room
- Make the hero full-viewport (≥70% screen height) — this design uses an immersive hero, not a tall navbar
- Use a single primary CTA in the hero — the design intentionally avoids choice paralysis
- Each card uses an icon (not photo) — the visual language is illustrative, not photographic
- Use a 3-column grid on desktop — density matters for this content type
- Repeat the primary CTA across 5 banner sections — conversion paths are layered, not single

### Don't
- 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 use weight 700 (bold) or above — 500 is the maximum weight in this system
- Don't increase letter-spacing on headings — the type is designed to run tight at scale
- Don't invent new shadow values — use only the extracted shadow levels
- Don't apply pill radius on rectangular buttons or cards — it's reserved for specific interactive elements
- Don't introduce additional saturated accent colors — the palette is intentionally controlled
- 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(255,255,255)` as the base canvas"
    why: "Every component is designed to composit against this exact tone"
    test: "document.body.style.backgroundColor === 'rgb(255,255,255)'"
  - id: brand-accent-001
    type: do
    rule: "Reserve `rgb(124, 58, 237)` for primary CTAs and brand-mark signals only"
    why: "Single chromatic assertion device — overuse dilutes meaning"
    test: "querySelectorAll('[style*=\"rgb(124, 58, 237)\"]').length <= 3 per fold"
```

## 9. Responsive Behavior

### Breakpoints
| Name | Width | Key Changes |
|------|-------|-------------|
| Mobile | 480px | Single column, compact spacing |
| Mobile Large | 640px | Expanded mobile layout |
| Tablet | 768px | Multi-column grids begin |
| Tablet | 1024px | Multi-column grids begin |
| Desktop | 1200px | Full feature layout |
| Large Desktop | 1367px | Maximum content width |

### Token Diff — Desktop vs Mobile

| Element | Property | Desktop | Mobile |
|---------|----------|---------|--------|
| heading | font-size | `64px` | `32px` |
| heading | line-height | `73.6px` | `38.4px` |
| heading | letter-spacing | `-2.88px` | `-1.44px` |

### Collapsing Strategy
- Headlines: 64px → 32px 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):

- **Card grid: 3-up → 1-up** — cards stack as viewport narrows, becoming a vertical list on mobile.
- **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** — 3 frosted/blur layer(s) (e.g. `blur(24px)`).

> **Motion fingerprint**: glassmorphism (3 layers)

## 9b. Visual Tone & Photography

**Tone:** Mixed photography + illustration

A balanced mix of photographic content and vector graphics. Photos likely carry product/lifestyle context while SVG handles icons, logos, and decorative accents.

**Canonical Brand Image (OG):**
- https://fly.io/phx/images/preview/og-7ea9380853220ced249aaf88c2332937.jpg?vsn=d (1200×630px)
  *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.78:1 (landscape (16:9-ish))
- Rendered size: 1400×787px
- *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): 5 (71%)
- Portrait (<0.87): 0 (0%)
- Square (0.87–1.15): 2 (29%)

**Media Format Mix:**
- WebP: 7 (optimized photo/illustration hybrid)
- SVG: 1 (icons, illustrations, decorative geometry)

**Average rendered image size:** 529×394px
**Above-fold image count:** 1 / 7

**Decorative Patterns Detected:**
- 47 multi-stop linear gradients (mesh-like, 3+ color stops) — the brand leans on rich color transitions for visual depth
- 1 large decorative SVG shape (≥200×200px, non-icon) — likely blob/illustration accents
- 1 background pattern (non-photo url() backgrounds) — textures/illustrations as backdrops
- **Glassmorphism** detected (`backdrop-filter: blur`) — layered transparent surfaces with blur, modern OS-like aesthetic

**Clone instruction for decorative work:** This is a gradient-rich design — invest in multi-stop CSS gradients (3+ color stops), not solid backgrounds.

**Imagery Guidance for clones:**
- Mix photography and illustration intentionally: photos for product/context, vectors for icons + decorative accents.
- Respect the format split — replacing JPGs with illustrations (or vice versa) will shift the brand tone.

## 10. Agent Prompt Guide

### Quick Reference
- Background: Pure White (`#ffffff`)
- Primary text: Translucent #281950 (75%) (`rgba(40, 25, 80, 0.75)`)
- Accent: Violet (`#7c3aed`)
- Border: Transparent (`transparent`)
- Font: Fricolage Grotesque
- Body: 16px weight 325

### Example Component Prompts
- "Create a hero section on Pure White background (#ffffff). Headline at 64px Fricolage Grotesque weight 500, line-height 1.15, letter-spacing -2.88px, color rgba(40, 25, 80, 0.75)."
- "Create the primary CTA button: `#7c3aed` background, `#ffffff` text, 8px 20px 20px 8px border-radius, 0px 12px 0px 10px padding, 450 weight, Fricolage Grotesque font."
- "Build navigation: relative on `#ffffff`. Fricolage Grotesque 14.5px weight 450 for links."

### Iteration Guide
1. **Canvas**: Set the light canvas to Pure White (`#ffffff`) — every component is composited against this exact base.
2. **Typography**: All type in Fricolage Grotesque, weight range 325–500. Never exceed 500 — heavier weights break the brand's tonal restraint.
3. **Accent**: Violet (`#7c3aed`) is the sole interactive color. On hover → Translucent #281950 (75%) (`rgba(40, 25, 80, 0.75)`). Use CSS transitions, not opacity/brightness filters.
4. **Motion**: All transitions use `cubic-bezier(0.4,0,0.2,1)`. Never use linear for UI transitions — preserve the brand's easing personality.
5. **Shape**: CTAs at `0px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
6. **Spacing**: Use the `--ca-space-*` token scale (6px–56px). 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-on-primary: #ffffff;
  --ca-primary-hover: #281950;
  --ca-ink-subtle: #202237;
  --ca-primary: #7c3aed;
  --ca-hairline: transparent;
}

/* Typography */
:root {
  --ca-font-primary: "Mackinac", system-ui, sans-serif;
  --ca-text-display: 64px;
  --ca-text-body: 16px;
  --ca-text-button: 15.5px;
}

/* Spacing & Radius */
:root {
  --ca-space-xxs: 2px;
  --ca-space-xs: 6px;
  --ca-space-sm: 20px;
  --ca-space-md: 32px;
  --ca-space-base: 40px;
  --ca-space-lg: 48px;
  --ca-space-xl: 56px;
  --ca-space-2xl: 70px;
  --ca-space-3xl: 72px;
  --ca-radius-none: 0px;
  --ca-radius-xs: 8px;
  --ca-radius-sm: 10px;
  --ca-radius-md: 16px;
  --ca-radius-lg: 9999px;
  --ca-radius-xl: 10007px;
  --ca-radius-full: 9999px;
}
```


## 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: header
    tag: header
    classes: ["navbar", "relative", "z-[500]", "container"]
    height: 96px
    width: 1200px
    layout: flex-row justify=normal
    children: 5
    padding: "0px 32px"
  - section: hero
    tag: div
    classes: ["relative", "w-full", "h-full", "overflow-hidden"]
    height: 6321px
    width: full-bleed
    layout: block
    children: 8
    vertical-padding: ~48px
    padding: "96px 0px 0px"
  - section: header
    tag: header
    classes: ["hero", "relative", "flex", "flex-col"]
    height: 1000px
    width: full-bleed
    layout: flex-column justify=normal
    children: 2
    vertical-padding: ~169px (airy)
    padding: "70px 0px 268px"
  - section: feature-section
    tag: main
    height: 6321px
    width: full-bleed
    layout: block
    children: 10
    vertical-padding: ~198px (airy)
  - section: feature-section
    tag: div
    classes: ["relative", "container", "lg:max-w-4xl", "m-auto"]
    height: 619px
    width: 896px
    layout: block
    children: 1
    vertical-padding: ~170px (airy)
    padding: "340px 32px 0px"
  - section: feature-section
    tag: section
    classes: ["relative", "bg-white", "overflow-hidden"]
    height: 561px
    width: full-bleed
    layout: block
    children: 3
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
  - section: feature-section
    tag: div
    classes: ["relative", "container", "mx-auto", "py-24"]
    height: 561px
    width: 1200px
    layout: grid: 1-col gap=80px
    children: 1
    vertical-padding: ~128px (airy)
    padding: "128px 32px"
  - section: feature-section
    tag: section
    classes: ["relative", "bg-white", "py-24", "xl:py-32"]
    height: 602px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
    padding: "128px 0px"
  - section: feature-section
    tag: div
    classes: ["relative", "container", "mx-auto", "px-4"]
    height: 346px
    width: 1200px
    layout: grid: 2-col gap=normal 64px
    children: 2
    padding: "0px 32px"
  - section: feature-section
    tag: section
    classes: ["relative", "bg-white", "overflow-hidden", "py-24"]
    height: 548px
    width: full-bleed
    layout: block
    children: 3
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
    padding: "128px 0px"
  - section: feature-section
    tag: div
    classes: ["relative", "container", "mx-auto", "px-4"]
    height: 292px
    width: 1200px
    layout: grid: 2-col gap=normal 64px
    children: 2
    padding: "0px 32px"
  - section: feature-section
    tag: section
    classes: ["relative", "bg-white", "py-24", "xl:py-32"]
    height: 548px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
    padding: "128px 0px"
  - section: feature-section
    tag: div
    classes: ["relative", "container", "mx-auto", "px-4"]
    height: 292px
    width: 1200px
    layout: grid: 2-col gap=normal 64px
    children: 2
    padding: "0px 32px"
  - section: content-section
    tag: section
    classes: ["relative", "bg-white", "overflow-hidden"]
    height: 563px
    width: full-bleed
    layout: block
    children: 3
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
  - section: content-section
    tag: div
    classes: ["relative", "container", "mx-auto", "py-24"]
    height: 563px
    width: 1200px
    layout: block
    children: 1
    vertical-padding: ~128px (airy)
    padding: "128px 32px"
  - section: navigation
    tag: section
    classes: ["relative", "py-16", "lg:py-24", "xl:py-32"]
    height: 568px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(139, 92, 246)"
    bg-treatment: linear-gradient
    vertical-padding: ~128px (airy)
    padding: "128px 0px"
  - section: feature-section
    tag: div
    classes: ["container", "mx-auto", "px-4", "sm:px-6"]
    height: 312px
    width: 1200px
    layout: block
    children: 1
    padding: "0px 32px"
  - section: header
    tag: header
    classes: ["drop-shadow", "lg:max-w-xl", "xl:max-w-lg", "xl:mx-auto"]
    height: 254px
    width: 512px
    layout: block
    children: 3
  - section: feature-section
    tag: section
    classes: ["relative", "bg-white", "py-24", "xl:py-32"]
    height: 643px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
    padding: "128px 0px"
  - section: feature-section
    tag: div
    classes: ["relative", "container", "mx-auto", "px-4"]
    height: 387px
    width: 1200px
    layout: grid: 2-col gap=normal 64px
    children: 2
    padding: "0px 32px"
  - section: feature-section
    tag: section
    classes: ["relative", "py-16", "lg:py-24", "xl:py-32"]
    height: 644px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~72px (generous)
    padding: "48px 0px 96px"
  - section: feature-section
    tag: div
    classes: ["container", "mx-auto", "px-4", "sm:px-6"]
    height: 500px
    width: 1200px
    layout: block
    children: 4
    padding: "0px 32px"
  - section: logo-strip
    tag: div
    classes: ["container", "overflow-hidden", "mx-auto", "relative"]
    height: 110px
    width: 1136px
    layout: block
    children: 2
  - section: header
    tag: header
    classes: ["space-y-3", "lg:max-w-xl", "xl:max-w-lg", "xl:mx-auto"]
    height: 217px
    width: 512px
    layout: block
    children: 3
  - section: feature-section
    tag: section
    classes: ["relative", "bg-white", "py-24", "xl:py-32"]
    height: 643px
    width: full-bleed
    layout: block
    children: 1
    bg: "rgb(255, 255, 255)"
    vertical-padding: ~128px (airy)
    padding: "128px 0px"
```

**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:
    - "Modern Compute Without the Complexity"
    - "Storage That Keeps Up"
    - "VMs That Do Everything You Need"
    - "Use the Tech You Love"
    - "TRUSTED BY TEAMS AT"
    - "Build Whatever You Can Think Up (and Give Your Users The Same Power)"
  ctas:
    - "Machines"
    - "Sign In"
    - "Get Started"
    - "Deploy your app"
    - "Check Em Out!"
    - "Learn More"
    - "Phoenix Framework"
    - "Docker"
  navigation:
    - "Deploy your app"
    - "Learn More"
    - "Phoenix Framework"
    - "SvelteKit"
    - "Ruby on Rails"
    - "Docker"
    - "Django"
    - "Laravel"
    - "NextJS"
    - "Enterprise Features"
  footer-links:
    - "About"
```

**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: 12
    avg-ratio: 4.19
    common-aspect: "~16:6 banner"
    sample-alts:
      - "Builder.io"
      - "Mercor"
      - "Context"
  product:
    count: 2
    avg-ratio: 0.99
    common-aspect: "~1:1 square"
```

**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">
  Machines
</button>
```
_Source pattern detected: padding `10px 12px` · radius `0px` · weight `500`_

**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** 20 · **cta** 1 · **auth** 1 · **pricing** 1 · **docs** 4 · **blog** 1 · **project** 1 · **social** 2 · **legal** 3 · **footer** 4 · **other** 22

**Primary actions (conversion path):**
- Account access — "Sign In" (login/signup) → `https://fly.io/app/sign-in`
- Primary call-to-action — "Get Started" (the conversion path) → `https://fly.io/app/sign-up`

**Signals:** 26/60 links carry a featured image · dominant link roles: content-card (23), navigation (20), footer-link (12).


---
## Extraction Completeness: 71/100 (C)

| Category | Score | Max | Detail |
|----------|-------|-----|--------|
| Colors & Palette | 25 | 25 | 18 named colors |
| Typography | 13 | 20 | 5 roles defined |
| Components | 8 | 20 | 2 specs extracted |
| Motion & Interaction | 12 | 15 | Keyframes |
| CSS Custom Properties | 3 | 10 | 66 vars |
| Responsive Breakpoints | 5 | 5 | 6 breakpoints |
| Variable Fonts | 5 | 5 | OPSZ axes |

## 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:*

- **Sparse component extraction** — fewer than 5 component types detected. Highly dynamic sections (modals, datepickers, carousels) require interaction to render and are not captured in a static pass.
- **3 parasitic shadow(s) detected** — colored box-shadows (not near-black) found in allShadows. These likely originate from browser extensions or third-party injected widgets (e.g. Grammarly, chat overlays), not from the site's own design system. Discard them when building.

| Category | What's missing | Fallback strategy |
|----------|----------------|-------------------|
| **Dark mode** | No dark-mode CSS variables or media queries detected | Light mode is canonical; do not generate dark-mode variants unless explicitly requested |
| **Form inputs** | No text input fields detected on this page | Use the documented border-radius + accent border on focus; 12-16px padding inside |

### Per-section confidence

| Section | Confidence | Reason |
|---------|------------|--------|
| §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
| §2 Colors | High | 66 CSS vars (semantic naming requires ≥20 for high) |
| §3 Typography | High | 5 typography roles inferred |
| §4 Components | Low | 2 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 | 7 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.*

### Keyframe Animations (Intercepted from CSS)

**17 @keyframes found** — these are the real animation definitions:

```
@keyframes fpFadeInDown { ... }
@keyframes ping-badge { ... }
@keyframes dot-one { ... }
@keyframes dot-two { ... }
@keyframes dot-three { ... }
@keyframes shimmer { ... }
@keyframes spin { ... }
@keyframes bounce { ... }
@keyframes fade { ... }
@keyframes slideY { ... }
@keyframes infinite-scroll { ... }
@keyframes ping { ... }
@keyframes pulse { ... }
@keyframes blink-animation { ... }
@keyframes subtle-ping { ... }
@keyframes progress-bar-stripes { ... }
@keyframes indeterminate { ... }
```

<details><summary>Full keyframes CSS (17 animations)</summary>

```css
@keyframes fpFadeInDown {
  from {
    opacity: 0;
    transform: translate3d(0, -20px, 0);
  }
@keyframes ping-badge {
  75%, 100% {
    transform: scale(1.75);
    opacity: 0;
  }
}
@keyframes dot-one {
  0%   { transform: scale(0); opacity: 0; }
  100% { transform: scale(1); opacity: 1; }
}
@keyframes dot-two {
  0%   { transform: translate(0, 0);                         }
  100% { transform: translate(calc(var(--dot-size) * 2), 0); }
}
@keyframes dot-three {
  0%   { transform: scale(1); opacity: 1; }
  100% { transform: scale(0); opacity: 0; }
}
@keyframes shimmer {
  0%   { transform: translateX(-100%); }
  50%  { transform: translateX(200%);  }
  100% { transform: translateX(-100%); }
}
@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}
@keyframes bounce {
  0%, 100% {
    transform: translateY(-25%);
    animation-timing-function: cubic-bezier(0.8,0,1,1);
  }
  50% {
    transform: none;
    animation-timing-function: cubic-bezier(0,0,0.2,1);
  }
}
@keyframes fade {
  from {
    opacity: 0;
  }
}
@keyframes slideY {
  from {
    transform: translateY(2rem);
  }
}
@keyframes infinite-scroll {
  from {
    transform: translateX(0);
  }
@keyframes ping {
  75%, 100% {
    transform: scale(2);
    opacity: 0;
  }
}
@keyframes pulse {
  50% {
    opacity: .5;
  }
}
@keyframes blink-animation {
  to {
    visibility: hidden;
  }
}
@keyframes subtle-ping {
  0%, 100% {
    opacity: 1;
    transform: scale(1);
  }
  50% {
    opacity: 0.5;
    transform: scale(1.2);
  }
}
@keyframes progress-bar-stripes {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: 1rem 0;
  }
}
@keyframes indeterminate {
  0% {
    transform: translateX(-100%);
  }
  100% {
    transform: translateX(400%);
  }
}
```
</details>

### Brand Gradient Palette

**5 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 right, #A02BE4, transparent, #4f46e5);

/* Gradient 2 */
background: linear-gradient(to bottom right, var(--tw-gradient-stops);

/* Gradient 3 */
background: linear-gradient(
      to right,
      hsla(217, 91%, 60%, var(--wave-opacity);

/* Gradient 4 */
background: linear-gradient(
    to bottom,
    #fff,
    hsla(0, 0%, 100%, 0.75);

/* Gradient 5 */
background: linear-gradient(
    to top,
    #fff,
    hsla(0, 0%, 100%, 0.75);

```

### Hover State CSS (Intercepted)

**1038 hover rule lines** captured from CSS files. Key interactive transitions from real CSS (not inferred):

```css
.flatpickr-months .flatpickr-prev-month:hover,
.flatpickr-months .flatpickr-next-month:hover {
  color: #959ea9;}

.flatpickr-months .flatpickr-prev-month:hover svg,
.flatpickr-months .flatpickr-next-month:hover svg {
  fill: #f64747;}

.numInputWrapper span:hover {
  background: rgba(0,0,0,0.1);}

.numInputWrapper:hover {
  background: rgba(0,0,0,0.05);}

.numInputWrapper:hover span {
  opacity: 1;}

.flatpickr-current-month span.cur-month:hover {
  background: rgba(0,0,0,0.05);}

.flatpickr-current-month input.cur-year[disabled]:hover {
  font-size: 100%;
  color: rgba(0,0,0,0.5);
  background: transparent;
  pointer-events: none;}

.flatpickr-current-month .flatpickr-monthDropdown-months:hover {
  background: rgba(0,0,0,0.05);}

.flatpickr-day:hover,
.flatpickr-day.prevMonthDay:hover,
.flatpickr-day.nextMonthDay:hover,
.flatpickr-day.today:hover,
.flatpickr-day.selected:hover,
.flatpickr-day.startRange:hover,
.flatpickr-day.endRange:hover,
.flatpickr-day.flatpickr-disabled:hover,
.flatpickr-day.flatpickr-disabled:hover {
  cursor: not-allowed;
  color: rgba(57,57,57,0.1);}

.flatpickr-weekwrapper span.flatpickr-day:hover {
  display: block;
  width: 100%;
  max-width: none;
  color: rgba(57,57,57,0.3);
  background: transparent;
  cursor: default;
  border: none;}

.flatpickr-time input:hover,
.flatpickr-time .flatpickr-am-pm:hover,
.leaflet-bar a:hover,
.leaflet-control-attribution a:hover,
.leaflet-container a.leaflet-popup-close-button:hover,
[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {
  border-color: transparent;
  background-color: currentColor;}

[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {
  border-color: transparent;
  background-color: currentColor;}

.bubble-wrap:is(:hover, :focus, :focus-within, :active) :where(.bubble, .bubble-tl, .bubble-t, .bubble-tr, .bubble-lt, .bubble-rt, .bubble-l, .bubble-r, .bubble-lb, .bubble-rb, .bubble-bl, .bubble-b, .bubble-br) {
  transform: translate3d(var(--active-x), var(--active-y), 0);
  opacity: 1;
  pointer-events: auto;}

.btn-xs:not(:disabled):hover, .btn-sm:not(:disabled):hover, .btn:not(:disabled):hover, .btn-lg:not(:disabled):hover, .btn-xl:not(:disabled):hover, .btn-2xl:not(:disabled):hover {
  color: var(--btn-text-color-active);
  background-color: var(--btn-bg-color-active);
  border-color: var(--btn-border-color-active);
  box-shadow: var(--btn-inner-shadow-active), var(--btn-shadow-active);}

.btn-link:not(:disabled):hover, .btn-link:not(:disabled):focus, .btn-link:not(:disabled):focus-within {
  color: #6d28d9;
  background-color: transparent;
  text-decoration-color: rgb(109 40 217 / .75);}

.card-info .btn-inline:hover, .card-info .btn-inline:focus {
  text-decoration-color: rgb(30 58 138 / .9);}

.card-error .btn-inline:hover, .card-error .btn-inline:focus {
  text-decoration-color: #be123c;}

.card-warning .btn-inline:hover, .card-warning .btn-inline:focus {
  text-decoration-color: #b45309;}

.card-success .btn-inline:hover, .card-success .btn-inline:focus {
  text-decoration-color: #047857;}

.prose :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)):hover {
  color: #7c3aed;}
```

> **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 709 rendered nodes** — not a sample. These are the values the page *actually paints*, weighted by how often they appear.

### Real Responsive Breakpoints
**8 breakpoints** read from the live `@media` rules (not guessed):
`480px` · `640px` · `768px` · `1024px` · `1200px` · `1367px` · `1400px` · `1728px`

### Measured Design Scale
**Type scale by usage** (× = paint count): `16px`×328 · `14.5px`×204 · `19px`×63 · `15.5px`×49 · `12px`×16 · `36px`×16 · `64px`×12 · `22px`×8

**Radius scale** (× = paint count): `9999px`×68 · `8px`×34 · `16px`×9 · `10px`×4 · `4px`×2 · `20px`×2

**Weights** (× = paint count): `325`×331 · `450`×245 · `500`×118 · `575`×12

**Layout gaps** (× = paint count): `32px`×29 · `8px`×14 · `normal 64px`×6 · `80px`×3 · `64px`×2 · `20px`×1 · `12px`×1 · `40px`×1

**Elevation (real shadows)**:
```css
rgba(67, 56, 202, 0.25) 0px 0px 0px 1px inset
rgba(91, 33, 182, 0.1) 0px 5px 5px -2px, rgba(91, 33, 182, 0.1) 0px 2px 4px -2px
rgba(32, 34, 55, 0.075) 0px 0px 0px 1px, rgba(32, 34, 55, 0.05) 0px 10px 15px -3px, rgba(32, 34, 55, 0.05) 0px 4px 6px -4px
rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px
```

### 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
header { font-size:0.90625rem }
header { font-weight:500 }
header { color:rgb(40 25 80 / var(--tw-text-opacity)) }
header { font-weight:450 }
h1 { font-family:Mackinac, ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; font-weight:500 }
h1 { font-size:2rem }
h1 { color:rgb(40 25 80 / var(--tw-text-opacity)) }
@media (min-width: 480px) h1 { font-size:2.5rem }
@media (min-width: 640px) h1 { font-size:3rem }
@media (min-width: 768px) h1 { font-size:3.35rem }
@media (min-width: 1024px) h1 { font-size:3.75rem }
@media (min-width: 1200px) h1 { font-size:4rem }
```

> 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://fly.io | 2026-06-11T06:09:49.666Z*
*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.*
