savant-code 0.0.22 → 0.0.24

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 (79) hide show
  1. package/README.md +5 -0
  2. package/launcher.js +192 -5
  3. package/package.json +3 -2
  4. package/savant-design-systems/SKILL.md +12 -0
  5. package/savant-design-systems/manifest.json +2541 -0
  6. package/savant-design-systems/resources/airbnb-design-analysis.json +983 -0
  7. package/savant-design-systems/resources/airtable-design-analysis.json +931 -0
  8. package/savant-design-systems/resources/apple-design-analysis.json +920 -0
  9. package/savant-design-systems/resources/binance-design-analysis.json +1068 -0
  10. package/savant-design-systems/resources/bmw-design-analysis.json +912 -0
  11. package/savant-design-systems/resources/bmw-m-design-analysis.json +824 -0
  12. package/savant-design-systems/resources/bugatti-design-analysis.json +746 -0
  13. package/savant-design-systems/resources/cal-com-design-analysis.json +913 -0
  14. package/savant-design-systems/resources/claude-design-analysis.json +1007 -0
  15. package/savant-design-systems/resources/clay-design-analysis.json +919 -0
  16. package/savant-design-systems/resources/clickhouse-design-analysis.json +926 -0
  17. package/savant-design-systems/resources/cohere-design-analysis.json +725 -0
  18. package/savant-design-systems/resources/coinbase-design-analysis.json +998 -0
  19. package/savant-design-systems/resources/composio-design-analysis.json +851 -0
  20. package/savant-design-systems/resources/cursor-design-analysis.json +934 -0
  21. package/savant-design-systems/resources/dell-1996-inspired.json +1042 -0
  22. package/savant-design-systems/resources/elevenlabs.json +551 -0
  23. package/savant-design-systems/resources/expo-design-analysis.json +879 -0
  24. package/savant-design-systems/resources/ferrari-design-analysis.json +874 -0
  25. package/savant-design-systems/resources/figma-design-analysis.json +928 -0
  26. package/savant-design-systems/resources/framer-design-analysis.json +891 -0
  27. package/savant-design-systems/resources/hashicorp-design-analysis.json +909 -0
  28. package/savant-design-systems/resources/hp-design-analysis.json +1077 -0
  29. package/savant-design-systems/resources/ibm-design-analysis.json +881 -0
  30. package/savant-design-systems/resources/intercom-design-analysis.json +876 -0
  31. package/savant-design-systems/resources/kraken.json +172 -0
  32. package/savant-design-systems/resources/lamborghini.json +335 -0
  33. package/savant-design-systems/resources/linear-design-analysis.json +890 -0
  34. package/savant-design-systems/resources/lovable.json +345 -0
  35. package/savant-design-systems/resources/mastercard.json +412 -0
  36. package/savant-design-systems/resources/meta-design-analysis.json +1121 -0
  37. package/savant-design-systems/resources/minimax-design-analysis.json +1220 -0
  38. package/savant-design-systems/resources/mintlify-design-analysis.json +1418 -0
  39. package/savant-design-systems/resources/miro-design-analysis.json +1364 -0
  40. package/savant-design-systems/resources/mistral-ai-design-analysis.json +1286 -0
  41. package/savant-design-systems/resources/mongodb-design-analysis.json +1276 -0
  42. package/savant-design-systems/resources/nike-design-analysis.json +938 -0
  43. package/savant-design-systems/resources/nintendo-com-2001-analysis.json +1082 -0
  44. package/savant-design-systems/resources/notion-design-analysis.json +1368 -0
  45. package/savant-design-systems/resources/nvidia-design-analysis.json +1023 -0
  46. package/savant-design-systems/resources/ollama-design-analysis.json +863 -0
  47. package/savant-design-systems/resources/opencode-design-analysis.json +806 -0
  48. package/savant-design-systems/resources/pinterest-design-analysis.json +953 -0
  49. package/savant-design-systems/resources/playstation-design-analysis.json +1053 -0
  50. package/savant-design-systems/resources/posthog-design-analysis.json +1146 -0
  51. package/savant-design-systems/resources/raycast.json +716 -0
  52. package/savant-design-systems/resources/renault-design-analysis.json +916 -0
  53. package/savant-design-systems/resources/replicate-design-analysis.json +986 -0
  54. package/savant-design-systems/resources/resend-design-analysis.json +942 -0
  55. package/savant-design-systems/resources/revolut-design-analysis.json +1008 -0
  56. package/savant-design-systems/resources/runwayml.json +291 -0
  57. package/savant-design-systems/resources/sanity.json +404 -0
  58. package/savant-design-systems/resources/sentri-inspired-design-analysis.json +953 -0
  59. package/savant-design-systems/resources/shopifi-inspired-design-analysis.json +921 -0
  60. package/savant-design-systems/resources/slacc-inspired-design-analysis.json +799 -0
  61. package/savant-design-systems/resources/spacex-inspired-design-analysis.json +598 -0
  62. package/savant-design-systems/resources/spotify.json +293 -0
  63. package/savant-design-systems/resources/starbucks.json +627 -0
  64. package/savant-design-systems/resources/stripi-inspired-design-analysis.json +805 -0
  65. package/savant-design-systems/resources/supabase.json +509 -0
  66. package/savant-design-systems/resources/superhumon-inspired-design-analysis.json +740 -0
  67. package/savant-design-systems/resources/tesla.json +333 -0
  68. package/savant-design-systems/resources/theverge.json +386 -0
  69. package/savant-design-systems/resources/together-ai-inspired-design-analysis.json +1099 -0
  70. package/savant-design-systems/resources/uber-inspired-design-analysis.json +1067 -0
  71. package/savant-design-systems/resources/vercel-inspired-design-analysis.json +1261 -0
  72. package/savant-design-systems/resources/vodafone-inspired-design-analysis.json +912 -0
  73. package/savant-design-systems/resources/voltagent-inspired-design-analysis.json +929 -0
  74. package/savant-design-systems/resources/warp-inspired-design-analysis.json +946 -0
  75. package/savant-design-systems/resources/webflow-inspired-design-analysis.json +1033 -0
  76. package/savant-design-systems/resources/wired-inspired-design-analysis.json +877 -0
  77. package/savant-design-systems/resources/wise-inspired-design-analysis.json +916 -0
  78. package/savant-design-systems/resources/xai-inspired-design-analysis.json +820 -0
  79. package/savant-design-systems/resources/zapier-inspired-design-analysis.json +915 -0
@@ -0,0 +1,912 @@
1
+ {
2
+ "schemaVersion": "1",
3
+ "id": "vodafone-inspired-design-analysis",
4
+ "displayName": "Vodafone-Inspired-design-analysis",
5
+ "description": "An inspired interpretation of Vodafone's design language — a telecom super-brand whose web surface alternates between editorial photography hero bands with massive uppercase display headlines and clean white content bands, anchored by the company's signature scarlet red CTA and the proprietary Vodafone display sans set at impossibly heavy 800 weight.",
6
+ "source": "embedded",
7
+ "status": "curated-reference",
8
+ "targets": [
9
+ "terminal",
10
+ "react",
11
+ "web"
12
+ ],
13
+ "contentPath": "packages/design-systems/library/vodafone.design.md",
14
+ "sourceContentHash": "293a40951e654283978fa744b24177a159d8f2a60f402bc735bf081618af0ef6",
15
+ "normalizedContentHash": "bda36a869308457a79f67f41e0b9aefd1685c35a93a82402c4d19e656c4e6408",
16
+ "provenance": {
17
+ "sourceRepository": "VoltAgent/awesome-design-md",
18
+ "sourceRevision": "working-tree-curated-snapshot",
19
+ "sourcePath": "packages/design-systems/library/vodafone.design.md",
20
+ "license": "MIT"
21
+ },
22
+ "fonts": [
23
+ {
24
+ "family": "Arial",
25
+ "fallback": [
26
+ "system-ui",
27
+ "sans-serif"
28
+ ],
29
+ "redistributable": false
30
+ },
31
+ {
32
+ "family": "Helvetica Neue",
33
+ "fallback": [
34
+ "system-ui",
35
+ "sans-serif"
36
+ ],
37
+ "redistributable": false
38
+ },
39
+ {
40
+ "family": "Vodafone",
41
+ "fallback": [
42
+ "system-ui",
43
+ "sans-serif"
44
+ ],
45
+ "redistributable": false
46
+ },
47
+ {
48
+ "family": "Vodafone Rg",
49
+ "fallback": [
50
+ "system-ui",
51
+ "sans-serif"
52
+ ],
53
+ "redistributable": false
54
+ }
55
+ ],
56
+ "tokens": {
57
+ "colors": {
58
+ "body": "#7e7e7e",
59
+ "canvas": "#ffffff",
60
+ "canvas-soft": "#f2f2f2",
61
+ "ink": "#25282b",
62
+ "mute": "#bebebe",
63
+ "on-dark": "#ffffff",
64
+ "on-primary": "#ffffff",
65
+ "primary": "#e60000"
66
+ },
67
+ "typography": {
68
+ "display-hero": {
69
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
70
+ "fontSize": "144px",
71
+ "fontWeight": 800,
72
+ "letterSpacing": "-1px",
73
+ "lineHeight": "114px"
74
+ },
75
+ "display-xxl": {
76
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
77
+ "fontSize": "126px",
78
+ "fontWeight": 800,
79
+ "letterSpacing": "-1px",
80
+ "lineHeight": "113px"
81
+ },
82
+ "display-xl": {
83
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
84
+ "fontSize": "90px",
85
+ "fontWeight": 800,
86
+ "lineHeight": "84px"
87
+ },
88
+ "display-lg": {
89
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
90
+ "fontSize": "48px",
91
+ "fontWeight": 300,
92
+ "lineHeight": "52px"
93
+ },
94
+ "display-md": {
95
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
96
+ "fontSize": "40px",
97
+ "fontWeight": 300,
98
+ "lineHeight": "44px"
99
+ },
100
+ "display-sm": {
101
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
102
+ "fontSize": "32px",
103
+ "fontWeight": 700,
104
+ "lineHeight": "40px"
105
+ },
106
+ "display-xs": {
107
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
108
+ "fontSize": "24px",
109
+ "fontWeight": 700,
110
+ "lineHeight": "24px"
111
+ },
112
+ "eyebrow-uppercase": {
113
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
114
+ "fontSize": "16px",
115
+ "fontWeight": 800,
116
+ "lineHeight": "24px"
117
+ },
118
+ "body-lg": {
119
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
120
+ "fontSize": "22px",
121
+ "fontWeight": 400,
122
+ "lineHeight": "24px"
123
+ },
124
+ "body-md": {
125
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
126
+ "fontSize": "18px",
127
+ "fontWeight": 400,
128
+ "lineHeight": "28px"
129
+ },
130
+ "body-md-strong": {
131
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
132
+ "fontSize": "18px",
133
+ "fontWeight": 600,
134
+ "lineHeight": "28px"
135
+ },
136
+ "body-sm": {
137
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
138
+ "fontSize": "16px",
139
+ "fontWeight": 400,
140
+ "lineHeight": "20px"
141
+ },
142
+ "body-sm-strong": {
143
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
144
+ "fontSize": "16px",
145
+ "fontWeight": 700,
146
+ "lineHeight": "22px"
147
+ },
148
+ "caption": {
149
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
150
+ "fontSize": "14px",
151
+ "fontWeight": 400,
152
+ "lineHeight": "16px"
153
+ },
154
+ "caption-strong": {
155
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
156
+ "fontSize": "14px",
157
+ "fontWeight": 700,
158
+ "lineHeight": "21px"
159
+ },
160
+ "caption-uppercase": {
161
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
162
+ "fontSize": "12px",
163
+ "fontWeight": 600,
164
+ "letterSpacing": "0.5691px",
165
+ "lineHeight": "16px"
166
+ },
167
+ "button-md": {
168
+ "fontFamily": "Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif",
169
+ "fontSize": "18px",
170
+ "fontWeight": 400,
171
+ "lineHeight": "28px"
172
+ }
173
+ },
174
+ "spacing": {
175
+ "2xl": "24px",
176
+ "3xl": "32px",
177
+ "lg": "16px",
178
+ "md": "12px",
179
+ "sm": "8px",
180
+ "xl": "20px",
181
+ "xs": "4px",
182
+ "xxs": "2px"
183
+ },
184
+ "radius": {
185
+ "card": "6px",
186
+ "full": "9999px",
187
+ "none": "0px",
188
+ "pill-lg": "60px",
189
+ "pill-md": "32px",
190
+ "sm": "6px",
191
+ "xs": "1px"
192
+ },
193
+ "components": {
194
+ "nav-bar": {
195
+ "backgroundColor": "{colors.ink}",
196
+ "padding": "{spacing.lg} {spacing.3xl}",
197
+ "textColor": "{colors.on-dark}",
198
+ "typography": "{typography.body-sm}"
199
+ },
200
+ "nav-link": {
201
+ "textColor": "{colors.on-dark}",
202
+ "typography": "{typography.body-sm}"
203
+ },
204
+ "button-primary": {
205
+ "backgroundColor": "{colors.primary}",
206
+ "borderColor": "{colors.primary}",
207
+ "padding": "{spacing.md} {spacing.2xl}",
208
+ "rounded": "{rounded.pill-lg}",
209
+ "textColor": "{colors.on-primary}",
210
+ "typography": "{typography.button-md}"
211
+ },
212
+ "button-outline-red": {
213
+ "backgroundColor": "{colors.canvas}",
214
+ "borderColor": "{colors.primary}",
215
+ "padding": "{spacing.md} {spacing.2xl}",
216
+ "rounded": "{rounded.pill-lg}",
217
+ "textColor": "{colors.primary}",
218
+ "typography": "{typography.button-md}"
219
+ },
220
+ "button-outline-dark": {
221
+ "backgroundColor": "{colors.canvas}",
222
+ "borderColor": "{colors.ink}",
223
+ "padding": "{spacing.md} {spacing.2xl}",
224
+ "rounded": "{rounded.pill-lg}",
225
+ "textColor": "{colors.ink}",
226
+ "typography": "{typography.button-md}"
227
+ },
228
+ "button-icon-circular": {
229
+ "backgroundColor": "{colors.canvas}",
230
+ "borderColor": "{colors.canvas}",
231
+ "rounded": "{rounded.full}",
232
+ "textColor": "{colors.ink}"
233
+ },
234
+ "text-input": {
235
+ "backgroundColor": "{colors.canvas}",
236
+ "borderColor": "{colors.ink}",
237
+ "padding": "{spacing.md} {spacing.lg}",
238
+ "rounded": "{rounded.sm}",
239
+ "textColor": "{colors.ink}",
240
+ "typography": "{typography.body-sm}"
241
+ },
242
+ "badge-chip": {
243
+ "backgroundColor": "{colors.canvas-soft}",
244
+ "padding": "{spacing.xs} {spacing.md}",
245
+ "rounded": "{rounded.pill-md}",
246
+ "textColor": "{colors.ink}",
247
+ "typography": "{typography.caption-strong}"
248
+ },
249
+ "card-content": {
250
+ "backgroundColor": "{colors.canvas}",
251
+ "padding": "{spacing.lg}",
252
+ "rounded": "{rounded.card}",
253
+ "textColor": "{colors.ink}",
254
+ "typography": "{typography.body-md}"
255
+ },
256
+ "card-hero": {
257
+ "backgroundColor": "{colors.canvas}",
258
+ "padding": "{spacing.lg}",
259
+ "rounded": "{rounded.card}",
260
+ "textColor": "{colors.ink}",
261
+ "typography": "{typography.display-sm}"
262
+ },
263
+ "hero-band-dark": {
264
+ "backgroundColor": "{colors.ink}",
265
+ "padding": "{spacing.3xl} {spacing.3xl}",
266
+ "textColor": "{colors.on-dark}",
267
+ "typography": "{typography.display-hero}"
268
+ },
269
+ "hero-band-red": {
270
+ "backgroundColor": "{colors.primary}",
271
+ "padding": "{spacing.3xl} {spacing.3xl}",
272
+ "textColor": "{colors.on-primary}",
273
+ "typography": "{typography.display-xl}"
274
+ },
275
+ "content-band-light": {
276
+ "backgroundColor": "{colors.canvas}",
277
+ "padding": "{spacing.3xl} {spacing.3xl}",
278
+ "textColor": "{colors.ink}",
279
+ "typography": "{typography.display-md}"
280
+ },
281
+ "speechmark-logo-orb": {
282
+ "backgroundColor": "{colors.primary}",
283
+ "rounded": "{rounded.sm}",
284
+ "textColor": "{colors.on-primary}"
285
+ },
286
+ "divider-on-dark": {
287
+ "borderColor": "{colors.on-dark}"
288
+ },
289
+ "footer": {
290
+ "backgroundColor": "{colors.ink}",
291
+ "padding": "{spacing.3xl} {spacing.3xl}",
292
+ "textColor": "{colors.on-dark}",
293
+ "typography": "{typography.body-sm}"
294
+ },
295
+ "ex-pricing-tier": {
296
+ "backgroundColor": "{colors.canvas-soft}",
297
+ "borderColor": "{colors.mute}",
298
+ "description": "Default tier card. Mirrors card-content chrome with canvas-soft surface and a hairline border.",
299
+ "padding": "{spacing.lg}",
300
+ "rounded": "{rounded.card}",
301
+ "textColor": "{colors.ink}"
302
+ },
303
+ "ex-pricing-tier-featured": {
304
+ "backgroundColor": "{colors.ink}",
305
+ "description": "Featured tier — polarity-flipped to ink with white text and white pill CTA inside.",
306
+ "padding": "{spacing.lg}",
307
+ "rounded": "{rounded.card}",
308
+ "textColor": "{colors.on-primary}"
309
+ },
310
+ "ex-product-selector": {
311
+ "backgroundColor": "{colors.canvas-soft}",
312
+ "description": "Tariff-tier picker — repurposed as the brand's plan selector with badge-chip chips inside the frame.",
313
+ "padding": "{spacing.lg}",
314
+ "rounded": "{rounded.card}"
315
+ },
316
+ "ex-cart-drawer": {
317
+ "backgroundColor": "{colors.canvas}",
318
+ "description": "Subscription summary — line items per tariff add-on, light hairline dividers.",
319
+ "item-divider": "{colors.mute}",
320
+ "padding": "{spacing.lg}",
321
+ "rounded": "{rounded.card}"
322
+ },
323
+ "ex-app-shell-row": {
324
+ "activeIndicator": "{colors.primary}",
325
+ "backgroundColor": "{colors.canvas}",
326
+ "description": "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar.",
327
+ "padding": "{spacing.md} {spacing.lg}",
328
+ "rounded": "{rounded.sm}"
329
+ },
330
+ "ex-data-table-cell": {
331
+ "bodyTypography": "{typography.body-sm}",
332
+ "cellPadding": "{spacing.md} {spacing.lg}",
333
+ "description": "Default data-table cell chrome. Header uses caption-uppercase mono-style eyebrow; body uses body-sm.",
334
+ "headerBackground": "{colors.canvas-soft}",
335
+ "headerTypography": "{typography.caption-uppercase}",
336
+ "rowBorder": "{colors.mute}"
337
+ },
338
+ "ex-auth-form-card": {
339
+ "backgroundColor": "{colors.canvas-soft}",
340
+ "description": "Sign-in / sign-up card. Mirrors card-content chrome with text-input primitives inside.",
341
+ "padding": "{spacing.lg}",
342
+ "rounded": "{rounded.card}"
343
+ },
344
+ "ex-modal-card": {
345
+ "backgroundColor": "{colors.canvas}",
346
+ "description": "Modal dialog surface — same chrome as card-content; brand uses scrim, not card shadow.",
347
+ "padding": "{spacing.lg}",
348
+ "rounded": "{rounded.card}"
349
+ },
350
+ "ex-empty-state-card": {
351
+ "backgroundColor": "{colors.canvas-soft}",
352
+ "captionTypography": "{typography.body-md}",
353
+ "description": "Empty-state illustration frame on canvas-soft with generous interior padding.",
354
+ "padding": "{spacing.3xl}",
355
+ "rounded": "{rounded.card}"
356
+ },
357
+ "ex-toast": {
358
+ "backgroundColor": "{colors.canvas}",
359
+ "description": "Toast notification surface — card-content shape with caption-strong body.",
360
+ "padding": "{spacing.md} {spacing.lg}",
361
+ "rounded": "{rounded.sm}",
362
+ "typography": "{typography.body-sm}"
363
+ }
364
+ },
365
+ "extensions": {
366
+ "description": "An inspired interpretation of Vodafone's design language — a telecom super-brand whose web surface alternates between editorial photography hero bands with massive uppercase display headlines and clean white content bands, anchored by the company's signature scarlet red CTA and the proprietary Vodafone display sans set at impossibly heavy 800 weight.",
367
+ "name": "Vodafone-Inspired-design-analysis",
368
+ "version": "alpha"
369
+ }
370
+ }
371
+ }
372
+
373
+ ---
374
+
375
+ ---
376
+ version: alpha
377
+ name: Vodafone-Inspired-design-analysis
378
+ description: An inspired interpretation of Vodafone's design language — a telecom super-brand whose web surface alternates between editorial photography hero bands with massive uppercase display headlines and clean white content bands, anchored by the company's signature scarlet red CTA and the proprietary Vodafone display sans set at impossibly heavy 800 weight.
379
+
380
+ colors:
381
+ primary: "#e60000"
382
+ on-primary: "#ffffff"
383
+ ink: "#25282b"
384
+ body: "#7e7e7e"
385
+ mute: "#bebebe"
386
+ canvas: "#ffffff"
387
+ canvas-soft: "#f2f2f2"
388
+ on-dark: "#ffffff"
389
+
390
+ typography:
391
+ display-hero:
392
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
393
+ fontSize: 144px
394
+ fontWeight: 800
395
+ lineHeight: 114px
396
+ letterSpacing: -1px
397
+ display-xxl:
398
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
399
+ fontSize: 126px
400
+ fontWeight: 800
401
+ lineHeight: 113px
402
+ letterSpacing: -1px
403
+ display-xl:
404
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
405
+ fontSize: 90px
406
+ fontWeight: 800
407
+ lineHeight: 84px
408
+ display-lg:
409
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
410
+ fontSize: 48px
411
+ fontWeight: 300
412
+ lineHeight: 52px
413
+ display-md:
414
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
415
+ fontSize: 40px
416
+ fontWeight: 300
417
+ lineHeight: 44px
418
+ display-sm:
419
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
420
+ fontSize: 32px
421
+ fontWeight: 700
422
+ lineHeight: 40px
423
+ display-xs:
424
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
425
+ fontSize: 24px
426
+ fontWeight: 700
427
+ lineHeight: 24px
428
+ eyebrow-uppercase:
429
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
430
+ fontSize: 16px
431
+ fontWeight: 800
432
+ lineHeight: 24px
433
+ body-lg:
434
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
435
+ fontSize: 22px
436
+ fontWeight: 400
437
+ lineHeight: 24px
438
+ body-md:
439
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
440
+ fontSize: 18px
441
+ fontWeight: 400
442
+ lineHeight: 28px
443
+ body-md-strong:
444
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
445
+ fontSize: 18px
446
+ fontWeight: 600
447
+ lineHeight: 28px
448
+ body-sm:
449
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
450
+ fontSize: 16px
451
+ fontWeight: 400
452
+ lineHeight: 20px
453
+ body-sm-strong:
454
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
455
+ fontSize: 16px
456
+ fontWeight: 700
457
+ lineHeight: 22px
458
+ caption:
459
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
460
+ fontSize: 14px
461
+ fontWeight: 400
462
+ lineHeight: 16px
463
+ caption-strong:
464
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
465
+ fontSize: 14px
466
+ fontWeight: 700
467
+ lineHeight: 21px
468
+ caption-uppercase:
469
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
470
+ fontSize: 12px
471
+ fontWeight: 600
472
+ lineHeight: 16px
473
+ letterSpacing: 0.5691px
474
+ button-md:
475
+ fontFamily: Vodafone, Vodafone Rg, Helvetica Neue, Arial, sans-serif
476
+ fontSize: 18px
477
+ fontWeight: 400
478
+ lineHeight: 28px
479
+
480
+ rounded:
481
+ none: 0px
482
+ xs: 1px
483
+ sm: 6px
484
+ card: 6px
485
+ pill-md: 32px
486
+ pill-lg: 60px
487
+ full: 9999px
488
+
489
+ spacing:
490
+ xxs: 2px
491
+ xs: 4px
492
+ sm: 8px
493
+ md: 12px
494
+ lg: 16px
495
+ xl: 20px
496
+ 2xl: 24px
497
+ 3xl: 32px
498
+
499
+ components:
500
+ nav-bar:
501
+ backgroundColor: "{colors.ink}"
502
+ textColor: "{colors.on-dark}"
503
+ typography: "{typography.body-sm}"
504
+ padding: "{spacing.lg} {spacing.3xl}"
505
+ nav-link:
506
+ textColor: "{colors.on-dark}"
507
+ typography: "{typography.body-sm}"
508
+ button-primary:
509
+ backgroundColor: "{colors.primary}"
510
+ textColor: "{colors.on-primary}"
511
+ borderColor: "{colors.primary}"
512
+ typography: "{typography.button-md}"
513
+ rounded: "{rounded.pill-lg}"
514
+ padding: "{spacing.md} {spacing.2xl}"
515
+ button-outline-red:
516
+ backgroundColor: "{colors.canvas}"
517
+ textColor: "{colors.primary}"
518
+ borderColor: "{colors.primary}"
519
+ typography: "{typography.button-md}"
520
+ rounded: "{rounded.pill-lg}"
521
+ padding: "{spacing.md} {spacing.2xl}"
522
+ button-outline-dark:
523
+ backgroundColor: "{colors.canvas}"
524
+ textColor: "{colors.ink}"
525
+ borderColor: "{colors.ink}"
526
+ typography: "{typography.button-md}"
527
+ rounded: "{rounded.pill-lg}"
528
+ padding: "{spacing.md} {spacing.2xl}"
529
+ button-icon-circular:
530
+ backgroundColor: "{colors.canvas}"
531
+ textColor: "{colors.ink}"
532
+ borderColor: "{colors.canvas}"
533
+ rounded: "{rounded.full}"
534
+ text-input:
535
+ backgroundColor: "{colors.canvas}"
536
+ textColor: "{colors.ink}"
537
+ borderColor: "{colors.ink}"
538
+ typography: "{typography.body-sm}"
539
+ rounded: "{rounded.sm}"
540
+ padding: "{spacing.md} {spacing.lg}"
541
+ badge-chip:
542
+ backgroundColor: "{colors.canvas-soft}"
543
+ textColor: "{colors.ink}"
544
+ typography: "{typography.caption-strong}"
545
+ rounded: "{rounded.pill-md}"
546
+ padding: "{spacing.xs} {spacing.md}"
547
+ card-content:
548
+ backgroundColor: "{colors.canvas}"
549
+ textColor: "{colors.ink}"
550
+ typography: "{typography.body-md}"
551
+ rounded: "{rounded.card}"
552
+ padding: "{spacing.lg}"
553
+ card-hero:
554
+ backgroundColor: "{colors.canvas}"
555
+ textColor: "{colors.ink}"
556
+ typography: "{typography.display-sm}"
557
+ rounded: "{rounded.card}"
558
+ padding: "{spacing.lg}"
559
+ hero-band-dark:
560
+ backgroundColor: "{colors.ink}"
561
+ textColor: "{colors.on-dark}"
562
+ typography: "{typography.display-hero}"
563
+ padding: "{spacing.3xl} {spacing.3xl}"
564
+ hero-band-red:
565
+ backgroundColor: "{colors.primary}"
566
+ textColor: "{colors.on-primary}"
567
+ typography: "{typography.display-xl}"
568
+ padding: "{spacing.3xl} {spacing.3xl}"
569
+ content-band-light:
570
+ backgroundColor: "{colors.canvas}"
571
+ textColor: "{colors.ink}"
572
+ typography: "{typography.display-md}"
573
+ padding: "{spacing.3xl} {spacing.3xl}"
574
+ speechmark-logo-orb:
575
+ backgroundColor: "{colors.primary}"
576
+ textColor: "{colors.on-primary}"
577
+ rounded: "{rounded.sm}"
578
+ divider-on-dark:
579
+ borderColor: "{colors.on-dark}"
580
+ footer:
581
+ backgroundColor: "{colors.ink}"
582
+ textColor: "{colors.on-dark}"
583
+ typography: "{typography.body-sm}"
584
+ padding: "{spacing.3xl} {spacing.3xl}"
585
+
586
+ # ─── Examples (illustrative) — auto-derived; resolve any TO_FILL markers below ───
587
+ ex-pricing-tier:
588
+ description: "Default tier card. Mirrors card-content chrome with canvas-soft surface and a hairline border."
589
+ backgroundColor: "{colors.canvas-soft}"
590
+ textColor: "{colors.ink}"
591
+ borderColor: "{colors.mute}"
592
+ rounded: "{rounded.card}"
593
+ padding: "{spacing.lg}"
594
+ ex-pricing-tier-featured:
595
+ description: "Featured tier — polarity-flipped to ink with white text and white pill CTA inside."
596
+ backgroundColor: "{colors.ink}"
597
+ textColor: "{colors.on-primary}"
598
+ rounded: "{rounded.card}"
599
+ padding: "{spacing.lg}"
600
+ ex-product-selector:
601
+ description: "Tariff-tier picker — repurposed as the brand's plan selector with badge-chip chips inside the frame."
602
+ backgroundColor: "{colors.canvas-soft}"
603
+ rounded: "{rounded.card}"
604
+ padding: "{spacing.lg}"
605
+ ex-cart-drawer:
606
+ description: "Subscription summary — line items per tariff add-on, light hairline dividers."
607
+ backgroundColor: "{colors.canvas}"
608
+ rounded: "{rounded.card}"
609
+ padding: "{spacing.lg}"
610
+ item-divider: "{colors.mute}"
611
+ ex-app-shell-row:
612
+ description: "Sidebar nav row. Active state uses brand primary as a left-edge indicator bar."
613
+ backgroundColor: "{colors.canvas}"
614
+ activeIndicator: "{colors.primary}"
615
+ rounded: "{rounded.sm}"
616
+ padding: "{spacing.md} {spacing.lg}"
617
+ ex-data-table-cell:
618
+ description: "Default data-table cell chrome. Header uses caption-uppercase mono-style eyebrow; body uses body-sm."
619
+ headerBackground: "{colors.canvas-soft}"
620
+ headerTypography: "{typography.caption-uppercase}"
621
+ bodyTypography: "{typography.body-sm}"
622
+ cellPadding: "{spacing.md} {spacing.lg}"
623
+ rowBorder: "{colors.mute}"
624
+ ex-auth-form-card:
625
+ description: "Sign-in / sign-up card. Mirrors card-content chrome with text-input primitives inside."
626
+ backgroundColor: "{colors.canvas-soft}"
627
+ rounded: "{rounded.card}"
628
+ padding: "{spacing.lg}"
629
+ ex-modal-card:
630
+ description: "Modal dialog surface — same chrome as card-content; brand uses scrim, not card shadow."
631
+ backgroundColor: "{colors.canvas}"
632
+ rounded: "{rounded.card}"
633
+ padding: "{spacing.lg}"
634
+ ex-empty-state-card:
635
+ description: "Empty-state illustration frame on canvas-soft with generous interior padding."
636
+ backgroundColor: "{colors.canvas-soft}"
637
+ rounded: "{rounded.card}"
638
+ padding: "{spacing.3xl}"
639
+ captionTypography: "{typography.body-md}"
640
+ ex-toast:
641
+ description: "Toast notification surface — card-content shape with caption-strong body."
642
+ backgroundColor: "{colors.canvas}"
643
+ rounded: "{rounded.sm}"
644
+ padding: "{spacing.md} {spacing.lg}"
645
+ typography: "{typography.body-sm}"
646
+
647
+ ---
648
+
649
+
650
+ ## Overview
651
+
652
+ Vodafone is a global telecom super-brand and its web surface delivers exactly that posture: heroic editorial photography, occasionally cropping a portrait so tight only an eye line and a phone hand are visible, with a single colossal uppercase headline floating on top in the brand's proprietary heavy display weight. The page reads like a campaign poster more than a corporate site, then breaks into a calmer content rhythm of light-canvas story cards and a single red marker (the iconic speechmark logo) drawing the eye to the brand's centre of gravity. There is no second accent colour competing — the entire decorative palette is `{colors.primary}` Vodafone red, near-black `{colors.ink}`, and the surrounding white and grayscale neutrals.
653
+
654
+ Type is the second decisive voice. Vodafone's custom display sans (extracted as `Vodafone`) carries every headline at impossibly heavy weight 800 in upper case for hero scale (`{typography.display-hero}` 144 px, `{typography.display-xxl}` 126 px) and at lighter weight 300 for the sub-displays that follow. Body text stays in the same family at weight 400 with neutral tracking. The contrast between display weight 800 and display weight 300 IS the brand's typographic story: a shout, then a calm sentence.
655
+
656
+ Every interactive CTA renders as a generously rounded pill (`{rounded.pill-lg}` 60 px) — Vodafone has never used a square button on its marketing surface in years, and the brand's pill scale ladder runs from 32 px (badge pills) through 60 px (CTA pills) up to 9999 px (icon circular containers). Cards stay gentler at `{rounded.card}` 6 px.
657
+
658
+ **Key Characteristics:**
659
+ - A single primary CTA color `{colors.primary}` (`#e60000`) — Vodafone Red. Pill-filled for primary, pill-outline for secondary. No third button variant.
660
+ - Massive uppercase display weight 800 (`{typography.display-hero}` and siblings) is the brand's signature. The 300-weight headline siblings (`{typography.display-lg}` / `{typography.display-md}`) handle calmer secondary moments.
661
+ - The `speechmark-logo-orb` — a red square hosting Vodafone's quotation-mark icon — is the only piece of decorative chrome that's not a CTA. It anchors the brand's centre of every page.
662
+ - Pill geometry on every interactive shape — `{rounded.pill-lg}` 60 px for buttons, `{rounded.pill-md}` 32 px for inline badges. Card chrome stays at `{rounded.card}` 6 px.
663
+ - A two-band page rhythm — `{colors.ink}` dark hero / `{colors.canvas}` light content. No mid-band greys; the brand uses surface contrast, not soft neutrals, for elevation.
664
+ - Editorial photography (real portraits, real cities, real cabling) is the only consistent decorative system — no illustration, no atmospheric gradients.
665
+
666
+ ## Colors
667
+
668
+ ### Brand & Accent
669
+ - **Vodafone Red** (`{colors.primary}` — `#e60000`): The single brand accent. Every primary CTA pill, every speechmark logo, every conversion target. The most iconic red in telecom — never desaturated, never used at scale for body fills (reserved for high-attention surfaces).
670
+
671
+ ### Surface
672
+ - **Canvas** (`{colors.canvas}` — `#ffffff`): The default light content background.
673
+ - **Canvas Soft** (`{colors.canvas-soft}` — `#f2f2f2`): A near-white tint used as the badge-chip background.
674
+ - **Ink** (`{colors.ink}` — `#25282b`): The brand's near-black surface — used as the dark hero band, the nav background, and the footer fill. Doubles as the primary text color on light surfaces.
675
+
676
+ ### Text
677
+ - **Ink** (`{colors.ink}` — `#25282b`): Every heading and body paragraph on light surfaces.
678
+ - **Body** (`{colors.body}` — `#7e7e7e`): Secondary body text on light surfaces — captions, metadata, supporting copy.
679
+ - **Mute** (`{colors.mute}` — `#bebebe`): The lowest-priority text color — placeholder text, low-key footer links.
680
+ - **On Dark** (`{colors.on-dark}` — `#ffffff`): All text on `{colors.ink}` surfaces (hero, footer, nav).
681
+
682
+ ### Semantic
683
+ The brand does not maintain a separate semantic palette. The primary red doubles as validation / destructive signal when needed; success / warning use are reserved for in-product contexts and are not part of the documented marketing system.
684
+
685
+ ## Typography
686
+
687
+ ### Font Family
688
+ A single custom face carries the entire system: **Vodafone**, the brand's proprietary display sans. The face spans weights 300 (light), 400 (regular), 600, 700, and 800 — every role in the system pulls from this one family. There is no mono companion; technical labels (rare on the marketing surface) borrow the same face at smaller sizes.
689
+
690
+ The icomoon icon-font is loaded for proprietary glyphs but does not render as a typographic role.
691
+
692
+ ### Hierarchy
693
+
694
+ | Token | Size | Weight | Line Height | Letter Spacing | Use |
695
+ |---|---|---|---|---|---|
696
+ | `{typography.display-hero}` | 144px | 800 | 114px | -1px | The hero stencil (`"STAY CONNECTED"`) — uppercase, ultra-tight tracking, brand's signature size. |
697
+ | `{typography.display-xxl}` | 126px | 800 | 113px | -1px | Slightly smaller hero variant. |
698
+ | `{typography.display-xl}` | 90px | 800 | 84px | 0 | Mid-hero scale. |
699
+ | `{typography.display-lg}` | 48px | 300 | 52px | 0 | Section-headline sub-display in the lighter weight. |
700
+ | `{typography.display-md}` | 40px | 300 | 44px | 0 | Sub-section displays. |
701
+ | `{typography.display-sm}` | 32px | 700 | 40px | 0 | Card headings, story-card titles. |
702
+ | `{typography.display-xs}` | 24px | 700 | 24px | 0 | Inline display micro-headings. |
703
+ | `{typography.eyebrow-uppercase}` | 16px | 800 | 24px | 0 | Uppercase eyebrow tags above section headlines. |
704
+ | `{typography.body-lg}` | 22px | 400 | 24px | 0 | Lead body paragraphs. |
705
+ | `{typography.body-md}` | 18px | 400 | 28px | 0 | Default paragraph body. |
706
+ | `{typography.body-md-strong}` | 18px | 600 | 28px | 0 | Bolded inline body. |
707
+ | `{typography.body-sm}` | 16px | 400 | 20px | 0 | Secondary body. |
708
+ | `{typography.body-sm-strong}` | 16px | 700 | 22px | 0 | Bolded short body. |
709
+ | `{typography.caption}` | 14px | 400 | 16px | 0 | Captions, fine print. |
710
+ | `{typography.caption-strong}` | 14px | 700 | 21px | 0 | Bold captions, badge labels. |
711
+ | `{typography.caption-uppercase}` | 12px | 600 | 16px | 0.57px | Uppercase metadata, footer eyebrows. |
712
+ | `{typography.button-md}` | 18px | 400 | 28px | 0 | Default button label. |
713
+
714
+ ### Principles
715
+ - **Weight 800 + uppercase = hero voice.** This is the entire reason the brand reads as a billboard rather than a tech site.
716
+ - **Weight 300 = the calmer secondary voice.** Used at 40 – 48 px for sub-displays; never below 24 px to keep legibility.
717
+ - **Single family throughout.** The brand never mixes a serif or a mono into the typographic system. Consistency is the calm.
718
+ - **Tracking stays tight at display sizes.** `-1px` at 144 px is the brand's calibration; reverting to neutral tracking softens the stencil look.
719
+
720
+ ### Note on Font Substitutes
721
+ The Vodafone display sans is proprietary. Open-source substitutes:
722
+ - **Display sans** — *Inter* weight 800 at hero scale with `letter-spacing: -1px` is the closest free match. *Geist* weight 700–800 is the second-best.
723
+ - **Lighter display weight (300)** — *Inter* weight 300 holds its line-height well at 48 px display sizes.
724
+
725
+ ## Layout
726
+
727
+ ### Spacing System
728
+ - **Base unit**: 4 px (mostly multiples of 4; a few 5/7 px appear inside icon-padding compensation).
729
+ - **Tokens**: `{spacing.xxs}` 2 px · `{spacing.xs}` 4 px · `{spacing.sm}` 8 px · `{spacing.md}` 12 px · `{spacing.lg}` 16 px · `{spacing.xl}` 20 px · `{spacing.2xl}` 24 px · `{spacing.3xl}` 32 px.
730
+ - **Section padding**: hero bands and content bands use `{spacing.3xl}` 32 px gutters; vertical spacing inside hero is fluid (fill-the-band).
731
+ - **Card interior padding**: story cards use `{spacing.lg}` 16 px around image + headline.
732
+ - **Inline gap**: button rows and chip rows use `{spacing.md}` 12 px between siblings.
733
+
734
+ ### Grid & Container
735
+ - Marketing content uses a wide container (effectively edge-to-edge with `{spacing.3xl}` gutters on desktop, shrinking on mobile).
736
+ - Story-card grids: 2-up at desktop, 1-up at mobile.
737
+ - Hero photography fills the viewport; the headline overlays at the top-left.
738
+
739
+ ### Whitespace Philosophy
740
+ The hero's massive display headline owns the whole top of the page; whitespace below is generous to let the second band breathe. Inside content cards, headline and copy hug close (`{spacing.sm}` 8 px gap), then a wider gap (`{spacing.3xl}`) before the next card. The footer band is dark and dense.
741
+
742
+ ### Responsive Strategy
743
+
744
+ #### Breakpoints
745
+
746
+ | Name | Width | Key Changes |
747
+ |---|---|---|
748
+ | Mobile | < 600px | Hero display scales down to ~64 px; story-card grid drops to 1-up; nav collapses to hamburger. |
749
+ | Tablet | 600–1023px | Story-card grid 2-up; display headlines drop to 90 – 110 px. |
750
+ | Desktop | 1024–1399px | Full display headline at 126 – 144 px; 2-up story grid. |
751
+ | Ultra-wide | ≥ 1400px | Container caps at ~1400 px; bands stay edge-to-edge in colour. |
752
+
753
+ #### Touch Targets
754
+ The `button-primary` pill renders at ~52 px tall (12 px vertical padding + 28 px line-height). All buttons comfortably meet WCAG AAA at every breakpoint.
755
+
756
+ #### Collapsing Strategy
757
+ - **Nav**: full link row at desktop. Collapses to a hamburger menu at mobile; the menu opens as a dark overlay with the same link list stacked.
758
+ - **Hero**: the massive display headline scales fluidly. At mobile, the photography crop tightens to the figure's face only.
759
+ - **Story-card grid**: 2-up → 1-up at the breakpoint above.
760
+ - **Speechmark logo orb**: stays at consistent size relative to surrounding content; never shrinks below ~48 px.
761
+
762
+ #### Image Behavior
763
+ - **Hero photography**: full-bleed 16:9 or 4:3 portraits at desktop; tighter crops at mobile.
764
+ - **Story-card thumbnails**: 16:9 landscape inside `{rounded.card}` 6 px chrome.
765
+ - **Speechmark orb**: always rendered as the red SVG quote-mark icon, never substituted.
766
+ - **Logo bar (if present on partner pages)**: monochrome SVGs at consistent height.
767
+
768
+ ## Elevation & Depth
769
+
770
+ | Level | Treatment | Use |
771
+ |---|---|---|
772
+ | Level 0 — Flat | No shadow, no border. | Default for most cards and panels — surface contrast does the elevation work. |
773
+ | Level 1 — Hairline | 1 px solid `{colors.ink}` border. | Form inputs, the `divider-on-dark` between footer columns. |
774
+ | Level 2 — Border on Dark | 1 px solid `{colors.on-dark}` border on `{colors.ink}` surfaces. | Outline buttons sitting on the dark hero band. |
775
+
776
+ The brand does not use soft drop shadows; depth comes from polarity-flip between `{colors.ink}` and `{colors.canvas}` bands.
777
+
778
+ ### Decorative Depth
779
+ - **Editorial photography**: the hero photo (real-person portrait or environment shot) is the brand's only true atmospheric effect.
780
+ - **Speechmark logo orb as visual anchor**: the red orb hosting the quote-mark icon acts as a single point of focal-depth in the centre of the otherwise-flat content rhythm.
781
+
782
+ ## Shapes
783
+
784
+ ### Border Radius Scale
785
+
786
+ | Token | Value | Use |
787
+ |---|---|---|
788
+ | `{rounded.none}` | 0px | Full-bleed hero bands, footer, banner strips. |
789
+ | `{rounded.xs}` | 1px | Tightest inline indicator (rarely used). |
790
+ | `{rounded.sm}` | 6px | The brand's canonical content radius — applied to images and inputs. |
791
+ | `{rounded.card}` | 6px | Card chrome and image frames (alias for `sm`). |
792
+ | `{rounded.pill-md}` | 32px | Badge / chip pills. |
793
+ | `{rounded.pill-lg}` | 60px | The brand's signature CTA pill — every primary and secondary button. |
794
+ | `{rounded.full}` | 9999px | Circular icon containers (e.g., video play/pause). |
795
+
796
+ ### Photography Geometry
797
+ - Hero portraits: edge-to-edge 16:9 or 4:3 with no internal frame.
798
+ - Story-card thumbnails: 16:9 landscape inside `{rounded.card}` chrome.
799
+ - Speechmark logo orb: square with `{rounded.sm}` corners (visually a tilted-square mark; the SVG mark itself fills the orb).
800
+
801
+ ## Components
802
+
803
+ ### Buttons
804
+
805
+ **`button-primary`** — the red pill CTA, brand's primary conversion target.
806
+ - Background `{colors.primary}`, text `{colors.on-primary}`, 1 px solid `{colors.primary}` border, label set in `{typography.button-md}`, padding `{spacing.md} {spacing.2xl}`, shape `{rounded.pill-lg}` 60 px.
807
+
808
+ **`button-outline-red`** — the secondary pill, red-text-on-white with red border.
809
+ - Background `{colors.canvas}`, text `{colors.primary}`, 1 px solid `{colors.primary}` border, same label / padding / shape as `button-primary`.
810
+
811
+ **`button-outline-dark`** — the tertiary pill, ink-text-on-white with ink border.
812
+ - Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, same label / padding / shape.
813
+
814
+ **`button-icon-circular`** — the round white icon button (video play / pause / chevron).
815
+ - Background `{colors.canvas}`, ink icon, 1 px solid `{colors.canvas}` outline (effectively borderless), shape `{rounded.full}`.
816
+
817
+ ### Cards & Containers
818
+
819
+ **`card-content`** — the default story-card chrome.
820
+ - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.lg}`, shape `{rounded.card}` 6 px. Hosts a 16:9 thumbnail at the top + headline + caption.
821
+
822
+ **`card-hero`** — the slightly larger card variant used as the lead story.
823
+ - Same chrome as `card-content` but headline scales to `{typography.display-sm}`.
824
+
825
+ ### Inputs & Forms
826
+
827
+ **`text-input`** — the canonical text input.
828
+ - Background `{colors.canvas}`, text `{colors.ink}`, 1 px solid `{colors.ink}` border, body in `{typography.body-sm}`, padding `{spacing.md} {spacing.lg}`, shape `{rounded.sm}` 6 px.
829
+
830
+ ### Navigation
831
+
832
+ **`nav-bar`** — the dark top nav, fixed to the page top.
833
+ - Background `{colors.ink}`, text `{colors.on-dark}`, padding `{spacing.lg} {spacing.3xl}`. Layout: logo left, link row right with login / search affordances.
834
+
835
+ **`nav-link`** — the link items inside `nav-bar`.
836
+ - Text `{colors.on-dark}`, set in `{typography.body-sm}`.
837
+
838
+ **`footer`** — the dark footer band.
839
+ - Background `{colors.ink}`, text `{colors.on-dark}`, padding `{spacing.3xl} {spacing.3xl}`. Body in `{typography.body-sm}`; column eyebrows in `{typography.caption-uppercase}`.
840
+
841
+ ### Signature Components
842
+
843
+ **`hero-band-dark`** — the dark navy/ink hero band hosting the massive display headline.
844
+ - Background `{colors.ink}` with full-bleed editorial photography overlay at reduced opacity; text `{colors.on-dark}`; padding `{spacing.3xl} {spacing.3xl}`. Headline in `{typography.display-hero}` (uppercase, weight 800).
845
+
846
+ **`hero-band-red`** — the rare full-bleed red hero used on signature campaigns.
847
+ - Background `{colors.primary}`, text `{colors.on-primary}`, padding `{spacing.3xl} {spacing.3xl}`. Headline in `{typography.display-xl}`.
848
+
849
+ **`content-band-light`** — the white content band that follows every hero.
850
+ - Background `{colors.canvas}`, text `{colors.ink}`, padding `{spacing.3xl} {spacing.3xl}`. Section headline in `{typography.display-md}` or `{typography.display-lg}` (weight 300).
851
+
852
+ **`speechmark-logo-orb`** — the red square hosting Vodafone's quotation-mark icon. The brand's visual anchor.
853
+ - Background `{colors.primary}`, white icon glyph, shape `{rounded.sm}`. Acts as a focal element between content bands, often near the centre of long pages.
854
+
855
+ **`badge-chip`** — the inline metadata pill used for category tags inside story cards.
856
+ - Background `{colors.canvas-soft}`, text `{colors.ink}`, label in `{typography.caption-strong}`, padding `{spacing.xs} {spacing.md}`, shape `{rounded.pill-md}` 32 px.
857
+
858
+ **`divider-on-dark`** — the 1 px hairline used between sections / columns on dark surfaces.
859
+ - 1 px solid `{colors.on-dark}` (often at 25 % opacity at the component level).
860
+
861
+ ### Examples (illustrative)
862
+
863
+ > Auto-derived kit-mirror demonstration surfaces (`scripts/derive-examples-block.mjs`). Each `ex-*` entry references brand-native primitives so downstream consumers (`/preview-design`, `/generate-kit`) re-skin the same 10 surfaces consistently. `TO_FILL` markers indicate missing primitives — resolve in the LLM judgment pass.
864
+
865
+ **`ex-pricing-tier`** — Default Pricing tier card. Re-uses feature-card chrome with brand canvas-soft surface.
866
+ - Properties: `backgroundColor`, `textColor`, `borderColor`, `rounded`, `padding`
867
+
868
+ **`ex-pricing-tier-featured`** — Featured/highlighted tier — polarity-flipped surface (dark fill + light text in light mode, light fill + dark text in dark mode).
869
+ - Properties: `backgroundColor`, `textColor`, `rounded`, `padding`
870
+
871
+ **`ex-product-selector`** — What's Included summary card — re-purposed for SaaS / B2B verticals (NOT a literal product gallery).
872
+ - Properties: `backgroundColor`, `rounded`, `padding`
873
+
874
+ **`ex-cart-drawer`** — Subscription summary — re-purposed for SaaS / B2B (line items per add-on, not literal cart).
875
+ - Properties: `backgroundColor`, `rounded`, `padding`, `item-divider`
876
+
877
+ **`ex-app-shell-row`** — Sidebar nav row inside the App Shell example. Active state uses brand primary as the indicator.
878
+ - Properties: `backgroundColor`, `activeIndicator`, `rounded`, `padding`
879
+
880
+ **`ex-data-table-cell`** — Default data-table th + td chrome. Header uses mono-caps eyebrow typography; body uses body-sm.
881
+ - Properties: `headerBackground`, `headerTypography`, `bodyTypography`, `cellPadding`, `rowBorder`
882
+
883
+ **`ex-auth-form-card`** — Sign-in / sign-up card. Re-uses feature-card chrome with text-input primitives inside.
884
+ - Properties: `backgroundColor`, `rounded`, `padding`
885
+
886
+ **`ex-modal-card`** — Modal dialog surface — same chrome as feature-card with elevated shadow.
887
+ - Properties: `backgroundColor`, `rounded`, `padding`
888
+
889
+ **`ex-empty-state-card`** — Empty-state illustration frame.
890
+ - Properties: `backgroundColor`, `rounded`, `padding`, `captionTypography`
891
+
892
+ **`ex-toast`** — Toast notification surface — feature-card shape + medium shadow.
893
+ - Properties: `backgroundColor`, `rounded`, `padding`, `typography`
894
+
895
+
896
+ ## Do's and Don'ts
897
+
898
+ ### Do
899
+ - Reserve `{colors.primary}` Vodafone Red for primary CTAs and the `speechmark-logo-orb`. Every conversion target uses the red pill.
900
+ - Set hero headlines in `{typography.display-hero}` weight 800 UPPERCASE with tight `-1px` tracking. That stencil look IS the brand voice.
901
+ - Use `{rounded.pill-lg}` 60 px on every interactive pill. The brand never uses square corners on CTAs.
902
+ - Cycle page surfaces in `{colors.ink}` dark hero → `{colors.canvas}` light content → `{colors.ink}` footer. Surface contrast is the depth cue.
903
+ - Pair editorial portrait photography with the massive display headline overlay — that combination IS the brand's signature.
904
+ - Render the speechmark logo orb at consistent size relative to surrounding content — it's the brand's centre of gravity on every page.
905
+
906
+ ### Don't
907
+ - Don't introduce a second accent colour. The brand operates with red + ink + grayscale only.
908
+ - Don't render headlines in sentence case at hero scale. Hero display IS uppercase weight 800.
909
+ - Don't render the primary CTA as a square rectangle. The 60 px pill is non-negotiable.
910
+ - Don't drop a soft drop-shadow on cards. The brand relies on surface-colour contrast, not shadow.
911
+ - Don't substitute the speechmark logo orb with a wordmark or a different shape. The orb is the iconic mark.
912
+ - Don't pair the weight 800 display face with letter-spacing 0 at 144 px — the `-1px` tracking is part of the brand's calibration.