@expressivecss/expressive 0.16.0 → 0.17.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 (384) hide show
  1. package/CHANGELOG.md +306 -1
  2. package/README.md +1 -1
  3. package/dist/css/expressive.css +540 -646
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/js/chunks/{chunk-PA7NU5AK.mjs → chunk-26VUH75M.mjs} +6 -3
  8. package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
  9. package/dist/js/chunks/{chunk-NBJAUGPP.mjs → chunk-2LFCOGC3.mjs} +12 -23
  10. package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
  11. package/dist/js/chunks/{chunk-OP43LLIC.mjs → chunk-36GELQGX.mjs} +4 -4
  12. package/dist/js/chunks/{chunk-OP43LLIC.mjs.map → chunk-36GELQGX.mjs.map} +2 -2
  13. package/dist/js/chunks/{chunk-EC26RU2D.mjs → chunk-3FKWIRHW.mjs} +6 -2
  14. package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
  15. package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs → chunk-3KF65KGL.mjs} +3 -3
  16. package/dist/js/chunks/{chunk-4QUCNFSD.mjs → chunk-3KLZRQZI.mjs} +31 -10
  17. package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
  18. package/dist/js/chunks/{chunk-75E5EDJF.mjs → chunk-3XORNED5.mjs} +2 -2
  19. package/dist/js/chunks/{chunk-NNHVANQA.mjs → chunk-4WBGAQN3.mjs} +3 -3
  20. package/dist/js/chunks/{chunk-ZJNLAGY5.mjs → chunk-5F4URJHL.mjs} +2 -2
  21. package/dist/js/chunks/{chunk-ZVLOUDIJ.mjs → chunk-67UNY7RH.mjs} +50 -2
  22. package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
  23. package/dist/js/chunks/{chunk-P6DRQ6KS.mjs → chunk-7CXNATJS.mjs} +6 -5
  24. package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
  25. package/dist/js/chunks/{chunk-4TRZ2AER.mjs → chunk-7X44MKEQ.mjs} +15 -14
  26. package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
  27. package/dist/js/chunks/{chunk-GWZ76SR4.mjs → chunk-7ZAMOMGY.mjs} +12 -7
  28. package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
  29. package/dist/js/chunks/{chunk-GVZQH2H5.mjs → chunk-AEG6LOAJ.mjs} +2 -2
  30. package/dist/js/chunks/{chunk-Y6TLRA3U.mjs → chunk-AQNFCJJ5.mjs} +27 -21
  31. package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
  32. package/dist/js/chunks/{chunk-OUCHKSAW.mjs → chunk-B55LWKBM.mjs} +16 -4
  33. package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
  34. package/dist/js/chunks/{chunk-AI73GJKG.mjs → chunk-BB5VXYXT.mjs} +2 -2
  35. package/dist/js/chunks/{chunk-2RLBDFH4.mjs → chunk-BDATLH3H.mjs} +4 -4
  36. package/dist/js/chunks/{chunk-2CS6TITK.mjs → chunk-CWMQOT4O.mjs} +23 -10
  37. package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
  38. package/dist/js/chunks/{chunk-ZKWUWBUB.mjs → chunk-CY2CTOVM.mjs} +2 -2
  39. package/dist/js/chunks/{chunk-CSYWKEK3.mjs → chunk-DWA5UYLJ.mjs} +58 -27
  40. package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
  41. package/dist/js/chunks/{chunk-CMGXGYUC.mjs → chunk-EB2V4OKL.mjs} +14 -9
  42. package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
  43. package/dist/js/chunks/{chunk-Z4GICXR2.mjs → chunk-EWO662ZC.mjs} +5 -7
  44. package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
  45. package/dist/js/chunks/{chunk-VGY4M57S.mjs → chunk-F7LAKFMX.mjs} +67 -34
  46. package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
  47. package/dist/js/chunks/{chunk-67ZPPKXS.mjs → chunk-FNIIH2LU.mjs} +3 -3
  48. package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
  49. package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
  50. package/dist/js/chunks/{chunk-DZYVU75J.mjs → chunk-GFWYMWYN.mjs} +18 -14
  51. package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
  52. package/dist/js/chunks/{chunk-3L3QIYLC.mjs → chunk-H5ISU45X.mjs} +8 -6
  53. package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
  54. package/dist/js/chunks/{chunk-QXKWVHBD.mjs → chunk-H6YIKFAQ.mjs} +67 -46
  55. package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
  56. package/dist/js/chunks/{chunk-KZPSAXIU.mjs → chunk-HEH7E3KO.mjs} +22 -12
  57. package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
  58. package/dist/js/chunks/{chunk-T3BNSRP3.mjs → chunk-HQRLBTNM.mjs} +3 -3
  59. package/dist/js/chunks/{chunk-NAC72P7R.mjs → chunk-I2F7MLUU.mjs} +2 -2
  60. package/dist/js/chunks/{chunk-ZM3XBHWV.mjs → chunk-IQOTGGHX.mjs} +86 -35
  61. package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
  62. package/dist/js/chunks/{chunk-QACZ6TUP.mjs → chunk-JH3YWKA6.mjs} +5 -4
  63. package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
  64. package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
  65. package/dist/js/chunks/{chunk-4IKVPCSU.mjs.map → chunk-JOLJAYIJ.mjs.map} +1 -1
  66. package/dist/js/chunks/{chunk-BPF3I2MN.mjs → chunk-KOTGMCMI.mjs} +9 -2
  67. package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
  68. package/dist/js/chunks/{chunk-ANKFWNWT.mjs → chunk-LC4O5LFS.mjs} +3 -3
  69. package/dist/js/chunks/{chunk-4PIXLDNJ.mjs → chunk-LEF33SCP.mjs} +2 -2
  70. package/dist/js/chunks/{chunk-ILDRRG7T.mjs → chunk-LFORZRPH.mjs} +3 -3
  71. package/dist/js/chunks/{chunk-Z4OARDZ7.mjs → chunk-LWLNV5EC.mjs} +26 -17
  72. package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-WU7XJ4RR.mjs → chunk-LXRHUQAX.mjs} +66 -25
  74. package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-VMY55K2X.mjs → chunk-MA2SZZFB.mjs} +11 -7
  76. package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-VJVQIXHC.mjs → chunk-MDBZAMIV.mjs} +8 -10
  78. package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-4EWGD4V2.mjs → chunk-NODZ5VAD.mjs} +2 -2
  80. package/dist/js/chunks/{chunk-UGJHCHXG.mjs → chunk-O2WJB6TH.mjs} +79 -55
  81. package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
  82. package/dist/js/chunks/{chunk-7YZ5CN3V.mjs → chunk-PCABY5BN.mjs} +5 -3
  83. package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
  84. package/dist/js/chunks/{chunk-X7SDA2J5.mjs → chunk-PWKYVMND.mjs} +9 -5
  85. package/dist/js/chunks/{chunk-X7SDA2J5.mjs.map → chunk-PWKYVMND.mjs.map} +2 -2
  86. package/dist/js/chunks/{chunk-SPPHF7YZ.mjs → chunk-QHZZT7YO.mjs} +35 -14
  87. package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
  88. package/dist/js/chunks/{chunk-LDXCC2L3.mjs → chunk-QND56EW2.mjs} +5 -4
  89. package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
  90. package/dist/js/chunks/{chunk-NVQ5EHCU.mjs → chunk-QNODAANY.mjs} +4 -4
  91. package/dist/js/chunks/{chunk-7NLUI3RR.mjs → chunk-QRO5FV3I.mjs} +23 -13
  92. package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
  93. package/dist/js/chunks/{chunk-FCNF4GRJ.mjs → chunk-R7A7JRC5.mjs} +6 -11
  94. package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
  95. package/dist/js/chunks/{chunk-S23RJ3XY.mjs → chunk-RKG2CBFE.mjs} +4 -16
  96. package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
  97. package/dist/js/chunks/{chunk-6FSEUFVW.mjs → chunk-RSNS5OYS.mjs} +6 -6
  98. package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-ROH2HDB4.mjs → chunk-RUDYMEJ3.mjs} +2 -2
  100. package/dist/js/chunks/{chunk-BIGU5RCJ.mjs → chunk-STJR62SU.mjs} +13 -5
  101. package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
  102. package/dist/js/chunks/{chunk-752ADW4M.mjs → chunk-SUSD4UTN.mjs} +27 -32
  103. package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
  104. package/dist/js/chunks/{chunk-B7DQFHA5.mjs → chunk-SYBOA5HC.mjs} +7 -12
  105. package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
  106. package/dist/js/chunks/{chunk-TFABTUAZ.mjs → chunk-T4MOBP3J.mjs} +2 -2
  107. package/dist/js/chunks/{chunk-GCWWEZKO.mjs → chunk-TM7HPGTV.mjs} +3 -3
  108. package/dist/js/chunks/{chunk-5KIHWJI2.mjs → chunk-TMQDZSDC.mjs} +34 -12
  109. package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
  110. package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs → chunk-TVSX5YA2.mjs} +3 -3
  111. package/dist/js/chunks/{chunk-INLZWHLY.mjs → chunk-UHO5CV6K.mjs} +2 -2
  112. package/dist/js/chunks/{chunk-INLZWHLY.mjs.map → chunk-UHO5CV6K.mjs.map} +2 -2
  113. package/dist/js/chunks/{chunk-7YQBHTK3.mjs → chunk-UKCNELUN.mjs} +6 -8
  114. package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-VH4BMAZS.mjs → chunk-UKQK5GWR.mjs} +13 -13
  116. package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-OYNUDOHR.mjs → chunk-UTSLYQ65.mjs} +7 -6
  118. package/dist/js/chunks/{chunk-OYNUDOHR.mjs.map → chunk-UTSLYQ65.mjs.map} +2 -2
  119. package/dist/js/chunks/{chunk-7W7TV6NY.mjs → chunk-VS5OJBOD.mjs} +2 -2
  120. package/dist/js/chunks/{chunk-7W7TV6NY.mjs.map → chunk-VS5OJBOD.mjs.map} +2 -2
  121. package/dist/js/chunks/{chunk-KYIEG4U3.mjs → chunk-VZMROW5A.mjs} +43 -14
  122. package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
  123. package/dist/js/chunks/{chunk-VFV75DHF.mjs → chunk-XB6Y7P5W.mjs} +11 -12
  124. package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
  125. package/dist/js/chunks/{chunk-CZSQHXEV.mjs → chunk-XDAMOMVD.mjs} +20 -21
  126. package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
  127. package/dist/js/chunks/{chunk-EVCVFEV3.mjs → chunk-XJPMW5SP.mjs} +21 -35
  128. package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
  129. package/dist/js/chunks/{chunk-VR3L2WN5.mjs → chunk-YKANQILZ.mjs} +7 -6
  130. package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
  131. package/dist/js/chunks/{chunk-JUKBBN6P.mjs → chunk-YLZOJLDI.mjs} +2 -2
  132. package/dist/js/chunks/{chunk-U4B3VHFS.mjs → chunk-ZK7YY322.mjs} +28 -21
  133. package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
  134. package/dist/js/expressive.cjs +2739 -2387
  135. package/dist/js/expressive.cjs.map +4 -4
  136. package/dist/js/expressive.js +2739 -2387
  137. package/dist/js/expressive.js.map +4 -4
  138. package/dist/js/expressive.min.js +7 -7
  139. package/dist/js/expressive.min.js.map +4 -4
  140. package/dist/js/expressive.mjs +76 -75
  141. package/dist/js/expressive.mjs.map +1 -1
  142. package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
  143. package/dist/js/internal/behaviors/copy.mjs +3 -3
  144. package/dist/js/internal/behaviors/dataTables.mjs +2 -4
  145. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  146. package/dist/js/internal/behaviors/forms.mjs +2 -2
  147. package/dist/js/internal/behaviors/imageCompare.mjs +2 -2
  148. package/dist/js/internal/behaviors/lists.mjs +2 -2
  149. package/dist/js/internal/behaviors/paneResize.mjs +2 -2
  150. package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
  151. package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
  152. package/dist/js/internal/behaviors/sortable.mjs +2 -2
  153. package/dist/js/internal/behaviors/theme.mjs +2 -2
  154. package/dist/js/internal/behaviors/tour.mjs +2 -2
  155. package/dist/js/internal/behaviors/transferList.mjs +2 -2
  156. package/dist/js/internal/components/appBar.mjs +3 -3
  157. package/dist/js/internal/components/autocomplete.mjs +5 -4
  158. package/dist/js/internal/components/backToTop.mjs +3 -3
  159. package/dist/js/internal/components/barChart.mjs +5 -5
  160. package/dist/js/internal/components/buttonGroup.mjs +3 -3
  161. package/dist/js/internal/components/buttons.mjs +3 -3
  162. package/dist/js/internal/components/cards.mjs +3 -3
  163. package/dist/js/internal/components/carousel.mjs +3 -3
  164. package/dist/js/internal/components/cascader.mjs +4 -4
  165. package/dist/js/internal/components/characterCounter.mjs +3 -3
  166. package/dist/js/internal/components/chips.mjs +7 -6
  167. package/dist/js/internal/components/colorPicker.mjs +3 -3
  168. package/dist/js/internal/components/columnChart.mjs +4 -4
  169. package/dist/js/internal/components/commandPalette.mjs +3 -3
  170. package/dist/js/internal/components/confetti.mjs +3 -3
  171. package/dist/js/internal/components/currencyInput.mjs +3 -3
  172. package/dist/js/internal/components/datepicker.mjs +8 -7
  173. package/dist/js/internal/components/expandingCard.mjs +3 -3
  174. package/dist/js/internal/components/funnelChart.mjs +4 -4
  175. package/dist/js/internal/components/heatmapChart.mjs +4 -4
  176. package/dist/js/internal/components/hoverCard.mjs +3 -3
  177. package/dist/js/internal/components/index.mjs +60 -59
  178. package/dist/js/internal/components/inputMask.mjs +3 -3
  179. package/dist/js/internal/components/keypad.mjs +3 -3
  180. package/dist/js/internal/components/lightbox.mjs +3 -3
  181. package/dist/js/internal/components/lineChart.mjs +23 -7
  182. package/dist/js/internal/components/loadingOverlay.mjs +3 -3
  183. package/dist/js/internal/components/mapView.mjs +3 -3
  184. package/dist/js/internal/components/menu.mjs +3 -3
  185. package/dist/js/internal/components/menubar.mjs +4 -4
  186. package/dist/js/internal/components/messageScroller.mjs +3 -3
  187. package/dist/js/internal/components/mixedChart.mjs +5 -5
  188. package/dist/js/internal/components/navigationRail.mjs +3 -3
  189. package/dist/js/internal/components/particles.mjs +3 -3
  190. package/dist/js/internal/components/pieChart.mjs +4 -4
  191. package/dist/js/internal/components/pullToRefresh.mjs +3 -3
  192. package/dist/js/internal/components/questionnaire.mjs +3 -3
  193. package/dist/js/internal/components/radarChart.mjs +4 -4
  194. package/dist/js/internal/components/radialChart.mjs +4 -4
  195. package/dist/js/internal/components/registry.mjs +59 -58
  196. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  197. package/dist/js/internal/components/sankeyChart.mjs +4 -4
  198. package/dist/js/internal/components/scatterChart.mjs +4 -4
  199. package/dist/js/internal/components/scrollspy.mjs +3 -3
  200. package/dist/js/internal/components/select.mjs +5 -4
  201. package/dist/js/internal/components/showMore.mjs +3 -3
  202. package/dist/js/internal/components/slider.mjs +3 -3
  203. package/dist/js/internal/components/snackbar.mjs +2 -2
  204. package/dist/js/internal/components/swipeActions.mjs +3 -3
  205. package/dist/js/internal/components/tabs.mjs +3 -3
  206. package/dist/js/internal/components/timepicker.mjs +5 -5
  207. package/dist/js/internal/components/tooltip.mjs +3 -3
  208. package/dist/js/internal/components/treeSelect.mjs +6 -5
  209. package/dist/js/internal/components/treemapChart.mjs +4 -4
  210. package/dist/js/internal/core/component.mjs +6 -4
  211. package/dist/js/internal/core/formControl.mjs +2 -2
  212. package/dist/js/internal/core/imageURL.mjs +7 -0
  213. package/dist/js/internal/core/imageURL.mjs.map +7 -0
  214. package/dist/js/internal/core/utils.mjs +11 -1
  215. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  216. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +3 -3
  217. package/dist/js/modular.mjs +76 -75
  218. package/dist/types/behaviors/bottomSheets.d.ts +5 -3
  219. package/dist/types/behaviors/dataTables.d.ts +2 -6
  220. package/dist/types/behaviors/forms.d.ts +7 -7
  221. package/dist/types/behaviors/imageCompare.d.ts +2 -1
  222. package/dist/types/behaviors/transferList.d.ts +2 -0
  223. package/dist/types/components/autocomplete.d.ts +14 -3
  224. package/dist/types/components/carousel.d.ts +7 -0
  225. package/dist/types/components/chips.d.ts +15 -0
  226. package/dist/types/components/colorPicker.d.ts +14 -0
  227. package/dist/types/components/currencyInput.d.ts +5 -4
  228. package/dist/types/components/datepicker.d.ts +54 -27
  229. package/dist/types/components/funnelChart.d.ts +1 -4
  230. package/dist/types/components/heatmapChart.d.ts +3 -0
  231. package/dist/types/components/hoverCard.d.ts +1 -0
  232. package/dist/types/components/inputMask.d.ts +0 -2
  233. package/dist/types/components/lineChart.d.ts +43 -5
  234. package/dist/types/components/mapView.d.ts +113 -11
  235. package/dist/types/components/menu.d.ts +14 -0
  236. package/dist/types/components/particles.d.ts +14 -1
  237. package/dist/types/components/pieChart.d.ts +1 -2
  238. package/dist/types/components/richTextEditor.d.ts +40 -9
  239. package/dist/types/components/select.d.ts +1 -3
  240. package/dist/types/components/showMore.d.ts +2 -0
  241. package/dist/types/components/slider.d.ts +0 -1
  242. package/dist/types/components/snackbar.d.ts +7 -1
  243. package/dist/types/components/tabs.d.ts +3 -3
  244. package/dist/types/components/timepicker.d.ts +15 -6
  245. package/dist/types/components/tooltip.d.ts +1 -1
  246. package/dist/types/components/treemapChart.d.ts +2 -2
  247. package/dist/types/core/component.d.ts +9 -3
  248. package/dist/types/core/imageURL.d.ts +2 -0
  249. package/dist/types/core/utils.d.ts +39 -1
  250. package/dist/types/modular.d.ts +1 -1
  251. package/dist/types/plugins/modalDisplayPlugin.d.ts +8 -1
  252. package/package.json +8 -6
  253. package/src/sass/abstracts/_mixins.scss +459 -59
  254. package/src/sass/abstracts/_variables.scss +25 -0
  255. package/src/sass/components/_accordion.scss +1 -3
  256. package/src/sass/components/_aura.scss +1 -0
  257. package/src/sass/components/_back-to-top.scss +3 -3
  258. package/src/sass/components/_bar-chart.scss +2 -83
  259. package/src/sass/components/_bottom-sheet.scss +7 -0
  260. package/src/sass/components/_breadcrumb.scss +1 -7
  261. package/src/sass/components/_button-groups.scss +15 -38
  262. package/src/sass/components/_buttons.scss +24 -74
  263. package/src/sass/components/_calendar.scss +1 -3
  264. package/src/sass/components/_carousel.scss +10 -10
  265. package/src/sass/components/_cascader.scss +3 -14
  266. package/src/sass/components/_column-chart.scss +1 -19
  267. package/src/sass/components/_confetti.scss +3 -4
  268. package/src/sass/components/_data-table.scss +10 -0
  269. package/src/sass/components/_dialog.scss +10 -18
  270. package/src/sass/components/_expanding-card.scss +1 -5
  271. package/src/sass/components/_fab-menu.scss +4 -12
  272. package/src/sass/components/_funnel-chart.scss +1 -62
  273. package/src/sass/components/_heatmap-chart.scss +2 -6
  274. package/src/sass/components/_icon-buttons.scss +1 -4
  275. package/src/sass/components/_line-chart.scss +2 -70
  276. package/src/sass/components/_map.scss +4 -0
  277. package/src/sass/components/_marquee.scss +3 -3
  278. package/src/sass/components/_mega-menu.scss +8 -17
  279. package/src/sass/components/_menu.scss +10 -11
  280. package/src/sass/components/_menubar.scss +1 -13
  281. package/src/sass/components/_mixed-chart.scss +1 -37
  282. package/src/sass/components/_navbar.scss +11 -16
  283. package/src/sass/components/_navigation-bar.scss +2 -5
  284. package/src/sass/components/_navigation-rail.scss +25 -15
  285. package/src/sass/components/_page-footer.scss +1 -3
  286. package/src/sass/components/_pagination.scss +3 -14
  287. package/src/sass/components/_panes.scss +3 -16
  288. package/src/sass/components/_particles.scss +3 -4
  289. package/src/sass/components/_pie-chart.scss +8 -70
  290. package/src/sass/components/_progress.scss +31 -13
  291. package/src/sass/components/_radar-chart.scss +2 -32
  292. package/src/sass/components/_radial-chart.scss +2 -48
  293. package/src/sass/components/_sankey-chart.scss +5 -28
  294. package/src/sass/components/_scatter-chart.scss +2 -11
  295. package/src/sass/components/_search.scss +1 -4
  296. package/src/sass/components/_side-sheet.scss +9 -14
  297. package/src/sass/components/_skeleton.scss +24 -15
  298. package/src/sass/components/_snackbar.scss +11 -13
  299. package/src/sass/components/_table_of_contents.scss +1 -3
  300. package/src/sass/components/_tabs.scss +4 -20
  301. package/src/sass/components/_timepicker.scss +2 -1
  302. package/src/sass/components/_toolbar.scss +1 -4
  303. package/src/sass/components/_tooltip.scss +9 -5
  304. package/src/sass/components/_tree.scss +5 -17
  305. package/src/sass/components/_treemap-chart.scss +2 -26
  306. package/src/sass/components/forms/_checkboxes.scss +2 -21
  307. package/src/sass/components/forms/_drop-zone.scss +1 -4
  308. package/src/sass/components/forms/_fieldset.scss +1 -4
  309. package/src/sass/components/forms/_file-input.scss +6 -0
  310. package/src/sass/components/forms/_input-fields.scss +21 -4
  311. package/src/sass/components/forms/_radio-buttons.scss +2 -24
  312. package/src/sass/components/forms/_select.scss +6 -7
  313. package/src/sass/components/forms/_slider.scss +1 -4
  314. package/src/sass/components/forms/_switches.scss +14 -21
  315. package/src/sass/utilities/_helpers.scss +1 -1
  316. package/src/sass/utilities/_visibility.scss +1 -3
  317. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +0 -7
  318. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +0 -7
  319. package/dist/js/chunks/chunk-4IKVPCSU.mjs +0 -7
  320. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +0 -7
  321. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +0 -7
  322. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +0 -7
  323. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +0 -7
  324. package/dist/js/chunks/chunk-752ADW4M.mjs.map +0 -7
  325. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +0 -7
  326. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +0 -7
  327. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +0 -7
  328. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +0 -7
  329. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +0 -7
  330. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +0 -7
  331. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +0 -7
  332. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +0 -7
  333. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +0 -7
  334. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +0 -7
  335. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +0 -7
  336. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +0 -7
  337. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +0 -7
  338. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +0 -7
  339. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +0 -7
  340. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +0 -7
  341. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +0 -7
  342. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +0 -7
  343. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +0 -7
  344. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +0 -7
  345. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +0 -7
  346. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +0 -7
  347. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +0 -7
  348. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +0 -7
  349. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +0 -7
  350. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +0 -7
  351. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +0 -7
  352. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +0 -7
  353. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +0 -7
  354. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +0 -7
  355. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +0 -7
  356. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +0 -7
  357. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +0 -7
  358. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +0 -7
  359. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +0 -7
  360. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +0 -7
  361. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +0 -7
  362. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +0 -7
  363. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +0 -7
  364. /package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs.map → chunk-3KF65KGL.mjs.map} +0 -0
  365. /package/dist/js/chunks/{chunk-75E5EDJF.mjs.map → chunk-3XORNED5.mjs.map} +0 -0
  366. /package/dist/js/chunks/{chunk-NNHVANQA.mjs.map → chunk-4WBGAQN3.mjs.map} +0 -0
  367. /package/dist/js/chunks/{chunk-ZJNLAGY5.mjs.map → chunk-5F4URJHL.mjs.map} +0 -0
  368. /package/dist/js/chunks/{chunk-GVZQH2H5.mjs.map → chunk-AEG6LOAJ.mjs.map} +0 -0
  369. /package/dist/js/chunks/{chunk-AI73GJKG.mjs.map → chunk-BB5VXYXT.mjs.map} +0 -0
  370. /package/dist/js/chunks/{chunk-2RLBDFH4.mjs.map → chunk-BDATLH3H.mjs.map} +0 -0
  371. /package/dist/js/chunks/{chunk-ZKWUWBUB.mjs.map → chunk-CY2CTOVM.mjs.map} +0 -0
  372. /package/dist/js/chunks/{chunk-67ZPPKXS.mjs.map → chunk-FNIIH2LU.mjs.map} +0 -0
  373. /package/dist/js/chunks/{chunk-T3BNSRP3.mjs.map → chunk-HQRLBTNM.mjs.map} +0 -0
  374. /package/dist/js/chunks/{chunk-NAC72P7R.mjs.map → chunk-I2F7MLUU.mjs.map} +0 -0
  375. /package/dist/js/chunks/{chunk-ANKFWNWT.mjs.map → chunk-LC4O5LFS.mjs.map} +0 -0
  376. /package/dist/js/chunks/{chunk-4PIXLDNJ.mjs.map → chunk-LEF33SCP.mjs.map} +0 -0
  377. /package/dist/js/chunks/{chunk-ILDRRG7T.mjs.map → chunk-LFORZRPH.mjs.map} +0 -0
  378. /package/dist/js/chunks/{chunk-4EWGD4V2.mjs.map → chunk-NODZ5VAD.mjs.map} +0 -0
  379. /package/dist/js/chunks/{chunk-NVQ5EHCU.mjs.map → chunk-QNODAANY.mjs.map} +0 -0
  380. /package/dist/js/chunks/{chunk-ROH2HDB4.mjs.map → chunk-RUDYMEJ3.mjs.map} +0 -0
  381. /package/dist/js/chunks/{chunk-TFABTUAZ.mjs.map → chunk-T4MOBP3J.mjs.map} +0 -0
  382. /package/dist/js/chunks/{chunk-GCWWEZKO.mjs.map → chunk-TM7HPGTV.mjs.map} +0 -0
  383. /package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs.map → chunk-TVSX5YA2.mjs.map} +0 -0
  384. /package/dist/js/chunks/{chunk-JUKBBN6P.mjs.map → chunk-YLZOJLDI.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  DockedDisplayPlugin
3
- } from "./chunk-ZKWUWBUB.mjs";
3
+ } from "./chunk-CY2CTOVM.mjs";
4
4
 
5
5
  // src/ts/plugins/modalDisplayPlugin.ts
6
6
  var ModalDisplayPlugin = class {
@@ -8,9 +8,19 @@ var ModalDisplayPlugin = class {
8
8
  /** Whether the picker, not the user, is closing the dialog. */
9
9
  this._settled = false;
10
10
  this._opener = null;
11
- /** The picker fills the dialog, so a press on the dialog itself is on the scrim. */
11
+ /** Whether the press that ends in the next click started on the scrim. */
12
+ this._downOnScrim = false;
13
+ this._handlePointerDown = (e) => {
14
+ this._downOnScrim = e.target === this.dialog;
15
+ };
16
+ /**
17
+ * The picker fills the dialog, so a press on the dialog itself is on the
18
+ * scrim. A drag that starts on the picker, such as the timepicker hand,
19
+ * and ends on the scrim also clicks the dialog, so both ends must be there.
20
+ */
12
21
  this._handleClick = (e) => {
13
- if (e.target === this.dialog) this.dialog.close();
22
+ if (e.target === this.dialog && this._downOnScrim) this.dialog.close();
23
+ this._downOnScrim = false;
14
24
  };
15
25
  this._handleClose = () => {
16
26
  const dismissed = !this._settled;
@@ -19,6 +29,7 @@ var ModalDisplayPlugin = class {
19
29
  if (dismissed) this.onDismiss();
20
30
  };
21
31
  this.destroy = () => {
32
+ this.dialog.removeEventListener("pointerdown", this._handlePointerDown);
22
33
  this.dialog.removeEventListener("click", this._handleClick);
23
34
  this.dialog.removeEventListener("close", this._handleClose);
24
35
  this.dialog.remove();
@@ -42,6 +53,7 @@ var ModalDisplayPlugin = class {
42
53
  if (label) this.dialog.setAttribute("aria-label", label);
43
54
  this.dialog.append(container);
44
55
  el.parentElement.append(this.dialog);
56
+ this.dialog.addEventListener("pointerdown", this._handlePointerDown);
45
57
  this.dialog.addEventListener("click", this._handleClick);
46
58
  this.dialog.addEventListener("close", this._handleClose);
47
59
  }
@@ -60,4 +72,4 @@ export {
60
72
  createDisplayPlugin,
61
73
  hideModal
62
74
  };
63
- //# sourceMappingURL=chunk-OUCHKSAW.mjs.map
75
+ //# sourceMappingURL=chunk-B55LWKBM.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/plugins/modalDisplayPlugin.ts"],
4
+ "sourcesContent": ["import { DockedDisplayPlugin, DockedDisplayPluginOptions } from './dockedDisplayPlugin';\n\n/**\n * Shows a picker in a modal <dialog>, which the dialog styles draw as a\n * basic dialog over a scrim. The browser keeps focus inside it. Escape or a\n * press on the scrim closes it, and the picker hears that as Cancel; the\n * picker closes it itself through hide() on Ok or Cancel. Focus goes back\n * to the field that opened it.\n */\nexport class ModalDisplayPlugin {\n /** The fields that open the dialog, as DockedDisplayPlugin keeps them. */\n readonly triggers: HTMLElement[];\n private readonly dialog: HTMLDialogElement;\n private readonly onDismiss: () => void;\n /** Whether the picker, not the user, is closing the dialog. */\n private _settled = false;\n private _opener: HTMLElement | null = null;\n /** Whether the press that ends in the next click started on the scrim. */\n private _downOnScrim = false;\n\n constructor(el: HTMLElement, container: HTMLElement, onDismiss: () => void) {\n this.triggers = [el];\n this.onDismiss = onDismiss;\n this.dialog = document.createElement('dialog');\n this.dialog.className = 'display-modal';\n const label = (el as HTMLInputElement).labels?.[0]?.textContent.trim() || el.getAttribute('aria-label');\n if (label) this.dialog.setAttribute('aria-label', label);\n this.dialog.append(container);\n el.parentElement.append(this.dialog);\n this.dialog.addEventListener('pointerdown', this._handlePointerDown);\n this.dialog.addEventListener('click', this._handleClick);\n this.dialog.addEventListener('close', this._handleClose);\n }\n\n private _handlePointerDown = (e: PointerEvent) => {\n this._downOnScrim = e.target === this.dialog;\n };\n\n /**\n * The picker fills the dialog, so a press on the dialog itself is on the\n * scrim. A drag that starts on the picker, such as the timepicker hand,\n * and ends on the scrim also clicks the dialog, so both ends must be there.\n */\n private _handleClick = (e: MouseEvent) => {\n if (e.target === this.dialog && this._downOnScrim) this.dialog.close();\n this._downOnScrim = false;\n };\n\n private _handleClose = () => {\n const dismissed = !this._settled;\n this._settled = false;\n this._opener?.focus({ preventScroll: true });\n if (dismissed) this.onDismiss();\n };\n\n destroy = () => {\n this.dialog.removeEventListener('pointerdown', this._handlePointerDown);\n this.dialog.removeEventListener('click', this._handleClick);\n this.dialog.removeEventListener('close', this._handleClose);\n this.dialog.remove();\n };\n\n show = () => {\n if (this.dialog.open) return;\n const root = this.dialog.getRootNode() as Document | ShadowRoot;\n this._opener = root.activeElement as HTMLElement | null;\n this.dialog.showModal();\n };\n\n hide = () => {\n if (!this.dialog.open) return;\n this._settled = true;\n this.dialog.close();\n };\n}\n\nexport type DisplayPlugin = DockedDisplayPlugin | ModalDisplayPlugin;\n\n/**\n * The display plugin a picker's `displayPlugin` option names: 'docked',\n * 'modal', or none for an inline picker. `onDismiss` is the picker's Cancel.\n */\nexport function createDisplayPlugin(\n type: string | null,\n el: HTMLElement,\n container: HTMLElement,\n options: Partial<DockedDisplayPluginOptions>,\n onDismiss: () => void\n): DisplayPlugin | undefined {\n if (type === 'modal') return new ModalDisplayPlugin(el, container, onDismiss);\n if (type === 'docked') return new DockedDisplayPlugin(el, container, options);\n return undefined;\n}\n\n/** Ok and Cancel close a modal picker; a docked one stays until a click outside. */\nexport function hideModal(plugin: DisplayPlugin | undefined) {\n if (plugin instanceof ModalDisplayPlugin) plugin.hide();\n}\n"],
5
+ "mappings": ";;;;;AASO,IAAM,qBAAN,MAAyB;AAAA,EAW9B,YAAY,IAAiB,WAAwB,WAAuB;AAL5E;AAAA,SAAQ,WAAW;AACnB,SAAQ,UAA8B;AAEtC;AAAA,SAAQ,eAAe;AAgBvB,SAAQ,qBAAqB,CAAC,MAAoB;AAChD,WAAK,eAAe,EAAE,WAAW,KAAK;AAAA,IACxC;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,eAAe,CAAC,MAAkB;AACxC,UAAI,EAAE,WAAW,KAAK,UAAU,KAAK,aAAc,MAAK,OAAO,MAAM;AACrE,WAAK,eAAe;AAAA,IACtB;AAEA,SAAQ,eAAe,MAAM;AAC3B,YAAM,YAAY,CAAC,KAAK;AACxB,WAAK,WAAW;AAChB,WAAK,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3C,UAAI,UAAW,MAAK,UAAU;AAAA,IAChC;AAEA,mBAAU,MAAM;AACd,WAAK,OAAO,oBAAoB,eAAe,KAAK,kBAAkB;AACtE,WAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,WAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,WAAK,OAAO,OAAO;AAAA,IACrB;AAEA,gBAAO,MAAM;AACX,UAAI,KAAK,OAAO,KAAM;AACtB,YAAM,OAAO,KAAK,OAAO,YAAY;AACrC,WAAK,UAAU,KAAK;AACpB,WAAK,OAAO,UAAU;AAAA,IACxB;AAEA,gBAAO,MAAM;AACX,UAAI,CAAC,KAAK,OAAO,KAAM;AACvB,WAAK,WAAW;AAChB,WAAK,OAAO,MAAM;AAAA,IACpB;AApDE,SAAK,WAAW,CAAC,EAAE;AACnB,SAAK,YAAY;AACjB,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,YAAY;AACxB,UAAM,QAAS,GAAwB,SAAS,CAAC,GAAG,YAAY,KAAK,KAAK,GAAG,aAAa,YAAY;AACtG,QAAI,MAAO,MAAK,OAAO,aAAa,cAAc,KAAK;AACvD,SAAK,OAAO,OAAO,SAAS;AAC5B,OAAG,cAAc,OAAO,KAAK,MAAM;AACnC,SAAK,OAAO,iBAAiB,eAAe,KAAK,kBAAkB;AACnE,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AACvD,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AAAA,EACzD;AA0CF;AAQO,SAAS,oBACd,MACA,IACA,WACA,SACA,WAC2B;AAC3B,MAAI,SAAS,QAAS,QAAO,IAAI,mBAAmB,IAAI,WAAW,SAAS;AAC5E,MAAI,SAAS,SAAU,QAAO,IAAI,oBAAoB,IAAI,WAAW,OAAO;AAC5E,SAAO;AACT;AAGO,SAAS,UAAU,QAAmC;AAC3D,MAAI,kBAAkB,mBAAoB,QAAO,KAAK;AACxD;",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Utils
3
- } from "./chunk-ZVLOUDIJ.mjs";
3
+ } from "./chunk-67UNY7RH.mjs";
4
4
 
5
5
  // src/ts/behaviors/lists.ts
6
6
  var rowTarget = ":scope > li > :is(a[href], button):only-child";
@@ -25,4 +25,4 @@ var Lists = _Lists;
25
25
  export {
26
26
  Lists
27
27
  };
28
- //# sourceMappingURL=chunk-AI73GJKG.mjs.map
28
+ //# sourceMappingURL=chunk-BB5VXYXT.mjs.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Menu
3
- } from "./chunk-CSYWKEK3.mjs";
3
+ } from "./chunk-DWA5UYLJ.mjs";
4
4
  import {
5
5
  Component
6
- } from "./chunk-CMGXGYUC.mjs";
6
+ } from "./chunk-EB2V4OKL.mjs";
7
7
  import {
8
8
  Utils
9
- } from "./chunk-ZVLOUDIJ.mjs";
9
+ } from "./chunk-67UNY7RH.mjs";
10
10
 
11
11
  // src/ts/components/menubar.ts
12
12
  var _defaults = {
@@ -105,4 +105,4 @@ Menubar.key = "Expressive_Menubar";
105
105
  export {
106
106
  Menubar
107
107
  };
108
- //# sourceMappingURL=chunk-2RLBDFH4.mjs.map
108
+ //# sourceMappingURL=chunk-BDATLH3H.mjs.map
@@ -1,14 +1,21 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils,
6
+ afterFormReset,
6
7
  controllerFor
7
- } from "./chunk-ZVLOUDIJ.mjs";
8
+ } from "./chunk-67UNY7RH.mjs";
8
9
 
9
10
  // src/ts/components/colorPicker.ts
10
11
  var _defaults = {
11
- onChange: null
12
+ onChange: null,
13
+ i18n: {
14
+ area: "Saturation and brightness",
15
+ value: (saturation, brightness) => `Saturation ${saturation}%, brightness ${brightness}%`,
16
+ hue: "Hue",
17
+ hex: "Hex color"
18
+ }
12
19
  };
13
20
  var clamp = (n) => Math.min(1, Math.max(0, n));
14
21
  function hueOf(r, g, b) {
@@ -87,8 +94,8 @@ var ColorPicker = class extends Component {
87
94
  };
88
95
  // Left and right change saturation, up and down brightness; see KEY_STEPS.
89
96
  this._onKeyDown = (e) => {
90
- const steps = KEY_STEPS[e.key];
91
- if (!steps || this.input.disabled) return;
97
+ const steps = this._keySteps(e);
98
+ if (!steps) return;
92
99
  e.preventDefault();
93
100
  const unit = e.shiftKey ? 0.1 : 0.01;
94
101
  const { s, v } = this._hsv;
@@ -99,6 +106,7 @@ var ColorPicker = class extends Component {
99
106
  this._hsv = toHsv(this.input.value) ?? this._hsv;
100
107
  this._build();
101
108
  this.input.addEventListener("input", this._onNativeInput, { signal: this._events.signal });
109
+ afterFormReset(this.input, this._onNativeInput, this._events.signal);
102
110
  this._render();
103
111
  }
104
112
  static get defaults() {
@@ -125,12 +133,13 @@ var ColorPicker = class extends Component {
125
133
  }
126
134
  _build() {
127
135
  const disabled = this.input.disabled;
136
+ const { i18n } = this.options;
128
137
  const area = document.createElement("div");
129
138
  area.className = "color-picker-area";
130
139
  const thumb = document.createElement("div");
131
140
  thumb.className = "color-picker-thumb";
132
141
  thumb.setAttribute("role", "slider");
133
- thumb.setAttribute("aria-label", "Saturation and brightness");
142
+ thumb.setAttribute("aria-label", i18n.area);
134
143
  thumb.setAttribute("aria-valuemin", "0");
135
144
  thumb.setAttribute("aria-valuemax", "100");
136
145
  thumb.tabIndex = disabled ? -1 : 0;
@@ -141,12 +150,12 @@ var ColorPicker = class extends Component {
141
150
  hue.className = "color-picker-hue";
142
151
  hue.min = "0";
143
152
  hue.max = "359";
144
- hue.setAttribute("aria-label", "Hue");
153
+ hue.setAttribute("aria-label", i18n.hue);
145
154
  hue.disabled = disabled;
146
155
  const hex = document.createElement("input");
147
156
  hex.type = "text";
148
157
  hex.className = "color-picker-hex";
149
- hex.setAttribute("aria-label", "Hex color");
158
+ hex.setAttribute("aria-label", i18n.hex);
150
159
  hex.autocomplete = "off";
151
160
  hex.spellcheck = false;
152
161
  hex.maxLength = 7;
@@ -178,7 +187,7 @@ var ColorPicker = class extends Component {
178
187
  thumb.style.setProperty("--_color-picker-y", String(1 - v));
179
188
  thumb.style.setProperty("--_color-picker-color", hex);
180
189
  thumb.setAttribute("aria-valuenow", String(Math.round(s * 100)));
181
- thumb.setAttribute("aria-valuetext", `Saturation ${Math.round(s * 100)}%, brightness ${Math.round(v * 100)}%`);
190
+ thumb.setAttribute("aria-valuetext", this.options.i18n.value(Math.round(s * 100), Math.round(v * 100)));
182
191
  this._hue.value = String(Math.round(h));
183
192
  this._hex.value = hex;
184
193
  }
@@ -210,10 +219,14 @@ var ColorPicker = class extends Component {
210
219
  const v = 1 - clamp((e.clientY - box.top) / box.height);
211
220
  this._set({ ...this._hsv, s, v }, commit);
212
221
  }
222
+ /** How a key moves the point. Shift is the larger step; Alt, Ctrl and Meta stay the browser's. */
223
+ _keySteps(e) {
224
+ return Utils.plainKey(e) && !this.input.disabled ? KEY_STEPS[e.key] : void 0;
225
+ }
213
226
  };
214
227
  ColorPicker.key = "Expressive_ColorPicker";
215
228
 
216
229
  export {
217
230
  ColorPicker
218
231
  };
219
- //# sourceMappingURL=chunk-2CS6TITK.mjs.map
232
+ //# sourceMappingURL=chunk-CWMQOT4O.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/colorPicker.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils, afterFormReset, controllerFor } from '../core/utils';\n\nexport interface ColorPickerI18n {\n /** The name of the saturation and brightness area. */\n area: string;\n /** What the area reports as its value, from two whole percentages. */\n value: (saturation: number, brightness: number) => string;\n /** The name of the hue slider. */\n hue: string;\n /** The name of the hex field. */\n hex: string;\n}\n\nexport interface ColorPickerOptions extends BaseOptions {\n /**\n * Called with the new `#rrggbb` value when a change is committed: the end\n * of a drag, a key press, a hue release or a typed hex value.\n * @default null\n */\n onChange: ((value: string) => void) | null;\n /** The accessible names, for a page in another language. */\n i18n: Partial<ColorPickerI18n>;\n}\n\nconst _defaults: ColorPickerOptions = {\n onChange: null,\n i18n: {\n area: 'Saturation and brightness',\n value: (saturation, brightness) => `Saturation ${saturation}%, brightness ${brightness}%`,\n hue: 'Hue',\n hex: 'Hex color'\n }\n};\n\n/** Hue in degrees, saturation and value from 0 to 1. */\ninterface Hsv { h: number; s: number; v: number }\n\nconst clamp = (n: number) => Math.min(1, Math.max(0, n));\n\n// Hue in degrees of an RGB color with channels from 0 to 1.\nfunction hueOf(r: number, g: number, b: number): number {\n const max = Math.max(r, g, b);\n const range = max - Math.min(r, g, b);\n if (!range) return 0;\n const sector = max === r ? (g - b) / range : max === g ? (b - r) / range + 2 : (r - g) / range + 4;\n return (sector * 60 + 360) % 360;\n}\n\nfunction toHsv(hex: string): Hsv | null {\n const match = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!match) return null;\n const digits = match[1].length === 3 ? [...match[1]].map((c) => c + c).join('') : match[1];\n const [r, g, b] = [0, 2, 4].map((i) => parseInt(digits.slice(i, i + 2), 16) / 255);\n const max = Math.max(r, g, b);\n return { h: hueOf(r, g, b), s: max ? (max - Math.min(r, g, b)) / max : 0, v: max };\n}\n\nfunction toHex({ h, s, v }: Hsv): string {\n const channel = (n: number) => {\n const k = (n + h / 60) % 6;\n return v - v * s * Math.max(0, Math.min(k, 4 - k, 1));\n };\n return '#' + [5, 3, 1].map((n) => Math.round(channel(n) * 255).toString(16).padStart(2, '0')).join('');\n}\n\n// Area keys as [saturation, brightness] steps of 1%; Shift takes ten of them.\n// Home and End overshoot so the clamp lands on the ends of saturation.\nconst KEY_STEPS: Record<string, [number, number]> = {\n ArrowRight: [1, 0],\n ArrowLeft: [-1, 0],\n ArrowUp: [0, 1],\n ArrowDown: [0, -1],\n PageUp: [0, 10],\n PageDown: [0, -10],\n Home: [-100, 0],\n End: [100, 0]\n};\n\n/**\n * Color picker. Enhances a `.color-picker` holding an `<input type=\"color\">`\n * with a saturation and brightness area, a hue slider and a hex field. The\n * native input stays the form value and the preview, so the browser's own\n * picker still opens from it, and it fires `input` and `change` as it would\n * if the person had used that picker.\n */\nexport class ColorPicker extends Component<ColorPickerOptions> {\n /** The native color input that holds the value. */\n input: HTMLInputElement | null;\n private _hsv: Hsv = { h: 0, s: 0, v: 0 };\n private _area: HTMLDivElement | null = null;\n private _thumb: HTMLDivElement | null = null;\n private _hue: HTMLInputElement | null = null;\n private _hex: HTMLInputElement | null = null;\n // Set while the picker writes the native input, so its own events are not\n // read back as an outside change.\n private _writing = false;\n\n constructor(el: HTMLElement, options: Partial<ColorPickerOptions>) {\n super(el, options);\n this.input = el.querySelector<HTMLInputElement>(':scope > input[type=\"color\"]');\n if (!this.input) return;\n this._hsv = toHsv(this.input.value) ?? this._hsv;\n this._build();\n this.input.addEventListener('input', this._onNativeInput, { signal: this._events.signal });\n // A form reset restores the native value without an input event.\n afterFormReset(this.input, this._onNativeInput, this._events.signal);\n this._render();\n }\n\n static get defaults(): ColorPickerOptions {\n return _defaults;\n }\n\n static key = 'Expressive_ColorPicker';\n\n destroy() {\n for (const part of [this._area, this._hue, this._hex]) part?.remove();\n this._area = this._thumb = this._hue = this._hex = null;\n this.el.style.removeProperty('--_color-picker-hue');\n super.destroy();\n }\n\n /** The current color as `#rrggbb`. Setting it fires no events, as with a native input. */\n get value(): string {\n return this.input?.value ?? '';\n }\n\n set value(hex: string) {\n const hsv = toHsv(hex);\n if (!hsv || !this.input) return;\n this._hsv = hsv;\n this._writing = true;\n this.input.value = toHex(hsv);\n this._writing = false;\n this._render();\n }\n\n private _build() {\n const disabled = this.input!.disabled;\n const { i18n } = this.options;\n\n const area = document.createElement('div');\n area.className = 'color-picker-area';\n const thumb = document.createElement('div');\n thumb.className = 'color-picker-thumb';\n thumb.setAttribute('role', 'slider');\n thumb.setAttribute('aria-label', i18n.area!);\n thumb.setAttribute('aria-valuemin', '0');\n thumb.setAttribute('aria-valuemax', '100');\n thumb.tabIndex = disabled ? -1 : 0;\n if (disabled) thumb.setAttribute('aria-disabled', 'true');\n area.append(thumb);\n\n const hue = document.createElement('input');\n hue.type = 'range';\n hue.className = 'color-picker-hue';\n hue.min = '0';\n hue.max = '359';\n hue.setAttribute('aria-label', i18n.hue!);\n hue.disabled = disabled;\n\n const hex = document.createElement('input');\n hex.type = 'text';\n hex.className = 'color-picker-hex';\n hex.setAttribute('aria-label', i18n.hex!);\n hex.autocomplete = 'off';\n hex.spellcheck = false;\n hex.maxLength = 7;\n hex.disabled = disabled;\n\n // Area and hue before the native input, the hex field after it.\n this.input!.before(area, hue);\n this.input!.after(hex);\n this._area = area;\n this._thumb = thumb;\n this._hue = hue;\n this._hex = hex;\n\n area.addEventListener('pointerdown', this._onPointerDown);\n thumb.addEventListener('keydown', this._onKeyDown);\n hue.addEventListener('input', () => this._set({ ...this._hsv, h: Number(hue.value) }, false));\n hue.addEventListener('change', () => this._commit());\n hex.addEventListener('change', this._onHex);\n hex.addEventListener('keydown', (e) => {\n // Enter in a text field would submit the form; take it as \"apply\".\n if (e.key === 'Enter' && !Utils.isComposing(e)) {\n e.preventDefault();\n this._onHex();\n }\n });\n }\n\n private _render() {\n const { h, s, v } = this._hsv;\n const hex = toHex(this._hsv);\n const thumb = this._thumb!;\n this.el.style.setProperty('--_color-picker-hue', String(Math.round(h)));\n thumb.style.setProperty('--_color-picker-x', String(s));\n thumb.style.setProperty('--_color-picker-y', String(1 - v));\n thumb.style.setProperty('--_color-picker-color', hex);\n thumb.setAttribute('aria-valuenow', String(Math.round(s * 100)));\n thumb.setAttribute('aria-valuetext', this.options.i18n.value!(Math.round(s * 100), Math.round(v * 100)));\n this._hue!.value = String(Math.round(h));\n // The hex field only commits on change, so rewriting it never fights typing.\n this._hex!.value = hex;\n }\n\n // Store the color, write it to the native input and fire `input`; with\n // `commit`, also fire `change` and onChange.\n // Only reached from the built controls, which a disabled input disables.\n private _set(hsv: Hsv, commit = true) {\n const input = this.input!;\n this._hsv = hsv;\n const hex = toHex(hsv);\n const changed = input.value !== hex;\n this._writing = true;\n input.value = hex;\n if (changed) input.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n this._writing = false;\n this._render();\n if (commit) this._commit();\n }\n\n private _commit() {\n if (!this.input) return;\n this._writing = true;\n this.input.dispatchEvent(new Event('change', { bubbles: true }));\n this._writing = false;\n this.options.onChange?.(this.input.value);\n }\n\n // The person used the browser's own picker on the native input.\n private _onNativeInput = () => {\n if (this._writing || !this.input) return;\n const hsv = toHsv(this.input.value);\n if (!hsv) return;\n this._hsv = hsv;\n this._render();\n };\n\n private _onHex = () => {\n const hsv = toHsv(this._hex!.value);\n if (hsv && toHex(hsv) !== this.input!.value) this._set(hsv);\n // An invalid entry goes back to the current color.\n this._hex!.value = toHex(this._hsv);\n };\n\n private _fromPoint(e: PointerEvent, commit: boolean) {\n const box = this._area!.getBoundingClientRect();\n const s = clamp((e.clientX - box.left) / box.width);\n const v = 1 - clamp((e.clientY - box.top) / box.height);\n this._set({ ...this._hsv, s, v }, commit);\n }\n\n private _onPointerDown = (e: PointerEvent) => {\n if (e.button || this.input!.disabled) return;\n const area = this._area!;\n e.preventDefault();\n this._thumb!.focus();\n area.setPointerCapture(e.pointerId);\n this._fromPoint(e, false);\n const move = (ev: PointerEvent) => this._fromPoint(ev, false);\n const drag = controllerFor(area);\n const up = (ev: PointerEvent) => {\n drag.abort();\n this._fromPoint(ev, true);\n };\n const { signal } = drag;\n area.addEventListener('pointermove', move, { signal });\n area.addEventListener('pointerup', up, { signal });\n area.addEventListener('pointercancel', up, { signal });\n };\n\n // Left and right change saturation, up and down brightness; see KEY_STEPS.\n private _onKeyDown = (e: KeyboardEvent) => {\n const steps = this._keySteps(e);\n if (!steps) return;\n e.preventDefault();\n const unit = e.shiftKey ? 0.1 : 0.01;\n const { s, v } = this._hsv;\n this._set({ ...this._hsv, s: clamp(s + steps[0] * unit), v: clamp(v + steps[1] * unit) });\n };\n\n /** How a key moves the point. Shift is the larger step; Alt, Ctrl and Meta stay the browser's. */\n private _keySteps(e: KeyboardEvent) {\n return Utils.plainKey(e) && !this.input!.disabled ? KEY_STEPS[e.key] : undefined;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Utils
3
- } from "./chunk-ZVLOUDIJ.mjs";
3
+ } from "./chunk-67UNY7RH.mjs";
4
4
 
5
5
  // src/ts/plugins/dockedDisplayPlugin.ts
6
6
  var _defaults = {
@@ -78,4 +78,4 @@ var DockedDisplayPlugin = class {
78
78
  export {
79
79
  DockedDisplayPlugin
80
80
  };
81
- //# sourceMappingURL=chunk-ZKWUWBUB.mjs.map
81
+ //# sourceMappingURL=chunk-CY2CTOVM.mjs.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils,
6
6
  controllerFor,
7
7
  restoreAttribute
8
- } from "./chunk-ZVLOUDIJ.mjs";
8
+ } from "./chunk-67UNY7RH.mjs";
9
9
 
10
10
  // src/ts/components/menu.ts
11
11
  var parentOf = (el) => el.parentElement ?? (el.getRootNode().host || null);
@@ -76,6 +76,10 @@ var _Menu = class _Menu extends Component {
76
76
  this._contextPoint = null;
77
77
  /** What had focus when a context menu opened; focus goes back there. */
78
78
  this._contextReturn = null;
79
+ /** Each attribute setup wrote, with the value it had before, for destroy(). */
80
+ this._originalAttributes = /* @__PURE__ */ new Map();
81
+ /** Where the menu was before it moved next to the trigger. */
82
+ this._originalPlace = { parent: null, next: null };
79
83
  this._handleContextMenu = (e) => {
80
84
  if (e.defaultPrevented) {
81
85
  this.close();
@@ -115,14 +119,13 @@ var _Menu = class _Menu extends Component {
115
119
  this._openedByHover = true;
116
120
  this.open();
117
121
  };
122
+ // A hover menu stays open while the pointer moves onto its content or onto
123
+ // the trigger of an open menu. relatedTarget is null when the pointer
124
+ // leaves the window entirely.
118
125
  this._handleMouseLeave = (e) => {
119
126
  const toEl = e.relatedTarget;
120
- if (!toEl) {
121
- this.close();
122
- return;
123
- }
124
- const leaveToActiveMenuTrigger = toEl.closest(".menu-trigger")?.["Expressive_Menu"]?.isOpen;
125
- if (!leaveToActiveMenuTrigger && !this.menuEl?.contains(toEl)) this.close();
127
+ if (toEl && (this.menuEl?.contains(toEl) || _Menu._inOpenTrigger(toEl))) return;
128
+ this.close();
126
129
  };
127
130
  this._handleDocumentClick = (e) => {
128
131
  const path = e.composedPath();
@@ -183,7 +186,7 @@ var _Menu = class _Menu extends Component {
183
186
  const target = e.target;
184
187
  this._menuClickTargets.set(e, target);
185
188
  const li = target.closest("li");
186
- if (li?.matches('.disabled, [aria-disabled="true"]')) {
189
+ if (li?.matches('.disabled, [aria-disabled="true"], .divider, .gap, .label, .optgroup')) {
187
190
  e.preventDefault();
188
191
  e.stopPropagation();
189
192
  return;
@@ -373,10 +376,10 @@ var _Menu = class _Menu extends Component {
373
376
  this.focusedIndex = -1;
374
377
  this.filterQuery = [];
375
378
  if (!this.options.contextMenu) {
376
- this.el.ariaExpanded = "false";
377
- if (!this.el.hasAttribute("aria-haspopup")) this.el.setAttribute("aria-haspopup", "menu");
379
+ this._setAttribute(this.el, "aria-expanded", "false");
380
+ if (!this.el.hasAttribute("aria-haspopup")) this._setAttribute(this.el, "aria-haspopup", "menu");
378
381
  if (this.id && !this.el.hasAttribute("aria-controls"))
379
- this.el.setAttribute("aria-controls", this.id);
382
+ this._setAttribute(this.el, "aria-controls", this.id);
380
383
  }
381
384
  if (!this.menuEl) {
382
385
  console.warn(`Menu skipped: no element matches target "${this.id}".`, el);
@@ -400,6 +403,7 @@ var _Menu = class _Menu extends Component {
400
403
  clearTimeout(this.filterTimeout);
401
404
  this._resetMenuStyles();
402
405
  this._restoreInert();
406
+ this._restoreSetup();
403
407
  this._events.abort();
404
408
  this._openEvents?.abort();
405
409
  const index = _Menu._menus.indexOf(this);
@@ -440,6 +444,10 @@ var _Menu = class _Menu extends Component {
440
444
  }
441
445
  if (this.options.contextMenu) document.addEventListener("contextmenu", this._handleDocumentContextMenu, { signal });
442
446
  }
447
+ static _inOpenTrigger(el) {
448
+ const trigger = el.closest(".menu-trigger");
449
+ return Boolean(trigger && _Menu.getInstance(trigger)?.isOpen);
450
+ }
443
451
  _activateItem(li) {
444
452
  const checked = this._toggleChecked(li);
445
453
  if (!this._notify("select", this.options.onItemClick, { args: [li], detail: { item: li } })) return;
@@ -485,27 +493,27 @@ var _Menu = class _Menu extends Component {
485
493
  }
486
494
  _setupAccessibility() {
487
495
  if (!this.menuEl) return;
488
- if (!this.menuEl.hasAttribute("role")) this.menuEl.setAttribute("role", "menu");
496
+ if (!this.menuEl.hasAttribute("role")) this._setAttribute(this.menuEl, "role", "menu");
489
497
  const menus = [this.menuEl, ...this.menuEl.querySelectorAll("menu")];
490
498
  menus.forEach((menu) => {
491
- if (!menu.hasAttribute("role")) menu.setAttribute("role", "menu");
499
+ if (!menu.hasAttribute("role")) this._setAttribute(menu, "role", "menu");
492
500
  if (menu.getAttribute("role") !== "menu") return;
493
501
  menu.querySelectorAll(ROWS).forEach((li) => {
494
502
  if (li.classList.contains("divider")) {
495
- if (!li.hasAttribute("role")) li.setAttribute("role", "separator");
503
+ if (!li.hasAttribute("role")) this._setAttribute(li, "role", "separator");
496
504
  return;
497
505
  }
498
506
  if (li.classList.contains("gap")) {
499
- li.setAttribute("aria-hidden", "true");
507
+ this._setAttribute(li, "aria-hidden", "true");
500
508
  return;
501
509
  }
502
510
  if (li.classList.contains("label") || li.classList.contains("optgroup")) {
503
- if (!li.hasAttribute("role")) li.setAttribute("role", "presentation");
511
+ if (!li.hasAttribute("role")) this._setAttribute(li, "role", "presentation");
504
512
  return;
505
513
  }
506
- if (!li.hasAttribute("role")) li.setAttribute("role", "menuitem");
514
+ if (!li.hasAttribute("role")) this._setAttribute(li, "role", "menuitem");
507
515
  if (li.classList.contains("disabled") && !li.hasAttribute("aria-disabled")) {
508
- li.setAttribute("aria-disabled", "true");
516
+ this._setAttribute(li, "aria-disabled", "true");
509
517
  }
510
518
  });
511
519
  });
@@ -522,8 +530,8 @@ var _Menu = class _Menu extends Component {
522
530
  this.menuEl?.querySelectorAll("li").forEach((li) => {
523
531
  if (!li.querySelector(":scope > menu")) return;
524
532
  const trigger = li.querySelector(":scope > a, :scope > button, :scope > span") ?? li;
525
- trigger.setAttribute("aria-haspopup", "menu");
526
- trigger.setAttribute("aria-expanded", "false");
533
+ this._setAttribute(trigger, "aria-haspopup", "menu");
534
+ this._setAttribute(trigger, "aria-expanded", "false");
527
535
  });
528
536
  }
529
537
  _toggleSubmenu(li) {
@@ -583,7 +591,7 @@ var _Menu = class _Menu extends Component {
583
591
  }
584
592
  _resetMenuStyles() {
585
593
  if (!this.menuEl) return;
586
- this.menuEl.hidePopover();
594
+ if (this.menuEl.popover) this.menuEl.hidePopover();
587
595
  this._resetMenuPositioningStyles();
588
596
  this.menuEl.style.transform = "";
589
597
  this.menuEl.style.opacity = "";
@@ -598,19 +606,42 @@ var _Menu = class _Menu extends Component {
598
606
  this._stopReanchoring();
599
607
  }
600
608
  _moveMenuToElement() {
609
+ this._originalPlace = { parent: this.menuEl.parentNode, next: this.menuEl.nextSibling };
601
610
  if (this.options.container) this.options.container.append(this.menuEl);
602
611
  else this.el.after(this.menuEl);
603
612
  }
613
+ /** Keeps the value an attribute had before setup first changed it, which destroy() puts back. */
614
+ _keepAttribute(el, name) {
615
+ const saved = this._originalAttributes.get(el) ?? /* @__PURE__ */ new Map();
616
+ if (!saved.has(name)) saved.set(name, el.getAttribute(name));
617
+ this._originalAttributes.set(el, saved);
618
+ }
619
+ _setAttribute(el, name, value) {
620
+ this._keepAttribute(el, name);
621
+ el.setAttribute(name, value);
622
+ }
623
+ /**
624
+ * Puts back the attributes setup wrote and the menu where it was, so a
625
+ * destroyed trigger is no longer announced as a menu button. The place is
626
+ * only used while it is still in the page.
627
+ */
628
+ _restoreSetup() {
629
+ this._originalAttributes.forEach((saved, el) => saved.forEach((value, name) => restoreAttribute(el, name, value)));
630
+ this._originalAttributes.clear();
631
+ const { parent, next } = this._originalPlace;
632
+ if (parent?.isConnected) parent.insertBefore(this.menuEl, next?.parentNode === parent ? next : null);
633
+ }
604
634
  _makeMenuFocusable() {
605
635
  if (!this.menuEl) return;
636
+ this._keepAttribute(this.menuEl, "popover");
606
637
  this.menuEl.popover = "manual";
607
- this.menuEl.tabIndex = -1;
638
+ this._setAttribute(this.menuEl, "tabindex", "-1");
608
639
  this.menuEl.querySelectorAll(":scope li").forEach((el) => {
609
640
  if (el.matches('.divider, .gap, .label, .optgroup, [role="none"]')) {
610
- el.setAttribute("tabindex", "-1");
641
+ this._setAttribute(el, "tabindex", "-1");
611
642
  return;
612
643
  }
613
- if (!el.getAttribute("tabindex")) el.setAttribute("tabindex", "0");
644
+ if (!el.getAttribute("tabindex")) this._setAttribute(el, "tabindex", "0");
614
645
  });
615
646
  }
616
647
  /**
@@ -862,7 +893,7 @@ var _Menu = class _Menu extends Component {
862
893
  }
863
894
  // A trigger whose target never resolved has no menu to open.
864
895
  get _canOpen() {
865
- return !this.isOpen && !!this.menuEl && this.el["Expressive_Menu"] === this;
896
+ return !this.isOpen && !!this.menuEl && _Menu.getInstance(this.el) === this;
866
897
  }
867
898
  };
868
899
  _Menu._menus = [];
@@ -872,4 +903,4 @@ var Menu = _Menu;
872
903
  export {
873
904
  Menu
874
905
  };
875
- //# sourceMappingURL=chunk-CSYWKEK3.mjs.map
906
+ //# sourceMappingURL=chunk-DWA5UYLJ.mjs.map