@threadlabs/looma 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -204,197 +204,210 @@
204
204
  display: none;
205
205
  }
206
206
 
207
- [data-component~="ui-button"][data-v-4fd0ad7f] {
207
+ [data-component~="ui-button"][data-v-8513eb5d] {
208
+ --_hue: var(--ui-accent);
209
+ --_hue-hover: var(--ui-accent-hover);
210
+ --_hue-active: var(--ui-accent-active);
211
+ --_hue-text: var(--ui-accent-active);
212
+ --_on-hue: var(--ui-on-accent);
213
+
214
+ --_tone: var(--_hue);
215
+ --_tone-hover: var(--_hue-hover);
216
+ --_tone-active: var(--_hue-active);
217
+ --_tone-text: var(--_hue-text);
218
+ --_on-tone: var(--_on-hue);
219
+
208
220
  display: inline-flex;
209
221
  align-items: center;
210
222
  justify-content: center;
211
223
  vertical-align: middle;
212
- color: var(--ui-action-secondary-text, var(--ui-text-primary));
213
- }
214
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-4fd0ad7f] {
215
- color: var(--ui-action-primary-text, var(--ui-text-on-accent));
224
+ color: var(--_tone-text);
216
225
  }
217
- [data-component~="ui-button"][data-ui-button-state~="align=start"][data-v-4fd0ad7f] {
226
+ [data-component~="ui-button"][data-ui-button-state~="align=start"][data-v-8513eb5d] {
218
227
  justify-content: flex-start;
219
228
  text-align: start;
220
229
  }
221
- [data-component~="ui-button"][data-ui-button-state~="stretch"][data-v-4fd0ad7f] {
230
+ [data-component~="ui-button"][data-ui-button-state~="stretch"][data-v-8513eb5d] {
222
231
  display: flex;
223
232
  inline-size: 100%;
224
233
  }
225
- [data-component~="ui-button"][data-v-4fd0ad7f] {
234
+ [data-component~="ui-button"][data-v-8513eb5d] {
226
235
  appearance: none;
227
236
  min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md));
228
- border: 1px solid var(--ui-button-border, var(--ui-border-strong));
237
+ border-style: solid;
238
+ border-width: 1px;
239
+ border-color: var(--ui-button-border, var(--_tone));
229
240
  border-radius: var(--ui-button-radius, var(--ui-radius-md));
230
- background: var(--ui-button-surface, var(--ui-surface-elevated));
231
- color: var(--ui-button-text, var(--ui-action-secondary-text, var(--ui-text-primary)));
241
+ background-color: var(--ui-button-surface, oklch(from var(--_tone) l c h / 5%));
242
+ color: var(--ui-button-text, var(--_tone-text));
232
243
  font: inherit;
233
244
  font-weight: var(--ui-font-medium);
234
245
  line-height: var(--ui-line-height-tight);
235
246
  padding: var(--ui-space-2) var(--ui-space-3);
236
247
  background-image: var(--ui-raised-highlight);
237
- box-shadow: var(--ui-button-shadow, var(--ui-raised, var(--ui-shadow-xs)));
248
+ box-shadow: var(--ui-button-shadow, var(--ui-raised));
238
249
  cursor: pointer;
239
250
  transition:
240
251
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
241
252
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
242
253
  color var(--ui-motion-fast) var(--ui-motion-ease),
243
- box-shadow var(--ui-motion-fast) var(--ui-motion-ease),
244
- transform var(--ui-motion-fast) var(--ui-motion-ease);
254
+ box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
245
255
  margin: 0;
246
256
  }
247
257
  @supports (text-box-trim: trim-both) {
248
- [data-component~="ui-button"][data-v-4fd0ad7f] {
258
+ [data-component~="ui-button"][data-v-8513eb5d] {
249
259
  text-box-trim: trim-both;
250
260
  text-box-edge: cap alphabetic;
251
261
  }
252
262
  }
253
- [data-component~="ui-button"][data-ui-button-state~="size=sm"][data-v-4fd0ad7f] {
263
+ [data-component~="ui-button"][data-ui-button-state~="size=sm"][data-v-8513eb5d] {
254
264
  min-block-size: var(--ui-control-size-sm);
255
265
  padding: var(--ui-space-1) var(--ui-space-2);
256
266
  font-size: 0.875rem;
257
267
  }
258
- [data-component~="ui-button"][data-ui-button-state~="size=lg"][data-v-4fd0ad7f] {
268
+ [data-component~="ui-button"][data-ui-button-state~="size=lg"][data-v-8513eb5d] {
259
269
  min-block-size: var(--ui-control-size-lg);
260
270
  padding: var(--ui-space-3) var(--ui-space-4);
261
271
  font-size: 1rem;
262
272
  }
263
- [data-component~="ui-button"][data-v-4fd0ad7f]:hover:enabled {
264
- background: var(--ui-action-secondary-surface-hover, var(--ui-surface-muted));
265
- border-color: var(--ui-control-border-hover, var(--ui-border-strong));
266
- }
267
- [data-component~="ui-button"][data-v-4fd0ad7f]:active:enabled {
268
- background: var(--ui-surface-subtle);
269
- }
270
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-4fd0ad7f] {
271
- border-color: var(--ui-action-primary-surface, var(--ui-accent-solid));
272
- background: var(--ui-action-primary-surface, var(--ui-accent-solid));
273
- color: var(--ui-action-primary-text, var(--ui-text-on-accent));
274
- box-shadow: var(
275
- --ui-button-solid-shadow,
276
- inset 0 1px rgb(255 255 255 / 0.16),
277
- var(--ui-shadow-xs)
278
- );
279
- }
280
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-4fd0ad7f]:hover:enabled {
281
- background: var(--ui-action-primary-surface-hover, var(--ui-accent-hover));
282
- border-color: var(--ui-action-primary-surface-hover, var(--ui-accent-hover));
283
- box-shadow: var(--ui-shadow-sm);
284
- transform: translateY(-1px);
285
- }
286
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-4fd0ad7f]:active:enabled {
287
- background: var(--ui-action-primary-surface-active, var(--ui-accent-active));
288
- border-color: var(--ui-action-primary-surface-active, var(--ui-accent-active));
289
- box-shadow: none;
290
- transform: translateY(0);
291
- }
292
- [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-4fd0ad7f] {
293
- border-color: var(--ui-danger-solid);
294
- background: var(--ui-danger-solid);
295
- color: var(--ui-text-on-accent);
296
- box-shadow: var(
297
- --ui-button-danger-shadow,
298
- inset 0 1px rgb(255 255 255 / 0.14),
299
- var(--ui-shadow-xs)
300
- );
301
- }
302
- [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-4fd0ad7f]:hover:enabled {
303
- background: var(--ui-danger-hover);
304
- border-color: var(--ui-danger-hover);
305
- box-shadow: var(--ui-shadow-sm);
306
- transform: translateY(-1px);
307
- }
308
- [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-4fd0ad7f]:active:enabled {
309
- box-shadow: none;
310
- transform: translateY(0);
311
- }
312
-
313
- /* An accent-tinted secondary action: the outline, ghost, and link variants in the accent colour.
314
- Solid and danger already carry their own intent. */
315
- [data-component~="ui-button"][data-ui-button-state~="tone=accent"][data-component~="ui-button"][data-ui-button-state~="variant=outline"][data-v-4fd0ad7f] {
316
- border-color: var(--ui-button-accent-border, var(--ui-accent));
317
- background: var(--ui-button-accent-surface, var(--ui-accent-subtle));
318
- color: var(--ui-button-accent-text, var(--ui-accent-active));
319
- }
320
- [data-component~="ui-button"][data-ui-button-state~="tone=accent"][data-component~="ui-button"][data-ui-button-state~="variant=outline"][data-v-4fd0ad7f]:hover:enabled {
321
- border-color: var(--ui-button-accent-hover-border, var(--ui-accent-hover));
322
- background: var(
323
- --ui-button-accent-hover-surface,
324
- color-mix(in srgb, var(--ui-accent) 16%, var(--ui-surface))
325
- );
326
- }
327
- [data-component~="ui-button"][data-ui-button-state~="tone=accent"][data-v-4fd0ad7f]:is([data-component~="ui-button"][data-ui-button-state~="variant=ghost"], [data-component~="ui-button"][data-ui-button-state~="variant=link"]) {
328
- color: var(--ui-button-accent-text, var(--ui-accent-active));
329
- }
330
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-4fd0ad7f] {
273
+ [data-component~="ui-button"][data-v-8513eb5d]:hover:enabled {
274
+ border-color: var(--ui-button-hover-border, var(--_tone-hover));
275
+ background-color: var(--ui-button-hover-surface, oklch(from var(--_tone) l c h / 12%));
276
+ }
277
+
278
+ /* Pressed reads as pressed in: the highlight goes, and the shadow moves inside. */
279
+ [data-component~="ui-button"][data-v-8513eb5d]:active:enabled {
280
+ background-color: var(--ui-button-active-surface, oklch(from var(--_tone) l c h / 18%));
281
+ background-image: none;
282
+ box-shadow: var(--ui-pressed);
283
+ }
284
+ [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-8513eb5d],
285
+ [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-8513eb5d] {
286
+ border-color: var(--_tone);
287
+ background-color: var(--_tone);
288
+ color: var(--_on-tone);
289
+ box-shadow: var(--ui-button-solid-shadow, var(--ui-raised));
290
+ }
291
+ :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-8513eb5d], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-8513eb5d]):hover:enabled {
292
+ background-color: var(--_tone-hover);
293
+ border-color: var(--_tone-hover);
294
+ }
295
+ :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-8513eb5d], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-8513eb5d]):active:enabled {
296
+ background-color: var(--_tone-active);
297
+ border-color: var(--_tone-active);
298
+ background-image: none;
299
+ box-shadow: var(--ui-pressed);
300
+ }
301
+
302
+ /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
303
+ destructive secondary action, not a special case. */
304
+ [data-component~="ui-button"][data-ui-button-state~="tone=neutral"][data-v-8513eb5d] {
305
+ --_hue: var(--ui-text);
306
+ --_hue-hover: var(--ui-text);
307
+ --_hue-active: var(--ui-text);
308
+ --_hue-text: var(--ui-text);
309
+ --_on-hue: var(--ui-surface);
310
+ }
311
+ [data-component~="ui-button"][data-ui-button-state~="tone=danger"][data-v-8513eb5d],
312
+ [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-8513eb5d] {
313
+ --_hue: var(--ui-danger);
314
+ --_hue-hover: var(--ui-danger-hover);
315
+ --_hue-active: var(--ui-danger-hover);
316
+ --_hue-text: var(--ui-danger-hover);
317
+ --_on-hue: var(--ui-on-danger);
318
+ }
319
+ [data-component~="ui-button"][data-ui-button-state~="tone=success"][data-v-8513eb5d] {
320
+ --_hue: var(--ui-success);
321
+ --_hue-hover: color-mix(in srgb, var(--ui-success) 85%, #000);
322
+ --_hue-active: color-mix(in srgb, var(--ui-success) 75%, #000);
323
+ --_hue-text: color-mix(in srgb, var(--ui-success) 85%, #000);
324
+ --_on-hue: var(--ui-surface);
325
+ }
326
+ [data-component~="ui-button"][data-ui-button-state~="tone=warning"][data-v-8513eb5d] {
327
+ --_hue: var(--ui-warning);
328
+ --_hue-hover: color-mix(in srgb, var(--ui-warning) 85%, #000);
329
+ --_hue-active: color-mix(in srgb, var(--ui-warning) 75%, #000);
330
+ --_hue-text: color-mix(in srgb, var(--ui-warning) 85%, #000);
331
+ --_on-hue: var(--ui-surface);
332
+ }
333
+ [data-component~="ui-button"][data-ui-button-state~="tone=info"][data-v-8513eb5d] {
334
+ --_hue: var(--ui-info);
335
+ --_hue-hover: color-mix(in srgb, var(--ui-info) 85%, #000);
336
+ --_hue-active: color-mix(in srgb, var(--ui-info) 75%, #000);
337
+ --_hue-text: color-mix(in srgb, var(--ui-info) 85%, #000);
338
+ --_on-hue: var(--ui-surface);
339
+ }
340
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-8513eb5d] {
331
341
  border-color: transparent;
332
342
  background: transparent;
333
343
  box-shadow: none;
334
- color: var(--ui-button-ghost-text, var(--ui-action-secondary-text, var(--ui-text-primary)));
344
+ color: var(--ui-button-ghost-text, var(--_tone-text));
335
345
  }
336
346
 
337
347
  /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
338
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-4fd0ad7f]:hover:enabled {
339
- background: var(
340
- --ui-button-ghost-hover-surface,
341
- color-mix(in srgb, currentColor 8%, transparent)
342
- );
348
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-8513eb5d]:hover:enabled {
349
+ background-color: var(--ui-button-ghost-hover-surface, oklch(from var(--_tone) l c h / 10%));
343
350
  border-color: transparent;
344
351
  }
345
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-4fd0ad7f]:active:enabled {
346
- background: var(
347
- --ui-button-ghost-active-surface,
348
- color-mix(in srgb, currentColor 14%, transparent)
349
- );
352
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-8513eb5d]:active:enabled {
353
+ background-color: var(--ui-button-ghost-active-surface, oklch(from var(--_tone) l c h / 16%));
350
354
  border-color: transparent;
355
+ box-shadow: var(--ui-pressed);
351
356
  }
352
357
 
353
358
  /* A soft halo that transitions in with the other box-shadow changes, layered on the raised shadow. */
354
- [data-component~="ui-button"][data-v-4fd0ad7f]:focus-visible {
359
+ [data-component~="ui-button"][data-v-8513eb5d]:focus-visible {
355
360
  outline: none;
356
361
  box-shadow:
357
- var(--ui-button-shadow, var(--ui-raised, var(--ui-shadow-xs))),
362
+ var(--ui-button-shadow, var(--ui-raised)),
358
363
  var(--ui-focus-halo);
359
364
  }
360
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-4fd0ad7f]:focus-visible {
365
+ [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-8513eb5d]:focus-visible {
361
366
  box-shadow:
362
- var(--ui-button-solid-shadow, inset 0 1px rgb(255 255 255 / 0.16), var(--ui-shadow-xs)),
367
+ var(--ui-button-solid-shadow, var(--ui-raised)),
363
368
  var(--ui-focus-halo);
364
369
  }
365
370
 
366
- /* Disabled colours fall back to each variant's own; ghost and link take only the text colour. */
367
- [data-component~="ui-button"][data-v-4fd0ad7f]:disabled {
371
+ /* Disabled drops the tone rather than the shape: every variant keeps its own structure, so a
372
+ disabled outline is still an outline and a disabled ghost is still text. Intent goes — an
373
+ unavailable action says "unavailable", not "unavailable, and destructive" — and so do the
374
+ highlight and shadow, because nothing that cannot be pressed should look raised. */
375
+ [data-component~="ui-button"][data-v-8513eb5d]:disabled {
376
+ /* Derived from the tone itself, not from a separate disabled palette: faded toward the
377
+ page, which desaturates it at the same time. Toward the page rather than toward white,
378
+ so a dark theme dims where a light one lightens — the same rule, both schemes. */
379
+ --_tone: color-mix(in oklab, var(--_hue) 58%, var(--ui-surface));
380
+ --_tone-hover: var(--_tone);
381
+ --_tone-active: var(--_tone);
382
+ --_tone-text: color-mix(in oklab, var(--_hue-text) 72%, var(--ui-surface));
383
+ --_on-tone: var(--_tone-text);
384
+
368
385
  opacity: var(--ui-button-disabled-opacity, 1);
369
386
  cursor: not-allowed;
370
- border-color: var(--ui-button-disabled-border, var(--ui-border));
371
- background-color: var(--ui-button-disabled-surface, var(--ui-disabled-surface));
372
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
373
- }
374
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-4fd0ad7f]:disabled {
375
- border-color: var(--ui-button-disabled-border, var(--ui-border));
376
- background-color: var(--ui-button-disabled-surface, var(--ui-disabled-surface));
377
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
387
+ background-image: none;
388
+ box-shadow: none;
378
389
  }
379
- [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-4fd0ad7f]:disabled {
380
- border-color: var(--ui-button-disabled-border, var(--ui-border));
381
- background-color: var(--ui-button-disabled-surface, var(--ui-disabled-surface));
382
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
390
+
391
+ /* A filled button keeps its fill, faded further so its text stays legible on it. */
392
+ :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-8513eb5d], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-8513eb5d]):disabled {
393
+ --_tone: color-mix(in oklab, var(--_hue) 34%, var(--ui-surface));
383
394
  }
384
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-4fd0ad7f]:disabled {
385
- background: none;
395
+
396
+ /* Ghost has no hover to fall back on, so disabled is the one state it has to state outright:
397
+ it takes a surface, light and tinted, rather than reading as plain text. */
398
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-8513eb5d]:disabled {
399
+ background-color: color-mix(in oklab, var(--_hue) 28%, var(--ui-surface));
386
400
  border-color: transparent;
387
- color: var(--ui-button-disabled-text, var(--ui-disabled-text));
388
401
  }
389
402
  @media (pointer: coarse) {
390
- [data-component~="ui-button"][data-v-4fd0ad7f] {
403
+ [data-component~="ui-button"][data-v-8513eb5d] {
391
404
  min-block-size: var(--ui-control-min-block-size);
392
405
  }
393
406
  }
394
407
 
395
408
  /* Link: an inline text action. No box, padding, or minimum height (inline targets are exempt under
396
409
  WCAG 2.5.8); the inherited font; an underline that strengthens on hover; a visible focus ring. */
397
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-4fd0ad7f] {
410
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-8513eb5d] {
398
411
  display: inline;
399
412
  min-block-size: 0;
400
413
  padding: 0;
@@ -412,22 +425,22 @@
412
425
  color var(--ui-motion-fast) var(--ui-motion-ease),
413
426
  text-decoration-color var(--ui-motion-fast) var(--ui-motion-ease);
414
427
  }
415
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-4fd0ad7f]:hover:enabled {
428
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-8513eb5d]:hover:enabled {
416
429
  color: var(--ui-button-link-hover-text, var(--ui-text-primary));
417
430
  text-decoration-color: currentColor;
418
431
  background: none;
419
432
  transform: none;
420
433
  }
421
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-4fd0ad7f]:active:enabled {
434
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-8513eb5d]:active:enabled {
422
435
  background: none;
423
436
  transform: none;
424
437
  }
425
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-4fd0ad7f]:disabled {
438
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-8513eb5d]:disabled {
426
439
  background: none;
427
440
  border-color: transparent;
428
441
  color: var(--ui-button-disabled-text, var(--ui-disabled-text));
429
442
  }
430
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-4fd0ad7f]:focus-visible {
443
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-8513eb5d]:focus-visible {
431
444
  box-shadow: none;
432
445
  /* Fallback keeps the ring if the token is missing: an unresolved var() would void the outline. */
433
446
  outline: 2px solid var(--ui-focus-ring);
@@ -435,7 +448,7 @@
435
448
  }
436
449
 
437
450
  /* A component that sets its display still honours the hidden attribute on its root. */
438
- [data-component~="ui-button"][hidden][data-v-4fd0ad7f] {
451
+ [data-component~="ui-button"][hidden][data-v-8513eb5d] {
439
452
  display: none;
440
453
  }
441
454
 
@@ -505,7 +518,7 @@
505
518
  display: none;
506
519
  }
507
520
 
508
- [data-component~="ui-checkbox"][data-v-d8891b6a] {
521
+ [data-component~="ui-checkbox"][data-v-964081a0] {
509
522
  display: inline-flex;
510
523
  align-items: flex-start;
511
524
  gap: var(--ui-checkbox-gap, var(--ui-space-2));
@@ -513,11 +526,11 @@
513
526
  color: var(--ui-text-primary);
514
527
  cursor: pointer;
515
528
  }
516
- .label[data-v-d8891b6a] {
529
+ .label[data-v-964081a0] {
517
530
  min-inline-size: 0;
518
531
  line-height: var(--ui-line-height-md);
519
532
  }
520
- input[data-v-d8891b6a] {
533
+ input[data-v-964081a0] {
521
534
  appearance: none;
522
535
  -webkit-appearance: none;
523
536
  position: relative;
@@ -535,30 +548,33 @@ input[data-v-d8891b6a] {
535
548
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
536
549
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
537
550
  }
538
- input[data-v-d8891b6a]::after {
551
+ input[data-v-964081a0]::after {
539
552
  content: "";
540
553
  position: absolute;
541
554
  opacity: 0;
542
555
  }
543
- input[data-v-d8891b6a]:checked,
544
- input[data-v-d8891b6a]:indeterminate {
556
+ input[data-v-964081a0]:checked,
557
+ input[data-v-964081a0]:indeterminate {
545
558
  border-color: var(--ui-accent-solid);
546
559
  background: var(--ui-accent-solid);
547
560
  box-shadow: inset 0 1px 2px color-mix(in srgb, #000 16%, transparent);
548
561
  }
549
562
 
550
563
  /* Centre the tick's box, then lift it: a rotated L's ink sits ~0.11rem below its box centre. */
551
- input[data-v-d8891b6a]:checked::after {
564
+ input[data-v-964081a0]:checked::after {
552
565
  inset: 0;
553
566
  margin: auto;
554
567
  inline-size: 0.32rem;
555
568
  block-size: 0.58rem;
556
- border: solid var(--ui-text-on-accent);
569
+ /* Longhands, not `border: solid var(...)`: lowering drops a shorthand that omits a
570
+ component, which left the tick with no style and no colour. */
571
+ border-style: solid;
572
+ border-color: var(--ui-text-on-accent);
557
573
  border-width: 0 0.125rem 0.125rem 0;
558
574
  opacity: 1;
559
575
  transform: translateY(-0.11rem) rotate(45deg);
560
576
  }
561
- input[data-v-d8891b6a]:indeterminate::after {
577
+ input[data-v-964081a0]:indeterminate::after {
562
578
  inset: 50% 0.23rem auto;
563
579
  block-size: 0.125rem;
564
580
  border-radius: var(--ui-radius-round);
@@ -566,25 +582,25 @@ input[data-v-d8891b6a]:indeterminate::after {
566
582
  opacity: 1;
567
583
  transform: translateY(-50%);
568
584
  }
569
- input[data-v-d8891b6a]:hover:enabled {
585
+ input[data-v-964081a0]:hover:enabled {
570
586
  border-color: var(--ui-accent-solid);
571
587
  }
572
- input[data-v-d8891b6a]:focus-visible {
588
+ input[data-v-964081a0]:focus-visible {
573
589
  outline: 2px solid var(--ui-focus-ring, var(--ui-accent-solid));
574
590
  outline-offset: 2px;
575
591
  }
576
- [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"][data-v-d8891b6a] {
592
+ [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"][data-v-964081a0] {
577
593
  color: var(--ui-text-muted);
578
594
  cursor: not-allowed;
579
595
  }
580
- [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"] input[data-v-d8891b6a] {
596
+ [data-component~="ui-checkbox"][data-ui-checkbox-state~="disabled"] input[data-v-964081a0] {
581
597
  border-color: var(--ui-border-default);
582
598
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
583
599
  cursor: not-allowed;
584
600
  }
585
601
 
586
602
  /* A component that sets its display still honours the hidden attribute on its root. */
587
- [data-component~="ui-checkbox"][hidden][data-v-d8891b6a] {
603
+ [data-component~="ui-checkbox"][hidden][data-v-964081a0] {
588
604
  display: none;
589
605
  }
590
606
 
@@ -723,27 +739,27 @@ input[data-v-d8891b6a]:focus-visible {
723
739
  }
724
740
  }
725
741
 
726
- [data-component~="ui-combobox"][data-v-aef83c81] {
742
+ [data-component~="ui-combobox"][data-v-1aba7b21] {
727
743
  display: grid;
728
744
  gap: var(--ui-space-1);
729
745
  min-inline-size: 0;
730
746
  color: var(--ui-text-primary);
731
747
  font: inherit;
732
748
  }
733
- label[data-v-aef83c81] {
749
+ label[data-v-1aba7b21] {
734
750
  color: var(--ui-combobox-label-text, var(--ui-text-primary));
735
751
  font-size: var(--ui-combobox-label-font-size, 0.875rem);
736
752
  font-weight: 500;
737
753
  }
738
754
  /* The field and anything that annotates it sit on one row; the help button is beside the box,
739
755
  not inside it, because a control's box holds its value. */
740
- .control[data-v-aef83c81] {
756
+ .control[data-v-1aba7b21] {
741
757
  display: flex;
742
758
  align-items: center;
743
759
  gap: var(--ui-space-2);
744
760
  min-inline-size: 0;
745
761
  }
746
- .field[data-v-aef83c81] {
762
+ .field[data-v-1aba7b21] {
747
763
  flex: 1 1 auto;
748
764
  display: flex;
749
765
  min-inline-size: 0;
@@ -755,14 +771,14 @@ label[data-v-aef83c81] {
755
771
  border-color var(--ui-motion-fast) var(--ui-motion-ease),
756
772
  box-shadow var(--ui-motion-fast) var(--ui-motion-ease);
757
773
  }
758
- .field[data-v-aef83c81]:focus-within {
774
+ .field[data-v-1aba7b21]:focus-within {
759
775
  border-color: var(--ui-control-focus, var(--ui-accent-solid));
760
776
  box-shadow:
761
777
  var(--ui-control-inset),
762
778
  var(--ui-control-focus-halo-shadow);
763
779
  }
764
780
  /* A ghost icon button: the affordance is the mark, not a box around it. */
765
- .help[data-v-aef83c81] {
781
+ .help[data-v-1aba7b21] {
766
782
  flex: none;
767
783
  display: inline-flex;
768
784
  align-items: center;
@@ -779,28 +795,28 @@ label[data-v-aef83c81] {
779
795
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
780
796
  color var(--ui-motion-fast) var(--ui-motion-ease);
781
797
  }
782
- .help[data-v-aef83c81]:hover:enabled,
783
- .help[aria-expanded="true"][data-v-aef83c81] {
798
+ .help[data-v-1aba7b21]:hover:enabled,
799
+ .help[aria-expanded="true"][data-v-1aba7b21] {
784
800
  background: color-mix(in srgb, currentColor 8%, transparent);
785
801
  color: var(--ui-text-primary);
786
802
  }
787
- .help[data-v-aef83c81]:focus-visible {
803
+ .help[data-v-1aba7b21]:focus-visible {
788
804
  outline: none;
789
805
  box-shadow: var(--ui-focus-halo);
790
806
  }
791
- .help[data-v-aef83c81]:disabled {
807
+ .help[data-v-1aba7b21]:disabled {
792
808
  color: var(--ui-disabled-text);
793
809
  cursor: not-allowed;
794
810
  }
795
- .help-icon[data-v-aef83c81] {
811
+ .help-icon[data-v-1aba7b21] {
796
812
  inline-size: var(--ui-icon-size-sm);
797
813
  block-size: var(--ui-icon-size-sm);
798
814
  }
799
- input[data-v-aef83c81]::selection {
815
+ input[data-v-1aba7b21]::selection {
800
816
  background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
801
817
  color: inherit;
802
818
  }
803
- input[data-v-aef83c81] {
819
+ input[data-v-1aba7b21] {
804
820
  appearance: none;
805
821
  width: 100%;
806
822
  min-inline-size: 0;
@@ -816,11 +832,11 @@ input[data-v-aef83c81] {
816
832
  margin: 0;
817
833
  outline: none;
818
834
  }
819
- [data-component~="ui-combobox"][data-ui-combobox-state~="size=sm"] input[data-v-aef83c81] {
835
+ [data-component~="ui-combobox"][data-ui-combobox-state~="size=sm"] input[data-v-1aba7b21] {
820
836
  min-block-size: calc(var(--ui-control-size-sm) - 2px);
821
837
  padding: var(--ui-space-1) var(--ui-space-2);
822
838
  }
823
- button[data-v-aef83c81] {
839
+ button[data-v-1aba7b21] {
824
840
  appearance: none;
825
841
  display: inline-grid;
826
842
  place-items: center;
@@ -835,31 +851,31 @@ button[data-v-aef83c81] {
835
851
  padding: 0 var(--ui-space-1);
836
852
  cursor: pointer;
837
853
  }
838
- .affordance-icon[data-v-aef83c81] {
854
+ .affordance-icon[data-v-1aba7b21] {
839
855
  display: block;
840
856
  inline-size: var(--ui-icon-size-sm);
841
857
  block-size: var(--ui-icon-size-sm);
842
858
  }
843
- button[data-v-aef83c81]:hover:enabled {
859
+ button[data-v-1aba7b21]:hover:enabled {
844
860
  background: var(--ui-surface-muted);
845
861
  color: var(--ui-text-primary);
846
862
  }
847
- button[data-v-aef83c81]:focus-visible {
863
+ button[data-v-1aba7b21]:focus-visible {
848
864
  outline: none;
849
865
  background: var(--ui-surface-muted);
850
866
  box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--ui-focus-ring) 45%, transparent);
851
867
  }
852
- input[data-v-aef83c81]:disabled, button[data-v-aef83c81]:disabled {
868
+ input[data-v-1aba7b21]:disabled, button[data-v-1aba7b21]:disabled {
853
869
  color: var(--ui-text-muted);
854
870
  cursor: not-allowed;
855
871
  }
856
- .field[data-v-aef83c81]:has(input:disabled) {
872
+ .field[data-v-1aba7b21]:has(input:disabled) {
857
873
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
858
874
  }
859
- [data-component~="ui-combobox"][data-ui-combobox-state~="validationStatus=error"] .field[data-v-aef83c81] {
875
+ [data-component~="ui-combobox"][data-ui-combobox-state~="validationStatus=error"] .field[data-v-1aba7b21] {
860
876
  border-color: var(--ui-danger-solid, var(--ui-accent-active));
861
877
  }
862
- .popup[data-v-aef83c81] {
878
+ .popup[data-v-1aba7b21] {
863
879
  box-sizing: border-box;
864
880
  min-inline-size: 12rem;
865
881
  max-inline-size: calc(100vw - 1rem);
@@ -873,40 +889,40 @@ input[data-v-aef83c81]:disabled, button[data-v-aef83c81]:disabled {
873
889
  color: var(--ui-text-primary);
874
890
  box-shadow: var(--ui-elevation-overlay, var(--ui-shadow-lg));
875
891
  }
876
- [hidden][data-v-aef83c81] {
892
+ [hidden][data-v-1aba7b21] {
877
893
  display: none;
878
894
  }
879
- .option[data-v-aef83c81] {
895
+ .option[data-v-1aba7b21] {
880
896
  padding: var(--ui-space-2) var(--ui-space-3);
881
897
  border-radius: var(--ui-radius-sm);
882
898
  cursor: pointer;
883
899
  overflow-wrap: anywhere;
884
900
  }
885
- .option[data-v-aef83c81]:hover, .option.active[data-v-aef83c81] {
901
+ .option[data-v-1aba7b21]:hover, .option.active[data-v-1aba7b21] {
886
902
  background: var(--ui-surface-muted);
887
903
  outline: 1px solid var(--ui-focus-ring);
888
904
  outline-offset: -1px;
889
905
  }
890
- .option[aria-disabled="true"][data-v-aef83c81] {
906
+ .option[aria-disabled="true"][data-v-1aba7b21] {
891
907
  color: var(--ui-text-muted);
892
908
  cursor: not-allowed;
893
909
  }
894
- .primary[data-v-aef83c81] {
910
+ .primary[data-v-1aba7b21] {
895
911
  display: block;
896
912
  color: var(--ui-combobox-option-text, var(--ui-text-primary));
897
913
  font-weight: 500;
898
914
  }
899
- .message[data-v-aef83c81], .group[data-v-aef83c81] {
915
+ .message[data-v-1aba7b21], .group[data-v-1aba7b21] {
900
916
  color: var(--ui-combobox-message-text, var(--ui-text-secondary));
901
917
  font-weight: 400;
902
918
  font-size: var(--ui-font-size-sm);
903
919
  line-height: var(--ui-line-height-md);
904
920
  overflow-wrap: anywhere;
905
921
  }
906
- .group[data-v-aef83c81], .popup .message[data-v-aef83c81] {
922
+ .group[data-v-1aba7b21], .popup .message[data-v-1aba7b21] {
907
923
  padding: var(--ui-space-2) var(--ui-space-3);
908
924
  }
909
- .sr-only[data-v-aef83c81] {
925
+ .sr-only[data-v-1aba7b21] {
910
926
  position: absolute;
911
927
  inline-size: 1px;
912
928
  block-size: 1px;
@@ -915,35 +931,67 @@ input[data-v-aef83c81]:disabled, button[data-v-aef83c81]:disabled {
915
931
  white-space: nowrap;
916
932
  }
917
933
  @media (pointer: coarse) {
918
- button[data-v-aef83c81] {
934
+ button[data-v-1aba7b21] {
919
935
  min-inline-size: 2.75rem;
920
936
  min-block-size: 2.75rem;
921
937
  }
922
938
  }
923
939
  @media (forced-colors: active) {
924
- .field[data-v-aef83c81], .popup[data-v-aef83c81] {
940
+ .field[data-v-1aba7b21], .popup[data-v-1aba7b21] {
925
941
  border-color: CanvasText;
926
942
  }
927
- .option.active[data-v-aef83c81] {
943
+ .option.active[data-v-1aba7b21] {
928
944
  outline-color: Highlight;
929
945
  }
930
946
  }
931
947
 
948
+ /* Multiple mode: every option carries a checkbox, so a list that takes several answers says so
949
+ before anything is picked. aria-selected is the state; this draws it.
950
+ Longhands, not shorthands: lowering drops a shorthand that omits a component. */
951
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .option[data-v-1aba7b21] {
952
+ display: flex;
953
+ gap: var(--ui-space-2);
954
+ align-items: center;
955
+ }
956
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .option[data-v-1aba7b21]::before {
957
+ content: "";
958
+ flex: none;
959
+ inline-size: 1.125rem;
960
+ block-size: 1.125rem;
961
+ border-style: solid;
962
+ border-width: 1px;
963
+ border-color: var(--ui-control-border-hover, var(--ui-border-strong));
964
+ border-radius: var(--ui-radius-sm);
965
+ background-color: var(--ui-control-surface, var(--ui-surface-default));
966
+ background-repeat: no-repeat;
967
+ background-position: center;
968
+ background-size: 0.7rem;
969
+ }
970
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"]
971
+ .option[aria-selected="true"][data-v-1aba7b21]::before {
972
+ border-color: var(--ui-accent-solid);
973
+ background-color: var(--ui-accent-solid);
974
+ background-image: var(
975
+ --ui-combobox-option-check,
976
+ url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m5 12 5 5 9-9'/%3E%3C/svg%3E")
977
+ );
978
+ }
979
+
932
980
  /* Multiple mode: chips wrap before the cursor on one flexible field line. */
933
- [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .field[data-v-aef83c81] {
981
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] .field[data-v-1aba7b21] {
934
982
  flex-wrap: wrap;
935
983
  align-items: center;
936
984
  gap: var(--ui-space-1);
937
985
  min-block-size: var(--ui-combobox-item-min-block-size, 2.5rem);
938
986
  padding: var(--ui-space-1);
939
987
  }
940
- [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] input[data-v-aef83c81] {
988
+ [data-component~="ui-combobox"][data-ui-combobox-state~="multiple"] input[data-v-1aba7b21] {
941
989
  flex: 1 0 var(--ui-combobox-item-input-min-inline-size, 5rem);
942
990
  width: auto;
943
991
  min-block-size: 1.75rem;
944
992
  padding: var(--ui-space-0-5) var(--ui-space-1);
945
993
  }
946
- .item[data-v-aef83c81] {
994
+ .item[data-v-1aba7b21] {
947
995
  appearance: none;
948
996
  display: inline-flex;
949
997
  min-inline-size: 0;
@@ -957,16 +1005,16 @@ button[data-v-aef83c81] {
957
1005
  font: inherit;
958
1006
  cursor: default;
959
1007
  }
960
- .item[data-v-aef83c81]:focus-visible {
1008
+ .item[data-v-1aba7b21]:focus-visible {
961
1009
  outline: 2px solid var(--ui-focus-ring);
962
1010
  outline-offset: 1px;
963
1011
  }
964
- .item[data-v-aef83c81]:disabled {
1012
+ .item[data-v-1aba7b21]:disabled {
965
1013
  opacity: 0.6;
966
1014
  }
967
1015
 
968
1016
  /* A component that sets its display still honours the hidden attribute on its root. */
969
- [data-component~="ui-combobox"][hidden][data-v-aef83c81] {
1017
+ [data-component~="ui-combobox"][hidden][data-v-1aba7b21] {
970
1018
  display: none;
971
1019
  }
972
1020
 
@@ -3258,7 +3306,7 @@ dialog[data-v-d27d0d8a] {
3258
3306
  display: none;
3259
3307
  }
3260
3308
 
3261
- [data-component~="ui-select"][data-v-d36968b7] {
3309
+ [data-component~="ui-select"][data-v-2a885e02] {
3262
3310
  box-sizing: border-box;
3263
3311
  display: inline-block;
3264
3312
  inline-size: 100%;
@@ -3280,9 +3328,9 @@ dialog[data-v-d27d0d8a] {
3280
3328
  background-color var(--ui-motion-fast) var(--ui-motion-ease);
3281
3329
  }
3282
3330
 
3283
- /* Single selects draw their own chevron: the native caret cannot be inset or sized consistently.
3331
+ /* The select draws its own chevron: the native caret cannot be inset or sized consistently.
3284
3332
  * The root stays a native <s-lect>, so the icon is a background image rather than an element. */
3285
- [data-component~="ui-select"][data-v-d36968b7]:not([multiple]) {
3333
+ [data-component~="ui-select"][data-v-2a885e02] {
3286
3334
  appearance: none;
3287
3335
  padding-inline-end: calc(var(--ui-space-3) + 1.5rem);
3288
3336
  background-image: var(
@@ -3293,10 +3341,10 @@ dialog[data-v-d27d0d8a] {
3293
3341
  background-position: right var(--ui-space-3) center;
3294
3342
  background-size: 1.125rem 1.125rem;
3295
3343
  }
3296
- [data-component~="ui-select"][data-v-d36968b7]:hover:not(:focus):not(:disabled) {
3344
+ [data-component~="ui-select"][data-v-2a885e02]:hover:not(:focus):not(:disabled) {
3297
3345
  border-color: var(--ui-control-border-hover, var(--ui-text-secondary));
3298
3346
  }
3299
- [data-component~="ui-select"][data-v-d36968b7]:focus-visible {
3347
+ [data-component~="ui-select"][data-v-2a885e02]:focus-visible {
3300
3348
  border-color: var(--ui-control-focus, var(--ui-accent-solid));
3301
3349
  outline: none;
3302
3350
  box-shadow: var(
@@ -3307,29 +3355,28 @@ dialog[data-v-d27d0d8a] {
3307
3355
  }
3308
3356
 
3309
3357
  /* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
3310
- [data-component~="ui-select"][aria-invalid="true"][data-v-d36968b7],
3311
- [data-component~="ui-select"][data-v-d36968b7]:is(:user-invalid, [data-user-invalid]) {
3358
+ [data-component~="ui-select"][aria-invalid="true"][data-v-2a885e02],
3359
+ [data-component~="ui-select"][data-v-2a885e02]:is(:user-invalid, [data-user-invalid]) {
3312
3360
  border-color: var(--ui-danger-solid);
3313
3361
  }
3314
- [data-component~="ui-select"][data-v-d36968b7]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
3362
+ [data-component~="ui-select"][data-v-2a885e02]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
3315
3363
  box-shadow:
3316
3364
  var(--ui-control-inset),
3317
3365
  0 0 0 3px color-mix(in srgb, var(--ui-danger-solid) 22%, transparent);
3318
3366
  }
3319
- [data-component~="ui-select"][data-v-d36968b7]:disabled {
3367
+ [data-component~="ui-select"][data-v-2a885e02]:disabled {
3320
3368
  background-color: var(--ui-control-surface-disabled, var(--ui-surface-muted));
3321
3369
  color: var(--ui-text-muted);
3322
3370
  box-shadow: none;
3323
3371
  cursor: not-allowed;
3324
3372
  }
3325
- [data-component~="ui-select"][multiple][data-v-d36968b7],
3326
- [data-component~="ui-select"][size][data-v-d36968b7]:not([size="1"]) {
3373
+ [data-component~="ui-select"][size][data-v-2a885e02]:not([size="1"]) {
3327
3374
  min-block-size: 7rem;
3328
3375
  padding: var(--ui-space-2);
3329
3376
  }
3330
3377
 
3331
3378
  /* A component that sets its display still honours the hidden attribute on its root. */
3332
- [data-component~="ui-select"][hidden][data-v-d36968b7] {
3379
+ [data-component~="ui-select"][hidden][data-v-2a885e02] {
3333
3380
  display: none;
3334
3381
  }
3335
3382