prism-design 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +292 -0
  2. package/LICENSE +21 -0
  3. package/README.md +203 -0
  4. package/bin/clone-architect.mjs +476 -0
  5. package/bin/prism.mjs +467 -0
  6. package/catalog/index.json +1155 -0
  7. package/extractions/airbnb.com/DESIGN.md +1068 -0
  8. package/extractions/airbnb.com/tokens.json +507 -0
  9. package/extractions/attio.com/DESIGN.md +1295 -0
  10. package/extractions/attio.com/tokens.json +438 -0
  11. package/extractions/auroxdashboard.com/DESIGN.md +724 -0
  12. package/extractions/auroxdashboard.com/tokens.json +195 -0
  13. package/extractions/careerexplorer.com/DESIGN.md +1178 -0
  14. package/extractions/careerexplorer.com/tokens.json +141 -0
  15. package/extractions/chance.co/DESIGN.md +1209 -0
  16. package/extractions/chance.co/tokens.json +160 -0
  17. package/extractions/choisis-ton-avenir.com/DESIGN.md +1265 -0
  18. package/extractions/choisis-ton-avenir.com/tokens.json +227 -0
  19. package/extractions/example.com/DESIGN.md +436 -0
  20. package/extractions/example.com/tokens.json +91 -0
  21. package/extractions/getdesign.md/DESIGN.md +1009 -0
  22. package/extractions/getdesign.md/tokens.json +219 -0
  23. package/extractions/github.com/DESIGN.md +1130 -0
  24. package/extractions/github.com/tokens.json +2092 -0
  25. package/extractions/hello-charly.com/DESIGN.md +1146 -0
  26. package/extractions/hello-charly.com/tokens.json +322 -0
  27. package/extractions/hyperliquid.xyz/DESIGN.md +779 -0
  28. package/extractions/hyperliquid.xyz/tokens.json +598 -0
  29. package/extractions/instagram.com/DESIGN.md +996 -0
  30. package/extractions/instagram.com/tokens.json +1240 -0
  31. package/extractions/jobirl.com/DESIGN.md +1160 -0
  32. package/extractions/jobirl.com/tokens.json +139 -0
  33. package/extractions/life360.com/DESIGN.md +1133 -0
  34. package/extractions/life360.com/tokens.json +491 -0
  35. package/extractions/lifesum.com/DESIGN.md +965 -0
  36. package/extractions/lifesum.com/tokens.json +170 -0
  37. package/extractions/linear.app/DESIGN.md +1301 -0
  38. package/extractions/linear.app/tokens.json +732 -0
  39. package/extractions/mavoie.org/DESIGN.md +1148 -0
  40. package/extractions/mavoie.org/tokens.json +128 -0
  41. package/extractions/miro.com/DESIGN.md +1237 -0
  42. package/extractions/miro.com/tokens.json +401 -0
  43. package/extractions/notion.so/DESIGN.md +1319 -0
  44. package/extractions/notion.so/tokens.json +906 -0
  45. package/extractions/onetonline.org/DESIGN.md +909 -0
  46. package/extractions/onetonline.org/tokens.json +280 -0
  47. package/extractions/posthog.com/DESIGN.md +1024 -0
  48. package/extractions/posthog.com/tokens.json +197 -0
  49. package/extractions/revolut.com/DESIGN.md +1080 -0
  50. package/extractions/revolut.com/tokens.json +401 -0
  51. package/extractions/stripe.com/DESIGN.md +1272 -0
  52. package/extractions/stripe.com/tokens.json +794 -0
  53. package/extractions/switchcollective.com/DESIGN.md +1040 -0
  54. package/extractions/switchcollective.com/tokens.json +98 -0
  55. package/extractions/truity.com/DESIGN.md +970 -0
  56. package/extractions/truity.com/tokens.json +166 -0
  57. package/extractions/uniquekicks.be/DESIGN.md +1171 -0
  58. package/extractions/uniquekicks.be/tokens.json +237 -0
  59. package/package.json +122 -0
  60. package/scripts/analyze.ts +281 -0
  61. package/scripts/bank-register.ts +379 -0
  62. package/scripts/bank.ts +374 -0
  63. package/scripts/browser-stealth.ts +189 -0
  64. package/scripts/clone.ts +198 -0
  65. package/scripts/compare-vs-gd-final.ts +273 -0
  66. package/scripts/compare-vs-gd.ts +269 -0
  67. package/scripts/compare.ts +405 -0
  68. package/scripts/deploy-site.ts +181 -0
  69. package/scripts/diff-snapshots.ts +340 -0
  70. package/scripts/enrich-catalog.ts +212 -0
  71. package/scripts/extract.ts +2038 -0
  72. package/scripts/extractors/advanced.ts +524 -0
  73. package/scripts/extractors/widgets.ts +711 -0
  74. package/scripts/generate-design-md.ts +5775 -0
  75. package/scripts/generate-final-pdf.ts +274 -0
  76. package/scripts/generate-og-image.ts +87 -0
  77. package/scripts/generate-showcase.ts +1588 -0
  78. package/scripts/generate-site.ts +847 -0
  79. package/scripts/mass-extract.sh +91 -0
  80. package/scripts/post-process-all.sh +55 -0
  81. package/scripts/regen-catalog.ts +203 -0
  82. package/scripts/shared/cache.ts +149 -0
  83. package/scripts/shared/css-helpers.ts +263 -0
  84. package/scripts/shared/logger.ts +57 -0
  85. package/scripts/shared/named-colors.ts +355 -0
  86. package/scripts/shared/types.ts +220 -0
  87. package/scripts/sync-catalog.ts +105 -0
  88. package/scripts/tokenize.ts +988 -0
  89. package/templates/layout-template.md +52 -0
  90. package/templates/tokens-template.json +34 -0
@@ -0,0 +1,1009 @@
1
+ ---
2
+ version: alpha
3
+ name: getdesign.md
4
+ description: "Dark-canvas product system built on #ffffff with #800000 as the single brand accent. Type anchored in GeistPixel-line at 48px / weight 400. Extracted automatically from https://getdesign.md/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
5
+ narrative: |
6
+ getdesign.md is built on a near-black canvas (rgb(0, 0, 0)).
7
+ The system uses rgb(128, 0, 0) as the accent for primary actions and brand signals.
8
+ GeistPixel-line as the primary typeface.
9
+ A restrained elevation system (1 distinct shadow) — shadows reserved for the few elements that must lift off the page.
10
+ Motion is a first-class concern — 6 keyframe animations plus transition-driven interactions.
11
+
12
+ colors:
13
+ surface-1: "#0a0a0a"
14
+ surface-2: "#1a1305"
15
+ ink: "#ededed"
16
+ ink-muted: "#a0a0a0"
17
+ ink-subtle: "#878787"
18
+ primary: "#800000"
19
+ on-primary: "#ffffff"
20
+ primary-hover: "#f5a623"
21
+ hairline: "#666666"
22
+ primary-focus: "#1a1305"
23
+
24
+ typography:
25
+ display-xl:
26
+ fontFamily: "GeistPixel-line"
27
+ fontSize: 48px
28
+ fontWeight: 400
29
+ lineHeight: 1.05
30
+ letterSpacing: 0
31
+ display-md:
32
+ fontFamily: "Geist Mono"
33
+ fontSize: 12px
34
+ fontWeight: 500
35
+ lineHeight: 1.4
36
+ letterSpacing: 1.2px
37
+ body:
38
+ fontFamily: "Geist"
39
+ fontSize: 16px
40
+ fontWeight: 400
41
+ lineHeight: 1.5
42
+ letterSpacing: 0
43
+ body-sm:
44
+ fontFamily: "GeistPixel-Square"
45
+ fontSize: 21px
46
+ fontWeight: 600
47
+ lineHeight: 1.2
48
+ letterSpacing: 2.52px
49
+ caption:
50
+ fontFamily: "Geist Mono"
51
+ fontSize: 13px
52
+ fontWeight: 500
53
+ lineHeight: 1.4
54
+ letterSpacing: 0
55
+ button:
56
+ fontFamily: "Geist"
57
+ fontSize: 12px
58
+ fontWeight: 400
59
+ lineHeight: 1.5
60
+ letterSpacing: 0
61
+
62
+ rounded:
63
+ none: 0px
64
+ xs: 4px
65
+ sm: 6px
66
+ md: 12px
67
+ lg: 12px
68
+ xl: 12px
69
+ xxl: 24px
70
+ pill: 9999px
71
+
72
+ spacing:
73
+ xxs: 2px
74
+ xs: 4px
75
+ sm: 8px
76
+ md: 12px
77
+ lg: 24px
78
+ xl: 32px
79
+ xxl: 64px
80
+ section: 80px
81
+
82
+ components:
83
+ button-icon-button:
84
+ backgroundColor: "transparent"
85
+ textColor: "{colors.primary-focus}"
86
+ typography: "{typography.body}"
87
+ rounded: "{rounded.sm}"
88
+ button-outline:
89
+ backgroundColor: "transparent"
90
+ textColor: "{colors.ink}"
91
+ typography: "{typography.display-md}"
92
+ rounded: "{rounded.sm}"
93
+ padding: 6px 12px
94
+ button-icon-button-2:
95
+ backgroundColor: "#c0c0c0"
96
+ textColor: "{colors.ink}"
97
+ typography: "{typography.body}"
98
+ rounded: "{rounded.none}"
99
+ padding: 2px
100
+ input-text-input:
101
+ backgroundColor: "transparent"
102
+ textColor: "{colors.ink}"
103
+ typography: "{typography.caption}"
104
+ rounded: "{rounded.none}"
105
+ padding: 12px 0px
106
+ cta-banner-full-width-cta:
107
+ backgroundColor: "{colors.surface-1}"
108
+ textColor: "{colors.ink}"
109
+ typography: "{typography.body}"
110
+ rounded: "{rounded.sm}"
111
+ padding: 12px 20px
112
+
113
+ extracted_at: "2026-06-03T00:01:20.558Z"
114
+ completeness: 82
115
+ scoreVersion: "v2"
116
+
117
+ ---
118
+
119
+ # Design System — getdesign.md
120
+ > Extracted automatically by Prism from https://getdesign.md
121
+ > Date: 2026-06-03
122
+ > Viewport: Desktop 1440x900 + Mobile 390x844
123
+ > 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).
124
+
125
+
126
+ ## 0. Design DNA
127
+
128
+ **Density**: moderate  |  **Motion**: animated  |  **Weight**: medium  |  **Aesthetic**: dark-premium
129
+
130
+ | Dimension | Value | Signal |
131
+ |---|---|---|
132
+ | Canvas | dark | `#000000` |
133
+ | Type posture | sans-led (Geist) | "Production-grade analysis" |
134
+ | Color assertion | dual-accent | #800000 |
135
+ | Whitespace | moderate | section rhythm 48px |
136
+ | Interaction | animated | 6 keyframes, 8 transitions |
137
+ | Radius language | 6px-rounded | from token scale |
138
+
139
+ **Prism fingerprint**: `dark-canvas · sans-display · dual-accent · 6px-rounded · animated-motion`
140
+
141
+ > **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
142
+ >
143
+ > - **Canvas**: `rgb(0, 0, 0)` is the page background. Every component composits against this.
144
+ > - **Accent**: `rgb(128, 0, 0)` for primary CTAs ONLY. Never decorative.
145
+ > - **Body type**: 16px (token: `typography.body`). Default for ALL text not in a heading role.
146
+ > - **Section rhythm**: 48px between major bands. Card padding: 24px.
147
+ > - **Default radius**: 6px on buttons/inputs. Pills (`9999px`) only for icon-buttons or status chips.
148
+ >
149
+ > **Before generating UI**: import this DESIGN.md, scan §2 (Color Palette) + §4 (Components) + §10 (Agent Guide). Skip §11–12 unless extending.
150
+
151
+ ## 1. Visual Theme & Atmosphere
152
+
153
+ getdesign.md commits fully to dark-mode as the native medium, not as a toggled alternative. The canvas is a near-pure-black surface (`#000000`) where surfaces are layered through stepped luminance — each elevated level is slightly less dark than the one beneath it, creating depth without color shifts.
154
+
155
+ Headlines are set in **GeistPixel-line**, a sans-serif display face (the dominant type signature, e.g. "Production-grade analysis" at 48px). A second display voice — **GeistPixel-Square** (sans) — appears in lower bands (e.g. "Find Designs"), used for editorial accent. Body text is set in **Geist**.
156
+
157
+ Body text reads in Light Gray (`#ededed`) (contrast ratio 19.6:1, well above WCAG AA). **#800000** (`#800000`) 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 (1 distinct), each a multi-layer stack — several blurred layers at varying offsets — used sparingly rather than across the whole UI.
158
+ 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.
159
+
160
+ **Key Characteristics:**
161
+ - Background: Black (`#000000`)
162
+ - Primary typeface: Geist
163
+ - Primary text: Light Gray (`#ededed`)
164
+ - Accent: #800000 (`#800000`)
165
+ - Display: 48px weight 400
166
+ - Shadow system: 1 distinct elevation levels
167
+ - Custom fonts loaded: Geist, Geist Mono, GeistPixel-Line, GeistPixel-Circle, GeistPixel-Square
168
+
169
+ ## 2. Color Palette & Roles
170
+
171
+ ### Background & Surface
172
+ - **Black** (`#000000`): Page background (primary)
173
+ - **Background 100** (`#0a0a0a`): Surface / elevated background (CSS var)
174
+ - **Card** (`#111111`): Surface / elevated background (CSS var)
175
+ - **Jet Black** (`#1a1305`): Surface / elevated background
176
+ - **Muted** (`#1a1a1a`): Surface / elevated background
177
+
178
+ ### Text & Content
179
+ - **Foreground** (`#ededed`): Primary body text
180
+ - **#f5a623** (`#f5a623`): Secondary text
181
+ - **Cool Gray** (`#a0a0a0`): Secondary text
182
+ - **Medium Gray** (`#8f8f8f`): Secondary text
183
+ - **Silver** (`#d0d0d0`): Secondary text
184
+
185
+ ### Accent & Interactive
186
+ - **Accent Foreground** (`#ffffff`): Accent / interactive (CSS var)
187
+ - **Accent** (`#ffb1ee`): Accent / interactive (CSS var)
188
+ - **#33a0d1** (`#33a0d1`): Interactive / accent
189
+ - **#373485** (`#373485`): Interactive / accent
190
+ - **#c52b30** (`#c52b30`): Interactive / accent
191
+ - **Amber** (`#f0b90b`): Interactive / accent
192
+ - **#ffff00** (`#ffff00`): Interactive / accent
193
+
194
+ ### Border & Divider
195
+ - **Border** (`#2e2e2e`): Border (CSS var)
196
+ - **Near Black** (`#1f1f1f`): Borders / dividers
197
+ - **Dark Gray** (`#444444`): Borders / dividers
198
+ - **Charcoal** (`#333333`): Borders / dividers
199
+ - **Dark Gray** (`#404040`): Borders / dividers
200
+
201
+ ### Full Extracted Palette
202
+ **64 colors rendered on the page** + **5** more declared in design tokens (CSS custom properties — not necessarily painted). (22 categorized above + 47 additional below.)
203
+ Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.
204
+
205
+ - `#878787` — Medium Gray
206
+ - `#c0c0c0` — Silver
207
+ - `#dfdfdf` — Light Gray
208
+ - `#000080` — #000080
209
+ - `#ff8c00` — #ff8c00
210
+ - `#808080` — Medium Gray
211
+ - `#800000` — #800000
212
+ - `#808000` — #808000
213
+ - `#008000` — #008000
214
+ - `#008080` — #008080
215
+ - `#800080` — #800080
216
+ - `#808040` — #808040
217
+ - `#004040` — #004040
218
+ - `#0000ff` — #0000ff
219
+ - `#004080` — #004080
220
+ - `#400080` — #400080
221
+ - `#800040` — #800040
222
+ - `#ff0000` — Red
223
+ - `#00ff00` — #00ff00
224
+ - `#00ffff` — #00ffff
225
+ - `#ff00ff` — #ff00ff
226
+ - `#ffff80` — #ffff80
227
+ - `#00ff80` — #00ff80
228
+ - `#80ffff` — #80ffff
229
+ - `#0080ff` — #0080ff
230
+ - `#8000ff` — #8000ff
231
+ - `#ff0080` — Rose
232
+ - `#804000` — Chocolate
233
+ - `#666666` — Dim Gray
234
+ - `#03231c` — Deep Navy
235
+ - `#007db8` — #007db8
236
+ - `#0096d6` — Sky Bright
237
+ - *…+15 more in `raw-css.json` (`desktop.allColors`).*
238
+
239
+ ### CSS Custom Properties (Design Tokens)
240
+
241
+ **Secondary Color**
242
+ - `--color-muted-foreground`: `#878787`
243
+ - `--color-muted`: `#1a1a1a`
244
+
245
+ **Shadow Token**
246
+ - `--tw-ring-offset-shadow`: `0 0 #0000`
247
+ - `--tw-inset-shadow-alpha`: `100%`
248
+ - `--tw-ring-shadow`: `0 0 #0000`
249
+ - `--tw-drop-shadow-alpha`: `100%`
250
+
251
+ **Spacing Token**
252
+ - `--spacing-4`: `1rem`
253
+ - `--spacing-1`: `.25rem`
254
+ - `--spacing-6`: `1.5rem`
255
+ - `--spacing-12`: `3rem`
256
+
257
+ **Motion Token**
258
+ - `--default-transition-timing-function`: `cubic-bezier(.4, 0, .2, 1)`
259
+ - `--default-transition-duration`: `.15s`
260
+
261
+ **Background**
262
+ - `--color-background-100`: `#0a0a0a`
263
+ - `--color-background-200`: `#111`
264
+ - `--color-background`: `#000`
265
+
266
+ **Font Weight Token**
267
+ - `--font-weight-semibold`: `600`
268
+ - `--font-weight-bold`: `700`
269
+ - `--font-weight-medium`: `500`
270
+
271
+ **Primary Brand Color**
272
+ - `--color-accent-foreground`: `#fff`
273
+ - `--color-accent`: `#ffb1ee`
274
+
275
+ **Border Radius Token**
276
+ - `--radius-sm`: `.375rem`
277
+ - `--radius-full`: `9999px`
278
+ - `--radius-xs`: `.125rem`
279
+ - `--radius-xl`: `1rem`
280
+
281
+ **Border**
282
+ - `--color-border`: `#2e2e2e`
283
+
284
+ **Font Family Token**
285
+ - `--default-font-family`: `"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`
286
+ - `--default-mono-font-family`: `"Geist Mono", "SFMono-Regular", Menlo, monospace`
287
+
288
+ **Text Color**
289
+ - `--color-foreground`: `#ededed`
290
+
291
+ **Other tokens**
292
+ - `--text-2xl`: `1.5rem`
293
+ - `--color-gray-800`: `#8f8f8f`
294
+ - `--color-l1`: `#3dd68c`
295
+ - `--color-zinc-900`: `oklch(21% .006 285.885)`
296
+ - `--text-5xl--line-height`: `1`
297
+ - `--text-2xl--line-height`: `calc(2 / 1.5)`
298
+ - `--color-card-foreground`: `#ededed`
299
+ - `--color-gray-300`: `#292929`
300
+
301
+ ## 3. Typography Rules
302
+
303
+ ### Font Families
304
+ - **Primary**: `Geist`
305
+ - **Secondary**: `GeistPixel-line`
306
+ - **Font 3**: `Geist Mono`
307
+ - **Font 4**: `GeistPixel-Circle`
308
+ - **Font 5**: `GeistPixel-Square`
309
+
310
+ ### Custom Fonts Loaded
311
+ - **Geist** weight 100 900 (normal)
312
+ - **Geist Mono** weight 100 900 (normal)
313
+ - **GeistPixel-Line** weight 400 (normal)
314
+ - **GeistPixel-Circle** weight 400 (normal)
315
+ - **GeistPixel-Square** weight 400 (normal)
316
+
317
+ ### Typography Hierarchy
318
+
319
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
320
+ |------|------|------|--------|-------------|----------------|-------|
321
+ | Display Hero | GeistPixel-line | 48px | 400 | 1.05 | normal | Main headline (h1) |
322
+ | Link Large | GeistPixel-Square | 21px | 600 | 1.2 | 2.52px | Link (21px) — Decoration: none |
323
+ | Body | Geist | 16px | 400 | 1.5 | normal | Standard reading text |
324
+ | Link | Geist | 14px | 500 | 1.5 | 1.4px | Link (14px) — Decoration: none |
325
+ | Link | Geist | 13px | 400 | 1.5 | normal | Link (13px) — Decoration: none |
326
+ | Link | Geist | 13px | 600 | 1.4 | normal | Link (13px) — Decoration: none |
327
+ | Caption / Badge | Geist Mono | 13px | 500 | 1.4 | normal | small text (13px) |
328
+ | Sub-heading | Geist Mono | 12px | 500 | 1.4 | 1.2px | Third-level heading (h3) |
329
+ | Button Small | Geist | 12px | 400 | 1.5 | normal | Button label (12px) |
330
+
331
+ ### Font Weight Scale
332
+
333
+ CSS custom properties define 3 explicit weight steps:
334
+ - `--font-weight-medium`: `500` — Medium
335
+ - `--font-weight-semibold`: `600` — SemiBold
336
+ - `--font-weight-bold`: `700` — Bold
337
+
338
+ ### Full Font Size Scale
339
+
340
+ Sizes detected in the design (descending): `48px`, `24px`, `21px`, `18px`, `16px`, `15px`, `14px`, `13px`, `12px`, `10px`, `9px`
341
+
342
+ > 5 size(s) detected outside the sampled hierarchy (24px, 18px, 15px, 10px, 9px). These appear on elements not in the sampled set — likely additional display sizes, marketing-section overrides, or third-party-widget styles.
343
+
344
+ ## 4. Component Stylings
345
+
346
+ ### Buttons
347
+
348
+ **Icon Button**
349
+ - Background: `transparent`
350
+ - Text: `#1a1305` `{colors.primary-focus}`
351
+ - Padding: 0px
352
+ - Radius: 6px
353
+ - Font: 16px weight 400
354
+ - Use: Toolbar/UI icons
355
+ - Hover: backgroundColor: `#000000`
356
+ - Focus: outline: `rgb(26, 19, 5) auto 1px`
357
+
358
+ **Outline**
359
+ - Background: `transparent`
360
+ - Text: `#ededed` `{colors.ink}`
361
+ - Padding: 6px 12px
362
+ - Radius: 6px
363
+ - Border: 1px solid rgb(46, 46, 46)
364
+ - Font: 12px weight 400
365
+ - Use: Secondary action with border
366
+ - Hover: backgroundColor: `#000000`
367
+ - Focus: outline: `rgb(26, 19, 5) auto 1px`
368
+
369
+ **Icon Button**
370
+ - Background: `#c0c0c0`
371
+ - Text: `#ededed` `{colors.ink}`
372
+ - Padding: 2px
373
+ - Radius: 0px
374
+ - Font: 16px weight 400
375
+ - Use: Toolbar/UI icons
376
+ - Hover: backgroundColor: `#000000`
377
+ - Focus: outline: `rgb(26, 19, 5) auto 1px`
378
+
379
+ **Secondary**
380
+ - Background: `#ffb1ee`
381
+ - Text: `#000000`
382
+ - Padding: 6px 12px
383
+ - Radius: 6px
384
+ - Font: 13px weight 600
385
+ - Use: Secondary action
386
+ - Hover: backgroundColor: `#000000`
387
+ - Focus: outline: `rgb(26, 19, 5) auto 1px`
388
+
389
+ **Dark / Solid**
390
+ - Background: `#0a0a0a` `{colors.surface-1}`
391
+ - Text: `#ededed` `{colors.ink}`
392
+ - Padding: 12px 20px
393
+ - Radius: 6px
394
+ - Border: 1px solid rgb(46, 46, 46)
395
+ - Font: 15px weight 400
396
+ - Use: Solid dark CTA
397
+ - Hover: backgroundColor: `#000000`
398
+ - Focus: outline: `rgb(26, 19, 5) auto 1px`
399
+
400
+ ### Inputs & Forms
401
+
402
+ **Text Input**
403
+ - Background: `transparent`
404
+ - Text: `#ededed` `{colors.ink}`
405
+ - Padding: 12px 0px
406
+ - Radius: 0px
407
+ - Border: 0px solid rgb(237, 237, 237)
408
+ - Font: 13px weight 500
409
+ - Use: Text fields, search inputs
410
+ - Focus: outline: `rgb(16, 16, 16) none 1px`
411
+
412
+ ### CTA Banners
413
+
414
+ **Full-width CTA**
415
+ - Background: `#0a0a0a` `{colors.surface-1}`
416
+ - Text: `#ededed` `{colors.ink}`
417
+ - Padding: 12px 20px
418
+ - Radius: 6px
419
+ - Font: 15px weight 400
420
+ - Use: Full-width conversion strip with headline + button
421
+ - Hover: backgroundColor: `#000000`
422
+ - Focus: outline: `rgb(26, 19, 5) auto 1px`
423
+
424
+
425
+ ## 4b. Component Behaviors (State Matrix)
426
+
427
+ ### Interaction State Narrative
428
+
429
+ - **Button**:
430
+ - **hover:** bg transparent → #000000
431
+
432
+ *State transitions extracted via Playwright simulation — exact values in the YAML matrix below.*
433
+
434
+ ```yaml
435
+ component-behaviors:
436
+ button:
437
+ default:
438
+ bg: "rgba(0, 0, 0, 0)"
439
+ fg: "rgb(26, 19, 5)"
440
+ hover:
441
+ bg: "oklab(0 0 0 / 0)"
442
+ fg: "rgb(26, 19, 5)"
443
+ focus:
444
+ bg: "rgba(0, 0, 0, 0)"
445
+ fg: "rgb(26, 19, 5)"
446
+ input:
447
+ default:
448
+ bg: "rgba(0, 0, 0, 0)"
449
+ fg: "rgb(237, 237, 237)"
450
+ focus:
451
+ bg: "rgba(0, 0, 0, 0)"
452
+ fg: "rgb(237, 237, 237)"
453
+ link:
454
+ default:
455
+ bg: "rgba(0, 0, 0, 0)"
456
+ fg: "rgb(10, 10, 10)"
457
+ navLink:
458
+ default:
459
+ bg: "rgba(0, 0, 0, 0)"
460
+ fg: "rgb(237, 237, 237)"
461
+ footerLink:
462
+ default:
463
+ bg: "rgba(0, 0, 0, 0)"
464
+ fg: "rgb(102, 102, 102)"
465
+ ```
466
+
467
+ **Agent usage**: Validate generated components against this matrix. If your output's `:hover` state changes properties not listed here, you are off-brand.
468
+
469
+
470
+ ## 4c. Component Vocabulary (Closed System)
471
+
472
+ *This brand uses ONLY the following component vocabulary. Introducing new variants without justification breaks the system's tonal coherence.*
473
+
474
+ ### Buttons
475
+ - **4 shape(s)** in this system: `Icon Button`, `Outline`, `Secondary`, `Dark / Solid`
476
+ - **DO NOT introduce new buttons variants** without justification
477
+
478
+ ### Inputs & Forms
479
+ - **1 shape(s)** in this system: `Text Input`
480
+ - **DO NOT introduce new inputs & forms variants** without justification
481
+
482
+ ### CTA Banners
483
+ - **1 shape(s)** in this system: `Full-width CTA`
484
+ - **DO NOT introduce new cta banners variants** without justification
485
+
486
+ ## 5. Layout Principles
487
+
488
+ ### Layout Type
489
+ **top-nav + content**
490
+
491
+ ### Grid
492
+ Single column, centered content
493
+
494
+ ### Max Width
495
+ 1200px
496
+
497
+ ### Spacing System
498
+ Compact spacing — information density prioritized
499
+
500
+ | Token | Value |
501
+ |-------|-------|
502
+ | xxs | 2px |
503
+ | xs | 4px |
504
+ | sm | 8px |
505
+ | md | 12px |
506
+ | base | 16px |
507
+ | lg | 24px |
508
+ | xl | 32px |
509
+ | 2xl | 48px |
510
+ | 3xl | 64px |
511
+
512
+ ### Border Radius Scale
513
+ | Name | Value | Use |
514
+ |------|-------|-----|
515
+ | None | 0px | No rounding |
516
+ | Xs | 4px | Tiny corners (badges, micro elements) |
517
+ | Sm | 6px | Buttons, inputs, small elements |
518
+ | Md | 12px | Cards, containers |
519
+ | Lg | 12px | Large rounded elements, pill segments |
520
+ | Xl | 12px | Category strips, featured containers |
521
+ | Full | 9999px | Pills, avatars, circular elements |
522
+
523
+ ### Shape Language
524
+
525
+ | Component | Border Radius |
526
+ |-----------|---------------|
527
+ | Buttons | `6px` |
528
+ | Inputs & Forms | `0px` |
529
+ | CTA Banners | `6px` |
530
+ | Page Body | `0px` |
531
+ | Navigation | `0px` |
532
+ | Primary Input | `0px` |
533
+
534
+ **Shape Personality**: Moderate Rounding — Medium corners (4–12px). Modern SaaS standard, neither sharp nor pill.
535
+
536
+ **Full Radius Spectrum**: 0px, 4px, 6px, 12px, full/pill (from `allBorderRadii` scan)
537
+
538
+
539
+ ## 5b. Spacing Rhythm Names
540
+
541
+ **Measured section rhythm**: bands use ~56px vertical padding (up to 56px) — **standard**. Reproduce this generous vertical breathing room; cramped spacing is the #1 tell of a cheap clone.
542
+
543
+ *Named spacing tokens with explicit use cases. Use these names in YOUR code instead of raw pixels for consistency.*
544
+
545
+ | Name | Value | Use case |
546
+ |------|-------|----------|
547
+ | **hero** | `64px` | Top/bottom of full-bleed hero sections |
548
+ | **section** | `32px` | Between major bands (color change, content shift) |
549
+ | **subsection** | `24px` | Within a section, between content groups |
550
+ | **card** | `12px` | Card padding, list-item spacing |
551
+ | **compact** | `8px` | Form fields, tight clusters, badge padding |
552
+ | **micro** | `4px` | Icon-text gap, tag inner padding |
553
+
554
+ **Agent rule**: NEVER hardcode raw pixel values for spacing in generated UI. Always reference these named tokens (`spacing-rhythm.section`, etc.).
555
+
556
+ ## 5c. Widget & Structure Library
557
+
558
+ Structural patterns extracted from the page DOM — these are the **blueprints** an agent should follow to reproduce the page architecture (not just CSS values).
559
+
560
+ **2/8 structural patterns detected.**
561
+
562
+ ### Hero Pattern
563
+
564
+ - **Composition:** centered — Centered composition — heading + subheading + CTAs stacked vertically, content centered horizontally. Common for SaaS marketing pages.
565
+ - **Viewport coverage:** 391px tall (not full-viewport)
566
+ - **Heading:** "Production-gradeDESIGN.md analysis" — 48px left-aligned
567
+ - **Subheading:** "Analyzed patterns, tokens, and rules as inspiration for your coding agent."
568
+ - **Media:** present, positioned top
569
+ - **CTAs:** 4 (primary: "Browse design system analysis→")
570
+ - **Clone instruction:** Reproduce the **centered** layout. Use the heading font-size token at the documented size. Place media top of text.
571
+
572
+ ### Footer Pattern
573
+
574
+ - **Columns:** 1
575
+ - **Links:** 4 total
576
+ - **Height:** 90px
577
+ - **Includes:** ✗ no newsletter | ✓ social icons |
578
+ - **Clone instruction:** Build a 1-column footer with ~4 links per column, social media links.
579
+
580
+ ## 6. Depth & Elevation
581
+
582
+ | Level | Treatment | Use |
583
+ |-------|-----------|-----|
584
+ | Flat (Level 0) | No shadow | Page background, content blocks |
585
+ | Layered (Level 1) | <br>`rgba(0, 0, 0, 0.16) 0px 10px 28px 0px` | Cards, elevated surfaces |
586
+
587
+ **Shadow Philosophy**: Multi-layered shadow system creating natural, atmospheric depth. Each shadow level combines multiple layers for realistic elevation.
588
+
589
+ ## 7. Motion & Interaction
590
+
591
+ ### Easing System
592
+
593
+ | CSS Variable | Curve | Semantic Name |
594
+ |--------------|-------|---------------|
595
+ | `--default-transition-timing-function` | `cubic-bezier(.4, 0, .2, 1)` | Ease Out — Decelerating |
596
+ | `--ease-in` | `cubic-bezier(.4, 0, 1, 1)` | Custom Ease — Balanced |
597
+ | `--ease-out` | `cubic-bezier(0, 0, .2, 1)` | Ease Out — Decelerating |
598
+ | `--ease-in-out` | `cubic-bezier(.4, 0, .2, 1)` | Ease Out — Decelerating |
599
+
600
+ ### Duration Scale
601
+
602
+ | CSS Variable | Value | Tier |
603
+ |--------------|-------|------|
604
+ | `--default-transition-duration` | `.15s` | Fast |
605
+
606
+ ### Copy-Paste Transition Snippets
607
+
608
+ **Transform**
609
+ ```css
610
+ transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), translate 0.2s cubic-bezier(0.4, 0, 0.2, 1), scale 0.2s cubic-bezier(0.4...;
611
+ ```
612
+
613
+ **Color / Background**
614
+ ```css
615
+ 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...;
616
+ ```
617
+
618
+ **Opacity**
619
+ ```css
620
+ transition: opacity 0.15s cubic-bezier(0.4, 0, 0.2, 1);
621
+ ```
622
+
623
+ **Color / Background**
624
+ ```css
625
+ transition: color 0.1s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.1s cubic-bezier(0.4, 0, 0.2, 1), border-color 0.1s cubic-...;
626
+ ```
627
+
628
+ ### Keyframe Animation Catalog
629
+
630
+ | Animation Name | Type | Animated Props | Use Hint |
631
+ |----------------|------|----------------|----------|
632
+ | `catalog-shimmer` | Custom | background-position-x, background-position-y | Loading placeholder |
633
+ | `catalog-pulse` | Fade + Move | opacity, transform | Attention / status |
634
+ | `fade-up` | Fade + Move | opacity, transform | UI transition |
635
+ | `fade-in` | Fade | opacity | Element entrance |
636
+ | `marquee` | Slide | transform | UI transition |
637
+ | `heartbeat` | Scale | transform | UI transition |
638
+
639
+ ### Motion Fingerprint
640
+
641
+ - **Speed Character**: Balanced Pacing (median duration: `150ms`)
642
+ - **Dominant Easing**: custom cubic-bezier curves
643
+ - **Animation Library**: 6 unique animations (6 total including variants)
644
+
645
+ > This design moves with balanced pacing timing using custom cubic-bezier curves, creating a UI that feels natural and fluid.
646
+
647
+ ## 8. Do's and Don'ts
648
+
649
+ ### Do
650
+ - Use dark background (`#000000`) as the foundation — this is a dark-mode-native design
651
+ - Use Geist as the primary typeface — it defines the brand personality
652
+ - Use the extracted shadow patterns for elevation — they are tuned to match the brand palette
653
+ - Use full-pill radius (9999px) only for specific elements (avatars, pills, toggles)
654
+ - Use #800000 (`#800000`) as the primary accent — it's the brand's signature interactive color
655
+ - Transition button background to Unknown (`#000000`) on hover — this is the extracted interactive state
656
+ - Respect the 4px–32px spacing range — the design uses a wide scale for visual breathing room
657
+ - Include exactly 4 CTAs in the hero (primary + secondary) — this design pattern is multi-action, not single-purpose
658
+
659
+ ### Don't
660
+ - Don't use light backgrounds — the dark canvas is the native medium
661
+ - Don't substitute with generic sans-serif or serif — the custom font carries the brand
662
+ - Don't invent new shadow values — use only the extracted shadow levels
663
+ - Don't apply pill radius on rectangular buttons or cards — it's reserved for specific interactive elements
664
+ - Don't introduce additional saturated accent colors — the palette is intentionally controlled
665
+ - Don't use opacity or brightness filter for button hover — the design uses an explicit background color change
666
+ - Don't over-build the footer — this design keeps it minimal (1 cols, 4 links)
667
+
668
+
669
+ ## 7b. Enforceable Brand Rules
670
+
671
+ *Structured Do/Don't with reasoning and validation tests. Agents can programmatically verify generated UI.*
672
+
673
+ ```yaml
674
+ rules:
675
+ - id: brand-canvas-001
676
+ type: do
677
+ rule: "Always use the page background `rgb(0, 0, 0)` as the base canvas"
678
+ why: "Every component is designed to composit against this exact tone"
679
+ test: "document.body.style.backgroundColor === 'rgb(0, 0, 0)'"
680
+ - id: brand-accent-001
681
+ type: do
682
+ rule: "Reserve `rgb(128, 0, 0)` for primary CTAs and brand-mark signals only"
683
+ why: "Single chromatic assertion device — overuse dilutes meaning"
684
+ test: "querySelectorAll('[style*=\"rgb(128, 0, 0)\"]').length <= 3 per fold"
685
+ ```
686
+
687
+ ## 9. Responsive Behavior
688
+
689
+ ### Breakpoints
690
+ | Name | Width | Key Changes |
691
+ |------|-------|-------------|
692
+ | Mobile | 640px | Single column layout |
693
+ | Tablet | 768px | 2-column grids |
694
+ | Desktop | 1024px | Full layout |
695
+ | Large Desktop | 1280px | Maximum width |
696
+
697
+ ### Token Diff — Desktop vs Mobile
698
+
699
+ | Element | Property | Desktop | Mobile |
700
+ |---------|----------|---------|--------|
701
+ | heading | font-size | `48px` | `36px` |
702
+ | heading | line-height | `50.4px` | `37.8px` |
703
+ | nav | display | `flex` | `none` |
704
+ | nav | flex-direction | `column` | `row` |
705
+ | nav | height | `389px` | `auto` |
706
+
707
+ ### Collapsing Strategy
708
+ - Headlines: 48px → 36px on mobile
709
+ - Navigation: flex → none on mobile
710
+ - Cards: multi-column → stacked vertical on mobile
711
+ - Footer: multi-column → stacked single column on mobile
712
+
713
+ ### Touch Targets
714
+ - Buttons: 0px padding
715
+ - Navigation: adequate spacing between items
716
+ - Interactive elements: minimum 44px touch target recommended
717
+
718
+ ### Collapsing Narrative
719
+
720
+ How the structural patterns adapt from desktop to mobile (extracted from both viewport extractions):
721
+
722
+ - **Hero CTAs:** 4 on desktop → 1 on mobile (secondary CTAs dropped on small screens).
723
+
724
+
725
+ ## 7c. Visual Effects & Dynamic Behavior
726
+
727
+ *The live/dynamic layer beyond static CSS — reproduce these, not flat substitutes. This is often what separates a faithful clone from a wireframe.*
728
+
729
+ - **Canvas / 2D rendering** — animated/interactive canvas (charts, graphs, particle fields). Reproduce as live data-viz (e.g. an animated SVG/Canvas line chart), NOT a static image.
730
+ - **WebGL** — GPU 3D/shader graphics (hero atmosphere is rendered, not a flat gradient).
731
+ - **Glassmorphism** — 1 frosted/blur layer(s) (e.g. `blur(12px)`).
732
+
733
+ > **Motion fingerprint**: WebGL/3D canvas, glassmorphism (1 layers)
734
+
735
+ ## 9b. Visual Tone & Photography
736
+
737
+ **Tone:** No imagery
738
+
739
+ No detectable photographic content. The site composes entirely with typography, color blocks, and minimal vector graphics. Clone strategy: lean on type hierarchy + layout rhythm rather than visual media.
740
+
741
+ **Canonical Brand Image (OG):**
742
+ - https://getdesign.md/api/og/default
743
+ *This is the image shown when the site is shared on social media — represents the brand visual essence.*
744
+
745
+ **Media Format Mix:**
746
+ - *No detectable images.*
747
+
748
+ **Decorative Patterns Detected:**
749
+ - 2 multi-stop linear gradients (mesh-like, 3+ color stops) — the brand leans on rich color transitions for visual depth
750
+ - **Glassmorphism** detected (`backdrop-filter: blur`) — layered transparent surfaces with blur, modern OS-like aesthetic
751
+
752
+ **Clone instruction for decorative work:** Glassmorphism is a brand signature — use `backdrop-filter: blur(20px)` on overlapping surfaces.
753
+
754
+ **Imagery Guidance for clones:**
755
+ - Don't add stock imagery just to "fill space" — this site's clarity comes from typographic restraint.
756
+ - Use generous whitespace, strong type hierarchy, and color blocks for visual rhythm.
757
+
758
+ ## 10. Agent Prompt Guide
759
+
760
+ ### Quick Reference
761
+ - Background: Black (`#000000`)
762
+ - Primary text: Light Gray (`#ededed`)
763
+ - Accent: #800000 (`#800000`)
764
+ - Border: Dim Gray (`#666666`)
765
+ - Font: Geist
766
+ - Body: 16px weight 400
767
+
768
+ ### Example Component Prompts
769
+ - "Create a hero section on Black background (#000000). Headline at 48px Geist weight 400, line-height 1.05, color #ededed."
770
+ - "Create the primary CTA button: `#800000` background, `#ededed` text, 9999px border-radius, 12px 24px padding, 600 weight, Geist font."
771
+ - "Build navigation: static on `#000000`. Geist 16px weight 400 for links."
772
+
773
+ ### Iteration Guide
774
+ 1. **Canvas**: Set the dark canvas to Black (`#000000`) — every component is composited against this exact base.
775
+ 2. **Typography**: All type in Geist, weight range 400–700. Never exceed 700 — heavier weights break the brand's tonal restraint.
776
+ 3. **Accent**: #800000 (`#800000`) is the sole interactive color. On hover → #f5a623 (`#f5a623`). Use CSS transitions, not opacity/brightness filters.
777
+ 4. **Motion**: All transitions use `cubic-bezier(0.4,0,0.2,1)`. Timing: 150ms for micro-interactions, 150ms for layout changes. Never use linear for UI transitions — preserve the brand's easing personality.
778
+ 5. **Shape**: CTAs at `6px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
779
+ 6. **Spacing**: Use the `--ca-space-*` token scale (4px–32px). All padding, margin, and gap values are multiples from this scale — no magic numbers.
780
+ 7. **Tokens**: Import from §11 CSS Export (`--ca-*` vars). Never hardcode hex values — always reference a token so theming remains consistent.
781
+
782
+ ## 11. CSS Design Tokens Raw Export
783
+
784
+ *Copy-paste ready `:root {}` block — all values extracted directly from the live site.*
785
+
786
+ ```css
787
+ /* Colors */
788
+ :root {
789
+ --ca-surface-1: #0a0a0a;
790
+ --ca-primary-focus: #1a1305;
791
+ --ca-ink: #ededed;
792
+ --ca-ink-muted: #a0a0a0;
793
+ --ca-ink-subtle: #878787;
794
+ --ca-primary: #800000;
795
+ --ca-on-primary: #ffffff;
796
+ --ca-primary-hover: #f5a623;
797
+ --ca-hairline: #666666;
798
+ }
799
+
800
+ /* Typography */
801
+ :root {
802
+ --ca-font-primary: "GeistPixel-line", system-ui, sans-serif;
803
+ --ca-text-display: 48px;
804
+ --ca-text-body: 16px;
805
+ --ca-text-small: 21px;
806
+ --ca-text-caption: 13px;
807
+ --ca-text-button: 12px;
808
+ }
809
+
810
+ /* Spacing & Radius */
811
+ :root {
812
+ --ca-space-xxs: 2px;
813
+ --ca-space-xs: 4px;
814
+ --ca-space-sm: 8px;
815
+ --ca-space-md: 12px;
816
+ --ca-space-base: 16px;
817
+ --ca-space-lg: 24px;
818
+ --ca-space-xl: 32px;
819
+ --ca-space-2xl: 48px;
820
+ --ca-space-3xl: 64px;
821
+ --ca-radius-none: 0px;
822
+ --ca-radius-xs: 4px;
823
+ --ca-radius-sm: 6px;
824
+ --ca-radius-md: 12px;
825
+ --ca-radius-lg: 12px;
826
+ --ca-radius-xl: 12px;
827
+ --ca-radius-full: 9999px;
828
+ }
829
+
830
+ /* Motion */
831
+ :root {
832
+ --ca-ease-in: cubic-bezier(.4, 0, 1, 1);
833
+ --ca-ease-out: cubic-bezier(0, 0, .2, 1);
834
+ --ca-ease-in-out: cubic-bezier(.4, 0, .2, 1);
835
+ }
836
+ ```
837
+
838
+
839
+ ## 13. Page Structure Skeleton
840
+
841
+ *The actual layout the source site uses. Reproduce these sections in order to match the site structure.*
842
+
843
+ ```yaml
844
+ page-skeleton:
845
+ - section: hero
846
+ tag: div
847
+ classes: ["min-[2200px]:max-w-[2000px]", "min-[2200px]:mx-auto"]
848
+ height: 3854px
849
+ width: full-bleed
850
+ layout: block
851
+ children: 6
852
+ bg: "rgb(0, 0, 0)"
853
+ tone: dark
854
+ vertical-padding: ~56px (generous)
855
+ contains: chart/canvas (reproduce as live data-viz, not a flat image)
856
+ - section: hero
857
+ tag: section
858
+ classes: ["relative", "z-20", "overflow-hidden"]
859
+ height: 391px
860
+ width: full-bleed
861
+ layout: block
862
+ children: 2
863
+ bg: "rgb(0, 0, 0)"
864
+ bg-treatment: mesh-gradient
865
+ tone: dark
866
+ contains: chart/canvas (reproduce as live data-viz, not a flat image)
867
+ - section: feature-section
868
+ tag: section
869
+ classes: ["px-4", "sm:px-6", "lg:px-16", "py-10"]
870
+ height: 3267px
871
+ width: full-bleed
872
+ layout: block
873
+ children: 2
874
+ tone: dark
875
+ vertical-padding: ~56px (generous)
876
+ contains: chart/canvas (reproduce as live data-viz, not a flat image)
877
+ padding: "56px 64px"
878
+ - section: navigation
879
+ tag: nav
880
+ classes: ["lg:flex", "lg:flex-col", "gap-0.5", "overflow-hidden"]
881
+ height: 389px
882
+ width: 256px
883
+ layout: flex-column justify=normal
884
+ children: 10
885
+ tone: dark
886
+ - section: footer
887
+ tag: footer
888
+ classes: ["mt-auto", "py-8"]
889
+ height: 90px
890
+ width: full-bleed
891
+ layout: block
892
+ children: 1
893
+ tone: dark
894
+ vertical-padding: ~32px
895
+ padding: "32px 0px"
896
+ ```
897
+
898
+ **Agent rule**: rebuild sections in this order (sorted by vertical position). Match the layout primitive (grid N-col / flex direction / block).
899
+
900
+
901
+ ## 14. Copy Library (Real Content from Source)
902
+
903
+ *Actual text content extracted from the live page. Use these strings verbatim when reproducing the site — they carry the brand voice.*
904
+
905
+ ```yaml
906
+ copy:
907
+ section-headings:
908
+ - "Find Designs"
909
+ sub-headings:
910
+ - "QUICK STATS"
911
+ ctas:
912
+ - "Sign in"
913
+ navigation:
914
+ - "get
915
+ design
916
+ .md"
917
+ - "Websites"
918
+ - "What the Community Says?"
919
+ - "Request private DESIGN.md"
920
+ - "DESIGN.md format"
921
+ - "86.8k"
922
+ - "Sign in"
923
+ footer-links:
924
+ - "Maintained by VoltAgent team"
925
+ - "About"
926
+ ```
927
+
928
+ **Agent rule**: reuse these exact strings when generating UI. Do NOT translate or rephrase — brand voice is preserved through the original wording.
929
+
930
+
931
+ ## 15. Asset Inventory (Image Roles & Ratios)
932
+
933
+ *Image inventory classified by role and aspect ratio. When reproducing the site, allocate this number of assets per role.*
934
+
935
+ ```yaml
936
+ assets:
937
+ thumbnail:
938
+ count: 49
939
+ avg-ratio: 1.00
940
+ common-aspect: "~1:1 square"
941
+ sample-alts:
942
+ - "Airtable"
943
+ - "Pencil"
944
+ ```
945
+
946
+ **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`.
947
+
948
+
949
+ ## 16. Component HTML Templates
950
+
951
+ *Suggested HTML markup for reproducing the key components — based on what was detected in the source DOM.*
952
+
953
+ ### Button (primary action)
954
+ ```html
955
+ <button class="btn btn-primary">
956
+ Action
957
+ </button>
958
+ ```
959
+ _Source pattern detected: padding `0px` · radius `6px` · weight `400`_
960
+
961
+ **Agent rule**: use these markup skeletons as the structural baseline. Apply tokens from §2-3 for visual styling.
962
+
963
+
964
+ ## 12. Known Extraction Gaps
965
+
966
+ *Auto-detected limitations of this extraction — understand before building:*
967
+
968
+ - **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.
969
+
970
+
971
+ ---
972
+ ## Extraction Completeness: 82/100 (B)
973
+
974
+ | Category | Score | Max | Detail |
975
+ |----------|-------|-----|--------|
976
+ | Colors & Palette | 25 | 25 | 22 named colors |
977
+ | Typography | 20 | 20 | 9 roles defined |
978
+ | Components | 12 | 20 | 3 specs extracted |
979
+ | Motion & Interaction | 15 | 15 | Keyframes present, easing vars |
980
+ | CSS Custom Properties | 6 | 10 | 121 vars |
981
+ | Responsive Breakpoints | 4 | 5 | 4 breakpoints |
982
+ | Variable Fonts | 0 | 5 | None detected |
983
+
984
+ ## 12. Known Gaps & Confidence
985
+
986
+ 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.
987
+
988
+ | Category | What's missing | Fallback strategy |
989
+ |----------|----------------|-------------------|
990
+ | **Photography** | No photographic content detected on this page | Don't add stock imagery; clarity comes from type + color blocks |
991
+ | **Dark mode** | No dark-mode CSS variables or media queries detected | Light mode is canonical; do not generate dark-mode variants unless explicitly requested |
992
+
993
+ ### Per-section confidence
994
+
995
+ | Section | Confidence | Reason |
996
+ |---------|------------|--------|
997
+ | §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
998
+ | §2 Colors | High | 121 CSS vars (semantic naming requires ≥20 for high) |
999
+ | §3 Typography | High | 9 typography roles inferred |
1000
+ | §4 Components | Medium | 3 component variants captured |
1001
+ | §7 Motion | High | Keyframes + transitions |
1002
+ | §8 Do's/Don'ts | High | 15 rules generated; design-decisions.json has evidence per rule |
1003
+ | §9 Responsive | High | 4 breakpoints detected |
1004
+ | §9b Photography | Low | 0 images, hero not detected |
1005
+
1006
+ ---
1007
+ *Generated by Prism — automated Playwright extraction + design analysis.*
1008
+ *Source: https://getdesign.md | 2026-06-03T00:01:20.585Z*
1009
+ *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.*