@usableapp/cardds 0.7.94 → 0.7.96
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 +76 -0
- package/README.md +110 -11
- package/bin/cardds.mjs +1 -1
- package/css/actions.css +9 -12
- package/css/base.css +3 -6
- package/css/card.css +11 -17
- package/css/choice.css +14 -11
- package/css/finish.css +4 -2
- package/css/journey.css +7 -4
- package/css/layover.css +16 -11
- package/css/lists.css +4 -9
- package/css/media.css +20 -16
- package/css/numbers.css +16 -18
- package/css/palette.css +79 -97
- package/css/people.css +5 -4
- package/css/post.css +2 -1
- package/css/sheet.css +13 -10
- package/css/sticky.css +6 -5
- package/css/theme.template.css +16 -7
- package/css/tokens.css +69 -35
- package/dist/actions/Chip.d.ts +1 -1
- package/dist/actions/Chip.js +1 -1
- package/dist/actions/Dropdown.d.ts +1 -1
- package/dist/actions/Dropdown.js +1 -1
- package/dist/cardds.css +280 -260
- package/dist/cards/cardGrounds.d.ts +22 -0
- package/dist/cards/cardGrounds.js +84 -0
- package/dist/cards/inkGrounds.d.ts +34 -0
- package/dist/cards/inkGrounds.js +181 -0
- package/dist/catalog.json +1 -1
- package/dist/choice/Calendar.d.ts +1 -1
- package/dist/choice/Calendar.js +1 -1
- package/dist/choice/Check.d.ts +2 -2
- package/dist/choice/Check.js +2 -2
- package/dist/choice/DayStrip.d.ts +1 -1
- package/dist/choice/DayStrip.js +1 -1
- package/dist/choice/Mood.d.ts +1 -1
- package/dist/choice/Mood.js +1 -1
- package/dist/choice/Slider.d.ts +1 -1
- package/dist/choice/Slider.js +1 -1
- package/dist/forms/AddRow.d.ts +1 -1
- package/dist/forms/AddRow.js +1 -1
- package/dist/forms/Composer.d.ts +1 -1
- package/dist/forms/Composer.js +1 -1
- package/dist/forms/Field.d.ts +4 -2
- package/dist/forms/Field.js +4 -2
- package/dist/forms/FileBtn.d.ts +1 -1
- package/dist/forms/FileBtn.js +1 -1
- package/dist/forms/Pin.d.ts +1 -1
- package/dist/forms/Pin.js +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/media/MapPick.d.ts +1 -1
- package/dist/media/MapPick.js +1 -1
- package/dist/media/Tile.d.ts +1 -1
- package/dist/media/Tile.js +1 -1
- package/dist/numbers/Picker.d.ts +1 -1
- package/dist/numbers/Picker.js +1 -1
- package/dist/people/AvatarPick.d.ts +2 -2
- package/dist/people/AvatarPick.js +1 -1
- package/lib/guide.mjs +1 -1
- package/lint/rules.mjs +37 -0
- package/package.json +1 -1
package/css/layover.css
CHANGED
|
@@ -69,19 +69,21 @@
|
|
|
69
69
|
gap: var(--modal-drawer-gap, var(--sp-1));
|
|
70
70
|
text-align: center;
|
|
71
71
|
background: var(--modal-drawer-bg, var(--card-3-bg));
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
--
|
|
72
|
+
--dark: var(--card-3-dark);
|
|
73
|
+
color: var(--modal-drawer-ink, var(--card-ink));
|
|
74
|
+
--accent: var(--card-ink); /* the one solid button inverts on the brand drawer */
|
|
75
|
+
--accent-dark: calc(1 - var(--dark));
|
|
75
76
|
}
|
|
76
77
|
.modal__drawer--light { /* light: the card's paper, dark words (Lh 2026-09-29) — the one solid button turns dark */
|
|
77
78
|
background: var(--modal-drawer-light-bg, var(--card-bg));
|
|
79
|
+
--dark: inherit; /* the card's own side */
|
|
78
80
|
color: var(--modal-drawer-light-ink, var(--card-ink));
|
|
79
81
|
--accent: var(--card-ink);
|
|
80
|
-
--
|
|
82
|
+
--accent-dark: calc(1 - var(--dark));
|
|
81
83
|
}
|
|
82
84
|
/* the CONFIRM: a Modal with no ModalBody: the ModalAsk IS the card, as tall as its words (no fixed band, no second beat) */
|
|
83
85
|
.modal:not(:has(> .modal__lift)) > .modal__drawer { height: auto; padding-block: var(--modal-confirm-pad-y, var(--sp-6)); animation: none; }
|
|
84
|
-
.modal__drawer .t-caption {
|
|
86
|
+
.modal__drawer .t-caption { color: var(--modal-drawer-caption-ink, var(--card-muted)); }
|
|
85
87
|
.modal__drawer > h2:focus { outline: none; } /* the question takes the cursor when the modal arrives (for a screen reader, the keyboard's way in) — it is not a control: no ring */
|
|
86
88
|
/* the answers as WORD buttons (a BtnRow of Btns; Lh 2026-10-11): the row fills the ask with room over it and each button keeps its words on one
|
|
87
89
|
line — left to its words' width the row squeezed two buttons into round blobs, their words on two lines. A quiet button is an outline only,
|
|
@@ -190,6 +192,7 @@
|
|
|
190
192
|
background: var(--banner-bg, var(--ink-tint));
|
|
191
193
|
color: var(--banner-ink, inherit);
|
|
192
194
|
border-block: var(--border-w) solid var(--banner-border, var(--hairline));
|
|
195
|
+
--card-muted: var(--card-ink); /* a tint of the ink is a ground where no lighter shade holds 4.5:1: its secondary words are the full ink */
|
|
193
196
|
/* a band edge to edge of what holds it — the card's or the screen's inset; no radius, no side border: a band, not a card */
|
|
194
197
|
margin-inline: calc(-1 * var(--card-pad, var(--screen-pad)));
|
|
195
198
|
padding-inline: var(--card-pad, var(--screen-pad));
|
|
@@ -243,7 +246,8 @@
|
|
|
243
246
|
border-radius: var(--float-bar-pill-radius, var(--r-chip));
|
|
244
247
|
border: var(--border-w) solid var(--float-bar-pill-border, var(--action-border));
|
|
245
248
|
background: var(--float-bar-pill-bg, color-mix(in srgb, var(--action-bg) 82%, transparent));
|
|
246
|
-
|
|
249
|
+
--dark: var(--action-dark); /* the pill is the items' ground: the paper's side */
|
|
250
|
+
color: var(--float-bar-pill-ink, var(--card-ink));
|
|
247
251
|
backdrop-filter: blur(var(--sp-3));
|
|
248
252
|
-webkit-backdrop-filter: blur(var(--sp-3));
|
|
249
253
|
box-shadow: var(--float-bar-pill-shadow, var(--shadow-float));
|
|
@@ -259,14 +263,14 @@
|
|
|
259
263
|
border-radius: var(--float-bar-item-radius, var(--r-chip));
|
|
260
264
|
font: var(--float-bar-item-font, var(--type-caption));
|
|
261
265
|
text-decoration: none;
|
|
262
|
-
|
|
266
|
+
color: var(--float-bar-item-rest-ink, var(--card-muted));
|
|
263
267
|
overflow: hidden;
|
|
264
268
|
white-space: nowrap;
|
|
265
269
|
text-overflow: ellipsis;
|
|
266
270
|
}
|
|
267
271
|
/* aria-current="false" is the correct way to mark the OTHER tabs, so the
|
|
268
272
|
bare attribute selector lights every one of them up */
|
|
269
|
-
.float-bar__item[aria-current]:not([aria-current="false"]) { background: var(--accent); color: var(--on-accent);
|
|
273
|
+
.float-bar__item[aria-current]:not([aria-current="false"]) { background: var(--accent); color: var(--on-accent); }
|
|
270
274
|
.float-bar > .icon-btn { width: var(--bar-h); height: var(--bar-h); box-shadow: var(--shadow-float); }
|
|
271
275
|
|
|
272
276
|
/* ---- callout: a small card with a tail — over a map, a media, a mascot ----
|
|
@@ -303,7 +307,7 @@
|
|
|
303
307
|
border-left: 0;
|
|
304
308
|
}
|
|
305
309
|
.callout__title { font: var(--callout-title-font, var(--type-title)); }
|
|
306
|
-
.callout__sub { font: var(--callout-sub-font, var(--type-caption));
|
|
310
|
+
.callout__sub { font: var(--callout-sub-font, var(--type-caption)); color: var(--callout-sub-ink, var(--action-muted)); }
|
|
307
311
|
/* ---- splash: the app's mark at the human centre while it boots (Lh 2026-09-24) ----
|
|
308
312
|
<section class="screen screen--fill splash"><div class="splash__group"><div class="splash__mark">{the app's lottie/img}</div>
|
|
309
313
|
<p class="splash__text">…</p></div></section>
|
|
@@ -346,7 +350,8 @@
|
|
|
346
350
|
border: var(--border-w) solid var(--snackbar-border, transparent);
|
|
347
351
|
border-radius: var(--snackbar-radius, var(--r-card));
|
|
348
352
|
background: var(--snackbar-bg, var(--signal-ok-soft));
|
|
349
|
-
|
|
353
|
+
--dark: var(--surface-dark); /* the signal's soft ground is a tint of the screen: the screen's side */
|
|
354
|
+
color: var(--snackbar-ink, var(--card-ink));
|
|
350
355
|
box-shadow: var(--snackbar-shadow, var(--shadow-float));
|
|
351
356
|
font: inherit; text-align: start;
|
|
352
357
|
pointer-events: auto;
|
|
@@ -354,5 +359,5 @@
|
|
|
354
359
|
.snackbar__body > .icon { flex: none; color: var(--snackbar-icon-ink, var(--signal-ok)); }
|
|
355
360
|
.snackbar__words { display: grid; min-width: 0; overflow-wrap: anywhere; }
|
|
356
361
|
.snackbar__text { font: var(--snackbar-text-font, var(--type-body)); }
|
|
357
|
-
.snackbar__caption { font: var(--snackbar-caption-font, var(--type-caption));
|
|
362
|
+
.snackbar__caption { font: var(--snackbar-caption-font, var(--type-caption)); color: var(--snackbar-caption-ink, inherit); } /* on the signal's soft ground the full ink: a muted shade there fell under AA */
|
|
358
363
|
@media (prefers-reduced-motion: reduce) { .snackbar { transition: none; } }
|
package/css/lists.css
CHANGED
|
@@ -32,7 +32,6 @@
|
|
|
32
32
|
.row__body { flex: 1; min-width: 0; display: grid; gap: var(--row-body-gap, var(--sp-0)); }
|
|
33
33
|
.row__title { font: var(--row-title-font, var(--type-title)); overflow-wrap: anywhere; } /* wraps freely — no clip, so no padding trick for Thai marks (Lh 2026-09-16, same call as the card heading) */
|
|
34
34
|
.row__meta { font: var(--row-meta-font, var(--type-caption)); color: var(--row-meta-ink, var(--card-muted)); display: flex; align-items: center; gap: var(--row-meta-gap, var(--sp-1)); }
|
|
35
|
-
.card--3 .row__meta { color: var(--card-3-muted); }
|
|
36
35
|
.row__end { margin-left: auto; text-align: right; display: grid; gap: var(--row-end-gap, var(--sp-0)); justify-items: end; flex: none; }
|
|
37
36
|
.row--lg { min-height: var(--row-lg-min-h, var(--fab)); } /* menu rows: a taller target, round arrow at the end; .rows gives them more air */
|
|
38
37
|
.row--lg .row__title { font: 700 var(--fs-lg)/1.2 var(--font-display); }
|
|
@@ -51,7 +50,6 @@
|
|
|
51
50
|
at --tap-sm, but not an input: nothing to press. */
|
|
52
51
|
.row--done { pointer-events: none; cursor: default; }
|
|
53
52
|
.row--done .row__title { color: var(--card-muted); }
|
|
54
|
-
.card--3 .row--done .row__title { color: var(--card-3-muted); }
|
|
55
53
|
.row__done {
|
|
56
54
|
width: var(--row-done-size, var(--tap-sm));
|
|
57
55
|
height: var(--row-done-size, var(--tap-sm));
|
|
@@ -96,7 +94,6 @@
|
|
|
96
94
|
.kv-cell > .icon { margin-bottom: var(--sp-1); }
|
|
97
95
|
.kv-cell__val { font: var(--kv-cell-val-font, var(--type-h2)); letter-spacing: var(--track-h2); font-variant-numeric: tabular-nums; }
|
|
98
96
|
.kv-cell__key { font: var(--kv-cell-key-font, var(--type-caption)); color: var(--kv-cell-key-ink, var(--card-muted)); }
|
|
99
|
-
.card--3 .kv-cell__key { color: var(--card-3-muted); }
|
|
100
97
|
|
|
101
98
|
/* ---- bubble: a chat message — theirs on the left, mine on the right (Lh 2026-09-18, replaces the chip's tail) ----
|
|
102
99
|
No tail: a rounded block whose corner nearest the sender is square-ish
|
|
@@ -125,7 +122,8 @@
|
|
|
125
122
|
border-radius: var(--bubble-body-radius, var(--r-card));
|
|
126
123
|
border-bottom-left-radius: var(--r-control);
|
|
127
124
|
background: var(--bubble-body-bg, var(--card-2-bg));
|
|
128
|
-
|
|
125
|
+
--dark: var(--card-2-dark);
|
|
126
|
+
color: var(--bubble-body-ink, var(--card-ink));
|
|
129
127
|
font: var(--bubble-body-font, var(--type-body));
|
|
130
128
|
overflow-wrap: anywhere;
|
|
131
129
|
}
|
|
@@ -136,10 +134,9 @@
|
|
|
136
134
|
color: var(--on-accent);
|
|
137
135
|
text-align: right;
|
|
138
136
|
}
|
|
139
|
-
.bubble__meta { display: flex; align-items: center; gap: var(--bubble-meta-gap, var(--sp-1)); font: var(--bubble-meta-font, var(--type-caption)); color: var(--bubble-meta-ink, var(--
|
|
137
|
+
.bubble__meta { display: flex; align-items: center; gap: var(--bubble-meta-gap, var(--sp-1)); font: var(--bubble-meta-font, var(--type-caption)); color: var(--bubble-meta-ink, var(--card-muted)); }
|
|
140
138
|
.bubble--right > .bubble__meta { justify-self: end; }
|
|
141
|
-
.bubble__meta > .icon { color: var(--accent); }
|
|
142
|
-
.card--3 .bubble__meta { color: var(--card-3-muted); }
|
|
139
|
+
.bubble__meta > .icon { color: var(--bubble-meta-icon-ink, var(--accent-ink)); }
|
|
143
140
|
|
|
144
141
|
/* ---- timeline: a hairline with date chips, entries to the right ----
|
|
145
142
|
<ol class="timeline"><li class="timeline__item"><span class="timeline__mark">Wed 14</span><p class="t-body">…</p></li>…</ol> */
|
|
@@ -182,7 +179,6 @@
|
|
|
182
179
|
/* ---- legend: signal dots with captions ----
|
|
183
180
|
<div class="legend"><span class="legend__item"><span class="dot"></span> very high</span>…</div> */
|
|
184
181
|
.legend { display: flex; flex-wrap: wrap; gap: var(--sp-2) var(--sp-4); font: var(--legend-font, var(--type-caption)); color: var(--legend-ink, var(--card-muted)); }
|
|
185
|
-
.card--3 .legend { color: inherit; opacity: 0.8; }
|
|
186
182
|
.legend__item { display: inline-flex; align-items: center; gap: var(--legend-item-gap, var(--sp-2)); min-height: var(--legend-item-min-h, var(--icon)); }
|
|
187
183
|
|
|
188
184
|
/* ---- link: "See all ↗" in a card head, big enough to tap ----
|
|
@@ -203,7 +199,6 @@
|
|
|
203
199
|
.link--muted { color: var(--link-muted-ink, var(--card-muted)); }
|
|
204
200
|
.link:disabled { color: var(--link-disabled-ink, var(--card-muted)); cursor: default; } /* inactive = muted (a Countdown) */
|
|
205
201
|
.link--wait { font-variant-numeric: tabular-nums; } /* the countdown's digits keep their width: the words do not jiggle each second */
|
|
206
|
-
.card--3 .link--muted { color: var(--card-3-muted); }
|
|
207
202
|
|
|
208
203
|
/* ---- bullets: a list, each item led by a small square picture as tall as a line of its words (Lh 2026-09-28, timebank #153) ----
|
|
209
204
|
<ul class="bullets"><li class="bullets__item"><img class="bullets__pic" alt=""><span class="bullets__text">…</span></li></ul>
|
package/css/media.css
CHANGED
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
<div class="row">…meta…</div></article> */
|
|
11
11
|
.card--cover {
|
|
12
12
|
--card-bg: var(--card-3-bg);
|
|
13
|
-
--
|
|
14
|
-
--accent: var(--card-
|
|
15
|
-
--
|
|
13
|
+
--dark: var(--card-3-dark);
|
|
14
|
+
--accent: var(--card-ink);
|
|
15
|
+
--accent-dark: calc(1 - var(--dark));
|
|
16
16
|
min-height: var(--_cover-min-h);
|
|
17
17
|
align-content: space-between;
|
|
18
18
|
overflow: hidden;
|
|
@@ -38,8 +38,6 @@
|
|
|
38
38
|
z-index: -1;
|
|
39
39
|
background: linear-gradient(to bottom, var(--scrim), transparent 40% 60%, var(--scrim));
|
|
40
40
|
}
|
|
41
|
-
.card--cover .t-muted { color: inherit; opacity: 0.75; }
|
|
42
|
-
.card--cover .row__meta { color: inherit; opacity: 0.85; }
|
|
43
41
|
|
|
44
42
|
/* ---- quote: giant mark, big text, attribution ----
|
|
45
43
|
<blockquote class="quote"><p class="quote__text">It's overcast…</p><footer class="quote__by">Wednesday 15</footer></blockquote> */
|
|
@@ -74,35 +72,40 @@
|
|
|
74
72
|
border: var(--border-w) solid var(--tile-border, var(--outline));
|
|
75
73
|
border-radius: var(--tile-radius, var(--r-card));
|
|
76
74
|
background: var(--tile-bg, var(--action-bg));
|
|
77
|
-
|
|
75
|
+
--dark: var(--action-dark); /* a tile is a surface: the paper's side (a toned tile takes its tone's, below) */
|
|
76
|
+
color: var(--tile-ink, var(--card-ink));
|
|
78
77
|
font: inherit;
|
|
79
78
|
text-align: left;
|
|
80
79
|
position: relative;
|
|
81
80
|
}
|
|
82
81
|
.tile__label { font: var(--tile-label-font, var(--type-title)); }
|
|
83
82
|
.tile__value { font: var(--tile-value-font, var(--type-h2)); letter-spacing: var(--track-h2); font-variant-numeric: tabular-nums; }
|
|
84
|
-
.tile__sub { font: var(--tile-sub-font, var(--type-caption));
|
|
83
|
+
.tile__sub { font: var(--tile-sub-font, var(--type-caption)); color: var(--tile-sub-ink, var(--card-muted)); } /* the muted words of the tile's ground; --dim faded the full ink to 2.4–3.4:1 */
|
|
85
84
|
.tile__text { display: grid; gap: var(--tile-text-gap, var(--sp-0)); }
|
|
86
|
-
.tile--on { background: var(--tile-on-bg, var(--accent)); color: var(--tile-on-ink, var(--
|
|
85
|
+
.tile--on { background: var(--tile-on-bg, var(--accent)); --dark: var(--accent-dark); color: var(--tile-on-ink, var(--card-ink)); border-color: transparent; }
|
|
87
86
|
/* .tile--pick's hidden input and :has(:checked) fill are declared once in choice.css, alongside .chip--pick and .mood__opt */
|
|
88
87
|
.tile--wide { grid-column: 1 / -1; }
|
|
89
88
|
/* stat: READ, not pressed — no frame of its own inside a card (a frame says "tap me"): icon · value · words on the card's ground */
|
|
90
|
-
|
|
89
|
+
/* a stat tile has no fill of its own, so it has no ink of its own: it takes the ink of what it stands on (currentColor on `color`
|
|
90
|
+
= the inherited colour), as the card's heading does. It kept the plain tile's --action-ink, dark on a dark card (timebank, tone 3,
|
|
91
|
+
Lh 2026-10-18). --tile-ink still overrides; a toned stat tile (.tile--N, below) takes its fill and its ink back */
|
|
92
|
+
.tile--stat { --dark: inherit; color: var(--tile-ink, currentColor); border-color: transparent; background: none; padding-inline: 0; min-height: var(--tile-stat-min-h, var(--avatar-xl)); gap: var(--tile-stat-gap, var(--sp-3)); grid-template-columns: auto 1fr; align-items: center; }
|
|
91
93
|
/* upload: dashed, centred plus + label */
|
|
92
94
|
.tile--upload {
|
|
93
95
|
border-style: dashed;
|
|
94
96
|
background: transparent;
|
|
95
97
|
color: inherit;
|
|
98
|
+
--dark: inherit;
|
|
96
99
|
align-content: center;
|
|
97
100
|
justify-items: center;
|
|
98
101
|
gap: var(--tile-upload-gap, var(--sp-2));
|
|
99
102
|
text-align: center;
|
|
100
103
|
}
|
|
101
104
|
/* tinted tiles: slot colors inside a card (schedule, notes) */
|
|
102
|
-
.tile--2 { background: var(--tile-2-bg, var(--card-2-bg)); color: var(--tile-2-ink, var(--card-
|
|
103
|
-
.tile--4 { background: var(--tile-4-bg, var(--card-4-bg)); color: var(--tile-4-ink, var(--card-
|
|
104
|
-
.tile--5 { background: var(--tile-5-bg, var(--card-5-bg)); color: var(--tile-5-ink, var(--card-
|
|
105
|
-
.tile--3 { background: var(--tile-3-bg, var(--card-3-bg)); color: var(--tile-3-ink, var(--card-
|
|
105
|
+
.tile--2 { background: var(--tile-2-bg, var(--card-2-bg)); --dark: var(--card-2-dark); color: var(--tile-2-ink, var(--card-ink)); border-color: transparent; }
|
|
106
|
+
.tile--4 { background: var(--tile-4-bg, var(--card-4-bg)); --dark: var(--card-4-dark); color: var(--tile-4-ink, var(--card-ink)); border-color: transparent; }
|
|
107
|
+
.tile--5 { background: var(--tile-5-bg, var(--card-5-bg)); --dark: var(--card-5-dark); color: var(--tile-5-ink, var(--card-ink)); border-color: transparent; }
|
|
108
|
+
.tile--3 { background: var(--tile-3-bg, var(--card-3-bg)); --dark: var(--card-3-dark); color: var(--tile-3-ink, var(--card-ink)); border-color: transparent; }
|
|
106
109
|
|
|
107
110
|
/* ---- fold: a sticky-note corner on any card (decorative) ----
|
|
108
111
|
No border. The card's outline follows its border box, so it ran straight
|
|
@@ -225,7 +228,7 @@
|
|
|
225
228
|
}
|
|
226
229
|
.postcard__turn:focus-visible { outline-offset: calc(-1 * var(--sp-1)); } /* the ring inside the card's edge */
|
|
227
230
|
/* the front: the photo (or the wireframe box) fills it; the band reads on a scrim */
|
|
228
|
-
.postcard__front { background: var(--postcard-front-bg, var(--card-3-bg)); color: var(--postcard-front-ink, var(--card-
|
|
231
|
+
.postcard__front { background: var(--postcard-front-bg, var(--card-3-bg)); --dark: var(--card-3-dark); color: var(--postcard-front-ink, var(--card-ink)); }
|
|
229
232
|
.postcard__front .postcard__turn > img,
|
|
230
233
|
.postcard__front .postcard__turn > .ph {
|
|
231
234
|
position: absolute;
|
|
@@ -248,7 +251,8 @@
|
|
|
248
251
|
/* the back: paper — the caption and the name packed at the middle, big enough to read at arm's length */
|
|
249
252
|
.postcard__back {
|
|
250
253
|
background: var(--postcard-back-bg, var(--card-2-bg));
|
|
251
|
-
|
|
254
|
+
--dark: var(--card-2-dark);
|
|
255
|
+
color: var(--postcard-back-ink, var(--card-ink));
|
|
252
256
|
transform: rotateY(180deg);
|
|
253
257
|
}
|
|
254
258
|
.postcard__back .postcard__turn { align-content: start; padding-top: var(--postcard-back-top, 20%); gap: var(--postcard-back-gap, var(--sp-5)); } /* the name a fifth down the paper, the words after it */
|
|
@@ -266,7 +270,7 @@
|
|
|
266
270
|
}
|
|
267
271
|
.postcard__band > * { pointer-events: auto; }
|
|
268
272
|
.postcard__words { display: grid; gap: var(--postcard-words-gap, var(--sp-1)); flex: 1; min-width: 0; pointer-events: none; }
|
|
269
|
-
.postcard__front .postcard__band { --accent: var(--postcard-front-ink, var(--card-
|
|
273
|
+
.postcard__front .postcard__band { --accent: var(--postcard-front-ink, var(--card-ink)); --accent-dark: calc(1 - var(--dark)); }
|
|
270
274
|
.postcard__band .icon-btn[aria-pressed="true"] .icon { fill: currentColor; }
|
|
271
275
|
.postcard.is-flipped > .postcard__front { transform: rotateY(-180deg); }
|
|
272
276
|
.postcard.is-flipped > .postcard__back { transform: rotateY(0); }
|
package/css/numbers.css
CHANGED
|
@@ -45,25 +45,21 @@
|
|
|
45
45
|
.track {
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
re-points the accent to its own ink (README rule 10). Without this, any
|
|
52
|
-
palette where --accent equals --card-3-bg — field, hydro, and the
|
|
53
|
-
wireframe default — paints done steps invisibly on the track. */
|
|
54
|
-
--accent: var(--_ink);
|
|
55
|
-
--on-accent: var(--_bg);
|
|
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) */
|
|
50
|
+
--dark: var(--accent-dark);
|
|
56
51
|
list-style: none;
|
|
57
52
|
margin: 0;
|
|
58
53
|
padding: var(--track-pad, var(--_pad));
|
|
59
54
|
display: flex;
|
|
60
55
|
align-items: center;
|
|
61
56
|
border-radius: var(--track-radius, var(--r-chip));
|
|
62
|
-
background: var(--
|
|
63
|
-
color: var(--
|
|
57
|
+
background: var(--accent);
|
|
58
|
+
color: var(--card-ink);
|
|
64
59
|
}
|
|
65
|
-
.card--3 .track { --_bg: var(--card-3-ink); --_ink: var(--card-3-bg); }
|
|
66
60
|
.track__step {
|
|
61
|
+
--accent: var(--card-ink);
|
|
62
|
+
--accent-dark: calc(1 - var(--dark));
|
|
67
63
|
flex: 1;
|
|
68
64
|
display: flex;
|
|
69
65
|
align-items: center;
|
|
@@ -75,7 +71,7 @@
|
|
|
75
71
|
content: "";
|
|
76
72
|
flex: 1;
|
|
77
73
|
height: var(--sp-2);
|
|
78
|
-
background: var(--ink-rail); /* the track's own ink at 30
|
|
74
|
+
background: var(--ink-rail); /* the track's own ink at 30%: --ink-rail reads currentColor */
|
|
79
75
|
}
|
|
80
76
|
.track__step:first-child::before { display: none; }
|
|
81
77
|
.track__step.is-done::before { background: var(--accent); }
|
|
@@ -87,8 +83,9 @@
|
|
|
87
83
|
padding: calc(var(--_step) * 7 / 32); /* the glyph = 18 in the 32 round */
|
|
88
84
|
border-radius: 50%;
|
|
89
85
|
background: var(--ink-rail);
|
|
90
|
-
color: var(--
|
|
86
|
+
color: var(--card-ink);
|
|
91
87
|
}
|
|
88
|
+
.track__step > .track__dot { background: var(--ink-tint); } /* a number is words: on the 30% rail it fell under 4.5:1 on a mid-dark track; the 12% tint is what every tone holds its ink on */
|
|
92
89
|
.track__step > .track__dot { /* a number in the round (TrackStep num) */
|
|
93
90
|
display: grid; place-items: center; box-sizing: border-box;
|
|
94
91
|
font: var(--track-dot-font, var(--type-caption)); line-height: 1; font-variant-numeric: tabular-nums;
|
|
@@ -185,10 +182,11 @@
|
|
|
185
182
|
font: var(--picker-item-font, var(--type-stat));
|
|
186
183
|
letter-spacing: var(--track-display);
|
|
187
184
|
font-variant-numeric: tabular-nums;
|
|
188
|
-
|
|
185
|
+
--_rest: var(--picker-rest-ink, var(--card-muted)); /* the values either side: the ground's muted words (they faded to 0.3, 1.8:1) */
|
|
186
|
+
color: var(--_rest);
|
|
189
187
|
text-align: center;
|
|
190
188
|
}
|
|
191
|
-
.picker__item[aria-selected="true"] {
|
|
189
|
+
.picker__item[aria-selected="true"] { color: var(--card-ink); }
|
|
192
190
|
/* centre rules either side of the selected value */
|
|
193
191
|
.picker::before,
|
|
194
192
|
.picker::after {
|
|
@@ -204,10 +202,10 @@
|
|
|
204
202
|
.picker__unit { font: var(--picker-unit-font, var(--type-caption)); color: var(--picker-unit-ink, var(--card-muted)); }
|
|
205
203
|
/* the scrolled-to item lights up by position — no JS */
|
|
206
204
|
@supports (animation-timeline: view(x)) {
|
|
207
|
-
.picker__item { animation: picker-focus linear both; animation-timeline: view(x); }
|
|
205
|
+
.picker__item { animation: picker-focus linear both; animation-timeline: view(x); }
|
|
208
206
|
@keyframes picker-focus {
|
|
209
|
-
0%, 100% {
|
|
210
|
-
45%, 55% {
|
|
207
|
+
0%, 100% { color: var(--_rest); }
|
|
208
|
+
45%, 55% { color: var(--card-ink); }
|
|
211
209
|
}
|
|
212
210
|
}
|
|
213
211
|
|
package/css/palette.css
CHANGED
|
@@ -3,156 +3,138 @@
|
|
|
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
|
|
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
|
+
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.
|
|
6
9
|
============================================================ */
|
|
7
10
|
|
|
8
11
|
/* ---- CLAY — earth-toned: cream surface, terracotta / mustard / ink cards ---- */
|
|
9
12
|
[data-palette="clay"] {
|
|
10
13
|
--surface: #ece5d8;
|
|
11
|
-
--
|
|
12
|
-
--
|
|
14
|
+
--ink-onlight: #191713; --ink-onlight-muted: #2a2723; /* the terracotta is a middle ground: no muted shade a step lighter holds 4.5:1 on it (4.6) */
|
|
15
|
+
--ink-ondark: #f4efe4; --ink-ondark-muted: #aeaaa1; /* 4.6:1 on tone 5's grey */
|
|
13
16
|
|
|
14
|
-
--card-1-bg: #e8b647;
|
|
15
|
-
--card-2-bg: #
|
|
16
|
-
--card-3-bg: #1c1a17;
|
|
17
|
+
--card-1-bg: #e8b647; /* mustard hero */
|
|
18
|
+
--card-2-bg: #eb6644; /* terracotta, a step lighter: the ink 5.5:1, 4.5 on its own tint (#e05c3a was 4.9 and 4.1) */
|
|
19
|
+
--card-3-bg: #1c1a17; /* ink */
|
|
17
20
|
|
|
18
|
-
--
|
|
19
|
-
--
|
|
20
|
-
--card-2-muted: var(--card-2-ink); /* terracotta holds 5:1 for its ink alone; nothing lighter passes AA, so tone 2 has no muted */
|
|
21
|
-
|
|
22
|
-
--accent: #1c1a17; --on-accent: #f4efe4;
|
|
23
|
-
--action-bg: #f7f3e9; --action-ink: #191713; --action-border: transparent;
|
|
21
|
+
--accent: #1c1a17;
|
|
22
|
+
--action-bg: #f7f3e9; --action-border: transparent;
|
|
24
23
|
|
|
25
24
|
--pos: #3e7d4f; --neg: #c23c1d;
|
|
26
|
-
--dot-a: #
|
|
25
|
+
--dot-a: #eb6644; --dot-b: #6f6be0;
|
|
26
|
+
/* the signals, deep enough for words on the terracotta (4.5:1) and so on every lighter ground; nearly the ink, the hue stays */
|
|
27
|
+
--signal-ok-onlight: #1b2c18; --signal-warn-onlight: #2f280d; --signal-error-onlight: #471a17; --signal-info-onlight: #1d2938;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
/* ---- ROAST — coffee: warm cream surface, caramel accent ---- */
|
|
30
31
|
[data-palette="roast"] {
|
|
31
32
|
--surface: #f6f1e7;
|
|
32
|
-
--
|
|
33
|
-
--
|
|
34
|
-
|
|
35
|
-
--card-1-bg: #ffffff; --card-1-ink: #2b211a;
|
|
36
|
-
--card-2-bg: #e9dcc6; --card-2-ink: #2b211a;
|
|
37
|
-
--card-3-bg: #b97e3c; --card-3-ink: #fdf9f1;
|
|
33
|
+
--ink-onlight: #2b211a; --ink-onlight-muted: #5e554d; /* 4.6:1 on the water note, the darkest light ground */
|
|
34
|
+
--ink-ondark: #fdf9f1; --ink-ondark-muted: #ecdfcb; /* 4.6:1 on the caramel */
|
|
38
35
|
|
|
39
|
-
--card-
|
|
40
|
-
--card-
|
|
36
|
+
--card-1-bg: #ffffff;
|
|
37
|
+
--card-2-bg: #e9dcc6;
|
|
38
|
+
--card-3-bg: #8c5402; /* caramel, on its own hue as far as the light ink holds 4.5:1 on it and on its tint (#b97e3c held it at 3.3) */
|
|
41
39
|
|
|
42
|
-
--accent: #
|
|
43
|
-
--action-bg: #ffffff; --action-
|
|
40
|
+
--accent: #8c5402;
|
|
41
|
+
--action-bg: #ffffff; --action-border: transparent;
|
|
44
42
|
|
|
45
43
|
--pos: #3e7d4f; --neg: #bf4028;
|
|
46
|
-
--dot-a: #
|
|
44
|
+
--dot-a: #8c5402; --dot-b: #2b211a;
|
|
47
45
|
}
|
|
48
46
|
|
|
49
47
|
/* ---- HYDRO — cool shiny blue: airy surface, saturated blue CTA ---- */
|
|
50
48
|
[data-palette="hydro"] {
|
|
51
49
|
--surface: #e9f0fb;
|
|
52
|
-
--
|
|
53
|
-
--
|
|
50
|
+
--ink-onlight: #17203a; --ink-onlight-muted: #4e566c; /* 4.6:1 on the water note, the darkest light ground */
|
|
51
|
+
--ink-ondark: #ffffff; --ink-ondark-muted: #e0e6f9; /* 4.6:1 on the blue */
|
|
54
52
|
|
|
55
|
-
--card-1-bg: #ffffff;
|
|
56
|
-
--card-2-bg: #cddcf7;
|
|
57
|
-
--card-3-bg: #
|
|
53
|
+
--card-1-bg: #ffffff;
|
|
54
|
+
--card-2-bg: #cddcf7;
|
|
55
|
+
--card-3-bg: #365bd7; /* white 5.7:1, 4.5 on its tint (#3d63e0 was 5.2 and 4.1) */
|
|
58
56
|
|
|
59
|
-
--
|
|
60
|
-
--
|
|
61
|
-
|
|
62
|
-
--accent: #3d63e0; --on-accent: #f2f6ff;
|
|
63
|
-
--action-bg: #ffffff; --action-ink: #17203a; --action-border: transparent;
|
|
57
|
+
--accent: #365bd7;
|
|
58
|
+
--action-bg: #ffffff; --action-border: transparent;
|
|
64
59
|
|
|
65
60
|
--pos: #2e8f52; --neg: #d13b1a;
|
|
66
|
-
--dot-a: #
|
|
61
|
+
--dot-a: #365bd7; --dot-b: #eec85a;
|
|
67
62
|
}
|
|
68
63
|
|
|
69
|
-
/* ---- ORCHARD — modern earth: calm, real, touchable (Lh 2026-09-25). Linen base, bone paper, moss brand
|
|
70
|
-
|
|
71
|
-
edges) come out as a darker tint of the ground under them — never a grey on a warm card. Four highlights for the
|
|
72
|
-
atmosphere, off the earth wheel on purpose: maple red · bright yellow · sky · fuchsia. ---- */
|
|
64
|
+
/* ---- ORCHARD — modern earth: calm, real, touchable (Lh 2026-09-25). Linen base, bone paper, moss brand. Four highlights for
|
|
65
|
+
the atmosphere, off the earth wheel on purpose: maple red · bright yellow · sky · fuchsia. ---- */
|
|
73
66
|
[data-palette="orchard"] {
|
|
74
67
|
--surface: #f4efe6; /* linen */
|
|
75
|
-
--
|
|
76
|
-
--
|
|
77
|
-
|
|
78
|
-
--card-1-bg: #fbf8f2; --card-1-ink: #2a241c; /* bone paper — sheets */
|
|
79
|
-
--card-2-bg: #e6d8bf; --card-2-ink: #33291c; /* sand */
|
|
80
|
-
--card-3-bg: #5c6b47; --card-3-ink: #f6f1e6; --card-3-muted: #d3d8c4; /* moss — the brand */
|
|
81
|
-
--card-4-bg: #d3d9c4; --card-4-ink: #2b3322; --card-4-muted: #515c42; /* sage mist */
|
|
82
|
-
--card-5-bg: #dcc2a6; --card-5-ink: #3a2a1c; --card-5-muted: #6b503a; /* clay */
|
|
68
|
+
--ink-onlight: #2a241c; --ink-onlight-muted: #565148; /* umber; muted 4.6:1 on the clay tone */
|
|
69
|
+
--ink-ondark: #f6f1e6; --ink-ondark-muted: #d7d6c6; /* linen; muted 4.6:1 on the moss */
|
|
83
70
|
|
|
84
|
-
--card-
|
|
85
|
-
--card-
|
|
86
|
-
--card-
|
|
71
|
+
--card-1-bg: #fbf8f2; /* bone paper — sheets */
|
|
72
|
+
--card-2-bg: #e6d8bf; /* sand */
|
|
73
|
+
--card-3-bg: #52613d; /* moss — the brand: its ink 5.9:1, 4.5 on its tint (#5c6b47 was 5.1 and 4.0) */
|
|
74
|
+
--card-4-bg: #d3d9c4; /* sage mist */
|
|
75
|
+
--card-5-bg: #dcc2a6; --card-5-dark: 0; /* clay: a light tone here */
|
|
87
76
|
|
|
88
|
-
--accent: #
|
|
89
|
-
--action-bg: #fbf8f2; --action-
|
|
77
|
+
--accent: #52613d;
|
|
78
|
+
--action-bg: #fbf8f2; --action-border: transparent;
|
|
90
79
|
|
|
91
80
|
/* highlights — decoration and atmosphere, a small dose: counts, marks, chart dots, a badge on a tile */
|
|
92
|
-
--highlight-1: #
|
|
81
|
+
--highlight-1: #d03114; /* maple red — the linen ink 4.5:1 on it (#d93a1f was 4.1) */
|
|
93
82
|
--highlight-2: #f5c518; /* bright yellow */
|
|
94
83
|
--highlight-3: #3a9fe0; /* sky */
|
|
95
|
-
--highlight-4: #
|
|
84
|
+
--highlight-4: #ca2e69; /* fuchsia — the linen ink 4.5:1 on it (#e0457b was 3.5) */
|
|
96
85
|
--dot-a: var(--highlight-1); --dot-b: var(--highlight-3);
|
|
97
86
|
|
|
98
87
|
/* signals from Sweet Salmon #dd9787 — words and edges, always with an icon */
|
|
99
|
-
--pos: #6f8f5a; --neg: #c4694f
|
|
100
|
-
--signal-error: #
|
|
101
|
-
--signal-warn: #
|
|
102
|
-
--signal-ok: #4f7f4a; /* leaf */
|
|
103
|
-
--signal-info: #4d6f96; /* slate */
|
|
88
|
+
--pos: #6f8f5a; --neg: #ad553b; /* a falling delta's linen words 4.5:1 (#c4694f was 3.4) */
|
|
89
|
+
--signal-error-onlight: #82402f; --signal-warn-onlight: #6b4e1b; --signal-ok-onlight: #3e5a37; --signal-info-onlight: #40556c; /* 4.5:1 on the clay tone */
|
|
90
|
+
--signal-error-ondark: #f9ccc0; --signal-warn-ondark: #f2d28b; --signal-ok-ondark: #cfe6b8; --signal-info-ondark: #c5d7ef; /* the same hues, 4.5:1 on the moss */
|
|
104
91
|
}
|
|
105
|
-
/*
|
|
106
|
-
|
|
107
|
-
[data-palette="orchard"] .badge:not(.badge--soft) { background: var(--badge-bg, var(--highlight-1)); color: var(--badge-ink,
|
|
108
|
-
[data-palette="orchard"] .tile-badge:not(.tile-badge--plain) { background: var(--tile-badge-bg, var(--highlight-2));
|
|
109
|
-
[data-palette="orchard"] .calendar__day--mark { background: var(--calendar-day-mark-bg, color-mix(in srgb, var(--highlight-2)
|
|
110
|
-
/* fields are WHITE boxes on every ground (Lh 2026-09-25)
|
|
111
|
-
[data-palette="orchard"] .field { background: var(--field-bg, #ffffff); color:
|
|
112
|
-
[data-palette="orchard"] .pin__cell { background: var(--pin-cell-bg, #ffffff); color:
|
|
92
|
+
/* where the highlights land — written as the component's own rule, its knob still first, so a project's knob wins (a palette never DECLARES a
|
|
93
|
+
knob). Each fill says its side; the words on it follow */
|
|
94
|
+
[data-palette="orchard"] .badge:not(.badge--soft) { background: var(--badge-bg, var(--highlight-1)); color: var(--badge-ink, var(--ink-ondark)); }
|
|
95
|
+
[data-palette="orchard"] .tile-badge:not(.tile-badge--plain) { background: var(--tile-badge-bg, var(--highlight-2)); --dark: 0; }
|
|
96
|
+
[data-palette="orchard"] .calendar__day--mark { background: var(--calendar-day-mark-bg, color-mix(in srgb, var(--highlight-2) 15%, transparent)); }
|
|
97
|
+
/* fields are WHITE boxes on every ground (Lh 2026-09-25): a light ground, so the words typed in them are onlight, even on the moss card */
|
|
98
|
+
[data-palette="orchard"] .field { background: var(--field-bg, #ffffff); color: var(--ink-onlight); }
|
|
99
|
+
[data-palette="orchard"] .pin__cell { background: var(--pin-cell-bg, #ffffff); color: var(--ink-onlight); }
|
|
113
100
|
/* the vivid ones, tried on the live parts (Lh 2026-09-25): primary = yellow · a user avatar = fuchsia · ring = sky · a switch on = sky · maple only on small dots (the count, dot a); the chosen stack tab stays moss */
|
|
114
|
-
[data-palette="orchard"] .btn--primary { background: var(--btn-primary-bg, var(--highlight-2)); color: var(--btn-primary-ink,
|
|
115
|
-
[data-palette="orchard"] .avatar:not(.avatar--outline, .avatar--add, .avatar--on) { background: var(--avatar-bg, var(--highlight-4));
|
|
101
|
+
[data-palette="orchard"] .btn--primary { background: var(--btn-primary-bg, var(--highlight-2)); color: var(--btn-primary-ink, var(--ink-onlight)); }
|
|
102
|
+
[data-palette="orchard"] .avatar:not(.avatar--outline, .avatar--add, .avatar--on) { background: var(--avatar-bg, var(--highlight-4)); --dark: 1; }
|
|
116
103
|
[data-palette="orchard"] .ring::before { background: conic-gradient(var(--highlight-3) calc(var(--value) * 1%), var(--ink-tint) 0); }
|
|
117
|
-
[data-palette="orchard"] .toggle:checked { background: var(--highlight-3); }
|
|
118
|
-
[data-palette="orchard"] .toggle:checked::after { background: #ffffff; }
|
|
119
|
-
[data-palette="orchard"] .card--3 { --signal-error: #f4b7a6; --signal-warn: #f1d18a; --signal-ok: #cfe6b8; --signal-info: #bcd0ec; }
|
|
104
|
+
[data-palette="orchard"] .toggle:checked { background: var(--highlight-3); --accent-dark: 0; } /* sky is a light ground: its knob is onlight */
|
|
120
105
|
|
|
121
106
|
/* ---- VERS — Lh's own-palette pick (2026-09-25): white surface, champagne paper, sage brand; earth tones for tones 2·4·5 ---- */
|
|
122
107
|
[data-palette="vers"] {
|
|
123
108
|
--surface: #ffffff;
|
|
124
|
-
--
|
|
125
|
-
--
|
|
126
|
-
|
|
127
|
-
--card-1-bg: #f6e7cb;
|
|
128
|
-
--card-2-bg: #e3cfa6;
|
|
129
|
-
--card-3-bg: #
|
|
130
|
-
--card-4-bg: #c9d6b0;
|
|
131
|
-
--card-5-bg: #d4bf9c; --card-5-
|
|
132
|
-
|
|
133
|
-
--
|
|
134
|
-
--
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
--
|
|
139
|
-
--action-bg: #f6e7cb; --action-ink: #1f1b16; --action-border: transparent;
|
|
140
|
-
|
|
141
|
-
/* signals from Sweet Salmon #dd9787, deepened to read on white/champagne */
|
|
142
|
-
--pos: #7fa86f; --neg: #dd9787;
|
|
143
|
-
--signal-error: #b5503b; /* salmon */
|
|
144
|
-
--signal-warn: #a5782a; /* ochre */
|
|
145
|
-
--signal-ok: #4f7f4a; /* leaf */
|
|
146
|
-
--signal-info: #4d6f96; /* slate */
|
|
109
|
+
--ink-onlight: #1f1b16; --ink-onlight-muted: #534f4c; /* 4.5:1 on the wheat */
|
|
110
|
+
--ink-ondark: #ffffff; --ink-ondark-muted: #dee5dc; /* 4.6:1 on the sage */
|
|
111
|
+
|
|
112
|
+
--card-1-bg: #f6e7cb; /* paper — Champagne */
|
|
113
|
+
--card-2-bg: #e3cfa6; /* sand */
|
|
114
|
+
--card-3-bg: #496d3a; /* brand — Sage, on its own hue as far as white holds 4.5:1 on it and on its tint (#678d58 held it at 3.8) */
|
|
115
|
+
--card-4-bg: #c9d6b0; /* lichen */
|
|
116
|
+
--card-5-bg: #d4bf9c; --card-5-dark: 0; /* wheat — a light tone here */
|
|
117
|
+
|
|
118
|
+
--accent: #496d3a;
|
|
119
|
+
--action-bg: #f6e7cb; --action-border: transparent;
|
|
120
|
+
|
|
121
|
+
/* signals from Sweet Salmon #dd9787, deepened to read on every light ground (4.5:1 on the wheat) */
|
|
122
|
+
--pos: #7fa86f; --neg: #a76557; /* the salmon deepened as far as a falling delta's white words hold 4.5:1 (#dd9787 was 2.4) */
|
|
123
|
+
--signal-error-onlight: #803c2d; --signal-warn-onlight: #654b1e; --signal-ok-onlight: #3b5734; --signal-info-onlight: #3c5169;
|
|
147
124
|
--dot-a: #dd9787; --dot-b: #b08a5a;
|
|
148
125
|
}
|
|
149
126
|
|
|
150
|
-
/* Colored palettes
|
|
127
|
+
/* Colored palettes add a soft elevation under the card's edge. */
|
|
151
128
|
[data-palette] :is(.card, .band-stack) { box-shadow: var(--shadow-card); }
|
|
152
129
|
/* COLOURED MODE is the attribute, whatever its value: a project with colours of its own (the five
|
|
153
130
|
--color-* bases, or roles, in its theme.css) writes <html data-palette="own"> — no block here matches
|
|
154
131
|
"own", so only the three generic rules apply: the card's shadow, the soft outline, the field's soft
|
|
155
|
-
edge (forms.css); and the
|
|
156
|
-
|
|
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; }
|
|
157
139
|
/* …but controls keep a faint edge so they still read as controls */
|
|
158
140
|
[data-palette] { --outline: color-mix(in srgb, currentColor 25%, transparent); }
|
package/css/people.css
CHANGED
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
display: grid;
|
|
17
17
|
place-items: center;
|
|
18
18
|
background: var(--avatar-bg, var(--card-2-bg));
|
|
19
|
-
|
|
19
|
+
--dark: var(--card-2-dark);
|
|
20
|
+
color: var(--avatar-ink, var(--card-ink));
|
|
20
21
|
font: var(--avatar-font, var(--type-label));
|
|
21
22
|
font-size: calc(var(--_size) * 0.3);
|
|
22
23
|
text-transform: uppercase;
|
|
@@ -30,10 +31,10 @@
|
|
|
30
31
|
.avatar--lg { --_size: var(--avatar-lg); }
|
|
31
32
|
.avatar--xl { --_size: var(--avatar-xl); } /* sheet head icon ring */
|
|
32
33
|
/* outline avatar: no fill, an edge — icons in a ring, "add" slots */
|
|
33
|
-
.avatar--outline { background: transparent; color: inherit; border: var(--border-w) solid var(--avatar-outline-border, var(--outline)); }
|
|
34
|
-
.avatar--add { background: transparent; color: inherit; border: var(--border-w) dashed var(--avatar-add-border, var(--outline)); }
|
|
34
|
+
.avatar--outline { background: transparent; --dark: inherit; color: inherit; border: var(--border-w) solid var(--avatar-outline-border, var(--outline)); }
|
|
35
|
+
.avatar--add { background: transparent; --dark: inherit; color: inherit; border: var(--border-w) dashed var(--avatar-add-border, var(--outline)); }
|
|
35
36
|
/* accent avatar: the "+7" tail, the selected person */
|
|
36
|
-
.avatar--on { background: var(--avatar-on-bg, var(--accent)); color: var(--avatar-on-ink, var(--
|
|
37
|
+
.avatar--on { background: var(--avatar-on-bg, var(--accent)); --dark: var(--accent-dark); color: var(--avatar-on-ink, var(--card-ink)); }
|
|
37
38
|
/* halo: faint concentric rings behind a hero avatar (decorative) */
|
|
38
39
|
.avatar--halo::before {
|
|
39
40
|
content: "";
|
package/css/post.css
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
/* ---- post-paper: the card stock. Its own ground and ink, wherever it lies; its parts read --_muted and --_rule ---- */
|
|
7
7
|
.post-paper {
|
|
8
8
|
background: var(--post-paper-bg, var(--card-1-bg));
|
|
9
|
-
|
|
9
|
+
--dark: var(--card-1-dark);
|
|
10
|
+
color: var(--post-paper-ink, var(--card-ink));
|
|
10
11
|
border-radius: var(--post-paper-radius, var(--sp-2));
|
|
11
12
|
box-shadow: var(--post-paper-shadow, var(--shadow-card));
|
|
12
13
|
--_muted: var(--post-paper-muted-ink, var(--card-muted));
|