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,1080 @@
1
+ ---
2
+ version: alpha
3
+ name: revolut.com
4
+ description: "Light product system built on #ffffff with #4f55f1 as the primary CTA accent. Type anchored in Inter at 89.216px / weight 500. Extracted automatically from https://revolut.com/ — rendered styles via getComputedStyle() + CSS custom properties (token-only values may not be painted)."
5
+ narrative: |
6
+ revolut.com is built on a pure-white canvas (rgb(255, 255, 255)).
7
+ The system uses #4f55f1 as the high-saturation accent for primary actions.
8
+ Moderately rounded CTAs (12px) — modern SaaS standard, neither sharp nor pill alongside Inter as the primary typeface.
9
+ Inter is paired with Aeonik Pro for secondary roles.
10
+ Depth comes from borders and surface contrast rather than shadows — a flat, structural elevation model.
11
+ Interactions are smoothed by transitions across many elements, with little or no keyframe animation.
12
+
13
+ colors:
14
+ background: "#ffffff"
15
+ surface-1: "#ebebf0"
16
+ surface-2: "#edeefd"
17
+ ink: "#191c1f"
18
+ ink-muted: "rgba(25, 28, 31, 0.65)"
19
+ primary: "#4f55f1"
20
+ on-primary: "#ffffff"
21
+ primary-hover: "#494fdf"
22
+ hairline: "#505a63"
23
+ semantic-error: "#e23b4a"
24
+ semantic-success: "#00b88b"
25
+ semantic-warning: "#ec7e00"
26
+
27
+ typography:
28
+ display-xl:
29
+ fontFamily: "Aeonik Pro"
30
+ fontSize: 89.216px
31
+ fontWeight: 500
32
+ lineHeight: 1
33
+ letterSpacing: -2.08px
34
+ display-md:
35
+ fontFamily: "Aeonik Pro"
36
+ fontSize: 18px
37
+ fontWeight: 400
38
+ lineHeight: 1.33
39
+ letterSpacing: 0
40
+ body:
41
+ fontFamily: "Inter"
42
+ fontSize: 16px
43
+ fontWeight: 400
44
+ lineHeight: normal
45
+ letterSpacing: 0
46
+ button:
47
+ fontFamily: "Aeonik Pro"
48
+ fontSize: 16px
49
+ fontWeight: 500
50
+ lineHeight: 1.38
51
+ letterSpacing: 0
52
+
53
+ rounded:
54
+ none: 0px
55
+ xs: 12px
56
+ sm: 12px
57
+ md: 12px
58
+ lg: 20px
59
+ xl: 22.5px
60
+ xxl: 24px
61
+ pill: 9999px
62
+
63
+ spacing:
64
+ xxs: 2px
65
+ xs: 40px
66
+ sm: 8px
67
+ md: 12px
68
+ lg: 24px
69
+ xl: 32px
70
+ xxl: 64px
71
+ section: 80px
72
+
73
+ components:
74
+ button-icon-button:
75
+ backgroundColor: "transparent"
76
+ textColor: "{colors.hairline}"
77
+ typography: "{typography.body}"
78
+ rounded: "{rounded.xs}"
79
+ button-light--invert:
80
+ backgroundColor: "{colors.surface-1}"
81
+ textColor: "{colors.ink-muted}"
82
+ typography: "{typography.body}"
83
+ rounded: "{rounded.xs}"
84
+ padding: 8px
85
+ button-icon-button-2:
86
+ backgroundColor: "{colors.ink-muted}"
87
+ textColor: "{colors.on-primary}"
88
+ typography: "{typography.body}"
89
+ rounded: "{rounded.pill}"
90
+ padding: 0px 16px
91
+ tab-ghost-tab:
92
+ backgroundColor: "transparent"
93
+ textColor: "#f4f4f4"
94
+ typography: "{typography.body}"
95
+ rounded: "{rounded.none}"
96
+ padding: 0px 20px
97
+ tab-pill-tab:
98
+ backgroundColor: "#f4f4f4"
99
+ textColor: "#000000"
100
+ typography: "{typography.body}"
101
+ rounded: "{rounded.pill}"
102
+ padding: 10px 26px
103
+
104
+ extracted_at: "2026-05-30T22:28:31.588Z"
105
+ completeness: 49
106
+ scoreVersion: "v2"
107
+
108
+ ---
109
+
110
+ # Design System — revolut.com
111
+ > Extracted automatically by Clone Architect from https://www.revolut.com
112
+ > Date: 2026-05-30
113
+ > Viewport: Desktop 1440x900 + Mobile 390x844
114
+ > 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).
115
+
116
+ > **🤖 TL;DR for AI agents** (read this first — saves you scanning the full doc):
117
+ >
118
+ > - **Canvas**: `rgb(255, 255, 255)` is the page background. Every component composits against this.
119
+ > - **Accent**: `#4f55f1` for primary CTAs ONLY. Never decorative.
120
+ > - **Body type**: 16px (token: `typography.body`). Default for ALL text not in a heading role.
121
+ > - **Section rhythm**: 48px between major bands. Card padding: 24px.
122
+ > - **Default radius**: 12px on buttons/inputs. Pills (`9999px`) only for icon-buttons or status chips.
123
+ > - **Forbidden**: Do NOT introduce heavy box-shadows — this system relies on borders for separation
124
+ >
125
+ > **Before generating UI**: import this DESIGN.md, scan §2 (Color Palette) + §4 (Components) + §10 (Agent Guide). Skip §11–12 unless extending.
126
+
127
+ ## 1. Visual Theme & Atmosphere
128
+
129
+ revolut.com uses a pure-white canvas (`#ffffff`), letting typography, color and imagery carry the visual weight.
130
+
131
+ Typography is anchored in **Inter**. Negative letter-spacing at display sizes (-2.08px at 89.216px) compresses headlines into engineered blocks, dense and precise.
132
+
133
+ Body text reads in Near Black (`#191c1f`) — softened from pure black, a small but deliberate detail that lowers reading friction. **Brand Indigo** (`#4f55f1`) provides interactive distinction without visual aggression. Shadow is absent by design — depth is conveyed through borders, spacing, and color differentiation rather than light simulation.
134
+ 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.
135
+
136
+ **Key Characteristics:**
137
+ - Background: Pure White (`#ffffff`)
138
+ - Primary typeface: Inter
139
+ - Primary text: Near Black (`#191c1f`)
140
+ - Accent: Brand Indigo (`#4f55f1`)
141
+ - Display: 89.216px weight 500, letter-spacing -2.08px
142
+ - Custom fonts loaded: Inter, Aeonik Pro, Aeonik Pro Capitalised
143
+
144
+ ## 2. Color Palette & Roles
145
+
146
+ ### Background & Surface
147
+ - **Pure White** (`#ffffff`): Page background (primary)
148
+ - **Light Gray** (`#ebebf0`): Surface / elevated background
149
+ - **Light Gray** (`#edeefd`): Surface / elevated background
150
+ - **Warm Cream** (`#f4f4f4`): Surface / elevated background
151
+ - **Off-Cream** (`#f7f7f7`): Surface / elevated background
152
+
153
+ ### Text & Content
154
+ - **Near Black** (`#191c1f`): Primary body text
155
+ - **Pure Black** (`#000000`): Secondary text
156
+
157
+ ### Border & Divider
158
+ - **Translucent Silver (66%)** (`rgba(201, 201, 205, 0.663)`): Borders / dividers
159
+
160
+ ### Full Extracted Palette
161
+ **11 colors rendered on the page** + **42** more declared in design tokens (CSS custom properties — not necessarily painted). (8 categorized above + 45 additional below.)
162
+ Rendered values are read via `getComputedStyle()`; token values come from CSS variable declarations. Third-party logo colors are filtered out.
163
+
164
+ - `#505a63` — Slate
165
+ - `#717173` — Stone
166
+ - `#8d969e` — Cool Gray
167
+ - `#f1f2f4` — Light Gray *(token)*
168
+ - `#efefef` — Light Gray *(token)*
169
+ - `#376cd5` — Royal Blue *(token)*
170
+ - `#006400` — #006400 *(token)*
171
+ - `#b09000` — #b09000 *(token)*
172
+ - `#4f55f1` — Brand Indigo *(token)*
173
+ - `#e23b4a` — Vermillion *(token)*
174
+ - `#494fdf` — Royal Blue *(token)*
175
+ - `#8b0000` — #8b0000 *(token)*
176
+ - `#e61e49` — Crimson *(token)*
177
+ - `#936d62` — Stone *(token)*
178
+ - `#fde5e3` — Soft Pink *(token)*
179
+ - `#00a87e` — Emerald *(token)*
180
+ - `#dfe3e7` — Light Gray *(token)*
181
+ - `#428619` — Forest Green *(token)*
182
+ - `#ec7e00` — #ec7e00 *(token)*
183
+ - `#007bc2` — #007bc2 *(token)*
184
+ - `#00b88b` — Emerald *(token)*
185
+ - `#75808a` — Medium Gray *(token)*
186
+ - `#6262d3` — Indigo *(token)*
187
+ - `#fef6f5` — Snow *(token)*
188
+ - `#ca4f12` — #ca4f12 *(token)*
189
+ - `#b73ccd` — #b73ccd *(token)*
190
+ - `#08a4af` — #08a4af *(token)*
191
+ - `#067f44` — #067f44 *(token)*
192
+ - `#e91f0c` — M Tricolor Red *(token)*
193
+ - `#0b6ef9` — #0b6ef9 *(token)*
194
+ - `#7c57f4` — Brand Indigo *(token)*
195
+ - `#fbc70a` — Amber *(token)*
196
+ - *…+13 more in `raw-css.json` (`desktop.allColors`).*
197
+
198
+ ### Gradients & Decorative Fills
199
+
200
+ - `linear-gradient(180deg,#99a2b3 -6.25%,#2c3c61 100%)` — (--website-premium-button-gradient)
201
+ - `radial-gradient(50% 50% at 50% 50%,hsl(235 98% 53%/0.15) 0%,hsl(235 98% 53%/0) 100%),radial-gradient…` — (--rui-gradient-glow)
202
+
203
+ ### CSS Custom Properties (Design Tokens)
204
+
205
+ **Font Weight Token**
206
+ - `--rui-font-weight-heading1`: `800`
207
+ - `--rui-font-weight-body3`: `500`
208
+ - `--rui-font-weight-marketing-display2`: `900`
209
+ - `--rui-font-weight-emphasis4`: `700`
210
+
211
+ **Border Radius Token**
212
+ - `--rui-radius-round`: `9999px`
213
+ - `--rui-radius-widget`: `1rem`
214
+ - `--rui-radius-r2`: `0.125rem`
215
+ - `--rui-radius-r12`: `0.75rem`
216
+
217
+ **Spacing Token**
218
+ - `--rui-letter-spacing-heading3`: `calc(-0.27em / 20)`
219
+ - `--rui-letter-spacing-heading1`: `calc(-0.35em / 32)`
220
+ - `--rui-space-none`: `0`
221
+ - `--rui-letter-spacing-emphasis3`: `0`
222
+
223
+ **Font Size Token**
224
+ - `--rui-font-size-marketing-display3`: `2rem`
225
+ - `--rui-font-size-heading1`: `2rem`
226
+ - `--rui-font-size-emphasis1`: `1rem`
227
+ - `--rui-font-size-marketing-display1`: `3.5rem`
228
+
229
+ **Success**
230
+ - `--website-color-green-text`: `#006400`
231
+ - `--rui-color-green`: `#067f44`
232
+ - `--rui-color-success`: `#00b88b`
233
+
234
+ **Warning**
235
+ - `--rui-color-yellow`: `#b09000`
236
+ - `--rui-color-warning`: `#ec7e00`
237
+
238
+ **Shadow Token**
239
+ - `--rui-timing-shadow`: `200ms cubic-bezier(0.4,0.3,0.8,0.6)`
240
+ - `--rui-shadow-level3`: `0 0.1875rem 1.875rem rgb(25 28 31/0.08)`
241
+ - `--rui-shadow-level1`: `0 0.125rem 0.1875rem rgb(25 28 31/0.05)`
242
+ - `--rui-shadow-level2`: `0 0.1875rem 0.5rem rgb(25 28 31/0.1)`
243
+
244
+ **Text Color**
245
+ - `--rui-color-foreground`: `#191c1f`
246
+
247
+ **Motion Token**
248
+ - `--rui-duration-xl`: `900ms`
249
+ - `--rui-duration-sm`: `200ms`
250
+ - `--rui-easing-toast`: `cubic-bezier(0.175,0.885,0.21,1.65)`
251
+
252
+ **Error / Destructive**
253
+ - `--rui-color-danger`: `#e23b4a`
254
+ - `--website-color-red-text`: `#8b0000`
255
+ - `--rui-color-red-action-background`: `#fef6f5`
256
+ - `--rui-color-red`: `#e91f0c`
257
+
258
+ **Primary Brand Color**
259
+ - `--rui-color-accent-neutral`: `#4f55f1`
260
+ - `--rui-color-accent`: `#494fdf`
261
+
262
+ **Background**
263
+ - `--rui-color-background`: `#fff`
264
+
265
+ **Other tokens**
266
+ - `--rui-color-grey-2`: `#f1f2f4`
267
+ - `--rui-color-grey-tone-20`: `#c9c9cd`
268
+ - `--rui-color-disabled`: `#efefef`
269
+ - `--rui-color-action-label`: `#fff`
270
+ - `--website-color-grouped-background`: `#f7f7f7`
271
+ - `--rui-color-channel-action-background-neutral`: `230 240 253`
272
+ - `--rui-color-action-background`: `#edeefd`
273
+ - `--website-color-blue-text`: `#376CD5`
274
+
275
+ ## 3. Typography Rules
276
+
277
+ ### Font Families
278
+ - **Primary**: `Inter`
279
+ - **Secondary**: `Aeonik Pro`
280
+ - **Font 3**: `Aeonik Pro Capitalised`
281
+
282
+ ### Custom Fonts Loaded
283
+ - **Inter** weight 400 (normal)
284
+ - **Inter** weight 500 (normal)
285
+ - **Inter** weight 600 (normal)
286
+ - **Inter** weight 700 (normal)
287
+ - **Aeonik Pro** weight 900 (normal)
288
+ - **Aeonik Pro** weight 500 (normal)
289
+ - **Aeonik Pro** weight 700 (normal)
290
+ - **Aeonik Pro Capitalised** weight 900 (normal)
291
+
292
+ ### Typography Hierarchy
293
+
294
+ | Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
295
+ |------|------|------|--------|-------------|----------------|-------|
296
+ | Display Hero | Aeonik Pro | 89.216px | 500 | 1 | -2.08px | Main headline (h1) |
297
+ | Sub-heading | Aeonik Pro | 18px | 400 | 1.33 | normal | Third-level heading (h3) |
298
+ | Body | Inter | 16px | 400 | normal | normal | Standard reading text |
299
+ | Button Large | Aeonik Pro | 16px | 500 | 1.38 | normal | Button label (16px) |
300
+
301
+ ### Font Weight Scale
302
+
303
+ CSS custom properties define 18 explicit weight steps:
304
+ - `--rui-font-weight-body3`: `500` — Medium
305
+ - `--rui-font-weight-sm-subtitle-2`: `500` — Medium
306
+ - `--rui-font-weight-body1`: `500` — Medium
307
+ - `--rui-font-weight-sm-h6`: `500` — Medium
308
+ - `--rui-font-weight-body2`: `500` — Medium
309
+ - `--rui-font-weight-emphasis4`: `700` — Bold
310
+ - `--rui-font-weight-emphasis3`: `700` — Bold
311
+ - `--rui-font-weight-subheader`: `700` — Bold
312
+ - `--rui-font-weight-emphasis1`: `700` — Bold
313
+ - `--rui-font-weight-emphasis2`: `700` — Bold
314
+ - `--rui-font-weight-heading1`: `800` — ExtraBold
315
+ - `--rui-font-weight-heading3`: `800` — ExtraBold
316
+ - `--rui-font-weight-heading2`: `800` — ExtraBold
317
+ - `--rui-font-weight-display2`: `800` — ExtraBold
318
+ - `--rui-font-weight-display1`: `800` — ExtraBold
319
+ - `--rui-font-weight-marketing-display2`: `900` — Black
320
+ - `--rui-font-weight-marketing-display1`: `900` — Black
321
+ - `--rui-font-weight-marketing-display3`: `900` — Black
322
+
323
+ ### Full Font Size Scale
324
+
325
+ Sizes detected in the design (descending): `89.22px`, `52.61px`, `40px`, `32px`, `24px`, `18px`, `16px`, `14px`, `13.33px`, `12px`
326
+
327
+ > 7 size(s) detected outside the sampled hierarchy (52.608px, 40px, 32px, 24px, 14px, 13.3333px, 12px). These appear on elements not in the sampled set — likely additional display sizes, marketing-section overrides, or third-party-widget styles.
328
+
329
+ ## 4. Component Stylings
330
+
331
+ ### Buttons
332
+
333
+ **Icon Button**
334
+ - Background: `transparent`
335
+ - Text: `#505a63` `{colors.hairline}`
336
+ - Padding: 0px
337
+ - Radius: 12px
338
+ - Font: 16px weight 400
339
+ - Use: Toolbar/UI icons
340
+
341
+ **Light / Invert**
342
+ - Background: `#ebebf0` `{colors.surface-1}`
343
+ - Text: `#191c1f` `{colors.ink-muted}`
344
+ - Padding: 8px
345
+ - Radius: 12px
346
+ - Font: 16px weight 400
347
+ - Use: Bright CTA on dark sections
348
+
349
+ **Icon Button**
350
+ - Background: `#191c1f` `{colors.ink-muted}`
351
+ - Text: `#ffffff` `{colors.on-primary}`
352
+ - Padding: 0px 16px
353
+ - Radius: 9999px
354
+ - Font: 16px weight 400
355
+ - Use: Toolbar/UI icons
356
+
357
+ **Pill**
358
+ - Background: `transparent`
359
+ - Text: `#ffffff` `{colors.on-primary}`
360
+ - Padding: 8px 20px
361
+ - Radius: 9999px
362
+ - Font: 16px weight 500
363
+ - Use: Status pills, tags, chips
364
+
365
+ **Pill**
366
+ - Background: `#f4f4f4`
367
+ - Text: `#000000`
368
+ - Padding: 10px 26px
369
+ - Radius: 9999px
370
+ - Font: 16px weight 500
371
+ - Use: Status pills, tags, chips
372
+
373
+ **Ghost**
374
+ - Background: `transparent`
375
+ - Text: `#8d969e`
376
+ - Padding: 0px
377
+ - Radius: 12px
378
+ - Font: 12px weight 400
379
+ - Use: Subtle action, toolbar, nav button
380
+
381
+ ### Tabs
382
+
383
+ **Ghost Tab**
384
+ - Background: `transparent`
385
+ - Text: `#f4f4f4`
386
+ - Padding: 0px 20px
387
+ - Radius: 0px
388
+ - Font: 16px weight 400
389
+ - Use: Navigation tabs, filter tabs
390
+
391
+ **Pill Tab**
392
+ - Background: `#f4f4f4`
393
+ - Text: `#000000`
394
+ - Padding: 10px 26px
395
+ - Radius: 9999px
396
+ - Font: 16px weight 500
397
+ - Use: Navigation tabs, filter tabs
398
+
399
+
400
+ ## 4b. Component Behaviors (State Matrix)
401
+
402
+ ### Interaction State Narrative
403
+
404
+
405
+ *State transitions extracted via Playwright simulation — exact values in the YAML matrix below.*
406
+
407
+ ```yaml
408
+ component-behaviors:
409
+ button:
410
+ default:
411
+ bg: "rgba(0, 0, 0, 0)"
412
+ fg: "rgb(80, 90, 99)"
413
+ link:
414
+ default:
415
+ bg: "rgba(0, 0, 0, 0)"
416
+ fg: "rgb(255, 255, 255)"
417
+ navLink:
418
+ default:
419
+ bg: "rgba(0, 0, 0, 0)"
420
+ fg: "rgb(255, 255, 255)"
421
+ tab:
422
+ default:
423
+ bg: "rgb(141, 150, 158)"
424
+ fg: "rgb(0, 0, 0)"
425
+ footerLink:
426
+ default:
427
+ bg: "rgba(0, 0, 0, 0)"
428
+ fg: "rgb(25, 28, 31)"
429
+ ```
430
+
431
+ **Agent usage**: Validate generated components against this matrix. If your output's `:hover` state changes properties not listed here, you are off-brand.
432
+
433
+
434
+ ## 4c. Component Vocabulary (Closed System)
435
+
436
+ *This brand uses ONLY the following component vocabulary. Introducing new variants without justification breaks the system's tonal coherence.*
437
+
438
+ ### Buttons
439
+ - **4 shape(s)** in this system: `Icon Button`, `Light / Invert`, `Pill`, `Ghost`
440
+ - **DO NOT introduce new buttons variants** without justification
441
+
442
+ ### Tabs
443
+ - **2 shape(s)** in this system: `Ghost Tab`, `Pill Tab`
444
+ - **DO NOT introduce new tabs variants** without justification
445
+
446
+ ## 5. Layout Principles
447
+
448
+ ### Layout Type
449
+ **top-nav + content**
450
+
451
+ ### Grid
452
+ Single column, centered content
453
+
454
+ ### Max Width
455
+ 100%
456
+
457
+ ### Spacing System
458
+ Compact spacing — information density prioritized
459
+
460
+ | Token | Value |
461
+ |-------|-------|
462
+ | xxs | 2px |
463
+ | xs | 40px |
464
+ | sm | 8px |
465
+ | md | 12px |
466
+ | base | 16px |
467
+ | lg | 24px |
468
+ | xl | 32px |
469
+ | 2xl | 48px |
470
+ | 3xl | 64px |
471
+
472
+ ### Border Radius Scale
473
+ | Name | Value | Use |
474
+ |------|-------|-----|
475
+ | None | 0px | No rounding |
476
+ | Xs | 12px | Tiny corners (badges, micro elements) |
477
+ | Sm | 12px | Buttons, inputs, small elements |
478
+ | Md | 12px | Cards, containers |
479
+ | Lg | 20px | Large rounded elements, pill segments |
480
+ | Xl | 22.5px | Category strips, featured containers |
481
+ | Full | 9999px | Pills, avatars, circular elements |
482
+
483
+ ### Shape Language
484
+
485
+ | Component | Border Radius |
486
+ |-----------|---------------|
487
+ | Buttons | `12px` |
488
+ | Tabs | `0px` |
489
+ | Page Body | `0px` |
490
+
491
+ **Shape Personality**: Moderate Rounding — Medium corners (4–12px). Modern SaaS standard, neither sharp nor pill.
492
+
493
+ **Full Radius Spectrum**: 12px, 20px, 22.5px, full/pill (from `allBorderRadii` scan)
494
+
495
+
496
+ ## 5b. Spacing Rhythm Names
497
+
498
+ *Named spacing tokens with explicit use cases. Use these names in YOUR code instead of raw pixels for consistency.*
499
+
500
+ | Name | Value | Use case |
501
+ |------|-------|----------|
502
+ | **hero** | `64px` | Top/bottom of full-bleed hero sections |
503
+ | **section** | `32px` | Between major bands (color change, content shift) |
504
+ | **subsection** | `24px` | Within a section, between content groups |
505
+ | **card** | `12px` | Card padding, list-item spacing |
506
+ | **compact** | `8px` | Form fields, tight clusters, badge padding |
507
+ | **micro** | `40px` | Icon-text gap, tag inner padding |
508
+
509
+ **Agent rule**: NEVER hardcode raw pixel values for spacing in generated UI. Always reference these named tokens (`spacing-rhythm.section`, etc.).
510
+
511
+ ## 5c. Widget & Structure Library
512
+
513
+ Structural patterns extracted from the page DOM — these are the **blueprints** an agent should follow to reproduce the page architecture (not just CSS values).
514
+
515
+ **4/8 structural patterns detected.**
516
+
517
+ ### Hero Pattern
518
+
519
+ - **Composition:** centered — Centered composition — heading + subheading + CTAs stacked vertically, content centered horizontally. Common for SaaS marketing pages.
520
+ - **Viewport coverage:** 359px tall (not full-viewport)
521
+ - **Heading:** "Banking & Beyond" — 89px left-aligned
522
+ - **Subheading:** "This is your bank, redefined. Get powerful daily banking and global freedom. Sign up for free in a tap."
523
+ - **CTAs:** 1 (primary: "Download the app")
524
+ - **Clone instruction:** Reproduce the **centered** layout. Use the heading font-size token at the documented size. No imagery needed for hero — text-driven.
525
+
526
+ ### Card Grid Pattern
527
+
528
+ - **Card count:** 3 cards detected
529
+ - **Columns (desktop):** 1-up grid
530
+ - **Card dimensions:** 1425×900px (aspect 1.58:1)
531
+ - **Gap:** 0px between cards
532
+ - **Content:** ✓ image + CTA
533
+ - **Image position:** top
534
+ - **Clone instruction:** Build a 1-column grid (desktop) with cards at ~1.58:1 aspect ratio. Each card has an image at the top.
535
+
536
+ ### Pricing Table Pattern
537
+
538
+ - **Tier count:** 5 pricing tiers
539
+ - **Layout:** side-by-side (horizontal comparison)
540
+ - **Columns (desktop):** 5-up
541
+ - **Clone instruction:** Build a 5-column side-by-side pricing comparison.
542
+
543
+ ### Footer Pattern
544
+
545
+ - **Columns:** 4
546
+ - **Links:** 93 total
547
+ - **Height:** 1965px
548
+ - **Includes:** ✗ no newsletter | ✓ social icons | ✓ copyright
549
+ - **Clone instruction:** Build a 4-column footer with ~23 links per column, social media links, and a copyright line.
550
+
551
+ ## 6. Depth & Elevation
552
+
553
+ | Level | Treatment | Use |
554
+ |-------|-----------|-----|
555
+ | Flat (Level 0) | No shadow | Page background, content blocks |
556
+
557
+ **Shadow Philosophy**: Flat design — no shadows used. Borders and spacing define structure.
558
+
559
+ ## 7. Motion & Interaction
560
+
561
+ ### Easing System
562
+
563
+ | CSS Variable | Curve | Semantic Name |
564
+ |--------------|-------|---------------|
565
+ | `--rui-easing-toast` | `cubic-bezier(0.175,0.885,0.21,1.65)` | Ease Out — Decelerating |
566
+ | `--rui-easing-shadow` | `cubic-bezier(0.4,0.3,0.8,0.6)` | Custom Ease — Balanced |
567
+ | `--rui-easing-default` | `cubic-bezier(0.15,0.5,0.5,1)` | Custom Ease — Balanced |
568
+
569
+ ### Duration Scale
570
+
571
+ | CSS Variable | Value | Tier |
572
+ |--------------|-------|------|
573
+ | `--rui-duration-xl` | `900ms` | Cinematic |
574
+ | `--rui-duration-sm` | `200ms` | Normal |
575
+ | `--rui-duration-skeleton` | `1500ms` | Cinematic |
576
+ | `--rui-duration-xs` | `100ms` | Fast |
577
+ | `--rui-duration-md` | `300ms` | Normal |
578
+ | `--rui-duration-lg` | `450ms` | Slow |
579
+
580
+ ### Copy-Paste Transition Snippets
581
+
582
+ **Shadow**
583
+ ```css
584
+ transition: box-shadow 0.2s cubic-bezier(0.4, 0.3, 0.8, 0.6);
585
+ ```
586
+
587
+ **Background**
588
+ ```css
589
+ transition: background-color 0.3s cubic-bezier(0.15, 0.5, 0.5, 1), color 0.3s cubic-bezier(0.15, 0.5, 0.5, 1), opacity 0.3s cubic...;
590
+ ```
591
+
592
+ **Background**
593
+ ```css
594
+ transition: background-color 0.2s, top 0.2s, opacity 0.3s;
595
+ ```
596
+
597
+ **Color / Background**
598
+ ```css
599
+ transition: color 0.3s cubic-bezier(0.15, 0.5, 0.5, 1), background-color 0.3s cubic-bezier(0.15, 0.5, 0.5, 1);
600
+ ```
601
+
602
+ ### Motion Fingerprint
603
+
604
+ - **Speed Character**: Cinematic & Slow (median duration: `600ms`)
605
+ - **Dominant Easing**: custom cubic-bezier curves
606
+
607
+ > This design moves with cinematic & slow timing using custom cubic-bezier curves, creating a UI that feels slow and cinematic.
608
+
609
+ ## 8. Do's and Don'ts
610
+
611
+ ### Do
612
+ - Use Near Black (`#191c1f`) for text — not pure black, it's warmer and more readable
613
+ - Use Inter as the primary typeface — it defines the brand personality
614
+ - Use negative letter-spacing (-2.08px) at display sizes for compressed, editorial headlines
615
+ - Use full-pill radius (9999px) only for specific elements (avatars, pills, toggles)
616
+ - Use Brand Indigo (`#4f55f1`) as the primary accent — it's the brand's signature interactive color
617
+ - Use 12px border-radius on buttons — the standard corner rounding for interactive elements
618
+ - Keep the hero centered and text-driven — no decorative media, typography carries the message
619
+ - Use a single primary CTA in the hero — the design intentionally avoids choice paralysis
620
+ - Each card includes a top image — imagery is part of the card identity, not optional
621
+ - Place 5 pricing tiers side-by-side on desktop — direct comparison is the value prop
622
+ - Build a content-dense footer (4 columns, ~93 links) — this site treats the footer as a sitemap, not an afterthought
623
+
624
+ ### Don't
625
+ - Don't use pure black (`#000000`) for text — the near-black adds warmth
626
+ - Don't substitute with generic sans-serif or serif — the custom font carries the brand
627
+ - Don't increase letter-spacing on headings — the type is designed to run tight at scale
628
+ - Don't apply pill radius on rectangular buttons or cards — it's reserved for specific interactive elements
629
+ - Don't introduce additional saturated accent colors — the palette is intentionally controlled
630
+ - Don't add hero illustrations or photos — they'll break the typographic restraint
631
+
632
+
633
+ ## 7b. Enforceable Brand Rules
634
+
635
+ *Structured Do/Don't with reasoning and validation tests. Agents can programmatically verify generated UI.*
636
+
637
+ ```yaml
638
+ rules:
639
+ - id: brand-canvas-001
640
+ type: do
641
+ rule: "Always use the page background `rgb(255, 255, 255)` as the base canvas"
642
+ why: "Every component is designed to composit against this exact tone"
643
+ test: "document.body.style.backgroundColor === 'rgb(255, 255, 255)'"
644
+ - id: brand-accent-001
645
+ type: do
646
+ rule: "Reserve `#4f55f1` for primary CTAs and brand-mark signals only"
647
+ why: "Single chromatic assertion device — overuse dilutes meaning"
648
+ test: "querySelectorAll('[style*=\"#4f55f1\"]').length <= 3 per fold"
649
+ - id: brand-depth-001
650
+ type: dont
651
+ rule: "Do NOT introduce drop shadows on cards or sections"
652
+ why: "Containment is achieved via borders, not elevation — adding shadows breaks the depth contract"
653
+ test: "getComputedStyle(card).boxShadow === 'none'"
654
+ ```
655
+
656
+ ## 9. Responsive Behavior
657
+
658
+ ### Breakpoints
659
+ | Name | Width | Key Changes |
660
+ |------|-------|-------------|
661
+ | Mobile | 320px | Single column, compact spacing |
662
+ | Mobile | 400px | Single column, compact spacing |
663
+ | Mobile Large | 719px | Expanded mobile layout |
664
+ | Tablet | 1023px | Multi-column grids begin |
665
+ | Desktop | 1280px | Full feature layout |
666
+ | Ultra-wide | 1920px | Maximum content width |
667
+
668
+ ### Token Diff — Desktop vs Mobile
669
+
670
+ | Element | Property | Desktop | Mobile |
671
+ |---------|----------|---------|--------|
672
+ | heading | font-size | `89.216px` | `36px` |
673
+ | heading | line-height | `89.216px` | `36px` |
674
+ | heading | letter-spacing | `-2.08px` | `normal` |
675
+
676
+ ### Collapsing Strategy
677
+ - Headlines: 89.216px → 36px on mobile
678
+ - Navigation: horizontal links → hamburger menu on mobile
679
+ - Cards: multi-column → stacked vertical on mobile
680
+ - Footer: multi-column → stacked single column on mobile
681
+
682
+ ### Touch Targets
683
+ - Buttons: 0px padding
684
+ - Navigation: adequate spacing between items
685
+ - Interactive elements: minimum 44px touch target recommended
686
+
687
+ ### Collapsing Narrative
688
+
689
+ How the structural patterns adapt from desktop to mobile (extracted from both viewport extractions):
690
+
691
+ - **Pricing collapses to vertical stack** — desktop comparison becomes scrollable tier-by-tier on mobile.
692
+ - **Footer columns collapse:** 4 columns (desktop) → 1 column (mobile).
693
+
694
+ ## 9b. Visual Tone & Photography
695
+
696
+ **Tone:** Mixed photography + illustration
697
+
698
+ A balanced mix of photographic content and vector graphics. Photos likely carry product/lifestyle context while SVG handles icons, logos, and decorative accents.
699
+
700
+ **Canonical Brand Image (OG):**
701
+ - https://assets.revolut.com/website/images/img-og-retail.png (1200×630px)
702
+ *This is the image shown when the site is shared on social media — represents the brand visual essence.*
703
+
704
+ **Hero Image (above-fold dominant visual):**
705
+ - Aspect: 1.58:1 (landscape (16:9-ish))
706
+ - Rendered size: 2252×1422px
707
+ - *Use this aspect ratio + composition for your clone's hero — mimicking the proportion preserves the visual hierarchy.*
708
+
709
+ **Aspect Ratio Distribution:**
710
+ - Landscape (1.15–2.3): 10 (50%)
711
+ - Portrait (<0.87): 3 (15%)
712
+ - Square (0.87–1.15): 0 (0%)
713
+ - Ultra-wide (>2.3): 7 (35%)
714
+
715
+ **Media Format Mix:**
716
+ - PNG: 20 (logos, transparent UI elements, mockups)
717
+
718
+ **Average rendered image size:** 889×547px
719
+ **Above-fold image count:** 7 / 20
720
+
721
+ **Decorative Patterns Detected:**
722
+ - **Glassmorphism** detected (`backdrop-filter: blur`) — layered transparent surfaces with blur, modern OS-like aesthetic
723
+
724
+ **Clone instruction for decorative work:** Glassmorphism is a brand signature — use `backdrop-filter: blur(20px)` on overlapping surfaces.
725
+
726
+ **Imagery Guidance for clones:**
727
+ - Mix photography and illustration intentionally: photos for product/context, vectors for icons + decorative accents.
728
+ - Respect the format split — replacing JPGs with illustrations (or vice versa) will shift the brand tone.
729
+
730
+ ## 10. Agent Prompt Guide
731
+
732
+ ### Quick Reference
733
+ - Background: Pure White (`#ffffff`)
734
+ - Primary text: Near Black (`#191c1f`)
735
+ - Accent: Brand Indigo (`#4f55f1`)
736
+ - Border: Slate (`#505a63`)
737
+ - Font: Inter
738
+ - Body: 16px weight 400
739
+
740
+ ### Example Component Prompts
741
+ - "Create a hero section on Pure White background (#ffffff). Headline at 89.216px Inter weight 500, line-height 1, letter-spacing -2.08px, color #191c1f."
742
+ - "Create the primary CTA button: `#4f55f1` background, `#505a63` text, 12px border-radius, 12px 24px padding, 700 weight, Inter font."
743
+ - "Build navigation: sticky on `#ffffff`. Inter 16px weight 400 for links."
744
+
745
+ ### Iteration Guide
746
+ 1. **Canvas**: Set the light canvas to Pure White (`#ffffff`) — every component is composited against this exact base.
747
+ 2. **Typography**: All type in Inter, weight range 400–900. Never exceed 900 — heavier weights break the brand's tonal restraint.
748
+ 3. **Accent**: Brand Indigo (`#4f55f1`) is the sole interactive color. On hover → Royal Blue (`#494fdf`). Use CSS transitions, not opacity/brightness filters.
749
+ 4. **Motion**: All transitions use `cubic-bezier(0.4,0.3,0.8,0.6)`. Timing: 100ms for micro-interactions, 450ms for layout changes. Never use linear for UI transitions — preserve the brand's easing personality.
750
+ 5. **Shape**: CTAs at `12px`. Apply border-radius from the extracted scale only — don't invent intermediate values.
751
+ 6. **Spacing**: Use the `--ca-space-*` token scale (40px–32px). All padding, margin, and gap values are multiples from this scale — no magic numbers.
752
+ 7. **Tokens**: Import from §11 CSS Export (`--ca-*` vars). Never hardcode hex values — always reference a token so theming remains consistent.
753
+
754
+ ## 11. CSS Design Tokens Raw Export
755
+
756
+ *Copy-paste ready `:root {}` block — all values extracted directly from the live site.*
757
+
758
+ ```css
759
+ /* Colors */
760
+ :root {
761
+ --ca-on-primary: #ffffff;
762
+ --ca-surface-1: #ebebf0;
763
+ --ca-surface-2: #edeefd;
764
+ --ca-ink-muted: #191c1f;
765
+ --ca-primary: #4f55f1;
766
+ --ca-primary-hover: #494fdf;
767
+ --ca-hairline: #505a63;
768
+ --ca-semantic-error: #e23b4a;
769
+ --ca-semantic-success: #00b88b;
770
+ --ca-semantic-warning: #ec7e00;
771
+ }
772
+
773
+ /* Typography */
774
+ :root {
775
+ --ca-font-primary: "Aeonik Pro", system-ui, sans-serif;
776
+ --ca-text-display: 89.216px;
777
+ --ca-text-body: 16px;
778
+ --ca-text-button: 16px;
779
+ }
780
+
781
+ /* Spacing & Radius */
782
+ :root {
783
+ --ca-space-xxs: 2px;
784
+ --ca-space-xs: 40px;
785
+ --ca-space-sm: 8px;
786
+ --ca-space-md: 12px;
787
+ --ca-space-base: 16px;
788
+ --ca-space-lg: 24px;
789
+ --ca-space-xl: 32px;
790
+ --ca-space-2xl: 48px;
791
+ --ca-space-3xl: 64px;
792
+ --ca-radius-none: 0px;
793
+ --ca-radius-xs: 12px;
794
+ --ca-radius-sm: 12px;
795
+ --ca-radius-md: 12px;
796
+ --ca-radius-lg: 20px;
797
+ --ca-radius-xl: 22.5px;
798
+ --ca-radius-full: 9999px;
799
+ }
800
+ ```
801
+
802
+
803
+ ## 13. Page Structure Skeleton
804
+
805
+ *The actual layout the source site uses. Reproduce these sections in order to match the site structure.*
806
+
807
+ ```yaml
808
+ page-skeleton:
809
+ - section: unknown
810
+ tag: div
811
+ height: 8814px
812
+ width: 1425px
813
+ layout: block
814
+ children: 4
815
+ - section: main-content
816
+ tag: main
817
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "beawxF"]
818
+ height: 6712px
819
+ width: 1425px
820
+ layout: block
821
+ children: 8
822
+ - section: section-3
823
+ tag: section
824
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "jlBlcU"]
825
+ height: 900px
826
+ width: 1425px
827
+ layout: block
828
+ children: 1
829
+ - section: section-4
830
+ tag: section
831
+ classes: ["Box-rui__sc-1g1k12l-0", "grpyCC"]
832
+ height: 359px
833
+ width: 1000px
834
+ layout: block
835
+ children: 1
836
+ padding: "48px 0px 24px"
837
+ - section: section-5
838
+ tag: section
839
+ classes: ["Box-rui__sc-1g1k12l-0", "cQFxcA", "frTNlw"]
840
+ height: 740px
841
+ width: 1000px
842
+ layout: flex-column justify=center
843
+ children: 3
844
+ - section: section-6
845
+ tag: section
846
+ classes: ["Box-rui__sc-1g1k12l-0", "cQFxcA"]
847
+ height: 234px
848
+ width: 1000px
849
+ layout: block
850
+ children: 1
851
+ - section: section-7
852
+ tag: section
853
+ classes: ["Box-rui__sc-1g1k12l-0", "cQFxcA"]
854
+ height: 169px
855
+ width: 1000px
856
+ layout: block
857
+ children: 1
858
+ - section: section-8
859
+ tag: section
860
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "kGgJZR"]
861
+ height: 900px
862
+ width: 1425px
863
+ layout: flex-row justify=center
864
+ children: 3
865
+ - section: section-9
866
+ tag: section
867
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "kGgJZR"]
868
+ height: 900px
869
+ width: 1425px
870
+ layout: flex-row justify=center
871
+ children: 2
872
+ - section: section-10
873
+ tag: section
874
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "kGgJZR"]
875
+ height: 900px
876
+ width: 1425px
877
+ layout: flex-row justify=center
878
+ children: 4
879
+ - section: section-11
880
+ tag: section
881
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "kGgJZR"]
882
+ height: 810px
883
+ width: 1425px
884
+ layout: flex-row justify=center
885
+ children: 1
886
+ - section: section-12
887
+ tag: section
888
+ classes: ["Box-rui__sc-1g1k12l-0", "Position-rui__sc-nh2ik7-0", "Position__Relative-rui__sc-nh2ik7-3", "kGgJZR"]
889
+ height: 900px
890
+ width: 1425px
891
+ layout: flex-row justify=center
892
+ children: 1
893
+ - section: section-13
894
+ tag: section
895
+ classes: ["Box-rui__sc-1g1k12l-0", "cQFxcA", "jztmrV"]
896
+ height: 127px
897
+ width: 1000px
898
+ layout: block
899
+ children: 1
900
+ - section: section-14
901
+ tag: section
902
+ classes: ["Box-rui__sc-1g1k12l-0", "cQFxcA", "jTezil"]
903
+ height: 127px
904
+ width: 1000px
905
+ layout: flex-column justify=center
906
+ children: 2
907
+ - section: section-15
908
+ tag: section
909
+ classes: ["Box-rui__sc-1g1k12l-0", "iKFcoh", "dJGght"]
910
+ height: 472px
911
+ width: 1000px
912
+ layout: block
913
+ children: 1
914
+ padding: "0px 0px 120px"
915
+ - section: footer
916
+ tag: footer
917
+ classes: ["Box-rui__sc-1g1k12l-0", "cQFxcA", "exkJmb"]
918
+ height: 1965px
919
+ width: 1425px
920
+ layout: flex-column justify=normal
921
+ children: 7
922
+ bg: "rgb(25, 28, 31)"
923
+ padding: "40px 220px"
924
+ - section: section-16
925
+ tag: section
926
+ classes: ["Box-rui__sc-1g1k12l-0", "cPFdEh"]
927
+ height: 496px
928
+ width: 985px
929
+ layout: block
930
+ children: 1
931
+ - section: section-17
932
+ tag: section
933
+ classes: ["Box-rui__sc-1g1k12l-0", "iKFcoh", "dJGght"]
934
+ height: 392px
935
+ width: 985px
936
+ layout: block
937
+ children: 1
938
+ - section: section-18
939
+ tag: section
940
+ classes: ["Box-rui__sc-1g1k12l-0", "iKFcoh", "dJGght"]
941
+ height: 126px
942
+ width: 985px
943
+ layout: block
944
+ children: 1
945
+ ```
946
+
947
+ **Agent rule**: rebuild sections in this order (sorted by vertical position). Match the layout primitive (grid N-col / flex direction / block).
948
+
949
+
950
+ ## 14. Copy Library (Real Content from Source)
951
+
952
+ *Actual text content extracted from the live page. Use these strings verbatim when reproducing the site — they carry the brand voice.*
953
+
954
+ ```yaml
955
+ copy:
956
+ section-headings:
957
+ - "Your salary, reimagined"
958
+ - "Join 75+ million customers worldwide and 13 million in the UK"
959
+ - "Elevate your spend"
960
+ - "Your money’s safe space"
961
+ - "Choose your plan"
962
+ - "Standard"
963
+ sub-headings:
964
+ - "Free"
965
+ ctas:
966
+ - "France"
967
+ - "Kids & Teens"
968
+ - "Physical cards"
969
+ - "Virtual cards"
970
+ - "United Kingdom"
971
+ - "Learn more and manage"
972
+ - "Accept all"
973
+ - "Reject non-essential cookies"
974
+ navigation:
975
+ - "Personal"
976
+ - "Business"
977
+ - "Company"
978
+ - "Log in"
979
+ - "Sign up"
980
+ footer-links:
981
+ - "Standard
982
+ Free
983
+
984
+ For the financial basics — everything you nee"
985
+ - "Metal
986
+ £14.99/month
987
+
988
+ For the global travellers and traders — "
989
+ - "FAQ page"
990
+ - "International Money Transfers"
991
+ - "International Transfers"
992
+ ```
993
+
994
+ **Agent rule**: reuse these exact strings when generating UI. Do NOT translate or rephrase — brand voice is preserved through the original wording.
995
+
996
+
997
+ ## 15. Asset Inventory (Image Roles & Ratios)
998
+
999
+ *Image inventory classified by role and aspect ratio. When reproducing the site, allocate this number of assets per role.*
1000
+
1001
+ ```yaml
1002
+ assets:
1003
+ hero:
1004
+ count: 1
1005
+ avg-ratio: 1.80
1006
+ common-aspect: "~16:9 landscape"
1007
+ thumbnail:
1008
+ count: 2
1009
+ avg-ratio: 1.00
1010
+ common-aspect: "~1:1 square"
1011
+ sample-alts:
1012
+ - "FR"
1013
+ - "GB"
1014
+ ```
1015
+
1016
+ **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`.
1017
+
1018
+
1019
+ ## 16. Component HTML Templates
1020
+
1021
+ *Suggested HTML markup for reproducing the key components — based on what was detected in the source DOM.*
1022
+
1023
+ ### Button (primary action)
1024
+ ```html
1025
+ <button class="btn btn-primary">
1026
+ Action
1027
+ </button>
1028
+ ```
1029
+ _Source pattern detected: padding `0px` · radius `12px` · weight `400`_
1030
+
1031
+ **Agent rule**: use these markup skeletons as the structural baseline. Apply tokens from §2-3 for visual styling.
1032
+
1033
+
1034
+ ## 12. Known Extraction Gaps
1035
+
1036
+ *Auto-detected limitations of this extraction — understand before building:*
1037
+
1038
+ - **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.
1039
+
1040
+
1041
+ ---
1042
+ ## Extraction Completeness: 49/100 (D)
1043
+
1044
+ | Category | Score | Max | Detail |
1045
+ |----------|-------|-----|--------|
1046
+ | Colors & Palette | 11 | 25 | 8 named colors |
1047
+ | Typography | 10 | 20 | 4 roles defined |
1048
+ | Components | 8 | 20 | 2 specs extracted |
1049
+ | Motion & Interaction | 5 | 15 | No keyframes, easing vars |
1050
+ | CSS Custom Properties | 10 | 10 | 300 vars |
1051
+ | Responsive Breakpoints | 5 | 5 | 6 breakpoints |
1052
+ | Variable Fonts | 0 | 5 | None detected |
1053
+
1054
+ ## 12. Known Gaps & Confidence
1055
+
1056
+ 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.
1057
+
1058
+ | Category | What's missing | Fallback strategy |
1059
+ |----------|----------------|-------------------|
1060
+ | **Keyframe animations** | No @keyframes declarations found (transitions only) | Use CSS transitions for state changes; avoid complex scroll-based animations |
1061
+ | **Dark mode** | No dark-mode CSS variables or media queries detected | Light mode is canonical; do not generate dark-mode variants unless explicitly requested |
1062
+ | **Form inputs** | No text input fields detected on this page | Use the documented border-radius + accent border on focus; 12-16px padding inside |
1063
+
1064
+ ### Per-section confidence
1065
+
1066
+ | Section | Confidence | Reason |
1067
+ |---------|------------|--------|
1068
+ | §1 Visual Theme | High | Body bg extracted via getComputedStyle() |
1069
+ | §2 Colors | High | 300 CSS vars (semantic naming requires ≥20 for high) |
1070
+ | §3 Typography | Medium | 4 typography roles inferred |
1071
+ | §4 Components | Low | 2 component variants captured |
1072
+ | §7 Motion | Medium | Transitions only |
1073
+ | §8 Do's/Don'ts | High | 17 rules generated; design-decisions.json has evidence per rule |
1074
+ | §9 Responsive | High | 6 breakpoints detected |
1075
+ | §9b Photography | High | 20 images, hero present |
1076
+
1077
+ ---
1078
+ *Generated by Clone Architect — automated Playwright extraction + design analysis.*
1079
+ *Source: https://www.revolut.com | 2026-05-30T22:28:31.610Z*
1080
+ *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.*