@ethlete/components 1.0.0-next.69 → 1.0.0-next.70

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 (239) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/design/button.ts +57 -0
  3. package/design/form-field.ts +210 -0
  4. package/design/select.ts +110 -0
  5. package/fesm2022/ethlete-components-testing.mjs +3 -1
  6. package/fesm2022/ethlete-components-testing.mjs.map +1 -1
  7. package/fesm2022/ethlete-components.mjs +823 -105
  8. package/fesm2022/ethlete-components.mjs.map +1 -1
  9. package/package.json +20 -14
  10. package/src/lib/accordion/accordion-group.component.css +12 -0
  11. package/src/lib/accordion/accordion.component.css +185 -0
  12. package/src/lib/avatar/avatar-group.component.css +31 -0
  13. package/src/lib/avatar/avatar.component.css +75 -0
  14. package/src/lib/badge/badge.component.css +111 -0
  15. package/src/lib/banner/banner.component.css +94 -0
  16. package/src/lib/bracket/bracket-default-continue.component.css +29 -0
  17. package/src/lib/bracket/bracket-default-final-match.component.css +76 -0
  18. package/src/lib/bracket/bracket-default-match.component.css +21 -0
  19. package/src/lib/bracket/bracket-default-round-header.component.css +36 -0
  20. package/src/lib/bracket/bracket-participants.component.css +13 -0
  21. package/src/lib/bracket/bracket-pick-card.component.css +232 -0
  22. package/src/lib/bracket/bracket-rounds-list.component.css +75 -0
  23. package/src/lib/bracket/bracket-skeleton.component.css +55 -0
  24. package/src/lib/bracket/bracket.component.css +102 -0
  25. package/src/lib/bracket/layouts/swiss/bracket-swiss-styles.component.css +10 -0
  26. package/src/lib/breadcrumb/breadcrumb-overflow.component.css +38 -0
  27. package/src/lib/breadcrumb/breadcrumb.component.css +120 -0
  28. package/src/lib/button/button-properties-styles.component.css +143 -0
  29. package/src/lib/button/button.component.css +196 -0
  30. package/src/lib/button/fab.component.css +252 -0
  31. package/src/lib/button/icon-button.component.css +143 -0
  32. package/src/lib/button/split-button.component.css +77 -0
  33. package/src/lib/button/text-button.component.css +140 -0
  34. package/src/lib/button/window-control-button.component.css +158 -0
  35. package/src/lib/calendar/calendar-coarse-grid-styles.component.css +29 -0
  36. package/src/lib/calendar/calendar-comparison-band-styles.component.css +36 -0
  37. package/src/lib/calendar/calendar-week-numbers-styles.component.css +32 -0
  38. package/src/lib/calendar/calendar.component.css +366 -0
  39. package/src/lib/card/card.component.css +39 -0
  40. package/src/lib/carousel/carousel-autoplay-styles.component.css +166 -0
  41. package/src/lib/carousel/carousel-transition-styles.component.css +179 -0
  42. package/src/lib/carousel/carousel.component.css +142 -0
  43. package/src/lib/chart/bar-chart.component.css +176 -0
  44. package/src/lib/chart/chart-axis.component.css +40 -0
  45. package/src/lib/chart/chart-grid.component.css +6 -0
  46. package/src/lib/chart/chart-legend.component.css +46 -0
  47. package/src/lib/chart/chart-tooltip.component.css +34 -0
  48. package/src/lib/chart/line-chart-tooltip.component.css +51 -0
  49. package/src/lib/chart/line-chart.component.css +234 -0
  50. package/src/lib/chart/pie-chart.component.css +176 -0
  51. package/src/lib/chart/sankey-chart.component.css +221 -0
  52. package/src/lib/chip/chip.component.css +155 -0
  53. package/src/lib/command-palette/command-palette-item.component.css +94 -0
  54. package/src/lib/command-palette/command-palette.component.css +100 -0
  55. package/src/lib/description-list/description-list.component.css +77 -0
  56. package/src/lib/divider/divider.component.css +36 -0
  57. package/src/lib/empty-state/empty-state.component.css +73 -0
  58. package/src/lib/floating-action/floating-action-styles.component.css +78 -0
  59. package/src/lib/focus-ring/focus-ring-styles.component.css +13 -0
  60. package/src/lib/forms/cascader/cascader-breadcrumb-styles.component.css +98 -0
  61. package/src/lib/forms/cascader/cascader-panel.component.css +386 -0
  62. package/src/lib/forms/cascader/cascader-sheet-styles.component.css +241 -0
  63. package/src/lib/forms/cascader/cascader.component.css +52 -0
  64. package/src/lib/forms/checkbox/checkbox.component.css +247 -0
  65. package/src/lib/forms/choice-field/choice-field-card-styles.component.css +59 -0
  66. package/src/lib/forms/choice-field/choice-field.component.css +186 -0
  67. package/src/lib/forms/color-input/color-input.component.css +108 -0
  68. package/src/lib/forms/color-input/color-picker-panel.component.css +349 -0
  69. package/src/lib/forms/date-time/date-input/date-input.component.css +35 -0
  70. package/src/lib/forms/date-time/date-picker-panel.component.css +115 -0
  71. package/src/lib/forms/date-time/date-range-input/date-range-input.component.css +16 -0
  72. package/src/lib/forms/date-time/date-range-presets.component.css +60 -0
  73. package/src/lib/forms/date-time/date-time-input/date-time-input.component.css +151 -0
  74. package/src/lib/forms/date-time/date-time-range-input/date-time-range-input.component.css +121 -0
  75. package/src/lib/forms/date-time/duration-input/duration-input.component.css +88 -0
  76. package/src/lib/forms/date-time/range-input-shell-styles.component.css +55 -0
  77. package/src/lib/forms/date-time/time-input/time-input.component.css +35 -0
  78. package/src/lib/forms/date-time/time-range-input/time-range-input.component.css +16 -0
  79. package/src/lib/forms/dropzone/dropzone-item.component.css +51 -0
  80. package/src/lib/forms/dropzone/dropzone-preview-styles.component.css +67 -0
  81. package/src/lib/forms/dropzone/dropzone-readonly-styles.component.css +34 -0
  82. package/src/lib/forms/dropzone/dropzone.component.css +267 -0
  83. package/src/lib/forms/form-field/counter.component.css +25 -0
  84. package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +116 -0
  85. package/src/lib/forms/form-field/form-field-rich-text-styles.component.css +31 -0
  86. package/src/lib/forms/form-field/form-field-suffix-overlap-styles.component.css +66 -0
  87. package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +312 -0
  88. package/src/lib/forms/form-field/form-field-textarea-styles.component.css +32 -0
  89. package/src/lib/forms/form-field/form-field.component.css +328 -0
  90. package/src/lib/forms/form-field/form-support-styles.component.css +102 -0
  91. package/src/lib/forms/form-field/headless/label.directive.css +25 -0
  92. package/src/lib/forms/form-field/hint.component.css +20 -0
  93. package/src/lib/forms/input/input.component.css +49 -0
  94. package/src/lib/forms/input/number-input.component.css +128 -0
  95. package/src/lib/forms/input/password-input.component.css +103 -0
  96. package/src/lib/forms/multi-language-rich-text-editor/multi-language-rich-text-editor.component.css +8 -0
  97. package/src/lib/forms/multi-language-rich-text-editor/tools/multi-language-rich-text-editor-language-tool.component.css +104 -0
  98. package/src/lib/forms/otp-input/otp-input.component.css +194 -0
  99. package/src/lib/forms/phone-input/phone-input.component.css +126 -0
  100. package/src/lib/forms/rating/rating.component.css +197 -0
  101. package/src/lib/forms/rich-text-editor/rich-text-content-styles.component.css +234 -0
  102. package/src/lib/forms/rich-text-editor/rich-text-editor-floating-toolbar.component.css +90 -0
  103. package/src/lib/forms/rich-text-editor/rich-text-editor-image-editor.component.css +172 -0
  104. package/src/lib/forms/rich-text-editor/rich-text-editor-link-editor.component.css +149 -0
  105. package/src/lib/forms/rich-text-editor/rich-text-editor-token-palette.component.css +18 -0
  106. package/src/lib/forms/rich-text-editor/rich-text-editor-token-popup.component.css +199 -0
  107. package/src/lib/forms/rich-text-editor/rich-text-editor.component.css +175 -0
  108. package/src/lib/forms/rich-text-editor/rich-text-viewer.component.css +6 -0
  109. package/src/lib/forms/rich-text-editor/tools/rich-text-editor-align-tool.component.css +5 -0
  110. package/src/lib/forms/rich-text-editor/tools/rich-text-editor-heading-tool.component.css +5 -0
  111. package/src/lib/forms/rich-text-editor/tools/rich-text-editor-image-styles.component.css +109 -0
  112. package/src/lib/forms/rich-text-editor/tools/rich-text-editor-table-styles.component.css +21 -0
  113. package/src/lib/forms/rich-text-editor/tools/rich-text-editor-table-tool.component.css +44 -0
  114. package/src/lib/forms/select/select-all-option.component.css +14 -0
  115. package/src/lib/forms/select/select-extras-styles.component.css +143 -0
  116. package/src/lib/forms/select/select-option-group.component.css +35 -0
  117. package/src/lib/forms/select/select-option-styles.component.css +137 -0
  118. package/src/lib/forms/select/select-panel.component.css +112 -0
  119. package/src/lib/forms/select/select.component.css +180 -0
  120. package/src/lib/forms/selection-card-styles.component.css +136 -0
  121. package/src/lib/forms/selection-list/checkbox-group/checkbox-group-select-all.component.css +89 -0
  122. package/src/lib/forms/selection-list/checkbox-group/checkbox-group.component.css +142 -0
  123. package/src/lib/forms/selection-list/checkbox-group/checkbox-option.component.css +153 -0
  124. package/src/lib/forms/selection-list/radio-group/radio-group.component.css +134 -0
  125. package/src/lib/forms/selection-list/radio-group/radio.component.css +137 -0
  126. package/src/lib/forms/selection-list/segmented-button-group/segmented-button-group.component.css +149 -0
  127. package/src/lib/forms/selection-list/segmented-button-group/segmented-button.component.css +180 -0
  128. package/src/lib/forms/slider/range-slider.component.css +348 -0
  129. package/src/lib/forms/slider/slider.component.css +342 -0
  130. package/src/lib/forms/switch/switch.component.css +187 -0
  131. package/src/lib/forms/tag-input/tag-input.component.css +54 -0
  132. package/src/lib/forms/textarea/textarea-autosize-styles.component.css +17 -0
  133. package/src/lib/forms/textarea/textarea.component.css +40 -0
  134. package/src/lib/grid/grid-debug.component.css +130 -0
  135. package/src/lib/grid/grid-item-default-actions.component.css +11 -0
  136. package/src/lib/grid/grid-item.component.css +172 -0
  137. package/src/lib/grid/grid.component.css +56 -0
  138. package/src/lib/icon/headless/icon-styles.component.css +7 -0
  139. package/src/lib/kbd/kbd.component.css +62 -0
  140. package/src/lib/loader/brand-loader/brand-loader.component.css +130 -0
  141. package/src/lib/loader/progress-bar/progress-bar.component.css +176 -0
  142. package/src/lib/loader/spinner/spinner.component.css +216 -0
  143. package/src/lib/masonry/masonry-styles.component.css +84 -0
  144. package/src/lib/match/match-card.component.css +441 -0
  145. package/src/lib/match/match-participant.component.css +137 -0
  146. package/src/lib/match/match-score.component.css +74 -0
  147. package/src/lib/menu/menu-group-label.component.css +12 -0
  148. package/src/lib/menu/menu-item-shortcut.component.css +10 -0
  149. package/src/lib/menu/menu-item-submenu-icon.component.css +18 -0
  150. package/src/lib/menu/menu-item.component.css +32 -0
  151. package/src/lib/menu/menu-search-styles.component.css +56 -0
  152. package/src/lib/menu/menu-selection-item.component.css +88 -0
  153. package/src/lib/menu/menu-separator.component.css +9 -0
  154. package/src/lib/menu/menu.component.css +296 -0
  155. package/src/lib/notification/notification-stack.component.css +114 -0
  156. package/src/lib/notification/notification.component.css +271 -0
  157. package/src/lib/overlay/alert-dialog/alert-dialog.component.css +45 -0
  158. package/src/lib/overlay/floating-panel-styles.component.css +71 -0
  159. package/src/lib/overlay/floating-tip-styles.component.css +78 -0
  160. package/src/lib/overlay/overlay-container.component.css +167 -0
  161. package/src/lib/overlay/overlay-main-styles.component.css +105 -0
  162. package/src/lib/overlay/overlay-template-host.component.css +7 -0
  163. package/src/lib/overlay/routing/overlay-route-header-template-outlet.component.css +36 -0
  164. package/src/lib/overlay/routing/overlay-router-outlet.component.css +207 -0
  165. package/src/lib/overlay/routing/overlay-shared-route-template-outlet.component.css +5 -0
  166. package/src/lib/overlay/sidebar/overlay-sidebar.component.css +16 -0
  167. package/src/lib/overlay/strategies/anchored-dialog-styles.component.css +51 -0
  168. package/src/lib/overlay/strategies/dialog-styles.component.css +50 -0
  169. package/src/lib/overlay/strategies/full-screen-dialog-styles.component.css +83 -0
  170. package/src/lib/overlay/strategies/overlay-arrow-styles.component.css +112 -0
  171. package/src/lib/overlay/strategies/overlay-origin-clone.component.css +63 -0
  172. package/src/lib/overlay/strategies/sheet-styles.component.css +143 -0
  173. package/src/lib/pagination/page-size-select.component.css +102 -0
  174. package/src/lib/pagination/pagination.component.css +192 -0
  175. package/src/lib/picture/picture.component.css +66 -0
  176. package/src/lib/progress-steps/progress-step.component.css +187 -0
  177. package/src/lib/progress-steps/progress-steps.component.css +26 -0
  178. package/src/lib/query-error/query-error.component.css +21 -0
  179. package/src/lib/scheduler/scheduler-agenda-view.component.css +97 -0
  180. package/src/lib/scheduler/scheduler-appointment-drag-styles.component.css +56 -0
  181. package/src/lib/scheduler/scheduler-appointment-styles.component.css +111 -0
  182. package/src/lib/scheduler/scheduler-edit-color.component.css +16 -0
  183. package/src/lib/scheduler/scheduler-edit-surface-actions.component.css +14 -0
  184. package/src/lib/scheduler/scheduler-edit-surface-breadcrumb.component.css +26 -0
  185. package/src/lib/scheduler/scheduler-edit-surface-children.component.css +57 -0
  186. package/src/lib/scheduler/scheduler-edit-surface-fields.component.css +11 -0
  187. package/src/lib/scheduler/scheduler-edit-surface-footer.component.css +7 -0
  188. package/src/lib/scheduler/scheduler-edit-surface-header.component.css +15 -0
  189. package/src/lib/scheduler/scheduler-edit-time-range.component.css +11 -0
  190. package/src/lib/scheduler/scheduler-month-view.component.css +143 -0
  191. package/src/lib/scheduler/scheduler-time-grid-view.component.css +260 -0
  192. package/src/lib/scheduler/scheduler.component.css +87 -0
  193. package/src/lib/scrollable/headless/scrollable-buttons.component.css +122 -0
  194. package/src/lib/scrollable/headless/scrollable-footer.css +25 -0
  195. package/src/lib/scrollable/headless/scrollable-masks.component.css +112 -0
  196. package/src/lib/scrollable/headless/scrollable-navigation.component.css +94 -0
  197. package/src/lib/scrollable/scrollable.component.css +192 -0
  198. package/src/lib/scrollbar/scrollbar.component.css +110 -0
  199. package/src/lib/skeleton/skeleton.component.css +108 -0
  200. package/src/lib/standings/standings-pick.component.css +172 -0
  201. package/src/lib/standings/standings.component.css +201 -0
  202. package/src/lib/stat-tile/stat-tile-sparkline.component.css +49 -0
  203. package/src/lib/stat-tile/stat-tile.component.css +111 -0
  204. package/src/lib/stream/pip/pip-chrome.component.css +96 -0
  205. package/src/lib/stream/pip/pip-player.component.css +40 -0
  206. package/src/lib/stream/pip/pip-window.component.css +222 -0
  207. package/src/lib/stream/stream-manager-styles.component.css +10 -0
  208. package/src/lib/stream/stream-overlay-card-styles.component.css +43 -0
  209. package/src/lib/stream/stream-player-slot-styles.component.css +14 -0
  210. package/src/lib/table/table-column-chooser.component.css +17 -0
  211. package/src/lib/table/table-column-menu-trigger.component.css +31 -0
  212. package/src/lib/table/table-detail-styles.component.css +103 -0
  213. package/src/lib/table/table-drag-scroll-styles.component.css +18 -0
  214. package/src/lib/table/table-expander-cell.component.css +58 -0
  215. package/src/lib/table/table-filter-trigger.component.css +44 -0
  216. package/src/lib/table/table-group-header-row.component.css +38 -0
  217. package/src/lib/table/table-inline-edit-styles.component.css +20 -0
  218. package/src/lib/table/table-page-sticky-header-styles.component.css +77 -0
  219. package/src/lib/table/table-reorder-overlay.component.css +42 -0
  220. package/src/lib/table/table-resize-grip.component.css +65 -0
  221. package/src/lib/table/table-row-box-styles.component.css +260 -0
  222. package/src/lib/table/table-select-cell.component.css +89 -0
  223. package/src/lib/table/table-skeleton-rows.component.css +19 -0
  224. package/src/lib/table/table-sort-priority-styles.component.css +15 -0
  225. package/src/lib/table/table-sticky-columns-styles.component.css +80 -0
  226. package/src/lib/table/table-virtual-scroll-styles.component.css +9 -0
  227. package/src/lib/table/table.component.css +829 -0
  228. package/src/lib/tabs/nav-tabs/nav-tab-link-styles.component.css +33 -0
  229. package/src/lib/tabs/tab-bar-styles.component.css +173 -0
  230. package/src/lib/tabs/tab-scale-styles.component.css +61 -0
  231. package/src/lib/time-picker/time-picker.component.css +220 -0
  232. package/src/lib/timeline/timeline-item.component.css +116 -0
  233. package/src/lib/timeline/timeline.component.css +7 -0
  234. package/src/lib/toggletip/toggletip.component.css +83 -0
  235. package/src/lib/toolbar/toolbar.component.css +40 -0
  236. package/src/lib/tooltip/tooltip.component.css +64 -0
  237. package/src/lib/tree/tree.component.css +221 -0
  238. package/types/ethlete-components-testing.d.ts +1 -1
  239. package/types/ethlete-components.d.ts +172 -7
@@ -0,0 +1,441 @@
1
+ @layer components {
2
+ @property --et-match-card-border-radius {
3
+ syntax: '<length>';
4
+ inherits: false;
5
+ initial-value: 10px;
6
+ }
7
+
8
+ /* An inline-size container's own width can never come from its contents, so a card in a flex row with
9
+ no width of its own would collapse to nothing. This is the floor that keeps it usable there — low
10
+ enough to stay out of the way of a narrow bracket column, which is the other way cards get sized. */
11
+ @property --et-match-card-min-inline-size {
12
+ syntax: '<length>';
13
+ inherits: false;
14
+ initial-value: 180px;
15
+ }
16
+
17
+ /* One token per density, rather than one token the density rules overwrite: the card only ever *reads*
18
+ these, so a value set from outside survives the mode switch instead of being clobbered by it. */
19
+ @property --et-match-card-compact-padding {
20
+ syntax: '<length>';
21
+ inherits: true;
22
+ initial-value: 10px;
23
+ }
24
+
25
+ @property --et-match-card-expanded-padding {
26
+ syntax: '<length>';
27
+ inherits: true;
28
+ initial-value: 16px;
29
+ }
30
+
31
+ @property --et-match-card-compact-gap {
32
+ syntax: '<length>';
33
+ inherits: true;
34
+ initial-value: 6px;
35
+ }
36
+
37
+ @property --et-match-card-expanded-gap {
38
+ syntax: '<length>';
39
+ inherits: true;
40
+ initial-value: 12px;
41
+ }
42
+
43
+ @property --et-match-card-compact-emblem-size {
44
+ syntax: '<length>';
45
+ inherits: true;
46
+ initial-value: 20px;
47
+ }
48
+
49
+ @property --et-match-card-expanded-emblem-size {
50
+ syntax: '<length>';
51
+ inherits: true;
52
+ initial-value: 36px;
53
+ }
54
+
55
+ @property --et-match-card-compact-name-font-size {
56
+ syntax: '<length>';
57
+ inherits: true;
58
+ initial-value: 13px;
59
+ }
60
+
61
+ @property --et-match-card-expanded-name-font-size {
62
+ syntax: '<length>';
63
+ inherits: true;
64
+ initial-value: 15px;
65
+ }
66
+
67
+ @property --et-match-card-compact-score-font-size {
68
+ syntax: '<length>';
69
+ inherits: true;
70
+ initial-value: 14px;
71
+ }
72
+
73
+ @property --et-match-card-expanded-score-font-size {
74
+ syntax: '<length>';
75
+ inherits: true;
76
+ initial-value: 20px;
77
+ }
78
+
79
+ /* The third density, below the dense row: a code and a number. See the minimal threshold below. */
80
+ @property --et-match-card-minimal-padding {
81
+ syntax: '<length>';
82
+ inherits: true;
83
+ initial-value: 6px;
84
+ }
85
+
86
+ @property --et-match-card-minimal-gap {
87
+ syntax: '<length>';
88
+ inherits: true;
89
+ initial-value: 3px;
90
+ }
91
+
92
+ @property --et-match-card-minimal-name-font-size {
93
+ syntax: '<length>';
94
+ inherits: true;
95
+ initial-value: 11px;
96
+ }
97
+
98
+ @property --et-match-card-minimal-score-font-size {
99
+ syntax: '<length>';
100
+ inherits: true;
101
+ initial-value: 12px;
102
+ }
103
+
104
+ .et-match-card {
105
+ container-type: inline-size;
106
+ container-name: et-match-card;
107
+ display: block;
108
+ box-sizing: border-box;
109
+ min-inline-size: var(--et-match-card-min-inline-size);
110
+ border-radius: var(--et-match-card-border-radius);
111
+ /* Set rather than inherited, so a card on an `<a>` doesn't come out link-blue and underlined. */
112
+ color: var(--et-surface-color-solid, currentColor);
113
+ text-decoration: none;
114
+ }
115
+
116
+ /* The card's actual box. Everything density-dependent lives here because a container query can only
117
+ match descendants of its container, and the container is the host. */
118
+ .et-match-card-content {
119
+ --_et-match-card-padding: var(--et-match-card-compact-padding);
120
+ --_et-match-card-gap: var(--et-match-card-compact-gap);
121
+ --_et-match-card-emblem-size: var(--et-match-card-compact-emblem-size);
122
+ --_et-match-card-name-font-size: var(--et-match-card-compact-name-font-size);
123
+ --_et-match-card-score-font-size: var(--et-match-card-compact-score-font-size);
124
+ /* What the dense row does without: the per-game breakdown, participant subtitles, the match label,
125
+ the kick-off, and therefore the meta row that would carry the last two. */
126
+ --_et-match-card-games-display: none;
127
+ --_et-match-card-meta-display: none;
128
+ --_et-match-card-time-display: none;
129
+ display: grid;
130
+ /* Centred rather than top-packed, for the one case where the card is given more height than it needs
131
+ — a bracket cell, whose height is the layout engine's decision. */
132
+ align-content: center;
133
+ gap: var(--_et-match-card-gap);
134
+ box-sizing: border-box;
135
+ padding: var(--_et-match-card-padding);
136
+ background: var(--et-surface-background-solid, transparent);
137
+ border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
138
+ border-radius: inherit;
139
+ }
140
+
141
+ /* Past the first threshold the card is the featured one; past the second the two sides stop stacking
142
+ and face each other across the middle. The thresholds are constants, not tokens: a container query
143
+ condition may not contain `var()`, so there is nothing to point a custom property at. Pin the layout
144
+ with the `size` input instead, and tune each one through the tokens above. */
145
+ /* Below the dense row there is one density left: a code and a number. A bracket at `density="compact"`
146
+ gives a cell about 150px, and an emblem, a name and a score is one thing too many for it — so the
147
+ emblems go and the type shrinks, which is the difference between a six-round bracket fitting an
148
+ article column and not. Applies to a pinned `compact` too, since compact means "the dense row" and
149
+ this is that row with nothing left to remove. */
150
+ @container et-match-card (max-inline-size: 149px) {
151
+ .et-match-card:where([data-size='auto']) .et-match-card-content,
152
+ .et-match-card:where([data-size='compact']) .et-match-card-content {
153
+ --_et-match-card-padding: var(--et-match-card-minimal-padding);
154
+ --_et-match-card-gap: var(--et-match-card-minimal-gap);
155
+ --_et-match-card-name-font-size: var(--et-match-card-minimal-name-font-size);
156
+ --_et-match-card-score-font-size: var(--et-match-card-minimal-score-font-size);
157
+ --_et-match-participant-emblem-display: none;
158
+ }
159
+ }
160
+
161
+ @container et-match-card (min-inline-size: 320px) {
162
+ .et-match-card:where([data-size='auto']) .et-match-card-content {
163
+ --_et-match-card-padding: var(--et-match-card-expanded-padding);
164
+ --_et-match-card-gap: var(--et-match-card-expanded-gap);
165
+ --_et-match-card-emblem-size: var(--et-match-card-expanded-emblem-size);
166
+ --_et-match-card-name-font-size: var(--et-match-card-expanded-name-font-size);
167
+ --_et-match-card-score-font-size: var(--et-match-card-expanded-score-font-size);
168
+ --_et-match-card-games-display: flex;
169
+ --_et-match-card-subtitle-display: block;
170
+ --_et-match-card-label-display: block;
171
+ --_et-match-card-meta-display: flex;
172
+ --_et-match-card-time-display: block;
173
+ }
174
+ }
175
+
176
+ @container et-match-card (min-inline-size: 560px) {
177
+ .et-match-card:where([data-size='auto']) .et-match-card-content {
178
+ --_et-match-card-sides-columns: 1fr auto 1fr;
179
+ --_et-match-card-sides-gap: 12px;
180
+ --_et-match-card-away-flow: row-reverse;
181
+ --_et-match-card-home-participant-flow: row-reverse;
182
+ --_et-match-card-home-text-align: end;
183
+ --_et-match-card-versus-display: block;
184
+ --_et-match-card-side-marker-size: 0px;
185
+ }
186
+ }
187
+
188
+ /* `size="expanded"` and `size="wide"` say the same things without measuring. Mutually exclusive with
189
+ the rules above, since a card has exactly one `data-size`. */
190
+ .et-match-card:where([data-size='expanded']) .et-match-card-content,
191
+ .et-match-card:where([data-size='wide']) .et-match-card-content {
192
+ --_et-match-card-padding: var(--et-match-card-expanded-padding);
193
+ --_et-match-card-gap: var(--et-match-card-expanded-gap);
194
+ --_et-match-card-emblem-size: var(--et-match-card-expanded-emblem-size);
195
+ --_et-match-card-name-font-size: var(--et-match-card-expanded-name-font-size);
196
+ --_et-match-card-score-font-size: var(--et-match-card-expanded-score-font-size);
197
+ --_et-match-card-games-display: flex;
198
+ --_et-match-card-subtitle-display: block;
199
+ --_et-match-card-label-display: block;
200
+ --_et-match-card-meta-display: flex;
201
+ --_et-match-card-time-display: block;
202
+ }
203
+
204
+ /* The dense row is two rows and nothing else — its round is named by the column it sits in and its
205
+ kick-off by the list around it. The one exception is a live badge, which is the whole reason someone
206
+ is looking at the thing. */
207
+ .et-match-card:where([data-status='live']) .et-match-card-content {
208
+ --_et-match-card-meta-display: flex;
209
+ }
210
+
211
+ /* Emblems only. The names are still in the card's accessible name and in each emblem's alt text. */
212
+ .et-match-card:where([data-hide-names]) .et-match-participant-names {
213
+ display: none;
214
+ }
215
+
216
+ .et-match-card:where([data-size='wide']) .et-match-card-content {
217
+ --_et-match-card-sides-columns: 1fr auto 1fr;
218
+ --_et-match-card-sides-gap: 12px;
219
+ --_et-match-card-away-flow: row-reverse;
220
+ --_et-match-card-home-participant-flow: row-reverse;
221
+ --_et-match-card-home-text-align: end;
222
+ --_et-match-card-versus-display: block;
223
+ --_et-match-card-side-marker-size: 0px;
224
+ }
225
+
226
+ .et-match-card-meta {
227
+ display: var(--_et-match-card-meta-display, flex);
228
+ align-items: center;
229
+ justify-content: space-between;
230
+ gap: 8px;
231
+ min-inline-size: 0;
232
+ font-size: 11px;
233
+ line-height: 1.4;
234
+ color: var(--et-surface-color-muted-solid, currentColor);
235
+ }
236
+
237
+ .et-match-card-label {
238
+ display: var(--_et-match-card-label-display, none);
239
+ overflow: hidden;
240
+ text-overflow: ellipsis;
241
+ white-space: nowrap;
242
+ }
243
+
244
+ .et-match-card-time {
245
+ display: var(--_et-match-card-time-display, block);
246
+ flex: none;
247
+ font-variant-numeric: tabular-nums;
248
+ }
249
+
250
+ /* Tinted with the color theme in scope, which the component points at the app's `type: 'error'` theme
251
+ by default — the red a live badge is expected to be, without this file naming a theme. */
252
+ .et-match-card-live {
253
+ display: inline-flex;
254
+ flex: none;
255
+ align-items: center;
256
+ gap: 5px;
257
+ padding-inline: 6px;
258
+ font-weight: 600;
259
+ letter-spacing: 0.04em;
260
+ text-transform: uppercase;
261
+ color: var(--et-theme-color-ink-solid, currentColor);
262
+ background: color-mix(in srgb, var(--et-theme-color-primary-solid, currentColor) 14%, transparent);
263
+ border-radius: 4px;
264
+ }
265
+
266
+ .et-match-card-live-dot {
267
+ flex: none;
268
+ inline-size: 6px;
269
+ block-size: 6px;
270
+ background: var(--et-theme-color-primary-solid, currentColor);
271
+ border-radius: 50%;
272
+ animation: et-match-card-live-pulse 2s ease-in-out infinite;
273
+ }
274
+
275
+ @keyframes et-match-card-live-pulse {
276
+ 50% {
277
+ opacity: 0.35;
278
+ }
279
+ }
280
+
281
+ @media (prefers-reduced-motion: reduce) {
282
+ .et-match-card-live-dot {
283
+ animation: none;
284
+ }
285
+ }
286
+
287
+ /* One column of two rows by default; three columns in the wide arrangement, where the outer two are
288
+ equal `1fr` so the middle one — the result — sits dead centre no matter how long the names are. That
289
+ equality is the whole trick: sized to content, the two halves would differ and the middle would
290
+ drift. Every value reads a var with an inline fallback rather than declaring a default here, since a
291
+ declaration on this element would beat the one the layout rules set on the card content above it. */
292
+ .et-match-card-sides {
293
+ display: grid;
294
+ grid-template-columns: var(--_et-match-card-sides-columns, 1fr);
295
+ align-items: center;
296
+ gap: var(--_et-match-card-sides-gap, 4px);
297
+ min-inline-size: 0;
298
+ }
299
+
300
+ .et-match-card-side {
301
+ --_et-match-card-side-color: var(--et-surface-color-solid, currentColor);
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 8px;
305
+ min-inline-size: 0;
306
+ }
307
+
308
+ /* Mirrored in the wide arrangement, and mirrored properly: the away side's row reverses so its value
309
+ lands next to the middle, and the home side's *participant* reverses so its emblem does too. Both
310
+ crests then flank the result with the names to the outside, which is the arrangement every wide
311
+ fixture row uses. `row-reverse` reverses the row the browser already resolved for the writing mode,
312
+ so RTL keeps working. */
313
+ .et-match-card-side:where([data-side='away']) {
314
+ flex-direction: var(--_et-match-card-away-flow, row);
315
+ }
316
+
317
+ .et-match-card-side:where([data-side='home']) {
318
+ text-align: var(--_et-match-card-home-text-align, start);
319
+ }
320
+
321
+ .et-match-card-side:where([data-side='home']) .et-match-card-participant {
322
+ flex-direction: var(--_et-match-card-home-participant-flow, row);
323
+ }
324
+
325
+ /* The winner's bar. Drawn on both sides — transparent on the loser's — because a marker that appears on
326
+ one row only would push that row's emblem out of line with the other's. */
327
+ .et-match-card-side::before {
328
+ display: var(--_et-match-card-side-marker-display, none);
329
+ flex: none;
330
+ align-self: stretch;
331
+ inline-size: var(--_et-match-card-side-marker-size, 2px);
332
+ background: var(--_et-match-card-side-marker-color, transparent);
333
+ border-radius: 1px;
334
+ content: '';
335
+ }
336
+
337
+ /* Between the two sides, and only where they are side by side with nothing else to put there. */
338
+ .et-match-card-versus {
339
+ display: var(--_et-match-card-versus-display, none);
340
+ flex: none;
341
+ padding-inline: 4px;
342
+ font-size: 11px;
343
+ font-weight: 600;
344
+ letter-spacing: 0.06em;
345
+ text-transform: uppercase;
346
+ color: var(--et-surface-color-muted-solid, currentColor);
347
+ }
348
+
349
+ /* The other form the result slot takes — never together with a score, so it can share its metrics. */
350
+ .et-match-card-outcome {
351
+ flex: none;
352
+ min-inline-size: 1.2em;
353
+ font-size: var(--_et-match-card-score-font-size);
354
+ font-weight: 700;
355
+ line-height: 1.2;
356
+ color: var(--_et-match-card-side-color);
357
+ text-align: center;
358
+ }
359
+
360
+ /* Two jobs, one selector: size the participant primitive for this density, and take over its color so
361
+ the winner emphasis below reaches the name. Both need to beat the primitive's own single-class
362
+ rules, which is why this is a descendant selector rather than a token on the card. */
363
+ .et-match-card-content .et-match-card-participant {
364
+ --et-match-participant-emblem-size: var(--_et-match-card-emblem-size);
365
+ --et-match-participant-font-size: var(--_et-match-card-name-font-size);
366
+ flex: 1;
367
+ min-inline-size: 0;
368
+ color: var(--_et-match-card-side-color);
369
+ }
370
+
371
+ /* A participant's second line is the first thing a dense row has no space for — it would make every row
372
+ two lines tall, which is the whole point of the dense row gone. Off by default here, back on in the
373
+ roomier layouts. The primitive keeps showing it when used standalone. */
374
+ .et-match-card-content .et-match-participant-subtitle {
375
+ display: var(--_et-match-card-subtitle-display, none);
376
+ }
377
+
378
+ .et-match-card-score {
379
+ flex: none;
380
+ font-size: var(--_et-match-card-score-font-size);
381
+ font-weight: 600;
382
+ font-variant-numeric: tabular-nums;
383
+ line-height: 1.2;
384
+ color: var(--_et-match-card-side-color);
385
+ }
386
+
387
+ /* A decided match reads its result off the emphasis, which is faster than reading two numbers: the
388
+ winner keeps full weight and color and gets the accent bar, the other side steps back. A draw
389
+ emphasizes neither, and draws no bars at all. */
390
+ .et-match-card:where([data-winner]) .et-match-card-side {
391
+ --_et-match-card-side-color: var(--et-surface-color-muted-solid, currentColor);
392
+ --_et-match-card-side-marker-display: block;
393
+ }
394
+
395
+ .et-match-card:where([data-winner='home']) .et-match-card-side:where([data-side='home']),
396
+ .et-match-card:where([data-winner='away']) .et-match-card-side:where([data-side='away']) {
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);
399
+ --_et-match-card-side-marker-display: block;
400
+ font-weight: 600;
401
+ }
402
+
403
+ .et-match-card-games {
404
+ display: var(--_et-match-card-games-display);
405
+ flex-wrap: wrap;
406
+ gap: 4px;
407
+ margin: 0;
408
+ padding: 0;
409
+ font-size: 11px;
410
+ color: var(--et-surface-color-muted-solid, currentColor);
411
+ list-style: none;
412
+ }
413
+
414
+ .et-match-card-game {
415
+ flex: none;
416
+ padding-inline: 5px;
417
+ font-variant-numeric: tabular-nums;
418
+ line-height: 18px;
419
+ background: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 10%, transparent);
420
+ border-radius: 4px;
421
+ }
422
+
423
+ .et-match-card:where([data-interactive]) {
424
+ cursor: pointer;
425
+ }
426
+
427
+ /* Bare rather than `:where()`-flattened: an interaction state is meant to escalate over the config
428
+ modifiers above it. */
429
+ .et-match-card:where([data-interactive]):hover .et-match-card-content {
430
+ background: color-mix(
431
+ in srgb,
432
+ var(--et-surface-interaction-solid, gray) 6%,
433
+ var(--et-surface-background-solid, transparent)
434
+ );
435
+ border-color: color-mix(
436
+ in srgb,
437
+ var(--et-surface-interaction-solid, gray) 24%,
438
+ var(--et-surface-border-solid, transparent)
439
+ );
440
+ }
441
+ }
@@ -0,0 +1,137 @@
1
+ @layer components {
2
+ @property --et-match-participant-emblem-size {
3
+ syntax: '<length>';
4
+ inherits: true;
5
+ initial-value: 28px;
6
+ }
7
+
8
+ @property --et-match-participant-gap {
9
+ syntax: '<length>';
10
+ inherits: true;
11
+ initial-value: 10px;
12
+ }
13
+
14
+ @property --et-match-participant-font-size {
15
+ syntax: '<length>';
16
+ inherits: true;
17
+ initial-value: 14px;
18
+ }
19
+
20
+ .et-match-participant {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: var(--et-match-participant-gap);
24
+ min-inline-size: 0;
25
+ /* Set rather than inherited, so this on an `<a>` doesn't come out link-blue and underlined. */
26
+ color: var(--et-surface-color-solid, currentColor);
27
+ text-decoration: none;
28
+ }
29
+
30
+ /* On an `<a>` or a `<button>`: the name is what the pointer is aiming at, so that is what reacts. */
31
+ .et-match-participant:where([data-interactive]) {
32
+ cursor: pointer;
33
+ background: none;
34
+ border: 0;
35
+ padding: 0;
36
+ font: inherit;
37
+ text-align: start;
38
+ }
39
+
40
+ .et-match-participant:where([data-interactive]):hover .et-match-participant-name {
41
+ text-decoration: underline;
42
+ }
43
+
44
+ /* A fixed frame whether or not there is an emblem, so a row of participants lines up and a late
45
+ image doesn't shove the name sideways. */
46
+ .et-match-participant-emblem {
47
+ /* A var so the densest card can drop the frame entirely — `display: none` rather than a zero size,
48
+ which would still hold the row's gap open. */
49
+ display: var(--_et-match-participant-emblem-display, grid);
50
+ place-items: center;
51
+ flex: none;
52
+ inline-size: var(--et-match-participant-emblem-size);
53
+ block-size: var(--et-match-participant-emblem-size);
54
+ overflow: hidden;
55
+ border-radius: 50%;
56
+ background: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 10%, transparent);
57
+ }
58
+
59
+ .et-match-participant-picture,
60
+ .et-match-participant-bone {
61
+ inline-size: 100%;
62
+ block-size: 100%;
63
+ /* A grid item's `min-*-size: auto` is content-based, so a broken image's intrinsic box would
64
+ stretch the frame past the size set above and pull the fallback mark off centre. */
65
+ min-inline-size: 0;
66
+ min-block-size: 0;
67
+ }
68
+
69
+ /* Stands in for an emblem that is absent or failed to load — a letter rather than an empty disc, so
70
+ the frame still points at somebody. Sized off the frame, so it shrinks with a compact row. */
71
+ .et-match-participant-emblem-mark {
72
+ color: var(--et-surface-color-muted-solid, currentColor);
73
+ font-size: calc(var(--et-match-participant-emblem-size) * 0.45);
74
+ font-weight: 600;
75
+ line-height: 1;
76
+ font-variant-numeric: tabular-nums;
77
+ }
78
+
79
+ /* Generated content keeps the letter out of the participant's textContent. */
80
+ .et-match-participant-emblem-mark::before {
81
+ content: attr(data-mark);
82
+ }
83
+
84
+ /* One column for the two lines, so the emblem stays centred against both of them. */
85
+ .et-match-participant-names {
86
+ display: flex;
87
+ flex-direction: column;
88
+ min-inline-size: 0;
89
+ }
90
+
91
+ .et-match-participant-name {
92
+ min-inline-size: 0;
93
+ overflow: hidden;
94
+ font-size: var(--et-match-participant-font-size);
95
+ line-height: 1.3;
96
+ text-overflow: ellipsis;
97
+ white-space: nowrap;
98
+ }
99
+
100
+ /* The org behind the roster, the club behind the squad. Quiet by construction — it is context for the
101
+ name above it, not a second name. */
102
+ .et-match-participant-subtitle {
103
+ min-inline-size: 0;
104
+ overflow: hidden;
105
+ font-size: max(10px, calc(var(--et-match-participant-font-size) - 4px));
106
+ line-height: 1.3;
107
+ color: var(--et-surface-color-muted-solid, currentColor);
108
+ text-overflow: ellipsis;
109
+ white-space: nowrap;
110
+ }
111
+
112
+ /* A slot waiting to be filled reads as secondary — it is not the name of anything yet. */
113
+ .et-match-participant-name--tbd {
114
+ color: var(--et-surface-color-muted-solid, currentColor);
115
+ }
116
+
117
+ .et-match-participant-name-bone {
118
+ inline-size: 96px;
119
+ }
120
+
121
+ .et-match-participant-seed {
122
+ flex: none;
123
+ padding-inline: 5px;
124
+ font-size: 11px;
125
+ line-height: 16px;
126
+ font-variant-numeric: tabular-nums;
127
+ color: var(--et-surface-color-muted-solid, currentColor);
128
+ background: color-mix(in srgb, var(--et-surface-interaction-solid, gray) 12%, transparent);
129
+ border-radius: 4px;
130
+ }
131
+
132
+ .et-match-participant:where([data-compact]) {
133
+ --et-match-participant-emblem-size: 20px;
134
+ --et-match-participant-gap: 8px;
135
+ --et-match-participant-font-size: 13px;
136
+ }
137
+ }
@@ -0,0 +1,74 @@
1
+ @layer components {
2
+ /* A fixed box the two values cross inside, so a rolling score never nudges the row it sits in. */
3
+ .et-match-score {
4
+ display: grid;
5
+ position: relative;
6
+ flex: none;
7
+ place-items: center end;
8
+ min-inline-size: 1ch;
9
+ overflow: hidden;
10
+ font-variant-numeric: tabular-nums;
11
+ line-height: 1.2;
12
+ }
13
+
14
+ /* Both values occupy the same cell — that is what lets one leave while the other arrives. */
15
+ .et-match-score-digit {
16
+ grid-area: 1 / 1;
17
+ }
18
+
19
+ .et-match-score-digit:where([data-state='in']) {
20
+ animation: et-match-score-roll-in 220ms cubic-bezier(0.2, 0, 0.2, 1);
21
+ }
22
+
23
+ .et-match-score-digit:where([data-state='out']) {
24
+ animation: et-match-score-roll-out 220ms cubic-bezier(0.4, 0, 1, 1) forwards;
25
+ }
26
+
27
+ /* Behind the digits, in the color theme in scope: the side that just scored catches the eye without the
28
+ card moving or changing size. */
29
+ .et-match-score-flash {
30
+ position: absolute;
31
+ /* Inside the clip box rather than bleeding past it: `overflow: hidden` is what makes the digits roll,
32
+ and it would cut a wider glow into a rectangle anyway. */
33
+ inset: 0;
34
+ background: var(--et-theme-color-primary-solid, currentColor);
35
+ border-radius: 6px;
36
+ opacity: 0;
37
+ animation: et-match-score-flash 520ms ease-out;
38
+ pointer-events: none;
39
+ }
40
+
41
+ @keyframes et-match-score-roll-in {
42
+ from {
43
+ opacity: 0;
44
+ translate: 0 70%;
45
+ }
46
+ }
47
+
48
+ @keyframes et-match-score-roll-out {
49
+ to {
50
+ opacity: 0;
51
+ translate: 0 -70%;
52
+ }
53
+ }
54
+
55
+ @keyframes et-match-score-flash {
56
+ 30% {
57
+ opacity: 0.22;
58
+ }
59
+
60
+ to {
61
+ opacity: 0;
62
+ }
63
+ }
64
+
65
+ /* Near-instant rather than `none`: the outgoing value is dropped on `animationend`, so an animation that
66
+ never runs is an animation that never finishes — and a value that never leaves. */
67
+ @media (prefers-reduced-motion: reduce) {
68
+ .et-match-score-digit:where([data-state='in']),
69
+ .et-match-score-digit:where([data-state='out']),
70
+ .et-match-score-flash {
71
+ animation-duration: 1ms;
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,12 @@
1
+ @layer components {
2
+ .et-menu-group-label {
3
+ display: block;
4
+ padding-block: 6px 4px;
5
+ padding-inline: var(--et-menu-item-padding-inline, 10px);
6
+ color: var(--_et-menu-muted-color, var(--et-surface-color-muted-solid, rgb(255 255 255 / 0.55)));
7
+ font-size: var(--et-menu-group-label-font-size, 12px);
8
+ font-weight: 600;
9
+ letter-spacing: 0.02em;
10
+ text-transform: uppercase;
11
+ }
12
+ }
@@ -0,0 +1,10 @@
1
+ @layer components {
2
+ .et-menu-item-shortcut {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ color: var(--_et-menu-muted-color, var(--et-surface-color-muted-solid, rgb(255 255 255 / 0.55)));
6
+ font-size: 12px;
7
+ font-variant-numeric: tabular-nums;
8
+ letter-spacing: 0.04em;
9
+ }
10
+ }
@@ -0,0 +1,18 @@
1
+ @layer components {
2
+ .et-menu-item-submenu-icon {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ flex: none;
7
+ inline-size: var(--et-menu-item-submenu-icon-size);
8
+ block-size: var(--et-menu-item-submenu-icon-size);
9
+ color: var(--_et-menu-muted-color, var(--et-surface-color-muted-solid, rgb(255 255 255 / 0.55)));
10
+ /* the registered chevron points up natively - rotate it to point into the submenu */
11
+ rotate: 90deg;
12
+
13
+ /* the chevron is directional, so it turns the other way when the menu reads right-to-left */
14
+ &:dir(rtl) {
15
+ rotate: -90deg;
16
+ }
17
+ }
18
+ }