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,1130 @@
1
+ ---
2
+ version: alpha
3
+ name: github.com
4
+ description: "Light product system built on #ffffff with #1f883d as the primary CTA accent. Type anchored in Mona Sans VF at 32px / weight 600. Extracted automatically from https://github.com/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
5
+ narrative: |
6
+ github.com is built on a pure-white canvas (rgb(255, 255, 255)).
7
+ The system uses rgb(31, 136, 61) as the accent for primary actions and brand signals.
8
+ Sharp 0px corners on CTAs — architectural restraint, engineering precision alongside Mona Sans VF as the primary typeface.
9
+ A layered elevation system (7 distinct shadows) building a clear front-to-back hierarchy.
10
+ Motion is a first-class concern — 54 keyframe animations plus transition-driven interactions.
11
+
12
+ colors:
13
+ background: "#ffffff"
14
+ surface-1: "rgba(255, 255, 255, 0)"
15
+ surface-2: "rgba(228, 235, 230, 0.996)"
16
+ ink: "#1f2328"
17
+ ink-subtle: "#58635b"
18
+ primary: "#1f883d"
19
+ on-primary: "#ffffff"
20
+ primary-hover: "#1f2328"
21
+ hairline: "#25292e"
22
+ primary-focus: "#0969da"
23
+ semantic-error: "#d1242f"
24
+ semantic-success: "#1a7f37"
25
+ semantic-warning: "#9a6700"
26
+
27
+ typography:
28
+ display-xl:
29
+ fontFamily: "Mona Sans VF"
30
+ fontSize: 32px
31
+ fontWeight: 600
32
+ lineHeight: 1.5
33
+ letterSpacing: 0
34
+ display-md:
35
+ fontFamily: "Mona Sans VF"
36
+ fontSize: 24px
37
+ fontWeight: 600
38
+ lineHeight: 1.5
39
+ letterSpacing: 0
40
+ headline:
41
+ fontFamily: "Mona Sans VF"
42
+ fontSize: 16px
43
+ fontWeight: 600
44
+ lineHeight: 1.5
45
+ letterSpacing: 0
46
+ body:
47
+ fontFamily: "Mona Sans"
48
+ fontSize: 16px
49
+ fontWeight: 400
50
+ lineHeight: 1.5
51
+ letterSpacing: 0
52
+ body-sm:
53
+ fontFamily: "Mona Sans"
54
+ fontSize: 16px
55
+ fontWeight: 500
56
+ lineHeight: 1.5
57
+ letterSpacing: 0
58
+ caption:
59
+ fontFamily: "Mona Sans"
60
+ fontSize: 12px
61
+ fontWeight: 500
62
+ lineHeight: 0px
63
+ letterSpacing: 0
64
+ button:
65
+ fontFamily: "Mona Sans VF"
66
+ fontSize: 16px
67
+ fontWeight: 400
68
+ lineHeight: 1.5
69
+ letterSpacing: 0
70
+ eyebrow:
71
+ fontFamily: "Mona Sans"
72
+ fontSize: 14px
73
+ fontWeight: 400
74
+ lineHeight: 1.5
75
+ letterSpacing: 0
76
+
77
+ rounded:
78
+ none: 0px
79
+ xs: 3px
80
+ sm: 6px
81
+ md: 12px
82
+ lg: 12px
83
+ xl: 12px
84
+ xxl: 24px
85
+ pill: 9999px
86
+
87
+ spacing:
88
+ xxs: 2px
89
+ xs: 6px
90
+ sm: 16px
91
+ md: 40px
92
+ lg: 24px
93
+ xl: 32px
94
+ xxl: 64px
95
+ section: 80px
96
+
97
+ components:
98
+ button-light--invert:
99
+ backgroundColor: "#efefef"
100
+ textColor: "#000000"
101
+ typography: "{typography.headline}"
102
+ rounded: "{rounded.none}"
103
+ padding: 1px 6px
104
+ button-ghost:
105
+ backgroundColor: "{colors.surface-1}"
106
+ textColor: "{colors.on-primary}"
107
+ typography: "{typography.headline}"
108
+ rounded: "{rounded.none}"
109
+ padding: 8px
110
+ button-ghost:
111
+ backgroundColor: "{colors.surface-1}"
112
+ textColor: "{colors.on-primary}"
113
+ typography: "{typography.eyebrow}"
114
+ rounded: "{rounded.sm}"
115
+ padding: 0px 0px 0px 8px
116
+ input-text-input:
117
+ backgroundColor: "{colors.surface-1}"
118
+ textColor: "{colors.surface-1}"
119
+ typography: "{typography.eyebrow}"
120
+ rounded: "{rounded.sm}"
121
+ navigation-main-nav:
122
+ backgroundColor: "{colors.hairline}"
123
+ typography: "{typography.headline}"
124
+ rounded: "{rounded.none}"
125
+ padding: 16px 0px
126
+
127
+ extracted_at: "2026-05-30T21:32:12.271Z"
128
+ completeness: 88
129
+ scoreVersion: "v2"
130
+
131
+ ---
132
+
133
+ # Design System — github.com
134
+ > Extracted automatically by Clone Architect from https://github.com/paulsainton/lifeos-app.git
135
+ > Date: 2026-05-30
136
+ > Viewport: Desktop 1440x900 + Mobile 390x844
137
+ > 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).
138
+
139
+ > **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
140
+ >
141
+ > - **Canvas**: `rgb(255, 255, 255)` is the page background. Every component composits against this.
142
+ > - **Accent**: `rgb(31, 136, 61)` for primary CTAs ONLY. Never decorative.
143
+ > - **Body type**: 14px (token: `typography.body`). Default for ALL text not in a heading role.
144
+ > - **Section rhythm**: 48px between major bands. Card padding: 24px.
145
+ > - **Default radius**: 6px on buttons/inputs. Pills (`9999px`) only for icon-buttons or status chips.
146
+ >
147
+ > **Before generating UI**: import this DESIGN.md, scan §2 (Color Palette) + §4 (Components) + §10 (Agent Guide). Skip §11–12 unless extending.
148
+
149
+ ## 1. Visual Theme & Atmosphere
150
+
151
+ github.com adopts the classic pure-white canvas (`#ffffff`) — a deliberate choice that recedes into transparency, letting typography, color and product imagery carry the entire visual weight.
152
+
153
+ Typography is anchored in **Mona Sans VF**. The weight scale rejects the standard 100/200/.../900 ladder in favor of custom values (max **460** in this system) — a deliberate signal that this design system is precisely tuned, not assembled from defaults.
154
+
155
+ Body text reads in Warm Brown (`#1f2328`) — softened from pure black, a small but deliberate detail that lowers reading friction. **Forest Green** (`#1f883d`) 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 — each level combines several blurred layers at varying offsets to simulate the way light actually falls on stacked surfaces, not the simulated drop-shadow of cheap interfaces.
156
+ Motion design uses smooth easing curves for polished state transitions. The site uses a variable font with ITAL axes, enabling precise weight/width control across the type hierarchy.
157
+
158
+ **Key Characteristics:**
159
+ - Background: Text White (`#ffffff`)
160
+ - Primary typeface: Mona Sans
161
+ - Primary text: Warm Brown (`#1f2328`)
162
+ - Accent: Forest Green (`#1f883d`)
163
+ - Shadow system: 7 distinct elevation levels
164
+ - Custom fonts loaded: Mona Sans, MonaSansFallback, MonaSansHeaderFallback, Hubot Sans, Mona Sans Mono, Mona Sans Fallback, Mona Sans Header Fallback
165
+
166
+ ## 2. Color Palette & Roles
167
+
168
+ ### Background & Surface
169
+ - **Text White** (`#ffffff`): Page background (primary)
170
+ - **Transparent** (`transparent`): Surface / elevated background
171
+ - **Ghost White** (`#f6f8fa`): Surface / elevated background
172
+ - **Light Gray** (`#efefef`): Surface / elevated background
173
+
174
+ ### Text & Content
175
+ - **Warm Brown** (`#1f2328`): Primary body text
176
+ - **Warm Brown** (`#25292e`): Secondary text
177
+
178
+ ### Accent & Interactive
179
+ - **Brand Label Color Green Blue Start** (`#08872b`): Accent / interactive (CSS var)
180
+ - **Brand Testimonial QuoteMarkBackground Teal** (`#daf9f5`): Accent / interactive (CSS var)
181
+ - **Brand Color Text Muted** (`#58635b`): Accent / interactive (CSS var)
182
+ - **Brand Pagination Link BgColor Rest** (`#000000`): Accent / interactive (CSS var)
183
+ - **Brand SubNav Color Link BgColor** (`#e4ebe6`): Accent / interactive (CSS var)
184
+ - **Brand Icon Color Coral** (`#e13f1b`): Accent / interactive (CSS var)
185
+ - **Brand IDE PlayPauseControl Rest** (`#d2d9d4`): Accent / interactive (CSS var)
186
+
187
+ ### Border & Divider
188
+ - **#d1d9e0** (`#d1d9e0`): Borders / dividers
189
+ - **Translucent Light Blue (40%)** (`rgba(200, 209, 218, 0.4)`): Borders / dividers
190
+
191
+ ### Full Extracted Palette
192
+ **20 colors rendered on the page** + **365** more declared in design tokens (CSS custom properties — not necessarily painted). (15 categorized above + 370 additional below.)
193
+ Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.
194
+
195
+ - `#0969da` — M Tricolor Blue
196
+ - `#0377ff` — #0377ff
197
+ - `#818b98` — Medium Gray
198
+ - `#59636e` — Dim Gray
199
+ - `#979a9c` — Cool Gray
200
+ - `#1f883d` — Forest Green
201
+ - `#d1242f` — Crimson
202
+ - `rgba(212, 167, 44, 0.4)` — Translucent #d4a72c (40%)
203
+ - `#9a6700` — #9a6700
204
+ - `rgba(255, 129, 130, 0.4)` — Translucent #ff8182 (40%)
205
+ - `#b6e3ff` — Light Blue *(token)*
206
+ - `#64513a` — #64513a *(token)*
207
+ - `#ce2c85` — Cherry *(token)*
208
+ - `#0a4852` — #0a4852 *(token)*
209
+ - `#b88700` — #b88700 *(token)*
210
+ - `#e3f2b5` — Vibrant Yellow *(token)*
211
+ - `#e6eaef` — Light Gray *(token)*
212
+ - `#fecfaa` — Pink *(token)*
213
+ - `#c7f5ef` — #c7f5ef *(token)*
214
+ - `#052b2c` — Navy Blue *(token)*
215
+ - `#007b94` — #007b94 *(token)*
216
+ - `#e6d6d5` — Soft Pink *(token)*
217
+ - `#0757ba` — Cobalt Blue *(token)*
218
+ - `#004db3` — Cobalt Blue *(token)*
219
+ - `#b8500f` — #b8500f *(token)*
220
+ - `#495a2b` — #495a2b *(token)*
221
+ - `#ffe5db` — Beige *(token)*
222
+ - `#422b00` — #422b00 *(token)*
223
+ - `#f68c41` — Coral *(token)*
224
+ - `#23b1ae` — #23b1ae *(token)*
225
+ - `#a98906` — #a98906 *(token)*
226
+ - `#1a7f37` — Forest Green *(token)*
227
+ - *…+338 more in `raw-css.json` (`desktop.allColors`).*
228
+
229
+ ### CSS Custom Properties (Design Tokens)
230
+
231
+ **Shadow Token**
232
+ - `--button-danger-shadow-selected`: `inset 0 1px 0 0 #4c001433`
233
+ - `--brand-CTABanner-shadow-color-start`: `#08872b`
234
+ - `--color-mktg-btn-shadow-focus`: `#00000026 0 0 0 4px`
235
+ - `--sub-nav-mktg-shadow`: `0 0 0 1px #35485b24, 0 3px 2px #0000000a, 0 7px 7px #00000008`
236
+
237
+ **Motion Token**
238
+ - `--brand-animation-variant-scaleInLeft-end`: `1`
239
+ - `--base-duration-600`: `.6s`
240
+ - `--brand-animation-variant-scaleInRight-distance`: `-1.25rem`
241
+
242
+ **Secondary Color**
243
+ - `--display-lime-bgColor-muted`: `#e3f2b5`
244
+ - `--data-coral-color-muted`: `#ffe5db`
245
+ - `--display-plum-borderColor-muted`: `#f0cdfe`
246
+ - `--display-cyan-borderColor-muted`: `#7ae9ff`
247
+
248
+ **Spacing Token**
249
+ - `--control-medium-gap`: `.5rem`
250
+ - `--brand-RiverBreakout-variant-gridline-spacing-outerBlock`: `4rem`
251
+ - `--brand-RiverAccordion-variant-gridline-spacing-outerInline`: `4rem`
252
+ - `--Layout-outer-spacing-x`: `0px`
253
+
254
+ **Success**
255
+ - `--brand-Label-color-green-blue-start`: `#08872b`
256
+ - `--brand-Eyebrowbanner-fgColor-green-blue-end`: `#0377ff`
257
+ - `--fgColor-success`: `#1a7f37`
258
+ - `--bgColor-success-emphasis`: `#1f883d`
259
+
260
+ **Text Color**
261
+ - `--brand-color-text-muted`: `#58635b`
262
+ - `--brand-color-text-emphasized`: `#08872b`
263
+ - `--brand-color-text-onEmphasis`: `#fff`
264
+ - `--color-text-white`: `#fff`
265
+
266
+ **Border**
267
+ - `--header-borderColor-divider`: `#818b98`
268
+ - `--brand-color-border-subtle`: `#d2d9d4`
269
+ - `--brand-color-border-muted`: `#e4ebe6`
270
+ - `--brand-color-border-default`: `#b6bfb8`
271
+
272
+ **Border Radius Token**
273
+ - `--brand-borderRadius-small`: `.25rem`
274
+ - `--brand-VideoPlayer-range-borderRadius`: `.1875rem`
275
+ - `--brand-Bento-item-borderRadius-large`: `1.5rem`
276
+ - `--borderRadius-medium`: `.375rem`
277
+
278
+ **Warning**
279
+ - `--brand-Label-color-yellow`: `#be7d00`
280
+ - `--brand-Testimonial-quoteMarkColor-yellow`: `#be7d00`
281
+ - `--brand-Eyebrowbanner-fgColor-yellow`: `#be7d00`
282
+ - `--brand-Accordion-toggle-color-yellow`: `#be7d00`
283
+
284
+ **Error / Destructive**
285
+ - `--brand-Label-color-red-orange-end`: `#b85b06`
286
+ - `--brand-Accordion-toggle-color-red`: `#cf2230`
287
+ - `--brand-Testimonial-quoteMarkColor-red-orange-start`: `#cf2230`
288
+ - `--brand-Pillar-icon-color-red`: `#cf2230`
289
+
290
+ **Primary Brand Color**
291
+ - `--borderColor-accent-muted`: `#54aeff66`
292
+ - `--brand-color-accent-primary`: `#0d6731`
293
+ - `--fgColor-accent`: `#0969da`
294
+ - `--brand-Token-fgColor-accent`: `#fff`
295
+
296
+ **Font Size Token**
297
+ - `--font-size-small`: `.75rem`
298
+ - `--body-font-size`: `.875rem`
299
+
300
+ **Background**
301
+ - `--brand-color-canvas-invert`: `#000`
302
+ - `--brand-color-canvas-inset`: `#f2f5f3`
303
+ - `--brand-color-canvas-overlay`: `#fff`
304
+ - `--brand-color-canvas-muted`: `#fafafa`
305
+
306
+ **Other tokens**
307
+ - `--label-blue-borderColor`: `#fff0`
308
+ - `--diffBlob-hunkNum-bgColor-rest`: `#b6e3ff`
309
+ - `--label-brown-fgColor-hover`: `#64513a`
310
+ - `--label-teal-fgColor-active`: `#0a4852`
311
+ - `--button-primary-iconColor-disabled`: `#fffc`
312
+ - `--button-outline-fgColor-disabled`: `#0969da80`
313
+ - `--data-yellow-color-emphasis`: `#b88700`
314
+ - `--brand-text-weight-300`: `400`
315
+
316
+ ## 3. Typography Rules
317
+
318
+ ### Font Families
319
+ - **Primary**: `Mona Sans VF`
320
+ - **Secondary**: `Noto Sans`
321
+ - **Font 3**: `Mona Sans`
322
+ - **Font 4**: `MonaSansFallback`
323
+ - **Font 5**: `MonaSansHeaderFallback`
324
+
325
+ ### Custom Fonts Loaded
326
+ - **Noto Sans** weight normal (normal)
327
+ - **Mona Sans** weight 200 900 (normal)
328
+ - **MonaSansFallback** weight normal (normal)
329
+ - **MonaSansHeaderFallback** weight normal (normal)
330
+ - **Hubot Sans** weight 200 900 (normal)
331
+ - **Mona Sans Mono** weight 200 900 (normal)
332
+ - **Mona Sans Fallback** weight normal (normal)
333
+ - **Mona Sans Header Fallback** weight normal (normal)
334
+
335
+ ### Typography Hierarchy
336
+
337
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
338
+ |------|------|------|--------|-------------|----------------|-------|
339
+ | Display Hero | Mona Sans VF | 32px | 600 | 1.5 | normal | Main headline (h1) |
340
+ | Sub-heading | Mona Sans VF | 24px | 600 | 1.5 | normal | Section titles (h2) |
341
+ | Label Heading | Mona Sans VF | 16px | 600 | 1.5 | normal | Small heading (H4) |
342
+ | Button Large | Mona Sans VF | 16px | 400 | 1.5 | normal | Button label (16px) |
343
+ | Link Large | Mona Sans | 16px | 500 | 1.5 | normal | Link (16px) — Decoration: none |
344
+ | Navigation | Mona Sans | 16px | 400 | 1.5 | normal | Navigation items |
345
+ | Sub-heading | Mona Sans VF | 14px | 600 | 1.5 | normal | Third-level heading (h3) |
346
+ | Body | Mona Sans VF | 14px | 400 | 1.5 | normal | Standard reading text |
347
+ | Button | Mona Sans VF | 14px | 500 | 1.43 | normal | Button label (14px) |
348
+ | Eyebrow / Overline | Mona Sans | 14px | 400 | 1.5 | normal | Label above heading, uppercase tag |
349
+ | Caption / Badge | Mona Sans | 12px | 500 | 0px | normal | small text (12px) |
350
+
351
+ ### Font Weight Scale
352
+
353
+ CSS custom properties define 2 explicit weight steps:
354
+ - `--brand-Testimonial-quote-fontWeight-default`: `425` — Regular (custom, ~400)
355
+ - `--brand-Testimonial-quote-fontWeight-large`: `460` — Medium (custom, ~500)
356
+
357
+ ### Full Font Size Scale
358
+
359
+ Sizes detected in the design (descending): `32px`, `24px`, `16px`, `14px`, `12px`
360
+
361
+ ### OpenType & Variable Font Features
362
+
363
+ The typography uses these OpenType features intentionally — this is a sophisticated type system, not a default fallback:
364
+
365
+ - **tabular figures** (`tnum`) — numbers align vertically, essential for pricing tables and dashboards
366
+ - **stylistic sets** (`ss0X`) — alternate letterforms enabled (often for brand-specific glyph variants)
367
+ - **contextual alternates** (`calt`) — connections between letters refined contextually
368
+ - **ligatures** — common letter pairs replaced with refined glyphs (fi, fl, etc.)
369
+
370
+ **Clone instruction:** Enable these in your CSS:
371
+ ```css
372
+ body {
373
+ font-feature-settings: "liga", "calt", "tnum", "ss02", "ss01";
374
+ }
375
+ ```
376
+
377
+ **Variable font axes:**
378
+ - ITAL axis
379
+
380
+ ## 4. Component Stylings
381
+
382
+ ### Buttons
383
+
384
+ **Light / Invert**
385
+ - Background: `#efefef`
386
+ - Text: `#000000`
387
+ - Padding: 1px 6px
388
+ - Radius: 0px
389
+ - Font: 16px weight 400
390
+ - Use: Bright CTA on dark sections
391
+
392
+ **Ghost**
393
+ - Background: `transparent` `{colors.surface-1}`
394
+ - Text: `#ffffff` `{colors.on-primary}`
395
+ - Padding: 8px
396
+ - Radius: 0px
397
+ - Font: 16px weight 400
398
+ - Use: Subtle action, toolbar, nav button
399
+
400
+ **Ghost**
401
+ - Background: `transparent` `{colors.surface-1}`
402
+ - Text: `rgba(255, 255, 255, 0.75)` `{colors.on-primary}`
403
+ - Padding: 0px 0px 0px 8px
404
+ - Radius: 6px
405
+ - Font: 14px weight 400
406
+ - Use: Subtle action, toolbar, nav button
407
+
408
+ **Primary Brand**
409
+ - Background: `#1f883d` `{colors.primary}`
410
+ - Text: `#ffffff` `{colors.on-primary}`
411
+ - Padding: 5px 16px
412
+ - Radius: 6px
413
+ - Border: 1px solid rgba(31, 35, 40, 0.15)
414
+ - Font: 14px weight 500
415
+ - Use: Primary CTA / brand action
416
+
417
+ **Outline**
418
+ - Background: `transparent` `{colors.surface-1}`
419
+ - Text: `#ffffff` `{colors.on-primary}`
420
+ - Padding: 4px 12px
421
+ - Radius: 6px
422
+ - Border: 1px solid rgb(209, 217, 224)
423
+ - Font: 14px weight 400
424
+ - Use: Secondary action with border
425
+
426
+ **Icon Button**
427
+ - Background: `transparent` `{colors.surface-1}`
428
+ - Text: `#59636e`
429
+ - Padding: 0px
430
+ - Radius: 6px
431
+ - Border: 1px solid rgb(209, 217, 224)
432
+ - Font: 14px weight 500
433
+ - Use: Toolbar/UI icons
434
+
435
+ **Light / Invert**
436
+ - Background: `#f6f8fa`
437
+ - Text: `#25292e` `{colors.hairline}`
438
+ - Padding: 5px 16px
439
+ - Radius: 6px
440
+ - Border: 1px solid rgb(209, 217, 224)
441
+ - Font: 14px weight 500
442
+ - Use: Bright CTA on dark sections
443
+
444
+ ### Inputs & Forms
445
+
446
+ **Text Input**
447
+ - Background: `transparent` `{colors.surface-1}`
448
+ - Text: `transparent` `{colors.surface-1}`
449
+ - Padding: 0px
450
+ - Radius: 6px
451
+ - Border: 0px none rgba(0, 0, 0, 0)
452
+ - Shadow: `rgba(31, 35, 40, 0.04) 0px 1px 0px 0px inset`
453
+ - Font: 14px weight 400
454
+ - Use: Text fields, search inputs
455
+
456
+ ### Navigation
457
+
458
+ **Main Nav**
459
+ - Background: `#25292e` `{colors.hairline}`
460
+ - Padding: 16px 0px
461
+ - Radius: none
462
+ - Font: 16px weight 400
463
+ - Use: Fixed/sticky block nav — N/A items
464
+ - Hover: textDecoration: `underline`
465
+
466
+
467
+ ## 4b. Component Behaviors (State Matrix)
468
+
469
+ ### Interaction State Narrative
470
+
471
+
472
+ *State transitions extracted via Playwright simulation — exact values in the YAML matrix below.*
473
+
474
+ ```yaml
475
+ component-behaviors:
476
+ button:
477
+ default:
478
+ bg: "rgb(239, 239, 239)"
479
+ fg: "rgb(0, 0, 0)"
480
+ input:
481
+ default:
482
+ bg: "rgba(0, 0, 0, 0)"
483
+ fg: "rgba(0, 0, 0, 0)"
484
+ shadow: "rgba(31, 35, 40, 0.04) 0px 1px 0px 0px inset"
485
+ link:
486
+ default:
487
+ bg: "rgb(9, 105, 218)"
488
+ fg: "rgb(255, 255, 255)"
489
+ card:
490
+ default:
491
+ bg: "rgba(0, 0, 0, 0)"
492
+ fg: "rgb(31, 35, 40)"
493
+ navLink:
494
+ default:
495
+ bg: "rgba(0, 0, 0, 0)"
496
+ fg: "rgb(255, 255, 255)"
497
+ hover:
498
+ bg: "rgba(0, 0, 0, 0)"
499
+ fg: "rgb(255, 255, 255)"
500
+ footerLink:
501
+ default:
502
+ bg: "rgba(0, 0, 0, 0)"
503
+ fg: "rgb(31, 35, 40)"
504
+ hover:
505
+ bg: "rgba(0, 0, 0, 0)"
506
+ fg: "rgb(31, 35, 40)"
507
+ ```
508
+
509
+ **Agent usage**: Validate generated components against this matrix. If your output's `:hover` state changes properties not listed here, you are off-brand.
510
+
511
+
512
+ ## 4c. Component Vocabulary (Closed System)
513
+
514
+ *This brand uses ONLY the following component vocabulary. Introducing new variants without justification breaks the system's tonal coherence.*
515
+
516
+ ### Buttons
517
+ - **5 shape(s)** in this system: `Light / Invert`, `Ghost`, `Primary Brand`, `Outline`, `Icon Button`
518
+ - **DO NOT introduce new buttons variants** without justification
519
+
520
+ ### Inputs & Forms
521
+ - **1 shape(s)** in this system: `Text Input`
522
+ - **DO NOT introduce new inputs & forms variants** without justification
523
+
524
+ ### Navigation
525
+ - **1 shape(s)** in this system: `Main Nav`
526
+ - **DO NOT introduce new navigation variants** without justification
527
+
528
+ ## 5. Layout Principles
529
+
530
+ ### Layout Type
531
+ **top-nav + content**
532
+
533
+ ### Grid
534
+ Single column, centered content
535
+
536
+ ### Max Width
537
+ 80rem
538
+
539
+ ### Spacing System
540
+ Compact spacing — information density prioritized
541
+
542
+ | Token | Value |
543
+ |-------|-------|
544
+ | xxs | 2px |
545
+ | xs | 6px |
546
+ | sm | 16px |
547
+ | md | 40px |
548
+ | base | 16px |
549
+ | lg | 24px |
550
+ | xl | 32px |
551
+ | 2xl | 48px |
552
+ | 3xl | 64px |
553
+
554
+ ### Border Radius Scale
555
+ | Name | Value | Use |
556
+ |------|-------|-----|
557
+ | None | 0px | No rounding |
558
+ | Xs | 3px | Tiny corners (badges, micro elements) |
559
+ | Sm | 6px | Buttons, inputs, small elements |
560
+ | Md | 12px | Cards, containers |
561
+ | Lg | 12px | Large rounded elements, pill segments |
562
+ | Xl | 12px | Category strips, featured containers |
563
+ | Full | 9999px | Pills, avatars, circular elements |
564
+
565
+ ### Shape Language
566
+
567
+ | Component | Border Radius |
568
+ |-----------|---------------|
569
+ | Buttons | `0px` |
570
+ | Inputs & Forms | `6px` |
571
+ | Navigation | `none` |
572
+ | Page Body | `0px` |
573
+ | Primary Input | `6px` |
574
+
575
+ **Shape Personality**: Moderate Rounding — Medium corners (4–12px). Modern SaaS standard, neither sharp nor pill.
576
+
577
+ **Full Radius Spectrum**: 0px, 3px, 6px, 12px (from `allBorderRadii` scan)
578
+
579
+
580
+ ## 5b. Spacing Rhythm Names
581
+
582
+ *Named spacing tokens with explicit use cases. Use these names in YOUR code instead of raw pixels for consistency.*
583
+
584
+ | Name | Value | Use case |
585
+ |------|-------|----------|
586
+ | **hero** | `64px` | Top/bottom of full-bleed hero sections |
587
+ | **section** | `32px` | Between major bands (color change, content shift) |
588
+ | **subsection** | `24px` | Within a section, between content groups |
589
+ | **card** | `40px` | Card padding, list-item spacing |
590
+ | **compact** | `16px` | Form fields, tight clusters, badge padding |
591
+ | **micro** | `6px` | Icon-text gap, tag inner padding |
592
+
593
+ **Agent rule**: NEVER hardcode raw pixel values for spacing in generated UI. Always reference these named tokens (`spacing-rhythm.section`, etc.).
594
+
595
+ ## 5c. Widget & Structure Library
596
+
597
+ Structural patterns extracted from the page DOM — these are the **blueprints** an agent should follow to reproduce the page architecture (not just CSS values).
598
+
599
+ **2/8 structural patterns detected.**
600
+
601
+ ### Navigation Pattern
602
+
603
+ - **Position:** static (scrolls with page)
604
+ - **Layout:** unknown — Layout not classified
605
+ - **Height:** 40px
606
+ - **Logo:** ✓ present
607
+ - **Nav links:** 1 primary items
608
+ - **CTAs in nav:** 0 (no buttons — links only)
609
+ - **Clone instruction:** Build a static unknown navigation. Link-only — no button styling needed.
610
+
611
+ ### Footer Pattern
612
+
613
+ - **Columns:** 2
614
+ - **Links:** 49 total
615
+ - **Height:** 600px
616
+ - **Includes:** ✗ no newsletter | ✓ social icons | ✓ copyright
617
+ - **Clone instruction:** Build a 2-column footer with ~25 links per column, social media links, and a copyright line.
618
+
619
+ ## 6. Depth & Elevation
620
+
621
+ | Level | Treatment | Use |
622
+ |-------|-----------|-----|
623
+ | Flat (Level 0) | No shadow | Page background, content blocks |
624
+ | Layered (Level 1) | <br>`rgba(209, 217, 224, 0.25) 0px 0px 0px 1px`,<br>`rgba(37, 41, 46, 0.04) 0px 6px 12px -3px`,<br>`rgba(37, 41, 46, 0.12) 0px 6px 18px 0px` | Cards, elevated surfaces |
625
+ | Layered (Level 2) | <br>`rgba(209, 217, 224, 0) 0px 0px 0px 1px`,<br>`rgba(37, 41, 46, 0.24) 0px 40px 80px 0px` | Cards, elevated surfaces |
626
+ | Inset (Level 3) | <br>`rgba(31, 35, 40, 0.04) 0px 1px 0px 0px inset` | Buttons, pressed-state elements |
627
+ | Inset (Level 4) | <br>`rgb(209, 217, 224) 0px -1px 0px 0px inset` | Buttons, pressed-state elements |
628
+
629
+ **Shadow Philosophy**: Multi-layered shadow system creating natural, atmospheric depth. Each shadow level combines multiple layers for realistic elevation.
630
+
631
+ ## 7. Motion & Interaction
632
+
633
+ ### Easing System
634
+
635
+ | CSS Variable | Curve | Semantic Name |
636
+ |--------------|-------|---------------|
637
+ | `--brand-control-animation-easing` | `cubic-bezier(.33, 1, .68, 1)` | Custom Ease — Balanced |
638
+ | `--brand-animation-easing-glide` | `cubic-bezier(.33, 1, .68, 1)` | Custom Ease — Balanced |
639
+ | `--easing-easeInOut` | `cubic-bezier(.65,0,.35,1)` | Ease Out — Decelerating |
640
+ | `--brand-animation-easing-default` | `cubic-bezier(.16, 1, .3, 1)` | Ease Out — Decelerating |
641
+ | `--base-easing-easeIn` | `cubic-bezier(.7, .1, .75, .9)` | Custom Ease — Balanced |
642
+ | `--brand-Card-animation-easing` | `cubic-bezier(.01, .73, .08, .93)` | Ease Out — Decelerating |
643
+ | `--base-easing-easeOut` | `cubic-bezier(.3, .8, .6, 1)` | Custom Ease — Balanced |
644
+ | `--base-easing-easeInOut` | `cubic-bezier(.6, 0, .2, 1)` | Ease Out — Decelerating |
645
+ | `--base-easing-linear` | `cubic-bezier(0, 0, 1, 1)` | Custom Ease — Balanced |
646
+ | `--base-easing-ease` | `cubic-bezier(.25, .1, .25, 1)` | Ease Out — Decelerating |
647
+
648
+ ### Duration Scale
649
+
650
+ | CSS Variable | Value | Tier |
651
+ |--------------|-------|------|
652
+ | `--base-duration-600` | `.6s` | Slow |
653
+ | `--brand-InlineLink-transition-timing` | `.3s` | Normal |
654
+ | `--brand-control-animation-duration` | `80ms` | Fast |
655
+ | `--base-duration-50` | `50ms` | Instant |
656
+ | `--duration-fast` | `80ms` | Fast |
657
+ | `--base-duration-300` | `.3s` | Normal |
658
+ | `--base-duration-1000` | `1s` | Cinematic |
659
+ | `--base-duration-500` | `.5s` | Slow |
660
+ | `--brand-animation-duration-fast` | `.3s` | Normal |
661
+ | `--base-duration-400` | `.4s` | Slow |
662
+
663
+ ### Copy-Paste Transition Snippets
664
+
665
+ **Opacity**
666
+ ```css
667
+ transition: opacity 0.4s linear 0.4s;
668
+ ```
669
+
670
+ **Opacity**
671
+ ```css
672
+ transition: opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1), transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
673
+ ```
674
+
675
+ **Color / Background**
676
+ ```css
677
+ transition: color 0.08s cubic-bezier(0.65, 0, 0.35, 1), fill 0.08s cubic-bezier(0.65, 0, 0.35, 1), background-color 0.08s cubic-b...;
678
+ ```
679
+
680
+ **Opacity**
681
+ ```css
682
+ transition: opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1);
683
+ ```
684
+
685
+ ### Keyframe Animation Catalog
686
+
687
+ | Animation Name | Type | Animated Props | Use Hint |
688
+ |----------------|------|----------------|----------|
689
+ | `AppFrame-a11yLink-focus` | Scale | color, transform | UI transition |
690
+ | `tooltip-appear` | Fade | opacity | UI transition |
691
+ | `fade-in` | Fade | opacity | Element entrance |
692
+ | `fade-out` | Fade | opacity | Element exit |
693
+ | `fade-up` | Fade + Move | opacity, transform | UI transition |
694
+ | `fade-down` | Fade + Move | opacity, transform | UI transition |
695
+ | `grow-x` | Custom | width | UI transition |
696
+ | `shrink-x` | Custom | width | UI transition |
697
+ | `scale-in` | Fade + Move | opacity, transform | Focus / emphasis |
698
+ | `pulse` | Fade | opacity | Attention / status |
699
+ | `pulse-in` | Scale | transform | Attention / status |
700
+ | `rotate-keyframes` | Rotate / Spin | transform | Loading indicator |
701
+ | `AnimatedEllipsis-keyframes` | Slide | transform | UI transition |
702
+ | `SelectMenu-modal-animation` | Fade + Move | opacity, transform | UI transition |
703
+ | `SelectMenu-modal-animation--sm` | Fade + Move | opacity, transform | UI transition |
704
+ | `Toast--animateIn` | Fade + Move | opacity, transform | UI transition |
705
+ | `Toast--animateOut` | Fade + Move | pointer-events, opacity, transform | UI transition |
706
+ | `Toast--spinner` | Rotate / Spin | transform | Loading indicator |
707
+ | `Overlay--motion-scaleFade` | Fade + Move | opacity, transform | Focus / emphasis |
708
+ | `Overlay--motion-slideDown` | Slide | transform | Panel / drawer enter |
709
+
710
+ > *34 additional animations omitted (repetitive variants). See raw keyframes in `raw-css.json`.*
711
+
712
+ ### Motion Fingerprint
713
+
714
+ - **Speed Character**: Deliberate & Calm (median duration: `400ms`)
715
+ - **Dominant Easing**: custom cubic-bezier curves
716
+ - **Animation Library**: 54 unique animations (54 total including variants)
717
+
718
+ > This design moves with deliberate & calm timing using custom cubic-bezier curves, creating a UI that feels calm and controlled.
719
+
720
+ ## 8. Do's and Don'ts
721
+
722
+ ### Do
723
+ - Use Warm Brown (`#1f2328`) for text — not pure black, it's warmer and more readable
724
+ - Use Mona Sans VF as the primary typeface — it defines the brand personality
725
+ - Keep font weights between 400-600 — the system uses a narrow weight range for subtle hierarchy
726
+ - Use the extracted shadow patterns for elevation — they are tuned to match the brand palette
727
+ - Use Forest Green (`#1f883d`) as the primary accent — it's the brand's signature interactive color
728
+ - Use 6px border-radius on buttons — the standard corner rounding for interactive elements
729
+ - Maintain nav height at 40px — consistent vertical space for the navigation bar
730
+
731
+ ### Don't
732
+ - Don't use pure black (`#000000`) for text — the near-black adds warmth
733
+ - Don't substitute with generic sans-serif or serif — the custom font carries the brand
734
+ - Don't use weight 700 (bold) or above — 600 is the maximum weight in this system
735
+ - Don't invent new shadow values — use only the extracted shadow levels
736
+ - Don't introduce additional saturated accent colors — the palette is intentionally controlled
737
+ - Don't collapse or hide the nav on scroll without an explicit scroll-triggered animation — the design uses fixed nav presence
738
+ - Don't make the nav sticky — this design lets it scroll away to maximize content focus
739
+ - Don't put a CTA button in the nav — this design uses links only at the top
740
+
741
+
742
+ ## 7b. Enforceable Brand Rules
743
+
744
+ *Structured Do/Don't with reasoning and validation tests. Agents can programmatically verify generated UI.*
745
+
746
+ ```yaml
747
+ rules:
748
+ - id: brand-canvas-001
749
+ type: do
750
+ rule: "Always use the page background `rgb(255, 255, 255)` as the base canvas"
751
+ why: "Every component is designed to composit against this exact tone"
752
+ test: "document.body.style.backgroundColor === 'rgb(255, 255, 255)'"
753
+ - id: brand-accent-001
754
+ type: do
755
+ rule: "Reserve `rgb(31, 136, 61)` for primary CTAs and brand-mark signals only"
756
+ why: "Single chromatic assertion device — overuse dilutes meaning"
757
+ test: "querySelectorAll('[style*=\"rgb(31, 136, 61)\"]').length <= 3 per fold"
758
+ ```
759
+
760
+ ## 9. Responsive Behavior
761
+
762
+ ### Breakpoints
763
+ | Name | Width | Key Changes |
764
+ |------|-------|-------------|
765
+ | Mobile | 400px | Single column, compact spacing |
766
+ | Mobile | 480px | Single column, compact spacing |
767
+ | Mobile Large | 618px | Expanded mobile layout |
768
+ | Mobile Large | 767px | Expanded mobile layout |
769
+ | Tablet | 1011px | Multi-column grids begin |
770
+ | Desktop | 1150px | Full feature layout |
771
+ | Desktop | 1250px | Full feature layout |
772
+ | Large Desktop | 1464px | Maximum content width |
773
+
774
+ ### Token Diff — Desktop vs Mobile
775
+
776
+ | Element | Property | Desktop | Mobile |
777
+ |---------|----------|---------|--------|
778
+ | nav | height | `40px` | `324px` |
779
+ | button | width | `100%` | `390px` |
780
+
781
+ ### Collapsing Strategy
782
+ - Navigation: horizontal links → hamburger menu on mobile
783
+ - Cards: multi-column → stacked vertical on mobile
784
+ - Footer: multi-column → stacked single column on mobile
785
+
786
+ ### Touch Targets
787
+ - Buttons: 1px 6px padding
788
+ - Navigation: adequate spacing between items
789
+ - Interactive elements: minimum 44px touch target recommended
790
+
791
+ ### Collapsing Narrative
792
+
793
+ How the structural patterns adapt from desktop to mobile (extracted from both viewport extractions):
794
+
795
+ *No major structural differences detected between desktop and mobile widgets. The same blueprints scale rather than collapse — verify by inspecting actual mobile render.*
796
+
797
+ ## 9b. Visual Tone & Photography
798
+
799
+ **Tone:** Mixed photography + illustration
800
+
801
+ A balanced mix of photographic content and vector graphics. Photos likely carry product/lifestyle context while SVG handles icons, logos, and decorative accents.
802
+
803
+ **Canonical Brand Image (OG):**
804
+ - https://github.githubassets.com/assets/github-logo-55c5b9a1fe52.png (1200×1200px)
805
+ *This is the image shown when the site is shared on social media — represents the brand visual essence.*
806
+
807
+ **Hero Image (above-fold dominant visual):**
808
+ - Aspect: 3.39:1 (ultra-wide cinematic)
809
+ - Rendered size: 1440×425px
810
+ - *Use this aspect ratio + composition for your clone's hero — mimicking the proportion preserves the visual hierarchy.*
811
+
812
+ **Aspect Ratio Distribution:**
813
+ - Landscape (1.15–2.3): 0 (0%)
814
+ - Portrait (<0.87): 1 (14%)
815
+ - Square (0.87–1.15): 1 (14%)
816
+ - Ultra-wide (>2.3): 5 (71%)
817
+
818
+ **Media Format Mix:**
819
+
820
+ **Average rendered image size:** 456×187px
821
+ **Above-fold image count:** 7 / 7
822
+
823
+ **Imagery Guidance for clones:**
824
+ - Mix photography and illustration intentionally: photos for product/context, vectors for icons + decorative accents.
825
+ - Respect the format split — replacing JPGs with illustrations (or vice versa) will shift the brand tone.
826
+
827
+ ## 10. Agent Prompt Guide
828
+
829
+ ### Quick Reference
830
+ - Background: Text White (`#ffffff`)
831
+ - Primary text: Warm Brown (`#1f2328`)
832
+ - Accent: Forest Green (`#1f883d`)
833
+ - Border: Warm Brown (`#25292e`)
834
+ - Font: Mona Sans VF
835
+ - Body: 14px weight 400
836
+
837
+ ### Example Component Prompts
838
+ - "Create a hero section on Text White background (#ffffff). Headline at 32px Mona Sans VF weight 600, line-height 1.5, color #1f2328."
839
+ - "Create the primary CTA button: `#1f883d` background, `#ffffff` text, 6px border-radius, 5px 16px padding, 500 weight, Mona Sans VF font."
840
+ - "Design a card on `transparent` background. Border: none. Radius: 0px. Shadow: none. Padding: 0px."
841
+ - "Build navigation: static on `#ffffff`. Mona Sans VF 16px weight 400 for links."
842
+
843
+ ### Iteration Guide
844
+ 1. **Canvas**: Set the light canvas to Text White (`#ffffff`) — every component is composited against this exact base.
845
+ 2. **Typography**: All type in Mona Sans VF, weight range 400–600. Never exceed 600 — heavier weights break the brand's tonal restraint.
846
+ 3. **Accent**: Forest Green (`#1f883d`) is the sole interactive color. On hover → M Tricolor Blue (`#0969da`). Use CSS transitions, not opacity/brightness filters.
847
+ 4. **Motion**: All transitions use `cubic-bezier(0.16,1,0.3,1)`. Timing: 50ms for micro-interactions, 400ms for layout changes. Never use linear for UI transitions — preserve the brand's easing personality.
848
+ 5. **Shape**: CTAs at `0px`, cards at `0px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
849
+ 6. **Spacing**: Use the `--ca-space-*` token scale (6px–32px). All padding, margin, and gap values are multiples from this scale — no magic numbers.
850
+ 7. **Tokens**: Import from §11 CSS Export (`--ca-*` vars). Never hardcode hex values — always reference a token so theming remains consistent.
851
+
852
+ ## 11. CSS Design Tokens Raw Export
853
+
854
+ *Copy-paste ready `:root {}` block — all values extracted directly from the live site.*
855
+
856
+ ```css
857
+ /* Colors */
858
+ :root {
859
+ --ca-on-primary: #ffffff;
860
+ --ca-surface-1: transparent;
861
+ --ca-surface-2: #e4ebe6;
862
+ --ca-primary-hover: #1f2328;
863
+ --ca-ink-subtle: #58635b;
864
+ --ca-primary: #1f883d;
865
+ --ca-hairline: #25292e;
866
+ --ca-primary-focus: #0969da;
867
+ --ca-semantic-error: #d1242f;
868
+ --ca-semantic-success: #1a7f37;
869
+ --ca-semantic-warning: #9a6700;
870
+ }
871
+
872
+ /* Typography */
873
+ :root {
874
+ --ca-font-primary: "Mona Sans VF", system-ui, sans-serif;
875
+ --ca-text-display: 32px;
876
+ --ca-text-body: 16px;
877
+ --ca-text-small: 16px;
878
+ --ca-text-caption: 12px;
879
+ --ca-text-button: 16px;
880
+ }
881
+
882
+ /* Spacing & Radius */
883
+ :root {
884
+ --ca-space-xxs: 2px;
885
+ --ca-space-xs: 6px;
886
+ --ca-space-sm: 16px;
887
+ --ca-space-md: 40px;
888
+ --ca-space-base: 16px;
889
+ --ca-space-lg: 24px;
890
+ --ca-space-xl: 32px;
891
+ --ca-space-2xl: 48px;
892
+ --ca-space-3xl: 64px;
893
+ --ca-radius-none: 0px;
894
+ --ca-radius-xs: 3px;
895
+ --ca-radius-sm: 6px;
896
+ --ca-radius-md: 12px;
897
+ --ca-radius-lg: 12px;
898
+ --ca-radius-xl: 12px;
899
+ --ca-radius-full: 9999px;
900
+ }
901
+
902
+ /* Motion */
903
+ :root {
904
+ --ca-duration-fast: 80ms;
905
+ }
906
+ ```
907
+
908
+
909
+ ## 13. Page Structure Skeleton
910
+
911
+ *The actual layout the source site uses. Reproduce these sections in order to match the site structure.*
912
+
913
+ ```yaml
914
+ page-skeleton:
915
+ - section: unknown
916
+ tag: div
917
+ classes: ["logged-out", "page-responsive", "min-height-full", "d-flex"]
918
+ height: 1219px
919
+ width: full-bleed
920
+ layout: flex-column justify=normal
921
+ children: 12
922
+ - section: main-content
923
+ tag: main
924
+ classes: ["font-mktg"]
925
+ height: 547px
926
+ width: full-bleed
927
+ layout: block
928
+ children: 2
929
+ - section: unknown
930
+ tag: div
931
+ classes: ["container-lg", "tmp-mt-5", "tmp-px-3", "tmp-pb-5"]
932
+ height: 145px
933
+ width: 1012px
934
+ layout: block
935
+ children: 2
936
+ padding: "0px 16px 32px"
937
+ - section: footer
938
+ tag: footer
939
+ classes: ["footer", "tmp-pt-6", "position-relative"]
940
+ height: 600px
941
+ width: full-bleed
942
+ layout: block
943
+ children: 3
944
+ padding: "40px 0px 0px"
945
+ - section: unknown
946
+ tag: div
947
+ classes: ["container-xl"]
948
+ height: 444px
949
+ width: 1280px
950
+ layout: block
951
+ children: 1
952
+ padding: "0px 16px"
953
+ - section: navigation
954
+ tag: nav
955
+ classes: ["col-6", "col-sm-3", "col-lg-2", "tmp-mb-6"]
956
+ height: 372px
957
+ width: 208px
958
+ layout: block
959
+ children: 2
960
+ padding: "0px 0px 0px 24px"
961
+ - section: navigation
962
+ tag: nav
963
+ classes: ["col-6", "col-sm-3", "col-lg-2", "tmp-mb-6"]
964
+ height: 372px
965
+ width: 208px
966
+ layout: block
967
+ children: 2
968
+ padding: "0px 0px 0px 24px"
969
+ - section: navigation
970
+ tag: nav
971
+ classes: ["col-6", "col-sm-3", "col-lg-2", "tmp-mb-6"]
972
+ height: 372px
973
+ width: 208px
974
+ layout: block
975
+ children: 2
976
+ padding: "0px 0px 0px 24px"
977
+ - section: navigation
978
+ tag: nav
979
+ classes: ["col-6", "col-sm-3", "col-lg-2", "tmp-mb-6"]
980
+ height: 372px
981
+ width: 208px
982
+ layout: block
983
+ children: 2
984
+ padding: "0px 0px 0px 24px"
985
+ - section: section-10
986
+ tag: section
987
+ classes: ["col-12", "col-lg-4", "tmp-mb-5", "tmp-pr-lg-4"]
988
+ height: 348px
989
+ width: 416px
990
+ layout: block
991
+ children: 4
992
+ padding: "0px 24px 0px 0px"
993
+ - section: unknown
994
+ tag: div
995
+ classes: ["container-xl", "f6", "tmp-py-4", "d-md-flex"]
996
+ height: 84px
997
+ width: 1280px
998
+ layout: flex-row justify=space-between
999
+ children: 2
1000
+ padding: "24px 16px"
1001
+ ```
1002
+
1003
+ **Agent rule**: rebuild sections in this order (sorted by vertical position). Match the layout primitive (grid N-col / flex direction / block).
1004
+
1005
+
1006
+ ## 14. Copy Library (Real Content from Source)
1007
+
1008
+ *Actual text content extracted from the live page. Use these strings verbatim when reproducing the site — they carry the brand voice.*
1009
+
1010
+ ```yaml
1011
+ copy:
1012
+ sub-headings:
1013
+ - "Subscribe to our developer newsletter"
1014
+ - "Platform"
1015
+ ctas:
1016
+ - "Platform"
1017
+ - "Search or jump to..."
1018
+ - "Sign in"
1019
+ - "Sign up"
1020
+ - "Search"
1021
+ - "Subscribe"
1022
+ - "Manage cookies"
1023
+ - "English
1024
+ Select language"
1025
+ navigation:
1026
+ - "Sign in"
1027
+ - "Pricing"
1028
+ - "Search syntax tips"
1029
+ - "documentation"
1030
+ - "Forgot password?"
1031
+ - "or continue with other methods"
1032
+ - "Sign up"
1033
+ - "Features"
1034
+ - "Enterprise"
1035
+ - "Copilot"
1036
+ footer-links:
1037
+ - "Subscribe"
1038
+ - "Features"
1039
+ - "Terms"
1040
+ - "GitHub on LinkedIn"
1041
+ - "GitHub on YouTube"
1042
+ - "GitHub’s organization on GitHub"
1043
+ ```
1044
+
1045
+ **Agent rule**: reuse these exact strings when generating UI. Do NOT translate or rephrase — brand voice is preserved through the original wording.
1046
+
1047
+
1048
+ ## 15. Asset Inventory (Image Roles & Ratios)
1049
+
1050
+ *Image inventory classified by role and aspect ratio. When reproducing the site, allocate this number of assets per role.*
1051
+
1052
+ ```yaml
1053
+ assets:
1054
+ logo:
1055
+ count: 2
1056
+ avg-ratio: 2.85
1057
+ common-aspect: "~16:6 banner"
1058
+ hero:
1059
+ count: 1
1060
+ avg-ratio: 3.39
1061
+ common-aspect: "~16:6 banner"
1062
+ product:
1063
+ count: 1
1064
+ avg-ratio: 1.09
1065
+ common-aspect: "~1:1 square"
1066
+ sample-alts:
1067
+ - "404 “This is not the web page you are looking for”"
1068
+ ```
1069
+
1070
+ **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`.
1071
+
1072
+
1073
+ ## 16. Component HTML Templates
1074
+
1075
+ *Suggested HTML markup for reproducing the key components — based on what was detected in the source DOM.*
1076
+
1077
+ ### Button (primary action)
1078
+ ```html
1079
+ <button class="btn btn-primary">
1080
+ Platform
1081
+ </button>
1082
+ ```
1083
+ _Source pattern detected: padding `8px` · radius `0px` · weight `400`_
1084
+
1085
+ **Agent rule**: use these markup skeletons as the structural baseline. Apply tokens from §2-3 for visual styling.
1086
+
1087
+
1088
+ ## 12. Known Extraction Gaps
1089
+
1090
+ *Auto-detected limitations of this extraction — understand before building:*
1091
+
1092
+ - **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.
1093
+
1094
+
1095
+ ---
1096
+ ## Extraction Completeness: 88/100 (B)
1097
+
1098
+ | Category | Score | Max | Detail |
1099
+ |----------|-------|-----|--------|
1100
+ | Colors & Palette | 21 | 25 | 15 named colors |
1101
+ | Typography | 20 | 20 | 11 roles defined |
1102
+ | Components | 12 | 20 | 3 specs extracted |
1103
+ | Motion & Interaction | 15 | 15 | Keyframes present, easing vars |
1104
+ | CSS Custom Properties | 10 | 10 | 1985 vars |
1105
+ | Responsive Breakpoints | 5 | 5 | 8 breakpoints |
1106
+ | Variable Fonts | 5 | 5 | ITAL axes |
1107
+
1108
+ ## 12. Known Gaps & Confidence
1109
+
1110
+ 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.
1111
+
1112
+ *✅ No critical extraction gaps detected — high-confidence reproduction expected.*
1113
+
1114
+ ### Per-section confidence
1115
+
1116
+ | Section | Confidence | Reason |
1117
+ |---------|------------|--------|
1118
+ | §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
1119
+ | §2 Colors | High | 1985 CSS vars (semantic naming requires ≥20 for high) |
1120
+ | §3 Typography | High | 11 typography roles inferred |
1121
+ | §4 Components | Medium | 3 component variants captured |
1122
+ | §7 Motion | High | Keyframes + transitions |
1123
+ | §8 Do's/Don'ts | High | 15 rules generated; design-decisions.json has evidence per rule |
1124
+ | §9 Responsive | High | 8 breakpoints detected |
1125
+ | §9b Photography | High | 7 images, hero present |
1126
+
1127
+ ---
1128
+ *Generated by Clone Architect — automated Playwright extraction + design analysis.*
1129
+ *Source: https://github.com/paulsainton/lifeos-app.git | 2026-05-30T21:32:13.958Z*
1130
+ *All values verified via getComputedStyle() — no approximation, no hallucination.*