@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,20 +1,26 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
- Utils
6
- } from "./chunk-ZVLOUDIJ.mjs";
5
+ Utils,
6
+ afterFormReset
7
+ } from "./chunk-67UNY7RH.mjs";
7
8
 
8
9
  // src/ts/components/richTextEditor.ts
9
10
  var _defaults = {
10
11
  Editor: null,
11
12
  extensions: []
12
13
  };
14
+ var command = (commands, name) => Reflect.get(commands, name);
13
15
  var NAMING = ["aria-label", "aria-labelledby", "aria-describedby"];
14
16
  var RichTextEditor = class extends Component {
15
17
  constructor(el, options) {
16
18
  super(el, options);
17
- /** The Tiptap editor. */
19
+ /**
20
+ * The Tiptap editor, with the full type of the `Editor` passed to the
21
+ * constructor; `init()` and `getInstance()` see the `RichTextEditorInstance`
22
+ * subset.
23
+ */
18
24
  this.editor = null;
19
25
  /** The element the editor is mounted in. */
20
26
  this.content = null;
@@ -25,7 +31,7 @@ var RichTextEditor = class extends Component {
25
31
  this._handleClick = (e) => {
26
32
  const button = e.target.closest("button[data-command]");
27
33
  const action = this._actions.get(button);
28
- if (action && !button.disabled) this.editor.chain().focus()[action.command](action.attributes).run();
34
+ if (action && !button.disabled) command(this.editor.chain().focus(), action.command)(action.attributes).run();
29
35
  };
30
36
  this._handleLabelClick = () => {
31
37
  this.editor.chain().focus().run();
@@ -36,14 +42,24 @@ var RichTextEditor = class extends Component {
36
42
  e.stopImmediatePropagation();
37
43
  this.editor.chain().focus().run();
38
44
  };
45
+ /**
46
+ * The form restores the textarea after the reset event, so the editor reads
47
+ * it back a task later. Without this the editor kept the typed text while the
48
+ * form submitted the default. No update is emitted, so a reset fires no input.
49
+ */
50
+ this._handleReset = () => {
51
+ if (!this.editor) return;
52
+ const commands = this.editor.commands;
53
+ commands.setContent(this.textarea.value, { emitUpdate: false });
54
+ };
39
55
  this._handleUpdate = () => {
40
56
  this.textarea.value = this.editor.isEmpty ? "" : this.editor.getHTML();
41
57
  this.textarea.dispatchEvent(new Event("input", { bubbles: true }));
42
58
  };
43
59
  this._handleTransaction = () => {
44
60
  const can = this.editor.isEditable && this.editor.can();
45
- for (const [button, { command, attributes, active }] of this._actions) {
46
- button.disabled = !can || !(command in this.editor.commands) || !can[command](attributes);
61
+ for (const [button, { command: name, attributes, active }] of this._actions) {
62
+ button.disabled = !can || !(name in this.editor.commands) || !command(can, name)(attributes);
47
63
  if (!active) continue;
48
64
  const on = this.editor.isActive(active, attributes);
49
65
  button.setAttribute("aria-pressed", String(on));
@@ -56,15 +72,15 @@ var RichTextEditor = class extends Component {
56
72
  return;
57
73
  }
58
74
  for (const button of el.querySelectorAll("button[data-command]")) {
59
- const command = button.dataset.command;
75
+ const command2 = button.dataset.command;
60
76
  let attributes2;
61
77
  try {
62
78
  attributes2 = button.dataset.attributes ? JSON.parse(button.dataset.attributes) : void 0;
63
79
  } catch {
64
80
  console.warn("RichTextEditor ignored invalid JSON in data-attributes:", button.dataset.attributes);
65
81
  }
66
- const active = command.startsWith("toggle") ? command[6].toLowerCase() + command.slice(7) : void 0;
67
- this._actions.set(button, { command, attributes: attributes2, active });
82
+ const active = command2.startsWith("toggle") ? command2[6].toLowerCase() + command2.slice(7) : void 0;
83
+ this._actions.set(button, { command: command2, attributes: attributes2, active });
68
84
  }
69
85
  const attributes = { role: "textbox", "aria-multiline": "true" };
70
86
  for (const name of NAMING) {
@@ -78,28 +94,33 @@ var RichTextEditor = class extends Component {
78
94
  this._label.addEventListener("click", this._handleLabelClick, { signal: this._events.signal });
79
95
  }
80
96
  this._required = this.textarea.required;
97
+ this._form = this.textarea.form;
81
98
  if (this._required) {
82
99
  attributes["aria-required"] = "true";
83
100
  this.textarea.required = false;
84
- this._form = this.textarea.form;
85
101
  this._form?.addEventListener("submit", this._handleSubmit, { capture: true, signal: this._events.signal });
86
102
  }
103
+ afterFormReset(this.textarea, this._handleReset, this._events.signal);
87
104
  this.content = document.createElement("div");
88
105
  this.content.className = "rich-text-editor-content";
89
106
  this.textarea.after(this.content);
90
107
  this.textarea.hidden = true;
91
- this.editor = new this.options.Editor({
108
+ const config = {
92
109
  element: this.content,
93
110
  extensions: this.options.extensions,
94
111
  content: this.textarea.value,
95
112
  editable: !(this.textarea.disabled || this.textarea.readOnly),
96
113
  editorProps: { attributes }
97
- });
114
+ };
115
+ this.editor = new this.options.Editor(config);
98
116
  this.editor.on("update", this._handleUpdate);
99
117
  this.editor.on("transaction", this._handleTransaction);
100
118
  this._handleTransaction();
101
119
  el.addEventListener("click", this._handleClick, { signal: this._events.signal });
102
120
  }
121
+ static init(els, options = {}) {
122
+ return super.init.call(this, els, options);
123
+ }
103
124
  static get defaults() {
104
125
  return _defaults;
105
126
  }
@@ -128,4 +149,4 @@ RichTextEditor.key = "Expressive_RichTextEditor";
128
149
  export {
129
150
  RichTextEditor
130
151
  };
131
- //# sourceMappingURL=chunk-SPPHF7YZ.mjs.map
152
+ //# sourceMappingURL=chunk-QHZZT7YO.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/richTextEditor.ts"],
4
+ "sourcesContent": ["import { Utils, afterFormReset } from '../core/utils';\nimport { Component, BaseOptions, InitElement, InitElements } from '../core/component';\n\n/**\n * The parts of a Tiptap `Editor` this component uses. Declared here so the\n * published types do not depend on Tiptap.\n */\n/** A Tiptap command chain. Commands by name come through `command()`. */\nexport interface RichTextEditorChain {\n focus(): RichTextEditorChain;\n run(): boolean;\n}\n\n/**\n * What `new Editor()` gets. Only these are declared; the extensions and\n * `editorProps` ride along, and Tiptap types them itself.\n */\nexport interface RichTextEditorConfig {\n element: HTMLElement;\n content: string;\n editable: boolean;\n}\n\nexport interface RichTextEditorInstance {\n commands: object;\n isEditable: boolean;\n isEmpty: boolean;\n chain(): RichTextEditorChain;\n /** Each command as a check that reports whether it can run now. */\n can(): object;\n isActive(name: string, attributes?: object): boolean;\n getHTML(): string;\n on(event: string, callback: () => void): unknown;\n off(event: string, callback: () => void): unknown;\n destroy(): void;\n}\n\n/** Tiptap's `Editor` class, or any class with the parts this component uses. */\nexport type RichTextEditorClass = new (options: RichTextEditorConfig) => RichTextEditorInstance;\n\nexport interface RichTextEditorOptions<E extends RichTextEditorClass = RichTextEditorClass> extends BaseOptions {\n /**\n * Tiptap's `Editor` class. ExpressiveCSS does not bundle Tiptap, so the\n * page imports it and passes it in.\n * @default null\n */\n Editor: E | null;\n /**\n * Tiptap extensions, usually `[StarterKit]`.\n * @default []\n */\n extensions: unknown[];\n}\n\nconst _defaults: RichTextEditorOptions = {\n Editor: null,\n extensions: []\n};\n\ntype Action = { command: string; attributes?: object; active?: string };\n\n/**\n * A command by name on a chain or on `can()`. The page's `data-command`\n * names a command an extension registered, which `_handleTransaction`\n * checks against `editor.commands` first.\n */\nconst command = <R>(commands: object, name: string) =>\n Reflect.get(commands, name) as (attributes?: object) => R;\n\n// Copied from the textarea onto the editable element.\nconst NAMING = ['aria-label', 'aria-labelledby', 'aria-describedby'];\n\n/**\n * A rich text editor built on Tiptap: a `.rich-text-editor` holding a\n * `<textarea>` and, usually, a `.toolbar` of `[data-command]` buttons.\n *\n * The textarea's value is the starting HTML. The component hides it, mounts\n * the editor after it and writes the editor's HTML back on every change, so\n * the textarea still submits with its form. A button's `data-command` names a\n * Tiptap command and `data-attributes` holds its JSON argument. Buttons are\n * disabled when their command cannot run, and `toggle*` commands report their\n * state with `aria-pressed` and `.active`.\n */\nexport class RichTextEditor<E extends RichTextEditorClass = RichTextEditorClass> extends Component<RichTextEditorOptions<E>> {\n /**\n * The Tiptap editor, with the full type of the `Editor` passed to the\n * constructor; `init()` and `getInstance()` see the `RichTextEditorInstance`\n * subset.\n */\n editor: InstanceType<E> | null = null;\n /** The form value. */\n textarea: HTMLTextAreaElement | null;\n /** The element the editor is mounted in. */\n content: HTMLElement | null = null;\n private _actions = new Map<HTMLButtonElement, Action>();\n private _label: HTMLLabelElement | null = null;\n private _required = false;\n private _form: HTMLFormElement | null = null;\n\n /** Initializes an editor, typed by the `Editor` passed in. */\n static init<E extends RichTextEditorClass>(this: typeof RichTextEditor, el: HTMLElement, options?: Partial<RichTextEditorOptions<E>>): RichTextEditor<E>;\n /** Initializes an editor on each element, typed by the `Editor` passed in. */\n static init<E extends RichTextEditorClass>(this: typeof RichTextEditor, els: InitElements<InitElement>, options?: Partial<RichTextEditorOptions<E>>): RichTextEditor<E>[];\n static init(els: HTMLElement | InitElements<InitElement>, options: Partial<RichTextEditorOptions> = {}): RichTextEditor | RichTextEditor[] {\n return super.init.call(this, els as InitElements<InitElement>, options);\n }\n\n constructor(el: HTMLElement, options: Partial<RichTextEditorOptions<E>>) {\n super(el, options);\n this.textarea = el.querySelector(':scope > textarea');\n if (!this.textarea || !this.options.Editor) {\n console.error('RichTextEditor needs a <textarea> child and the Tiptap Editor class in options.Editor.');\n return;\n }\n\n for (const button of el.querySelectorAll<HTMLButtonElement>('button[data-command]')) {\n const command = button.dataset.command;\n let attributes: object | undefined;\n try {\n attributes = button.dataset.attributes ? JSON.parse(button.dataset.attributes) : undefined;\n } catch {\n // One bad button must not stop the editor, or later elements, mounting.\n console.warn('RichTextEditor ignored invalid JSON in data-attributes:', button.dataset.attributes);\n }\n // toggleBulletList is active while the selection is in a bulletList.\n const active = command.startsWith('toggle') ? command[6].toLowerCase() + command.slice(7) : undefined;\n this._actions.set(button, { command, attributes, active });\n }\n\n const attributes: Record<string, string> = { role: 'textbox', 'aria-multiline': 'true' };\n for (const name of NAMING) {\n const value = this.textarea.getAttribute(name);\n if (value) attributes[name] = value;\n }\n // A <label for> names the hidden textarea, so it has to name the editor\n // instead, and a click on it has to focus the editor.\n this._label = this.textarea.labels?.[0] ?? null;\n if (this._label && !attributes['aria-labelledby']) {\n if (!this._label.id) this._label.id = `rich-text-editor-label-${Utils.guid()}`;\n attributes['aria-labelledby'] = this._label.id;\n this._label.addEventListener('click', this._handleLabelClick, { signal: this._events.signal });\n }\n // A hidden required textarea blocks submit with no message, because the\n // browser cannot focus it to report. The editor takes over: it carries\n // aria-required, and an empty editor cancels submit and takes focus.\n this._required = this.textarea.required;\n this._form = this.textarea.form;\n if (this._required) {\n attributes['aria-required'] = 'true';\n this.textarea.required = false;\n this._form?.addEventListener('submit', this._handleSubmit, { capture: true, signal: this._events.signal });\n }\n afterFormReset(this.textarea, this._handleReset, this._events.signal);\n\n this.content = document.createElement('div');\n this.content.className = 'rich-text-editor-content';\n this.textarea.after(this.content);\n this.textarea.hidden = true;\n const config = {\n element: this.content,\n extensions: this.options.extensions,\n content: this.textarea.value,\n editable: !(this.textarea.disabled || this.textarea.readOnly),\n editorProps: { attributes }\n };\n // `new` on a generic constructor yields the constraint, not E's instance.\n this.editor = new this.options.Editor(config) as InstanceType<E>;\n this.editor.on('update', this._handleUpdate);\n this.editor.on('transaction', this._handleTransaction);\n this._handleTransaction();\n el.addEventListener('click', this._handleClick, { signal: this._events.signal });\n }\n\n static get defaults(): RichTextEditorOptions {\n return _defaults;\n }\n\n static key = 'Expressive_RichTextEditor';\n\n destroy() {\n super.destroy();\n if (!this.editor) return;\n this.editor.off('update', this._handleUpdate);\n this.editor.off('transaction', this._handleTransaction);\n this.editor.destroy();\n this.editor = null;\n this.content.remove();\n this.textarea.hidden = false;\n this.textarea.required = this._required;\n for (const button of this._actions.keys()) {\n button.disabled = false;\n button.classList.remove('active');\n button.removeAttribute('aria-pressed');\n }\n }\n\n private _handleClick = (e: MouseEvent) => {\n const button = (e.target as Element).closest<HTMLButtonElement>('button[data-command]');\n const action = this._actions.get(button);\n if (action && !button.disabled) command<RichTextEditorChain>(this.editor.chain().focus(), action.command)(action.attributes).run();\n };\n\n private _handleLabelClick = () => {\n this.editor.chain().focus().run();\n };\n\n private _skipsValidation(e: SubmitEvent) {\n return this._form.noValidate || !!(e.submitter as HTMLButtonElement | null)?.formNoValidate;\n }\n\n private _handleSubmit = (e: SubmitEvent) => {\n if (this._skipsValidation(e) || !this.editor.isEditable || !this.editor.isEmpty) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n this.editor.chain().focus().run();\n };\n\n /**\n * The form restores the textarea after the reset event, so the editor reads\n * it back a task later. Without this the editor kept the typed text while the\n * form submitted the default. No update is emitted, so a reset fires no input.\n */\n private _handleReset = () => {\n if (!this.editor) return;\n const commands = this.editor.commands as { setContent: (content: string, options: { emitUpdate: boolean }) => boolean };\n commands.setContent(this.textarea.value, { emitUpdate: false });\n };\n\n private _handleUpdate = () => {\n this.textarea.value = this.editor.isEmpty ? '' : this.editor.getHTML();\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n };\n\n private _handleTransaction = () => {\n const can = this.editor.isEditable && this.editor.can();\n for (const [button, { command: name, attributes, active }] of this._actions) {\n button.disabled = !can || !(name in this.editor.commands) || !command<boolean>(can, name)(attributes);\n if (!active) continue;\n const on = this.editor.isActive(active, attributes);\n button.setAttribute('aria-pressed', String(on));\n button.classList.toggle('active', on);\n }\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["command", "attributes"]
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils,
6
6
  restoreAttribute
7
- } from "./chunk-ZVLOUDIJ.mjs";
7
+ } from "./chunk-67UNY7RH.mjs";
8
8
 
9
9
  // src/ts/components/tabs.ts
10
10
  var STEPS = { ltr: { ArrowLeft: -1, ArrowRight: 1 }, rtl: { ArrowLeft: 1, ArrowRight: -1 } };
@@ -117,7 +117,7 @@ var _Tabs = class _Tabs extends Component {
117
117
  this._createIndicator();
118
118
  this._setupEventHandlers();
119
119
  document.fonts?.ready.then(() => {
120
- if (this.el["Expressive_Tabs"] === this) this._remeasure();
120
+ if (_Tabs.getInstance(this.el) === this) this._remeasure();
121
121
  });
122
122
  }
123
123
  _setupTablist() {
@@ -191,6 +191,7 @@ var _Tabs = class _Tabs extends Component {
191
191
  this._scrollToActivePanel(scrollBehavior());
192
192
  }
193
193
  _clickTab(tabLink) {
194
+ if (tabLink === this._activeTabLink) return;
194
195
  const oldContent = this._content;
195
196
  this._tabLinks = this._queryTabLinks();
196
197
  const prevIndex = this._index;
@@ -435,4 +436,4 @@ var Tabs = _Tabs;
435
436
  export {
436
437
  Tabs
437
438
  };
438
- //# sourceMappingURL=chunk-LDXCC2L3.mjs.map
439
+ //# sourceMappingURL=chunk-QND56EW2.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/tabs.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils, restoreAttribute } from '../core/utils';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Indicator transition duration in milliseconds, on an ease-out curve. The\n * default, null, follows the --md-comp-tabs-indicator-duration and\n * --md-comp-tabs-indicator-easing spring tokens instead.\n * @default null\n */\n duration: number | null;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to swipe between panels. The panels move into a full-width\n * scroll-snap track, so touch and trackpad swipes are native scrolling.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\n/** Left and Right move between tabs the way they point, so they swap in RTL. */\nconst STEPS = { ltr: { ArrowLeft: -1, ArrowRight: 1 }, rtl: { ArrowLeft: 1, ArrowRight: -1 } };\n\nconst _defaults: TabsOptions = {\n duration: null,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nconst scrollBehavior = (): ScrollBehavior =>\n window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'instant' : 'smooth';\n\n/** Links cannot be :disabled; a tab is turned off with a class or aria-disabled. */\nconst isDisabled = (a: Element) => a.matches('.disabled, [aria-disabled=\"true\"]');\n\n/** Shown, as far as the browser can say; a responsive utility may hide a tab. */\nconst isShown = (a: Element) => a.checkVisibility?.() ?? true;\n\n/** A tab the keyboard can reach: enabled and shown. */\nconst isUsable = (a: Element) => !isDisabled(a) && isShown(a);\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _track: HTMLElement;\n private _panels: HTMLElement[] = [];\n // The panel a programmatic scroll is heading for. Scroll events on the way\n // there pass over other panels and must not select them.\n private _scrollTarget: number | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout>;\n private _trackObserver: ResizeObserver | null = null;\n private _trackWidth = -1;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n private _originalPanels = new Map<HTMLElement, { display: string; priority: string; active: boolean; inert: boolean; marker?: Comment }>();\n private _originalLinks = new Map<HTMLAnchorElement, { active: boolean; current: string | null; selected: string | null; tabindex: string | null }>();\n /**\n * Whether the page made the strip a tablist. The roles are the author's;\n * in that mode the component keeps aria-selected and a roving tabindex, and\n * the arrow keys select as they move, as the ARIA tabs pattern asks.\n */\n private _tablist = false;\n /** The bar's own tabindex as the page wrote it, put back on destroy. */\n private _barTabindex: string | null = null;\n /** Re-chooses a tablist's Tab stop when the strip is shown, hidden or resized. */\n private _stripObserver: ResizeObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options);\n\n this._tabLinks = this._queryTabLinks();\n if (!this._tabLinks.length) {\n console.error('Tabs: no tab links (an <a> child) to show');\n return;\n }\n this._setupTablist();\n this._tabLinks.forEach(link => {\n this._originalLinks.set(link, {\n active: link.classList.contains('active'), current: link.getAttribute('aria-current'),\n selected: link.getAttribute('aria-selected'), tabindex: link.getAttribute('tabindex')\n });\n const panel = this._panelFor(link);\n if (panel) this._originalPanels.set(panel, {\n display: panel.style.display, priority: panel.style.getPropertyPriority('display'),\n active: panel.classList.contains('active'), inert: panel.inert\n });\n });\n // Swiping needs at least one panel the links resolve to.\n this.options.swipeable &&= window.innerWidth <= this.options.responsiveThreshold && this._originalPanels.size > 0;\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n // Labels measured before a web font arrives have the fallback's width,\n // and the strip's size need not change when the font arrives.\n document.fonts?.ready.then(() => {\n if (Tabs.getInstance(this.el) === this) this._remeasure();\n });\n }\n\n private _setupTablist() {\n this._tablist = this.el.getAttribute('role') === 'tablist';\n // Firefox makes an overflowing bar a Tab stop of its own, ahead of the\n // tabs; a tablist is one Tab stop, so the bar steps aside.\n this._barTabindex = this.el.getAttribute('tabindex');\n if (this._tablist) this.el.tabIndex = -1;\n // A strip set up inside a closed dialog has no visible tabs yet; opening\n // it changes the strip's size, and so does a window resize or a utility\n // that shows or hides a tab. The tabs are watched too: at the 840px\n // breakpoint they switch between equal and intrinsic widths inside a\n // strip that may keep its size. Each change re-measures the indicator,\n // and a tablist chooses its Tab stop again.\n this._stripObserver = new ResizeObserver(() => {\n if (this._tablist) this._refreshTabStop();\n this._remeasure();\n });\n this._stripObserver.observe(this.el);\n this._tabLinks.forEach((a) => this._stripObserver.observe(a));\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Tabs';\n\n destroy() {\n this._stripObserver?.disconnect();\n this._stripObserver = null;\n this._indicator?.remove();\n if (this._track) {\n this._teardownSwipeableTabs();\n }\n this._originalPanels.forEach((original, panel) => {\n panel.style.setProperty('display', original.display, original.priority);\n panel.classList.toggle('active', original.active);\n panel.inert = original.inert;\n if (!panel.className) panel.removeAttribute('class');\n });\n this._originalLinks.forEach((original, link) => {\n link.classList.toggle('active', original.active);\n restoreAttribute(link, 'aria-current', original.current);\n restoreAttribute(link, 'aria-selected', original.selected);\n restoreAttribute(link, 'tabindex', original.tabindex);\n });\n restoreAttribute(this.el, 'tabindex', this._barTabindex);\n super.destroy();\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleTabClick, { signal: this._events.signal });\n this.el.addEventListener('keydown', this._handleKeydown, { signal: this._events.signal });\n }\n\n /**\n * Left and Right move focus to the next tab, wrapping at the ends, and\n * Home and End to the first and last; disabled tabs are skipped. In link\n * tabs focus moves without choosing, and Enter follows the link. In a\n * tablist the tab that takes focus is selected too, the ARIA pattern's\n * automatic activation, since a panel here shows at once.\n */\n _handleKeydown = (e: KeyboardEvent) => {\n const steps = STEPS[getComputedStyle(this.el).direction === 'rtl' ? 'rtl' : 'ltr'];\n const target = Utils.focusTarget(Array.from(this._tabLinks).filter(isShown), e, steps, true) as HTMLAnchorElement | undefined;\n if (!target) return;\n e.preventDefault();\n target.focus();\n this._followFocus(target);\n };\n\n /**\n * In a tablist the tab that takes focus is selected; link tabs wait for\n * Enter. The page's focus handlers run inside focus(), and one may have\n * destroyed or replaced the tabs, which then are no longer this instance's.\n */\n private _followFocus(tab: HTMLAnchorElement) {\n if (this._tablist && tab !== this._activeTabLink && Tabs.getInstance(this.el) === this) this._select(tab);\n }\n\n private _remeasure() {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) this._positionIndicator();\n }\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(':scope > a');\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a');\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true';\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n e.preventDefault();\n this._select(tabLink);\n };\n\n private _select(tabLink: HTMLAnchorElement) {\n if (this.options.swipeable) this._clickSwipeable(tabLink);\n else this._clickTab(tabLink);\n }\n\n private _clickSwipeable(tabLink: HTMLAnchorElement) {\n if (!this._panels.includes(this._panelFor(tabLink))) return;\n // A listener may destroy the tabs or pick another one.\n if (tabLink !== this._activeTabLink && !this._showPanel(tabLink)) return;\n this._scrollToActivePanel(scrollBehavior());\n }\n\n private _clickTab(tabLink: HTMLAnchorElement) {\n // The shown tab: nothing changes, so onShow must not fire again.\n if (tabLink === this._activeTabLink) return;\n const oldContent = this._content;\n this._tabLinks = this._queryTabLinks();\n // Moves the class and aria-current together, off the old tab and onto this\n // one - they used to be able to disagree.\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n // A listener may destroy the tabs or pick another one.\n if (this._content && !this._swapPanels(oldContent)) return;\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n }\n\n /** Shows the active panel, hides the old one, then reports the change. */\n private _swapPanels(oldContent: HTMLElement | null): boolean {\n // Clear the hide rather than force 'block', so a flex or grid panel\n // keeps the display its stylesheet gives it.\n this._content.style.display = '';\n this._content.classList.add('active');\n if (oldContent && oldContent !== this._content) {\n oldContent.style.display = 'none';\n oldContent.classList.remove('active');\n }\n return this._notifyShow();\n }\n\n _createIndicator() {\n const indicator = document.createElement('span');\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._positionIndicator();\n }\n\n /** Reads both positions before writing either. */\n private _positionIndicator() {\n const left = this._calcLeftPos(this._activeTabLink);\n const right = this._calcRightPos(this._activeTabLink);\n this._indicator.style.left = left + 'px';\n this._indicator.style.right = right + 'px';\n }\n\n /** The panel a link shows, or null for a `target` link or one without a hash. */\n private _panelFor(a: HTMLAnchorElement): HTMLElement | null {\n if (!a.hash || a.hasAttribute('target')) return null;\n // Looked up in the tabs' own root, so panels inside a shadow root resolve.\n return Utils.getElementById(this.el, Tabs._decodeHash(a.hash));\n }\n\n /**\n * The id a hash names. `a.hash` and `location.hash` come back\n * percent-encoded, so a non-ASCII id would never match without this. A\n * malformed escape throws, and is then taken as written.\n */\n private static _decodeHash(hash: string): string {\n try {\n return decodeURIComponent(hash.slice(1));\n } catch {\n return hash.slice(1);\n }\n }\n\n /**\n * Which tab is current, for the eye and for assistive technology.\n *\n * The class alone is a colour. Link tabs are navigation, so `aria-current`\n * is the part a screen reader reads. A strip the page made a tablist reads\n * `aria-selected` instead, with the keyboard model rule 2 asks of a\n * composite role. Either value changes as the user picks, which makes\n * keeping it the component's job, not the author's - see CONTEXT.md on\n * static semantics versus dynamic state. Writing it once in the markup and\n * never moving it left the old tab announcing itself as current.\n */\n private _setActiveTabLink(tabLink: HTMLAnchorElement, behavior: ScrollBehavior = scrollBehavior()) {\n const stop = this._tabStop(tabLink);\n Array.from(this._tabLinks).forEach(a => this._mark(a, a === tabLink, a === stop));\n this._activeTabLink = tabLink;\n this._index = Array.from(this._tabLinks).indexOf(tabLink);\n this._content = this._panelFor(tabLink);\n this._reveal(tabLink, behavior);\n }\n\n /** A tablist says selected and keeps one Tab stop; link tabs say current. */\n private _mark(a: HTMLAnchorElement, on: boolean, stop: boolean) {\n a.classList.toggle('active', on);\n if (this._tablist) {\n a.setAttribute('aria-selected', String(on));\n a.tabIndex = stop ? 0 : -1;\n } else if (on) a.setAttribute('aria-current', 'page');\n else a.removeAttribute('aria-current');\n }\n\n /**\n * The tablist's one Tab stop: the selected tab, or the first usable one\n * when the selected tab is disabled or hidden. The arrow keys skip both,\n * so a Tab stop on one would leave every other panel out of reach.\n */\n private _tabStop(selected: HTMLAnchorElement): HTMLAnchorElement {\n if (isUsable(selected)) return selected;\n // With nothing shown, as in a closed dialog, at least skip disabled tabs.\n const links = Array.from(this._tabLinks);\n return links.find(isUsable) ?? links.find((a) => !isDisabled(a)) ?? selected;\n }\n\n /** Showing or hiding the strip or a tab moves the Tab stop to a usable tab. */\n private _refreshTabStop() {\n const stop = this._tabStop(this._activeTabLink);\n this._tabLinks.forEach((a) => (a.tabIndex = a === stop ? 0 : -1));\n }\n\n /**\n * Scrolls an overflowing bar, and only the bar, so the tab is in view.\n * Measured as a visual offset, so it holds in a right-to-left bar too.\n */\n private _reveal(tab: HTMLElement, behavior: ScrollBehavior) {\n const bar = this.el.getBoundingClientRect();\n const box = tab.getBoundingClientRect();\n const left = Math.min(0, box.left - bar.left) || Math.max(0, box.right - bar.right);\n if (left) this.el.scrollBy({ left, behavior });\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n // If no match is found, use any with class 'active', then the first link.\n // Both sides decoded: an href may be written with or without escapes.\n const hash = location.hash && Tabs._decodeHash(location.hash);\n this._activeTabLink =\n Array.from(this._tabLinks).find(a => hash && Tabs._decodeHash(a.getAttribute('href') ?? '') === hash) ??\n this.el.querySelector<HTMLAnchorElement>('a.active') ??\n this._tabStop(this._tabLinks[0]);\n this._setActiveTabLink(this._activeTabLink, 'instant');\n\n this._originalPanels.forEach((_, panel) => panel.classList.toggle('active', panel === this._content));\n }\n\n _setupSwipeableTabs() {\n this._panels = [...new Set(Array.from(this._tabLinks, (a) => this._panelFor(a)).filter(Boolean))];\n const track = document.createElement('div');\n track.classList.add('tabs-content');\n this._panels[0].before(track);\n this._panels.forEach((panel) => {\n const marker = document.createComment('');\n panel.before(marker);\n this._originalPanels.get(panel).marker = marker;\n track.appendChild(panel);\n panel.style.display = '';\n });\n this._track = track;\n this._syncPanels();\n const options = { passive: true, signal: this._events.signal };\n track.addEventListener('scroll', this._handleTrackScroll, options);\n // A swipe or wheel that interrupts a programmatic scroll takes over from it.\n track.addEventListener('pointerdown', this._releaseScrollTarget, options);\n track.addEventListener('wheel', this._releaseScrollTarget, options);\n // A track that starts hidden (in a closed dialog or sheet) is 0px wide, so\n // the scroll below cannot reach the active panel. Re-align whenever the\n // track's width changes, which also covers window resizes. Only the width:\n // a panel growing taller mid-swipe must not pull the track back.\n this._trackObserver = new ResizeObserver(() => {\n if (track.clientWidth === this._trackWidth) return;\n this._trackWidth = track.clientWidth;\n this._scrollToActivePanel('instant');\n });\n this._trackObserver.observe(track);\n this._scrollToActivePanel('instant');\n }\n\n _teardownSwipeableTabs() {\n const track = this._track;\n this._trackObserver?.disconnect();\n this._trackObserver = null;\n this._releaseScrollTarget();\n this._originalPanels.forEach((original, panel) => original.marker?.replaceWith(panel));\n track.remove();\n this._track = undefined;\n }\n\n /** Only the shown panel is reachable; the others are off to the side. */\n private _syncPanels() {\n this._panels.forEach((panel) => {\n panel.classList.toggle('active', panel === this._content);\n panel.inert = panel !== this._content;\n });\n }\n\n /** The panel the track is mostly showing. Panels are exactly one track wide. */\n private _trackIndex() {\n return Math.round(Math.abs(this._track.scrollLeft) / (this._track.clientWidth || 1));\n }\n\n /**\n * Whether panel `index` fills the track. Compare positions, not rounded\n * indexes: a scroll still on its way to another panel can already round to\n * this one. Measured rather than computed from clientWidth, which rounds a\n * fractional track width, while the mandatory snap lands on the real edge.\n */\n private _trackAt(index: number) {\n return Math.abs(this._panels[index].getBoundingClientRect().left - this._track.getBoundingClientRect().left) < 1;\n }\n\n private _scrollToActivePanel(behavior: ScrollBehavior) {\n const index = this._panels.indexOf(this._content);\n if (index < 0 || this._trackAt(index)) return;\n // scrollLeft runs negative in a right-to-left track.\n const sign = getComputedStyle(this._track).direction === 'rtl' ? -1 : 1;\n const left = sign * index * this._track.clientWidth;\n this._scrollTarget = index;\n this._waitForScroll();\n this._track.scrollTo({ left, behavior });\n }\n\n // A smooth scroll that something cut short never arrives, and on a busy page\n // one can also take a while to start. Once the track has been still for half\n // a second, jump to the selected panel. The selection stands: a swipe or\n // wheel that took over has already released the target, so the scroll\n // events that follow choose the panel. Every scroll event restarts the wait.\n private _waitForScroll() {\n clearTimeout(this._scrollTimer);\n this._scrollTimer = setTimeout(() => {\n this._releaseScrollTarget();\n this._scrollToActivePanel('instant');\n }, 500);\n }\n\n _releaseScrollTarget = () => {\n clearTimeout(this._scrollTimer);\n this._scrollTarget = null;\n };\n\n _handleTrackScroll = () => {\n if (this._scrollTarget !== null) {\n // Release on arrival. A smooth scroll still heading to the previous\n // selection rounds to the new target on its way past, and releasing\n // there let the rest of that scroll select the panel it was heading to.\n if (this._trackAt(this._scrollTarget)) this._releaseScrollTarget();\n else this._waitForScroll();\n return;\n }\n const panel = this._panels[this._trackIndex()];\n if (!panel || panel === this._content) return;\n this._showPanel(Array.from(this._tabLinks).find((a) => this._panelFor(a) === panel));\n };\n\n private _showPanel(tabLink: HTMLAnchorElement): boolean {\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n this._syncPanels();\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n return this._notifyShow();\n }\n\n // After the old panel is hidden, so a listener sees one active panel.\n private _notifyShow(): boolean {\n const panel = this._content;\n return this._notify('change', this.options.onShow, { args: [panel], detail: { panel }, current: () => this._content === panel });\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink) return;\n const currContent = this._panelFor(a);\n if (currContent) currContent.style.display = 'none';\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el: HTMLElement): number {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el: HTMLElement): number {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex: number): void {\n // The trailing edge waits 30% of the move, so the bar stretches toward\n // the new tab before it shrinks. On the spring tokens that delay scales\n // with the spring and drops to 0 with it under reduced motion.\n const ms = this.options.duration;\n const timing = ms == null\n ? ['var(--md-comp-tabs-indicator-duration) var(--md-comp-tabs-indicator-easing)', 'calc(var(--md-comp-tabs-indicator-duration) * 0.3)']\n : [`${ms}ms ease-out`, `${ms * 0.3}ms`];\n const [leftDelay, rightDelay] = this._index - prevIndex >= 0 ? [timing[1], '0s'] : ['0s', timing[1]];\n this._indicator.style.transition = `left ${timing[0]} ${leftDelay}, right ${timing[0]} ${rightDelay}`;\n\n this._positionIndicator();\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(a => a.getAttribute('href') === '#' + tabId);\n if (tab) tab.click();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -2,15 +2,15 @@ import {
2
2
  formAssociated,
3
3
  unwrapControl,
4
4
  wrapInControl
5
- } from "./chunk-INLZWHLY.mjs";
5
+ } from "./chunk-UHO5CV6K.mjs";
6
6
  import {
7
7
  Component
8
- } from "./chunk-CMGXGYUC.mjs";
8
+ } from "./chunk-EB2V4OKL.mjs";
9
9
  import {
10
10
  Utils,
11
11
  controllerFor,
12
12
  restoreAttribute
13
- } from "./chunk-ZVLOUDIJ.mjs";
13
+ } from "./chunk-67UNY7RH.mjs";
14
14
 
15
15
  // src/ts/components/cascader.ts
16
16
  var CONTROL = "expressive-cascader-control";
@@ -373,4 +373,4 @@ Cascader.key = "Expressive_Cascader";
373
373
  export {
374
374
  Cascader
375
375
  };
376
- //# sourceMappingURL=chunk-NVQ5EHCU.mjs.map
376
+ //# sourceMappingURL=chunk-QNODAANY.mjs.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils
6
- } from "./chunk-ZVLOUDIJ.mjs";
6
+ } from "./chunk-67UNY7RH.mjs";
7
7
 
8
8
  // src/ts/components/mapView.ts
9
9
  var OPENFREEMAP = "https://tiles.openfreemap.org/styles/";
@@ -36,7 +36,10 @@ var plainArrow = (e) => Utils.plainKey(e) ? ARROWS[e.key] : void 0;
36
36
  var MapView = class extends Component {
37
37
  constructor(el, options) {
38
38
  super(el, options);
39
- /** The MapLibre map. */
39
+ /**
40
+ * The MapLibre map, with the full type of the `maplibregl` passed to the
41
+ * constructor; `init()` and `getInstance()` see the `MapInstance` subset.
42
+ */
40
43
  this.map = null;
41
44
  /** The MapLibre markers made from `.map-marker` children, in order. */
42
45
  this.markers = [];
@@ -116,13 +119,14 @@ var MapView = class extends Component {
116
119
  this._zoomIn = [...this._buttons("zoom-in")];
117
120
  this._zoomOut = [...this._buttons("zoom-out")];
118
121
  this._dark = this._isDark();
119
- this.map = new lib.Map({
122
+ const init = {
120
123
  ...this.options.mapOptions,
121
124
  container: el,
122
125
  style: this._style(),
123
126
  center: this.options.center,
124
127
  zoom: this.options.zoom
125
- });
128
+ };
129
+ this.map = new lib.Map(init);
126
130
  this.map.on("style.load", this._handleStyleLoad);
127
131
  this.map.on("move", this._sync);
128
132
  this.map.on("click", this._handleMapClick);
@@ -149,6 +153,9 @@ var MapView = class extends Component {
149
153
  el.addEventListener("keydown", this._handleKeydown, { signal });
150
154
  this._sync();
151
155
  }
156
+ static init(els, options = {}) {
157
+ return super.init.call(this, els, options);
158
+ }
152
159
  static get defaults() {
153
160
  return _defaults;
154
161
  }
@@ -200,8 +207,9 @@ var MapView = class extends Component {
200
207
  const clusters = `${id}-clusters`, points = `${id}-points`;
201
208
  const zoomIn = async (e) => {
202
209
  const [feature] = e.features;
203
- const zoom = await this.map.getSource(id).getClusterExpansionZoom(feature.properties.cluster_id);
204
- this.map?.easeTo({ center: feature.geometry.coordinates, zoom });
210
+ const source = this.map.getSource(id);
211
+ const zoom = await source.getClusterExpansionZoom(feature.properties.cluster_id).catch(() => null);
212
+ if (zoom !== null) this.map?.easeTo({ center: feature.geometry.coordinates, zoom });
205
213
  };
206
214
  const pointer = () => {
207
215
  this.map.getCanvas().style.cursor = "pointer";
@@ -336,7 +344,9 @@ var MapView = class extends Component {
336
344
  this._restore.push(() => ["aria-pressed", ...added].forEach((name) => element.removeAttribute(name)));
337
345
  element.addEventListener("keydown", (e) => this._nudge(e, marker), { signal: this._events.signal });
338
346
  marker.on("dragstart", () => this._dragged = element);
339
- marker.on("dragend", () => setTimeout(() => this._dragged = null));
347
+ marker.on("dragend", () => setTimeout(() => {
348
+ this._dragged = null;
349
+ }));
340
350
  }
341
351
  /** Takes back the attributes `_makeMovable()` added. Destroy removes its listeners. */
342
352
  _releaseMarkers() {
@@ -362,7 +372,7 @@ var MapView = class extends Component {
362
372
  // A tap on a draggable marker picks it up, or puts it back down; the click
363
373
  // that ends a drag does neither.
364
374
  _tapMarker(element) {
365
- if (element?.hasAttribute("data-draggable")) this._tapMovable(element);
375
+ if (element?.matches("[data-draggable][aria-pressed]")) this._tapMovable(element);
366
376
  else if (this._markerPopups.has(element)) this._toggle(element);
367
377
  }
368
378
  _tapMovable(element) {
@@ -430,12 +440,12 @@ var MapView = class extends Component {
430
440
  _isDark() {
431
441
  return this._color("light-dark(black, white)") === "rgba(255, 255, 255, 1)";
432
442
  }
433
- _themed() {
434
- const style = this.options.style;
443
+ _themed(style = this.options.style) {
435
444
  return typeof style === "object" && "light" in style && "dark" in style;
436
445
  }
437
446
  _style() {
438
- return this._themed() ? this.options.style[this._dark ? "dark" : "light"] : this.options.style;
447
+ const style = this.options.style;
448
+ return this._themed(style) ? style[this._dark ? "dark" : "light"] : style;
439
449
  }
440
450
  // A tap on the map, not on a marker, puts a picked-up marker there.
441
451
  _drop(target, at) {
@@ -465,4 +475,4 @@ MapView.key = "Expressive_MapView";
465
475
  export {
466
476
  MapView
467
477
  };
468
- //# sourceMappingURL=chunk-7NLUI3RR.mjs.map
478
+ //# sourceMappingURL=chunk-QRO5FV3I.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/mapView.ts"],
4
+ "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElement, InitElements } from '../core/component';\n\n/** `[longitude, latitude]`, MapLibre's order. */\nexport type LngLat = [number, number];\n\n/**\n * The parts of the `maplibre-gl` module this component uses. Declared here so\n * the published types do not depend on MapLibre.\n */\nexport interface MapLibre {\n Map: new (options: MapInit) => MapInstance;\n Marker: new (options: object) => MapMarker;\n Popup: new (options: object) => MapPopup;\n}\n\n/**\n * What `new Map()` gets. Only the container is declared; the style, center,\n * zoom and `mapOptions` ride along, and MapLibre types them itself.\n */\nexport interface MapInit {\n container: HTMLElement;\n}\n\n/** A point on the map, as MapLibre hands it back. */\nexport interface MapLngLat {\n lng: number;\n lat: number;\n}\n\n/** A map click, with the DOM event behind it and, on a layer, the features hit. */\nexport interface MapMouseEvent {\n originalEvent: MouseEvent;\n lngLat: MapLngLat;\n features?: Array<{ properties: Record<string, unknown>; geometry: { coordinates: LngLat } }>;\n}\n\nexport interface MapMarker {\n getElement(): HTMLElement;\n getLngLat(): MapLngLat;\n setLngLat(at: LngLat | MapLngLat): this;\n addTo(map: MapInstance): this;\n on(event: 'dragstart' | 'dragend', callback: () => void): unknown;\n remove(): unknown;\n}\n\nexport interface MapPopup {\n getElement(): HTMLElement | undefined;\n setDOMContent(content: Node): this;\n setLngLat(at: LngLat | MapLngLat): this;\n addTo(map: MapInstance): this;\n isOpen(): boolean;\n on(event: 'open' | 'close', callback: () => void): unknown;\n remove(): unknown;\n}\n\n/** A style layer, as `getStyle()` lists them. */\nexport interface MapLayer {\n id: string;\n source?: string;\n layout?: Record<string, unknown>;\n}\n\n/** A source, as `getSource()` returns it. */\nexport interface MapSource {\n type: string;\n}\n\n/** A clustered GeoJSON source, which is what `addClusters()` registers. */\nexport interface MapClusterSource extends MapSource {\n getClusterExpansionZoom(clusterId: unknown): Promise<number>;\n}\n\n/** The parts of a `maplibre-gl` `Map` this component calls. */\nexport interface MapInstance {\n on(event: string, listener: (e: MapMouseEvent) => void): unknown;\n on(event: string, layer: string, listener: (e: MapMouseEvent) => void): unknown;\n off(event: string, layer: string, listener: (e: MapMouseEvent) => void): unknown;\n remove(): void;\n zoomIn(): unknown;\n zoomOut(): unknown;\n resetNorthPitch(): unknown;\n getZoom(): number;\n getMinZoom(): number;\n getMaxZoom(): number;\n getBearing(): number;\n getCanvas(): HTMLCanvasElement;\n getStyle(): { glyphs?: string; layers: MapLayer[] };\n setStyle(style: string | object | null, options?: { diff?: boolean }): unknown;\n getSource(id: string): MapSource | undefined;\n addSource(id: string, source: object): unknown;\n removeSource(id: string): unknown;\n addLayer(layer: object): unknown;\n removeLayer(id: string): unknown;\n project(at: MapLngLat): { x: number; y: number };\n unproject(point: [number, number]): MapLngLat;\n panBy(offset: [number, number]): unknown;\n flyTo(options: { center: LngLat; zoom: number }): unknown;\n easeTo(options: { center: LngLat; zoom: number }): unknown;\n}\n\n/** A style for each color scheme. The map follows the page's theme. */\nexport interface MapThemedStyle {\n light: string | object;\n dark: string | object;\n}\n\nexport interface MapViewOptions<L extends MapLibre = MapLibre> extends BaseOptions {\n /**\n * The `maplibre-gl` module. ExpressiveCSS does not bundle MapLibre, so the\n * page imports it and passes it in.\n * @default null\n */\n maplibregl: L | null;\n /**\n * A MapLibre style URL or object, or `{ light, dark }` to follow the theme.\n * @default OpenFreeMap Positron and Dark\n */\n style: string | object | MapThemedStyle;\n /**\n * Starting `[longitude, latitude]`.\n * @default [0, 20]\n */\n center: LngLat;\n /**\n * Starting zoom level.\n * @default 1\n */\n zoom: number;\n /**\n * More MapLibre `Map` options, such as `maxZoom` or `bearing`.\n * @default {}\n */\n mapOptions: object;\n}\n\nexport interface MapLineOptions {\n /** CSS color. Defaults to the route or arc color token. */\n color?: string;\n /** Width in pixels. Routes default to 4, arcs to 2. */\n width?: number;\n /** 0 to 1. */\n opacity?: number;\n /** Dash and gap lengths in line widths, such as `[2, 2]`. */\n dashArray?: number[];\n}\n\nexport interface MapArc {\n from: LngLat;\n to: LngLat;\n}\n\nexport interface MapClusterOptions {\n /** CSS color. Defaults to the cluster color token. */\n color?: string;\n /**\n * Pixels within which points join a cluster.\n * @default 50\n */\n radius?: number;\n /**\n * Last zoom level that clusters points.\n * @default 14\n */\n maxZoom?: number;\n}\n\nconst OPENFREEMAP = 'https://tiles.openfreemap.org/styles/';\n\nconst _defaults: MapViewOptions = {\n maplibregl: null,\n style: { light: `${OPENFREEMAP}positron`, dark: `${OPENFREEMAP}dark` },\n center: [0, 20],\n zoom: 1,\n mapOptions: {}\n};\n\ntype Overlay = { draw: () => void; off?: () => void };\n\nconst isLngLat = (value: number[]): value is LngLat =>\n value.length === 2 && value.every(Number.isFinite) && Math.abs(value[1]) <= 90;\n\n// MapLibre throws on a bad position only after the map exists, which leaked\n// the map and stopped every later element in the same init(). A value that\n// is not \"lng,lat\", such as Google's lat,lng order past 90, is skipped.\nconst lngLat = (el: HTMLElement): LngLat | null => {\n // Number('') is 0, so an empty part (\"12.5,\") becomes NaN and fails.\n const value = el.dataset.lngLat.split(',').map((part) => (part.trim() ? Number(part) : NaN));\n if (isLngLat(value)) return value;\n console.warn(`MapView skipped data-lng-lat=\"${el.dataset.lngLat}\": expected \"longitude,latitude\".`, el);\n return null;\n};\n\n/** The elements with a usable `data-lng-lat`, each paired with its position. */\nconst positioned = (elements: HTMLElement[]) =>\n elements.map((el) => [el, lngLat(el)] as const).filter((pair): pair is readonly [HTMLElement, LngLat] => pair[1] !== null);\n\n// A quadratic B\u00E9zier from `from` to `to`, bowed north of an eastward line.\n// ponytail: drawn in degrees, so an arc across the antimeridian goes the long\n// way round; split it at \u00B1180 if that matters.\nfunction arc([x0, y0]: LngLat, [x2, y2]: LngLat, steps = 32): LngLat[] {\n const bow = x2 >= x0 ? 0.25 : -0.25;\n const x1 = (x0 + x2) / 2 - (y2 - y0) * bow;\n const y1 = (y0 + y2) / 2 + (x2 - x0) * bow;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps, u = 1 - t;\n return [u * u * x0 + 2 * u * t * x1 + t * t * x2, u * u * y0 + 2 * u * t * y1 + t * t * y2];\n });\n}\n\n// How far each arrow key nudges a focused draggable marker, in steps.\nconst ARROWS: Record<string, [number, number]> = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, -1], ArrowDown: [0, 1] };\nconst plainArrow = (e: KeyboardEvent) => (Utils.plainKey(e) ? ARROWS[e.key] : undefined);\n\n/**\n * An interactive map built on MapLibre: a `.map` holding `.map-marker`,\n * `.map-popup` and `.map-controls` children.\n *\n * Each marker sits at its `data-lng-lat`. A marker button with\n * `aria-controls` opens the `.map-popup` it names; a popup with its own\n * `data-lng-lat` and no marker opens at init. Buttons in `.map-controls`\n * run their `data-action`: `zoom-in`, `zoom-out`, `compass`, `locate`,\n * `fullscreen` or `pan-up`, `pan-down`, `pan-left` and `pan-right`. A\n * `data-draggable` marker moves without a drag too: a tap picks it up and\n * the next tap on the map drops it, and the arrow keys nudge it. Routes, arcs and clusters are data, so they are added from\n * script. The default style follows the page's light or dark theme, and\n * line and cluster colors come from the theme.\n *\n * The class is `MapView` rather than `Map` so importing it does not shadow\n * JavaScript's `Map`.\n */\nexport class MapView<L extends MapLibre = MapLibre> extends Component<MapViewOptions<L>> {\n /**\n * The MapLibre map, with the full type of the `maplibregl` passed to the\n * constructor; `init()` and `getInstance()` see the `MapInstance` subset.\n */\n map: InstanceType<L['Map']> | null = null;\n /** The MapLibre markers made from `.map-marker` children, in order. */\n markers: MapMarker[] = [];\n private _children: Element[] = [];\n private _popups: MapPopup[] = [];\n private _markerPopups = new Map<HTMLElement, MapPopup>();\n private _overlays = new Map<string, Overlay>();\n private _styleReady = false;\n private _dark = false;\n private _location: MapMarker | null = null;\n private _observer: MutationObserver | null = null;\n // Looked up once: `move` fires every frame of a pan or zoom.\n private _zoomIn: HTMLButtonElement[] = [];\n private _zoomOut: HTMLButtonElement[] = [];\n // The draggable marker a tap picked up, waiting for the tap that drops it.\n private _picked: HTMLElement | null = null;\n // The marker whose drag just ended, so the click that follows does not pick it up.\n private _dragged: HTMLElement | null = null;\n // Undoes what the map added to the page's markup, for destroy().\n private _restore: (() => void)[] = [];\n private _actions: Record<string, (button: HTMLButtonElement) => void> = {\n 'zoom-in': () => this.map.zoomIn(),\n 'zoom-out': () => this.map.zoomOut(),\n compass: () => this.map.resetNorthPitch(),\n locate: (button) => this._locate(button),\n fullscreen: () => this._toggleFullscreen(),\n 'pan-up': () => this._pan(0, -1),\n 'pan-down': () => this._pan(0, 1),\n 'pan-left': () => this._pan(-1, 0),\n 'pan-right': () => this._pan(1, 0)\n };\n\n /** Initializes a map, typed by the `maplibregl` passed in. */\n static init<L extends MapLibre>(this: typeof MapView, el: HTMLElement, options?: Partial<MapViewOptions<L>>): MapView<L>;\n /** Initializes a map on each element, typed by the `maplibregl` passed in. */\n static init<L extends MapLibre>(this: typeof MapView, els: InitElements<InitElement>, options?: Partial<MapViewOptions<L>>): MapView<L>[];\n static init(els: HTMLElement | InitElements<InitElement>, options: Partial<MapViewOptions> = {}): MapView | MapView[] {\n return super.init.call(this, els as InitElements<InitElement>, options);\n }\n\n constructor(el: HTMLElement, options: Partial<MapViewOptions<L>>) {\n super(el, options);\n const lib = this.options.maplibregl;\n if (!lib) {\n console.error('MapView needs the maplibre-gl module in options.maplibregl.');\n return;\n }\n\n this._children = [...el.children];\n this._zoomIn = [...this._buttons('zoom-in')];\n this._zoomOut = [...this._buttons('zoom-out')];\n this._dark = this._isDark();\n const init = {\n ...this.options.mapOptions,\n container: el,\n style: this._style(),\n center: this.options.center,\n zoom: this.options.zoom\n };\n // `new` on a generic constructor yields the constraint, not L's instance.\n this.map = new lib.Map(init) as InstanceType<L['Map']>;\n this.map.on('style.load', this._handleStyleLoad);\n this.map.on('move', this._sync);\n this.map.on('click', this._handleMapClick);\n\n const children = this._children.filter((child): child is HTMLElement => child instanceof HTMLElement);\n const claimed = new Set<Element>();\n for (const [marker, at] of positioned(children.filter((child) => child.matches('.map-marker[data-lng-lat]')))) {\n const target = marker.hasAttribute('aria-controls') ? Utils.getElementById(marker, marker.getAttribute('aria-controls')) : null;\n const popup = target?.parentElement === el && target.matches('.map-popup') ? target : null;\n if (popup) claimed.add(popup);\n this._addMarker(marker, popup, at);\n }\n for (const [popup, at] of positioned(children.filter((child) => child.matches('.map-popup[data-lng-lat]') && !claimed.has(child)))) {\n this._popup(popup, 0).setLngLat(at).addTo(this.map);\n }\n\n const { signal } = this._events;\n if (this._themed()) {\n matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this._handleScheme, { signal });\n this._observer = new MutationObserver(this._handleScheme);\n this._observer.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n }\n for (const button of this._buttons('fullscreen')) button.hidden = !document.fullscreenEnabled;\n document.addEventListener('fullscreenchange', this._handleFullscreen, { signal });\n el.addEventListener('click', this._handleClick, { signal });\n el.addEventListener('keydown', this._handleKeydown, { signal });\n this._sync();\n }\n\n static get defaults(): MapViewOptions {\n return _defaults;\n }\n\n static key = 'Expressive_MapView';\n\n destroy() {\n super.destroy();\n if (!this.map) return;\n this._releaseMarkers();\n this._observer?.disconnect();\n for (const overlay of this._overlays.values()) overlay.off?.();\n for (const popup of this._popups) popup.remove();\n for (const marker of this.markers) {\n marker.remove();\n const element: HTMLElement = marker.getElement();\n element.classList.remove(...[...element.classList].filter((name) => name.startsWith('maplibregl-')));\n element.style.removeProperty('transform');\n element.style.removeProperty('opacity');\n if (element.hasAttribute('aria-controls')) element.removeAttribute('aria-expanded');\n }\n this._location?.remove();\n this._location = null;\n this.map.remove();\n this.map = null;\n this.markers = [];\n this._popups = [];\n this._markerPopups.clear();\n this._overlays.clear();\n this.el.style.removeProperty('--md-comp-map-bearing');\n for (const button of this.el.querySelectorAll<HTMLButtonElement>('.map-controls [data-action]')) {\n button.disabled = false;\n button.hidden = false;\n button.removeAttribute('aria-pressed');\n }\n this.el.append(...this._children);\n }\n\n /** Draws a line through `[longitude, latitude]` points. Replaces an overlay with the same id. */\n addRoute(id: string, coordinates: LngLat[], options: MapLineOptions = {}) {\n this._line(id, { type: 'LineString', coordinates }, 'route', { width: 4, ...options });\n }\n\n /** Draws a curved line for each `{ from, to }`. Replaces an overlay with the same id. */\n addArcs(id: string, arcs: MapArc[], options: MapLineOptions = {}) {\n this._line(id, { type: 'MultiLineString', coordinates: arcs.map(({ from, to }) => arc(from, to)) }, 'arc', { width: 2, ...options });\n }\n\n /**\n * Draws GeoJSON points, or the URL of a GeoJSON file, as clusters that\n * show their count and zoom in when clicked. The layers are\n * `${id}-clusters`, `${id}-count` and `${id}-points`.\n */\n addClusters(id: string, data: object | string, options: MapClusterOptions = {}) {\n const clusters = `${id}-clusters`, points = `${id}-points`;\n const zoomIn = async (e: MapMouseEvent) => {\n const [feature] = e.features;\n // `_draw` registered this id as a clustered GeoJSON source.\n const source = this.map.getSource(id) as MapClusterSource;\n // The data may have changed since the click, leaving no such cluster.\n const zoom = await source.getClusterExpansionZoom(feature.properties.cluster_id).catch((): null => null);\n // destroy() may have run while the zoom was looked up.\n if (zoom !== null) this.map?.easeTo({ center: feature.geometry.coordinates, zoom });\n };\n const pointer = () => { this.map.getCanvas().style.cursor = 'pointer'; };\n const reset = () => { this.map.getCanvas().style.cursor = ''; };\n const listen = (method: 'on' | 'off') => {\n this.map[method]('click', clusters, zoomIn);\n for (const layer of [clusters, points]) {\n this.map[method]('mouseenter', layer, pointer);\n this.map[method]('mouseleave', layer, reset);\n }\n };\n this._draw(id, {\n draw: () => {\n const color = options.color ?? this._color('var(--md-comp-map-cluster-color)');\n const surface = this._color('var(--md-comp-map-marker-ring-color)');\n this.map.addSource(id, {\n type: 'geojson',\n data,\n cluster: true,\n clusterRadius: options.radius ?? 50,\n clusterMaxZoom: options.maxZoom ?? 14\n });\n this.map.addLayer({\n id: clusters,\n type: 'circle',\n source: id,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': color,\n 'circle-radius': ['step', ['get', 'point_count'], 16, 10, 20, 100, 26],\n 'circle-stroke-width': 6,\n 'circle-stroke-color': color,\n 'circle-stroke-opacity': 0.3\n }\n });\n // A symbol layer needs the style's glyphs and one of its fonts.\n const style = this.map.getStyle();\n const font = style.glyphs && style.layers.find((layer) => layer.layout?.['text-font'])?.layout['text-font'];\n if (font) {\n this.map.addLayer({\n id: `${id}-count`,\n type: 'symbol',\n source: id,\n filter: ['has', 'point_count'],\n layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-font': font, 'text-size': 12 },\n paint: { 'text-color': this._color('var(--md-comp-map-cluster-label-color)') }\n });\n }\n this.map.addLayer({\n id: points,\n type: 'circle',\n source: id,\n filter: ['!', ['has', 'point_count']],\n paint: { 'circle-color': color, 'circle-radius': 6, 'circle-stroke-width': 2, 'circle-stroke-color': surface }\n });\n },\n off: () => listen('off')\n });\n listen('on');\n }\n\n /** Removes a route, arcs or clusters added with this id. */\n removeOverlay(id: string) {\n const overlay = this._overlays.get(id);\n if (!overlay) return;\n this._overlays.delete(id);\n overlay.off?.();\n if (!this._styleReady || !this.map.getSource(id)) return;\n for (const layer of this.map.getStyle().layers) if (layer.source === id) this.map.removeLayer(layer.id);\n this.map.removeSource(id);\n }\n\n private _line(id: string, geometry: object, token: string, options: MapLineOptions) {\n this._draw(id, {\n draw: () => {\n this.map.addSource(id, { type: 'geojson', data: { type: 'Feature', properties: {}, geometry } });\n this.map.addLayer({\n id,\n type: 'line',\n source: id,\n layout: { 'line-cap': 'round', 'line-join': 'round' },\n paint: {\n 'line-color': options.color ?? this._color(`var(--md-comp-map-${token}-color)`),\n 'line-width': options.width,\n 'line-opacity': options.opacity ?? 1,\n ...(options.dashArray && { 'line-dasharray': options.dashArray })\n }\n });\n }\n });\n }\n\n // Sources and layers go with the style, so every overlay is drawn again\n // when a theme change swaps it.\n private _draw(id: string, overlay: Overlay) {\n this.removeOverlay(id);\n this._overlays.set(id, overlay);\n if (this._styleReady) overlay.draw();\n }\n\n private _addMarker(element: HTMLElement, content: HTMLElement | null, at: LngLat) {\n const marker = new this.options.maplibregl.Marker({\n element,\n draggable: element.hasAttribute('data-draggable')\n }).setLngLat(at).addTo(this.map);\n marker.on('dragend', () => this._moved(marker));\n if (element.hasAttribute('data-draggable')) this._makeMovable(element, marker);\n this.markers.push(marker);\n if (!content) return;\n element.setAttribute('aria-expanded', 'false');\n const popup = this._popup(content, 16);\n popup.on('open', () => element.setAttribute('aria-expanded', 'true'));\n popup.on('close', () => {\n element.setAttribute('aria-expanded', 'false');\n if (!document.activeElement || document.activeElement === document.body) element.focus();\n });\n this._markerPopups.set(element, popup);\n }\n\n /** A marker moved: its `data-lng-lat` holds the new place, and it fires `change`. */\n private _moved(marker: MapMarker) {\n const element: HTMLElement = marker.getElement();\n const { lng, lat } = marker.getLngLat();\n element.dataset.lngLat = `${lng},${lat}`;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n // A drag is not the only way to move it (WCAG 2.5.7): a tap picks it up,\n // and the arrow keys nudge it. A button is already a control; anything\n // else becomes one, and destroy() takes that back off.\n private _makeMovable(element: HTMLElement, marker: MapMarker) {\n const added = element instanceof HTMLButtonElement ? [] : ['role', 'tabindex'].filter((name) => !element.hasAttribute(name));\n if (added.includes('role')) element.setAttribute('role', 'button');\n if (added.includes('tabindex')) element.tabIndex = 0;\n element.setAttribute('aria-pressed', 'false');\n this._restore.push(() => ['aria-pressed', ...added].forEach((name) => element.removeAttribute(name)));\n element.addEventListener('keydown', (e) => this._nudge(e, marker), { signal: this._events.signal });\n marker.on('dragstart', () => (this._dragged = element));\n marker.on('dragend', () => setTimeout(() => { this._dragged = null; }));\n }\n\n /** Takes back the attributes `_makeMovable()` added. Destroy removes its listeners. */\n private _releaseMarkers() {\n this._restore.splice(0).forEach((undo) => undo());\n this._picked = null;\n }\n\n /** The arrow keys move a focused draggable marker 10px, and the map stays put. */\n private _nudge(e: KeyboardEvent, marker: MapMarker) {\n const step = plainArrow(e);\n if (!step) return;\n e.preventDefault();\n e.stopPropagation();\n const at = this.map.project(marker.getLngLat());\n marker.setLngLat(this.map.unproject([at.x + step[0] * 10, at.y + step[1] * 10]));\n this._moved(marker);\n }\n\n /** Picks a marker up, or puts down the one already picked up. */\n private _pick(element: HTMLElement | null) {\n this._picked?.setAttribute('aria-pressed', 'false');\n this._picked = element;\n element?.setAttribute('aria-pressed', 'true');\n }\n\n // A tap on a draggable marker picks it up, or puts it back down; the click\n // that ends a drag does neither.\n private _tapMarker(element: HTMLElement | null) {\n // aria-pressed: one skipped for a bad data-lng-lat is no marker to pick up.\n if (element?.matches('[data-draggable][aria-pressed]')) this._tapMovable(element);\n else if (this._markerPopups.has(element)) this._toggle(element);\n }\n\n private _tapMovable(element: HTMLElement) {\n if (this._dragged !== element) this._pick(this._picked === element ? null : element);\n }\n\n /** A third of the map's width or height in a direction. */\n private _pan(x: number, y: number) {\n const { width, height } = this.el.getBoundingClientRect();\n this.map.panBy([(x * width) / 3, (y * height) / 3]);\n }\n\n // Either can be refused (an iframe without allowfullscreen, say). The\n // button state follows fullscreenchange, so there is nothing to undo.\n private _toggleFullscreen() {\n const request = document.fullscreenElement === this.el ? document.exitFullscreen() : this.el.requestFullscreen();\n request.catch(() => {});\n }\n\n private _popup(content: HTMLElement, offset: number) {\n const popup = new this.options.maplibregl.Popup({ closeOnClick: false, maxWidth: 'none', offset }).setDOMContent(content);\n this._popups.push(popup);\n return popup;\n }\n\n private _toggle(marker: HTMLElement) {\n const popup = this._markerPopups.get(marker);\n if (popup.isOpen()) popup.remove();\n else popup.setLngLat(this.markers.find((m) => m.getElement() === marker).getLngLat()).addTo(this.map);\n }\n\n private _buttons(action: string) {\n return this.el.querySelectorAll<HTMLButtonElement>(`.map-controls [data-action=\"${action}\"]`);\n }\n\n private _locate(button: HTMLButtonElement) {\n navigator.geolocation?.getCurrentPosition(\n ({ coords }) => {\n if (!this.map) return;\n const center: LngLat = [coords.longitude, coords.latitude];\n if (!this._location) {\n const dot = document.createElement('span');\n dot.className = 'map-marker location';\n dot.setAttribute('aria-hidden', 'true');\n this._location = new this.options.maplibregl.Marker({ element: dot });\n }\n this._location.setLngLat(center).addTo(this.map);\n this.map.flyTo({ center, zoom: Math.max(this.map.getZoom(), 14) });\n },\n (error) => { if (this.map && error.code === error.PERMISSION_DENIED) button.disabled = true; }\n );\n }\n\n // Resolves a CSS color where the map is, so light-dark() and scoped\n // themes apply, then paints it on a canvas to read back the sRGB value.\n // MapLibre does not parse the oklch() the theme tokens compute to.\n private _color(value: string) {\n const probe = document.createElement('span');\n probe.hidden = true;\n probe.style.color = value;\n this.el.append(probe);\n const context = document.createElement('canvas').getContext('2d', { willReadFrequently: true });\n context.fillStyle = getComputedStyle(probe).color;\n probe.remove();\n context.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = context.getImageData(0, 0, 1, 1).data;\n return `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 100) / 100})`;\n }\n\n private _isDark() {\n return this._color('light-dark(black, white)') === 'rgba(255, 255, 255, 1)';\n }\n\n private _themed(style: MapViewOptions['style'] = this.options.style): style is MapThemedStyle {\n return typeof style === 'object' && 'light' in style && 'dark' in style;\n }\n\n private _style() {\n const style = this.options.style;\n return this._themed(style) ? style[this._dark ? 'dark' : 'light'] : style;\n }\n\n private _handleStyleLoad = () => {\n this._styleReady = true;\n for (const overlay of this._overlays.values()) overlay.draw();\n };\n\n private _handleScheme = () => {\n const dark = this._isDark();\n if (dark === this._dark) return;\n this._dark = dark;\n this._styleReady = false;\n this.map.setStyle(this._style(), { diff: false });\n };\n\n private _sync = () => {\n const zoom = this.map.getZoom();\n for (const button of this._zoomIn) button.disabled = zoom >= this.map.getMaxZoom();\n for (const button of this._zoomOut) button.disabled = zoom <= this.map.getMinZoom();\n this.el.style.setProperty('--md-comp-map-bearing', `${-this.map.getBearing()}deg`);\n };\n\n private _handleFullscreen = () => {\n for (const button of this._buttons('fullscreen')) {\n button.setAttribute('aria-pressed', String(document.fullscreenElement === this.el));\n }\n };\n\n private _handleClick = (e: MouseEvent) => {\n const target = e.target as Element;\n const button = target.closest<HTMLButtonElement>('.map-controls [data-action]');\n if (button) this._actions[button.dataset.action]?.(button);\n else this._tapMarker(target.closest<HTMLElement>('.map-marker'));\n };\n\n // A click on the map closes marker popups, but not the one being toggled.\n private _handleMapClick = (e: MapMouseEvent) => {\n const target = e.originalEvent.target as Node;\n this._drop(target, e.lngLat);\n for (const [marker, popup] of this._markerPopups) {\n if (!marker.contains(target) && !popup.getElement()?.contains(target)) popup.remove();\n }\n };\n\n // A tap on the map, not on a marker, puts a picked-up marker there.\n private _drop(target: Node, at: MapLngLat) {\n if (!this._picked || (target as Element).closest?.('.map-marker')) return;\n const marker = this.markers.find((m) => m.getElement() === this._picked);\n marker.setLngLat(at);\n this._moved(marker);\n this._pick(null);\n }\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this._escape(e);\n };\n\n // Escape puts down a picked-up marker first, then closes a popup.\n private _escape(e: KeyboardEvent) {\n if (this._picked) {\n e.preventDefault();\n this._pick(null);\n return;\n }\n for (const popup of this._popups) {\n if (popup.getElement()?.contains(e.target as Node)) {\n e.preventDefault();\n popup.remove();\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
  import {
5
5
  Utils,
6
6
  restoreAttribute
7
- } from "./chunk-ZVLOUDIJ.mjs";
7
+ } from "./chunk-67UNY7RH.mjs";
8
8
 
9
9
  // src/ts/components/tooltip.ts
10
10
  var anchorSupported = typeof CSS !== "undefined" && !!CSS.supports?.("anchor-name: --a");
@@ -40,7 +40,7 @@ var _defaults = {
40
40
  opacity: 1,
41
41
  openOnClick: false
42
42
  };
43
- var _Tooltip = class _Tooltip extends Component {
43
+ var Tooltip = class extends Component {
44
44
  constructor(el, options) {
45
45
  super(el, options);
46
46
  /** The last click on the trigger or inside the tooltip, which the document listener leaves alone. */
@@ -177,11 +177,7 @@ var _Tooltip = class _Tooltip extends Component {
177
177
  this.isFocused = false;
178
178
  if (!this.isHovered) this.close();
179
179
  };
180
- this.options = {
181
- ..._Tooltip.defaults,
182
- ...this._getAttributeOptions(),
183
- ...options
184
- };
180
+ this.options = { ...this.options, ...this._getAttributeOptions() };
185
181
  this.isOpen = false;
186
182
  this.isHovered = false;
187
183
  this.isFocused = false;
@@ -436,10 +432,9 @@ var _Tooltip = class _Tooltip extends Component {
436
432
  return attributeOptions;
437
433
  }
438
434
  };
439
- _Tooltip.key = "Expressive_Tooltip";
440
- var Tooltip = _Tooltip;
435
+ Tooltip.key = "Expressive_Tooltip";
441
436
 
442
437
  export {
443
438
  Tooltip
444
439
  };
445
- //# sourceMappingURL=chunk-FCNF4GRJ.mjs.map
440
+ //# sourceMappingURL=chunk-R7A7JRC5.mjs.map