@apliteni/apliteni-ui 0.23.1 → 0.23.3

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.
@@ -1,14 +1,8 @@
1
1
  /* ============================================================================
2
- * apliteni-ui — design tokens
3
- * Single source of truth for the Apliteni deck theme.
4
- *
5
- * Colour semantics are identical to viz/ (deck index.html, account.mjs):
6
- * purple accent, near-black surfaces, green = live, cyan = link/flag.
7
- * Two themes: dark (default) and light. Toggle with `data-theme` on <html>.
8
- *
9
- * Everything downstream references the SEMANTIC tokens (--bg, --surface,
10
- * --accent, --text…), never the raw ramp. Swap a ramp value once, and every
11
- * component follows.
2
+ * apliteni-ui — design tokens. Single source of truth for the Apliteni deck theme,
3
+ * with viz/'s colour semantics: purple accent, near-black surfaces, green = live,
4
+ * cyan = link/flag. Two themes, dark (default) and light, toggled with `data-theme`
5
+ * on <html>. Everything downstream references the SEMANTIC tokens, never the ramp.
12
6
  * ========================================================================== */
13
7
 
14
8
  :root {
@@ -44,7 +38,6 @@
44
38
  /* -- Measure ------------------------------------------------------------
45
39
  * --container is the page, gutter to gutter; --measure is the reading column
46
40
  * INSIDE a track, beside a sidebar. Different axes, never interchangeable.
47
- * Below --measure are --panel-* and --prose-*, at the end of this file (#208).
48
41
  * why: docs/specification.md#widths */
49
42
  --container: 1120px;
50
43
  --measure: 860px;
@@ -79,13 +72,12 @@
79
72
  --tracking-caps: 0.14em;
80
73
 
81
74
  /* -- Motion -------------------------------------------------------------
82
- * Durations + easings are the Apliteni brand's motion vocabulary, synced
83
- * from design-system into brand.generated.css (--duration-*, --easing-*).
84
- * The kit's legacy --dur-* and --ease names alias onto them, so every existing
85
- * component transitively consumes the brand primitives one vocabulary,
86
- * zero drift. Fallbacks keep tokens.css self-sufficient when imported
87
- * without brand.generated.css. Delays are the kit's own (not a brand
88
- * concern). The reusable effect layer lives in styles/motion.css. */
75
+ * The kit's legacy --dur-* and --ease names alias onto the brand's
76
+ * --duration-* and --easing-* primitives, so every component consumes one
77
+ * vocabulary; the fallbacks keep tokens.css self-sufficient when imported
78
+ * without brand.generated.css. Delays are the kit's own, and the reusable
79
+ * effect layer lives in styles/motion.css.
80
+ * why: CONTRIBUTING.md#brand-tokens-synced-from-design-system */
89
81
  --ease: var(--easing-ease-in-out, cubic-bezier(0.4, 0, 0.2, 1));
90
82
  --ease-out: var(--easing-ease-out, cubic-bezier(0, 0, 0.2, 1));
91
83
  --ease-in: var(--easing-ease-in, cubic-bezier(0.4, 0, 1, 1));
@@ -119,22 +111,16 @@
119
111
  color-scheme: dark;
120
112
 
121
113
  --purple: #6a2dcc;
122
- /* The ramp moves up one step so --accent is --purple-light again, which is
123
- the shape light Nebula and light Ocean already ship and which dark Nebula
124
- held until #157 lifted the accent onto the old --purple-mid. Left alone,
125
- the two tokens would resolve to one colour and the ramp would carry a
126
- duplicate step. #bd8cff is the value docs/specification.md#colour-and-contrast reasons about and
127
- rejects as the accent; it becomes the ramp's top step instead. Light
128
- Nebula's ramp does not move. See issue #157. */
114
+ /* The ramp moves up one step so --accent is --purple-light again, the shape light
115
+ Nebula and light Ocean already ship; left alone the two tokens would resolve to
116
+ one colour. #bd8cff becomes the ramp's top step instead. See issue #157. */
129
117
  --purple-light: #b479ff;
130
118
  --purple-mid: #bd8cff;
131
119
  --cyan: #20dcf5;
132
120
  --green: #98ff8f;
133
- /* Lighter than it looks like it should be, and deliberately so: --pink is read
134
- mostly ON its own 16% glow, and that wash lifts the ground faster than the
135
- hue lifts the ink. #e35b8f measured 3.82:1 on --glow-pink over a card
136
- under AA — so danger moved AWAY from the canvas, not toward it. Light moves
137
- the opposite way for the same reason. See issue #131. */
121
+ /* Lighter than it looks like it should be: --pink is read mostly ON its own 16%
122
+ glow, and that wash lifts the ground faster than the hue lifts the ink, so danger
123
+ moved AWAY from the canvas. Light moves the opposite way. See issue #131. */
138
124
  --pink: #e97ca5;
139
125
  --amber: #ffcf6a;
140
126
 
@@ -144,9 +130,8 @@
144
130
  --surface-2: #1b1927;
145
131
  --surface-3: #2a2739;
146
132
  --seg-active-bg: #34314a; /* raised pill — clearly above the inset track in dark */
147
- /* The raised handle on a control track (switch knob). Stays white in both
148
- themes and under every accent: it has to read on the plain track AND on
149
- the accent fill the track takes when the control is on. */
133
+ /* The raised handle on a control track (switch knob). White in both themes and under
134
+ every accent: it reads on the plain track AND on the accent fill of an on control. */
150
135
  --control-knob: #ffffff;
151
136
  --border: #332f45;
152
137
  --border-strong: #453f5c;
@@ -156,61 +141,40 @@
156
141
  --dim: #c6c2d6;
157
142
  --muted: #948fa8;
158
143
 
159
- /* The paint of a control that is off. NOT an opacity: `opacity` is a group
160
- property, so it fades a label and the box under it toward the ground
161
- TOGETHER and the pair a reader is left with is whatever that composite
162
- lands on a disabled primary button measured 1.48:1 that way, white on a
163
- faded accent. These three composite predictably instead: the ink is read on
164
- the surface beside it, and both are opaque. They are aliases, not new
165
- colours — the ramp gains nothing to keep in sync. A disabled control drops
166
- its accent, which is most of what makes it read as inert; the ink going
167
- quiet is the rest. Held by stories/guidelines/accessibility-floor.test.js.
144
+ /* The paint of a control that is off. NOT an opacity: `opacity` is a group property,
145
+ so it fades label and box toward the ground TOGETHER a disabled primary button
146
+ measured 1.48:1 that way. These three are aliases that composite predictably, the
147
+ ink read on the surface beside it. Held by guidelines/accessibility-floor.test.js.
168
148
  why: docs/specification.md#colour-and-contrast */
169
149
  --disabled-ink: var(--muted);
170
150
  --disabled-surface: var(--surface-2);
171
151
  --disabled-border: var(--border);
172
152
 
173
- /* Lifted from #9b5dff, which cleared the flat surfaces and failed on its own
174
- wash over a card. This value was already in the ramp as --purple-mid, so no
175
- new colour entered it; the ramp then moved up a step above so --accent is
176
- --purple-light, which is how every other Nebula and Ocean cell is written.
177
- --glow-purple follows it down the file; --ring is written as var(--accent)
178
- and so follows it by reference. Held by
179
- stories/accent-contrast.test.js. See issue #157.
153
+ /* Lifted from #9b5dff, which cleared the flat surfaces and failed on its own wash over
154
+ a card; the value was already in the ramp. --ring is var(--accent) and follows by
155
+ reference. Held by stories/accent-contrast.test.js. #157.
180
156
  why: docs/specification.md#colour-and-contrast */
181
157
  --accent: #b479ff;
182
158
  --accent-strong: #7c3aed; /* button bg — white text clears WCAG AA at 5.70:1 */
183
159
  --accent-contrast: #ffffff;
184
160
  --ink: #e9e7f0;
185
161
 
186
- /* Ink that reads on a SIGNAL colour once that colour becomes a fill — the
187
- glyph in a success circle, the glyph on a toast's status circle.
188
- In dark every signal is a bright hue, so one near-black ink clears all
189
- five: 15.87 on --green, 7.35 on --pink, 13.40 on --amber, 11.75 on --cyan
190
- and 6.29 on --muted. Danger keeps a token of its own only because LIGHT
191
- still needs it: there the signals are deepened to read as ink on white,
192
- which parks them mid-luminance, and --pink is the one that comes out ahead
193
- against white (5.78) rather than against near-black (3.39).
194
- Dark danger was white until now, which was correct while --pink was
195
- #e35b8f. Issue #131 lightened it to #e97ca5 to clear AA as INK on its own
196
- glow, and that carried the fill up past the point where white could read on
197
- it — 2.66 on the toast's status circle, under the 3:1 of WCAG 1.4.11. The
198
- ten status x theme icon pairs are gated in stories/signal-contrast.test.js. */
162
+ /* Ink that reads on a SIGNAL colour once that colour becomes a fill — the glyph in a
163
+ success circle, or on a toast's status circle. One near-black ink clears all five in
164
+ dark; danger keeps its own token because LIGHT still needs one.
165
+ why: docs/specification.md#colour-and-contrast */
199
166
  --signal-contrast: #0c0c0c;
200
167
  --danger-contrast: var(--signal-contrast);
201
168
 
202
169
  --glow-green: rgba(152, 255, 143, 0.16);
203
- /* Dropped from 0.18: the wash, not the surface beneath it, is what put --accent
204
- under AA it lifts the ground toward the ink faster than the ink lifts off
205
- it. Re-tinted from the new --accent, which signal-contrast.test.js requires.
206
- See issue #157. */
170
+ /* Dropped from 0.18: the wash, not the surface beneath it, is what put --accent under
171
+ AA. Re-tinted from the new --accent, which signal-contrast.test.js requires. #157. */
207
172
  --glow-purple: rgba(180, 121, 255, 0.12);
208
173
  --glow-cyan: rgba(32, 220, 245, 0.14);
209
174
  --glow-pink: rgba(233, 124, 165, 0.16);
210
175
 
211
- /* Status-chip paint — the ink + fill of a badge / pill. Dark tints with the
212
- signal's own glow; light needs a solid, deepened pair (the glows wash out
213
- on white), which is why these are a token pair and not just --green etc. */
176
+ /* Status-chip paint — the ink + fill of a badge / pill. Dark tints with the signal's
177
+ own glow; light needs a solid, deepened pair, which is why these are a token pair. */
214
178
  --chip-success-ink: var(--green);
215
179
  --chip-success-fill: var(--glow-green);
216
180
  --chip-warn-ink: var(--amber);
@@ -220,14 +184,10 @@
220
184
  --chip-info-ink: var(--cyan);
221
185
  --chip-info-fill: var(--glow-cyan);
222
186
 
223
- /* Solid signal surfaces — a status that has stopped being ink and become the
224
- FILL (a solid toast). The fill and its ink are ONE pair, never two
225
- independent picks: the fill is the status at this theme's extreme, and the
226
- ink is the pole opposite it, so a single ink clears all five. Dark fills are
227
- the bright signals, so the ink is near-black — it measures 15.87 on --green,
228
- 7.35 on --pink, 13.40 on --amber, 11.75 on --cyan and 6.29 on --muted.
229
- Neutral needs no chip pair to take part: --muted is already its
230
- fill-strength form. See issues #131 and #149. */
187
+ /* Solid signal surfaces — a status that has stopped being ink and become the FILL (a
188
+ solid toast). Fill and ink are ONE pair, never two independent picks: the fill is the
189
+ status at this theme's extreme and the ink the pole opposite it, so a single ink
190
+ clears all five. --muted is already its own fill-strength form. See #131, #149. */
231
191
  --signal-solid-ink: var(--signal-contrast);
232
192
  --signal-solid-success: var(--green);
233
193
  --signal-solid-danger: var(--pink);
@@ -240,19 +200,18 @@
240
200
  --shadow-lg: 0 18px 50px rgba(0, 0, 0, 0.5);
241
201
  /* Tight elevation for the active segmented pill — stays contained in its track. */
242
202
  --shadow-seg: 0 1px 2px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.3);
243
- /* Resting elevation for a card. Dark cards are borderless — the surface does
244
- the grouping on its own — so they cast nothing. */
203
+ /* Resting elevation for a card. Dark cards are borderless — the surface groups on
204
+ its own — so they cast nothing. */
245
205
  --shadow-card: none;
246
- /* THE ONLY --ring in the kit — light and every data-accent sub-theme declare
247
- an --accent and inherit this line. Opaque because a translucent ring is a
248
- glow: the eight rgba() literals this replaced all missed the 3:1 of WCAG
249
- 1.4.11, at 1.35:1 worst. Held at 4.22:1 worst by
250
- stories/guidelines/accessibility-floor.test.js. See issue #218.
206
+ /* THE ONLY --ring in the kit — light and every data-accent sub-theme declare an
207
+ --accent and inherit this line. Opaque because a translucent ring is a glow, and the
208
+ eight rgba() literals it replaced all missed WCAG 1.4.11's 3:1 (#218). Held by
209
+ stories/guidelines/accessibility-floor.test.js.
251
210
  why: docs/specification.md#the-focus-ring */
252
211
  --ring: 0 0 0 3px var(--accent);
253
212
 
254
- /* The ink a cast shadow is made of, and the specular white that reads as
255
- gloss on a raised surface. Effects mix these instead of writing rgba(). */
213
+ /* The ink a cast shadow is made of, and the specular white that reads as gloss on a
214
+ raised surface. Effects mix these instead of writing rgba(). */
256
215
  --shadow-ink: #000000;
257
216
  --sheen: #ffffff;
258
217
 
@@ -260,10 +219,8 @@
260
219
  --scrim: rgba(0, 0, 0, 0.58);
261
220
 
262
221
  /* Accent gradient stops (hero headline, marketing) — overridden per sub-theme.
263
- --grad-from is pinned to the literal rather than tracking --purple-light,
264
- which #157 moved up a step: following it would lighten the hero gradient's
265
- first stop, a visible change nobody asked for. Every --grad-from in
266
- src/tokens/accents.css is already written as a literal for the same reason. */
222
+ --grad-from is pinned to a literal rather than tracking --purple-light, which #157
223
+ moved up a step; every --grad-from in accents.css is a literal for the same reason. */
267
224
  --grad-from: #9b5dff;
268
225
  --grad-to: var(--cyan);
269
226
  }
@@ -279,15 +236,13 @@
279
236
  --purple-mid: #7a3be0;
280
237
  --cyan: #0c8fa8;
281
238
  --green: #1c8a2c;
282
- /* Deeper than the dark pink for the same reason dark's is lighter: the wash
283
- under it is white, so the ink has to come down to meet it. #d63c72 measured
284
- 3.87:1 on --glow-pink over white and 4.42:1 on plain white — the required
285
- marker and the form error missed AA on nothing at all. See issue #131. */
239
+ /* Deeper than the dark pink for the same reason dark's is lighter: the wash under it
240
+ is white, so the ink has to come down to meet it. See issue #131. */
286
241
  --pink: #b63361;
287
242
  --amber: #b5730a;
288
243
 
289
- /* A WHITE app: the page and cards are both white; cards are delineated by a
290
- hairline border + soft shadow (see card.css), not a grey canvas. */
244
+ /* A WHITE app: page and cards are both white, and cards are delineated by a hairline
245
+ border + soft shadow (see card.css), not a grey canvas. */
291
246
  --bg: #ffffff;
292
247
  --bg-elevated: #ffffff;
293
248
  --surface: #ffffff;
@@ -303,9 +258,8 @@
303
258
  --dim: #3a404b;
304
259
  --muted: #5c6270;
305
260
 
306
- /* Same three aliases as dark, same reasoning. Light moves the disabled
307
- surface AWAY from white for the same reason dark moves it away from the
308
- card: a control that is off should sink, not rise. */
261
+ /* Same three aliases as dark. Light moves the disabled surface AWAY from white for the
262
+ same reason dark moves it away from the card: a control that is off should sink. */
309
263
  --disabled-ink: var(--muted);
310
264
  --disabled-surface: var(--surface-2);
311
265
  --disabled-border: var(--border);
@@ -318,45 +272,33 @@
318
272
  --signal-contrast: #0c0c0c;
319
273
  --danger-contrast: #ffffff;
320
274
 
321
- /* Re-tinted from --green. It was rgba(30, 150, 50, .1) a colour that exists
322
- nowhere else in the kit, carried unedited since the initial commit while the
323
- other three light glows are exact tints of their own token. The wash over
324
- white moves #e9f5eb -> #e8f3ea, at most two levels on a channel, which is
325
- 0.86 of a deltaE — under the 1.0 that is normally called imperceptible. No
326
- verdict moves with it: body copy on the success wash goes 9.29 -> 9.15
327
- against the 4.5 AA bar, and the --green icon on it 3.97 -> 3.91 against the
328
- 3.0 bar WCAG 1.4.11 sets for a graphic. The success chips are untouched —
329
- light's --chip-success-fill is the solid #dff3e4, not this. Gated for all
330
- four glows in stories/signal-contrast.test.js. See issue #131. */
275
+ /* Re-tinted from --green; it was rgba(30, 150, 50, .1), a colour that exists nowhere
276
+ else in the kit while the other three light glows are exact tints of their own token.
277
+ The wash over white moves at most two levels on a channel and no verdict moves with
278
+ it. Gated for all four glows in stories/signal-contrast.test.js. */
331
279
  --glow-green: rgba(28, 138, 44, 0.1);
332
280
  --glow-purple: rgba(106, 45, 204, 0.09);
333
281
  --glow-cyan: rgba(12, 143, 168, 0.1);
334
282
  --glow-pink: rgba(182, 51, 97, 0.1);
335
283
 
336
- /* Solid chip pairs for the white app. Each ink is deepened past its signal
337
- hue so 10px uppercase text clears WCAG AA on its own pale fill
338
- e.g. --pink (#b63361) on #fbe0ea is 4.66:1, #b7295f is 4.85:1. */
284
+ /* Solid chip pairs for the white app. Each ink is deepened past its signal hue so 10px
285
+ uppercase text clears WCAG AA on its own pale fill. */
339
286
  --chip-success-ink: #1f7a38;
340
287
  --chip-success-fill: #dff3e4;
341
288
  --chip-warn-ink: #8a5e00;
342
289
  --chip-warn-fill: #fbedd2;
343
290
  --chip-danger-ink: #b7295f;
344
291
  --chip-danger-fill: #fbe0ea;
345
- /* Info was the one signal family without a pair, so the info badge was still
346
- painting --cyan (#0c8fa8) on --glow-cyan over white, which is 3.39:1
347
- under AA. #0a7286 on #ddeff3 is 4.71:1, inside the 4.64–4.93 band the other
348
- three pairs already sit in. See issue #131. */
292
+ /* Info was the one signal family without a pair, so the info badge painted --cyan on
293
+ --glow-cyan over white and missed AA. This pair sits in the band the other three
294
+ already occupy. See issue #131. */
349
295
  --chip-info-ink: #0a7286;
350
296
  --chip-info-fill: #ddeff3;
351
297
 
352
- /* Light runs the same rule the other way. The signals are mid-tone here a
353
- solid --green fill measures 4.40 against near-black and 4.45 against white,
354
- so NO ink rescues it and the fill is what has to move. It moves to the
355
- deepened form the chip pair already carries, and the pole above it, white,
356
- clears every one: #ffffff measures 5.39 on --chip-success-ink, 6.01 on
357
- --chip-danger-ink, 5.70 on --chip-warn-ink, 5.58 on --chip-info-ink and 6.11
358
- on --muted. A future status supplies one --signal-solid-* value dark enough
359
- for white and inherits the ink. See issues #131 and #149. */
298
+ /* Light runs the same rule the other way. The signals are mid-tone here, so NO ink
299
+ rescues them and the fill is what has to move: it takes the deepened form the chip
300
+ pair already carries, and white clears every one. A future status supplies one
301
+ --signal-solid-* value dark enough for white and inherits the ink. See #131, #149. */
360
302
  --signal-solid-ink: #ffffff;
361
303
  --signal-solid-success: var(--chip-success-ink);
362
304
  --signal-solid-danger: var(--chip-danger-ink);
@@ -369,8 +311,8 @@
369
311
  --shadow-lg: 0 18px 50px rgba(30, 30, 50, 0.16);
370
312
  /* Tight elevation for the active segmented pill — stays contained in its track. */
371
313
  --shadow-seg: 0 1px 2px rgba(30, 30, 50, 0.12), 0 2px 4px rgba(30, 30, 50, 0.1);
372
- /* A white card on a white page needs its own, flatter-than-sm elevation:
373
- a hairline contact shadow plus a wide soft one (see card.css). */
314
+ /* A white card on a white page needs its own flatter-than-sm elevation: a hairline
315
+ contact shadow plus a wide soft one (see card.css). */
374
316
  --shadow-card: 0 1px 2px rgba(20, 25, 45, 0.04), 0 4px 14px rgba(20, 25, 45, 0.05);
375
317
  /* No --ring here. :root's is var(--accent), and light re-points --accent. */
376
318
 
@@ -384,42 +326,32 @@
384
326
  }
385
327
 
386
328
  /* ============================================================================
387
- * WIDTHS BELOW THE PAGE — the box, and the line
388
- *
389
- * --container is the page and --measure the reading column inside it (both
390
- * above). Underneath them the kit has two scales and one rule for choosing
391
- * between them: THE UNIT SAYS WHICH SCALE YOU ARE ON.
329
+ * WIDTHS BELOW THE PAGE — the box, and the line. Two scales, and one rule for
330
+ * choosing between them: THE UNIT SAYS WHICH SCALE YOU ARE ON.
392
331
  *
393
332
  * a box that holds a COMPONENT -> --panel-* (px)
394
333
  * a box that holds a LINE -> --prose-* (ch)
395
334
  *
396
- * Both are theme-invariant, which is why they sit outside the palette blocks.
335
+ * Both are theme-invariant, so they sit outside the palette blocks.
397
336
  * why: docs/specification.md#boxes-below-the-page
398
337
  * ========================================================================== */
399
338
  :root {
400
339
  /* -- Panel widths -------------------------------------------------------
401
- * Not a new scale: the drawer has shipped sm/md/lg at exactly these three
402
- * values since it was written, and confirm, the auth card and the toast each
403
- * wrote one of them out again on their own. --panel-md answers the question
404
- * #208 asked — the two 420s were three (--confirm-w, --drawer-w md and
405
- * .ui-auth__card), and they are one measure now. */
340
+ * Not a new scale: the drawer has shipped sm/md/lg at these three values, and
341
+ * confirm, the auth card and the toast each wrote one out again (#208). */
406
342
  --panel-sm: 320px;
407
343
  --panel-md: 420px;
408
344
  --panel-lg: 560px;
409
345
 
410
346
  /* -- Prose measures -----------------------------------------------------
411
- * ch resolves against the font-size of the element it is DECLARED on, so a
412
- * step goes on the paragraph itself never on a wrapper holding two type
413
- * sizes, where the same token would mean two different widths.
414
- *
415
- * The four steps are the reading band (44–72ch), named for what is being
416
- * read rather than sized s/m/l, so the choice is made by the writer:
347
+ * ch resolves against the font-size of the element it is DECLARED on, so a step
348
+ * goes on the paragraph itself, never on a wrapper holding two type sizes. The
349
+ * four steps are the reading band (44–72ch), named for what is being read:
417
350
  * caption one or two sentences under a glyph, centred
418
351
  * lede the line under a title
419
352
  * body a left-aligned column of copy
420
353
  * dense reference prose set below 13px, where the band runs wider
421
- * --prose-display is NOT a measure. It is where a display headline rags, and
422
- * it is far under the band on purpose. */
354
+ * --prose-display is NOT a measure it is where a display headline rags. */
423
355
  --prose-display: 14ch;
424
356
  --prose-caption: 44ch;
425
357
  --prose-lede: 54ch;