@medquantis/design-system 0.0.0-stage → 1.0.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 (56) hide show
  1. package/LICENSE +44 -0
  2. package/README.md +145 -2
  3. package/brand/LICENSE +8 -0
  4. package/brand/favicon/apple-touch-icon.png +0 -0
  5. package/brand/favicon/favicon.ico +0 -0
  6. package/brand/favicon/favicon.svg +1 -0
  7. package/brand/favicon/icon-192.png +0 -0
  8. package/brand/favicon/icon-512.png +0 -0
  9. package/brand/monogram-small.svg +1 -0
  10. package/brand/monogram-square.svg +1 -0
  11. package/brand/monogram.svg +1 -0
  12. package/brand/wordmark-on-light-print.svg +1 -0
  13. package/brand/wordmark-on-light.svg +1 -0
  14. package/brand/wordmark-on-navy-print.svg +1 -0
  15. package/brand/wordmark-on-navy.svg +1 -0
  16. package/css/app.css +57 -0
  17. package/css/base.css +124 -0
  18. package/css/components.css +469 -0
  19. package/css/print.css +59 -0
  20. package/css/slide.css +110 -0
  21. package/dist/kit-contract.css +73 -0
  22. package/dist/llms-full.txt +942 -0
  23. package/dist/llms.txt +39 -0
  24. package/dist/tailwind.css +116 -0
  25. package/dist/tokens.css +179 -0
  26. package/dist/tokens.json +1802 -0
  27. package/fonts/fonts.css +76 -0
  28. package/fonts/geist-mono/OFL.txt +93 -0
  29. package/fonts/geist-mono/geist-mono-latin-ext-wght-normal.woff2 +0 -0
  30. package/fonts/geist-mono/geist-mono-latin-wght-normal.woff2 +0 -0
  31. package/fonts/newsreader/OFL.txt +93 -0
  32. package/fonts/newsreader/newsreader-latin-ext-wght-italic.woff2 +0 -0
  33. package/fonts/newsreader/newsreader-latin-ext-wght-normal.woff2 +0 -0
  34. package/fonts/newsreader/newsreader-latin-wght-italic.woff2 +0 -0
  35. package/fonts/newsreader/newsreader-latin-wght-normal.woff2 +0 -0
  36. package/fonts/outfit/OFL.txt +93 -0
  37. package/fonts/outfit/outfit-latin-ext-wght-normal.woff2 +0 -0
  38. package/fonts/outfit/outfit-latin-wght-normal.woff2 +0 -0
  39. package/guidelines/LICENSE +8 -0
  40. package/guidelines/README.md +310 -0
  41. package/guidelines/accessibility.md +62 -0
  42. package/guidelines/brand.md +75 -0
  43. package/guidelines/charts.md +84 -0
  44. package/guidelines/colour.md +102 -0
  45. package/guidelines/data-patterns.md +60 -0
  46. package/guidelines/layout.md +110 -0
  47. package/guidelines/principles.md +28 -0
  48. package/guidelines/specialising.md +40 -0
  49. package/guidelines/typography.md +76 -0
  50. package/guidelines/voice.md +42 -0
  51. package/guidelines/writing.md +40 -0
  52. package/icons/LICENSE +43 -0
  53. package/icons/lucide.min.js +12 -0
  54. package/icons/manifest.json +7 -0
  55. package/package.json +67 -4
  56. package/stylelint.config.mjs +52 -0
@@ -0,0 +1,469 @@
1
+ /*
2
+ * MedQuantis document components: cards, navy panel, KPI tiles, table, badges, callout,
3
+ * progress and distribution bars, legend, takeaway and footer.
4
+ * Documents are navy-only (ADR-0004): states read by mark style (solid, ring, pale, outline,
5
+ * quiet, dashed), never by a status hue. Status badges live in app.css.
6
+ * Text on a navy or tinted background names it in a mq-bg comment, so the contrast test can
7
+ * check the pair against tokens/contrast-pairs.json.
8
+ */
9
+ @layer mq.base, mq.components, mq.slide, mq.print, mq.app;
10
+
11
+ @layer mq.components {
12
+ /* Card */
13
+ :where(.mq-card) {
14
+ box-sizing: border-box;
15
+ padding: var(--mq-space-5);
16
+ border: var(--mq-stroke-hairline) solid var(--mq-border-light);
17
+ border-radius: var(--mq-radius-medium);
18
+ background-color: var(--mq-surface);
19
+ box-shadow: var(--mq-shadow-small);
20
+ color: var(--mq-ink);
21
+ }
22
+
23
+ :where(.mq-card-title) {
24
+ margin: 0 0 var(--mq-space-2);
25
+ color: var(--mq-ink);
26
+ font-family: var(--mq-font-family-heading);
27
+ font-size: var(--mq-font-size-h3);
28
+ font-weight: var(--mq-font-weight-heading);
29
+ line-height: 1.3;
30
+ }
31
+
32
+ :where(.mq-card-body) {
33
+ margin: 0;
34
+ color: var(--mq-muted);
35
+ font-family: var(--mq-font-family-body);
36
+ font-size: var(--mq-font-size-small);
37
+ line-height: 1.55;
38
+ }
39
+
40
+ /* Navy panel */
41
+ :where(.mq-panel) {
42
+ box-sizing: border-box;
43
+ padding: var(--mq-space-6);
44
+ border-radius: var(--mq-radius-medium);
45
+ background: linear-gradient(160deg, var(--mq-panel-start), var(--mq-panel-end));
46
+ box-shadow: var(--mq-shadow-panel);
47
+ color: var(--mq-on-navy-title);
48
+ }
49
+
50
+ :where(.mq-panel-kicker) {
51
+ /* mq-bg: --mq-panel-start */
52
+ margin: 0 0 var(--mq-space-2);
53
+ color: var(--mq-on-navy-secondary);
54
+ font-family: var(--mq-font-family-mono);
55
+ font-size: var(--mq-font-size-eyebrow);
56
+ letter-spacing: 0.16em;
57
+ text-transform: uppercase;
58
+ }
59
+
60
+ :where(.mq-panel-title) {
61
+ /* mq-bg: --mq-panel-start */
62
+ margin: 0;
63
+ color: var(--mq-on-navy-title);
64
+ font-family: var(--mq-font-family-heading);
65
+ font-size: var(--mq-font-size-h3);
66
+ font-weight: var(--mq-font-weight-heading);
67
+ line-height: 1.3;
68
+ }
69
+
70
+ :where(.mq-panel-text) {
71
+ /* mq-bg: --mq-panel-start */
72
+ margin: var(--mq-space-2) 0 0;
73
+ color: var(--mq-on-navy-second-level);
74
+ font-family: var(--mq-font-family-body);
75
+ font-size: var(--mq-font-size-small);
76
+ line-height: 1.55;
77
+ }
78
+
79
+ :where(.mq-panel-rule) {
80
+ /* mq-bg: --mq-panel-start */
81
+ margin: var(--mq-space-4) 0;
82
+ border: 0;
83
+ border-top: var(--mq-stroke-hairline) solid var(--mq-on-navy-rule);
84
+ }
85
+
86
+ :where(.mq-panel-icon) {
87
+ /* mq-bg: --mq-on-navy-pill --mq-panel-start */
88
+ display: inline-flex;
89
+ align-items: center;
90
+ justify-content: center;
91
+ width: var(--mq-space-7);
92
+ height: var(--mq-space-7);
93
+ border-radius: var(--mq-radius-medium);
94
+ background-color: var(--mq-on-navy-pill);
95
+ color: var(--mq-on-navy-title);
96
+ }
97
+
98
+ :where(.mq-panel a) {
99
+ /* mq-bg: --mq-panel-start */
100
+ color: var(--mq-on-navy-title);
101
+ }
102
+
103
+ :where(.mq-panel :focus-visible) {
104
+ /* mq-bg: --mq-panel-start */
105
+ outline-color: var(--mq-focus-ring-color-on-navy);
106
+ }
107
+
108
+ /* KPI tiles: default on surface, navy, pale */
109
+ :where(.mq-kpis) {
110
+ display: grid;
111
+ grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
112
+ gap: var(--mq-space-4);
113
+ }
114
+
115
+ :where(.mq-kpi) {
116
+ box-sizing: border-box;
117
+ padding: var(--mq-space-4) var(--mq-space-5);
118
+ border: var(--mq-stroke-hairline) solid var(--mq-border-light);
119
+ border-radius: var(--mq-radius-medium);
120
+ background-color: var(--mq-surface);
121
+ }
122
+
123
+ :where(.mq-kpi-label) {
124
+ margin: 0;
125
+ color: var(--mq-muted);
126
+ font-family: var(--mq-font-family-mono);
127
+ font-size: var(--mq-font-size-eyebrow);
128
+ letter-spacing: 0.14em;
129
+ text-transform: uppercase;
130
+ }
131
+
132
+ :where(.mq-kpi-value) {
133
+ margin: var(--mq-space-2) 0 0;
134
+ color: var(--mq-accent);
135
+ font-family: var(--mq-font-family-heading);
136
+ font-size: var(--mq-font-size-kpi);
137
+ font-weight: var(--mq-font-weight-heading);
138
+ font-variant-numeric: tabular-nums;
139
+ line-height: 1.1;
140
+ }
141
+
142
+ :where(.mq-kpi-caption) {
143
+ margin: var(--mq-space-1) 0 0;
144
+ color: var(--mq-muted);
145
+ font-family: var(--mq-font-family-body);
146
+ font-size: var(--mq-font-size-note);
147
+ }
148
+
149
+ :where(.mq-kpi.is-navy) {
150
+ border-color: transparent;
151
+ background: linear-gradient(160deg, var(--mq-panel-start), var(--mq-panel-end));
152
+ }
153
+
154
+ :where(.mq-kpi.is-navy .mq-kpi-label, .mq-kpi.is-navy .mq-kpi-caption) {
155
+ /* mq-bg: --mq-panel-start */
156
+ color: var(--mq-on-navy-secondary);
157
+ }
158
+
159
+ :where(.mq-kpi.is-navy .mq-kpi-value) {
160
+ /* mq-bg: --mq-panel-start */
161
+ color: var(--mq-on-navy-title);
162
+ }
163
+
164
+ :where(.mq-kpi.is-pale) {
165
+ border-color: transparent;
166
+ background-color: var(--mq-accent-pale);
167
+ }
168
+
169
+ :where(.mq-kpi.is-pale .mq-kpi-label, .mq-kpi.is-pale .mq-kpi-caption) {
170
+ /* mq-bg: --mq-accent-pale */
171
+ color: var(--mq-muted);
172
+ }
173
+
174
+ :where(.mq-kpi.is-pale .mq-kpi-value) {
175
+ /* mq-bg: --mq-accent-pale */
176
+ color: var(--mq-accent);
177
+ }
178
+
179
+ /* Table */
180
+ :where(.mq-table) {
181
+ width: 100%;
182
+ border-collapse: collapse;
183
+ color: var(--mq-ink);
184
+ font-family: var(--mq-font-family-body);
185
+ font-size: var(--mq-font-size-table-text);
186
+ }
187
+
188
+ :where(.mq-table th) {
189
+ padding: var(--mq-space-2) var(--mq-space-3);
190
+ border-bottom: var(--mq-stroke-hairline) solid var(--mq-border);
191
+ background-color: var(--mq-surface-alt);
192
+ color: var(--mq-muted);
193
+ font-family: var(--mq-font-family-mono);
194
+ font-size: var(--mq-font-size-table-header);
195
+ font-weight: var(--mq-font-weight-heading);
196
+ letter-spacing: 0.12em;
197
+ text-align: left;
198
+ text-transform: uppercase;
199
+ }
200
+
201
+ :where(.mq-table td) {
202
+ padding: var(--mq-space-2) var(--mq-space-3);
203
+ border-bottom: var(--mq-stroke-hairline) solid var(--mq-border-light);
204
+ color: var(--mq-ink);
205
+ vertical-align: top;
206
+ }
207
+
208
+ :where(.mq-table .mq-num) {
209
+ font-family: var(--mq-font-family-mono);
210
+ font-size: var(--mq-font-size-table-cell);
211
+ font-variant-numeric: tabular-nums;
212
+ text-align: right;
213
+ white-space: nowrap;
214
+ }
215
+
216
+ :where(.mq-table .is-key) {
217
+ color: var(--mq-accent);
218
+ font-weight: var(--mq-font-weight-heading);
219
+ }
220
+
221
+ :where(.mq-table tr.is-highlight > td) {
222
+ background-color: var(--mq-accent-pale);
223
+ }
224
+
225
+ :where(.mq-table tr.is-total > td) {
226
+ border-top: var(--mq-stroke-strong) solid var(--mq-accent);
227
+ border-bottom: 0;
228
+ font-weight: var(--mq-font-weight-heading);
229
+ }
230
+
231
+ /* Badges: state by mark style, never by hue */
232
+ :where(.mq-badge) {
233
+ display: inline-flex;
234
+ align-items: center;
235
+ gap: var(--mq-space-1);
236
+ box-sizing: border-box;
237
+ padding: 0 var(--mq-space-2);
238
+ border: var(--mq-stroke-hairline) solid transparent;
239
+ border-radius: var(--mq-radius-small);
240
+ font-family: var(--mq-font-family-ui);
241
+ font-size: var(--mq-font-size-eyebrow);
242
+ font-weight: var(--mq-font-weight-heading);
243
+ line-height: 1.8;
244
+ white-space: nowrap;
245
+ }
246
+
247
+ :where(.mq-badge.is-solid) {
248
+ background-color: var(--mq-accent);
249
+ color: var(--mq-on-accent);
250
+ }
251
+
252
+ :where(.mq-badge.is-ring) {
253
+ border-color: var(--mq-accent);
254
+ background-color: var(--mq-surface);
255
+ color: var(--mq-accent);
256
+ }
257
+
258
+ :where(.mq-badge.is-pale) {
259
+ background-color: var(--mq-accent-pale);
260
+ color: var(--mq-accent);
261
+ }
262
+
263
+ :where(.mq-badge.is-outline) {
264
+ border-color: var(--mq-border-strong);
265
+ background-color: var(--mq-surface);
266
+ color: var(--mq-ink);
267
+ }
268
+
269
+ :where(.mq-badge.is-quiet) {
270
+ background-color: var(--mq-accent-pale-2);
271
+ color: var(--mq-muted);
272
+ }
273
+
274
+ :where(.mq-badge.is-dashed) {
275
+ border-style: dashed;
276
+ border-color: var(--mq-border-strong);
277
+ background-color: var(--mq-surface);
278
+ color: var(--mq-muted);
279
+ }
280
+
281
+ /* Callout */
282
+ :where(.mq-callout) {
283
+ box-sizing: border-box;
284
+ padding: var(--mq-space-4) var(--mq-space-5);
285
+ border-left: var(--mq-stroke-tab) solid var(--mq-accent);
286
+ border-radius: 0 var(--mq-radius-small) var(--mq-radius-small) 0;
287
+ background-color: var(--mq-accent-pale-2);
288
+ color: var(--mq-ink);
289
+ }
290
+
291
+ :where(.mq-callout-title) {
292
+ /* mq-bg: --mq-accent-pale-2 */
293
+ margin: 0 0 var(--mq-space-1);
294
+ color: var(--mq-accent);
295
+ font-family: var(--mq-font-family-mono);
296
+ font-size: var(--mq-font-size-eyebrow);
297
+ letter-spacing: 0.14em;
298
+ text-transform: uppercase;
299
+ }
300
+
301
+ /* Progress bar */
302
+ :where(.mq-progress) {
303
+ display: grid;
304
+ grid-template-columns: minmax(0, 1fr) auto;
305
+ align-items: baseline;
306
+ gap: var(--mq-space-1) var(--mq-space-3);
307
+ }
308
+
309
+ :where(.mq-progress-label) {
310
+ color: var(--mq-muted);
311
+ font-family: var(--mq-font-family-ui);
312
+ font-size: var(--mq-font-size-label);
313
+ }
314
+
315
+ :where(.mq-progress-value) {
316
+ color: var(--mq-ink);
317
+ font-family: var(--mq-font-family-mono);
318
+ font-size: var(--mq-font-size-table-cell);
319
+ font-variant-numeric: tabular-nums;
320
+ }
321
+
322
+ :where(.mq-progress-track) {
323
+ grid-column: 1 / -1;
324
+ height: var(--mq-space-2);
325
+ overflow: hidden;
326
+ border-radius: var(--mq-radius-small);
327
+ background-color: var(--mq-accent-pale-2);
328
+ }
329
+
330
+ :where(.mq-progress-fill) {
331
+ height: 100%;
332
+ background-color: var(--mq-accent);
333
+ }
334
+
335
+ /* Distribution bar: parts of a whole in the ordered chart palette */
336
+ :where(.mq-distribution) {
337
+ display: flex;
338
+ gap: var(--mq-space-1);
339
+ height: var(--mq-space-3);
340
+ }
341
+
342
+ :where(.mq-segment) {
343
+ height: 100%;
344
+ background-color: var(--mq-chart-series-1);
345
+ }
346
+
347
+ :where(.mq-segment:first-child) {
348
+ border-radius: var(--mq-radius-small) 0 0 var(--mq-radius-small);
349
+ }
350
+
351
+ :where(.mq-segment:last-child) {
352
+ border-radius: 0 var(--mq-radius-small) var(--mq-radius-small) 0;
353
+ }
354
+
355
+ /* Legend swatch base; it precedes the series rules, which share its zero specificity. */
356
+ :where(.mq-swatch) {
357
+ flex: none;
358
+ box-sizing: border-box;
359
+ width: var(--mq-space-3);
360
+ height: var(--mq-space-3);
361
+ border-radius: var(--mq-radius-small);
362
+ background-color: var(--mq-chart-series-1);
363
+ }
364
+
365
+ :where(.mq-segment.is-1, .mq-swatch.is-1) {
366
+ background-color: var(--mq-chart-series-1);
367
+ }
368
+
369
+ :where(.mq-segment.is-2, .mq-swatch.is-2) {
370
+ background-color: var(--mq-chart-series-2);
371
+ }
372
+
373
+ :where(.mq-segment.is-3, .mq-swatch.is-3) {
374
+ background-color: var(--mq-chart-series-3);
375
+ }
376
+
377
+ :where(.mq-segment.is-4, .mq-swatch.is-4) {
378
+ background-color: var(--mq-chart-series-4);
379
+ }
380
+
381
+ :where(.mq-segment.is-rest, .mq-swatch.is-rest) {
382
+ box-sizing: border-box;
383
+ border: var(--mq-stroke-hairline) solid var(--mq-chart-series-4);
384
+ background-color: var(--mq-chart-rest);
385
+ }
386
+
387
+ /* Legend */
388
+ :where(.mq-legend) {
389
+ display: flex;
390
+ flex-wrap: wrap;
391
+ gap: var(--mq-space-2) var(--mq-space-4);
392
+ margin: 0;
393
+ padding: 0;
394
+ list-style: none;
395
+ }
396
+
397
+ :where(.mq-legend-item) {
398
+ display: inline-flex;
399
+ align-items: center;
400
+ gap: var(--mq-space-2);
401
+ color: var(--mq-muted);
402
+ font-family: var(--mq-font-family-ui);
403
+ font-size: var(--mq-font-size-label);
404
+ }
405
+
406
+ /* Column legend beside a ring: one item per line, the value at the right edge, the
407
+ remainder after a rule. The legend is as wide as its widest item. */
408
+ :where(.mq-legend.is-column) {
409
+ flex-direction: column;
410
+ flex-wrap: nowrap;
411
+ width: fit-content;
412
+ gap: var(--mq-space-2);
413
+ }
414
+
415
+ :where(.mq-legend.is-column .mq-legend-item) {
416
+ display: flex;
417
+ }
418
+
419
+ :where(.mq-legend-value) {
420
+ color: var(--mq-ink);
421
+ font-family: var(--mq-font-family-mono);
422
+ font-variant-numeric: tabular-nums;
423
+ text-align: right;
424
+ }
425
+
426
+ :where(.mq-legend.is-column .mq-legend-value) {
427
+ margin-left: auto;
428
+ padding-left: var(--mq-space-5);
429
+ }
430
+
431
+ :where(.mq-legend.is-column .mq-legend-item.is-rest) {
432
+ padding-top: var(--mq-space-2);
433
+ border-top: var(--mq-stroke-hairline) solid var(--mq-border);
434
+ }
435
+
436
+ :where(.mq-swatch.is-outline) {
437
+ border: var(--mq-stroke-hairline) solid var(--mq-border-strong);
438
+ background-color: var(--mq-surface);
439
+ }
440
+
441
+ :where(.mq-swatch.is-dashed) {
442
+ border: var(--mq-stroke-hairline) dashed var(--mq-border-strong);
443
+ background-color: var(--mq-surface);
444
+ }
445
+
446
+ /* Takeaway under a figure */
447
+ :where(.mq-takeaway) {
448
+ margin: var(--mq-space-4) 0 0;
449
+ padding: 0 0 0 var(--mq-space-3);
450
+ border-left: var(--mq-stroke-tab) solid var(--mq-accent);
451
+ color: var(--mq-ink);
452
+ font-family: var(--mq-font-family-heading);
453
+ font-size: var(--mq-font-size-takeaway);
454
+ font-weight: var(--mq-font-weight-heading);
455
+ line-height: 1.4;
456
+ }
457
+
458
+ /* Footer: sources, legal line, illustrative-data note */
459
+ :where(.mq-foot) {
460
+ margin: var(--mq-space-6) 0 0;
461
+ padding: var(--mq-space-3) 0 0;
462
+ border-top: var(--mq-stroke-hairline) solid var(--mq-border);
463
+ color: var(--mq-tertiary);
464
+ font-family: var(--mq-font-family-body);
465
+ font-size: var(--mq-font-size-note);
466
+ font-style: italic;
467
+ line-height: 1.5;
468
+ }
469
+ }
package/css/print.css ADDED
@@ -0,0 +1,59 @@
1
+ /*
2
+ * MedQuantis A4 print: one .mq-page per sheet (named page mq-a4), colours printed exactly,
3
+ * motion stopped. On screen the pages sit on the desk; the desk never reaches paper
4
+ * (owner ruling 9: every document page is the canvas colour).
5
+ */
6
+ @layer mq.base, mq.components, mq.slide, mq.print, mq.app;
7
+
8
+ @layer mq.print {
9
+ :where(.mq-desk) {
10
+ padding: var(--mq-space-6);
11
+ background-color: var(--mq-desk);
12
+ }
13
+
14
+ :where(.mq-page) {
15
+ box-sizing: border-box;
16
+ width: var(--mq-a4-width);
17
+ min-height: var(--mq-a4-height);
18
+ margin: 0 auto var(--mq-space-6);
19
+ padding: var(--mq-space-7) var(--mq-space-8);
20
+ background-color: var(--mq-canvas);
21
+ box-shadow: var(--mq-shadow-medium);
22
+ color: var(--mq-ink);
23
+ page: mq-a4;
24
+ }
25
+
26
+ @page mq-a4 {
27
+ size: A4;
28
+ margin: 0;
29
+ }
30
+
31
+ @media print {
32
+ :where(html, body) {
33
+ margin: 0;
34
+ padding: 0;
35
+ print-color-adjust: exact;
36
+ -webkit-print-color-adjust: exact;
37
+ }
38
+
39
+ :where(.mq-desk) {
40
+ padding: 0;
41
+ background-color: transparent;
42
+ }
43
+
44
+ :where(.mq-page) {
45
+ margin: 0;
46
+ box-shadow: none;
47
+ break-after: page;
48
+ }
49
+
50
+ :where(.mq-page *, .mq-slide *) {
51
+ animation: none;
52
+ transition: none;
53
+ }
54
+
55
+ :where(.mq-no-print) {
56
+ display: none;
57
+ }
58
+ }
59
+ }
package/css/slide.css ADDED
@@ -0,0 +1,110 @@
1
+ /*
2
+ * MedQuantis slide canvas: 1280 x 720, section label, title, body area, and a footer row with
3
+ * the legal line at the left and the slide number at the right (owner ruling 11).
4
+ * In print each slide is one page of its own size (named page mq-slide); @page cannot read
5
+ * custom properties, so its size restates the --mq-slide-width and --mq-slide-height tokens.
6
+ */
7
+ @layer mq.base, mq.components, mq.slide, mq.print, mq.app;
8
+
9
+ @layer mq.slide {
10
+ :where(.mq-slide) {
11
+ position: relative;
12
+ box-sizing: border-box;
13
+ width: var(--mq-slide-width);
14
+ height: var(--mq-slide-height);
15
+ overflow: hidden;
16
+ border-radius: var(--mq-radius-medium);
17
+ background-color: var(--mq-canvas);
18
+ box-shadow: var(--mq-shadow-medium);
19
+ color: var(--mq-ink);
20
+ font-family: var(--mq-font-family-body);
21
+ font-size: var(--mq-font-size-lead);
22
+ line-height: 1.5;
23
+ page: mq-slide;
24
+ }
25
+
26
+ :where(.mq-slide-label) {
27
+ position: absolute;
28
+ top: var(--mq-space-7);
29
+ left: var(--mq-space-8);
30
+ margin: 0;
31
+ color: var(--mq-accent);
32
+ font-family: var(--mq-font-family-mono);
33
+ font-size: var(--mq-font-size-eyebrow);
34
+ font-weight: var(--mq-font-weight-heading);
35
+ letter-spacing: 0.18em;
36
+ text-transform: uppercase;
37
+ }
38
+
39
+ :where(.mq-slide-title) {
40
+ position: absolute;
41
+ top: var(--mq-space-8);
42
+ right: var(--mq-space-8);
43
+ left: var(--mq-space-8);
44
+ margin: 0;
45
+ color: var(--mq-ink);
46
+ font-family: var(--mq-font-family-heading);
47
+ font-size: var(--mq-font-size-slide-title);
48
+ font-weight: var(--mq-font-weight-heading);
49
+ line-height: 1.15;
50
+ letter-spacing: -0.01em;
51
+ text-wrap: balance;
52
+ }
53
+
54
+ :where(.mq-slide-body) {
55
+ position: absolute;
56
+ top: calc(var(--mq-space-8) * 2);
57
+ right: var(--mq-space-8);
58
+ bottom: var(--mq-space-8);
59
+ left: var(--mq-space-8);
60
+ }
61
+
62
+ :where(.mq-slide-number) {
63
+ position: absolute;
64
+ right: var(--mq-space-8);
65
+ bottom: var(--mq-space-5);
66
+ color: var(--mq-tertiary);
67
+ font-family: var(--mq-font-family-mono);
68
+ font-size: var(--mq-font-size-eyebrow);
69
+ font-variant-numeric: tabular-nums;
70
+ }
71
+
72
+ /* Footer row: legal line at the left, slide number at the right, on one baseline. */
73
+ :where(.mq-slide-foot) {
74
+ position: absolute;
75
+ right: var(--mq-space-8);
76
+ bottom: var(--mq-space-5);
77
+ left: var(--mq-space-8);
78
+ display: flex;
79
+ align-items: baseline;
80
+ justify-content: space-between;
81
+ gap: var(--mq-space-5);
82
+ margin: 0;
83
+ color: var(--mq-tertiary);
84
+ font-family: var(--mq-font-family-mono);
85
+ font-size: var(--mq-font-size-note);
86
+ line-height: 1.4;
87
+ }
88
+
89
+ :where(.mq-slide-foot > *) {
90
+ margin: 0;
91
+ }
92
+
93
+ /* Inside the footer the number joins the row; on its own it keeps its position above. */
94
+ :where(.mq-slide-foot .mq-slide-number) {
95
+ position: static;
96
+ }
97
+
98
+ @page mq-slide {
99
+ size: 1280px 720px;
100
+ margin: 0;
101
+ }
102
+
103
+ @media print {
104
+ :where(.mq-slide) {
105
+ border-radius: 0;
106
+ box-shadow: none;
107
+ break-after: page;
108
+ }
109
+ }
110
+ }