@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
@@ -1,9 +1,11 @@
1
- import {
2
- Utils
3
- } from "./chunk-M372EDXD.mjs";
4
1
  import {
5
2
  Component
6
- } from "./chunk-PD6HYHAE.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ controllerFor,
7
+ restoreAttribute
8
+ } from "./chunk-ZVLOUDIJ.mjs";
7
9
 
8
10
  // src/ts/components/lightbox.ts
9
11
  var _defaults = {
@@ -14,16 +16,17 @@ var _defaults = {
14
16
  onCloseStart: null,
15
17
  onCloseEnd: null
16
18
  };
17
- var _Lightbox = class _Lightbox extends Component {
19
+ var Lightbox = class extends Component {
18
20
  constructor(el, options) {
19
- super(el, options, _Lightbox);
20
- /** Ancestors forced to `overflow: visible`, with the inline value to put back. */
21
- this._changedAncestorList = [];
21
+ super(el, options);
22
22
  this._timers = /* @__PURE__ */ new Map();
23
23
  this._motion = window.matchMedia("(prefers-reduced-motion: reduce)");
24
24
  this._isOpen = false;
25
25
  this._destroyed = false;
26
26
  this._revision = 0;
27
+ // Counts opens and closes only. _revision also moves when reduced motion
28
+ // flushes a transition, which must still report its end.
29
+ this._phase = 0;
27
30
  this._handleMotionChange = () => {
28
31
  if (!this._motion.matches) return;
29
32
  const callbacks = [...this._timers.values()];
@@ -37,7 +40,7 @@ var _Lightbox = class _Lightbox extends Component {
37
40
  }
38
41
  };
39
42
  this._handleLightboxKeypress = (e) => {
40
- if (this._trigger === this.el && (e.key === Utils.keys.ENTER || e.key === " ")) {
43
+ if (this._trigger === this.el && (e.key === "Enter" || e.key === " ")) {
41
44
  e.preventDefault();
42
45
  this._handleLightboxToggle();
43
46
  }
@@ -50,35 +53,38 @@ var _Lightbox = class _Lightbox extends Component {
50
53
  if (this.overlayActive) this.close();
51
54
  };
52
55
  this._handleWindowEscape = (e) => {
53
- if (e.key === Utils.keys.ESC) this.close();
56
+ if (e.key === "Escape") this.close();
57
+ };
58
+ // The image zooms in place, not in a modal, so Tab would reach the page
59
+ // behind the overlay. Tab closes it instead, then moves focus as usual.
60
+ this._handleWindowTab = (e) => {
61
+ if (e.key === "Tab") this.close();
54
62
  };
55
63
  /**
56
64
  * Open lightbox.
57
65
  */
58
66
  this.open = () => {
59
67
  if (this._destroyed || this._isOpen) return;
68
+ this._phase++;
60
69
  const revision = this._cancel();
61
70
  if (this.overlayActive) this._reset();
62
- this._isOpen = true;
63
71
  this._updateVars();
64
72
  const originRect = this.el.getBoundingClientRect();
65
73
  const placeholderRect = this.placeholder.getBoundingClientRect();
74
+ if (!originRect.width || !originRect.height) return;
75
+ this._isOpen = true;
66
76
  this.originalWidth = originRect.width;
67
77
  this.originalHeight = originRect.height;
68
78
  this.doneAnimating = false;
69
79
  this.el.classList.add("active");
70
80
  this.overlayActive = true;
71
- if (typeof this.options.onOpenStart === "function")
72
- this.options.onOpenStart.call(this, this.el);
73
- if (revision !== this._revision) return;
81
+ if (!this._notify("open", this.options.onOpenStart, { current: () => revision === this._revision })) return;
74
82
  this.placeholder.style.width = placeholderRect.width + "px";
75
83
  this.placeholder.style.height = placeholderRect.height + "px";
76
- this.placeholder.style.position = "relative";
77
- this.placeholder.style.top = "0";
78
- this.placeholder.style.left = "0";
79
- this._makeAncestorsOverflowVisible();
80
84
  this.el.style.position = "absolute";
81
- this.el.style.zIndex = "1000";
85
+ this.el.style.inset = "auto";
86
+ this.el.style.left = placeholderRect.left + window.scrollX + "px";
87
+ this.el.style.top = placeholderRect.top + window.scrollY + "px";
82
88
  this.el.style.willChange = "left, top, width, height";
83
89
  this.attrWidth = this.el.getAttribute("width");
84
90
  this.attrHeight = this.el.getAttribute("height");
@@ -91,6 +97,7 @@ var _Lightbox = class _Lightbox extends Component {
91
97
  this.el.removeAttribute("height");
92
98
  }
93
99
  this._addOverlay();
100
+ this._showOnTop(this.el);
94
101
  if (this.caption !== "") this._addCaption();
95
102
  const widthPercent = this.originalWidth / this.windowWidth;
96
103
  const heightPercent = this.originalHeight / this.windowHeight;
@@ -103,9 +110,13 @@ var _Lightbox = class _Lightbox extends Component {
103
110
  this.newWidth = this.windowHeight * 0.9 * ratio;
104
111
  this.newHeight = this.windowHeight * 0.9;
105
112
  }
106
- window.addEventListener("scroll", this._handleWindowChange, { passive: true });
107
- window.addEventListener("resize", this._handleWindowChange, { passive: true });
108
- window.addEventListener("keyup", this._handleWindowEscape);
113
+ this._windowEvents?.abort();
114
+ this._windowEvents = controllerFor(this.el);
115
+ const { signal } = this._windowEvents;
116
+ window.addEventListener("scroll", this._handleWindowChange, { passive: true, signal });
117
+ window.addEventListener("resize", this._handleWindowChange, { passive: true, signal });
118
+ window.addEventListener("keyup", this._handleWindowEscape, { signal });
119
+ window.addEventListener("keydown", this._handleWindowTab, { signal });
109
120
  this._animateImageIn();
110
121
  };
111
122
  /**
@@ -113,24 +124,17 @@ var _Lightbox = class _Lightbox extends Component {
113
124
  */
114
125
  this.close = () => {
115
126
  if (this._destroyed || !this._isOpen) return;
127
+ this._phase++;
116
128
  const revision = this._cancel();
117
129
  this._isOpen = false;
118
130
  this.doneAnimating = false;
119
- if (typeof this.options.onCloseStart === "function")
120
- this.options.onCloseStart.call(this, this.el);
121
- if (revision !== this._revision) return;
122
- window.removeEventListener("scroll", this._handleWindowChange);
123
- window.removeEventListener("resize", this._handleWindowChange);
124
- window.removeEventListener("keyup", this._handleWindowEscape);
131
+ if (!this._notify("close", this.options.onCloseStart, { current: () => revision === this._revision })) return;
132
+ this._windowEvents?.abort();
133
+ this._restoreFocus();
125
134
  if (this._overlay) this._fadeOut(this._overlay);
126
135
  if (this._photoCaption) this._fadeOut(this._photoCaption);
127
136
  this._animateImageOut();
128
137
  };
129
- this.el["Expressive_Lightbox"] = this;
130
- this.options = {
131
- ..._Lightbox.defaults,
132
- ...options
133
- };
134
138
  this.overlayActive = false;
135
139
  this.doneAnimating = true;
136
140
  this.placeholder = document.createElement("div");
@@ -149,53 +153,35 @@ var _Lightbox = class _Lightbox extends Component {
149
153
  static get defaults() {
150
154
  return _defaults;
151
155
  }
152
- /**
153
- * Initializes instances of Lightbox.
154
- * @param els HTML elements.
155
- * @param options Component options.
156
- */
157
- static init(els, options = {}) {
158
- return super.init(els, options, _Lightbox);
159
- }
160
- static getInstance(el) {
161
- return el["Expressive_Lightbox"];
162
- }
163
156
  destroy() {
164
157
  if (this._destroyed) return;
165
158
  this._destroyed = true;
166
- const root = this.el.getRootNode();
167
- const focused = root.activeElement === this.el;
168
- this._removeEventHandlers();
159
+ const focused = this.el.getRootNode().activeElement === this.el;
169
160
  this._cancel();
170
161
  this._reset();
171
162
  this.placeholder.replaceWith(this.el);
163
+ if (focused) this._restoreFocus();
164
+ restoreAttribute(this.el, "tabindex", this._tabindex);
165
+ super.destroy();
166
+ }
167
+ // Back to the trigger when focus fell to the body (or the shadow host), as
168
+ // a click on the overlay, which cannot take focus, leaves it.
169
+ _restoreFocus() {
170
+ const root = this.el.getRootNode();
172
171
  let active = document.activeElement;
173
172
  while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
174
- if (focused && (active === document.body || active === root.host)) this._trigger.focus();
175
- if (this._tabindex === null) this.el.removeAttribute("tabindex");
176
- else this.el.setAttribute("tabindex", this._tabindex);
177
- this.el["Expressive_Lightbox"] = void 0;
173
+ if ([document.body, root.host].includes(active)) this._trigger.focus({ preventScroll: true });
178
174
  }
179
175
  _reset() {
180
- window.removeEventListener("scroll", this._handleWindowChange);
181
- window.removeEventListener("resize", this._handleWindowChange);
182
- window.removeEventListener("keyup", this._handleWindowEscape);
176
+ this._windowEvents?.abort();
183
177
  this._overlay?.remove();
184
178
  this._photoCaption?.remove();
185
- for (const ancestor of this._changedAncestorList) {
186
- const saved = _Lightbox._overflow.get(ancestor);
187
- if (--saved.count === 0) {
188
- ancestor.style.setProperty("overflow", saved.value, saved.priority);
189
- _Lightbox._overflow.delete(ancestor);
190
- }
191
- }
192
- this._changedAncestorList = [];
179
+ this.el.removeAttribute("popover");
193
180
  if (this.attrWidth != null) this.el.setAttribute("width", this.attrWidth);
194
181
  if (this.attrHeight != null) this.el.setAttribute("height", this.attrHeight);
195
182
  this.el.classList.remove("active");
196
183
  this.placeholder.removeAttribute("style");
197
- if (this.originInlineStyles === null) this.el.removeAttribute("style");
198
- else this.el.setAttribute("style", this.originInlineStyles);
184
+ restoreAttribute(this.el, "style", this.originInlineStyles);
199
185
  this.overlayActive = false;
200
186
  this._isOpen = false;
201
187
  this.doneAnimating = true;
@@ -217,37 +203,23 @@ var _Lightbox = class _Lightbox extends Component {
217
203
  this._timers.set(timer, callback);
218
204
  }
219
205
  _setupEventHandlers() {
220
- this._motion.addEventListener("change", this._handleMotionChange);
221
- this._trigger.addEventListener("click", this._handleLightboxToggle);
222
- this.el.addEventListener("keydown", this._handleLightboxKeypress);
223
- }
224
- _removeEventHandlers() {
225
- this._motion.removeEventListener("change", this._handleMotionChange);
226
- this._trigger.removeEventListener("click", this._handleLightboxToggle);
227
- this.el.removeEventListener("keydown", this._handleLightboxKeypress);
206
+ const { signal } = this._events;
207
+ this._motion.addEventListener("change", this._handleMotionChange, { signal });
208
+ this._trigger.addEventListener("click", this._handleLightboxToggle, { signal });
209
+ this.el.addEventListener("keydown", this._handleLightboxKeypress, { signal });
228
210
  }
229
- _makeAncestorsOverflowVisible() {
230
- this._changedAncestorList = [];
231
- let ancestor = this.placeholder.parentNode;
232
- while (ancestor != null && ancestor !== document) {
233
- const curr = ancestor;
234
- if (curr.style && (curr.style.overflow !== "visible" || _Lightbox._overflow.has(curr))) {
235
- const saved = _Lightbox._overflow.get(curr) ?? { count: 0, value: curr.style.overflow, priority: curr.style.getPropertyPriority("overflow") };
236
- saved.count++;
237
- _Lightbox._overflow.set(curr, saved);
238
- this._changedAncestorList.push(curr);
239
- curr.style.overflow = "visible";
240
- }
241
- ancestor = ancestor.parentNode ?? ancestor.host;
242
- }
211
+ /**
212
+ * Shows `el` as a manual popover, so it is in the top layer: no ancestor
213
+ * clips or covers it, and it stacks above what was shown before it.
214
+ */
215
+ _showOnTop(el) {
216
+ el.setAttribute("popover", "manual");
217
+ el.showPopover();
243
218
  }
244
- _offset(el) {
245
- const box = el.getBoundingClientRect();
246
- const docElem = document.documentElement;
247
- return {
248
- top: box.top + window.scrollY - docElem.clientTop,
249
- left: box.left + window.scrollX - docElem.clientLeft
250
- };
219
+ /** The placeholder's document position, where the image rests. */
220
+ _restingPlace() {
221
+ const box = this.placeholder.getBoundingClientRect();
222
+ return { left: box.left + window.scrollX + "px", top: box.top + window.scrollY + "px" };
251
223
  }
252
224
  _updateVars() {
253
225
  this.windowWidth = window.innerWidth;
@@ -256,6 +228,7 @@ var _Lightbox = class _Lightbox extends Component {
256
228
  }
257
229
  // Image
258
230
  _animateImageIn() {
231
+ const phase = this._phase;
259
232
  this.el.style.maxHeight = this.newHeight.toString() + "px";
260
233
  this.el.style.maxWidth = this.newWidth.toString() + "px";
261
234
  const duration = this._motion.matches ? 0 : this.options.inDuration;
@@ -263,7 +236,6 @@ var _Lightbox = class _Lightbox extends Component {
263
236
  this.el.style.height = this.originalHeight + "px";
264
237
  this.el.style.width = this.originalWidth + "px";
265
238
  this._schedule(() => {
266
- const placeholderOffset = this._offset(this.placeholder);
267
239
  this.el.style.transition = `height ${duration}ms ease,
268
240
  width ${duration}ms ease,
269
241
  left ${duration}ms ease,
@@ -271,15 +243,16 @@ var _Lightbox = class _Lightbox extends Component {
271
243
  `;
272
244
  this.el.style.height = this.newHeight + "px";
273
245
  this.el.style.width = this.newWidth + "px";
274
- this.el.style.left = Utils.getDocumentScrollLeft() + this.windowWidth / 2 - placeholderOffset.left - this.newWidth / 2 + "px";
275
- this.el.style.top = Utils.getDocumentScrollTop() + this.windowHeight / 2 - placeholderOffset.top - this.newHeight / 2 + "px";
246
+ this.el.style.left = window.scrollX + (this.windowWidth - this.newWidth) / 2 + "px";
247
+ this.el.style.top = window.scrollY + (this.windowHeight - this.newHeight) / 2 + "px";
276
248
  }, 1);
277
249
  this._schedule(() => {
278
250
  this.doneAnimating = true;
279
- if (typeof this.options.onOpenEnd === "function") this.options.onOpenEnd.call(this, this.el);
251
+ this._notify("opened", this.options.onOpenEnd, { current: () => phase === this._phase });
280
252
  }, duration);
281
253
  }
282
254
  _animateImageOut() {
255
+ const phase = this._phase;
283
256
  const duration = this._motion.matches ? 0 : this.options.outDuration;
284
257
  this.el.style.transition = `height ${duration}ms ease,
285
258
  width ${duration}ms ease,
@@ -288,12 +261,10 @@ var _Lightbox = class _Lightbox extends Component {
288
261
  `;
289
262
  this.el.style.height = this.originalHeight + "px";
290
263
  this.el.style.width = this.originalWidth + "px";
291
- this.el.style.left = "0";
292
- this.el.style.top = "0";
264
+ Object.assign(this.el.style, this._restingPlace());
293
265
  this._schedule(() => {
294
266
  this._reset();
295
- if (typeof this.options.onCloseEnd === "function")
296
- this.options.onCloseEnd.call(this, this.el);
267
+ this._notify("closed", this.options.onCloseEnd, { current: () => phase === this._phase });
297
268
  }, duration);
298
269
  }
299
270
  // Caption
@@ -303,6 +274,7 @@ var _Lightbox = class _Lightbox extends Component {
303
274
  this._photoCaption.innerText = this.caption;
304
275
  Utils.portalRoot(this.el).append(this._photoCaption);
305
276
  this._photoCaption.style.display = "inline";
277
+ this._showOnTop(this._photoCaption);
306
278
  this._fadeIn(this._photoCaption);
307
279
  }
308
280
  // Overlay
@@ -318,11 +290,7 @@ var _Lightbox = class _Lightbox extends Component {
318
290
  { once: true }
319
291
  );
320
292
  this.el.before(this._overlay);
321
- const overlayOffset = this._overlay.getBoundingClientRect();
322
- this._overlay.style.width = this.windowWidth + "px";
323
- this._overlay.style.height = this.windowHeight + "px";
324
- this._overlay.style.left = -1 * overlayOffset.left + "px";
325
- this._overlay.style.top = -1 * overlayOffset.top + "px";
293
+ this._showOnTop(this._overlay);
326
294
  this._fadeIn(this._overlay);
327
295
  }
328
296
  _fadeIn(el) {
@@ -340,10 +308,9 @@ var _Lightbox = class _Lightbox extends Component {
340
308
  el.style.opacity = "0";
341
309
  }
342
310
  };
343
- _Lightbox._overflow = /* @__PURE__ */ new WeakMap();
344
- var Lightbox = _Lightbox;
311
+ Lightbox.key = "Expressive_Lightbox";
345
312
 
346
313
  export {
347
314
  Lightbox
348
315
  };
349
- //# sourceMappingURL=chunk-SFI2U4YW.mjs.map
316
+ //# sourceMappingURL=chunk-VMY55K2X.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/lightbox.ts"],
4
+ "sourcesContent": ["import { Utils, controllerFor, restoreAttribute } from '../core/utils';\nimport { BaseOptions, Component } from '../core/component';\n\nexport interface LightboxOptions extends BaseOptions {\n /**\n * Transition in duration in milliseconds.\n * @default 275\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 200\n */\n outDuration: number;\n /**\n * Callback function called before lightbox is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before lightbox is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: LightboxOptions = {\n inDuration: 275,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nexport class Lightbox extends Component<LightboxOptions> {\n /** If the lightbox overlay is showing. */\n overlayActive: boolean;\n /** If the lightbox is no longer being animated. */\n doneAnimating: boolean;\n /** Caption, if specified. */\n caption: string;\n /** Original width of image. */\n originalWidth: number;\n /** Original height of image. */\n originalHeight: number;\n private originInlineStyles: string;\n private placeholder: HTMLElement;\n private newHeight: number;\n private newWidth: number;\n private windowWidth: number;\n private windowHeight: number;\n private attrWidth: string;\n private attrHeight: string;\n private _overlay: HTMLElement;\n private _photoCaption: HTMLElement;\n private _trigger: HTMLElement;\n private _tabindex: string | null;\n private _timers = new Map<ReturnType<typeof setTimeout>, () => void>();\n private _motion = window.matchMedia('(prefers-reduced-motion: reduce)');\n private _isOpen = false;\n private _destroyed = false;\n /** Removes the listeners that close an open lightbox. */\n private _windowEvents: AbortController | undefined;\n private _revision = 0;\n // Counts opens and closes only. _revision also moves when reduced motion\n // flushes a transition, which must still report its end.\n private _phase = 0;\n\n constructor(el: HTMLElement, options: Partial<LightboxOptions>) {\n super(el, options);\n\n this.overlayActive = false;\n this.doneAnimating = true;\n this.placeholder = document.createElement('div');\n this.placeholder.classList.add('material-placeholder');\n this.originalWidth = 0;\n this.originalHeight = 0;\n this.originInlineStyles = this.el.getAttribute('style');\n this.caption = this.el.getAttribute('data-caption') || '';\n this._tabindex = this.el.getAttribute('tabindex');\n this._trigger = this.el.closest('button') ?? this.el;\n this.el.tabIndex = this._trigger === this.el ? 0 : -1;\n // Wrap\n this.el.before(this.placeholder);\n this.placeholder.append(this.el);\n this._setupEventHandlers();\n }\n\n static get defaults(): LightboxOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Lightbox';\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement === this.el;\n this._cancel();\n this._reset();\n this.placeholder.replaceWith(this.el);\n if (focused) this._restoreFocus();\n restoreAttribute(this.el, 'tabindex', this._tabindex);\n super.destroy();\n }\n\n // Back to the trigger when focus fell to the body (or the shadow host), as\n // a click on the overlay, which cannot take focus, leaves it.\n private _restoreFocus() {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n let active = document.activeElement;\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n if ([document.body, (root as ShadowRoot).host].includes(active)) this._trigger.focus({ preventScroll: true });\n }\n\n private _reset() {\n this._windowEvents?.abort();\n // Removing a popover, or its attribute, takes it out of the top layer.\n this._overlay?.remove();\n this._photoCaption?.remove();\n this.el.removeAttribute('popover');\n if (this.attrWidth != null) this.el.setAttribute('width', this.attrWidth);\n if (this.attrHeight != null) this.el.setAttribute('height', this.attrHeight);\n this.el.classList.remove('active');\n this.placeholder.removeAttribute('style');\n restoreAttribute(this.el, 'style', this.originInlineStyles);\n this.overlayActive = false;\n this._isOpen = false;\n this.doneAnimating = true;\n }\n\n private _cancel() {\n for (const timer of this._timers.keys()) clearTimeout(timer);\n this._timers.clear();\n return ++this._revision;\n }\n\n private _schedule(callback: () => void, delay: number) {\n if (this._motion.matches) { callback(); return; }\n const timer = setTimeout(() => { this._timers.delete(timer); callback(); }, delay);\n this._timers.set(timer, callback);\n }\n\n private _handleMotionChange = () => {\n if (!this._motion.matches) return;\n const callbacks = [...this._timers.values()];\n const revision = this._cancel();\n for (const callback of callbacks) {\n if (revision !== this._revision) break;\n callback();\n }\n if (this.overlayActive) {\n for (const el of [this.el, this._overlay, this._photoCaption]) if (el) el.style.transition = 'none';\n }\n };\n\n private _setupEventHandlers() {\n const { signal } = this._events;\n this._motion.addEventListener('change', this._handleMotionChange, { signal });\n this._trigger.addEventListener('click', this._handleLightboxToggle, { signal });\n this.el.addEventListener('keydown', this._handleLightboxKeypress, { signal });\n }\n\n private _handleLightboxKeypress = (e: KeyboardEvent) => {\n if (this._trigger === this.el && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n this._handleLightboxToggle();\n }\n };\n\n private _handleLightboxToggle = () => {\n // If already modal, return to original\n if (this._isOpen) this.close();\n else this.open();\n };\n\n private _handleWindowChange = () => {\n if (this.overlayActive) this.close();\n };\n\n private _handleWindowEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this.close();\n };\n\n // The image zooms in place, not in a modal, so Tab would reach the page\n // behind the overlay. Tab closes it instead, then moves focus as usual.\n private _handleWindowTab = (e: KeyboardEvent) => {\n if (e.key === 'Tab') this.close();\n };\n\n /**\n * Shows `el` as a manual popover, so it is in the top layer: no ancestor\n * clips or covers it, and it stacks above what was shown before it.\n */\n private _showOnTop(el: HTMLElement) {\n el.setAttribute('popover', 'manual');\n el.showPopover();\n }\n\n /** The placeholder's document position, where the image rests. */\n private _restingPlace() {\n const box = this.placeholder.getBoundingClientRect();\n return { left: box.left + window.scrollX + 'px', top: box.top + window.scrollY + 'px' };\n }\n\n private _updateVars(): void {\n this.windowWidth = window.innerWidth;\n this.windowHeight = window.innerHeight;\n this.caption = this.el.getAttribute('data-caption') || '';\n }\n\n // Image\n private _animateImageIn(): void {\n const phase = this._phase;\n this.el.style.maxHeight = this.newHeight.toString() + 'px';\n this.el.style.maxWidth = this.newWidth.toString() + 'px';\n const duration = this._motion.matches ? 0 : this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.height = this.originalHeight + 'px';\n this.el.style.width = this.originalWidth + 'px';\n this._schedule(() => {\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.newHeight + 'px';\n this.el.style.width = this.newWidth + 'px';\n this.el.style.left = window.scrollX + (this.windowWidth - this.newWidth) / 2 + 'px';\n this.el.style.top = window.scrollY + (this.windowHeight - this.newHeight) / 2 + 'px';\n }, 1);\n\n this._schedule(() => {\n this.doneAnimating = true;\n this._notify('opened', this.options.onOpenEnd, { current: () => phase === this._phase });\n }, duration);\n\n }\n private _animateImageOut(): void {\n const phase = this._phase;\n const duration = this._motion.matches ? 0 : this.options.outDuration;\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.originalHeight + 'px'; // was originalWidth\n this.el.style.width = this.originalWidth + 'px';\n Object.assign(this.el.style, this._restingPlace());\n this._schedule(() => {\n this._reset();\n // onCloseEnd callback\n this._notify('closed', this.options.onCloseEnd, { current: () => phase === this._phase });\n }, duration);\n }\n\n // Caption\n private _addCaption(): void {\n this._photoCaption = document.createElement('div');\n this._photoCaption.classList.add('lightbox-caption');\n this._photoCaption.innerText = this.caption;\n Utils.portalRoot(this.el).append(this._photoCaption);\n this._photoCaption.style.display = 'inline';\n this._showOnTop(this._photoCaption);\n this._fadeIn(this._photoCaption);\n }\n\n // Overlay\n private _addOverlay(): void {\n this._overlay = document.createElement('div');\n this._overlay.id = 'lightbox-overlay';\n this._overlay.addEventListener(\n 'click',\n (event) => {\n event.stopPropagation();\n this.close();\n },\n { once: true }\n );\n\n this.el.before(this._overlay);\n this._showOnTop(this._overlay);\n this._fadeIn(this._overlay);\n }\n\n private _fadeIn(el: HTMLElement): void {\n el.style.transition = 'none';\n el.style.opacity = '0';\n const duration = this._motion.matches ? 0 : this.options.inDuration;\n this._schedule(() => {\n el.style.transition = `opacity ${duration}ms ease`;\n el.style.opacity = '1';\n }, 1);\n }\n\n private _fadeOut(el: HTMLElement): void {\n const duration = this._motion.matches ? 0 : this.options.outDuration;\n el.style.transition = `opacity ${duration}ms ease`;\n el.style.opacity = '0';\n }\n\n /**\n * Open lightbox.\n */\n open = () => {\n if (this._destroyed || this._isOpen) return;\n this._phase++;\n const revision = this._cancel();\n if (this.overlayActive) this._reset();\n this._updateVars();\n // Both rects are read up front: measuring the placeholder after writing\n // its width forced a second layout for the height.\n const originRect = this.el.getBoundingClientRect();\n const placeholderRect = this.placeholder.getBoundingClientRect();\n // An image not yet loaded, or hidden, has no size to zoom from; the\n // ratios below would be 0 / 0.\n if (!originRect.width || !originRect.height) return;\n this._isOpen = true;\n this.originalWidth = originRect.width;\n this.originalHeight = originRect.height;\n // Set states\n this.doneAnimating = false;\n this.el.classList.add('active');\n this.overlayActive = true;\n // onOpenStart callback\n if (!this._notify('open', this.options.onOpenStart, { current: () => revision === this._revision })) return;\n // Set positioning for placeholder\n this.placeholder.style.width = placeholderRect.width + 'px';\n this.placeholder.style.height = placeholderRect.height + 'px';\n // In the top layer the image is positioned in the document, starting\n // where the placeholder holds its place.\n this.el.style.position = 'absolute';\n this.el.style.inset = 'auto';\n this.el.style.left = placeholderRect.left + window.scrollX + 'px';\n this.el.style.top = placeholderRect.top + window.scrollY + 'px';\n this.el.style.willChange = 'left, top, width, height';\n // Change from width or height attribute to css\n this.attrWidth = this.el.getAttribute('width');\n this.attrHeight = this.el.getAttribute('height');\n if (this.attrWidth) {\n this.el.style.width = this.attrWidth + 'px';\n this.el.removeAttribute('width');\n }\n if (this.attrHeight) {\n this.el.style.height = this.attrHeight + 'px'; // was width, from the height attribute\n this.el.removeAttribute('height');\n }\n // The overlay, the image and the caption go into the top layer in that\n // order, so each stacks above the one before.\n this._addOverlay();\n this._showOnTop(this.el);\n if (this.caption !== '') this._addCaption();\n // Resize Image\n const widthPercent = this.originalWidth / this.windowWidth;\n const heightPercent = this.originalHeight / this.windowHeight;\n if (widthPercent > heightPercent) {\n // Width first\n const ratio = this.originalHeight / this.originalWidth;\n this.newWidth = this.windowWidth * 0.9;\n this.newHeight = this.windowWidth * 0.9 * ratio;\n } else {\n // Height first\n const ratio = this.originalWidth / this.originalHeight;\n this.newWidth = this.windowHeight * 0.9 * ratio;\n this.newHeight = this.windowHeight * 0.9;\n }\n // Handle Exit triggers\n this._windowEvents?.abort();\n this._windowEvents = controllerFor(this.el);\n const { signal } = this._windowEvents;\n window.addEventListener('scroll', this._handleWindowChange, { passive: true, signal });\n window.addEventListener('resize', this._handleWindowChange, { passive: true, signal });\n window.addEventListener('keyup', this._handleWindowEscape, { signal });\n window.addEventListener('keydown', this._handleWindowTab, { signal });\n this._animateImageIn();\n };\n\n /**\n * Close lightbox.\n */\n close = () => {\n if (this._destroyed || !this._isOpen) return;\n this._phase++;\n const revision = this._cancel();\n this._isOpen = false;\n this.doneAnimating = false;\n // onCloseStart callback\n if (!this._notify('close', this.options.onCloseStart, { current: () => revision === this._revision })) return;\n // disable exit handlers\n this._windowEvents?.abort();\n this._restoreFocus();\n if (this._overlay) this._fadeOut(this._overlay);\n if (this._photoCaption) this._fadeOut(this._photoCaption);\n this._animateImageOut();\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-PD6HYHAE.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
4
 
5
5
  // src/ts/components/confetti.ts
6
6
  var _defaults = {
@@ -23,26 +23,18 @@ var FALLBACK_COLORS = ["#26ccff", "#a25afd", "#ff5e7e", "#88ff5a", "#fcff42", "#
23
23
  var RAD = Math.PI / 180;
24
24
  var scenes = /* @__PURE__ */ new Map();
25
25
  var overlay = null;
26
- var Confetti = class _Confetti extends Component {
26
+ var _Confetti = class _Confetti extends Component {
27
27
  constructor(el, options) {
28
- super(el, options, _Confetti);
28
+ super(el, options);
29
29
  this._onClick = () => {
30
30
  this.fire();
31
31
  };
32
- this.el["Expressive_Confetti"] = this;
33
- this.options = { ..._Confetti.defaults, ...options };
34
- if (!(el instanceof HTMLCanvasElement)) el.addEventListener("click", this._onClick);
32
+ if (!(el instanceof HTMLCanvasElement)) el.addEventListener("click", this._onClick, { signal: this._events.signal });
35
33
  else if (!this.options.manualStart) this.fire();
36
34
  }
37
35
  static get defaults() {
38
36
  return _defaults;
39
37
  }
40
- static init(els, options = {}) {
41
- return super.init(els, options, _Confetti);
42
- }
43
- static getInstance(el) {
44
- return el["Expressive_Confetti"];
45
- }
46
38
  /**
47
39
  * Bursts over the whole viewport. Resolves when the last piece is gone.
48
40
  */
@@ -64,13 +56,14 @@ var Confetti = class _Confetti extends Component {
64
56
  return burst(viewportCanvas, this.el.parentElement ?? document.body, merged);
65
57
  }
66
58
  destroy() {
67
- this.el.removeEventListener("click", this._onClick);
68
59
  if (this.el instanceof HTMLCanvasElement) stop(this.el);
69
- this.el["Expressive_Confetti"] = void 0;
60
+ super.destroy();
70
61
  }
71
62
  };
63
+ _Confetti.key = "Expressive_Confetti";
64
+ var Confetti = _Confetti;
72
65
  function burst(getCanvas, themed, o) {
73
- if (typeof matchMedia === "function" && matchMedia("(prefers-reduced-motion: reduce)").matches) return Promise.resolve();
66
+ if (matchMedia("(prefers-reduced-motion: reduce)").matches) return Promise.resolve();
74
67
  const canvas = getCanvas();
75
68
  let scene = scenes.get(canvas);
76
69
  if (!scene) {
@@ -183,10 +176,11 @@ function viewportCanvas() {
183
176
  height: "100%",
184
177
  margin: "0",
185
178
  padding: "0",
179
+ // The fallback keeps the order where the sheet, and so the token, is absent.
186
180
  border: "0",
187
181
  background: "transparent",
188
182
  pointerEvents: "none",
189
- zIndex: "10001"
183
+ zIndex: "var(--expressive-z-confetti, 10001)"
190
184
  });
191
185
  document.body.append(overlay);
192
186
  if (typeof overlay.showPopover === "function") {
@@ -211,4 +205,4 @@ function themeColors(themed) {
211
205
  export {
212
206
  Confetti
213
207
  };
214
- //# sourceMappingURL=chunk-KUFHW3DS.mjs.map
208
+ //# sourceMappingURL=chunk-VR3L2WN5.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/confetti.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\n\nexport type ConfettiShape = 'square' | 'circle' | 'star';\n\nexport interface ConfettiOptions extends BaseOptions {\n /**\n * Pieces per burst.\n * @default 50\n */\n particleCount: number;\n /**\n * Launch direction in degrees. 90 is straight up, 0 is right.\n * @default 90\n */\n angle: number;\n /**\n * How far the pieces fan out from the angle, in degrees.\n * @default 45\n */\n spread: number;\n /**\n * Launch speed in pixels per frame.\n * @default 45\n */\n startVelocity: number;\n /**\n * Share of its speed a piece keeps each frame.\n * @default 0.9\n */\n decay: number;\n /**\n * Pull toward the bottom. 0 floats, 1 is normal.\n * @default 1\n */\n gravity: number;\n /**\n * Sideways push per frame. Negative drifts left.\n * @default 0\n */\n drift: number;\n /**\n * Frames a piece lives while it fades out.\n * @default 200\n */\n ticks: number;\n /**\n * Launch point as fractions of the canvas, 0 to 1. A missing side is\n * 0.5. A trigger element ignores it and launches from its own center.\n * @default { x: 0.5, y: 0.5 }\n */\n origin: { x?: number; y?: number };\n /**\n * CSS colors. Empty uses the theme's primary, secondary and tertiary\n * colors and their containers.\n * @default []\n */\n colors: string[];\n /**\n * @default ['square', 'circle']\n */\n shapes: ConfettiShape[];\n /**\n * Piece size multiplier.\n * @default 1\n */\n scalar: number;\n /**\n * On a canvas, wait for `fire()` instead of bursting once at init.\n * @default false\n */\n manualStart: boolean;\n}\n\nconst _defaults: ConfettiOptions = {\n particleCount: 50,\n angle: 90,\n spread: 45,\n startVelocity: 45,\n decay: 0.9,\n gravity: 1,\n drift: 0,\n ticks: 200,\n origin: { x: 0.5, y: 0.5 },\n colors: [],\n shapes: ['square', 'circle'],\n scalar: 1,\n manualStart: false\n};\n\nconst THEME_COLORS = ['primary', 'secondary', 'tertiary', 'primary-container', 'secondary-container', 'tertiary-container'];\n// Used when the page has no theme tokens.\nconst FALLBACK_COLORS = ['#26ccff', '#a25afd', '#ff5e7e', '#88ff5a', '#fcff42', '#ffa62d', '#ff36ff'];\nconst RAD = Math.PI / 180;\n\ninterface Piece {\n x: number;\n y: number;\n velocity: number;\n angle: number;\n wobble: number;\n wobbleSpeed: number;\n tilt: number;\n tick: number;\n color: string;\n shape: ConfettiShape;\n options: ConfettiOptions;\n}\n\ninterface Scene {\n ctx: CanvasRenderingContext2D;\n pieces: Piece[];\n frame: number;\n last: number;\n done: (() => void)[];\n overlay: boolean;\n}\n\nconst scenes = new Map<HTMLCanvasElement, Scene>();\nlet overlay: HTMLCanvasElement | null = null;\n\n/**\n * Confetti. Bursts of theme-colored pieces drawn on a canvas.\n *\n * - `Confetti.fire(options)` bursts over the whole viewport.\n * - Any other `.confetti` element bursts from its center when clicked.\n * - A `<canvas class=\"confetti\">` bursts inside its own box, once at init\n * unless `manualStart`, and again on each `fire()`.\n *\n * The viewport canvas is a manual popover, so it draws above an open modal\n * dialog, and it ignores the pointer. Nothing is drawn when the reader\n * prefers reduced motion.\n */\nexport class Confetti extends Component<ConfettiOptions> {\n private _onClick = () => { this.fire(); };\n\n constructor(el: HTMLElement, options: Partial<ConfettiOptions>) {\n super(el, options);\n if (!(el instanceof HTMLCanvasElement)) el.addEventListener('click', this._onClick, { signal: this._events.signal });\n else if (!this.options.manualStart) this.fire();\n }\n\n static get defaults(): ConfettiOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Confetti';\n\n /**\n * Bursts over the whole viewport. Resolves when the last piece is gone.\n */\n static fire(options: Partial<ConfettiOptions> = {}): Promise<void> {\n return burst(viewportCanvas, document.body, { ...Confetti.defaults, ...options });\n }\n\n /**\n * Bursts on this canvas, or from this element's center over the viewport.\n * Resolves when the last piece is gone.\n */\n fire(options: Partial<ConfettiOptions> = {}): Promise<void> {\n const merged = { ...this.options, ...options };\n if (this.el instanceof HTMLCanvasElement) {\n const canvas = this.el;\n return burst(() => canvas, canvas.parentElement ?? document.body, merged);\n }\n const r = this.el.getBoundingClientRect();\n merged.origin = { x: (r.left + r.width / 2) / innerWidth, y: (r.top + r.height / 2) / innerHeight };\n return burst(viewportCanvas, this.el.parentElement ?? document.body, merged);\n }\n\n destroy() {\n if (this.el instanceof HTMLCanvasElement) stop(this.el);\n super.destroy();\n }\n}\n\n// `themed` is where the theme colors are read, so a scoped theme applies.\nfunction burst(getCanvas: () => HTMLCanvasElement, themed: Element, o: ConfettiOptions): Promise<void> {\n if (matchMedia('(prefers-reduced-motion: reduce)').matches) return Promise.resolve();\n const canvas = getCanvas();\n let scene = scenes.get(canvas);\n if (!scene) {\n const ctx = canvas.getContext('2d');\n if (!ctx) return Promise.resolve();\n scene = { ctx, pieces: [], frame: 0, last: 0, done: [], overlay: canvas === overlay };\n scenes.set(canvas, scene);\n }\n const { width, height } = fit(canvas);\n const colors = o.colors.length ? o.colors : themeColors(themed);\n const x = (o.origin.x ?? 0.5) * width;\n const y = (o.origin.y ?? 0.5) * height;\n for (let i = 0; i < o.particleCount; i++) {\n scene.pieces.push({\n x, y,\n velocity: o.startVelocity * (0.5 + Math.random()),\n angle: -o.angle * RAD + (0.5 - Math.random()) * o.spread * RAD,\n wobble: Math.random() * 10,\n wobbleSpeed: 0.05 + Math.random() * 0.05,\n tilt: (0.25 + Math.random() / 2) * Math.PI,\n tick: 0,\n color: colors[i % colors.length],\n shape: o.shapes[Math.floor(Math.random() * o.shapes.length)] ?? 'square',\n options: o\n });\n }\n const s = scene;\n if (!s.frame) s.frame = requestAnimationFrame((now) => { s.last = now; draw(canvas, s, now); });\n return new Promise((resolve) => s.done.push(resolve));\n}\n\nfunction draw(canvas: HTMLCanvasElement, scene: Scene, now: number) {\n // Frames are counted at 60 per second whatever the display rate.\n const step = Math.min((now - scene.last) / (1000 / 60), 4);\n scene.last = now;\n const { width, height } = fit(canvas);\n const { ctx } = scene;\n const dpr = canvas.width / (width || 1);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n scene.pieces = scene.pieces.filter((p) => {\n const o = p.options;\n p.x += (Math.cos(p.angle) * p.velocity + o.drift) * step;\n p.y += (Math.sin(p.angle) * p.velocity + o.gravity * 3) * step;\n p.velocity *= o.decay ** step;\n p.wobble += p.wobbleSpeed * step;\n p.tilt += 0.1 * step;\n p.tick += step;\n if (p.tick >= o.ticks) return false;\n const size = 8 * o.scalar;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.translate(p.x + 10 * o.scalar * Math.cos(p.wobble), p.y + 10 * o.scalar * Math.sin(p.wobble));\n ctx.rotate(p.tilt);\n ctx.scale(1, Math.cos(p.wobble));\n ctx.globalAlpha = 1 - p.tick / o.ticks;\n ctx.fillStyle = p.color;\n ctx.beginPath();\n if (p.shape === 'circle') ctx.arc(0, 0, size / 2, 0, 2 * Math.PI);\n else if (p.shape === 'star') star(ctx, size * 0.75);\n else ctx.rect(-size / 2, -size / 2, size, size);\n ctx.fill();\n return true;\n });\n if (scene.pieces.length) scene.frame = requestAnimationFrame((t) => draw(canvas, scene, t));\n else stop(canvas);\n}\n\nfunction stop(canvas: HTMLCanvasElement) {\n const scene = scenes.get(canvas);\n if (!scene) return;\n cancelAnimationFrame(scene.frame);\n scenes.delete(canvas);\n scene.ctx.setTransform(1, 0, 0, 1, 0, 0);\n scene.ctx.clearRect(0, 0, canvas.width, canvas.height);\n if (scene.overlay) {\n canvas.remove();\n overlay = null;\n }\n for (const resolve of scene.done) resolve();\n}\n\nfunction star(ctx: CanvasRenderingContext2D, r: number) {\n for (let i = 0; i < 10; i++) {\n const a = (i * Math.PI) / 5 - Math.PI / 2;\n const d = i % 2 ? r / 2 : r;\n ctx.lineTo(Math.cos(a) * d, Math.sin(a) * d);\n }\n ctx.closePath();\n}\n\n// Matches the canvas's pixel buffer to its box and the screen's pixel ratio.\nfunction fit(canvas: HTMLCanvasElement) {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n const w = Math.round(width * devicePixelRatio);\n const h = Math.round(height * devicePixelRatio);\n if (canvas.width !== w || canvas.height !== h) {\n canvas.width = w;\n canvas.height = h;\n }\n return { width, height };\n}\n\nfunction viewportCanvas(): HTMLCanvasElement {\n if (overlay?.isConnected) return overlay;\n overlay = document.createElement('canvas');\n overlay.className = 'confetti-overlay';\n overlay.setAttribute('aria-hidden', 'true');\n // Inline, so the overlay works even where the stylesheet does not reach.\n Object.assign(overlay.style, {\n position: 'fixed', inset: '0', width: '100%', height: '100%', margin: '0', padding: '0',\n // The fallback keeps the order where the sheet, and so the token, is absent.\n border: '0', background: 'transparent', pointerEvents: 'none', zIndex: 'var(--expressive-z-confetti, 10001)'\n });\n document.body.append(overlay);\n if (typeof overlay.showPopover === 'function') {\n overlay.popover = 'manual';\n overlay.showPopover();\n }\n return overlay;\n}\n\n// Resolves each theme color token through `color`, so light-dark() and\n// relative colors reach the canvas as plain colors.\nfunction themeColors(themed: Element): string[] {\n const probe = document.createElement('span');\n probe.hidden = true;\n themed.append(probe);\n const style = getComputedStyle(probe);\n const colors = THEME_COLORS.filter((role) => style.getPropertyValue(`--md-sys-color-${role}`).trim()).map((role) => {\n probe.style.color = `var(--md-sys-color-${role})`;\n return getComputedStyle(probe).color;\n });\n probe.remove();\n return colors.length ? colors : FALLBACK_COLORS;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,38 @@
1
+ // src/ts/core/spring.ts
2
+ var FPS = 60;
3
+ var REST = 0.5;
4
+ var LONGEST = 5;
5
+ function displacement(x0, v0, { damping, stiffness }, t) {
6
+ const w = Math.sqrt(stiffness);
7
+ if (damping >= 1) return Math.exp(-w * t) * (x0 + (v0 + w * x0) * t);
8
+ const wd = w * Math.sqrt(1 - damping * damping);
9
+ return Math.exp(-damping * w * t) * (x0 * Math.cos(wd * t) + (v0 + damping * w * x0) / wd * Math.sin(wd * t));
10
+ }
11
+ function springPath(from, to, velocity, spring) {
12
+ const path = [from];
13
+ const [x0, v0] = [from - to, velocity * 1e3];
14
+ for (let frame = 1; frame < LONGEST * FPS; frame++) {
15
+ const x = displacement(x0, v0, spring, frame / FPS);
16
+ path.push(to + x);
17
+ if (Math.abs(x) < REST && Math.abs(to + x - path[frame - 1]) < REST) break;
18
+ }
19
+ path.push(to);
20
+ return path;
21
+ }
22
+ function springToken(el, name) {
23
+ const style = getComputedStyle(el);
24
+ const read = (part) => parseFloat(style.getPropertyValue(`--md-sys-motion-spring-${name}-${part}`));
25
+ const [damping, stiffness] = [read("damping"), read("stiffness")];
26
+ return damping > 0 && stiffness > 0 ? { damping, stiffness } : null;
27
+ }
28
+ function animatePath(el, property, path, write) {
29
+ const frames = path.map((value) => ({ [property]: write(value) }));
30
+ return el.animate(frames, { duration: (path.length - 1) * 1e3 / FPS, easing: "linear" });
31
+ }
32
+
33
+ export {
34
+ springPath,
35
+ springToken,
36
+ animatePath
37
+ };
38
+ //# sourceMappingURL=chunk-W6FAL3TI.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/core/spring.ts"],
4
+ "sourcesContent": ["/**\n * Springs solved at run time. The CSS springs are sampled at build time\n * into linear() easings that always start from rest, so motion that is\n * interrupted restarts. A spring solved here starts from where something\n * is, at the speed it has, as M3's springs do: mass 1, a damping ratio and\n * a stiffness.\n */\nexport interface Spring {\n damping: number;\n stiffness: number;\n}\n\n/** Frames per second the path is sampled at. */\nconst FPS = 60;\n/** Settled once within this distance of the target and moving less than this a frame. */\nconst REST = 0.5;\n/** No spring runs longer than this, in seconds. */\nconst LONGEST = 5;\n\n/**\n * How far from the target a spring is at `t` seconds, released `x0` away\n * at speed `v0`: underdamped springs oscillate as they decay, and M3's\n * critically damped ones do not.\n */\nfunction displacement(x0: number, v0: number, { damping, stiffness }: Spring, t: number) {\n const w = Math.sqrt(stiffness);\n if (damping >= 1) return Math.exp(-w * t) * (x0 + (v0 + w * x0) * t);\n const wd = w * Math.sqrt(1 - damping * damping);\n return Math.exp(-damping * w * t) * (x0 * Math.cos(wd * t) + ((v0 + damping * w * x0) / wd) * Math.sin(wd * t));\n}\n\n/**\n * The spring's path from `from` to `to`, released at `velocity` in units\n * per millisecond, as one value a frame until it settles on `to`.\n */\nexport function springPath(from: number, to: number, velocity: number, spring: Spring): number[] {\n const path = [from];\n const [x0, v0] = [from - to, velocity * 1000];\n for (let frame = 1; frame < LONGEST * FPS; frame++) {\n const x = displacement(x0, v0, spring, frame / FPS);\n path.push(to + x);\n if (Math.abs(x) < REST && Math.abs(to + x - path[frame - 1]) < REST) break;\n }\n path.push(to);\n return path;\n}\n\n/** The spring a CSS token names, from its -damping and -stiffness tokens, or null without them. */\nexport function springToken(el: Element, name: string): Spring | null {\n const style = getComputedStyle(el);\n const read = (part: string) => parseFloat(style.getPropertyValue(`--md-sys-motion-spring-${name}-${part}`));\n const [damping, stiffness] = [read('damping'), read('stiffness')];\n return damping > 0 && stiffness > 0 ? { damping, stiffness } : null;\n}\n\n/** Plays a path on one property, `write` turning each value into CSS. */\nexport function animatePath(el: Element, property: string, path: number[], write: (value: number) => string): Animation {\n const frames = path.map((value) => ({ [property]: write(value) }));\n return el.animate(frames, { duration: ((path.length - 1) * 1000) / FPS, easing: 'linear' });\n}\n"],
5
+ "mappings": ";AAaA,IAAM,MAAM;AAEZ,IAAM,OAAO;AAEb,IAAM,UAAU;AAOhB,SAAS,aAAa,IAAY,IAAY,EAAE,SAAS,UAAU,GAAW,GAAW;AACvF,QAAM,IAAI,KAAK,KAAK,SAAS;AAC7B,MAAI,WAAW,EAAG,QAAO,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,KAAK,IAAI,MAAM;AAClE,QAAM,KAAK,IAAI,KAAK,KAAK,IAAI,UAAU,OAAO;AAC9C,SAAO,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,KAAM,KAAK,UAAU,IAAI,MAAM,KAAM,KAAK,IAAI,KAAK,CAAC;AAC/G;AAMO,SAAS,WAAW,MAAc,IAAY,UAAkB,QAA0B;AAC/F,QAAM,OAAO,CAAC,IAAI;AAClB,QAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,WAAW,GAAI;AAC5C,WAAS,QAAQ,GAAG,QAAQ,UAAU,KAAK,SAAS;AAClD,UAAM,IAAI,aAAa,IAAI,IAAI,QAAQ,QAAQ,GAAG;AAClD,SAAK,KAAK,KAAK,CAAC;AAChB,QAAI,KAAK,IAAI,CAAC,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC,IAAI,KAAM;AAAA,EACvE;AACA,OAAK,KAAK,EAAE;AACZ,SAAO;AACT;AAGO,SAAS,YAAY,IAAa,MAA6B;AACpE,QAAM,QAAQ,iBAAiB,EAAE;AACjC,QAAM,OAAO,CAAC,SAAiB,WAAW,MAAM,iBAAiB,0BAA0B,IAAI,IAAI,IAAI,EAAE,CAAC;AAC1G,QAAM,CAAC,SAAS,SAAS,IAAI,CAAC,KAAK,SAAS,GAAG,KAAK,WAAW,CAAC;AAChE,SAAO,UAAU,KAAK,YAAY,IAAI,EAAE,SAAS,UAAU,IAAI;AACjE;AAGO,SAAS,YAAY,IAAa,UAAkB,MAAgB,OAA6C;AACtH,QAAM,SAAS,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,MAAM,KAAK,EAAE,EAAE;AACjE,SAAO,GAAG,QAAQ,QAAQ,EAAE,WAAY,KAAK,SAAS,KAAK,MAAQ,KAAK,QAAQ,SAAS,CAAC;AAC5F;",
6
+ "names": []
7
+ }