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,1319 @@
1
+ ---
2
+ version: alpha
3
+ name: notion.so
4
+ description: "Light product system built on #ffffff with #455dd3 as the primary CTA accent. Type anchored in NotionInter at 64px / weight 700. Extracted automatically from https://notion.so/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
5
+ narrative: |
6
+ notion.so is built on a pure-white canvas (rgb(255, 255, 255)).
7
+ The system uses rgb(69, 93, 211) as the accent for primary actions and brand signals.
8
+ Crisp CTAs (4px radius) reinforce a precise, technical aesthetic alongside NotionInter as the primary typeface.
9
+ NotionInter is paired with Inter for secondary roles.
10
+ A layered elevation system (7 distinct shadows) building a clear front-to-back hierarchy.
11
+ Motion is a first-class concern — 39 keyframe animations plus transition-driven interactions.
12
+
13
+ colors:
14
+ background: "#ffffff"
15
+ surface-1: "#f6f5f4"
16
+ surface-2: "rgba(255, 255, 255, 0)"
17
+ ink-subtle: "#615d59"
18
+ primary: "#455dd3"
19
+ on-primary: "#ffffff"
20
+ primary-hover: "#f2f9ff"
21
+ hairline: "#78736f"
22
+ primary-focus: "#0075de"
23
+ semantic-error: "#f64932"
24
+ semantic-success: "#14832b"
25
+ semantic-warning: "#ff6d00"
26
+
27
+ typography:
28
+ display-xl:
29
+ fontFamily: "NotionInter"
30
+ fontSize: 64px
31
+ fontWeight: 700
32
+ lineHeight: 1
33
+ letterSpacing: -2.125px
34
+ display-md:
35
+ fontFamily: "NotionInter"
36
+ fontSize: 14px
37
+ fontWeight: 400
38
+ lineHeight: 1.43
39
+ letterSpacing: 0
40
+ body:
41
+ fontFamily: "NotionInter"
42
+ fontSize: 16px
43
+ fontWeight: 400
44
+ lineHeight: 1.5
45
+ letterSpacing: 0
46
+ caption:
47
+ fontFamily: "NotionInter"
48
+ fontSize: 22px
49
+ fontWeight: 700
50
+ lineHeight: 1.27
51
+ letterSpacing: -0.25px
52
+ button:
53
+ fontFamily: "NotionInter"
54
+ fontSize: 16px
55
+ fontWeight: 500
56
+ lineHeight: 1.5
57
+ letterSpacing: 0
58
+ mono:
59
+ fontFamily: "NotionInter"
60
+ fontSize: 42px
61
+ fontWeight: 700
62
+ lineHeight: 1.14
63
+ letterSpacing: -1.5px
64
+
65
+ rounded:
66
+ none: 0px
67
+ xs: 4px
68
+ sm: 8px
69
+ md: 12px
70
+ lg: 16px
71
+ xl: 16px
72
+ xxl: 24px
73
+ pill: 9999px
74
+
75
+ spacing:
76
+ xxs: 2px
77
+ xs: 4px
78
+ sm: 8px
79
+ md: 12px
80
+ lg: 24px
81
+ xl: 32px
82
+ xxl: 64px
83
+ section: 80px
84
+
85
+ components:
86
+ button-ghost:
87
+ backgroundColor: "{colors.surface-2}"
88
+ textColor: "{colors.surface-1}"
89
+ typography: "{typography.body}"
90
+ rounded: "{rounded.xs}"
91
+ padding: 5px 10px
92
+ button-primary-brand:
93
+ backgroundColor: "{colors.primary}"
94
+ textColor: "{colors.on-primary}"
95
+ typography: "{typography.body}"
96
+ rounded: "{rounded.sm}"
97
+ padding: 4px 14px
98
+ button-primary-brand-2:
99
+ backgroundColor: "{colors.primary}"
100
+ textColor: "{colors.on-primary}"
101
+ typography: "{typography.body}"
102
+ rounded: "{rounded.sm}"
103
+ padding: 6px 15px
104
+ navigation-main-nav:
105
+ backgroundColor: "{colors.surface-1}"
106
+ typography: "{typography.body}"
107
+ rounded: "{rounded.none}"
108
+ padding: 12px 16px
109
+ testimonial-quote-card:
110
+ backgroundColor: "{colors.on-primary}"
111
+ textColor: "#000000"
112
+ typography: "{typography.body}"
113
+ rounded: "{rounded.md}"
114
+ padding: 24px
115
+ tab-ghost-tab:
116
+ backgroundColor: "{colors.surface-2}"
117
+ textColor: "#000000"
118
+ typography: "{typography.body}"
119
+ rounded: "{rounded.sm}"
120
+ padding: 12px 16px
121
+
122
+ extracted_at: "2026-05-30T22:28:30.006Z"
123
+ completeness: 91
124
+ scoreVersion: "v2"
125
+
126
+ ---
127
+
128
+ # Design System — notion.so
129
+ > Extracted automatically by Clone Architect from https://www.notion.so
130
+ > Date: 2026-05-30
131
+ > Viewport: Desktop 1440x900 + Mobile 390x844
132
+ > 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).
133
+
134
+ > **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
135
+ >
136
+ > - **Canvas**: `rgb(255, 255, 255)` is the page background. Every component composits against this.
137
+ > - **Accent**: `rgb(69, 93, 211)` for primary CTAs ONLY. Never decorative.
138
+ > - **Body type**: 16px (token: `typography.body`). Default for ALL text not in a heading role.
139
+ > - **Section rhythm**: 48px between major bands. Card padding: 24px.
140
+ > - **Default radius**: 8px on buttons/inputs. Pills (`9999px`) only for icon-buttons or status chips.
141
+ >
142
+ > **Before generating UI**: import this DESIGN.md, scan §2 (Color Palette) + §4 (Components) + §10 (Agent Guide). Skip §11–12 unless extending.
143
+
144
+ ## 1. Visual Theme & Atmosphere
145
+
146
+ notion.so uses a pure-white canvas (`#ffffff`), letting typography, color and imagery carry the visual weight.
147
+
148
+ Typography is anchored in **NotionInter**, deployed with OpenType features enabled globally (`"lnum", "locl" 0`). These aren't decorative — they're load-bearing: without them, the typeface reverts to its generic state and the design loses its specific texture. The weight scale rejects the standard 100/200/.../900 ladder in favor of custom values (max **700** in this system) — a deliberate signal that this design system is precisely tuned, not assembled from defaults. Negative letter-spacing at display sizes (-2.125px at 64px) compresses headlines into engineered blocks, dense and precise.
149
+
150
+ Body text reads in Translucent Black (95%) (`rgba(0, 0, 0, 0.95)`) (contrast ratio 21.0:1, well above WCAG AA). **Royal Blue** (`#455dd3`) 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 how light falls on stacked surfaces.
151
+ 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.
152
+
153
+ **Key Characteristics:**
154
+ - Background: Banner (`#ffffff`)
155
+ - Primary typeface: NotionInter
156
+ - Accent: Royal Blue (`#455dd3`)
157
+ - Display: 64px weight 700, letter-spacing -2.125px
158
+ - Shadow system: 7 distinct elevation levels
159
+ - Custom fonts loaded: NotionInter, Lyon Text, iA Writer Mono, Permanent Marker
160
+
161
+ ## 2. Color Palette & Roles
162
+
163
+ ### Background & Surface
164
+ - **Banner** (`#ffffff`): Page background (primary)
165
+ - **Background Surface Accent Muted** (`#f2f9ff`): Surface / elevated background (CSS var)
166
+ - **Background Surface Accent Soft** (`#e6f3fe`): Surface / elevated background (CSS var)
167
+ - **Background Surface Neutral** (`#f6f5f4`): Surface / elevated background (CSS var)
168
+ - **Transparent** (`transparent`): Surface / elevated background
169
+
170
+ ### Text & Content
171
+ - **Translucent Black (95%)** (`rgba(0, 0, 0, 0.95)`): Primary body text
172
+ - **Text Warning** (`#ff6d00`): Text (CSS var)
173
+ - **Text Error** (`#f64932`): Text (CSS var)
174
+ - **Text Color Regular** (`#040404`): Text (CSS var)
175
+ - **Text Color Dark** (`#111111`): Text (CSS var)
176
+
177
+ ### Accent & Interactive
178
+ - **Background Surface Accent Soft Active** (`#93cdfe`): Accent / interactive (CSS var)
179
+ - **Background Surface Accent Focus** (`#0075de`): Accent / interactive (CSS var)
180
+ - **Background Surface Accent Hover** (`#097fe8`): Accent / interactive (CSS var)
181
+ - **Link Primary Text Active** (`#00396b`): Accent / interactive (CSS var)
182
+ - **Background Surface Accent Active** (`#005bab`): Accent / interactive (CSS var)
183
+ - **Accent** (`#62aef0`): Accent / interactive (CSS var)
184
+ - **#9c7054** (`#9c7054`): Interactive / accent
185
+
186
+ ### Border & Divider
187
+ - **Light Gray** (`#dddddd`): Borders / dividers
188
+ - **Silver** (`#c0c0c0`): Borders / dividers
189
+
190
+ ### Full Extracted Palette
191
+ **42 colors rendered on the page** + **70** more declared in design tokens (CSS custom properties — not necessarily painted). (19 categorized above + 93 additional below.)
192
+ Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.
193
+
194
+ - `#191918` — Near Black
195
+ - `#02093a` — Deep Navy
196
+ - `#fcf8f5` — Off-Cream
197
+ - `#fff5ed` — Warm Cream
198
+ - `#fef3f1` — Warm Cream
199
+ - `#f8f5fc` — Ghost White
200
+ - `#9849e8` — Violet
201
+ - `#f2fafa` — Ghost White
202
+ - `#27918d` — #27918d
203
+ - `#fff5e0` — Beige
204
+ - `#ffb110` — Amber
205
+ - `#f9f9f8` — Off-Cream
206
+ - `#78736f` — Stone
207
+ - `#455dd3` — Royal Blue
208
+ - `#2537b1` — #2537b1
209
+ - `#ffc95e` — #ffc95e
210
+ - `#ff3b30` — Vermillion
211
+ - `#f77463` — Coral
212
+ - `#ad6ded` — #ad6ded
213
+ - `#ff8a33` — Coral
214
+ - `#ff83dd` — Magenta
215
+ - `#213183` — #213183
216
+ - `#31302e` — Charcoal
217
+ - `#2a9d99` — #2a9d99
218
+ - `#1aae39` — Success Green
219
+ - `#b18164` — #b18164
220
+ - `#615d59` — Dim Gray
221
+ - `#a39e98` — Cool Gray
222
+ - `#f7f7f5` — Off-Cream
223
+ - `#d6b6f6` — Lavender *(token)*
224
+ - `#523410` — #523410 *(token)*
225
+ - `#ff64c8` — Hot Pink *(token)*
226
+ - *…+61 more in `raw-css.json` (`desktop.allColors`).*
227
+
228
+ ### CSS Custom Properties (Design Tokens)
229
+
230
+ **Spacing Token**
231
+ - `--typography-article-body-letter-spacing`: `0`
232
+ - `--typography-sans-600-bold-letter-spacing`: `-0.046875rem`
233
+ - `--typography-serif-800-regular-letter-spacing`: `-0.125rem`
234
+ - `--typography-sans-1000-regular-letter-spacing`: `-0.25rem`
235
+
236
+ **Motion Token**
237
+ - `--motion-duration-300`: `300ms`
238
+ - `--motion-duration-250`: `250ms`
239
+ - `--motion-timing-function-ease-in`: `ease-in`
240
+
241
+ **Background**
242
+ - `--color-background-surface-accent-muted`: `#f2f9ff`
243
+ - `--color-background-surface-neutral-focus`: `#dfdcd9`
244
+ - `--color-background-surface-accent-soft`: `#e6f3fe`
245
+ - `--color-background-surface-accent-muted-focus`: `#e6f3fe`
246
+
247
+ **Success**
248
+ - `--color-green-500`: `#1aae39`
249
+ - `--color-green-900`: `#05210b`
250
+ - `--color-green-400`: `#68ce7e`
251
+ - `--color-green-100`: `#f0faf2`
252
+
253
+ **Font Family Token**
254
+ - `--font-family-fallback-mono`: `Nitti,Menlo,Courier,monospace`
255
+ - `--font-family-primary-serif-japanese`: `"Lyon Text"`
256
+ - `--font-family-primary-serif`: `"Lyon Text"`
257
+ - `--font-family-fallback-serif-japanese`: `Georgia,YuMincho,"Yu Mincho","Hiragino Mincho ProN",serif`
258
+
259
+ **Border Radius Token**
260
+ - `--border-radius-800`: `0.875rem`
261
+ - `--border-radius-400`: `0.375rem`
262
+ - `--border-radius-300`: `0.3125rem`
263
+ - `--border-radius-900`: `1rem`
264
+
265
+ **Border**
266
+ - `--color-border-base`: `#0000001a`
267
+
268
+ **Z-Index Token**
269
+ - `--z-index-banner`: `90`
270
+ - `--z-index-popup`: `500`
271
+ - `--z-index-mobile-nav`: `200`
272
+ - `--z-index-header`: `100`
273
+
274
+ **Font Size Token**
275
+ - `--font-size-350`: `1.25rem`
276
+ - `--font-size-700`: `2.625rem`
277
+ - `--font-size-600`: `2rem`
278
+ - `--font-size-500`: `1.625rem`
279
+
280
+ **Font Weight Token**
281
+ - `--font-weight-variable-semibold`: `620`
282
+ - `--font-weight-medium`: `500`
283
+ - `--font-weight-bold`: `700`
284
+ - `--font-weight-regular`: `400`
285
+
286
+ **Text Color**
287
+ - `--color-text-warning`: `#ff6d00`
288
+ - `--color-text-error`: `#f64932`
289
+ - `--color-text-disabled`: `#0000004d`
290
+ - `--color-text-muted`: `#0000008a`
291
+
292
+ **Primary Brand Color**
293
+ - `--color-accent-muted`: `#f2f9ff`
294
+ - `--color-accent`: `#62aef0`
295
+ - `--color-accent-strong`: `#097fe8`
296
+ - `--color-accent-soft`: `#e6f3fe`
297
+
298
+ **Warning**
299
+ - `--color-yellow-600`: `#e89d01`
300
+ - `--color-yellow-800`: `#a16c00`
301
+ - `--color-yellow-700`: `#c78600`
302
+ - `--color-yellow-500`: `#ffb110`
303
+
304
+ **Error / Destructive**
305
+ - `--color-red-800`: `#6f0d00`
306
+ - `--color-red-500`: `#f64932`
307
+ - `--color-red-700`: `#b01601`
308
+ - `--color-red-900`: `#4f0900`
309
+
310
+ **Shadow Token**
311
+ - `--shadow-100`: `0px 0.7px 1.462px rgba(0,0,0,.015),0px 3px 9px #00000008`
312
+
313
+ **Other tokens**
314
+ - `--color-purple-300`: `#d6b6f6`
315
+ - `--color-brown-900`: `#523410`
316
+ - `--color-pink-500`: `#ff64c8`
317
+ - `--color-orange-600`: `#dd5b00`
318
+ - `--color-orange-800`: `#793400`
319
+ - `--color-button-tertiary-text`: `#000000f2`
320
+ - `--color-button-primary-background-active`: `#005bab`
321
+ - `--color-teal-400`: `#2a9d99`
322
+
323
+ ## 3. Typography Rules
324
+
325
+ ### Font Families
326
+ - **Primary**: `NotionInter`
327
+ - **Secondary**: `Noto Sans Arabic`
328
+ - **Font 3**: `Noto Sans Hebrew`
329
+ - **Font 4**: `Lyon Text`
330
+ - **Font 5**: `iA Writer Mono`
331
+
332
+ ### Custom Fonts Loaded
333
+ - **NotionInter** weight 400 (normal)
334
+ - **NotionInter** weight 500 (normal)
335
+ - **NotionInter** weight 600 (normal)
336
+ - **NotionInter** weight 700 (normal)
337
+ - **Noto Sans Arabic** weight 100 900 (normal)
338
+ - **Noto Sans Hebrew** weight 100 900 (normal)
339
+ - **Lyon Text** weight 400 (normal)
340
+ - **Lyon Text** weight 600 (normal)
341
+ - **iA Writer Mono** weight 400 (normal)
342
+ - **iA Writer Mono** weight 600 (normal)
343
+ - **Permanent Marker** weight 400 (normal)
344
+
345
+ ### Typography Hierarchy
346
+
347
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
348
+ |------|------|------|--------|-------------|----------------|-------|
349
+ | Display Hero | NotionInter | 64px | 700 | 1 | -2.125px | Main headline (h1) |
350
+ | Input Large | NotionInter | 42px | 700 | 1.14 | -1.5px | Form input (42px) |
351
+ | Caption / Badge | NotionInter | 22px | 700 | 1.27 | -0.25px | small text (22px) |
352
+ | Card Title | NotionInter | 16px | 400 | 1.5 | normal | Card headings |
353
+ | Button Large | NotionInter | 16px | 500 | 1.5 | normal | Button label (16px) |
354
+ | Sub-heading | NotionInter | 14px | 400 | 1.43 | normal | Third-level heading (h3) |
355
+ | Caption / Badge | NotionInter | 14px | 500 | 1.43 | normal | small text (14px) |
356
+ | Caption | NotionInter | 12px | 500 | 1.33 | 0.125px | Image caption, helper text |
357
+
358
+ ### Font Weight Scale
359
+
360
+ CSS custom properties define 8 explicit weight steps:
361
+ - `--font-weight-regular`: `400` — Regular
362
+ - `--font-weight-variable-regular`: `420` — Regular (custom, ~400)
363
+ - `--font-weight-medium`: `500` — Medium
364
+ - `--font-weight-variable-medium`: `520` — Medium (custom, ~500)
365
+ - `--font-weight-semibold`: `600` — SemiBold
366
+ - `--font-weight-variable-semibold`: `620` — SemiBold (custom, ~600)
367
+ - `--font-weight-variable-bold`: `680` — Bold (custom, ~700)
368
+ - `--font-weight-bold`: `700` — Bold
369
+
370
+ ### Full Font Size Scale
371
+
372
+ Sizes detected in the design (descending): `64px`, `54px`, `48px`, `42px`, `40px`, `32px`, `26px`, `24px`, `22px`, `20px`, `16px`, `15px`, `14px`, `12px`
373
+
374
+ > 8 size(s) detected outside the sampled hierarchy (54px, 48px, 40px, 32px, 26px, 24px, 20px, 15px). These appear on elements not in the sampled set — likely additional display sizes, marketing-section overrides, or third-party-widget styles.
375
+
376
+ ### OpenType & Variable Font Features
377
+
378
+ The typography uses these OpenType features intentionally — this is a sophisticated type system, not a default fallback:
379
+
380
+ - **lining figures** (`lnum`) — full-height numbers, more authoritative than old-style
381
+ - **case-sensitive forms** (`case`) — punctuation height adjusted for uppercase contexts
382
+ - **capital spacing** (`cpsp`) — added tracking on uppercase for breathing room
383
+ - **localized forms** (`locl`) — glyphs swapped based on script/locale
384
+
385
+ **Clone instruction:** Enable these in your CSS:
386
+ ```css
387
+ body {
388
+ font-feature-settings: "lnum", "locl", "case", "cpsp";
389
+ }
390
+ ```
391
+
392
+ ## 4. Component Stylings
393
+
394
+ ### Buttons
395
+
396
+ **Ghost**
397
+ - Background: `transparent` `{colors.surface-2}`
398
+ - Text: `#f6f5f4` `{colors.surface-1}`
399
+ - Padding: 5px 10px
400
+ - Radius: 4px
401
+ - Font: 16px weight 400
402
+ - Use: Subtle action, toolbar, nav button
403
+ - Hover: backgroundColor: `#ffffff`
404
+ - Focus: backgroundColor: `rgba(255, 255, 255, 0.03)`, outline: `rgb(0, 117, 222) solid 2px`
405
+
406
+ **Primary Brand**
407
+ - Background: `#455dd3` `{colors.primary}`
408
+ - Text: `#ffffff` `{colors.on-primary}`
409
+ - Padding: 4px 14px
410
+ - Radius: 8px
411
+ - Border: 1px solid rgba(255, 255, 255, 0)
412
+ - Font: 16px weight 500
413
+ - Use: Primary CTA / brand action
414
+ - Hover: backgroundColor: `#ffffff`
415
+ - Focus: backgroundColor: `rgba(255, 255, 255, 0.03)`, outline: `rgb(0, 117, 222) solid 2px`
416
+
417
+ **Primary Brand**
418
+ - Background: `#455dd3` `{colors.primary}`
419
+ - Text: `#ffffff` `{colors.on-primary}`
420
+ - Padding: 6px 15px
421
+ - Radius: 8px
422
+ - Border: 1px solid rgba(255, 255, 255, 0)
423
+ - Font: 16px weight 500
424
+ - Use: Primary CTA / brand action
425
+ - Hover: backgroundColor: `#ffffff`
426
+ - Focus: backgroundColor: `rgba(255, 255, 255, 0.03)`, outline: `rgb(0, 117, 222) solid 2px`
427
+
428
+ **Primary Brand**
429
+ - Background: `#213183`
430
+ - Text: `#ffffff` `{colors.on-primary}`
431
+ - Padding: 6px 15px
432
+ - Radius: 8px
433
+ - Border: 1px solid rgba(255, 255, 255, 0)
434
+ - Font: 16px weight 500
435
+ - Use: Primary CTA / brand action
436
+ - Hover: backgroundColor: `#ffffff`
437
+ - Focus: backgroundColor: `rgba(255, 255, 255, 0.03)`, outline: `rgb(0, 117, 222) solid 2px`
438
+
439
+ **Outline**
440
+ - Background: `transparent` `{colors.surface-2}`
441
+ - Text: `#ffffff` `{colors.on-primary}`
442
+ - Padding: 6px 15px
443
+ - Radius: 8px
444
+ - Border: 1px solid rgba(255, 255, 255, 0)
445
+ - Font: 16px weight 500
446
+ - Use: Secondary action with border
447
+ - Hover: backgroundColor: `#ffffff`
448
+ - Focus: backgroundColor: `rgba(255, 255, 255, 0.03)`, outline: `rgb(0, 117, 222) solid 2px`
449
+
450
+ **Ghost**
451
+ - Background: `transparent` `{colors.surface-2}`
452
+ - Text: `rgba(0, 0, 0, 0.95)`
453
+ - Padding: 12px 16px
454
+ - Radius: 8px
455
+ - Font: 16px weight 400
456
+ - Use: Subtle action, toolbar, nav button
457
+ - Hover: backgroundColor: `#ffffff`
458
+ - Focus: backgroundColor: `rgba(255, 255, 255, 0.03)`, outline: `rgb(0, 117, 222) solid 2px`
459
+
460
+ ### Navigation
461
+
462
+ **Main Nav**
463
+ - Background: `#f6f5f4` `{colors.surface-1}`
464
+ - Padding: 12px 16px
465
+ - Radius: none
466
+ - Font: 16px weight 400
467
+ - Use: Fixed/sticky grid nav — N/A items
468
+
469
+ ### Testimonials
470
+
471
+ **Quote Card**
472
+ - Background: `#ffffff` `{colors.on-primary}`
473
+ - Text: `rgba(0, 0, 0, 0.95)`
474
+ - Padding: 24px
475
+ - Radius: 12px
476
+ - Font: 16px weight 400
477
+ - Use: Customer quote with avatar + company attribution
478
+
479
+ ### Tabs
480
+
481
+ **Ghost Tab**
482
+ - Background: `transparent` `{colors.surface-2}`
483
+ - Text: `rgba(0, 0, 0, 0.95)`
484
+ - Padding: 12px 16px
485
+ - Radius: 8px
486
+ - Font: 16px weight 400
487
+ - Use: Navigation tabs, filter tabs
488
+
489
+
490
+ ## 4b. Component Behaviors (State Matrix)
491
+
492
+ ### Interaction State Narrative
493
+
494
+ - **Button**:
495
+ - **hover:** bg transparent → rgba(255, 255, 255, 0.004)
496
+ - **focus:** bg transparent → rgba(255, 255, 255, 0.03)
497
+ - **Link**:
498
+ - **hover:** text #0075de → #00396b, border changes
499
+ - **Badge**:
500
+ - **hover:** text #a39e98 → #615d59, border changes
501
+
502
+ *State transitions extracted via Playwright simulation — exact values in the YAML matrix below.*
503
+
504
+ ```yaml
505
+ component-behaviors:
506
+ button:
507
+ default:
508
+ bg: "rgba(0, 0, 0, 0)"
509
+ fg: "rgb(246, 245, 244)"
510
+ hover:
511
+ bg: "rgba(255, 255, 255, 0.004)"
512
+ fg: "rgb(246, 245, 244)"
513
+ focus:
514
+ bg: "rgba(255, 255, 255, 0.03)"
515
+ fg: "rgb(246, 245, 244)"
516
+ link:
517
+ default:
518
+ bg: "rgba(0, 0, 0, 0)"
519
+ fg: "rgb(0, 117, 222)"
520
+ hover:
521
+ bg: "rgba(0, 0, 0, 0)"
522
+ fg: "rgb(0, 57, 107)"
523
+ card:
524
+ default:
525
+ bg: "rgb(255, 255, 255)"
526
+ fg: "rgba(0, 0, 0, 0.898)"
527
+ border: "1px solid rgba(0, 0, 0, 0.1)"
528
+ navLink:
529
+ default:
530
+ bg: "rgba(0, 0, 0, 0)"
531
+ fg: "rgba(0, 0, 0, 0.95)"
532
+ tab:
533
+ default:
534
+ bg: "rgba(0, 0, 0, 0)"
535
+ fg: "rgba(0, 0, 0, 0.95)"
536
+ badge:
537
+ default:
538
+ bg: "rgba(0, 0, 0, 0)"
539
+ fg: "rgb(163, 158, 152)"
540
+ hover:
541
+ bg: "rgba(0, 0, 0, 0)"
542
+ fg: "rgb(97, 93, 89)"
543
+ footerLink:
544
+ default:
545
+ bg: "rgba(0, 0, 0, 0)"
546
+ fg: "rgba(0, 0, 0, 0.95)"
547
+ ```
548
+
549
+ **Agent usage**: Validate generated components against this matrix. If your output's `:hover` state changes properties not listed here, you are off-brand.
550
+
551
+
552
+ ## 4c. Component Vocabulary (Closed System)
553
+
554
+ *This brand uses ONLY the following component vocabulary. Introducing new variants without justification breaks the system's tonal coherence.*
555
+
556
+ ### Buttons
557
+ - **3 shape(s)** in this system: `Ghost`, `Primary Brand`, `Outline`
558
+ - **DO NOT introduce new buttons variants** without justification
559
+
560
+ ### Navigation
561
+ - **1 shape(s)** in this system: `Main Nav`
562
+ - **DO NOT introduce new navigation variants** without justification
563
+
564
+ ### Testimonials
565
+ - **1 shape(s)** in this system: `Quote Card`
566
+ - **DO NOT introduce new testimonials variants** without justification
567
+
568
+ ### Tabs
569
+ - **1 shape(s)** in this system: `Ghost Tab`
570
+ - **DO NOT introduce new tabs variants** without justification
571
+
572
+ ## 5. Layout Principles
573
+
574
+ ### Layout Type
575
+ **top-nav + content**
576
+
577
+ ### Grid
578
+ Single column, centered content
579
+
580
+ ### Max Width
581
+ 1200px
582
+
583
+ ### Spacing System
584
+ Compact spacing — information density prioritized
585
+
586
+ | Token | Value |
587
+ |-------|-------|
588
+ | xxs | 2px |
589
+ | xs | 4px |
590
+ | sm | 8px |
591
+ | md | 12px |
592
+ | base | 16px |
593
+ | lg | 24px |
594
+ | xl | 32px |
595
+ | 2xl | 48px |
596
+ | 3xl | 64px |
597
+
598
+ ### Border Radius Scale
599
+ | Name | Value | Use |
600
+ |------|-------|-----|
601
+ | None | 0px | No rounding |
602
+ | Xs | 4px | Tiny corners (badges, micro elements) |
603
+ | Sm | 8px | Buttons, inputs, small elements |
604
+ | Md | 12px | Cards, containers |
605
+ | Lg | 16px | Large rounded elements, pill segments |
606
+ | Xl | 16px | Category strips, featured containers |
607
+ | Full | 9999px | Pills, avatars, circular elements |
608
+
609
+ ### Shape Language
610
+
611
+ | Component | Border Radius |
612
+ |-----------|---------------|
613
+ | Buttons | `4px` |
614
+ | Navigation | `none` |
615
+ | Testimonials | `12px` |
616
+ | Tabs | `8px` |
617
+ | Page Body | `0px` |
618
+
619
+ **Shape Personality**: Moderate Rounding — Medium corners (4–12px). Modern SaaS standard, neither sharp nor pill.
620
+
621
+ **Full Radius Spectrum**: 0px, 4px, 5px, 8px, 12px, 16px, full/pill (from `allBorderRadii` scan)
622
+
623
+
624
+ ## 5b. Spacing Rhythm Names
625
+
626
+ *Named spacing tokens with explicit use cases. Use these names in YOUR code instead of raw pixels for consistency.*
627
+
628
+ | Name | Value | Use case |
629
+ |------|-------|----------|
630
+ | **hero** | `64px` | Top/bottom of full-bleed hero sections |
631
+ | **section** | `32px` | Between major bands (color change, content shift) |
632
+ | **subsection** | `24px` | Within a section, between content groups |
633
+ | **card** | `12px` | Card padding, list-item spacing |
634
+ | **compact** | `8px` | Form fields, tight clusters, badge padding |
635
+ | **micro** | `4px` | Icon-text gap, tag inner padding |
636
+
637
+ **Agent rule**: NEVER hardcode raw pixel values for spacing in generated UI. Always reference these named tokens (`spacing-rhythm.section`, etc.).
638
+
639
+ ## 5c. Widget & Structure Library
640
+
641
+ Structural patterns extracted from the page DOM — these are the **blueprints** an agent should follow to reproduce the page architecture (not just CSS values).
642
+
643
+ **7/8 structural patterns detected.**
644
+
645
+ ### Hero Pattern
646
+
647
+ - **Composition:** centered — Centered composition — heading + subheading + CTAs stacked vertically, content centered horizontally. Common for SaaS marketing pages.
648
+ - **Viewport coverage:** 256px tall (not full-viewport)
649
+ - **Heading:** "Meet the night shift." — 64px center-aligned
650
+ - **Subheading:** "Notion agents keep work moving 24/7. They capture knowledge, answer questions, and push projects forward—all while you sleep."
651
+ - **CTAs:** 2 (primary: "Get Notion free")
652
+ - **Clone instruction:** Reproduce the **centered** layout. Use the heading font-size token at the documented size. No imagery needed for hero — text-driven.
653
+
654
+ ### Navigation Pattern
655
+
656
+ - **Position:** static (scrolls with page)
657
+ - **Layout:** unknown — Layout not classified
658
+ - **Height:** 64px
659
+ - **Logo:** ✓ present
660
+ - **Nav links:** 5 primary items
661
+ - **CTAs in nav:** 1
662
+ - **Theme toggle:** ✓ dark/light mode switcher present
663
+ - **Clone instruction:** Build a static unknown navigation. Reserve 1 slot for primary CTA.
664
+
665
+ ### Card Grid Pattern
666
+
667
+ - **Card count:** 3 cards detected
668
+ - **Columns (desktop):** 1-up grid
669
+ - **Card dimensions:** 1229×978px (aspect 1.26:1)
670
+ - **Gap:** 80px between cards
671
+ - **Content:** ✓ image + CTA
672
+ - **Image position:** top
673
+ - **Clone instruction:** Build a 1-column grid (desktop) with cards at ~1.26:1 aspect ratio. Each card has an image at the top.
674
+
675
+ ### Pricing Table Pattern
676
+
677
+ - **Tier count:** 2 pricing tiers
678
+ - **Layout:** vertical stacked
679
+ - **Columns (desktop):** 2-up
680
+ - **Clone instruction:** Build a 2-column vertical-stack pricing comparison.
681
+
682
+ ### Testimonial Pattern
683
+
684
+ - **Count:** 12 testimonial blocks
685
+ - **Layout:** grid
686
+ - **Avg quote length:** 81 chars (medium quote)
687
+ - **Includes:** ✓ avatars | ✓ company logos | ✓ star ratings
688
+ - **Clone instruction:** Build a grid of 12 testimonials. Each includes an avatar. Include source company logos. Display ratings prominently.
689
+
690
+ ### CTA Banner Pattern
691
+
692
+ - **Banner count:** 1
693
+ - **Position:** mid-page
694
+ - **Visual treatment:** ✓ contrasting background
695
+ - **Primary CTA text:** "Q&A agentsAnswers questions instantly using knowledge you al"
696
+ - **Clone instruction:** Place a single CTA banner mid-page. Use contrasting solid background.
697
+
698
+ ### Footer Pattern
699
+
700
+ - **Columns:** 1
701
+ - **Links:** 28 total
702
+ - **Height:** 416px
703
+ - **Includes:** ✗ no newsletter | ✓ social icons | ✓ copyright
704
+ - **Clone instruction:** Build a 1-column footer with ~28 links per column, social media links, and a copyright line.
705
+
706
+ ## 6. Depth & Elevation
707
+
708
+ | Level | Treatment | Use |
709
+ |-------|-----------|-----|
710
+ | Flat (Level 0) | No shadow | Page background, content blocks |
711
+ | Layered (Level 1) | <br>`rgba(0, 0, 0, 0) 0px 1px 0px 0px` | Cards, elevated surfaces |
712
+ | Layered (Level 2) | <br>`rgba(0, 0, 0, 0.01) 0px 0.175px 1.041px 0px`,<br>`rgba(0, 0, 0, 0.02) 0px 0.8px 2.925px 0px`,<br>`rgba(0, 0, 0, 0.027) 0px 2.025px 7.847px 0px`,<br>`rgba(0, 0, 0, 0.04) 0px 4px 18px 0px` | Cards, elevated surfaces |
713
+ | Layered (Level 3) | <br>`rgba(255, 255, 255, 0.2) 0px 0px 20px 5px` | Cards, elevated surfaces |
714
+ | Layered (Level 4) | <br>`rgba(0, 0, 0, 0.01) 0px 0.667px 3.502px 0px`,<br>`rgba(0, 0, 0, 0.016) 0px 2.933px 7.252px 0px`,<br>`rgba(0, 0, 0, 0.02) 0px 7.2px 14.462px 0px`,<br>`rgba(0, 0, 0, 0.024) 0px 13.867px 28.348px 0px`,<br>`rgba(0, 0, 0, 0.03) 0px 23.333px 52.123px 0px`,<br>`rgba(0, 0, 0, 0.04) 0px 36px 89px 0px` | Cards, elevated surfaces |
715
+
716
+ **Shadow Philosophy**: Multi-layered shadow system creating natural, atmospheric depth. Each shadow level combines multiple layers for realistic elevation.
717
+
718
+ ## 7. Motion & Interaction
719
+
720
+ ### Easing System
721
+
722
+ | CSS Variable | Curve | Semantic Name |
723
+ |--------------|-------|---------------|
724
+ | `--motion-timing-function-ease-in` | `ease-in` | Ease In — Accelerating |
725
+ | `--motion-timing-function-ease-in-out-quint` | `cubic-bezier(0.86,0,0.07,1)` | Quint In-Out — Dramatic Symmetric |
726
+ | `--motion-timing-function-ease-in-out-cubic` | `cubic-bezier(0.645,0.045,0.355,1)` | Ease Out — Decelerating |
727
+ | `--motion-timing-function-ease-in-out-quad` | `cubic-bezier(0.45,0,0.55,1)` | Custom Ease — Balanced |
728
+ | `--motion-timing-function-ease-out` | `ease-out` | Ease Out — Decelerating |
729
+ | `--motion-timing-function-ease-in-out-linear` | `cubic-bezier(0.5,0,0.5,1)` | Custom Ease — Balanced |
730
+ | `--motion-timing-function-ease-in-out-quart` | `cubic-bezier(0.76,0,0.24,1)` | Ease Out — Decelerating |
731
+
732
+ ### Duration Scale
733
+
734
+ | CSS Variable | Value | Tier |
735
+ |--------------|-------|------|
736
+ | `--motion-duration-300` | `300ms` | Normal |
737
+ | `--motion-duration-250` | `250ms` | Normal |
738
+ | `--motion-duration-100` | `100ms` | Fast |
739
+ | `--motion-global-fade-out-duration` | `200ms` | Normal |
740
+ | `--motion-duration-200` | `200ms` | Normal |
741
+ | `--motion-duration-150` | `150ms` | Fast |
742
+ | `--motion-global-transform-duration` | `300ms` | Normal |
743
+ | `--motion-global-fade-in-duration` | `150ms` | Fast |
744
+
745
+ ### Copy-Paste Transition Snippets
746
+
747
+ **Background**
748
+ ```css
749
+ transition: background 0.075s linear;
750
+ ```
751
+
752
+ **Shadow**
753
+ ```css
754
+ transition: box-shadow 0.2s ease-in;
755
+ ```
756
+
757
+ **Background**
758
+ ```css
759
+ transition: background-color 0.15s;
760
+ ```
761
+
762
+ **Background**
763
+ ```css
764
+ transition: background-color 0.2s ease-in;
765
+ ```
766
+
767
+ ### Keyframe Animation Catalog
768
+
769
+ | Animation Name | Type | Animated Props | Use Hint |
770
+ |----------------|------|----------------|----------|
771
+ | `fadeIn` | Fade | opacity | Element entrance |
772
+ | `fadeOut` | Fade | opacity | Element exit |
773
+ | `scaleIn` | Scale | transform | Focus / emphasis |
774
+ | `scaleOut` | Scale | transform | Focus / emphasis |
775
+ | `popIn` | Fade + Move | opacity, transform | UI transition |
776
+ | `rotate` | Rotate / Spin | transform | Loading indicator |
777
+ | `loadingDots_pulse__d8LYi` | Fade | opacity | Loading indicator |
778
+ | `globalNavigation_navShadowScrolled__p...` | Custom | box-shadow | UI transition |
779
+ | `globalNavigation_fadeIn__BTvkx` | Fade | opacity | Element entrance |
780
+ | `globalNavigation_fadeOut__UET7A` | Fade | opacity | Element exit |
781
+ | `globalNavigation_slideDown__fiX_y` | Fade + Move | opacity, transform | Panel / drawer enter |
782
+ | `globalNavigation_navTokensHeroExit__n...` | Custom | --color-text-normal, --color-background-base-hover, --color-border-base, --color-button-primary-text, --color-button-primary-background, --color-button-primary-background-hover, --color-button-primary-background-focus, --color-button-primary-background-active, --color-button-ghost-text, --color-button-ghost-background-hover, --color-button-ghost-background-focus, --color-button-ghost-background-active, --color-text-muted | Element exit |
783
+ | `globalNavigation_navBgVarHeroExit__Kk6M2` | Custom | --campaign-nav-bg | Element exit |
784
+ | `globalNavigation_logoFillHeroExit__liWYo` | Custom | --notion-logo-fill | Element exit |
785
+ | `globalNavigation_navBgScrolled__qcb4e` | Custom | --campaign-nav-bg | UI transition |
786
+ | `globalNavigation_thinkTogetherNavToke...` | Custom | --color-text-normal, --color-text-muted, --color-background-base-hover, --color-border-base, --color-button-primary-text, --color-button-primary-background, --color-button-primary-background-hover, --color-button-primary-background-focus, --color-button-primary-background-active, --color-button-ghost-text, --color-button-ghost-background, --color-button-ghost-background-hover, --color-button-ghost-background-focus, --color-button-ghost-background-active | Element exit |
787
+ | `globalNavigation_thinkTogetherNavBgHe...` | Custom | --hero-nav-bg | Element exit |
788
+ | `globalNavigation_thinkTogetherLogoFil...` | Custom | --notion-logo-fill | Element exit |
789
+ | `globalNavigation_thinkTogetherNavBgSc...` | Custom | --hero-nav-bg | UI transition |
790
+ | `globalNavigation_devPlatformNavTokens...` | Custom | --color-interaction-focus-ring, --color-text-normal, --color-text-muted, --color-border-base, --color-background-base-hover, --color-button-primary-text, --color-button-primary-background, --color-button-primary-background-hover, --color-button-primary-background-focus, --color-button-primary-background-active, --color-button-ghost-text, --color-button-ghost-background-hover, --color-button-ghost-background-focus, --color-button-ghost-background-active, --color-nav-text, --color-nav-bracket, --color-nav-letter-hint | Element exit |
791
+
792
+ > *19 additional animations omitted (repetitive variants). See raw keyframes in `raw-css.json`.*
793
+
794
+ ### Motion Fingerprint
795
+
796
+ - **Speed Character**: Balanced Pacing (median duration: `200ms`)
797
+ - **Dominant Easing**: custom cubic-bezier curves
798
+ - **Animation Library**: 39 unique animations (39 total including variants)
799
+
800
+ > This design moves with balanced pacing timing using custom cubic-bezier curves, creating a UI that feels natural and fluid.
801
+
802
+ ## 8. Do's and Don'ts
803
+
804
+ ### Do
805
+ - Use NotionInter as the primary typeface — it defines the brand personality
806
+ - Use negative letter-spacing (-2.125px) at display sizes for compressed, editorial headlines
807
+ - Use the extracted shadow patterns for elevation — they are tuned to match the brand palette
808
+ - Use full-pill radius (9999px) only for specific elements (avatars, pills, toggles)
809
+ - Use Royal Blue (`#455dd3`) as the primary accent — it's the brand's signature interactive color
810
+ - Use 8px border-radius on buttons — the standard corner rounding for interactive elements
811
+ - Maintain nav height at 64px — consistent vertical space for the navigation bar
812
+ - Transition button background to Translucent White (0%) (`rgba(255, 255, 255, 0.004)`) on hover — this is the extracted interactive state
813
+ - Respect the 4px–32px spacing range — the design uses a wide scale for visual breathing room
814
+ - Keep the hero centered and text-driven — no decorative media, typography carries the message
815
+ - Include exactly 2 CTAs in the hero (primary + secondary) — this design pattern is multi-action, not single-purpose
816
+ - Include a theme toggle in the nav — dark mode is a first-class feature
817
+ - Each card includes a top image — imagery is part of the card identity, not optional
818
+ - Show company logos with testimonials — social proof relies on brand recognition, not avatars
819
+ - Lay out testimonials in a grid (12+ items) — quantity signals scale and trust
820
+
821
+ ### Don't
822
+ - Don't substitute with generic sans-serif or serif — the custom font carries the brand
823
+ - Don't increase letter-spacing on headings — the type is designed to run tight at scale
824
+ - Don't invent new shadow values — use only the extracted shadow levels
825
+ - Don't apply pill radius on rectangular buttons or cards — it's reserved for specific interactive elements
826
+ - Don't introduce additional saturated accent colors — the palette is intentionally controlled
827
+ - Don't collapse or hide the nav on scroll without an explicit scroll-triggered animation — the design uses fixed nav presence
828
+ - Don't use opacity or brightness filter for button hover — the design uses an explicit background color change
829
+ - Don't add hero illustrations or photos — they'll break the typographic restraint
830
+ - Don't make the nav sticky — this design lets it scroll away to maximize content focus
831
+
832
+
833
+ ## 7b. Enforceable Brand Rules
834
+
835
+ *Structured Do/Don't with reasoning and validation tests. Agents can programmatically verify generated UI.*
836
+
837
+ ```yaml
838
+ rules:
839
+ - id: brand-canvas-001
840
+ type: do
841
+ rule: "Always use the page background `rgb(255, 255, 255)` as the base canvas"
842
+ why: "Every component is designed to composit against this exact tone"
843
+ test: "document.body.style.backgroundColor === 'rgb(255, 255, 255)'"
844
+ - id: brand-accent-001
845
+ type: do
846
+ rule: "Reserve `rgb(69, 93, 211)` for primary CTAs and brand-mark signals only"
847
+ why: "Single chromatic assertion device — overuse dilutes meaning"
848
+ test: "querySelectorAll('[style*=\"rgb(69, 93, 211)\"]').length <= 3 per fold"
849
+ ```
850
+
851
+ ## 9. Responsive Behavior
852
+
853
+ ### Breakpoints
854
+ | Name | Width | Key Changes |
855
+ |------|-------|-------------|
856
+ | Mobile | 375px | Single column, compact spacing |
857
+ | Tablet | 768px | Multi-column grids begin |
858
+ | Desktop | 1032px | Full feature layout |
859
+ | Desktop | 1120px | Full feature layout |
860
+ | Desktop | 1280px | Full feature layout |
861
+ | Large Desktop | 1440px | Maximum content width |
862
+
863
+ ### Token Diff — Desktop vs Mobile
864
+
865
+ | Element | Property | Desktop | Mobile |
866
+ |---------|----------|---------|--------|
867
+ | heading | font-size | `64px` | `54px` |
868
+ | heading | line-height | `64px` | `56px` |
869
+ | heading | letter-spacing | `-2.125px` | `-1.875px` |
870
+ | button | width | `90.3906px` | `auto` |
871
+ | card | width | `436.062px` | `310px` |
872
+
873
+ ### Collapsing Strategy
874
+ - Headlines: 64px → 54px on mobile
875
+ - Navigation: horizontal links → hamburger menu on mobile
876
+ - Cards: multi-column → stacked vertical on mobile
877
+ - Footer: multi-column → stacked single column on mobile
878
+
879
+ ### Touch Targets
880
+ - Buttons: 5px 10px padding
881
+ - Navigation: adequate spacing between items
882
+ - Interactive elements: minimum 44px touch target recommended
883
+
884
+ ### Collapsing Narrative
885
+
886
+ How the structural patterns adapt from desktop to mobile (extracted from both viewport extractions):
887
+
888
+ - **Navigation collapses to hamburger** — 5 links visible on desktop, 0 on mobile (the rest hide behind a menu toggle).
889
+
890
+ ## 9b. Visual Tone & Photography
891
+
892
+ **Tone:** Mixed photography + illustration
893
+
894
+ A balanced mix of photographic content and vector graphics. Photos likely carry product/lifestyle context while SVG handles icons, logos, and decorative accents.
895
+
896
+ **Canonical Brand Image (OG):**
897
+ - https://www.notion.com/front-static/meta/custom-agents-og.png
898
+ *This is the image shown when the site is shared on social media — represents the brand visual essence.*
899
+
900
+ **Hero Image (above-fold dominant visual):**
901
+ - Aspect: 1.19:1 (landscape)
902
+ - Rendered size: 192×161px
903
+ - *Use this aspect ratio + composition for your clone's hero — mimicking the proportion preserves the visual hierarchy.*
904
+
905
+ **Aspect Ratio Distribution:**
906
+ - Landscape (1.15–2.3): 6 (29%)
907
+ - Portrait (<0.87): 3 (14%)
908
+ - Square (0.87–1.15): 9 (43%)
909
+ - Ultra-wide (>2.3): 3 (14%)
910
+
911
+ **Media Format Mix:**
912
+ - SVG: 3 (icons, illustrations, decorative geometry)
913
+
914
+ **Average rendered image size:** 301×235px
915
+ **Above-fold image count:** 6 / 21
916
+
917
+ **Decorative Patterns Detected:**
918
+ - 1 multi-stop linear gradient (mesh-like, 3+ color stops) — the brand leans on rich color transitions for visual depth
919
+ - 2 large decorative SVG shapes (≥200×200px, non-icon) — likely blob/illustration accents
920
+ - **Glassmorphism** detected (`backdrop-filter: blur`) — layered transparent surfaces with blur, modern OS-like aesthetic
921
+
922
+ **Clone instruction for decorative work:** Glassmorphism is a brand signature — use `backdrop-filter: blur(20px)` on overlapping surfaces.
923
+
924
+ **Imagery Guidance for clones:**
925
+ - Mix photography and illustration intentionally: photos for product/context, vectors for icons + decorative accents.
926
+ - Respect the format split — replacing JPGs with illustrations (or vice versa) will shift the brand tone.
927
+
928
+ ## 10. Agent Prompt Guide
929
+
930
+ ### Quick Reference
931
+ - Background: Banner (`#ffffff`)
932
+ - Primary text: Translucent Black (95%) (`rgba(0, 0, 0, 0.95)`)
933
+ - Accent: Royal Blue (`#455dd3`)
934
+ - Border: Stone (`#78736f`)
935
+ - Font: NotionInter
936
+ - Body: 16px weight 400
937
+
938
+ ### Example Component Prompts
939
+ - "Create a hero section on Banner background (#ffffff). Headline at 64px NotionInter weight 700, line-height 1, letter-spacing -2.125px, color rgba(0, 0, 0, 0.95)."
940
+ - "Create the primary CTA button: `#455dd3` background, `#ffffff` text, 8px border-radius, 4px 14px padding, 500 weight, NotionInter font."
941
+ - "Design a card on `transparent` background. Border: none. Radius: 0px. Shadow: none. Padding: 0px."
942
+ - "Build navigation: relative on `#ffffff`. NotionInter 16px weight 400 for links."
943
+
944
+ ### Iteration Guide
945
+ 1. **Canvas**: Set the light canvas to Banner (`#ffffff`) — every component is composited against this exact base.
946
+ 2. **Typography**: All type in NotionInter, weight range 400–700. Never exceed 700 — heavier weights break the brand's tonal restraint.
947
+ 3. **Accent**: Royal Blue (`#455dd3`) is the sole interactive color. On hover → Accent Strong (`#097fe8`). Use CSS transitions, not opacity/brightness filters.
948
+ 4. **Motion**: All transitions use `cubic-bezier(0.45,0,0.55,1)`. Timing: 100ms for micro-interactions, 200ms for layout changes. Never use linear for UI transitions — preserve the brand's easing personality.
949
+ 5. **Shape**: CTAs at `4px`, cards at `0px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
950
+ 6. **Spacing**: Use the `--ca-space-*` token scale (4px–32px). All padding, margin, and gap values are multiples from this scale — no magic numbers.
951
+ 7. **Tokens**: Import from §11 CSS Export (`--ca-*` vars). Never hardcode hex values — always reference a token so theming remains consistent.
952
+
953
+ ## 11. CSS Design Tokens Raw Export
954
+
955
+ *Copy-paste ready `:root {}` block — all values extracted directly from the live site.*
956
+
957
+ ```css
958
+ /* Colors */
959
+ :root {
960
+ --ca-on-primary: #ffffff;
961
+ --ca-surface-1: #f6f5f4;
962
+ --ca-surface-2: transparent;
963
+ --ca-ink-subtle: #615d59;
964
+ --ca-primary: #455dd3;
965
+ --ca-primary-hover: #f2f9ff;
966
+ --ca-hairline: #78736f;
967
+ --ca-primary-focus: #0075de;
968
+ --ca-semantic-error: #f64932;
969
+ --ca-semantic-success: #14832b;
970
+ --ca-semantic-warning: #ff6d00;
971
+ }
972
+
973
+ /* Typography */
974
+ :root {
975
+ --ca-font-primary: "NotionInter", system-ui, sans-serif;
976
+ --ca-text-display: 64px;
977
+ --ca-text-body: 16px;
978
+ --ca-text-caption: 22px;
979
+ --ca-text-button: 16px;
980
+ --ca-text-mono: 42px;
981
+ }
982
+
983
+ /* Spacing & Radius */
984
+ :root {
985
+ --ca-space-xxs: 2px;
986
+ --ca-space-xs: 4px;
987
+ --ca-space-sm: 8px;
988
+ --ca-space-md: 12px;
989
+ --ca-space-base: 16px;
990
+ --ca-space-lg: 24px;
991
+ --ca-space-xl: 32px;
992
+ --ca-space-2xl: 48px;
993
+ --ca-space-3xl: 64px;
994
+ --ca-radius-none: 0px;
995
+ --ca-radius-xs: 4px;
996
+ --ca-radius-sm: 8px;
997
+ --ca-radius-md: 12px;
998
+ --ca-radius-lg: 16px;
999
+ --ca-radius-xl: 16px;
1000
+ --ca-radius-full: 9999px;
1001
+ }
1002
+ ```
1003
+
1004
+
1005
+ ## 13. Page Structure Skeleton
1006
+
1007
+ *The actual layout the source site uses. Reproduce these sections in order to match the site structure.*
1008
+
1009
+ ```yaml
1010
+ page-skeleton:
1011
+ - section: unknown
1012
+ tag: div
1013
+ height: 7546px
1014
+ width: full-bleed
1015
+ layout: block
1016
+ children: 1
1017
+ - section: main-content
1018
+ tag: main
1019
+ height: 7086px
1020
+ width: full-bleed
1021
+ layout: block
1022
+ children: 5
1023
+ - section: hero
1024
+ tag: div
1025
+ height: 1117px
1026
+ width: full-bleed
1027
+ layout: flex-column justify=normal
1028
+ children: 3
1029
+ - section: hero
1030
+ tag: div
1031
+ classes: ["isCampaignAgentsHomepageHero"]
1032
+ height: 1149px
1033
+ width: full-bleed
1034
+ layout: block
1035
+ children: 1
1036
+ bg: "rgb(2, 9, 58)"
1037
+ padding: "0px 0px 32px"
1038
+ - section: hero
1039
+ tag: div
1040
+ height: 953px
1041
+ width: full-bleed
1042
+ layout: grid: 3-col gap=40px normal
1043
+ children: 5
1044
+ padding: "56px 105.6px 0px"
1045
+ - section: header
1046
+ tag: header
1047
+ classes: ["flex", "flex-col", "items-stretch", "justify-start"]
1048
+ height: 256px
1049
+ width: 960px
1050
+ layout: flex-column justify=start
1051
+ children: 3
1052
+ padding: "80px 0px 0px"
1053
+ - section: hero
1054
+ tag: div
1055
+ height: 601px
1056
+ width: 960px
1057
+ layout: block
1058
+ children: 2
1059
+ - section: section-12
1060
+ tag: section
1061
+ height: 647px
1062
+ width: 1229px
1063
+ layout: flex-column justify=normal
1064
+ children: 2
1065
+ - section: unknown
1066
+ tag: div
1067
+ height: 3235px
1068
+ width: 1229px
1069
+ layout: flex-column justify=normal
1070
+ children: 2
1071
+ - section: section-13
1072
+ tag: section
1073
+ height: 559px
1074
+ width: 1229px
1075
+ layout: block
1076
+ children: 1
1077
+ bg: "rgb(255, 255, 255)"
1078
+ - section: header
1079
+ tag: header
1080
+ height: 96px
1081
+ width: 436px
1082
+ layout: flex-column justify=normal
1083
+ children: 2
1084
+ bg: "rgb(255, 255, 255)"
1085
+ - section: section-14
1086
+ tag: section
1087
+ height: 182px
1088
+ width: 1229px
1089
+ layout: block
1090
+ children: 1
1091
+ - section: section-15
1092
+ tag: section
1093
+ height: 1037px
1094
+ width: 1229px
1095
+ layout: flex-column justify=normal
1096
+ children: 2
1097
+ - section: header
1098
+ tag: header
1099
+ height: 366px
1100
+ width: 498px
1101
+ layout: flex-column justify=normal
1102
+ children: 2
1103
+ bg: "rgb(255, 255, 255)"
1104
+ padding: "24px"
1105
+ - section: header
1106
+ tag: header
1107
+ height: 108px
1108
+ width: 602px
1109
+ layout: flex-column justify=normal
1110
+ children: 2
1111
+ bg: "rgb(255, 255, 255)"
1112
+ padding: "24px"
1113
+ - section: header
1114
+ tag: header
1115
+ height: 108px
1116
+ width: 602px
1117
+ layout: flex-column justify=normal
1118
+ children: 2
1119
+ bg: "rgb(255, 255, 255)"
1120
+ padding: "24px"
1121
+ - section: section-16
1122
+ tag: section
1123
+ height: 1037px
1124
+ width: 1229px
1125
+ layout: flex-column justify=normal
1126
+ children: 2
1127
+ - section: header
1128
+ tag: header
1129
+ height: 108px
1130
+ width: 602px
1131
+ layout: flex-column justify=normal
1132
+ children: 2
1133
+ bg: "rgb(255, 255, 255)"
1134
+ padding: "24px"
1135
+ - section: header
1136
+ tag: header
1137
+ height: 108px
1138
+ width: 602px
1139
+ layout: flex-column justify=normal
1140
+ children: 2
1141
+ bg: "rgb(255, 255, 255)"
1142
+ padding: "24px"
1143
+ - section: header
1144
+ tag: header
1145
+ height: 366px
1146
+ width: 498px
1147
+ layout: flex-column justify=normal
1148
+ children: 2
1149
+ bg: "rgb(255, 255, 255)"
1150
+ padding: "24px"
1151
+ - section: unknown
1152
+ tag: div
1153
+ height: 564px
1154
+ width: 1229px
1155
+ layout: flex-column justify=normal
1156
+ children: 2
1157
+ - section: header
1158
+ tag: div
1159
+ height: 192px
1160
+ width: 1229px
1161
+ layout: flex-row justify=space-between
1162
+ children: 2
1163
+ - section: header
1164
+ tag: div
1165
+ height: 192px
1166
+ width: 605px
1167
+ layout: flex-column justify=normal
1168
+ children: 3
1169
+ - section: section-17
1170
+ tag: section
1171
+ height: 787px
1172
+ width: 1229px
1173
+ layout: block
1174
+ children: 3
1175
+ - section: unknown
1176
+ tag: div
1177
+ height: 787px
1178
+ width: 1229px
1179
+ layout: flex-column justify=normal
1180
+ children: 1
1181
+ ```
1182
+
1183
+ **Agent rule**: rebuild sections in this order (sorted by vertical position). Match the layout primitive (grid N-col / flex direction / block).
1184
+
1185
+
1186
+ ## 14. Copy Library (Real Content from Source)
1187
+
1188
+ *Actual text content extracted from the live page. Use these strings verbatim when reproducing the site — they carry the brand voice.*
1189
+
1190
+ ```yaml
1191
+ copy:
1192
+ section-headings:
1193
+ - "Keep work moving 24/7."
1194
+ - "Automate repetitive work for your team."
1195
+ - "You assign the tasks. Notion Agent does the work."
1196
+ - "One search for everything."
1197
+ - "More productivity. Fewer tools."
1198
+ sub-headings:
1199
+ - "See what Custom Agents can do"
1200
+ - "Triage product feedback→"
1201
+ - "Create your own Custom Agent→"
1202
+ - "Get started on Notion"
1203
+ ctas:
1204
+ - "Product"
1205
+ - "Get Notion free"
1206
+ - "Request a demo"
1207
+ - "Pause"
1208
+ navigation:
1209
+ - "Developers"
1210
+ - "Enterprise"
1211
+ - "Pricing"
1212
+ - "Request a demo"
1213
+ - "Get Notion free"
1214
+ - "Log in"
1215
+ footer-links:
1216
+ - "About us"
1217
+ ```
1218
+
1219
+ **Agent rule**: reuse these exact strings when generating UI. Do NOT translate or rephrase — brand voice is preserved through the original wording.
1220
+
1221
+
1222
+ ## 15. Asset Inventory (Image Roles & Ratios)
1223
+
1224
+ *Image inventory classified by role and aspect ratio. When reproducing the site, allocate this number of assets per role.*
1225
+
1226
+ ```yaml
1227
+ assets:
1228
+ logo:
1229
+ count: 16
1230
+ avg-ratio: 3.43
1231
+ common-aspect: "~16:6 banner"
1232
+ sample-alts:
1233
+ - "OpenAI"
1234
+ - "Figma"
1235
+ - "Ramp"
1236
+ product:
1237
+ count: 3
1238
+ avg-ratio: 1.12
1239
+ common-aspect: "~1:1 square"
1240
+ sample-alts:
1241
+ - "Homepage | Agents 26 | Bento | Agent | Front | Desktop"
1242
+ - "Homepage | Agents 26 | Bento | Search | Desktop"
1243
+ thumbnail:
1244
+ count: 23
1245
+ avg-ratio: 1.00
1246
+ common-aspect: "~1:1 square"
1247
+ ```
1248
+
1249
+ **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`.
1250
+
1251
+
1252
+ ## 16. Component HTML Templates
1253
+
1254
+ *Suggested HTML markup for reproducing the key components — based on what was detected in the source DOM.*
1255
+
1256
+ ### Button (primary action)
1257
+ ```html
1258
+ <button class="btn btn-primary">
1259
+ Product
1260
+ </button>
1261
+ ```
1262
+ _Source pattern detected: padding `5px 10px` · radius `4px` · weight `400`_
1263
+
1264
+ ### Generic Card
1265
+ ```html
1266
+ <div class="card">
1267
+ <!-- content -->
1268
+ </div>
1269
+ ```
1270
+ _Source pattern detected: padding `24px` · radius `12px` · shadow `none`_
1271
+
1272
+ **Agent rule**: use these markup skeletons as the structural baseline. Apply tokens from §2-3 for visual styling.
1273
+
1274
+
1275
+ ## 12. Known Extraction Gaps
1276
+
1277
+ *Auto-detected limitations of this extraction — understand before building:*
1278
+
1279
+ - **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.
1280
+
1281
+
1282
+ ---
1283
+ ## Extraction Completeness: 91/100 (A)
1284
+
1285
+ | Category | Score | Max | Detail |
1286
+ |----------|-------|-----|--------|
1287
+ | Colors & Palette | 25 | 25 | 19 named colors |
1288
+ | Typography | 20 | 20 | 8 roles defined |
1289
+ | Components | 16 | 20 | 4 specs extracted |
1290
+ | Motion & Interaction | 15 | 15 | Keyframes present, easing vars |
1291
+ | CSS Custom Properties | 10 | 10 | 799 vars |
1292
+ | Responsive Breakpoints | 5 | 5 | 6 breakpoints |
1293
+ | Variable Fonts | 0 | 5 | None detected |
1294
+
1295
+ ## 12. Known Gaps & Confidence
1296
+
1297
+ 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.
1298
+
1299
+ | Category | What's missing | Fallback strategy |
1300
+ |----------|----------------|-------------------|
1301
+ | **Form inputs** | No text input fields detected on this page | Use the documented border-radius + accent border on focus; 12-16px padding inside |
1302
+
1303
+ ### Per-section confidence
1304
+
1305
+ | Section | Confidence | Reason |
1306
+ |---------|------------|--------|
1307
+ | §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
1308
+ | §2 Colors | High | 799 CSS vars (semantic naming requires ≥20 for high) |
1309
+ | §3 Typography | High | 8 typography roles inferred |
1310
+ | §4 Components | Medium | 4 component variants captured |
1311
+ | §7 Motion | High | Keyframes + transitions |
1312
+ | §8 Do's/Don'ts | High | 24 rules generated; design-decisions.json has evidence per rule |
1313
+ | §9 Responsive | High | 6 breakpoints detected |
1314
+ | §9b Photography | High | 21 images, hero present |
1315
+
1316
+ ---
1317
+ *Generated by Clone Architect — automated Playwright extraction + design analysis.*
1318
+ *Source: https://www.notion.so | 2026-05-30T22:28:30.131Z*
1319
+ *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.*