@threadlabs/looma 0.26.1 → 0.26.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.
Files changed (39) hide show
  1. package/components/ui-avatar/ui-avatar.html +6 -1
  2. package/components/ui-badge/ui-badge.html +101 -12
  3. package/components/ui-container/ui-container.html +11 -0
  4. package/components/ui-icon-button/ui-icon-button.html +58 -12
  5. package/components/ui-list-item/ui-list-item.html +13 -0
  6. package/dist/index.js +1 -1
  7. package/package.json +1 -1
  8. package/styles/ui-avatar.css +4 -0
  9. package/styles/ui-badge.css +107 -8
  10. package/styles/ui-container.css +8 -0
  11. package/styles/ui-icon-button.css +62 -12
  12. package/styles/ui-list-item.css +12 -0
  13. package/vanilla/UiBadge.d.ts +3 -3
  14. package/vanilla/UiBadge.js +1 -1
  15. package/vanilla/UiContainer.d.ts +1 -0
  16. package/vanilla/UiContainer.js +5 -5
  17. package/vanilla/UiIconButton.d.ts +1 -0
  18. package/vanilla/UiIconButton.js +4 -4
  19. package/vanilla/UiListItem.d.ts +1 -0
  20. package/vanilla/UiListItem.js +6 -6
  21. package/vue/UiAvatar.vue +6 -1
  22. package/vue/UiBadge.d.ts +9 -9
  23. package/vue/UiBadge.vue +123 -21
  24. package/vue/UiCard.d.ts +1 -1
  25. package/vue/UiContainer.d.ts +9 -0
  26. package/vue/UiContainer.vue +27 -1
  27. package/vue/UiIconButton.d.ts +9 -0
  28. package/vue/UiIconButton.vue +95 -12
  29. package/vue/UiListItem.d.ts +9 -0
  30. package/vue/UiListItem.vue +31 -0
  31. package/vue/UiPopover.d.ts +1 -1
  32. package/vue/UiScrollArea.d.ts +1 -1
  33. package/vue/UiTooltip.d.ts +1 -1
  34. package/vue/chunks/UiAvatar.js +2 -2
  35. package/vue/chunks/UiBadge.js +13 -7
  36. package/vue/chunks/UiContainer.js +23 -1
  37. package/vue/chunks/UiIconButton.js +25 -1
  38. package/vue/chunks/UiListItem.js +26 -2
  39. package/vue/components.css +319 -147
@@ -134,7 +134,7 @@ svg[data-v-abaeb064] {
134
134
  syntax: "*";
135
135
  inherits: false;
136
136
  }
137
- [data-component~="ui-avatar"][data-v-8b3c5fb3] {
137
+ [data-component~="ui-avatar"][data-v-03720dc1] {
138
138
  --_ui-default-icon-size: 1.25rem;
139
139
  display: inline-grid;
140
140
  place-items: center;
@@ -156,13 +156,13 @@ svg[data-v-abaeb064] {
156
156
  line-height: 1;
157
157
  text-transform: uppercase;
158
158
  }
159
- [data-component~="ui-avatar"][data-ui-avatar-state~="size=sm"][data-v-8b3c5fb3] {
159
+ [data-component~="ui-avatar"][data-ui-avatar-state~="size=sm"][data-v-03720dc1] {
160
160
  --_ui-default-icon-size: 1rem;
161
161
  inline-size: 1.75rem;
162
162
  block-size: 1.75rem;
163
163
  font-size: var(--ui-font-size-xs);
164
164
  }
165
- [data-component~="ui-avatar"][data-ui-avatar-state~="size=xs"][data-v-8b3c5fb3] {
165
+ [data-component~="ui-avatar"][data-ui-avatar-state~="size=xs"][data-v-03720dc1] {
166
166
  --_ui-default-icon-size: 0.75rem;
167
167
  inline-size: 1.25rem;
168
168
  block-size: 1.25rem;
@@ -170,26 +170,29 @@ svg[data-v-abaeb064] {
170
170
  font-size: calc(var(--ui-font-size) * 0.5625);
171
171
  letter-spacing: 0.02em;
172
172
  }
173
- [data-component~="ui-avatar"][data-ui-avatar-state~="hasImage"][data-v-8b3c5fb3] {
173
+ [data-component~="ui-avatar"][data-ui-avatar-state~="hasImage"][data-v-03720dc1] {
174
174
  border-color: var(--ui-avatar-border, var(--ui-border-strong));
175
175
  }
176
- [data-component~="ui-avatar"][data-ui-avatar-state~="shape=square"][data-v-8b3c5fb3] {
176
+ [data-component~="ui-avatar"][data-ui-avatar-state~="shape=circle"][data-v-03720dc1] {
177
+ box-shadow: var(--ui-shadow-sm);
178
+ }
179
+ [data-component~="ui-avatar"][data-ui-avatar-state~="shape=square"][data-v-03720dc1] {
177
180
  border-radius: var(--ui-avatar-radius, var(--ui-radius-md));
178
181
  }
179
182
 
180
183
  /* An outline, not a dot: the avatar clips its content to the circle, and an outline is drawn
181
184
  outside the box, so the ring survives the clip and the overlap in an Avatar Group. */
182
- [data-component~="ui-avatar"][data-ui-avatar-state~="active"][data-v-8b3c5fb3] {
185
+ [data-component~="ui-avatar"][data-ui-avatar-state~="active"][data-v-03720dc1] {
183
186
  outline: var(--ui-border-width) solid var(--ui-avatar-active-ring, var(--ui-accent-solid));
184
187
  outline-offset: var(--ui-border-width);
185
188
  }
186
- .image[data-v-8b3c5fb3],img[data-v-8b3c5fb3-s] {
189
+ .image[data-v-03720dc1],img[data-v-03720dc1-s] {
187
190
  grid-area: 1 / 1;
188
191
  inline-size: 100%;
189
192
  block-size: 100%;
190
193
  object-fit: cover;
191
194
  }
192
- .fallback[data-v-8b3c5fb3] {
195
+ .fallback[data-v-03720dc1] {
193
196
  grid-area: 1 / 1;
194
197
  display: inline-flex;
195
198
  align-items: center;
@@ -202,7 +205,7 @@ svg[data-v-abaeb064] {
202
205
  /* Centre the glyphs, not the line box: a label without descenders otherwise reads high.
203
206
  * Trimming applies to block containers, so the box is a block with centred content. */
204
207
  @supports (text-box-trim: trim-both) {
205
- .fallback[data-v-8b3c5fb3] {
208
+ .fallback[data-v-03720dc1] {
206
209
  display: block;
207
210
  text-align: center;
208
211
  align-content: center;
@@ -210,12 +213,12 @@ svg[data-v-abaeb064] {
210
213
  text-box-edge: cap alphabetic;
211
214
  }
212
215
  }
213
- [hidden][data-v-8b3c5fb3] {
216
+ [hidden][data-v-03720dc1] {
214
217
  display: none;
215
218
  }
216
219
 
217
220
  /* A component that sets its display still honours the hidden attribute on its root. */
218
- [data-component~="ui-avatar"][hidden][data-v-8b3c5fb3] {
221
+ [data-component~="ui-avatar"][hidden][data-v-03720dc1] {
219
222
  display: none;
220
223
  }
221
224
 
@@ -305,6 +308,10 @@ svg[data-v-abaeb064] {
305
308
  syntax: "*";
306
309
  inherits: false;
307
310
  }
311
+ @property --ui-badge-circle-size {
312
+ syntax: "*";
313
+ inherits: false;
314
+ }
308
315
  @property --ui-badge-dot-size {
309
316
  syntax: "*";
310
317
  inherits: false;
@@ -349,7 +356,7 @@ svg[data-v-abaeb064] {
349
356
  syntax: "*";
350
357
  inherits: false;
351
358
  }
352
- [data-component~="ui-badge"][data-v-a45f2b52] {
359
+ [data-component~="ui-badge"][data-v-4d2f1396] {
353
360
  --_badge-surface: color-mix(in srgb, var(--ui-surface-subtle) 80%, var(--ui-surface-default));
354
361
  --_badge-text: var(--ui-text-secondary);
355
362
  /* Sit between the soft fill and its stronger theme ink. */
@@ -395,27 +402,27 @@ svg[data-v-abaeb064] {
395
402
 
396
403
  /* A constrained badge keeps its surface intact and ellipsizes only its label. The full
397
404
  text stays in the DOM for accessible names and consumers' selected values. */
398
- .label[data-v-a45f2b52] {
405
+ .label[data-v-4d2f1396] {
399
406
  display: block;
400
407
  min-inline-size: 0;
401
408
  overflow: hidden;
402
409
  text-overflow: ellipsis;
403
410
  }
404
- .label[data-v-a45f2b52]:empty {
411
+ .label[data-v-4d2f1396]:empty {
405
412
  display: none;
406
413
  }
407
414
 
408
415
  /* Icon content has its own flex item so label ellipsis never clips its strokes. */
409
- .icon[data-v-a45f2b52] {
416
+ .icon[data-v-4d2f1396] {
410
417
  display: inline-flex;
411
418
  align-items: center;
412
419
  justify-content: center;
413
420
  flex: none;
414
421
  }
415
- .icon[data-v-a45f2b52]:empty {
422
+ .icon[data-v-4d2f1396]:empty {
416
423
  display: none;
417
424
  }
418
- .icon svg[data-v-a45f2b52-s] {
425
+ .icon svg[data-v-4d2f1396-s] {
419
426
  display: block;
420
427
  inline-size: 1em;
421
428
  block-size: 1em;
@@ -423,38 +430,39 @@ svg[data-v-abaeb064] {
423
430
  }
424
431
 
425
432
  /* Ordinary icon-plus-text children keep inline ellipsis, with explicit glyph spacing. */
426
- .label svg[data-v-a45f2b52-s] {
433
+ .label svg[data-v-4d2f1396-s] {
427
434
  inline-size: 1em;
428
435
  block-size: 1em;
429
436
  vertical-align: middle;
430
437
  margin-inline-end: var(--ui-space-1);
431
438
  }
432
- .label[data-v-a45f2b52]:has(svg) {
439
+ .label[data-v-4d2f1396]:has(svg) {
433
440
  text-box-trim: none;
434
441
  }
435
442
 
436
- /* Text-only badges retain their trimmed inline baseline. Icon content needs a flex row;
437
- trimming its label separately keeps the glyph centered without changing adjacent lines. */
443
+ /* Center the capital/baseline text box, while clipping only inline overflow for ellipsis.
444
+ Vertical ink remains visible so trimming never cuts off ascenders or descenders. */
438
445
  @supports (text-box-trim: trim-both) {
439
- [data-component~="ui-badge"][data-v-a45f2b52] {
446
+ [data-component~="ui-badge"][data-v-4d2f1396] {
440
447
  display: inline-block;
441
448
  min-block-size: var(--ui-badge-min-block-size, 1.5rem);
442
449
  text-align: center;
443
450
  align-content: center;
444
- text-box-trim: trim-both;
445
- text-box-edge: text;
451
+ text-box-trim: none;
446
452
  }
447
- [data-component~="ui-badge"][data-v-a45f2b52]:has(.icon:not(:empty)),
448
- [data-component~="ui-badge"][data-v-a45f2b52]:has(.label svg) {
453
+ [data-component~="ui-badge"][data-v-4d2f1396]:has(.icon:not(:empty)),
454
+ [data-component~="ui-badge"][data-v-4d2f1396]:has(.label svg) {
449
455
  display: inline-flex;
450
456
  text-box-trim: none;
451
457
  }
452
- [data-component~="ui-badge"]:has(.icon:not(:empty)) .label[data-v-a45f2b52] {
458
+ .label[data-v-4d2f1396]:not(:has(svg)) {
453
459
  text-box-trim: trim-both;
454
- text-box-edge: text;
460
+ text-box-edge: cap alphabetic;
461
+ overflow-x: clip;
462
+ overflow-y: visible;
455
463
  }
456
464
  }
457
- [data-component~="ui-badge"][data-ui-badge-state~="size=xs"][data-v-a45f2b52] {
465
+ [data-component~="ui-badge"][data-ui-badge-state~="size=xs"][data-v-4d2f1396] {
458
466
  box-sizing: border-box;
459
467
  min-inline-size: 1rem;
460
468
  min-block-size: var(--ui-badge-min-block-size, 1rem);
@@ -462,52 +470,52 @@ svg[data-v-abaeb064] {
462
470
  font-size: var(--ui-badge-font-size, var(--ui-font-size-2xs));
463
471
  line-height: var(--ui-badge-line-height, 1);
464
472
  }
465
- [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"][data-v-a45f2b52] {
473
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"][data-v-4d2f1396] {
466
474
  --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
467
475
  --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
468
476
  --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
469
477
  }
470
- [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"][data-v-a45f2b52] {
478
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"][data-v-4d2f1396] {
471
479
  --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
472
480
  --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
473
481
  --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
474
482
  }
475
- [data-component~="ui-badge"][data-ui-badge-state~="tone=success"][data-v-a45f2b52] {
483
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=success"][data-v-4d2f1396] {
476
484
  --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
477
485
  --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
478
486
  --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
479
487
  }
480
- [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"][data-v-a45f2b52] {
488
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"][data-v-4d2f1396] {
481
489
  --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
482
490
  --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
483
491
  --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
484
492
  }
485
- [data-component~="ui-badge"][data-ui-badge-state~="tone=info"][data-v-a45f2b52] {
493
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=info"][data-v-4d2f1396] {
486
494
  --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
487
495
  --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
488
496
  --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
489
497
  }
490
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"][data-v-a45f2b52] {
498
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"][data-v-4d2f1396] {
491
499
  --_badge-surface: color-mix(in srgb, var(--ui-accent-solid) 19%, var(--ui-surface-default));
492
500
  --_badge-border: color-mix(in srgb, var(--ui-accent-solid) 25%, var(--ui-surface-default));
493
501
  --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
494
502
  }
495
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"][data-v-a45f2b52] {
503
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"][data-v-4d2f1396] {
496
504
  --_badge-surface: color-mix(in srgb, var(--ui-danger-solid) 19%, var(--ui-surface-default));
497
505
  --_badge-border: color-mix(in srgb, var(--ui-danger-solid) 25%, var(--ui-surface-default));
498
506
  --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
499
507
  }
500
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"][data-v-a45f2b52] {
508
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"][data-v-4d2f1396] {
501
509
  --_badge-surface: color-mix(in srgb, var(--ui-success-solid) 19%, var(--ui-surface-default));
502
510
  --_badge-border: color-mix(in srgb, var(--ui-success-solid) 25%, var(--ui-surface-default));
503
511
  --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
504
512
  }
505
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"][data-v-a45f2b52] {
513
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"][data-v-4d2f1396] {
506
514
  --_badge-surface: color-mix(in srgb, var(--ui-warning-solid) 19%, var(--ui-surface-default));
507
515
  --_badge-border: color-mix(in srgb, var(--ui-warning-solid) 25%, var(--ui-surface-default));
508
516
  --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
509
517
  }
510
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"][data-v-a45f2b52] {
518
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"][data-v-4d2f1396] {
511
519
  --_badge-surface: color-mix(in srgb, var(--ui-info-solid) 19%, var(--ui-surface-default));
512
520
  --_badge-border: color-mix(in srgb, var(--ui-info-solid) 25%, var(--ui-surface-default));
513
521
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
@@ -515,12 +523,47 @@ svg[data-v-abaeb064] {
515
523
 
516
524
  /* A solid colour fills with the ink. Its text is the page surface, mixed at 0% only so that it too is
517
525
  invalid while the hook is unset. */
518
- [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"][data-v-a45f2b52] {
526
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"][data-v-4d2f1396] {
519
527
  --_badge-color-surface: var(--_badge-color-ink);
520
528
  --_badge-color-border: var(--_badge-color-ink);
521
529
  --_badge-color-text: color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default));
522
530
  }
523
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-v-a45f2b52] {
531
+
532
+ /* A translucent inverse surface picks up its filled control's tone. Deepen the tone ink
533
+ toward the theme text to retain contrast against that composed surface. */
534
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=inverse"][data-v-4d2f1396] {
535
+ --_badge-color-surface: color-mix(
536
+ in srgb,
537
+ color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default)) 88%,
538
+ transparent
539
+ );
540
+ --_badge-color-border: var(--_badge-color-surface);
541
+ --_badge-color-text: color-mix(in srgb, var(--_badge-color-ink) 85%, var(--ui-text-primary));
542
+ --_badge-outline-surface: var(
543
+ --ui-badge-surface,
544
+ var(--_badge-color-surface, color-mix(in srgb, var(--_badge-text) 88%, transparent))
545
+ );
546
+ border-color: var(
547
+ --ui-badge-border,
548
+ var(--_badge-color-border, color-mix(in srgb, var(--_badge-text) 88%, transparent))
549
+ );
550
+ color: var(
551
+ --ui-badge-text,
552
+ var(--_badge-color-text, color-mix(in srgb, var(--_badge-surface) 85%, var(--ui-text-primary)))
553
+ );
554
+ /* Paint each translucent layer once, including the border, without a bright double-painted ring. */
555
+ background-clip: padding-box;
556
+ }
557
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="shape=circle"][data-v-4d2f1396] {
558
+ box-shadow: var(--ui-shadow-sm);
559
+ }
560
+
561
+ /* Neutral reverses a subtle surface/ink pair rather than a strong tone. Keep its original
562
+ surface ink: moving it toward dark-theme primary text would reduce overlay contrast. */
563
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=inverse"][data-ui-badge-state~="tone=neutral"][data-v-4d2f1396] {
564
+ color: var(--ui-badge-text, var(--_badge-color-text, var(--_badge-surface)));
565
+ }
566
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-v-4d2f1396] {
524
567
  --_badge-surface: var(--ui-surface-default);
525
568
  --_badge-border: var(--ui-border-strong);
526
569
  --_badge-text: var(--ui-text-secondary);
@@ -528,29 +571,29 @@ svg[data-v-abaeb064] {
528
571
  --_badge-color-surface: initial;
529
572
  --_badge-color-border: var(--_badge-color-ink);
530
573
  }
531
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"][data-v-a45f2b52] {
574
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"][data-v-4d2f1396] {
532
575
  --_badge-border: var(--ui-accent-solid);
533
576
  --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
534
577
  }
535
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"][data-v-a45f2b52] {
578
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"][data-v-4d2f1396] {
536
579
  --_badge-border: var(--ui-danger-solid);
537
580
  --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
538
581
  }
539
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"][data-v-a45f2b52] {
582
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"][data-v-4d2f1396] {
540
583
  --_badge-border: var(--ui-success-solid);
541
584
  --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
542
585
  }
543
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"][data-v-a45f2b52] {
586
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"][data-v-4d2f1396] {
544
587
  --_badge-border: var(--ui-warning-solid);
545
588
  --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
546
589
  }
547
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"][data-v-a45f2b52] {
590
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"][data-v-4d2f1396] {
548
591
  --_badge-border: var(--ui-info-solid);
549
592
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
550
593
  }
551
594
 
552
595
  /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
553
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-v-a45f2b52] {
596
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-v-4d2f1396] {
554
597
  --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-4) * 2));
555
598
  display: inline-flex;
556
599
  box-sizing: border-box;
@@ -563,23 +606,74 @@ svg[data-v-abaeb064] {
563
606
  border-radius: var(--ui-radius-md);
564
607
  text-box-trim: none;
565
608
  }
566
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"][data-v-a45f2b52] {
609
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"][data-v-4d2f1396] {
567
610
  --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-3) * 2));
568
611
  }
569
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-a45f2b52] {
612
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=lg"][data-v-4d2f1396] {
613
+ --_badge-square-size: var(
614
+ --ui-badge-square-size,
615
+ calc(var(--ui-space-4) * 2 + var(--ui-space-2))
616
+ );
617
+ }
618
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-4d2f1396] {
570
619
  display: inline-flex;
571
620
  align-items: center;
572
621
  justify-content: center;
573
622
  }
574
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label svg[data-v-a45f2b52-s] {
623
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label svg[data-v-4d2f1396-s] {
575
624
  margin-inline-end: 0;
576
625
  }
577
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-a45f2b52]:empty {
626
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-4d2f1396]:empty {
578
627
  display: none;
579
628
  }
580
629
 
630
+ /* A visible glyph needs fixed geometry, unlike a content-sized pill or a hidden-label dot. */
631
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"][data-v-4d2f1396] {
632
+ --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-3) * 2));
633
+ display: inline-flex;
634
+ flex: none;
635
+ inline-size: var(--_badge-circle-size);
636
+ block-size: var(--_badge-circle-size);
637
+ min-inline-size: var(--_badge-circle-size);
638
+ min-block-size: var(--_badge-circle-size);
639
+ padding: 0;
640
+ border-radius: var(--ui-radius-round);
641
+ text-box-trim: none;
642
+ }
643
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=xs"][data-v-4d2f1396] {
644
+ --_badge-circle-size: var(--ui-badge-circle-size, var(--ui-space-4));
645
+ }
646
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"][data-ui-badge-state~="size=lg"][data-v-4d2f1396] {
647
+ --_badge-circle-size: var(--ui-badge-circle-size, calc(var(--ui-space-4) * 2));
648
+ }
649
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label[data-v-4d2f1396] {
650
+ display: inline-flex;
651
+ align-items: center;
652
+ justify-content: center;
653
+ line-height: 1;
654
+ text-box-trim: none;
655
+ }
656
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label svg[data-v-4d2f1396-s] {
657
+ margin-inline-end: 0;
658
+ }
659
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label[data-v-4d2f1396]:empty {
660
+ display: none;
661
+ }
662
+
663
+ /* Center capital and numeral ink, rather than the font's ascent/descent line box.
664
+ Icon labels retain flex geometry; untrimmed browsers keep that fallback too. */
665
+ @supports (text-box-trim: trim-both) {
666
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=circle"] .label[data-v-4d2f1396]:not(:has(svg)),
667
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-4d2f1396]:not(:has(svg)) {
668
+ display: block;
669
+ text-box-trim: trim-both;
670
+ text-box-edge: cap alphabetic;
671
+ overflow: visible;
672
+ }
673
+ }
674
+
581
675
  /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
582
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-a45f2b52] {
676
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-4d2f1396] {
583
677
  position: relative;
584
678
  box-sizing: border-box;
585
679
  flex: none;
@@ -591,7 +685,7 @@ svg[data-v-abaeb064] {
591
685
  border-radius: var(--ui-radius-round);
592
686
  text-box-trim: none;
593
687
  }
594
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] .label[data-v-a45f2b52] {
688
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] .label[data-v-4d2f1396] {
595
689
  position: absolute;
596
690
  inline-size: 1px;
597
691
  block-size: 1px;
@@ -602,7 +696,7 @@ svg[data-v-abaeb064] {
602
696
 
603
697
  /* The clipped point needs an inset surface over an outer border-colour shape: a native border
604
698
  has no diagonal edge to follow. Keep this edge for every tag variant. */
605
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-a45f2b52] {
699
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-4d2f1396] {
606
700
  --_badge-point: var(--ui-badge-point, var(--ui-space-2));
607
701
 
608
702
  position: relative;
@@ -619,7 +713,7 @@ svg[data-v-abaeb064] {
619
713
  0 100%
620
714
  );
621
715
  }
622
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-a45f2b52]::before {
716
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-4d2f1396]::before {
623
717
  content: "";
624
718
  position: absolute;
625
719
  inset: 0;
@@ -634,34 +728,37 @@ svg[data-v-abaeb064] {
634
728
  );
635
729
  pointer-events: none;
636
730
  }
637
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-a45f2b52]:dir(rtl) {
731
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-ui-badge-state~="variant=inverse"][data-v-4d2f1396] {
732
+ background: var(--ui-badge-border, var(--_badge-color-border, var(--_badge-text)));
733
+ }
734
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-4d2f1396]:dir(rtl) {
638
735
  padding-inline-end: var(--ui-badge-padding-inline, var(--ui-space-2));
639
736
  padding-inline-start: calc(
640
737
  var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point)
641
738
  );
642
739
  clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
643
740
  }
644
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-a45f2b52]:dir(rtl)::before {
741
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-4d2f1396]:dir(rtl)::before {
645
742
  clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
646
743
  }
647
744
  @media (forced-colors: active) {
648
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-a45f2b52] {
745
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-4d2f1396] {
649
746
  forced-color-adjust: none;
650
747
  border-color: CanvasText;
651
748
  background: CanvasText;
652
749
  }
653
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-a45f2b52] {
750
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-4d2f1396] {
654
751
  forced-color-adjust: none;
655
752
  background: CanvasText;
656
753
  color: CanvasText;
657
754
  }
658
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-a45f2b52]::before {
755
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-4d2f1396]::before {
659
756
  background: Canvas;
660
757
  }
661
758
  }
662
759
 
663
760
  /* A component that sets its display still honours the hidden attribute on its root. */
664
- [data-component~="ui-badge"][hidden][data-v-a45f2b52] {
761
+ [data-component~="ui-badge"][hidden][data-v-4d2f1396] {
665
762
  display: none;
666
763
  }
667
764
 
@@ -2285,7 +2382,7 @@ button[data-v-2be0ffde] {
2285
2382
  syntax: "*";
2286
2383
  inherits: false;
2287
2384
  }
2288
- [data-component~="ui-container"][data-v-955318c7] {
2385
+ [data-component~="ui-container"][data-v-d3919ea4] {
2289
2386
  --_container-measure: 65ch;
2290
2387
  --_container-gutters: var(--ui-space-4);
2291
2388
  display: block;
@@ -2294,24 +2391,32 @@ button[data-v-2be0ffde] {
2294
2391
  margin-inline: auto;
2295
2392
  padding-inline: var(--ui-container-gutters, var(--_container-gutters));
2296
2393
  }
2297
- [data-component~="ui-container"][data-ui-container-state~="measure=narrow"][data-v-955318c7] {
2394
+ [data-component~="ui-container"][data-ui-container-state~="measure=narrow"][data-v-d3919ea4] {
2298
2395
  --_container-measure: 45ch;
2299
2396
  }
2300
- [data-component~="ui-container"][data-ui-container-state~="measure=wide"][data-v-955318c7] {
2397
+ [data-component~="ui-container"][data-ui-container-state~="fill"][data-v-d3919ea4] {
2398
+ box-sizing: border-box;
2399
+ display: flex;
2400
+ flex-direction: column;
2401
+ flex: 1;
2402
+ min-inline-size: 0;
2403
+ min-block-size: 0;
2404
+ }
2405
+ [data-component~="ui-container"][data-ui-container-state~="measure=wide"][data-v-d3919ea4] {
2301
2406
  --_container-measure: 80ch;
2302
2407
  }
2303
- [data-component~="ui-container"][data-ui-container-state~="gutters=s"][data-v-955318c7] {
2408
+ [data-component~="ui-container"][data-ui-container-state~="gutters=s"][data-v-d3919ea4] {
2304
2409
  --_container-gutters: var(--ui-space-3);
2305
2410
  }
2306
- [data-component~="ui-container"][data-ui-container-state~="gutters=m"][data-v-955318c7] {
2411
+ [data-component~="ui-container"][data-ui-container-state~="gutters=m"][data-v-d3919ea4] {
2307
2412
  --_container-gutters: var(--ui-space-4);
2308
2413
  }
2309
- [data-component~="ui-container"][data-ui-container-state~="gutters=l"][data-v-955318c7] {
2414
+ [data-component~="ui-container"][data-ui-container-state~="gutters=l"][data-v-d3919ea4] {
2310
2415
  --_container-gutters: var(--ui-space-5);
2311
2416
  }
2312
2417
 
2313
2418
  /* A component that sets its display still honours the hidden attribute on its root. */
2314
- [data-component~="ui-container"][hidden][data-v-955318c7] {
2419
+ [data-component~="ui-container"][hidden][data-v-d3919ea4] {
2315
2420
  display: none;
2316
2421
  }
2317
2422
 
@@ -4694,7 +4799,7 @@ svg[data-v-955cfa65-s] {
4694
4799
  syntax: "*";
4695
4800
  inherits: false;
4696
4801
  }
4697
- [data-component~="ui-icon-button"][data-v-cb9aaf03] {
4802
+ [data-component~="ui-icon-button"][data-v-b66a1661] {
4698
4803
  /* Hooks do not inherit, so the parts below read them from the root. */
4699
4804
  --_ui-icon-button-icon-size: var(--ui-icon-button-icon-size);
4700
4805
  --_ui-icon-button-icon-stroke-width: var(--ui-icon-button-icon-stroke-width);
@@ -4702,10 +4807,28 @@ svg[data-v-955cfa65-s] {
4702
4807
  display: inline-flex;
4703
4808
  color: var(--ui-text-secondary);
4704
4809
  }
4705
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-cb9aaf03] {
4810
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="tone=accent"][data-v-b66a1661] {
4811
+ --_icon-button-border: var(--ui-accent-solid);
4812
+ --_icon-button-hover-border: var(--ui-accent-hover);
4813
+ --_icon-button-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
4814
+ --_icon-button-outline-surface: color-mix(
4815
+ in srgb,
4816
+ var(--ui-accent-solid) 5%,
4817
+ var(--ui-surface-default)
4818
+ );
4819
+ color: var(--_icon-button-text);
4820
+ }
4821
+
4822
+ /* Omitted tone retains the existing accent solid; explicit neutral is additive. */
4823
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="tone=neutral"][data-v-b66a1661] {
4824
+ --_icon-button-solid-surface: var(--ui-text-primary);
4825
+ --_icon-button-solid-hover-surface: var(--ui-text-primary);
4826
+ --_icon-button-solid-text: var(--ui-surface-default);
4827
+ }
4828
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-b66a1661] {
4706
4829
  position: relative;
4707
4830
  }
4708
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-cb9aaf03]::before {
4831
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-b66a1661]::before {
4709
4832
  content: "";
4710
4833
  position: absolute;
4711
4834
  inset: 50% auto auto 50%;
@@ -4719,13 +4842,13 @@ svg[data-v-955cfa65-s] {
4719
4842
  transition: opacity var(--ui-affordance-motion, var(--ui-motion-fast)) var(--ui-motion-ease);
4720
4843
  pointer-events: none;
4721
4844
  }
4722
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-cb9aaf03]:disabled::before {
4845
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-b66a1661]:disabled::before {
4723
4846
  opacity: 0;
4724
4847
  }
4725
4848
 
4726
4849
  /* At rest an anticipatory button shows only its guide dot. The icon grows into place when
4727
4850
  proximity, hover, or focus reveals it; the button's hit area and guide remain stable. */
4728
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] .content[data-v-cb9aaf03] {
4851
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] .content[data-v-b66a1661] {
4729
4852
  opacity: 1;
4730
4853
  transform: scale(1);
4731
4854
  transition:
@@ -4733,22 +4856,22 @@ svg[data-v-955cfa65-s] {
4733
4856
  transform calc(var(--ui-motion-fast) * 2) cubic-bezier(0.2, 1.4, 0.35, 1);
4734
4857
  }
4735
4858
  @media (hover: hover) and (pointer: fine) {
4736
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-cb9aaf03]:not([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"], :disabled, [data-ui-proximity="near"], :hover, :focus-visible) {
4859
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-b66a1661]:not([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible) {
4737
4860
  border-color: transparent;
4738
4861
  background-color: transparent;
4739
4862
  box-shadow: none;
4740
4863
  }
4741
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]:not([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"], :disabled, [data-ui-proximity="near"], :hover, :focus-visible)
4742
- .content[data-v-cb9aaf03] {
4864
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"]:not([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"], :disabled, [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)
4865
+ .content[data-v-b66a1661] {
4743
4866
  opacity: 0;
4744
4867
  transform: scale(0.65);
4745
4868
  transition-duration: var(--ui-motion-fast);
4746
4869
  }
4747
4870
  }
4748
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-cb9aaf03]:is([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
4871
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-b66a1661]:is([data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"], [aria-pressed="true"], [data-ui-proximity="near"], :hover, :focus-visible)::before {
4749
4872
  opacity: 0;
4750
4873
  }
4751
- [data-component~="ui-icon-button"][data-v-cb9aaf03] {
4874
+ [data-component~="ui-icon-button"][data-v-b66a1661] {
4752
4875
  /* The size prop resolves here; --ui-icon-button-size overrides it on an element. */
4753
4876
  --_size: 2rem;
4754
4877
  appearance: none;
@@ -4774,7 +4897,7 @@ svg[data-v-955cfa65-s] {
4774
4897
  transform var(--ui-motion-fast) var(--ui-motion-ease);
4775
4898
  }
4776
4899
  @media (hover: none), (pointer: coarse) {
4777
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-cb9aaf03]::before {
4900
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"][data-v-b66a1661]::before {
4778
4901
  opacity: 0;
4779
4902
  }
4780
4903
  }
@@ -4782,10 +4905,10 @@ svg[data-v-955cfa65-s] {
4782
4905
  /* A touch target without a bigger button: an invisible hit area, at least the control
4783
4906
  minimum, centred on the button (::before is the anticipatory guide). */
4784
4907
  @media (pointer: coarse) {
4785
- [data-component~="ui-icon-button"][data-v-cb9aaf03] {
4908
+ [data-component~="ui-icon-button"][data-v-b66a1661] {
4786
4909
  position: relative;
4787
4910
  }
4788
- [data-component~="ui-icon-button"][data-v-cb9aaf03]::after {
4911
+ [data-component~="ui-icon-button"][data-v-b66a1661]::after {
4789
4912
  content: "";
4790
4913
  position: absolute;
4791
4914
  inset: 50% auto auto 50%;
@@ -4794,10 +4917,10 @@ svg[data-v-955cfa65-s] {
4794
4917
  transform: translate(-50%, -50%);
4795
4918
  }
4796
4919
  }
4797
- html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-cb9aaf03] {
4920
+ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-b66a1661] {
4798
4921
  position: relative;
4799
4922
  }
4800
- html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-cb9aaf03]::after {
4923
+ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-b66a1661]::after {
4801
4924
  content: "";
4802
4925
  position: absolute;
4803
4926
  inset: 50% auto auto 50%;
@@ -4805,14 +4928,14 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-c
4805
4928
  block-size: max(100%, var(--ui-control-min-block-size));
4806
4929
  transform: translate(-50%, -50%);
4807
4930
  }
4808
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"][data-v-cb9aaf03] {
4931
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"][data-v-b66a1661] {
4809
4932
  --_size: 1.75rem;
4810
4933
  inline-size: var(--ui-icon-button-size, var(--_size));
4811
4934
  block-size: var(--ui-icon-button-size, var(--_size));
4812
4935
  min-inline-size: var(--ui-icon-button-size, var(--_size));
4813
4936
  min-block-size: var(--ui-icon-button-size, var(--_size));
4814
4937
  }
4815
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"][data-v-cb9aaf03] {
4938
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"][data-v-b66a1661] {
4816
4939
  --_size: 2.5rem;
4817
4940
  inline-size: var(--ui-icon-button-size, var(--_size));
4818
4941
  block-size: var(--ui-icon-button-size, var(--_size));
@@ -4821,19 +4944,19 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-c
4821
4944
  }
4822
4945
 
4823
4946
  /* A text button's companion uses control geometry; compact icon buttons keep their own density. */
4824
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-v-cb9aaf03] {
4947
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-v-b66a1661] {
4825
4948
  --_size: var(--ui-control-size-md);
4826
4949
  block-size: auto;
4827
4950
  align-self: stretch;
4828
4951
  }
4829
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=sm"][data-v-cb9aaf03] {
4952
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=sm"][data-v-b66a1661] {
4830
4953
  --_size: var(--ui-control-size-sm);
4831
4954
  }
4832
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=lg"][data-v-cb9aaf03] {
4955
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-ui-icon-button-state~="size=lg"][data-v-b66a1661] {
4833
4956
  --_size: var(--ui-control-size-lg);
4834
4957
  }
4835
4958
  @media (pointer: coarse) {
4836
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-v-cb9aaf03] {
4959
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="matchButton"][data-v-b66a1661] {
4837
4960
  inline-size: max(var(--ui-icon-button-size, var(--_size)), var(--ui-control-min-block-size));
4838
4961
  min-inline-size: max(
4839
4962
  var(--ui-icon-button-size, var(--_size)),
@@ -4842,77 +4965,117 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-c
4842
4965
  min-block-size: max(var(--ui-icon-button-size, var(--_size)), var(--ui-control-min-block-size));
4843
4966
  }
4844
4967
  }
4845
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="round"][data-v-cb9aaf03] {
4968
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="round"][data-v-b66a1661] {
4846
4969
  border-radius: var(--ui-radius-round);
4847
4970
  }
4848
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][data-v-cb9aaf03] {
4849
- border-color: var(--ui-icon-button-border, var(--ui-control-border, var(--ui-border-strong)));
4850
- background-color: var(--ui-icon-button-outline-surface, var(--ui-surface-default));
4971
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][data-v-b66a1661] {
4972
+ border-color: var(
4973
+ --ui-icon-button-border,
4974
+ var(--_icon-button-border, var(--ui-control-border, var(--ui-border-strong)))
4975
+ );
4976
+ background-color: var(
4977
+ --ui-icon-button-outline-surface,
4978
+ var(--_icon-button-outline-surface, var(--ui-surface-default))
4979
+ );
4851
4980
  background-image: var(--ui-raised-highlight);
4852
- color: var(--ui-icon-button-outline-text, var(--ui-text-primary));
4981
+ color: var(--ui-icon-button-outline-text, var(--_icon-button-text, var(--ui-text-primary)));
4853
4982
  box-shadow: var(--ui-raised);
4854
4983
  }
4855
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-v-cb9aaf03] {
4856
- background-color: var(--ui-icon-button-solid-surface, var(--ui-accent-solid));
4984
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-v-b66a1661] {
4985
+ background-color: var(
4986
+ --ui-icon-button-solid-surface,
4987
+ var(--_icon-button-solid-surface, var(--ui-accent-solid))
4988
+ );
4857
4989
  background-image: var(--ui-raised-highlight);
4858
- color: var(--ui-icon-button-solid-text, var(--ui-text-on-accent));
4990
+ color: var(--ui-icon-button-solid-text, var(--_icon-button-solid-text, var(--ui-text-on-accent)));
4859
4991
  box-shadow: var(
4860
4992
  --ui-icon-button-solid-shadow,
4861
4993
  0 1px 2px color-mix(in srgb, var(--ui-accent-solid) 18%, transparent)
4862
4994
  );
4863
4995
  }
4864
- [data-component~="ui-icon-button"][data-v-cb9aaf03]:hover:enabled:not([aria-disabled="true"]) {
4996
+ [data-component~="ui-icon-button"][data-v-b66a1661]:hover:enabled:not([aria-disabled="true"]) {
4865
4997
  /* Derived from the text colour so the ghost hover shows on any background. */
4866
4998
  background-color: var(
4867
4999
  --ui-icon-button-hover-surface,
4868
5000
  color-mix(in srgb, currentColor 8%, transparent)
4869
5001
  );
4870
- color: var(--ui-icon-button-hover-text, var(--ui-text-primary));
5002
+ color: var(--ui-icon-button-hover-text, var(--_icon-button-text, var(--ui-text-primary)));
4871
5003
  }
4872
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][data-v-cb9aaf03]:hover:enabled:not([aria-disabled="true"]) {
5004
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][data-v-b66a1661]:hover:enabled:not([aria-disabled="true"]) {
4873
5005
  border-color: var(
4874
5006
  --ui-icon-button-hover-border,
4875
- var(--ui-control-border-hover, var(--ui-control-border))
5007
+ var(--_icon-button-hover-border, var(--ui-control-border-hover, var(--ui-control-border)))
4876
5008
  );
4877
5009
  }
4878
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-v-cb9aaf03]:hover:enabled:not([aria-disabled="true"]) {
4879
- background-color: var(--ui-icon-button-solid-hover-surface, var(--ui-accent-hover));
5010
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-v-b66a1661]:hover:enabled:not([aria-disabled="true"]) {
5011
+ background-color: var(
5012
+ --ui-icon-button-solid-hover-surface,
5013
+ var(--_icon-button-solid-hover-surface, var(--ui-accent-hover))
5014
+ );
5015
+ }
5016
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-ui-icon-button-state~="tone=accent"][data-v-b66a1661]:hover:enabled:not([aria-disabled="true"]),
5017
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=solid"][data-ui-icon-button-state~="tone=neutral"][data-v-b66a1661]:hover:enabled:not([aria-disabled="true"]) {
5018
+ color: var(--ui-icon-button-solid-text, var(--_icon-button-solid-text, var(--ui-text-on-accent)));
4880
5019
  }
4881
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=ghost"][aria-expanded="true"][data-v-cb9aaf03]:enabled:not([aria-disabled="true"]) {
5020
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=ghost"][aria-expanded="true"][data-v-b66a1661]:enabled:not([aria-disabled="true"]) {
4882
5021
  background-color: var(
4883
5022
  --ui-icon-button-active-surface,
4884
5023
  color-mix(in srgb, currentColor 16%, transparent)
4885
5024
  );
4886
- color: var(--ui-icon-button-hover-text, var(--ui-text-primary));
5025
+ color: var(--ui-icon-button-hover-text, var(--_icon-button-text, var(--ui-text-primary)));
4887
5026
  box-shadow: var(--ui-pressed);
4888
5027
  }
4889
- [data-component~="ui-icon-button"][data-v-cb9aaf03]:active:enabled:not([aria-disabled="true"]) {
5028
+
5029
+ /* Native toggle state persists after pointer release, including during loading. */
5030
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"][data-v-b66a1661]:enabled {
5031
+ background-color: var(
5032
+ --ui-icon-button-active-surface,
5033
+ color-mix(in srgb, currentColor 12%, var(--ui-surface-default))
5034
+ );
5035
+ background-image: none;
5036
+ box-shadow: var(--ui-pressed);
5037
+ }
5038
+ [data-component~="ui-icon-button"][data-v-b66a1661]:active:enabled:not([aria-disabled="true"]) {
4890
5039
  transform: scale(var(--ui-icon-button-active-scale, 0.96));
4891
5040
  }
4892
- :is([data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"][data-v-cb9aaf03], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"][data-v-cb9aaf03]) {
5041
+ :is([data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"][data-v-b66a1661], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"][data-v-b66a1661]) {
4893
5042
  cursor: progress;
4894
5043
  }
4895
- .content[data-v-cb9aaf03] {
5044
+ .content[data-v-b66a1661] {
4896
5045
  display: inline-flex;
4897
5046
  align-items: center;
4898
5047
  justify-content: center;
4899
5048
  }
4900
5049
  :is([data-component~="ui-icon-button"][data-ui-icon-button-state~="loading"], [data-component~="ui-icon-button"][data-ui-icon-button-state~="pending"])
4901
- .content[data-v-cb9aaf03] {
5050
+ .content[data-v-b66a1661] {
4902
5051
  display: none;
4903
5052
  }
4904
5053
  @media (prefers-reduced-motion: reduce) {
4905
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] .content[data-v-cb9aaf03] {
5054
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="anticipatory"] .content[data-v-b66a1661] {
4906
5055
  transition: none;
4907
5056
  }
4908
5057
  }
4909
- [data-component~="ui-icon-button"][data-v-cb9aaf03]:focus-visible {
5058
+ [data-component~="ui-icon-button"][data-v-b66a1661]:focus-visible {
4910
5059
  outline: none;
4911
5060
  box-shadow: var(--ui-focus-halo);
4912
5061
  }
5062
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"][data-v-b66a1661]:enabled:focus-visible {
5063
+ box-shadow:
5064
+ var(--ui-pressed),
5065
+ var(--ui-focus-halo);
5066
+ }
5067
+ @media (forced-colors: active) {
5068
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"][data-v-b66a1661]:enabled {
5069
+ outline: var(--ui-focus-width) solid Highlight;
5070
+ outline-offset: calc(-2 * var(--ui-focus-width));
5071
+ }
5072
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=outline"][aria-pressed="true"][data-v-b66a1661]:enabled:focus-visible {
5073
+ outline-offset: var(--ui-focus-width);
5074
+ }
5075
+ }
4913
5076
 
4914
5077
  /* Disabled is a flat neutral control, independent of the active variant's tone. */
4915
- [data-component~="ui-icon-button"][data-v-cb9aaf03]:disabled {
5078
+ [data-component~="ui-icon-button"][data-v-b66a1661]:disabled {
4916
5079
  border-color: var(--ui-disabled-border);
4917
5080
  background-color: var(--ui-disabled-surface);
4918
5081
  color: var(--ui-disabled-text);
@@ -4922,23 +5085,23 @@ html[data-ui-input-modality="touch"] [data-component~="ui-icon-button"][data-v-c
4922
5085
  box-shadow: none;
4923
5086
  background-image: none;
4924
5087
  }
4925
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=ghost"][data-v-cb9aaf03]:disabled {
5088
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="variant=ghost"][data-v-b66a1661]:disabled {
4926
5089
  border-color: transparent;
4927
5090
  }
4928
- [data-component~="ui-icon-button"][data-v-cb9aaf03] {
5091
+ [data-component~="ui-icon-button"][data-v-b66a1661] {
4929
5092
  --_icon-button-icon-default: var(--ui-icon-size-md);
4930
5093
  /* A slotted ui-icon is its own component, out of reach of the svg rule below; these are its
4931
5094
  defaults, which its own --ui-icon-* hooks still override. */
4932
5095
  --_ui-default-icon-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
4933
5096
  --_ui-default-icon-stroke-width: var(--_ui-icon-button-icon-stroke-width, 1.75);
4934
5097
  }
4935
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"][data-v-cb9aaf03] {
5098
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=sm"][data-v-b66a1661] {
4936
5099
  --_icon-button-icon-default: var(--ui-icon-size-sm);
4937
5100
  }
4938
- [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"][data-v-cb9aaf03] {
5101
+ [data-component~="ui-icon-button"][data-ui-icon-button-state~="size=lg"][data-v-b66a1661] {
4939
5102
  --_icon-button-icon-default: var(--ui-icon-size-lg);
4940
5103
  }
4941
- svg[data-v-cb9aaf03-s] {
5104
+ svg[data-v-b66a1661-s] {
4942
5105
  inline-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
4943
5106
  block-size: var(--_ui-icon-button-icon-size, var(--_icon-button-icon-default));
4944
5107
  flex-shrink: 0;
@@ -4946,7 +5109,7 @@ svg[data-v-cb9aaf03-s] {
4946
5109
  }
4947
5110
 
4948
5111
  /* A component that sets its display still honours the hidden attribute on its root. */
4949
- [data-component~="ui-icon-button"][hidden][data-v-cb9aaf03] {
5112
+ [data-component~="ui-icon-button"][hidden][data-v-b66a1661] {
4950
5113
  display: none;
4951
5114
  }
4952
5115
 
@@ -5618,7 +5781,7 @@ svg[data-v-cb9aaf03-s] {
5618
5781
  padding follow it too, and the item takes the link's focus ring. The link stays a real link, so
5619
5782
  a router, a modified click, and "open in new tab" all work. Trailing controls sit above it and
5620
5783
  stay their own. */
5621
- [data-component~="ui-list-item"][data-v-bb9ba09d] {
5784
+ [data-component~="ui-list-item"][data-v-6c3bc8f3] {
5622
5785
  /* Hooks do not inherit, so the parts below read them from the root. */
5623
5786
  --_ui-list-item-icon-size: var(--ui-list-item-icon-size);
5624
5787
 
@@ -5643,97 +5806,106 @@ svg[data-v-cb9aaf03-s] {
5643
5806
  background-color var(--ui-motion-fast) var(--ui-motion-ease),
5644
5807
  border-color var(--ui-motion-fast) var(--ui-motion-ease);
5645
5808
  }
5646
- [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-bb9ba09d] {
5809
+ [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-6c3bc8f3] {
5647
5810
  padding-block: var(--ui-list-item-padding-block, var(--ui-space-3));
5648
5811
  padding-inline: var(--ui-list-item-padding-inline, var(--ui-space-4));
5649
5812
  border: var(--ui-border-width) solid var(--ui-border-strong);
5650
5813
  border-radius: var(--ui-radius-lg);
5651
5814
  background: var(--ui-surface-raised);
5652
5815
  }
5653
- [data-component~="ui-list-item"][data-v-bb9ba09d]:where(:has(.title a[href])):hover {
5816
+ [data-component~="ui-list-item"][data-v-6c3bc8f3]:where(:has(.title a[href])):hover {
5654
5817
  background: var(--ui-selection-surface);
5655
5818
  }
5656
- [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-bb9ba09d]:where(:has(.title
5819
+ [data-component~="ui-list-item"][data-ui-list-item-state~="variant=card"][data-v-6c3bc8f3]:where(:has(.title
5657
5820
  a[href])):hover {
5658
5821
  border-color: var(--ui-border-strong);
5659
5822
  }
5660
- [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-bb9ba09d] {
5823
+ [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-6c3bc8f3] {
5661
5824
  background: var(--ui-selection-surface);
5662
5825
  }
5663
- [data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-bb9ba09d] {
5826
+ [data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-6c3bc8f3] {
5664
5827
  background: var(--ui-selection-surface);
5665
5828
  color: var(--ui-selection-text);
5666
5829
  }
5667
- [data-component~="ui-list-item"][data-v-bb9ba09d]:has(.title a[href]:focus-visible) {
5830
+ [data-component~="ui-list-item"][data-v-6c3bc8f3]:has(.title a[href]:focus-visible) {
5668
5831
  box-shadow: 0 0 0 var(--ui-focus-width) var(--ui-focus-ring);
5669
5832
  }
5670
- .leading[data-v-bb9ba09d],
5671
- .trailing[data-v-bb9ba09d] {
5833
+ .leading[data-v-6c3bc8f3],
5834
+ .trailing[data-v-6c3bc8f3] {
5672
5835
  display: inline-flex;
5673
5836
  flex: none;
5674
5837
  align-items: center;
5675
5838
  gap: var(--ui-space-2);
5676
5839
  }
5677
- .leading[data-v-bb9ba09d] {
5840
+ .leading[data-v-6c3bc8f3] {
5678
5841
  color: var(--ui-text-muted);
5679
5842
  font-size: var(--_ui-list-item-icon-size, var(--ui-font-size-lg));
5680
5843
  }
5681
- [data-component~="ui-list-item"][data-ui-list-item-state~="current"] .leading[data-v-bb9ba09d] {
5844
+ [data-component~="ui-list-item"][data-ui-list-item-state~="current"] .leading[data-v-6c3bc8f3] {
5682
5845
  color: var(--ui-selection-text);
5683
5846
  }
5684
5847
 
5685
5848
  /* An explicitly independent leading control sits above the stretched row link. */
5686
- [data-component~="ui-list-item"][data-ui-list-item-state~="leadingInteractive"] .leading[data-v-bb9ba09d] {
5849
+ [data-component~="ui-list-item"][data-ui-list-item-state~="leadingInteractive"] .leading[data-v-6c3bc8f3] {
5687
5850
  position: relative;
5688
5851
  z-index: 1;
5689
5852
  }
5690
5853
 
5691
5854
  /* Trailing controls take their own clicks, above the title link's stretched hit area. */
5692
- .trailing[data-v-bb9ba09d] {
5855
+ .trailing[data-v-6c3bc8f3] {
5693
5856
  position: relative;
5694
5857
  z-index: 1;
5695
5858
  color: var(--ui-text-muted);
5696
5859
  font-size: var(--ui-font-size-sm);
5697
5860
  }
5698
- .content[data-v-bb9ba09d] {
5861
+ .content[data-v-6c3bc8f3] {
5699
5862
  display: flex;
5700
5863
  flex: 1;
5701
5864
  flex-direction: column;
5702
5865
  gap: var(--ui-space-0-5, 2px);
5703
5866
  min-inline-size: 0;
5704
5867
  }
5705
- .title[data-v-bb9ba09d],
5706
- .description[data-v-bb9ba09d] {
5868
+ .title[data-v-6c3bc8f3],
5869
+ .description[data-v-6c3bc8f3] {
5707
5870
  display: block;
5708
5871
  min-inline-size: 0;
5709
5872
  overflow: hidden;
5710
5873
  text-overflow: ellipsis;
5711
5874
  white-space: nowrap;
5712
5875
  }
5713
- [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .title[data-v-bb9ba09d],
5714
- [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .description[data-v-bb9ba09d] {
5876
+ [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .title[data-v-6c3bc8f3],
5877
+ [data-component~="ui-list-item"][data-ui-list-item-state~="wrap"] .description[data-v-6c3bc8f3] {
5715
5878
  white-space: normal;
5716
5879
  overflow-wrap: anywhere;
5717
5880
  }
5718
- .title[data-v-bb9ba09d] {
5881
+ .title[data-v-6c3bc8f3] {
5719
5882
  font-size: var(--ui-font-size-md);
5720
5883
  font-weight: var(--_ui-list-item-title-weight, var(--ui-font-medium));
5721
5884
  line-height: var(--ui-line-height-tight);
5722
5885
  }
5723
- .description[data-v-bb9ba09d] {
5886
+
5887
+ /* Keep identity and disclosure marks beside the first line, even with a long description. */
5888
+ [data-component~="ui-list-item"][data-ui-list-item-state~="align=title"][data-v-6c3bc8f3] {
5889
+ align-items: flex-start;
5890
+ }
5891
+ [data-component~="ui-list-item"][data-ui-list-item-state~="align=title"] .leading[data-v-6c3bc8f3],
5892
+ [data-component~="ui-list-item"][data-ui-list-item-state~="align=title"] .trailing[data-v-6c3bc8f3] {
5893
+ min-block-size: calc(var(--ui-font-size-md) * var(--ui-line-height-tight));
5894
+ }
5895
+ .description[data-v-6c3bc8f3] {
5724
5896
  color: var(--ui-text-muted);
5725
5897
  font-size: var(--ui-font-size-sm);
5726
5898
  line-height: var(--ui-line-height-tight);
5727
5899
  }
5728
- .title > a[data-v-bb9ba09d-s] {
5900
+ .title > a[data-v-6c3bc8f3-s] {
5729
5901
  color: inherit;
5730
5902
  text-decoration: none;
5731
5903
  }
5732
- .title > a[data-v-bb9ba09d-s]:focus-visible {
5904
+ .title > a[data-v-6c3bc8f3-s]:focus-visible {
5733
5905
  outline: none;
5734
5906
  box-shadow: none;
5735
5907
  }
5736
- .title > a[href][data-v-bb9ba09d-s]::after {
5908
+ .title > a[href][data-v-6c3bc8f3-s]::after {
5737
5909
  position: absolute;
5738
5910
  inset: 0;
5739
5911
  border-radius: inherit;
@@ -5741,24 +5913,24 @@ svg[data-v-cb9aaf03-s] {
5741
5913
  }
5742
5914
 
5743
5915
  /* An unused region takes no space. */
5744
- .leading[data-v-bb9ba09d]:empty,
5745
- .description[data-v-bb9ba09d]:empty,
5746
- .trailing[data-v-bb9ba09d]:empty {
5916
+ .leading[data-v-6c3bc8f3]:empty,
5917
+ .description[data-v-6c3bc8f3]:empty,
5918
+ .trailing[data-v-6c3bc8f3]:empty {
5747
5919
  display: none;
5748
5920
  }
5749
5921
  @media (forced-colors: active) {
5750
- [data-component~="ui-list-item"][data-v-bb9ba09d]:has(a:focus-visible) {
5922
+ [data-component~="ui-list-item"][data-v-6c3bc8f3]:has(a:focus-visible) {
5751
5923
  outline: var(--ui-focus-width) solid Highlight;
5752
5924
  outline-offset: calc(-1 * var(--ui-focus-width));
5753
5925
  }
5754
- :is([data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-bb9ba09d], [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-bb9ba09d]):not(:has(a:focus-visible)) {
5926
+ :is([data-component~="ui-list-item"][data-ui-list-item-state~="current"][data-v-6c3bc8f3], [data-component~="ui-list-item"][data-ui-list-item-state~="highlighted"][data-v-6c3bc8f3]):not(:has(a:focus-visible)) {
5755
5927
  outline: var(--ui-border-width) solid Highlight;
5756
5928
  outline-offset: calc(-1 * var(--ui-border-width));
5757
5929
  }
5758
5930
  }
5759
5931
 
5760
5932
  /* A component that sets its display still honours the hidden attribute on its root. */
5761
- [data-component~="ui-list-item"][hidden][data-v-bb9ba09d] {
5933
+ [data-component~="ui-list-item"][hidden][data-v-6c3bc8f3] {
5762
5934
  display: none;
5763
5935
  }
5764
5936