@threadlabs/looma 0.25.3 → 0.25.5

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 (69) hide show
  1. package/components/ui-badge/ui-badge.html +59 -3
  2. package/components/ui-button/ui-button.html +1 -1
  3. package/components/ui-card/ui-card.html +27 -2
  4. package/components/ui-cluster/ui-cluster.html +30 -0
  5. package/components/ui-editor-surface/ui-editor-surface.html +23 -0
  6. package/components/ui-scroll-area/ui-scroll-area.html +5 -0
  7. package/components/ui-stack/ui-stack.html +17 -1
  8. package/components/ui-text/ui-text.html +5 -0
  9. package/components/ui-textarea/ui-textarea.html +7 -0
  10. package/dist/index.js +1 -1
  11. package/package.json +1 -1
  12. package/styles/ui-badge.css +61 -4
  13. package/styles/ui-button.css +1 -1
  14. package/styles/ui-card.css +24 -0
  15. package/styles/ui-cluster.css +25 -0
  16. package/styles/ui-editor-surface.css +19 -0
  17. package/styles/ui-scroll-area.css +4 -0
  18. package/styles/ui-stack.css +13 -0
  19. package/styles/ui-text.css +4 -0
  20. package/styles/ui-textarea.css +4 -0
  21. package/vanilla/UiBadge.js +16 -3
  22. package/vanilla/UiCard.d.ts +1 -1
  23. package/vanilla/UiCard.js +1 -1
  24. package/vanilla/UiCluster.d.ts +3 -0
  25. package/vanilla/UiCluster.js +9 -3
  26. package/vanilla/UiEditorSurface.d.ts +14 -0
  27. package/vanilla/UiEditorSurface.js +27 -0
  28. package/vanilla/UiScrollArea.d.ts +1 -0
  29. package/vanilla/UiScrollArea.js +1 -1
  30. package/vanilla/UiStack.d.ts +2 -0
  31. package/vanilla/UiStack.js +8 -9
  32. package/vanilla/UiText.d.ts +1 -0
  33. package/vanilla/UiText.js +1 -1
  34. package/vanilla/UiTextarea.d.ts +1 -0
  35. package/vanilla/UiTextarea.js +4 -1
  36. package/vanilla/index.js +1 -0
  37. package/vue/UiBadge.d.ts +4 -2
  38. package/vue/UiBadge.vue +57 -3
  39. package/vue/UiButton.vue +1 -1
  40. package/vue/UiCard.d.ts +3 -3
  41. package/vue/UiCard.vue +34 -5
  42. package/vue/UiCluster.d.ts +27 -0
  43. package/vue/UiCluster.vue +95 -1
  44. package/vue/UiEditorSlashMenuItem.d.ts +1 -1
  45. package/vue/UiEditorSurface.d.ts +26 -0
  46. package/vue/UiEditorSurface.js +2 -0
  47. package/vue/UiEditorSurface.vue +129 -0
  48. package/vue/UiScrollArea.d.ts +9 -0
  49. package/vue/UiScrollArea.vue +28 -2
  50. package/vue/UiStack.d.ts +18 -0
  51. package/vue/UiStack.vue +58 -1
  52. package/vue/UiText.d.ts +9 -0
  53. package/vue/UiText.vue +33 -0
  54. package/vue/UiTextarea.d.ts +9 -0
  55. package/vue/UiTextarea.vue +37 -2
  56. package/vue/chunks/UiBadge.js +7 -3
  57. package/vue/chunks/UiButton.js +1 -1
  58. package/vue/chunks/UiCard.js +10 -3
  59. package/vue/chunks/UiCluster.js +82 -1
  60. package/vue/chunks/UiEditorSurface.js +71 -0
  61. package/vue/chunks/UiScrollArea.js +28 -2
  62. package/vue/chunks/UiStack.js +46 -1
  63. package/vue/chunks/UiText.js +43 -1
  64. package/vue/chunks/UiTextarea.js +28 -2
  65. package/vue/components.css +321 -190
  66. package/vue/editor/LoomaEditor.d.ts +12 -0
  67. package/vue/editor/index.js +7 -2
  68. package/vue/index.d.ts +1 -0
  69. package/vue/index.js +2 -1
@@ -349,7 +349,7 @@ svg[data-v-bf7b9190] {
349
349
  syntax: "*";
350
350
  inherits: false;
351
351
  }
352
- [data-component~="ui-badge"][data-v-b1009c5d] {
352
+ [data-component~="ui-badge"][data-v-5065fda2] {
353
353
  --_badge-surface: color-mix(in srgb, var(--ui-surface-subtle) 80%, var(--ui-surface-default));
354
354
  --_badge-text: var(--ui-text-secondary);
355
355
  /* Sit between the soft fill and its stronger theme ink. */
@@ -375,6 +375,7 @@ svg[data-v-bf7b9190] {
375
375
  display: inline-flex;
376
376
  align-items: center;
377
377
  justify-content: center;
378
+ gap: var(--ui-space-1);
378
379
  box-sizing: border-box;
379
380
  min-inline-size: 0;
380
381
  max-inline-size: 100%;
@@ -394,17 +395,48 @@ svg[data-v-bf7b9190] {
394
395
 
395
396
  /* A constrained badge keeps its surface intact and ellipsizes only its label. The full
396
397
  text stays in the DOM for accessible names and consumers' selected values. */
397
- .label[data-v-b1009c5d] {
398
+ .label[data-v-5065fda2] {
398
399
  display: block;
399
400
  min-inline-size: 0;
400
401
  overflow: hidden;
401
402
  text-overflow: ellipsis;
402
403
  }
404
+ .label[data-v-5065fda2]:empty {
405
+ display: none;
406
+ }
403
407
 
404
- /* Trim leading while retaining the font's ascent and descent. A cap-to-baseline box
405
- would crop glyphs where the label clips horizontal overflow for ellipsis. */
408
+ /* Icon content has its own flex item so label ellipsis never clips its strokes. */
409
+ .icon[data-v-5065fda2] {
410
+ display: inline-flex;
411
+ align-items: center;
412
+ justify-content: center;
413
+ flex: none;
414
+ }
415
+ .icon[data-v-5065fda2]:empty {
416
+ display: none;
417
+ }
418
+ .icon svg[data-v-5065fda2-s] {
419
+ display: block;
420
+ inline-size: 1em;
421
+ block-size: 1em;
422
+ flex: none;
423
+ }
424
+
425
+ /* Ordinary icon-plus-text children keep inline ellipsis, with explicit glyph spacing. */
426
+ .label svg[data-v-5065fda2-s] {
427
+ inline-size: 1em;
428
+ block-size: 1em;
429
+ vertical-align: middle;
430
+ margin-inline-end: var(--ui-space-1);
431
+ }
432
+ .label[data-v-5065fda2]:has(svg) {
433
+ text-box-trim: none;
434
+ }
435
+
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. */
406
438
  @supports (text-box-trim: trim-both) {
407
- [data-component~="ui-badge"][data-v-b1009c5d] {
439
+ [data-component~="ui-badge"][data-v-5065fda2] {
408
440
  display: inline-block;
409
441
  min-block-size: var(--ui-badge-min-block-size, 1.5rem);
410
442
  text-align: center;
@@ -412,8 +444,17 @@ svg[data-v-bf7b9190] {
412
444
  text-box-trim: trim-both;
413
445
  text-box-edge: text;
414
446
  }
447
+ [data-component~="ui-badge"][data-v-5065fda2]:has(.icon:not(:empty)),
448
+ [data-component~="ui-badge"][data-v-5065fda2]:has(.label svg) {
449
+ display: inline-flex;
450
+ text-box-trim: none;
415
451
  }
416
- [data-component~="ui-badge"][data-ui-badge-state~="size=xs"][data-v-b1009c5d] {
452
+ [data-component~="ui-badge"]:has(.icon:not(:empty)) .label[data-v-5065fda2] {
453
+ text-box-trim: trim-both;
454
+ text-box-edge: text;
455
+ }
456
+ }
457
+ [data-component~="ui-badge"][data-ui-badge-state~="size=xs"][data-v-5065fda2] {
417
458
  box-sizing: border-box;
418
459
  min-inline-size: 1rem;
419
460
  min-block-size: var(--ui-badge-min-block-size, 1rem);
@@ -421,52 +462,52 @@ svg[data-v-bf7b9190] {
421
462
  font-size: var(--ui-badge-font-size, var(--ui-font-size-2xs));
422
463
  line-height: var(--ui-badge-line-height, 1);
423
464
  }
424
- [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"][data-v-b1009c5d] {
465
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=accent"][data-v-5065fda2] {
425
466
  --_badge-surface: var(--ui-accent-strong-surface, var(--ui-accent-solid));
426
467
  --_badge-border: var(--ui-accent-strong-surface, var(--ui-accent-solid));
427
468
  --_badge-text: var(--ui-accent-on-strong, var(--ui-text-on-accent));
428
469
  }
429
- [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"][data-v-b1009c5d] {
470
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=danger"][data-v-5065fda2] {
430
471
  --_badge-surface: var(--ui-danger-strong-surface, var(--ui-danger-solid));
431
472
  --_badge-border: var(--ui-danger-strong-surface, var(--ui-danger-solid));
432
473
  --_badge-text: var(--ui-danger-on-strong, var(--ui-text-on-accent));
433
474
  }
434
- [data-component~="ui-badge"][data-ui-badge-state~="tone=success"][data-v-b1009c5d] {
475
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=success"][data-v-5065fda2] {
435
476
  --_badge-surface: var(--ui-success-strong-surface, var(--ui-success-solid));
436
477
  --_badge-border: var(--ui-success-strong-surface, var(--ui-success-solid));
437
478
  --_badge-text: var(--ui-success-on-strong, var(--ui-text-on-accent));
438
479
  }
439
- [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"][data-v-b1009c5d] {
480
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=warning"][data-v-5065fda2] {
440
481
  --_badge-surface: var(--ui-warning-strong-surface, var(--ui-warning-solid));
441
482
  --_badge-border: var(--ui-warning-strong-surface, var(--ui-warning-solid));
442
483
  --_badge-text: var(--ui-warning-on-strong, var(--ui-text-on-accent));
443
484
  }
444
- [data-component~="ui-badge"][data-ui-badge-state~="tone=info"][data-v-b1009c5d] {
485
+ [data-component~="ui-badge"][data-ui-badge-state~="tone=info"][data-v-5065fda2] {
445
486
  --_badge-surface: var(--ui-info-strong-surface, var(--ui-info-solid));
446
487
  --_badge-border: var(--ui-info-strong-surface, var(--ui-info-solid));
447
488
  --_badge-text: var(--ui-info-on-strong, var(--ui-text-on-accent));
448
489
  }
449
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"][data-v-b1009c5d] {
490
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=accent"][data-v-5065fda2] {
450
491
  --_badge-surface: color-mix(in srgb, var(--ui-accent-solid) 19%, var(--ui-surface-default));
451
492
  --_badge-border: color-mix(in srgb, var(--ui-accent-solid) 25%, var(--ui-surface-default));
452
493
  --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
453
494
  }
454
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"][data-v-b1009c5d] {
495
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=danger"][data-v-5065fda2] {
455
496
  --_badge-surface: color-mix(in srgb, var(--ui-danger-solid) 19%, var(--ui-surface-default));
456
497
  --_badge-border: color-mix(in srgb, var(--ui-danger-solid) 25%, var(--ui-surface-default));
457
498
  --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
458
499
  }
459
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"][data-v-b1009c5d] {
500
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=success"][data-v-5065fda2] {
460
501
  --_badge-surface: color-mix(in srgb, var(--ui-success-solid) 19%, var(--ui-surface-default));
461
502
  --_badge-border: color-mix(in srgb, var(--ui-success-solid) 25%, var(--ui-surface-default));
462
503
  --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
463
504
  }
464
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"][data-v-b1009c5d] {
505
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=warning"][data-v-5065fda2] {
465
506
  --_badge-surface: color-mix(in srgb, var(--ui-warning-solid) 19%, var(--ui-surface-default));
466
507
  --_badge-border: color-mix(in srgb, var(--ui-warning-solid) 25%, var(--ui-surface-default));
467
508
  --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
468
509
  }
469
- [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"][data-v-b1009c5d] {
510
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=subtle"][data-ui-badge-state~="tone=info"][data-v-5065fda2] {
470
511
  --_badge-surface: color-mix(in srgb, var(--ui-info-solid) 19%, var(--ui-surface-default));
471
512
  --_badge-border: color-mix(in srgb, var(--ui-info-solid) 25%, var(--ui-surface-default));
472
513
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
@@ -474,12 +515,12 @@ svg[data-v-bf7b9190] {
474
515
 
475
516
  /* A solid colour fills with the ink. Its text is the page surface, mixed at 0% only so that it too is
476
517
  invalid while the hook is unset. */
477
- [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"][data-v-b1009c5d] {
518
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=solid"][data-v-5065fda2] {
478
519
  --_badge-color-surface: var(--_badge-color-ink);
479
520
  --_badge-color-border: var(--_badge-color-ink);
480
521
  --_badge-color-text: color-mix(in oklab, var(--_ui-badge-color) 0%, var(--ui-surface-default));
481
522
  }
482
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-v-b1009c5d] {
523
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-v-5065fda2] {
483
524
  --_badge-surface: var(--ui-surface-default);
484
525
  --_badge-border: var(--ui-border-strong);
485
526
  --_badge-text: var(--ui-text-secondary);
@@ -487,29 +528,29 @@ svg[data-v-bf7b9190] {
487
528
  --_badge-color-surface: initial;
488
529
  --_badge-color-border: var(--_badge-color-ink);
489
530
  }
490
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"][data-v-b1009c5d] {
531
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=accent"][data-v-5065fda2] {
491
532
  --_badge-border: var(--ui-accent-solid);
492
533
  --_badge-text: var(--ui-accent-subtle-text, var(--ui-accent-solid));
493
534
  }
494
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"][data-v-b1009c5d] {
535
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=danger"][data-v-5065fda2] {
495
536
  --_badge-border: var(--ui-danger-solid);
496
537
  --_badge-text: var(--ui-danger-subtle-text, var(--ui-danger-solid));
497
538
  }
498
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"][data-v-b1009c5d] {
539
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=success"][data-v-5065fda2] {
499
540
  --_badge-border: var(--ui-success-solid);
500
541
  --_badge-text: var(--ui-success-subtle-text, var(--ui-success-solid));
501
542
  }
502
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"][data-v-b1009c5d] {
543
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=warning"][data-v-5065fda2] {
503
544
  --_badge-border: var(--ui-warning-solid);
504
545
  --_badge-text: var(--ui-warning-subtle-text, var(--ui-warning-solid));
505
546
  }
506
- [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"][data-v-b1009c5d] {
547
+ [data-component~="ui-badge"][data-ui-badge-state~="variant=outline"][data-ui-badge-state~="tone=info"][data-v-5065fda2] {
507
548
  --_badge-border: var(--ui-info-solid);
508
549
  --_badge-text: var(--ui-info-subtle-text, var(--ui-info-solid));
509
550
  }
510
551
 
511
552
  /* An icon mark keeps the existing tone recipe and follows the global spacing and radius. */
512
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-v-b1009c5d] {
553
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-v-5065fda2] {
513
554
  --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-4) * 2));
514
555
  display: inline-flex;
515
556
  box-sizing: border-box;
@@ -522,17 +563,23 @@ svg[data-v-bf7b9190] {
522
563
  border-radius: var(--ui-radius-md);
523
564
  text-box-trim: none;
524
565
  }
525
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"][data-v-b1009c5d] {
566
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"][data-ui-badge-state~="size=xs"][data-v-5065fda2] {
526
567
  --_badge-square-size: var(--ui-badge-square-size, calc(var(--ui-space-3) * 2));
527
568
  }
528
- [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-b1009c5d] {
569
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-5065fda2] {
529
570
  display: inline-flex;
530
571
  align-items: center;
531
572
  justify-content: center;
532
573
  }
574
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label svg[data-v-5065fda2-s] {
575
+ margin-inline-end: 0;
576
+ }
577
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=square"] .label[data-v-5065fda2]:empty {
578
+ display: none;
579
+ }
533
580
 
534
581
  /* A dot uses the badge's tone recipe; only its silhouette and visible label change. */
535
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-b1009c5d] {
582
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-5065fda2] {
536
583
  position: relative;
537
584
  box-sizing: border-box;
538
585
  flex: none;
@@ -544,7 +591,7 @@ svg[data-v-bf7b9190] {
544
591
  border-radius: var(--ui-radius-round);
545
592
  text-box-trim: none;
546
593
  }
547
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] .label[data-v-b1009c5d] {
594
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"] .label[data-v-5065fda2] {
548
595
  position: absolute;
549
596
  inline-size: 1px;
550
597
  block-size: 1px;
@@ -555,7 +602,7 @@ svg[data-v-bf7b9190] {
555
602
 
556
603
  /* The clipped point needs an inset surface over an outer border-colour shape: a native border
557
604
  has no diagonal edge to follow. Keep this edge for every tag variant. */
558
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-b1009c5d] {
605
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-5065fda2] {
559
606
  --_badge-point: var(--ui-badge-point, var(--ui-space-2));
560
607
 
561
608
  position: relative;
@@ -572,7 +619,7 @@ svg[data-v-bf7b9190] {
572
619
  0 100%
573
620
  );
574
621
  }
575
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-b1009c5d]::before {
622
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-5065fda2]::before {
576
623
  content: "";
577
624
  position: absolute;
578
625
  inset: 0;
@@ -587,34 +634,34 @@ svg[data-v-bf7b9190] {
587
634
  );
588
635
  pointer-events: none;
589
636
  }
590
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-b1009c5d]:dir(rtl) {
637
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-5065fda2]:dir(rtl) {
591
638
  padding-inline-end: var(--ui-badge-padding-inline, var(--ui-space-2));
592
639
  padding-inline-start: calc(
593
640
  var(--ui-badge-padding-inline, var(--ui-space-2)) + var(--_badge-point)
594
641
  );
595
642
  clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
596
643
  }
597
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-b1009c5d]:dir(rtl)::before {
644
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-5065fda2]:dir(rtl)::before {
598
645
  clip-path: polygon(var(--_badge-point) 0, 100% 0, 100% 100%, var(--_badge-point) 100%, 0 50%);
599
646
  }
600
647
  @media (forced-colors: active) {
601
- [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-b1009c5d] {
648
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=dot"][data-v-5065fda2] {
602
649
  forced-color-adjust: none;
603
650
  border-color: CanvasText;
604
651
  background: CanvasText;
605
652
  }
606
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-b1009c5d] {
653
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-5065fda2] {
607
654
  forced-color-adjust: none;
608
655
  background: CanvasText;
609
656
  color: CanvasText;
610
657
  }
611
- [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-b1009c5d]::before {
658
+ [data-component~="ui-badge"][data-ui-badge-state~="shape=tag"][data-v-5065fda2]::before {
612
659
  background: Canvas;
613
660
  }
614
661
  }
615
662
 
616
663
  /* A component that sets its display still honours the hidden attribute on its root. */
617
- [data-component~="ui-badge"][hidden][data-v-b1009c5d] {
664
+ [data-component~="ui-badge"][hidden][data-v-5065fda2] {
618
665
  display: none;
619
666
  }
620
667
 
@@ -824,7 +871,7 @@ svg[data-v-fb67873c],
824
871
  syntax: "*";
825
872
  inherits: false;
826
873
  }
827
- [data-component~="ui-button"][data-v-5c174bca] {
874
+ [data-component~="ui-button"][data-v-7c2bc2b4] {
828
875
  --_hue: var(--ui-accent);
829
876
  --_hue-hover: var(--ui-accent-hover);
830
877
  --_hue-active: var(--ui-accent-active);
@@ -840,18 +887,19 @@ svg[data-v-fb67873c],
840
887
  display: inline-flex;
841
888
  align-items: center;
842
889
  justify-content: center;
890
+ column-gap: var(--ui-space-2);
843
891
  vertical-align: middle;
844
892
  color: var(--_tone-text);
845
893
  }
846
- [data-component~="ui-button"][data-ui-button-state~="align=start"][data-v-5c174bca] {
894
+ [data-component~="ui-button"][data-ui-button-state~="align=start"][data-v-7c2bc2b4] {
847
895
  justify-content: flex-start;
848
896
  text-align: start;
849
897
  }
850
- [data-component~="ui-button"][data-ui-button-state~="stretch"][data-v-5c174bca] {
898
+ [data-component~="ui-button"][data-ui-button-state~="stretch"][data-v-7c2bc2b4] {
851
899
  display: flex;
852
900
  inline-size: 100%;
853
901
  }
854
- [data-component~="ui-button"][data-v-5c174bca] {
902
+ [data-component~="ui-button"][data-v-7c2bc2b4] {
855
903
  appearance: none;
856
904
  min-block-size: var(--ui-button-min-block-size, var(--ui-control-size-md));
857
905
  border-style: solid;
@@ -879,35 +927,34 @@ svg[data-v-fb67873c],
879
927
  }
880
928
 
881
929
  /* An anchor keeps the boxed button look even when an app styles ordinary links. */
882
- [data-component~="ui-button"][data-v-5c174bca]:is(a) {
930
+ [data-component~="ui-button"][data-v-7c2bc2b4]:is(a) {
883
931
  text-decoration: none;
884
932
  }
885
- .spinner-wrap[data-v-5c174bca] {
933
+ .spinner-wrap[data-v-7c2bc2b4] {
886
934
  display: inline-flex;
887
935
  flex: none;
888
- margin-inline-end: var(--ui-space-2);
889
936
  vertical-align: middle;
890
937
  }
891
938
  @supports (text-box-trim: trim-both) {
892
- [data-component~="ui-button"][data-v-5c174bca] {
939
+ [data-component~="ui-button"][data-v-7c2bc2b4] {
893
940
  text-box-trim: trim-both;
894
941
  text-box-edge: cap alphabetic;
895
942
  }
896
943
  }
897
- [data-component~="ui-button"][data-ui-button-state~="size=xs"][data-v-5c174bca] {
944
+ [data-component~="ui-button"][data-ui-button-state~="size=xs"][data-v-7c2bc2b4] {
898
945
  min-block-size: 1.5rem;
899
946
  padding: calc(var(--ui-space-0-5) * 1.5) calc(var(--ui-space-1) * 1.25);
900
947
  font-size: var(--ui-font-size-xs);
901
948
  }
902
- [data-component~="ui-button"][data-ui-button-state~="shape=pill"][data-v-5c174bca] {
949
+ [data-component~="ui-button"][data-ui-button-state~="shape=pill"][data-v-7c2bc2b4] {
903
950
  border-radius: var(--ui-button-radius, var(--ui-radius-round));
904
951
  }
905
- [data-component~="ui-button"][data-ui-button-state~="size=sm"][data-v-5c174bca] {
952
+ [data-component~="ui-button"][data-ui-button-state~="size=sm"][data-v-7c2bc2b4] {
906
953
  min-block-size: var(--ui-control-size-sm);
907
954
  padding: var(--ui-space-1) var(--ui-space-2);
908
955
  font-size: var(--ui-font-size-sm);
909
956
  }
910
- [data-component~="ui-button"][data-ui-button-state~="size=lg"][data-v-5c174bca] {
957
+ [data-component~="ui-button"][data-ui-button-state~="size=lg"][data-v-7c2bc2b4] {
911
958
  min-block-size: var(--ui-control-size-lg);
912
959
  padding: var(--ui-space-3) var(--ui-space-4);
913
960
  font-size: var(--ui-font-size-md);
@@ -915,7 +962,7 @@ svg[data-v-fb67873c],
915
962
 
916
963
  /* Card actions inherit Button's palette and behavior; only their shared layout changes.
917
964
  The icon may contain any decorative composition. Empty icons remove their column. */
918
- [data-component~="ui-button"][data-ui-button-state~="variant=card"][data-v-5c174bca] {
965
+ [data-component~="ui-button"][data-ui-button-state~="variant=card"][data-v-7c2bc2b4] {
919
966
  display: grid;
920
967
  grid-template-columns: auto minmax(0, 1fr) auto;
921
968
  align-content: center;
@@ -928,23 +975,23 @@ svg[data-v-fb67873c],
928
975
  box-shadow: none;
929
976
  background-image: none;
930
977
  }
931
- [data-component~="ui-button"][data-ui-button-state~="variant=card"][data-ui-button-state~="size=lg"][data-v-5c174bca] {
978
+ [data-component~="ui-button"][data-ui-button-state~="variant=card"][data-ui-button-state~="size=lg"][data-v-7c2bc2b4] {
932
979
  min-block-size: max(var(--ui-control-min-block-size), var(--ui-control-size-lg));
933
980
  }
934
- [data-component~="ui-button"][data-ui-button-state~="variant=card"][data-v-5c174bca]:has(.card-icon:empty) {
981
+ [data-component~="ui-button"][data-ui-button-state~="variant=card"][data-v-7c2bc2b4]:has(.card-icon:empty) {
935
982
  grid-template-columns: minmax(0, 1fr) auto;
936
983
  }
937
- .card-icon[data-v-5c174bca] {
984
+ .card-icon[data-v-7c2bc2b4] {
938
985
  display: flex;
939
986
  align-items: flex-start;
940
987
  }
941
- .card-icon[data-v-5c174bca]:empty {
988
+ .card-icon[data-v-7c2bc2b4]:empty {
942
989
  display: none;
943
990
  }
944
- .card-content[data-v-5c174bca] {
991
+ .card-content[data-v-7c2bc2b4] {
945
992
  min-inline-size: 0;
946
993
  }
947
- .card-action[data-v-5c174bca] {
994
+ .card-action[data-v-7c2bc2b4] {
948
995
  display: flex;
949
996
  align-items: center;
950
997
  align-self: center;
@@ -952,29 +999,29 @@ svg[data-v-fb67873c],
952
999
 
953
1000
  /* A link is never :enabled, so interactive states test "not unavailable" instead: for a button that
954
1001
  is exactly :enabled, at the same specificity, and it also matches a link that can be followed. */
955
- [data-component~="ui-button"][data-v-5c174bca]:hover:not(:disabled, [aria-disabled="true"]) {
1002
+ [data-component~="ui-button"][data-v-7c2bc2b4]:hover:not(:disabled, [aria-disabled="true"]) {
956
1003
  border-color: var(--ui-button-hover-border, var(--_tone-hover));
957
1004
  background-color: var(--ui-button-hover-surface, oklch(from var(--_tone) l c h / 12%));
958
1005
  }
959
1006
 
960
1007
  /* Pressed reads as pressed in: the highlight goes, and the shadow moves inside. */
961
- [data-component~="ui-button"][data-v-5c174bca]:active:not(:disabled, [aria-disabled="true"]) {
1008
+ [data-component~="ui-button"][data-v-7c2bc2b4]:active:not(:disabled, [aria-disabled="true"]) {
962
1009
  background-color: var(--ui-button-active-surface, oklch(from var(--_tone) l c h / 18%));
963
1010
  background-image: none;
964
1011
  box-shadow: var(--ui-pressed);
965
1012
  }
966
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-5c174bca],
967
- [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-5c174bca] {
1013
+ [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-7c2bc2b4],
1014
+ [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-7c2bc2b4] {
968
1015
  border-color: var(--_tone);
969
1016
  background-color: var(--_tone);
970
1017
  color: var(--_on-tone);
971
1018
  box-shadow: var(--ui-button-solid-shadow, var(--ui-raised));
972
1019
  }
973
- :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-5c174bca], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-5c174bca]):hover:not(:disabled, [aria-disabled="true"]) {
1020
+ :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-7c2bc2b4], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-7c2bc2b4]):hover:not(:disabled, [aria-disabled="true"]) {
974
1021
  background-color: var(--_tone-hover);
975
1022
  border-color: var(--_tone-hover);
976
1023
  }
977
- :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-5c174bca], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-5c174bca]):active:not(:disabled, [aria-disabled="true"]) {
1024
+ :is([data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-7c2bc2b4], [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-7c2bc2b4]):active:not(:disabled, [aria-disabled="true"]) {
978
1025
  background-color: var(--_tone-active);
979
1026
  border-color: var(--_tone-active);
980
1027
  background-image: none;
@@ -983,43 +1030,43 @@ svg[data-v-fb67873c],
983
1030
 
984
1031
  /* Tone is the colour, variant is the volume. Every pairing works: a danger outline is a
985
1032
  destructive secondary action, not a special case. */
986
- [data-component~="ui-button"][data-ui-button-state~="tone=neutral"][data-v-5c174bca] {
1033
+ [data-component~="ui-button"][data-ui-button-state~="tone=neutral"][data-v-7c2bc2b4] {
987
1034
  --_hue: var(--ui-text);
988
1035
  --_hue-hover: var(--ui-text);
989
1036
  --_hue-active: var(--ui-text);
990
1037
  --_hue-text: var(--ui-text);
991
1038
  --_on-hue: var(--ui-surface);
992
1039
  }
993
- [data-component~="ui-button"][data-ui-button-state~="tone=danger"][data-v-5c174bca],
994
- [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-5c174bca] {
1040
+ [data-component~="ui-button"][data-ui-button-state~="tone=danger"][data-v-7c2bc2b4],
1041
+ [data-component~="ui-button"][data-ui-button-state~="variant=danger"][data-v-7c2bc2b4] {
995
1042
  --_hue: var(--ui-danger);
996
1043
  --_hue-hover: var(--ui-danger-hover);
997
1044
  --_hue-active: var(--ui-danger-hover);
998
1045
  --_hue-text: var(--ui-danger-hover);
999
1046
  --_on-hue: var(--ui-on-danger);
1000
1047
  }
1001
- [data-component~="ui-button"][data-ui-button-state~="tone=success"][data-v-5c174bca] {
1048
+ [data-component~="ui-button"][data-ui-button-state~="tone=success"][data-v-7c2bc2b4] {
1002
1049
  --_hue: var(--ui-success);
1003
1050
  --_hue-hover: color-mix(in srgb, var(--ui-success) 85%, #000);
1004
1051
  --_hue-active: color-mix(in srgb, var(--ui-success) 75%, #000);
1005
1052
  --_hue-text: color-mix(in srgb, var(--ui-success) 85%, #000);
1006
1053
  --_on-hue: var(--ui-surface);
1007
1054
  }
1008
- [data-component~="ui-button"][data-ui-button-state~="tone=warning"][data-v-5c174bca] {
1055
+ [data-component~="ui-button"][data-ui-button-state~="tone=warning"][data-v-7c2bc2b4] {
1009
1056
  --_hue: var(--ui-warning);
1010
1057
  --_hue-hover: color-mix(in srgb, var(--ui-warning) 85%, #000);
1011
1058
  --_hue-active: color-mix(in srgb, var(--ui-warning) 75%, #000);
1012
1059
  --_hue-text: color-mix(in srgb, var(--ui-warning) 85%, #000);
1013
1060
  --_on-hue: var(--ui-surface);
1014
1061
  }
1015
- [data-component~="ui-button"][data-ui-button-state~="tone=info"][data-v-5c174bca] {
1062
+ [data-component~="ui-button"][data-ui-button-state~="tone=info"][data-v-7c2bc2b4] {
1016
1063
  --_hue: var(--ui-info);
1017
1064
  --_hue-hover: color-mix(in srgb, var(--ui-info) 85%, #000);
1018
1065
  --_hue-active: color-mix(in srgb, var(--ui-info) 75%, #000);
1019
1066
  --_hue-text: color-mix(in srgb, var(--ui-info) 85%, #000);
1020
1067
  --_on-hue: var(--ui-surface);
1021
1068
  }
1022
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-5c174bca] {
1069
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-7c2bc2b4] {
1023
1070
  border-color: transparent;
1024
1071
  background: transparent;
1025
1072
  box-shadow: none;
@@ -1027,14 +1074,14 @@ svg[data-v-fb67873c],
1027
1074
  }
1028
1075
 
1029
1076
  /* Tints derive from the text colour, not a surface token, so hover and press show on any background. */
1030
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-5c174bca]:hover:not(:disabled, [aria-disabled="true"]) {
1077
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-7c2bc2b4]:hover:not(:disabled, [aria-disabled="true"]) {
1031
1078
  background-color: var(--ui-button-ghost-hover-surface, oklch(from var(--_tone) l c h / 10%));
1032
1079
  border-color: transparent;
1033
1080
  }
1034
1081
 
1035
1082
  /* Pressed, or holding its menu open, a ghost button sinks slightly: a light surface with a faint
1036
1083
  edge and a soft inner shadow. Lighter than hover, so an open menu's trigger never reads as heavy. */
1037
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-5c174bca]:is(:active, [aria-expanded="true"]):not(:disabled, [aria-disabled="true"]) {
1084
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-7c2bc2b4]:is(:active, [aria-expanded="true"]):not(:disabled, [aria-disabled="true"]) {
1038
1085
  background-color: var(
1039
1086
  --ui-button-ghost-active-surface,
1040
1087
  color-mix(in oklch, var(--ui-surface), var(--_tone) 3%)
@@ -1046,13 +1093,13 @@ svg[data-v-fb67873c],
1046
1093
  }
1047
1094
 
1048
1095
  /* A soft halo that transitions in with the other box-shadow changes, layered on the raised shadow. */
1049
- [data-component~="ui-button"][data-v-5c174bca]:focus-visible {
1096
+ [data-component~="ui-button"][data-v-7c2bc2b4]:focus-visible {
1050
1097
  outline: none;
1051
1098
  box-shadow:
1052
1099
  var(--ui-button-shadow, var(--ui-raised)),
1053
1100
  var(--ui-focus-halo);
1054
1101
  }
1055
- [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-5c174bca]:focus-visible {
1102
+ [data-component~="ui-button"][data-ui-button-state~="variant=solid"][data-v-7c2bc2b4]:focus-visible {
1056
1103
  box-shadow:
1057
1104
  var(--ui-button-solid-shadow, var(--ui-raised)),
1058
1105
  var(--ui-focus-halo);
@@ -1060,7 +1107,7 @@ svg[data-v-fb67873c],
1060
1107
 
1061
1108
  /* A loading action stays visually active; only an explicitly disabled action takes the
1062
1109
  neutral disabled palette. Its flat surface and muted ink make the state unambiguous. */
1063
- [data-component~="ui-button"][data-v-5c174bca]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
1110
+ [data-component~="ui-button"][data-v-7c2bc2b4]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
1064
1111
  border-color: var(--ui-disabled-border);
1065
1112
  background-color: var(--ui-disabled-surface);
1066
1113
  color: var(--ui-disabled-text);
@@ -1070,19 +1117,19 @@ svg[data-v-fb67873c],
1070
1117
  background-image: none;
1071
1118
  box-shadow: none;
1072
1119
  }
1073
- :is([data-component~="ui-button"][data-ui-button-state~="loading"][data-v-5c174bca], [data-component~="ui-button"][data-ui-button-state~="pending"][data-v-5c174bca]):focus-visible {
1120
+ :is([data-component~="ui-button"][data-ui-button-state~="loading"][data-v-7c2bc2b4], [data-component~="ui-button"][data-ui-button-state~="pending"][data-v-7c2bc2b4]):focus-visible {
1074
1121
  box-shadow: var(--ui-focus-halo);
1075
1122
  }
1076
1123
 
1077
1124
  /* Ghost keeps no border, but gains the same neutral surface as other disabled buttons. */
1078
- [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-5c174bca]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
1125
+ [data-component~="ui-button"][data-ui-button-state~="variant=ghost"][data-v-7c2bc2b4]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
1079
1126
  background-color: var(--ui-disabled-surface);
1080
1127
  border-color: transparent;
1081
1128
  }
1082
1129
 
1083
1130
  /* The size states outrank :host, so sm is named too, or a small button would stay small. */
1084
1131
  @media (pointer: coarse) {
1085
- [data-component~="ui-button"][data-v-5c174bca], [data-component~="ui-button"][data-ui-button-state~="size=sm"][data-v-5c174bca] {
1132
+ [data-component~="ui-button"][data-v-7c2bc2b4], [data-component~="ui-button"][data-ui-button-state~="size=sm"][data-v-7c2bc2b4] {
1086
1133
  min-block-size: var(--ui-control-min-block-size);
1087
1134
  }
1088
1135
  }
@@ -1093,15 +1140,15 @@ svg[data-v-fb67873c],
1093
1140
  area. xs sits inside a line of text the same way, so it keeps its size and gains the area too.
1094
1141
  Only these need it: a hit area on every button would reach over its neighbours. */
1095
1142
  html[data-ui-input-modality="touch"]
1096
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca],
1143
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4],
1097
1144
  html[data-ui-input-modality="touch"]
1098
- [data-component~="ui-button"][data-ui-button-state~="size=xs"][data-v-5c174bca] {
1145
+ [data-component~="ui-button"][data-ui-button-state~="size=xs"][data-v-7c2bc2b4] {
1099
1146
  position: relative;
1100
1147
  }
1101
1148
  html[data-ui-input-modality="touch"]
1102
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca]::after,
1149
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4]::after,
1103
1150
  html[data-ui-input-modality="touch"]
1104
- [data-component~="ui-button"][data-ui-button-state~="size=xs"][data-v-5c174bca]::after {
1151
+ [data-component~="ui-button"][data-ui-button-state~="size=xs"][data-v-7c2bc2b4]::after {
1105
1152
  position: absolute;
1106
1153
  inset: 50% auto auto 50%;
1107
1154
  inline-size: max(100%, var(--ui-control-min-block-size));
@@ -1112,7 +1159,7 @@ html[data-ui-input-modality="touch"]
1112
1159
 
1113
1160
  /* Link: an inline text action. No box, padding, or minimum height (inline targets are exempt under
1114
1161
  WCAG 2.5.8); the inherited font; an underline that strengthens on hover; a visible focus ring. */
1115
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca] {
1162
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4] {
1116
1163
  display: inline;
1117
1164
  min-block-size: 0;
1118
1165
  padding: 0;
@@ -1130,21 +1177,21 @@ html[data-ui-input-modality="touch"]
1130
1177
  color var(--ui-motion-fast) var(--ui-motion-ease),
1131
1178
  text-decoration-color var(--ui-motion-fast) var(--ui-motion-ease);
1132
1179
  }
1133
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca]:hover:not(:disabled, [aria-disabled="true"]) {
1180
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4]:hover:not(:disabled, [aria-disabled="true"]) {
1134
1181
  color: var(--ui-button-link-hover-text, var(--ui-text-primary));
1135
1182
  text-decoration-color: currentColor;
1136
1183
  background: none;
1137
1184
  transform: none;
1138
1185
  }
1139
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca]:active:not(:disabled, [aria-disabled="true"]) {
1186
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4]:active:not(:disabled, [aria-disabled="true"]) {
1140
1187
  background: none;
1141
1188
  transform: none;
1142
1189
  }
1143
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
1190
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4]:is(:disabled, [aria-disabled="true"]:not([aria-busy="true"])) {
1144
1191
  background: none;
1145
1192
  border-color: transparent;
1146
1193
  }
1147
- [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-5c174bca]:focus-visible {
1194
+ [data-component~="ui-button"][data-ui-button-state~="variant=link"][data-v-7c2bc2b4]:focus-visible {
1148
1195
  box-shadow: none;
1149
1196
  /* Fallback keeps the ring if the token is missing: an unresolved var() would void the outline. */
1150
1197
  outline: var(--ui-focus-width) solid var(--ui-focus-ring);
@@ -1152,7 +1199,7 @@ html[data-ui-input-modality="touch"]
1152
1199
  }
1153
1200
 
1154
1201
  /* A component that sets its display still honours the hidden attribute on its root. */
1155
- [data-component~="ui-button"][hidden][data-v-5c174bca] {
1202
+ [data-component~="ui-button"][hidden][data-v-7c2bc2b4] {
1156
1203
  display: none;
1157
1204
  }
1158
1205
 
@@ -1284,7 +1331,7 @@ html[data-ui-input-modality="touch"]
1284
1331
 
1285
1332
  /* A surface that groups content. Its children stack with even space between them, so a card
1286
1333
  needs no layout of its own. */
1287
- [data-component~="ui-card"][data-v-fa2ae386] {
1334
+ [data-component~="ui-card"][data-v-c589f774] {
1288
1335
  display: flex;
1289
1336
  flex-direction: column;
1290
1337
  gap: var(--ui-space-4);
@@ -1296,45 +1343,64 @@ html[data-ui-input-modality="touch"]
1296
1343
  background: var(--ui-surface-raised);
1297
1344
  color: var(--ui-text-primary);
1298
1345
  }
1299
- [data-component~="ui-card"][data-ui-card-state~="padding=xs"][data-v-fa2ae386] {
1346
+ [data-component~="ui-card"][data-ui-card-state~="padding=xs"][data-v-c589f774] {
1300
1347
  gap: var(--ui-space-1);
1301
1348
  padding: var(--ui-space-2);
1302
1349
  }
1303
- [data-component~="ui-card"][data-ui-card-state~="padding=sm"][data-v-fa2ae386] {
1350
+ [data-component~="ui-card"][data-ui-card-state~="padding=sm"][data-v-c589f774] {
1304
1351
  gap: var(--ui-space-2);
1305
1352
  padding: var(--ui-space-3);
1306
1353
  }
1307
- [data-component~="ui-card"][data-ui-card-state~="padding=lg"][data-v-fa2ae386] {
1354
+ [data-component~="ui-card"][data-ui-card-state~="padding=lg"][data-v-c589f774] {
1308
1355
  padding: var(--ui-space-6);
1309
1356
  }
1310
- [data-component~="ui-card"][data-ui-card-state~="variant=subtle"][data-v-fa2ae386] {
1357
+ [data-component~="ui-card"][data-ui-card-state~="variant=subtle"][data-v-c589f774] {
1311
1358
  border-color: transparent;
1312
1359
  background: var(--ui-surface-muted);
1313
1360
  }
1314
- [data-component~="ui-card"][data-ui-card-state~="variant=elevated"][data-v-fa2ae386] {
1361
+ [data-component~="ui-card"][data-ui-card-state~="variant=elevated"][data-v-c589f774] {
1315
1362
  border-color: var(--ui-border-subtle);
1316
1363
  box-shadow: var(--ui-shadow-lg);
1317
1364
  }
1318
- [data-component~="ui-card"][data-ui-card-state~="tone=danger"][data-v-fa2ae386] {
1365
+ [data-component~="ui-card"][data-ui-card-state~="tone=accent"][data-v-c589f774] {
1366
+ border-color: color-mix(in srgb, var(--ui-accent) 25%, var(--ui-border-default));
1367
+ background: color-mix(in srgb, var(--ui-accent) 6%, var(--ui-surface-default));
1368
+ }
1369
+ [data-component~="ui-card"][data-ui-card-state~="tone=info"][data-v-c589f774] {
1370
+ border-color: color-mix(in srgb, var(--ui-info) 25%, var(--ui-border-default));
1371
+ background: color-mix(in srgb, var(--ui-info) 6%, var(--ui-surface-default));
1372
+ }
1373
+ [data-component~="ui-card"][data-ui-card-state~="tone=success"][data-v-c589f774] {
1374
+ border-color: color-mix(in srgb, var(--ui-success) 25%, var(--ui-border-default));
1375
+ background: color-mix(in srgb, var(--ui-success) 6%, var(--ui-surface-default));
1376
+ }
1377
+ [data-component~="ui-card"][data-ui-card-state~="tone=warning"][data-v-c589f774] {
1378
+ border-color: color-mix(in srgb, var(--ui-warning) 25%, var(--ui-border-default));
1379
+ background: color-mix(in srgb, var(--ui-warning) 6%, var(--ui-surface-default));
1380
+ }
1381
+ [data-component~="ui-card"][data-ui-card-state~="variant=subtle"][data-v-c589f774]:is([data-ui-card-state~="tone=accent"], [data-ui-card-state~="tone=info"], [data-ui-card-state~="tone=success"], [data-ui-card-state~="tone=warning"]) {
1382
+ border-color: transparent;
1383
+ }
1384
+ [data-component~="ui-card"][data-ui-card-state~="tone=danger"][data-v-c589f774] {
1319
1385
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
1320
1386
  border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
1321
1387
  background: var(--ui-danger-soft);
1322
1388
  }
1323
- [data-component~="ui-card"][data-ui-card-state~="size=sm"][data-v-fa2ae386] {
1389
+ [data-component~="ui-card"][data-ui-card-state~="size=sm"][data-v-c589f774] {
1324
1390
  inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
1325
1391
  max-inline-size: min(22rem, calc(100vw - var(--ui-space-2) * 2));
1326
1392
  }
1327
- [data-component~="ui-card"][data-ui-card-state~="size=md"][data-v-fa2ae386] {
1393
+ [data-component~="ui-card"][data-ui-card-state~="size=md"][data-v-c589f774] {
1328
1394
  inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
1329
1395
  max-inline-size: min(28rem, calc(100vw - var(--ui-space-2) * 2));
1330
1396
  }
1331
- [data-component~="ui-card"][data-ui-card-state~="size=lg"][data-v-fa2ae386] {
1397
+ [data-component~="ui-card"][data-ui-card-state~="size=lg"][data-v-c589f774] {
1332
1398
  inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
1333
1399
  max-inline-size: min(36rem, calc(100vw - var(--ui-space-2) * 2));
1334
1400
  }
1335
1401
 
1336
1402
  /* A component that sets its display still honours the hidden attribute on its root. */
1337
- [data-component~="ui-card"][hidden][data-v-fa2ae386] {
1403
+ [data-component~="ui-card"][hidden][data-v-c589f774] {
1338
1404
  display: none;
1339
1405
  }
1340
1406
 
@@ -1521,7 +1587,7 @@ input[data-v-ce204e6e]:focus-visible {
1521
1587
  syntax: "*";
1522
1588
  inherits: false;
1523
1589
  }
1524
- [data-component~="ui-cluster"][data-v-fafdad21] {
1590
+ [data-component~="ui-cluster"][data-v-e3a64464] {
1525
1591
  --_layout-gap: var(--ui-space-3);
1526
1592
  display: flex;
1527
1593
  flex-wrap: wrap;
@@ -1531,45 +1597,69 @@ input[data-v-ce204e6e]:focus-visible {
1531
1597
  max-inline-size: 100%;
1532
1598
  margin: 0;
1533
1599
  }
1534
- [data-component~="ui-cluster"][data-ui-cluster-state~="gap=xs"][data-v-fafdad21] {
1600
+ [data-component~="ui-cluster"][data-ui-cluster-state~="fixed"][data-v-e3a64464] {
1601
+ flex: none;
1602
+ }
1603
+ [data-component~="ui-cluster"][data-ui-cluster-state~="padding=s"][data-v-e3a64464] {
1604
+ padding: var(--ui-space-2);
1605
+ }
1606
+ [data-component~="ui-cluster"][data-ui-cluster-state~="padding=m"][data-v-e3a64464] {
1607
+ padding: var(--ui-space-3);
1608
+ }
1609
+ [data-component~="ui-cluster"][data-ui-cluster-state~="padding=l"][data-v-e3a64464] {
1610
+ padding: var(--ui-space-4);
1611
+ }
1612
+ [data-component~="ui-cluster"][data-ui-cluster-state~="paddingEnd=s"][data-v-e3a64464] {
1613
+ padding-inline-end: var(--ui-space-2);
1614
+ }
1615
+ [data-component~="ui-cluster"][data-ui-cluster-state~="paddingEnd=m"][data-v-e3a64464] {
1616
+ padding-inline-end: var(--ui-space-3);
1617
+ }
1618
+ [data-component~="ui-cluster"][data-ui-cluster-state~="paddingEnd=l"][data-v-e3a64464] {
1619
+ padding-inline-end: var(--ui-space-4);
1620
+ }
1621
+ [data-component~="ui-cluster"][data-ui-cluster-state~="paddingEnd=xl"][data-v-e3a64464] {
1622
+ padding-inline-end: calc(var(--ui-space-4) * 4);
1623
+ }
1624
+ [data-component~="ui-cluster"][data-ui-cluster-state~="gap=xs"][data-v-e3a64464] {
1535
1625
  --_layout-gap: var(--ui-space-2);
1536
1626
  }
1537
- [data-component~="ui-cluster"][data-ui-cluster-state~="gap=s"][data-v-fafdad21] {
1627
+ [data-component~="ui-cluster"][data-ui-cluster-state~="gap=s"][data-v-e3a64464] {
1538
1628
  --_layout-gap: var(--ui-space-3);
1539
1629
  }
1540
- [data-component~="ui-cluster"][data-ui-cluster-state~="gap=m"][data-v-fafdad21] {
1630
+ [data-component~="ui-cluster"][data-ui-cluster-state~="gap=m"][data-v-e3a64464] {
1541
1631
  --_layout-gap: var(--ui-space-4);
1542
1632
  }
1543
- [data-component~="ui-cluster"][data-ui-cluster-state~="gap=l"][data-v-fafdad21] {
1633
+ [data-component~="ui-cluster"][data-ui-cluster-state~="gap=l"][data-v-e3a64464] {
1544
1634
  --_layout-gap: var(--ui-space-5);
1545
1635
  }
1546
- [data-component~="ui-cluster"][data-ui-cluster-state~="gap=xl"][data-v-fafdad21] {
1636
+ [data-component~="ui-cluster"][data-ui-cluster-state~="gap=xl"][data-v-e3a64464] {
1547
1637
  --_layout-gap: var(--ui-space-6);
1548
1638
  }
1549
- [data-component~="ui-cluster"][data-ui-cluster-state~="align=start"][data-v-fafdad21] {
1639
+ [data-component~="ui-cluster"][data-ui-cluster-state~="align=start"][data-v-e3a64464] {
1550
1640
  align-items: flex-start;
1551
1641
  }
1552
- [data-component~="ui-cluster"][data-ui-cluster-state~="align=end"][data-v-fafdad21] {
1642
+ [data-component~="ui-cluster"][data-ui-cluster-state~="align=end"][data-v-e3a64464] {
1553
1643
  align-items: flex-end;
1554
1644
  }
1555
- [data-component~="ui-cluster"][data-ui-cluster-state~="align=stretch"][data-v-fafdad21] {
1645
+ [data-component~="ui-cluster"][data-ui-cluster-state~="align=stretch"][data-v-e3a64464] {
1556
1646
  align-items: stretch;
1557
1647
  }
1558
- [data-component~="ui-cluster"][data-ui-cluster-state~="justify=center"][data-v-fafdad21] {
1648
+ [data-component~="ui-cluster"][data-ui-cluster-state~="justify=center"][data-v-e3a64464] {
1559
1649
  justify-content: center;
1560
1650
  }
1561
- [data-component~="ui-cluster"][data-ui-cluster-state~="justify=end"][data-v-fafdad21] {
1651
+ [data-component~="ui-cluster"][data-ui-cluster-state~="justify=end"][data-v-e3a64464] {
1562
1652
  justify-content: flex-end;
1563
1653
  }
1564
- [data-component~="ui-cluster"][data-ui-cluster-state~="justify=between"][data-v-fafdad21] {
1654
+ [data-component~="ui-cluster"][data-ui-cluster-state~="justify=between"][data-v-e3a64464] {
1565
1655
  justify-content: space-between;
1566
1656
  }
1567
- [data-component~="ui-cluster"][data-ui-cluster-state~="wrap=nowrap"][data-v-fafdad21] {
1657
+ [data-component~="ui-cluster"][data-ui-cluster-state~="wrap=nowrap"][data-v-e3a64464] {
1568
1658
  flex-wrap: nowrap;
1569
1659
  }
1570
1660
 
1571
1661
  /* A component that sets its display still honours the hidden attribute on its root. */
1572
- [data-component~="ui-cluster"][hidden][data-v-fafdad21] {
1662
+ [data-component~="ui-cluster"][hidden][data-v-e3a64464] {
1573
1663
  display: none;
1574
1664
  }
1575
1665
 
@@ -2445,7 +2535,10 @@ dd[data-v-cc61fece] {
2445
2535
  /* The controller sets each fade length from overflow and scroll position. The mask blends
2446
2536
  into whatever is behind the area without needing to know its colour. Before upgrade, its
2447
2537
  zero-length defaults leave the authored scroll area fully visible. */
2448
- [data-component~="ui-scroll-area"][data-v-7357ecdb] {
2538
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="fill"][data-v-1f6366dd] {
2539
+ flex: 1;
2540
+ }
2541
+ [data-component~="ui-scroll-area"][data-v-1f6366dd] {
2449
2542
  display: block;
2450
2543
  box-sizing: border-box;
2451
2544
  min-block-size: 0;
@@ -2464,29 +2557,29 @@ dd[data-v-cc61fece] {
2464
2557
  transparent
2465
2558
  );
2466
2559
  }
2467
- .content[data-v-7357ecdb] {
2560
+ .content[data-v-1f6366dd] {
2468
2561
  display: flow-root;
2469
2562
  }
2470
- [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="orientation=horizontal"][data-v-7357ecdb] {
2563
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="orientation=horizontal"][data-v-1f6366dd] {
2471
2564
  overflow-x: auto;
2472
2565
  overflow-y: hidden;
2473
2566
  --_ui-scroll-fade-direction: var(--_ui-scroll-fade-inline);
2474
2567
  }
2475
- [data-component~="ui-scroll-area"][data-v-7357ecdb]:dir(rtl) {
2568
+ [data-component~="ui-scroll-area"][data-v-1f6366dd]:dir(rtl) {
2476
2569
  --_ui-scroll-fade-inline: to left;
2477
2570
  }
2478
- [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=sm"][data-v-7357ecdb] {
2571
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=sm"][data-v-1f6366dd] {
2479
2572
  max-block-size: calc(9.375rem + var(--ui-scroll-fade-size, 24px));
2480
2573
  }
2481
- [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=md"][data-v-7357ecdb] {
2574
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=md"][data-v-1f6366dd] {
2482
2575
  max-block-size: 20rem;
2483
2576
  }
2484
- [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=lg"][data-v-7357ecdb] {
2577
+ [data-component~="ui-scroll-area"][data-ui-scroll-area-state~="size=lg"][data-v-1f6366dd] {
2485
2578
  max-block-size: 30rem;
2486
2579
  }
2487
2580
 
2488
2581
  /* A component that sets its display still honours the hidden attribute on its root. */
2489
- [data-component~="ui-scroll-area"][hidden][data-v-7357ecdb] {
2582
+ [data-component~="ui-scroll-area"][hidden][data-v-1f6366dd] {
2490
2583
  display: none;
2491
2584
  }
2492
2585
 
@@ -3534,6 +3627,20 @@ ul[data-v-d78f0cb3] {
3534
3627
  display: none;
3535
3628
  }
3536
3629
 
3630
+ [data-component~="ui-editor-surface"][data-v-7e72ed22] {
3631
+ display: flex;
3632
+ flex-direction: column;
3633
+ min-inline-size: 0;
3634
+ max-inline-size: 100%;
3635
+ }
3636
+ /* The document renderer consumes these inherited surface settings. They do not style controls. */
3637
+ [data-component~="ui-editor-surface"][data-ui-editor-surface-state~="density=compact"][data-v-7e72ed22] {
3638
+ --_ui-editor-content-min-height: 0px;
3639
+ --_ui-editor-content-padding-block: 0px;
3640
+ --_ui-editor-content-padding-inline: 0px;
3641
+ --_ui-editor-mobile-bottom-space: 0px;
3642
+ }
3643
+
3537
3644
  [data-component~="ui-editor-table-context-menu"][data-v-27797f18] {
3538
3645
  /* The max-width is a promise about the menu's footprint, so it counts padding and border. */
3539
3646
  box-sizing: border-box;
@@ -7517,11 +7624,15 @@ dialog[data-v-a7c1863a] {
7517
7624
  }
7518
7625
 
7519
7626
  /* This component's hooks style the element they are set on, and never a nested one. */
7627
+ @property --ui-stack-height {
7628
+ syntax: "*";
7629
+ inherits: false;
7630
+ }
7520
7631
  @property --ui-stack-gap {
7521
7632
  syntax: "*";
7522
7633
  inherits: false;
7523
7634
  }
7524
- [data-component~="ui-stack"][data-v-8129c161] {
7635
+ [data-component~="ui-stack"][data-v-bdf63b20] {
7525
7636
  --_layout-gap: var(--ui-space-4);
7526
7637
  display: flex;
7527
7638
  flex-direction: column;
@@ -7531,45 +7642,53 @@ dialog[data-v-a7c1863a] {
7531
7642
  max-inline-size: 100%;
7532
7643
  margin: 0;
7533
7644
  }
7534
- [data-component~="ui-stack"][data-ui-stack-state~="gap=none"][data-v-8129c161] {
7645
+ [data-component~="ui-stack"][data-ui-stack-state~="fill"][data-v-bdf63b20] {
7646
+ flex: 1;
7647
+ min-block-size: 0;
7648
+ }
7649
+ [data-component~="ui-stack"][data-ui-stack-state~="height"][data-v-bdf63b20] {
7650
+ block-size: calc(var(--ui-stack-height, 0) * 1px);
7651
+ min-block-size: 0;
7652
+ }
7653
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=none"][data-v-bdf63b20] {
7535
7654
  --_layout-gap: 0px;
7536
7655
  }
7537
- [data-component~="ui-stack"][data-ui-stack-state~="gap=xs"][data-v-8129c161] {
7656
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=xs"][data-v-bdf63b20] {
7538
7657
  --_layout-gap: var(--ui-space-2);
7539
7658
  }
7540
- [data-component~="ui-stack"][data-ui-stack-state~="gap=s"][data-v-8129c161] {
7659
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=s"][data-v-bdf63b20] {
7541
7660
  --_layout-gap: var(--ui-space-3);
7542
7661
  }
7543
- [data-component~="ui-stack"][data-ui-stack-state~="gap=m"][data-v-8129c161] {
7662
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=m"][data-v-bdf63b20] {
7544
7663
  --_layout-gap: var(--ui-space-4);
7545
7664
  }
7546
- [data-component~="ui-stack"][data-ui-stack-state~="gap=l"][data-v-8129c161] {
7665
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=l"][data-v-bdf63b20] {
7547
7666
  --_layout-gap: var(--ui-space-5);
7548
7667
  }
7549
- [data-component~="ui-stack"][data-ui-stack-state~="gap=xl"][data-v-8129c161] {
7668
+ [data-component~="ui-stack"][data-ui-stack-state~="gap=xl"][data-v-bdf63b20] {
7550
7669
  --_layout-gap: var(--ui-space-6);
7551
7670
  }
7552
- [data-component~="ui-stack"][data-ui-stack-state~="align=start"][data-v-8129c161] {
7671
+ [data-component~="ui-stack"][data-ui-stack-state~="align=start"][data-v-bdf63b20] {
7553
7672
  align-items: flex-start;
7554
7673
  }
7555
- [data-component~="ui-stack"][data-ui-stack-state~="align=center"][data-v-8129c161] {
7674
+ [data-component~="ui-stack"][data-ui-stack-state~="align=center"][data-v-bdf63b20] {
7556
7675
  align-items: center;
7557
7676
  }
7558
- [data-component~="ui-stack"][data-ui-stack-state~="align=end"][data-v-8129c161] {
7677
+ [data-component~="ui-stack"][data-ui-stack-state~="align=end"][data-v-bdf63b20] {
7559
7678
  align-items: flex-end;
7560
7679
  }
7561
- [data-component~="ui-stack"][data-ui-stack-state~="justify=center"][data-v-8129c161] {
7680
+ [data-component~="ui-stack"][data-ui-stack-state~="justify=center"][data-v-bdf63b20] {
7562
7681
  justify-content: center;
7563
7682
  }
7564
- [data-component~="ui-stack"][data-ui-stack-state~="justify=end"][data-v-8129c161] {
7683
+ [data-component~="ui-stack"][data-ui-stack-state~="justify=end"][data-v-bdf63b20] {
7565
7684
  justify-content: flex-end;
7566
7685
  }
7567
- [data-component~="ui-stack"][data-ui-stack-state~="justify=between"][data-v-8129c161] {
7686
+ [data-component~="ui-stack"][data-ui-stack-state~="justify=between"][data-v-bdf63b20] {
7568
7687
  justify-content: space-between;
7569
7688
  }
7570
7689
 
7571
7690
  /* A component that sets its display still honours the hidden attribute on its root. */
7572
- [data-component~="ui-stack"][hidden][data-v-8129c161] {
7691
+ [data-component~="ui-stack"][hidden][data-v-bdf63b20] {
7573
7692
  display: none;
7574
7693
  }
7575
7694
 
@@ -8112,7 +8231,10 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8112
8231
  /* Running text, set on the type scale and in a tone that says what it is, so a view never styles
8113
8232
  text of its own. The root is a paragraph unless as= names a span, div, small, strong, label, or
8114
8233
  heading. */
8115
- [data-component~="ui-text"][data-v-d830471c] {
8234
+ [data-component~="ui-text"][data-ui-text-state~="grow"][data-v-2c821f7e] {
8235
+ flex: 1;
8236
+ }
8237
+ [data-component~="ui-text"][data-v-2c821f7e] {
8116
8238
  margin: 0;
8117
8239
  min-inline-size: 0;
8118
8240
  color: var(--ui-text-primary);
@@ -8121,93 +8243,93 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8121
8243
 
8122
8244
  /* A heading drops the browser's heading size and weight, so size and weight set it as they set
8123
8245
  any text, and inherit keeps the text around it. */
8124
- [data-component~="ui-text"][data-v-d830471c]:is(h2, h3, h4, h5, h6) {
8246
+ [data-component~="ui-text"][data-v-2c821f7e]:is(h2, h3, h4, h5, h6) {
8125
8247
  font-size: inherit;
8126
8248
  font-weight: inherit;
8127
8249
  }
8128
- [data-component~="ui-text"][data-ui-text-state~="size=xs"][data-v-d830471c] {
8250
+ [data-component~="ui-text"][data-ui-text-state~="size=xs"][data-v-2c821f7e] {
8129
8251
  font-size: var(--ui-font-size-xs);
8130
8252
  line-height: var(--ui-line-height);
8131
8253
  }
8132
- [data-component~="ui-text"][data-ui-text-state~="size=sm"][data-v-d830471c] {
8254
+ [data-component~="ui-text"][data-ui-text-state~="size=sm"][data-v-2c821f7e] {
8133
8255
  font-size: var(--ui-font-size-sm);
8134
8256
  line-height: var(--ui-line-height);
8135
8257
  }
8136
- [data-component~="ui-text"][data-ui-text-state~="size=md"][data-v-d830471c] {
8258
+ [data-component~="ui-text"][data-ui-text-state~="size=md"][data-v-2c821f7e] {
8137
8259
  font-size: var(--ui-font-size-md);
8138
8260
  line-height: var(--ui-line-height);
8139
8261
  }
8140
- [data-component~="ui-text"][data-ui-text-state~="size=lg"][data-v-d830471c] {
8262
+ [data-component~="ui-text"][data-ui-text-state~="size=lg"][data-v-2c821f7e] {
8141
8263
  font-size: var(--ui-font-size-lg);
8142
8264
  line-height: var(--ui-line-height-relaxed);
8143
8265
  }
8144
- [data-component~="ui-text"][data-ui-text-state~="tone=secondary"][data-v-d830471c] {
8266
+ [data-component~="ui-text"][data-ui-text-state~="tone=secondary"][data-v-2c821f7e] {
8145
8267
  color: var(--ui-text-secondary);
8146
8268
  }
8147
- [data-component~="ui-text"][data-ui-text-state~="tone=muted"][data-v-d830471c] {
8269
+ [data-component~="ui-text"][data-ui-text-state~="tone=muted"][data-v-2c821f7e] {
8148
8270
  color: var(--ui-text-muted);
8149
8271
  }
8150
- [data-component~="ui-text"][data-ui-text-state~="tone=accent"][data-v-d830471c] {
8272
+ [data-component~="ui-text"][data-ui-text-state~="tone=accent"][data-v-2c821f7e] {
8151
8273
  color: var(--ui-accent-active);
8152
8274
  }
8153
8275
  /* Every status tone uses the text-safe token a subtle badge sets its words in, so text and badges
8154
8276
  in one tone match, and each holds 4.5:1 on sunken surfaces where some base colours fall short. */
8155
- [data-component~="ui-text"][data-ui-text-state~="tone=danger"][data-v-d830471c] {
8277
+ [data-component~="ui-text"][data-ui-text-state~="tone=danger"][data-v-2c821f7e] {
8156
8278
  color: var(--ui-danger-subtle-text);
8157
8279
  }
8158
- [data-component~="ui-text"][data-ui-text-state~="tone=success"][data-v-d830471c] {
8280
+ [data-component~="ui-text"][data-ui-text-state~="tone=success"][data-v-2c821f7e] {
8159
8281
  color: var(--ui-success-subtle-text);
8160
8282
  }
8161
- [data-component~="ui-text"][data-ui-text-state~="tone=info"][data-v-d830471c] {
8283
+ [data-component~="ui-text"][data-ui-text-state~="tone=info"][data-v-2c821f7e] {
8162
8284
  color: var(--ui-info-subtle-text);
8163
8285
  }
8164
- [data-component~="ui-text"][data-ui-text-state~="tone=warning"][data-v-d830471c] {
8286
+ [data-component~="ui-text"][data-ui-text-state~="tone=warning"][data-v-2c821f7e] {
8165
8287
  color: var(--ui-warning-subtle-text);
8166
8288
  }
8167
- [data-component~="ui-text"][data-ui-text-state~="weight=normal"][data-v-d830471c] {
8289
+ [data-component~="ui-text"][data-ui-text-state~="weight=normal"][data-v-2c821f7e] {
8168
8290
  font-weight: var(--ui-font-normal);
8169
8291
  }
8170
- [data-component~="ui-text"][data-ui-text-state~="weight=medium"][data-v-d830471c] {
8292
+ [data-component~="ui-text"][data-ui-text-state~="weight=medium"][data-v-2c821f7e] {
8171
8293
  font-weight: var(--ui-font-medium);
8172
8294
  }
8173
- [data-component~="ui-text"][data-ui-text-state~="weight=semibold"][data-v-d830471c] {
8295
+ [data-component~="ui-text"][data-ui-text-state~="weight=semibold"][data-v-2c821f7e] {
8174
8296
  font-weight: var(--ui-font-semibold);
8175
8297
  }
8176
- [data-component~="ui-text"][data-ui-text-state~="variant=eyebrow"][data-v-d830471c] {
8298
+ [data-component~="ui-text"][data-ui-text-state~="variant=eyebrow"][data-v-2c821f7e] {
8177
8299
  font-size: var(--ui-font-size-xs);
8178
8300
  font-weight: var(--ui-font-semibold);
8179
8301
  letter-spacing: 0.06em;
8180
8302
  text-transform: uppercase;
8181
8303
  }
8182
- [data-component~="ui-text"][data-ui-text-state~="variant=code"][data-v-d830471c] {
8304
+ [data-component~="ui-text"][data-ui-text-state~="variant=code"][data-v-2c821f7e] {
8183
8305
  font-family: var(--ui-font-family-mono);
8184
8306
  }
8185
8307
 
8186
8308
  /* A link in running text is underlined, so it stands apart from the words around it by more than
8187
8309
  colour. */
8188
- [data-component~="ui-text"] a[data-v-d830471c-s] {
8310
+ [data-component~="ui-text"] a[data-v-2c821f7e-s] {
8189
8311
  color: var(--ui-accent-active);
8190
8312
  text-decoration: underline;
8191
8313
  text-decoration-thickness: 0.06em;
8192
8314
  text-underline-offset: 0.18em;
8193
8315
  }
8194
- [data-component~="ui-text"][data-ui-text-state~="truncate"][data-v-d830471c] {
8316
+ [data-component~="ui-text"][data-ui-text-state~="truncate"][data-v-2c821f7e] {
8195
8317
  overflow: hidden;
8196
8318
  text-overflow: ellipsis;
8197
8319
  white-space: nowrap;
8198
8320
  }
8199
- [data-component~="ui-text"][data-ui-text-state~="align=center"][data-v-d830471c] {
8321
+ [data-component~="ui-text"][data-ui-text-state~="align=center"][data-v-2c821f7e] {
8200
8322
  text-align: center;
8201
8323
  }
8202
- [data-component~="ui-text"][data-ui-text-state~="font=sans"][data-v-d830471c] {
8324
+ [data-component~="ui-text"][data-ui-text-state~="font=sans"][data-v-2c821f7e] {
8203
8325
  font-family: var(--ui-font-family-sans, sans-serif);
8204
8326
  }
8205
- [data-component~="ui-text"][data-ui-text-state~="wrap=anywhere"][data-v-d830471c] {
8327
+ [data-component~="ui-text"][data-ui-text-state~="wrap=anywhere"][data-v-2c821f7e] {
8206
8328
  overflow-wrap: anywhere;
8207
8329
  }
8208
8330
 
8209
8331
  /* A component that sets its display still honours the hidden attribute on its root. */
8210
- [data-component~="ui-text"][hidden][data-v-d830471c] {
8332
+ [data-component~="ui-text"][hidden][data-v-2c821f7e] {
8211
8333
  display: none;
8212
8334
  }
8213
8335
 
@@ -8260,7 +8382,7 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8260
8382
  syntax: "*";
8261
8383
  inherits: false;
8262
8384
  }
8263
- [data-component~="ui-textarea"][data-v-f5b6ae17] {
8385
+ [data-component~="ui-textarea"][data-v-4fc6e397] {
8264
8386
  box-sizing: border-box;
8265
8387
  display: inline-block;
8266
8388
  inline-size: 100%;
@@ -8305,15 +8427,15 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8305
8427
  }
8306
8428
 
8307
8429
  /* Tabbing into a field selects its text; tint that selection softly instead of the page highlight. */
8308
- [data-component~="ui-textarea"][data-v-f5b6ae17]::selection {
8430
+ [data-component~="ui-textarea"][data-v-4fc6e397]::selection {
8309
8431
  background: color-mix(in srgb, var(--ui-accent-solid) 20%, transparent);
8310
8432
  color: inherit;
8311
8433
  }
8312
- [data-component~="ui-textarea"][data-v-f5b6ae17]::placeholder {
8434
+ [data-component~="ui-textarea"][data-v-4fc6e397]::placeholder {
8313
8435
  color: var(--ui-control-placeholder, var(--ui-text-secondary));
8314
8436
  opacity: 1;
8315
8437
  }
8316
- [data-component~="ui-textarea"][data-v-f5b6ae17]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
8438
+ [data-component~="ui-textarea"][data-v-4fc6e397]:hover:not(:focus):not(:disabled):not(:read-only):not([aria-invalid="true"]):not(:is(:user-invalid, [data-user-invalid])) {
8317
8439
  border-color: var(
8318
8440
  --ui-textarea-border-hover,
8319
8441
  var(
@@ -8322,7 +8444,7 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8322
8444
  )
8323
8445
  );
8324
8446
  }
8325
- [data-component~="ui-textarea"][data-v-f5b6ae17]:focus-visible {
8447
+ [data-component~="ui-textarea"][data-v-4fc6e397]:focus-visible {
8326
8448
  border-color: var(
8327
8449
  --ui-textarea-focus-border,
8328
8450
  var(--_ui-default-textarea-focus-border, var(--ui-control-focus, var(--ui-accent-solid)))
@@ -8339,14 +8461,14 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8339
8461
  }
8340
8462
 
8341
8463
  /* The app's invalid flag, or the browser's own verdict once the user has left an invalid field. */
8342
- [data-component~="ui-textarea"][aria-invalid="true"][data-v-f5b6ae17],
8343
- [data-component~="ui-textarea"][data-v-f5b6ae17]:is(:user-invalid, [data-user-invalid]) {
8464
+ [data-component~="ui-textarea"][aria-invalid="true"][data-v-4fc6e397],
8465
+ [data-component~="ui-textarea"][data-v-4fc6e397]:is(:user-invalid, [data-user-invalid]) {
8344
8466
  border-color: var(
8345
8467
  --ui-textarea-invalid-border,
8346
8468
  var(--_ui-default-textarea-invalid-border, var(--ui-field-danger, var(--ui-danger-solid)))
8347
8469
  );
8348
8470
  }
8349
- [data-component~="ui-textarea"][data-v-f5b6ae17]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
8471
+ [data-component~="ui-textarea"][data-v-4fc6e397]:is([aria-invalid="true"], :is(:user-invalid, [data-user-invalid])):focus-visible {
8350
8472
  box-shadow: var(
8351
8473
  --ui-textarea-invalid-focus-shadow,
8352
8474
  var(
@@ -8363,13 +8485,13 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8363
8485
  )
8364
8486
  );
8365
8487
  }
8366
- [data-component~="ui-textarea"][data-v-f5b6ae17]:disabled {
8488
+ [data-component~="ui-textarea"][data-v-4fc6e397]:disabled {
8367
8489
  background: var(--ui-control-surface-disabled, var(--ui-surface-muted));
8368
8490
  color: var(--ui-disabled-text);
8369
8491
  box-shadow: none;
8370
8492
  cursor: not-allowed;
8371
8493
  }
8372
- [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-f5b6ae17] {
8494
+ [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-4fc6e397] {
8373
8495
  --_padding-block: var(--ui-space-1);
8374
8496
  padding: var(--ui-space-1) var(--ui-space-2);
8375
8497
  padding-inline-end: var(
@@ -8378,7 +8500,7 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8378
8500
  );
8379
8501
  font-size: var(--ui-font-size-sm);
8380
8502
  }
8381
- [data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"][data-v-f5b6ae17] {
8503
+ [data-component~="ui-textarea"][data-ui-textarea-state~="size=lg"][data-v-4fc6e397] {
8382
8504
  --_padding-block: var(--ui-space-3);
8383
8505
  padding: var(--ui-space-3) var(--ui-space-4);
8384
8506
  padding-inline-end: var(
@@ -8387,8 +8509,13 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8387
8509
  );
8388
8510
  font-size: var(--ui-font-size-md);
8389
8511
  }
8512
+ [data-component~="ui-textarea"][data-ui-textarea-state~="maxRows"][data-v-4fc6e397] {
8513
+ max-block-size: calc(
8514
+ max(var(--_rows), var(--_max-rows)) * 1lh + var(--_padding-block) + var(--_padding-block) + 2px
8515
+ );
8516
+ }
8390
8517
  @supports (field-sizing: content) {
8391
- [data-component~="ui-textarea"][data-ui-textarea-state~="autosize"][data-v-f5b6ae17] {
8518
+ [data-component~="ui-textarea"][data-ui-textarea-state~="autosize"][data-v-4fc6e397] {
8392
8519
  field-sizing: content;
8393
8520
  min-block-size: calc(var(--_rows) * 1lh + var(--_padding-block) + var(--_padding-block) + 2px);
8394
8521
  }
@@ -8396,13 +8523,13 @@ tbody tr[data-v-93c9ac9c-s]:last-child > * {
8396
8523
 
8397
8524
  /* Below 16px, iOS zooms the page into the focused field, so touch keeps body-size text. */
8398
8525
  @media (pointer: coarse) {
8399
- [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-f5b6ae17] {
8526
+ [data-component~="ui-textarea"][data-ui-textarea-state~="size=sm"][data-v-4fc6e397] {
8400
8527
  font-size: inherit;
8401
8528
  }
8402
8529
  }
8403
8530
 
8404
8531
  /* A component that sets its display still honours the hidden attribute on its root. */
8405
- [data-component~="ui-textarea"][hidden][data-v-f5b6ae17] {
8532
+ [data-component~="ui-textarea"][hidden][data-v-4fc6e397] {
8406
8533
  display: none;
8407
8534
  }
8408
8535
 
@@ -9363,24 +9490,12 @@ html[data-ui-input-modality="touch"]
9363
9490
  [data-component~="ui-tree-item"][hidden][data-v-f2ec0a81] {
9364
9491
  display: none;
9365
9492
  }
9366
- /**
9367
- * Looma editor styles (tokens-based).
9368
- * Tables, context menu, insert-table grid, slash menu. Use with ProseMirror/Tiptap content.
9369
- */
9370
-
9371
- /* Turnkey editor */
9372
- .looma-editor {
9373
- position: relative;
9374
- min-width: 0;
9375
- color: var(--ui-text-primary);
9376
- font-family: var(--ui-font-family-sans);
9377
- }
9378
-
9379
- .looma-editor .ProseMirror {
9380
- min-height: var(--ui-editor-content-min-height, 300px);
9493
+ /* The editor surface owns its renderer canvas. Existing hooks retain their defaults. */
9494
+ [data-component~="ui-editor-surface"] .ProseMirror {
9495
+ min-height: var(--ui-editor-content-min-height, var(--_ui-editor-content-min-height, 300px));
9381
9496
  padding:
9382
- var(--ui-editor-content-padding-block, var(--ui-space-4))
9383
- var(--ui-editor-content-padding-inline, var(--ui-space-6));
9497
+ var(--ui-editor-content-padding-block, var(--_ui-editor-content-padding-block, var(--ui-space-4)))
9498
+ var(--ui-editor-content-padding-inline, var(--_ui-editor-content-padding-inline, var(--ui-space-6)));
9384
9499
  outline: none;
9385
9500
  color: var(--ui-editor-content-color, var(--ui-text-primary));
9386
9501
  caret-color: var(--ui-editor-caret-color, var(--ui-accent-solid));
@@ -9390,11 +9505,27 @@ html[data-ui-input-modality="touch"]
9390
9505
  }
9391
9506
 
9392
9507
  @media (max-width: 767px) {
9393
- .looma-editor .ProseMirror {
9394
- padding-bottom: var(--ui-editor-mobile-bottom-space, 80px);
9508
+ [data-component~="ui-editor-surface"] .ProseMirror {
9509
+ padding-bottom: var(--ui-editor-mobile-bottom-space, var(--_ui-editor-mobile-bottom-space, 80px));
9395
9510
  }
9396
9511
  }
9397
9512
 
9513
+
9514
+ [data-component~="ui-editor-surface"][data-density="compact"] .ProseMirror > :first-child { margin-block-start: 0; }
9515
+ [data-component~="ui-editor-surface"][data-density="compact"] .ProseMirror > :last-child { margin-block-end: 0; }
9516
+ /**
9517
+ * Looma editor styles (tokens-based).
9518
+ * Tables, context menu, insert-table grid, slash menu. Use with ProseMirror/Tiptap content.
9519
+ */
9520
+
9521
+ /* Turnkey editor */
9522
+ .looma-editor {
9523
+ position: relative;
9524
+ min-width: 0;
9525
+ color: var(--ui-text-primary);
9526
+ font-family: var(--ui-font-family-sans);
9527
+ }
9528
+
9398
9529
  /*
9399
9530
  * Marker for the block being edited, drawn in the gutter beside the text rather
9400
9531
  * than around it: a border or fill on the reading column reads as a form field.