@medquantis/design-system 0.0.0-stage → 1.0.1

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