@ethlete/components 1.0.0-next.73 → 1.0.0-next.75

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 (47) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/design/form-field.ts +1 -0
  3. package/design/select.ts +1 -1
  4. package/fesm2022/ethlete-components.mjs +1283 -711
  5. package/fesm2022/ethlete-components.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/src/lib/accordion/accordion.component.css +40 -24
  8. package/src/lib/carousel/carousel-transition-styles.component.css +1 -1
  9. package/src/lib/carousel/carousel.component.css +16 -0
  10. package/src/lib/command-palette/command-palette-item.component.css +4 -0
  11. package/src/lib/command-palette/command-palette.component.css +48 -0
  12. package/src/lib/divider/divider.component.css +7 -3
  13. package/src/lib/forms/cascader/cascader-panel.component.css +4 -6
  14. package/src/lib/forms/color-input/color-picker-panel.component.css +1 -1
  15. package/src/lib/forms/date-time/date-picker-panel.component.css +3 -41
  16. package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +49 -0
  17. package/src/lib/forms/form-field/form-field-suffix-overlap-styles.component.css +27 -0
  18. package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +9 -12
  19. package/src/lib/forms/rich-text-editor/rich-text-editor-token-popup.component.css +4 -0
  20. package/src/lib/forms/select/select-option-group.component.css +4 -3
  21. package/src/lib/forms/select/select-option-styles.component.css +5 -0
  22. package/src/lib/forms/select/select-panel.component.css +14 -6
  23. package/src/lib/forms/select/select.component.css +77 -10
  24. package/src/lib/loader/progress-bar/progress-bar.component.css +1 -0
  25. package/src/lib/menu/menu-search-styles.component.css +27 -0
  26. package/src/lib/menu/menu.component.css +3 -7
  27. package/src/lib/notification/notification.component.css +4 -0
  28. package/src/lib/overlay/floating-panel-styles.component.css +2 -57
  29. package/src/lib/overlay/floating-tip-styles.component.css +0 -3
  30. package/src/lib/overlay/routing/overlay-router-outlet.component.css +8 -0
  31. package/src/lib/overlay/sidebar/overlay-sidebar.component.css +8 -1
  32. package/src/lib/overlay/strategies/anchored-dialog-styles.component.css +27 -0
  33. package/src/lib/overlay/strategies/dialog-styles.component.css +27 -0
  34. package/src/lib/overlay/strategies/full-screen-dialog-styles.component.css +58 -0
  35. package/src/lib/overlay/strategies/overlay-origin-clone.component.css +29 -0
  36. package/src/lib/overlay/strategies/sheet-styles.component.css +8 -0
  37. package/src/lib/pagination/page-size-select.component.css +0 -96
  38. package/src/lib/pagination/pagination.component.css +1 -22
  39. package/src/lib/progress-steps/progress-step.component.css +6 -0
  40. package/src/lib/scheduler/scheduler-agenda-view.component.css +9 -0
  41. package/src/lib/scheduler/scheduler-time-grid-view.component.css +5 -0
  42. package/src/lib/scrollable/headless/scrollable-buttons.component.css +8 -1
  43. package/src/lib/scrollable/headless/scrollable-footer.css +12 -0
  44. package/src/lib/scrollable/headless/scrollable-masks.component.css +37 -0
  45. package/src/lib/scrollbar/scrollbar.component.css +8 -2
  46. package/types/ethlete-components.d.ts +92 -28
  47. /package/src/lib/loader/spinner/{spinner.component.css → spinner-styles.component.css} +0 -0
@@ -33,6 +33,10 @@
33
33
  cursor: default;
34
34
  }
35
35
 
36
+ &:has(input[etselectsearch]:not(:read-only)) {
37
+ cursor: text;
38
+ }
39
+
36
40
  .et-select-trigger-content {
37
41
  display: flex;
38
42
  flex-wrap: wrap;
@@ -57,7 +61,8 @@
57
61
 
58
62
  input[etselectsearch] {
59
63
  flex: 1 1 60px;
60
- min-inline-size: 60px;
64
+ min-inline-size: min(100%, max(60px, var(--_et-select-search-placeholder-width, 0px)));
65
+ max-inline-size: 100%;
61
66
  border: none;
62
67
  outline: none;
63
68
  background: transparent;
@@ -65,21 +70,21 @@
65
70
  color: inherit;
66
71
  padding: 0;
67
72
  caret-color: var(--et-theme-color-primary-solid, currentColor);
68
- cursor: text;
73
+ cursor: inherit;
69
74
 
70
75
  &::placeholder {
71
76
  color: var(--et-surface-color-muted-solid, color-mix(in srgb, currentColor 46%, transparent));
72
77
  }
73
78
 
74
- /* Before the disabled rule: a disabled input is :read-only too, and there
75
- not-allowed must win. */
76
79
  &:read-only {
77
- cursor: default;
78
80
  caret-color: transparent;
79
81
  }
82
+ }
80
83
 
81
- &:disabled {
82
- cursor: not-allowed;
84
+ @supports (field-sizing: content) {
85
+ .et-select-trigger-content:not(.et-select-trigger-content--stacked) > input[etselectsearch] {
86
+ flex: 1 0 auto;
87
+ field-sizing: content;
83
88
  }
84
89
  }
85
90
 
@@ -152,29 +157,91 @@
152
157
  }
153
158
 
154
159
  .et-select-trigger-busy--enter {
155
- animation: et-select-busy-in 120ms ease;
160
+ animation: et-select-fade-in 120ms ease;
161
+ }
162
+
163
+ .et-select-trigger-busy--leave {
164
+ animation: et-select-fade-out 120ms ease forwards;
165
+ }
166
+
167
+ .et-select-chip--enter {
168
+ animation: et-select-fade-in 150ms ease-out;
156
169
  }
157
170
 
158
171
  @media (prefers-reduced-motion: reduce) {
159
- .et-select-trigger-busy--enter {
172
+ .et-select-trigger-busy--enter,
173
+ .et-select-trigger-busy--leave,
174
+ .et-select-chip--enter {
160
175
  animation: none;
161
176
  }
162
177
  }
163
178
  }
164
179
 
180
+ et-form-field
181
+ .et-form-field-control-frame:has(> .et-form-field-suffix > :is(.et-input-clear, .et-form-field-busy-spinner)):has(
182
+ et-select .et-select-chips
183
+ ) {
184
+ .et-form-field-control-slot {
185
+ mask-image: none;
186
+ }
187
+
188
+ .et-select-trigger-content {
189
+ padding-inline-end: var(--_et-form-field-suffix-overlap);
190
+ }
191
+ }
192
+
193
+ /* The search input always ends the last chip row and stretches to its end, so the clear button sits
194
+ over the input there instead of padding the content - a pad would rewrap the chips on focus. */
195
+ et-form-field
196
+ .et-form-field-control-frame:has(> .et-form-field-suffix > .et-input-clear):not(
197
+ :has(> .et-form-field-suffix > .et-form-field-busy-spinner)
198
+ ):has(et-select .et-select-chips + input[etselectsearch]) {
199
+ > .et-form-field-suffix > .et-input-clear {
200
+ align-self: end;
201
+ margin-block-end: calc((1lh - var(--et-form-field-affix-icon-size)) / 2);
202
+ }
203
+
204
+ .et-select-trigger-content {
205
+ padding-inline-end: 0;
206
+
207
+ > input[etselectsearch] {
208
+ padding-inline-end: 0;
209
+ mask-image: linear-gradient(
210
+ var(--_et-form-field-suffix-mask-direction),
211
+ black calc(100% - var(--_et-form-field-suffix-overlap) - 4px),
212
+ transparent calc(100% - var(--_et-form-field-suffix-cover))
213
+ );
214
+
215
+ &:not(:placeholder-shown) {
216
+ padding-inline-end: var(--_et-form-field-suffix-overlap);
217
+ }
218
+ }
219
+ }
220
+ }
221
+
165
222
  .et-form-field-control-frame:has(et-select) {
166
223
  cursor: pointer;
167
224
  }
168
225
 
226
+ .et-form-field-control-frame:has(et-select input[etselectsearch]:not(:read-only)) {
227
+ cursor: text;
228
+ }
229
+
169
230
  /* outside the `et-select` block on purpose: the chevron renders in the form field's suffix slot,
170
231
  which is not a descendant of the host. */
171
232
  .et-select-arrow .et-icon {
172
233
  rotate: 180deg;
173
234
  }
174
235
 
175
- @keyframes et-select-busy-in {
236
+ @keyframes et-select-fade-in {
176
237
  from {
177
238
  opacity: 0;
178
239
  }
179
240
  }
241
+
242
+ @keyframes et-select-fade-out {
243
+ to {
244
+ opacity: 0;
245
+ }
246
+ }
180
247
  }
@@ -136,6 +136,7 @@
136
136
  .et-progress-bar__bar-inner {
137
137
  display: inline-block;
138
138
  position: absolute;
139
+ inset-inline-start: 0;
139
140
  width: 100%;
140
141
  animation: none;
141
142
  border-top-style: solid;
@@ -20,6 +20,21 @@
20
20
  inset-inline-end: 10px;
21
21
  translate: 0 -50%;
22
22
  color: var(--_et-menu-muted-color);
23
+
24
+ &.et-menu-search-spinner--enter {
25
+ animation: et-menu-search-spinner-in 120ms ease;
26
+ }
27
+
28
+ &.et-menu-search-spinner--leave {
29
+ animation: et-menu-search-spinner-out 120ms ease forwards;
30
+ }
31
+
32
+ @media (prefers-reduced-motion: reduce) {
33
+ &.et-menu-search-spinner--enter,
34
+ &.et-menu-search-spinner--leave {
35
+ animation: none;
36
+ }
37
+ }
23
38
  }
24
39
 
25
40
  .et-menu-search-error {
@@ -53,4 +68,16 @@
53
68
  }
54
69
  }
55
70
  }
71
+
72
+ @keyframes et-menu-search-spinner-in {
73
+ from {
74
+ opacity: 0;
75
+ }
76
+ }
77
+
78
+ @keyframes et-menu-search-spinner-out {
79
+ to {
80
+ opacity: 0;
81
+ }
82
+ }
56
83
  }
@@ -247,8 +247,10 @@
247
247
 
248
248
  /* the roving focus is applied programmatically on mouse-open too, so :focus-visible (instead
249
249
  of [data-active] alone) keeps the highlight from appearing without a hover or keyboard
250
- interaction; a trigger whose submenu is open stays highlighted the whole time */
250
+ interaction; a trigger whose submenu is open stays highlighted the whole time, and an item
251
+ activated from the keyboard keeps its highlight while the menu fades out */
251
252
  &[data-active]:where(:focus-visible),
253
+ &[data-highlight-held],
252
254
  &[data-menu-open] {
253
255
  background: var(--_et-menu-item-active-background);
254
256
  }
@@ -287,10 +289,4 @@
287
289
  }
288
290
  }
289
291
  }
290
-
291
- .et-overlay--menu {
292
- --et-floating-panel-enter-duration: 140ms;
293
- --et-floating-panel-leave-duration: 100ms;
294
- --et-floating-panel-distance: 0.3rem;
295
- }
296
292
  }
@@ -223,6 +223,10 @@
223
223
  line-height: var(--et-notification-message-line-height);
224
224
  }
225
225
 
226
+ .et-notification-custom-content {
227
+ margin-top: var(--et-notification-gap);
228
+ }
229
+
226
230
  .et-notification-progress-bar {
227
231
  margin-top: 0.8rem;
228
232
  color: var(--et-theme-color-primary-solid, currentColor);
@@ -6,66 +6,11 @@
6
6
  }
7
7
 
8
8
  &.et-animation-enter-active {
9
- transition:
10
- transform var(--et-floating-panel-enter-duration, 200ms) ease,
11
- opacity var(--et-floating-panel-enter-duration, 200ms) ease;
9
+ transition: opacity 140ms ease;
12
10
  }
13
11
 
14
12
  &.et-animation-leave-active {
15
- transition:
16
- transform var(--et-floating-panel-leave-duration, 140ms) ease,
17
- opacity var(--et-floating-panel-leave-duration, 140ms) ease;
18
- }
19
- }
20
-
21
- .et-floating-panel[data-overlay-placement^='top'] {
22
- &.et-animation-enter-from,
23
- &.et-animation-leave-to {
24
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0)
25
- translateY(var(--et-floating-panel-distance, 0.4rem)) !important;
26
- }
27
- }
28
-
29
- .et-floating-panel[data-overlay-placement^='right'] {
30
- &.et-animation-enter-from,
31
- &.et-animation-leave-to {
32
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0)
33
- translateX(calc(var(--et-floating-panel-distance, 0.4rem) * -1)) !important;
34
- }
35
- }
36
-
37
- .et-floating-panel[data-overlay-placement^='bottom'] {
38
- &.et-animation-enter-from,
39
- &.et-animation-leave-to {
40
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0)
41
- translateY(calc(var(--et-floating-panel-distance, 0.4rem) * -1)) !important;
42
- }
43
- }
44
-
45
- .et-floating-panel[data-overlay-placement^='left'] {
46
- &.et-animation-enter-from,
47
- &.et-animation-leave-to {
48
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0)
49
- translateX(var(--et-floating-panel-distance, 0.4rem)) !important;
50
- }
51
- }
52
-
53
- @media (prefers-reduced-motion: reduce) {
54
- .et-overlay.et-with-default-animation.et-floating-panel {
55
- &.et-animation-enter-active {
56
- transition: opacity var(--et-floating-panel-enter-duration, 200ms) ease;
57
- }
58
-
59
- &.et-animation-leave-active {
60
- transition: opacity var(--et-floating-panel-leave-duration, 140ms) ease;
61
- }
62
- }
63
-
64
- .et-floating-panel[data-overlay-placement] {
65
- &.et-animation-enter-from,
66
- &.et-animation-leave-to {
67
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0) !important;
68
- }
13
+ transition: opacity 100ms ease;
69
14
  }
70
15
  }
71
16
  }
@@ -8,9 +8,6 @@
8
8
 
9
9
  .et-overlay--tooltip,
10
10
  .et-overlay--toggletip {
11
- --et-floating-panel-enter-duration: 200ms;
12
- --et-floating-panel-leave-duration: 140ms;
13
- --et-floating-panel-distance: 0.45rem;
14
11
  }
15
12
 
16
13
  .et-tooltip,
@@ -173,6 +173,14 @@
173
173
  grid-template-rows: minmax(0, 1fr);
174
174
  block-size: 100%;
175
175
  overflow: hidden;
176
+
177
+ .et-overlay-body-container > .et-overlay-router-outlet-host > & {
178
+ margin-inline: calc(var(--et-overlay-padding-inline) * -1);
179
+
180
+ > .et-overlay-router-outlet-page {
181
+ padding-inline: var(--et-overlay-padding-inline);
182
+ }
183
+ }
176
184
  }
177
185
 
178
186
  .et-overlay-router-outlet-page {
@@ -7,9 +7,16 @@
7
7
  display: flex;
8
8
  flex-direction: column;
9
9
  inline-size: var(--et-overlay-sidebar-inline-size, 240px);
10
+ position: relative;
11
+ min-block-size: 0;
12
+ border-inline-end: 1px solid var(--et-overlay-body-divider-color);
13
+ }
14
+
15
+ .et-overlay-sidebar-scroller {
16
+ flex: 1;
17
+ min-block-size: 0;
10
18
  padding-block: var(--et-overlay-padding-block);
11
19
  padding-inline: var(--et-overlay-padding-inline);
12
- border-inline-end: 1px solid var(--et-overlay-body-divider-color);
13
20
  overflow-y: auto;
14
21
  overscroll-behavior: contain;
15
22
  }
@@ -28,6 +28,33 @@
28
28
  transition:
29
29
  transform 150ms var(--ease-out-5),
30
30
  opacity 150ms var(--ease-out-5);
31
+
32
+ @supports (transition-timing-function: linear(0, 1)) {
33
+ /* a response 0.22s critically damped spring, cut where the opacity reaches 0 */
34
+ --_et-dialog-leave-spring: linear(
35
+ 0,
36
+ 0.0242 5.56%,
37
+ 0.083 11.11%,
38
+ 0.1607 16.67%,
39
+ 0.4178 33.33%,
40
+ 0.4961 38.89%,
41
+ 0.5674 44.44%,
42
+ 0.6311 50%,
43
+ 0.6872 55.56%,
44
+ 0.7361 61.11%,
45
+ 0.7783 66.67%,
46
+ 0.8145 72.22%,
47
+ 0.8453 77.78%,
48
+ 0.8713 83.33%,
49
+ 0.9117 94.44%,
50
+ 0.9271 100%,
51
+ 1 100%
52
+ );
53
+
54
+ transition:
55
+ transform 150ms var(--_et-dialog-leave-spring),
56
+ opacity 150ms linear;
57
+ }
31
58
  }
32
59
  }
33
60
  }
@@ -27,6 +27,33 @@
27
27
  transition:
28
28
  transform 150ms var(--ease-out-5),
29
29
  opacity 150ms var(--ease-out-5);
30
+
31
+ @supports (transition-timing-function: linear(0, 1)) {
32
+ /* a response 0.22s critically damped spring, cut where the opacity reaches 0 */
33
+ --_et-dialog-leave-spring: linear(
34
+ 0,
35
+ 0.0242 5.56%,
36
+ 0.083 11.11%,
37
+ 0.1607 16.67%,
38
+ 0.4178 33.33%,
39
+ 0.4961 38.89%,
40
+ 0.5674 44.44%,
41
+ 0.6311 50%,
42
+ 0.6872 55.56%,
43
+ 0.7361 61.11%,
44
+ 0.7783 66.67%,
45
+ 0.8145 72.22%,
46
+ 0.8453 77.78%,
47
+ 0.8713 83.33%,
48
+ 0.9117 94.44%,
49
+ 0.9271 100%,
50
+ 1 100%
51
+ );
52
+
53
+ transition:
54
+ transform 150ms var(--_et-dialog-leave-spring),
55
+ opacity 150ms linear;
56
+ }
30
57
  }
31
58
  }
32
59
  }
@@ -28,6 +28,36 @@
28
28
  transform 300ms var(--ease-in-out-5),
29
29
  border-radius 300ms var(--ease-in-out-5),
30
30
  opacity 150ms linear 100ms;
31
+
32
+ @supports (transition-timing-function: linear(0, 1)) {
33
+ /* a response 0.28s critically damped spring; the origin clone leave uses the same curve and timing */
34
+ --_et-full-screen-leave-spring: linear(
35
+ 0,
36
+ 0.0155 2.78%,
37
+ 0.0547 5.56%,
38
+ 0.1092 8.33%,
39
+ 0.1726 11.11%,
40
+ 0.3764 19.44%,
41
+ 0.5015 25%,
42
+ 0.5577 27.78%,
43
+ 0.6092 30.56%,
44
+ 0.656 33.33%,
45
+ 0.6982 36.11%,
46
+ 0.7361 38.89%,
47
+ 0.7997 44.44%,
48
+ 0.8493 50%,
49
+ 0.8874 55.56%,
50
+ 0.9281 63.89%,
51
+ 0.9612 75%,
52
+ 0.9908 100%,
53
+ 1
54
+ );
55
+
56
+ transition:
57
+ transform 300ms var(--_et-full-screen-leave-spring),
58
+ border-radius 300ms var(--_et-full-screen-leave-spring),
59
+ opacity 150ms linear 35ms;
60
+ }
31
61
  }
32
62
 
33
63
  &.et-overlay--full-screen-dialog--reduced-animation {
@@ -50,6 +80,34 @@
50
80
  transform 150ms var(--ease-in-5),
51
81
  border-radius 150ms var(--ease-in-5),
52
82
  opacity 150ms var(--ease-in-5);
83
+
84
+ @supports (transition-timing-function: linear(0, 1)) {
85
+ /* a response 0.22s critically damped spring, cut where the opacity reaches 0 */
86
+ --_et-full-screen-leave-spring: linear(
87
+ 0,
88
+ 0.0242 5.56%,
89
+ 0.083 11.11%,
90
+ 0.1607 16.67%,
91
+ 0.4178 33.33%,
92
+ 0.4961 38.89%,
93
+ 0.5674 44.44%,
94
+ 0.6311 50%,
95
+ 0.6872 55.56%,
96
+ 0.7361 61.11%,
97
+ 0.7783 66.67%,
98
+ 0.8145 72.22%,
99
+ 0.8453 77.78%,
100
+ 0.8713 83.33%,
101
+ 0.9117 94.44%,
102
+ 0.9271 100%,
103
+ 1 100%
104
+ );
105
+
106
+ transition:
107
+ transform 150ms var(--_et-full-screen-leave-spring),
108
+ border-radius 150ms var(--_et-full-screen-leave-spring),
109
+ opacity 150ms linear;
110
+ }
53
111
  }
54
112
  }
55
113
  }
@@ -41,6 +41,35 @@
41
41
  transition:
42
42
  transform 300ms var(--ease-in-out-5),
43
43
  opacity 125ms 175ms linear;
44
+
45
+ @supports (transition-timing-function: linear(0, 1)) {
46
+ /* must match the full-screen dialog leave, which this clone tracks */
47
+ --_et-origin-clone-leave-spring: linear(
48
+ 0,
49
+ 0.0155 2.78%,
50
+ 0.0547 5.56%,
51
+ 0.1092 8.33%,
52
+ 0.1726 11.11%,
53
+ 0.3764 19.44%,
54
+ 0.5015 25%,
55
+ 0.5577 27.78%,
56
+ 0.6092 30.56%,
57
+ 0.656 33.33%,
58
+ 0.6982 36.11%,
59
+ 0.7361 38.89%,
60
+ 0.7997 44.44%,
61
+ 0.8493 50%,
62
+ 0.8874 55.56%,
63
+ 0.9281 63.89%,
64
+ 0.9612 75%,
65
+ 0.9908 100%,
66
+ 1
67
+ );
68
+
69
+ transition:
70
+ transform 300ms var(--_et-origin-clone-leave-spring),
71
+ opacity 125ms 70ms linear;
72
+ }
44
73
  }
45
74
 
46
75
  &.et-animation-leave-to,
@@ -15,6 +15,14 @@
15
15
  Falls back to transparent (no filler) for overlays opened without surface themes. */
16
16
  --_et-overlay-overshoot-fill: var(--et-surface-background-solid, transparent);
17
17
 
18
+ @media (pointer: coarse) {
19
+ &:where(.et-overlay--bottom-sheet, .et-overlay--top-sheet, .et-overlay--left-sheet, .et-overlay--right-sheet) {
20
+ /* Android Chrome can show an unpainted frame when the first drag transforms a large
21
+ scrollable sheet. Keep its compositor layer ready while it is open. */
22
+ will-change: transform;
23
+ }
24
+ }
25
+
18
26
  &.et-overlay--bottom-sheet {
19
27
  &.et-animation-enter-from,
20
28
  &.et-animation-leave-to {
@@ -1,102 +1,6 @@
1
1
  @layer components {
2
- /* Its own height token rather than the paginator's `--et-pagination-item-size`: that one is
3
- `@property`-registered as inheriting with a 36px initial value, so it resolves everywhere — the
4
- select would silently take 36px regardless of its own density, and would not follow a compact
5
- paginator that lowered it on its own host anyway. Set this to line the two up exactly. */
6
- @property --et-page-size-select-height {
7
- syntax: '<length>';
8
- inherits: true;
9
- initial-value: 36px;
10
- }
11
-
12
2
  :where(.et-page-size-select-host) {
13
3
  display: inline-flex;
14
4
  align-items: center;
15
5
  }
16
-
17
- /* Follows the paginator's coarse-pointer target so the two stay level on touch. Zero specificity, so
18
- the `sm` rule below still wins. */
19
- @media (pointer: coarse) {
20
- :where(.et-page-size-select-host) {
21
- --et-page-size-select-height: 44px;
22
- }
23
- }
24
-
25
- .et-page-size-select-label {
26
- display: inline-flex;
27
- align-items: center;
28
- gap: 8px;
29
- font-size: 14px;
30
- white-space: nowrap;
31
- color: var(--et-surface-color-muted-solid, CanvasText);
32
- }
33
-
34
- /* The chevron is drawn over the control's trailing edge, so the field is the positioning context. */
35
- .et-page-size-select-field {
36
- position: relative;
37
- display: inline-flex;
38
- align-items: center;
39
- }
40
-
41
- /* The control itself reads as the paginator's own chrome — same radius, same border, same minimum
42
- height — so the two sit level in a controls row without either being restyled at the call site.
43
- The trailing padding leaves room for the chevron. */
44
- .et-page-size-select-control {
45
- appearance: none;
46
- min-block-size: var(--et-page-size-select-height);
47
- padding-block: 0;
48
- padding-inline: 8px 26px;
49
- font: inherit;
50
- font-variant-numeric: tabular-nums;
51
- color: var(--et-surface-color-solid, CanvasText);
52
- background: transparent;
53
- border: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / 0.3));
54
- border-radius: var(--et-pagination-radius, 8px);
55
- cursor: pointer;
56
- }
57
-
58
- .et-page-size-select-chevron {
59
- position: absolute;
60
- inset-inline-end: 8px;
61
- /* The picker is the select's; the chevron is decoration sitting on top of it. */
62
- pointer-events: none;
63
- color: var(--et-surface-color-muted-solid, CanvasText);
64
- }
65
-
66
- /* The dropdown the browser draws is outside this element, so it inherits nothing from the surface
67
- theme — give the options a background that at least matches the app rather than the UA default. */
68
- .et-page-size-select-control option {
69
- color: var(--et-surface-color-solid, CanvasText);
70
- background: var(--et-surface-background-solid, Canvas);
71
- }
72
-
73
- @media (hover: hover) {
74
- .et-page-size-select-control:hover {
75
- background: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 8%, transparent);
76
- }
77
- }
78
-
79
- .et-page-size-select-control:focus-visible {
80
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
81
- outline-offset: 2px;
82
- }
83
-
84
- /* Matches the paginator's own `sm` density, so a table footer can shrink both together. */
85
- .et-page-size-select-host:where([data-size='sm']) .et-page-size-select-label {
86
- font-size: 13px;
87
- gap: 6px;
88
- }
89
-
90
- .et-page-size-select-host:where([data-size='sm']) {
91
- /* Level with the compact pager's 34px chevrons, which is what it usually sits beside. */
92
- --et-page-size-select-height: 34px;
93
- }
94
-
95
- .et-page-size-select-host:where([data-size='sm']) .et-page-size-select-control {
96
- padding-inline: 6px 22px;
97
- }
98
-
99
- .et-page-size-select-host:where([data-size='sm']) .et-page-size-select-chevron {
100
- inset-inline-end: 6px;
101
- }
102
6
  }
@@ -130,28 +130,7 @@
130
130
  }
131
131
 
132
132
  .et-pagination-jump {
133
- display: inline-flex;
134
- align-items: center;
135
- gap: 8px;
136
- font-size: 14px;
137
- color: var(--et-surface-color-muted-solid, CanvasText);
138
- }
139
-
140
- .et-pagination-jump-input {
141
- inline-size: 64px;
142
- min-block-size: var(--et-pagination-item-size);
143
- padding-inline: 8px;
144
- font: inherit;
145
- font-variant-numeric: tabular-nums;
146
- color: var(--et-surface-color-solid, CanvasText);
147
- background: transparent;
148
- border: 1px solid var(--et-surface-border-solid, rgb(128 128 128 / 0.3));
149
- border-radius: var(--et-pagination-radius);
150
- }
151
-
152
- .et-pagination-jump-input:where(:focus-visible) {
153
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
154
- outline-offset: 2px;
133
+ inline-size: 128px;
155
134
  }
156
135
 
157
136
  /* Compact density: smaller cells with tighter padding, so the paginator sits closer to table-row
@@ -39,6 +39,7 @@
39
39
  inline-size: calc(100% + var(--et-progress-steps-gap, 8px));
40
40
  block-size: 2px;
41
41
  background: var(--et-surface-border-solid, currentColor);
42
+ transition: background-color 200ms ease;
42
43
  }
43
44
 
44
45
  /* Every resolved state fills its connector. The color comes from the step's own forced theme, so
@@ -66,6 +67,10 @@
66
67
  centers that whole box rather than the glyph inside it - the digit then sits visibly
67
68
  above center, since a line box's extra leading isn't split evenly around the glyph. */
68
69
  line-height: 1;
70
+ transition:
71
+ border-color 200ms ease,
72
+ background-color 200ms ease,
73
+ color 200ms ease;
69
74
 
70
75
  /* The icon's own SVG is `width/height: 100%` (fills its box) with no intrinsic size of its
71
76
  own, so left unset it stretches to whatever the flex layout gives it - explicitly sizing
@@ -107,6 +112,7 @@
107
112
 
108
113
  .et-progress-step-label {
109
114
  color: var(--et-surface-color-muted-solid, currentColor);
115
+ transition: color 200ms ease;
110
116
  }
111
117
 
112
118
  [etProgressStepDescription] {