@usableapp/cardds 0.7.96 → 0.7.98

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/bin/cardds.mjs CHANGED
@@ -78,7 +78,7 @@ In the app's entry, once:
78
78
  import './theme.css'; // after cardds.css
79
79
 
80
80
  Start a screen from a template (Walkthrough · Home · CallSheet · Splash) or compose the components —
81
- import them, never copy their markup: the behaviour lives in the component. Gallery: see README.`);
81
+ import them, never copy their markup: the behaviour lives in the component. Gallery: see docs/reference.md.`);
82
82
  return 0;
83
83
  }
84
84
 
package/css/actions.css CHANGED
@@ -199,7 +199,7 @@
199
199
  /* --sm: a small LABEL (a name on a note, a tag in a tight head) — low and tight; never a tap target */
200
200
  .chip--sm { min-height: 0; gap: var(--chip-sm-gap, var(--sp-1)); padding: var(--chip-sm-pad-y, var(--sp-0)) var(--chip-sm-pad-x, var(--sp-2)); }
201
201
  .chip--on { background: var(--chip-on-bg, var(--accent)); --dark: var(--accent-dark); color: var(--chip-on-ink, var(--card-ink)); border-color: transparent; }
202
- /* muted: an untouched default — the words wash out, the edge stays; emphasis is the difference from the neighbours (README 13) */
202
+ /* muted: an untouched default — the words wash out, the edge stays; emphasis is the difference from the neighbours (docs/reference.md 13) */
203
203
  .chip--muted { color: var(--chip-muted-ink, var(--card-muted)); } /* the chip's own fill's muted words: a muted chip on the dark card is still a light chip */
204
204
 
205
205
  .chip-row { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
@@ -229,7 +229,7 @@
229
229
  font-size: var(--fs-body);
230
230
  text-align: left;
231
231
  }
232
- /* muted: the value is still the default (README 13) */
232
+ /* muted: the value is still the default (docs/reference.md 13) */
233
233
  .dropdown--muted .dropdown__btn { color: var(--dropdown-muted-ink, var(--action-muted)); }
234
234
  .dropdown__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
235
235
  .dropdown__btn > .icon { transition: rotate var(--motion-quick) ease; }
package/css/finish.css CHANGED
@@ -20,10 +20,9 @@
20
20
  so a finish sits in any palette; the one plain white is the sticker's backing paper and the lit edge's light.
21
21
  ============================================================ */
22
22
 
23
- /* every finish: the finish IS the controls' edge, so the wireframe's control border steps back (as [data-palette] in palette.css). The card
24
- keeps its --card-border: lit's ring and sticker's white cut do not reach 3:1 on a light ground (palette.css, THE CARD KEEPS AN EDGE);
25
- print and ink draw their own line below */
26
- [data-finish] { --action-border: transparent; }
23
+ /* every finish: the finish IS the edge, so the wireframe's two borders step back (as [data-palette] in palette.css, A CARD HAS NO EDGE);
24
+ ink puts its own line there below */
25
+ [data-finish] { --card-border: transparent; --action-border: transparent; }
27
26
 
28
27
  /* ============================================================
29
28
  lit — the light comes from above:
package/css/numbers.css CHANGED
@@ -46,7 +46,7 @@
46
46
  --_step: calc(var(--tap-base) * 2 / 3); /* 32 the round of one step */
47
47
  --_pad: calc((var(--header-h) - var(--_step)) / 2); /* 14 round + its room = the top bar's height; the end rounds sit concentric in the pill */
48
48
  /* the track lays down the accent fill of where it stands (the brand on a light card, the card's ink on the brand card), so it is a
49
- surface of that fill's side; its steps re-point the accent to its ink, as the brand card slot does (README rule 10) */
49
+ surface of that fill's side; its steps re-point the accent to its ink, as the brand card slot does (docs/reference.md rule 10) */
50
50
  --dark: var(--accent-dark);
51
51
  list-style: none;
52
52
  margin: 0;
package/css/palette.css CHANGED
@@ -3,7 +3,7 @@
3
3
  Apply with <html data-palette="clay"> (or <body>).
4
4
  No attribute = wireframe grayscale from tokens.css.
5
5
  Each palette overrides role tokens only — components never change.
6
- A palette sets its grounds, its two ink sets (onlight, ondark; README "Ink follows its ground") and the side of any ground
6
+ A palette sets its grounds, its two ink sets (onlight, ondark; docs/reference.md "Ink follows its ground") and the side of any ground
7
7
  that is not the default's (tokens.css: tones 1, 2, 4 and the paper light; tone 3, tone 5 and the brand dark). Each ink set
8
8
  holds 4.5:1 on every ground of its side; a tone with words on its 12% tint (a banner, a step bar, today) holds them there too.
9
9
  ============================================================ */
@@ -124,17 +124,15 @@
124
124
  --dot-a: #dd9787; --dot-b: #b08a5a;
125
125
  }
126
126
 
127
- /* Colored palettes add a soft elevation under the card's edge. */
127
+ /* Colored palettes trade wireframe outlines for soft elevation. */
128
128
  [data-palette] :is(.card, .band-stack) { box-shadow: var(--shadow-card); }
129
129
  /* COLOURED MODE is the attribute, whatever its value: a project with colours of its own (the five
130
130
  --color-* bases, or roles, in its theme.css) writes <html data-palette="own"> — no block here matches
131
131
  "own", so only the three generic rules apply: the card's shadow, the soft outline, the field's soft
132
- edge (forms.css); and the controls' wireframe border steps back, as in every stock palette.
133
- THE CARD KEEPS AN EDGE (Lh 2026-10-18, timebank's help sheet: white cards on the white sheet, "no different from
134
- the background at all"). A card is one boundary, and WCAG 2.2 SC 1.4.11 asks 3:1 for it against what it stands
135
- on. Light cards on a light ground cannot reach 3:1 by fill (a tone-1 card in a tone-1 sheet is 1:1), so the
136
- edge carries it: the muted ink of the ground, which every palette already holds to AA on its surface.
137
- `cardGrounds()` measures each tone on each ground (tests/card-grounds.spec.js). */
138
- [data-palette] { --card-border: var(--on-surface-muted); --action-border: transparent; }
132
+ edge (forms.css); and the two wireframe borders step back, as in every stock palette.
133
+ A CARD HAS NO EDGE (Lh 2026-10-18, ruled after 0.7.96 gave every card and every sheet a line: "this design never
134
+ used a card edge"). A card stands apart from its ground by its FILL; `cardGrounds()` measures that fill and
135
+ names the tokens to move. Never answer a card that cannot be seen with a border. */
136
+ [data-palette] { --card-border: transparent; --action-border: transparent; }
139
137
  /* …but controls keep a faint edge so they still read as controls */
140
138
  [data-palette] { --outline: color-mix(in srgb, currentColor 25%, transparent); }
package/css/stack.css CHANGED
@@ -32,7 +32,7 @@
32
32
  bottom, the headroom above is the base's (block below).
33
33
  --flood (with --closed): an open sheet fills the whole screen, over the top bar.
34
34
  Direct children only, five at most (slots are :nth-child below):
35
- first = the back of the stack, last = the front. README "Sheet stack
35
+ first = the back of the stack, last = the front. docs/reference.md "Sheet stack
36
36
  markup". The SheetStack component opens and closes a --tap stack; without it the
37
37
  stack still renders, it just won't open.
38
38
  ============================================================ */
@@ -43,7 +43,7 @@
43
43
  /* --color-brand: #ef4e0b; */ /* the primary action, the strong card */
44
44
  /* --color-on-brand: #fff4ec; */ /* the words on the brand */
45
45
 
46
- /* ---- ink: two sets, ONLIGHT and ONDARK (README "Ink follows its ground") ----
46
+ /* ---- ink: two sets, ONLIGHT and ONDARK (docs/reference.md "Ink follows its ground") ----
47
47
  Every word and glyph on a light ground is onlight, on a dark ground ondark. Set the two sets; each one's ink and its muted shade
48
48
  hold 4.5:1 on every ground of its side (inkGrounds() measures it). Unset, --color-ink and --color-on-brand derive them.
49
49
  --ink-onlight --ink-onlight-muted --ink-ondark --ink-ondark-muted
@@ -55,7 +55,7 @@
55
55
 
56
56
  /* ---- colour roles: only where a derivation is not what you want — a role set here wins over it ----
57
57
  --surface --card-1-bg … --card-5-bg (five card tones: fills only, their words follow their side)
58
- --card-border (a card's fill or its --card-border holds 3:1 on its ground: cardGrounds(), README)
58
+ --card-border (transparent in coloured mode: a card stands apart by its fill, 3:1 on its ground — cardGrounds(), docs/reference.md)
59
59
  --accent --action-bg --action-border
60
60
  --pos --neg --dot-a --dot-b
61
61
  --signal-ok-onlight --signal-warn-onlight --signal-error-onlight --signal-info-onlight (the signal set: green · yellow · red ·
package/css/tokens.css CHANGED
@@ -180,7 +180,7 @@
180
180
 
181
181
  /* INK: TWO SETS, ONLIGHT AND ONDARK (Lh 2026-10-18: "there are text colours ONLIGHT and ONDARK. When the ground is light, use
182
182
  onlight; when the ground is dark, use ondark"). Words and glyphs alike (icons, marks, dots, a check, a knob). Each set holds its
183
- ink and its muted shade to 4.5:1 on every ground of its side. README "Ink follows its ground". */
183
+ ink and its muted shade to 4.5:1 on every ground of its side. docs/reference.md "Ink follows its ground". */
184
184
  --ink-onlight: var(--color-ink, #141414);
185
185
  --ink-onlight-muted: var(--_onlight-muted, #575757); /* 4.6:1 on the water note and 4.9 on tone 4's grey, the darkest light grounds */
186
186
  --ink-ondark: var(--color-on-brand, #ffffff);
@@ -205,7 +205,7 @@
205
205
  --card-4-bg: #d4d4d0;
206
206
  --card-5-bg: #3d3d3d;
207
207
 
208
- --card-border: #141414; /* wireframe: visible outline; coloured mode: --on-surface-muted (palette.css). Its edge, or the fill, holds 3:1 on the ground: cardGrounds() */
208
+ --card-border: #141414; /* wireframe: visible outline; coloured mode and every finish: transparent, the card stands apart by its fill (cardGrounds()) */
209
209
 
210
210
  /* actions */
211
211
  --accent: var(--color-brand, #141414); /* primary CTA fill */
@@ -279,7 +279,7 @@
279
279
  marks, dots: currentColor), --card-muted (secondary words), the four signals, --on-accent (the ink on the accent fill, whose
280
280
  side is --accent-dark) and --accent-ink (the brand as a glyph). A piece with no fill of its own reads only these, so a dark
281
281
  surface turns everything on it to ondark with no rule per piece. A piece with no fill that stands in for a surface (a stat
282
- tile) takes its ground's side: `--dark: inherit`. inkGrounds() measures it; README "Ink follows its ground" */
282
+ tile) takes its ground's side: `--dark: inherit`. inkGrounds() measures it; docs/reference.md "Ink follows its ground" */
283
283
  :where(body, [data-palette], [data-mode], .card, .tile, .modal__drawer, .postcard__front, .postcard__back, .sticky, .post-paper,
284
284
  .float-bar__pill, .snackbar__body, .delta, .track, .tile-badge, .avatar, .bubble__body, .map__hint, .sheet--paper > .sheet__body,
285
285
  .postcard__band, .track__step, .toggle, .chip) {
@@ -3,7 +3,7 @@ import { type DotTone } from './Dot.js';
3
3
  export interface ChipProps extends ComponentProps<'span'> {
4
4
  /** filled accent: the selected / live state */
5
5
  on?: boolean;
6
- /** quiet: an untouched default value — muted words, the thin edge, nothing to find the eye (README rule 13) */
6
+ /** quiet: an untouched default value — muted words, the thin edge, nothing to find the eye (docs/reference.md rule 13) */
7
7
  muted?: boolean;
8
8
  /** a leading signal dot: `a` (the accent signal), `b` (the secondary), or one of the signal set — ok · warn · error · info */
9
9
  dot?: 'a' | 'b' | DotTone;
@@ -13,7 +13,7 @@ export interface DropdownProps extends Omit<ComponentProps<'div'>, 'onChange' |
13
13
  label?: ReactNode;
14
14
  /** right-aligned trigger: the panel grows leftwards (in TopBar actions) */
15
15
  end?: boolean;
16
- /** quiet: the value is still the default — muted words; drop it once the member picks (README rule 13) */
16
+ /** quiet: the value is still the default — muted words; drop it once the member picks (docs/reference.md rule 13) */
17
17
  muted?: boolean;
18
18
  /** MenuItems, each with a `value` */
19
19
  children?: ReactNode;
package/dist/cardds.css CHANGED
@@ -221,7 +221,7 @@
221
221
 
222
222
  /* INK: TWO SETS, ONLIGHT AND ONDARK (Lh 2026-10-18: "there are text colours ONLIGHT and ONDARK. When the ground is light, use
223
223
  onlight; when the ground is dark, use ondark"). Words and glyphs alike (icons, marks, dots, a check, a knob). Each set holds its
224
- ink and its muted shade to 4.5:1 on every ground of its side. README "Ink follows its ground". */
224
+ ink and its muted shade to 4.5:1 on every ground of its side. docs/reference.md "Ink follows its ground". */
225
225
  --ink-onlight: var(--color-ink, #141414);
226
226
  --ink-onlight-muted: var(--_onlight-muted, #575757); /* 4.6:1 on the water note and 4.9 on tone 4's grey, the darkest light grounds */
227
227
  --ink-ondark: var(--color-on-brand, #ffffff);
@@ -246,7 +246,7 @@
246
246
  --card-4-bg: #d4d4d0;
247
247
  --card-5-bg: #3d3d3d;
248
248
 
249
- --card-border: #141414; /* wireframe: visible outline; coloured mode: --on-surface-muted (palette.css). Its edge, or the fill, holds 3:1 on the ground: cardGrounds() */
249
+ --card-border: #141414; /* wireframe: visible outline; coloured mode and every finish: transparent, the card stands apart by its fill (cardGrounds()) */
250
250
 
251
251
  /* actions */
252
252
  --accent: var(--color-brand, #141414); /* primary CTA fill */
@@ -320,7 +320,7 @@
320
320
  marks, dots: currentColor), --card-muted (secondary words), the four signals, --on-accent (the ink on the accent fill, whose
321
321
  side is --accent-dark) and --accent-ink (the brand as a glyph). A piece with no fill of its own reads only these, so a dark
322
322
  surface turns everything on it to ondark with no rule per piece. A piece with no fill that stands in for a surface (a stat
323
- tile) takes its ground's side: `--dark: inherit`. inkGrounds() measures it; README "Ink follows its ground" */
323
+ tile) takes its ground's side: `--dark: inherit`. inkGrounds() measures it; docs/reference.md "Ink follows its ground" */
324
324
  :where(body, [data-palette], [data-mode], .card, .tile, .modal__drawer, .postcard__front, .postcard__back, .sticky, .post-paper,
325
325
  .float-bar__pill, .snackbar__body, .delta, .track, .tile-badge, .avatar, .bubble__body, .map__hint, .sheet--paper > .sheet__body,
326
326
  .postcard__band, .track__step, .toggle, .chip) {
@@ -356,7 +356,7 @@
356
356
  Apply with <html data-palette="clay"> (or <body>).
357
357
  No attribute = wireframe grayscale from tokens.css.
358
358
  Each palette overrides role tokens only — components never change.
359
- A palette sets its grounds, its two ink sets (onlight, ondark; README "Ink follows its ground") and the side of any ground
359
+ A palette sets its grounds, its two ink sets (onlight, ondark; docs/reference.md "Ink follows its ground") and the side of any ground
360
360
  that is not the default's (tokens.css: tones 1, 2, 4 and the paper light; tone 3, tone 5 and the brand dark). Each ink set
361
361
  holds 4.5:1 on every ground of its side; a tone with words on its 12% tint (a banner, a step bar, today) holds them there too.
362
362
  ============================================================ */
@@ -477,18 +477,16 @@
477
477
  --dot-a: #dd9787; --dot-b: #b08a5a;
478
478
  }
479
479
 
480
- /* Colored palettes add a soft elevation under the card's edge. */
480
+ /* Colored palettes trade wireframe outlines for soft elevation. */
481
481
  [data-palette] :is(.card, .band-stack) { box-shadow: var(--shadow-card); }
482
482
  /* COLOURED MODE is the attribute, whatever its value: a project with colours of its own (the five
483
483
  --color-* bases, or roles, in its theme.css) writes <html data-palette="own"> — no block here matches
484
484
  "own", so only the three generic rules apply: the card's shadow, the soft outline, the field's soft
485
- edge (forms.css); and the controls' wireframe border steps back, as in every stock palette.
486
- THE CARD KEEPS AN EDGE (Lh 2026-10-18, timebank's help sheet: white cards on the white sheet, "no different from
487
- the background at all"). A card is one boundary, and WCAG 2.2 SC 1.4.11 asks 3:1 for it against what it stands
488
- on. Light cards on a light ground cannot reach 3:1 by fill (a tone-1 card in a tone-1 sheet is 1:1), so the
489
- edge carries it: the muted ink of the ground, which every palette already holds to AA on its surface.
490
- `cardGrounds()` measures each tone on each ground (tests/card-grounds.spec.js). */
491
- [data-palette] { --card-border: var(--on-surface-muted); --action-border: transparent; }
485
+ edge (forms.css); and the two wireframe borders step back, as in every stock palette.
486
+ A CARD HAS NO EDGE (Lh 2026-10-18, ruled after 0.7.96 gave every card and every sheet a line: "this design never
487
+ used a card edge"). A card stands apart from its ground by its FILL; `cardGrounds()` measures that fill and
488
+ names the tokens to move. Never answer a card that cannot be seen with a border. */
489
+ [data-palette] { --card-border: transparent; --action-border: transparent; }
492
490
  /* …but controls keep a faint edge so they still read as controls */
493
491
  [data-palette] { --outline: color-mix(in srgb, currentColor 25%, transparent); }
494
492
 
@@ -1125,7 +1123,7 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
1125
1123
  bottom, the headroom above is the base's (block below).
1126
1124
  --flood (with --closed): an open sheet fills the whole screen, over the top bar.
1127
1125
  Direct children only, five at most (slots are :nth-child below):
1128
- first = the back of the stack, last = the front. README "Sheet stack
1126
+ first = the back of the stack, last = the front. docs/reference.md "Sheet stack
1129
1127
  markup". The SheetStack component opens and closes a --tap stack; without it the
1130
1128
  stack still renders, it just won't open.
1131
1129
  ============================================================ */
@@ -2734,7 +2732,7 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
2734
2732
  /* --sm: a small LABEL (a name on a note, a tag in a tight head) — low and tight; never a tap target */
2735
2733
  .chip--sm { min-height: 0; gap: var(--chip-sm-gap, var(--sp-1)); padding: var(--chip-sm-pad-y, var(--sp-0)) var(--chip-sm-pad-x, var(--sp-2)); }
2736
2734
  .chip--on { background: var(--chip-on-bg, var(--accent)); --dark: var(--accent-dark); color: var(--chip-on-ink, var(--card-ink)); border-color: transparent; }
2737
- /* muted: an untouched default — the words wash out, the edge stays; emphasis is the difference from the neighbours (README 13) */
2735
+ /* muted: an untouched default — the words wash out, the edge stays; emphasis is the difference from the neighbours (docs/reference.md 13) */
2738
2736
  .chip--muted { color: var(--chip-muted-ink, var(--card-muted)); } /* the chip's own fill's muted words: a muted chip on the dark card is still a light chip */
2739
2737
 
2740
2738
  .chip-row { display: flex; gap: var(--sp-2); flex-wrap: wrap; }
@@ -2764,7 +2762,7 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
2764
2762
  font-size: var(--fs-body);
2765
2763
  text-align: left;
2766
2764
  }
2767
- /* muted: the value is still the default (README 13) */
2765
+ /* muted: the value is still the default (docs/reference.md 13) */
2768
2766
  .dropdown--muted .dropdown__btn { color: var(--dropdown-muted-ink, var(--action-muted)); }
2769
2767
  .dropdown__label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2770
2768
  .dropdown__btn > .icon { transition: rotate var(--motion-quick) ease; }
@@ -3028,7 +3026,7 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
3028
3026
  --_step: calc(var(--tap-base) * 2 / 3); /* 32 the round of one step */
3029
3027
  --_pad: calc((var(--header-h) - var(--_step)) / 2); /* 14 round + its room = the top bar's height; the end rounds sit concentric in the pill */
3030
3028
  /* the track lays down the accent fill of where it stands (the brand on a light card, the card's ink on the brand card), so it is a
3031
- surface of that fill's side; its steps re-point the accent to its ink, as the brand card slot does (README rule 10) */
3029
+ surface of that fill's side; its steps re-point the accent to its ink, as the brand card slot does (docs/reference.md rule 10) */
3032
3030
  --dark: var(--accent-dark);
3033
3031
  list-style: none;
3034
3032
  margin: 0;
@@ -5594,10 +5592,9 @@ button:enabled { cursor: pointer; } /* a disabled one keeps the arrow */
5594
5592
  so a finish sits in any palette; the one plain white is the sticker's backing paper and the lit edge's light.
5595
5593
  ============================================================ */
5596
5594
 
5597
- /* every finish: the finish IS the controls' edge, so the wireframe's control border steps back (as [data-palette] in palette.css). The card
5598
- keeps its --card-border: lit's ring and sticker's white cut do not reach 3:1 on a light ground (palette.css, THE CARD KEEPS AN EDGE);
5599
- print and ink draw their own line below */
5600
- [data-finish] { --action-border: transparent; }
5595
+ /* every finish: the finish IS the edge, so the wireframe's two borders step back (as [data-palette] in palette.css, A CARD HAS NO EDGE);
5596
+ ink puts its own line there below */
5597
+ [data-finish] { --card-border: transparent; --action-border: transparent; }
5601
5598
 
5602
5599
  /* ============================================================
5603
5600
  lit — the light comes from above:
@@ -74,7 +74,7 @@ export function cardGrounds(root = document.body) {
74
74
  const edge = Math.max(1, ...edges.map((c) => ratio(paint([...under, c]), ground)));
75
75
  const f = ratio(fill, ground), pass = f >= 3 || edge >= 3;
76
76
  const where = g.ground === 'screen' ? 'on the screen' : `in a ${g.ground}'s body`;
77
- const problem = pass ? '' : `tone ${tone} card ${where}: fill ${f}:1 (--card-${tone}-bg ${hex(fill)} on ${g.token} ${hex(ground)}), edge ${edge}:1 (--card-border); one of them needs 3:1 — the fill is short by ${Math.round((3 - f) * 100) / 100}, or give --card-border a colour of 3:1 on ${hex(ground)}`;
77
+ const problem = pass ? '' : `tone ${tone} card ${where}: fill ${f}:1 (--card-${tone}-bg ${hex(fill)} on ${g.token} ${hex(ground)}); the fill needs 3:1 and is short by ${Math.round((3 - f) * 100) / 100} — move --card-${tone}-bg or ${g.token}, never an edge`;
78
78
  return { ground: g.ground, tone, fill: f, edge, pass, problem };
79
79
  }));
80
80
  }
@@ -24,7 +24,7 @@ export type InkGround = {
24
24
  * every glyph drawn as a fill (a dot, a day's dot, the pager's dots, a check's tick, a switch's knob, a strong calendar mark's ring) inside
25
25
  * `root`, finds the ground it is really drawn on (each ancestor's fill, from the page down, through every opacity on the way, to the first
26
26
  * opaque one and past it) and returns one row per piece: words 4.5:1, large words, icons and glyphs 3:1. Each row names the side its ground
27
- * declares and the ink set its colour is (README "Ink follows its ground": light ground → onlight, dark ground → ondark). What the browser
27
+ * declares and the ink set its colour is (docs/reference.md "Ink follows its ground": light ground → onlight, dark ground → ondark). What the browser
28
28
  * draws is what is measured, so the project's theme.css, palette and finish are in it. Not measured: a piece on a picture (a `url()` ground
29
29
  * is not one colour; a gradient is read as decoration unless it is one colour, a fill laid as an image), a disabled control (WCAG exempts
30
30
  * it), a hidden one, words drawn by CSS `content`. Run it where the theme is loaded:
@@ -3,7 +3,7 @@
3
3
  * every glyph drawn as a fill (a dot, a day's dot, the pager's dots, a check's tick, a switch's knob, a strong calendar mark's ring) inside
4
4
  * `root`, finds the ground it is really drawn on (each ancestor's fill, from the page down, through every opacity on the way, to the first
5
5
  * opaque one and past it) and returns one row per piece: words 4.5:1, large words, icons and glyphs 3:1. Each row names the side its ground
6
- * declares and the ink set its colour is (README "Ink follows its ground": light ground → onlight, dark ground → ondark). What the browser
6
+ * declares and the ink set its colour is (docs/reference.md "Ink follows its ground": light ground → onlight, dark ground → ondark). What the browser
7
7
  * draws is what is measured, so the project's theme.css, palette and finish are in it. Not measured: a piece on a picture (a `url()` ground
8
8
  * is not one colour; a gradient is read as decoration unless it is one colour, a fill laid as an image), a disabled control (WCAG exempts
9
9
  * it), a hidden one, words drawn by CSS `content`. Run it where the theme is loaded: