@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/README.md +15 -3
- package/dist/DESIGN.md +344 -6
- package/dist/kit/brand.css +2 -2
- package/dist/kit/guidance.md +4 -2
- package/dist/llms-full.txt +346 -5
- package/dist/llms.txt +24 -23
- package/dist/tailwind.css +11 -0
- package/dist/themes/dark.css +1 -0
- package/dist/themes/dark.json +10 -0
- package/dist/tokens.css +24 -0
- package/dist/tokens.json +251 -0
- package/guidelines/README.md +3 -0
- package/guidelines/accessibility.md +2 -1
- package/guidelines/app-patterns.md +281 -0
- package/guidelines/charts.md +33 -1
- package/guidelines/colour.md +3 -2
- package/icons/lucide.min.js +3 -3
- package/icons/manifest.json +2 -2
- package/package.json +7 -6
package/dist/llms-full.txt
CHANGED
|
@@ -22,6 +22,7 @@ The MedQuantis brand, writing, colour, type, layout, chart, data and accessibili
|
|
|
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.
|
|
@@ -229,7 +230,7 @@ Use semantic tokens only. The `--mq-core-*` names hold raw values and exist so s
|
|
|
229
230
|
| Medium | Colours allowed | How a state is shown |
|
|
230
231
|
| :-- | :-- | :-- |
|
|
231
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 |
|
|
232
|
-
| 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 |
|
|
233
234
|
|
|
234
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.
|
|
235
236
|
|
|
@@ -318,7 +319,7 @@ Every status colour comes with an icon or a word (WCAG 1.4.1):
|
|
|
318
319
|
- a flag is a coloured word, and only on the rows that need attention, so normal rows stay quiet;
|
|
319
320
|
- light badge backgrounds come from the 50 and 100 steps of the status scales in `dist/tailwind.css`, never a hand-picked tint.
|
|
320
321
|
|
|
321
|
-
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).
|
|
322
323
|
|
|
323
324
|
## Chart colours
|
|
324
325
|
|
|
@@ -358,6 +359,7 @@ Every ratio below is the WCAG 2.x contrast with the dark values, on the dark can
|
|
|
358
359
|
| `--mq-panel-end` | `#0f2a5e` | Dark end of the navy panel gradient | Background |
|
|
359
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 |
|
|
360
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 |
|
|
361
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 |
|
|
362
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 |
|
|
363
365
|
|
|
@@ -594,7 +596,7 @@ One column, a 16 px gutter, and no horizontal scrolling of the page. Only tables
|
|
|
594
596
|
|
|
595
597
|
# Charts
|
|
596
598
|
|
|
597
|
-
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.
|
|
598
600
|
|
|
599
601
|
## The ordered palette
|
|
600
602
|
|
|
@@ -629,6 +631,38 @@ Rules:
|
|
|
629
631
|
| Ranking with more than four items | Highlight on grey, below |
|
|
630
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 |
|
|
631
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
|
+
|
|
632
666
|
## Highlight on grey
|
|
633
667
|
|
|
634
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.
|
|
@@ -749,7 +783,8 @@ Colour never carries meaning on its own (WCAG 1.4.1):
|
|
|
749
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;
|
|
750
784
|
- apps pair every status colour with an icon or a word;
|
|
751
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);
|
|
752
|
-
- 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).
|
|
753
788
|
|
|
754
789
|
## Contrast pairs
|
|
755
790
|
|
|
@@ -799,6 +834,288 @@ Placeholder text in inputs uses the tertiary text colour, never a lighter grey.
|
|
|
799
834
|
- Icons that carry meaning have a label; decorative icons are hidden (`aria-hidden="true"`).
|
|
800
835
|
- PDFs exported from HTML are tagged and carry an outline (Playwright `tagged` and `outline`); the specimen test exports one.
|
|
801
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
|
+
|
|
802
1119
|
# Specialising the design system
|
|
803
1120
|
|
|
804
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.
|
|
@@ -842,7 +1159,7 @@ Every local one-off (a component or a token a consumer adds under its own prefix
|
|
|
842
1159
|
|
|
843
1160
|
# Tokens
|
|
844
1161
|
|
|
845
|
-
Every token of release 1.
|
|
1162
|
+
Every token of release 1.4.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.
|
|
846
1163
|
|
|
847
1164
|
## Semantic tokens
|
|
848
1165
|
|
|
@@ -891,6 +1208,17 @@ Every token of release 1.2.0, generated from dist/tokens.json. Consumers use the
|
|
|
891
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. |
|
|
892
1209
|
| `--mq-dim` | `#707070` | Deprecated: Use --mq-tertiary for text or --mq-decoration for non-text decoration. |
|
|
893
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). |
|
|
894
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). |
|
|
895
1223
|
| `--mq-focus-ring-color-on-navy` | `#ffffff` | Focus ring on navy backgrounds, 14.53:1. |
|
|
896
1224
|
| `--mq-focus-ring-width` | `2px` | Focus ring width (WCAG 2.4.7 and 1.4.11). |
|
|
@@ -913,12 +1241,15 @@ Every token of release 1.2.0, generated from dist/tokens.json. Consumers use the
|
|
|
913
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). |
|
|
914
1242
|
| `--mq-shadow-panel` | `0px 14px 36px 0px rgba(10, 36, 99, 0.24)` | Navy panels (increment 07 component need). |
|
|
915
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). |
|
|
916
1245
|
| `--mq-slide-width` | `1280px` | Slide canvas width (increment 07 component need). |
|
|
917
1246
|
| `--mq-slide-height` | `720px` | Slide canvas height (increment 07 component need). |
|
|
918
1247
|
| `--mq-page-width` | `1040px` | Content width of a screen document (increment 07 component need). |
|
|
919
1248
|
| `--mq-page-measure` | `760px` | Longest line of running text (increment 07 component need). |
|
|
920
1249
|
| `--mq-a4-width` | `793.7px` | A4 sheet width (increment 07 component need). |
|
|
921
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. |
|
|
922
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). |
|
|
923
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). |
|
|
924
1255
|
| `--mq-font-family-ui` | `Outfit, system-ui, -apple-system, 'Segoe UI', sans-serif` | Labels and app UI (Owner ruling 10, 2026-10-09). |
|
|
@@ -985,6 +1316,13 @@ Every token of release 1.2.0, generated from dist/tokens.json. Consumers use the
|
|
|
985
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. |
|
|
986
1317
|
| `--mq-core-red` | `#d8232a` | Swiss red, kept only as the danger status colour (ADR-0003, ADR-0004). |
|
|
987
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). |
|
|
988
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). |
|
|
989
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). |
|
|
990
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). |
|
|
@@ -1017,6 +1355,9 @@ Every token of release 1.2.0, generated from dist/tokens.json. Consumers use the
|
|
|
1017
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). |
|
|
1018
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). |
|
|
1019
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). |
|
|
1020
1361
|
| `--mq-core-size-720` | `720px` | Slide canvas height, 720 px (increment 07 component need: the 1280 by 720 slide canvas). |
|
|
1021
1362
|
| `--mq-core-size-760` | `760px` | Reading measure, 760 px (increment 07 component need, Report design system, 2026-10-08). |
|
|
1022
1363
|
| `--mq-core-size-1040` | `1040px` | Content width of a screen document, 1040 px (increment 07 component need, Report design system, 2026-10-08). |
|
package/dist/llms.txt
CHANGED
|
@@ -8,32 +8,33 @@ The links below point at the exact release on the jsDelivr CDN; pin that version
|
|
|
8
8
|
|
|
9
9
|
## Guidelines
|
|
10
10
|
|
|
11
|
-
- [Principles](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
12
|
-
- [Brand](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
13
|
-
- [Voice](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
14
|
-
- [Writing](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
15
|
-
- [Colour](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
16
|
-
- [Typography](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
17
|
-
- [Layout](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
18
|
-
- [Charts](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
19
|
-
- [Data patterns](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
20
|
-
- [Accessibility](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
21
|
-
- [
|
|
11
|
+
- [Principles](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/principles.md): The principles that decide the cases the other files do not cover
|
|
12
|
+
- [Brand](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/brand.md): Name, tagline, legal line, wordmark, monogram, favicon, icons
|
|
13
|
+
- [Voice](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/voice.md): Tone, words to prefer and avoid, languages, terminology in French, German, Italian and English
|
|
14
|
+
- [Writing](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/writing.md): No em or en dash, titles, sentences and lists, French typography
|
|
15
|
+
- [Colour](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/colour.md): Semantic colour tokens, the medium split, navy panels, states by mark style, status colours in apps, the dark theme
|
|
16
|
+
- [Typography](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/typography.md): Families, weights, roles, sizes and line heights
|
|
17
|
+
- [Layout](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/layout.md): Media, report skeleton, widths and spacing, radius, components, tables, app patterns, print
|
|
18
|
+
- [Charts](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/charts.md): The ordered palette, highlight on grey, sequential and diverging use, marks, legends
|
|
19
|
+
- [Data patterns](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/data-patterns.md): Numbers, amounts, dates, null versus zero, confidential and illustrative data
|
|
20
|
+
- [Accessibility](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/accessibility.md): WCAG 2.2 AA, contrast pairs, focus, targets, motion, structure
|
|
21
|
+
- [App patterns](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/app-patterns.md): Apps only: the app shell, and the review, decision and history patterns of dense internal tools
|
|
22
|
+
- [Specialising the design system](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/specialising.md): Framework neutrality, the four rules, the promotion tests, the one-off log
|
|
22
23
|
|
|
23
24
|
## Tokens and CSS
|
|
24
25
|
|
|
25
|
-
- [tokens.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
26
|
-
- [tokens.json](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
27
|
-
- [tailwind.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
28
|
-
- [base.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
29
|
-
- [components.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
30
|
-
- [slide.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
31
|
-
- [print.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
32
|
-
- [app.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
33
|
-
- [fonts.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
26
|
+
- [tokens.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/dist/tokens.css): every token as a `--mq-*` custom property; load it first
|
|
27
|
+
- [tokens.json](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/dist/tokens.json): every token with its resolved value and description
|
|
28
|
+
- [tailwind.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/dist/tailwind.css): Tailwind 4 theme with 50 to 950 scales, for apps
|
|
29
|
+
- [base.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/css/base.css): typography roles for documents
|
|
30
|
+
- [components.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/css/components.css): the shared `mq-` document components
|
|
31
|
+
- [slide.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/css/slide.css): the 1280 by 720 slide canvas
|
|
32
|
+
- [print.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/css/print.css): A4 pages with exact colour printing
|
|
33
|
+
- [app.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/css/app.css): status badges, for interactive apps only
|
|
34
|
+
- [fonts.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/fonts/fonts.css): self-hosted Outfit, Newsreader and Geist Mono
|
|
34
35
|
|
|
35
36
|
## Optional
|
|
36
37
|
|
|
37
|
-
- [llms-full.txt](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
38
|
-
- [kit-contract.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
39
|
-
- [Guidelines index](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.
|
|
38
|
+
- [llms-full.txt](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/dist/llms-full.txt): every guideline in full and every token with its value
|
|
39
|
+
- [kit-contract.css](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/dist/kit-contract.css): unprefixed names for homemade-claude-kit renderers only, never loaded in an app
|
|
40
|
+
- [Guidelines index](https://cdn.jsdelivr.net/npm/@medquantis/design-system@1.4.0/guidelines/README.md): the file list and where each legacy rule went
|
package/dist/tailwind.css
CHANGED
|
@@ -115,4 +115,15 @@
|
|
|
115
115
|
--color-on-navy-discreet: var(--mq-on-navy-discreet);
|
|
116
116
|
--color-warning-fill: var(--mq-warning-fill);
|
|
117
117
|
--color-warning-tint: var(--mq-warning-tint);
|
|
118
|
+
--color-app-cat-green: var(--mq-app-cat-green);
|
|
119
|
+
--color-app-cat-orange: var(--mq-app-cat-orange);
|
|
120
|
+
--color-app-cat-orange-text: var(--mq-app-cat-orange-text);
|
|
121
|
+
--color-app-cat-vermillion: var(--mq-app-cat-vermillion);
|
|
122
|
+
--color-app-cat-blue: var(--mq-app-cat-blue);
|
|
123
|
+
--color-app-cat-violet: var(--mq-app-cat-violet);
|
|
124
|
+
--color-app-cat-teal: var(--mq-app-cat-teal);
|
|
125
|
+
--color-change-added: var(--mq-change-added);
|
|
126
|
+
--color-change-modified: var(--mq-change-modified);
|
|
127
|
+
--color-change-modified-text: var(--mq-change-modified-text);
|
|
128
|
+
--color-change-removed: var(--mq-change-removed);
|
|
118
129
|
}
|
package/dist/themes/dark.css
CHANGED
|
@@ -46,4 +46,5 @@
|
|
|
46
46
|
--mq-shadow-medium: 0px 3px 12px 0px rgba(0, 0, 0, 0.5); /** A slide or page previewed on the dark desk: black at 50 % (ADR-0007, owner approval of 2026-10-17). */
|
|
47
47
|
--mq-shadow-panel: 0px 0px 0px 1px rgba(159, 179, 232, 0.35); /** Navy panels on dark: a 1 px light-navy outline, no glow (ADR-0007, owner 2026-10-15). */
|
|
48
48
|
--mq-shadow-edge: 0px 0px 0px 1px rgba(159, 179, 232, 0.35); /** On dark, the panel's 1 px light-navy outline around a navy KPI tile, a navy brand tile and the monogram, whose navy square is 1.11:1 on the dark surface (owner rulings 13 and 14, ADR-0007). */
|
|
49
|
+
--mq-shadow-live: 0px 0px 0px 3px rgba(111, 191, 115, 0.17); /** The live halo on dark: a 3 px ring of the dark success green at 17 % (ADR-0004, ADR-0007). */
|
|
49
50
|
}
|
package/dist/themes/dark.json
CHANGED
|
@@ -432,5 +432,15 @@
|
|
|
432
432
|
"edge"
|
|
433
433
|
],
|
|
434
434
|
"description": "On dark, the panel's 1 px light-navy outline around a navy KPI tile, a navy brand tile and the monogram, whose navy square is 1.11:1 on the dark surface (owner rulings 13 and 14, ADR-0007)."
|
|
435
|
+
},
|
|
436
|
+
"--mq-shadow-live": {
|
|
437
|
+
"value": "0px 0px 0px 3px rgba(111, 191, 115, 0.17)",
|
|
438
|
+
"type": "shadow",
|
|
439
|
+
"path": [
|
|
440
|
+
"semantic",
|
|
441
|
+
"shadow",
|
|
442
|
+
"live"
|
|
443
|
+
],
|
|
444
|
+
"description": "The live halo on dark: a 3 px ring of the dark success green at 17 % (ADR-0004, ADR-0007)."
|
|
435
445
|
}
|
|
436
446
|
}
|