@expressivecss/expressive 0.14.1 → 0.15.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 (242) hide show
  1. package/CHANGELOG.md +88 -1
  2. package/README.md +1 -1
  3. package/dist/css/expressive.css +200 -241
  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/js/chunks/{chunk-4KMNFIFZ.mjs → chunk-33QVDDGR.mjs} +3 -3
  8. package/dist/js/chunks/{chunk-SPETGK25.mjs → chunk-45FER6RI.mjs} +5 -5
  9. package/dist/js/chunks/chunk-45FER6RI.mjs.map +7 -0
  10. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-5CEAOLUA.mjs} +11 -10
  11. package/dist/js/chunks/{chunk-GIW4K4SE.mjs.map → chunk-5CEAOLUA.mjs.map} +2 -2
  12. package/dist/js/chunks/{chunk-LRZMJZ3T.mjs → chunk-6VATUZC6.mjs} +10 -6
  13. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +7 -0
  14. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-74MXKKLN.mjs} +2 -2
  15. package/dist/js/chunks/{chunk-QDAL4IYN.mjs.map → chunk-74MXKKLN.mjs.map} +2 -2
  16. package/dist/js/chunks/{chunk-CUQPB25U.mjs → chunk-AIURVCG6.mjs} +3 -3
  17. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-BGZLF6JZ.mjs} +16 -16
  18. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +7 -0
  19. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-C6CHEWYP.mjs} +2 -2
  20. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-CK2XCICY.mjs} +2 -2
  21. package/dist/js/chunks/{chunk-KY6U46SM.mjs → chunk-CXXM2L4F.mjs} +8 -9
  22. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +7 -0
  23. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-DXGRXYYL.mjs} +25 -37
  24. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +7 -0
  25. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-FM5CZOUB.mjs} +3 -7
  26. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs.map → chunk-FM5CZOUB.mjs.map} +2 -2
  27. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-GJL6GCIU.mjs} +34 -55
  28. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +7 -0
  29. package/dist/js/chunks/chunk-K3HZMFMD.mjs +135 -0
  30. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +7 -0
  31. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-KHXZ2A4K.mjs} +12 -15
  32. package/dist/js/chunks/{chunk-TBM3FT7G.mjs.map → chunk-KHXZ2A4K.mjs.map} +2 -2
  33. package/dist/js/chunks/chunk-KQACNQ22.mjs +7 -0
  34. package/dist/js/chunks/{chunk-KBNN3QDH.mjs.map → chunk-KQACNQ22.mjs.map} +1 -1
  35. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-KUFHW3DS.mjs} +2 -2
  36. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-KVJAVDBC.mjs} +7 -15
  37. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-L27Q6ZMI.mjs} +2 -2
  39. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-LQWUDNHZ.mjs} +3 -3
  40. package/dist/js/chunks/{chunk-MNPROCZF.mjs → chunk-M372EDXD.mjs} +4 -10
  41. package/dist/js/chunks/chunk-M372EDXD.mjs.map +7 -0
  42. package/dist/js/chunks/{chunk-YMSXJON6.mjs → chunk-M3MURWMB.mjs} +15 -12
  43. package/dist/js/chunks/{chunk-YMSXJON6.mjs.map → chunk-M3MURWMB.mjs.map} +2 -2
  44. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-NUHMOAOY.mjs} +18 -33
  45. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +7 -0
  46. package/dist/js/chunks/{chunk-VGZSAFTX.mjs → chunk-OWG3LMUL.mjs} +7 -11
  47. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +7 -0
  48. package/dist/js/chunks/{chunk-LTWPGFBR.mjs → chunk-PD6HYHAE.mjs} +4 -15
  49. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-PDG64UHF.mjs} +3 -3
  51. package/dist/js/chunks/{chunk-QERLECVU.mjs → chunk-PO3AXVR3.mjs} +38 -64
  52. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +7 -0
  53. package/dist/js/chunks/{chunk-ILP3PDTL.mjs → chunk-QYGK36OG.mjs} +7 -13
  54. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +7 -0
  55. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-SFI2U4YW.mjs} +28 -44
  56. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +7 -0
  57. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SMY7GJSS.mjs} +3 -3
  58. package/dist/js/chunks/{chunk-O5XPWXIQ.mjs → chunk-TCCA2HDG.mjs} +39 -31
  59. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +7 -0
  60. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-TSZYSW7F.mjs} +4 -4
  61. package/dist/js/chunks/{chunk-PM655FXL.mjs.map → chunk-TSZYSW7F.mjs.map} +2 -2
  62. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-UAZSDUVP.mjs} +3 -4
  63. package/dist/js/chunks/{chunk-UEZUJQ66.mjs.map → chunk-UAZSDUVP.mjs.map} +2 -2
  64. package/dist/js/chunks/{chunk-6N2XAEFK.mjs → chunk-UBRZZWRA.mjs} +10 -8
  65. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +7 -0
  66. package/dist/js/chunks/{chunk-5BKHWHYY.mjs → chunk-UCOE7ZDL.mjs} +41 -46
  67. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-UETTGDLI.mjs} +3 -3
  69. package/dist/js/chunks/{chunk-RHRQKTTX.mjs → chunk-UNCRDLP6.mjs} +6 -9
  70. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +7 -0
  71. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-VGNYF6FB.mjs} +3 -6
  72. package/dist/js/chunks/{chunk-GUB3TNO2.mjs.map → chunk-VGNYF6FB.mjs.map} +2 -2
  73. package/dist/js/chunks/{chunk-X7OCHZVF.mjs → chunk-VGPGBNGL.mjs} +4 -12
  74. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +7 -0
  75. package/dist/js/chunks/chunk-VKAUVTQY.mjs +1 -0
  76. package/dist/js/chunks/{chunk-HKT2S7VM.mjs → chunk-VM4FTS7L.mjs} +3 -3
  77. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-WDK4T63U.mjs} +8 -11
  78. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-GZKEFWPM.mjs → chunk-WOCCTVUF.mjs} +38 -34
  80. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-QJABDLSD.mjs → chunk-WQYN5L4E.mjs} +11 -16
  82. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-X4ISMKE2.mjs} +2 -2
  84. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-XAEAEHIX.mjs} +6 -8
  85. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +7 -0
  86. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-ZX6M7SWO.mjs} +24 -24
  87. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +7 -0
  88. package/dist/js/expressive.cjs +484 -507
  89. package/dist/js/expressive.cjs.map +4 -4
  90. package/dist/js/expressive.js +484 -507
  91. package/dist/js/expressive.js.map +4 -4
  92. package/dist/js/expressive.min.js +10 -13
  93. package/dist/js/expressive.min.js.map +4 -4
  94. package/dist/js/expressive.mjs +54 -50
  95. package/dist/js/expressive.mjs.map +1 -1
  96. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  97. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  98. package/dist/js/internal/behaviors/forms.mjs +2 -2
  99. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  100. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  101. package/dist/js/internal/components/appBar.mjs +2 -2
  102. package/dist/js/internal/components/autocomplete.mjs +4 -4
  103. package/dist/js/internal/components/barChart.mjs +4 -4
  104. package/dist/js/internal/components/buttonGroup.mjs +2 -2
  105. package/dist/js/internal/components/buttons.mjs +3 -3
  106. package/dist/js/internal/components/cards.mjs +3 -3
  107. package/dist/js/internal/components/carousel.mjs +3 -3
  108. package/dist/js/internal/components/characterCounter.mjs +2 -2
  109. package/dist/js/internal/components/chips.mjs +5 -5
  110. package/dist/js/internal/components/columnChart.mjs +3 -3
  111. package/dist/js/internal/components/commandPalette.mjs +3 -3
  112. package/dist/js/internal/components/confetti.mjs +2 -2
  113. package/dist/js/internal/components/datepicker.mjs +6 -6
  114. package/dist/js/internal/components/expandingCard.mjs +3 -3
  115. package/dist/js/internal/components/heatmapChart.mjs +3 -3
  116. package/dist/js/internal/components/index.mjs +47 -43
  117. package/dist/js/internal/components/keypad.mjs +9 -0
  118. package/dist/js/internal/components/keypad.mjs.map +7 -0
  119. package/dist/js/internal/components/lightbox.mjs +3 -3
  120. package/dist/js/internal/components/lineChart.mjs +6 -2
  121. package/dist/js/internal/components/mapView.mjs +3 -3
  122. package/dist/js/internal/components/menu.mjs +3 -3
  123. package/dist/js/internal/components/messageScroller.mjs +3 -3
  124. package/dist/js/internal/components/mixedChart.mjs +4 -4
  125. package/dist/js/internal/components/navigationRail.mjs +2 -2
  126. package/dist/js/internal/components/particles.mjs +2 -2
  127. package/dist/js/internal/components/pieChart.mjs +3 -3
  128. package/dist/js/internal/components/questionnaire.mjs +3 -3
  129. package/dist/js/internal/components/radarChart.mjs +3 -3
  130. package/dist/js/internal/components/radialChart.mjs +3 -3
  131. package/dist/js/internal/components/registry.mjs +41 -40
  132. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  133. package/dist/js/internal/components/scrollspy.mjs +2 -2
  134. package/dist/js/internal/components/select.mjs +4 -4
  135. package/dist/js/internal/components/slider.mjs +3 -3
  136. package/dist/js/internal/components/snackbar.mjs +2 -2
  137. package/dist/js/internal/components/tabs.mjs +4 -4
  138. package/dist/js/internal/components/timepicker.mjs +4 -4
  139. package/dist/js/internal/components/tooltip.mjs +3 -3
  140. package/dist/js/internal/core/component.mjs +1 -1
  141. package/dist/js/internal/core/utils.mjs +1 -1
  142. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  143. package/dist/js/modular.mjs +54 -50
  144. package/dist/types/components/autocomplete.d.ts +1 -0
  145. package/dist/types/components/datepicker.d.ts +3 -4
  146. package/dist/types/components/expandingCard.d.ts +2 -0
  147. package/dist/types/components/index.d.ts +1 -0
  148. package/dist/types/components/keypad.d.ts +34 -0
  149. package/dist/types/components/lightbox.d.ts +3 -5
  150. package/dist/types/components/lineChart.d.ts +4 -0
  151. package/dist/types/components/menu.d.ts +1 -0
  152. package/dist/types/components/radialChart.d.ts +0 -1
  153. package/dist/types/components/registry.d.ts +4 -0
  154. package/dist/types/components/slider.d.ts +2 -0
  155. package/dist/types/components/snackbar.d.ts +1 -0
  156. package/dist/types/components/tabs.d.ts +4 -0
  157. package/dist/types/components/timepicker.d.ts +2 -0
  158. package/dist/types/modular.d.ts +1 -1
  159. package/dist/types/plugins/dockedDisplayPlugin.d.ts +1 -0
  160. package/package.json +1 -1
  161. package/src/sass/abstracts/_breakpoints.scss +0 -1
  162. package/src/sass/abstracts/_elevation.scss +1 -1
  163. package/src/sass/abstracts/_mixins.scss +20 -60
  164. package/src/sass/abstracts/_variables.scss +10 -0
  165. package/src/sass/base/_global.scss +3 -12
  166. package/src/sass/base/_index.scss +1 -1
  167. package/src/sass/components/_badges.scss +1 -8
  168. package/src/sass/components/_bar-chart.scss +1 -1
  169. package/src/sass/components/_button-groups.scss +31 -66
  170. package/src/sass/components/_cards.scss +6 -25
  171. package/src/sass/components/_carousel.scss +16 -55
  172. package/src/sass/components/_chips.scss +0 -6
  173. package/src/sass/components/_column-chart.scss +1 -1
  174. package/src/sass/components/_data-table.scss +1 -3
  175. package/src/sass/components/_datepicker.scss +3 -22
  176. package/src/sass/components/_dialog.scss +1 -4
  177. package/src/sass/components/_heatmap-chart.scss +2 -2
  178. package/src/sass/components/_icon-buttons.scss +0 -1
  179. package/src/sass/components/_index.scss +1 -0
  180. package/src/sass/components/_keypad.scss +162 -0
  181. package/src/sass/components/_lightbox.scss +3 -8
  182. package/src/sass/components/_map.scss +2 -2
  183. package/src/sass/components/_menu.scss +31 -74
  184. package/src/sass/components/_mixed-chart.scss +1 -1
  185. package/src/sass/components/_navbar.scss +9 -45
  186. package/src/sass/components/_navigation-rail.scss +23 -32
  187. package/src/sass/components/_page-footer.scss +15 -12
  188. package/src/sass/components/_panes.scss +2 -6
  189. package/src/sass/components/_progress.scss +6 -4
  190. package/src/sass/components/_side-sheet.scss +1 -4
  191. package/src/sass/components/_stepper.scss +0 -4
  192. package/src/sass/components/_timepicker.scss +4 -36
  193. package/src/sass/components/_toolbar.scss +0 -4
  194. package/src/sass/components/forms/_checkboxes.scss +37 -65
  195. package/src/sass/components/forms/_fieldset.scss +3 -3
  196. package/src/sass/components/forms/_file-input.scss +0 -1
  197. package/src/sass/components/forms/_radio-buttons.scss +10 -36
  198. package/src/sass/components/forms/_select.scss +0 -3
  199. package/src/sass/components/forms/_slider.scss +72 -259
  200. package/src/sass/tokens/_state.scss +2 -2
  201. package/src/sass/tokens/_theme.scss +1 -1
  202. package/src/sass/utilities/_colors.scss +6 -1
  203. package/src/sass/utilities/_index.scss +1 -1
  204. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  205. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  206. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  207. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  208. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  209. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  210. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  211. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  212. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  213. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  214. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  215. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  216. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  217. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  218. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  219. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  220. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  221. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  222. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  223. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  224. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  225. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  226. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  227. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  228. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  229. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  230. /package/dist/js/chunks/{chunk-4KMNFIFZ.mjs.map → chunk-33QVDDGR.mjs.map} +0 -0
  231. /package/dist/js/chunks/{chunk-CUQPB25U.mjs.map → chunk-AIURVCG6.mjs.map} +0 -0
  232. /package/dist/js/chunks/{chunk-BG6ZRB5H.mjs.map → chunk-C6CHEWYP.mjs.map} +0 -0
  233. /package/dist/js/chunks/{chunk-GVGT6MIU.mjs.map → chunk-CK2XCICY.mjs.map} +0 -0
  234. /package/dist/js/chunks/{chunk-UEXCIMJZ.mjs.map → chunk-KUFHW3DS.mjs.map} +0 -0
  235. /package/dist/js/chunks/{chunk-YDCS5S3J.mjs.map → chunk-L27Q6ZMI.mjs.map} +0 -0
  236. /package/dist/js/chunks/{chunk-NS2UMNZV.mjs.map → chunk-LQWUDNHZ.mjs.map} +0 -0
  237. /package/dist/js/chunks/{chunk-ZAS25YFD.mjs.map → chunk-PDG64UHF.mjs.map} +0 -0
  238. /package/dist/js/chunks/{chunk-FS7XY3HT.mjs.map → chunk-SMY7GJSS.mjs.map} +0 -0
  239. /package/dist/js/chunks/{chunk-4TKTLGEM.mjs.map → chunk-UETTGDLI.mjs.map} +0 -0
  240. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-VKAUVTQY.mjs.map} +0 -0
  241. /package/dist/js/chunks/{chunk-HKT2S7VM.mjs.map → chunk-VM4FTS7L.mjs.map} +0 -0
  242. /package/dist/js/chunks/{chunk-DAIU5SLG.mjs.map → chunk-X4ISMKE2.mjs.map} +0 -0
@@ -28,6 +28,13 @@
28
28
 
29
29
  $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='black' d='M10 6l6 6-6 6'/%3E%3C/svg%3E");
30
30
 
31
+ // Item states, interpolated after `li`. An item is any <li> that is not a
32
+ // divider, optgroup, gap or label; an enabled item is also not disabled.
33
+ $_item: ":not(.divider, .optgroup, .gap, .label)";
34
+ $_enabled: ':not(.disabled, [aria-disabled="true"], .divider, .optgroup, .gap, .label)';
35
+ $_selected: ':is(.selected, [aria-selected="true"], [aria-checked="true"])';
36
+ $_unselected: ':not(.selected, [aria-selected="true"], [aria-checked="true"])';
37
+
31
38
  [popover] {
32
39
  outline: none;
33
40
  padding: 0;
@@ -188,7 +195,8 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
188
195
  // butted against the label instead of flush right.
189
196
  //
190
197
  // Leading stays the default; a trailing icon names its side, the same way
191
- // a field icon must (see rule 3 in CLAUDE.md).
198
+ // a field icon must (see rule 3 under "HTML semantics" in
199
+ // docs/development-notes.md).
192
200
  > :is(a, button) > #{$icon}:is(.suffix, :last-child:not(:only-child)) {
193
201
  margin-inline-start: auto;
194
202
  color: var(--md-comp-menu-item-trailing-icon-color);
@@ -209,33 +217,26 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
209
217
  }
210
218
  }
211
219
 
212
- > li:not(.divider, .optgroup, .gap, .label) {
220
+ > li#{$_item} {
213
221
  min-height: var(--md-comp-menu-item-container-height);
214
222
  }
215
223
 
216
- > li:not(.divider, .optgroup, .gap, .label):first-child {
224
+ > li#{$_item}:first-child {
217
225
  border-radius: var(--md-comp-menu-item-edge-shape)
218
226
  var(--md-comp-menu-item-edge-shape)
219
227
  var(--md-comp-menu-item-container-shape)
220
228
  var(--md-comp-menu-item-container-shape);
221
229
  }
222
230
 
223
- > li:not(.divider, .optgroup, .gap, .label):last-child {
231
+ > li#{$_item}:last-child {
224
232
  border-radius: var(--md-comp-menu-item-container-shape)
225
233
  var(--md-comp-menu-item-container-shape)
226
234
  var(--md-comp-menu-item-edge-shape) var(--md-comp-menu-item-edge-shape);
227
235
  }
228
236
 
229
237
  // Hover / press sit on extra-small corners and do not span the container.
230
- > li:not(
231
- .disabled,
232
- [aria-disabled="true"],
233
- .divider,
234
- .optgroup,
235
- .gap,
236
- .label
237
- ):hover,
238
- > li.active:not(.selected, [aria-selected="true"], [aria-checked="true"]) {
238
+ > li#{$_enabled}:hover,
239
+ > li.active#{$_unselected} {
239
240
  background-color: color-mix(
240
241
  in oklab,
241
242
  var(--md-comp-menu-item-label-text-color) 8%,
@@ -243,14 +244,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
243
244
  );
244
245
  }
245
246
 
246
- > li:not(
247
- .disabled,
248
- [aria-disabled="true"],
249
- .divider,
250
- .optgroup,
251
- .gap,
252
- .label
253
- ):active {
247
+ > li#{$_enabled}:active {
254
248
  background-color: color-mix(
255
249
  in oklab,
256
250
  var(--md-comp-menu-item-label-text-color) 10%,
@@ -261,9 +255,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
261
255
  // :not(.divider) only buys specificity: menu-item.selected.shape is 12dp
262
256
  // unconditionally, so it has to outrank the first/last-child edge rule that
263
257
  // would otherwise leave a selected end item with 4dp inner corners.
264
- > li:is(.selected, [aria-selected="true"], [aria-checked="true"]):not(
265
- .divider
266
- ) {
258
+ > li#{$_selected}:not(.divider) {
267
259
  border-radius: var(--md-comp-menu-item-selected-container-shape);
268
260
  background-color: var(--md-comp-menu-item-selected-container-color);
269
261
  color: var(--md-comp-menu-item-selected-label-text-color);
@@ -282,7 +274,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
282
274
  }
283
275
  }
284
276
 
285
- > li:is(.selected, [aria-selected="true"], [aria-checked="true"]):hover {
277
+ > li#{$_selected}:hover {
286
278
  background-color: color-mix(
287
279
  in oklab,
288
280
  var(--md-comp-menu-item-selected-label-text-color) 8%,
@@ -290,11 +282,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
290
282
  );
291
283
  }
292
284
 
293
- > li:is(.selected, [aria-selected="true"], [aria-checked="true"]):is(
294
- :focus,
295
- :focus-visible,
296
- :active
297
- ) {
285
+ > li#{$_selected}:is(:focus, :focus-visible, :active) {
298
286
  background-color: color-mix(
299
287
  in oklab,
300
288
  var(--md-comp-menu-item-selected-label-text-color) 10%,
@@ -365,21 +353,21 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
365
353
  // blur the menu itself. Grouped menus stay solid.
366
354
  backdrop-filter: none;
367
355
 
368
- > li:not(.divider, .optgroup, .gap, .label) {
356
+ > li#{$_item} {
369
357
  padding-inline: var(--md-comp-menu-group-padding);
370
358
  background-color: var(--md-comp-menu-container-color);
371
359
  border-radius: 0;
372
360
  }
373
361
 
374
- > li:not(.divider, .optgroup, .gap, .label):first-child,
375
- > li.gap + li:not(.divider, .optgroup, .gap, .label) {
362
+ > li#{$_item}:first-child,
363
+ > li.gap + li#{$_item} {
376
364
  padding-block-start: var(--md-comp-menu-group-padding);
377
365
  border-start-start-radius: var(--md-comp-menu-group-shape);
378
366
  border-start-end-radius: var(--md-comp-menu-group-shape);
379
367
  }
380
368
 
381
- > li:not(.divider, .optgroup, .gap, .label):has(+ li.gap),
382
- > li:not(.divider, .optgroup, .gap, .label):last-child {
369
+ > li#{$_item}:has(+ li.gap),
370
+ > li#{$_item}:last-child {
383
371
  padding-block-end: var(--md-comp-menu-group-padding);
384
372
  border-end-start-radius: var(--md-comp-menu-group-shape);
385
373
  border-end-end-radius: var(--md-comp-menu-group-shape);
@@ -390,14 +378,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
390
378
  }
391
379
 
392
380
  // State layers belong to the inset item while the group surface remains.
393
- > li:not(
394
- .disabled,
395
- [aria-disabled="true"],
396
- .divider,
397
- .optgroup,
398
- .gap,
399
- .label
400
- ):hover,
381
+ > li#{$_enabled}:hover,
401
382
  > li.active,
402
383
  > li.selected,
403
384
  > li[aria-selected="true"],
@@ -405,16 +386,9 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
405
386
  background-color: var(--md-comp-menu-container-color);
406
387
  }
407
388
 
408
- > li:not(
409
- .disabled,
410
- [aria-disabled="true"],
411
- .divider,
412
- .optgroup,
413
- .gap,
414
- .label
415
- ):hover
389
+ > li#{$_enabled}:hover
416
390
  > :is(a, button, #{$icon-label}),
417
- > li.active:not(.selected, [aria-selected="true"], [aria-checked="true"])
391
+ > li.active#{$_unselected}
418
392
  > :is(a, button, #{$icon-label}) {
419
393
  border-radius: var(--md-comp-menu-item-container-shape);
420
394
  background-color: color-mix(
@@ -424,14 +398,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
424
398
  );
425
399
  }
426
400
 
427
- > li:not(
428
- .disabled,
429
- [aria-disabled="true"],
430
- .divider,
431
- .optgroup,
432
- .gap,
433
- .label
434
- ):active
401
+ > li#{$_enabled}:active
435
402
  > :is(a, button, #{$icon-label}) {
436
403
  background-color: color-mix(
437
404
  in oklab,
@@ -440,13 +407,13 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
440
407
  );
441
408
  }
442
409
 
443
- > li:is(.selected, [aria-selected="true"], [aria-checked="true"])
410
+ > li#{$_selected}
444
411
  > :is(a, button, #{$icon-label}) {
445
412
  border-radius: var(--md-comp-menu-item-selected-container-shape);
446
413
  background-color: var(--md-comp-menu-item-selected-container-color);
447
414
  }
448
415
 
449
- > li:is(.selected, [aria-selected="true"], [aria-checked="true"]):hover
416
+ > li#{$_selected}:hover
450
417
  > :is(a, button, #{$icon-label}) {
451
418
  background-color: color-mix(
452
419
  in oklab,
@@ -455,11 +422,7 @@ $_menu-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg
455
422
  );
456
423
  }
457
424
 
458
- > li:is(.selected, [aria-selected="true"], [aria-checked="true"]):is(
459
- :focus,
460
- :focus-visible,
461
- :active
462
- )
425
+ > li#{$_selected}:is(:focus, :focus-visible, :active)
463
426
  > :is(a, button, #{$icon-label}) {
464
427
  background-color: color-mix(
465
428
  in oklab,
@@ -576,18 +539,12 @@ menu[id] > li:focus-visible {
576
539
  );
577
540
  }
578
541
 
579
- menu[id]
580
- > li:focus-visible:not(.selected, [aria-selected="true"], [aria-checked="true"]) {
581
- outline: 3px solid var(--md-sys-color-secondary);
582
- outline-offset: -3px;
583
- }
584
-
585
542
  menu[id].grouped > li:focus-visible {
586
543
  background-color: var(--md-comp-menu-container-color);
587
544
  }
588
545
 
589
546
  menu[id].grouped
590
- > li:focus-visible:not(.selected, [aria-selected="true"], [aria-checked="true"])
547
+ > li:focus-visible#{$_unselected}
591
548
  > :is(a, button, span:not(.material-symbols, .badge, .supporting-text)) {
592
549
  border-radius: var(--md-comp-menu-item-container-shape);
593
550
  background-color: color-mix(
@@ -125,7 +125,7 @@
125
125
  inset: 0;
126
126
  z-index: -1;
127
127
  border-radius: var(--md-comp-mixed-chart-shape);
128
- background-color: color-mix(in srgb, var(--md-sys-color-on-surface) state-opacity("hover"), transparent);
128
+ background-color: color-mix(in oklab, var(--md-sys-color-on-surface) state-opacity("hover"), transparent);
129
129
  }
130
130
 
131
131
  > span {
@@ -107,11 +107,7 @@ header:has(> #{$_bar}) {
107
107
  > #{$_bar} > hgroup > #{$_heading} {
108
108
  margin: 0;
109
109
  color: inherit;
110
- font-family: var(--md-sys-typescale-title-large-font-family-name);
111
- font-size: var(--md-sys-typescale-title-large-font-size);
112
- font-weight: var(--md-sys-typescale-title-large-font-weight);
113
- line-height: var(--md-sys-typescale-title-large-line-height);
114
- letter-spacing: var(--md-sys-typescale-title-large-letter-spacing);
110
+ @include typescale("title-large");
115
111
  }
116
112
 
117
113
  > #{$_bar} > hgroup {
@@ -126,11 +122,7 @@ header:has(> #{$_bar}) {
126
122
  > #{$_bar} > hgroup > p {
127
123
  margin: 0;
128
124
  color: inherit;
129
- font-family: var(--md-sys-typescale-label-medium-font-family-name);
130
- font-size: var(--md-sys-typescale-label-medium-font-size);
131
- font-weight: var(--md-sys-typescale-label-medium-font-weight);
132
- line-height: var(--md-sys-typescale-label-medium-line-height);
133
- letter-spacing: var(--md-sys-typescale-label-medium-letter-spacing);
125
+ @include typescale("label-medium");
134
126
  }
135
127
 
136
128
  // Icon-only actions — 48dp target, 24dp glyph, 4dp from the container edge.
@@ -281,11 +273,7 @@ header:has(> #{$_bar}) {
281
273
  padding: 0 12px;
282
274
  color: inherit;
283
275
  text-decoration: none;
284
- font-family: var(--md-sys-typescale-label-large-font-family-name);
285
- font-size: var(--md-sys-typescale-label-large-font-size);
286
- font-weight: var(--md-sys-typescale-label-large-font-weight);
287
- line-height: var(--md-sys-typescale-label-large-line-height);
288
- letter-spacing: var(--md-sys-typescale-label-large-letter-spacing);
276
+ @include typescale("label-large");
289
277
  @include focus-visible;
290
278
 
291
279
  &:hover:not(.active) {
@@ -378,19 +366,11 @@ header.medium:has(> #{$_bar}) > #{$_bar} {
378
366
 
379
367
  > #{$_heading},
380
368
  > hgroup > #{$_heading} {
381
- font-family: var(--md-sys-typescale-headline-medium-font-family-name);
382
- font-size: var(--md-sys-typescale-headline-medium-font-size);
383
- font-weight: var(--md-sys-typescale-headline-medium-font-weight);
384
- line-height: var(--md-sys-typescale-headline-medium-line-height);
385
- letter-spacing: var(--md-sys-typescale-headline-medium-letter-spacing);
369
+ @include typescale("headline-medium");
386
370
  }
387
371
 
388
372
  > hgroup > p {
389
- font-family: var(--md-sys-typescale-label-large-font-family-name);
390
- font-size: var(--md-sys-typescale-label-large-font-size);
391
- font-weight: var(--md-sys-typescale-label-large-font-weight);
392
- line-height: var(--md-sys-typescale-label-large-line-height);
393
- letter-spacing: var(--md-sys-typescale-label-large-letter-spacing);
373
+ @include typescale("label-large");
394
374
  }
395
375
  }
396
376
 
@@ -408,19 +388,11 @@ header.large:has(> #{$_bar}) > #{$_bar} {
408
388
 
409
389
  > #{$_heading},
410
390
  > hgroup > #{$_heading} {
411
- font-family: var(--md-sys-typescale-display-small-font-family-name);
412
- font-size: var(--md-sys-typescale-display-small-font-size);
413
- font-weight: var(--md-sys-typescale-display-small-font-weight);
414
- line-height: var(--md-sys-typescale-display-small-line-height);
415
- letter-spacing: var(--md-sys-typescale-display-small-letter-spacing);
391
+ @include typescale("display-small");
416
392
  }
417
393
 
418
394
  > hgroup > p {
419
- font-family: var(--md-sys-typescale-title-medium-font-family-name);
420
- font-size: var(--md-sys-typescale-title-medium-font-size);
421
- font-weight: var(--md-sys-typescale-title-medium-font-weight);
422
- line-height: var(--md-sys-typescale-title-medium-line-height);
423
- letter-spacing: var(--md-sys-typescale-title-medium-letter-spacing);
395
+ @include typescale("title-medium");
424
396
  }
425
397
  }
426
398
 
@@ -473,20 +445,12 @@ header.large.collapsed:has(> #{$_bar}) > #{$_bar} {
473
445
  white-space: nowrap;
474
446
  overflow: hidden;
475
447
  text-overflow: ellipsis;
476
- font-family: var(--md-sys-typescale-title-large-font-family-name);
477
- font-size: var(--md-sys-typescale-title-large-font-size);
478
- font-weight: var(--md-sys-typescale-title-large-font-weight);
479
- line-height: var(--md-sys-typescale-title-large-line-height);
480
- letter-spacing: var(--md-sys-typescale-title-large-letter-spacing);
448
+ @include typescale("title-large");
481
449
  }
482
450
 
483
451
  > hgroup > p {
484
452
  padding: 0;
485
- font-family: var(--md-sys-typescale-label-medium-font-family-name);
486
- font-size: var(--md-sys-typescale-label-medium-font-size);
487
- font-weight: var(--md-sys-typescale-label-medium-font-weight);
488
- line-height: var(--md-sys-typescale-label-medium-line-height);
489
- letter-spacing: var(--md-sys-typescale-label-medium-letter-spacing);
453
+ @include typescale("label-medium");
490
454
  }
491
455
  }
492
456
 
@@ -29,6 +29,27 @@
29
29
  --md-comp-nav-rail-expanded-width: 280px;
30
30
  }
31
31
 
32
+ // Expanded rail as an overlay with a scrim.
33
+ @mixin _modal-rail {
34
+ position: fixed;
35
+ inset: 0 auto 0 0;
36
+ z-index: 998;
37
+ @include z-depth("1");
38
+
39
+ // A blurred rail would become the containing block of the fixed scrim
40
+ // below and clip it to the rail, so a modal rail stays solid.
41
+ background-color: var(--md-sys-color-surface-container);
42
+ backdrop-filter: none;
43
+
44
+ &::before {
45
+ content: "";
46
+ position: fixed;
47
+ inset: 0;
48
+ background-color: var(--md-comp-scrim-color);
49
+ z-index: -1;
50
+ }
51
+ }
52
+
32
53
  .navigation-rail {
33
54
  --md-comp-nav-rail-icon-size: 24px;
34
55
  --md-comp-nav-rail-indicator-width: 56px;
@@ -278,42 +299,12 @@
278
299
  }
279
300
 
280
301
  &.expanded.modal {
281
- position: fixed;
282
- inset: 0 auto 0 0;
283
- z-index: 998;
284
- @include z-depth("1");
285
-
286
- // A blurred rail would become the containing block of the fixed scrim
287
- // below and clip it to the rail, so a modal rail stays solid.
288
- background-color: var(--md-sys-color-surface-container);
289
- backdrop-filter: none;
290
-
291
- &::before {
292
- content: "";
293
- position: fixed;
294
- inset: 0;
295
- background-color: var(--md-comp-scrim-color);
296
- z-index: -1;
297
- }
302
+ @include _modal-rail;
298
303
  }
299
304
 
300
305
  @include bp-down("medium") {
301
306
  &.expanded:not(.modal) {
302
- position: fixed;
303
- inset: 0 auto 0 0;
304
- z-index: 998;
305
- @include z-depth("1");
306
-
307
- background-color: var(--md-sys-color-surface-container);
308
- backdrop-filter: none;
309
-
310
- &::before {
311
- content: "";
312
- position: fixed;
313
- inset: 0;
314
- background-color: var(--md-comp-scrim-color);
315
- z-index: -1;
316
- }
307
+ @include _modal-rail;
317
308
  }
318
309
  }
319
310
  }
@@ -17,7 +17,10 @@
17
17
  // Unfilled by default (dashed hairline). .filled uses surface-container.
18
18
  // There is no JavaScript.
19
19
 
20
- footer:not(:has(> .navigation-bar:only-child)) {
20
+ // Any footer except one wrapping a lone navigation bar.
21
+ $_footer: "footer:not(:has(> .navigation-bar:only-child))";
22
+
23
+ #{$_footer} {
21
24
  --md-comp-footer-padding-block: 3rem;
22
25
  --md-comp-footer-padding-inline: 1rem;
23
26
  --md-comp-footer-gap: 2rem;
@@ -54,16 +57,16 @@ footer:not(:has(> .navigation-bar:only-child)) {
54
57
  }
55
58
  }
56
59
 
57
- footer:not(:has(> nav:only-child)).filled,
58
- footer:not(:has(> nav:only-child)).surface {
60
+ #{$_footer}.filled,
61
+ #{$_footer}.surface {
59
62
  background-color: var(--md-sys-color-surface-container);
60
63
  border-top: 1px solid var(--md-sys-color-outline-variant);
61
64
  }
62
65
 
63
66
  // Columns: direct <nav> children. A wrapping .container is the grid
64
67
  // when the author uses one. Legacy .row still spans the full measure.
65
- footer:not(:has(> nav:only-child)) > .container,
66
- footer:not(:has(> nav:only-child)):not(:has(> .container)) {
68
+ #{$_footer} > .container,
69
+ #{$_footer}:not(:has(> .container)) {
67
70
  display: grid;
68
71
  gap: var(--md-comp-footer-gap);
69
72
  grid-template-columns: 1fr;
@@ -85,14 +88,14 @@ footer:not(:has(> nav:only-child)):not(:has(> .container)) {
85
88
  }
86
89
  }
87
90
 
88
- footer:not(:has(> nav:only-child)) > .container > .row,
89
- footer:not(:has(> nav:only-child)) > .row {
91
+ #{$_footer} > .container > .row,
92
+ #{$_footer} > .row {
90
93
  grid-column: 1 / -1;
91
94
  }
92
95
 
93
96
  // A column with no links is a <section>, not a <nav> - see rule 4. Both are
94
97
  // columns to look at.
95
- footer:not(:has(> nav:only-child)) :is(nav, section) {
98
+ #{$_footer} :is(nav, section) {
96
99
  display: flex;
97
100
  flex-direction: column;
98
101
  align-items: flex-start;
@@ -100,8 +103,8 @@ footer:not(:has(> nav:only-child)) :is(nav, section) {
100
103
  min-width: 0;
101
104
  }
102
105
 
103
- footer:not(:has(> nav:only-child)) nav > a:not(.button, .icon-button, .circle, .extra),
104
- footer:not(:has(> nav:only-child)) ul a:not(.button, .icon-button, .circle, .extra) {
106
+ #{$_footer} nav > a:not(.button, .icon-button, .circle, .extra),
107
+ #{$_footer} ul a:not(.button, .icon-button, .circle, .extra) {
105
108
  display: inline-flex;
106
109
  align-items: center;
107
110
  box-sizing: border-box;
@@ -119,8 +122,8 @@ footer:not(:has(> nav:only-child)) ul a:not(.button, .icon-button, .circle, .ext
119
122
  // The legal bar. `.container` is a supported columns wrapper - the rule above
120
123
  // already accounts for it - so the bar has to be found through it too, or a
121
124
  // footer written the documented way gets an unstyled copyright row.
122
- footer:not(:has(> nav:only-child)) > small:last-child,
123
- footer:not(:has(> nav:only-child)) > .container > small:last-child {
125
+ #{$_footer} > small:last-child,
126
+ #{$_footer} > .container > small:last-child {
124
127
  display: flex;
125
128
  flex-wrap: wrap;
126
129
  align-items: center;
@@ -169,7 +169,6 @@
169
169
  @include z-depth("0");
170
170
 
171
171
  &.elevated {
172
- background-color: var(--md-sys-color-surface-container-low);
173
172
  @include z-depth("1");
174
173
  }
175
174
 
@@ -255,10 +254,7 @@
255
254
  background-color: color-mix(in oklab, var(--md-sys-color-on-surface) state-opacity("hover"), transparent);
256
255
  }
257
256
 
258
- &:focus-visible {
259
- outline: 3px solid var(--md-sys-color-secondary);
260
- outline-offset: 2px;
261
- }
257
+ @include focus-visible;
262
258
  }
263
259
  }
264
260
 
@@ -281,7 +277,7 @@
281
277
  }
282
278
 
283
279
  // Footer / Action Bar
284
- > footer:not(:has(> nav:only-child)),
280
+ > footer:not(:has(> .navigation-bar:only-child)),
285
281
  > :is(footer, .pane-footer, nav:last-child) {
286
282
  display: flex;
287
283
  flex-wrap: wrap;
@@ -102,7 +102,9 @@ progress.progress {
102
102
  // `<span class="progress circular">` is not a <progress>, has no determinate
103
103
  // child, and so matched this too - drawing a linear fill on top of the conic
104
104
  // circular indicator.
105
- .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate)) {
105
+ $_bare: ".progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate))";
106
+
107
+ #{$_bare} {
106
108
  &::after {
107
109
  content: "";
108
110
  position: absolute;
@@ -219,7 +221,7 @@ progress.progress:indeterminate {
219
221
  .progress > .determinate,
220
222
  .progress > .indeterminate::before,
221
223
  .progress > .indeterminate::after,
222
- .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate))::after,
224
+ #{$_bare}::after,
223
225
  progress.progress:indeterminate::before,
224
226
  progress.progress:indeterminate::after {
225
227
  background-color: CanvasText;
@@ -253,7 +255,7 @@ progress.progress:indeterminate {
253
255
  .progress::after,
254
256
  progress.progress:indeterminate::before,
255
257
  progress.progress:indeterminate::after,
256
- .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate)):not([style*="--md-comp-progress-value"])::after,
258
+ #{$_bare}:not([style*="--md-comp-progress-value"])::after,
257
259
  :is(.preloader, .progress.circular) {
258
260
  animation: none;
259
261
  }
@@ -262,7 +264,7 @@ progress.progress:indeterminate {
262
264
  .progress > .indeterminate::after,
263
265
  progress.progress:indeterminate::before,
264
266
  progress.progress:indeterminate::after,
265
- .progress:not(:is(progress)):not(.circular):not(:has(> .determinate, > .indeterminate)):not([style*="--md-comp-progress-value"])::after {
267
+ #{$_bare}:not([style*="--md-comp-progress-value"])::after {
266
268
  width: 40%;
267
269
  }
268
270
 
@@ -153,10 +153,7 @@ $_sheet: "dialog.side-sheet, dialog.right, dialog.right-sheet, dialog.left, dial
153
153
  background-color: color-mix(in oklab, var(--md-sys-color-on-surface) state-opacity("hover"), transparent);
154
154
  }
155
155
 
156
- &:focus-visible {
157
- outline: 3px solid var(--md-sys-color-secondary);
158
- outline-offset: 2px;
159
- }
156
+ @include focus-visible;
160
157
  }
161
158
 
162
159
  > :is(form, nav):last-child {
@@ -166,10 +166,6 @@ $_stepper-alert: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/sv
166
166
  margin-block: 4px;
167
167
  }
168
168
 
169
- &:last-child::after {
170
- content: none;
171
- }
172
-
173
169
  > .stepper-content {
174
170
  grid-column: 2;
175
171
  grid-row: 3;