@medquantis/design-system 1.1.0 → 1.3.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/README.md +36 -11
- package/css/app.css +1 -1
- package/css/components.css +20 -4
- package/css/kit/dark.css +6 -0
- package/css/kit/slide-frame.css +15 -2
- package/dist/DESIGN.md +518 -12
- package/dist/kit/brand.css +3 -3
- package/dist/kit/core.css +1 -1
- package/dist/kit/dark.css +47 -0
- package/dist/kit/dataviz.css +1 -1
- package/dist/kit/document.css +1 -1
- package/dist/kit/guidance.md +98 -6
- package/dist/kit/print.css +1 -1
- package/dist/kit/slide-frame.css +16 -3
- package/dist/kit/space-shape.css +1 -1
- package/dist/kit/type.css +1 -1
- package/dist/llms-full.txt +443 -12
- package/dist/llms.txt +24 -23
- package/dist/tailwind.css +12 -0
- package/dist/themes/dark.css +50 -0
- package/dist/themes/dark.json +446 -0
- package/dist/tokens.css +28 -0
- package/dist/tokens.json +292 -0
- package/guidelines/README.md +20 -2
- package/guidelines/accessibility.md +2 -1
- package/guidelines/app-patterns.md +281 -0
- package/guidelines/brand.md +6 -1
- package/guidelines/charts.md +33 -1
- package/guidelines/colour.md +86 -4
- package/guidelines/layout.md +3 -3
- package/icons/lucide.min.js +3 -3
- package/icons/manifest.json +2 -2
- package/kit-manifest.json +2 -1
- package/package.json +10 -6
package/dist/llms-full.txt
CHANGED
|
@@ -16,12 +16,13 @@ The MedQuantis brand, writing, colour, type, layout, chart, data and accessibili
|
|
|
16
16
|
| brand.md | Name, tagline, legal line, wordmark, monogram, favicon, icons |
|
|
17
17
|
| voice.md | Tone, words to prefer and avoid, languages, terminology in French, German, Italian and English |
|
|
18
18
|
| writing.md | No em or en dash, titles, sentences and lists, French typography |
|
|
19
|
-
| colour.md | Semantic colour tokens, the medium split, navy panels, states by mark style, status colours in apps |
|
|
19
|
+
| colour.md | Semantic colour tokens, the medium split, navy panels, states by mark style, status colours in apps, the dark theme |
|
|
20
20
|
| typography.md | Families, weights, roles, sizes and line heights |
|
|
21
21
|
| layout.md | Media, report skeleton, widths and spacing, radius, components, tables, app patterns, print |
|
|
22
22
|
| charts.md | The ordered palette, highlight on grey, sequential and diverging use, marks, legends |
|
|
23
23
|
| data-patterns.md | Numbers, amounts, dates, null versus zero, confidential and illustrative data |
|
|
24
24
|
| accessibility.md | WCAG 2.2 AA, contrast pairs, focus, targets, motion, structure |
|
|
25
|
+
| app-patterns.md | Apps only: the app shell, and the review, decision and history patterns of dense internal tools |
|
|
25
26
|
| specialising.md | Framework neutrality, the four rules, the promotion tests, the one-off log |
|
|
26
27
|
|
|
27
28
|
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.
|
|
@@ -84,6 +85,8 @@ Set it in Geist Mono at the note size, tertiary text colour (`--mq-tertiary`), w
|
|
|
84
85
|
|
|
85
86
|
On slides the legal line appears on every slide, bottom left, small and in tertiary grey, with the slide number bottom right (owner ruling 11). Use the slide footer row `mq-slide-foot` of `css/slide.css`, never `mq-foot`, which flows from the top of a slide canvas.
|
|
86
87
|
|
|
88
|
+
A deck that carries a classification shows it at the right of the footer, before the slide number, in the same small tertiary mono (owner ruling 17, amending ruling 11's two-cell footer). It is the label only, in the deck's language (Confidential in an English deck, Confidentiel in a French one), never the C0 to C3 code. A kit deck takes it from its `classification:` and `lang:`.
|
|
89
|
+
|
|
87
90
|
Material left with a reader (a deck after a meeting, a report sent outside) also carries a confidentiality mention and its date, in the document's language:
|
|
88
91
|
|
|
89
92
|
| Medium | French | German | English | Italian |
|
|
@@ -93,7 +96,7 @@ Material left with a reader (a deck after a meeting, a report sent outside) also
|
|
|
93
96
|
|
|
94
97
|
## Wordmark
|
|
95
98
|
|
|
96
|
-
The wordmark is the logo; no icon is required next to it. "Med" is set in Outfit 600 and "Quantis" in Outfit 300, in navy (`#0a2463`) on light backgrounds and in white on navy, at every size (owner
|
|
99
|
+
The wordmark is the logo; no icon is required next to it. "Med" is set in Outfit 600 and "Quantis" in Outfit 300, in navy (`#0a2463`) on light backgrounds and in white on navy and on every dark surface, at every size (owner rulings 6 and 14).
|
|
97
100
|
|
|
98
101
|
Each background has two files in `brand/`:
|
|
99
102
|
|
|
@@ -105,6 +108,7 @@ Each background has two files in `brand/`:
|
|
|
105
108
|
Rules:
|
|
106
109
|
|
|
107
110
|
- Use the on-navy file on navy and the on-light file on light backgrounds. Never recolour, stretch, outline, shadow or rearrange the wordmark.
|
|
111
|
+
- On dark (the dark theme, a dark slide or page), use the white `wordmark-on-navy` files on every dark surface: 18.13:1 on the dark canvas, 16.08:1 on the dark surface. The navy wordmark is never used on dark: it is 1.25:1 there (owner ruling 14).
|
|
108
112
|
- Inline the SVG rather than linking an external image, and remove its `width` and `height` so the page sizes it. On a report header the wordmark sits at about 198 by 44 px on screen and 162 by 36 px in print.
|
|
109
113
|
- A full stop in the on-navy accent (`--mq-on-navy-accent`) after a name is reserved for a one-word name on a navy cover. It is never added to the wordmark.
|
|
110
114
|
|
|
@@ -119,6 +123,8 @@ Where the wordmark does not fit (favicon, app icon, avatar, app tile), use the m
|
|
|
119
123
|
| `brand/monogram-small.svg` | 16 px and smaller: larger letters, M 800 and Q 600 |
|
|
120
124
|
| `brand/favicon/` | `favicon.svg`, `favicon.ico` (16, 32, 48), `apple-touch-icon.png` (180), `icon-192.png`, `icon-512.png` |
|
|
121
125
|
|
|
126
|
+
On dark (owner ruling 14) the monogram keeps its file and takes the navy panel's edge, the 1 px light-navy outline that `--mq-shadow-panel` draws in the dark theme, since its navy square is only 1.11:1 against the dark surface; in light it has no outline. A navy brand tile or app tile on dark takes the panel gradient (`--mq-panel-start` to `--mq-panel-end`), never the lifted accent, on which white is 3.48:1. No new brand file is needed.
|
|
127
|
+
|
|
122
128
|
## No combined logo yet
|
|
123
129
|
|
|
124
130
|
There is no lockup of the monogram and the wordmark in v1, and no on-navy variant of the monogram. Do not compose one locally: the combined logo is deferred until a real surface needs it ([issue #2](https://github.com/MedQuantis/design-system/issues/2)). Older lockups with a strapline under the wordmark are retired.
|
|
@@ -224,7 +230,7 @@ Use semantic tokens only. The `--mq-core-*` names hold raw values and exist so s
|
|
|
224
230
|
| Medium | Colours allowed | How a state is shown |
|
|
225
231
|
| :-- | :-- | :-- |
|
|
226
232
|
| Documents: slides, A4 reports, papers, newsletters, the website | Navy, the neutrals, the blue-grey family, the chart tokens | By mark style: solid, ring, pale, outline, quiet, dashed, struck through |
|
|
227
|
-
| Interactive apps | Everything documents use, plus `--mq-success`, `--mq-warning`, `--mq-danger`, `--mq-info
|
|
233
|
+
| Interactive apps | Everything documents use, plus `--mq-success`, `--mq-warning`, `--mq-danger`, `--mq-info`, and the app categorical palette with its change types (charts) | Status colour for genuine system status only (errors, validation, alerts, confirmations), always with an icon or a word; a categorical hue for a data category only, always with a label, a sign or a word |
|
|
228
234
|
|
|
229
235
|
Documents never carry green, orange, red, sky blue, pink, purple or turquoise, not even to say good or bad (ADR-0004). They never load `css/app.css`. A callout in a document is always navy; there is no warning-orange or success-green callout.
|
|
230
236
|
|
|
@@ -237,12 +243,13 @@ Documents never carry green, orange, red, sky blue, pink, purple or turquoise, n
|
|
|
237
243
|
| `--mq-accent-pale` | `#eaeef7` | Icon pills and chips, a deviating value, the highlighted table row, the pale state |
|
|
238
244
|
| `--mq-accent-pale-2` | `#f2f4f9` | Progress tracks, the quiet state, callout background |
|
|
239
245
|
| `--mq-on-accent` | `#ffffff` | Text and icons on an accent fill (14.53:1) |
|
|
246
|
+
| `--mq-accent-highlight` | `#0a2463` | Accent text on the pale fills (the pale KPI value, the pale badge, the callout title) and large highlighted title text: the accent itself in light, the light navy on dark (owner ruling 18) |
|
|
240
247
|
|
|
241
248
|
Navy carries emphasis on its own. Status colours never replace it for emphasis, in any medium.
|
|
242
249
|
|
|
243
250
|
## Neutrals
|
|
244
251
|
|
|
245
|
-
|
|
252
|
+
In the light theme the neutrals are warm greys tuned to the warm canvas, never blue-tinted greys; the neutrals of the dark theme carry the navy cast of its canvas (Dark theme).
|
|
246
253
|
|
|
247
254
|
| Token | Value | Use | Contrast |
|
|
248
255
|
| :-- | :-- | :-- | :-- |
|
|
@@ -300,7 +307,7 @@ The first six are the `mq-badge` states (`is-solid`, `is-ring`, `is-pale`, `is-o
|
|
|
300
307
|
| `--mq-danger` | `#d8232a` | Errors, destructive actions | 5.01:1 on surface, 4.79:1 on canvas |
|
|
301
308
|
| `--mq-info` | `#1565c0` | Information | 5.75:1 on surface, 5.50:1 on canvas |
|
|
302
309
|
| `--mq-warning` | `#a06400` | Warning text, icons and borders | 4.86:1 on surface, 4.65:1 on canvas |
|
|
303
|
-
| `--mq-warning-fill` | `#d4850a` | Warning badge or highlight fill, always with
|
|
310
|
+
| `--mq-warning-fill` | `#d4850a` | Warning badge or highlight fill, always with its text role `--mq-on-warning-fill`, ink in light (5.93:1) | Fill only |
|
|
304
311
|
| `--mq-warning-tint` | `#fbf3e7` | Warning background behind ink text (15.81:1) | Fill only |
|
|
305
312
|
|
|
306
313
|
The warning split (owner ruling 5): the orange `#d4850a` is a fill and never text, an icon or a border (2.81:1 on canvas). Text on it is ink; white on it is forbidden (2.93:1). On the warning tint, the text stays ink and `--mq-warning` is used only for the icon and the border (4.42:1, non-text).
|
|
@@ -312,12 +319,93 @@ Every status colour comes with an icon or a word (WCAG 1.4.1):
|
|
|
312
319
|
- a flag is a coloured word, and only on the rows that need attention, so normal rows stay quiet;
|
|
313
320
|
- light badge backgrounds come from the 50 and 100 steps of the status scales in `dist/tailwind.css`, never a hand-picked tint.
|
|
314
321
|
|
|
315
|
-
The red of the old Paracel theme survives only as `--mq-danger` (ADR-0003).
|
|
322
|
+
The red of the old Paracel theme survives only as `--mq-danger` (ADR-0003). The app categorical palette and the change types (`--mq-app-cat-*`, `--mq-change-*`) are data categories, never statuses; their values and rules are in charts (ADR-0008). Other app-specific hues, such as the annotation colours of regulatory text, stay local in the app under its own prefix until a second consumer needs them (specialising).
|
|
316
323
|
|
|
317
324
|
## Chart colours
|
|
318
325
|
|
|
319
326
|
The chart tokens (`--mq-chart-series-1` to `--mq-chart-series-4`, `--mq-chart-rest`, `--mq-chart-axis`, `--mq-chart-baseline`) and their order are in charts.
|
|
320
327
|
|
|
328
|
+
## Dark theme
|
|
329
|
+
|
|
330
|
+
MedQuantis has one dark theme (ADR-0007, owner ruling 12). It re-values the semantic roles above under the `.dark` class: a role it does not name keeps its light value, and no component needs a second name. A consumer opts in by loading `themes/dark.css` of the package after `tokens.css` and setting `.dark` on `<html>` or on one slide. The design system never switches on `prefers-color-scheme` by itself.
|
|
331
|
+
|
|
332
|
+
- **Apps and the website:** light and dark; the app decides how the viewer chooses, and may follow the viewer's setting by toggling `.dark`.
|
|
333
|
+
- **Documents** (A4 reports, papers, PDFs): light or dark, chosen by the author per document at build time, never from the reader's screen (owner ruling 15). A dark document stays dark in its PDF; light stays the default for anything likely to be printed on paper.
|
|
334
|
+
- **Slides:** a whole deck, or a single slide carrying `.dark`.
|
|
335
|
+
|
|
336
|
+
Every ratio below is the WCAG 2.x contrast with the dark values, on the dark canvas `#11161f` and surface `#1a2131`; the token test checks every declared pair in both themes.
|
|
337
|
+
|
|
338
|
+
| Token | Dark value | Use | Contrast |
|
|
339
|
+
| :-- | :-- | :-- | :-- |
|
|
340
|
+
| `--mq-canvas` | `#11161f`, a near-black with a navy cast | Background of every dark page and slide | Background |
|
|
341
|
+
| `--mq-surface` | `#1a2131` | Cards, panels, tables, figures, inputs | Background |
|
|
342
|
+
| `--mq-surface-alt` | `#141a26` | Recessed areas: table headers, grouped areas | Background |
|
|
343
|
+
| `--mq-desk` | `#0b0f16` | On screen only, around a dark page preview | Background |
|
|
344
|
+
| `--mq-border` | white at 14 % | Borders, dividers | Decorative |
|
|
345
|
+
| `--mq-border-light` | white at 10 % | Hairlines, card borders | Decorative |
|
|
346
|
+
| `--mq-border-strong` | `#8795b3` | Outline of outlined and dashed state marks | 6.03:1 on canvas, 5.35:1 on surface, non-text |
|
|
347
|
+
| `--mq-ink` | `#f5f4f1`, warm white | Primary text and values | 16.48:1 on canvas, 14.62:1 on surface |
|
|
348
|
+
| `--mq-muted` | `#c3cbdc` | Secondary text, leads, captions | 11.13:1 on canvas, 9.88:1 on surface |
|
|
349
|
+
| `--mq-tertiary` | `#8f98aa` | Tertiary text: notes, footers, axis labels | 6.25:1 on canvas, 5.54:1 on surface |
|
|
350
|
+
| `--mq-decoration` | `#6b7385` | Non-text decoration only, never text | 3.81:1 on canvas, 3.38:1 on surface, non-text |
|
|
351
|
+
| `--mq-accent` | `#6f88c9`, the lifted navy | Links, labels, key figures, active states | 5.22:1 on canvas, 4.63:1 on surface, 5.01:1 on the recessed surface |
|
|
352
|
+
| `--mq-accent-hover` | `#8aa0d6` | Hover and pressed state of a link or an accent control | 6.98:1 on canvas |
|
|
353
|
+
| `--mq-accent-pale` | the lifted navy at 18 % | Icon pills and chips, the highlighted row, the pale state | Fill |
|
|
354
|
+
| `--mq-accent-pale-2` | the lifted navy at 10 % | Progress tracks, the quiet state, callout background | Fill |
|
|
355
|
+
| `--mq-accent-highlight` | `#9fb3e8`, the light navy | Large highlighted title text, and accent text on the pale fills: the pale KPI value, the pale badge and the callout title (owner ruling 18) | 8.71:1 on canvas, 7.73:1 on surface, 5.97:1 on the pale fill, 6.77:1 on the quiet pale fill |
|
|
356
|
+
| `--mq-on-accent` | `#11161f` | Text and icons on an accent fill, never white (white 3.48:1 on the accent) | 5.22:1 on the accent |
|
|
357
|
+
| `--mq-focus-ring-color` | `#9fb3e8`, the light navy | Focus ring on dark backgrounds | 8.71:1 on canvas |
|
|
358
|
+
| `--mq-panel-start` | `#2f4c8f` | Light end of the navy panel gradient | Background, white 8.23:1 on the panel start |
|
|
359
|
+
| `--mq-panel-end` | `#0f2a5e` | Dark end of the navy panel gradient | Background |
|
|
360
|
+
| `--mq-shadow-panel` | a 1 px outline, light navy at 35 %, no glow (owner ruling 13) | Navy panels, the report header and the navy KPI tile on dark | Edge of a panel |
|
|
361
|
+
| `--mq-shadow-edge` | the same 1 px outline, light navy at 35 %; none in light | The monogram (`mq-monogram`), the navy KPI tile and a navy brand or app tile, which draw no shadow in light (owner ruling 14) | Edge of a navy mark |
|
|
362
|
+
| `--mq-shadow-live` | a 3 px ring of the dark success green `#6fbf73` at 17 %; in light the success green at 17 % | Apps only: the halo of a live dot, the row in force on a timeline (app patterns) | Decorative |
|
|
363
|
+
| `--mq-shadow-small` | black at 40 %, 1 px down with a 2 px blur | Cards, figures and tables on dark, where the light 5 % shadow does not show | Elevation |
|
|
364
|
+
| `--mq-shadow-medium` | black at 50 %, 3 px down with a 12 px blur | A slide or page previewed on the dark desk, raised panels and menus | Elevation |
|
|
365
|
+
|
|
366
|
+
Accent text on the pale fills reads `--mq-accent-highlight` in both themes (owner ruling 18): in light it is the accent itself, while on dark the lifted navy would be only 3.57:1 on the pale fill and 4.05:1 on the quiet pale fill. The fills are measured laid over the canvas and over the surface, the worse result counting. The callout tab keeps `--mq-accent` on the quiet pale fill as a non-text mark.
|
|
367
|
+
|
|
368
|
+
The retired `--mq-dim` and `--mq-accent-on-dark` follow the roles they alias on dark too: `#8f98aa` (tertiary) and `#b2c2ed` (the on-navy accent).
|
|
369
|
+
|
|
370
|
+
**The navy panel on dark.** Navy itself fails on a dark canvas (`#0a2463` is 1.25:1 on `#11161f`), so on dark the brand shows as the lifted navy, the light navy and the panel gradient, with no new hue (ADR-0003). Navy panels, the report header and the navy KPI tile keep the 160 degree gradient between `--mq-panel-start` and `--mq-panel-end`, with the dark values above, and draw `--mq-shadow-panel`: a 1 px light-navy outline, never a glow (owner ruling 13). A navy tile on dark takes the panel gradient, never the lifted accent. Contrast on navy is still checked against the panel start, the lighter stop.
|
|
371
|
+
|
|
372
|
+
The on-navy tier on the dark panel (owner ruling 19): two roles take dark values, the others keep their light values and are checked again on the lighter dark panel start.
|
|
373
|
+
|
|
374
|
+
| Token | Dark value | Contrast | Allowed for |
|
|
375
|
+
| :-- | :-- | :-- | :-- |
|
|
376
|
+
| `--mq-on-navy-title` | `#ffffff`, unchanged | 8.23:1 on the panel start | Text |
|
|
377
|
+
| `--mq-on-navy-secondary` | white at 68 %, unchanged | 4.80:1 on the panel start | Text |
|
|
378
|
+
| `--mq-on-navy-second-level` | `#c3cbdc`, unchanged | 5.05:1 on the panel start | Text |
|
|
379
|
+
| `--mq-on-navy-accent` | `#b2c2ed`, a lighter navy tint | 4.64:1 on the panel start | Text, narrow margin |
|
|
380
|
+
| `--mq-on-navy-discreet` | white at 50 % | 3.37:1 on the panel start | Large text or non-text only |
|
|
381
|
+
| `--mq-on-navy-rule`, `--mq-on-navy-rule-strong`, `--mq-on-navy-pill` | white at 16, 18 and 12 %, unchanged | Decorative | Decorative only |
|
|
382
|
+
|
|
383
|
+
Light keeps `#8795b3` (4.61:1) and white at 40 % (3.44:1) for those two roles; on the dark panel start they would fall to 2.74:1 and 2.71:1.
|
|
384
|
+
|
|
385
|
+
**The light navy is a navy tint.** `#9fb3e8` (`--mq-accent-highlight`, `--mq-focus-ring-color`, dark series 1) is not the retired sky blue: its LCH hue 280.4 (chroma 29.2) sits in the navy family with the lifted navy `#6f88c9` (hue 282.8), against navy 293.7 and sky blue 269.9 (chroma 36.1). Sky blue stays retired in both themes (owner ruling 2).
|
|
386
|
+
|
|
387
|
+
Status colours on dark, apps only (ADR-0004, owner ruling 16), each still with an icon or a word; `--mq-warning-fill` keeps its value and stays a fill:
|
|
388
|
+
|
|
389
|
+
- `--mq-success` `#6fbf73`: 8.09:1 on canvas, 7.18:1 on surface.
|
|
390
|
+
- `--mq-warning` `#e0a040`: 8.00:1 on canvas, 7.10:1 on surface.
|
|
391
|
+
- `--mq-danger` `#ff6b6b`: 6.53:1 on canvas, 5.80:1 on surface.
|
|
392
|
+
- `--mq-info` `#64a8f0`: 7.25:1 on canvas, 6.43:1 on surface.
|
|
393
|
+
- `--mq-warning-fill` `#d4850a`, unchanged: a fill, never text.
|
|
394
|
+
- `--mq-warning-tint`, the warning fill at 16 %: ink 11.63:1 on the warning tint.
|
|
395
|
+
- `--mq-on-warning-fill` `#11161f`, text on `--mq-warning-fill`: 6.18:1 on the warning fill, where the warm white ink 2.67:1 on the warning fill would fail.
|
|
396
|
+
|
|
397
|
+
Chart colours on dark (owner ruling 16): the four series run in reverse order, the lightest first, under the same rules as light (charts): series 4 for context bars, the remainder drawn with a series 4 outline. Each dark series meets or beats its light counterpart against its canvas.
|
|
398
|
+
|
|
399
|
+
| Token | Dark value | Contrast |
|
|
400
|
+
| :-- | :-- | :-- |
|
|
401
|
+
| `--mq-chart-series-1` | `#9fb3e8` | 8.71:1 on canvas |
|
|
402
|
+
| `--mq-chart-series-2` | `#6f88c9` | 5.22:1 on canvas |
|
|
403
|
+
| `--mq-chart-series-3` | `#5d6f91` | 3.58:1 on canvas |
|
|
404
|
+
| `--mq-chart-series-4` | `#3a4560` | 1.90:1 on canvas, context bars only |
|
|
405
|
+
| `--mq-chart-rest` | `#232b3d` | 1.28:1 on canvas, with a series 4 outline |
|
|
406
|
+
| `--mq-chart-axis` | `#6b7385` | 3.81:1 on canvas, non-text |
|
|
407
|
+
| `--mq-chart-baseline` | white at 10 % | Decorative |
|
|
408
|
+
|
|
321
409
|
# Typography
|
|
322
410
|
|
|
323
411
|
## Three families, three roles
|
|
@@ -401,7 +489,7 @@ Apps use the same families and weights at UI sizes: UI body Outfit 400 at 14 px,
|
|
|
401
489
|
|
|
402
490
|
| Medium | Canvas | Layout |
|
|
403
491
|
| :-- | :-- | :-- |
|
|
404
|
-
| Slide | 1280 by 720 px (`--mq-slide-width`, `--mq-slide-height`, `css/slide.css`) | Fixed canvas, 72 px side margins (`--mq-space-8`), section label top left, title under it, and a footer row (`mq-slide-foot`) with the legal line bottom left and the slide number bottom right, both in tertiary mono (owner ruling 11) |
|
|
492
|
+
| Slide | 1280 by 720 px (`--mq-slide-width`, `--mq-slide-height`, `css/slide.css`) | Fixed canvas, 72 px side margins (`--mq-space-8`), section label top left, title under it, and a footer row (`mq-slide-foot`) with the legal line bottom left and the slide number bottom right, both in tertiary mono (owner ruling 11); a classified deck adds its classification label at the right of the footer, before the slide number (owner ruling 17) |
|
|
405
493
|
| Screen report or paper | A page that scrolls, centred, `--mq-page-width` (1040 px) wide | Flow layout: no absolute positions, no fixed heights. It is not a deck: no slide canvas inside a report |
|
|
406
494
|
| A4 print | 210 by 297 mm (`--mq-a4-width`, `--mq-a4-height`, `css/print.css`) | One `mq-page` per sheet on the canvas colour; on screen the pages sit on the desk |
|
|
407
495
|
|
|
@@ -450,7 +538,7 @@ Squared-off corners read professional and institutional; pills read consumer.
|
|
|
450
538
|
|
|
451
539
|
## Elevation and navy blocks
|
|
452
540
|
|
|
453
|
-
- Cards, figures and tables: `--mq-shadow-small`. Raised panels, menus and a page or slide previewed on the desk: `--mq-shadow-medium`. Navy panels: `--mq-shadow-panel
|
|
541
|
+
- Cards, figures and tables: `--mq-shadow-small`. Raised panels, menus and a page or slide previewed on the desk: `--mq-shadow-medium`. Navy panels: `--mq-shadow-panel`, which on dark is a 1 px light-navy outline and never a glow (owner ruling 13). No shadow in print and none on chart marks.
|
|
454
542
|
- One large navy block per screen, slide or page area. In a report, keep the header, a navy KPI band and a navy panel apart with light content.
|
|
455
543
|
|
|
456
544
|
## Document components
|
|
@@ -464,7 +552,7 @@ Squared-off corners read professional and institutional; pills read consumer.
|
|
|
464
552
|
| Takeaway | `mq-takeaway` | The one sentence to remember, under a navy tab, Outfit 500 |
|
|
465
553
|
| Numbered rows | (pattern) | A navy circle with the number, a heading column, a body column: one line per point |
|
|
466
554
|
| Footer | `mq-foot` | Sources and legal line in tertiary italic, in reports and papers; never inside a slide |
|
|
467
|
-
| Slide footer | `mq-slide-foot` | On every slide (owner ruling 11): the legal line bottom left, the slide number bottom right, small, tertiary, Geist Mono: `<footer class="mq-slide-foot"><p>MedQuantis SA · CH-1095 Lutry · medquantis.ch</p><p class="mq-slide-number">03</p></footer>` |
|
|
555
|
+
| Slide footer | `mq-slide-foot` | On every slide (owner ruling 11): the legal line bottom left, the slide number bottom right, small, tertiary, Geist Mono. A classified deck shows its classification at the right of the footer, before the slide number: the label in the deck's language, never the C0 to C3 code (owner ruling 17). Without a classification: `<footer class="mq-slide-foot"><p>MedQuantis SA · CH-1095 Lutry · medquantis.ch</p><p class="mq-slide-number">03</p></footer>` |
|
|
468
556
|
|
|
469
557
|
## Tables
|
|
470
558
|
|
|
@@ -508,7 +596,7 @@ One column, a 16 px gutter, and no horizontal scrolling of the page. Only tables
|
|
|
508
596
|
|
|
509
597
|
# Charts
|
|
510
598
|
|
|
511
|
-
Charts use the navy and blue-grey family
|
|
599
|
+
Charts use the navy and blue-grey family, in every medium. An interactive app may also use the app categorical palette, for a chart of more categories than the ordered palette carries and for data categories such as change types; documents never do (ADR-0008). Status colours never colour a chart series, not even in an app; a chart that shows system status labels it in words.
|
|
512
600
|
|
|
513
601
|
## The ordered palette
|
|
514
602
|
|
|
@@ -543,6 +631,38 @@ Rules:
|
|
|
543
631
|
| Ranking with more than four items | Highlight on grey, below |
|
|
544
632
|
| Workflow stages in an app | Series 1 to 4 with the stage name as a label or legend, never status hues, never white text on series 3 or 4 |
|
|
545
633
|
|
|
634
|
+
## App categorical palette (apps only)
|
|
635
|
+
|
|
636
|
+
Six hues for interactive apps whose charts or lists show more categories than the four ordered series can carry, and three change types built on them (owner rulings 20 and 21, ADR-0008). They are light only until their dark values are ruled, and they never appear in documents, which keep the ordered palette.
|
|
637
|
+
|
|
638
|
+
| Token | Value | Contrast on surface | Allowed for |
|
|
639
|
+
| :-- | :-- | :-- | :-- |
|
|
640
|
+
| `--mq-app-cat-green` | `#1c7e3f` | 5.12:1 | Marks, fills and text |
|
|
641
|
+
| `--mq-app-cat-orange` | `#d78000` | 3.01:1 | Marks and fills only |
|
|
642
|
+
| `--mq-app-cat-orange-text` | `#a35f00` | 5.01:1 | Text in the orange hue: counts and labels |
|
|
643
|
+
| `--mq-app-cat-vermillion` | `#cf2a00` | 5.27:1 | Marks, fills and text |
|
|
644
|
+
| `--mq-app-cat-blue` | `#3a8ff5` | 3.27:1 | Marks and fills only |
|
|
645
|
+
| `--mq-app-cat-violet` | `#5a2fbe` | 8.12:1 | Marks, fills and text |
|
|
646
|
+
| `--mq-app-cat-teal` | `#178a91` | 4.13:1 | Marks and fills only |
|
|
647
|
+
|
|
648
|
+
| Change type | Token | Reads |
|
|
649
|
+
| :-- | :-- | :-- |
|
|
650
|
+
| Added | `--mq-change-added` | The green |
|
|
651
|
+
| Modified | `--mq-change-modified`; its text `--mq-change-modified-text` | The orange; the orange text |
|
|
652
|
+
| Removed | `--mq-change-removed` | The vermillion |
|
|
653
|
+
|
|
654
|
+
Between the six hues and navy series 1, the smallest CIEDE2000 distance is 17.4 under normal vision, 11.9 under protanopia, 12.9 under deuteranopia and 8.4 under tritanopia (green and teal); the token test holds those floors.
|
|
655
|
+
|
|
656
|
+
Rules:
|
|
657
|
+
|
|
658
|
+
- A one-series chart stays navy (`--mq-chart-series-1`). Up to four series, the ordered palette applies in apps too; the categorical hues are for charts of five or more categories and for data categories.
|
|
659
|
+
- Fix each hue to its category across every view of the app; never let a charting library rotate through the palette.
|
|
660
|
+
- No series uses a status token. The vermillion is a data category ("removed from the list"), not an error: `--mq-danger` stays for errors. The green, the orange, the orange text and the vermillion sit CIEDE2000 3.3, 2.2, 2.8 and 7.9 from `--mq-success`, `--mq-warning-fill`, `--mq-warning` and `--mq-danger`, so code tells them apart by token name and the screen by the word or sign each carries, never by hue.
|
|
661
|
+
- Marks sit on the surface (`--mq-surface`), where every hue meets 3:1 and needs no outline. On the canvas the orange falls to 2.88:1, and on the recessed surface the orange and the blue fall below 3:1, so a chart in these hues sits in a white card.
|
|
662
|
+
- Text in a hue meets 4.5:1: the green, the vermillion and the violet may be text, orange text reads `--mq-app-cat-orange-text`, and the blue and the teal are never text.
|
|
663
|
+
- Never colour alone: the green and the vermillion have almost the same lightness, so in greyscale they cannot be told apart. Every mark carries a direct label or a legend entry, and a change type its sign (+, −) or its word; label the green and the teal directly where they touch.
|
|
664
|
+
- A change type keeps its hue wherever a change is listed (badge, dot, filter, count) and keeps its mark style on top: an added value with +, a removed value struck through.
|
|
665
|
+
|
|
546
666
|
## Highlight on grey
|
|
547
667
|
|
|
548
668
|
To point at one item among many (a ranking, one insurer among peers), draw the item the text discusses in series 1 and every other item in series 3. When the context should recede further, such as a reference period behind the current one, use series 4. Label the highlighted item directly; the others need a label or an outline because series 3 and 4 are below 3:1.
|
|
@@ -663,7 +783,8 @@ Colour never carries meaning on its own (WCAG 1.4.1):
|
|
|
663
783
|
- 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;
|
|
664
784
|
- apps pair every status colour with an icon or a word;
|
|
665
785
|
- 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);
|
|
666
|
-
- a change in a figure is shown by its sign, not by a colour or an arrow alone
|
|
786
|
+
- a change in a figure is shown by its sign, not by a colour or an arrow alone;
|
|
787
|
+
- 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).
|
|
667
788
|
|
|
668
789
|
## Contrast pairs
|
|
669
790
|
|
|
@@ -713,6 +834,288 @@ Placeholder text in inputs uses the tertiary text colour, never a lighter grey.
|
|
|
713
834
|
- Icons that carry meaning have a label; decorative icons are hidden (`aria-hidden="true"`).
|
|
714
835
|
- PDFs exported from HTML are tagged and carry an outline (Playwright `tagged` and `outline`); the specimen test exports one.
|
|
715
836
|
|
|
837
|
+
# App patterns
|
|
838
|
+
|
|
839
|
+
Patterns for dense interactive apps (internal review and operations tools) built on the tokens. They describe anatomy, states and the tokens each part reads; the framework components that draw them belong to the app (specialising). Every pattern here is for the app medium only.
|
|
840
|
+
|
|
841
|
+
## App shell
|
|
842
|
+
|
|
843
|
+
One frame for every screen of the app: a left sidebar, then a main panel that stacks an optional environment banner, a navbar, a toolbar and the content. The content scrolls inside the panel; the sidebar, banner, navbar and toolbar stay in place.
|
|
844
|
+
|
|
845
|
+
**Sidebar.** On the surface (`--mq-surface`) with a `--mq-border-light` hairline on its right edge, `--mq-sidebar-width` wide.
|
|
846
|
+
|
|
847
|
+
- Brand block at the top: the wordmark, and under it the product name in muted Outfit 500 at the label size. The block keeps one height expanded or collapsed, so the toggle below it never moves.
|
|
848
|
+
- Navigation in groups. A group opens with an eyebrow in tertiary text; the first group may have none. Each link carries a Lucide icon in `--mq-decoration`, its label in muted Outfit 500, and an optional count at the right in Geist Mono, tertiary. Hover: ink on `--mq-surface-alt`. The current page (`aria-current="page"`): navy text and icon on `--mq-accent-pale`, its count navy.
|
|
849
|
+
- A count shows only when it is above zero. A count that asks for the person's action (what waits for them) is a filled badge, `--mq-on-accent` on `--mq-accent`, Geist Mono 600, with the small radius: never a pill. Every other count stays plain text.
|
|
850
|
+
- The signed-in person at the foot, in a block on the canvas with a `--mq-border-light` border and the medium radius: a round avatar with initials (`--mq-on-accent` on `--mq-accent`), the name, the roles as small mono chips (a role not held is struck through in tertiary), and the session line in muted text, such as "Session open · expires after 8 h of inactivity". Sign-out opens from the name.
|
|
851
|
+
- A toggle on the sidebar's edge collapses and expands it. It carries `aria-expanded` and an accessible name that says the action (expand the navigation, collapse the navigation).
|
|
852
|
+
|
|
853
|
+
**Rail.** The collapsed sidebar, `--mq-sidebar-rail-width` wide. The monogram replaces the wordmark; links become icons alone, centred in 40 by 36 px targets, each label moving to the link's tooltip and accessible name; groups are separated by a hairline instead of their eyebrow; the person shows as the avatar alone. The only count kept is the action badge, at the icon's top right.
|
|
854
|
+
|
|
855
|
+
**Environment banner.** Above the navbar on every environment except production, an unknown environment included, never on production. One line of ink text at the label size, Outfit 500, on `--mq-warning-tint`, with a `--mq-warning-fill` bottom border and a `--mq-warning` icon, as a `status` region. It is genuine system status, so it takes the warning colours (colour).
|
|
856
|
+
|
|
857
|
+
**Navbar.** On the surface with a hairline below: a screen icon (a white Lucide icon on a 32 px navy tile with the medium radius), the page title as the page's `h1` in Outfit 500 at the h3 size, and a one-line subtitle in muted text at the label size. Global actions, such as search, sit at the right.
|
|
858
|
+
|
|
859
|
+
**Toolbar.** On the canvas with a hairline below: the screen's filters in one row that wraps, a flexible gap, then right-aligned controls. Each screen fills it; a screen without filters leaves it out.
|
|
860
|
+
|
|
861
|
+
**Spacing.** Side padding `--mq-space-6`, `--mq-space-4` on phones, plus the device's safe-area inset.
|
|
862
|
+
|
|
863
|
+
| State | What changes |
|
|
864
|
+
| :-- | :-- |
|
|
865
|
+
| Expanded | The full sidebar |
|
|
866
|
+
| Rail | As above; the app may start on the rail and keep the person's choice |
|
|
867
|
+
| Drawer, below 768 px | The sidebar leaves the layout. A menu button at the left of the navbar opens it in full over the content, with `--mq-shadow-medium`; it closes on a link, on Escape and on a tap outside. The edge toggle is hidden |
|
|
868
|
+
| Phone, below 480 px | The navbar's subtitle and screen icon are hidden |
|
|
869
|
+
| Service unavailable | The shell stays. Counts are hidden, never shown as 0, since a count that could not be measured is missing, not zero (data patterns); the content shows the error state |
|
|
870
|
+
| Not production | The environment banner shows |
|
|
871
|
+
|
|
872
|
+
The drawer slides in within 200 ms and appears at once under `prefers-reduced-motion`.
|
|
873
|
+
|
|
874
|
+
Stays in the app: the routes and their grouping, the count values and which count asks for action, the session and its timeout, the environment and where it comes from, and the search.
|
|
875
|
+
|
|
876
|
+
## Sign-in, access refused and error pages
|
|
877
|
+
|
|
878
|
+
Three ways the app answers a person it cannot serve yet. None of them ever falls back to a framework's default page.
|
|
879
|
+
|
|
880
|
+
**Sign-in page.** The only page served without a session, so it carries no app bundle: a self-contained page built from `tokens.css` and `fonts.css` alone, on the canvas, centred both ways.
|
|
881
|
+
|
|
882
|
+
- The wordmark above one card: the surface, a `--mq-border-light` border, the medium radius, `--mq-shadow-small`, `--mq-space-6` padding, at most 420 px wide. The wordmark is not a link, since nothing behind it is reachable yet.
|
|
883
|
+
- In the card, in order: an eyebrow in tertiary mono ("Restricted access"), the product name as the `h1`, one muted sentence on what the tool is for, an optional notice, then the one action: a full-width primary button with a sign-in icon ("Sign in with MedQuantis"), and under it a muted hint at the label size naming the account to use and the role the app asks for.
|
|
884
|
+
- The legal line under the card, in tertiary Geist Mono (brand).
|
|
885
|
+
- One action only: no second link, no password reset, no sign-up, which belong to the identity provider.
|
|
886
|
+
|
|
887
|
+
| Arrival | Notice above the button |
|
|
888
|
+
| :-- | :-- |
|
|
889
|
+
| First visit | None |
|
|
890
|
+
| After the session expired | An info notice as a `status` region: an `--mq-info` icon and border, the sentence in ink, such as "Your session expired. Sign in to pick up where you left off." |
|
|
891
|
+
| After sign-out | A success notice the same way with `--mq-success`, such as "You are signed out." |
|
|
892
|
+
|
|
893
|
+
After sign-in the person lands on the page they asked for, never on a default home.
|
|
894
|
+
|
|
895
|
+
**Access refused page.** For a signed-in person whose account lacks the role the app needs. It replaces the shell, since every page behind it would refuse again: a navbar with the monogram and the product name only (no sidebar, no link into the app), then one card at most 560 px wide.
|
|
896
|
+
|
|
897
|
+
- A navy icon pill (`--mq-accent-pale`, the medium radius) with a lock icon, the title as the `h1` ("Access refused"), a lead sentence in Outfit 500 naming the missing role in bold, and one muted sentence explaining it.
|
|
898
|
+
- A key-value block on the canvas with a `--mq-border-light` border and the medium radius: the signed-in account (avatar, name, address in mono), then the role asked for as a struck-through role chip, beside "Not assigned to this account" in `--mq-danger` with an icon.
|
|
899
|
+
- How to get the role, in muted text: who assigns it, and that the person signs in again once it is assigned.
|
|
900
|
+
- One primary action, "Switch account": it signs out of the app and of the identity provider, then opens the sign-in page in its signed-out state, and a note under the button says so. Never a redirect back into the app, which would loop.
|
|
901
|
+
|
|
902
|
+
**Error states inside the shell.** When a screen cannot show its content, the shell stays (sidebar, and the navbar with the screen's own title) and one card takes the content area: centred, at most 560 px wide, on the surface with `--mq-shadow-small`, its text centred. In order: a 40 px icon tile with the medium radius, a status word in Geist Mono capitals at the eyebrow size, the title as an `h2` at the h3 size, one muted sentence no wider than 50 characters, and the actions.
|
|
903
|
+
|
|
904
|
+
| State | Icon tile | Status word | Body and actions |
|
|
905
|
+
| :-- | :-- | :-- | :-- |
|
|
906
|
+
| Not found (404) | `--mq-decoration` icon on `--mq-surface-alt` | "Not found", tertiary | What was not found and why that may be, the address asked for in tertiary mono, and a primary action back to the list |
|
|
907
|
+
| Service unavailable (503) | `--mq-warning` icon on `--mq-warning-tint` | "Unavailable", `--mq-warning` | That the service does not answer for now, and a primary "Retry". While it retries, the button is disabled with a turning icon; if the service is still down, a muted line under it gives the time of the last attempt ("Still unavailable at the last attempt, at 14:32") in a polite live region. The sidebar's counts are hidden (app shell, above) |
|
|
908
|
+
| Unexpected error (500) | `--mq-danger` icon on `--mq-surface-alt` | "Error", `--mq-danger` | That the request failed and what to do if it happens again; the request ID as selectable mono text in a bordered row labelled `X-Request-Id`, with a "Copy" button that confirms once ("Copied"); a secondary action back to the list |
|
|
909
|
+
|
|
910
|
+
The status word and the icon carry each state together with its colour, never the colour alone (accessibility). Under `prefers-reduced-motion` the icon does not turn and the button reads "Retrying".
|
|
911
|
+
|
|
912
|
+
Stays in the app: the sign-in address and its return path, the role name and who assigns it, the request ID value, and the wording of each state.
|
|
913
|
+
|
|
914
|
+
## Overview: queue boxes and coverage cards
|
|
915
|
+
|
|
916
|
+
The overview lands a person on what waits for them, then shows how much of each area is covered, in one grammar for every area.
|
|
917
|
+
|
|
918
|
+
**Queue boxes.** A row of boxes, one per queue, three across and one column on phones. Each box is a link to its list: the surface, a `--mq-border-light` border, the medium radius and `--mq-shadow-small`, `--mq-space-4` padding; on hover the border turns `--mq-border-strong`. In order:
|
|
919
|
+
|
|
920
|
+
- the queue's name in Outfit 600, with its total at the right in navy Outfit 500 at the figure size, in tabular figures;
|
|
921
|
+
- optionally one line per area, its name in ink and its count in navy at the right;
|
|
922
|
+
- the age line in tertiary text at the note size: "Oldest waiting for 3 days", the duration in ink.
|
|
923
|
+
|
|
924
|
+
| State | Shows |
|
|
925
|
+
| :-- | :-- |
|
|
926
|
+
| Zero | The box stays in place, quiet: the total in tertiary, no area lines, and the age line reads "Nothing waits" |
|
|
927
|
+
| The person's own queue, above zero | A navy border and the pale navy fill (`--mq-accent-pale`); the same box at zero is quiet like the others |
|
|
928
|
+
| Overdue | The age turns `--mq-warning` and takes a warning icon, so the state never rests on colour alone. The threshold belongs to the app |
|
|
929
|
+
| Loading | The box keeps its size with skeleton bars on `--mq-surface-alt`; their shimmer stops under `prefers-reduced-motion` |
|
|
930
|
+
|
|
931
|
+
**Coverage cards.** One card per area, three across, one column below 1100 px; the same card as a queue box but not a link itself. In order:
|
|
932
|
+
|
|
933
|
+
- the area's title in Outfit 600, with an "Open →" link at the right in navy;
|
|
934
|
+
- the scope in Geist Mono capitals at the eyebrow size, tertiary: what is counted and over which editions ("Coverage of 1'248 texts · every edition served");
|
|
935
|
+
- a segmented bar, 12 px high, its ends rounded with the small radius, never a pill, with 2 px gaps between segments (charts, distribution bar);
|
|
936
|
+
- the legend under it: per segment a 10 px swatch with the small radius, the label (a link when the segment opens a list), the count in Geist Mono, muted, and the percentage in Geist Mono, tertiary, both right-aligned;
|
|
937
|
+
- optionally one take-away line in muted text at the note size.
|
|
938
|
+
|
|
939
|
+
Rules for the bar:
|
|
940
|
+
|
|
941
|
+
- The segments take the ordered palette in order, `--mq-chart-series-1` to `--mq-chart-series-4`, and what is left (not yet detected, not yet extracted) takes the remainder fill `--mq-chart-rest`, with a series 4 outline in the bar and the swatch. Five segments therefore need no new hue. A status colour never colours a segment: a segment that needs attention says so in its label.
|
|
942
|
+
- A segment below 1 % keeps a 2 px minimum width in the bar, and its legend line reads "< 1 %"; every other percentage is rounded with the largest-remainder method (data patterns).
|
|
943
|
+
- A segment that opens a list is a link in both the bar and the legend, with the same accessible name; one that opens nothing is plain text, never a dead link.
|
|
944
|
+
- The bar has an accessible name that states the scope; the legend carries every value in text.
|
|
945
|
+
- One edition or every edition served: the scope line says which; the card does not change shape.
|
|
946
|
+
|
|
947
|
+
Stays in the app: the segment keys, their counts and labels, which segments link where, the overdue threshold, and the queues themselves.
|
|
948
|
+
|
|
949
|
+
## Review table: filters, condition tile, status pill, code chips
|
|
950
|
+
|
|
951
|
+
The list behind every review screen: a filter toolbar, then a table whose rows carry a condition tile, a status pill and code chips. It extends the app table of layout, Tables.
|
|
952
|
+
|
|
953
|
+
**Filters**, in the shell's toolbar (app shell, above):
|
|
954
|
+
|
|
955
|
+
- **Select with its label inside**: 32 px high, the surface, a `--mq-border` border, the small radius; the label in muted text, the value in ink Outfit 500. Each option ends with its count, and an option whose count is zero is muted but still listed.
|
|
956
|
+
- **Segmented control** for a filter in two steps: a track on `--mq-surface-alt` with a `--mq-border` border and the medium radius, its segments with the small radius, each with its count in Geist Mono, tertiary. The selected segment is navy Outfit 500 on the surface with `--mq-shadow-small`; an empty segment is tertiary. A 1 px `--mq-border-strong` rule, 16 px high, separates the two steps. It is a radio group: arrow keys move, and the selection is announced.
|
|
957
|
+
- **Clear filters**: a ghost text button that appears once any filter differs from its default, and puts every filter back.
|
|
958
|
+
|
|
959
|
+
**Table.** The app table wrapper: the surface, a `--mq-border-light` border, the medium radius, `--mq-shadow-small`, scrolling sideways inside itself below its minimum width. Header row on `--mq-surface-alt`, never a navy band; cells with `--mq-space-3` padding and a `--mq-border-light` hairline between rows; text at the table text size.
|
|
960
|
+
|
|
961
|
+
| State | Shows |
|
|
962
|
+
| :-- | :-- |
|
|
963
|
+
| Loading | Skeleton rows of the same height, bars on `--mq-surface-alt`; the shimmer stops under `prefers-reduced-motion` |
|
|
964
|
+
| Sorted | The sorted header is underlined and carries `aria-sort`; the sort reads in the header's accessible name |
|
|
965
|
+
| Hover | The row on `--mq-surface-alt` |
|
|
966
|
+
| Keyboard | Rows are reachable with the keyboard (Arrow or J and K keys move, Enter opens); the focused row shows the focus ring, and moving never opens |
|
|
967
|
+
| Selected (the open item) | `--mq-accent-pale`, with a 3 px navy edge (`--mq-stroke-tab`) on its first cell |
|
|
968
|
+
| Waiting for you | The quiet pale fill `--mq-accent-pale-2`, on that row only, so the others stay quiet |
|
|
969
|
+
| Empty | The app empty state (layout, App patterns) in the table's place: "No open item", or, under filters, "No item matches these filters" with a clear-filters action |
|
|
970
|
+
|
|
971
|
+
**Condition tile.** A short code that identifies a review condition (R1, R2): a navy square (`--mq-on-accent` on `--mq-accent`), the medium radius, the code in Geist Mono 600, 30 px in the list and 32 px in a dialog header, followed by the condition's name in Outfit 600. A tooltip on the tile gives what raised it. It is an identifier, not a state, so every tile is the same navy.
|
|
972
|
+
|
|
973
|
+
**Status pill.** The item's step, a word in Outfit 500 at the label size with the small radius (never a pill shape despite its name), and under it a detail line in tertiary text at the note size (who, since when). The four states differ by mark style, and each carries its word:
|
|
974
|
+
|
|
975
|
+
| State | Mark |
|
|
976
|
+
| :-- | :-- |
|
|
977
|
+
| To decide | Outline: `--mq-border-strong` border, muted text on the surface |
|
|
978
|
+
| Confirmation required | The warning mark: `--mq-warning` text and a `--mq-warning-fill` border on `--mq-warning-tint`, since it asks the person to act |
|
|
979
|
+
| Under review by a colleague | Pale: navy text and border on `--mq-accent-pale`; the detail line names the colleague |
|
|
980
|
+
| Under review by you | Pale, plus a 2 px `--mq-accent-pale` ring around it, and its row takes the waiting-for-you fill |
|
|
981
|
+
|
|
982
|
+
**Code chip.** A mono code with its name: the code in Geist Mono at the note size on `--mq-surface-alt` with the small radius, then the name in ink. A name too long for its cell is cut with an ellipsis and given in full in a tooltip and the accessible name; a code without a name shows the code alone, never an empty name.
|
|
983
|
+
|
|
984
|
+
| Variant | Mark |
|
|
985
|
+
| :-- | :-- |
|
|
986
|
+
| Plain | As above |
|
|
987
|
+
| Key code (the one the row is about) | `--mq-accent-pale` with navy text |
|
|
988
|
+
| Added | A leading "+" and the code in `--mq-change-added`, with a 1 px ring of the same colour |
|
|
989
|
+
| Removed | Struck through, the code in `--mq-change-removed` |
|
|
990
|
+
|
|
991
|
+
The change colours are apps only and never carry the change alone: the "+" and the strike say it in every theme and in greyscale (charts, App categorical palette).
|
|
992
|
+
|
|
993
|
+
Stays in the app: the conditions and their codes, the wording of each state, the sort keys, the keyboard shortcuts beyond Arrow and Enter, and which code is the key code.
|
|
994
|
+
|
|
995
|
+
## Decision modal
|
|
996
|
+
|
|
997
|
+
A large dialog where one decision is taken: context on the left, process on the right, actions at the foot. Its proportions and pane heights stay fixed from item to item, so nothing jumps while a person works through a list.
|
|
998
|
+
|
|
999
|
+
**Frame.** On the surface with the overlay radius (`--mq-radius-overlay`) and `--mq-shadow-medium`, inset `--mq-space-5` from the viewport plus the safe-area insets, at most 1320 px wide. Escape closes it, focus stays inside while it is open and returns to the row it came from. Below 768 px it fills the screen with no radius, and its panes stack and scroll as one.
|
|
1000
|
+
|
|
1001
|
+
**Header**, with a hairline below:
|
|
1002
|
+
|
|
1003
|
+
- at the left, the condition tile (32 px) and the condition's name as the dialog title in Outfit 500 at the h3 size; under it the subject (the product) and an edition badge in the outline mark ("Edition 01.10.2026");
|
|
1004
|
+
- in the centre, the progress line at a fixed width;
|
|
1005
|
+
- at the right, the position in mono ("3 / 12"), previous and next buttons, and close.
|
|
1006
|
+
|
|
1007
|
+
**Progress line.** Three steps (detected, review, decided): a 22 px circle and a label each, joined by 1.5 px lines.
|
|
1008
|
+
|
|
1009
|
+
| Step | Mark |
|
|
1010
|
+
| :-- | :-- |
|
|
1011
|
+
| Done | `--mq-accent-pale` circle with a navy ring and a tick; the line after it navy |
|
|
1012
|
+
| Current | A navy circle with its number in `--mq-on-accent` and a 3 px `--mq-accent-pale` ring; the label in navy Outfit 600 |
|
|
1013
|
+
| To come | A `--mq-border-strong` ring on the surface, the label tertiary; the line after it `--mq-border` |
|
|
1014
|
+
| Optional review | The circle dashed, with "optional" in its detail line |
|
|
1015
|
+
| Required review | The detail line in `--mq-warning` with a warning icon: "required: your confirmation" |
|
|
1016
|
+
|
|
1017
|
+
Labels keep one line, cut with an ellipsis and given in full in a tooltip. Where the header is too narrow for title, line and navigation side by side, the line takes its own row under the title.
|
|
1018
|
+
|
|
1019
|
+
**Left pane: context**, on the canvas, a hairline on its right edge:
|
|
1020
|
+
|
|
1021
|
+
- "The problem": a card with a fixed height of four lines, what the condition means for this item;
|
|
1022
|
+
- underline tabs (layout, App patterns): the source text (limitation-text marks) and the decision history with its count (history timeline). The chosen tab stays chosen from item to item.
|
|
1023
|
+
|
|
1024
|
+
**Right pane: process**, on the surface, in numbered steps (a 22 px navy circle with the number in `--mq-on-accent`, then the step's name in Outfit 500):
|
|
1025
|
+
|
|
1026
|
+
1. **Evidence**: one row per code in play, the code chip (review table, above), its name, and its source tag; a reason or quote an agent gave sits under its row in Newsreader italic, muted. The list has a fixed height and scrolls inside.
|
|
1027
|
+
2. **Decision**: the choice cards, then the form fields.
|
|
1028
|
+
3. **Result**: what is served today and what will be served after.
|
|
1029
|
+
|
|
1030
|
+
**Source tags**, one mark style per source (colour, States by mark style), each with its word:
|
|
1031
|
+
|
|
1032
|
+
| Source | Mark |
|
|
1033
|
+
| :-- | :-- |
|
|
1034
|
+
| Attached by the regulator | Solid |
|
|
1035
|
+
| Printed in the text | Pale, like the printed-code mark in the text |
|
|
1036
|
+
| Proposed by the agent | Dashed: not yet confirmed |
|
|
1037
|
+
| Candidate from the title | Outline |
|
|
1038
|
+
| Close code | Quiet |
|
|
1039
|
+
| Removed by the regulator | Struck through |
|
|
1040
|
+
|
|
1041
|
+
**Choice cards.** A radio group of cards, one per answer: a `--mq-border-light` border and the small radius; the title in Outfit 500, one muted line of explanation, and at the right the codes the answer would serve, or "no code" in tertiary italic. Hover on `--mq-surface-alt`; selected: a navy border on `--mq-accent-pale-2`; invalid: a `--mq-danger` border with the error in words under the group. A card that restates what is served today says so in its explanation.
|
|
1042
|
+
|
|
1043
|
+
**Result card.** A dashed `--mq-border-strong` border with the medium radius, two rows labelled in Geist Mono capitals, "Today" and "After": the code chips of each, an added code with its "+", a removed one struck through, both in the change-type colours, and "unchanged" in tertiary when nothing moves. Its height is fixed; long names are cut with a tooltip.
|
|
1044
|
+
|
|
1045
|
+
**Held decision card.** While a colleague's review is pending it replaces the decision form: `--mq-warning-tint` with a `--mq-warning-fill` border and the medium radius, its title ("Decision to review") in `--mq-warning`, then rows of label and value: the held answer, its reason, the comment, who asked and when. The reviewer sees approve and send back, where send back asks for a comment; the person who asked sees withdraw. Everyone else sees it read-only.
|
|
1046
|
+
|
|
1047
|
+
**Alerts**, above the form, each with an icon and a sentence:
|
|
1048
|
+
|
|
1049
|
+
- a refused write: a `--mq-danger` border, what was refused and why; the form keeps what the person entered;
|
|
1050
|
+
- a stale write: an `--mq-info` border, "Decided meanwhile by a colleague, at 14:20"; the item reloads with that decision at the top of its history;
|
|
1051
|
+
- after a decision: a notice that the change reaches the public site after the next refresh.
|
|
1052
|
+
|
|
1053
|
+
**Footer** on the canvas with a hairline above: facts at the left (muted label, ink value), actions at the right, secondary first and the primary last, such as "Confirm and go to next". An action the person cannot take is disabled with its reason shown in words beside it ("Role required: Maintainer"), never refused after a click on an enabled button.
|
|
1054
|
+
|
|
1055
|
+
**Closed item.** It opens in its last state, read-only: no form, the result card showing what is served, and only navigation and close in the footer.
|
|
1056
|
+
|
|
1057
|
+
Stays in the app: the choices and what each serves, which actions are allowed and why not, the wording of refusals and alerts, the sources and the data.
|
|
1058
|
+
|
|
1059
|
+
## Limitation-text marks
|
|
1060
|
+
|
|
1061
|
+
How a verbatim source text shows the passages a decision rests on. The text stays the official text: a mark adds a background or an underline, and never changes a word, its case or its order.
|
|
1062
|
+
|
|
1063
|
+
**Text box.** Newsreader at a reading size (about 16.5 px) with a loose line height (about 2.2), so a mark never touches the line above it; on the canvas with a `--mq-border-light` border, the medium radius, and `--mq-space-3` by `--mq-space-4` padding. A long text scrolls inside its box (in the decision modal, inside its tab), never the page.
|
|
1064
|
+
|
|
1065
|
+
| Mark | Look | Means |
|
|
1066
|
+
| :-- | :-- | :-- |
|
|
1067
|
+
| Printed code | Geist Mono, navy text on `--mq-accent-pale`, the small radius | A code the text itself prints |
|
|
1068
|
+
| Accepted quote | `--mq-accent-pale-2` with a 2 px navy underline | A passage accepted as evidence for a decision |
|
|
1069
|
+
| Contested printed code | The printed mark with a 2 px `--mq-warning` underline | The printed code this item calls into question |
|
|
1070
|
+
| Quote pointed at | The accepted quote on `--mq-accent-pale` | While the person points at that quote elsewhere, such as its evidence row |
|
|
1071
|
+
|
|
1072
|
+
The contested mark differs from the printed one by its underline, not by colour alone, and the legend names it.
|
|
1073
|
+
|
|
1074
|
+
**Legend.** Under the box at the note size in muted text: a swatch for each mark this item uses (the contested mark only where the item has one), then, in tertiary, the editions the text belongs to in mono ("Binding in editions 01.03.2024 to 01.10.2026").
|
|
1075
|
+
|
|
1076
|
+
**Quoting a passage.** The text is plain text, so it can be selected with a pointer or the keyboard; the selection shows on `--mq-accent-pale`. When the selection could prove a decision, a popover opens beside it (the surface, a `--mq-border` border, the medium radius, `--mq-shadow-medium`): an eyebrow, "Quote as evidence for", then one small button per code that still needs a quote, its code in mono and its name. When nothing needs a quote, no popover opens. Once quoted, the passage takes the accepted-quote mark, and the decision form lists it as a quote row: a 3 px navy left edge (`--mq-stroke-tab`) on `--mq-accent-pale-2`, the passage in Newsreader italic, and a remove action.
|
|
1077
|
+
|
|
1078
|
+
| State | Shows |
|
|
1079
|
+
| :-- | :-- |
|
|
1080
|
+
| Printed, quoted, contested | The marks above, each in the legend |
|
|
1081
|
+
| Selection in progress | The selection on `--mq-accent-pale`; the popover only when a code needs a quote |
|
|
1082
|
+
| Long text | It scrolls inside its box; the legend stays under it |
|
|
1083
|
+
|
|
1084
|
+
Stays in the app: the passages and where they fall in the text, which codes need a quote, matching a quote to the text, and the popover's actions.
|
|
1085
|
+
|
|
1086
|
+
## History timeline
|
|
1087
|
+
|
|
1088
|
+
The decisions on one item, newest first: who did what, with which values, and which row is in force now. It is read on every item and later as an audit view.
|
|
1089
|
+
|
|
1090
|
+
**Filters** above it: a row of toggle buttons, "All" then one per source, each with its count in Geist Mono, tertiary; a `--mq-border` border with the small radius, never a pill. A filter that is on is navy (`--mq-on-accent` on `--mq-accent`), its count in `--mq-accent-pale`, and carries `aria-pressed`.
|
|
1091
|
+
|
|
1092
|
+
**Rows.** A vertical list joined by a 1 px `--mq-border` line through the dots. Each row is one line that opens to its details:
|
|
1093
|
+
|
|
1094
|
+
- the dot, by origin: a person's decision a filled navy dot, an agent's a dashed `--mq-border-strong` ring, the system's a plain ring, a publication a small square in `--mq-decoration`;
|
|
1095
|
+
- the date in Geist Mono, muted;
|
|
1096
|
+
- the source as an icon with its name (in a narrow pane the icon alone, its name in the tooltip and the accessible name);
|
|
1097
|
+
- the event as a chip with the small radius, one mark style per outcome: accepted or applied in the ring mark (navy border and text), rejected dashed, a person's decision pale (`--mq-accent-pale`), a publication quiet (`--mq-surface-alt`);
|
|
1098
|
+
- the person, muted; a person the app cannot name reads "Unknown identity" in tertiary italic, never an empty cell or an internal identifier;
|
|
1099
|
+
- the values in Geist Mono at the right, or "none" in tertiary italic;
|
|
1100
|
+
- the in-force column, then a chevron that turns when the row opens.
|
|
1101
|
+
|
|
1102
|
+
Hover on `--mq-surface-alt`. A row opens with a click or Enter: its details sit under it, aligned with the event, in tertiary text at the note size: the reason code in mono, the note, and the run that produced it as a mono link.
|
|
1103
|
+
|
|
1104
|
+
**The row in force.** Exactly one row is live: its in-force column shows a 10 px `--mq-success` dot with the live halo (`--mq-shadow-live`), its name ("in force") in the tooltip and the accessible name. Superseded rows leave the column empty.
|
|
1105
|
+
|
|
1106
|
+
**Key.** Under the list, after a hairline: each event mark and each dot with its meaning, in tertiary text at the note size, so no mark is read by colour alone.
|
|
1107
|
+
|
|
1108
|
+
| State | Shows |
|
|
1109
|
+
| :-- | :-- |
|
|
1110
|
+
| Collapsed, expanded | One line; the line with its details under it |
|
|
1111
|
+
| Live, superseded | The live dot with its halo; an empty column |
|
|
1112
|
+
| Filter on, off | The navy toggle; the outlined toggle. "All" turns the others off |
|
|
1113
|
+
| Loading | Skeleton rows of the same height; the shimmer stops under `prefers-reduced-motion` |
|
|
1114
|
+
| Empty | "No decision yet" in muted text, in the list's place |
|
|
1115
|
+
| Unknown person | "Unknown identity", tertiary italic |
|
|
1116
|
+
|
|
1117
|
+
Stays in the app: the event types and their wording, the sources, the data, and which row is in force.
|
|
1118
|
+
|
|
716
1119
|
# Specialising the design system
|
|
717
1120
|
|
|
718
1121
|
The design system is the single source of the MedQuantis visual identity (ADR-0002). A consumer uses it as released and adds only what it alone needs.
|
|
@@ -756,7 +1159,7 @@ Every local one-off (a component or a token a consumer adds under its own prefix
|
|
|
756
1159
|
|
|
757
1160
|
# Tokens
|
|
758
1161
|
|
|
759
|
-
Every token of release 1.
|
|
1162
|
+
Every token of release 1.3.0, generated from dist/tokens.json. Consumers use the semantic names; the `--mq-core-*` names exist so semantic tokens can point at them. A deprecated token names its replacement.
|
|
760
1163
|
|
|
761
1164
|
## Semantic tokens
|
|
762
1165
|
|
|
@@ -773,6 +1176,7 @@ Every token of release 1.1.0, generated from dist/tokens.json. Consumers use the
|
|
|
773
1176
|
| `--mq-accent-hover` | `#061a4d` | Hover state of accent-coloured controls. |
|
|
774
1177
|
| `--mq-accent-pale` | `#eaeef7` | Pale accent fill for a highlighted row, tag or state. |
|
|
775
1178
|
| `--mq-accent-pale-2` | `#f2f4f9` | Quieter pale accent fill. |
|
|
1179
|
+
| `--mq-accent-highlight` | `#0a2463` | Large highlighted title text; the accent itself in light, the light navy in dark (ADR-0007). |
|
|
776
1180
|
| `--mq-on-accent` | `#ffffff` | Text and icons on an accent fill, 14.53:1 on navy. |
|
|
777
1181
|
| `--mq-ink` | `#1a1a1a` | Primary text. |
|
|
778
1182
|
| `--mq-muted` | `#555555` | Secondary text. |
|
|
@@ -799,10 +1203,22 @@ Every token of release 1.1.0, generated from dist/tokens.json. Consumers use the
|
|
|
799
1203
|
| `--mq-warning` | `#a06400` | Owner ruling 5, 2026-10-09: warning text, icons and borders; apps only (ADR-0004). |
|
|
800
1204
|
| `--mq-danger` | `#d8232a` | Apps only: errors and destructive actions, always with an icon or a word (ADR-0003, ADR-0004). |
|
|
801
1205
|
| `--mq-info` | `#1565c0` | Apps only: information, always with an icon or a word (ADR-0004). |
|
|
1206
|
+
| `--mq-on-warning-fill` | `#1a1a1a` | Text on the warning fill: ink in light (5.93:1), near-black in dark (6.18:1), where warm white on the fill is 2.67:1 (ADR-0007, amends owner ruling 5). |
|
|
802
1207
|
| `--mq-warning-fill` | `#d4850a` | Owner ruling 5, 2026-10-09: warning badge and highlight fill, always with ink text; white on it is forbidden (2.93:1). |
|
|
803
1208
|
| `--mq-warning-tint` | `#fbf3e7` | Owner ruling 5, 2026-10-09: warning tint behind ink text; warning strong only for icons and borders on it. |
|
|
804
1209
|
| `--mq-dim` | `#707070` | Deprecated: Use --mq-tertiary for text or --mq-decoration for non-text decoration. |
|
|
805
1210
|
| `--mq-accent-on-dark` | `#8795b3` | Deprecated: Use --mq-on-navy-title for titles and rules, --mq-on-navy-accent for the one-off accent. |
|
|
1211
|
+
| `--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). |
|
|
1212
|
+
| `--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). |
|
|
1213
|
+
| `--mq-app-cat-orange-text` | `#a35f00` | Text in the app categorical orange (counts, labels), 5.01:1 on the surface (ADR-0008). |
|
|
1214
|
+
| `--mq-app-cat-vermillion` | `#cf2a00` | App categorical hue: a data category, never the danger status, which stays for errors (ADR-0008). |
|
|
1215
|
+
| `--mq-app-cat-blue` | `#3a8ff5` | App categorical hue for marks and fills on the surface only (3.27:1), never text (ADR-0008). |
|
|
1216
|
+
| `--mq-app-cat-violet` | `#5a2fbe` | App categorical hue: marks, fills and text (ADR-0008). |
|
|
1217
|
+
| `--mq-app-cat-teal` | `#178a91` | App categorical hue for marks and fills on the surface only (4.13:1), never text (ADR-0008). |
|
|
1218
|
+
| `--mq-change-added` | `#1c7e3f` | Change type added, in apps only, always with its sign or its word: marks, fills and text (ADR-0008). |
|
|
1219
|
+
| `--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). |
|
|
1220
|
+
| `--mq-change-modified-text` | `#a35f00` | Text of the change type modified (counts, labels), in apps only (ADR-0008). |
|
|
1221
|
+
| `--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). |
|
|
806
1222
|
| `--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). |
|
|
807
1223
|
| `--mq-focus-ring-color-on-navy` | `#ffffff` | Focus ring on navy backgrounds, 14.53:1. |
|
|
808
1224
|
| `--mq-focus-ring-width` | `2px` | Focus ring width (WCAG 2.4.7 and 1.4.11). |
|
|
@@ -824,12 +1240,16 @@ Every token of release 1.1.0, generated from dist/tokens.json. Consumers use the
|
|
|
824
1240
|
| `--mq-shadow-small` | `0px 1px 2px 0px rgba(0, 0, 0, 0.05)` | Cards (increment 07 component need). |
|
|
825
1241
|
| `--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). |
|
|
826
1242
|
| `--mq-shadow-panel` | `0px 14px 36px 0px rgba(10, 36, 99, 0.24)` | Navy panels (increment 07 component need). |
|
|
1243
|
+
| `--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). |
|
|
1244
|
+
| `--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). |
|
|
827
1245
|
| `--mq-slide-width` | `1280px` | Slide canvas width (increment 07 component need). |
|
|
828
1246
|
| `--mq-slide-height` | `720px` | Slide canvas height (increment 07 component need). |
|
|
829
1247
|
| `--mq-page-width` | `1040px` | Content width of a screen document (increment 07 component need). |
|
|
830
1248
|
| `--mq-page-measure` | `760px` | Longest line of running text (increment 07 component need). |
|
|
831
1249
|
| `--mq-a4-width` | `793.7px` | A4 sheet width (increment 07 component need). |
|
|
832
1250
|
| `--mq-a4-height` | `1122.52px` | A4 sheet height (increment 07 component need). |
|
|
1251
|
+
| `--mq-sidebar-width` | `248px` | Apps only: the expanded app sidebar. |
|
|
1252
|
+
| `--mq-sidebar-rail-width` | `64px` | Apps only: the app sidebar collapsed to an icon rail. |
|
|
833
1253
|
| `--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). |
|
|
834
1254
|
| `--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). |
|
|
835
1255
|
| `--mq-font-family-ui` | `Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif` | Labels and app UI (Owner ruling 10, 2026-10-09). |
|
|
@@ -896,6 +1316,13 @@ Every token of release 1.1.0, generated from dist/tokens.json. Consumers use the
|
|
|
896
1316
|
| `--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. |
|
|
897
1317
|
| `--mq-core-red` | `#d8232a` | Swiss red, kept only as the danger status colour (ADR-0003, ADR-0004). |
|
|
898
1318
|
| `--mq-core-blue` | `#1565c0` | Info hue for interactive apps (ADR-0004). |
|
|
1319
|
+
| `--mq-core-app-green` | `#1c7e3f` | App categorical green, a data category in interactive apps only, never the success status (ADR-0008). |
|
|
1320
|
+
| `--mq-core-app-orange` | `#d78000` | App categorical orange, marks and fills only, 3.01:1 on white (ADR-0008). |
|
|
1321
|
+
| `--mq-core-app-orange-dark` | `#a35f00` | Darker app categorical orange for text in that hue, 5.01:1 on white (ADR-0008). |
|
|
1322
|
+
| `--mq-core-app-vermillion` | `#cf2a00` | App categorical vermillion, a data category, never the danger status (ADR-0008). |
|
|
1323
|
+
| `--mq-core-app-blue` | `#3a8ff5` | App categorical blue, marks and fills only, 3.27:1 on white (ADR-0008). |
|
|
1324
|
+
| `--mq-core-app-violet` | `#5a2fbe` | App categorical violet (ADR-0008). |
|
|
1325
|
+
| `--mq-core-app-teal` | `#178a91` | App categorical teal, marks and fills only, 4.13:1 on white (ADR-0008). |
|
|
899
1326
|
| `--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). |
|
|
900
1327
|
| `--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). |
|
|
901
1328
|
| `--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). |
|
|
@@ -927,6 +1354,10 @@ Every token of release 1.1.0, generated from dist/tokens.json. Consumers use the
|
|
|
927
1354
|
| `--mq-core-shadow-small` | `0px 1px 2px 0px rgba(0, 0, 0, 0.05)` | Small elevation for cards (increment 07 component need, Report design system, 2026-10-08). |
|
|
928
1355
|
| `--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). |
|
|
929
1356
|
| `--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). |
|
|
1357
|
+
| `--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). |
|
|
1358
|
+
| `--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). |
|
|
1359
|
+
| `--mq-core-size-64` | `64px` | App sidebar collapsed to an icon rail, 64 px (#38 component need: the Maintainer app shell). |
|
|
1360
|
+
| `--mq-core-size-248` | `248px` | App sidebar width, 248 px (#38 component need: the Maintainer app shell). |
|
|
930
1361
|
| `--mq-core-size-720` | `720px` | Slide canvas height, 720 px (increment 07 component need: the 1280 by 720 slide canvas). |
|
|
931
1362
|
| `--mq-core-size-760` | `760px` | Reading measure, 760 px (increment 07 component need, Report design system, 2026-10-08). |
|
|
932
1363
|
| `--mq-core-size-1040` | `1040px` | Content width of a screen document, 1040 px (increment 07 component need, Report design system, 2026-10-08). |
|