@ethlete/components 1.0.0-next.78 → 1.0.0-next.79

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 (252) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/design/accordion.ts +73 -0
  3. package/design/avatar.ts +90 -0
  4. package/design/badge.ts +48 -0
  5. package/design/banner.ts +77 -0
  6. package/design/bracket.ts +457 -0
  7. package/design/breadcrumb.ts +145 -0
  8. package/design/button.ts +49 -0
  9. package/design/calendar.ts +306 -0
  10. package/design/card.ts +92 -0
  11. package/design/carousel.ts +240 -0
  12. package/design/chart.ts +512 -0
  13. package/design/checkbox.ts +275 -0
  14. package/design/chip.ts +64 -0
  15. package/design/config.json +4 -1
  16. package/design/control.ts +19 -0
  17. package/design/copy-button.ts +59 -0
  18. package/design/description-list.ts +41 -0
  19. package/design/dialog.ts +214 -0
  20. package/design/divider.ts +27 -0
  21. package/design/empty-state.ts +45 -0
  22. package/design/floating-action.ts +55 -0
  23. package/design/grid.ts +148 -0
  24. package/design/input.ts +86 -0
  25. package/design/kbd.ts +19 -0
  26. package/design/loader.ts +152 -0
  27. package/design/masonry.ts +115 -0
  28. package/design/match.ts +131 -0
  29. package/design/menu.ts +143 -0
  30. package/design/notification.ts +129 -0
  31. package/design/otp-input.ts +107 -0
  32. package/design/pagination.ts +120 -0
  33. package/design/picture.ts +80 -0
  34. package/design/progress-steps.ts +79 -0
  35. package/design/query-error.ts +60 -0
  36. package/design/radio-group.ts +132 -0
  37. package/design/scheduler.ts +369 -0
  38. package/design/scrollable.ts +218 -0
  39. package/design/scrollbar.ts +47 -0
  40. package/design/sdk/assets/fallback.svg +1 -0
  41. package/design/sdk/assets/tall.svg +1 -0
  42. package/design/sdk/assets/wide.svg +1 -0
  43. package/design/sdk/components/accent-on-light/accent-on-light.css +35 -0
  44. package/design/sdk/components/accent-on-light/accent-on-light.ts +10 -0
  45. package/design/sdk/components/accent-on-light/shared/controls.ts +46 -0
  46. package/design/sdk/components/accordion/accordion.css +17 -0
  47. package/design/sdk/components/accordion/accordion.ts +64 -0
  48. package/design/sdk/components/avatar/avatar.css +14 -0
  49. package/design/sdk/components/avatar/avatar.ts +78 -0
  50. package/design/sdk/components/badge/badge.css +13 -0
  51. package/design/sdk/components/badge/badge.ts +52 -0
  52. package/design/sdk/components/banner/banner.css +18 -0
  53. package/design/sdk/components/banner/banner.ts +87 -0
  54. package/design/sdk/components/bracket/bracket.css +59 -0
  55. package/design/sdk/components/bracket/bracket.ts +143 -0
  56. package/design/sdk/components/breadcrumb/breadcrumb.css +25 -0
  57. package/design/sdk/components/breadcrumb/breadcrumb.ts +81 -0
  58. package/design/sdk/components/button/button.css +33 -0
  59. package/design/sdk/components/button/button.ts +50 -7
  60. package/design/sdk/components/calendar/calendar.css +33 -0
  61. package/design/sdk/components/calendar/calendar.ts +96 -0
  62. package/design/sdk/components/card/card.css +19 -0
  63. package/design/sdk/components/card/card.ts +61 -0
  64. package/design/sdk/components/carousel/carousel.css +44 -0
  65. package/design/sdk/components/carousel/carousel.ts +74 -0
  66. package/design/sdk/components/chart/chart.css +56 -0
  67. package/design/sdk/components/chart/chart.ts +98 -0
  68. package/design/sdk/components/chip/chip.css +18 -0
  69. package/design/sdk/components/chip/chip.ts +76 -0
  70. package/design/sdk/components/copy-button/copy-button.css +14 -0
  71. package/design/sdk/components/copy-button/copy-button.ts +59 -0
  72. package/design/sdk/components/description-list/description-list.css +7 -0
  73. package/design/sdk/components/description-list/description-list.ts +53 -0
  74. package/design/sdk/components/dialog/dialog.css +29 -0
  75. package/design/sdk/components/dialog/dialog.ts +78 -0
  76. package/design/sdk/components/divider/divider.css +26 -0
  77. package/design/sdk/components/divider/divider.ts +43 -0
  78. package/design/sdk/components/empty-state/empty-state.css +15 -0
  79. package/design/sdk/components/empty-state/empty-state.ts +56 -0
  80. package/design/sdk/components/floating-action/floating-action.css +51 -0
  81. package/design/sdk/components/floating-action/floating-action.ts +63 -0
  82. package/design/sdk/components/form-field/form-field.ts +23 -5
  83. package/design/sdk/components/grid/grid.css +17 -0
  84. package/design/sdk/components/grid/grid.ts +80 -0
  85. package/design/sdk/components/input/input.css +75 -0
  86. package/design/sdk/components/input/input.ts +79 -0
  87. package/design/sdk/components/kbd/kbd.css +25 -0
  88. package/design/sdk/components/kbd/kbd.ts +57 -0
  89. package/design/sdk/components/loader/loader.css +37 -0
  90. package/design/sdk/components/loader/loader.ts +68 -0
  91. package/design/sdk/components/masonry/masonry.css +7 -0
  92. package/design/sdk/components/masonry/masonry.ts +42 -0
  93. package/design/sdk/components/match/match.css +25 -0
  94. package/design/sdk/components/match/match.ts +76 -0
  95. package/design/sdk/components/menu/menu.css +22 -0
  96. package/design/sdk/components/menu/menu.ts +91 -0
  97. package/design/sdk/components/notification/notification.css +32 -0
  98. package/design/sdk/components/notification/notification.ts +106 -0
  99. package/design/sdk/components/otp-input/otp-input.css +35 -0
  100. package/design/sdk/components/otp-input/otp-input.ts +64 -0
  101. package/design/sdk/components/pagination/pagination.css +14 -0
  102. package/design/sdk/components/pagination/pagination.ts +75 -0
  103. package/design/sdk/components/picture/picture.css +37 -0
  104. package/design/sdk/components/picture/picture.ts +96 -0
  105. package/design/sdk/components/progress-steps/progress-steps.css +37 -0
  106. package/design/sdk/components/progress-steps/progress-steps.ts +91 -0
  107. package/design/sdk/components/query-error/query-error.css +33 -0
  108. package/design/sdk/components/query-error/query-error.ts +120 -0
  109. package/design/sdk/components/scheduler/scheduler.css +55 -0
  110. package/design/sdk/components/scheduler/scheduler.ts +239 -0
  111. package/design/sdk/components/scrollable/scrollable.css +58 -0
  112. package/design/sdk/components/scrollable/scrollable.ts +133 -0
  113. package/design/sdk/components/scrollbar/scrollbar.css +78 -0
  114. package/design/sdk/components/scrollbar/scrollbar.ts +123 -0
  115. package/design/sdk/components/select/select.ts +1 -1
  116. package/design/sdk/components/select/shared/select-part.ts +16 -1
  117. package/design/sdk/components/select-panel/select-panel.css +3 -0
  118. package/design/sdk/components/select-panel/select-panel.ts +124 -0
  119. package/design/sdk/components/skeleton/skeleton.css +22 -0
  120. package/design/sdk/components/skeleton/skeleton.ts +50 -0
  121. package/design/sdk/components/slider/slider.css +52 -0
  122. package/design/sdk/components/slider/slider.ts +86 -0
  123. package/design/sdk/components/standings/standings.css +33 -0
  124. package/design/sdk/components/standings/standings.ts +130 -0
  125. package/design/sdk/components/stat-tile/stat-tile.css +15 -0
  126. package/design/sdk/components/stat-tile/stat-tile.ts +84 -0
  127. package/design/sdk/components/stream/stream.css +48 -0
  128. package/design/sdk/components/stream/stream.ts +38 -0
  129. package/design/sdk/components/switch/switch.css +35 -0
  130. package/design/sdk/components/switch/switch.ts +63 -0
  131. package/design/sdk/components/table/table.css +67 -0
  132. package/design/sdk/components/table/table.ts +160 -0
  133. package/design/sdk/components/tabs/tabs.css +13 -0
  134. package/design/sdk/components/tabs/tabs.ts +74 -0
  135. package/design/sdk/components/textarea/textarea.css +116 -0
  136. package/design/sdk/components/textarea/textarea.ts +64 -0
  137. package/design/sdk/components/timeline/timeline.css +30 -0
  138. package/design/sdk/components/timeline/timeline.ts +87 -0
  139. package/design/sdk/components/toolbar/toolbar.css +24 -0
  140. package/design/sdk/components/toolbar/toolbar.ts +87 -0
  141. package/design/sdk/components/tooltip/tooltip.css +15 -0
  142. package/design/sdk/components/tooltip/tooltip.ts +28 -0
  143. package/design/sdk/components/tree/selected-tint.css +15 -0
  144. package/design/sdk/components/tree/tree.ts +70 -0
  145. package/design/sdk/foundations/colors/colors.css +108 -4
  146. package/design/sdk/foundations/elevation/elevation.css +6 -0
  147. package/design/sdk/foundations/elevation/elevation.ts +11 -0
  148. package/design/sdk/foundations/elevation/shared/elevation/scene.css +101 -0
  149. package/design/sdk/foundations/elevation/shared/elevation/scene.ts +74 -0
  150. package/design/sdk/foundations/icons/icons.ts +119 -0
  151. package/design/skeleton.ts +67 -0
  152. package/design/slider.ts +155 -0
  153. package/design/standings.ts +161 -0
  154. package/design/stat-tile.ts +109 -0
  155. package/design/stream.ts +92 -0
  156. package/design/switch.ts +83 -0
  157. package/design/table.ts +302 -0
  158. package/design/tabs.ts +75 -0
  159. package/design/textarea.ts +92 -0
  160. package/design/timeline.ts +52 -0
  161. package/design/toolbar.ts +95 -0
  162. package/design/tooltip.ts +87 -0
  163. package/fesm2022/ethlete-components.mjs +228 -187
  164. package/fesm2022/ethlete-components.mjs.map +1 -1
  165. package/package.json +1 -1
  166. package/src/lib/accordion/accordion.component.css +2 -1
  167. package/src/lib/avatar/avatar.component.css +10 -0
  168. package/src/lib/badge/badge.component.css +2 -2
  169. package/src/lib/banner/banner.component.css +3 -1
  170. package/src/lib/breadcrumb/breadcrumb-outlet.component.css +5 -0
  171. package/src/lib/breadcrumb/breadcrumb.component.css +5 -1
  172. package/src/lib/button/button.component.css +19 -0
  173. package/src/lib/button/icon-button.component.css +19 -20
  174. package/src/lib/button/split-button.component.css +5 -1
  175. package/src/lib/calendar/calendar.component.css +13 -3
  176. package/src/lib/card/card.component.css +4 -0
  177. package/src/lib/carousel/carousel-autoplay-styles.component.css +1 -1
  178. package/src/lib/carousel/carousel.component.css +2 -2
  179. package/src/lib/chart/chart-axis.component.css +3 -3
  180. package/src/lib/chip/chip.component.css +8 -2
  181. package/src/lib/description-list/description-list.component.css +2 -1
  182. package/src/lib/empty-state/empty-state.component.css +4 -0
  183. package/src/lib/floating-action/floating-action-styles.component.css +27 -0
  184. package/src/lib/focus-ring/focus-ring-styles.component.css +4 -1
  185. package/src/lib/forms/checkbox/checkbox.component.css +31 -5
  186. package/src/lib/forms/color-input/color-input.component.css +3 -1
  187. package/src/lib/forms/color-input/color-picker-panel.component.css +6 -2
  188. package/src/lib/forms/date-time/date-input/date-input.component.css +1 -1
  189. package/src/lib/forms/date-time/date-time-input/date-time-input.component.css +1 -1
  190. package/src/lib/forms/date-time/duration-input/duration-input.component.css +1 -1
  191. package/src/lib/forms/date-time/range-input-shell-styles.component.css +1 -1
  192. package/src/lib/forms/date-time/time-input/time-input.component.css +1 -1
  193. package/src/lib/forms/description/description.component.css +7 -0
  194. package/src/lib/forms/dropzone/dropzone.component.css +26 -0
  195. package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +4 -2
  196. package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +54 -5
  197. package/src/lib/forms/form-field/form-field-textarea-styles.component.css +62 -0
  198. package/src/lib/forms/form-field/form-field.component.css +6 -0
  199. package/src/lib/forms/form-field/headless/label.directive.css +1 -1
  200. package/src/lib/forms/input/input.component.css +6 -2
  201. package/src/lib/forms/input/number-input.component.css +2 -2
  202. package/src/lib/forms/input/password-input.component.css +4 -3
  203. package/src/lib/forms/otp-input/otp-input.component.css +23 -4
  204. package/src/lib/forms/phone-input/phone-input.component.css +4 -3
  205. package/src/lib/forms/rating/rating.component.css +2 -1
  206. package/src/lib/forms/rich-text-editor/rich-text-editor.component.css +1 -1
  207. package/src/lib/forms/selection-card-styles.component.css +3 -2
  208. package/src/lib/forms/selection-list/checkbox-group/checkbox-group-select-all.component.css +4 -2
  209. package/src/lib/forms/selection-list/checkbox-group/checkbox-option.component.css +4 -2
  210. package/src/lib/forms/selection-list/radio-group/radio.component.css +5 -2
  211. package/src/lib/forms/selection-list/segmented-button-group/segmented-button.component.css +2 -1
  212. package/src/lib/forms/slider/range-slider.component.css +98 -6
  213. package/src/lib/forms/slider/slider.component.css +96 -4
  214. package/src/lib/forms/switch/switch.component.css +47 -4
  215. package/src/lib/forms/tag-input/tag-input.component.css +2 -2
  216. package/src/lib/forms/textarea/textarea-autosize-styles.component.css +2 -3
  217. package/src/lib/forms/textarea/textarea.component.css +7 -2
  218. package/src/lib/grid/grid-item-toolbar.component.css +10 -0
  219. package/src/lib/grid/grid-item.component.css +6 -1
  220. package/src/lib/loader/brand-loader/brand-loader.component.css +4 -1
  221. package/src/lib/loader/progress-bar/progress-bar.component.css +1 -1
  222. package/src/lib/loader/spinner/spinner-styles.component.css +1 -1
  223. package/src/lib/match/match-card.component.css +9 -3
  224. package/src/lib/match/match-score.component.css +4 -1
  225. package/src/lib/menu/menu-selection-item.component.css +1 -1
  226. package/src/lib/menu/menu.component.css +5 -0
  227. package/src/lib/overlay/overlay-container.component.css +4 -0
  228. package/src/lib/pagination/pagination.component.css +4 -0
  229. package/src/lib/progress-steps/progress-step.component.css +4 -4
  230. package/src/lib/query-error/query-error.component.css +4 -0
  231. package/src/lib/scheduler/scheduler-appointment-styles.component.css +21 -5
  232. package/src/lib/scheduler/scheduler-month-view.component.css +4 -2
  233. package/src/lib/scheduler/scheduler-time-grid-view.component.css +8 -2
  234. package/src/lib/scrollable/headless/scrollable-navigation.component.css +1 -1
  235. package/src/lib/standings/standings-pick.component.css +1 -1
  236. package/src/lib/standings/standings.component.css +10 -10
  237. package/src/lib/stat-tile/stat-tile-sparkline.component.css +1 -1
  238. package/src/lib/stream/consent/stream-consent.component.css +99 -0
  239. package/src/lib/stream/error/stream-player-error.component.css +100 -0
  240. package/src/lib/stream/loading/stream-player-loading.component.css +16 -0
  241. package/src/lib/stream/pip/pip-slot-placeholder.component.css +68 -0
  242. package/src/lib/stream/stream-player-slot-styles.component.css +4 -0
  243. package/src/lib/table/table-resize-grip.component.css +2 -1
  244. package/src/lib/table/table-select-cell.component.css +45 -15
  245. package/src/lib/table/table.component.css +15 -5
  246. package/src/lib/tabs/tab-bar-styles.component.css +1 -1
  247. package/src/lib/tabs/tabs/tab-group.component.css +111 -0
  248. package/src/lib/time-picker/time-picker.component.css +2 -1
  249. package/src/lib/timeline/timeline-item.component.css +5 -1
  250. package/src/lib/toolbar/toolbar.component.css +4 -0
  251. package/src/lib/tooltip/tooltip.component.css +14 -0
  252. package/types/ethlete-components.d.ts +11 -2
@@ -91,9 +91,10 @@
91
91
  position: relative;
92
92
  display: flex;
93
93
  align-items: center;
94
- block-size: max(28px, var(--et-slider-thumb-size));
94
+ block-size: max(44px, var(--et-slider-thumb-size));
95
95
  /* thumbs overhang the rail by half their size at the extremes — keep them inside the box */
96
96
  margin-inline: calc(var(--et-slider-thumb-size) / 2);
97
+ container-type: inline-size;
97
98
  cursor: pointer;
98
99
  }
99
100
 
@@ -131,7 +132,8 @@
131
132
  /* not `:focus-visible` alone: the track focuses the thumb programmatically on a press, and
132
133
  Chrome matches `:focus-visible` for that - the ring then stayed on after every click */
133
134
  &:focus-visible:not([data-pointer-focused]) {
134
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
135
+ outline: 2px solid
136
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
135
137
  outline-offset: 2px;
136
138
  }
137
139
 
@@ -168,7 +170,13 @@
168
170
  left: 50%;
169
171
  /* clear the thumb (which overhangs the tick by half the size difference), then add the gap */
170
172
  inset-block-start: calc(100% + (var(--et-slider-thumb-size) - var(--et-slider-mark-size)) / 2 + 6px);
171
- translate: -50% 0;
173
+ --_et-slider-edge-x: calc(var(--_et-slider-mark-position, 0) * 1cqi);
174
+ translate: clamp(
175
+ -1 * (var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2),
176
+ -50%,
177
+ 100cqi - var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2 - 100%
178
+ )
179
+ 0;
172
180
  inline-size: max-content;
173
181
  font-size: var(--et-slider-mark-label-font-size);
174
182
  line-height: 1.2;
@@ -189,7 +197,13 @@
189
197
  /* physical centering is direction-safe — 50% of the thumb is 50% in both directions */
190
198
  left: 50%;
191
199
  bottom: calc(100% + 8px);
192
- translate: -50% 0;
200
+ --_et-slider-edge-x: calc(var(--_et-slider-thumb-position, 0) * 1cqi);
201
+ translate: clamp(
202
+ -1 * (var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2),
203
+ -50%,
204
+ 100cqi - var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2 - 100%
205
+ )
206
+ 0;
193
207
  inline-size: max-content;
194
208
  padding: 2px 8px;
195
209
  border-radius: 6px;
@@ -203,6 +217,21 @@
203
217
  user-select: none;
204
218
  }
205
219
 
220
+ .et-range-slider-mark-label:dir(rtl) {
221
+ --_et-slider-edge-x: calc((100 - var(--_et-slider-mark-position, 0)) * 1cqi);
222
+ }
223
+
224
+ .et-range-slider-thumb-value:dir(rtl) {
225
+ --_et-slider-edge-x: calc((100 - var(--_et-slider-thumb-position, 0)) * 1cqi);
226
+ }
227
+
228
+ &:where([data-thumb-value]) .et-range-slider-interaction {
229
+ margin-block-start: calc(
230
+ var(--et-slider-thumb-value-font-size) * 1.4 + 14px -
231
+ (max(44px, var(--et-slider-thumb-size)) - var(--et-slider-thumb-size)) / 2
232
+ );
233
+ }
234
+
206
235
  /* an unresolved bulk-edit range parks both thumbs at the track start — the dashed accent rail
207
236
  (not a muted/grey one, which would read as disabled) makes that read as "provisional /
208
237
  values differ", not "minimum". The fill is already zero-width while mixed. Consumers
@@ -261,11 +290,12 @@
261
290
  .et-range-slider-interaction {
262
291
  flex-direction: column;
263
292
  align-items: center;
264
- inline-size: max(28px, var(--et-slider-thumb-size));
293
+ inline-size: max(44px, var(--et-slider-thumb-size));
265
294
  block-size: var(--et-slider-vertical-size);
266
295
  margin-inline: 0;
267
296
  /* thumbs overhang the rail by half their size at the extremes — keep them inside the box */
268
297
  margin-block: calc(var(--et-slider-thumb-size) / 2);
298
+ container-type: normal;
269
299
  }
270
300
 
271
301
  .et-range-slider-rail {
@@ -296,7 +326,17 @@
296
326
  bottom: auto;
297
327
  inset-block-start: 50%;
298
328
  inset-inline-start: calc(100% + 8px);
299
- translate: 0 -50%;
329
+ translate: 0
330
+ clamp(
331
+ -1 *
332
+ (
333
+ (100 - var(--_et-slider-thumb-position, 0)) * var(--et-slider-vertical-size) / 100 +
334
+ var(--et-slider-thumb-size) / 2
335
+ ),
336
+ -50%,
337
+ var(--_et-slider-thumb-position, 0) * var(--et-slider-vertical-size) / 100 + var(--et-slider-thumb-size) /
338
+ 2 - 100%
339
+ );
300
340
  }
301
341
 
302
342
  .et-range-slider-mark {
@@ -315,6 +355,58 @@
315
355
  translate: 0 -50%;
316
356
  }
317
357
 
358
+ &:where([data-mark-labels]) {
359
+ .et-range-slider-interaction {
360
+ display: grid;
361
+ grid-template-columns: auto max(44px, var(--et-slider-thumb-size));
362
+ align-self: flex-start;
363
+ inline-size: auto;
364
+ }
365
+
366
+ .et-range-slider-rail {
367
+ grid-area: 1 / 2;
368
+ justify-self: center;
369
+ }
370
+
371
+ .et-range-slider-fill,
372
+ .et-range-slider-thumb {
373
+ grid-area: 1 / 2;
374
+ }
375
+
376
+ .et-range-slider-marks,
377
+ .et-range-slider-mark {
378
+ display: contents;
379
+ }
380
+
381
+ .et-range-slider-mark::before {
382
+ content: '';
383
+ position: absolute;
384
+ grid-area: 1 / 2;
385
+ left: 50%;
386
+ bottom: calc(var(--_et-slider-mark-position, 0) * 1% - var(--et-slider-mark-size) / 2);
387
+ translate: -50% 0;
388
+ inline-size: var(--et-slider-mark-size);
389
+ block-size: var(--et-slider-mark-size);
390
+ border-radius: 50%;
391
+ background: inherit;
392
+ }
393
+
394
+ .et-range-slider-mark-label {
395
+ position: relative;
396
+ grid-area: 1 / 1;
397
+ justify-self: end;
398
+ align-self: end;
399
+ inset: auto;
400
+ bottom: clamp(
401
+ var(--et-slider-thumb-size) / -2,
402
+ var(--_et-slider-mark-position, 0) * 1% - var(--et-slider-mark-label-font-size) * 0.6,
403
+ 100% + var(--et-slider-thumb-size) / 2 - var(--et-slider-mark-label-font-size) * 1.2
404
+ );
405
+ translate: none;
406
+ margin-inline-end: calc(var(--et-slider-thumb-size) / 2 + 6px - max(44px, var(--et-slider-thumb-size)) / 2);
407
+ }
408
+ }
409
+
318
410
  &[data-mixed] {
319
411
  .et-range-slider-rail {
320
412
  background: repeating-linear-gradient(
@@ -93,6 +93,7 @@
93
93
  block-size: max(44px, var(--et-slider-thumb-size));
94
94
  /* thumbs overhang the rail by half their size at the extremes — keep them inside the box */
95
95
  margin-inline: calc(var(--et-slider-thumb-size) / 2);
96
+ container-type: inline-size;
96
97
  cursor: pointer;
97
98
  }
98
99
 
@@ -130,7 +131,8 @@
130
131
  /* not `:focus-visible` alone: the track focuses the thumb programmatically on a press, and
131
132
  Chrome matches `:focus-visible` for that - the ring then stayed on after every click */
132
133
  &:focus-visible:not([data-pointer-focused]) {
133
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
134
+ outline: 2px solid
135
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
134
136
  outline-offset: 2px;
135
137
  }
136
138
  }
@@ -162,7 +164,13 @@
162
164
  left: 50%;
163
165
  /* clear the thumb (which overhangs the tick by half the size difference), then add the gap */
164
166
  inset-block-start: calc(100% + (var(--et-slider-thumb-size) - var(--et-slider-mark-size)) / 2 + 6px);
165
- translate: -50% 0;
167
+ --_et-slider-edge-x: calc(var(--_et-slider-mark-position, 0) * 1cqi);
168
+ translate: clamp(
169
+ -1 * (var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2),
170
+ -50%,
171
+ 100cqi - var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2 - 100%
172
+ )
173
+ 0;
166
174
  inline-size: max-content;
167
175
  font-size: var(--et-slider-mark-label-font-size);
168
176
  line-height: 1.2;
@@ -183,7 +191,13 @@
183
191
  /* physical centering is direction-safe — 50% of the thumb is 50% in both directions */
184
192
  left: 50%;
185
193
  bottom: calc(100% + 8px);
186
- translate: -50% 0;
194
+ --_et-slider-edge-x: calc(var(--_et-slider-thumb-position, 0) * 1cqi);
195
+ translate: clamp(
196
+ -1 * (var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2),
197
+ -50%,
198
+ 100cqi - var(--_et-slider-edge-x) + var(--et-slider-thumb-size) / 2 - 100%
199
+ )
200
+ 0;
187
201
  inline-size: max-content;
188
202
  padding: 2px 8px;
189
203
  border-radius: 6px;
@@ -197,6 +211,21 @@
197
211
  user-select: none;
198
212
  }
199
213
 
214
+ .et-slider-mark-label:dir(rtl) {
215
+ --_et-slider-edge-x: calc((100 - var(--_et-slider-mark-position, 0)) * 1cqi);
216
+ }
217
+
218
+ .et-slider-thumb-value:dir(rtl) {
219
+ --_et-slider-edge-x: calc((100 - var(--_et-slider-thumb-position, 0)) * 1cqi);
220
+ }
221
+
222
+ &:where([data-thumb-value]) .et-slider-interaction {
223
+ margin-block-start: calc(
224
+ var(--et-slider-thumb-value-font-size) * 1.4 + 14px -
225
+ (max(44px, var(--et-slider-thumb-size)) - var(--et-slider-thumb-size)) / 2
226
+ );
227
+ }
228
+
200
229
  /* an unresolved bulk-edit value parks the thumb at the track start — the dashed accent rail
201
230
  (not a muted/grey one, which would read as disabled) makes that read as "provisional /
202
231
  values differ", not "minimum". The fill is already zero-width while mixed. Consumers
@@ -260,6 +289,7 @@
260
289
  margin-inline: 0;
261
290
  /* thumbs overhang the rail by half their size at the extremes — keep them inside the box */
262
291
  margin-block: calc(var(--et-slider-thumb-size) / 2);
292
+ container-type: normal;
263
293
  }
264
294
 
265
295
  .et-slider-rail {
@@ -290,7 +320,17 @@
290
320
  bottom: auto;
291
321
  inset-block-start: 50%;
292
322
  inset-inline-start: calc(100% + 8px);
293
- translate: 0 -50%;
323
+ translate: 0
324
+ clamp(
325
+ -1 *
326
+ (
327
+ (100 - var(--_et-slider-thumb-position, 0)) * var(--et-slider-vertical-size) / 100 +
328
+ var(--et-slider-thumb-size) / 2
329
+ ),
330
+ -50%,
331
+ var(--_et-slider-thumb-position, 0) * var(--et-slider-vertical-size) / 100 + var(--et-slider-thumb-size) /
332
+ 2 - 100%
333
+ );
294
334
  }
295
335
 
296
336
  .et-slider-mark {
@@ -309,6 +349,58 @@
309
349
  translate: 0 -50%;
310
350
  }
311
351
 
352
+ &:where([data-mark-labels]) {
353
+ .et-slider-interaction {
354
+ display: grid;
355
+ grid-template-columns: auto max(44px, var(--et-slider-thumb-size));
356
+ align-self: flex-start;
357
+ inline-size: auto;
358
+ }
359
+
360
+ .et-slider-rail {
361
+ grid-area: 1 / 2;
362
+ justify-self: center;
363
+ }
364
+
365
+ .et-slider-fill,
366
+ .et-slider-thumb {
367
+ grid-area: 1 / 2;
368
+ }
369
+
370
+ .et-slider-marks,
371
+ .et-slider-mark {
372
+ display: contents;
373
+ }
374
+
375
+ .et-slider-mark::before {
376
+ content: '';
377
+ position: absolute;
378
+ grid-area: 1 / 2;
379
+ left: 50%;
380
+ bottom: calc(var(--_et-slider-mark-position, 0) * 1% - var(--et-slider-mark-size) / 2);
381
+ translate: -50% 0;
382
+ inline-size: var(--et-slider-mark-size);
383
+ block-size: var(--et-slider-mark-size);
384
+ border-radius: 50%;
385
+ background: inherit;
386
+ }
387
+
388
+ .et-slider-mark-label {
389
+ position: relative;
390
+ grid-area: 1 / 1;
391
+ justify-self: end;
392
+ align-self: end;
393
+ inset: auto;
394
+ bottom: clamp(
395
+ var(--et-slider-thumb-size) / -2,
396
+ var(--_et-slider-mark-position, 0) * 1% - var(--et-slider-mark-label-font-size) * 0.6,
397
+ 100% + var(--et-slider-thumb-size) / 2 - var(--et-slider-mark-label-font-size) * 1.2
398
+ );
399
+ translate: none;
400
+ margin-inline-end: calc(var(--et-slider-thumb-size) / 2 + 6px - max(44px, var(--et-slider-thumb-size)) / 2);
401
+ }
402
+ }
403
+
312
404
  &[data-mixed] {
313
405
  .et-slider-rail {
314
406
  background: repeating-linear-gradient(
@@ -59,6 +59,7 @@
59
59
  height: var(--et-switch-track-height);
60
60
  border-radius: calc(var(--et-switch-track-height) / 2);
61
61
  background-color: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 22%, transparent);
62
+ box-shadow: inset 0 0 0 1px var(--et-surface-interaction-solid);
62
63
  }
63
64
 
64
65
  /* hover-capable pointers only — on touch, :hover sticks after a tap */
@@ -69,6 +70,7 @@
69
70
  &:not([aria-disabled='true']):not([data-readonly]):not([aria-checked='true']):not([data-indeterminate])
70
71
  .et-switch-track {
71
72
  background-color: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 30%, transparent);
73
+ box-shadow: inset 0 0 0 1px var(--et-surface-interaction-hover-solid);
72
74
  }
73
75
  }
74
76
 
@@ -78,8 +80,45 @@
78
80
  background-color: color-mix(in srgb, var(--et-theme-color-primary-solid) 40%, transparent);
79
81
  }
80
82
 
83
+ @media (hover: hover) {
84
+ :where(et-choice-field[data-error])
85
+ &:hover:not([aria-disabled='true']):not([data-readonly]):not([aria-checked='true']):not([data-indeterminate])
86
+ .et-switch-track,
87
+ :where(et-choice-field[data-error]:has(.et-choice-field-label-area:hover))
88
+ &:not([aria-disabled='true']):not([data-readonly]):not([aria-checked='true']):not([data-indeterminate])
89
+ .et-switch-track {
90
+ background-color: color-mix(
91
+ in srgb,
92
+ light-dark(
93
+ rgb(var(--et-color-primary-hover, var(--et-color-primary))),
94
+ rgb(
95
+ var(
96
+ --et-color-primary-ink-active,
97
+ var(
98
+ --et-color-primary-ink-focus,
99
+ var(
100
+ --et-color-primary-ink-hover,
101
+ var(
102
+ --et-color-primary-ink,
103
+ var(
104
+ --et-color-primary-active,
105
+ var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))
106
+ )
107
+ )
108
+ )
109
+ )
110
+ )
111
+ )
112
+ )
113
+ 40%,
114
+ transparent
115
+ );
116
+ }
117
+ }
118
+
81
119
  &:focus-visible .et-switch-track {
82
- outline: 2px solid var(--et-theme-color-primary-solid);
120
+ outline: 2px solid
121
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
83
122
  outline-offset: 2px;
84
123
  }
85
124
 
@@ -117,6 +156,7 @@
117
156
  &[aria-checked='true'] {
118
157
  .et-switch-track {
119
158
  background-color: var(--et-theme-color-primary-solid, currentColor);
159
+ box-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
120
160
  }
121
161
 
122
162
  .et-switch-thumb {
@@ -149,25 +189,28 @@
149
189
  &[data-indeterminate] {
150
190
  .et-switch-track {
151
191
  background-color: transparent;
192
+ box-shadow: none;
152
193
 
153
194
  &::before {
154
195
  content: '';
155
196
  position: absolute;
156
197
  inset: 0;
157
198
  border-radius: inherit;
158
- border: 1px dashed var(--et-theme-color-primary-solid, currentColor);
199
+ border: 1px dashed var(--et-theme-color-ink-solid, currentColor);
159
200
  }
160
201
  }
161
202
 
162
203
  .et-switch-thumb {
163
204
  left: calc((var(--et-switch-track-width) - (var(--et-switch-thumb-size) - 4px)) / 2);
164
- background-color: var(--et-theme-color-primary-solid, currentColor);
205
+ background-color: var(--et-theme-color-ink-solid, currentColor);
165
206
  }
166
207
  }
167
208
 
168
209
  &[data-can-animate] {
169
210
  .et-switch-track {
170
- transition: background-color var(--et-switch-transition-duration) ease;
211
+ transition:
212
+ background-color var(--et-switch-transition-duration) ease,
213
+ box-shadow var(--et-switch-transition-duration) ease;
171
214
  }
172
215
 
173
216
  .et-switch-thumb {
@@ -35,7 +35,7 @@
35
35
  caret-color: var(--et-theme-color-primary-solid, currentColor);
36
36
 
37
37
  &::placeholder {
38
- color: color-mix(in srgb, currentColor 46%, transparent);
38
+ color: color-mix(in srgb, currentColor 60%, transparent);
39
39
  }
40
40
 
41
41
  &:disabled {
@@ -44,7 +44,7 @@
44
44
  }
45
45
 
46
46
  /* an unresolved bulk-edit value reads as provisional — the mixedLabel placeholder sits
47
- between committed text (full strength) and the regular placeholder (46%). Consumers
47
+ between committed text (full strength) and the regular placeholder (60%). Consumers
48
48
  restyle via [data-mixed]. */
49
49
  &[data-mixed] .et-tag-input-field::placeholder {
50
50
  font-style: italic;
@@ -4,9 +4,8 @@
4
4
  run at once - the directive skips measuring exactly when this `@supports` condition holds.
5
5
  Delete the fallback once Firefox ESR and iOS Safari 26 both support `field-sizing`.
6
6
 
7
- The row bounds hold only while the native textarea has no block padding: it is a border box,
8
- so any padding on it eats into the clamp, and CSS cannot add the padding back. Pad the form
9
- field's frame instead. */
7
+ The row bounds count only the content: the native textarea is a border box, so a rule that
8
+ pads it must add its block padding to both bounds, as form-field-textarea-styles does. */
10
9
  @supports (field-sizing: content) {
11
10
  textarea[data-et-textarea-autosize] {
12
11
  field-sizing: content;
@@ -18,7 +18,11 @@
18
18
  min-width: 0;
19
19
 
20
20
  &::placeholder {
21
- color: color-mix(in srgb, currentColor 46%, transparent);
21
+ color: color-mix(in srgb, currentColor 60%, transparent);
22
+ }
23
+
24
+ &[rows='1']::placeholder {
25
+ white-space: pre;
22
26
  }
23
27
 
24
28
  &[data-resize='none'] {
@@ -27,11 +31,12 @@
27
31
 
28
32
  &[data-resize='vertical'] {
29
33
  resize: vertical;
34
+ min-block-size: 1lh;
30
35
  }
31
36
  }
32
37
 
33
38
  /* an unresolved bulk-edit value reads as provisional — the mixed label shows as the
34
- placeholder, between a committed value (full strength) and a real placeholder (46%) */
39
+ placeholder, between a committed value (full strength) and a real placeholder (60%) */
35
40
  &[data-mixed] .et-textarea-native::placeholder {
36
41
  font-style: italic;
37
42
  color: color-mix(in srgb, currentColor 72%, transparent);
@@ -0,0 +1,10 @@
1
+ @layer components {
2
+ .et-grid-item-toolbar {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: var(--et-grid-item-toolbar-gap, 4px);
6
+ padding: var(--et-grid-item-toolbar-padding, 4px);
7
+ border-radius: var(--et-grid-item-toolbar-radius, 8px);
8
+ background: var(--et-grid-item-toolbar-background, transparent);
9
+ }
10
+ }
@@ -23,7 +23,8 @@
23
23
  background: var(--et-grid-item-bg, var(--et-surface-background-solid));
24
24
 
25
25
  &:focus-visible {
26
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
26
+ outline: 2px solid
27
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
27
28
  outline-offset: -2px;
28
29
  }
29
30
 
@@ -152,6 +153,10 @@
152
153
  min-height: 0;
153
154
  }
154
155
 
156
+ .et-grid-item:has(> .et-grid-item__actions:not(:empty)) > .et-grid-item__content {
157
+ padding-inline-end: var(--et-grid-item-actions-reserve, calc(2.4rem + 12px));
158
+ }
159
+
155
160
  .et-grid:not(.et-grid--readonly) .et-grid-item__content {
156
161
  cursor: grab;
157
162
  user-select: none;
@@ -109,7 +109,7 @@
109
109
 
110
110
  .et-brand-loader__outline {
111
111
  fill: none;
112
- stroke: var(--_et-brand-loader-accent);
112
+ stroke: var(--et-brand-loader-accent, var(--et-theme-color-ink-solid, #00ffa1));
113
113
  stroke-width: 1.4;
114
114
  stroke-linecap: round;
115
115
  stroke-linejoin: round;
@@ -121,6 +121,9 @@
121
121
 
122
122
  .et-brand-loader__fill {
123
123
  fill: var(--_et-brand-loader-accent);
124
+ stroke: var(--et-theme-color-ink-solid);
125
+ stroke-width: 0.7;
126
+ stroke-linejoin: round;
124
127
  animation: et-brand-loader-fill-fade var(--_et-brand-loader-duration) ease infinite;
125
128
  }
126
129
 
@@ -172,6 +172,6 @@
172
172
  }
173
173
 
174
174
  .et-progress-bar:where(.et-progress-bar--themed) {
175
- --et-progress-bar-indicator-color: var(--et-theme-color-primary-solid, currentColor);
175
+ --et-progress-bar-indicator-color: var(--et-theme-color-ink-solid);
176
176
  }
177
177
  }
@@ -226,6 +226,6 @@
226
226
  /* `--et-spinner-color` is declared via `@property`, whose `initial-value` cannot contain `var()`, so the theme
227
227
  colour can only be applied by a rule - and only when `color` is set, hence the class gate. */
228
228
  .et-spinner:where(.et-spinner--themed) {
229
- --et-spinner-color: var(--et-theme-color-primary-solid, currentColor);
229
+ --et-spinner-color: var(--et-theme-color-ink-solid);
230
230
  }
231
231
  }
@@ -267,7 +267,7 @@
267
267
  flex: none;
268
268
  inline-size: 6px;
269
269
  block-size: 6px;
270
- background: var(--et-theme-color-primary-solid, currentColor);
270
+ background: light-dark(var(--et-theme-color-ink-solid), var(--et-theme-color-primary-solid));
271
271
  border-radius: 50%;
272
272
  animation: et-match-card-live-pulse 2s ease-in-out infinite;
273
273
  }
@@ -395,9 +395,15 @@
395
395
  .et-match-card:where([data-winner='home']) .et-match-card-side:where([data-side='home']),
396
396
  .et-match-card:where([data-winner='away']) .et-match-card-side:where([data-side='away']) {
397
397
  --_et-match-card-side-color: var(--et-surface-color-solid, currentColor);
398
- --_et-match-card-side-marker-color: var(--et-theme-color-primary-solid, currentColor);
398
+ --_et-match-card-side-marker-color: light-dark(
399
+ var(--et-theme-color-ink-solid),
400
+ var(--et-theme-color-primary-solid)
401
+ );
399
402
  --_et-match-card-side-marker-display: block;
400
- font-weight: 600;
403
+
404
+ .et-match-participant-name {
405
+ font-weight: 600;
406
+ }
401
407
  }
402
408
 
403
409
  .et-match-card-games {
@@ -6,11 +6,14 @@
6
6
  flex: none;
7
7
  place-items: center end;
8
8
  min-inline-size: 1ch;
9
- overflow: hidden;
10
9
  font-variant-numeric: tabular-nums;
11
10
  line-height: 1.2;
12
11
  }
13
12
 
13
+ .et-match-score:has(.et-match-score-digit:is([data-state='in'], [data-state='out']), .et-match-score-flash) {
14
+ overflow: hidden;
15
+ }
16
+
14
17
  /* Both values occupy the same cell — that is what lets one leave while the other arrives. */
15
18
  .et-match-score-digit {
16
19
  grid-area: 1 / 1;
@@ -10,7 +10,7 @@
10
10
  flex: none;
11
11
  inline-size: var(--et-menu-item-icon-size, 16px);
12
12
  block-size: var(--et-menu-item-icon-size, 16px);
13
- color: var(--et-theme-color-primary-solid, currentColor);
13
+ color: var(--et-theme-color-ink-solid, currentColor);
14
14
  }
15
15
 
16
16
  &.et-menu-radio-item .et-menu-item-check::before {
@@ -245,6 +245,11 @@
245
245
  color 120ms ease,
246
246
  opacity 120ms ease;
247
247
 
248
+ &[data-active]:focus-visible {
249
+ outline: 2px solid var(--et-theme-color-ink-solid);
250
+ outline-offset: -2px;
251
+ }
252
+
248
253
  /* the roving focus is applied programmatically on mouse-open too, so :focus-visible (instead
249
254
  of [data-active] alone) keeps the highlight from appearing without a hover or keyboard
250
255
  interaction; a trigger whose submenu is open stays highlighted the whole time, and an item
@@ -164,4 +164,8 @@
164
164
  .et-force-invisible {
165
165
  visibility: hidden !important;
166
166
  }
167
+
168
+ .et-overlay--dialog .et-button:where([data-variant='filled']) {
169
+ --et-button-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
170
+ }
167
171
  }
@@ -168,4 +168,8 @@
168
168
  white-space: nowrap;
169
169
  color: var(--et-surface-color-muted-solid, CanvasText);
170
170
  }
171
+
172
+ .et-pagination-host .et-pagination-button:where([aria-current='page']) {
173
+ --et-button-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
174
+ }
171
175
  }
@@ -47,7 +47,7 @@
47
47
  &:is([data-state='complete'], [data-state='success'], [data-state='warning'], [data-state='error']):not(
48
48
  :last-child
49
49
  )::after {
50
- background: var(--et-theme-color-primary-solid, currentColor);
50
+ background: var(--et-theme-color-ink-solid);
51
51
  }
52
52
 
53
53
  .et-progress-step-marker {
@@ -83,13 +83,13 @@
83
83
  }
84
84
 
85
85
  &[data-state='current'] .et-progress-step-marker {
86
- border-color: var(--et-theme-color-primary-solid, currentColor);
86
+ border-color: var(--et-theme-color-ink-solid);
87
87
  color: var(--et-theme-color-ink-solid, currentColor);
88
88
  }
89
89
 
90
90
  &:is([data-state='complete'], [data-state='success'], [data-state='warning'], [data-state='error'])
91
91
  .et-progress-step-marker {
92
- border-color: var(--et-theme-color-primary-solid, currentColor);
92
+ border-color: var(--et-theme-color-ink-solid);
93
93
  background: var(--et-theme-color-primary-solid, currentColor);
94
94
  color: var(--et-theme-color-on-primary-solid, white);
95
95
  }
@@ -175,7 +175,7 @@
175
175
  @media (hover: hover) {
176
176
  &:hover {
177
177
  .et-progress-step-marker {
178
- border-color: var(--et-theme-color-primary-solid, currentColor);
178
+ border-color: var(--et-theme-color-ink-solid);
179
179
  }
180
180
 
181
181
  .et-progress-step-label {