savant-code 0.0.21 → 0.0.23

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 +16 -8
  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,909 @@
1
+ {
2
+ "schemaVersion": "1",
3
+ "id": "hashicorp-design-analysis",
4
+ "displayName": "HashiCorp-design-analysis",
5
+ "description": "An enterprise-infrastructure marketing canvas built around a near-black ground (#000000) and a system of per-product accent colors — Terraform purple, Vault yellow, Consul pink, Waypoint cyan, Vagrant blue — that act as identity tokens rather than decorative palette. Display type is hashicorpSans set in 600/700 with tight 1.17–1.21 line-heights; body type runs the same family at 500 weight with relaxed 1.50–1.71 line-heights. Cards live as charcoal surfaces with 1px translucent gray borders; product showcase cards lift into per-product chromatic gradients. The system reads as confident, technical, and intentionally multi-product — every section quietly signals which HashiCorp tool it represents.",
6
+ "source": "embedded",
7
+ "status": "curated-reference",
8
+ "targets": [
9
+ "terminal",
10
+ "react"
11
+ ],
12
+ "contentPath": "packages/design-systems/library/hashicorp.design.md",
13
+ "sourceContentHash": "d2df9be72d867e48d318fd18db04e60a78357c27e392ab921fc2ba7f46951442",
14
+ "normalizedContentHash": "ed8d1219ef98fa41c9f13b2f3e9463629694a45d8d16a2718a746db2b210761d",
15
+ "provenance": {
16
+ "sourceRepository": "VoltAgent/awesome-design-md",
17
+ "sourceRevision": "working-tree-curated-snapshot",
18
+ "sourcePath": "packages/design-systems/library/hashicorp.design.md",
19
+ "license": "MIT"
20
+ },
21
+ "fonts": [
22
+ {
23
+ "family": "hashicorpSans",
24
+ "fallback": [
25
+ "system-ui",
26
+ "sans-serif"
27
+ ],
28
+ "redistributable": false
29
+ }
30
+ ],
31
+ "tokens": {
32
+ "colors": {
33
+ "accent-blue": "#2b89ff",
34
+ "amber-100": "#fbeabf",
35
+ "amber-200": "#bb5a00",
36
+ "blue-7": "#101a59",
37
+ "canvas": "#000000",
38
+ "hairline": "#3b3d45",
39
+ "hairline-soft": "#252830",
40
+ "ink": "#ffffff",
41
+ "ink-muted": "#b2b6bd",
42
+ "ink-subtle": "#656a76",
43
+ "inverse-canvas": "#ffffff",
44
+ "inverse-ink": "#000000",
45
+ "on-primary": "#ffffff",
46
+ "primary": "#000000",
47
+ "product-boundary": "#f24c53",
48
+ "product-consul": "#e62b1e",
49
+ "product-nomad": "#00ca8e",
50
+ "product-terraform": "#7b42bc",
51
+ "product-terraform-bright": "#911ced",
52
+ "product-vagrant": "#1868f2",
53
+ "product-vault": "#ffcf25",
54
+ "product-waypoint": "#14c6cb",
55
+ "product-waypoint-deep": "#12b6bb",
56
+ "semantic-error": "#e62b1e",
57
+ "semantic-success": "#00ca8e",
58
+ "semantic-visited": "#a737ff",
59
+ "semantic-warning": "#ffcf25",
60
+ "surface-1": "#15181e",
61
+ "surface-2": "#1f232b",
62
+ "surface-3": "#3b3d45"
63
+ },
64
+ "typography": {
65
+ "display-xl": {
66
+ "fontFamily": "hashicorpSans",
67
+ "fontSize": "80px",
68
+ "fontWeight": 700,
69
+ "letterSpacing": "-2.5px",
70
+ "lineHeight": 1.17
71
+ },
72
+ "display-lg": {
73
+ "fontFamily": "hashicorpSans",
74
+ "fontSize": "56px",
75
+ "fontWeight": 700,
76
+ "letterSpacing": "-1.6px",
77
+ "lineHeight": 1.18
78
+ },
79
+ "display-md": {
80
+ "fontFamily": "hashicorpSans",
81
+ "fontSize": "40px",
82
+ "fontWeight": 600,
83
+ "letterSpacing": "-1.0px",
84
+ "lineHeight": 1.19
85
+ },
86
+ "headline": {
87
+ "fontFamily": "hashicorpSans",
88
+ "fontSize": "28px",
89
+ "fontWeight": 600,
90
+ "letterSpacing": "-0.6px",
91
+ "lineHeight": 1.21
92
+ },
93
+ "card-title": {
94
+ "fontFamily": "hashicorpSans",
95
+ "fontSize": "22px",
96
+ "fontWeight": 600,
97
+ "letterSpacing": "-0.4px",
98
+ "lineHeight": 1.18
99
+ },
100
+ "subhead": {
101
+ "fontFamily": "hashicorpSans",
102
+ "fontSize": "20px",
103
+ "fontWeight": 600,
104
+ "letterSpacing": "-0.2px",
105
+ "lineHeight": 1.35
106
+ },
107
+ "body-lg": {
108
+ "fontFamily": "hashicorpSans",
109
+ "fontSize": "18px",
110
+ "fontWeight": 500,
111
+ "letterSpacing": 0,
112
+ "lineHeight": 1.69
113
+ },
114
+ "body": {
115
+ "fontFamily": "hashicorpSans",
116
+ "fontSize": "16px",
117
+ "fontWeight": 500,
118
+ "letterSpacing": 0,
119
+ "lineHeight": 1.5
120
+ },
121
+ "body-sm": {
122
+ "fontFamily": "hashicorpSans",
123
+ "fontSize": "14px",
124
+ "fontWeight": 500,
125
+ "letterSpacing": 0,
126
+ "lineHeight": 1.71
127
+ },
128
+ "caption": {
129
+ "fontFamily": "hashicorpSans",
130
+ "fontSize": "13px",
131
+ "fontWeight": 500,
132
+ "letterSpacing": "0.2px",
133
+ "lineHeight": 1.38
134
+ },
135
+ "button": {
136
+ "fontFamily": "hashicorpSans",
137
+ "fontSize": "14px",
138
+ "fontWeight": 600,
139
+ "letterSpacing": 0,
140
+ "lineHeight": 1.29
141
+ },
142
+ "eyebrow": {
143
+ "fontFamily": "hashicorpSans",
144
+ "fontSize": "12px",
145
+ "fontWeight": 600,
146
+ "letterSpacing": "0.6px",
147
+ "lineHeight": 1.23
148
+ }
149
+ },
150
+ "spacing": {
151
+ "hair": "1px",
152
+ "lg": "24px",
153
+ "md": "16px",
154
+ "section": "96px",
155
+ "sm": "12px",
156
+ "xl": "32px",
157
+ "xs": "8px",
158
+ "xxl": "48px",
159
+ "xxs": "4px"
160
+ },
161
+ "radius": {
162
+ "full": "9999px",
163
+ "lg": "12px",
164
+ "md": "8px",
165
+ "pill": "9999px",
166
+ "sm": "6px",
167
+ "xl": "16px",
168
+ "xs": "4px",
169
+ "xxl": "24px"
170
+ },
171
+ "components": {
172
+ "button-primary": {
173
+ "backgroundColor": "{colors.inverse-canvas}",
174
+ "padding": "10px 18px",
175
+ "rounded": "{rounded.md}",
176
+ "textColor": "{colors.inverse-ink}",
177
+ "typography": "{typography.button}"
178
+ },
179
+ "button-primary-pressed": {
180
+ "backgroundColor": "{colors.inverse-canvas}",
181
+ "rounded": "{rounded.md}",
182
+ "textColor": "{colors.inverse-ink}",
183
+ "typography": "{typography.button}"
184
+ },
185
+ "button-secondary": {
186
+ "backgroundColor": "{colors.surface-2}",
187
+ "padding": "10px 18px",
188
+ "rounded": "{rounded.md}",
189
+ "textColor": "{colors.ink}",
190
+ "typography": "{typography.button}"
191
+ },
192
+ "button-tertiary": {
193
+ "backgroundColor": "{colors.canvas}",
194
+ "padding": "10px 18px",
195
+ "rounded": "{rounded.md}",
196
+ "textColor": "{colors.ink}",
197
+ "typography": "{typography.button}"
198
+ },
199
+ "button-product-terraform": {
200
+ "backgroundColor": "{colors.product-terraform}",
201
+ "padding": "10px 18px",
202
+ "rounded": "{rounded.md}",
203
+ "textColor": "{colors.ink}",
204
+ "typography": "{typography.button}"
205
+ },
206
+ "button-product-vault": {
207
+ "backgroundColor": "{colors.product-vault}",
208
+ "padding": "10px 18px",
209
+ "rounded": "{rounded.md}",
210
+ "textColor": "{colors.inverse-ink}",
211
+ "typography": "{typography.button}"
212
+ },
213
+ "button-product-waypoint": {
214
+ "backgroundColor": "{colors.product-waypoint}",
215
+ "padding": "10px 18px",
216
+ "rounded": "{rounded.md}",
217
+ "textColor": "{colors.inverse-ink}",
218
+ "typography": "{typography.button}"
219
+ },
220
+ "product-card": {
221
+ "backgroundColor": "{colors.surface-1}",
222
+ "padding": "24px",
223
+ "rounded": "{rounded.lg}",
224
+ "textColor": "{colors.ink}",
225
+ "typography": "{typography.body}"
226
+ },
227
+ "product-card-terraform": {
228
+ "backgroundColor": "{colors.product-terraform}",
229
+ "padding": "24px",
230
+ "rounded": "{rounded.lg}",
231
+ "textColor": "{colors.ink}",
232
+ "typography": "{typography.body}"
233
+ },
234
+ "product-card-vault": {
235
+ "backgroundColor": "{colors.product-vault}",
236
+ "padding": "24px",
237
+ "rounded": "{rounded.lg}",
238
+ "textColor": "{colors.inverse-ink}",
239
+ "typography": "{typography.body}"
240
+ },
241
+ "product-card-waypoint": {
242
+ "backgroundColor": "{colors.product-waypoint}",
243
+ "padding": "24px",
244
+ "rounded": "{rounded.lg}",
245
+ "textColor": "{colors.inverse-ink}",
246
+ "typography": "{typography.body}"
247
+ },
248
+ "feature-card": {
249
+ "backgroundColor": "{colors.surface-1}",
250
+ "padding": "24px",
251
+ "rounded": "{rounded.lg}",
252
+ "textColor": "{colors.ink}",
253
+ "typography": "{typography.body}"
254
+ },
255
+ "pricing-card": {
256
+ "backgroundColor": "{colors.surface-1}",
257
+ "padding": "32px",
258
+ "rounded": "{rounded.lg}",
259
+ "textColor": "{colors.ink}",
260
+ "typography": "{typography.body}"
261
+ },
262
+ "pricing-card-featured": {
263
+ "backgroundColor": "{colors.surface-2}",
264
+ "padding": "32px",
265
+ "rounded": "{rounded.lg}",
266
+ "textColor": "{colors.ink}",
267
+ "typography": "{typography.body}"
268
+ },
269
+ "resource-card": {
270
+ "backgroundColor": "{colors.surface-1}",
271
+ "padding": "16px",
272
+ "rounded": "{rounded.lg}",
273
+ "textColor": "{colors.ink}",
274
+ "typography": "{typography.body-sm}"
275
+ },
276
+ "text-input": {
277
+ "backgroundColor": "{colors.surface-1}",
278
+ "padding": "10px 14px",
279
+ "rounded": "{rounded.md}",
280
+ "textColor": "{colors.ink}",
281
+ "typography": "{typography.body}"
282
+ },
283
+ "text-input-focused": {
284
+ "backgroundColor": "{colors.surface-1}",
285
+ "padding": "10px 14px",
286
+ "rounded": "{rounded.md}",
287
+ "textColor": "{colors.ink}",
288
+ "typography": "{typography.body}"
289
+ },
290
+ "product-pill": {
291
+ "backgroundColor": "{colors.surface-1}",
292
+ "padding": "4px 10px",
293
+ "rounded": "{rounded.pill}",
294
+ "textColor": "{colors.ink-muted}",
295
+ "typography": "{typography.caption}"
296
+ },
297
+ "top-nav": {
298
+ "backgroundColor": "{colors.canvas}",
299
+ "height": "64px",
300
+ "rounded": "{rounded.xs}",
301
+ "textColor": "{colors.ink}",
302
+ "typography": "{typography.body-sm}"
303
+ },
304
+ "comparison-row": {
305
+ "backgroundColor": "{colors.canvas}",
306
+ "rounded": "{rounded.xs}",
307
+ "textColor": "{colors.ink-muted}",
308
+ "typography": "{typography.body-sm}"
309
+ },
310
+ "cta-banner": {
311
+ "backgroundColor": "{colors.surface-1}",
312
+ "padding": "48px",
313
+ "rounded": "{rounded.xxl}",
314
+ "textColor": "{colors.ink}",
315
+ "typography": "{typography.subhead}"
316
+ },
317
+ "footer": {
318
+ "backgroundColor": "{colors.canvas}",
319
+ "padding": "64px 32px",
320
+ "rounded": "{rounded.xs}",
321
+ "textColor": "{colors.ink-muted}",
322
+ "typography": "{typography.caption}"
323
+ }
324
+ },
325
+ "extensions": {
326
+ "description": "An enterprise-infrastructure marketing canvas built around a near-black ground (#000000) and a system of per-product accent colors — Terraform purple, Vault yellow, Consul pink, Waypoint cyan, Vagrant blue — that act as identity tokens rather than decorative palette. Display type is hashicorpSans set in 600/700 with tight 1.17–1.21 line-heights; body type runs the same family at 500 weight with relaxed 1.50–1.71 line-heights. Cards live as charcoal surfaces with 1px translucent gray borders; product showcase cards lift into per-product chromatic gradients. The system reads as confident, technical, and intentionally multi-product — every section quietly signals which HashiCorp tool it represents.",
327
+ "name": "HashiCorp-design-analysis",
328
+ "version": "alpha"
329
+ }
330
+ }
331
+ }
332
+
333
+ ---
334
+
335
+ ---
336
+ version: alpha
337
+ name: HashiCorp-design-analysis
338
+ description: "An enterprise-infrastructure marketing canvas built around a near-black ground (#000000) and a system of per-product accent colors — Terraform purple, Vault yellow, Consul pink, Waypoint cyan, Vagrant blue — that act as identity tokens rather than decorative palette. Display type is hashicorpSans set in 600/700 with tight 1.17–1.21 line-heights; body type runs the same family at 500 weight with relaxed 1.50–1.71 line-heights. Cards live as charcoal surfaces with 1px translucent gray borders; product showcase cards lift into per-product chromatic gradients. The system reads as confident, technical, and intentionally multi-product — every section quietly signals which HashiCorp tool it represents."
339
+
340
+ colors:
341
+ primary: "#000000"
342
+ on-primary: "#ffffff"
343
+ accent-blue: "#2b89ff"
344
+ ink: "#ffffff"
345
+ ink-muted: "#b2b6bd"
346
+ ink-subtle: "#656a76"
347
+ canvas: "#000000"
348
+ surface-1: "#15181e"
349
+ surface-2: "#1f232b"
350
+ surface-3: "#3b3d45"
351
+ hairline: "#3b3d45"
352
+ hairline-soft: "#252830"
353
+ inverse-canvas: "#ffffff"
354
+ inverse-ink: "#000000"
355
+ product-terraform: "#7b42bc"
356
+ product-terraform-bright: "#911ced"
357
+ product-vault: "#ffcf25"
358
+ product-consul: "#e62b1e"
359
+ product-waypoint: "#14c6cb"
360
+ product-waypoint-deep: "#12b6bb"
361
+ product-vagrant: "#1868f2"
362
+ product-nomad: "#00ca8e"
363
+ product-boundary: "#f24c53"
364
+ amber-100: "#fbeabf"
365
+ amber-200: "#bb5a00"
366
+ blue-7: "#101a59"
367
+ semantic-success: "#00ca8e"
368
+ semantic-warning: "#ffcf25"
369
+ semantic-error: "#e62b1e"
370
+ semantic-visited: "#a737ff"
371
+
372
+ typography:
373
+ display-xl:
374
+ fontFamily: hashicorpSans
375
+ fontSize: 80px
376
+ fontWeight: 700
377
+ lineHeight: 1.17
378
+ letterSpacing: -2.5px
379
+ display-lg:
380
+ fontFamily: hashicorpSans
381
+ fontSize: 56px
382
+ fontWeight: 700
383
+ lineHeight: 1.18
384
+ letterSpacing: -1.6px
385
+ display-md:
386
+ fontFamily: hashicorpSans
387
+ fontSize: 40px
388
+ fontWeight: 600
389
+ lineHeight: 1.19
390
+ letterSpacing: -1.0px
391
+ headline:
392
+ fontFamily: hashicorpSans
393
+ fontSize: 28px
394
+ fontWeight: 600
395
+ lineHeight: 1.21
396
+ letterSpacing: -0.6px
397
+ card-title:
398
+ fontFamily: hashicorpSans
399
+ fontSize: 22px
400
+ fontWeight: 600
401
+ lineHeight: 1.18
402
+ letterSpacing: -0.4px
403
+ subhead:
404
+ fontFamily: hashicorpSans
405
+ fontSize: 20px
406
+ fontWeight: 600
407
+ lineHeight: 1.35
408
+ letterSpacing: -0.2px
409
+ body-lg:
410
+ fontFamily: hashicorpSans
411
+ fontSize: 18px
412
+ fontWeight: 500
413
+ lineHeight: 1.69
414
+ letterSpacing: 0
415
+ body:
416
+ fontFamily: hashicorpSans
417
+ fontSize: 16px
418
+ fontWeight: 500
419
+ lineHeight: 1.50
420
+ letterSpacing: 0
421
+ body-sm:
422
+ fontFamily: hashicorpSans
423
+ fontSize: 14px
424
+ fontWeight: 500
425
+ lineHeight: 1.71
426
+ letterSpacing: 0
427
+ caption:
428
+ fontFamily: hashicorpSans
429
+ fontSize: 13px
430
+ fontWeight: 500
431
+ lineHeight: 1.38
432
+ letterSpacing: 0.2px
433
+ button:
434
+ fontFamily: hashicorpSans
435
+ fontSize: 14px
436
+ fontWeight: 600
437
+ lineHeight: 1.29
438
+ letterSpacing: 0
439
+ eyebrow:
440
+ fontFamily: hashicorpSans
441
+ fontSize: 12px
442
+ fontWeight: 600
443
+ lineHeight: 1.23
444
+ letterSpacing: 0.6px
445
+
446
+ rounded:
447
+ xs: 4px
448
+ sm: 6px
449
+ md: 8px
450
+ lg: 12px
451
+ xl: 16px
452
+ xxl: 24px
453
+ pill: 9999px
454
+ full: 9999px
455
+
456
+ spacing:
457
+ hair: 1px
458
+ xxs: 4px
459
+ xs: 8px
460
+ sm: 12px
461
+ md: 16px
462
+ lg: 24px
463
+ xl: 32px
464
+ xxl: 48px
465
+ section: 96px
466
+
467
+ components:
468
+ button-primary:
469
+ backgroundColor: "{colors.inverse-canvas}"
470
+ textColor: "{colors.inverse-ink}"
471
+ typography: "{typography.button}"
472
+ rounded: "{rounded.md}"
473
+ padding: 10px 18px
474
+ button-primary-pressed:
475
+ backgroundColor: "{colors.inverse-canvas}"
476
+ textColor: "{colors.inverse-ink}"
477
+ typography: "{typography.button}"
478
+ rounded: "{rounded.md}"
479
+ button-secondary:
480
+ backgroundColor: "{colors.surface-2}"
481
+ textColor: "{colors.ink}"
482
+ typography: "{typography.button}"
483
+ rounded: "{rounded.md}"
484
+ padding: 10px 18px
485
+ button-tertiary:
486
+ backgroundColor: "{colors.canvas}"
487
+ textColor: "{colors.ink}"
488
+ typography: "{typography.button}"
489
+ rounded: "{rounded.md}"
490
+ padding: 10px 18px
491
+ button-product-terraform:
492
+ backgroundColor: "{colors.product-terraform}"
493
+ textColor: "{colors.ink}"
494
+ typography: "{typography.button}"
495
+ rounded: "{rounded.md}"
496
+ padding: 10px 18px
497
+ button-product-vault:
498
+ backgroundColor: "{colors.product-vault}"
499
+ textColor: "{colors.inverse-ink}"
500
+ typography: "{typography.button}"
501
+ rounded: "{rounded.md}"
502
+ padding: 10px 18px
503
+ button-product-waypoint:
504
+ backgroundColor: "{colors.product-waypoint}"
505
+ textColor: "{colors.inverse-ink}"
506
+ typography: "{typography.button}"
507
+ rounded: "{rounded.md}"
508
+ padding: 10px 18px
509
+ product-card:
510
+ backgroundColor: "{colors.surface-1}"
511
+ textColor: "{colors.ink}"
512
+ typography: "{typography.body}"
513
+ rounded: "{rounded.lg}"
514
+ padding: 24px
515
+ product-card-terraform:
516
+ backgroundColor: "{colors.product-terraform}"
517
+ textColor: "{colors.ink}"
518
+ typography: "{typography.body}"
519
+ rounded: "{rounded.lg}"
520
+ padding: 24px
521
+ product-card-vault:
522
+ backgroundColor: "{colors.product-vault}"
523
+ textColor: "{colors.inverse-ink}"
524
+ typography: "{typography.body}"
525
+ rounded: "{rounded.lg}"
526
+ padding: 24px
527
+ product-card-waypoint:
528
+ backgroundColor: "{colors.product-waypoint}"
529
+ textColor: "{colors.inverse-ink}"
530
+ typography: "{typography.body}"
531
+ rounded: "{rounded.lg}"
532
+ padding: 24px
533
+ feature-card:
534
+ backgroundColor: "{colors.surface-1}"
535
+ textColor: "{colors.ink}"
536
+ typography: "{typography.body}"
537
+ rounded: "{rounded.lg}"
538
+ padding: 24px
539
+ pricing-card:
540
+ backgroundColor: "{colors.surface-1}"
541
+ textColor: "{colors.ink}"
542
+ typography: "{typography.body}"
543
+ rounded: "{rounded.lg}"
544
+ padding: 32px
545
+ pricing-card-featured:
546
+ backgroundColor: "{colors.surface-2}"
547
+ textColor: "{colors.ink}"
548
+ typography: "{typography.body}"
549
+ rounded: "{rounded.lg}"
550
+ padding: 32px
551
+ resource-card:
552
+ backgroundColor: "{colors.surface-1}"
553
+ textColor: "{colors.ink}"
554
+ typography: "{typography.body-sm}"
555
+ rounded: "{rounded.lg}"
556
+ padding: 16px
557
+ text-input:
558
+ backgroundColor: "{colors.surface-1}"
559
+ textColor: "{colors.ink}"
560
+ typography: "{typography.body}"
561
+ rounded: "{rounded.md}"
562
+ padding: 10px 14px
563
+ text-input-focused:
564
+ backgroundColor: "{colors.surface-1}"
565
+ textColor: "{colors.ink}"
566
+ typography: "{typography.body}"
567
+ rounded: "{rounded.md}"
568
+ padding: 10px 14px
569
+ product-pill:
570
+ backgroundColor: "{colors.surface-1}"
571
+ textColor: "{colors.ink-muted}"
572
+ typography: "{typography.caption}"
573
+ rounded: "{rounded.pill}"
574
+ padding: 4px 10px
575
+ top-nav:
576
+ backgroundColor: "{colors.canvas}"
577
+ textColor: "{colors.ink}"
578
+ typography: "{typography.body-sm}"
579
+ rounded: "{rounded.xs}"
580
+ height: 64px
581
+ comparison-row:
582
+ backgroundColor: "{colors.canvas}"
583
+ textColor: "{colors.ink-muted}"
584
+ typography: "{typography.body-sm}"
585
+ rounded: "{rounded.xs}"
586
+ cta-banner:
587
+ backgroundColor: "{colors.surface-1}"
588
+ textColor: "{colors.ink}"
589
+ typography: "{typography.subhead}"
590
+ rounded: "{rounded.xxl}"
591
+ padding: 48px
592
+ footer:
593
+ backgroundColor: "{colors.canvas}"
594
+ textColor: "{colors.ink-muted}"
595
+ typography: "{typography.caption}"
596
+ rounded: "{rounded.xs}"
597
+ padding: 64px 32px
598
+ ---
599
+
600
+ ## Overview
601
+
602
+ HashiCorp's marketing canvas is a near-black ground that serves a multi-product portfolio without ever feeling generic. The dominant surface is `{colors.canvas}` (pure black) layered with `{colors.surface-1}` charcoal cards and 1px translucent gray hairlines. The chrome is monochrome — white pill-rounded buttons (`{components.button-primary}`), white type, gray secondary type — but the system is held together by a **palette of per-product accent colors** that signal which HashiCorp tool a given section belongs to: Terraform purple, Vault yellow, Consul red, Waypoint cyan, Vagrant blue, Nomad green, Boundary coral.
603
+
604
+ Display type is **hashicorpSans** at weights 600/700 with tight line-heights (1.17–1.21); body type is the same family at 500 weight with deliberately relaxed line-heights (1.50–1.71) — the contrast feels editorial, not enterprise-templated. CTAs use small `{rounded.md}` 8px corners rather than pills, which keeps the system reading as developer-facing rather than consumer-y.
605
+
606
+ The signature device is the **product-card** family — each HashiCorp product gets its own colored card variant on the home and infrastructure pages, lifting Terraform into a violet ground, Vault into yellow, Waypoint into cyan. These aren't decorative gradients — they're identity surfaces. A reader scrolling the page can tell which product a section is about from the corner of their eye.
607
+
608
+ **Key Characteristics:**
609
+ - Black-canvas marketing system: `{colors.canvas}` is the surface for hero, body, pricing, comparison tables, and footer alike.
610
+ - **Per-product color identity**: Terraform `{colors.product-terraform}`, Vault `{colors.product-vault}`, Waypoint `{colors.product-waypoint}`, Vagrant `{colors.product-vagrant}`, Consul `{colors.product-consul}`, Nomad `{colors.product-nomad}`, Boundary `{colors.product-boundary}` — each with its own button + card variant.
611
+ - Display headlines run hashicorpSans 600/700 with line-height 1.17–1.21 (tight); body runs the same family at 500 with 1.50–1.71 (relaxed) — the proportional gap is the brand's voice.
612
+ - CTA shape is `{rounded.md}` 8px — not a pill — keeping the system reading as developer-tool rather than consumer-app.
613
+ - Charcoal surface lift (canvas → surface-1 → surface-2) instead of shadow-driven elevation.
614
+ - 1px translucent gray hairlines (`rgba(178,182,189,0.1)`) define cards and dividers — the borders are felt more than seen.
615
+ - Eyebrow typography (12–13px, 600 weight, 0.6px positive tracking, uppercase) marks every section as a category label.
616
+
617
+ ## Colors
618
+
619
+ > Source pages: hashicorp.com/en (home), /en/infrastructure-cloud, /en/products/terraform, /en/pricing, /en/resources?contentType=PDF.
620
+
621
+ ### Brand & Accent
622
+ - **Black** ({colors.primary}): The system primary surface. Canvas, footer, comparison tables, hero — all black.
623
+ - **White** ({colors.on-primary}): Inverse text on black; canvas of `button-primary`.
624
+ - **Accent Blue** ({colors.accent-blue}): Hyperlinks across the marketing surface.
625
+ - **Visited Purple** ({colors.semantic-visited}): Visited-link state.
626
+
627
+ ### Surface
628
+ - **Canvas** ({colors.canvas}): Default page background.
629
+ - **Surface 1** ({colors.surface-1}): Charcoal one step above canvas — feature cards, pricing cards, resource tiles.
630
+ - **Surface 2** ({colors.surface-2}): Two steps above — featured pricing card, secondary buttons, hovered product chrome.
631
+ - **Surface 3** ({colors.surface-3}): Three steps above — small chips, badges, sub-nav backgrounds.
632
+ - **Hairline** ({colors.hairline}): 1px borders on cards and dividers.
633
+ - **Hairline Soft** ({colors.hairline-soft}): Subtler dividers — comparison-table rows.
634
+ - **Inverse Canvas** ({colors.inverse-canvas}): Pure white — used as the surface of `button-primary` only.
635
+
636
+ ### Text
637
+ - **Ink** ({colors.ink}): All headline and emphasized body type — pure white.
638
+ - **Ink Muted** ({colors.ink-muted}): Secondary type at #b2b6bd — meta info, footer columns.
639
+ - **Ink Subtle** ({colors.ink-subtle}): Tertiary type at #656a76 — form helper text, timestamps, footnotes.
640
+
641
+ ### Per-Product Identity (signature)
642
+ HashiCorp's marketing isn't held together by a single accent color — it's held together by a system of product-specific accents, each used to mark which tool a section represents.
643
+
644
+ - **Terraform Purple** ({colors.product-terraform}): Terraform sections, terraform CTAs, the violet 3D cube on the home hero.
645
+ - **Terraform Bright** ({colors.product-terraform-bright}): Saturated highlight — link emphasis on Terraform pages.
646
+ - **Vault Yellow** ({colors.product-vault}): Vault sections and CTAs.
647
+ - **Consul Red** ({colors.product-consul}): Consul sections.
648
+ - **Waypoint Cyan** ({colors.product-waypoint}): Waypoint sections, deep variant `{colors.product-waypoint-deep}` for hover/active.
649
+ - **Vagrant Blue** ({colors.product-vagrant}): Vagrant sections.
650
+ - **Nomad Green** ({colors.product-nomad}): Nomad sections.
651
+ - **Boundary Coral** ({colors.product-boundary}): Boundary sections.
652
+
653
+ ### Semantic
654
+ - **Success** ({colors.semantic-success}): Positive states (also reused as Nomad green).
655
+ - **Warning** ({colors.semantic-warning}): Warning states (also Vault yellow).
656
+ - **Error** ({colors.semantic-error}): Error states (also Consul red).
657
+ - **Amber 100** ({colors.amber-100}): Soft warm highlight — extracted but used sparingly.
658
+ - **Amber 200** ({colors.amber-200}): Saturated amber for caution badges.
659
+ - **Blue 7** ({colors.blue-7}): Deep navy used in unified-core gradients.
660
+
661
+ ## Typography
662
+
663
+ ### Font Family
664
+
665
+ - **hashicorpSans** — HashiCorp's proprietary marketing typeface. Geometric, clean, slightly humanist. Fallback stack `__hashicorpSans_Fallback_96f0ca` (system font), then `-apple-system, BlinkMacSystemFont, Segoe UI, helvetica, arial`.
666
+
667
+ The same family carries display, body, button, and caption — no separate display + body pairing. Hierarchy is carried by weight (500 body / 600 emphasis / 700 display) and by a deliberate line-height contrast (tight on display, relaxed on body).
668
+
669
+ ### Hierarchy
670
+
671
+ | Token | Size | Weight | Line Height | Letter Spacing | Use |
672
+ |---|---|---|---|---|---|
673
+ | `{typography.display-xl}` | 80px | 700 | 1.17 | -2.5px | Largest hero headline |
674
+ | `{typography.display-lg}` | 56px | 700 | 1.18 | -1.6px | Section opener headlines |
675
+ | `{typography.display-md}` | 40px | 600 | 1.19 | -1.0px | Sub-section headlines |
676
+ | `{typography.headline}` | 28px | 600 | 1.21 | -0.6px | Pricing tier titles, CTA banner heading |
677
+ | `{typography.card-title}` | 22px | 600 | 1.18 | -0.4px | Feature card title |
678
+ | `{typography.subhead}` | 20px | 600 | 1.35 | -0.2px | Long-form intro paragraphs |
679
+ | `{typography.body-lg}` | 18px | 500 | 1.69 | 0 | Hero subhead, lead body |
680
+ | `{typography.body}` | 16px | 500 | 1.50 | 0 | Default body |
681
+ | `{typography.body-sm}` | 14px | 500 | 1.71 | 0 | Card body, footer columns |
682
+ | `{typography.caption}` | 13px | 500 | 1.38 | 0.2px | Meta, comparison cell labels |
683
+ | `{typography.button}` | 14px | 600 | 1.29 | 0 | Pill / square CTA buttons |
684
+ | `{typography.eyebrow}` | 12px | 600 | 1.23 | 0.6px | Uppercase section eyebrows |
685
+
686
+ ### Principles
687
+
688
+ - **Tight on display, relaxed on body.** Display sits at line-height 1.17–1.21; body lifts to 1.50–1.71. The size + line-height contrast carries hierarchy.
689
+ - **Weight hierarchy is small.** 500 body / 600 emphasis / 700 display. No light / black extremes — the brand reads as engineered.
690
+ - **Eyebrow positive-tracked uppercase 12px is the section header.** Every meaningful section has one above the headline.
691
+ - **No mono.** Despite being a developer-tools brand, the marketing surface uses no monospace face — code voice is reserved for in-product surfaces.
692
+
693
+ ### Note on Font Substitutes
694
+
695
+ If implementing without hashicorpSans, suitable open-source substitutes include **Inter** (closest geometric character set), **Geist Sans**, or **IBM Plex Sans**. Inter at weights 500 / 600 / 700 closely approximates hashicorpSans's proportions; expect to manually adjust line-heights down by ~0.02 to match.
696
+
697
+ ## Layout
698
+
699
+ ### Spacing System
700
+
701
+ - **Base unit**: 8px (the primary increments are 4 / 8 / 12 / 16 / 24 / 32 / 48).
702
+ - **Tokens (front matter)**: `{spacing.hair}` 1px · `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 32px · `{spacing.xxl}` 48px · `{spacing.section}` 96px.
703
+ - Card interior padding: `{spacing.lg}` 24px on product cards; `{spacing.xl}` 32px on pricing cards; `{spacing.xxl}` 48px on CTA banners.
704
+ - Button padding: 10px vertical · 18px horizontal on `{components.button-primary}`.
705
+ - Universal rhythm constant: `{spacing.section}` (96px) vertical gap between major sections.
706
+
707
+ ### Grid & Container
708
+
709
+ - Max content width sits around 1280px with side gutters scaling from `{spacing.xxl}` on desktop down to `{spacing.lg}` on mobile.
710
+ - Product card grids are 3-up on desktop, 2-up at tablet, 1-up on mobile.
711
+ - Pricing tier grid is 3-up across desktop; comparison table beneath uses fixed-width left column.
712
+ - Resource directory (PDF library) uses 4-up dense thumbnail grid.
713
+
714
+ ### Whitespace Philosophy
715
+
716
+ The dark canvas IS the whitespace. Sections separate by surface lift (canvas → surface-1) rather than by gaps in white. Within a section, generous `{spacing.xl}` 32px gaps separate cards; `{spacing.lg}` 24px separates rows.
717
+
718
+ ## Elevation & Depth
719
+
720
+ | Level | Treatment | Use |
721
+ |---|---|---|
722
+ | 0 (flat) | No shadow, no border | Canvas-mounted display type, hero, footer |
723
+ | 1 (charcoal lift) | `{colors.surface-1}` background + 1px `rgba(178,182,189,0.1)` border | Default cards, resource tiles, pricing cards |
724
+ | 2 (surface-2 lift) | `{colors.surface-2}` background + 1px `{colors.hairline}` border | Featured pricing card, hovered cards, sub-nav |
725
+ | 3 (product chromatic) | Per-product accent color background — Terraform purple, Vault yellow, Waypoint cyan | Product showcase cards |
726
+
727
+ The product chromatic level isn't a "modal lift" — it's an identity device. A Terraform card sits at the same z-plane as a feature-card; the difference is meaning, not depth.
728
+
729
+ ### Decorative Depth
730
+
731
+ - **3D product visuals** — isometric purple cubes (Terraform), translucent yellow safes (Vault), and similar product-tinted illustrations sit in the right column of hero sections.
732
+ - **1px translucent gray hairlines** are the dominant edge — borders are visible without competing.
733
+ - **No drop shadows on dark.** Cards lift via surface change, never shadow.
734
+
735
+ ## Shapes
736
+
737
+ ### Border Radius Scale
738
+
739
+ | Token | Value | Use |
740
+ |---|---|---|
741
+ | `{rounded.xs}` | 4px | Small chips / badges |
742
+ | `{rounded.sm}` | 6px | Inline tag |
743
+ | `{rounded.md}` | 8px | All CTA buttons, form inputs, list items |
744
+ | `{rounded.lg}` | 12px | Feature cards, product cards, pricing cards |
745
+ | `{rounded.xl}` | 16px | Large illustrative tiles |
746
+ | `{rounded.xxl}` | 24px | CTA banner panels |
747
+ | `{rounded.pill}` | 9999px | Eyebrow-style product pills (small chips) |
748
+ | `{rounded.full}` | 9999px | Avatar circles (rare on marketing) |
749
+
750
+ ### Photography & Illustration Geometry
751
+
752
+ - Product 3D illustrations use full-bleed within their container — no rounded inner mask.
753
+ - Logo chips in the customer marquee sit on `{rounded.sm}` 6px tiles with 1px hairline.
754
+ - Resource thumbnails use `{rounded.lg}` 12px corners.
755
+
756
+ ## Components
757
+
758
+ ### Buttons
759
+
760
+ **`button-primary`** — White rounded-rect CTA. Used as primary CTA on all pages.
761
+ - Background `{colors.inverse-canvas}`, text `{colors.inverse-ink}`, type `{typography.button}`, padding 10px 18px, rounded `{rounded.md}`.
762
+ - Pressed state lives in `button-primary-pressed`.
763
+
764
+ **`button-secondary`** — Charcoal rounded-rect. Secondary CTA, "Read docs" / "Talk to sales".
765
+ - Background `{colors.surface-2}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.
766
+
767
+ **`button-tertiary`** — Bare ghost button on canvas with text-only treatment.
768
+ - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.
769
+
770
+ **`button-product-terraform`** — Terraform-tinted CTA on Terraform pages.
771
+ - Background `{colors.product-terraform}`, text `{colors.ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.
772
+
773
+ **`button-product-vault`** — Vault-yellow CTA.
774
+ - Background `{colors.product-vault}`, text `{colors.inverse-ink}` (yellow needs dark text), type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.
775
+
776
+ **`button-product-waypoint`** — Waypoint-cyan CTA.
777
+ - Background `{colors.product-waypoint}`, text `{colors.inverse-ink}`, type `{typography.button}`, rounded `{rounded.md}`, padding 10px 18px.
778
+
779
+ (Vagrant blue, Nomad green, Consul red, Boundary coral follow the same pattern with their respective `{colors.product-*}` token.)
780
+
781
+ ### Cards & Containers
782
+
783
+ **`product-card`** — Default product showcase card — surface-1 charcoal.
784
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.
785
+
786
+ **`product-card-terraform`** — Product card with Terraform purple ground (used as identity surface, not modal elevation).
787
+ - Background `{colors.product-terraform}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.
788
+
789
+ **`product-card-vault`** — Vault-yellow ground.
790
+ - Background `{colors.product-vault}`, text `{colors.inverse-ink}`, otherwise identical structure.
791
+
792
+ **`product-card-waypoint`** — Waypoint-cyan ground.
793
+ - Background `{colors.product-waypoint}`, text `{colors.inverse-ink}`, otherwise identical structure.
794
+
795
+ (Other product variants follow the same shape with their respective product token.)
796
+
797
+ **`feature-card`** — Generic feature highlight on surface-1.
798
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 24px.
799
+
800
+ **`pricing-card`** — Pricing tier on `/en/pricing`.
801
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.lg}`, padding 32px.
802
+
803
+ **`pricing-card-featured`** — Recommended tier (visually emphasized via surface lift).
804
+ - Background `{colors.surface-2}`, otherwise identical structure.
805
+
806
+ **`resource-card`** — PDF / whitepaper / guide tile in the resources directory.
807
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body-sm}`, rounded `{rounded.lg}`, padding 16px.
808
+
809
+ ### Inputs & Forms
810
+
811
+ **`text-input`** + **`text-input-focused`** — Form fields on pricing seat-count and contact forms.
812
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.body}`, rounded `{rounded.md}`, padding 10px 14px.
813
+ - Focused state retains the same surface; the focus ring is a 1px `{colors.accent-blue}` outline.
814
+
815
+ ### Pills & Chips
816
+
817
+ **`product-pill`** — Small product-name chip used above hero headlines and on resource cards to label which product a piece of content belongs to.
818
+ - Background `{colors.surface-1}`, text `{colors.ink-muted}`, type `{typography.caption}`, rounded `{rounded.pill}`, padding 4px 10px.
819
+
820
+ ### Comparison Table
821
+
822
+ **`comparison-row`** — Single row inside the pricing comparison table.
823
+ - Background `{colors.canvas}`, text `{colors.ink-muted}`, type `{typography.body-sm}`. Row separator is `{colors.hairline-soft}`.
824
+
825
+ ### CTA Banner
826
+
827
+ **`cta-banner`** — Large rounded panel used at the bottom of long-form pages with a closing CTA.
828
+ - Background `{colors.surface-1}`, text `{colors.ink}`, type `{typography.subhead}`, rounded `{rounded.xxl}`, padding 48px.
829
+
830
+ ### Navigation
831
+
832
+ **`top-nav`** — Sticky black bar with HashiCorp logomark left, primary nav links centered, and a `button-primary` ("Sign up") + `button-secondary` ("Sign in") pair right.
833
+ - Background `{colors.canvas}`, text `{colors.ink}`, type `{typography.body-sm}`, height 64px.
834
+ - Mobile: collapses primary links into a hamburger; the primary CTA remains visible.
835
+
836
+ ### Footer
837
+
838
+ **`footer`** — Dense link grid on `{colors.canvas}` with the wordmark at left and 5–6 columns of caption-sized links.
839
+ - Background `{colors.canvas}`, text `{colors.ink-muted}`, type `{typography.caption}`, padding 64px 32px.
840
+
841
+ ## Do's and Don'ts
842
+
843
+ ### Do
844
+
845
+ - Reserve `{colors.canvas}` (black) and `{colors.surface-1}` (charcoal) as the system's two anchor surfaces. Every band of the page is one or the other.
846
+ - When introducing a section about a specific HashiCorp product, use that product's `{colors.product-*}` token consistently — for the section pill, the CTA button, and (where appropriate) the showcase card background.
847
+ - Use `{rounded.md}` 8px on CTA buttons; HashiCorp's brand reads as engineered, not consumer.
848
+ - Pair tight display line-heights (1.17–1.21) with relaxed body line-heights (1.50–1.71). The contrast IS the brand voice.
849
+ - Use the eyebrow typography (`{typography.eyebrow}`, uppercase, 0.6px tracking) above every meaningful section.
850
+ - Use surface lift (canvas → surface-1 → surface-2) to express hierarchy on dark.
851
+ - Reserve product-chromatic cards for product identity; keep generic feature cards on `{colors.surface-1}`.
852
+
853
+ ### Don't
854
+
855
+ - Don't ship a light-mode marketing page. HashiCorp's marketing brand IS dark.
856
+ - Don't introduce mid-tone gray text outside the documented `ink` / `ink-muted` / `ink-subtle` set.
857
+ - Don't square off CTA corners — use `{rounded.md}` 8px, not 0px.
858
+ - Don't use a product accent color for a CTA on a page that isn't about that product. Terraform purple on the Vault page is a brand violation.
859
+ - Don't combine multiple product accents in the same viewport — the system says "this section is about THIS tool", and mixing accents breaks that signal.
860
+ - Don't add drop shadows on dark; surface lift carries elevation.
861
+ - Don't replace `hashicorpSans` with a display-only sans for headlines and a different family for body. The brand is held together by one family across the full hierarchy.
862
+
863
+ ## Responsive Behavior
864
+
865
+ ### Breakpoints
866
+
867
+ | Name | Width | Key Changes |
868
+ |---|---|---|
869
+ | Desktop-XL | 1440px | Default desktop layout |
870
+ | Desktop | 1280px | Pricing 3-up grid maintained |
871
+ | Tablet | 1024px | Product card grid 3-up → 2-up |
872
+ | Mobile-Lg | 768px | Pricing comparison becomes per-tier accordion; nav becomes hamburger |
873
+ | Mobile | 480px | Single-column everything; display-xl scales 80px → ~36px |
874
+
875
+ ### Touch Targets
876
+
877
+ - CTA buttons (`button-primary`, `button-secondary`) maintain ≥40px tap height across viewports.
878
+ - Product pills are 24px tall on desktop and grow to 28px on touch viewports.
879
+ - Form inputs hold ≥44px tap target on touch viewports.
880
+
881
+ ### Collapsing Strategy
882
+
883
+ - **Nav**: horizontal nav with right-anchored CTAs collapses to a hamburger overlay below 768px. The primary CTA stays visible on the bar.
884
+ - **Product card grid**: 3-up → 2-up at 1024px → 1-up below 768px.
885
+ - **Pricing comparison table**: collapses into per-tier accordions below 768px to avoid horizontal scroll.
886
+ - **Display type**: `{typography.display-xl}` 80px scales toward `{typography.display-md}` 40px on mobile while preserving the negative-tracking percentage.
887
+
888
+ ### Image Behavior
889
+
890
+ - 3D product illustrations (cubes, safes, etc.) maintain aspect ratio and never crop; below 768px they shrink rather than reflow.
891
+ - Customer logo marquee scales horizontally and may wrap to a second row at narrow widths.
892
+
893
+ ## Iteration Guide
894
+
895
+ 1. Focus on ONE component at a time and reference it by its `components:` token name.
896
+ 2. When introducing a new section, decide first whether it's a generic feature (surface-1) or a product-identity section (product-* color).
897
+ 3. Default body to `{typography.body}` at 500 weight; reach for `{typography.subhead}` only inside CTA banners and feature cards.
898
+ 4. Run `npx @google/design.md lint DESIGN.md` after edits.
899
+ 5. Add new product variants as separate component entries (`product-card-nomad`, `button-product-consul`, etc.).
900
+ 6. Treat the per-product palette as identity tokens, not decoration. If you reach for a product color outside its product context, the brand is drifting.
901
+ 7. Eyebrow type is mandatory above every section — skipping it makes sections read as floating.
902
+
903
+ ## Known Gaps
904
+
905
+ - The exact product-color hex values come from the `--mds-color-*` CSS variable set extracted directly; they are HashiCorp's canonical brand spec.
906
+ - Shadow tokens are not extensively documented because the dark surface system uses surface lift instead of shadow elevation.
907
+ - Form-field error and validation styling is not visible on the inspected pages.
908
+ - Dark mode is the only marketing mode — light-mode adaptation is not documented.
909
+ - Product-card variants for Consul, Nomad, Vagrant, and Boundary follow the documented Terraform / Vault / Waypoint pattern but are referenced in prose only; if they need formal entries they can be added as `product-card-consul`, `product-card-nomad`, etc.