@expressivecss/expressive 0.15.0 → 0.16.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 (602) hide show
  1. package/CHANGELOG.md +1502 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19247 -11923
  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/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-4QUCNFSD.mjs} +64 -113
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-6FSEUFVW.mjs} +39 -26
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-7NLUI3RR.mjs} +139 -66
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-B7DQFHA5.mjs} +30 -47
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-BPF3I2MN.mjs} +109 -24
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-CSYWKEK3.mjs} +310 -196
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-EVCVFEV3.mjs} +235 -146
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-KZPSAXIU.mjs} +142 -32
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-OP43LLIC.mjs} +28 -45
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-OYNUDOHR.mjs} +19 -47
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UAZSDUVP.mjs → chunk-P6DRQ6KS.mjs} +36 -30
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-QXKWVHBD.mjs} +265 -161
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-VGY4M57S.mjs} +266 -120
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-VMY55K2X.mjs} +76 -109
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-ZJNLAGY5.mjs} +19 -30
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10613 -4327
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10613 -4327
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -22
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +182 -71
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +131 -66
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +3 -3
  274. package/dist/js/internal/components/lightbox.mjs +3 -3
  275. package/dist/js/internal/components/lineChart.mjs +25 -4
  276. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  277. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  278. package/dist/js/internal/components/mapView.mjs +3 -3
  279. package/dist/js/internal/components/menu.mjs +3 -3
  280. package/dist/js/internal/components/menubar.mjs +10 -0
  281. package/dist/js/internal/components/menubar.mjs.map +7 -0
  282. package/dist/js/internal/components/messageScroller.mjs +3 -3
  283. package/dist/js/internal/components/mixedChart.mjs +5 -4
  284. package/dist/js/internal/components/navigationRail.mjs +3 -2
  285. package/dist/js/internal/components/particles.mjs +3 -2
  286. package/dist/js/internal/components/pieChart.mjs +4 -3
  287. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  288. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  289. package/dist/js/internal/components/questionnaire.mjs +3 -3
  290. package/dist/js/internal/components/radarChart.mjs +4 -3
  291. package/dist/js/internal/components/radialChart.mjs +4 -3
  292. package/dist/js/internal/components/registry.mjs +59 -41
  293. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  294. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  295. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  296. package/dist/js/internal/components/scatterChart.mjs +10 -0
  297. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scrollspy.mjs +3 -2
  299. package/dist/js/internal/components/select.mjs +4 -4
  300. package/dist/js/internal/components/showMore.mjs +9 -0
  301. package/dist/js/internal/components/showMore.mjs.map +7 -0
  302. package/dist/js/internal/components/slider.mjs +3 -3
  303. package/dist/js/internal/components/snackbar.mjs +2 -2
  304. package/dist/js/internal/components/swipeActions.mjs +9 -0
  305. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  306. package/dist/js/internal/components/tabs.mjs +3 -4
  307. package/dist/js/internal/components/timepicker.mjs +5 -4
  308. package/dist/js/internal/components/tooltip.mjs +3 -3
  309. package/dist/js/internal/components/treeSelect.mjs +13 -0
  310. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  311. package/dist/js/internal/components/treemapChart.mjs +10 -0
  312. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  313. package/dist/js/internal/core/component.mjs +2 -1
  314. package/dist/js/internal/core/formControl.mjs +12 -0
  315. package/dist/js/internal/core/formControl.mjs.map +7 -0
  316. package/dist/js/internal/core/spring.mjs +11 -0
  317. package/dist/js/internal/core/spring.mjs.map +7 -0
  318. package/dist/js/internal/core/utils.mjs +11 -3
  319. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  320. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  322. package/dist/js/modular.mjs +173 -71
  323. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  324. package/dist/types/behaviors/copy.d.ts +18 -0
  325. package/dist/types/behaviors/dataTables.d.ts +129 -0
  326. package/dist/types/behaviors/dialogs.d.ts +27 -1
  327. package/dist/types/behaviors/forms.d.ts +68 -2
  328. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  329. package/dist/types/behaviors/lists.d.ts +12 -0
  330. package/dist/types/behaviors/paneResize.d.ts +29 -0
  331. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  332. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  333. package/dist/types/behaviors/sortable.d.ts +28 -0
  334. package/dist/types/behaviors/theme.d.ts +22 -0
  335. package/dist/types/behaviors/tour.d.ts +36 -0
  336. package/dist/types/behaviors/transferList.d.ts +51 -0
  337. package/dist/types/components/appBar.d.ts +5 -6
  338. package/dist/types/components/autocomplete.d.ts +91 -17
  339. package/dist/types/components/backToTop.d.ts +36 -0
  340. package/dist/types/components/barChart.d.ts +3 -6
  341. package/dist/types/components/buttonGroup.d.ts +2 -4
  342. package/dist/types/components/buttons.d.ts +5 -5
  343. package/dist/types/components/cards.d.ts +3 -16
  344. package/dist/types/components/carousel.d.ts +9 -15
  345. package/dist/types/components/cascader.d.ts +130 -0
  346. package/dist/types/components/characterCounter.d.ts +2 -15
  347. package/dist/types/components/chips.d.ts +65 -19
  348. package/dist/types/components/colorPicker.d.ts +42 -0
  349. package/dist/types/components/columnChart.d.ts +23 -10
  350. package/dist/types/components/commandPalette.d.ts +11 -16
  351. package/dist/types/components/confetti.d.ts +2 -4
  352. package/dist/types/components/currencyInput.d.ts +59 -0
  353. package/dist/types/components/datepicker.d.ts +56 -32
  354. package/dist/types/components/expandingCard.d.ts +4 -6
  355. package/dist/types/components/funnelChart.d.ts +38 -0
  356. package/dist/types/components/heatmapChart.d.ts +39 -8
  357. package/dist/types/components/hoverCard.d.ts +58 -0
  358. package/dist/types/components/index.d.ts +16 -1
  359. package/dist/types/components/inputMask.d.ts +30 -0
  360. package/dist/types/components/keypad.d.ts +38 -6
  361. package/dist/types/components/lightbox.d.ts +14 -20
  362. package/dist/types/components/lineChart.d.ts +172 -10
  363. package/dist/types/components/loadingOverlay.d.ts +42 -0
  364. package/dist/types/components/mapView.d.ts +26 -17
  365. package/dist/types/components/menu.d.ts +60 -22
  366. package/dist/types/components/menubar.d.ts +37 -0
  367. package/dist/types/components/messageScroller.d.ts +2 -14
  368. package/dist/types/components/mixedChart.d.ts +15 -6
  369. package/dist/types/components/navigationRail.d.ts +16 -5
  370. package/dist/types/components/particles.d.ts +8 -4
  371. package/dist/types/components/pieChart.d.ts +32 -7
  372. package/dist/types/components/pullToRefresh.d.ts +80 -0
  373. package/dist/types/components/questionnaire.d.ts +58 -16
  374. package/dist/types/components/radarChart.d.ts +10 -6
  375. package/dist/types/components/radialChart.d.ts +58 -7
  376. package/dist/types/components/registry.d.ts +73 -3
  377. package/dist/types/components/richTextEditor.d.ts +6 -14
  378. package/dist/types/components/sankeyChart.d.ts +72 -0
  379. package/dist/types/components/scatterChart.d.ts +102 -0
  380. package/dist/types/components/scrollspy.d.ts +3 -5
  381. package/dist/types/components/select.d.ts +43 -30
  382. package/dist/types/components/showMore.d.ts +51 -0
  383. package/dist/types/components/slider.d.ts +3 -15
  384. package/dist/types/components/snackbar.d.ts +61 -0
  385. package/dist/types/components/swipeActions.d.ts +81 -0
  386. package/dist/types/components/tabs.d.ts +89 -27
  387. package/dist/types/components/timepicker.d.ts +113 -21
  388. package/dist/types/components/tooltip.d.ts +56 -20
  389. package/dist/types/components/treeSelect.d.ts +106 -0
  390. package/dist/types/components/treemapChart.d.ts +56 -0
  391. package/dist/types/core/component.d.ts +43 -25
  392. package/dist/types/core/formControl.d.ts +21 -0
  393. package/dist/types/core/spring.d.ts +20 -0
  394. package/dist/types/core/utils.d.ts +85 -72
  395. package/dist/types/modular.d.ts +33 -1
  396. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  397. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  398. package/package.json +10 -8
  399. package/src/sass/README.md +27 -18
  400. package/src/sass/abstracts/_elevation.scss +13 -7
  401. package/src/sass/abstracts/_index.scss +1 -0
  402. package/src/sass/abstracts/_mixins.scss +422 -36
  403. package/src/sass/abstracts/_spring.scss +63 -0
  404. package/src/sass/abstracts/_variables.scss +39 -21
  405. package/src/sass/base/_fonts.scss +61 -48
  406. package/src/sass/base/_global.scss +104 -24
  407. package/src/sass/base/_index.scss +2 -0
  408. package/src/sass/base/_normalize.scss +59 -114
  409. package/src/sass/base/_print.scss +21 -0
  410. package/src/sass/base/_prose.scss +68 -0
  411. package/src/sass/base/_typography.scss +9 -5
  412. package/src/sass/components/_accordion.scss +9 -16
  413. package/src/sass/components/_alert.scss +102 -0
  414. package/src/sass/components/_aura.scss +8 -3
  415. package/src/sass/components/_avatar.scss +3 -3
  416. package/src/sass/components/_back-to-top.scss +38 -0
  417. package/src/sass/components/_badges.scss +6 -5
  418. package/src/sass/components/_bar-chart.scss +41 -19
  419. package/src/sass/components/_bottom-sheet.scss +44 -16
  420. package/src/sass/components/_breadcrumb.scss +8 -1
  421. package/src/sass/components/_button-groups.scss +15 -25
  422. package/src/sass/components/_buttons.scss +156 -63
  423. package/src/sass/components/_calendar.scss +246 -0
  424. package/src/sass/components/_cards.scss +36 -44
  425. package/src/sass/components/_carousel.scss +27 -103
  426. package/src/sass/components/_cascader.scss +142 -0
  427. package/src/sass/components/_chips.scss +36 -46
  428. package/src/sass/components/_column-chart.scss +19 -12
  429. package/src/sass/components/_command-palette.scss +4 -7
  430. package/src/sass/components/_confetti.scss +0 -2
  431. package/src/sass/components/_countdown.scss +1 -1
  432. package/src/sass/components/_data-table.scss +162 -25
  433. package/src/sass/components/_datepicker.scss +54 -40
  434. package/src/sass/components/_description-list.scss +85 -0
  435. package/src/sass/components/_dialog.scss +42 -41
  436. package/src/sass/components/_docked-display.scss +1 -3
  437. package/src/sass/components/_drag-handle.scss +16 -20
  438. package/src/sass/components/_expanding-card.scss +20 -9
  439. package/src/sass/components/_fab-menu.scss +44 -32
  440. package/src/sass/components/_funnel-chart.scss +124 -0
  441. package/src/sass/components/_heatmap-chart.scss +111 -22
  442. package/src/sass/components/_icon-buttons.scss +7 -7
  443. package/src/sass/components/_icons-material-design.scss +2 -2
  444. package/src/sass/components/_image-compare.scss +108 -0
  445. package/src/sass/components/_index.scss +20 -0
  446. package/src/sass/components/_keypad.scss +39 -19
  447. package/src/sass/components/_kpi.scss +6 -11
  448. package/src/sass/components/_lightbox.scss +24 -13
  449. package/src/sass/components/_line-chart.scss +16 -2
  450. package/src/sass/components/_list.scss +59 -14
  451. package/src/sass/components/_loading-indicator.scss +1 -0
  452. package/src/sass/components/_loading-overlay.scss +105 -0
  453. package/src/sass/components/_map.scss +33 -11
  454. package/src/sass/components/_marquee.scss +3 -2
  455. package/src/sass/components/_mega-menu.scss +137 -0
  456. package/src/sass/components/_menu.scss +143 -123
  457. package/src/sass/components/_menubar.scss +59 -0
  458. package/src/sass/components/_message-scroller.scss +2 -2
  459. package/src/sass/components/_message.scss +3 -3
  460. package/src/sass/components/_mixed-chart.scss +37 -9
  461. package/src/sass/components/_modal-display.scss +21 -0
  462. package/src/sass/components/_navbar.scss +34 -20
  463. package/src/sass/components/_navigation-bar.scss +15 -77
  464. package/src/sass/components/_navigation-rail.scss +151 -92
  465. package/src/sass/components/_org-chart.scss +192 -0
  466. package/src/sass/components/_page-footer.scss +1 -1
  467. package/src/sass/components/_pagination.scss +6 -13
  468. package/src/sass/components/_panes.scss +32 -26
  469. package/src/sass/components/_particles.scss +0 -2
  470. package/src/sass/components/_pie-chart.scss +91 -11
  471. package/src/sass/components/_popover.scss +18 -5
  472. package/src/sass/components/_progress.scss +152 -31
  473. package/src/sass/components/_pull-to-refresh.scss +90 -0
  474. package/src/sass/components/_questionnaire.scss +74 -3
  475. package/src/sass/components/_radar-chart.scss +38 -10
  476. package/src/sass/components/_radial-chart.scss +113 -5
  477. package/src/sass/components/_rich-text-editor.scss +2 -2
  478. package/src/sass/components/_sankey-chart.scss +114 -0
  479. package/src/sass/components/_scatter-chart.scss +153 -0
  480. package/src/sass/components/_scrim.scss +0 -2
  481. package/src/sass/components/_scrollspy.scss +0 -2
  482. package/src/sass/components/_search.scss +26 -22
  483. package/src/sass/components/_show-more.scss +8 -0
  484. package/src/sass/components/_side-sheet.scss +23 -37
  485. package/src/sass/components/_skeleton.scss +2 -4
  486. package/src/sass/components/_snackbar.scss +27 -21
  487. package/src/sass/components/_split-button.scss +5 -5
  488. package/src/sass/components/_stat.scss +3 -8
  489. package/src/sass/components/_stepper.scss +1 -1
  490. package/src/sass/components/_swipe-actions.scss +71 -0
  491. package/src/sass/components/_tabs.scss +51 -32
  492. package/src/sass/components/_timeline.scss +12 -12
  493. package/src/sass/components/_timepicker.scss +109 -78
  494. package/src/sass/components/_toolbar.scss +35 -43
  495. package/src/sass/components/_tooltip.scss +21 -12
  496. package/src/sass/components/_tour.scss +89 -0
  497. package/src/sass/components/_transfer-list.scss +73 -0
  498. package/src/sass/components/_transitions.scss +4 -4
  499. package/src/sass/components/_tree.scss +3 -16
  500. package/src/sass/components/_treemap-chart.scss +122 -0
  501. package/src/sass/components/forms/_checkboxes.scss +106 -24
  502. package/src/sass/components/forms/_color-picker.scss +135 -0
  503. package/src/sass/components/forms/_color-swatches.scss +85 -0
  504. package/src/sass/components/forms/_drop-zone.scss +15 -9
  505. package/src/sass/components/forms/_fieldset.scss +7 -7
  506. package/src/sass/components/forms/_file-input.scss +6 -8
  507. package/src/sass/components/forms/_index.scss +3 -1
  508. package/src/sass/components/forms/_input-fields.scss +254 -90
  509. package/src/sass/components/forms/_radio-buttons.scss +33 -94
  510. package/src/sass/components/forms/_rating.scss +2 -32
  511. package/src/sass/components/forms/_select.scss +199 -20
  512. package/src/sass/components/forms/_slider.scss +91 -94
  513. package/src/sass/components/forms/_switches.scss +53 -164
  514. package/src/sass/custom.scss +10 -1
  515. package/src/sass/expressive.scss +3 -63
  516. package/src/sass/tokens/_contrast.scss +94 -0
  517. package/src/sass/tokens/_elevation.scss +16 -0
  518. package/src/sass/tokens/_index.scss +5 -0
  519. package/src/sass/tokens/_motion.scss +109 -0
  520. package/src/sass/tokens/_reference.scss +72 -141
  521. package/src/sass/tokens/_shape.scss +38 -0
  522. package/src/sass/tokens/_stacking.scss +27 -0
  523. package/src/sass/tokens/_state.scss +0 -2
  524. package/src/sass/tokens/_theme.scss +10 -1
  525. package/src/sass/tokens/_vibrant.scss +2 -5
  526. package/src/sass/utilities/_defer-render.scss +17 -0
  527. package/src/sass/utilities/_helpers.scss +183 -26
  528. package/src/sass/utilities/_index.scss +1 -0
  529. package/src/sass/utilities/_scroll-area.scss +0 -2
  530. package/src/sass/utilities/_spacing.scss +52 -34
  531. package/src/sass/utilities/_typescale.scss +8 -1
  532. package/src/sass/utilities/_visibility.scss +47 -76
  533. package/src/sass/utilities/_z-depth.scss +7 -4
  534. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  535. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  536. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  537. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  540. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  541. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  543. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  548. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  553. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  556. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  562. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  564. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  567. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  568. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  569. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  570. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  572. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  574. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  578. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  582. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  584. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  587. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  589. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  590. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  592. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  593. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  594. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  596. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  598. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  599. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  602. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -6,6 +6,16 @@
6
6
 
7
7
  $_state-layers: ("hover", "focus", "pressed", "dragged");
8
8
 
9
+ /// A dp size as rem, for a box that holds text or an icon.
10
+ ///
11
+ /// Type is set in rem, so raising the browser's default font size or zooming
12
+ /// text only grows the text. A px box around it stays put, and the text spills
13
+ /// out of it or is cut. A rem box grows with its text, and it renders exactly
14
+ /// as before at the default 16px. Borders, gaps and insets stay px.
15
+ @function rem($px) {
16
+ @return math.div($px, 16px) * 1rem;
17
+ }
18
+
9
19
  /// A state layer opacity, as the percentage `color-mix()` wants.
10
20
  ///
11
21
  /// The tokens hold numbers (0.08), because an overlay uses one as `opacity`
@@ -23,12 +33,17 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
23
33
  @return calc(var(--md-sys-state-#{$state}-state-layer-opacity) * 100%);
24
34
  }
25
35
 
36
+ /// `$color` at the `$state` layer's opacity, mixed over `$base`.
37
+ @function state-layer($color, $state, $base: transparent) {
38
+ @return color-mix(in oklab, $color state-opacity($state), $base);
39
+ }
40
+
26
41
 
27
42
  // Common-button geometry. M3 Expressive's default size is small: 40dp,
28
43
  // label-large, corner.full, 16dp inset, 8dp icon gap. The size axis moves
29
44
  // those tokens; the style mixins only change color and elevation.
30
45
  @mixin btn(
31
- $height: var(--md-comp-filled-button-container-height, 40px),
46
+ $height: var(--md-comp-filled-button-container-height, #{rem(40px)}),
32
47
  $border-radius: var(--md-comp-filled-button-container-shape, 9999px),
33
48
  $padding-left: var(--md-comp-filled-button-leading-space, 16px),
34
49
  $padding-right: var(--md-comp-filled-button-trailing-space, 16px),
@@ -56,21 +71,23 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
56
71
  user-select: none;
57
72
  appearance: none;
58
73
  -webkit-tap-highlight-color: transparent;
59
- transition: background-color .2s ease-out, box-shadow .2s ease-out;
74
+ transition: background-color var(--md-sys-motion-duration-short4) ease-out, box-shadow var(--md-sys-motion-duration-short4) ease-out;
60
75
  }
61
76
 
62
77
  // State layers mix the on-color into the container in oklab; the opacities come
63
78
  // from md.sys.state via `state-opacity()`. Filled and tonal have no elevation.
64
79
 
65
- // Shared by filled, tonal, outlined and flat. Elevated also moves z-depth.
66
- @mixin _btn-states($on, $base) {
80
+ // Shared by every style. Elevated also moves z-depth on hover and press.
81
+ @mixin _btn-states($on, $base, $hover-depth: null, $press-depth: null) {
67
82
  &:hover {
68
- background-color: color-mix(in oklab, #{$on} state-opacity("hover"), #{$base});
83
+ @if $hover-depth { @include z-depth($hover-depth); }
84
+ background-color: state-layer($on, "hover", $base);
69
85
  }
70
86
 
71
87
  &:active,
72
88
  &:focus {
73
- background-color: color-mix(in oklab, #{$on} state-opacity("focus"), #{$base});
89
+ @if $press-depth { @include z-depth($press-depth); }
90
+ background-color: state-layer($on, "focus", $base);
74
91
  }
75
92
 
76
93
  @include focus-visible();
@@ -95,18 +112,7 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
95
112
  background-color: var(--md-sys-color-surface-container-low);
96
113
  @include z-depth("1");
97
114
 
98
- &:hover {
99
- @include z-depth("2");
100
- background-color: color-mix(in oklab, var(--md-sys-color-primary) state-opacity("hover"), var(--md-sys-color-surface-container-low));
101
- }
102
-
103
- &:active,
104
- &:focus {
105
- @include z-depth("1");
106
- background-color: color-mix(in oklab, var(--md-sys-color-primary) state-opacity("focus"), var(--md-sys-color-surface-container-low));
107
- }
108
-
109
- @include focus-visible();
115
+ @include _btn-states(var(--md-sys-color-primary), var(--md-sys-color-surface-container-low), "2", "1");
110
116
  }
111
117
 
112
118
  @mixin btn-outlined {
@@ -148,9 +154,6 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
148
154
  // `$important` is for the `.visually-hidden` utility, which has to beat a
149
155
  // consumer's own `position` or `padding` the way `.hide` beats their
150
156
  // `display`. Component rules leave it off.
151
- //
152
- // _navigation-rail.scss carries its own copy, which predates the mixin and
153
- // omits the margin and white-space; fold it in when it is next touched.
154
157
  @mixin visually-hidden($important: false) {
155
158
  $flag: null;
156
159
  @if $important { $flag: !important; }
@@ -181,28 +184,238 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
181
184
  }
182
185
  }
183
186
 
187
+ // The 18dp up arrow on a pseudo-element: Stat and KPI change lines, data
188
+ // table sort buttons. Rotate it 180deg for down.
189
+ @mixin trend-arrow {
190
+ content: "";
191
+ flex: none;
192
+ width: 18px;
193
+ height: 18px;
194
+ background-color: currentColor;
195
+ mask: $trend-arrow center / 18px no-repeat;
196
+ }
197
+
198
+ // A 48dp icon action in a dialog, pane or side sheet header bar.
199
+ @mixin header-icon-action {
200
+ flex: 0 0 48px;
201
+ box-sizing: border-box;
202
+ width: 48px;
203
+ height: 48px;
204
+ min-width: 48px;
205
+ padding: 0;
206
+ border: none;
207
+ border-radius: 50%;
208
+ background-color: transparent;
209
+ color: var(--md-sys-color-on-surface-variant);
210
+ box-shadow: none;
211
+
212
+ > #{$icon} {
213
+ font-size: rem(24px);
214
+ width: rem(24px);
215
+ height: rem(24px);
216
+ line-height: rem(24px);
217
+ }
218
+
219
+ &:hover {
220
+ background-color: state-layer(var(--md-sys-color-on-surface), "hover");
221
+ }
222
+
223
+ @include focus-visible;
224
+ }
225
+
226
+ // Forced colors repaint every background as Canvas and drop box-shadow, so a
227
+ // state shown only by a fill or a ring disappears. forced-colors-selected marks
228
+ // a selected item with a Highlight outline. forced-colors-fill keeps a drawn
229
+ // shape (an indicator bar, a dot, a glyph drawn as a mask) by opting it out
230
+ // and painting it with a system color.
231
+ @mixin forced-colors-selected {
232
+ @media (forced-colors: active) {
233
+ outline: 2px solid Highlight;
234
+ outline-offset: -2px;
235
+ }
236
+ }
237
+
238
+ // A tree branch's chevron, drawn as the row's ::before: it points to the end
239
+ // edge while closed. The row turns it with `transform: none` once the branch
240
+ // opens, and with rotate(90deg) under :dir(rtl). .tree and the tree select
241
+ // share it.
242
+ $_tree-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 15.4 6 9.4 7.4 8l4.6 4.6L16.6 8 18 9.4z'/%3E%3C/svg%3E");
243
+
244
+ @mixin tree-chevron {
245
+ content: "";
246
+ flex: none;
247
+ width: 20px;
248
+ height: 20px;
249
+ background-color: currentColor;
250
+ mask: $_tree-chevron center / 20px no-repeat;
251
+ transform: rotate(-90deg);
252
+ transition: transform var(--md-sys-motion-duration-short3) ease-out;
253
+ }
254
+
255
+ @mixin forced-colors-fill($color: CanvasText) {
256
+ @media (forced-colors: active) {
257
+ forced-color-adjust: none;
258
+ background-color: $color;
259
+ }
260
+ }
261
+
262
+ // A fieldset of round, labeled choices (color swatches, rating): no fieldset
263
+ // chrome, a body-medium legend, and labels whose 4px of padding makes the
264
+ // 48px target. $control is the input the label's focus and disabled states
265
+ // follow.
266
+ @mixin choice-fieldset($radius, $control) {
267
+ display: flex;
268
+ flex-wrap: wrap;
269
+ align-items: center;
270
+ margin: 0;
271
+ padding: 0;
272
+ border: 0;
273
+
274
+ > legend {
275
+ margin-block-end: 4px;
276
+ padding: 0;
277
+ color: var(--md-sys-color-on-surface-variant);
278
+ @include typescale("body-medium");
279
+ }
280
+
281
+ > label {
282
+ display: inline-flex;
283
+ gap: 0;
284
+ min-height: 0;
285
+ padding: 4px;
286
+ border-radius: $radius;
287
+ cursor: pointer;
288
+
289
+ &:has(> #{$control}:focus-visible) {
290
+ @include focus-ring;
291
+ }
292
+
293
+ &:has(> #{$control}:disabled) {
294
+ opacity: 0.38;
295
+ cursor: default;
296
+ }
297
+ }
298
+ }
299
+
300
+ // A navigation bar or rail destination stacked over its label: the indicator
301
+ // behind the icon, its hover layer, the active state, and a sibling badge on
302
+ // the upper trailing corner of the 24dp glyph. $prefix names the component
303
+ // tokens (nav-bar, nav-rail); $inset is the destination's top padding. Rules
304
+ // passed as content land between the active state and the badge.
305
+ @mixin nav-destination($prefix, $inset, $transition) {
306
+ > #{$icon} {
307
+ display: flex;
308
+ flex-shrink: 0;
309
+ align-items: center;
310
+ justify-content: center;
311
+ box-sizing: border-box;
312
+ width: var(--md-comp-#{$prefix}-indicator-width);
313
+ height: var(--md-comp-#{$prefix}-indicator-height);
314
+ border-radius: var(--md-comp-#{$prefix}-indicator-shape);
315
+ font-size: var(--md-comp-#{$prefix}-icon-size);
316
+ color: inherit;
317
+ transition: $transition;
318
+ }
319
+
320
+ &:hover:not(.active, [aria-current]) > #{$icon} {
321
+ background-color: state-layer(var(--md-sys-color-on-surface), "hover");
322
+ }
323
+
324
+ &.active,
325
+ &[aria-current] {
326
+ color: var(--md-sys-color-on-surface);
327
+
328
+ > #{$icon} {
329
+ background-color: var(--md-comp-#{$prefix}-active-indicator-color);
330
+ color: var(--md-comp-#{$prefix}-active-color);
331
+ --md-icon-fill: 1;
332
+ @include forced-colors-selected;
333
+ }
334
+ }
335
+
336
+ @content;
337
+
338
+ > .badge {
339
+ position: absolute;
340
+ z-index: 1;
341
+ top: calc(#{$inset} + (var(--md-comp-#{$prefix}-indicator-height) - 24px) / 2);
342
+ inset-inline-start: calc(50% + 12px);
343
+ transform: translate(-50%, -50%);
344
+
345
+ &:dir(rtl) {
346
+ transform: translate(50%, -50%);
347
+ }
348
+ }
349
+ }
350
+
351
+ // The same destination laid out as a row (bar .horizontal, rail .expanded):
352
+ // the indicator moves from the icon to the whole destination.
353
+ @mixin nav-destination-row($prefix) {
354
+ > #{$icon} {
355
+ width: var(--md-comp-#{$prefix}-icon-size);
356
+ height: var(--md-comp-#{$prefix}-icon-size);
357
+ border-radius: 0;
358
+ }
359
+
360
+ &:hover:not(.active, [aria-current]) {
361
+ background-color: state-layer(var(--md-sys-color-on-surface), "hover");
362
+
363
+ > #{$icon} {
364
+ background-color: transparent;
365
+ }
366
+ }
367
+
368
+ &.active,
369
+ &[aria-current] {
370
+ background-color: var(--md-comp-#{$prefix}-active-indicator-color);
371
+ color: var(--md-comp-#{$prefix}-active-color);
372
+ @include forced-colors-selected;
373
+
374
+ > #{$icon} {
375
+ background-color: transparent;
376
+ color: inherit;
377
+ outline: none;
378
+ }
379
+ }
380
+ }
381
+
184
382
  // M3 type role. Every property must name a token tokens/_reference.scss
185
383
  // actually defines — a missing var() drops the whole declaration.
186
- @mixin typescale($role) {
384
+ // $emphasized takes the role's M3 Expressive emphasized weight.
385
+ @mixin typescale($role, $emphasized: false) {
187
386
  font-family: var(--md-sys-typescale-#{$role}-font-family-name);
188
387
  font-size: var(--md-sys-typescale-#{$role}-font-size);
189
- font-weight: var(--md-sys-typescale-#{$role}-font-weight);
388
+ @if $emphasized {
389
+ font-weight: var(--md-sys-typescale-emphasized-#{$role}-font-weight);
390
+ } @else {
391
+ font-weight: var(--md-sys-typescale-#{$role}-font-weight);
392
+ }
190
393
  line-height: var(--md-sys-typescale-#{$role}-line-height);
191
394
  letter-spacing: var(--md-sys-typescale-#{$role}-letter-spacing);
192
395
  }
193
396
 
397
+ // The <label> row of a radio, checkbox or switch: 48dp touch target, 12dp
398
+ // between control and text, body-large on-surface.
399
+ @mixin selection-control-label($display: flex) {
400
+ display: $display;
401
+ align-items: center;
402
+ gap: 12px;
403
+ min-height: 48px;
404
+ margin: 0;
405
+ cursor: pointer;
406
+ user-select: none;
407
+ color: var(--md-sys-color-on-surface);
408
+ @include typescale("body-large");
409
+ }
410
+
194
411
  /// The state layer some controls draw as a ring rather than an overlay.
195
412
  ///
196
413
  /// Checkboxes and radio buttons have no room for an overlay pseudo-element, so
197
414
  /// they grow a `box-shadow` from the control's edge out to the state layer
198
415
  /// size.
199
416
  @mixin state-layer-ring($outer, $inner, $color, $state) {
200
- box-shadow: 0 0 0 calc((#{$outer} - #{$inner}) / 2)
201
- color-mix(
202
- in oklab,
203
- #{$color} state-opacity($state),
204
- transparent
205
- );
417
+ // Interpolated so a quoted color, such as "var(--c)", is written unquoted.
418
+ box-shadow: 0 0 0 calc((#{$outer} - #{$inner}) / 2) state-layer(#{$color}, $state);
206
419
  }
207
420
 
208
421
  /// The button size tokens for one rung of `$button-sizes`.
@@ -213,20 +426,22 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
213
426
  @mixin button-size($name) {
214
427
  $s: map.get($button-sizes, $name);
215
428
 
216
- --md-comp-filled-button-container-height: #{map.get($s, height)};
217
- --md-comp-filled-button-icon-size: #{map.get($s, icon)};
429
+ --md-comp-filled-button-container-height: #{rem(map.get($s, height))};
430
+ --md-comp-filled-button-icon-size: #{rem(map.get($s, icon))};
218
431
  --md-comp-filled-button-leading-space: #{map.get($s, space)};
219
432
  --md-comp-filled-button-trailing-space: #{map.get($s, space)};
220
433
  --md-comp-filled-button-icon-label-space: #{map.get($s, gap)};
221
434
  --md-comp-filled-button-outline-width: #{map.get($s, outline)};
435
+ --md-comp-filled-button-container-shape-square: #{map.get($s, square)};
436
+ --md-comp-filled-button-pressed-container-shape: #{map.get($s, pressed)};
222
437
  }
223
438
 
224
439
  /// The icon-button tokens for one rung of `$icon-button-sizes`.
225
440
  @mixin icon-button-size($name) {
226
441
  $s: map.get($icon-button-sizes, $name);
227
442
 
228
- --md-comp-icon-button-container-height: #{map.get($s, height)};
229
- --md-comp-icon-button-icon-size: #{map.get($s, icon)};
443
+ --md-comp-icon-button-container-height: #{rem(map.get($s, height))};
444
+ --md-comp-icon-button-icon-size: #{rem(map.get($s, icon))};
230
445
  --md-comp-icon-button-leading-space: #{map.get($s, space)};
231
446
  --md-comp-icon-button-trailing-space: #{map.get($s, space)};
232
447
  --md-comp-icon-button-narrow-space: #{map.get($s, narrow)};
@@ -306,14 +521,70 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
306
521
  }
307
522
  }
308
523
 
524
+ // The .toggle legend button is the same in every chart, so chart() writes
525
+ // it once, with the first chart in the build.
526
+ $_chart-toggle-written: false;
527
+
528
+ // With .toggle, a button shows or hides each series. It covers its legend
529
+ // item, swatch included, and a hidden series is struck through with a
530
+ // hollow swatch, so the state does not rest on color. The class keeps it
531
+ // out of the button styles, in _buttons.scss.
532
+ @mixin _chart-toggle {
533
+ .chart-toggle {
534
+ min-height: rem(48px);
535
+ padding: 0;
536
+ border: 0;
537
+ background: none;
538
+ color: inherit;
539
+ font: inherit;
540
+ cursor: pointer;
541
+
542
+ &::after {
543
+ content: "";
544
+ position: absolute;
545
+ inset: 0;
546
+ border-radius: 4px;
547
+ }
548
+
549
+ &:focus-visible {
550
+ outline: none;
551
+
552
+ &::after {
553
+ @include focus-ring();
554
+ }
555
+ }
556
+
557
+ &:hover {
558
+ color: var(--md-sys-color-on-surface);
559
+ }
560
+
561
+ &[aria-pressed="false"] {
562
+ text-decoration: line-through;
563
+ }
564
+
565
+ &[aria-disabled="true"] {
566
+ cursor: default;
567
+ }
568
+ }
569
+
570
+ li:has(> .chart-toggle[aria-pressed="false"])::before {
571
+ mask: radial-gradient(closest-side, transparent 50%, #000 calc(50% + 0.5px));
572
+ }
573
+ }
574
+
309
575
  // The parts LineChart draws for every chart type, prefixed with the
310
576
  // component's name: .#{$name}-plot, -cursor, -tooltip, -labels and -legend.
311
577
  // Defines the --md-comp-#{$name}-height, -grid-color and -color-1..4 tokens,
312
578
  // and --#{$name}-color on each [data-series]. Include it at the root of the
313
579
  // component's partial; the component adds its own marks and cursor look.
314
580
  @mixin chart($name) {
581
+ @if not $_chart-toggle-written {
582
+ $_chart-toggle-written: true !global;
583
+ @include _chart-toggle;
584
+ }
585
+
315
586
  .#{$name} {
316
- --md-comp-#{$name}-height: 240px;
587
+ --md-comp-#{$name}-height: #{rem(240px)};
317
588
  --md-comp-#{$name}-grid-color: var(--md-sys-color-outline-variant);
318
589
  --md-comp-#{$name}-color-1: var(--md-sys-color-primary);
319
590
  --md-comp-#{$name}-color-2: var(--md-sys-color-tertiary);
@@ -378,10 +649,10 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
378
649
  display: grid;
379
650
  grid-template-columns: auto auto;
380
651
  gap: 4px 16px;
381
- min-width: 120px;
652
+ min-width: rem(120px);
382
653
  margin: 0;
383
654
  padding: 12px 16px;
384
- border-radius: 12px;
655
+ border-radius: var(--md-sys-shape-corner-medium);
385
656
  background-color: var(--md-comp-#{$name}-tooltip-color);
386
657
  color: var(--md-sys-color-on-surface-variant);
387
658
  @include typescale("body-small");
@@ -439,6 +710,28 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
439
710
  text-overflow: ellipsis;
440
711
  white-space: nowrap;
441
712
  }
713
+
714
+ // When each label is wider than its column, LineChart keeps every nth
715
+ // one. A kept label spreads over the hidden ones beside it, still
716
+ // centred on its own column; the flex box centres what overflows. The
717
+ // end labels line up with the chart's edges, so none overflows them.
718
+ &[data-thinned] > li:not([data-skip]) {
719
+ display: flex;
720
+ justify-content: center;
721
+ overflow: visible;
722
+
723
+ &:first-child {
724
+ justify-content: start;
725
+ }
726
+
727
+ &:last-child {
728
+ justify-content: end;
729
+ }
730
+ }
731
+
732
+ > li[data-skip] {
733
+ visibility: hidden;
734
+ }
442
735
  }
443
736
 
444
737
  .#{$name}-legend {
@@ -447,6 +740,7 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
447
740
  gap: 4px 16px;
448
741
 
449
742
  > li {
743
+ position: relative;
450
744
  display: flex;
451
745
  align-items: center;
452
746
  gap: 8px;
@@ -497,3 +791,95 @@ $_state-layers: ("hover", "focus", "pressed", "dragged");
497
791
  }
498
792
  }
499
793
  }
794
+
795
+ // The columns' or bars' growth, inside their container: from the zero
796
+ // line, or after update() from where each span was, which ColumnChart
797
+ // writes as --from-top and --from-bottom. !important lets these starting
798
+ // values beat the inline --top and --bottom.
799
+ @mixin chart-column-motion {
800
+ @media (prefers-reduced-motion: no-preference) {
801
+ > div > span {
802
+ transition: clip-path var(--md-sys-motion-duration-medium4) var(--md-sys-motion-easing-standard);
803
+
804
+ @starting-style {
805
+ --top: var(--from-top, var(--zero, 100%)) !important;
806
+ --bottom: var(--from-bottom, calc(100% - var(--zero, 100%))) !important;
807
+ }
808
+ }
809
+ }
810
+ }
811
+
812
+ // The value labels LineChart draws for .axis: an .#{$name}-axis list in the
813
+ // plot, behind the marks, with each label's distance down the plot in --at.
814
+ // A label sits beside the plot with a grid line across it at its value; a
815
+ // mixed chart's end scale gets a second list, .end, on the far side, whose
816
+ // labels share those lines. With $beside the plot and row labels make room
817
+ // at the inline start (and end, for .end) for
818
+ // --md-comp-#{$name}-axis-width, 48px. Without it the component places the
819
+ // labels itself.
820
+ @mixin chart-axis($name, $beside: true) {
821
+ .#{$name}.axis {
822
+ --md-comp-#{$name}-axis-width: #{rem(48px)};
823
+
824
+ > .#{$name}-plot {
825
+ background: none;
826
+ }
827
+ }
828
+
829
+ @if $beside {
830
+ // Room for the top label's upper half.
831
+ .#{$name}.axis > .#{$name}-plot {
832
+ margin-block-start: 8px;
833
+ }
834
+
835
+ .#{$name}.axis > :is(.#{$name}-plot, .#{$name}-labels) {
836
+ margin-inline-start: var(--md-comp-#{$name}-axis-width);
837
+ }
838
+
839
+ .#{$name}.axis:has(.#{$name}-axis.end) > :is(.#{$name}-plot, .#{$name}-labels) {
840
+ margin-inline-end: var(--md-comp-#{$name}-axis-width);
841
+ }
842
+ }
843
+
844
+ .#{$name}-axis {
845
+ position: absolute;
846
+ inset: 0;
847
+ margin: 0;
848
+ padding: 0;
849
+ list-style: none;
850
+ color: var(--md-sys-color-on-surface-variant);
851
+ @include typescale("body-small");
852
+ font-variant-numeric: tabular-nums;
853
+ pointer-events: none;
854
+
855
+ > li {
856
+ position: absolute;
857
+ inset-inline: 0;
858
+ top: var(--at, 0%);
859
+ border-block-start: 1px solid var(--md-comp-#{$name}-grid-color);
860
+ }
861
+
862
+ > li > span {
863
+ position: absolute;
864
+ inset-inline-end: 100%;
865
+ box-sizing: border-box;
866
+ width: var(--md-comp-#{$name}-axis-width);
867
+ padding-inline-end: 8px;
868
+ overflow: hidden;
869
+ text-align: end;
870
+ text-overflow: ellipsis;
871
+ white-space: nowrap;
872
+ translate: 0 -50%;
873
+ }
874
+
875
+ &.end > li {
876
+ border: 0;
877
+ }
878
+
879
+ &.end > li > span {
880
+ inset-inline: 100% auto;
881
+ padding-inline: 8px 0;
882
+ text-align: start;
883
+ }
884
+ }
885
+ }
@@ -0,0 +1,63 @@
1
+ @use "sass:list";
2
+ @use "sass:math";
3
+ @use "sass:string";
4
+
5
+ // Springs, solved at compile time. M3 Expressive describes motion as springs
6
+ // (a damping ratio and a stiffness, mass 1) rather than as curves and
7
+ // durations. CSS has no spring timing function, so spring() samples the
8
+ // spring's position from rest to the target into a `linear()` easing, and
9
+ // spring-duration() returns how long it takes to settle. Use them together:
10
+ //
11
+ // transition: translate spring-duration(0.8, 380) spring(0.8, 380);
12
+ //
13
+ // tokens/_motion.scss emits M3's six standard and expressive springs as
14
+ // --md-sys-motion-spring-* tokens from these.
15
+
16
+ // Settled once within this fraction of the distance, about a pixel on a
17
+ // 200px move.
18
+ $_settle: 0.005;
19
+ $_samples: 24;
20
+
21
+ // Position at $t seconds, from 0 to 1, for a spring released at rest.
22
+ @function _position($t, $damping, $stiffness) {
23
+ $w: math.sqrt($stiffness);
24
+ @if $damping < 1 {
25
+ $wd: $w * math.sqrt(1 - $damping * $damping);
26
+ $decay: math.pow(math.$e, -$damping * $w * $t);
27
+ @return 1 - $decay * (math.cos($wd * $t) + math.div($damping * $w, $wd) * math.sin($wd * $t));
28
+ }
29
+ // Critically damped (M3's effects springs). Overdamped springs are not used.
30
+ @return 1 - math.pow(math.$e, -$w * $t) * (1 + $w * $t);
31
+ }
32
+
33
+ // Seconds until the spring stays within $_settle of the target. An
34
+ // underdamped spring settles when its envelope does; a critically damped one
35
+ // is stepped forward a millisecond at a time.
36
+ @function _settle-time($damping, $stiffness) {
37
+ $w: math.sqrt($stiffness);
38
+ @if $damping < 1 {
39
+ @return math.div(math.log(math.div(1, $_settle * math.sqrt(1 - $damping * $damping))), $damping * $w);
40
+ }
41
+ $t: 0;
42
+ @while 1 - _position($t, $damping, $stiffness) > $_settle {
43
+ $t: $t + 0.001;
44
+ }
45
+ @return $t;
46
+ }
47
+
48
+ /// How long the spring takes to settle, in milliseconds.
49
+ @function spring-duration($damping, $stiffness) {
50
+ @return math.round(_settle-time($damping, $stiffness) * 1000) * 1ms;
51
+ }
52
+
53
+ /// The spring as a `linear()` easing over spring-duration().
54
+ @function spring($damping, $stiffness) {
55
+ $end: _settle-time($damping, $stiffness);
56
+ $points: (0,);
57
+ @for $i from 1 to $_samples {
58
+ $x: _position($end * math.div($i, $_samples), $damping, $stiffness);
59
+ $points: list.append($points, string.unquote("#{math.div(math.round($x * 10000), 10000)} #{math.div(math.round(math.div($i, $_samples) * 1000), 10)}%"), comma);
60
+ }
61
+ $points: list.append($points, 1, comma);
62
+ @return string.unquote("linear(#{$points})");
63
+ }