@medquantis/design-system 1.2.0 → 1.4.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.
package/dist/tokens.css CHANGED
@@ -36,6 +36,13 @@
36
36
  --mq-core-amber-tint: #fbf3e7; /** Owner ruling 5, 2026-10-09: warning tint, the warning fill at 10 % on white; warning strong on it is 4.42:1, so text on the tint stays ink. */
37
37
  --mq-core-red: #d8232a; /** Swiss red, kept only as the danger status colour (ADR-0003, ADR-0004). */
38
38
  --mq-core-blue: #1565c0; /** Info hue for interactive apps (ADR-0004). */
39
+ --mq-core-app-green: #1c7e3f; /** App categorical green, a data category in interactive apps only, never the success status (ADR-0008). */
40
+ --mq-core-app-orange: #d78000; /** App categorical orange, marks and fills only, 3.01:1 on white (ADR-0008). */
41
+ --mq-core-app-orange-dark: #a35f00; /** Darker app categorical orange for text in that hue, 5.01:1 on white (ADR-0008). */
42
+ --mq-core-app-vermillion: #cf2a00; /** App categorical vermillion, a data category, never the danger status (ADR-0008). */
43
+ --mq-core-app-blue: #3a8ff5; /** App categorical blue, marks and fills only, 3.27:1 on white (ADR-0008). */
44
+ --mq-core-app-violet: #5a2fbe; /** App categorical violet (ADR-0008). */
45
+ --mq-core-app-teal: #178a91; /** App categorical teal, marks and fills only, 4.13:1 on white (ADR-0008). */
39
46
  --mq-core-font-family-outfit: Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif; /** Outfit, the sans for headings, labels and app UI (Owner ruling 10, 2026-10-09). */
40
47
  --mq-core-font-family-newsreader: Newsreader, Georgia, 'Times New Roman', serif; /** Newsreader, the only serif; Georgia and Times New Roman are fallbacks only (Owner ruling 10, 2026-10-09). */
41
48
  --mq-core-font-family-geist-mono: 'Geist Mono', ui-monospace, 'SF Mono', Menlo, monospace; /** Geist Mono for figures and codes (Owner ruling 10, 2026-10-09). */
@@ -68,6 +75,9 @@
68
75
  --mq-core-shadow-medium: 0px 3px 12px 0px rgba(0, 0, 0, 0.07); /** Medium elevation for a slide or page shown on the desk (increment 07 component need, Report design system, 2026-10-08). */
69
76
  --mq-core-shadow-panel: 0px 14px 36px 0px rgba(10, 36, 99, 0.24); /** Navy-tinted elevation for navy panels (increment 07 component need, Report design system, 2026-10-08). */
70
77
  --mq-core-shadow-none: 0px 0px 0px 0px rgba(0, 0, 0, 0); /** No shadow: a transparent layer of zero size, for a role that draws an edge in one theme only (owner ruling 14). */
78
+ --mq-core-shadow-live: 0px 0px 0px 3px rgba(46, 125, 50, 0.17); /** A 3 px ring of the success green at 17 %, the halo of a live mark in apps (ADR-0004, #38 component need). */
79
+ --mq-core-size-64: 64px; /** App sidebar collapsed to an icon rail, 64 px (#38 component need: the Maintainer app shell). */
80
+ --mq-core-size-248: 248px; /** App sidebar width, 248 px (#38 component need: the Maintainer app shell). */
71
81
  --mq-core-size-720: 720px; /** Slide canvas height, 720 px (increment 07 component need: the 1280 by 720 slide canvas). */
72
82
  --mq-core-size-760: 760px; /** Reading measure, 760 px (increment 07 component need, Report design system, 2026-10-08). */
73
83
  --mq-core-size-1040: 1040px; /** Content width of a screen document, 1040 px (increment 07 component need, Report design system, 2026-10-08). */
@@ -128,6 +138,17 @@
128
138
  --mq-warning-tint: #fbf3e7; /** Owner ruling 5, 2026-10-09: warning tint behind ink text; warning strong only for icons and borders on it. */
129
139
  --mq-dim: #707070; /** Retired name of the old tertiary grey; resolves to tertiary (Owner ruling 1, 2026-10-09). */
130
140
  --mq-accent-on-dark: #8795b3; /** Retired name of the accent on navy; resolves to the on-navy accent (Owner ruling 2, 2026-10-09). Use --mq-on-navy-title for titles and rules, --mq-on-navy-accent for the one-off accent. */
141
+ --mq-app-cat-green: #1c7e3f; /** App categorical hue: a many-category app chart or a data category, never a status and never in documents; text in it meets 4.5:1 (ADR-0008). */
142
+ --mq-app-cat-orange: #d78000; /** App categorical hue for marks and fills on the surface only (3.01:1); text in this hue reads app-cat-orange-text (ADR-0008). */
143
+ --mq-app-cat-orange-text: #a35f00; /** Text in the app categorical orange (counts, labels), 5.01:1 on the surface (ADR-0008). */
144
+ --mq-app-cat-vermillion: #cf2a00; /** App categorical hue: a data category, never the danger status, which stays for errors (ADR-0008). */
145
+ --mq-app-cat-blue: #3a8ff5; /** App categorical hue for marks and fills on the surface only (3.27:1), never text (ADR-0008). */
146
+ --mq-app-cat-violet: #5a2fbe; /** App categorical hue: marks, fills and text (ADR-0008). */
147
+ --mq-app-cat-teal: #178a91; /** App categorical hue for marks and fills on the surface only (4.13:1), never text (ADR-0008). */
148
+ --mq-change-added: #1c7e3f; /** Change type added, in apps only, always with its sign or its word: marks, fills and text (ADR-0008). */
149
+ --mq-change-modified: #d78000; /** Change type modified, in apps only, always with its word: marks and fills; its text reads change-modified-text (ADR-0008). */
150
+ --mq-change-modified-text: #a35f00; /** Text of the change type modified (counts, labels), in apps only (ADR-0008). */
151
+ --mq-change-removed: #cf2a00; /** Change type removed, in apps only, always with its sign or its word; a data category, never the danger status (ADR-0008). */
131
152
  --mq-focus-ring-color: #0a2463; /** Focus ring on light backgrounds: 2 px navy with an offset, 13.90:1 on canvas (research note 0001, section 7). */
132
153
  --mq-focus-ring-color-on-navy: #ffffff; /** Focus ring on navy backgrounds, 14.53:1. */
133
154
  --mq-focus-ring-width: 2px; /** Focus ring width (WCAG 2.4.7 and 1.4.11). */
@@ -150,12 +171,15 @@
150
171
  --mq-shadow-medium: 0px 3px 12px 0px rgba(0, 0, 0, 0.07); /** A slide or page previewed on the desk, never in print (increment 07 component need). */
151
172
  --mq-shadow-panel: 0px 14px 36px 0px rgba(10, 36, 99, 0.24); /** Navy panels (increment 07 component need). */
152
173
  --mq-shadow-edge: 0px 0px 0px 0px rgba(0, 0, 0, 0); /** The navy panel's edge for a navy mark that has no panel shadow: the monogram, a navy KPI tile, a navy brand or app tile. None in light; on dark the panel's 1 px light-navy outline (owner rulings 13 and 14). */
174
+ --mq-shadow-live: 0px 0px 0px 3px rgba(46, 125, 50, 0.17); /** Apps only: the halo around a live status dot, the row in force on a timeline; built on the success colour, so never in documents (ADR-0004). */
153
175
  --mq-slide-width: 1280px; /** Slide canvas width (increment 07 component need). */
154
176
  --mq-slide-height: 720px; /** Slide canvas height (increment 07 component need). */
155
177
  --mq-page-width: 1040px; /** Content width of a screen document (increment 07 component need). */
156
178
  --mq-page-measure: 760px; /** Longest line of running text (increment 07 component need). */
157
179
  --mq-a4-width: 793.7px; /** A4 sheet width (increment 07 component need). */
158
180
  --mq-a4-height: 1122.52px; /** A4 sheet height (increment 07 component need). */
181
+ --mq-sidebar-width: 248px; /** Apps only: the expanded app sidebar. */
182
+ --mq-sidebar-rail-width: 64px; /** Apps only: the app sidebar collapsed to an icon rail. */
159
183
  --mq-font-family-heading: Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif; /** Headings, column titles and hero figures (Owner ruling 4, 2026-10-09, Owner ruling 10, 2026-10-09). */
160
184
  --mq-font-family-body: Newsreader, Georgia, 'Times New Roman', serif; /** Body text of documents and slides, regulatory text in apps (Owner ruling 10, 2026-10-09). */
161
185
  --mq-font-family-ui: Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif; /** Labels and app UI (Owner ruling 10, 2026-10-09). */
package/dist/tokens.json CHANGED
@@ -319,6 +319,76 @@
319
319
  ],
320
320
  "description": "Info hue for interactive apps (ADR-0004)."
321
321
  },
322
+ "--mq-core-app-green": {
323
+ "value": "#1c7e3f",
324
+ "type": "color",
325
+ "path": [
326
+ "core",
327
+ "color",
328
+ "app-green"
329
+ ],
330
+ "description": "App categorical green, a data category in interactive apps only, never the success status (ADR-0008)."
331
+ },
332
+ "--mq-core-app-orange": {
333
+ "value": "#d78000",
334
+ "type": "color",
335
+ "path": [
336
+ "core",
337
+ "color",
338
+ "app-orange"
339
+ ],
340
+ "description": "App categorical orange, marks and fills only, 3.01:1 on white (ADR-0008)."
341
+ },
342
+ "--mq-core-app-orange-dark": {
343
+ "value": "#a35f00",
344
+ "type": "color",
345
+ "path": [
346
+ "core",
347
+ "color",
348
+ "app-orange-dark"
349
+ ],
350
+ "description": "Darker app categorical orange for text in that hue, 5.01:1 on white (ADR-0008)."
351
+ },
352
+ "--mq-core-app-vermillion": {
353
+ "value": "#cf2a00",
354
+ "type": "color",
355
+ "path": [
356
+ "core",
357
+ "color",
358
+ "app-vermillion"
359
+ ],
360
+ "description": "App categorical vermillion, a data category, never the danger status (ADR-0008)."
361
+ },
362
+ "--mq-core-app-blue": {
363
+ "value": "#3a8ff5",
364
+ "type": "color",
365
+ "path": [
366
+ "core",
367
+ "color",
368
+ "app-blue"
369
+ ],
370
+ "description": "App categorical blue, marks and fills only, 3.27:1 on white (ADR-0008)."
371
+ },
372
+ "--mq-core-app-violet": {
373
+ "value": "#5a2fbe",
374
+ "type": "color",
375
+ "path": [
376
+ "core",
377
+ "color",
378
+ "app-violet"
379
+ ],
380
+ "description": "App categorical violet (ADR-0008)."
381
+ },
382
+ "--mq-core-app-teal": {
383
+ "value": "#178a91",
384
+ "type": "color",
385
+ "path": [
386
+ "core",
387
+ "color",
388
+ "app-teal"
389
+ ],
390
+ "description": "App categorical teal, marks and fills only, 4.13:1 on white (ADR-0008)."
391
+ },
322
392
  "--mq-core-font-family-outfit": {
323
393
  "value": "Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif",
324
394
  "type": "fontFamily",
@@ -664,6 +734,36 @@
664
734
  ],
665
735
  "description": "No shadow: a transparent layer of zero size, for a role that draws an edge in one theme only (owner ruling 14)."
666
736
  },
737
+ "--mq-core-shadow-live": {
738
+ "value": "0px 0px 0px 3px rgba(46, 125, 50, 0.17)",
739
+ "type": "shadow",
740
+ "path": [
741
+ "core",
742
+ "shadow",
743
+ "live"
744
+ ],
745
+ "description": "A 3 px ring of the success green at 17 %, the halo of a live mark in apps (ADR-0004, #38 component need)."
746
+ },
747
+ "--mq-core-size-64": {
748
+ "value": "64px",
749
+ "type": "dimension",
750
+ "path": [
751
+ "core",
752
+ "size",
753
+ "64"
754
+ ],
755
+ "description": "App sidebar collapsed to an icon rail, 64 px (#38 component need: the Maintainer app shell)."
756
+ },
757
+ "--mq-core-size-248": {
758
+ "value": "248px",
759
+ "type": "dimension",
760
+ "path": [
761
+ "core",
762
+ "size",
763
+ "248"
764
+ ],
765
+ "description": "App sidebar width, 248 px (#38 component need: the Maintainer app shell)."
766
+ },
667
767
  "--mq-core-size-720": {
668
768
  "value": "720px",
669
769
  "type": "dimension",
@@ -1283,6 +1383,127 @@
1283
1383
  "description": "Retired name of the accent on navy; resolves to the on-navy accent (Owner ruling 2, 2026-10-09). Use --mq-on-navy-title for titles and rules, --mq-on-navy-accent for the one-off accent.",
1284
1384
  "deprecated": "Use --mq-on-navy-title for titles and rules, --mq-on-navy-accent for the one-off accent."
1285
1385
  },
1386
+ "--mq-app-cat-green": {
1387
+ "value": "#1c7e3f",
1388
+ "type": "color",
1389
+ "path": [
1390
+ "semantic",
1391
+ "color",
1392
+ "app-cat",
1393
+ "green"
1394
+ ],
1395
+ "description": "App categorical hue: a many-category app chart or a data category, never a status and never in documents; text in it meets 4.5:1 (ADR-0008)."
1396
+ },
1397
+ "--mq-app-cat-orange": {
1398
+ "value": "#d78000",
1399
+ "type": "color",
1400
+ "path": [
1401
+ "semantic",
1402
+ "color",
1403
+ "app-cat",
1404
+ "orange"
1405
+ ],
1406
+ "description": "App categorical hue for marks and fills on the surface only (3.01:1); text in this hue reads app-cat-orange-text (ADR-0008)."
1407
+ },
1408
+ "--mq-app-cat-orange-text": {
1409
+ "value": "#a35f00",
1410
+ "type": "color",
1411
+ "path": [
1412
+ "semantic",
1413
+ "color",
1414
+ "app-cat",
1415
+ "orange-text"
1416
+ ],
1417
+ "description": "Text in the app categorical orange (counts, labels), 5.01:1 on the surface (ADR-0008)."
1418
+ },
1419
+ "--mq-app-cat-vermillion": {
1420
+ "value": "#cf2a00",
1421
+ "type": "color",
1422
+ "path": [
1423
+ "semantic",
1424
+ "color",
1425
+ "app-cat",
1426
+ "vermillion"
1427
+ ],
1428
+ "description": "App categorical hue: a data category, never the danger status, which stays for errors (ADR-0008)."
1429
+ },
1430
+ "--mq-app-cat-blue": {
1431
+ "value": "#3a8ff5",
1432
+ "type": "color",
1433
+ "path": [
1434
+ "semantic",
1435
+ "color",
1436
+ "app-cat",
1437
+ "blue"
1438
+ ],
1439
+ "description": "App categorical hue for marks and fills on the surface only (3.27:1), never text (ADR-0008)."
1440
+ },
1441
+ "--mq-app-cat-violet": {
1442
+ "value": "#5a2fbe",
1443
+ "type": "color",
1444
+ "path": [
1445
+ "semantic",
1446
+ "color",
1447
+ "app-cat",
1448
+ "violet"
1449
+ ],
1450
+ "description": "App categorical hue: marks, fills and text (ADR-0008)."
1451
+ },
1452
+ "--mq-app-cat-teal": {
1453
+ "value": "#178a91",
1454
+ "type": "color",
1455
+ "path": [
1456
+ "semantic",
1457
+ "color",
1458
+ "app-cat",
1459
+ "teal"
1460
+ ],
1461
+ "description": "App categorical hue for marks and fills on the surface only (4.13:1), never text (ADR-0008)."
1462
+ },
1463
+ "--mq-change-added": {
1464
+ "value": "#1c7e3f",
1465
+ "type": "color",
1466
+ "path": [
1467
+ "semantic",
1468
+ "color",
1469
+ "change",
1470
+ "added"
1471
+ ],
1472
+ "description": "Change type added, in apps only, always with its sign or its word: marks, fills and text (ADR-0008)."
1473
+ },
1474
+ "--mq-change-modified": {
1475
+ "value": "#d78000",
1476
+ "type": "color",
1477
+ "path": [
1478
+ "semantic",
1479
+ "color",
1480
+ "change",
1481
+ "modified"
1482
+ ],
1483
+ "description": "Change type modified, in apps only, always with its word: marks and fills; its text reads change-modified-text (ADR-0008)."
1484
+ },
1485
+ "--mq-change-modified-text": {
1486
+ "value": "#a35f00",
1487
+ "type": "color",
1488
+ "path": [
1489
+ "semantic",
1490
+ "color",
1491
+ "change",
1492
+ "modified-text"
1493
+ ],
1494
+ "description": "Text of the change type modified (counts, labels), in apps only (ADR-0008)."
1495
+ },
1496
+ "--mq-change-removed": {
1497
+ "value": "#cf2a00",
1498
+ "type": "color",
1499
+ "path": [
1500
+ "semantic",
1501
+ "color",
1502
+ "change",
1503
+ "removed"
1504
+ ],
1505
+ "description": "Change type removed, in apps only, always with its sign or its word; a data category, never the danger status (ADR-0008)."
1506
+ },
1286
1507
  "--mq-focus-ring-color": {
1287
1508
  "value": "#0a2463",
1288
1509
  "type": "color",
@@ -1505,6 +1726,16 @@
1505
1726
  ],
1506
1727
  "description": "The navy panel's edge for a navy mark that has no panel shadow: the monogram, a navy KPI tile, a navy brand or app tile. None in light; on dark the panel's 1 px light-navy outline (owner rulings 13 and 14)."
1507
1728
  },
1729
+ "--mq-shadow-live": {
1730
+ "value": "0px 0px 0px 3px rgba(46, 125, 50, 0.17)",
1731
+ "type": "shadow",
1732
+ "path": [
1733
+ "semantic",
1734
+ "shadow",
1735
+ "live"
1736
+ ],
1737
+ "description": "Apps only: the halo around a live status dot, the row in force on a timeline; built on the success colour, so never in documents (ADR-0004)."
1738
+ },
1508
1739
  "--mq-slide-width": {
1509
1740
  "value": "1280px",
1510
1741
  "type": "dimension",
@@ -1565,6 +1796,26 @@
1565
1796
  ],
1566
1797
  "description": "A4 sheet height (increment 07 component need)."
1567
1798
  },
1799
+ "--mq-sidebar-width": {
1800
+ "value": "248px",
1801
+ "type": "dimension",
1802
+ "path": [
1803
+ "semantic",
1804
+ "sidebar",
1805
+ "width"
1806
+ ],
1807
+ "description": "Apps only: the expanded app sidebar."
1808
+ },
1809
+ "--mq-sidebar-rail-width": {
1810
+ "value": "64px",
1811
+ "type": "dimension",
1812
+ "path": [
1813
+ "semantic",
1814
+ "sidebar",
1815
+ "rail-width"
1816
+ ],
1817
+ "description": "Apps only: the app sidebar collapsed to an icon rail."
1818
+ },
1568
1819
  "--mq-font-family-heading": {
1569
1820
  "value": "Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif",
1570
1821
  "type": "fontFamily",
@@ -14,6 +14,7 @@ The MedQuantis brand, writing, colour, type, layout, chart, data and accessibili
14
14
  | [charts.md](charts.md) | The ordered palette, highlight on grey, sequential and diverging use, marks, legends |
15
15
  | [data-patterns.md](data-patterns.md) | Numbers, amounts, dates, null versus zero, confidential and illustrative data |
16
16
  | [accessibility.md](accessibility.md) | WCAG 2.2 AA, contrast pairs, focus, targets, motion, structure |
17
+ | [app-patterns.md](app-patterns.md) | Apps only: the app shell, and the review, decision and history patterns of dense internal tools |
17
18
  | [specialising.md](specialising.md) | Framework neutrality, the four rules, the promotion tests, the one-off log |
18
19
 
19
20
  The values themselves live in `tokens/` and reach these pages as `--mq-*` names; when a guideline and a token disagree, the token is right and the guideline is fixed. The generated specimen (`make specimen`) is the visual reference: when a rendering is in doubt, it decides.
@@ -323,3 +324,5 @@ Owner rulings taken after the bootstrap plan, numbered on from ruling 11. Each i
323
324
  | 17 | 2026-10-15 | A deck's classification sits at the right of the slide footer, before the number, in the deck's language: the label only, never the C0 to C3 code. Amends ruling 11 | [layout.md](layout.md), [brand.md](brand.md) | Design pass of 2026-10-15 (the ADR-0007 decision log), Plan-0003 |
324
325
  | 18 | 2026-10-17 | Accent text on the pale fills (the pale KPI value, the pale badge, the callout title) reads `--mq-accent-highlight`, the accent itself in light | [colour.md](colour.md) | ADR-0007 |
325
326
  | 19 | 2026-10-17 | On the dark panel start, `--mq-on-navy-accent` is `#b2c2ed` and `--mq-on-navy-discreet` white at 50 %, large text or non-text only; the light values are unchanged | [colour.md](colour.md) | ADR-0007 |
327
+ | 20 | 2026-11-03 | Interactive apps may use the app categorical palette (six hues) and the change-type tokens built on it, light only; documents keep the ordered navy and blue-grey palette | [charts.md](charts.md), [colour.md](colour.md) | ADR-0008, issue #35 |
328
+ | 21 | 2026-11-03 | A one-series chart stays navy; no series uses a status token; the vermillion is a data category, never `--mq-danger`; marks sit on the surface; text in a hue meets 4.5:1; never colour alone | [charts.md](charts.md), [accessibility.md](accessibility.md) | ADR-0008, issue #35 |
@@ -11,7 +11,8 @@ Colour never carries meaning on its own (WCAG 1.4.1):
11
11
  - documents show states by mark style (solid, ring, pale, outline, quiet, dashed, struck through) and a page that uses these marks gives their key once, in a legend or a note;
12
12
  - apps pair every status colour with an icon or a word;
13
13
  - charts label the marks that use series 3 or 4, or give them an outline, since those colours are below 3:1 on the page ([charts](charts.md));
14
- - a change in a figure is shown by its sign, not by a colour or an arrow alone.
14
+ - a change in a figure is shown by its sign, not by a colour or an arrow alone;
15
+ - in apps, a mark in the app categorical palette carries a direct label, a legend entry, a sign or a word, since two of its hues share their lightness ([charts](charts.md)).
15
16
 
16
17
  ## Contrast pairs
17
18