getrelay 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/bin/relay.js +362 -0
  4. package/design-md/airbnb/DESIGN.md +545 -0
  5. package/design-md/airbnb/README.md +5 -0
  6. package/design-md/airtable/DESIGN.md +554 -0
  7. package/design-md/airtable/README.md +5 -0
  8. package/design-md/apple/DESIGN.md +562 -0
  9. package/design-md/apple/README.md +5 -0
  10. package/design-md/binance/DESIGN.md +634 -0
  11. package/design-md/binance/README.md +5 -0
  12. package/design-md/bmw/DESIGN.md +544 -0
  13. package/design-md/bmw/README.md +5 -0
  14. package/design-md/bmw-m/DESIGN.md +503 -0
  15. package/design-md/bmw-m/README.md +5 -0
  16. package/design-md/bugatti/DESIGN.md +454 -0
  17. package/design-md/bugatti/README.md +5 -0
  18. package/design-md/cal/DESIGN.md +542 -0
  19. package/design-md/cal/README.md +5 -0
  20. package/design-md/claude/DESIGN.md +589 -0
  21. package/design-md/claude/README.md +5 -0
  22. package/design-md/clay/DESIGN.md +541 -0
  23. package/design-md/clay/README.md +5 -0
  24. package/design-md/clickhouse/DESIGN.md +544 -0
  25. package/design-md/clickhouse/README.md +5 -0
  26. package/design-md/cohere/DESIGN.md +451 -0
  27. package/design-md/cohere/README.md +5 -0
  28. package/design-md/coinbase/DESIGN.md +570 -0
  29. package/design-md/coinbase/README.md +5 -0
  30. package/design-md/composio/DESIGN.md +506 -0
  31. package/design-md/composio/README.md +5 -0
  32. package/design-md/cursor/DESIGN.md +537 -0
  33. package/design-md/cursor/README.md +5 -0
  34. package/design-md/elevenlabs/DESIGN.md +504 -0
  35. package/design-md/elevenlabs/README.md +5 -0
  36. package/design-md/expo/DESIGN.md +526 -0
  37. package/design-md/expo/README.md +5 -0
  38. package/design-md/ferrari/DESIGN.md +531 -0
  39. package/design-md/ferrari/README.md +5 -0
  40. package/design-md/figma/DESIGN.md +578 -0
  41. package/design-md/figma/README.md +5 -0
  42. package/design-md/framer/DESIGN.md +544 -0
  43. package/design-md/framer/README.md +5 -0
  44. package/design-md/hashicorp/DESIGN.md +575 -0
  45. package/design-md/hashicorp/README.md +5 -0
  46. package/design-md/ibm/DESIGN.md +550 -0
  47. package/design-md/ibm/README.md +5 -0
  48. package/design-md/intercom/DESIGN.md +546 -0
  49. package/design-md/intercom/README.md +5 -0
  50. package/design-md/kraken/DESIGN.md +125 -0
  51. package/design-md/kraken/README.md +5 -0
  52. package/design-md/lamborghini/DESIGN.md +288 -0
  53. package/design-md/lamborghini/README.md +5 -0
  54. package/design-md/linear.app/DESIGN.md +548 -0
  55. package/design-md/linear.app/README.md +5 -0
  56. package/design-md/lovable/DESIGN.md +298 -0
  57. package/design-md/lovable/README.md +5 -0
  58. package/design-md/mastercard/DESIGN.md +365 -0
  59. package/design-md/mastercard/README.md +5 -0
  60. package/design-md/meta/DESIGN.md +683 -0
  61. package/design-md/meta/README.md +5 -0
  62. package/design-md/minimax/DESIGN.md +746 -0
  63. package/design-md/minimax/README.md +5 -0
  64. package/design-md/mintlify/DESIGN.md +852 -0
  65. package/design-md/mintlify/README.md +5 -0
  66. package/design-md/miro/DESIGN.md +825 -0
  67. package/design-md/miro/README.md +5 -0
  68. package/design-md/mistral.ai/DESIGN.md +773 -0
  69. package/design-md/mistral.ai/README.md +5 -0
  70. package/design-md/mongodb/DESIGN.md +767 -0
  71. package/design-md/mongodb/README.md +5 -0
  72. package/design-md/nike/DESIGN.md +575 -0
  73. package/design-md/nike/README.md +5 -0
  74. package/design-md/notion/DESIGN.md +821 -0
  75. package/design-md/notion/README.md +5 -0
  76. package/design-md/nvidia/DESIGN.md +640 -0
  77. package/design-md/nvidia/README.md +5 -0
  78. package/design-md/ollama/DESIGN.md +539 -0
  79. package/design-md/ollama/README.md +5 -0
  80. package/design-md/opencode.ai/DESIGN.md +521 -0
  81. package/design-md/opencode.ai/README.md +5 -0
  82. package/design-md/pinterest/DESIGN.md +597 -0
  83. package/design-md/pinterest/README.md +5 -0
  84. package/design-md/playstation/DESIGN.md +661 -0
  85. package/design-md/playstation/README.md +5 -0
  86. package/design-md/posthog/DESIGN.md +690 -0
  87. package/design-md/posthog/README.md +5 -0
  88. package/design-md/raycast/DESIGN.md +669 -0
  89. package/design-md/raycast/README.md +5 -0
  90. package/design-md/renault/DESIGN.md +589 -0
  91. package/design-md/renault/README.md +5 -0
  92. package/design-md/replicate/DESIGN.md +616 -0
  93. package/design-md/replicate/README.md +5 -0
  94. package/design-md/resend/DESIGN.md +585 -0
  95. package/design-md/resend/README.md +5 -0
  96. package/design-md/revolut/DESIGN.md +636 -0
  97. package/design-md/revolut/README.md +5 -0
  98. package/design-md/runwayml/DESIGN.md +244 -0
  99. package/design-md/runwayml/README.md +5 -0
  100. package/design-md/sanity/DESIGN.md +357 -0
  101. package/design-md/sanity/README.md +5 -0
  102. package/design-md/sentry/DESIGN.md +551 -0
  103. package/design-md/sentry/README.md +5 -0
  104. package/design-md/shopify/DESIGN.md +516 -0
  105. package/design-md/shopify/README.md +5 -0
  106. package/design-md/slack/DESIGN.md +482 -0
  107. package/design-md/spacex/DESIGN.md +363 -0
  108. package/design-md/spacex/README.md +5 -0
  109. package/design-md/spotify/DESIGN.md +246 -0
  110. package/design-md/spotify/README.md +5 -0
  111. package/design-md/starbucks/DESIGN.md +580 -0
  112. package/design-md/starbucks/README.md +5 -0
  113. package/design-md/stripe/DESIGN.md +487 -0
  114. package/design-md/stripe/README.md +5 -0
  115. package/design-md/supabase/DESIGN.md +462 -0
  116. package/design-md/supabase/README.md +5 -0
  117. package/design-md/superhuman/DESIGN.md +448 -0
  118. package/design-md/superhuman/README.md +5 -0
  119. package/design-md/tesla/DESIGN.md +286 -0
  120. package/design-md/tesla/README.md +5 -0
  121. package/design-md/theverge/DESIGN.md +339 -0
  122. package/design-md/theverge/README.md +5 -0
  123. package/design-md/together.ai/DESIGN.md +633 -0
  124. package/design-md/together.ai/README.md +5 -0
  125. package/design-md/uber/DESIGN.md +636 -0
  126. package/design-md/uber/README.md +5 -0
  127. package/design-md/vercel/DESIGN.md +736 -0
  128. package/design-md/vercel/README.md +5 -0
  129. package/design-md/vodafone/DESIGN.md +538 -0
  130. package/design-md/vodafone/README.md +5 -0
  131. package/design-md/voltagent/DESIGN.md +521 -0
  132. package/design-md/voltagent/README.md +5 -0
  133. package/design-md/warp/DESIGN.md +526 -0
  134. package/design-md/warp/README.md +5 -0
  135. package/design-md/webflow/DESIGN.md +588 -0
  136. package/design-md/webflow/README.md +5 -0
  137. package/design-md/wired/DESIGN.md +497 -0
  138. package/design-md/wired/README.md +5 -0
  139. package/design-md/wise/DESIGN.md +544 -0
  140. package/design-md/wise/README.md +5 -0
  141. package/design-md/x.ai/DESIGN.md +465 -0
  142. package/design-md/x.ai/README.md +5 -0
  143. package/design-md/zapier/DESIGN.md +537 -0
  144. package/design-md/zapier/README.md +5 -0
  145. package/package.json +31 -0
@@ -0,0 +1,503 @@
1
+ ---
2
+ version: alpha
3
+ name: BMW M
4
+ description: A motorsport-engineering interface anchored on a near-black canvas with white BMW Type Next Latin display headlines in confident UPPERCASE. The brand carries no decorative voltage — its energy comes from full-bleed automotive photography (cars on tracks, driver-cockpit shots, carbon-fiber detail) and the iconic M tricolor stripe (light blue → dark blue → red) used sparingly as a brand signature on logos, dividers, and motorsport chrome. Type stays light to medium weight to feel European-engineered, never American-bombastic.
5
+
6
+ colors:
7
+ primary: "#ffffff"
8
+ ink: "#ffffff"
9
+ body: "#bbbbbb"
10
+ body-strong: "#e6e6e6"
11
+ muted: "#7e7e7e"
12
+ hairline: "#3c3c3c"
13
+ hairline-strong: "#262626"
14
+ canvas: "#000000"
15
+ surface-card: "#1a1a1a"
16
+ surface-elevated: "#262626"
17
+ surface-soft: "#0d0d0d"
18
+ on-primary: "#000000"
19
+ on-dark: "#ffffff"
20
+ m-blue-light: "#0066b1"
21
+ m-blue-dark: "#1c69d4"
22
+ m-red: "#e22718"
23
+ bmw-blue: "#1c69d4"
24
+ electric-blue: "#0653b6"
25
+ carbon-gray: "#2b2b2b"
26
+ warning: "#f4b400"
27
+ success: "#0fa336"
28
+
29
+ typography:
30
+ display-xl:
31
+ fontFamily: "BMWTypeNextLatin, sans-serif"
32
+ fontSize: 80px
33
+ fontWeight: 700
34
+ lineHeight: 1
35
+ letterSpacing: 0
36
+ display-lg:
37
+ fontFamily: "BMWTypeNextLatin, sans-serif"
38
+ fontSize: 56px
39
+ fontWeight: 700
40
+ lineHeight: 1.05
41
+ letterSpacing: 0
42
+ display-md:
43
+ fontFamily: "BMWTypeNextLatin, sans-serif"
44
+ fontSize: 40px
45
+ fontWeight: 700
46
+ lineHeight: 1.1
47
+ letterSpacing: 0
48
+ display-sm:
49
+ fontFamily: "BMWTypeNextLatin, sans-serif"
50
+ fontSize: 32px
51
+ fontWeight: 700
52
+ lineHeight: 1.15
53
+ letterSpacing: 0
54
+ title-lg:
55
+ fontFamily: "BMWTypeNextLatin, sans-serif"
56
+ fontSize: 24px
57
+ fontWeight: 700
58
+ lineHeight: 1.3
59
+ letterSpacing: 0
60
+ title-md:
61
+ fontFamily: "BMWTypeNextLatin, sans-serif"
62
+ fontSize: 20px
63
+ fontWeight: 400
64
+ lineHeight: 1.4
65
+ letterSpacing: 0
66
+ title-sm:
67
+ fontFamily: "BMWTypeNextLatin, sans-serif"
68
+ fontSize: 18px
69
+ fontWeight: 400
70
+ lineHeight: 1.4
71
+ letterSpacing: 0
72
+ label-uppercase:
73
+ fontFamily: "BMWTypeNextLatin, sans-serif"
74
+ fontSize: 14px
75
+ fontWeight: 700
76
+ lineHeight: 1.3
77
+ letterSpacing: 1.5px
78
+ body-md:
79
+ fontFamily: "BMWTypeNextLatin Light, BMWTypeNextLatin, sans-serif"
80
+ fontSize: 16px
81
+ fontWeight: 300
82
+ lineHeight: 1.5
83
+ letterSpacing: 0
84
+ body-sm:
85
+ fontFamily: "BMWTypeNextLatin Light, sans-serif"
86
+ fontSize: 14px
87
+ fontWeight: 300
88
+ lineHeight: 1.5
89
+ letterSpacing: 0
90
+ caption:
91
+ fontFamily: "BMWTypeNextLatin, sans-serif"
92
+ fontSize: 12px
93
+ fontWeight: 400
94
+ lineHeight: 1.4
95
+ letterSpacing: 0.5px
96
+ button:
97
+ fontFamily: "BMWTypeNextLatin, sans-serif"
98
+ fontSize: 14px
99
+ fontWeight: 700
100
+ lineHeight: 1
101
+ letterSpacing: 1.5px
102
+ nav-link:
103
+ fontFamily: "BMWTypeNextLatin, sans-serif"
104
+ fontSize: 14px
105
+ fontWeight: 400
106
+ lineHeight: 1.4
107
+ letterSpacing: 0.5px
108
+
109
+ rounded:
110
+ none: 0px
111
+ xs: 2px
112
+ sm: 4px
113
+ md: 6px
114
+ full: 9999px
115
+
116
+ spacing:
117
+ xxs: 4px
118
+ xs: 8px
119
+ sm: 12px
120
+ md: 16px
121
+ lg: 24px
122
+ xl: 40px
123
+ xxl: 64px
124
+ section: 96px
125
+
126
+ components:
127
+ button-primary:
128
+ backgroundColor: "{colors.canvas}"
129
+ textColor: "{colors.on-dark}"
130
+ typography: "{typography.button}"
131
+ rounded: "{rounded.none}"
132
+ padding: 16px 32px
133
+ height: 48px
134
+ button-primary-outline:
135
+ backgroundColor: transparent
136
+ textColor: "{colors.on-dark}"
137
+ typography: "{typography.button}"
138
+ rounded: "{rounded.none}"
139
+ padding: 16px 32px
140
+ height: 48px
141
+ button-on-light:
142
+ backgroundColor: "{colors.canvas}"
143
+ textColor: "{colors.on-dark}"
144
+ typography: "{typography.button}"
145
+ rounded: "{rounded.none}"
146
+ padding: 16px 32px
147
+ button-icon:
148
+ backgroundColor: "{colors.surface-card}"
149
+ textColor: "{colors.on-dark}"
150
+ rounded: "{rounded.full}"
151
+ size: 48px
152
+ text-link:
153
+ backgroundColor: transparent
154
+ textColor: "{colors.on-dark}"
155
+ typography: "{typography.label-uppercase}"
156
+ top-nav:
157
+ backgroundColor: "{colors.canvas}"
158
+ textColor: "{colors.on-dark}"
159
+ typography: "{typography.nav-link}"
160
+ height: 64px
161
+ hero-photo-band:
162
+ backgroundColor: "{colors.canvas}"
163
+ textColor: "{colors.on-dark}"
164
+ typography: "{typography.display-xl}"
165
+ padding: 96px
166
+ m-stripe-divider:
167
+ backgroundColor: transparent
168
+ textColor: "{colors.on-dark}"
169
+ height: 4px
170
+ feature-photo-card:
171
+ backgroundColor: "{colors.surface-card}"
172
+ textColor: "{colors.on-dark}"
173
+ typography: "{typography.title-md}"
174
+ rounded: "{rounded.none}"
175
+ padding: 24px
176
+ model-card:
177
+ backgroundColor: "{colors.canvas}"
178
+ textColor: "{colors.on-dark}"
179
+ typography: "{typography.title-lg}"
180
+ rounded: "{rounded.none}"
181
+ padding: 24px
182
+ magazine-article-card:
183
+ backgroundColor: "{colors.canvas}"
184
+ textColor: "{colors.on-dark}"
185
+ typography: "{typography.title-md}"
186
+ rounded: "{rounded.none}"
187
+ padding: 24px
188
+ spec-cell:
189
+ backgroundColor: "{colors.surface-soft}"
190
+ textColor: "{colors.on-dark}"
191
+ typography: "{typography.body-md}"
192
+ rounded: "{rounded.none}"
193
+ padding: 24px
194
+ cookie-consent-card:
195
+ backgroundColor: "{colors.canvas}"
196
+ textColor: "{colors.on-dark}"
197
+ typography: "{typography.body-sm}"
198
+ rounded: "{rounded.none}"
199
+ padding: 24px
200
+ category-tab:
201
+ backgroundColor: transparent
202
+ textColor: "{colors.body}"
203
+ typography: "{typography.label-uppercase}"
204
+ padding: 12px 0
205
+ category-tab-active:
206
+ backgroundColor: transparent
207
+ textColor: "{colors.on-dark}"
208
+ typography: "{typography.label-uppercase}"
209
+ padding: 12px 0
210
+ text-input:
211
+ backgroundColor: "{colors.surface-card}"
212
+ textColor: "{colors.on-dark}"
213
+ typography: "{typography.body-md}"
214
+ rounded: "{rounded.none}"
215
+ padding: 12px 16px
216
+ height: 48px
217
+ chatbot-launcher:
218
+ backgroundColor: "{colors.surface-card}"
219
+ textColor: "{colors.on-dark}"
220
+ typography: "{typography.title-md}"
221
+ rounded: "{rounded.none}"
222
+ padding: 24px
223
+ cta-band-photo:
224
+ backgroundColor: "{colors.canvas}"
225
+ textColor: "{colors.on-dark}"
226
+ typography: "{typography.display-md}"
227
+ padding: 80px
228
+ motorsport-photo-card:
229
+ backgroundColor: "{colors.canvas}"
230
+ textColor: "{colors.on-dark}"
231
+ typography: "{typography.title-md}"
232
+ rounded: "{rounded.none}"
233
+ carousel-arrow:
234
+ backgroundColor: "{colors.surface-card}"
235
+ textColor: "{colors.on-dark}"
236
+ rounded: "{rounded.full}"
237
+ size: 48px
238
+ footer:
239
+ backgroundColor: "{colors.canvas}"
240
+ textColor: "{colors.body}"
241
+ typography: "{typography.body-sm}"
242
+ padding: 64px
243
+ ---
244
+
245
+ ## Overview
246
+
247
+ BMW M's marketing surface is a near-pure black canvas (`{colors.canvas}` — #000) holding white BMW Type Next Latin headlines in **confident UPPERCASE**. The system has no decorative voltage of its own; brand energy comes from **full-bleed automotive photography** — cars cornering at speed, carbon-fiber wheel detail, driver cockpit shots, motorsport pit lanes — placed as edge-to-edge content that fills entire bands. UI chrome around the photography stays minimal: thin sans-serif copy, dividers as 1px hairlines (`{colors.hairline}`), all-caps button labels with no fill until hovered.
248
+
249
+ The **M tricolor stripe** — `{colors.m-blue-light}` (#0066b1) → `{colors.m-blue-dark}` (#1c69d4) → `{colors.m-red}` (#e22718) — appears sparingly as the brand's signature accent, used on the M wordmark, motorsport chrome, vehicle-tech callouts, and model badges. It is never a CTA color and never used as a background fill — the tricolor is exclusively a brand-identity marker.
250
+
251
+ Type voice runs **BMW Type Next Latin** in two cuts: regular for display + nav labels and Light for body + secondary copy. Display sizes use weight 700 (BMW's signature heavy-but-tight setting), while body type drops to weight 300 (Light). The contrast between heavy display and light body is the system's editorial signature.
252
+
253
+ **Key Characteristics:**
254
+ - Near-pure black canvas (`{colors.canvas}` — #000) with white type. The system inverts almost nothing — there is no light-mode marketing surface.
255
+ - Display headlines in UPPERCASE BMW Type Next Latin at weight 700. Sub-heads stay sentence-case at lighter weight.
256
+ - M tricolor (`{colors.m-blue-light}` / `{colors.m-blue-dark}` / `{colors.m-red}`) used as 4px brand-stripe dividers, M-wordmark accents, and motorsport chrome — never as buttons or fills.
257
+ - Photography fills entire bands edge-to-edge. Cars are always the visual subject; UI chrome backs off to small white labels overlaid on photography.
258
+ - Buttons are flat with `{rounded.none}` (0px) corners and uppercase letterspaced labels. The "industrial precision" rectangular silhouette IS the brand.
259
+ - Border radius is mostly zero across the system. The few exceptions: `{rounded.full}` on circular icon buttons (carousel arrows, chatbot launcher) and `{rounded.sm}` on a handful of small toggle pills.
260
+ - Spacing is generous and grid-aligned: `{spacing.section}` (96px) between major bands; `{spacing.xxl}` (64px) inside hero photo bands; `{spacing.xl}` (40px) inside content cards.
261
+
262
+ ## Colors
263
+
264
+ ### Brand & Accent
265
+ - **Primary** (`{colors.primary}` — #ffffff): The system's primary type and CTA color. Used for h1/h2/h3 display, body text on dark, and primary button labels (the buttons themselves are transparent or canvas-colored — the white text + outline IS the button).
266
+ - **M Blue Light** (`{colors.m-blue-light}` — #0066b1): The first stop in the M tricolor stripe. Used on M-badge accents and motorsport chrome.
267
+ - **M Blue Dark** (`{colors.m-blue-dark}` — #1c69d4): The middle stop. The same hex as `{colors.bmw-blue}` — BMW's heritage corporate blue, repurposed as the middle band of the M stripe.
268
+ - **M Red** (`{colors.m-red}` — #e22718): The third stop. The signature M-power red, used in the stripe and on motorsport-pace callouts.
269
+ - **Electric Blue** (`{colors.electric-blue}` — #0653b6): A separate electric-vehicle accent used on M xDrive electric model pages. Distinct from the heritage blue — feels colder, more digital.
270
+
271
+ ### Surface
272
+ - **Canvas** (`{colors.canvas}` — #000000): The default page floor across every marketing surface. True black.
273
+ - **Surface Soft** (`{colors.surface-soft}` — #0d0d0d): A barely-different-from-black used for spec table cells and footer-adjacent strips.
274
+ - **Surface Card** (`{colors.surface-card}` — #1a1a1a): Cards, secondary buttons, icon-button backgrounds.
275
+ - **Surface Elevated** (`{colors.surface-elevated}` — #262626): One step lighter, used for nested cards inside dark bands.
276
+ - **Carbon Gray** (`{colors.carbon-gray}` — #2b2b2b): Carbon-fiber-inspired surface tone used on technical-spec cards.
277
+
278
+ ### Hairlines & Borders
279
+ - **Hairline** (`{colors.hairline}` — #3c3c3c): The 1px divider tone on dark surfaces. Used between body sections, between table rows, around card outlines.
280
+ - **Hairline Strong** (`{colors.hairline-strong}` — #262626): Same hex as `{colors.surface-elevated}` — borders feel like one-step elevations rather than ink lines.
281
+
282
+ ### Text
283
+ - **Ink / On Dark** (`{colors.on-dark}` — #ffffff): All headline and primary text on dark canvas.
284
+ - **Body** (`{colors.body}` — #bbbbbb): Default running-text color (slightly cooler than pure white). Used for body paragraphs and secondary metadata.
285
+ - **Body Strong** (`{colors.body-strong}` — #e6e6e6): Emphasized body / lead paragraph.
286
+ - **Muted** (`{colors.muted}` — #7e7e7e): Footer links, breadcrumbs, captions.
287
+
288
+ ### Semantic
289
+ - **Warning** (`{colors.warning}` — #f4b400): Used very sparingly on technical-warning callouts.
290
+ - **Success** (`{colors.success}` — #0fa336): Order-confirmation states (rare on marketing surfaces).
291
+
292
+ ## Typography
293
+
294
+ ### Font Family
295
+ **BMW Type Next Latin** is BMW's licensed display + body typeface. The system uses two cuts: regular and Light. The fallback stack walks `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`.
296
+
297
+ The split is a deliberate weight-pair:
298
+ - Display (700) for headlines, navigation labels, button text, and category labels — the "stamped" voice
299
+ - Light (300) for body paragraphs, descriptive copy, and secondary metadata — the "engineered" voice
300
+
301
+ The contrast between heavy display and light body is BMW's editorial signature — never blur it by using regular (400) display or medium (500) body.
302
+
303
+ ### Hierarchy
304
+
305
+ | Token | Size | Weight | Line Height | Letter Spacing | Use |
306
+ |---|---|---|---|---|---|
307
+ | `{typography.display-xl}` | 80px | 700 | 1.0 | 0 | Hero h1 ("THE ULTIMATE", "MORE BMW M.") |
308
+ | `{typography.display-lg}` | 56px | 700 | 1.05 | 0 | Section heads ("MORE FROM BMW M MAGAZINE.") |
309
+ | `{typography.display-md}` | 40px | 700 | 1.1 | 0 | Sub-section heads, model names |
310
+ | `{typography.display-sm}` | 32px | 700 | 1.15 | 0 | CTA-band heads, category page titles |
311
+ | `{typography.title-lg}` | 24px | 700 | 1.3 | 0 | Card titles in 3-up grids |
312
+ | `{typography.title-md}` | 20px | 400 | 1.4 | 0 | Card sub-titles, lead paragraphs |
313
+ | `{typography.title-sm}` | 18px | 400 | 1.4 | 0 | Spec callouts, intro paragraphs |
314
+ | `{typography.label-uppercase}` | 14px | 700 | 1.3 | 1.5px | Category tabs, "VIEW MORE" inline labels |
315
+ | `{typography.body-md}` | 16px | 300 (Light) | 1.5 | 0 | Default body — BMW Type Next Latin Light |
316
+ | `{typography.body-sm}` | 14px | 300 (Light) | 1.5 | 0 | Footer body, cookie consent, fine print |
317
+ | `{typography.caption}` | 12px | 400 | 1.4 | 0.5px | Photo captions, image-credit lines |
318
+ | `{typography.button}` | 14px | 700 | 1.0 | 1.5px | All button labels — uppercase, letterspaced |
319
+ | `{typography.nav-link}` | 14px | 400 | 1.4 | 0.5px | Top-nav menu items |
320
+
321
+ ### Principles
322
+ The system contrasts heavy headlines (700) against very light body (300) at all times — the gap is the editorial signature. Letter-spacing is non-trivial: button labels and category labels carry 1.5px tracking that makes them feel "machined" rather than "typed." Display headlines stay at 0 letter-spacing — BMW Type's natural cap-height handles spacing on large sizes.
323
+
324
+ UPPERCASE display is the default voice for h1/h2 — sentence case appears on body and intro paragraphs but rarely on headlines. The all-caps treatment is a brand-voice signal, not a stylistic choice.
325
+
326
+ ### Note on Font Substitutes
327
+ If BMW Type Next Latin is unavailable, **Inter** (variable) at 700/300 is the closest open-source substitute. Adjust display headline tracking to -0.5px to match BMW Type's tighter spacing at large sizes. **Saira Condensed** is an alternative for headlines if a slightly more compressed feel is desired.
328
+
329
+ ## Layout
330
+
331
+ ### Spacing System
332
+ - **Base unit:** 4px.
333
+ - **Tokens:** `{spacing.xxs}` 4px · `{spacing.xs}` 8px · `{spacing.sm}` 12px · `{spacing.md}` 16px · `{spacing.lg}` 24px · `{spacing.xl}` 40px · `{spacing.xxl}` 64px · `{spacing.section}` 96px.
334
+ - **Section padding (vertical):** `{spacing.section}` (96px) between major editorial bands.
335
+ - **Hero photo bands:** `{spacing.xxl}` (64px) internal vertical padding around the hero h1 + sub-headline pair.
336
+ - **Card internal padding:** `{spacing.lg}` (24px) for content and model cards; `{spacing.xl}` (40px) for spec-cell tables.
337
+ - **Gutters:** `{spacing.lg}` (24px) between cards in 3-up grids; `{spacing.md}` (16px) inside footer columns.
338
+
339
+ ### Grid & Container
340
+ - **Max content width:** ~1440px centered on marketing pages — wider than typical SaaS to give photography breathing room.
341
+ - **Editorial body:** Single 12-column grid; photo bands bleed full-bleed (no max-width).
342
+ - **Card grids:** 3-up at desktop, 2-up at tablet, 1-up at mobile.
343
+ - **Footer:** 4-column link list at desktop, 2-up at tablet, 1-up at mobile.
344
+
345
+ ### Whitespace Philosophy
346
+ BMW M trusts photography to do the visual work. Whitespace around photography is restrained — the cars fill the frame, and copy sits below or beside them in tightly-aligned columns. Where whitespace appears (between body sections, around CTAs), it's always uniform `{spacing.section}` (96px). The system never adds atmospheric backdrops, gradients, or decoration — empty space stays as empty black canvas.
347
+
348
+ ## Elevation & Depth
349
+
350
+ | Level | Treatment | Use |
351
+ |---|---|---|
352
+ | Flat | No shadow, no border | Body sections, top nav, footer, photo bands |
353
+ | Soft hairline | 1px `{colors.hairline}` border | Section dividers, card outlines, table rows |
354
+ | Card surface | `{colors.surface-card}` background over canvas — no shadow | Feature photo cards, magazine cards, chatbot launcher |
355
+ | Photographic depth | Full-bleed photography with edge-to-edge crop | Hero bands, motorsport features — depth via subject matter, not chrome |
356
+
357
+ The system uses no drop shadows and no layered chrome. Depth comes entirely from photography (subject + lens + lighting) and the contrast between black canvas and slightly-elevated `{colors.surface-card}`.
358
+
359
+ ### Decorative Depth
360
+ - **M Stripe Divider** (`{component.m-stripe-divider}`): A 4px-tall horizontal divider carrying the M tricolor (`{colors.m-blue-light}` → `{colors.m-blue-dark}` → `{colors.m-red}`). Used on motorsport chrome, model-detail headers, and brand-identity moments. The stripe is the system's only true "decorative" element — used sparingly to mark significance.
361
+ - **Carbon-fiber surfaces**: The technical-spec page uses `{colors.carbon-gray}` (#2b2b2b) cells with subtle texture overlay. This is a single-page treatment, not a system-wide pattern.
362
+ - **Photographic depth**: Full-bleed cars are the depth. Lighting in the photography (track lights, sunset rim-light) does the elevation work that drop shadows would do in a SaaS system.
363
+
364
+ ## Shapes
365
+
366
+ ### Border Radius Scale
367
+
368
+ | Token | Value | Use |
369
+ |---|---|---|
370
+ | `{rounded.none}` | 0px | All buttons, cards, photo containers, spec cells, inputs — the dominant radius |
371
+ | `{rounded.xs}` | 2px | Almost no use — reserved for legal CTAs |
372
+ | `{rounded.sm}` | 4px | Small toggle pills on configurator surfaces |
373
+ | `{rounded.md}` | 6px | Rare — small dropdown menu items |
374
+ | `{rounded.full}` | 9999px / 50% | Circular icon buttons, carousel arrows, chatbot launcher |
375
+
376
+ The radius hierarchy is "almost always 0, sometimes circular." This binary radius decision is a deliberate brand-language choice — sharp rectangles read as engineered precision; circles read as functional controls. Nothing in between.
377
+
378
+ ### Photography Geometry
379
+ Hero photography fills full-width with no rounding. Photo cards inside grids retain `{rounded.none}` corners, edge-to-edge images. Carbon-wheel detail shots and motorsport-pit photos use 16:9 or 21:9 cinema-aspect ratios. Driver portraits in racing-team grids use 4:5 portrait crops, also with sharp corners.
380
+
381
+ ## Components
382
+
383
+ ### Top Navigation
384
+
385
+ **`top-nav`** — Black nav bar pinned to the top of every page. 64px tall, `{colors.canvas}` background. Carries the BMW M logo at left (M tricolor + BMW roundel + "M" wordmark), primary horizontal menu (Models, Topics, Magazine, Configurator, Fastlane), right-side cluster with language selector, search icon, account icon. Menu items render in `{typography.nav-link}` with sentence-case labels.
386
+
387
+ ### Buttons
388
+
389
+ **`button-primary`** — The signature primary CTA. Background `{colors.canvas}` (or transparent over photography), text `{colors.on-dark}` (white), 1px white border outline, rounded `{rounded.none}` (0px), padding 16px × 32px, height 48px. Type `{typography.button}` — uppercase 14px / 700 / 1.5px tracking. The rectangular silhouette and uppercase letterspaced label IS the brand button.
390
+
391
+ **`button-primary-outline`** — Same shape as primary but with transparent background and white outline only. Used over photography where a filled button would clash with the image.
392
+
393
+ **`button-on-light`** — Used on rare light-surface contexts (configurator, account dialogs). Background `{colors.canvas}`, text `{colors.on-dark}` — black button with white text, inverted from the dark-canvas default.
394
+
395
+ **`button-icon`** — Circular icon buttons (carousel controls, share, favorite). 48 × 48px, background `{colors.surface-card}`, white icon centered, rounded `{rounded.full}`. The only non-rectangular button shape in the system.
396
+
397
+ **`carousel-arrow`** — Specific 48 × 48 circular arrow used in photo carousels. Same shape as `{component.button-icon}` with chevron glyph.
398
+
399
+ **`text-link`** — Inline uppercase letterspaced links ("VIEW ALL MODELS", "READ MORE"). `{typography.label-uppercase}`, white on dark, no underline. The chevron arrow → glyph appears next to most link labels.
400
+
401
+ ### Cards & Containers
402
+
403
+ **`hero-photo-band`** — Full-width black band with full-bleed automotive photography filling most of the frame. The h1 uses `{typography.display-xl}` (80px / 700) and sits left-aligned over the photo, often with a small subtitle in `{typography.body-md}` below. Vertical padding `{spacing.xxl}` (64px). No card frame — the photo IS the band.
404
+
405
+ **`feature-photo-card`** — Used in 3-up grids for "MORE FROM BMW M MAGAZINE" and similar editorial sections. Background `{colors.surface-card}`, rounded `{rounded.none}`, internal padding `{spacing.lg}` (24px). Top half of the card is a 16:9 photo (full-bleed within the card); below the photo, a category tag in `{typography.label-uppercase}`, a `{typography.title-lg}` title, and a short body description.
406
+
407
+ **`model-card`** — Used in the "MORE NEW M MODELS" 3-up grid. Background `{colors.canvas}` (no card surface — just photo on black), rounded `{rounded.none}`. Top: 16:10 hero shot of the model. Below: model name in `{typography.display-md}` (40px / 700), short specs line in `{typography.body-sm}`, a `{component.text-link}` ("EXPLORE THIS MODEL").
408
+
409
+ **`magazine-article-card`** — A more text-forward card variant used on the magazine overview page. Background `{colors.canvas}` with hairline border, rounded `{rounded.none}`. Carries a small thumbnail at top, a category label in `{typography.label-uppercase}`, headline in `{typography.title-lg}`, and a body excerpt.
410
+
411
+ **`spec-cell`** — Technical specification cells used on model-detail pages (engine specs, weight, top speed, 0-100 time). Background `{colors.surface-soft}` (#0d0d0d), rounded `{rounded.none}`, padding `{spacing.lg}` (24px). Each cell holds a value in `{typography.display-sm}` (32px / 700) at top and a label in `{typography.label-uppercase}` below.
412
+
413
+ **`motorsport-photo-card`** — Edge-to-edge photo cards used in the racing-team / motorsport sections. No card surface — just a full-bleed photograph with a small overlay caption in white text at the bottom-left. The photography IS the brand here.
414
+
415
+ **`chatbot-launcher`** — A right-side card-style entry point ("BMW M CHATBOT") on the homepage. Background `{colors.surface-card}`, rounded `{rounded.none}`, padding `{spacing.lg}` (24px). Carries an h3 title, a short prompt, and a `{component.button-primary}` to launch.
416
+
417
+ **`category-tab`** + **`category-tab-active`** — The category selector tabs used on the magazine and topics pages (e.g., "ALL · MAGAZINE · MODELS · LIFESTYLE · MOTORSPORT"). Tabs render as text-only labels in `{typography.label-uppercase}`. Active state changes text color from `{colors.body}` to `{colors.on-dark}` and adds a 2px white underline below the label. No background fill, no rounded corners.
418
+
419
+ ### Inputs & Forms
420
+
421
+ **`text-input`** — Standard text input on dark surfaces. Background `{colors.surface-card}`, text `{colors.on-dark}`, type `{typography.body-md}`, rounded `{rounded.none}` (0px), padding 12px × 16px, height 48px. 1px hairline border. Focus state thickens the border to white.
422
+
423
+ **`cookie-consent-card`** — A right-side cookie-banner card visible on the homepage. Background `{colors.canvas}` with 1px hairline, rounded `{rounded.none}`, padding `{spacing.lg}` (24px). Body text in `{typography.body-sm}` (14px / 300) — Light weight even for legal text. Two buttons stacked at bottom: primary outline + text-link.
424
+
425
+ ### Signature Components
426
+
427
+ **`m-stripe-divider`** — The 4px horizontal stripe carrying the M tricolor (`{colors.m-blue-light}` → `{colors.m-blue-dark}` → `{colors.m-red}`). Used as a divider on motorsport chrome, between brand-identity sections, and as a hover-state indicator on category tabs. The most distinctive non-typographic element in the system.
428
+
429
+ **`cta-band-photo`** — A pre-footer "Drive an M" CTA band carrying full-bleed photography of a car cornering on a track, with a centered headline in `{typography.display-md}` and a `{component.button-primary-outline}` below. Vertical padding 80px. The CTA inherits the editorial gravity of the rest of the page through full-bleed photography rather than chrome.
430
+
431
+ ### Footer
432
+
433
+ **`footer`** — Black footer that closes every page. Background `{colors.canvas}`, text `{colors.body}`. 4-column link list at desktop covering BMW M Models / BMW M Lifestyle / Owners / Company. Vertical padding 64px. Bottom row carries the BMW corporate disclaimer in `{typography.caption}` and language selector. The footer never inverts — it stays black even when the body might transition.
434
+
435
+ ## Do's and Don'ts
436
+
437
+ ### Do
438
+ - Anchor every page with full-bleed automotive photography. The cars are the brand voltage; chrome backs off.
439
+ - Use UPPERCASE display headlines in `{typography.display-xl}` or `{typography.display-lg}`. Sentence-case display reads as off-brand.
440
+ - Pair heavy display (700) with light body (300). The weight contrast is the editorial signature.
441
+ - Reserve the M tricolor stripe for brand-identity moments — wordmark accents, motorsport chrome, model badges. Never as a button fill or surface.
442
+ - Use `{rounded.none}` (0px) by default. Reserve `{rounded.full}` for circular icon buttons only.
443
+ - Letter-space all-caps labels at 1.5px. The "machined" feel is non-negotiable.
444
+ - Use `{spacing.section}` (96px) between major editorial bands for grid-aligned vertical rhythm.
445
+
446
+ ### Don't
447
+ - Don't introduce a brand color outside the M tricolor (`{colors.m-blue-light}` / `{colors.m-blue-dark}` / `{colors.m-red}`) and the heritage `{colors.bmw-blue}`.
448
+ - Don't bold body type. Body stays at 300 (Light) — bumping to 400 or 500 makes the page feel marketing-bombastic instead of European-engineered.
449
+ - Don't use rounded buttons. The rectangular silhouette IS the brand. Rounded corners read as consumer-tech, not motorsport.
450
+ - Don't put gradient backdrops behind hero type. The hero IS the photography — the page floor stays pure black, and the photo provides the depth.
451
+ - Don't repeat the same surface mode in two consecutive bands. Rhythm: photo band → spec table → photo band → magazine grid → photo band. Two text-only bands in a row read as a corporate site.
452
+ - Don't use the M stripe as a button fill. The stripe is a divider / accent — never an action surface.
453
+ - Don't bold uppercase tracking under 1.5px on button labels — the spacing is what makes them feel "machined."
454
+
455
+ ## Responsive Behavior
456
+
457
+ ### Breakpoints
458
+
459
+ | Name | Width | Key Changes |
460
+ |---|---|---|
461
+ | Mobile | < 768px | Hamburger nav; hero h1 scales 80→48px; demo grid 1-up; photo cards stack full-width; footer 4 cols → 1 |
462
+ | Tablet | 768–1024px | Top nav stays horizontal but tightens; 2-up card grids; spec tables 2-up |
463
+ | Desktop | 1024–1440px | Full top-nav; 3-up card grids; spec tables 4-up |
464
+ | Wide | > 1440px | Same as desktop with more breathing room; max content 1440px |
465
+
466
+ ### Touch Targets
467
+ - `{component.button-primary}` renders at 48 × 48px minimum — meets WCAG AAA.
468
+ - `{component.button-icon}` and `{component.carousel-arrow}` are exactly 48 × 48 — comfortably above the 44 × 44 minimum.
469
+ - `{component.text-input}` height is 48px.
470
+ - Category tabs render as text-only labels with 12px vertical padding; effective tap area meets 44px with surrounding spacing.
471
+
472
+ ### Collapsing Strategy
473
+ - Top nav collapses to a hamburger sheet at < 768px; the menu opens as a full-screen black overlay with the M tricolor stripe at the top.
474
+ - Photography stays full-bleed at every breakpoint — never collapses to a margin'd container.
475
+ - Card grids reduce columns rather than scaling cards down; photography retains its native aspect ratio.
476
+ - Spec tables collapse from 4-up to 2-up to 1-up; spec values stay at `{typography.display-sm}` regardless of column count.
477
+ - The M-stripe divider stays at 4px height across all breakpoints.
478
+
479
+ ### Image Behavior
480
+ - Hero photography crops responsively — wider crops at desktop, vertical crops on mobile.
481
+ - Lifestyle and motorsport photos retain native aspect ratios; the system never letterboxes or pillarboxes.
482
+ - The M wordmark + tricolor logo scales proportionally with viewport width.
483
+
484
+ ## Iteration Guide
485
+
486
+ 1. Focus on ONE component at a time. Reference its YAML key (`{component.hero-photo-band}`, `{component.spec-cell}`).
487
+ 2. New components default to `{rounded.none}` (0px). Only use `{rounded.full}` if it's a circular icon button.
488
+ 3. Variants (`-active`, `-disabled`) live as separate entries in `components:`.
489
+ 4. Use `{token.refs}` everywhere — never inline hex.
490
+ 5. Never document hover states. Default and Active/Pressed only.
491
+ 6. Display headlines stay UPPERCASE 700; body stays sentence-case 300. Never blur the contrast.
492
+ 7. The M tricolor is brand-identity-only — never extend it to system tokens for "primary action."
493
+ 8. When in doubt about emphasis: bigger photography before bigger type.
494
+
495
+ ## Known Gaps
496
+
497
+ - The dembrandt frequency analyzer captured the white text (count 955) as the highest-frequency token. The black canvas was inferred from screenshot — dembrandt's body-background sampling didn't surface it as a top palette entry, but the page is unambiguously black-on-white-text.
498
+ - The exact M tricolor stops are documented from public BMW brand guidelines; the screenshots show the stripe as a small element but pixel-sampling at this resolution doesn't reliably distinguish #0066b1 from #1c69d4. Treat the documented stops as canonical based on BMW Design Works' published brand spec.
499
+ - BMW Type Next Latin weight axis values beyond Light (300) and regular (700) are not documented — only the static weights observed in screenshots.
500
+ - Animation and transition timings (photo carousel transitions, hover-reveal effects, configurator interactions) are not in scope.
501
+ - Form validation states beyond `{component.text-input}` defaults are not extracted — error / success input variants would need a configurator or order flow to confirm.
502
+ - The configurator surface (vehicle build pages with color / wheel / interior pickers) was not in the analyzed URL set; its swatch grid, comparison panels, and price-summary card are not documented here.
503
+ - The cookie consent overlay obscured part of the homepage hero in the captured screenshot; secondary hero treatments (different car models cycling through the hero band) may carry variations not captured.
@@ -0,0 +1,5 @@
1
+ # Bmw-m Inspired Design System
2
+
3
+ Design system details have been moved to: https://getdesign.md/bmw-m/design-md
4
+
5
+ You can also view previews, dark mode examples, and download options on getdesign.md.