@eos-ui/vue 0.4.0 → 0.5.1

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 (98) 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/Combobox/EComboboxBase.js.map +1 -1
  21. package/dist/components/Combobox/EComboboxBase.vue_vue_type_script_setup_true_lang.js +4 -8
  22. package/dist/components/Combobox/EComboboxBase.vue_vue_type_script_setup_true_lang.js.map +1 -1
  23. package/dist/components/Combobox/types.d.ts +2 -2
  24. package/dist/components/DataGrid/EDataGrid.js.map +1 -1
  25. package/dist/components/DataGrid/EDataGrid.vue.d.ts +1 -1
  26. package/dist/components/DataGrid/EDataGrid.vue_vue_type_script_setup_true_lang.js +1 -0
  27. package/dist/components/DataGrid/EDataGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/components/DescriptionList/EDescriptionList.js.map +1 -1
  29. package/dist/components/DescriptionList/EDescriptionList.vue_vue_type_script_setup_true_lang.js +2 -2
  30. package/dist/components/DescriptionList/EDescriptionList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  31. package/dist/components/Dialog/EDialog.js.map +1 -1
  32. package/dist/components/Dialog/EDialog.vue_vue_type_script_setup_true_lang.js.map +1 -1
  33. package/dist/components/Drawer/EDrawer.js.map +1 -1
  34. package/dist/components/Drawer/EDrawer.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/EmptyState/EEmptyState.js.map +1 -1
  36. package/dist/components/EmptyState/EEmptyState.vue.d.ts +1 -1
  37. package/dist/components/EmptyState/EEmptyState.vue_vue_type_script_setup_true_lang.js.map +1 -1
  38. package/dist/components/Grid/EGrid.js.map +1 -1
  39. package/dist/components/Grid/EGrid.vue.d.ts +1 -1
  40. package/dist/components/Grid/EGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  41. package/dist/components/IconButton/EIconButton.js.map +1 -1
  42. package/dist/components/IconButton/EIconButton.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/components/Inline/EInline.js.map +1 -1
  44. package/dist/components/Inline/EInline.vue.d.ts +1 -1
  45. package/dist/components/Inline/EInline.vue_vue_type_script_setup_true_lang.js.map +1 -1
  46. package/dist/components/Kbd/EKbd.js.map +1 -1
  47. package/dist/components/Kbd/EKbd.vue_vue_type_script_setup_true_lang.js.map +1 -1
  48. package/dist/components/NavList/ENavList.js.map +1 -1
  49. package/dist/components/NavList/ENavList.vue_vue_type_script_setup_true_lang.js.map +1 -1
  50. package/dist/components/Notice/ENotice.js.map +1 -1
  51. package/dist/components/Notice/ENotice.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/components/OtpField/EOtpField.js.map +1 -1
  53. package/dist/components/OtpField/EOtpField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/PageHeader/EPageHeader.js.map +1 -1
  55. package/dist/components/PageHeader/EPageHeader.vue_vue_type_script_setup_true_lang.js.map +1 -1
  56. package/dist/components/Pagination/EPagination.js.map +1 -1
  57. package/dist/components/Pagination/EPagination.vue_vue_type_script_setup_true_lang.js.map +1 -1
  58. package/dist/components/PasswordField/EPasswordField.js.map +1 -1
  59. package/dist/components/PasswordField/EPasswordField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  60. package/dist/components/SearchBar/ESearchBar.js.map +1 -1
  61. package/dist/components/SearchBar/ESearchBar.vue.d.ts +1 -1
  62. package/dist/components/SearchBar/ESearchBar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  63. package/dist/components/Segmented/ESegmented.js.map +1 -1
  64. package/dist/components/Segmented/ESegmented.vue_vue_type_script_setup_true_lang.js.map +1 -1
  65. package/dist/components/Select/ESelectControl.js.map +1 -1
  66. package/dist/components/Select/ESelectControl.vue_vue_type_script_setup_true_lang.js.map +1 -1
  67. package/dist/components/SignaturePad/ESignaturePad.js.map +1 -1
  68. package/dist/components/SignaturePad/ESignaturePad.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/Stack/EStack.js.map +1 -1
  70. package/dist/components/Stack/EStack.vue.d.ts +1 -1
  71. package/dist/components/Stack/EStack.vue_vue_type_script_setup_true_lang.js.map +1 -1
  72. package/dist/components/Stamp/EStamp.js.map +1 -1
  73. package/dist/components/Stamp/EStamp.vue.d.ts +2 -2
  74. package/dist/components/Stamp/EStamp.vue_vue_type_script_setup_true_lang.js +2 -2
  75. package/dist/components/Stamp/EStamp.vue_vue_type_script_setup_true_lang.js.map +1 -1
  76. package/dist/components/Stepper/EStepper.js.map +1 -1
  77. package/dist/components/Stepper/EStepper.vue_vue_type_script_setup_true_lang.js.map +1 -1
  78. package/dist/components/Surface/ESurface.js.map +1 -1
  79. package/dist/components/Surface/ESurface.vue.d.ts +1 -1
  80. package/dist/components/Surface/ESurface.vue_vue_type_script_setup_true_lang.js.map +1 -1
  81. package/dist/components/Switch/ESwitch.js.map +1 -1
  82. package/dist/components/Switch/ESwitch.vue_vue_type_script_setup_true_lang.js.map +1 -1
  83. package/dist/components/Table/ETable.js +8 -0
  84. package/dist/components/Table/ETable.js.map +1 -0
  85. package/dist/components/Table/ETable.vue.d.ts +25 -0
  86. package/dist/components/Table/ETable.vue_vue_type_script_setup_true_lang.js +28 -0
  87. package/dist/components/Table/ETable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  88. package/dist/components/Table/index.d.ts +1 -0
  89. package/dist/components/Tabs/ETabs.js.map +1 -1
  90. package/dist/components/Tabs/ETabs.vue.d.ts +10 -2
  91. package/dist/components/Tabs/ETabs.vue_vue_type_script_setup_true_lang.js +11 -3
  92. package/dist/components/Tabs/ETabs.vue_vue_type_script_setup_true_lang.js.map +1 -1
  93. package/dist/components/Upload/EUpload.js.map +1 -1
  94. package/dist/components/Upload/EUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  95. package/dist/index.d.ts +1 -0
  96. package/dist/index.js +10 -9
  97. package/dist/style.css +555 -179
  98. 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,21 +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);
479
+ border: 0;
475
480
  border-radius: var(--e-radius-md);
476
481
  background: var(--e-surface-tint);
477
482
  color: var(--e-primary);
478
483
  font: 600 var(--e-text-sm) / 1 var(--e-font-mono);
479
484
  letter-spacing: 0.02em;
480
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
+ }
481
497
  .e-avatar--button {
482
498
  position: relative;
483
499
  padding: 0;
484
500
  cursor: pointer;
485
- transition: border-color var(--e-duration-tap) var(--e-easing-out);
486
501
  }
487
502
  .e-avatar--button:hover {
488
- border-color: var(--e-ink);
503
+ --e-ring: var(--e-ink);
489
504
  }
490
505
  .e-avatar--button:focus-visible {
491
506
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -608,21 +623,24 @@
608
623
  --e-hover: color-mix(in srgb, var(--e-fill), var(--e-shade-hover));
609
624
  --e-press: color-mix(in srgb, var(--e-fill), var(--e-shade-press));
610
625
 
611
- /* The face is a whole rounded box and the slab is an offset copy of it showing underneath, in the colour of the face's own edge. The margin gives back the room the slab takes, so the button is still one control height tall, and pressing sinks the face onto the slab. */
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. */
612
627
  --e-lift: var(--e-depth);
628
+ --e-band: calc(var(--e-lift) + var(--e-stroke-edge));
629
+ --e-ring: var(--e-slab);
613
630
 
614
631
  position: relative;
615
632
  display: inline-flex;
616
633
  align-items: center;
617
634
  justify-content: center;
618
635
  gap: var(--e-space-2);
619
- height: calc(var(--e-control-height) - var(--e-lift));
620
- margin-block-end: var(--e-lift);
621
- padding: 0 var(--e-space-4);
622
- border: var(--e-stroke-edge) solid var(--e-slab);
636
+ height: var(--e-control-height);
637
+ padding: 0 var(--e-space-4) var(--e-lift);
638
+ border: 0;
623
639
  border-radius: var(--e-radius-md);
624
- background: var(--e-fill);
625
- box-shadow: 0 var(--e-lift) 0 0 var(--e-slab);
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);
626
644
  color: var(--e-on-fill);
627
645
  font: 500 var(--e-text-md) / 1 var(--e-font-sans);
628
646
  letter-spacing: 0.01em;
@@ -630,17 +648,19 @@
630
648
  text-decoration: none;
631
649
  cursor: pointer;
632
650
  transition:
633
- transform var(--e-duration-tap) var(--e-easing-out),
634
651
  box-shadow var(--e-duration-tap) var(--e-easing-out),
635
652
  background-color var(--e-duration-tap) var(--e-easing-out);
636
653
  }
637
654
  .e-btn:hover {
638
- 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);
639
658
  }
640
659
  .e-btn:active {
641
- background: var(--e-press);
642
- box-shadow: 0 0 0 0 var(--e-slab);
643
- transform: translateY(var(--e-lift));
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);
644
664
  }
645
665
  .e-btn--secondary {
646
666
  --e-fill: var(--e-secondary);
@@ -656,21 +676,24 @@
656
676
  --e-slab: var(--e-border-strong);
657
677
  }
658
678
  .e-btn--outline:hover {
659
- background: color-mix(in srgb, var(--e-surface), var(--e-shade-hover));
660
- border-color: var(--e-ink);
679
+ --e-ring: var(--e-ink);
680
+ --e-slab: var(--e-ink);
681
+
682
+ background-color: color-mix(in srgb, var(--e-surface), var(--e-shade-hover));
661
683
  }
662
684
  .e-btn--outline:active {
663
- background: color-mix(in srgb, var(--e-surface), var(--e-shade-press));
664
- border-color: var(--e-ink);
685
+ --e-ring: var(--e-ink);
686
+ --e-slab: var(--e-ink);
687
+
688
+ background-color: color-mix(in srgb, var(--e-surface), var(--e-shade-press));
665
689
  }
666
690
  .e-btn--quiet {
667
- border-color: transparent;
668
-
691
+ --e-ring: transparent;
669
692
  --e-lift: 0px;
670
693
 
671
694
  background: transparent;
672
695
  color: var(--e-ink);
673
- box-shadow: none;
696
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ring);
674
697
  padding-inline: var(--e-space-3);
675
698
  text-decoration: underline;
676
699
  text-underline-offset: 5px;
@@ -678,18 +701,72 @@
678
701
  text-decoration-color: var(--e-border-strong);
679
702
  }
680
703
  .e-btn--quiet:not([disabled], [aria-disabled="true"]):hover {
681
- border-color: var(--e-wash-ring);
704
+ --e-ring: var(--e-wash-ring);
705
+
682
706
  background: var(--e-wash-hover);
683
707
  text-decoration-color: currentcolor;
684
708
  }
685
709
  .e-btn--quiet:not([disabled], [aria-disabled="true"]):active {
686
- border-color: var(--e-ink);
710
+ --e-ring: var(--e-ink);
711
+
687
712
  background: var(--e-wash-press);
688
713
  transform: none;
689
714
  }
690
- .e-btn .e-icon {
715
+ .e-btn .e-icon,
716
+ .e-btn-spinner {
691
717
  margin-inline-start: calc(-0.5 * var(--e-space-1));
692
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
+ }
693
770
  .e-btn--block {
694
771
  width: 100%;
695
772
  }
@@ -699,9 +776,9 @@
699
776
  .e-btn[aria-pressed="true"]:hover,
700
777
  .e-btn[aria-pressed="true"]:active {
701
778
  --e-slab: var(--e-primary);
779
+ --e-ring: var(--e-primary);
702
780
 
703
- border-color: var(--e-primary);
704
- background: var(--e-surface-hover);
781
+ background-color: var(--e-surface-hover);
705
782
  color: var(--e-primary);
706
783
  }
707
784
  .e-btn[disabled],
@@ -711,8 +788,8 @@
711
788
  cursor: not-allowed;
712
789
  background: transparent;
713
790
  color: var(--e-muted);
714
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
715
- outline: 0;
791
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
792
+ outline-offset: calc(-1 * var(--e-stroke-edge));
716
793
  box-shadow: none;
717
794
  transform: none;
718
795
  }
@@ -720,6 +797,12 @@
720
797
  .e-btn {
721
798
  transition: none;
722
799
  }
800
+ .e-btn-spinner {
801
+ animation-duration: 3s;
802
+ }
803
+ .e-btn--loading {
804
+ animation: none;
805
+ }
723
806
  }
724
807
  @media print {
725
808
  .e-btn {
@@ -737,7 +820,7 @@
737
820
  }
738
821
  .e-btn[disabled],
739
822
  .e-btn[aria-disabled="true"] {
740
- border-color: GrayText;
823
+ outline-color: GrayText;
741
824
  color: GrayText;
742
825
  }
743
826
  }
@@ -767,7 +850,8 @@
767
850
  box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ink);
768
851
  }
769
852
  .e-icon-btn:disabled {
770
- 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));
771
855
  color: var(--e-muted);
772
856
  cursor: not-allowed;
773
857
  }
@@ -788,7 +872,7 @@
788
872
  outline-offset: calc(-1 * var(--e-stroke-edge));
789
873
  }
790
874
  .e-icon-btn:disabled {
791
- border-color: GrayText;
875
+ outline-color: GrayText;
792
876
  color: GrayText;
793
877
  }
794
878
  }
@@ -826,7 +910,7 @@
826
910
  gap: var(--e-space-1);
827
911
  height: var(--e-control-height);
828
912
  padding: 0 var(--e-space-2);
829
- border: var(--e-stroke-edge) solid transparent;
913
+ border: 0;
830
914
  border-radius: var(--e-radius-md);
831
915
  background: transparent;
832
916
  color: var(--e-ink);
@@ -836,7 +920,7 @@
836
920
  }
837
921
  .e-cal-pick:hover {
838
922
  background: var(--e-surface-hover);
839
- border-color: var(--e-border-strong);
923
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
840
924
  }
841
925
  .e-cal-pick:focus-visible {
842
926
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -889,7 +973,7 @@
889
973
  width: 100%;
890
974
  height: var(--e-tap);
891
975
  padding: 0;
892
- border: var(--e-stroke-edge) solid transparent;
976
+ border: 0;
893
977
  border-radius: var(--e-radius-md);
894
978
  background: transparent;
895
979
  color: var(--e-ink);
@@ -902,7 +986,7 @@
902
986
  /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */
903
987
  .e-day:hover:not(:disabled):not(.e-day--sel) {
904
988
  background: var(--e-surface-hover);
905
- border-color: var(--e-border-strong);
989
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
906
990
  }
907
991
  .e-day:focus-visible {
908
992
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -917,7 +1001,7 @@
917
1001
  }
918
1002
  .e-day--sel {
919
1003
  background: var(--e-primary);
920
- border-color: var(--e-primary);
1004
+ box-shadow: none;
921
1005
  font-weight: 700;
922
1006
  color: var(--e-on-primary);
923
1007
  }
@@ -960,7 +1044,7 @@
960
1044
  height: 100%;
961
1045
  min-height: var(--e-tap);
962
1046
  padding: 0;
963
- border: var(--e-stroke-edge) solid transparent;
1047
+ border: 0;
964
1048
  border-radius: var(--e-radius-md);
965
1049
  background: transparent;
966
1050
  color: var(--e-ink);
@@ -976,7 +1060,7 @@
976
1060
  /* stylelint-disable-next-line selector-not-notation -- the selector stays in this form */
977
1061
  .e-cal-cell:hover:not(:disabled):not(.e-day--sel) {
978
1062
  background: var(--e-surface-hover);
979
- border-color: var(--e-border-strong);
1063
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
980
1064
  }
981
1065
  .e-cal-cell:focus-visible {
982
1066
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -989,7 +1073,7 @@
989
1073
  }
990
1074
  .e-cal-cell.e-day--sel {
991
1075
  background: var(--e-primary);
992
- border-color: var(--e-primary);
1076
+ box-shadow: none;
993
1077
  font-weight: 700;
994
1078
  color: var(--e-on-primary);
995
1079
  }
@@ -1092,12 +1176,17 @@
1092
1176
  width: 24px;
1093
1177
  height: 24px;
1094
1178
  margin: 0;
1095
- border: var(--e-stroke-edge) solid var(--e-border-strong);
1179
+
1180
+ --e-ring: var(--e-border-strong);
1181
+
1182
+ border: 0;
1096
1183
  background: var(--e-surface);
1097
- box-shadow: var(--e-well);
1184
+ box-shadow:
1185
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
1186
+ var(--e-well);
1098
1187
  cursor: inherit;
1099
1188
  transition:
1100
- border-color var(--e-duration-tap) var(--e-easing-out),
1189
+ box-shadow var(--e-duration-tap) var(--e-easing-out),
1101
1190
  background-color var(--e-duration-tap) var(--e-easing-out);
1102
1191
  }
1103
1192
 
@@ -1111,12 +1200,12 @@
1111
1200
 
1112
1201
  .e-check:hover,
1113
1202
  .e-radio:hover {
1114
- border-color: var(--e-ink);
1203
+ --e-ring: var(--e-ink);
1204
+
1115
1205
  background-color: var(--e-surface-hover);
1116
1206
  }
1117
1207
 
1118
1208
  .e-check:checked {
1119
- border-color: var(--e-primary);
1120
1209
  background-color: var(--e-primary);
1121
1210
  box-shadow: none;
1122
1211
  }
@@ -1135,7 +1224,6 @@
1135
1224
  }
1136
1225
 
1137
1226
  .e-radio:checked {
1138
- border-color: var(--e-primary);
1139
1227
  background-color: var(--e-primary);
1140
1228
  box-shadow: none;
1141
1229
  background-image: radial-gradient(circle, var(--e-on-primary) 0 4px, transparent 5px);
@@ -1155,16 +1243,17 @@
1155
1243
 
1156
1244
  .e-check:disabled,
1157
1245
  .e-radio:disabled {
1158
- border-style: dashed;
1246
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
1247
+ outline-offset: calc(-1 * var(--e-stroke-edge));
1159
1248
  background-color: var(--e-surface-tint);
1160
1249
  box-shadow: none;
1161
1250
  }
1162
1251
 
1163
1252
  .e-check:checked:disabled,
1164
1253
  .e-radio:checked:disabled {
1165
- border-style: solid;
1254
+ outline: 0;
1166
1255
  background-color: var(--e-surface-tint);
1167
- border-color: var(--e-border-strong);
1256
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
1168
1257
  }
1169
1258
 
1170
1259
  @media (prefers-reduced-motion: reduce) {
@@ -1307,18 +1396,22 @@
1307
1396
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
1308
1397
  @layer e.controls {
1309
1398
  .e-input {
1399
+ --e-ring: var(--e-border-strong);
1400
+
1310
1401
  width: 100%;
1311
1402
  min-width: 0;
1312
1403
  height: var(--e-control-height);
1313
1404
  padding: 0 var(--e-space-4);
1314
- border: var(--e-stroke-edge) solid var(--e-border-strong);
1405
+ border: 0;
1315
1406
  border-radius: var(--e-radius-md);
1316
1407
  background-color: var(--e-surface);
1317
- box-shadow: var(--e-well);
1408
+ box-shadow:
1409
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
1410
+ var(--e-well);
1318
1411
  color: var(--e-ink);
1319
1412
  font: 400 var(--e-text-md)/1 var(--e-font-sans);
1320
1413
  transition:
1321
- border-color var(--e-duration-tap) var(--e-easing-out),
1414
+ box-shadow var(--e-duration-tap) var(--e-easing-out),
1322
1415
  background-color var(--e-duration-tap) var(--e-easing-out);
1323
1416
  }
1324
1417
 
@@ -1327,25 +1420,34 @@
1327
1420
  }
1328
1421
 
1329
1422
  .e-input:hover {
1330
- border-color: var(--e-ink);
1331
1423
  background-color: var(--e-surface-hover);
1332
1424
  }
1333
1425
 
1334
1426
  .e-input:focus {
1335
- border-color: var(--e-focus-field);
1427
+ --e-ring: var(--e-focus-field);
1428
+
1336
1429
  background-color: var(--e-surface);
1337
1430
  }
1338
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. */
1339
1433
  .e-input:focus-visible {
1434
+ outline-width: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge)));
1340
1435
  outline-color: var(--e-focus-field);
1341
1436
  outline-offset: var(--e-focus-gap-field);
1342
1437
  }
1343
1438
 
1344
1439
  .e-input[aria-invalid="true"] {
1345
- border-color: var(--e-danger);
1440
+ --e-ring: var(--e-danger);
1441
+
1442
+ background-color: var(--e-surface);
1443
+ }
1444
+
1445
+ .e-input[aria-invalid="true"]:hover {
1446
+ background-color: var(--e-danger-soft);
1447
+ }
1448
+
1449
+ .e-input[aria-invalid="true"]:focus {
1346
1450
  background-color: var(--e-surface);
1347
- box-shadow:
1348
- var(--e-well), inset 0 0 0 var(--e-stroke-hair) var(--e-danger);
1349
1451
  }
1350
1452
 
1351
1453
  .e-input[aria-invalid="true"]:focus-visible {
@@ -1354,8 +1456,8 @@
1354
1456
 
1355
1457
  .e-input:disabled {
1356
1458
  cursor: not-allowed;
1357
- border-style: dashed;
1358
- outline: 0;
1459
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
1460
+ outline-offset: calc(-1 * var(--e-stroke-edge));
1359
1461
  background-color: var(--e-surface-tint);
1360
1462
  box-shadow: none;
1361
1463
  color: var(--e-muted);
@@ -1366,46 +1468,52 @@
1366
1468
  }
1367
1469
 
1368
1470
  .e-input-wrap {
1471
+ --e-ring: var(--e-border-strong);
1472
+
1369
1473
  display: flex;
1370
1474
  align-items: stretch;
1371
1475
  min-width: 0;
1372
1476
  min-height: var(--e-control-height);
1373
- border: var(--e-stroke-edge) solid var(--e-border-strong);
1374
1477
  border-radius: var(--e-radius-md);
1375
1478
  background: var(--e-surface);
1376
- box-shadow: var(--e-well);
1479
+ box-shadow:
1480
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
1481
+ var(--e-well);
1377
1482
  transition:
1378
- border-color var(--e-duration-tap) var(--e-easing-out),
1483
+ box-shadow var(--e-duration-tap) var(--e-easing-out),
1379
1484
  background-color var(--e-duration-tap) var(--e-easing-out);
1380
1485
  }
1381
1486
 
1382
1487
  .e-input-wrap:hover {
1383
- border-color: var(--e-ink);
1384
1488
  background: var(--e-surface-hover);
1385
1489
  }
1386
1490
 
1387
1491
  .e-input-wrap:focus-within {
1388
- border-color: var(--e-focus-field);
1492
+ --e-ring: var(--e-focus-field);
1493
+
1389
1494
  background: var(--e-surface);
1390
- 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);
1391
1496
  outline-offset: var(--e-focus-gap-field);
1392
1497
  }
1393
1498
 
1394
1499
  .e-input-wrap[data-invalid] {
1395
- border-color: var(--e-danger);
1396
- box-shadow:
1397
- var(--e-well), inset 0 0 0 var(--e-stroke-hair) var(--e-danger);
1500
+ --e-ring: var(--e-danger);
1501
+
1398
1502
  background: var(--e-surface);
1399
1503
  }
1400
1504
 
1505
+ .e-input-wrap[data-invalid]:hover {
1506
+ background: var(--e-danger-soft);
1507
+ }
1508
+
1401
1509
  .e-input-wrap[data-invalid]:focus-within {
1402
- border-color: var(--e-danger);
1510
+ background: var(--e-surface);
1403
1511
  outline-color: var(--e-danger);
1404
1512
  }
1405
1513
 
1406
1514
  .e-input-wrap[data-disabled] {
1407
- border-style: dashed;
1408
- outline: 0;
1515
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
1516
+ outline-offset: calc(-1 * var(--e-stroke-edge));
1409
1517
  background: var(--e-surface-tint);
1410
1518
  box-shadow: none;
1411
1519
  color: var(--e-muted);
@@ -1413,7 +1521,6 @@
1413
1521
 
1414
1522
  .e-input-wrap .e-input {
1415
1523
  flex: 1;
1416
- border: 0;
1417
1524
  outline: 0;
1418
1525
  background: transparent;
1419
1526
  box-shadow: none;
@@ -1465,7 +1572,7 @@
1465
1572
 
1466
1573
  .e-input:disabled,
1467
1574
  .e-input-wrap[data-disabled] {
1468
- border-color: GrayText;
1575
+ outline-color: GrayText;
1469
1576
  }
1470
1577
 
1471
1578
  .e-input:focus-visible,
@@ -1800,6 +1907,9 @@ to {
1800
1907
  align-self: center;
1801
1908
  padding-inline: var(--e-space-2);
1802
1909
  }
1910
+ .e-combo-main .e-tag:not(:has(.e-tag-x)) {
1911
+ padding-inline-end: var(--e-space-3);
1912
+ }
1803
1913
  .e-tag {
1804
1914
  display: inline-flex;
1805
1915
  align-items: center;
@@ -1954,27 +2064,23 @@ to {
1954
2064
  justify-items: center;
1955
2065
  gap: var(--e-space-2);
1956
2066
  padding: var(--e-space-8) var(--e-space-4);
1957
- 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));
1958
2069
  border-radius: var(--e-radius-md);
1959
2070
  text-align: center;
1960
2071
  }
1961
2072
  .e-empty--bare {
1962
- border: 0;
2073
+ outline: 0;
1963
2074
  }
1964
2075
  .e-empty-icon {
1965
2076
  display: grid;
1966
2077
  place-items: center;
1967
- box-sizing: border-box;
1968
- width: 56px;
1969
- height: 56px;
1970
2078
  margin-bottom: var(--e-space-1);
1971
- border-radius: 50%;
1972
- background: var(--e-secondary-soft);
1973
- border: var(--e-stroke-hair) solid var(--e-secondary);
2079
+ color: var(--e-primary);
1974
2080
  }
1975
2081
  .e-empty-icon .e-icon {
1976
- width: 26px;
1977
- height: 26px;
2082
+ width: 40px;
2083
+ height: 40px;
1978
2084
  }
1979
2085
  .e-empty-title {
1980
2086
  margin: 0;
@@ -1987,10 +2093,12 @@ to {
1987
2093
  color: var(--e-muted);
1988
2094
  }
1989
2095
  @media (forced-colors: active) {
1990
- .e-empty-icon {
1991
- border-color: CanvasText;
2096
+ .e-empty {
1992
2097
  outline-color: CanvasText;
1993
2098
  }
2099
+ .e-empty-icon {
2100
+ color: CanvasText;
2101
+ }
1994
2102
  }
1995
2103
  }
1996
2104
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
@@ -2016,7 +2124,7 @@ to {
2016
2124
  min-width: var(--e-control-height);
2017
2125
  height: var(--e-control-height);
2018
2126
  padding: 0 var(--e-space-2);
2019
- border: var(--e-stroke-edge) solid transparent;
2127
+ border: 0;
2020
2128
  border-radius: var(--e-radius-md);
2021
2129
  background: transparent;
2022
2130
  color: var(--e-ink);
@@ -2025,11 +2133,11 @@ to {
2025
2133
  cursor: pointer;
2026
2134
  transition:
2027
2135
  background-color var(--e-duration-tap) var(--e-easing-out),
2028
- border-color var(--e-duration-tap) var(--e-easing-out);
2136
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
2029
2137
  }
2030
2138
  .e-page:hover {
2031
2139
  background: var(--e-surface-hover);
2032
- border-color: var(--e-border-strong);
2140
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
2033
2141
  }
2034
2142
  .e-page:focus-visible {
2035
2143
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -2037,7 +2145,7 @@ to {
2037
2145
  }
2038
2146
  .e-page[aria-current="page"] {
2039
2147
  background: var(--e-primary);
2040
- border-color: var(--e-primary);
2148
+ box-shadow: none;
2041
2149
  color: var(--e-on-primary);
2042
2150
  font-weight: 600;
2043
2151
  cursor: default;
@@ -2089,7 +2197,8 @@ to {
2089
2197
  cursor: pointer;
2090
2198
  }
2091
2199
  .e-sel-trigger[aria-expanded="true"] {
2092
- border-color: var(--e-ink);
2200
+ --e-ring: var(--e-ink);
2201
+
2093
2202
  background-color: var(--e-surface);
2094
2203
  }
2095
2204
  .e-sel-value {
@@ -2173,15 +2282,20 @@ to {
2173
2282
  }
2174
2283
  }
2175
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. */
2176
2286
  @layer e.containers {
2177
- .e-table {
2287
+ .e-table {
2178
2288
  width: 100%;
2179
2289
  border-collapse: collapse;
2180
2290
  font: 400 var(--e-text-md) / 1.4 var(--e-font-sans);
2181
- }
2182
- .e-table th {
2291
+ }
2292
+
2293
+ .e-table th {
2183
2294
  padding: var(--e-space-3) var(--e-space-4);
2184
- 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);
2185
2299
  background: var(--e-surface-tint);
2186
2300
  text-align: start;
2187
2301
  white-space: nowrap;
@@ -2189,30 +2303,52 @@ to {
2189
2303
  letter-spacing: 0.08em;
2190
2304
  text-transform: uppercase;
2191
2305
  color: var(--e-muted);
2192
- }
2193
- .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 {
2194
2322
  padding: var(--e-space-3) var(--e-space-4);
2195
2323
  border-top: var(--e-stroke-hair) solid var(--e-border);
2196
2324
  vertical-align: middle;
2197
- }
2198
- .e-table tbody tr:first-child td {
2325
+ }
2326
+
2327
+ .e-table tbody tr:first-child :is(td, th) {
2199
2328
  border-top: 0;
2200
- }
2201
- .e-table tbody tr:hover td {
2329
+ }
2330
+
2331
+ .e-table tbody tr:hover :is(td, th) {
2202
2332
  background: var(--e-surface-hover);
2203
- }
2204
- .e-table .e-num {
2333
+ }
2334
+
2335
+ .e-table .e-num {
2205
2336
  text-align: end;
2206
2337
  font-family: var(--e-font-mono);
2207
2338
  font-variant-numeric: tabular-nums;
2208
2339
  white-space: nowrap;
2209
- }
2210
- .e-table th.e-num {
2340
+ }
2341
+
2342
+ .e-table th.e-num {
2211
2343
  font-family: var(--e-font-mono);
2212
- }
2213
- .e-table .e-center {
2344
+ }
2345
+
2346
+ .e-table .e-center {
2214
2347
  text-align: center;
2348
+ }
2215
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 {
2216
2352
  .e-skel {
2217
2353
  display: block;
2218
2354
  height: 14px;
@@ -2363,7 +2499,7 @@ to {
2363
2499
  .e-filterrow td {
2364
2500
  padding: var(--e-space-1) var(--e-space-3);
2365
2501
  background: var(--e-surface);
2366
- 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);
2367
2503
  border-top: 0;
2368
2504
  position: sticky;
2369
2505
  top: var(--e-grid-head-h);
@@ -2635,15 +2771,11 @@ to {
2635
2771
  white-space: nowrap;
2636
2772
  align-items: center;
2637
2773
  gap: var(--e-space-2);
2638
-
2639
- --e-bc: var(--e-strong);
2640
-
2641
2774
  min-height: calc(var(--e-chip-height) + var(--e-space-1));
2642
2775
  padding: 0 var(--e-space-3);
2643
2776
  border-radius: var(--e-radius-sm);
2644
2777
  background: var(--e-strong);
2645
2778
  color: var(--e-on);
2646
- box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-bc);
2647
2779
  cursor: default;
2648
2780
  justify-self: start;
2649
2781
  }
@@ -2866,7 +2998,7 @@ to {
2866
2998
  height: fit-content;
2867
2999
  max-height: calc(100dvh - var(--e-space-8));
2868
3000
  margin: auto;
2869
- border-radius: var(--e-radius-lg);
3001
+ border-radius: var(--e-radius-md);
2870
3002
  overflow: auto;
2871
3003
  }
2872
3004
  .e-dialog--inline {
@@ -2984,7 +3116,7 @@ to {
2984
3116
  height: auto;
2985
3117
  max-height: min(32rem, 85dvh);
2986
3118
  margin: 0;
2987
- 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;
2988
3120
  }
2989
3121
  .e-drawer[data-state="open"] {
2990
3122
  animation: e-drawer-in 220ms var(--e-easing-out);
@@ -3056,7 +3188,7 @@ to {
3056
3188
  max-width: 28rem;
3057
3189
  height: auto;
3058
3190
  max-height: 18rem;
3059
- border-radius: var(--e-radius-lg);
3191
+ border-radius: var(--e-radius-md);
3060
3192
  }
3061
3193
  .e-drawer-body:focus-visible {
3062
3194
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
@@ -3445,9 +3577,10 @@ a:any-link > .e-highlight {
3445
3577
  display: inline-block;
3446
3578
  min-width: 1.5em;
3447
3579
  padding: 0 var(--e-space-1);
3448
- border: var(--e-stroke-hair) solid var(--e-border-strong);
3580
+ border: 0;
3449
3581
  border-radius: var(--e-radius-sm);
3450
3582
  background: var(--e-surface-tint);
3583
+ box-shadow: inset 0 0 0 var(--e-stroke-hair) var(--e-border-strong);
3451
3584
  color: var(--e-muted);
3452
3585
  font: 500 var(--e-text-sm) / 1.5 var(--e-font-mono);
3453
3586
  text-align: center;
@@ -3458,7 +3591,8 @@ a:any-link > .e-highlight {
3458
3591
  }
3459
3592
  @media (forced-colors: active) {
3460
3593
  .e-kbd {
3461
- border-color: ButtonText;
3594
+ outline: var(--e-stroke-hair) solid ButtonText;
3595
+ outline-offset: calc(-1 * var(--e-stroke-hair));
3462
3596
  }
3463
3597
  }
3464
3598
  }
@@ -3597,19 +3731,20 @@ a:any-link > .e-highlight {
3597
3731
  display: flex;
3598
3732
  align-items: center;
3599
3733
  gap: var(--e-space-3);
3600
- height: calc(var(--e-control-height) - var(--e-lift));
3601
- margin-block-end: var(--e-lift);
3734
+ height: var(--e-control-height);
3602
3735
  box-sizing: border-box;
3603
- padding: 0 var(--e-space-3);
3736
+ padding: 0 var(--e-space-3) var(--e-lift);
3604
3737
 
3605
3738
  --e-lift: 0px;
3606
3739
 
3607
- border: var(--e-stroke-edge) solid transparent;
3740
+ border: 0;
3608
3741
  border-radius: var(--e-radius-md);
3609
3742
  color: var(--e-ink);
3610
3743
  font: 400 var(--e-text-md) / 1 var(--e-font-sans);
3611
3744
  text-decoration: none;
3612
- 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);
3613
3748
  }
3614
3749
  .e-nav-item:hover {
3615
3750
  background-color: var(--e-surface-hover);
@@ -3621,11 +3756,16 @@ a:any-link > .e-highlight {
3621
3756
  .e-nav-item[aria-current="page"] {
3622
3757
  background-color: color-mix(in srgb, var(--e-surface-tint), var(--e-ink) 3%);
3623
3758
  font-weight: 600;
3624
- border-color: var(--e-primary);
3625
3759
 
3626
3760
  --e-lift: var(--e-depth);
3761
+ --e-slab: var(--e-primary);
3627
3762
 
3628
- box-shadow: 0 var(--e-lift) 0 0 var(--e-primary);
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));
3629
3769
  }
3630
3770
  .e-nav-label {
3631
3771
  flex: 1;
@@ -3747,11 +3887,11 @@ a:any-link > .e-highlight {
3747
3887
  container-type: inline-size;
3748
3888
  padding: var(--e-space-3) var(--e-space-4);
3749
3889
  padding-left: calc(var(--e-space-4) + 2 * var(--e-depth));
3750
- border: var(--e-stroke-edge) solid var(--e-tone);
3890
+ border: 0;
3751
3891
  border-radius: var(--e-radius-md);
3752
3892
  background-color: var(--e-bg);
3893
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-tone);
3753
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)));
3754
- background-origin: border-box;
3755
3895
  background-repeat: no-repeat;
3756
3896
  color: var(--e-ink);
3757
3897
  }
@@ -3809,7 +3949,7 @@ a:any-link > .e-highlight {
3809
3949
 
3810
3950
  /* stylelint-disable-next-line selector-not-notation */
3811
3951
  .e-otp .e-otp-box[data-filled]:not(:focus):not([aria-invalid="true"]) {
3812
- border-color: var(--e-ink);
3952
+ --e-ring: var(--e-ink);
3813
3953
  }
3814
3954
  }
3815
3955
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
@@ -3852,9 +3992,6 @@ a:any-link > .e-highlight {
3852
3992
  align-items: center;
3853
3993
  gap: var(--e-space-2) var(--e-space-4);
3854
3994
  }
3855
- .e-pagehead-titlerow > :not(.e-pagehead-title) {
3856
- margin-top: var(--e-space-1);
3857
- }
3858
3995
  }
3859
3996
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
3860
3997
  @layer e.composites {
@@ -3886,8 +4023,8 @@ a:any-link > .e-highlight {
3886
4023
  flex: none;
3887
4024
  width: 14px;
3888
4025
  height: 14px;
3889
- border: var(--e-stroke-edge) solid var(--e-border-strong);
3890
4026
  border-radius: 50%;
4027
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
3891
4028
  }
3892
4029
  }
3893
4030
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
@@ -4020,24 +4157,27 @@ to {
4020
4157
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4021
4158
  @layer e.controls {
4022
4159
  .e-search {
4160
+ --e-ring: var(--e-border-strong);
4161
+
4023
4162
  display: flex;
4024
4163
  align-items: center;
4025
4164
  gap: var(--e-space-1);
4026
4165
  height: var(--e-control-height);
4027
4166
  padding: 0 var(--e-space-1) 0 var(--e-space-2);
4028
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4029
4167
  border-radius: var(--e-radius-md);
4030
4168
  background: var(--e-surface);
4031
- box-shadow: var(--e-well);
4032
- transition: border-color var(--e-duration-tap) var(--e-easing-out);
4169
+ box-shadow:
4170
+ inset 0 0 0 var(--e-stroke-edge) var(--e-ring),
4171
+ var(--e-well);
4172
+ transition: box-shadow var(--e-duration-tap) var(--e-easing-out);
4033
4173
  }
4034
4174
  .e-search:hover {
4035
- border-color: var(--e-ink);
4175
+ background: var(--e-surface-hover);
4036
4176
  }
4037
4177
  .e-search .e-btn {
4038
4178
  position: relative;
4039
- height: calc(var(--e-control-height) - 6px - var(--e-lift));
4040
- padding: 0 var(--e-space-3);
4179
+ height: calc(var(--e-control-height) - 6px);
4180
+ padding: 0 var(--e-space-3) var(--e-lift);
4041
4181
  font-size: var(--e-text-md);
4042
4182
  }
4043
4183
  .e-search .e-btn::after {
@@ -4104,8 +4244,10 @@ to {
4104
4244
  outline: none;
4105
4245
  }
4106
4246
  .e-search:focus-within {
4107
- border-color: var(--e-focus-field);
4108
- outline: var(--e-stroke-focus) solid var(--e-focus-field);
4247
+ --e-ring: var(--e-focus-field);
4248
+
4249
+ background: var(--e-surface);
4250
+ outline: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge))) solid var(--e-focus-field);
4109
4251
  outline-offset: var(--e-focus-gap-field);
4110
4252
  }
4111
4253
  @media (prefers-reduced-motion: reduce) {
@@ -4160,12 +4302,17 @@ to {
4160
4302
  }
4161
4303
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4162
4304
  @layer e.controls {
4305
+ /* 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). */
4163
4306
  .e-seg {
4164
4307
  display: inline-flex;
4308
+ box-sizing: border-box;
4165
4309
  height: var(--e-control-height);
4166
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4310
+ position: relative;
4167
4311
  border-radius: var(--e-radius-md);
4168
- background: var(--e-border-strong);
4312
+ background: var(--e-surface-tint);
4313
+ box-shadow:
4314
+ inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong),
4315
+ var(--e-well);
4169
4316
  overflow: hidden;
4170
4317
  max-width: 100%;
4171
4318
  width: fit-content;
@@ -4175,9 +4322,6 @@ to {
4175
4322
  display: inline-flex;
4176
4323
  cursor: pointer;
4177
4324
  }
4178
- .e-seg-opt + .e-seg-opt {
4179
- border-inline-start: var(--e-stroke-hair) solid var(--e-border-strong);
4180
- }
4181
4325
  .e-seg-input {
4182
4326
  position: absolute;
4183
4327
  inset: 0;
@@ -4190,18 +4334,24 @@ to {
4190
4334
  align-items: center;
4191
4335
  justify-content: center;
4192
4336
  gap: var(--e-space-2);
4337
+ box-sizing: border-box;
4193
4338
  min-width: 4rem;
4194
4339
  padding: 0 var(--e-space-4);
4195
- background: var(--e-surface);
4340
+ background: transparent;
4341
+ color: var(--e-ink);
4196
4342
  font: 500 var(--e-text-md)/1 var(--e-font-sans);
4197
4343
  white-space: nowrap;
4198
4344
  transition: background-color var(--e-duration-tap) var(--e-easing-out);
4199
4345
  }
4200
4346
  .e-seg-opt:hover .e-seg-text {
4201
- background: var(--e-surface-hover);
4347
+ background: var(--e-wash-hover);
4202
4348
  }
4203
- .e-seg-input:checked + .e-seg-text {
4204
- background: var(--e-primary);
4349
+ .e-seg-input:checked + .e-seg-text,
4350
+ .e-seg-opt:hover .e-seg-input:checked + .e-seg-text {
4351
+ background-color: var(--e-primary);
4352
+
4353
+ /* The darker band along the bottom is the slab, drawn inside the piece and the track clips it to the corners. */
4354
+ background-image: linear-gradient(to top, color-mix(in srgb, var(--e-primary), var(--e-shade-slab)) var(--e-depth), transparent var(--e-depth));
4205
4355
  color: var(--e-on-primary);
4206
4356
  font-weight: 600;
4207
4357
  }
@@ -4216,9 +4366,13 @@ to {
4216
4366
  .e-seg-opt:has(:disabled):hover .e-seg-text {
4217
4367
  background: transparent;
4218
4368
  }
4369
+
4370
+ /* Chosen but unavailable: a flat piece with ink text, so it stays readable. */
4219
4371
  .e-seg-input:disabled:checked + .e-seg-text,
4220
4372
  .e-seg-opt:has(:disabled:checked):hover .e-seg-text {
4221
- background: var(--e-surface-hover);
4373
+ background-color: var(--e-surface);
4374
+ background-image: none;
4375
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
4222
4376
  color: var(--e-ink);
4223
4377
  }
4224
4378
  .e-seg-field {
@@ -4247,10 +4401,11 @@ to {
4247
4401
  .e-pad-surface {
4248
4402
  position: relative;
4249
4403
  overflow: hidden;
4250
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4251
4404
  border-radius: var(--e-radius-md);
4252
4405
  background: var(--e-surface);
4253
- box-shadow: var(--e-well);
4406
+ box-shadow:
4407
+ inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong),
4408
+ var(--e-well);
4254
4409
  }
4255
4410
  .e-pad-surface::after {
4256
4411
  content: "";
@@ -4442,18 +4597,20 @@ to {
4442
4597
  width: var(--e-dot);
4443
4598
  height: var(--e-dot);
4444
4599
  border-radius: 50%;
4445
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
4600
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
4601
+ outline-offset: calc(-1 * var(--e-stroke-edge));
4446
4602
  background: var(--e-surface);
4447
4603
  color: var(--e-muted);
4448
4604
  font: 600 var(--e-text-xs) / 1 var(--e-font-mono);
4449
4605
  }
4450
4606
  .e-step[data-state="done"] .e-step-dot {
4451
- border: var(--e-stroke-edge) solid var(--e-primary);
4607
+ outline: 0;
4452
4608
  background: var(--e-primary);
4453
4609
  color: var(--e-on-primary);
4454
4610
  }
4455
4611
  .e-step[data-state="current"] .e-step-dot {
4456
- border: var(--e-stroke-focus) solid var(--e-primary);
4612
+ outline: 0;
4613
+ box-shadow: inset 0 0 0 var(--e-stroke-focus) var(--e-primary);
4457
4614
  color: var(--e-primary);
4458
4615
  background: var(--e-surface);
4459
4616
  }
@@ -4508,7 +4665,6 @@ to {
4508
4665
  .e-step[data-state="done"] .e-step-dot {
4509
4666
  forced-color-adjust: none;
4510
4667
  background: Highlight;
4511
- border-color: Highlight;
4512
4668
  color: HighlightText;
4513
4669
  }
4514
4670
  }
@@ -4574,19 +4730,20 @@ to {
4574
4730
  .e-switch-track {
4575
4731
  --e-switch-w: 44px;
4576
4732
  --e-thumb: 14px;
4577
- --e-thumb-inset: calc(var(--e-space-1) - var(--e-stroke-card));
4578
- --e-thumb-travel: calc(var(--e-switch-w) - 2 * var(--e-stroke-edge) - var(--e-thumb) - 2 * var(--e-thumb-inset));
4733
+ --e-thumb-inset: var(--e-space-1);
4734
+ --e-thumb-travel: calc(var(--e-switch-w) - var(--e-thumb) - 2 * var(--e-thumb-inset));
4735
+ --e-ring: var(--e-border-strong);
4579
4736
 
4580
4737
  position: relative;
4581
4738
  flex: none;
4582
4739
  width: var(--e-switch-w);
4583
4740
  height: 24px;
4584
- border: var(--e-stroke-edge) solid var(--e-border-strong);
4585
4741
  border-radius: var(--e-radius-pill);
4586
4742
  background: var(--e-surface-tint);
4743
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-ring);
4587
4744
  transition:
4588
4745
  background-color var(--e-duration-tap) var(--e-easing-out),
4589
- border-color var(--e-duration-tap) var(--e-easing-out);
4746
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
4590
4747
  }
4591
4748
  .e-switch-track::after {
4592
4749
  content: "";
@@ -4601,19 +4758,21 @@ to {
4601
4758
  transition: transform var(--e-duration-move, 160ms) var(--e-easing-out);
4602
4759
  }
4603
4760
  .e-switch:hover .e-switch-track {
4604
- border-color: var(--e-ink);
4761
+ --e-ring: var(--e-ink);
4605
4762
  }
4606
4763
  .e-switch-input:checked + .e-switch-track {
4764
+ --e-ring: var(--e-primary);
4765
+
4607
4766
  background: var(--e-primary);
4608
- border-color: var(--e-primary);
4609
4767
  }
4610
4768
  .e-switch-input:checked + .e-switch-track::after {
4611
4769
  background: var(--e-on-primary);
4612
4770
  transform: translateX(var(--e-thumb-travel));
4613
4771
  }
4614
4772
  .e-switch-input:disabled + .e-switch-track {
4615
- border-style: dashed;
4616
- outline: 0;
4773
+ box-shadow: none;
4774
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
4775
+ outline-offset: calc(-1 * var(--e-stroke-edge));
4617
4776
  background: var(--e-surface-tint);
4618
4777
  }
4619
4778
  .e-switch-input:disabled + .e-switch-track::after {
@@ -4640,8 +4799,79 @@ to {
4640
4799
  }
4641
4800
  @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4642
4801
  @layer e.containers {
4802
+ .e-table-wrap {
4803
+ position: relative;
4804
+ min-width: 0;
4805
+ border-radius: var(--e-radius-md);
4806
+ background: var(--e-surface);
4807
+ }
4808
+
4809
+ /* The outline is drawn once, above the scroller and its sticky headings, so nothing covers it. */
4810
+ .e-table-wrap::after {
4811
+ content: "";
4812
+ position: absolute;
4813
+ inset: 0;
4814
+ border-radius: inherit;
4815
+ z-index: var(--e-z-sticky);
4816
+ box-shadow: inset 0 0 0 var(--e-stroke-card) var(--e-border);
4817
+ pointer-events: none;
4818
+ }
4819
+ .e-table-scroll {
4820
+ overflow: auto;
4821
+ max-height: var(--e-table-max-h, none);
4822
+ border-radius: inherit;
4823
+ }
4824
+ .e-table-scroll:focus-visible {
4825
+ outline: var(--e-stroke-focus) solid var(--e-focus-ring);
4826
+ outline-offset: calc(-1 * var(--e-stroke-focus));
4827
+ }
4828
+ .e-table-wrap .e-table {
4829
+ background: var(--e-surface);
4830
+ }
4831
+ .e-table-caption {
4832
+ padding: var(--e-space-3) var(--e-space-4);
4833
+ border-bottom: var(--e-stroke-hair) solid var(--e-border);
4834
+ text-align: start;
4835
+ font: 600 var(--e-text-md) / 1.3 var(--e-font-sans);
4836
+ color: var(--e-ink);
4837
+ }
4838
+ .e-table-wrap thead th {
4839
+ position: sticky;
4840
+ top: 0;
4841
+ z-index: var(--e-z-raised);
4842
+ }
4843
+ .e-table-wrap--striped tbody tr:nth-child(even) :is(td, th) {
4844
+ background: var(--e-surface-tint);
4845
+ }
4846
+ .e-table-wrap--striped tbody tr:hover :is(td, th) {
4847
+ background: var(--e-surface-hover);
4848
+ }
4849
+ .e-table-wrap--dense .e-table {
4850
+ font-size: var(--e-text-sm);
4851
+ }
4852
+ .e-table-wrap--dense .e-table :is(th, td, tbody th) {
4853
+ padding: var(--e-space-2) var(--e-space-3);
4854
+ }
4855
+ @media print {
4856
+ .e-table-scroll {
4857
+ overflow: visible;
4858
+ max-height: none;
4859
+ }
4860
+ .e-table-wrap::after {
4861
+ display: none;
4862
+ }
4863
+ }
4864
+ @media (forced-colors: active) {
4865
+ .e-table-wrap {
4866
+ outline: 1px solid CanvasText;
4867
+ }
4868
+ }
4869
+ }
4870
+ @layer e.reset, e.tokens, e.base, e.primitives, e.blocks, e.controls, e.composites, e.containers, e.page;
4871
+ @layer e.containers {
4643
4872
  .e-tablist {
4644
4873
  display: flex;
4874
+ flex: none;
4645
4875
  gap: 0;
4646
4876
  /* stylelint-disable-next-line declaration-block-no-redundant-longhand-properties -- the two axes are set apart */
4647
4877
  overflow-x: auto;
@@ -4652,30 +4882,33 @@ to {
4652
4882
  display: none;
4653
4883
  }
4654
4884
 
4655
- /* 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. */
4885
+ /* 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. */
4656
4886
  .e-tab {
4657
4887
  --e-bc: var(--e-border-strong);
4658
4888
 
4659
- /* A selected tab rises: its face is a whole rounded box with an offset copy in the primary colour showing underneath. The margin gives back the room that copy takes, so every tab row is one control height tall. */
4889
+ /* 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. */
4660
4890
  --e-lift: 0px;
4891
+ --e-band: calc(var(--e-lift) + var(--e-stroke-edge));
4892
+ --e-slab: var(--e-primary);
4661
4893
 
4662
4894
  position: relative;
4663
4895
  display: inline-flex;
4664
4896
  align-items: center;
4665
4897
  gap: var(--e-space-2);
4666
4898
  flex: none;
4667
- height: calc(var(--e-control-height) - var(--e-lift));
4668
- margin-block-end: var(--e-lift);
4669
- padding: 0 var(--e-space-4);
4670
- border: var(--e-stroke-edge) solid var(--e-bc);
4899
+ height: var(--e-control-height);
4900
+ padding: 0 var(--e-space-4) var(--e-lift);
4901
+ border: 0;
4671
4902
  border-radius: 0;
4672
4903
  background: transparent;
4904
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-bc);
4673
4905
  color: var(--e-muted);
4674
4906
  font: 500 var(--e-text-md) / 1 var(--e-font-sans);
4675
4907
  cursor: pointer;
4676
4908
  transition:
4677
4909
  color var(--e-duration-tap) var(--e-easing-out),
4678
- background-color var(--e-duration-tap) var(--e-easing-out);
4910
+ background-color var(--e-duration-tap) var(--e-easing-out),
4911
+ box-shadow var(--e-duration-tap) var(--e-easing-out);
4679
4912
  }
4680
4913
 
4681
4914
  /* Only the outer ends of the row are rounded. */
@@ -4703,24 +4936,166 @@ to {
4703
4936
 
4704
4937
  z-index: var(--e-z-sticky);
4705
4938
  background-color: color-mix(in srgb, var(--e-surface-tint), var(--e-ink) 3%);
4706
- box-shadow: 0 var(--e-lift) 0 0 var(--e-primary);
4939
+ box-shadow:
4940
+ inset 0 0 0 var(--e-stroke-edge) var(--e-bc),
4941
+ inset 0 calc(-1 * var(--e-band)) 0 0 var(--e-slab);
4707
4942
  color: var(--e-ink);
4708
4943
  font-weight: 600;
4709
4944
  }
4945
+
4946
+ /* The slab answers the pointer too: it darkens under the cursor, in step with the face. */
4947
+ .e-tab[aria-selected="true"]:hover {
4948
+ --e-slab: color-mix(in srgb, var(--e-primary), var(--e-shade-slab));
4949
+ }
4710
4950
  .e-tab:focus-visible {
4711
4951
  z-index: var(--e-z-focus);
4712
4952
  outline: var(--e-stroke-focus) solid var(--e-focus-ring);
4713
4953
  outline-offset: var(--e-focus-gap);
4714
4954
  }
4715
- .e-tabs--fill .e-tablist {
4955
+ .e-tabs--fill > .e-tablist {
4716
4956
  overflow-x: hidden;
4717
4957
  }
4718
- .e-tabs--fill .e-tab {
4958
+ .e-tabs--fill > .e-tablist > .e-tab {
4719
4959
  flex: 1 1 0;
4720
4960
  min-width: 0;
4721
4961
  justify-content: center;
4722
4962
  padding-inline: var(--e-space-1);
4723
4963
  }
4964
+
4965
+ /* 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. */
4966
+ .e-tabs--vertical {
4967
+ display: flex;
4968
+ align-items: flex-start;
4969
+ gap: var(--e-space-4);
4970
+ }
4971
+ .e-tabs--vertical > .e-tablist {
4972
+ flex-direction: column;
4973
+ flex: none;
4974
+ overflow: visible;
4975
+ }
4976
+ .e-tabs--vertical > .e-tablist > .e-tab {
4977
+ --e-lift: 0px;
4978
+
4979
+ height: var(--e-control-height);
4980
+ padding-block-end: 0;
4981
+ justify-content: flex-start;
4982
+ border-radius: 0;
4983
+ }
4984
+ .e-tabs--vertical > .e-tablist > .e-tab:first-child {
4985
+ border-start-start-radius: var(--e-radius-md);
4986
+ border-start-end-radius: var(--e-radius-md);
4987
+ }
4988
+ .e-tabs--vertical > .e-tablist > .e-tab:last-child {
4989
+ border-end-start-radius: var(--e-radius-md);
4990
+ border-end-end-radius: var(--e-radius-md);
4991
+ }
4992
+ .e-tabs--vertical > .e-tablist > .e-tab + .e-tab {
4993
+ margin-inline-start: 0;
4994
+ margin-block-start: calc(-1 * var(--e-stroke-edge));
4995
+ }
4996
+ .e-tabs--vertical > .e-tablist > .e-tab[aria-selected="true"] {
4997
+ --e-lift: var(--e-depth);
4998
+
4999
+ padding-inline-start: calc(var(--e-space-4) + var(--e-lift));
5000
+ box-shadow:
5001
+ inset 0 0 0 var(--e-stroke-edge) var(--e-bc),
5002
+ inset var(--e-band) 0 0 0 var(--e-slab);
5003
+ }
5004
+ .e-tabs--vertical > .e-tabpanel {
5005
+ flex: 1 1 0;
5006
+ min-width: 0;
5007
+ padding-top: 0;
5008
+ }
5009
+ :dir(rtl) .e-tabs--vertical > .e-tablist > .e-tab[aria-selected="true"] {
5010
+ box-shadow:
5011
+ inset 0 0 0 var(--e-stroke-edge) var(--e-bc),
5012
+ inset calc(-1 * var(--e-band)) 0 0 0 var(--e-slab);
5013
+ }
5014
+
5015
+ /* 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. */
5016
+ .e-tabs--framed > .e-tablist {
5017
+ position: relative;
5018
+ z-index: var(--e-z-raised);
5019
+ margin-block-end: calc(-1 * var(--e-stroke-edge));
5020
+ }
5021
+ .e-tabs--framed > .e-tablist > .e-tab {
5022
+ --e-bc: var(--e-border-strong);
5023
+ --e-lift: 0px;
5024
+
5025
+ border-radius: 0;
5026
+ background-color: var(--e-surface-tint);
5027
+ }
5028
+ .e-tabs--framed > .e-tablist > .e-tab:first-child {
5029
+ border-start-start-radius: var(--e-radius-md);
5030
+ }
5031
+ .e-tabs--framed.e-tabs--fill > .e-tablist > .e-tab:last-child {
5032
+ border-start-end-radius: var(--e-radius-md);
5033
+ }
5034
+ .e-tabs:not(.e-tabs--fill, .e-tabs--vertical).e-tabs--framed > .e-tablist {
5035
+ padding-inline-end: var(--e-radius-md);
5036
+ }
5037
+ .e-tabs--framed > .e-tablist > .e-tab:hover {
5038
+ background-color: var(--e-surface-hover);
5039
+ }
5040
+
5041
+ /* 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. */
5042
+ .e-tabs--framed > .e-tablist > .e-tab[aria-selected="true"] {
5043
+ --e-bc: var(--e-primary);
5044
+ --e-lift: var(--e-depth);
5045
+
5046
+ padding-block: var(--e-lift) 0;
5047
+ background-color: var(--e-surface);
5048
+ box-shadow:
5049
+ inset var(--e-stroke-edge) 0 0 0 var(--e-bc),
5050
+ inset calc(-1 * var(--e-stroke-edge)) 0 0 0 var(--e-bc),
5051
+ inset 0 var(--e-band) 0 0 var(--e-slab);
5052
+ }
5053
+ .e-tabs--framed > .e-tabpanel {
5054
+ padding: var(--e-space-4);
5055
+ border-radius: var(--e-radius-md);
5056
+ border-start-start-radius: 0;
5057
+ background: var(--e-surface);
5058
+ box-shadow: inset 0 0 0 var(--e-stroke-edge) var(--e-border-strong);
5059
+ }
5060
+ .e-tabs--framed.e-tabs--fill > .e-tabpanel {
5061
+ border-start-end-radius: 0;
5062
+ }
5063
+ .e-tabs--framed.e-tabs--vertical {
5064
+ gap: 0;
5065
+ align-items: stretch;
5066
+ }
5067
+ .e-tabs--framed.e-tabs--vertical > .e-tablist {
5068
+ align-self: flex-start;
5069
+ margin-block-end: var(--e-radius-md);
5070
+ margin-inline-end: calc(-1 * var(--e-stroke-edge));
5071
+ }
5072
+ .e-tabs--framed.e-tabs--vertical > .e-tablist > .e-tab {
5073
+ border-radius: 0;
5074
+ }
5075
+ .e-tabs--framed.e-tabs--vertical > .e-tablist > .e-tab:first-child {
5076
+ border-start-start-radius: var(--e-radius-md);
5077
+ }
5078
+ .e-tabs--framed.e-tabs--vertical > .e-tablist > .e-tab[aria-selected="true"] {
5079
+ margin-block: calc(-1 * var(--e-stroke-edge)) 0;
5080
+ padding-block: 0;
5081
+ padding-inline-start: calc(var(--e-space-4) + var(--e-lift));
5082
+ box-shadow:
5083
+ inset 0 var(--e-stroke-edge) 0 0 var(--e-bc),
5084
+ inset 0 calc(-1 * var(--e-stroke-edge)) 0 0 var(--e-bc),
5085
+ inset var(--e-band) 0 0 0 var(--e-slab);
5086
+ }
5087
+ :dir(rtl) .e-tabs--framed.e-tabs--vertical > .e-tablist > .e-tab[aria-selected="true"] {
5088
+ box-shadow:
5089
+ inset 0 var(--e-stroke-edge) 0 0 var(--e-bc),
5090
+ inset 0 calc(-1 * var(--e-stroke-edge)) 0 0 var(--e-bc),
5091
+ inset calc(-1 * var(--e-band)) 0 0 0 var(--e-slab);
5092
+ }
5093
+ .e-tabs--framed.e-tabs--vertical > .e-tablist > .e-tab[aria-selected="true"]:first-child {
5094
+ margin-block-start: 0;
5095
+ }
5096
+ .e-tabs--framed.e-tabs--vertical > .e-tabpanel {
5097
+ padding: var(--e-space-4);
5098
+ }
4724
5099
  .e-tab-count {
4725
5100
  min-width: var(--e-space-6);
4726
5101
  padding: 0 var(--e-space-2);
@@ -4858,22 +5233,23 @@ to {
4858
5233
  justify-items: center;
4859
5234
  gap: var(--e-space-1);
4860
5235
  padding: var(--e-space-6) var(--e-space-4);
4861
- border: var(--e-stroke-edge) dashed var(--e-border-strong);
5236
+ outline: var(--e-stroke-edge) dashed var(--e-border-strong);
5237
+ outline-offset: calc(-1 * var(--e-stroke-edge));
4862
5238
  border-radius: var(--e-radius-md);
4863
5239
  background: var(--e-surface);
4864
5240
  text-align: center;
4865
5241
  cursor: pointer;
4866
5242
  transition:
4867
5243
  background-color var(--e-duration-tap) var(--e-easing-out),
4868
- border-color var(--e-duration-tap) var(--e-easing-out);
5244
+ outline-color var(--e-duration-tap) var(--e-easing-out);
4869
5245
  }
4870
5246
  .e-drop:hover {
4871
5247
  background: var(--e-surface-hover);
4872
- border-color: var(--e-ink);
5248
+ outline-color: var(--e-ink);
4873
5249
  }
4874
5250
  .e-drop--over {
4875
5251
  background: var(--e-secondary-soft);
4876
- border-color: var(--e-secondary);
5252
+ outline-color: var(--e-secondary);
4877
5253
  }
4878
5254
  .e-drop-main {
4879
5255
  font: 400 var(--e-text-md)/1.4 var(--e-font-sans);
@@ -4897,7 +5273,7 @@ to {
4897
5273
  }
4898
5274
  .e-drop-input:focus-visible + .e-files,
4899
5275
  .e-field:focus-within .e-drop {
4900
- outline: var(--e-stroke-focus) solid var(--e-focus-field);
5276
+ outline: max(var(--e-stroke-focus), calc(2 * var(--e-stroke-edge))) solid var(--e-focus-field);
4901
5277
  outline-offset: var(--e-focus-gap-field);
4902
5278
  }
4903
5279
  .e-files {
@@ -4932,8 +5308,8 @@ to {
4932
5308
  @media (forced-colors: active) {
4933
5309
  .e-drop:hover,
4934
5310
  .e-drop--over {
4935
- border-style: solid;
4936
- border-color: Highlight;
5311
+ outline-style: solid;
5312
+ outline-color: Highlight;
4937
5313
  }
4938
5314
  }
4939
5315
  }