@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
@@ -40,41 +40,36 @@
40
40
  --md-comp-pane-list-width: 360px;
41
41
  --md-comp-pane-supporting-width: 360px;
42
42
  --md-comp-pane-primary-min-width: 360px;
43
+ --md-comp-pane-margin: 16px;
44
+ --_pane-columns: 1fr;
45
+ --_pane-expanded-columns: var(--md-comp-pane-list-width) 1fr;
46
+ --_pane-wide-columns: var(--_pane-expanded-columns);
47
+ --_pane-display: none;
48
+ --_pane-divider: 0px;
43
49
 
44
50
  box-sizing: border-box;
45
51
  display: grid;
46
- width: 100%;
52
+ width: calc(100% - (2 * var(--md-comp-pane-margin)));
47
53
  height: 100%;
48
54
  min-height: 0;
49
- margin: 0;
55
+ margin: 0 var(--md-comp-pane-margin);
50
56
  padding: 0;
51
57
  container-type: inline-size;
52
58
  background-color: var(--md-comp-pane-container-color);
53
59
  color: var(--md-sys-color-on-surface);
54
60
 
55
- // Default: single pane on Compact and Medium windows (< 840px).
56
- grid-template-columns: 1fr;
61
+ grid-template-columns: var(--_pane-columns);
57
62
  gap: 0;
58
63
 
59
- // M3 layout margins are the inline space between content and the window
60
- // edges. Keep the full-height pane model and inset layouts below Large.
61
- @include bp-down("medium") {
62
- --md-comp-pane-margin: 16px;
63
- width: calc(100% - (2 * var(--md-comp-pane-margin)));
64
- margin-inline: var(--md-comp-pane-margin);
65
- }
66
-
67
- @include bp-between("medium", "expanded") {
64
+ @include bp-up("medium") {
68
65
  --md-comp-pane-margin: 24px;
69
- width: calc(100% - (2 * var(--md-comp-pane-margin)));
70
- margin-inline: var(--md-comp-pane-margin);
71
66
  gap: var(--md-comp-pane-gap);
72
67
  }
73
68
 
74
69
  // Panes in compact mode: list/primary visible by default, detail/supporting hidden
75
70
  // unless marked .active
76
71
  > :is(.pane, .list-pane, .primary-pane, .detail-pane, .supporting-pane) {
77
- display: none;
72
+ display: var(--_pane-display);
78
73
  min-width: 0;
79
74
  min-height: 0;
80
75
  overflow: hidden;
@@ -90,46 +85,40 @@
90
85
  }
91
86
  }
92
87
 
93
- // Expanded Viewports: Dual-pane side-by-side (via container query or breakpoint)
94
88
  @include bp-up("expanded") {
95
- grid-template-columns: var(--md-comp-pane-list-width) 1fr;
96
- gap: 0;
89
+ --_pane-columns: var(--_pane-expanded-columns);
90
+ --_pane-display: flex;
91
+ --_pane-divider: 1px;
92
+ }
97
93
 
98
- > :is(.pane, .list-pane, .primary-pane, .detail-pane, .supporting-pane) {
99
- display: flex !important;
100
- }
94
+ @include bp-up("large") {
95
+ --_pane-columns: var(--_pane-wide-columns);
101
96
  }
102
97
 
103
- @container (min-width: 840px) {
104
- grid-template-columns: var(--md-comp-pane-list-width) 1fr;
98
+ @container (width < 600px) {
99
+ --md-comp-pane-margin: 16px;
105
100
  gap: 0;
106
-
107
- > :is(.pane, .list-pane, .primary-pane, .detail-pane, .supporting-pane) {
108
- display: flex !important;
109
- }
110
101
  }
111
102
 
112
- // This follows both two-pane rules so their base gap cannot cancel the M3
113
- // Expanded spacer when the viewport and container queries both match.
114
- @include bp-between("expanded", "large") {
103
+ @container (width >= 600px) {
115
104
  --md-comp-pane-margin: 24px;
116
- width: calc(100% - (2 * var(--md-comp-pane-margin)));
117
- margin-inline: var(--md-comp-pane-margin);
118
105
  gap: var(--md-comp-pane-gap);
119
106
  }
120
107
 
121
- @include bp-between("large", "extra-large") {
122
- --md-comp-pane-margin: 24px;
123
- width: calc(100% - (2 * var(--md-comp-pane-margin)));
124
- margin-inline: var(--md-comp-pane-margin);
125
- gap: var(--md-comp-pane-gap);
108
+ @container (width < 840px) {
109
+ --_pane-columns: 1fr;
110
+ --_pane-display: none;
111
+ --_pane-divider: 0px;
126
112
  }
127
113
 
128
- @include bp-up("extra-large") {
129
- --md-comp-pane-margin: 24px;
130
- width: calc(100% - (2 * var(--md-comp-pane-margin)));
131
- margin-inline: var(--md-comp-pane-margin);
132
- gap: var(--md-comp-pane-gap);
114
+ @container (min-width: 840px) {
115
+ --_pane-columns: var(--_pane-expanded-columns);
116
+ --_pane-display: flex;
117
+ --_pane-divider: 1px;
118
+ }
119
+
120
+ @container (min-width: 1200px) {
121
+ --_pane-columns: var(--_pane-wide-columns);
133
122
  }
134
123
  }
135
124
 
@@ -140,49 +129,25 @@
140
129
  // 1. Supporting Pane Layout
141
130
  .supporting-pane-layout,
142
131
  .panes.supporting {
143
- @include bp-up("expanded") {
144
- grid-template-columns: 1fr var(--md-comp-pane-supporting-width);
145
- }
146
-
147
- @container (min-width: 840px) {
148
- grid-template-columns: 1fr var(--md-comp-pane-supporting-width);
149
- }
132
+ --_pane-expanded-columns: 1fr var(--md-comp-pane-supporting-width);
150
133
 
151
134
  // Leading supporting pane (.start / .left)
152
135
  &.start,
153
136
  &.left {
154
- @include bp-up("expanded") {
155
- grid-template-columns: var(--md-comp-pane-supporting-width) 1fr;
156
- }
157
-
158
- @container (min-width: 840px) {
159
- grid-template-columns: var(--md-comp-pane-supporting-width) 1fr;
160
- }
137
+ --_pane-expanded-columns: var(--md-comp-pane-supporting-width) 1fr;
161
138
  }
162
139
  }
163
140
 
164
141
  // 2. Equal / Proportional Pane Layout
165
142
  .panes.equal,
166
143
  .pane-layout.equal {
167
- @include bp-up("expanded") {
168
- grid-template-columns: 1fr 1fr;
169
- }
170
-
171
- @container (min-width: 840px) {
172
- grid-template-columns: 1fr 1fr;
173
- }
144
+ --_pane-expanded-columns: 1fr 1fr;
174
145
  }
175
146
 
176
147
  // 3. Three-Pane Layout (List + Primary Focus + Supporting)
177
148
  .panes.three-pane,
178
149
  .pane-layout.three-pane {
179
- @include bp-up("large") {
180
- grid-template-columns: var(--md-comp-pane-list-width) 1fr var(--md-comp-pane-supporting-width);
181
- }
182
-
183
- @container (min-width: 1200px) {
184
- grid-template-columns: var(--md-comp-pane-list-width) 1fr var(--md-comp-pane-supporting-width);
185
- }
150
+ --_pane-wide-columns: var(--md-comp-pane-list-width) 1fr var(--md-comp-pane-supporting-width);
186
151
  }
187
152
 
188
153
  // ---------------------------------------------------------------------------
@@ -220,13 +185,7 @@
220
185
  // ---------------------------------------------------------------------------
221
186
  :is(.panes, .pane-layout, .list-detail, .supporting-pane-layout):not(.separated, .floating) {
222
187
  > :is(.pane, .list-pane, .primary-pane, .detail-pane, .supporting-pane):not(:last-child) {
223
- @include bp-up("expanded") {
224
- border-inline-end: 1px solid var(--md-comp-pane-divider-color);
225
- }
226
-
227
- @container (min-width: 840px) {
228
- border-inline-end: 1px solid var(--md-comp-pane-divider-color);
229
- }
188
+ border-inline-end: var(--_pane-divider) solid var(--md-comp-pane-divider-color);
230
189
  }
231
190
  }
232
191
 
@@ -322,14 +281,27 @@
322
281
  }
323
282
 
324
283
  // Footer / Action Bar
284
+ > footer:not(:has(> nav:only-child)),
325
285
  > :is(footer, .pane-footer, nav:last-child) {
326
286
  display: flex;
287
+ flex-wrap: wrap;
327
288
  align-items: center;
328
289
  gap: 8px;
329
290
  flex: 0 0 auto;
330
291
  box-sizing: border-box;
331
292
  min-height: 56px;
293
+ margin: 0;
332
294
  padding: 8px 16px;
333
295
  border-block-start: 1px solid var(--md-comp-pane-divider-color);
296
+
297
+ > :is(button, a):not(.icon-button) {
298
+ min-width: 0;
299
+ max-width: 100%;
300
+ min-height: var(--md-comp-filled-button-container-height, 40px);
301
+ height: auto;
302
+ padding-block: 8px;
303
+ white-space: normal;
304
+ overflow-wrap: anywhere;
305
+ }
334
306
  }
335
307
  }
@@ -49,6 +49,10 @@
49
49
  -webkit-appearance: none;
50
50
  }
51
51
 
52
+ .progress:not(.circular) {
53
+ writing-mode: horizontal-tb;
54
+ }
55
+
52
56
  progress.progress {
53
57
  vertical-align: baseline;
54
58
 
@@ -75,7 +79,8 @@ progress.progress {
75
79
 
76
80
  .progress > .determinate {
77
81
  position: absolute;
78
- inset: 0 auto 0 0;
82
+ inset-block: 0;
83
+ inset-inline: 0 auto;
79
84
  width: var(--md-comp-progress-value, 0%);
80
85
  background-color: var(--md-comp-progress-indicator);
81
86
  transition: width 0.3s linear;
@@ -89,7 +94,8 @@ progress.progress {
89
94
  &::after {
90
95
  content: "";
91
96
  position: absolute;
92
- inset: 0 auto 0 0;
97
+ inset-block: 0;
98
+ inset-inline: 0 auto;
93
99
  width: var(--md-comp-progress-value, 0%);
94
100
  background-color: var(--md-comp-progress-indicator);
95
101
  transition: width 0.3s linear;
@@ -109,7 +115,8 @@ progress.progress:indeterminate {
109
115
  &::after {
110
116
  content: "";
111
117
  position: absolute;
112
- inset: 0 auto 0 0;
118
+ inset-block: 0;
119
+ inset-inline: 0 auto;
113
120
  background-color: var(--md-comp-progress-indicator);
114
121
  }
115
122
 
@@ -124,15 +131,15 @@ progress.progress:indeterminate {
124
131
  }
125
132
 
126
133
  @keyframes preloader-indeterminate {
127
- 0% { left: -35%; right: 100%; }
128
- 60% { left: 100%; right: -90%; }
129
- 100% { left: 100%; right: -90%; }
134
+ 0% { inset-inline-start: -35%; inset-inline-end: 100%; }
135
+ 60% { inset-inline-start: 100%; inset-inline-end: -90%; }
136
+ 100% { inset-inline-start: 100%; inset-inline-end: -90%; }
130
137
  }
131
138
 
132
139
  @keyframes preloader-indeterminate-short {
133
- 0% { left: -200%; right: 100%; }
134
- 60% { left: 107%; right: -8%; }
135
- 100% { left: 107%; right: -8%; }
140
+ 0% { inset-inline-start: -200%; inset-inline-end: 100%; }
141
+ 60% { inset-inline-start: 107%; inset-inline-end: -8%; }
142
+ 100% { inset-inline-start: 107%; inset-inline-end: -8%; }
136
143
  }
137
144
 
138
145
  // ---------------------------------------------------------------------------
@@ -183,14 +190,67 @@ progress.progress:indeterminate {
183
190
  to { transform: rotate(1turn); }
184
191
  }
185
192
 
186
- @media (prefers-reduced-motion: reduce) {
187
- .progress > .indeterminate,
188
- progress.progress:indeterminate,
189
- .progress:not(:is(progress)):not(:has(> .determinate, > .indeterminate)):not([style*="--md-comp-progress-value"]),
193
+ @media (forced-colors: active) {
194
+ .progress,
190
195
  .preloader {
196
+ forced-color-adjust: none;
197
+ }
198
+
199
+ .progress:not(.circular) {
200
+ background-color: Canvas;
201
+ outline: 1px solid CanvasText;
202
+ outline-offset: 1px;
203
+ }
204
+
205
+ .progress > .determinate,
206
+ .progress > .indeterminate::before,
207
+ .progress > .indeterminate::after,
208
+ .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate))::after,
209
+ progress.progress:indeterminate::before,
210
+ progress.progress:indeterminate::after {
211
+ background-color: CanvasText;
212
+ }
213
+
214
+ progress.progress::-webkit-progress-bar { background-color: Canvas; }
215
+ progress.progress::-webkit-progress-value { background-color: CanvasText; }
216
+ progress.progress::-moz-progress-bar { background-color: CanvasText; }
217
+ progress.progress:indeterminate::-webkit-progress-value { background-color: transparent; }
218
+ progress.progress:indeterminate::-moz-progress-bar {
219
+ background-color: CanvasText;
220
+ width: 40%;
221
+ }
222
+
223
+ :is(.preloader, .progress.circular) {
224
+ background: conic-gradient(CanvasText 0 90deg, transparent 90deg 360deg);
225
+
226
+ &.determinate {
227
+ background: conic-gradient(
228
+ CanvasText 0 var(--md-comp-progress-value, 0%),
229
+ GrayText var(--md-comp-progress-value, 0%)
230
+ );
231
+ }
232
+ }
233
+ }
234
+
235
+ @media (prefers-reduced-motion: reduce) {
236
+ .progress > .indeterminate::before,
237
+ .progress > .indeterminate::after,
238
+ .progress::after,
239
+ progress.progress:indeterminate::before,
240
+ progress.progress:indeterminate::after,
241
+ .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate)):not([style*="--md-comp-progress-value"])::after,
242
+ :is(.preloader, .progress.circular) {
191
243
  animation: none;
192
244
  }
193
245
 
246
+ .progress > .indeterminate::before,
247
+ .progress > .indeterminate::after,
248
+ progress.progress:indeterminate::before,
249
+ progress.progress:indeterminate::after,
250
+ .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate)):not([style*="--md-comp-progress-value"])::after {
251
+ width: 40%;
252
+ }
253
+
194
254
  .preloader {
195
255
  transform: none;
196
256
  }
@@ -3,17 +3,17 @@
3
3
  // Scrim (M3 Expressive). A foundation, not a component: there is no markup an
4
4
  // author writes to get one. It is the wash a modal surface puts behind itself
5
5
  // to dim what it covers, and this is the one place its value is decided -
6
- // dialogs, both sheets, the navigation drawer and the modal navigation rail
6
+ // dialogs, both sheets, and the modal navigation rail
7
7
  // all consume the same custom property - the sheets through the
8
8
  // `dialog::backdrop` rule they already share, so they declare nothing.
9
9
  //
10
10
  // https://m3.material.io/styles/color/roles - the `scrim` role, at 32%.
11
11
  //
12
12
  // Blur is deliberately not part of it. Only the basic dialog frosts what is
13
- // behind it (`--md-comp-basic-dialog-scrim-blur`); the drawer and the rail
14
- // slide over the page and would smear it.
13
+ // behind it (`--md-comp-basic-dialog-scrim-blur`); the rail slides over the
14
+ // page and would smear it.
15
15
  //
16
- // Declared on :root rather than per surface because four of the five consumers
16
+ // Declared on :root rather than per surface because the modal consumers
17
17
  // paint into `::backdrop`, which has no box of its own to hang a token on -
18
18
  // only the rail uses a `::before`. `::backdrop` inherits from the element it
19
19
  // belongs to, so setting this on one `<dialog>` still dims only that one.
@@ -59,8 +59,9 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
59
59
  }
60
60
 
61
61
  &:modal {
62
- border-radius: var(--md-comp-side-sheet-container-shape) 0 0
63
- var(--md-comp-side-sheet-container-shape);
62
+ border-radius: 0;
63
+ border-start-start-radius: var(--md-comp-side-sheet-container-shape);
64
+ border-end-start-radius: var(--md-comp-side-sheet-container-shape);
64
65
  @include z-depth("1");
65
66
  }
66
67
 
@@ -82,8 +83,10 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
82
83
  }
83
84
 
84
85
  &:modal {
85
- border-radius: 0 var(--md-comp-side-sheet-container-shape)
86
- var(--md-comp-side-sheet-container-shape) 0;
86
+ border-start-start-radius: 0;
87
+ border-end-start-radius: 0;
88
+ border-start-end-radius: var(--md-comp-side-sheet-container-shape);
89
+ border-end-end-radius: var(--md-comp-side-sheet-container-shape);
87
90
  }
88
91
  }
89
92
 
@@ -95,7 +98,8 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
95
98
  box-sizing: border-box;
96
99
  min-height: 64px;
97
100
  margin: 0;
98
- padding: 8px 12px 8px 24px;
101
+ padding-block: 8px;
102
+ padding-inline: 24px 12px;
99
103
  background: none;
100
104
  box-shadow: none;
101
105
  }
@@ -155,6 +159,7 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
155
159
  }
156
160
 
157
161
  > :is(form, nav):last-child {
162
+ flex-wrap: wrap;
158
163
  justify-content: flex-start;
159
164
  gap: 8px;
160
165
  padding: 16px 24px;
@@ -174,15 +179,20 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
174
179
  }
175
180
 
176
181
  @starting-style {
177
- dialog.side-sheet[open],
178
- dialog.right[open],
179
- dialog.right-sheet[open] {
182
+ :is(#{$_sheet})[open] {
180
183
  translate: 100% 0;
181
- }
182
184
 
183
- dialog.left[open],
184
- dialog.left-sheet[open] {
185
- translate: -100% 0;
185
+ &:dir(rtl) {
186
+ translate: -100% 0;
187
+ }
188
+
189
+ &:is(.start, .left, .left-sheet) {
190
+ translate: -100% 0;
191
+
192
+ &:dir(rtl) {
193
+ translate: 100% 0;
194
+ }
195
+ }
186
196
  }
187
197
  }
188
198
 
@@ -47,9 +47,6 @@
47
47
  //
48
48
  // Do not show a toolbar at the same time as nav.navigation-bar.
49
49
  //
50
- // #{$_toolbar} only - do not style every <nav>. div.fixed-action-btn.toolbar
51
- // is the FAB-to-toolbar transition, not this component.
52
-
53
50
  // The host. A toolbar holds commands, not destinations, so it is not a <nav>
54
51
  // (rule 4) - and not role="toolbar" either, because that is a composite role
55
52
  // promising arrow-key navigation nothing here implements (rule 2). The <nav>
@@ -58,7 +55,7 @@
58
55
  // Wrapped in :is() so it stays one compound selector: interpolating a bare
59
56
  // comma-separated list breaks out of its context. That mistake shipped once
60
57
  // already, in $_bar.
61
- $_toolbar: ":is(nav.toolbar, .toolbar:not(.fixed-action-btn):not(.fab))";
58
+ $_toolbar: ".toolbar";
62
59
 
63
60
  // The two axes. `.max` is BeerCSS's name for docked; `.filled` is the older
64
61
  // name for vibrant. Both stay in the :is() lists.
@@ -37,8 +37,9 @@
37
37
  color: var(--md-comp-plain-tooltip-supporting-text-color);
38
38
  @include typescale("body-small");
39
39
  text-align: center;
40
- white-space: nowrap;
41
- pointer-events: none;
40
+ white-space: normal;
41
+ overflow-wrap: anywhere;
42
+ pointer-events: auto;
42
43
  z-index: 2000;
43
44
  }
44
45
 
@@ -159,3 +160,20 @@ body > .tooltip {
159
160
  box-shadow: none;
160
161
  }
161
162
  }
163
+
164
+ .tooltip::before {
165
+ content: "";
166
+ position: absolute;
167
+ inset: calc(-1 * var(--md-comp-tooltip-anchor-gap));
168
+ z-index: -1;
169
+ }
170
+
171
+ @media (prefers-reduced-motion: reduce) {
172
+ :not(body) > .tooltip {
173
+ transition: none;
174
+ }
175
+ }
176
+
177
+ .tooltip-content {
178
+ min-width: 0;
179
+ }
@@ -45,7 +45,7 @@ $_text-inputs: "input:not([type]):not(.browser-default), input[type=text]:not(.b
45
45
  // .suffix to four of five is exactly the bug this variable prevents: the
46
46
  // leading icon inherited the label's position and sat at 16px with
47
47
  // pointer-events: none.
48
- $_not-label: ".supporting-text, .character-counter, .file-path, .caret, .prefix, .suffix";
48
+ $_not-label: ".supporting-text, .character-counter, .file-path, .caret, .prefix, .suffix, .chip";
49
49
 
50
50
  .field {
51
51
  --md-comp-filled-text-field-container-color: var(--md-sys-color-surface-container-highest);
@@ -295,6 +295,10 @@ textarea {
295
295
  }
296
296
  }
297
297
 
298
+ .autocomplete-status {
299
+ @include visually-hidden;
300
+ }
301
+
298
302
  .autocomplete-content {
299
303
  li {
300
304
  .highlight { color: var(--md-sys-color-on-surface); }
@@ -150,6 +150,7 @@ select.browser-default {
150
150
  overflow-wrap: anywhere;
151
151
  pointer-events: auto;
152
152
  @include typescale("body-small");
153
+ line-height: normal;
153
154
  }
154
155
 
155
156
  &:has(> i:first-of-type:not(.suffix):not(:last-child), > i.prefix, > .prefix) > label {