@expressivecss/expressive 0.13.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 (257) hide show
  1. package/CHANGELOG.md +196 -1
  2. package/README.md +2 -1
  3. package/dist/css/expressive.css +432 -311
  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-DTKR54I6.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-WJXDBPXQ.mjs → chunk-5CEAOLUA.mjs} +17 -20
  11. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +7 -0
  12. package/dist/js/chunks/{chunk-CKQP6P76.mjs → chunk-6VATUZC6.mjs} +12 -7
  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-DLWYKFEI.mjs → chunk-AIURVCG6.mjs} +3 -3
  17. package/dist/js/chunks/{chunk-NNYP33NB.mjs → chunk-BGZLF6JZ.mjs} +19 -18
  18. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +7 -0
  19. package/dist/js/chunks/chunk-C6CHEWYP.mjs +154 -0
  20. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +7 -0
  21. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-CK2XCICY.mjs} +2 -2
  22. package/dist/js/chunks/{chunk-XGHORT7J.mjs → chunk-CXXM2L4F.mjs} +8 -9
  23. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +7 -0
  24. package/dist/js/chunks/{chunk-QVVEWBOF.mjs → chunk-DXGRXYYL.mjs} +25 -37
  25. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +7 -0
  26. package/dist/js/chunks/{chunk-QV2JAWIZ.mjs → chunk-FM5CZOUB.mjs} +5 -8
  27. package/dist/js/chunks/{chunk-QV2JAWIZ.mjs.map → chunk-FM5CZOUB.mjs.map} +2 -2
  28. package/dist/js/chunks/{chunk-PLYXLSH3.mjs → chunk-GJL6GCIU.mjs} +46 -58
  29. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +7 -0
  30. package/dist/js/chunks/chunk-K3HZMFMD.mjs +135 -0
  31. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +7 -0
  32. package/dist/js/chunks/chunk-KHXZ2A4K.mjs +395 -0
  33. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +7 -0
  34. package/dist/js/chunks/chunk-KQACNQ22.mjs +7 -0
  35. package/dist/js/chunks/{chunk-4PWAPV6F.mjs.map → chunk-KQACNQ22.mjs.map} +1 -1
  36. package/dist/js/chunks/chunk-KUFHW3DS.mjs +214 -0
  37. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-LWBQIX5J.mjs → chunk-KVJAVDBC.mjs} +46 -57
  39. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +7 -0
  40. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-L27Q6ZMI.mjs} +2 -2
  41. package/dist/js/chunks/{chunk-CCWDV5CR.mjs → chunk-LQWUDNHZ.mjs} +3 -3
  42. package/dist/js/chunks/{chunk-6OMRGML6.mjs → chunk-M372EDXD.mjs} +7 -13
  43. package/dist/js/chunks/{chunk-6OMRGML6.mjs.map → chunk-M372EDXD.mjs.map} +2 -2
  44. package/dist/js/chunks/{chunk-EC63CHXU.mjs → chunk-M3MURWMB.mjs} +20 -16
  45. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +7 -0
  46. package/dist/js/chunks/{chunk-U2OTHOTI.mjs → chunk-NUHMOAOY.mjs} +19 -33
  47. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +7 -0
  48. package/dist/js/chunks/{chunk-P3G3QHII.mjs → chunk-OWG3LMUL.mjs} +17 -14
  49. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-LTWPGFBR.mjs → chunk-PD6HYHAE.mjs} +4 -15
  51. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +7 -0
  52. package/dist/js/chunks/{chunk-PIJ2TAR3.mjs → chunk-PDG64UHF.mjs} +3 -3
  53. package/dist/js/chunks/{chunk-IFXVDDDH.mjs → chunk-PO3AXVR3.mjs} +38 -64
  54. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +7 -0
  55. package/dist/js/chunks/{chunk-QKWPQK5N.mjs → chunk-QYGK36OG.mjs} +16 -14
  56. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +7 -0
  57. package/dist/js/chunks/{chunk-UNEMYWEW.mjs → chunk-SFI2U4YW.mjs} +28 -44
  58. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +7 -0
  59. package/dist/js/chunks/{chunk-VTLBW7QS.mjs → chunk-SMY7GJSS.mjs} +3 -3
  60. package/dist/js/chunks/{chunk-O5XPWXIQ.mjs → chunk-TCCA2HDG.mjs} +39 -31
  61. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +7 -0
  62. package/dist/js/chunks/{chunk-UBLRRJ7N.mjs → chunk-TSZYSW7F.mjs} +4 -4
  63. package/dist/js/chunks/{chunk-UBLRRJ7N.mjs.map → chunk-TSZYSW7F.mjs.map} +2 -2
  64. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-UAZSDUVP.mjs} +3 -4
  65. package/dist/js/chunks/{chunk-UEZUJQ66.mjs.map → chunk-UAZSDUVP.mjs.map} +2 -2
  66. package/dist/js/chunks/{chunk-6N2XAEFK.mjs → chunk-UBRZZWRA.mjs} +10 -8
  67. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-3VOK6J7U.mjs → chunk-UCOE7ZDL.mjs} +47 -45
  69. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +7 -0
  70. package/dist/js/chunks/{chunk-K4CJCRGE.mjs → chunk-UETTGDLI.mjs} +3 -3
  71. package/dist/js/chunks/{chunk-RHRQKTTX.mjs → chunk-UNCRDLP6.mjs} +6 -9
  72. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-LNCCYGPC.mjs → chunk-VGNYF6FB.mjs} +8 -10
  74. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-UAEAQBRC.mjs → chunk-VGPGBNGL.mjs} +4 -12
  76. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +7 -0
  77. package/dist/js/chunks/chunk-VKAUVTQY.mjs +1 -0
  78. package/dist/js/chunks/{chunk-HKT2S7VM.mjs → chunk-VM4FTS7L.mjs} +3 -3
  79. package/dist/js/chunks/{chunk-55IA2XUC.mjs → chunk-WDK4T63U.mjs} +8 -11
  80. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-XH6BEEMY.mjs → chunk-WOCCTVUF.mjs} +51 -39
  82. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-GZWPXXY6.mjs → chunk-WQYN5L4E.mjs} +14 -16
  84. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +7 -0
  85. package/dist/js/chunks/{chunk-6WLSDZ4O.mjs → chunk-X4ISMKE2.mjs} +2 -2
  86. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-XAEAEHIX.mjs} +6 -8
  87. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +7 -0
  88. package/dist/js/chunks/{chunk-3CLXLPYS.mjs → chunk-ZX6M7SWO.mjs} +43 -29
  89. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +7 -0
  90. package/dist/js/expressive.cjs +1337 -572
  91. package/dist/js/expressive.cjs.map +4 -4
  92. package/dist/js/expressive.js +1337 -572
  93. package/dist/js/expressive.js.map +4 -4
  94. package/dist/js/expressive.min.js +10 -13
  95. package/dist/js/expressive.min.js.map +4 -4
  96. package/dist/js/expressive.mjs +71 -55
  97. package/dist/js/expressive.mjs.map +1 -1
  98. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  99. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  100. package/dist/js/internal/behaviors/forms.mjs +2 -2
  101. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  102. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  103. package/dist/js/internal/components/appBar.mjs +2 -2
  104. package/dist/js/internal/components/autocomplete.mjs +4 -4
  105. package/dist/js/internal/components/barChart.mjs +4 -4
  106. package/dist/js/internal/components/buttonGroup.mjs +2 -2
  107. package/dist/js/internal/components/buttons.mjs +3 -3
  108. package/dist/js/internal/components/cards.mjs +3 -3
  109. package/dist/js/internal/components/carousel.mjs +3 -3
  110. package/dist/js/internal/components/characterCounter.mjs +2 -2
  111. package/dist/js/internal/components/chips.mjs +5 -5
  112. package/dist/js/internal/components/columnChart.mjs +3 -3
  113. package/dist/js/internal/components/commandPalette.mjs +3 -3
  114. package/dist/js/internal/components/confetti.mjs +8 -0
  115. package/dist/js/internal/components/confetti.mjs.map +7 -0
  116. package/dist/js/internal/components/datepicker.mjs +6 -6
  117. package/dist/js/internal/components/expandingCard.mjs +3 -3
  118. package/dist/js/internal/components/heatmapChart.mjs +3 -3
  119. package/dist/js/internal/components/index.mjs +64 -48
  120. package/dist/js/internal/components/keypad.mjs +9 -0
  121. package/dist/js/internal/components/keypad.mjs.map +7 -0
  122. package/dist/js/internal/components/lightbox.mjs +3 -3
  123. package/dist/js/internal/components/lineChart.mjs +6 -2
  124. package/dist/js/internal/components/mapView.mjs +9 -0
  125. package/dist/js/internal/components/mapView.mjs.map +7 -0
  126. package/dist/js/internal/components/menu.mjs +3 -3
  127. package/dist/js/internal/components/messageScroller.mjs +3 -3
  128. package/dist/js/internal/components/mixedChart.mjs +4 -4
  129. package/dist/js/internal/components/navigationRail.mjs +2 -2
  130. package/dist/js/internal/components/particles.mjs +8 -0
  131. package/dist/js/internal/components/particles.mjs.map +7 -0
  132. package/dist/js/internal/components/pieChart.mjs +3 -3
  133. package/dist/js/internal/components/questionnaire.mjs +3 -3
  134. package/dist/js/internal/components/radarChart.mjs +3 -3
  135. package/dist/js/internal/components/radialChart.mjs +3 -3
  136. package/dist/js/internal/components/registry.mjs +41 -37
  137. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  138. package/dist/js/internal/components/scrollspy.mjs +2 -2
  139. package/dist/js/internal/components/select.mjs +4 -4
  140. package/dist/js/internal/components/slider.mjs +3 -3
  141. package/dist/js/internal/components/snackbar.mjs +2 -2
  142. package/dist/js/internal/components/tabs.mjs +4 -4
  143. package/dist/js/internal/components/timepicker.mjs +4 -4
  144. package/dist/js/internal/components/tooltip.mjs +3 -3
  145. package/dist/js/internal/core/component.mjs +1 -1
  146. package/dist/js/internal/core/utils.mjs +1 -1
  147. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  148. package/dist/js/modular.mjs +71 -55
  149. package/dist/types/behaviors/forms.d.ts +5 -0
  150. package/dist/types/components/autocomplete.d.ts +1 -0
  151. package/dist/types/components/carousel.d.ts +2 -0
  152. package/dist/types/components/confetti.d.ts +103 -0
  153. package/dist/types/components/datepicker.d.ts +5 -4
  154. package/dist/types/components/expandingCard.d.ts +2 -0
  155. package/dist/types/components/index.d.ts +4 -0
  156. package/dist/types/components/keypad.d.ts +34 -0
  157. package/dist/types/components/lightbox.d.ts +3 -5
  158. package/dist/types/components/lineChart.d.ts +4 -0
  159. package/dist/types/components/mapView.d.ts +151 -0
  160. package/dist/types/components/menu.d.ts +1 -0
  161. package/dist/types/components/particles.d.ts +72 -0
  162. package/dist/types/components/pieChart.d.ts +3 -0
  163. package/dist/types/components/radialChart.d.ts +0 -1
  164. package/dist/types/components/registry.d.ts +12 -0
  165. package/dist/types/components/slider.d.ts +3 -1
  166. package/dist/types/components/snackbar.d.ts +3 -0
  167. package/dist/types/components/tabs.d.ts +5 -1
  168. package/dist/types/components/timepicker.d.ts +2 -0
  169. package/dist/types/modular.d.ts +1 -1
  170. package/dist/types/plugins/dockedDisplayPlugin.d.ts +4 -3
  171. package/package.json +2 -1
  172. package/src/sass/abstracts/_breakpoints.scss +0 -1
  173. package/src/sass/abstracts/_elevation.scss +1 -1
  174. package/src/sass/abstracts/_mixins.scss +20 -60
  175. package/src/sass/abstracts/_variables.scss +10 -0
  176. package/src/sass/base/_global.scss +3 -12
  177. package/src/sass/base/_index.scss +1 -1
  178. package/src/sass/components/_badges.scss +1 -8
  179. package/src/sass/components/_bar-chart.scss +1 -1
  180. package/src/sass/components/_button-groups.scss +31 -66
  181. package/src/sass/components/_buttons.scss +1 -1
  182. package/src/sass/components/_cards.scss +6 -25
  183. package/src/sass/components/_carousel.scss +16 -55
  184. package/src/sass/components/_chips.scss +0 -6
  185. package/src/sass/components/_column-chart.scss +1 -1
  186. package/src/sass/components/_confetti.scss +14 -0
  187. package/src/sass/components/_data-table.scss +1 -3
  188. package/src/sass/components/_datepicker.scss +3 -22
  189. package/src/sass/components/_dialog.scss +1 -4
  190. package/src/sass/components/_heatmap-chart.scss +2 -2
  191. package/src/sass/components/_icon-buttons.scss +0 -1
  192. package/src/sass/components/_index.scss +4 -0
  193. package/src/sass/components/_keypad.scss +162 -0
  194. package/src/sass/components/_lightbox.scss +3 -8
  195. package/src/sass/components/_map.scss +188 -0
  196. package/src/sass/components/_menu.scss +31 -74
  197. package/src/sass/components/_mixed-chart.scss +1 -1
  198. package/src/sass/components/_navbar.scss +9 -45
  199. package/src/sass/components/_navigation-rail.scss +23 -32
  200. package/src/sass/components/_page-footer.scss +15 -12
  201. package/src/sass/components/_panes.scss +2 -6
  202. package/src/sass/components/_particles.scss +14 -0
  203. package/src/sass/components/_progress.scss +6 -4
  204. package/src/sass/components/_side-sheet.scss +1 -4
  205. package/src/sass/components/_stepper.scss +0 -4
  206. package/src/sass/components/_table_of_contents.scss +3 -1
  207. package/src/sass/components/_timepicker.scss +4 -36
  208. package/src/sass/components/_toolbar.scss +0 -4
  209. package/src/sass/components/forms/_checkboxes.scss +44 -67
  210. package/src/sass/components/forms/_fieldset.scss +3 -3
  211. package/src/sass/components/forms/_file-input.scss +0 -1
  212. package/src/sass/components/forms/_radio-buttons.scss +10 -36
  213. package/src/sass/components/forms/_select.scss +0 -3
  214. package/src/sass/components/forms/_slider.scss +72 -259
  215. package/src/sass/tokens/_state.scss +2 -2
  216. package/src/sass/tokens/_theme.scss +1 -1
  217. package/src/sass/utilities/_colors.scss +6 -1
  218. package/src/sass/utilities/_index.scss +1 -1
  219. package/dist/js/chunks/chunk-3CLXLPYS.mjs.map +0 -7
  220. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  221. package/dist/js/chunks/chunk-3VOK6J7U.mjs.map +0 -7
  222. package/dist/js/chunks/chunk-4PWAPV6F.mjs +0 -7
  223. package/dist/js/chunks/chunk-55IA2XUC.mjs.map +0 -7
  224. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  225. package/dist/js/chunks/chunk-CKQP6P76.mjs.map +0 -7
  226. package/dist/js/chunks/chunk-EC63CHXU.mjs.map +0 -7
  227. package/dist/js/chunks/chunk-GZWPXXY6.mjs.map +0 -7
  228. package/dist/js/chunks/chunk-IFXVDDDH.mjs.map +0 -7
  229. package/dist/js/chunks/chunk-LNCCYGPC.mjs.map +0 -7
  230. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  231. package/dist/js/chunks/chunk-LWBQIX5J.mjs.map +0 -7
  232. package/dist/js/chunks/chunk-NNYP33NB.mjs.map +0 -7
  233. package/dist/js/chunks/chunk-NQLC3YMW.mjs +0 -1
  234. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  235. package/dist/js/chunks/chunk-P3G3QHII.mjs.map +0 -7
  236. package/dist/js/chunks/chunk-PLYXLSH3.mjs.map +0 -7
  237. package/dist/js/chunks/chunk-QKWPQK5N.mjs.map +0 -7
  238. package/dist/js/chunks/chunk-QVVEWBOF.mjs.map +0 -7
  239. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  240. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  241. package/dist/js/chunks/chunk-U2OTHOTI.mjs.map +0 -7
  242. package/dist/js/chunks/chunk-UAEAQBRC.mjs.map +0 -7
  243. package/dist/js/chunks/chunk-UNEMYWEW.mjs.map +0 -7
  244. package/dist/js/chunks/chunk-WJXDBPXQ.mjs.map +0 -7
  245. package/dist/js/chunks/chunk-XGHORT7J.mjs.map +0 -7
  246. package/dist/js/chunks/chunk-XH6BEEMY.mjs.map +0 -7
  247. /package/dist/js/chunks/{chunk-DTKR54I6.mjs.map → chunk-33QVDDGR.mjs.map} +0 -0
  248. /package/dist/js/chunks/{chunk-DLWYKFEI.mjs.map → chunk-AIURVCG6.mjs.map} +0 -0
  249. /package/dist/js/chunks/{chunk-GVGT6MIU.mjs.map → chunk-CK2XCICY.mjs.map} +0 -0
  250. /package/dist/js/chunks/{chunk-YDCS5S3J.mjs.map → chunk-L27Q6ZMI.mjs.map} +0 -0
  251. /package/dist/js/chunks/{chunk-CCWDV5CR.mjs.map → chunk-LQWUDNHZ.mjs.map} +0 -0
  252. /package/dist/js/chunks/{chunk-PIJ2TAR3.mjs.map → chunk-PDG64UHF.mjs.map} +0 -0
  253. /package/dist/js/chunks/{chunk-VTLBW7QS.mjs.map → chunk-SMY7GJSS.mjs.map} +0 -0
  254. /package/dist/js/chunks/{chunk-K4CJCRGE.mjs.map → chunk-UETTGDLI.mjs.map} +0 -0
  255. /package/dist/js/chunks/{chunk-NQLC3YMW.mjs.map → chunk-VKAUVTQY.mjs.map} +0 -0
  256. /package/dist/js/chunks/{chunk-HKT2S7VM.mjs.map → chunk-VM4FTS7L.mjs.map} +0 -0
  257. /package/dist/js/chunks/{chunk-6WLSDZ4O.mjs.map → chunk-X4ISMKE2.mjs.map} +0 -0
@@ -0,0 +1,162 @@
1
+ @use "../abstracts" as *;
2
+
3
+ // Keypad and keyboard: on-screen keys that type into a text field.
4
+ //
5
+ // Anatomy is the HTML. Every key is a <button type="button">. A key with a
6
+ // `value` types that value; a key with `data-key` is a function key
7
+ // (Backspace, Enter, Shift). `.keypad` is a three-column grid of round keys,
8
+ // the dial pad and PIN pad. `.keyboard` is a column of rows (any <div>), each
9
+ // row a flex line of keys. A key carrying a button style class (.filled,
10
+ // .tonal, .outlined, .elevated, .text) keeps that style, so a call or submit
11
+ // key is written the same way as any other button.
12
+ //
13
+ // Keys press the same way button-group items do: the corner squares off on a
14
+ // spring and springs back on release.
15
+ //
16
+ // Keyboard width comes from a column count rather than per-key classes. A
17
+ // character key is one column wide and may shrink; a function key is one and
18
+ // a half; the space bar takes what is left. Ten columns gives QWERTY's
19
+ // half-key indent on the nine-key row with no extra markup.
20
+
21
+ $_key: "button:not(.filled, .tonal, .outlined, .elevated, .text, :disabled)";
22
+
23
+ :is(.keypad, .keyboard) {
24
+ --md-comp-keypad-key-color: var(--md-sys-color-surface-container-highest);
25
+ --md-comp-keypad-key-label-color: var(--md-sys-color-on-surface);
26
+ --md-comp-keypad-function-key-color: var(--md-sys-color-secondary-container);
27
+ --md-comp-keypad-function-key-label-color: var(--md-sys-color-on-secondary-container);
28
+ --md-comp-keypad-key-pressed-shape: 12px;
29
+ // Material's fast-spatial spring, the curve button groups press with.
30
+ --md-comp-keypad-motion: #{$motion-fast-spatial};
31
+
32
+ touch-action: manipulation;
33
+
34
+ button {
35
+ --_color: var(--md-comp-keypad-key-color);
36
+ --_label: var(--md-comp-keypad-key-label-color);
37
+ min-width: 0;
38
+ padding: 0;
39
+ transition:
40
+ border-radius 200ms var(--md-comp-keypad-motion),
41
+ background-color 200ms ease-out;
42
+
43
+ &[data-key] {
44
+ --_color: var(--md-comp-keypad-function-key-color);
45
+ --_label: var(--md-comp-keypad-function-key-label-color);
46
+ }
47
+
48
+ // The state layer's opacity. Only the rule below reads it, so a key
49
+ // that keeps a button style ignores it.
50
+ @each $state, $selector in ("hover": "&:hover", "focus": "&:focus", "pressed": "&:active") {
51
+ #{$selector} {
52
+ --_state: #{state-opacity($state)};
53
+ }
54
+ }
55
+
56
+ &:active:not(:disabled) {
57
+ border-radius: var(--md-comp-keypad-key-pressed-shape);
58
+ }
59
+
60
+ // The shape stops moving; the color still fades, which is not motion.
61
+ @media (prefers-reduced-motion: reduce) {
62
+ transition-property: background-color;
63
+ }
64
+ }
65
+
66
+ #{$_key} {
67
+ color: var(--_label);
68
+ background-color: color-mix(in oklab, var(--_label) var(--_state, 0%), var(--_color));
69
+ }
70
+
71
+ // A latched Shift reads as selected: primary, like a selected toggle.
72
+ [data-key="Shift"][aria-pressed="true"] {
73
+ --_color: var(--md-sys-color-primary);
74
+ --_label: var(--md-sys-color-on-primary);
75
+ }
76
+ }
77
+
78
+ // Dial pad and PIN pad: three columns of round keys. A digit key may carry
79
+ // its letters in a <small> under the digit. An empty cell is an empty <span>.
80
+ // Keys fill their cell, so `.wide` spans two and becomes a pill: a call key
81
+ // beside Backspace leaves no hole in the last row.
82
+ .keypad {
83
+ --md-comp-keypad-key-size: 72px;
84
+ --md-comp-keypad-gap: 12px;
85
+
86
+ display: inline-grid;
87
+ grid-template-columns: repeat(3, var(--md-comp-keypad-key-size));
88
+ gap: var(--md-comp-keypad-gap);
89
+
90
+ button {
91
+ flex-direction: column;
92
+ gap: 0;
93
+ width: 100%;
94
+ height: var(--md-comp-keypad-key-size);
95
+ border-radius: calc(var(--md-comp-keypad-key-size) / 2);
96
+ @include typescale("headline-medium");
97
+
98
+ &.wide {
99
+ grid-column: span 2;
100
+ }
101
+
102
+ > small {
103
+ @include typescale("label-small");
104
+ color: inherit;
105
+ opacity: .78;
106
+ }
107
+ }
108
+ }
109
+
110
+ // On-screen keyboard. The container is a docked surface; each row is a line
111
+ // of keys sized from the column count. An optional `.numbers` row of digits
112
+ // sits above the letters with shorter keys, as on a phone; `hidden` drops it.
113
+ // Rows skip `display: flex` while hidden, which would otherwise outrank the
114
+ // browser's `[hidden]` rule.
115
+ .keyboard {
116
+ --md-comp-keyboard-columns: 10;
117
+ --md-comp-keyboard-gap: 6px;
118
+ --md-comp-keyboard-key-height: 48px;
119
+ --md-comp-keyboard-number-key-height: 40px;
120
+ --md-comp-keyboard-key-shape: 12px;
121
+ --md-comp-keypad-key-pressed-shape: 6px;
122
+ --md-comp-keyboard-container-color: var(--md-sys-color-surface-container);
123
+ --md-comp-keyboard-container-shape: 16px;
124
+
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: 8px;
128
+ padding: 8px;
129
+ border-radius: var(--md-comp-keyboard-container-shape);
130
+ background-color: var(--md-comp-keyboard-container-color);
131
+
132
+ > :not([hidden]) {
133
+ --_unit: calc((100% - (var(--md-comp-keyboard-columns) - 1) * var(--md-comp-keyboard-gap)) / var(--md-comp-keyboard-columns));
134
+ display: flex;
135
+ justify-content: center;
136
+ gap: var(--md-comp-keyboard-gap);
137
+ }
138
+
139
+ button {
140
+ flex: 0 1 var(--_unit);
141
+ height: var(--md-comp-keyboard-key-height);
142
+ border-radius: var(--md-comp-keyboard-key-shape);
143
+ @include typescale("title-medium");
144
+
145
+ &[data-key] {
146
+ flex-basis: calc(1.5 * var(--_unit) + .5 * var(--md-comp-keyboard-gap));
147
+ }
148
+
149
+ &[value=" "] {
150
+ flex-grow: 1;
151
+ }
152
+ }
153
+
154
+ > .numbers button {
155
+ height: var(--md-comp-keyboard-number-key-height);
156
+ }
157
+
158
+ // Shift shows capitals on the character keys while it is latched.
159
+ &:has([data-key="Shift"][aria-pressed="true"]) button[value] {
160
+ text-transform: uppercase;
161
+ }
162
+ }
@@ -11,10 +11,8 @@
11
11
  border-radius: 12px;
12
12
  }
13
13
 
14
- &:hover {
15
- &:not(.active) {
16
- opacity: .8;
17
- }
14
+ &:hover:not(.active) {
15
+ opacity: .8;
18
16
  }
19
17
  &.active {
20
18
  cursor: zoom-out;
@@ -23,10 +21,7 @@
23
21
 
24
22
  #lightbox-overlay {
25
23
  position:fixed;
26
- top: 0;
27
- right: 0;
28
- bottom: 0;
29
- left: 0;
24
+ inset: 0;
30
25
  background-color: var(--md-sys-color-background);
31
26
  z-index: 1000;
32
27
  will-change: opacity;
@@ -0,0 +1,188 @@
1
+ @use "sass:map";
2
+ @use "../abstracts" as *;
3
+
4
+ // Map. A MapLibre map in a .map frame. The page loads maplibre-gl.css; these
5
+ // rules restyle what MapLibre draws and add the ExpressiveCSS parts:
6
+ //
7
+ // .map-marker a point at data-lng-lat. With no content of its own it is
8
+ // a primary dot; anything else inside replaces the dot.
9
+ // A .map-marker-label shows below it (.top: above), and a
10
+ // child .tooltip works as on any button.
11
+ // .map-popup moved into a MapLibre popup, drawn as a surface card.
12
+ // .map-controls a corner stack of .icon-button controls, top right
13
+ // unless .top-left, .bottom-left or .bottom-right. A
14
+ // .map-control-group joins buttons on one surface.
15
+ //
16
+ // Until the script starts the map, markers, popups and controls are hidden.
17
+ // MapLibre moves markers and popups out of the frame, so the hiding rules
18
+ // stop matching them once the map runs.
19
+ //
20
+ // Tokens:
21
+ // --md-comp-map-height 400px
22
+ // --md-comp-map-shape 16px
23
+ // --md-comp-map-marker-color primary
24
+ // --md-comp-map-marker-ring-color surface
25
+ // --md-comp-map-route-color primary
26
+ // --md-comp-map-arc-color tertiary
27
+ // --md-comp-map-cluster-color primary
28
+ // --md-comp-map-cluster-label-color on-primary
29
+ // --md-comp-map-popup-max-width 280px
30
+ // --md-comp-map-control-offset 12px
31
+ //
32
+ // The script sets --md-comp-map-bearing, so a [data-action="compass"] icon
33
+ // points north.
34
+
35
+ .map {
36
+ --md-comp-map-height: 400px;
37
+ --md-comp-map-shape: 16px;
38
+ --md-comp-map-marker-color: var(--md-sys-color-primary);
39
+ --md-comp-map-marker-ring-color: var(--md-sys-color-surface);
40
+ --md-comp-map-route-color: var(--md-sys-color-primary);
41
+ --md-comp-map-arc-color: var(--md-sys-color-tertiary);
42
+ --md-comp-map-cluster-color: var(--md-sys-color-primary);
43
+ --md-comp-map-cluster-label-color: var(--md-sys-color-on-primary);
44
+ --md-comp-map-popup-max-width: 280px;
45
+ --md-comp-map-control-offset: 12px;
46
+
47
+ position: relative;
48
+ overflow: hidden;
49
+ block-size: var(--md-comp-map-height);
50
+ border-radius: var(--md-comp-map-shape);
51
+ background-color: var(--md-sys-color-surface-container);
52
+
53
+ &:fullscreen {
54
+ border-radius: 0;
55
+ }
56
+
57
+ > :is(.map-marker, .map-popup),
58
+ &:not(.maplibregl-map) > .map-controls {
59
+ display: none;
60
+ }
61
+ }
62
+
63
+ // Absolute, as MapLibre places it; a child .tooltip would otherwise make
64
+ // the marker relative.
65
+ .map .map-marker {
66
+ position: absolute;
67
+ display: grid;
68
+ place-items: center;
69
+ padding: 0;
70
+ border: none;
71
+ background: none;
72
+ color: inherit;
73
+ cursor: pointer;
74
+ @include focus-visible;
75
+
76
+ &:not(:has(> :not(.tooltip, .map-marker-label))) {
77
+ inline-size: 16px;
78
+ block-size: 16px;
79
+ border: 2px solid var(--md-comp-map-marker-ring-color);
80
+ border-radius: 50%;
81
+ background-color: var(--md-comp-map-marker-color);
82
+ @include z-depth(1);
83
+ }
84
+
85
+ &.location {
86
+ --md-comp-map-marker-color: var(--md-sys-color-tertiary);
87
+
88
+ box-shadow: 0 0 0 8px color-mix(in oklab, var(--md-comp-map-marker-color) 24%, transparent);
89
+ cursor: default;
90
+ }
91
+ }
92
+
93
+ .map-marker-label {
94
+ position: absolute;
95
+ inset-block-start: calc(100% + 4px);
96
+ padding: 2px 8px;
97
+ border-radius: 8px;
98
+ background-color: var(--md-sys-color-surface-container-highest);
99
+ color: var(--md-sys-color-on-surface);
100
+ @include typescale("label-medium");
101
+ white-space: nowrap;
102
+ pointer-events: none;
103
+
104
+ &.top {
105
+ inset-block: auto calc(100% + 4px);
106
+ }
107
+ }
108
+
109
+ // MapLibre's popup, as an M3 surface card. The tip is dropped; the offset
110
+ // keeps the card clear of its marker.
111
+ //
112
+ // maplibre-gl.css is unlayered, so it beats this layer wherever both set a
113
+ // property. Those declarations are !important; an important declaration in
114
+ // a layer outranks a normal unlayered one.
115
+ .map {
116
+ .maplibregl-popup-content {
117
+ max-inline-size: var(--md-comp-map-popup-max-width);
118
+ padding: 12px 16px !important;
119
+ border-radius: 12px !important;
120
+ background: var(--md-sys-color-surface-container-low) !important;
121
+ color: var(--md-sys-color-on-surface);
122
+ @include typescale("body-medium");
123
+ box-shadow: map.get($elevations, "2") !important;
124
+
125
+ &:has(> .maplibregl-popup-close-button) {
126
+ padding-inline-end: 44px;
127
+ }
128
+
129
+ :is(h1, h2, h3, h4, h5, h6) {
130
+ margin: 0 0 4px;
131
+ @include typescale("title-small");
132
+ }
133
+
134
+ p {
135
+ margin: 0;
136
+ font: inherit;
137
+ }
138
+ }
139
+
140
+ .maplibregl-popup-tip {
141
+ display: none;
142
+ }
143
+
144
+ .maplibregl-popup-close-button {
145
+ inset: 4px 4px auto auto !important;
146
+ inline-size: 32px;
147
+ block-size: 32px;
148
+ border-radius: 50% !important;
149
+ color: var(--md-sys-color-on-surface-variant);
150
+ font-size: 20px;
151
+ line-height: 1;
152
+
153
+ &:hover {
154
+ background-color: color-mix(in oklab, currentColor 8%, transparent) !important;
155
+ }
156
+
157
+ @include focus-visible;
158
+ }
159
+ }
160
+
161
+ .map-controls {
162
+ position: absolute;
163
+ inset: var(--md-comp-map-control-offset) var(--md-comp-map-control-offset) auto auto;
164
+ z-index: 2;
165
+ display: flex;
166
+ flex-direction: column;
167
+ gap: 8px;
168
+
169
+ &.top-left { inset: var(--md-comp-map-control-offset) auto auto var(--md-comp-map-control-offset); }
170
+ &.bottom-left { inset: auto auto var(--md-comp-map-control-offset) var(--md-comp-map-control-offset); }
171
+ &.bottom-right { inset: auto var(--md-comp-map-control-offset) var(--md-comp-map-control-offset) auto; }
172
+
173
+ > .icon-button,
174
+ > .map-control-group {
175
+ border-radius: 9999px;
176
+ background-color: var(--md-sys-color-surface-container-low);
177
+ @include z-depth(2);
178
+ }
179
+
180
+ [data-action="compass"] > .material-symbols {
181
+ rotate: var(--md-comp-map-bearing, 0deg);
182
+ }
183
+ }
184
+
185
+ .map-control-group {
186
+ display: flex;
187
+ flex-direction: column;
188
+ }
@@ -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 {