@eos-ui/vue 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +4 -4
  2. package/dist/component-names.js +1 -1
  3. package/dist/component-names.js.map +1 -1
  4. package/dist/components/Actions/EActions.js.map +1 -1
  5. package/dist/components/Actions/EActions.vue.d.ts +1 -1
  6. package/dist/components/Actions/EActions.vue_vue_type_script_setup_true_lang.js.map +1 -1
  7. package/dist/components/Avatar/EAvatar.js.map +1 -1
  8. package/dist/components/Avatar/EAvatar.vue.d.ts +1 -1
  9. package/dist/components/Avatar/EAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  10. package/dist/components/Button/EButton.js.map +1 -1
  11. package/dist/components/Button/EButton.vue.d.ts +2 -0
  12. package/dist/components/Button/EButton.vue_vue_type_script_setup_true_lang.js +64 -29
  13. package/dist/components/Button/EButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  14. package/dist/components/Calendar/ECalendar.js.map +1 -1
  15. package/dist/components/Calendar/ECalendar.vue.d.ts +1 -1
  16. package/dist/components/Calendar/ECalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/components/Checkbox/ECheckbox.js.map +1 -1
  18. package/dist/components/Checkbox/ECheckbox.vue.d.ts +1 -1
  19. package/dist/components/Checkbox/ECheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  20. package/dist/components/CodeBlock/ECodeBlock.js.map +1 -1
  21. package/dist/components/CodeBlock/ECodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -1
  22. package/dist/components/Combobox/EComboboxBase.js.map +1 -1
  23. package/dist/components/Combobox/EComboboxBase.vue_vue_type_script_setup_true_lang.js +4 -8
  24. package/dist/components/Combobox/EComboboxBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  25. package/dist/components/Combobox/types.d.ts +2 -2
  26. package/dist/components/DataGrid/EDataGrid.js.map +1 -1
  27. package/dist/components/DataGrid/EDataGrid.vue.d.ts +1 -1
  28. package/dist/components/DataGrid/EDataGrid.vue_vue_type_script_setup_true_lang.js +1 -0
  29. package/dist/components/DataGrid/EDataGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  30. package/dist/components/DescriptionList/EDescriptionList.js.map +1 -1
  31. package/dist/components/DescriptionList/EDescriptionList.vue_vue_type_script_setup_true_lang.js +2 -2
  32. package/dist/components/DescriptionList/EDescriptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/Dialog/EDialog.js.map +1 -1
  34. package/dist/components/Dialog/EDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/Drawer/EDrawer.js.map +1 -1
  36. package/dist/components/Drawer/EDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  37. package/dist/components/EmptyState/EEmptyState.js.map +1 -1
  38. package/dist/components/EmptyState/EEmptyState.vue.d.ts +1 -1
  39. package/dist/components/EmptyState/EEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/ExpandableRow/EExpandableRow.js.map +1 -1
  41. package/dist/components/ExpandableRow/EExpandableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  42. package/dist/components/Grid/EGrid.js.map +1 -1
  43. package/dist/components/Grid/EGrid.vue.d.ts +1 -1
  44. package/dist/components/Grid/EGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  45. package/dist/components/IconButton/EIconButton.js.map +1 -1
  46. package/dist/components/IconButton/EIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/components/Inline/EInline.js.map +1 -1
  48. package/dist/components/Inline/EInline.vue.d.ts +1 -1
  49. package/dist/components/Inline/EInline.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/Kbd/EKbd.js.map +1 -1
  51. package/dist/components/Kbd/EKbd.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/components/Menu/EMenu.js.map +1 -1
  53. package/dist/components/Menu/EMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/NavList/ENavList.js.map +1 -1
  55. package/dist/components/NavList/ENavList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  56. package/dist/components/Notice/ENotice.js.map +1 -1
  57. package/dist/components/Notice/ENotice.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/OtpField/EOtpField.js.map +1 -1
  59. package/dist/components/OtpField/EOtpField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  60. package/dist/components/Pagination/EPagination.js.map +1 -1
  61. package/dist/components/Pagination/EPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  62. package/dist/components/PasswordField/EPasswordField.js.map +1 -1
  63. package/dist/components/PasswordField/EPasswordField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  64. package/dist/components/Progress/EProgress.js.map +1 -1
  65. package/dist/components/Progress/EProgress.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/SearchBar/ESearchBar.js.map +1 -1
  67. package/dist/components/SearchBar/ESearchBar.vue.d.ts +1 -1
  68. package/dist/components/SearchBar/ESearchBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/SearchResults/ESearchResults.js.map +1 -1
  70. package/dist/components/SearchResults/ESearchResults.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/components/Segmented/ESegmented.js.map +1 -1
  72. package/dist/components/Segmented/ESegmented.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/Select/ESelectControl.js.map +1 -1
  74. package/dist/components/Select/ESelectControl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  75. package/dist/components/SignaturePad/ESignaturePad.js.map +1 -1
  76. package/dist/components/SignaturePad/ESignaturePad.vue_vue_type_script_setup_true_lang.js.map +1 -1
  77. package/dist/components/Skeleton/ESkeleton.js.map +1 -1
  78. package/dist/components/Skeleton/ESkeleton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  79. package/dist/components/Stack/EStack.js.map +1 -1
  80. package/dist/components/Stack/EStack.vue.d.ts +1 -1
  81. package/dist/components/Stack/EStack.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/Stamp/EStamp.js.map +1 -1
  83. package/dist/components/Stamp/EStamp.vue.d.ts +2 -2
  84. package/dist/components/Stamp/EStamp.vue_vue_type_script_setup_true_lang.js +2 -2
  85. package/dist/components/Stamp/EStamp.vue_vue_type_script_setup_true_lang.js.map +1 -1
  86. package/dist/components/Stepper/EStepper.js.map +1 -1
  87. package/dist/components/Stepper/EStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  88. package/dist/components/Surface/ESurface.js.map +1 -1
  89. package/dist/components/Surface/ESurface.vue.d.ts +1 -1
  90. package/dist/components/Surface/ESurface.vue_vue_type_script_setup_true_lang.js.map +1 -1
  91. package/dist/components/Switch/ESwitch.js.map +1 -1
  92. package/dist/components/Switch/ESwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  93. package/dist/components/Table/ETable.js +8 -0
  94. package/dist/components/Table/ETable.js.map +1 -0
  95. package/dist/components/Table/ETable.vue.d.ts +25 -0
  96. package/dist/components/Table/ETable.vue_vue_type_script_setup_true_lang.js +28 -0
  97. package/dist/components/Table/ETable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  98. package/dist/components/Table/index.d.ts +1 -0
  99. package/dist/components/Tabs/ETabs.js.map +1 -1
  100. package/dist/components/Tabs/ETabs.vue.d.ts +10 -2
  101. package/dist/components/Tabs/ETabs.vue_vue_type_script_setup_true_lang.js +11 -3
  102. package/dist/components/Tabs/ETabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  103. package/dist/components/Upload/EUpload.js.map +1 -1
  104. package/dist/components/Upload/EUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  105. package/dist/index.d.ts +1 -0
  106. package/dist/index.js +10 -9
  107. package/dist/style.css +572 -364
  108. package/package.json +3 -2
package/dist/style.css CHANGED
@@ -178,6 +178,8 @@
178
178
  .e-radio,
179
179
  .e-sel-trigger,
180
180
  .e-combo,
181
+ .e-search,
182
+ .e-seg,
181
183
  .e-avatar {
182
184
  border: 1px solid ButtonText;
183
185
  }
@@ -464,6 +466,9 @@
464
466
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
465
467
  @layer e.primitives {
466
468
  .e-avatar {
469
+ --e-ring: var(--e-border-strong);
470
+
471
+ position: relative;
467
472
  display: inline-grid;
468
473
  place-items: center;
469
474
  flex: none;
@@ -471,28 +476,31 @@
471
476
  width: var(--e-tap, 44px);
472
477
  height: var(--e-tap, 44px);
473
478
  overflow: hidden;
474
- border: var(--e-stroke-edge) solid var(--e-border-strong);
475
-
476
- --e-bc: var(--e-border-strong);
477
-
478
- outline: var(--e-stroke-edge) solid var(--e-bc);
479
- outline-offset: calc(-1 * var(--e-stroke-edge));
479
+ border: 0;
480
480
  border-radius: var(--e-radius-md);
481
481
  background: var(--e-surface-tint);
482
482
  color: var(--e-primary);
483
483
  font: 600 var(--e-text-sm) / 1 var(--e-font-mono);
484
484
  letter-spacing: 0.02em;
485
485
  }
486
+
487
+ /* The ring sits over the picture so an image never covers it. */
488
+ .e-avatar::after {
489
+ content: "";
490
+ position: absolute;
491
+ inset: 0;
492
+ border-radius: inherit;
493
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ring);
494
+ pointer-events: none;
495
+ transition: box-shadow var(--e-duration-tap) var(--e-easing-out);
496
+ }
486
497
  .e-avatar--button {
487
498
  position: relative;
488
499
  padding: 0;
489
500
  cursor: pointer;
490
- transition: border-color var(--e-duration-tap) var(--e-easing-out);
491
501
  }
492
502
  .e-avatar--button:hover {
493
- border-color: var(--e-ink);
494
-
495
- --e-bc: var(--e-ink);
503
+ --e-ring: var(--e-ink);
496
504
  }
497
505
  .e-avatar--button:focus-visible {
498
506
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -615,22 +623,24 @@
615
623
  --e-hover: color-mix(in srgb, var(--e-fill), var(--e-shade-hover));
616
624
  --e-press: color-mix(in srgb, var(--e-fill), var(--e-shade-press));
617
625
 
626
+ /* One rounded box, one control height tall. The slab is an inset shadow shifted up by the lift: the part of the box left uncovered along its bottom, which follows the corners up the sides, in the colour of the box's own edge. It is cut by the box's one outline, so nothing sits behind the curve. Pressing sinks the face over it. */
627
+ --e-lift: var(--e-depth);
628
+ --e-band: calc(var(--e-lift) + var(--e-stroke-edge));
629
+ --e-ring: var(--e-slab);
630
+
618
631
  position: relative;
619
632
  display: inline-flex;
620
633
  align-items: center;
621
634
  justify-content: center;
622
635
  gap: var(--e-space-2);
623
636
  height: var(--e-control-height);
624
- padding: var(--e-depth) var(--e-space-4) 0;
625
- border: var(--e-stroke-edge) solid var(--e-slab);
626
-
627
- --e-bc: var(--e-slab);
628
-
629
- outline: var(--e-stroke-edge) solid var(--e-bc);
630
- outline-offset: calc(-1 * var(--e-stroke-edge));
631
- border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));
637
+ padding: 0 var(--e-space-4) var(--e-lift);
638
+ border: 0;
632
639
  border-radius: var(--e-radius-md);
633
- background: var(--e-fill);
640
+ background-color: var(--e-fill);
641
+ box-shadow:
642
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
643
+ inset 0 calc(-1 * var(--e-band)) 0 0 var(--e-slab);
634
644
  color: var(--e-on-fill);
635
645
  font: 500 var(--e-text-md) / 1 var(--e-font-sans);
636
646
  letter-spacing: 0.01em;
@@ -642,12 +652,15 @@
642
652
  background-color var(--e-duration-tap) var(--e-easing-out);
643
653
  }
644
654
  .e-btn:hover {
645
- background: var(--e-hover);
655
+ --e-slab: color-mix(in srgb, var(--e-hover), var(--e-shade-slab));
656
+
657
+ background-color: var(--e-hover);
646
658
  }
647
659
  .e-btn:active {
648
- background: var(--e-press);
649
- border-bottom-width: var(--e-stroke-edge);
650
- box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, transparent, var(--e-shade-press));
660
+ --e-lift: 0px;
661
+
662
+ background-color: var(--e-press);
663
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ring);
651
664
  }
652
665
  .e-btn--secondary {
653
666
  --e-fill: var(--e-secondary);
@@ -663,30 +676,24 @@
663
676
  --e-slab: var(--e-border-strong);
664
677
  }
665
678
  .e-btn--outline:hover {
666
- background: color-mix(in srgb, var(--e-surface), var(--e-shade-hover));
667
- border-color: var(--e-ink);
679
+ --e-ring: var(--e-ink);
680
+ --e-slab: var(--e-ink);
668
681
 
669
- --e-bc: var(--e-ink);
682
+ background-color: color-mix(in srgb, var(--e-surface), var(--e-shade-hover));
670
683
  }
671
684
  .e-btn--outline:active {
672
- background: color-mix(in srgb, var(--e-surface), var(--e-shade-press));
673
- border-color: var(--e-ink);
674
-
675
- --e-bc: var(--e-ink);
685
+ --e-ring: var(--e-ink);
686
+ --e-slab: var(--e-ink);
676
687
 
677
- border-bottom-width: var(--e-stroke-edge);
678
- box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, transparent, var(--e-shade-press));
688
+ background-color: color-mix(in srgb, var(--e-surface), var(--e-shade-press));
679
689
  }
680
690
  .e-btn--quiet {
681
- border-color: transparent;
691
+ --e-ring: transparent;
692
+ --e-lift: 0px;
682
693
 
683
- --e-bc: transparent;
684
-
685
- border-bottom-width: var(--e-stroke-edge);
686
694
  background: transparent;
687
695
  color: var(--e-ink);
688
- box-shadow: none;
689
- padding-top: 0;
696
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ring);
690
697
  padding-inline: var(--e-space-3);
691
698
  text-decoration: underline;
692
699
  text-underline-offset: 5px;
@@ -694,25 +701,72 @@
694
701
  text-decoration-color: var(--e-border-strong);
695
702
  }
696
703
  .e-btn--quiet:not([disabled], [aria-disabled="true"]):hover {
697
- border-color: var(--e-wash-ring);
698
-
699
- --e-bc: var(--e-wash-ring);
704
+ --e-ring: var(--e-wash-ring);
700
705
 
701
706
  background: var(--e-wash-hover);
702
707
  text-decoration-color: currentcolor;
703
708
  }
704
709
  .e-btn--quiet:not([disabled], [aria-disabled="true"]):active {
705
- border-color: var(--e-ink);
706
-
707
- --e-bc: var(--e-ink);
710
+ --e-ring: var(--e-ink);
708
711
 
709
712
  background: var(--e-wash-press);
710
- box-shadow: none;
711
- padding-top: 0;
713
+ transform: none;
712
714
  }
713
- .e-btn .e-icon {
715
+ .e-btn .e-icon,
716
+ .e-btn-spinner {
714
717
  margin-inline-start: calc(-0.5 * var(--e-space-1));
715
718
  }
719
+ .e-btn-spinner {
720
+ flex: none;
721
+ width: 1.125em;
722
+ height: 1.125em;
723
+ fill: none;
724
+ stroke: currentcolor;
725
+ stroke-width: 3;
726
+ stroke-linecap: round;
727
+ stroke-dasharray: 36 56;
728
+ animation: e-btn-spin 0.9s linear infinite;
729
+ }
730
+
731
+ /* Busy reads as unavailable and in progress: a soft tint of the button's colour with a dashed edge like a disabled button, and stripes that move. The face grows over its slab, so the button stays one control height tall. The edge is a pseudo-element, so a page's focus reset cannot remove it. */
732
+ .e-btn--loading {
733
+ --e-lift: 0px;
734
+ --e-tint: var(--e-fill);
735
+ --e-busy: color-mix(in srgb, var(--e-tint) 80%, var(--e-ink));
736
+ }
737
+ .e-btn--outline.e-btn--loading {
738
+ --e-tint: var(--e-border-strong);
739
+ }
740
+ .e-btn--loading,
741
+ .e-btn--loading:hover,
742
+ .e-btn--loading:active {
743
+ background-color: color-mix(in srgb, var(--e-tint) 14%, var(--e-surface));
744
+ background-image: repeating-linear-gradient(135deg, transparent 0 8px, color-mix(in srgb, var(--e-tint) 20%, transparent) 8px 16px);
745
+ background-size: 22.63px 22.63px;
746
+ box-shadow: none;
747
+ color: var(--e-busy);
748
+ transform: none;
749
+ cursor: not-allowed;
750
+ animation: e-btn-stripes 0.8s linear infinite;
751
+ }
752
+ .e-btn--loading::before {
753
+ content: "";
754
+ position: absolute;
755
+ inset: 0;
756
+ border: var(--e-stroke-edge) dashed var(--e-busy);
757
+ border-radius: inherit;
758
+ pointer-events: none;
759
+ }
760
+ @keyframes e-btn-stripes {
761
+ to {
762
+ background-position-x: 22.63px;
763
+ }
764
+ }
765
+ @keyframes e-btn-spin {
766
+ to {
767
+ transform: rotate(360deg);
768
+ }
769
+ }
716
770
  .e-btn--block {
717
771
  width: 100%;
718
772
  }
@@ -722,26 +776,33 @@
722
776
  .e-btn[aria-pressed="true"]:hover,
723
777
  .e-btn[aria-pressed="true"]:active {
724
778
  --e-slab: var(--e-primary);
725
- --e-bc: var(--e-primary);
779
+ --e-ring: var(--e-primary);
726
780
 
727
- border-color: var(--e-primary);
728
- background: var(--e-surface-hover);
781
+ background-color: var(--e-surface-hover);
729
782
  color: var(--e-primary);
730
783
  }
731
784
  .e-btn[disabled],
732
785
  .e-btn[aria-disabled="true"] {
786
+ --e-lift: 0px;
787
+
733
788
  cursor: not-allowed;
734
789
  background: transparent;
735
790
  color: var(--e-muted);
736
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
737
- outline: 0;
791
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
792
+ outline-offset: calc(-1 * var(--e-stroke-edge));
738
793
  box-shadow: none;
739
- padding-top: 0;
794
+ transform: none;
740
795
  }
741
796
  @media (prefers-reduced-motion: reduce) {
742
797
  .e-btn {
743
798
  transition: none;
744
799
  }
800
+ .e-btn-spinner {
801
+ animation-duration: 3s;
802
+ }
803
+ .e-btn--loading {
804
+ animation: none;
805
+ }
745
806
  }
746
807
  @media print {
747
808
  .e-btn {
@@ -759,7 +820,7 @@
759
820
  }
760
821
  .e-btn[disabled],
761
822
  .e-btn[aria-disabled="true"] {
762
- border-color: GrayText;
823
+ outline-color: GrayText;
763
824
  color: GrayText;
764
825
  }
765
826
  }
@@ -789,7 +850,8 @@
789
850
  box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ink);
790
851
  }
791
852
  .e-icon-btn:disabled {
792
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
853
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
854
+ outline-offset: calc(-1 * var(--e-stroke-edge));
793
855
  color: var(--e-muted);
794
856
  cursor: not-allowed;
795
857
  }
@@ -810,7 +872,7 @@
810
872
  outline-offset: calc(-1 * var(--e-stroke-edge));
811
873
  }
812
874
  .e-icon-btn:disabled {
813
- border-color: GrayText;
875
+ outline-color: GrayText;
814
876
  color: GrayText;
815
877
  }
816
878
  }
@@ -848,12 +910,7 @@
848
910
  gap: var(--e-space-1);
849
911
  height: var(--e-control-height);
850
912
  padding: 0 var(--e-space-2);
851
- border: var(--e-stroke-edge) solid transparent;
852
-
853
- --e-bc: transparent;
854
-
855
- outline: var(--e-stroke-edge) solid var(--e-bc);
856
- outline-offset: calc(-1 * var(--e-stroke-edge));
913
+ border: 0;
857
914
  border-radius: var(--e-radius-md);
858
915
  background: transparent;
859
916
  color: var(--e-ink);
@@ -863,9 +920,7 @@
863
920
  }
864
921
  .e-cal-pick:hover {
865
922
  background: var(--e-surface-hover);
866
- border-color: var(--e-border-strong);
867
-
868
- --e-bc: var(--e-border-strong);
923
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
869
924
  }
870
925
  .e-cal-pick:focus-visible {
871
926
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -918,12 +973,7 @@
918
973
  width: 100%;
919
974
  height: var(--e-tap);
920
975
  padding: 0;
921
- border: var(--e-stroke-edge) solid transparent;
922
-
923
- --e-bc: transparent;
924
-
925
- outline: var(--e-stroke-edge) solid var(--e-bc);
926
- outline-offset: calc(-1 * var(--e-stroke-edge));
976
+ border: 0;
927
977
  border-radius: var(--e-radius-md);
928
978
  background: transparent;
929
979
  color: var(--e-ink);
@@ -936,9 +986,7 @@
936
986
  /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */
937
987
  .e-day:hover:not(:disabled):not(.e-day--sel) {
938
988
  background: var(--e-surface-hover);
939
- border-color: var(--e-border-strong);
940
-
941
- --e-bc: var(--e-border-strong);
989
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
942
990
  }
943
991
  .e-day:focus-visible {
944
992
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -953,10 +1001,7 @@
953
1001
  }
954
1002
  .e-day--sel {
955
1003
  background: var(--e-primary);
956
- border-color: var(--e-primary);
957
-
958
- --e-bc: var(--e-primary);
959
-
1004
+ box-shadow: none;
960
1005
  font-weight: 700;
961
1006
  color: var(--e-on-primary);
962
1007
  }
@@ -999,12 +1044,7 @@
999
1044
  height: 100%;
1000
1045
  min-height: var(--e-tap);
1001
1046
  padding: 0;
1002
- border: var(--e-stroke-edge) solid transparent;
1003
-
1004
- --e-bc: transparent;
1005
-
1006
- outline: var(--e-stroke-edge) solid var(--e-bc);
1007
- outline-offset: calc(-1 * var(--e-stroke-edge));
1047
+ border: 0;
1008
1048
  border-radius: var(--e-radius-md);
1009
1049
  background: transparent;
1010
1050
  color: var(--e-ink);
@@ -1020,9 +1060,7 @@
1020
1060
  /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */
1021
1061
  .e-cal-cell:hover:not(:disabled):not(.e-day--sel) {
1022
1062
  background: var(--e-surface-hover);
1023
- border-color: var(--e-border-strong);
1024
-
1025
- --e-bc: var(--e-border-strong);
1063
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
1026
1064
  }
1027
1065
  .e-cal-cell:focus-visible {
1028
1066
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -1035,10 +1073,7 @@
1035
1073
  }
1036
1074
  .e-cal-cell.e-day--sel {
1037
1075
  background: var(--e-primary);
1038
- border-color: var(--e-primary);
1039
-
1040
- --e-bc: var(--e-primary);
1041
-
1076
+ box-shadow: none;
1042
1077
  font-weight: 700;
1043
1078
  color: var(--e-on-primary);
1044
1079
  }
@@ -1141,12 +1176,17 @@
1141
1176
  width: 24px;
1142
1177
  height: 24px;
1143
1178
  margin: 0;
1144
- border: var(--e-stroke-edge) solid var(--e-border-strong);
1179
+
1180
+ --e-ring: var(--e-border-strong);
1181
+
1182
+ border: 0;
1145
1183
  background: var(--e-surface);
1146
- box-shadow: var(--e-well);
1184
+ box-shadow:
1185
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
1186
+ var(--e-well);
1147
1187
  cursor: inherit;
1148
1188
  transition:
1149
- border-color var(--e-duration-tap) var(--e-easing-out),
1189
+ box-shadow var(--e-duration-tap) var(--e-easing-out),
1150
1190
  background-color var(--e-duration-tap) var(--e-easing-out);
1151
1191
  }
1152
1192
 
@@ -1160,12 +1200,12 @@
1160
1200
 
1161
1201
  .e-check:hover,
1162
1202
  .e-radio:hover {
1163
- border-color: var(--e-ink);
1203
+ --e-ring: var(--e-ink);
1204
+
1164
1205
  background-color: var(--e-surface-hover);
1165
1206
  }
1166
1207
 
1167
1208
  .e-check:checked {
1168
- border-color: var(--e-primary);
1169
1209
  background-color: var(--e-primary);
1170
1210
  box-shadow: none;
1171
1211
  }
@@ -1184,7 +1224,6 @@
1184
1224
  }
1185
1225
 
1186
1226
  .e-radio:checked {
1187
- border-color: var(--e-primary);
1188
1227
  background-color: var(--e-primary);
1189
1228
  box-shadow: none;
1190
1229
  background-image: radial-gradient(circle, var(--e-on-primary) 0 4px, transparent 5px);
@@ -1204,16 +1243,17 @@
1204
1243
 
1205
1244
  .e-check:disabled,
1206
1245
  .e-radio:disabled {
1207
- border-style: dashed;
1246
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
1247
+ outline-offset: calc(-1 * var(--e-stroke-edge));
1208
1248
  background-color: var(--e-surface-tint);
1209
1249
  box-shadow: none;
1210
1250
  }
1211
1251
 
1212
1252
  .e-check:checked:disabled,
1213
1253
  .e-radio:checked:disabled {
1214
- border-style: solid;
1254
+ outline: 0;
1215
1255
  background-color: var(--e-surface-tint);
1216
- border-color: var(--e-border-strong);
1256
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
1217
1257
  }
1218
1258
 
1219
1259
  @media (prefers-reduced-motion: reduce) {
@@ -1278,8 +1318,6 @@
1278
1318
  border-radius: var(--e-radius-md);
1279
1319
  background: var(--e-surface);
1280
1320
  box-shadow: var(--e-edge);
1281
- outline: var(--e-stroke-card) solid var(--e-border);
1282
- outline-offset: 0;
1283
1321
  }
1284
1322
 
1285
1323
  /* Code blocks stacked back to back share one seam: the rings overlap into a single line. */
@@ -1358,23 +1396,22 @@
1358
1396
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
1359
1397
  @layer e.controls {
1360
1398
  .e-input {
1399
+ --e-ring: var(--e-border-strong);
1400
+
1361
1401
  width: 100%;
1362
1402
  min-width: 0;
1363
1403
  height: var(--e-control-height);
1364
1404
  padding: 0 var(--e-space-4);
1365
- border: var(--e-stroke-edge) solid var(--e-border-strong);
1366
-
1367
- --e-bc: var(--e-border-strong);
1368
-
1369
- outline: var(--e-stroke-edge) solid var(--e-bc);
1370
- outline-offset: calc(-1 * var(--e-stroke-edge));
1405
+ border: 0;
1371
1406
  border-radius: var(--e-radius-md);
1372
1407
  background-color: var(--e-surface);
1373
- box-shadow: var(--e-well);
1408
+ box-shadow:
1409
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
1410
+ var(--e-well);
1374
1411
  color: var(--e-ink);
1375
1412
  font: 400 var(--e-text-md)/1 var(--e-font-sans);
1376
1413
  transition:
1377
- border-color var(--e-duration-tap) var(--e-easing-out),
1414
+ box-shadow var(--e-duration-tap) var(--e-easing-out),
1378
1415
  background-color var(--e-duration-tap) var(--e-easing-out);
1379
1416
  }
1380
1417
 
@@ -1383,34 +1420,34 @@
1383
1420
  }
1384
1421
 
1385
1422
  .e-input:hover {
1386
- border-color: var(--e-ink);
1387
-
1388
- --e-bc: var(--e-ink);
1389
-
1390
1423
  background-color: var(--e-surface-hover);
1391
1424
  }
1392
1425
 
1393
1426
  .e-input:focus {
1394
- border-color: var(--e-focus-field);
1395
-
1396
- --e-bc: var(--e-focus-field);
1427
+ --e-ring: var(--e-focus-field);
1397
1428
 
1398
1429
  background-color: var(--e-surface);
1399
1430
  }
1400
1431
 
1432
+ /* A field's focus outline lies over its border and then reaches at least as far outside it again, so the field looks thicker on every stroke preset. */
1401
1433
  .e-input:focus-visible {
1434
+ outline-width: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge)));
1402
1435
  outline-color: var(--e-focus-field);
1403
1436
  outline-offset: var(--e-focus-gap-field);
1404
1437
  }
1405
1438
 
1406
1439
  .e-input[aria-invalid="true"] {
1407
- border-color: var(--e-danger);
1440
+ --e-ring: var(--e-danger);
1408
1441
 
1409
- --e-bc: var(--e-danger);
1442
+ background-color: var(--e-surface);
1443
+ }
1444
+
1445
+ .e-input[aria-invalid="true"]:hover {
1446
+ background-color: var(--e-danger-soft);
1447
+ }
1410
1448
 
1449
+ .e-input[aria-invalid="true"]:focus {
1411
1450
  background-color: var(--e-surface);
1412
- box-shadow:
1413
- var(--e-well), inset 0 0 0 var(--e-stroke-hair) var(--e-danger);
1414
1451
  }
1415
1452
 
1416
1453
  .e-input[aria-invalid="true"]:focus-visible {
@@ -1419,8 +1456,8 @@
1419
1456
 
1420
1457
  .e-input:disabled {
1421
1458
  cursor: not-allowed;
1422
- border-style: dashed;
1423
- outline: 0;
1459
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
1460
+ outline-offset: calc(-1 * var(--e-stroke-edge));
1424
1461
  background-color: var(--e-surface-tint);
1425
1462
  box-shadow: none;
1426
1463
  color: var(--e-muted);
@@ -1431,63 +1468,52 @@
1431
1468
  }
1432
1469
 
1433
1470
  .e-input-wrap {
1471
+ --e-ring: var(--e-border-strong);
1472
+
1434
1473
  display: flex;
1435
1474
  align-items: stretch;
1436
1475
  min-width: 0;
1437
1476
  min-height: var(--e-control-height);
1438
- border: var(--e-stroke-edge) solid var(--e-border-strong);
1439
-
1440
- --e-bc: var(--e-border-strong);
1441
-
1442
- outline: var(--e-stroke-edge) solid var(--e-bc);
1443
- outline-offset: calc(-1 * var(--e-stroke-edge));
1444
1477
  border-radius: var(--e-radius-md);
1445
1478
  background: var(--e-surface);
1446
- box-shadow: var(--e-well);
1479
+ box-shadow:
1480
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
1481
+ var(--e-well);
1447
1482
  transition:
1448
- border-color var(--e-duration-tap) var(--e-easing-out),
1483
+ box-shadow var(--e-duration-tap) var(--e-easing-out),
1449
1484
  background-color var(--e-duration-tap) var(--e-easing-out);
1450
1485
  }
1451
1486
 
1452
1487
  .e-input-wrap:hover {
1453
- border-color: var(--e-ink);
1454
-
1455
- --e-bc: var(--e-ink);
1456
-
1457
1488
  background: var(--e-surface-hover);
1458
1489
  }
1459
1490
 
1460
1491
  .e-input-wrap:focus-within {
1461
- border-color: var(--e-focus-field);
1462
-
1463
- --e-bc: var(--e-focus-field);
1492
+ --e-ring: var(--e-focus-field);
1464
1493
 
1465
1494
  background: var(--e-surface);
1466
- outline: var(--e-stroke-focus) solid var(--e-focus-field);
1495
+ outline: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge))) solid var(--e-focus-field);
1467
1496
  outline-offset: var(--e-focus-gap-field);
1468
1497
  }
1469
1498
 
1470
1499
  .e-input-wrap[data-invalid] {
1471
- border-color: var(--e-danger);
1472
-
1473
- --e-bc: var(--e-danger);
1500
+ --e-ring: var(--e-danger);
1474
1501
 
1475
- box-shadow:
1476
- var(--e-well), inset 0 0 0 var(--e-stroke-hair) var(--e-danger);
1477
1502
  background: var(--e-surface);
1478
1503
  }
1479
1504
 
1480
- .e-input-wrap[data-invalid]:focus-within {
1481
- border-color: var(--e-danger);
1482
-
1483
- --e-bc: var(--e-danger);
1505
+ .e-input-wrap[data-invalid]:hover {
1506
+ background: var(--e-danger-soft);
1507
+ }
1484
1508
 
1509
+ .e-input-wrap[data-invalid]:focus-within {
1510
+ background: var(--e-surface);
1485
1511
  outline-color: var(--e-danger);
1486
1512
  }
1487
1513
 
1488
1514
  .e-input-wrap[data-disabled] {
1489
- border-style: dashed;
1490
- outline: 0;
1515
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
1516
+ outline-offset: calc(-1 * var(--e-stroke-edge));
1491
1517
  background: var(--e-surface-tint);
1492
1518
  box-shadow: none;
1493
1519
  color: var(--e-muted);
@@ -1495,7 +1521,6 @@
1495
1521
 
1496
1522
  .e-input-wrap .e-input {
1497
1523
  flex: 1;
1498
- border: 0;
1499
1524
  outline: 0;
1500
1525
  background: transparent;
1501
1526
  box-shadow: none;
@@ -1547,7 +1572,7 @@
1547
1572
 
1548
1573
  .e-input:disabled,
1549
1574
  .e-input-wrap[data-disabled] {
1550
- border-color: GrayText;
1575
+ outline-color: GrayText;
1551
1576
  }
1552
1577
 
1553
1578
  .e-input:focus-visible,
@@ -1649,8 +1674,6 @@ to {
1649
1674
  background: var(--e-surface);
1650
1675
  color: var(--e-ink);
1651
1676
  box-shadow: var(--e-float);
1652
- outline: var(--e-stroke-card) solid var(--e-border-strong);
1653
- outline-offset: 0;
1654
1677
  font-family: var(--e-font-sans);
1655
1678
  }
1656
1679
 
@@ -1697,8 +1720,6 @@ to {
1697
1720
  .e-opt--active {
1698
1721
  background: var(--e-surface-tint);
1699
1722
  box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-border-strong);
1700
- outline: var(--e-stroke-hair) solid var(--e-border-strong);
1701
- outline-offset: calc(-1 * var(--e-stroke-hair));
1702
1723
  }
1703
1724
 
1704
1725
  .e-opt--selected .e-opt-label {
@@ -1762,8 +1783,6 @@ to {
1762
1783
  .e-opt[data-highlighted]:not(.e-opt--disabled) {
1763
1784
  background: var(--e-surface-tint);
1764
1785
  box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-border-strong);
1765
- outline: var(--e-stroke-hair) solid var(--e-border-strong);
1766
- outline-offset: calc(-1 * var(--e-stroke-hair));
1767
1786
  }
1768
1787
 
1769
1788
  .e-opt-set {
@@ -1888,6 +1907,9 @@ to {
1888
1907
  align-self: center;
1889
1908
  padding-inline: var(--e-space-2);
1890
1909
  }
1910
+ .e-combo-main .e-tag:not(:has(.e-tag-x)) {
1911
+ padding-inline-end: var(--e-space-3);
1912
+ }
1891
1913
  .e-tag {
1892
1914
  display: inline-flex;
1893
1915
  align-items: center;
@@ -2042,32 +2064,23 @@ to {
2042
2064
  justify-items: center;
2043
2065
  gap: var(--e-space-2);
2044
2066
  padding: var(--e-space-8) var(--e-space-4);
2045
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
2067
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
2068
+ outline-offset: calc(-1 * var(--e-stroke-edge));
2046
2069
  border-radius: var(--e-radius-md);
2047
2070
  text-align: center;
2048
2071
  }
2049
2072
  .e-empty--bare {
2050
- border: 0;
2073
+ outline: 0;
2051
2074
  }
2052
2075
  .e-empty-icon {
2053
2076
  display: grid;
2054
2077
  place-items: center;
2055
- box-sizing: border-box;
2056
- width: 56px;
2057
- height: 56px;
2058
2078
  margin-bottom: var(--e-space-1);
2059
- border-radius: 50%;
2060
- background: var(--e-secondary-soft);
2061
- border: var(--e-stroke-hair) solid var(--e-secondary);
2062
-
2063
- --e-bc: var(--e-secondary);
2064
-
2065
- outline: var(--e-stroke-hair) solid var(--e-bc);
2066
- outline-offset: calc(-1 * var(--e-stroke-hair));
2079
+ color: var(--e-primary);
2067
2080
  }
2068
2081
  .e-empty-icon .e-icon {
2069
- width: 26px;
2070
- height: 26px;
2082
+ width: 40px;
2083
+ height: 40px;
2071
2084
  }
2072
2085
  .e-empty-title {
2073
2086
  margin: 0;
@@ -2080,10 +2093,12 @@ to {
2080
2093
  color: var(--e-muted);
2081
2094
  }
2082
2095
  @media (forced-colors: active) {
2083
- .e-empty-icon {
2084
- border-color: CanvasText;
2096
+ .e-empty {
2085
2097
  outline-color: CanvasText;
2086
2098
  }
2099
+ .e-empty-icon {
2100
+ color: CanvasText;
2101
+ }
2087
2102
  }
2088
2103
  }
2089
2104
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
@@ -2109,12 +2124,7 @@ to {
2109
2124
  min-width: var(--e-control-height);
2110
2125
  height: var(--e-control-height);
2111
2126
  padding: 0 var(--e-space-2);
2112
- border: var(--e-stroke-edge) solid transparent;
2113
-
2114
- --e-bc: transparent;
2115
-
2116
- outline: var(--e-stroke-edge) solid var(--e-bc);
2117
- outline-offset: calc(-1 * var(--e-stroke-edge));
2127
+ border: 0;
2118
2128
  border-radius: var(--e-radius-md);
2119
2129
  background: transparent;
2120
2130
  color: var(--e-ink);
@@ -2123,13 +2133,11 @@ to {
2123
2133
  cursor: pointer;
2124
2134
  transition:
2125
2135
  background-color var(--e-duration-tap) var(--e-easing-out),
2126
- border-color var(--e-duration-tap) var(--e-easing-out);
2136
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
2127
2137
  }
2128
2138
  .e-page:hover {
2129
2139
  background: var(--e-surface-hover);
2130
- border-color: var(--e-border-strong);
2131
-
2132
- --e-bc: var(--e-border-strong);
2140
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
2133
2141
  }
2134
2142
  .e-page:focus-visible {
2135
2143
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -2137,10 +2145,7 @@ to {
2137
2145
  }
2138
2146
  .e-page[aria-current="page"] {
2139
2147
  background: var(--e-primary);
2140
- border-color: var(--e-primary);
2141
-
2142
- --e-bc: var(--e-primary);
2143
-
2148
+ box-shadow: none;
2144
2149
  color: var(--e-on-primary);
2145
2150
  font-weight: 600;
2146
2151
  cursor: default;
@@ -2192,7 +2197,8 @@ to {
2192
2197
  cursor: pointer;
2193
2198
  }
2194
2199
  .e-sel-trigger[aria-expanded="true"] {
2195
- border-color: var(--e-ink);
2200
+ --e-ring: var(--e-ink);
2201
+
2196
2202
  background-color: var(--e-surface);
2197
2203
  }
2198
2204
  .e-sel-value {
@@ -2276,15 +2282,20 @@ to {
2276
2282
  }
2277
2283
  }
2278
2284
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
2285
+ /* The table look shared by ETable and EDataGrid: tinted mono headings, hairline rows, a hover row and numeric columns. */
2279
2286
  @layer e.containers {
2280
- .e-table {
2287
+ .e-table {
2281
2288
  width: 100%;
2282
2289
  border-collapse: collapse;
2283
2290
  font: 400 var(--e-text-md) / 1.4 var(--e-font-sans);
2284
- }
2285
- .e-table th {
2291
+ }
2292
+
2293
+ .e-table th {
2286
2294
  padding: var(--e-space-3) var(--e-space-4);
2287
- border-bottom: var(--e-stroke-card) solid var(--e-border-strong);
2295
+ border-bottom: 0;
2296
+
2297
+ /* The rule under a heading is a shadow, not a border: a sticky cell in a collapsed table drops its border when the table scrolls. */
2298
+ box-shadow: inset 0 calc(-1 * var(--e-stroke-card)) 0 var(--e-border-strong);
2288
2299
  background: var(--e-surface-tint);
2289
2300
  text-align: start;
2290
2301
  white-space: nowrap;
@@ -2292,38 +2303,58 @@ to {
2292
2303
  letter-spacing: 0.08em;
2293
2304
  text-transform: uppercase;
2294
2305
  color: var(--e-muted);
2295
- }
2296
- .e-table td {
2306
+ }
2307
+
2308
+ /* A heading at the start of a row names the row: it reads as a label, not as a column heading. */
2309
+ .e-table tbody th {
2310
+ padding: var(--e-space-3) var(--e-space-4);
2311
+ border-top: var(--e-stroke-hair) solid var(--e-border);
2312
+ border-bottom: 0;
2313
+ box-shadow: none;
2314
+ background: transparent;
2315
+ font: 600 var(--e-text-md) / 1.4 var(--e-font-sans);
2316
+ letter-spacing: normal;
2317
+ text-transform: none;
2318
+ color: var(--e-ink);
2319
+ }
2320
+
2321
+ .e-table td {
2297
2322
  padding: var(--e-space-3) var(--e-space-4);
2298
2323
  border-top: var(--e-stroke-hair) solid var(--e-border);
2299
2324
  vertical-align: middle;
2300
- }
2301
- .e-table tbody tr:first-child td {
2325
+ }
2326
+
2327
+ .e-table tbody tr:first-child :is(td, th) {
2302
2328
  border-top: 0;
2303
- }
2304
- .e-table tbody tr:hover td {
2329
+ }
2330
+
2331
+ .e-table tbody tr:hover :is(td, th) {
2305
2332
  background: var(--e-surface-hover);
2306
- }
2307
- .e-table .e-num {
2333
+ }
2334
+
2335
+ .e-table .e-num {
2308
2336
  text-align: end;
2309
2337
  font-family: var(--e-font-mono);
2310
2338
  font-variant-numeric: tabular-nums;
2311
2339
  white-space: nowrap;
2312
- }
2313
- .e-table th.e-num {
2340
+ }
2341
+
2342
+ .e-table th.e-num {
2314
2343
  font-family: var(--e-font-mono);
2315
- }
2316
- .e-table .e-center {
2344
+ }
2345
+
2346
+ .e-table .e-center {
2317
2347
  text-align: center;
2348
+ }
2318
2349
  }
2350
+ @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
2351
+ @layer e.containers {
2319
2352
  .e-skel {
2320
2353
  display: block;
2321
2354
  height: 14px;
2322
2355
  border-radius: var(--e-radius-sm);
2323
2356
  background: var(--e-surface-tint);
2324
2357
  box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-border);
2325
- outline: var(--e-stroke-hair) solid var(--e-border);
2326
- outline-offset: calc(-1 * var(--e-stroke-hair));
2327
2358
  animation: e-pulse 1.4s ease-in-out infinite;
2328
2359
  }
2329
2360
  @keyframes e-pulse {
@@ -2350,8 +2381,6 @@ to {
2350
2381
  z-index: var(--e-z-sticky);
2351
2382
  border-radius: inherit;
2352
2383
  box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border-strong);
2353
- outline: var(--e-stroke-card) solid var(--e-border-strong);
2354
- outline-offset: calc(-1 * var(--e-stroke-card));
2355
2384
  pointer-events: none;
2356
2385
  }
2357
2386
  .e-grid-frame {
@@ -2470,7 +2499,7 @@ to {
2470
2499
  .e-filterrow td {
2471
2500
  padding: var(--e-space-1) var(--e-space-3);
2472
2501
  background: var(--e-surface);
2473
- border-bottom: var(--e-stroke-card) solid var(--e-border-strong);
2502
+ box-shadow: inset 0 calc(-1 * var(--e-stroke-card)) 0 var(--e-border-strong);
2474
2503
  border-top: 0;
2475
2504
  position: sticky;
2476
2505
  top: var(--e-grid-head-h);
@@ -2645,8 +2674,6 @@ to {
2645
2674
  border-radius: var(--e-radius-md);
2646
2675
  background: var(--e-surface);
2647
2676
  box-shadow: var(--e-edge);
2648
- outline: var(--e-stroke-card) solid var(--e-border-strong);
2649
- outline-offset: 0;
2650
2677
  }
2651
2678
  .e-grid--cards .e-gridtable tbody tr:hover td {
2652
2679
  background: transparent;
@@ -2729,8 +2756,6 @@ to {
2729
2756
  background: var(--e-surface);
2730
2757
  color: var(--e-ink);
2731
2758
  box-shadow: var(--e-float);
2732
- outline: var(--e-stroke-card) solid var(--e-border-strong);
2733
- outline-offset: 0;
2734
2759
  font-family: var(--e-font-sans);
2735
2760
  }
2736
2761
  }
@@ -2746,17 +2771,11 @@ to {
2746
2771
  white-space: nowrap;
2747
2772
  align-items: center;
2748
2773
  gap: var(--e-space-2);
2749
-
2750
- --e-bc: var(--e-strong);
2751
-
2752
2774
  min-height: calc(var(--e-chip-height) + var(--e-space-1));
2753
2775
  padding: 0 var(--e-space-3);
2754
2776
  border-radius: var(--e-radius-sm);
2755
2777
  background: var(--e-strong);
2756
2778
  color: var(--e-on);
2757
- box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-bc);
2758
- outline: var(--e-stroke-card) solid var(--e-bc);
2759
- outline-offset: calc(-1 * var(--e-stroke-card));
2760
2779
  cursor: default;
2761
2780
  justify-self: start;
2762
2781
  }
@@ -2924,8 +2943,6 @@ to {
2924
2943
  background: var(--e-surface);
2925
2944
  color: var(--e-ink);
2926
2945
  box-shadow: var(--e-float);
2927
- outline: var(--e-stroke-card) solid var(--e-border);
2928
- outline-offset: 0;
2929
2946
  font-family: var(--e-font-sans);
2930
2947
  }
2931
2948
 
@@ -2981,7 +2998,7 @@ to {
2981
2998
  height: fit-content;
2982
2999
  max-height: calc(100dvh - var(--e-space-8));
2983
3000
  margin: auto;
2984
- border-radius: var(--e-radius-lg);
3001
+ border-radius: var(--e-radius-md);
2985
3002
  overflow: auto;
2986
3003
  }
2987
3004
  .e-dialog--inline {
@@ -3099,7 +3116,7 @@ to {
3099
3116
  height: auto;
3100
3117
  max-height: min(32rem, 85dvh);
3101
3118
  margin: 0;
3102
- border-radius: var(--e-radius-lg) var(--e-radius-lg) 0 0;
3119
+ border-radius: var(--e-radius-md) var(--e-radius-md) 0 0;
3103
3120
  }
3104
3121
  .e-drawer[data-state="open"] {
3105
3122
  animation: e-drawer-in 220ms var(--e-easing-out);
@@ -3171,7 +3188,7 @@ to {
3171
3188
  max-width: 28rem;
3172
3189
  height: auto;
3173
3190
  max-height: 18rem;
3174
- border-radius: var(--e-radius-lg);
3191
+ border-radius: var(--e-radius-md);
3175
3192
  }
3176
3193
  .e-drawer-body:focus-visible {
3177
3194
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -3187,34 +3204,33 @@ to {
3187
3204
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
3188
3205
  @layer e.containers {
3189
3206
  .e-xrow {
3190
- border-bottom: var(--e-depth) solid var(--e-border);
3207
+ --e-band-c: var(--e-border);
3208
+
3209
+ border-bottom: var(--e-depth) solid transparent;
3191
3210
  border-radius: var(--e-radius-md);
3192
- background: var(--e-surface);
3211
+ background-color: var(--e-surface);
3212
+ background-image: linear-gradient(to top, var(--e-band-c) var(--e-depth), transparent var(--e-depth));
3213
+ background-origin: border-box;
3214
+ background-repeat: no-repeat;
3193
3215
  box-shadow: var(--e-edge);
3194
- outline: var(--e-stroke-card) solid var(--e-border);
3195
- outline-offset: 0;
3196
3216
  transition:
3197
3217
  background-color var(--e-duration-tap) var(--e-easing-out),
3198
3218
  box-shadow var(--e-duration-tap) var(--e-easing-out);
3199
3219
  }
3200
3220
  .e-xrow:not([open]):hover {
3201
- border-bottom-color: var(--e-border-strong);
3202
- background: var(--e-surface-hover);
3221
+ --e-band-c: var(--e-border-strong);
3222
+
3223
+ background-color: var(--e-surface-hover);
3203
3224
  box-shadow: 0 0 0 var(--e-stroke-card) var(--e-border-strong);
3204
- outline: var(--e-stroke-card) solid var(--e-border-strong);
3205
- outline-offset: 0;
3206
3225
  }
3207
3226
  .e-xrow[open] {
3208
3227
  border-bottom-width: 0;
3228
+ background-image: none;
3209
3229
  box-shadow: var(--e-edge);
3210
- outline: var(--e-stroke-card) solid var(--e-border);
3211
- outline-offset: 0;
3212
3230
  }
3213
3231
  .e-xrow[open]:has(> summary:hover) {
3214
3232
  background-color: var(--e-surface-hover);
3215
3233
  box-shadow: 0 0 0 var(--e-stroke-card) var(--e-border-strong);
3216
- outline: var(--e-stroke-card) solid var(--e-border-strong);
3217
- outline-offset: 0;
3218
3234
  }
3219
3235
  .e-xrow[open] > summary:hover {
3220
3236
  border-bottom-color: var(--e-border-strong);
@@ -3561,14 +3577,10 @@ a:any-link > .e-highlight {
3561
3577
  display: inline-block;
3562
3578
  min-width: 1.5em;
3563
3579
  padding: 0 var(--e-space-1);
3564
- border: var(--e-stroke-hair) solid var(--e-border-strong);
3565
-
3566
- --e-bc: var(--e-border-strong);
3567
-
3568
- outline: var(--e-stroke-hair) solid var(--e-bc);
3569
- outline-offset: calc(-1 * var(--e-stroke-hair));
3580
+ border: 0;
3570
3581
  border-radius: var(--e-radius-sm);
3571
3582
  background: var(--e-surface-tint);
3583
+ box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-border-strong);
3572
3584
  color: var(--e-muted);
3573
3585
  font: 500 var(--e-text-sm) / 1.5 var(--e-font-mono);
3574
3586
  text-align: center;
@@ -3579,7 +3591,8 @@ a:any-link > .e-highlight {
3579
3591
  }
3580
3592
  @media (forced-colors: active) {
3581
3593
  .e-kbd {
3582
- border-color: ButtonText;
3594
+ outline: var(--e-stroke-hair) solid ButtonText;
3595
+ outline-offset: calc(-1 * var(--e-stroke-hair));
3583
3596
  }
3584
3597
  }
3585
3598
  }
@@ -3646,8 +3659,6 @@ a:any-link > .e-highlight {
3646
3659
  .e-menu-item[data-highlighted] {
3647
3660
  background: var(--e-surface-hover);
3648
3661
  box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border-strong);
3649
- outline: var(--e-stroke-card) solid var(--e-border-strong);
3650
- outline-offset: calc(-1 * var(--e-stroke-card));
3651
3662
  }
3652
3663
  .e-menu-item--danger {
3653
3664
  color: var(--e-danger);
@@ -3722,26 +3733,39 @@ a:any-link > .e-highlight {
3722
3733
  gap: var(--e-space-3);
3723
3734
  height: var(--e-control-height);
3724
3735
  box-sizing: border-box;
3725
- padding: 0 var(--e-space-3);
3726
- border: var(--e-stroke-edge) solid transparent;
3736
+ padding: 0 var(--e-space-3) var(--e-lift);
3737
+
3738
+ --e-lift: 0px;
3739
+
3740
+ border: 0;
3727
3741
  border-radius: var(--e-radius-md);
3728
3742
  color: var(--e-ink);
3729
3743
  font: 400 var(--e-text-md) / 1 var(--e-font-sans);
3730
3744
  text-decoration: none;
3731
- transition: background-color var(--e-duration-tap) var(--e-easing-out);
3745
+ transition:
3746
+ background-color var(--e-duration-tap) var(--e-easing-out),
3747
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
3732
3748
  }
3733
3749
  .e-nav-item:hover {
3734
- background: var(--e-surface-hover);
3750
+ background-color: var(--e-surface-hover);
3735
3751
  }
3736
3752
  .e-nav-item:focus-visible {
3737
3753
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
3738
3754
  outline-offset: var(--e-focus-gap);
3739
3755
  }
3740
3756
  .e-nav-item[aria-current="page"] {
3741
- background: color-mix(in srgb, var(--e-surface-tint), var(--e-ink) 3%);
3757
+ background-color: color-mix(in srgb, var(--e-surface-tint), var(--e-ink) 3%);
3742
3758
  font-weight: 600;
3743
- border-color: var(--e-primary);
3744
- border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));
3759
+
3760
+ --e-lift: var(--e-depth);
3761
+ --e-slab: var(--e-primary);
3762
+
3763
+ box-shadow:
3764
+ inset 0 0 0 var(--e-stroke-edge) var(--e-primary),
3765
+ inset 0 calc(-1 * (var(--e-lift) + var(--e-stroke-edge))) 0 0 var(--e-slab);
3766
+ }
3767
+ .e-nav-item[aria-current="page"]:hover {
3768
+ --e-slab: color-mix(in srgb, var(--e-primary), var(--e-shade-slab));
3745
3769
  }
3746
3770
  .e-nav-label {
3747
3771
  flex: 1;
@@ -3781,8 +3805,6 @@ a:any-link > .e-highlight {
3781
3805
  border-radius: var(--e-radius-pill);
3782
3806
  background: color-mix(in srgb, var(--e-primary) 12%, var(--e-surface));
3783
3807
  box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-primary);
3784
- outline: var(--e-stroke-hair) solid var(--e-primary);
3785
- outline-offset: calc(-1 * var(--e-stroke-hair));
3786
3808
  font: 600 var(--e-text-xs) / 20px var(--e-font-mono);
3787
3809
  text-align: center;
3788
3810
  }
@@ -3864,15 +3886,13 @@ a:any-link > .e-highlight {
3864
3886
 
3865
3887
  container-type: inline-size;
3866
3888
  padding: var(--e-space-3) var(--e-space-4);
3867
- border: var(--e-stroke-edge) solid var(--e-tone);
3868
-
3869
- --e-bc: var(--e-tone);
3870
-
3871
- outline: var(--e-stroke-edge) solid var(--e-bc);
3872
- outline-offset: calc(-1 * var(--e-stroke-edge));
3873
- border-left-width: calc(var(--e-stroke-edge) + 2 * var(--e-depth));
3889
+ padding-left: calc(var(--e-space-4) + 2 * var(--e-depth));
3890
+ border: 0;
3874
3891
  border-radius: var(--e-radius-md);
3875
- background: var(--e-bg);
3892
+ background-color: var(--e-bg);
3893
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-tone);
3894
+ background-image: linear-gradient(to right, var(--e-tone) calc(var(--e-stroke-edge) + 2 * var(--e-depth)), transparent calc(var(--e-stroke-edge) + 2 * var(--e-depth)));
3895
+ background-repeat: no-repeat;
3876
3896
  color: var(--e-ink);
3877
3897
  }
3878
3898
  .e-notice--success {
@@ -3929,7 +3949,7 @@ a:any-link > .e-highlight {
3929
3949
 
3930
3950
  /* stylelint-disable-next-line selector-not-notation */
3931
3951
  .e-otp .e-otp-box[data-filled]:not(:focus):not([aria-invalid="true"]) {
3932
- border-color: var(--e-ink);
3952
+ --e-ring: var(--e-ink);
3933
3953
  }
3934
3954
  }
3935
3955
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
@@ -4006,13 +4026,8 @@ a:any-link > .e-highlight {
4006
4026
  flex: none;
4007
4027
  width: 14px;
4008
4028
  height: 14px;
4009
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4010
-
4011
- --e-bc: var(--e-border-strong);
4012
-
4013
- outline: var(--e-stroke-edge) solid var(--e-bc);
4014
- outline-offset: calc(-1 * var(--e-stroke-edge));
4015
4029
  border-radius: 50%;
4030
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
4016
4031
  }
4017
4032
  }
4018
4033
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
@@ -4047,8 +4062,6 @@ a:any-link > .e-highlight {
4047
4062
  border-radius: var(--e-radius-pill);
4048
4063
  background: var(--e-surface-tint);
4049
4064
  box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border-strong);
4050
- outline: var(--e-stroke-card) solid var(--e-border-strong);
4051
- outline-offset: calc(-1 * var(--e-stroke-card));
4052
4065
  overflow: hidden;
4053
4066
  }
4054
4067
  .e-progress-fill {
@@ -4056,8 +4069,6 @@ a:any-link > .e-highlight {
4056
4069
  border-radius: var(--e-radius-pill);
4057
4070
  background: var(--e-primary);
4058
4071
  box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-primary);
4059
- outline: var(--e-stroke-card) solid var(--e-primary);
4060
- outline-offset: calc(-1 * var(--e-stroke-card));
4061
4072
  transition: width var(--e-duration-move) var(--e-easing-out);
4062
4073
  }
4063
4074
  .e-progress--indeterminate .e-progress-fill {
@@ -4149,31 +4160,27 @@ to {
4149
4160
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4150
4161
  @layer e.controls {
4151
4162
  .e-search {
4163
+ --e-ring: var(--e-border-strong);
4164
+
4152
4165
  display: flex;
4153
4166
  align-items: center;
4154
4167
  gap: var(--e-space-1);
4155
4168
  height: var(--e-control-height);
4156
4169
  padding: 0 var(--e-space-1) 0 var(--e-space-2);
4157
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4158
-
4159
- --e-bc: var(--e-border-strong);
4160
-
4161
- outline: var(--e-stroke-edge) solid var(--e-bc);
4162
- outline-offset: calc(-1 * var(--e-stroke-edge));
4163
4170
  border-radius: var(--e-radius-md);
4164
4171
  background: var(--e-surface);
4165
- box-shadow: var(--e-well);
4166
- transition: border-color var(--e-duration-tap) var(--e-easing-out);
4172
+ box-shadow:
4173
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
4174
+ var(--e-well);
4175
+ transition: box-shadow var(--e-duration-tap) var(--e-easing-out);
4167
4176
  }
4168
4177
  .e-search:hover {
4169
- border-color: var(--e-ink);
4170
-
4171
- --e-bc: var(--e-ink);
4178
+ background: var(--e-surface-hover);
4172
4179
  }
4173
4180
  .e-search .e-btn {
4174
4181
  position: relative;
4175
4182
  height: calc(var(--e-control-height) - 6px);
4176
- padding: 0 var(--e-space-3);
4183
+ padding: 0 var(--e-space-3) var(--e-lift);
4177
4184
  font-size: var(--e-text-md);
4178
4185
  }
4179
4186
  .e-search .e-btn::after {
@@ -4240,11 +4247,10 @@ to {
4240
4247
  outline: none;
4241
4248
  }
4242
4249
  .e-search:focus-within {
4243
- border-color: var(--e-focus-field);
4250
+ --e-ring: var(--e-focus-field);
4244
4251
 
4245
- --e-bc: var(--e-focus-field);
4246
-
4247
- outline: var(--e-stroke-focus) solid var(--e-focus-field);
4252
+ background: var(--e-surface);
4253
+ outline: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge))) solid var(--e-focus-field);
4248
4254
  outline-offset: var(--e-focus-gap-field);
4249
4255
  }
4250
4256
  @media (prefers-reduced-motion: reduce) {
@@ -4267,8 +4273,6 @@ to {
4267
4273
  padding: var(--e-space-1);
4268
4274
  border-radius: var(--e-radius-md);
4269
4275
  box-shadow: var(--e-edge);
4270
- outline: var(--e-stroke-card) solid var(--e-border-strong);
4271
- outline-offset: 0;
4272
4276
  color: var(--e-ink);
4273
4277
  }
4274
4278
  .e-results-list {
@@ -4285,8 +4289,6 @@ to {
4285
4289
  .e-results .e-opt:focus-visible {
4286
4290
  background: var(--e-surface-hover);
4287
4291
  box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-border-strong);
4288
- outline: var(--e-stroke-hair) solid var(--e-border-strong);
4289
- outline-offset: calc(-1 * var(--e-stroke-hair));
4290
4292
  }
4291
4293
  .e-results .e-opt:focus-visible {
4292
4294
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -4303,17 +4305,17 @@ to {
4303
4305
  }
4304
4306
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4305
4307
  @layer e.controls {
4308
+ /* A pressed-in track. The chosen option fills its cell edge to edge in the primary colour, covering the track's outline there so the outline turns primary where it is chosen, and the track clips it, so only the pieces at either end take the track's rounded corners: a value you set, not a place you go (that is Tabs). */
4306
4309
  .e-seg {
4307
4310
  display: inline-flex;
4311
+ box-sizing: border-box;
4308
4312
  height: var(--e-control-height);
4309
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4310
-
4311
- --e-bc: var(--e-border-strong);
4312
-
4313
- outline: var(--e-stroke-edge) solid var(--e-bc);
4314
- outline-offset: calc(-1 * var(--e-stroke-edge));
4313
+ position: relative;
4315
4314
  border-radius: var(--e-radius-md);
4316
- background: var(--e-border-strong);
4315
+ background: var(--e-surface-tint);
4316
+ box-shadow:
4317
+ inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong),
4318
+ var(--e-well);
4317
4319
  overflow: hidden;
4318
4320
  max-width: 100%;
4319
4321
  width: fit-content;
@@ -4323,9 +4325,6 @@ to {
4323
4325
  display: inline-flex;
4324
4326
  cursor: pointer;
4325
4327
  }
4326
- .e-seg-opt + .e-seg-opt {
4327
- border-inline-start: var(--e-stroke-hair) solid var(--e-border-strong);
4328
- }
4329
4328
  .e-seg-input {
4330
4329
  position: absolute;
4331
4330
  inset: 0;
@@ -4338,19 +4337,24 @@ to {
4338
4337
  align-items: center;
4339
4338
  justify-content: center;
4340
4339
  gap: var(--e-space-2);
4340
+ box-sizing: border-box;
4341
4341
  min-width: 4rem;
4342
4342
  padding: 0 var(--e-space-4);
4343
- background: var(--e-surface);
4343
+ background: transparent;
4344
+ color: var(--e-ink);
4344
4345
  font: 500 var(--e-text-md)/1 var(--e-font-sans);
4345
4346
  white-space: nowrap;
4346
4347
  transition: background-color var(--e-duration-tap) var(--e-easing-out);
4347
4348
  }
4348
4349
  .e-seg-opt:hover .e-seg-text {
4349
- background: var(--e-surface-hover);
4350
+ background: var(--e-wash-hover);
4350
4351
  }
4351
- .e-seg-input:checked + .e-seg-text {
4352
- background: var(--e-primary);
4353
- box-shadow: inset 0 var(--e-depth) 0 0 color-mix(in srgb, var(--e-primary), var(--e-shade-slab));
4352
+ .e-seg-input:checked + .e-seg-text,
4353
+ .e-seg-opt:hover .e-seg-input:checked + .e-seg-text {
4354
+ background-color: var(--e-primary);
4355
+
4356
+ /* The darker band along the bottom is the slab, drawn inside the piece and the track clips it to the corners. */
4357
+ background-image: linear-gradient(to top, color-mix(in srgb, var(--e-primary), var(--e-shade-slab)) var(--e-depth), transparent var(--e-depth));
4354
4358
  color: var(--e-on-primary);
4355
4359
  font-weight: 600;
4356
4360
  }
@@ -4365,11 +4369,14 @@ to {
4365
4369
  .e-seg-opt:has(:disabled):hover .e-seg-text {
4366
4370
  background: transparent;
4367
4371
  }
4372
+
4373
+ /* Chosen but unavailable: a flat piece with ink text, so it stays readable. */
4368
4374
  .e-seg-input:disabled:checked + .e-seg-text,
4369
4375
  .e-seg-opt:has(:disabled:checked):hover .e-seg-text {
4370
- background: var(--e-surface-hover);
4376
+ background-color: var(--e-surface);
4377
+ background-image: none;
4378
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
4371
4379
  color: var(--e-ink);
4372
- box-shadow: inset 0 calc(-1 * var(--e-depth)) 0 0 var(--e-border-strong);
4373
4380
  }
4374
4381
  .e-seg-field {
4375
4382
  display: grid;
@@ -4397,15 +4404,11 @@ to {
4397
4404
  .e-pad-surface {
4398
4405
  position: relative;
4399
4406
  overflow: hidden;
4400
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4401
-
4402
- --e-bc: var(--e-border-strong);
4403
-
4404
- outline: var(--e-stroke-edge) solid var(--e-bc);
4405
- outline-offset: calc(-1 * var(--e-stroke-edge));
4406
4407
  border-radius: var(--e-radius-md);
4407
4408
  background: var(--e-surface);
4408
- box-shadow: var(--e-well);
4409
+ box-shadow:
4410
+ inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong),
4411
+ var(--e-well);
4409
4412
  }
4410
4413
  .e-pad-surface::after {
4411
4414
  content: "";
@@ -4499,8 +4502,6 @@ to {
4499
4502
  border-radius: var(--e-radius-md);
4500
4503
  background: var(--e-surface-tint);
4501
4504
  box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border-strong);
4502
- outline: var(--e-stroke-card) solid var(--e-border-strong);
4503
- outline-offset: calc(-1 * var(--e-stroke-card));
4504
4505
  animation: e-pulse 1.4s ease-in-out infinite;
4505
4506
  }
4506
4507
  .e-skel {
@@ -4509,8 +4510,6 @@ to {
4509
4510
  border-radius: var(--e-radius-sm);
4510
4511
  background: var(--e-surface-tint);
4511
4512
  box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border-strong);
4512
- outline: var(--e-stroke-card) solid var(--e-border-strong);
4513
- outline-offset: calc(-1 * var(--e-stroke-card));
4514
4513
  animation: e-pulse 1.4s ease-in-out infinite;
4515
4514
  }
4516
4515
  .e-skeleton--circle {
@@ -4601,18 +4600,20 @@ to {
4601
4600
  width: var(--e-dot);
4602
4601
  height: var(--e-dot);
4603
4602
  border-radius: 50%;
4604
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
4603
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
4604
+ outline-offset: calc(-1 * var(--e-stroke-edge));
4605
4605
  background: var(--e-surface);
4606
4606
  color: var(--e-muted);
4607
4607
  font: 600 var(--e-text-xs) / 1 var(--e-font-mono);
4608
4608
  }
4609
4609
  .e-step[data-state="done"] .e-step-dot {
4610
- border: var(--e-stroke-edge) solid var(--e-primary);
4610
+ outline: 0;
4611
4611
  background: var(--e-primary);
4612
4612
  color: var(--e-on-primary);
4613
4613
  }
4614
4614
  .e-step[data-state="current"] .e-step-dot {
4615
- border: var(--e-stroke-focus) solid var(--e-primary);
4615
+ outline: 0;
4616
+ box-shadow: inset 0 0 0 var(--e-stroke-focus) var(--e-primary);
4616
4617
  color: var(--e-primary);
4617
4618
  background: var(--e-surface);
4618
4619
  }
@@ -4667,7 +4668,6 @@ to {
4667
4668
  .e-step[data-state="done"] .e-step-dot {
4668
4669
  forced-color-adjust: none;
4669
4670
  background: Highlight;
4670
- border-color: Highlight;
4671
4671
  color: HighlightText;
4672
4672
  }
4673
4673
  }
@@ -4679,8 +4679,6 @@ to {
4679
4679
  border-radius: var(--e-radius-md);
4680
4680
  background: var(--e-surface);
4681
4681
  box-shadow: var(--e-edge);
4682
- outline: var(--e-stroke-card) solid var(--e-border);
4683
- outline-offset: 0;
4684
4682
  }
4685
4683
  .e-surface--clip {
4686
4684
  overflow: hidden;
@@ -4700,8 +4698,6 @@ to {
4700
4698
  }
4701
4699
  .e-surface--raised {
4702
4700
  box-shadow: var(--e-float);
4703
- outline: var(--e-stroke-card) solid var(--e-border);
4704
- outline-offset: 0;
4705
4701
  }
4706
4702
  .e-surface--pad-sm {
4707
4703
  padding: var(--e-space-3) var(--e-space-4);
@@ -4737,24 +4733,20 @@ to {
4737
4733
  .e-switch-track {
4738
4734
  --e-switch-w: 44px;
4739
4735
  --e-thumb: 14px;
4740
- --e-thumb-inset: calc(var(--e-space-1) - var(--e-stroke-card));
4741
- --e-thumb-travel: calc(var(--e-switch-w) - 2 * var(--e-stroke-edge) - var(--e-thumb) - 2 * var(--e-thumb-inset));
4736
+ --e-thumb-inset: var(--e-space-1);
4737
+ --e-thumb-travel: calc(var(--e-switch-w) - var(--e-thumb) - 2 * var(--e-thumb-inset));
4738
+ --e-ring: var(--e-border-strong);
4742
4739
 
4743
4740
  position: relative;
4744
4741
  flex: none;
4745
4742
  width: var(--e-switch-w);
4746
4743
  height: 24px;
4747
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4748
-
4749
- --e-bc: var(--e-border-strong);
4750
-
4751
- outline: var(--e-stroke-edge) solid var(--e-bc);
4752
- outline-offset: calc(-1 * var(--e-stroke-edge));
4753
4744
  border-radius: var(--e-radius-pill);
4754
4745
  background: var(--e-surface-tint);
4746
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ring);
4755
4747
  transition:
4756
4748
  background-color var(--e-duration-tap) var(--e-easing-out),
4757
- border-color var(--e-duration-tap) var(--e-easing-out);
4749
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
4758
4750
  }
4759
4751
  .e-switch-track::after {
4760
4752
  content: "";
@@ -4769,23 +4761,21 @@ to {
4769
4761
  transition: transform var(--e-duration-move, 160ms) var(--e-easing-out);
4770
4762
  }
4771
4763
  .e-switch:hover .e-switch-track {
4772
- border-color: var(--e-ink);
4773
-
4774
- --e-bc: var(--e-ink);
4764
+ --e-ring: var(--e-ink);
4775
4765
  }
4776
4766
  .e-switch-input:checked + .e-switch-track {
4777
- background: var(--e-primary);
4778
- border-color: var(--e-primary);
4767
+ --e-ring: var(--e-primary);
4779
4768
 
4780
- --e-bc: var(--e-primary);
4769
+ background: var(--e-primary);
4781
4770
  }
4782
4771
  .e-switch-input:checked + .e-switch-track::after {
4783
4772
  background: var(--e-on-primary);
4784
4773
  transform: translateX(var(--e-thumb-travel));
4785
4774
  }
4786
4775
  .e-switch-input:disabled + .e-switch-track {
4787
- border-style: dashed;
4788
- outline: 0;
4776
+ box-shadow: none;
4777
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
4778
+ outline-offset: calc(-1 * var(--e-stroke-edge));
4789
4779
  background: var(--e-surface-tint);
4790
4780
  }
4791
4781
  .e-switch-input:disabled + .e-switch-track::after {
@@ -4812,8 +4802,79 @@ to {
4812
4802
  }
4813
4803
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4814
4804
  @layer e.containers {
4805
+ .e-table-wrap {
4806
+ position: relative;
4807
+ min-width: 0;
4808
+ border-radius: var(--e-radius-md);
4809
+ background: var(--e-surface);
4810
+ }
4811
+
4812
+ /* The outline is drawn once, above the scroller and its sticky headings, so nothing covers it. */
4813
+ .e-table-wrap::after {
4814
+ content: "";
4815
+ position: absolute;
4816
+ inset: 0;
4817
+ border-radius: inherit;
4818
+ z-index: var(--e-z-sticky);
4819
+ box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border);
4820
+ pointer-events: none;
4821
+ }
4822
+ .e-table-scroll {
4823
+ overflow: auto;
4824
+ max-height: var(--e-table-max-h, none);
4825
+ border-radius: inherit;
4826
+ }
4827
+ .e-table-scroll:focus-visible {
4828
+ outline: var(--e-stroke-focus) solid var(--e-focus-ring);
4829
+ outline-offset: calc(-1 * var(--e-stroke-focus));
4830
+ }
4831
+ .e-table-wrap .e-table {
4832
+ background: var(--e-surface);
4833
+ }
4834
+ .e-table-caption {
4835
+ padding: var(--e-space-3) var(--e-space-4);
4836
+ border-bottom: var(--e-stroke-hair) solid var(--e-border);
4837
+ text-align: start;
4838
+ font: 600 var(--e-text-md) / 1.3 var(--e-font-sans);
4839
+ color: var(--e-ink);
4840
+ }
4841
+ .e-table-wrap thead th {
4842
+ position: sticky;
4843
+ top: 0;
4844
+ z-index: var(--e-z-raised);
4845
+ }
4846
+ .e-table-wrap--striped tbody tr:nth-child(even) :is(td, th) {
4847
+ background: var(--e-surface-tint);
4848
+ }
4849
+ .e-table-wrap--striped tbody tr:hover :is(td, th) {
4850
+ background: var(--e-surface-hover);
4851
+ }
4852
+ .e-table-wrap--dense .e-table {
4853
+ font-size: var(--e-text-sm);
4854
+ }
4855
+ .e-table-wrap--dense .e-table :is(th, td, tbody th) {
4856
+ padding: var(--e-space-2) var(--e-space-3);
4857
+ }
4858
+ @media print {
4859
+ .e-table-scroll {
4860
+ overflow: visible;
4861
+ max-height: none;
4862
+ }
4863
+ .e-table-wrap::after {
4864
+ display: none;
4865
+ }
4866
+ }
4867
+ @media (forced-colors: active) {
4868
+ .e-table-wrap {
4869
+ outline: 1px solid CanvasText;
4870
+ }
4871
+ }
4872
+ }
4873
+ @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4874
+ @layer e.containers {
4815
4875
  .e-tablist {
4816
4876
  display: flex;
4877
+ flex: none;
4817
4878
  gap: 0;
4818
4879
  /* stylelint-disable-next-line declaration-block-no-redundant-longhand-properties -- the two axes are set apart */
4819
4880
  overflow-x: auto;
@@ -4824,28 +4885,33 @@ to {
4824
4885
  display: none;
4825
4886
  }
4826
4887
 
4827
- /* Tabs are button-like: every tab is ringed and neighbours sit flush and share an edge, so only the outer ends of the row are rounded. The selected tab is outlined in the primary colour with a thick slab underneath. */
4888
+ /* Tabs are button-like: every tab is ringed and neighbours sit flush and share an edge, so only the outer ends of the row are rounded. The selected tab is outlined in the primary colour with a thick slab along its bottom. */
4828
4889
  .e-tab {
4829
4890
  --e-bc: var(--e-border-strong);
4830
4891
 
4892
+ /* A selected tab rises: the slab is a band the tab paints along one edge itself, so there is no second shape behind the corners. Every tab is one control height tall either way. */
4893
+ --e-lift: 0px;
4894
+ --e-band: calc(var(--e-lift) + var(--e-stroke-edge));
4895
+ --e-slab: var(--e-primary);
4896
+
4831
4897
  position: relative;
4832
4898
  display: inline-flex;
4833
4899
  align-items: center;
4834
4900
  gap: var(--e-space-2);
4835
4901
  flex: none;
4836
4902
  height: var(--e-control-height);
4837
- padding: 0 var(--e-space-4);
4838
- border: var(--e-stroke-edge) solid var(--e-bc);
4903
+ padding: 0 var(--e-space-4) var(--e-lift);
4904
+ border: 0;
4839
4905
  border-radius: 0;
4840
- outline: var(--e-stroke-edge) solid var(--e-bc);
4841
- outline-offset: calc(-1 * var(--e-stroke-edge));
4842
4906
  background: transparent;
4907
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-bc);
4843
4908
  color: var(--e-muted);
4844
4909
  font: 500 var(--e-text-md) / 1 var(--e-font-sans);
4845
4910
  cursor: pointer;
4846
4911
  transition:
4847
4912
  color var(--e-duration-tap) var(--e-easing-out),
4848
- background-color var(--e-duration-tap) var(--e-easing-out);
4913
+ background-color var(--e-duration-tap) var(--e-easing-out),
4914
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
4849
4915
  }
4850
4916
 
4851
4917
  /* Only the outer ends of the row are rounded. */
@@ -4869,13 +4935,21 @@ to {
4869
4935
  }
4870
4936
  .e-tab[aria-selected="true"] {
4871
4937
  --e-bc: var(--e-primary);
4938
+ --e-lift: var(--e-depth);
4872
4939
 
4873
4940
  z-index: var(--e-z-sticky);
4874
- border-bottom-width: calc(var(--e-stroke-edge) + var(--e-depth));
4875
4941
  background-color: color-mix(in srgb, var(--e-surface-tint), var(--e-ink) 3%);
4942
+ box-shadow:
4943
+ inset 0 0 0 var(--e-stroke-edge) var(--e-bc),
4944
+ inset 0 calc(-1 * var(--e-band)) 0 0 var(--e-slab);
4876
4945
  color: var(--e-ink);
4877
4946
  font-weight: 600;
4878
4947
  }
4948
+
4949
+ /* The slab answers the pointer too: it darkens under the cursor, in step with the face. */
4950
+ .e-tab[aria-selected="true"]:hover {
4951
+ --e-slab: color-mix(in srgb, var(--e-primary), var(--e-shade-slab));
4952
+ }
4879
4953
  .e-tab:focus-visible {
4880
4954
  z-index: var(--e-z-focus);
4881
4955
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -4890,14 +4964,147 @@ to {
4890
4964
  justify-content: center;
4891
4965
  padding-inline: var(--e-space-1);
4892
4966
  }
4967
+
4968
+ /* Vertical: the tabs stack beside the panel, flush and sharing edges. The selected tab rises towards the panel, so its slab is a band down the inline-start side, away from the panel, instead of along the bottom, and only the top and bottom ends of the column are rounded. */
4969
+ .e-tabs--vertical {
4970
+ display: flex;
4971
+ align-items: flex-start;
4972
+ gap: var(--e-space-4);
4973
+ }
4974
+ .e-tabs--vertical .e-tablist {
4975
+ flex-direction: column;
4976
+ flex: none;
4977
+ overflow: visible;
4978
+ }
4979
+ .e-tabs--vertical .e-tab {
4980
+ --e-lift: 0px;
4981
+
4982
+ height: var(--e-control-height);
4983
+ padding-block-end: 0;
4984
+ justify-content: flex-start;
4985
+ border-radius: 0;
4986
+ }
4987
+ .e-tabs--vertical .e-tab:first-child {
4988
+ border-start-start-radius: var(--e-radius-md);
4989
+ border-start-end-radius: var(--e-radius-md);
4990
+ }
4991
+ .e-tabs--vertical .e-tab:last-child {
4992
+ border-end-start-radius: var(--e-radius-md);
4993
+ border-end-end-radius: var(--e-radius-md);
4994
+ }
4995
+ .e-tabs--vertical .e-tab + .e-tab {
4996
+ margin-inline-start: 0;
4997
+ margin-block-start: calc(-1 * var(--e-stroke-edge));
4998
+ }
4999
+ .e-tabs--vertical .e-tab[aria-selected="true"] {
5000
+ --e-lift: var(--e-depth);
5001
+
5002
+ padding-inline-start: calc(var(--e-space-4) + var(--e-lift));
5003
+ box-shadow:
5004
+ inset 0 0 0 var(--e-stroke-edge) var(--e-bc),
5005
+ inset var(--e-band) 0 0 0 var(--e-slab);
5006
+ }
5007
+ .e-tabs--vertical .e-tabpanel {
5008
+ flex: 1 1 0;
5009
+ min-width: 0;
5010
+ padding-top: 0;
5011
+ }
5012
+ :dir(rtl) .e-tabs--vertical .e-tab[aria-selected="true"] {
5013
+ box-shadow:
5014
+ inset 0 0 0 var(--e-stroke-edge) var(--e-bc),
5015
+ inset calc(-1 * var(--e-band)) 0 0 0 var(--e-slab);
5016
+ }
5017
+
5018
+ /* Framed: tabs and panel are one outlined card. The tab row sits over the panel's edge by one stroke, so a tab's lower edge and the panel's upper edge are the same line; the chosen tab has no edge on that side and its fill covers the panel's, opening into it. Tabs sit flush with their neighbours, square where they meet; only the card's outer corner at the first tab is rounded, and the panel's own corner beside it is square. The row always leaves a corner's width of open edge past the last tab, so the panel's curve never lands against a tab's straight edge. */
5019
+ .e-tabs--framed .e-tablist {
5020
+ position: relative;
5021
+ z-index: var(--e-z-raised);
5022
+ margin-block-end: calc(-1 * var(--e-stroke-edge));
5023
+ }
5024
+ .e-tabs--framed .e-tab {
5025
+ --e-bc: var(--e-border-strong);
5026
+ --e-lift: 0px;
5027
+
5028
+ border-radius: 0;
5029
+ background-color: var(--e-surface-tint);
5030
+ }
5031
+ .e-tabs--framed .e-tab:first-child {
5032
+ border-start-start-radius: var(--e-radius-md);
5033
+ }
5034
+ .e-tabs--framed.e-tabs--fill .e-tab:last-child {
5035
+ border-start-end-radius: var(--e-radius-md);
5036
+ }
5037
+ .e-tabs:not(.e-tabs--fill, .e-tabs--vertical).e-tabs--framed .e-tablist {
5038
+ padding-inline-end: var(--e-radius-md);
5039
+ }
5040
+ .e-tabs--framed .e-tab:hover {
5041
+ background-color: var(--e-surface-hover);
5042
+ }
5043
+
5044
+ /* The chosen tab rises like a button does, with its primary slab as a band on the edge away from the panel, and its open sides outlined in the primary colour. */
5045
+ .e-tabs--framed .e-tab[aria-selected="true"] {
5046
+ --e-bc: var(--e-primary);
5047
+ --e-lift: var(--e-depth);
5048
+
5049
+ padding-block: var(--e-lift) 0;
5050
+ background-color: var(--e-surface);
5051
+ box-shadow:
5052
+ inset var(--e-stroke-edge) 0 0 0 var(--e-bc),
5053
+ inset calc(-1 * var(--e-stroke-edge)) 0 0 0 var(--e-bc),
5054
+ inset 0 var(--e-band) 0 0 var(--e-slab);
5055
+ }
5056
+ .e-tabs--framed .e-tabpanel {
5057
+ padding: var(--e-space-4);
5058
+ border-radius: var(--e-radius-md);
5059
+ border-start-start-radius: 0;
5060
+ background: var(--e-surface);
5061
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
5062
+ }
5063
+ .e-tabs--framed.e-tabs--fill .e-tabpanel {
5064
+ border-start-end-radius: 0;
5065
+ }
5066
+ .e-tabs--framed.e-tabs--vertical {
5067
+ gap: 0;
5068
+ align-items: stretch;
5069
+ }
5070
+ .e-tabs--framed.e-tabs--vertical .e-tablist {
5071
+ align-self: flex-start;
5072
+ margin-block-end: var(--e-radius-md);
5073
+ margin-inline-end: calc(-1 * var(--e-stroke-edge));
5074
+ }
5075
+ .e-tabs--framed.e-tabs--vertical .e-tab {
5076
+ border-radius: 0;
5077
+ }
5078
+ .e-tabs--framed.e-tabs--vertical .e-tab:first-child {
5079
+ border-start-start-radius: var(--e-radius-md);
5080
+ }
5081
+ .e-tabs--framed.e-tabs--vertical .e-tab[aria-selected="true"] {
5082
+ margin-block: calc(-1 * var(--e-stroke-edge)) 0;
5083
+ padding-block: 0;
5084
+ padding-inline-start: calc(var(--e-space-4) + var(--e-lift));
5085
+ box-shadow:
5086
+ inset 0 var(--e-stroke-edge) 0 0 var(--e-bc),
5087
+ inset 0 calc(-1 * var(--e-stroke-edge)) 0 0 var(--e-bc),
5088
+ inset var(--e-band) 0 0 0 var(--e-slab);
5089
+ }
5090
+ :dir(rtl) .e-tabs--framed.e-tabs--vertical .e-tab[aria-selected="true"] {
5091
+ box-shadow:
5092
+ inset 0 var(--e-stroke-edge) 0 0 var(--e-bc),
5093
+ inset 0 calc(-1 * var(--e-stroke-edge)) 0 0 var(--e-bc),
5094
+ inset calc(-1 * var(--e-band)) 0 0 0 var(--e-slab);
5095
+ }
5096
+ .e-tabs--framed.e-tabs--vertical .e-tab[aria-selected="true"]:first-child {
5097
+ margin-block-start: 0;
5098
+ }
5099
+ .e-tabs--framed.e-tabs--vertical .e-tabpanel {
5100
+ padding: var(--e-space-4);
5101
+ }
4893
5102
  .e-tab-count {
4894
5103
  min-width: var(--e-space-6);
4895
5104
  padding: 0 var(--e-space-2);
4896
5105
  border-radius: var(--e-radius-pill);
4897
5106
  background: color-mix(in srgb, var(--e-primary) 12%, var(--e-surface));
4898
5107
  box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-primary);
4899
- outline: var(--e-stroke-hair) solid var(--e-primary);
4900
- outline-offset: calc(-1 * var(--e-stroke-hair));
4901
5108
  font: 600 var(--e-text-xs) / 20px var(--e-font-mono);
4902
5109
  text-align: center;
4903
5110
  color: var(--e-ink);
@@ -5029,22 +5236,23 @@ to {
5029
5236
  justify-items: center;
5030
5237
  gap: var(--e-space-1);
5031
5238
  padding: var(--e-space-6) var(--e-space-4);
5032
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
5239
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
5240
+ outline-offset: calc(-1 * var(--e-stroke-edge));
5033
5241
  border-radius: var(--e-radius-md);
5034
5242
  background: var(--e-surface);
5035
5243
  text-align: center;
5036
5244
  cursor: pointer;
5037
5245
  transition:
5038
5246
  background-color var(--e-duration-tap) var(--e-easing-out),
5039
- border-color var(--e-duration-tap) var(--e-easing-out);
5247
+ outline-color var(--e-duration-tap) var(--e-easing-out);
5040
5248
  }
5041
5249
  .e-drop:hover {
5042
5250
  background: var(--e-surface-hover);
5043
- border-color: var(--e-ink);
5251
+ outline-color: var(--e-ink);
5044
5252
  }
5045
5253
  .e-drop--over {
5046
5254
  background: var(--e-secondary-soft);
5047
- border-color: var(--e-secondary);
5255
+ outline-color: var(--e-secondary);
5048
5256
  }
5049
5257
  .e-drop-main {
5050
5258
  font: 400 var(--e-text-md)/1.4 var(--e-font-sans);
@@ -5068,7 +5276,7 @@ to {
5068
5276
  }
5069
5277
  .e-drop-input:focus-visible + .e-files,
5070
5278
  .e-field:focus-within .e-drop {
5071
- outline: var(--e-stroke-focus) solid var(--e-focus-field);
5279
+ outline: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge))) solid var(--e-focus-field);
5072
5280
  outline-offset: var(--e-focus-gap-field);
5073
5281
  }
5074
5282
  .e-files {
@@ -5103,8 +5311,8 @@ to {
5103
5311
  @media (forced-colors: active) {
5104
5312
  .e-drop:hover,
5105
5313
  .e-drop--over {
5106
- border-style: solid;
5107
- border-color: Highlight;
5314
+ outline-style: solid;
5315
+ outline-color: Highlight;
5108
5316
  }
5109
5317
  }
5110
5318
  }