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

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 (270) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/design/accordion.ts +73 -0
  3. package/design/anchored-dialog.ts +92 -0
  4. package/design/avatar.ts +90 -0
  5. package/design/badge.ts +48 -0
  6. package/design/banner.ts +77 -0
  7. package/design/bracket.ts +457 -0
  8. package/design/breadcrumb.ts +145 -0
  9. package/design/button.ts +62 -1
  10. package/design/calendar.ts +306 -0
  11. package/design/card.ts +92 -0
  12. package/design/carousel.ts +240 -0
  13. package/design/chart.ts +512 -0
  14. package/design/checkbox.ts +275 -0
  15. package/design/chip.ts +64 -0
  16. package/design/config.json +8 -0
  17. package/design/control.ts +19 -0
  18. package/design/copy-button.ts +59 -0
  19. package/design/description-list.ts +41 -0
  20. package/design/dialog.ts +216 -0
  21. package/design/divider.ts +27 -0
  22. package/design/empty-state.ts +45 -0
  23. package/design/floating-action.ts +55 -0
  24. package/design/form-field.ts +3 -0
  25. package/design/grid.ts +148 -0
  26. package/design/input.ts +86 -0
  27. package/design/kbd.ts +19 -0
  28. package/design/loader.ts +152 -0
  29. package/design/masonry.ts +115 -0
  30. package/design/match.ts +131 -0
  31. package/design/menu.ts +147 -0
  32. package/design/notification.ts +133 -0
  33. package/design/otp-input.ts +107 -0
  34. package/design/pagination.ts +120 -0
  35. package/design/picture.ts +80 -0
  36. package/design/progress-steps.ts +79 -0
  37. package/design/query-error.ts +60 -0
  38. package/design/radio-group.ts +132 -0
  39. package/design/scheduler.ts +369 -0
  40. package/design/scrollable.ts +218 -0
  41. package/design/scrollbar.ts +47 -0
  42. package/design/sdk/assets/fallback.svg +1 -0
  43. package/design/sdk/assets/tall.svg +1 -0
  44. package/design/sdk/assets/wide.svg +1 -0
  45. package/design/sdk/components/accent-on-light/accent-on-light.css +35 -0
  46. package/design/sdk/components/accent-on-light/accent-on-light.ts +10 -0
  47. package/design/sdk/components/accent-on-light/shared/controls.ts +46 -0
  48. package/design/sdk/components/accordion/accordion.css +17 -0
  49. package/design/sdk/components/accordion/accordion.ts +68 -0
  50. package/design/sdk/components/anchored-dialog/anchored-dialog.css +63 -0
  51. package/design/sdk/components/anchored-dialog/anchored-dialog.ts +65 -0
  52. package/design/sdk/components/avatar/avatar.css +14 -0
  53. package/design/sdk/components/avatar/avatar.ts +79 -0
  54. package/design/sdk/components/badge/badge.css +13 -0
  55. package/design/sdk/components/badge/badge.ts +53 -0
  56. package/design/sdk/components/banner/banner.css +18 -0
  57. package/design/sdk/components/banner/banner.ts +88 -0
  58. package/design/sdk/components/bracket/bracket.css +59 -0
  59. package/design/sdk/components/bracket/bracket.ts +144 -0
  60. package/design/sdk/components/breadcrumb/breadcrumb.css +25 -0
  61. package/design/sdk/components/breadcrumb/breadcrumb.ts +82 -0
  62. package/design/sdk/components/button/button.css +41 -0
  63. package/design/sdk/components/button/button.ts +59 -7
  64. package/design/sdk/components/calendar/calendar.css +33 -0
  65. package/design/sdk/components/calendar/calendar.ts +97 -0
  66. package/design/sdk/components/card/card.css +19 -0
  67. package/design/sdk/components/card/card.ts +62 -0
  68. package/design/sdk/components/carousel/carousel.css +44 -0
  69. package/design/sdk/components/carousel/carousel.ts +75 -0
  70. package/design/sdk/components/chart/chart.css +56 -0
  71. package/design/sdk/components/chart/chart.ts +99 -0
  72. package/design/sdk/components/checkbox/checkbox.css +65 -0
  73. package/design/sdk/components/checkbox/checkbox.ts +180 -0
  74. package/design/sdk/components/chip/chip.css +18 -0
  75. package/design/sdk/components/chip/chip.ts +77 -0
  76. package/design/sdk/components/copy-button/copy-button.css +14 -0
  77. package/design/sdk/components/copy-button/copy-button.ts +60 -0
  78. package/design/sdk/components/description-list/description-list.css +7 -0
  79. package/design/sdk/components/description-list/description-list.ts +54 -0
  80. package/design/sdk/components/dialog/dialog.css +29 -0
  81. package/design/sdk/components/dialog/dialog.ts +79 -0
  82. package/design/sdk/components/divider/divider.css +26 -0
  83. package/design/sdk/components/divider/divider.ts +44 -0
  84. package/design/sdk/components/empty-state/empty-state.css +15 -0
  85. package/design/sdk/components/empty-state/empty-state.ts +57 -0
  86. package/design/sdk/components/floating-action/floating-action.css +51 -0
  87. package/design/sdk/components/floating-action/floating-action.ts +63 -0
  88. package/design/sdk/components/form-field/form-field.ts +23 -5
  89. package/design/sdk/components/grid/grid.css +17 -0
  90. package/design/sdk/components/grid/grid.ts +81 -0
  91. package/design/sdk/components/input/input.css +75 -0
  92. package/design/sdk/components/input/input.ts +80 -0
  93. package/design/sdk/components/kbd/kbd.css +25 -0
  94. package/design/sdk/components/kbd/kbd.ts +58 -0
  95. package/design/sdk/components/loader/loader.css +37 -0
  96. package/design/sdk/components/loader/loader.ts +69 -0
  97. package/design/sdk/components/masonry/masonry.css +7 -0
  98. package/design/sdk/components/masonry/masonry.ts +43 -0
  99. package/design/sdk/components/match/match.css +25 -0
  100. package/design/sdk/components/match/match.ts +77 -0
  101. package/design/sdk/components/menu/menu.css +22 -0
  102. package/design/sdk/components/menu/menu.ts +103 -0
  103. package/design/sdk/components/notification/notification.css +32 -0
  104. package/design/sdk/components/notification/notification.ts +107 -0
  105. package/design/sdk/components/otp-input/otp-input.css +35 -0
  106. package/design/sdk/components/otp-input/otp-input.ts +65 -0
  107. package/design/sdk/components/pagination/pagination.css +14 -0
  108. package/design/sdk/components/pagination/pagination.ts +76 -0
  109. package/design/sdk/components/picture/picture.css +37 -0
  110. package/design/sdk/components/picture/picture.ts +97 -0
  111. package/design/sdk/components/progress-steps/progress-steps.css +37 -0
  112. package/design/sdk/components/progress-steps/progress-steps.ts +92 -0
  113. package/design/sdk/components/query-error/query-error.css +33 -0
  114. package/design/sdk/components/query-error/query-error.ts +121 -0
  115. package/design/sdk/components/radio-group/radio-group.css +46 -0
  116. package/design/sdk/components/radio-group/radio-group.ts +167 -0
  117. package/design/sdk/components/scheduler/scheduler.css +55 -0
  118. package/design/sdk/components/scheduler/scheduler.ts +240 -0
  119. package/design/sdk/components/scrollable/scrollable.css +58 -0
  120. package/design/sdk/components/scrollable/scrollable.ts +133 -0
  121. package/design/sdk/components/scrollbar/scrollbar.css +78 -0
  122. package/design/sdk/components/scrollbar/scrollbar.ts +124 -0
  123. package/design/sdk/components/select/select.ts +1 -1
  124. package/design/sdk/components/select/shared/select-part.ts +25 -3
  125. package/design/sdk/components/select-panel/select-panel.css +3 -0
  126. package/design/sdk/components/select-panel/select-panel.ts +125 -0
  127. package/design/sdk/components/skeleton/skeleton.css +22 -0
  128. package/design/sdk/components/skeleton/skeleton.ts +51 -0
  129. package/design/sdk/components/slider/slider.css +52 -0
  130. package/design/sdk/components/slider/slider.ts +87 -0
  131. package/design/sdk/components/standings/standings.css +33 -0
  132. package/design/sdk/components/standings/standings.ts +131 -0
  133. package/design/sdk/components/stat-tile/stat-tile.css +15 -0
  134. package/design/sdk/components/stat-tile/stat-tile.ts +85 -0
  135. package/design/sdk/components/stream/stream.css +48 -0
  136. package/design/sdk/components/stream/stream.ts +43 -0
  137. package/design/sdk/components/switch/switch.css +37 -0
  138. package/design/sdk/components/switch/switch.ts +63 -0
  139. package/design/sdk/components/table/table.css +67 -0
  140. package/design/sdk/components/table/table.ts +161 -0
  141. package/design/sdk/components/tabs/tabs.css +13 -0
  142. package/design/sdk/components/tabs/tabs.ts +74 -0
  143. package/design/sdk/components/textarea/textarea.css +116 -0
  144. package/design/sdk/components/textarea/textarea.ts +65 -0
  145. package/design/sdk/components/timeline/timeline.css +30 -0
  146. package/design/sdk/components/timeline/timeline.ts +87 -0
  147. package/design/sdk/components/toolbar/toolbar.css +24 -0
  148. package/design/sdk/components/toolbar/toolbar.ts +88 -0
  149. package/design/sdk/components/tooltip/tooltip.css +15 -0
  150. package/design/sdk/components/tooltip/tooltip.ts +28 -0
  151. package/design/sdk/components/tree/selected-tint.css +15 -0
  152. package/design/sdk/components/tree/tree.ts +70 -0
  153. package/design/sdk/foundations/colors/colors.css +124 -4
  154. package/design/sdk/foundations/colors/colors.ts +1 -1
  155. package/design/sdk/foundations/colors/shared/contrast.ts +1 -1
  156. package/design/sdk/foundations/elevation/elevation.css +6 -0
  157. package/design/sdk/foundations/elevation/elevation.ts +11 -0
  158. package/design/sdk/foundations/elevation/shared/elevation/scene.css +101 -0
  159. package/design/sdk/foundations/elevation/shared/elevation/scene.ts +74 -0
  160. package/design/sdk/foundations/icons/icons.ts +119 -0
  161. package/design/sdk/pictures.json +1183 -0
  162. package/design/select.ts +5 -4
  163. package/design/skeleton.ts +67 -0
  164. package/design/slider.ts +155 -0
  165. package/design/standings.ts +161 -0
  166. package/design/stat-tile.ts +109 -0
  167. package/design/stream.ts +92 -0
  168. package/design/switch.ts +83 -0
  169. package/design/table.ts +302 -0
  170. package/design/tabs.ts +75 -0
  171. package/design/textarea.ts +94 -0
  172. package/design/timeline.ts +52 -0
  173. package/design/toolbar.ts +95 -0
  174. package/design/tooltip.ts +87 -0
  175. package/fesm2022/ethlete-components.mjs +1440 -1209
  176. package/fesm2022/ethlete-components.mjs.map +1 -1
  177. package/generators/generators.json +2 -0
  178. package/package.json +1 -1
  179. package/src/lib/accordion/accordion.component.css +2 -1
  180. package/src/lib/avatar/avatar.component.css +10 -0
  181. package/src/lib/badge/badge.component.css +2 -2
  182. package/src/lib/banner/banner.component.css +3 -1
  183. package/src/lib/breadcrumb/breadcrumb-outlet.component.css +5 -0
  184. package/src/lib/breadcrumb/breadcrumb.component.css +5 -1
  185. package/src/lib/button/button-properties-styles.component.css +6 -6
  186. package/src/lib/button/button.component.css +27 -4
  187. package/src/lib/button/button.types.ts +33 -0
  188. package/src/lib/button/icon-button.component.css +21 -22
  189. package/src/lib/button/split-button.component.css +5 -1
  190. package/src/lib/button/window-control-button.component.css +43 -3
  191. package/src/lib/calendar/calendar.component.css +15 -5
  192. package/src/lib/card/card.component.css +4 -0
  193. package/src/lib/carousel/carousel-autoplay-styles.component.css +1 -1
  194. package/src/lib/carousel/carousel.component.css +2 -2
  195. package/src/lib/chart/chart-axis.component.css +3 -3
  196. package/src/lib/chip/chip.component.css +12 -6
  197. package/src/lib/description-list/description-list.component.css +2 -1
  198. package/src/lib/empty-state/empty-state.component.css +4 -0
  199. package/src/lib/floating-action/floating-action-styles.component.css +27 -0
  200. package/src/lib/focus-ring/focus-ring-styles.component.css +4 -1
  201. package/src/lib/forms/checkbox/checkbox.component.css +31 -5
  202. package/src/lib/forms/color-input/color-input.component.css +3 -1
  203. package/src/lib/forms/color-input/color-picker-panel.component.css +6 -2
  204. package/src/lib/forms/date-time/date-input/date-input.component.css +1 -1
  205. package/src/lib/forms/date-time/date-time-input/date-time-input.component.css +1 -1
  206. package/src/lib/forms/date-time/duration-input/duration-input.component.css +1 -1
  207. package/src/lib/forms/date-time/range-input-shell-styles.component.css +1 -1
  208. package/src/lib/forms/date-time/time-input/time-input.component.css +1 -1
  209. package/src/lib/forms/description/description.component.css +7 -0
  210. package/src/lib/forms/dropzone/dropzone.component.css +26 -0
  211. package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +4 -2
  212. package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +54 -5
  213. package/src/lib/forms/form-field/form-field-textarea-styles.component.css +62 -0
  214. package/src/lib/forms/form-field/form-field.component.css +6 -0
  215. package/src/lib/forms/form-field/headless/label.directive.css +1 -1
  216. package/src/lib/forms/input/input.component.css +6 -2
  217. package/src/lib/forms/input/number-input.component.css +2 -2
  218. package/src/lib/forms/input/password-input.component.css +4 -3
  219. package/src/lib/forms/otp-input/otp-input.component.css +23 -4
  220. package/src/lib/forms/phone-input/phone-input.component.css +4 -3
  221. package/src/lib/forms/rating/rating.component.css +2 -1
  222. package/src/lib/forms/rich-text-editor/rich-text-editor.component.css +1 -1
  223. package/src/lib/forms/selection-card-styles.component.css +3 -2
  224. package/src/lib/forms/selection-list/checkbox-group/checkbox-group-select-all.component.css +4 -2
  225. package/src/lib/forms/selection-list/checkbox-group/checkbox-option.component.css +4 -2
  226. package/src/lib/forms/selection-list/radio-group/radio.component.css +5 -2
  227. package/src/lib/forms/selection-list/segmented-button-group/segmented-button.component.css +2 -1
  228. package/src/lib/forms/slider/range-slider.component.css +98 -6
  229. package/src/lib/forms/slider/slider.component.css +96 -4
  230. package/src/lib/forms/switch/switch.component.css +45 -15
  231. package/src/lib/forms/tag-input/tag-input.component.css +2 -2
  232. package/src/lib/forms/textarea/textarea-autosize-styles.component.css +2 -3
  233. package/src/lib/forms/textarea/textarea.component.css +7 -2
  234. package/src/lib/grid/grid-item-toolbar.component.css +10 -0
  235. package/src/lib/grid/grid-item.component.css +6 -1
  236. package/src/lib/kbd/kbd.component.css +1 -1
  237. package/src/lib/loader/brand-loader/brand-loader.component.css +4 -1
  238. package/src/lib/loader/progress-bar/progress-bar.component.css +1 -1
  239. package/src/lib/loader/spinner/spinner-styles.component.css +1 -1
  240. package/src/lib/match/match-card.component.css +9 -3
  241. package/src/lib/match/match-score.component.css +4 -1
  242. package/src/lib/menu/menu-selection-item.component.css +1 -1
  243. package/src/lib/menu/menu.component.css +6 -1
  244. package/src/lib/notification/notification.component.css +3 -3
  245. package/src/lib/overlay/overlay-container.component.css +4 -0
  246. package/src/lib/pagination/pagination.component.css +4 -0
  247. package/src/lib/progress-steps/progress-step.component.css +4 -4
  248. package/src/lib/query-error/query-error.component.css +4 -0
  249. package/src/lib/scheduler/scheduler-appointment-styles.component.css +21 -5
  250. package/src/lib/scheduler/scheduler-month-view.component.css +4 -2
  251. package/src/lib/scheduler/scheduler-time-grid-view.component.css +8 -2
  252. package/src/lib/scrollable/headless/scrollable-navigation.component.css +1 -1
  253. package/src/lib/standings/standings-pick.component.css +1 -1
  254. package/src/lib/standings/standings.component.css +10 -10
  255. package/src/lib/stat-tile/stat-tile-sparkline.component.css +1 -1
  256. package/src/lib/stream/consent/stream-consent.component.css +99 -0
  257. package/src/lib/stream/error/stream-player-error.component.css +100 -0
  258. package/src/lib/stream/loading/stream-player-loading.component.css +16 -0
  259. package/src/lib/stream/pip/pip-slot-placeholder.component.css +68 -0
  260. package/src/lib/stream/stream-player-slot-styles.component.css +4 -0
  261. package/src/lib/table/table-resize-grip.component.css +2 -1
  262. package/src/lib/table/table-select-cell.component.css +45 -15
  263. package/src/lib/table/table.component.css +15 -5
  264. package/src/lib/tabs/tab-bar-styles.component.css +1 -1
  265. package/src/lib/tabs/tabs/tab-group.component.css +111 -0
  266. package/src/lib/time-picker/time-picker.component.css +2 -1
  267. package/src/lib/timeline/timeline-item.component.css +5 -1
  268. package/src/lib/toolbar/toolbar.component.css +4 -0
  269. package/src/lib/tooltip/tooltip.component.css +14 -0
  270. package/types/ethlete-components.d.ts +156 -128
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "generators": {
3
3
  "component": {
4
+ "scaffold": true,
4
5
  "factory": "./component/generator",
5
6
  "schema": "./component/schema.json",
6
7
  "description": "Scaffold a component domain following the three-tier architecture (folder layout, headless + default split, styles, spec, stories, docs page, barrel wiring)"
@@ -101,6 +102,7 @@
101
102
  "description": "Remove the spinner determinate and progress bar indeterminate inputs in templates"
102
103
  },
103
104
  "icons": {
105
+ "scaffold": true,
104
106
  "factory": "./icons/generator",
105
107
  "schema": "./icons/schema.json",
106
108
  "description": "Generate etIcon IconDefinitions and typed names from an installed SVG icon source (auto-detects Font Awesome)"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethlete/components",
3
- "version": "1.0.0-next.78",
3
+ "version": "1.0.0-next.80",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/ethlete-io/ethdk",
@@ -101,7 +101,8 @@
101
101
  }
102
102
 
103
103
  &:focus-visible {
104
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
104
+ outline: 2px solid
105
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
105
106
  outline-offset: -2px;
106
107
  }
107
108
 
@@ -19,6 +19,7 @@
19
19
 
20
20
  .et-avatar {
21
21
  --_et-avatar-size: 40px;
22
+ --_et-avatar-icon-size: 2rem;
22
23
  --et-theme-color-primary-opacity: 1;
23
24
 
24
25
  display: inline-flex;
@@ -43,21 +44,25 @@
43
44
 
44
45
  &:where([data-size='xs']) {
45
46
  --_et-avatar-size: 24px;
47
+ --_et-avatar-icon-size: 1.4rem;
46
48
  --et-avatar-font-size: 10px;
47
49
  }
48
50
 
49
51
  &:where([data-size='sm']) {
50
52
  --_et-avatar-size: 32px;
53
+ --_et-avatar-icon-size: 1.8rem;
51
54
  --et-avatar-font-size: 12px;
52
55
  }
53
56
 
54
57
  &:where([data-size='lg']) {
55
58
  --_et-avatar-size: 48px;
59
+ --_et-avatar-icon-size: 2.4rem;
56
60
  --et-avatar-font-size: 16px;
57
61
  }
58
62
 
59
63
  &:where([data-size='xl']) {
60
64
  --_et-avatar-size: 64px;
65
+ --_et-avatar-icon-size: 2.8rem;
61
66
  --et-avatar-font-size: 20px;
62
67
  }
63
68
 
@@ -66,6 +71,11 @@
66
71
  }
67
72
  }
68
73
 
74
+ .et-avatar .et-icon {
75
+ inline-size: var(--_et-avatar-icon-size);
76
+ block-size: var(--_et-avatar-icon-size);
77
+ }
78
+
69
79
  .et-avatar-image {
70
80
  display: block;
71
81
  inline-size: 100%;
@@ -64,12 +64,12 @@
64
64
  &:where([data-variant='filled']) {
65
65
  --et-theme-color-primary-opacity: 1;
66
66
  --_et-badge-color: var(--et-theme-color-on-primary);
67
- --_et-badge-border-color: transparent;
67
+ --_et-badge-border-color: var(--et-theme-color-ink-solid);
68
68
  }
69
69
 
70
70
  &:where([data-variant='tonal']) {
71
71
  --et-theme-color-primary-opacity: 0.16;
72
- --_et-badge-border-color: transparent;
72
+ --_et-badge-border-color: var(--et-theme-color-ink-solid);
73
73
  }
74
74
 
75
75
  &:where([data-variant='outline']) {
@@ -50,7 +50,7 @@
50
50
  /* The tint is whatever type/color resolved onto this host's color scope, so the banner reads as its
51
51
  type without a hardcoded color - including a neutral `currentColor` tint for `info` with nothing forced. */
52
52
  background: color-mix(in srgb, var(--et-theme-color-primary-solid, currentColor) 8%, transparent);
53
- border: 1px solid color-mix(in srgb, var(--et-theme-color-primary-solid, currentColor) 24%, transparent);
53
+ border: 1px solid var(--et-theme-color-ink-solid);
54
54
 
55
55
  > .et-icon {
56
56
  flex-shrink: 0;
@@ -74,6 +74,7 @@
74
74
  font-size: var(--et-banner-heading-size);
75
75
  font-weight: var(--et-banner-heading-weight);
76
76
  color: var(--et-surface-color-solid, currentColor);
77
+ overflow-wrap: anywhere;
77
78
  }
78
79
 
79
80
  .et-banner-description,
@@ -81,6 +82,7 @@
81
82
  margin: 0;
82
83
  font-size: var(--et-banner-description-size);
83
84
  color: var(--et-surface-color-muted-solid, currentColor);
85
+ overflow-wrap: anywhere;
84
86
  }
85
87
 
86
88
  [etBannerAction] {
@@ -0,0 +1,5 @@
1
+ @layer components {
2
+ .et-breadcrumb-outlet {
3
+ display: block;
4
+ }
5
+ }
@@ -28,6 +28,9 @@
28
28
  /* The clip that makes overflow measurable — `scroll.width > client.width` is the directive's
29
29
  "doesn't fit" signal. Never `auto`: a scrollbar would defeat the collapsing it drives. */
30
30
  overflow: hidden;
31
+ /* Room for the focus ring (the overflow trigger's 2px outline + 3px offset) inside the clip; the negative margin keeps the layout height. */
32
+ padding-block: 5px;
33
+ margin-block: -5px;
31
34
  color: var(--et-surface-color-muted-solid, GrayText);
32
35
  }
33
36
 
@@ -91,7 +94,8 @@
91
94
  }
92
95
 
93
96
  &:where(a, button):focus-visible {
94
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
97
+ outline: 2px solid
98
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
95
99
  outline-offset: 2px;
96
100
  }
97
101
 
@@ -75,7 +75,7 @@
75
75
  --et-theme-color-primary-opacity: 0;
76
76
 
77
77
  @media (hover: hover) {
78
- &:hover {
78
+ &:not([disabled], [aria-disabled='true']):hover {
79
79
  --et-theme-color-primary-opacity: var(--et-button-variant-opacity-hover-delta);
80
80
  }
81
81
  }
@@ -84,7 +84,7 @@
84
84
  --et-theme-color-primary-opacity: var(--et-button-variant-opacity-focus-delta);
85
85
  }
86
86
 
87
- &:active {
87
+ &:not([disabled], [aria-disabled='true']):active {
88
88
  --et-theme-color-primary-opacity: var(--et-button-variant-opacity-active-delta);
89
89
  }
90
90
  }
@@ -93,7 +93,7 @@
93
93
  --et-theme-color-primary-opacity: 0.16;
94
94
 
95
95
  @media (hover: hover) {
96
- &:hover {
96
+ &:not([disabled], [aria-disabled='true']):hover {
97
97
  --et-theme-color-primary-opacity: calc(0.16 + var(--et-button-variant-opacity-hover-delta));
98
98
  }
99
99
  }
@@ -102,7 +102,7 @@
102
102
  --et-theme-color-primary-opacity: calc(0.16 + var(--et-button-variant-opacity-focus-delta));
103
103
  }
104
104
 
105
- &:active {
105
+ &:not([disabled], [aria-disabled='true']):active {
106
106
  --et-theme-color-primary-opacity: calc(0.16 + var(--et-button-variant-opacity-active-delta));
107
107
  }
108
108
  }
@@ -112,7 +112,7 @@
112
112
  --et-theme-color-primary-opacity: 0.16;
113
113
 
114
114
  @media (hover: hover) {
115
- &:hover {
115
+ &:not([disabled], [aria-disabled='true']):hover {
116
116
  --et-theme-color-primary-opacity: calc(0.16 + var(--et-button-variant-opacity-hover-delta));
117
117
  }
118
118
  }
@@ -121,7 +121,7 @@
121
121
  --et-theme-color-primary-opacity: calc(0.16 + var(--et-button-variant-opacity-focus-delta));
122
122
  }
123
123
 
124
- &:active {
124
+ &:not([disabled], [aria-disabled='true']):active {
125
125
  --et-theme-color-primary-opacity: calc(0.16 + var(--et-button-variant-opacity-active-delta));
126
126
  }
127
127
  }
@@ -103,7 +103,7 @@
103
103
  --_et-button-border-color: var(--et-theme-color-ink-solid);
104
104
 
105
105
  @media (hover: hover) {
106
- &:hover {
106
+ &:not([disabled], [aria-disabled='true']):hover {
107
107
  --et-theme-color-primary-opacity: var(--et-button-variant-opacity-hover-delta);
108
108
  }
109
109
  }
@@ -112,7 +112,7 @@
112
112
  --et-theme-color-primary-opacity: var(--et-button-variant-opacity-focus-delta);
113
113
  }
114
114
 
115
- &:active {
115
+ &:not([disabled], [aria-disabled='true']):active {
116
116
  --et-theme-color-primary-opacity: var(--et-button-variant-opacity-active-delta);
117
117
  }
118
118
 
@@ -135,6 +135,25 @@
135
135
  --_et-button-border-color: transparent;
136
136
  }
137
137
 
138
+ &:where([data-variant='filled']) {
139
+ @media (hover: hover) {
140
+ &:not([disabled], [aria-disabled='true']):hover {
141
+ --et-theme-color-primary-rgb: var(
142
+ --et-color-primary-active,
143
+ var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))
144
+ );
145
+ }
146
+ }
147
+
148
+ &:not([disabled], [aria-disabled='true']):active {
149
+ --_et-button-background: color-mix(
150
+ in srgb,
151
+ var(--et-theme-color-primary-solid) 96%,
152
+ var(--et-theme-color-on-primary-solid)
153
+ );
154
+ }
155
+ }
156
+
138
157
  &[data-pressed='true']:where([data-pressed-variant='filled']) {
139
158
  --et-theme-color-primary-opacity: 1;
140
159
  --_et-button-background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));
@@ -142,7 +161,7 @@
142
161
  --_et-button-border-color: transparent;
143
162
 
144
163
  @media (hover: hover) {
145
- &:hover {
164
+ &:not([disabled], [aria-disabled='true']):hover {
146
165
  --et-theme-color-primary-opacity: 1;
147
166
  }
148
167
  }
@@ -151,7 +170,7 @@
151
170
  --et-theme-color-primary-opacity: 1;
152
171
  }
153
172
 
154
- &:active {
173
+ &:not([disabled], [aria-disabled='true']):active {
155
174
  --et-theme-color-primary-opacity: 1;
156
175
  }
157
176
  }
@@ -182,6 +201,10 @@
182
201
  transition: opacity 120ms ease;
183
202
  }
184
203
 
204
+ &:where([data-stretch-contents]) .et-button-contents {
205
+ flex: 1;
206
+ }
207
+
185
208
  &[data-loading='true'] {
186
209
  .et-button-icon,
187
210
  .et-button-contents {
@@ -0,0 +1,33 @@
1
+ export const BUTTON_SIZES = {
2
+ XS: 'xs',
3
+ SM: 'sm',
4
+ MD: 'md',
5
+ LG: 'lg',
6
+ XL: 'xl',
7
+ } as const;
8
+
9
+ export type ButtonSize = (typeof BUTTON_SIZES)[keyof typeof BUTTON_SIZES];
10
+
11
+ export const BUTTON_ICON_ALIGNMENTS = {
12
+ START: 'start',
13
+ END: 'end',
14
+ } as const;
15
+
16
+ export type ButtonIconAlignment = (typeof BUTTON_ICON_ALIGNMENTS)[keyof typeof BUTTON_ICON_ALIGNMENTS];
17
+
18
+ export const BUTTON_VARIANTS = {
19
+ FILLED: 'filled',
20
+ OUTLINE: 'outline',
21
+ TONAL: 'tonal',
22
+ TRANSPARENT: 'transparent',
23
+ } as const;
24
+
25
+ export type ButtonVariant = (typeof BUTTON_VARIANTS)[keyof typeof BUTTON_VARIANTS];
26
+
27
+ export const BUTTON_SPINNER_CONFIG: Record<ButtonSize, { diameter: number; strokeWidth: number }> = {
28
+ xs: { diameter: 12, strokeWidth: 1.5 },
29
+ sm: { diameter: 14, strokeWidth: 1.75 },
30
+ md: { diameter: 16, strokeWidth: 2 },
31
+ lg: { diameter: 20, strokeWidth: 2.5 },
32
+ xl: { diameter: 24, strokeWidth: 3 },
33
+ };
@@ -18,7 +18,10 @@
18
18
  justify-content: center;
19
19
  width: var(--et-icon-button-size);
20
20
  height: var(--et-icon-button-size);
21
- background: rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity));
21
+ background: var(
22
+ --_et-icon-button-background,
23
+ rgb(var(--et-theme-color-primary-rgb) / var(--et-theme-color-primary-opacity))
24
+ );
22
25
  color: var(--et-theme-color-ink-solid);
23
26
  border: none;
24
27
  border-radius: var(--et-icon-button-border-radius, 9999px);
@@ -74,13 +77,20 @@
74
77
  pointer-events: none;
75
78
  }
76
79
 
77
- &:where([data-variant='filled']) {
80
+ &:where([data-variant='filled']):not([data-pressed='true']),
81
+ &[data-pressed='true']:where([data-pressed-variant='filled']) {
78
82
  --et-theme-color-primary-opacity: 1;
83
+ --et-button-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
79
84
  color: var(--et-theme-color-on-primary);
85
+ box-shadow: var(--et-button-shadow, none);
80
86
 
81
87
  @media (hover: hover) {
82
- &:hover {
83
- --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-hover-delta));
88
+ &:not([disabled], [aria-disabled='true']):hover {
89
+ --et-theme-color-primary-opacity: 1;
90
+ --et-theme-color-primary-rgb: var(
91
+ --et-color-primary-active,
92
+ var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))
93
+ );
84
94
  }
85
95
  }
86
96
 
@@ -88,8 +98,12 @@
88
98
  --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-focus-delta));
89
99
  }
90
100
 
91
- &:active {
92
- --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-active-delta));
101
+ &:not([disabled], [aria-disabled='true']):active {
102
+ --_et-icon-button-background: color-mix(
103
+ in srgb,
104
+ var(--et-theme-color-primary-solid) 96%,
105
+ var(--et-theme-color-on-primary-solid)
106
+ );
93
107
  }
94
108
  }
95
109
 
@@ -98,22 +112,7 @@
98
112
  }
99
113
 
100
114
  &[data-pressed='true']:where([data-pressed-variant='filled']) {
101
- --et-theme-color-primary-opacity: 1;
102
- color: var(--et-theme-color-on-primary);
103
-
104
- @media (hover: hover) {
105
- &:hover {
106
- --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-hover-delta));
107
- }
108
- }
109
-
110
- &:focus-visible {
111
- --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-focus-delta));
112
- }
113
-
114
- &:active {
115
- --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-active-delta));
116
- }
115
+ border: none;
117
116
  }
118
117
 
119
118
  .et-icon-button-icon {
@@ -87,7 +87,11 @@
87
87
  z-index: 1;
88
88
 
89
89
  &:where([data-variant='filled']) {
90
- --et-theme-color-primary-opacity: calc(1 - var(--et-button-variant-opacity-hover-delta));
90
+ --et-theme-color-primary-opacity: 1;
91
+ --et-theme-color-primary-rgb: var(
92
+ --et-color-primary-active,
93
+ var(--et-color-primary-focus, var(--et-color-primary-hover, var(--et-color-primary)))
94
+ );
91
95
  }
92
96
 
93
97
  &:where([data-variant='outline'], [data-variant='transparent']) {
@@ -64,6 +64,27 @@
64
64
  --_et-window-control-button-icon-size: 1.8rem;
65
65
  }
66
66
 
67
+ &:where([data-shape='round']) {
68
+ --et-theme-color-primary-opacity: 0.1;
69
+ --_et-window-control-button-fallback-background: rgba(255, 255, 255, 0.1);
70
+ --_et-window-control-button-border-radius: 50%;
71
+ }
72
+
73
+ &:where([data-shape='round'][data-size='sm']) {
74
+ --_et-window-control-button-size: 2rem;
75
+ --_et-window-control-button-icon-size: 1.2rem;
76
+ }
77
+
78
+ &:where([data-shape='round'][data-size='md']) {
79
+ --_et-window-control-button-size: 2.4rem;
80
+ --_et-window-control-button-icon-size: 1.6rem;
81
+ }
82
+
83
+ &:where([data-shape='round'][data-size='lg']) {
84
+ --_et-window-control-button-size: 2.8rem;
85
+ --_et-window-control-button-icon-size: 1.8rem;
86
+ }
87
+
67
88
  @media (hover: hover) {
68
89
  &:hover {
69
90
  --et-theme-color-primary-opacity: 0.14;
@@ -103,19 +124,38 @@
103
124
  }
104
125
  }
105
126
 
106
- &:where([data-kind='close']):focus-visible {
127
+ &:where([data-shape='round']) {
128
+ @media (hover: hover) {
129
+ &:hover {
130
+ --et-theme-color-primary-opacity: 0.15;
131
+ --_et-window-control-button-fallback-background: rgba(255, 255, 255, 0.15);
132
+ }
133
+ }
134
+
135
+ &:focus-visible {
136
+ --et-theme-color-primary-opacity: 0.15;
137
+ --_et-window-control-button-fallback-background: rgba(255, 255, 255, 0.15);
138
+ }
139
+
140
+ &:active {
141
+ --et-theme-color-primary-opacity: 0.3;
142
+ --_et-window-control-button-fallback-background: rgba(255, 255, 255, 0.3);
143
+ }
144
+ }
145
+
146
+ &:where([data-kind='close']:not([data-shape='round'])):focus-visible {
107
147
  background: var(--et-window-control-button-close-background, rgba(232, 17, 35, 0.92));
108
148
  color: var(--et-window-control-button-close-color, #ffffff);
109
149
  }
110
150
 
111
151
  @media (hover: hover) {
112
- &:where([data-kind='close']):hover {
152
+ &:where([data-kind='close']:not([data-shape='round'])):hover {
113
153
  background: var(--et-window-control-button-close-background, rgba(232, 17, 35, 0.92));
114
154
  color: var(--et-window-control-button-close-color, #ffffff);
115
155
  }
116
156
  }
117
157
 
118
- &:where([data-kind='close']):active {
158
+ &:where([data-kind='close']:not([data-shape='round'])):active {
119
159
  background: var(--et-window-control-button-close-background-active, rgba(196, 14, 29, 0.96));
120
160
  color: var(--et-window-control-button-close-color, #ffffff);
121
161
  }
@@ -38,17 +38,18 @@
38
38
  -webkit-tap-highlight-color: transparent;
39
39
 
40
40
  @media (hover: hover) {
41
- &:hover {
41
+ &:not([disabled], [aria-disabled='true']):hover {
42
42
  background: color-mix(in srgb, var(--et-surface-interaction-solid) 12%, transparent);
43
43
  }
44
44
  }
45
45
 
46
- &:active {
46
+ &:not([disabled], [aria-disabled='true']):active {
47
47
  background: color-mix(in srgb, var(--et-surface-interaction-solid) 22%, transparent);
48
48
  }
49
49
 
50
50
  &:focus-visible {
51
- outline: 2px solid var(--et-theme-color-primary-solid);
51
+ outline: 2px solid
52
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
52
53
  outline-offset: 1px;
53
54
  }
54
55
  }
@@ -204,7 +205,10 @@
204
205
  inset-block: 4px;
205
206
  inset-inline: 0;
206
207
  display: none;
207
- background: color-mix(in srgb, var(--et-theme-color-primary-solid) 12%, transparent);
208
+ background: light-dark(
209
+ color-mix(in srgb, var(--et-theme-color-primary-solid) 32%, transparent),
210
+ color-mix(in srgb, var(--et-theme-color-primary-solid) 12%, transparent)
211
+ );
208
212
  }
209
213
 
210
214
  &:where([data-band])::before {
@@ -242,7 +246,8 @@
242
246
  outline: none;
243
247
 
244
248
  .et-calendar-cell-content {
245
- outline: 2px solid var(--et-theme-color-primary-solid);
249
+ outline: 2px solid
250
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
246
251
  outline-offset: 1px;
247
252
  }
248
253
  }
@@ -255,6 +260,11 @@
255
260
  box-shadow: inset 0 0 0 1px var(--et-theme-color-ink-solid);
256
261
  }
257
262
 
263
+ &:where([data-selected], [data-band='start'], [data-band='end']):where(:not([data-disabled], [data-today]))
264
+ .et-calendar-cell-content {
265
+ box-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
266
+ }
267
+
258
268
  &:where([data-band='start'], [data-band='end']):where(:not([data-selected])) {
259
269
  color: var(--et-theme-color-on-primary);
260
270
 
@@ -36,4 +36,8 @@
36
36
  box-shadow: 0 4px 16px rgb(var(--et-shadow-color-rgb, 0 0 0) / 0.12);
37
37
  }
38
38
  }
39
+
40
+ .et-card .et-button:where([data-variant='filled']) {
41
+ --et-button-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
42
+ }
39
43
  }
@@ -51,7 +51,7 @@
51
51
  content: '';
52
52
  position: absolute;
53
53
  inset: 0;
54
- background: var(--et-theme-color-primary-solid, currentColor);
54
+ background: light-dark(var(--et-theme-color-ink-solid), var(--et-theme-color-primary-solid));
55
55
  rotate: -180deg;
56
56
  /* At -180deg the flat edge lies on this half's clip edge, and at a fractional device pixel ratio the
57
57
  anti-aliasing of the two leaks a one-pixel line. The sweep keyframes show it again. */
@@ -144,13 +144,13 @@
144
144
  }
145
145
 
146
146
  &:where([data-active])::before {
147
- background: var(--et-theme-color-primary-solid, currentColor);
147
+ background: light-dark(var(--et-theme-color-ink-solid), var(--et-theme-color-primary-solid));
148
148
  }
149
149
 
150
150
  /* Spelled out because the plain `:hover` above outranks a `:where()`-flattened selector, so without this
151
151
  the accent dot went grey under the pointer — the one dot that must never look unselected. */
152
152
  &:where([data-active]):hover::before {
153
- background: var(--et-theme-color-primary-solid, currentColor);
153
+ background: light-dark(var(--et-theme-color-ink-solid), var(--et-theme-color-primary-solid));
154
154
  }
155
155
  }
156
156
 
@@ -12,6 +12,7 @@
12
12
  }
13
13
 
14
14
  &:where([data-orientation='horizontal']) {
15
+ container-type: inline-size;
15
16
  justify-items: start;
16
17
 
17
18
  .et-chart-axis-label {
@@ -20,10 +21,9 @@
20
21
 
21
22
  .et-chart-axis-label:where([data-extent]) {
22
23
  box-sizing: border-box;
23
- inline-size: var(--_et-chart-axis-extent);
24
+ max-inline-size: var(--_et-chart-axis-extent);
24
25
  padding-inline: 2px;
25
- text-align: center;
26
- translate: calc(var(--_et-chart-axis-position) - var(--_et-chart-axis-extent) / 2) 0;
26
+ translate: clamp(0px, calc(var(--_et-chart-axis-position) - 50%), calc(100cqi - 100%)) 0;
27
27
  }
28
28
  }
29
29
 
@@ -74,13 +74,14 @@
74
74
  color 120ms ease;
75
75
 
76
76
  @media (hover: hover) {
77
- &:hover:not([aria-checked='true']):not([data-readonly]) {
77
+ &:hover:not([aria-checked='true'], [data-readonly], [data-disabled]) {
78
78
  background: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 22%, transparent);
79
79
  }
80
80
  }
81
81
 
82
82
  &:focus-visible {
83
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
83
+ outline: 2px solid
84
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
84
85
  outline-offset: 1px;
85
86
  }
86
87
 
@@ -95,9 +96,10 @@
95
96
  &:where([aria-checked='true']) {
96
97
  background: color-mix(in srgb, var(--et-theme-color-primary-solid, currentColor) 16%, transparent);
97
98
  color: var(--et-theme-color-ink-solid, currentColor);
99
+ box-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
98
100
 
99
101
  @media (hover: hover) {
100
- &:hover:not([data-readonly]) {
102
+ &:hover:not([data-readonly], [data-disabled]) {
101
103
  background: color-mix(in srgb, var(--et-theme-color-primary-solid, currentColor) 24%, transparent);
102
104
  }
103
105
  }
@@ -131,20 +133,24 @@
131
133
  color: var(--et-surface-color-muted-solid, currentColor);
132
134
  cursor: pointer;
133
135
  appearance: none;
136
+ transition:
137
+ background 120ms ease,
138
+ color 120ms ease;
134
139
 
135
140
  @media (hover: hover) {
136
- &:hover {
141
+ &:not([disabled]):hover {
137
142
  background: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 20%, transparent);
138
143
  color: var(--et-surface-color-solid, currentColor);
139
144
  }
140
145
  }
141
146
 
142
- &:active {
147
+ &:not([disabled]):active {
143
148
  background: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 28%, transparent);
144
149
  }
145
150
 
146
151
  &:focus-visible {
147
- outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
152
+ outline: 2px solid
153
+ light-dark(var(--et-theme-color-ink-solid, currentColor), var(--et-theme-color-primary-solid, currentColor));
148
154
  outline-offset: 1px;
149
155
  }
150
156
 
@@ -37,7 +37,7 @@
37
37
 
38
38
  .et-description-list {
39
39
  display: grid;
40
- grid-template-columns: minmax(var(--et-description-list-term-min-width), max-content) 1fr;
40
+ grid-template-columns: minmax(var(--et-description-list-term-min-width), max-content) minmax(0, 1fr);
41
41
  row-gap: var(--et-description-list-row-gap);
42
42
  column-gap: var(--et-description-list-column-gap);
43
43
  margin: 0;
@@ -55,6 +55,7 @@
55
55
  dd {
56
56
  grid-column: 2;
57
57
  margin: 0;
58
+ overflow-wrap: anywhere;
58
59
  font-size: var(--et-description-list-detail-font-size);
59
60
  color: var(--et-surface-color-solid, currentColor);
60
61
  }
@@ -70,4 +70,8 @@
70
70
  font-size: var(--et-empty-state-description-font-size);
71
71
  color: var(--et-surface-color-muted-solid, currentColor);
72
72
  }
73
+
74
+ .et-empty-state .et-button:where([data-variant='filled']) {
75
+ --et-button-shadow: inset 0 0 0 1px light-dark(var(--et-theme-color-ink-solid), transparent);
76
+ }
73
77
  }