@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/CHANGELOG.md +18 -1
- package/LICENSE +21 -0
- package/README.md +3 -1131
- package/bin/cardds.mjs +1 -1
- package/css/actions.css +2 -2
- package/css/finish.css +3 -4
- package/css/numbers.css +1 -1
- package/css/palette.css +7 -9
- package/css/stack.css +1 -1
- package/css/theme.template.css +2 -2
- package/css/tokens.css +3 -3
- package/dist/actions/Chip.d.ts +1 -1
- package/dist/actions/Dropdown.d.ts +1 -1
- package/dist/cardds.css +17 -20
- package/dist/cards/cardGrounds.js +1 -1
- package/dist/cards/inkGrounds.d.ts +1 -1
- package/dist/cards/inkGrounds.js +1 -1
- package/dist/catalog.json +1 -1
- package/docs/reference.md +1135 -0
- package/lib/guide.mjs +1 -1
- package/package.json +2 -1
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
|
|
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 (
|
|
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 (
|
|
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
|
|
24
|
-
|
|
25
|
-
|
|
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 (
|
|
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;
|
|
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
|
|
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
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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.
|
|
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
|
============================================================ */
|
package/css/theme.template.css
CHANGED
|
@@ -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 (
|
|
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
|
|
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.
|
|
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
|
|
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;
|
|
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) {
|
package/dist/actions/Chip.d.ts
CHANGED
|
@@ -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 (
|
|
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 (
|
|
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.
|
|
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
|
|
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;
|
|
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;
|
|
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
|
|
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
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
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.
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
5598
|
-
|
|
5599
|
-
|
|
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)})
|
|
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 (
|
|
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:
|
package/dist/cards/inkGrounds.js
CHANGED
|
@@ -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 (
|
|
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:
|