@expressivecss/expressive 0.9.1 → 0.10.0

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 (188) hide show
  1. package/CHANGELOG.md +157 -1
  2. package/README.md +178 -25
  3. package/dist/css/expressive.css +365 -1222
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  8. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  9. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  10. package/dist/js/chunks/chunk-7MM4VJJO.mjs +509 -0
  11. package/dist/js/chunks/chunk-7MM4VJJO.mjs.map +7 -0
  12. package/dist/js/chunks/chunk-7UXHSYIA.mjs +183 -0
  13. package/dist/js/chunks/chunk-7UXHSYIA.mjs.map +7 -0
  14. package/dist/js/chunks/chunk-A3BJA7V4.mjs +28 -0
  15. package/dist/js/chunks/chunk-A3BJA7V4.mjs.map +7 -0
  16. package/dist/js/chunks/chunk-AOGFNMXS.mjs +691 -0
  17. package/dist/js/chunks/chunk-AOGFNMXS.mjs.map +7 -0
  18. package/dist/js/chunks/chunk-D4UZ4HFN.mjs +560 -0
  19. package/dist/js/chunks/chunk-D4UZ4HFN.mjs.map +7 -0
  20. package/dist/js/chunks/chunk-EP3CVKB5.mjs +88 -0
  21. package/dist/js/chunks/chunk-EP3CVKB5.mjs.map +7 -0
  22. package/dist/js/chunks/chunk-G576EP5O.mjs +459 -0
  23. package/dist/js/chunks/chunk-G576EP5O.mjs.map +7 -0
  24. package/dist/js/chunks/chunk-GY2Z5CJ2.mjs +320 -0
  25. package/dist/js/chunks/chunk-GY2Z5CJ2.mjs.map +7 -0
  26. package/dist/js/chunks/chunk-JKNPQQWY.mjs +191 -0
  27. package/dist/js/chunks/chunk-JKNPQQWY.mjs.map +7 -0
  28. package/dist/js/chunks/chunk-JNPIWFJT.mjs +365 -0
  29. package/dist/js/chunks/chunk-JNPIWFJT.mjs.map +7 -0
  30. package/dist/js/chunks/chunk-JODJAGFS.mjs +267 -0
  31. package/dist/js/chunks/chunk-JODJAGFS.mjs.map +7 -0
  32. package/dist/js/chunks/chunk-JR24UB4X.mjs +100 -0
  33. package/dist/js/chunks/chunk-JR24UB4X.mjs.map +7 -0
  34. package/dist/js/chunks/chunk-KR44BSYQ.mjs +55 -0
  35. package/dist/js/chunks/chunk-KR44BSYQ.mjs.map +7 -0
  36. package/dist/js/chunks/chunk-LZVBJ33S.mjs +102 -0
  37. package/dist/js/chunks/chunk-LZVBJ33S.mjs.map +7 -0
  38. package/dist/js/chunks/chunk-MISGHDUU.mjs +326 -0
  39. package/dist/js/chunks/chunk-MISGHDUU.mjs.map +7 -0
  40. package/dist/js/chunks/chunk-N3UHGN3N.mjs +175 -0
  41. package/dist/js/chunks/chunk-N3UHGN3N.mjs.map +7 -0
  42. package/dist/js/chunks/chunk-PB5L3EXF.mjs +7 -0
  43. package/dist/js/chunks/chunk-PB5L3EXF.mjs.map +7 -0
  44. package/dist/js/chunks/chunk-PIIAEYAJ.mjs +85 -0
  45. package/dist/js/chunks/chunk-PIIAEYAJ.mjs.map +7 -0
  46. package/dist/js/chunks/chunk-QSQ24FYT.mjs +59 -0
  47. package/dist/js/chunks/chunk-QSQ24FYT.mjs.map +7 -0
  48. package/dist/js/chunks/chunk-QYCYP443.mjs +1111 -0
  49. package/dist/js/chunks/chunk-QYCYP443.mjs.map +7 -0
  50. package/dist/js/chunks/chunk-SLFNPY5M.mjs +78 -0
  51. package/dist/js/chunks/chunk-SLFNPY5M.mjs.map +7 -0
  52. package/dist/js/chunks/chunk-TK6PX2GC.mjs +663 -0
  53. package/dist/js/chunks/chunk-TK6PX2GC.mjs.map +7 -0
  54. package/dist/js/chunks/chunk-TYM6U5DY.mjs +76 -0
  55. package/dist/js/chunks/chunk-TYM6U5DY.mjs.map +7 -0
  56. package/dist/js/chunks/chunk-TZZ24ZQS.mjs +154 -0
  57. package/dist/js/chunks/chunk-TZZ24ZQS.mjs.map +7 -0
  58. package/dist/js/chunks/chunk-VAS6JQ6P.mjs +94 -0
  59. package/dist/js/chunks/chunk-VAS6JQ6P.mjs.map +7 -0
  60. package/dist/js/chunks/chunk-WWPAPHMA.mjs +1 -0
  61. package/dist/js/chunks/chunk-WWPAPHMA.mjs.map +7 -0
  62. package/dist/js/chunks/chunk-XDB3G6RL.mjs +114 -0
  63. package/dist/js/chunks/chunk-XDB3G6RL.mjs.map +7 -0
  64. package/dist/js/chunks/chunk-XO5WX3TK.mjs +226 -0
  65. package/dist/js/chunks/chunk-XO5WX3TK.mjs.map +7 -0
  66. package/dist/js/chunks/chunk-YFXEJ7GR.mjs +286 -0
  67. package/dist/js/chunks/chunk-YFXEJ7GR.mjs.map +7 -0
  68. package/dist/js/chunks/chunk-ZIZVUWRL.mjs +120 -0
  69. package/dist/js/chunks/chunk-ZIZVUWRL.mjs.map +7 -0
  70. package/dist/js/chunks/chunk-ZZBZI2XN.mjs +338 -0
  71. package/dist/js/chunks/chunk-ZZBZI2XN.mjs.map +7 -0
  72. package/dist/js/expressive.cjs +747 -754
  73. package/dist/js/expressive.cjs.map +4 -4
  74. package/dist/js/expressive.js +747 -754
  75. package/dist/js/expressive.js.map +4 -4
  76. package/dist/js/expressive.min.js +11 -15
  77. package/dist/js/expressive.min.js.map +4 -4
  78. package/dist/js/expressive.mjs +83 -7490
  79. package/dist/js/expressive.mjs.map +4 -4
  80. package/dist/js/internal/behaviors/bottomSheets.mjs +9 -0
  81. package/dist/js/internal/behaviors/bottomSheets.mjs.map +7 -0
  82. package/dist/js/internal/behaviors/dialogs.mjs +8 -0
  83. package/dist/js/internal/behaviors/dialogs.mjs.map +7 -0
  84. package/dist/js/internal/behaviors/forms.mjs +8 -0
  85. package/dist/js/internal/behaviors/forms.mjs.map +7 -0
  86. package/dist/js/internal/behaviors/sheetDrag.mjs +8 -0
  87. package/dist/js/internal/behaviors/sheetDrag.mjs.map +7 -0
  88. package/dist/js/internal/behaviors/sideSheets.mjs +9 -0
  89. package/dist/js/internal/behaviors/sideSheets.mjs.map +7 -0
  90. package/dist/js/internal/components/appBar.mjs +8 -0
  91. package/dist/js/internal/components/appBar.mjs.map +7 -0
  92. package/dist/js/internal/components/autocomplete.mjs +10 -0
  93. package/dist/js/internal/components/autocomplete.mjs.map +7 -0
  94. package/dist/js/internal/components/buttonGroup.mjs +8 -0
  95. package/dist/js/internal/components/buttonGroup.mjs.map +7 -0
  96. package/dist/js/internal/components/buttons.mjs +9 -0
  97. package/dist/js/internal/components/buttons.mjs.map +7 -0
  98. package/dist/js/internal/components/cards.mjs +13 -0
  99. package/dist/js/internal/components/cards.mjs.map +7 -0
  100. package/dist/js/internal/components/carousel.mjs +9 -0
  101. package/dist/js/internal/components/carousel.mjs.map +7 -0
  102. package/dist/js/internal/components/characterCounter.mjs +8 -0
  103. package/dist/js/internal/components/characterCounter.mjs.map +7 -0
  104. package/dist/js/internal/components/chips.mjs +11 -0
  105. package/dist/js/internal/components/chips.mjs.map +7 -0
  106. package/dist/js/internal/components/datepicker.mjs +12 -0
  107. package/dist/js/internal/components/datepicker.mjs.map +7 -0
  108. package/dist/js/internal/components/expandingCard.mjs +11 -0
  109. package/dist/js/internal/components/expandingCard.mjs.map +7 -0
  110. package/dist/js/internal/components/index.mjs +88 -0
  111. package/dist/js/internal/components/index.mjs.map +7 -0
  112. package/dist/js/internal/components/lightbox.mjs +9 -0
  113. package/dist/js/internal/components/lightbox.mjs.map +7 -0
  114. package/dist/js/internal/components/menu.mjs +9 -0
  115. package/dist/js/internal/components/menu.mjs.map +7 -0
  116. package/dist/js/internal/components/navigationRail.mjs +8 -0
  117. package/dist/js/internal/components/navigationRail.mjs.map +7 -0
  118. package/dist/js/internal/components/registry.mjs +33 -0
  119. package/dist/js/internal/components/registry.mjs.map +7 -0
  120. package/dist/js/internal/components/scrollspy.mjs +8 -0
  121. package/dist/js/internal/components/scrollspy.mjs.map +7 -0
  122. package/dist/js/internal/components/select.mjs +10 -0
  123. package/dist/js/internal/components/select.mjs.map +7 -0
  124. package/dist/js/internal/components/slider.mjs +9 -0
  125. package/dist/js/internal/components/slider.mjs.map +7 -0
  126. package/dist/js/internal/components/snackbar.mjs +8 -0
  127. package/dist/js/internal/components/snackbar.mjs.map +7 -0
  128. package/dist/js/internal/components/tabs.mjs +10 -0
  129. package/dist/js/internal/components/tabs.mjs.map +7 -0
  130. package/dist/js/internal/components/timepicker.mjs +10 -0
  131. package/dist/js/internal/components/timepicker.mjs.map +7 -0
  132. package/dist/js/internal/components/tooltip.mjs +9 -0
  133. package/dist/js/internal/components/tooltip.mjs.map +7 -0
  134. package/dist/js/internal/core/component.mjs +7 -0
  135. package/dist/js/internal/core/component.mjs.map +7 -0
  136. package/dist/js/internal/core/utils.mjs +7 -0
  137. package/dist/js/internal/core/utils.mjs.map +7 -0
  138. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +8 -0
  139. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs.map +7 -0
  140. package/dist/js/modular.mjs +113 -0
  141. package/dist/js/modular.mjs.map +7 -0
  142. package/dist/types/behaviors/sheetDrag.d.ts +1 -1
  143. package/dist/types/components/appBar.d.ts +1 -1
  144. package/dist/types/components/autocomplete.d.ts +9 -0
  145. package/dist/types/components/buttons.d.ts +4 -39
  146. package/dist/types/components/carousel.d.ts +10 -1
  147. package/dist/types/components/chips.d.ts +1 -0
  148. package/dist/types/components/datepicker.d.ts +7 -0
  149. package/dist/types/components/index.d.ts +0 -2
  150. package/dist/types/components/lightbox.d.ts +12 -0
  151. package/dist/types/components/menu.d.ts +3 -0
  152. package/dist/types/components/registry.d.ts +0 -4
  153. package/dist/types/components/select.d.ts +4 -0
  154. package/dist/types/components/slider.d.ts +2 -1
  155. package/dist/types/components/snackbar.d.ts +4 -2
  156. package/dist/types/components/tabs.d.ts +2 -1
  157. package/dist/types/components/timepicker.d.ts +5 -3
  158. package/dist/types/components/tooltip.d.ts +5 -3
  159. package/dist/types/index.d.ts +1 -8
  160. package/dist/types/modular.d.ts +28 -0
  161. package/package.json +16 -4
  162. package/src/sass/README.md +8 -0
  163. package/src/sass/components/_badges.scss +1 -6
  164. package/src/sass/components/_button-groups.scss +5 -1
  165. package/src/sass/components/_buttons.scss +8 -287
  166. package/src/sass/components/_chips.scss +17 -2
  167. package/src/sass/components/_dialog.scss +9 -4
  168. package/src/sass/components/_fab-menu.scss +11 -9
  169. package/src/sass/components/_icon-buttons.scss +0 -5
  170. package/src/sass/components/_index.scss +0 -5
  171. package/src/sass/components/_menu.scss +2 -2
  172. package/src/sass/components/_navigation-rail.scss +1 -1
  173. package/src/sass/components/_panes.scss +50 -78
  174. package/src/sass/components/_progress.scss +73 -13
  175. package/src/sass/components/_scrim.scss +4 -4
  176. package/src/sass/components/_side-sheet.scss +22 -12
  177. package/src/sass/components/_toolbar.scss +1 -4
  178. package/src/sass/components/_tooltip.scss +20 -2
  179. package/src/sass/components/forms/_input-fields.scss +5 -1
  180. package/src/sass/components/forms/_select.scss +1 -0
  181. package/src/sass/components/forms/_slider.scss +81 -25
  182. package/src/sass/custom.scss +38 -0
  183. package/dist/types/components/navigationDrawer.d.ts +0 -110
  184. package/src/sass/components/_banners.scss +0 -298
  185. package/src/sass/components/_bottom-app-bar.scss +0 -180
  186. package/src/sass/components/_floating-sheet.scss +0 -86
  187. package/src/sass/components/_navigation-drawer.scss +0 -476
  188. package/src/sass/components/_segmented-buttons.scss +0 -188
@@ -2,6 +2,7 @@
2
2
 
3
3
  ```
4
4
  expressive.scss entry point - decides cascade order, nothing else
5
+ custom.scss optional entry - selected partials in the same layers
5
6
  abstracts/ variables, functions, mixins (emits no CSS)
6
7
  tokens/ M3 design tokens as :root custom properties
7
8
  base/ normalize, element defaults, typography, grid
@@ -9,6 +10,13 @@ components/ one file per widget (+ components/forms/)
9
10
  utilities/ single-purpose helper classes
10
11
  ```
11
12
 
13
+ `custom.scss` accepts `$components` and `$utilities` lists of partial names,
14
+ in load order. `null` loads the complete group; `()` loads none. Tokens and base
15
+ are always loaded, and the existing font configuration still applies. Its
16
+ default output must equal `expressive.scss`. Use one entry per consumer sheet.
17
+ Keep selections in the order of the existing indexes, with icons first, and
18
+ include supporting partials. See the README's smaller-build recipes.
19
+
12
20
  ## Browser support
13
21
 
14
22
  The last 5 versions of Chrome and Firefox. No IE, no Edge Legacy. Declared in
@@ -79,9 +79,8 @@
79
79
  }
80
80
  }
81
81
 
82
- // Trailing count in a list or drawer row stays in flow.
82
+ // Trailing count in a list or menu row stays in flow.
83
83
  .list .badge,
84
- :is(.sidenav, .navigation-drawer) .badge,
85
84
  menu .badge {
86
85
  position: static;
87
86
  transform: none;
@@ -90,7 +89,3 @@ menu .badge {
90
89
  .list .badge {
91
90
  margin-inline-start: auto;
92
91
  }
93
-
94
- :is(.sidenav, .navigation-drawer) summary .badge {
95
- margin-inline-start: 14px;
96
- }
@@ -299,7 +299,11 @@ $_connected-corners: (
299
299
  --md-comp-button-group-pressed-inner-corner-corner-size: 4px;
300
300
  --md-comp-button-group-selected-inner-corner-corner-size: 50%;
301
301
 
302
- width: 100%;
302
+ display: grid;
303
+ grid-auto-flow: column;
304
+ grid-auto-columns: 1fr;
305
+ width: max-content;
306
+ min-width: 100%;
303
307
 
304
308
  @each $name, $c in $_connected-corners {
305
309
  &.#{$name} {
@@ -17,8 +17,8 @@
17
17
  // the size ladder in abstracts, corner.full at every size
18
18
  // state layer 8% hover / 10% focus+press
19
19
  // FAB 56dp (extra/large icon-only), primary-container, 16dp corners
20
- // FAB sizes 40dp small / 56dp default / 80dp medium / 96dp large,
21
- // 24 / 24 / 26 / 36dp icon, 12 / 16 / 20 / 28dp corners
20
+ // FAB sizes 56dp default / 80dp medium / 96dp large,
21
+ // 24 / 26 / 36dp icon, 16 / 20 / 28dp corners
22
22
 
23
23
  // The size axis is `$button-sizes` in abstracts, and `button-size()` sets its
24
24
  // tokens. Both moved there when button groups grew a size ladder of their own:
@@ -152,17 +152,15 @@ $_btn: "button:not(#{$_not-btn}), a.button, label.button";
152
152
 
153
153
  // Extended FAB: an icon plus a label, on its own size and colour axes.
154
154
  //
155
- // Tokens (M3 md.comp.extended-fab.*, DSP 34.0.21). The sizeless case is the
156
- // base family; the three named sizes are `md.comp.extended-fab.{size}.*`:
155
+ // Tokens (M3 md.comp.extended-fab.{size}.*, DSP 34.0.21):
157
156
  //
158
157
  // size height shape icon lead gap trail label
159
- // (none) 56 16 24 16 8 20 label-large
160
158
  // small 56 16 24 16 8 16 title-medium
161
159
  // medium 80 20 28 26 12 26 title-large
162
160
  // large 96 28 36 28 16 28 headline-small
163
161
  //
164
162
  // Leading and trailing space are equal at every named size, so the map states
165
- // one `space`; only the base family keeps M3's older 16/20 asymmetry.
163
+ // one `space`.
166
164
  //
167
165
  // The colour axis is M3's three container roles, and it runs through two
168
166
  // tokens rather than a background per variant: the state layers mix the label
@@ -178,13 +176,7 @@ $_extend-sizes: (
178
176
  "large": (height: 96px, shape: 28px, icon: 36px, space: 28px, gap: 16px, label: "headline-small"),
179
177
  );
180
178
 
181
- :where(#{$_btn}).extend {
182
- --md-comp-extended-fab-container-height: 56px;
183
- --md-comp-extended-fab-container-shape: 16px;
184
- --md-comp-extended-fab-icon-size: 24px;
185
- --md-comp-extended-fab-leading-space: 16px;
186
- --md-comp-extended-fab-icon-label-space: 8px;
187
- --md-comp-extended-fab-trailing-space: 20px;
179
+ :where(#{$_btn}):where(.small, .medium, .large).extend {
188
180
  --md-comp-extended-fab-container-color: var(--md-sys-color-primary-container);
189
181
  --md-comp-extended-fab-label-text-color: var(
190
182
  --md-sys-color-on-primary-container
@@ -195,7 +187,6 @@ $_extend-sizes: (
195
187
  padding-inline: var(--md-comp-extended-fab-leading-space)
196
188
  var(--md-comp-extended-fab-trailing-space);
197
189
  border-radius: var(--md-comp-extended-fab-container-shape);
198
- font-size: var(--md-sys-typescale-label-large-font-size);
199
190
  color: var(--md-comp-extended-fab-label-text-color);
200
191
  background-color: var(--md-comp-extended-fab-container-color);
201
192
  @include z-depth("3");
@@ -255,15 +246,14 @@ $_extend-sizes: (
255
246
  }
256
247
  }
257
248
 
258
- // FAB. Icon-only .extra / .large is the 56dp regular FAB. Add .small for
259
- // the 40dp small FAB. The speed-dial host is .fab.
249
+ // FAB. Icon-only .extra / .large is the 56dp regular FAB.
260
250
  //
261
251
  // Tokens (M3 md.comp.fab.*):
262
252
  // --md-comp-fab-container-height 56dp
263
253
  // --md-comp-fab-container-width 56dp
264
254
  // --md-comp-fab-container-shape 16dp, corner.large - rounded, not a pill
265
255
  // --md-comp-fab-icon-size 24dp
266
- // .small, .medium and .extra.large reset those four; nothing else varies
256
+ // .medium and .extra.large reset those four; nothing else varies
267
257
  // by size.
268
258
  :where(#{$_btn}).extra.circle,
269
259
  :where(#{$_btn}).large.circle {
@@ -316,15 +306,8 @@ $_extend-sizes: (
316
306
  );
317
307
  }
318
308
 
319
- // Small FAB: 40dp container, corner.medium, icon stays 24dp.
320
- &.small {
321
- --md-comp-fab-container-height: 40px;
322
- --md-comp-fab-container-width: 40px;
323
- --md-comp-fab-container-shape: 12px;
324
- }
325
-
326
309
  // Medium FAB: 80dp container, 26dp icon. The corner continues the size
327
- // ladder - 12dp small, 16dp default, 20dp here (corner.large-increased).
310
+ // ladder - 16dp default, 20dp here (corner.large-increased).
328
311
  &.medium {
329
312
  --md-comp-fab-container-height: 80px;
330
313
  --md-comp-fab-container-width: 80px;
@@ -363,265 +346,3 @@ $_extend-sizes: (
363
346
  :where(#{$_btn}).disabled {
364
347
  @include btn-disabled;
365
348
  }
366
-
367
- // The FAB host. M3 names this component "FAB"; `.fixed-action-btn` is the
368
- // Materialize name and stays as an alias. Interpolate inside :is() - a bare
369
- // comma list breaks out of its context (see $_bar in _navbar).
370
- $_fab: ":is(.fab, .fixed-action-btn)";
371
-
372
- // Speed dial. .active (and :hover when the pointer can hover) opens the
373
- // menu. Motion is CSS. .click-to-toggle is the markup switch for click
374
- // mode. `.fab` is the public class; .fixed-action-btn is the old alias.
375
- //
376
- // Tokens:
377
- // --md-comp-fab-offset 16px from the corner
378
- // --md-comp-fab-z 997
379
- // --md-comp-fab-menu-gap 16px
380
- // --md-comp-fab-duration 200ms
381
- // --md-comp-fab-stagger 40ms
382
- // --md-comp-fab-easing soft ease-in-out
383
- // --md-comp-fab-travel center-to-center step into the main disc
384
- // --md-comp-fab-hidden-transform toward / into the main button
385
- #{$_fab} {
386
- --md-comp-fab-offset: 16px;
387
- --md-comp-fab-z: 997;
388
- --md-comp-fab-menu-gap: 16px;
389
- --md-comp-fab-duration: 200ms;
390
- --md-comp-fab-stagger: 40ms;
391
- --md-comp-fab-easing: cubic-bezier(0.65, 0, 0.35, 1);
392
- --md-comp-fab-travel: 64px;
393
- --md-comp-fab-hidden-transform: scale(0)
394
- translateY(calc(var(--md-comp-fab-travel) * (var(--i, 0) + 1)));
395
-
396
- position: fixed;
397
- inset-inline-end: var(--md-comp-fab-offset);
398
- bottom: var(--md-comp-fab-offset);
399
- z-index: var(--md-comp-fab-z);
400
- padding-top: var(--md-comp-fab-menu-gap);
401
- margin: 0;
402
- overflow: visible;
403
-
404
- // Main disc stays above retracting actions so they slide under it.
405
- > :is(a, button) {
406
- position: relative;
407
- z-index: 1;
408
- }
409
-
410
- :is(ul, menu) {
411
- --n: 1;
412
- position: absolute;
413
- inset-inline: 0;
414
- bottom: 64px;
415
- display: flex;
416
- flex-direction: column;
417
- align-items: center;
418
- gap: var(--md-comp-fab-menu-gap);
419
- margin: 0;
420
- padding: 0;
421
- list-style: none;
422
- visibility: hidden;
423
- overflow: visible;
424
- transition: visibility 0s
425
- calc(var(--md-comp-fab-duration) + var(--md-comp-fab-stagger) * (var(--n) - 1));
426
-
427
- &:has(> :nth-child(2)) { --n: 2; }
428
- &:has(> :nth-child(3)) { --n: 3; }
429
- &:has(> :nth-child(4)) { --n: 4; }
430
- &:has(> :nth-child(5)) { --n: 5; }
431
- &:has(> :nth-child(6)) { --n: 6; }
432
- &:has(> :nth-child(7)) { --n: 7; }
433
- &:has(> :nth-child(8)) { --n: 8; }
434
-
435
- li:nth-last-child(1) { --i: 0; }
436
- li:nth-last-child(2) { --i: 1; }
437
- li:nth-last-child(3) { --i: 2; }
438
- li:nth-last-child(4) { --i: 3; }
439
- li:nth-last-child(5) { --i: 4; }
440
- li:nth-last-child(6) { --i: 5; }
441
- li:nth-last-child(7) { --i: 6; }
442
- li:nth-last-child(8) { --i: 7; }
443
-
444
- > li > :is(a, button) {
445
- opacity: 0;
446
- transform: var(--md-comp-fab-hidden-transform);
447
- transition:
448
- opacity var(--md-comp-fab-duration) var(--md-comp-fab-easing),
449
- transform var(--md-comp-fab-duration) var(--md-comp-fab-easing),
450
- background-color .2s ease-out,
451
- box-shadow .2s ease-out;
452
- // Close: farthest first, so they funnel into the disc.
453
- transition-delay: calc(
454
- var(--md-comp-fab-stagger) * (var(--n) - 1 - var(--i, 0))
455
- );
456
- }
457
- }
458
-
459
- &.active :is(ul, menu) {
460
- visibility: visible;
461
- transition-delay: 0s;
462
-
463
- > li > :is(a, button) {
464
- opacity: 1;
465
- transform: none;
466
- transition-delay: calc(var(--md-comp-fab-stagger) * var(--i, 0));
467
- }
468
- }
469
-
470
- // Closest-to-FAB is the first child when the menu is left, right, or
471
- // down (row-reverse / row / column). Top uses nth-last-child above.
472
- &.direction-left,
473
- &.direction-right,
474
- &.direction-bottom {
475
- :is(ul, menu) {
476
- li:nth-child(1) { --i: 0; }
477
- li:nth-child(2) { --i: 1; }
478
- li:nth-child(3) { --i: 2; }
479
- li:nth-child(4) { --i: 3; }
480
- li:nth-child(5) { --i: 4; }
481
- li:nth-child(6) { --i: 5; }
482
- li:nth-child(7) { --i: 6; }
483
- li:nth-child(8) { --i: 7; }
484
- }
485
- }
486
-
487
- &.direction-left,
488
- &.direction-right {
489
- padding: 0;
490
-
491
- :is(ul, menu) {
492
- inset: auto;
493
- top: 50%;
494
- translate: 0 -50%;
495
- flex-direction: row;
496
- width: max-content;
497
- height: auto;
498
- }
499
- }
500
-
501
- // Hidden offset is toward the main button, one step per index, so
502
- // close sends every action into the disc.
503
- &.direction-left {
504
- --md-comp-fab-hidden-transform: scale(0)
505
- translateX(calc(var(--md-comp-fab-travel) * (var(--i, 0) + 1)));
506
- padding-inline-start: var(--md-comp-fab-menu-gap);
507
-
508
- :is(ul, menu) {
509
- inset-inline-end: 64px;
510
- flex-direction: row-reverse;
511
- }
512
- }
513
-
514
- &.direction-right {
515
- --md-comp-fab-hidden-transform: scale(0)
516
- translateX(calc(-1 * var(--md-comp-fab-travel) * (var(--i, 0) + 1)));
517
- padding-inline-end: var(--md-comp-fab-menu-gap);
518
-
519
- :is(ul, menu) {
520
- inset-inline-start: 64px;
521
- }
522
- }
523
-
524
- &.direction-bottom {
525
- --md-comp-fab-hidden-transform: scale(0)
526
- translateY(calc(-1 * var(--md-comp-fab-travel) * (var(--i, 0) + 1)));
527
- padding: 0 0 var(--md-comp-fab-menu-gap);
528
-
529
- :is(ul, menu) {
530
- inset: auto;
531
- top: 64px;
532
- bottom: auto;
533
- inset-inline: 0;
534
- }
535
- }
536
-
537
- &.toolbar {
538
- padding: 0;
539
- height: 56px;
540
-
541
- :is(ul, menu) > li > :is(a, button) {
542
- opacity: 1;
543
- transform: none;
544
- transition: opacity var(--md-comp-fab-duration);
545
- }
546
-
547
- &.active {
548
- inset-inline: 0;
549
- bottom: 0;
550
- width: 100%;
551
- height: 56px;
552
-
553
- > :is(a, button) > #{$icon} {
554
- opacity: 0;
555
- }
556
-
557
- :is(ul, menu) {
558
- visibility: visible;
559
- position: static;
560
- display: flex;
561
- flex-direction: row;
562
- width: 100%;
563
- height: 100%;
564
- gap: 0;
565
- }
566
- }
567
-
568
- :is(ul, menu) li {
569
- flex: 1;
570
- margin: 0;
571
- height: 100%;
572
-
573
- :is(a, button) {
574
- display: grid;
575
- place-items: center;
576
- width: 100%;
577
- height: 100%;
578
- background: transparent;
579
- box-shadow: none;
580
- color: var(--md-sys-color-on-primary-container);
581
-
582
- &:hover {
583
- background-color: color-mix(in oklab, var(--md-sys-color-on-primary-container) state-opacity("hover"), transparent);
584
- }
585
-
586
- &:focus-visible {
587
- background-color: color-mix(in oklab, var(--md-sys-color-on-primary-container) state-opacity("focus"), transparent);
588
- }
589
-
590
- &:active {
591
- background-color: color-mix(in oklab, var(--md-sys-color-on-primary-container) state-opacity("pressed"), transparent);
592
- }
593
- }
594
- }
595
- }
596
-
597
- .fab-backdrop {
598
- position: absolute;
599
- inset: 0 auto auto 0;
600
- z-index: -1;
601
- width: 56px;
602
- height: 56px;
603
- border-radius: 16px;
604
- background-color: var(--md-sys-color-primary-container);
605
- transform: scale(0);
606
- }
607
- }
608
-
609
- @media (hover: hover) {
610
- #{$_fab}:not(.click-to-toggle):hover :is(ul, menu) {
611
- visibility: visible;
612
- transition-delay: 0s;
613
-
614
- > li > :is(a, button) {
615
- opacity: 1;
616
- transform: none;
617
- transition-delay: calc(var(--md-comp-fab-stagger) * var(--i, 0));
618
- }
619
- }
620
- }
621
-
622
- @media (prefers-reduced-motion: reduce) {
623
- #{$_fab} {
624
- --md-comp-fab-duration: 0s;
625
- --md-comp-fab-stagger: 0s;
626
- }
627
- }
@@ -13,13 +13,18 @@
13
13
  color: var(--md-sys-color-on-surface-variant);
14
14
  background-color: var(--md-sys-color-surface-container-low);
15
15
  display: inline-flex;
16
- white-space: nowrap;
16
+ white-space: normal;
17
+ overflow-wrap: anywhere;
18
+ max-width: 100%;
19
+ min-width: 0;
17
20
  gap: 8px;
18
21
  margin: 0;
19
- height: 32px;
22
+ min-height: 32px;
23
+ height: auto;
20
24
  padding-left: var(--padding);
21
25
  padding-right: var(--padding);
22
26
  font-size: var(--font-size);
27
+ line-height: 1.5;
23
28
  font-weight: 500;
24
29
  border-radius: 8px;
25
30
  align-items: center;
@@ -88,6 +93,7 @@
88
93
  }
89
94
 
90
95
  .chip > img {
96
+ flex-shrink: 0;
91
97
  margin: 0;
92
98
  width: 24px;
93
99
  height: 24px;
@@ -102,6 +108,7 @@
102
108
 
103
109
  // The delete affordance is a real <button>, so it needs the button reset too.
104
110
  .chip .close {
111
+ flex-shrink: 0;
105
112
  border-radius: 50%;
106
113
  height: 24px;
107
114
  width: 24px;
@@ -119,6 +126,14 @@
119
126
  @include focus-visible();
120
127
  }
121
128
 
129
+ .chip > button:not(.close) {
130
+ min-width: 0;
131
+ height: auto;
132
+ font: inherit;
133
+ white-space: inherit;
134
+ overflow-wrap: inherit;
135
+ }
136
+
122
137
  .chip .close:hover {
123
138
  background-color: color-mix(in oklab, var(--md-sys-color-on-surface-variant) state-opacity("hover"), transparent);
124
139
  }
@@ -36,6 +36,7 @@ dialog {
36
36
  background-color: var(--md-comp-basic-dialog-container-color);
37
37
  color: var(--md-sys-color-on-surface);
38
38
  outline: none;
39
+ overflow-wrap: anywhere;
39
40
  @include z-depth("3");
40
41
 
41
42
  &::backdrop {
@@ -140,6 +141,13 @@ dialog > :is(form, nav):last-child {
140
141
  padding: 0 24px 24px;
141
142
  border: 0;
142
143
  background: none;
144
+
145
+ > :is(button, a.button):not(.icon-button, .circle, .extend) {
146
+ max-width: 100%;
147
+ height: auto;
148
+ min-height: var(--md-comp-filled-button-container-height, 40px);
149
+ white-space: normal;
150
+ }
143
151
  }
144
152
 
145
153
  dialog:not(
@@ -149,10 +157,7 @@ dialog:not(
149
157
  .right,
150
158
  .right-sheet,
151
159
  .left,
152
- .left-sheet,
153
- .floating-sheet,
154
- :is(.sidenav, .navigation-drawer),
155
- :is(.sidenav-overlay, .navigation-drawer-overlay)
160
+ .left-sheet
156
161
  )
157
162
  > :is(form, nav):last-child
158
163
  > :is(button, a.button):not(.tonal, .outlined, .elevated, .filled, .icon-button) {
@@ -4,13 +4,6 @@
4
4
  // into a close button while it is open. `.fab-menu` is the host; `.active`
5
5
  // and `aria-expanded` are the framework's, never the author's.
6
6
  //
7
- // It shares the FloatingActionButton class with the `.fab` speed dial next
8
- // door and nothing else. The two never collide: `$_fab` is
9
- // `:is(.fab, .fixed-action-btn)`, and a class selector matches whole class
10
- // names, so `.fab` does not reach `.fab-menu`. The one name that looks shared
11
- // is `--md-comp-fab-menu-gap`, which is the speed dial's own gap token and is
12
- // deliberately not one of the names below.
13
- //
14
7
  // Tokens (M3 md.comp.fab-menu.*, DSP 34.0.21):
15
8
  //
16
9
  // close-button 56x56, icon 20dp, corner.full, elevation 3, 8dp above list
@@ -82,6 +75,8 @@ $_fab-menu-roles: ("primary", "secondary", "tertiary");
82
75
  margin: 0;
83
76
  padding: 0;
84
77
  list-style: none;
78
+ width: max-content;
79
+ max-inline-size: calc(100vw - 2 * var(--md-comp-fab-menu-offset));
85
80
  visibility: hidden;
86
81
  transition: visibility 0s var(--md-comp-fab-menu-duration);
87
82
 
@@ -95,18 +90,25 @@ $_fab-menu-roles: ("primary", "secondary", "tertiary");
95
90
  li:nth-last-child(5) { --i: 4; }
96
91
  li:nth-last-child(6) { --i: 5; }
97
92
 
93
+ > li {
94
+ max-inline-size: 100%;
95
+ }
96
+
98
97
  > li > :is(a, button) {
99
98
  display: inline-flex;
100
99
  align-items: center;
101
100
  gap: var(--md-comp-fab-menu-menu-item-icon-label-space);
102
- height: var(--md-comp-fab-menu-menu-item-container-height);
101
+ min-height: var(--md-comp-fab-menu-menu-item-container-height);
102
+ max-inline-size: 100%;
103
103
  padding-inline: var(--md-comp-fab-menu-menu-item-leading-space)
104
104
  var(--md-comp-fab-menu-menu-item-trailing-space);
105
105
  border: none;
106
106
  border-radius: 9999px;
107
107
  color: var(--md-comp-fab-menu-menu-item-label-text-color);
108
108
  background-color: var(--md-comp-fab-menu-menu-item-container-color);
109
- white-space: nowrap;
109
+ white-space: normal;
110
+ overflow-wrap: anywhere;
111
+ text-align: start;
110
112
  text-decoration: none;
111
113
  cursor: pointer;
112
114
  appearance: none;
@@ -21,11 +21,6 @@
21
21
  // goes inside the existing `:not()` argument list, never chained after it, so
22
22
  // the host rule stays exactly as specific as it was.
23
23
  //
24
- // The navigation drawer is the deliberate exception. Its `$_row` geometry has
25
- // no opt-out for `.button` either: every row in a drawer is one shape, and
26
- // carving an icon button out of that is the drawer's decision to make, not
27
- // this component's.
28
- //
29
24
  // Anatomy is the HTML — one control, one icon, and the name on the control.
30
25
  // The icon is decoration (`aria-hidden`), so `aria-label` is the only name the
31
26
  // control has; `semantics.json` enforces both halves of that.
@@ -28,7 +28,6 @@
28
28
  @forward "expanding-card";
29
29
  @forward "bottom-sheet";
30
30
  @forward "side-sheet";
31
- @forward "floating-sheet";
32
31
  @forward "chips";
33
32
  @forward "lightbox";
34
33
  @forward "docked-display";
@@ -36,7 +35,6 @@
36
35
  @forward "forms";
37
36
  @forward "table_of_contents";
38
37
  @forward "scrollspy";
39
- @forward "navigation-drawer";
40
38
  @forward "progress";
41
39
  @forward "carousel";
42
40
  @forward "datepicker";
@@ -47,8 +45,5 @@
47
45
  @forward "fab-menu";
48
46
  @forward "loading-indicator";
49
47
  @forward "search";
50
- @forward "segmented-buttons";
51
- @forward "banners";
52
48
  @forward "drag-handle";
53
- @forward "bottom-app-bar";
54
49
  @forward "scrim";
@@ -506,7 +506,7 @@ menu[id] {
506
506
  }
507
507
 
508
508
  // Nested menu. Optional, desktop-first. No second Menu instance —
509
- // a <menu> inside an <li> is a flyout. Hover / :focus-within on fine
509
+ // a <menu> inside an <li> is a flyout. Hover on fine
510
510
  // pointers; .open is the tap / keyboard switch.
511
511
  menu[id] li > menu {
512
512
  @include menu-surface;
@@ -530,7 +530,7 @@ menu[id] li > menu {
530
530
  }
531
531
 
532
532
  @media (hover: hover) and (pointer: fine) {
533
- menu[id] li:is(:hover, :focus-within) > menu {
533
+ menu[id] li:hover > menu {
534
534
  visibility: visible;
535
535
  opacity: 1;
536
536
  pointer-events: auto;
@@ -1,7 +1,7 @@
1
1
  @use "../abstracts" as *;
2
2
 
3
3
  // Navigation rail. Destinations on mid-size screens, not the bottom
4
- // navigation bar and not the sidenav drawer.
4
+ // navigation bar.
5
5
  //
6
6
  // Anatomy is the HTML: a nav.navigation-rail. The first
7
7
  // button:not(.button) is the menu toggle. A .button child is the