@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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/lightbox.ts"],
4
+ "sourcesContent": ["import { Utils, controllerFor, deepActiveElement, restoreAttribute } from '../core/utils';\nimport { BaseOptions, Component } from '../core/component';\n\nexport interface LightboxOptions extends BaseOptions {\n /**\n * Transition in duration in milliseconds.\n * @default 275\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 200\n */\n outDuration: number;\n /**\n * Callback function called before lightbox is opened.\n * @default null\n */\n onOpenStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is opened.\n * @default null\n */\n onOpenEnd: (el: Element) => void;\n /**\n * Callback function called before lightbox is closed.\n * @default null\n */\n onCloseStart: (el: Element) => void;\n /**\n * Callback function called after lightbox is closed.\n * @default null\n */\n onCloseEnd: (el: Element) => void;\n}\n\nconst _defaults: LightboxOptions = {\n inDuration: 275,\n outDuration: 200,\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nexport class Lightbox extends Component<LightboxOptions> {\n /** If the lightbox overlay is showing. */\n overlayActive: boolean;\n /** If the lightbox is no longer being animated. */\n doneAnimating: boolean;\n /** Caption, if specified. */\n caption: string;\n /** Original width of image. */\n originalWidth: number;\n /** Original height of image. */\n originalHeight: number;\n private originInlineStyles: string;\n private placeholder: HTMLElement;\n private newHeight: number;\n private newWidth: number;\n private windowWidth: number;\n private windowHeight: number;\n private attrWidth: string;\n private attrHeight: string;\n private _overlay: HTMLElement;\n private _photoCaption: HTMLElement;\n private _trigger: HTMLElement;\n private _tabindex: string | null;\n private _timers = new Map<ReturnType<typeof setTimeout>, () => void>();\n private _motion = window.matchMedia('(prefers-reduced-motion: reduce)');\n private _isOpen = false;\n private _destroyed = false;\n /** Removes the listeners that close an open lightbox. */\n private _windowEvents: AbortController | undefined;\n private _revision = 0;\n // Counts opens and closes only. _revision also moves when reduced motion\n // flushes a transition, which must still report its end.\n private _phase = 0;\n\n constructor(el: HTMLElement, options: Partial<LightboxOptions>) {\n super(el, options);\n\n this.overlayActive = false;\n this.doneAnimating = true;\n this.placeholder = document.createElement('div');\n this.placeholder.classList.add('material-placeholder');\n this.originalWidth = 0;\n this.originalHeight = 0;\n this.originInlineStyles = this.el.getAttribute('style');\n this.caption = this.el.getAttribute('data-caption') || '';\n this._tabindex = this.el.getAttribute('tabindex');\n this._trigger = this.el.closest('button') ?? this.el;\n this.el.tabIndex = this._trigger === this.el ? 0 : -1;\n // Wrap\n this.el.before(this.placeholder);\n this.placeholder.append(this.el);\n this._setupEventHandlers();\n }\n\n static get defaults(): LightboxOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Lightbox';\n\n destroy() {\n if (this._destroyed) return;\n this._destroyed = true;\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement === this.el;\n this._cancel();\n this._reset();\n this.placeholder.replaceWith(this.el);\n if (focused) this._restoreFocus();\n restoreAttribute(this.el, 'tabindex', this._tabindex);\n super.destroy();\n }\n\n // Back to the trigger when focus fell to the body (or the shadow host), as\n // a click on the overlay, which cannot take focus, leaves it.\n private _restoreFocus() {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n const active = deepActiveElement(document);\n if ([document.body, (root as ShadowRoot).host].includes(active)) this._trigger.focus({ preventScroll: true });\n }\n\n private _reset() {\n this._windowEvents?.abort();\n // Removing a popover, or its attribute, takes it out of the top layer.\n this._overlay?.remove();\n this._photoCaption?.remove();\n this.el.removeAttribute('popover');\n if (this.attrWidth != null) this.el.setAttribute('width', this.attrWidth);\n if (this.attrHeight != null) this.el.setAttribute('height', this.attrHeight);\n this.el.classList.remove('active');\n this.placeholder.removeAttribute('style');\n restoreAttribute(this.el, 'style', this.originInlineStyles);\n this.overlayActive = false;\n this._isOpen = false;\n this.doneAnimating = true;\n }\n\n private _cancel() {\n for (const timer of this._timers.keys()) clearTimeout(timer);\n this._timers.clear();\n return ++this._revision;\n }\n\n private _schedule(callback: () => void, delay: number) {\n if (this._motion.matches) { callback(); return; }\n const timer = setTimeout(() => { this._timers.delete(timer); callback(); }, delay);\n this._timers.set(timer, callback);\n }\n\n private _handleMotionChange = () => {\n if (!this._motion.matches) return;\n const callbacks = [...this._timers.values()];\n const revision = this._cancel();\n for (const callback of callbacks) {\n if (revision !== this._revision) break;\n callback();\n }\n if (this.overlayActive) {\n for (const el of [this.el, this._overlay, this._photoCaption]) if (el) el.style.transition = 'none';\n }\n };\n\n private _setupEventHandlers() {\n const { signal } = this._events;\n this._motion.addEventListener('change', this._handleMotionChange, { signal });\n this._trigger.addEventListener('click', this._handleLightboxToggle, { signal });\n this.el.addEventListener('keydown', this._handleLightboxKeypress, { signal });\n }\n\n private _handleLightboxKeypress = (e: KeyboardEvent) => {\n if (this._trigger === this.el && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n this._handleLightboxToggle();\n }\n };\n\n private _handleLightboxToggle = () => {\n // If already modal, return to original\n if (this._isOpen) this.close();\n else this.open();\n };\n\n private _handleWindowChange = () => {\n if (this.overlayActive) this.close();\n };\n\n // On keydown, and taken, so a dialog around the lightbox does not close on\n // the same press.\n private _handleWindowEscape = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n e.preventDefault();\n this.close();\n };\n\n // The image zooms in place, not in a modal, so Tab would reach the page\n // behind the overlay. Tab closes it instead, then moves focus as usual.\n private _handleWindowTab = (e: KeyboardEvent) => {\n if (e.key === 'Tab') this.close();\n };\n\n /**\n * Shows `el` as a manual popover, so it is in the top layer: no ancestor\n * clips or covers it, and it stacks above what was shown before it.\n */\n private _showOnTop(el: HTMLElement) {\n el.setAttribute('popover', 'manual');\n el.showPopover();\n }\n\n /** The placeholder's document position, where the image rests. */\n private _restingPlace() {\n const box = this.placeholder.getBoundingClientRect();\n return { left: box.left + window.scrollX + 'px', top: box.top + window.scrollY + 'px' };\n }\n\n private _updateVars(): void {\n this.windowWidth = window.innerWidth;\n this.windowHeight = window.innerHeight;\n this.caption = this.el.getAttribute('data-caption') || '';\n }\n\n // Image\n private _animateImageIn(): void {\n const phase = this._phase;\n this.el.style.maxHeight = this.newHeight.toString() + 'px';\n this.el.style.maxWidth = this.newWidth.toString() + 'px';\n const duration = this._motion.matches ? 0 : this.options.inDuration;\n // from\n this.el.style.transition = 'none';\n this.el.style.height = this.originalHeight + 'px';\n this.el.style.width = this.originalWidth + 'px';\n this._schedule(() => {\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.newHeight + 'px';\n this.el.style.width = this.newWidth + 'px';\n this.el.style.left = window.scrollX + (this.windowWidth - this.newWidth) / 2 + 'px';\n this.el.style.top = window.scrollY + (this.windowHeight - this.newHeight) / 2 + 'px';\n }, 1);\n\n this._schedule(() => {\n this.doneAnimating = true;\n this._notify('opened', this.options.onOpenEnd, { current: () => phase === this._phase });\n }, duration);\n\n }\n private _animateImageOut(): void {\n const phase = this._phase;\n const duration = this._motion.matches ? 0 : this.options.outDuration;\n // easeOutQuad\n this.el.style.transition = `height ${duration}ms ease,\n width ${duration}ms ease,\n left ${duration}ms ease,\n top ${duration}ms ease\n `;\n // to\n this.el.style.height = this.originalHeight + 'px'; // was originalWidth\n this.el.style.width = this.originalWidth + 'px';\n Object.assign(this.el.style, this._restingPlace());\n this._schedule(() => {\n this._reset();\n // onCloseEnd callback\n this._notify('closed', this.options.onCloseEnd, { current: () => phase === this._phase });\n }, duration);\n }\n\n // Caption\n private _addCaption(): void {\n this._photoCaption = document.createElement('div');\n this._photoCaption.classList.add('lightbox-caption');\n this._photoCaption.innerText = this.caption;\n Utils.portalRoot(this.el).append(this._photoCaption);\n this._photoCaption.style.display = 'inline';\n this._showOnTop(this._photoCaption);\n this._fadeIn(this._photoCaption);\n }\n\n // Overlay\n private _addOverlay(): void {\n this._overlay = document.createElement('div');\n this._overlay.id = 'lightbox-overlay';\n this._overlay.addEventListener(\n 'click',\n (event) => {\n event.stopPropagation();\n this.close();\n },\n { once: true }\n );\n\n this.el.before(this._overlay);\n this._showOnTop(this._overlay);\n this._fadeIn(this._overlay);\n }\n\n private _fadeIn(el: HTMLElement): void {\n el.style.transition = 'none';\n el.style.opacity = '0';\n const duration = this._motion.matches ? 0 : this.options.inDuration;\n this._schedule(() => {\n el.style.transition = `opacity ${duration}ms ease`;\n el.style.opacity = '1';\n }, 1);\n }\n\n private _fadeOut(el: HTMLElement): void {\n const duration = this._motion.matches ? 0 : this.options.outDuration;\n el.style.transition = `opacity ${duration}ms ease`;\n el.style.opacity = '0';\n }\n\n /**\n * Open lightbox.\n */\n open = () => {\n if (this._destroyed || this._isOpen) return;\n this._phase++;\n const revision = this._cancel();\n if (this.overlayActive) this._reset();\n this._updateVars();\n // Both rects are read up front: measuring the placeholder after writing\n // its width forced a second layout for the height.\n const originRect = this.el.getBoundingClientRect();\n const placeholderRect = this.placeholder.getBoundingClientRect();\n // An image not yet loaded, or hidden, has no size to zoom from; the\n // ratios below would be 0 / 0.\n if (!originRect.width || !originRect.height) return;\n this._isOpen = true;\n this.originalWidth = originRect.width;\n this.originalHeight = originRect.height;\n // Set states\n this.doneAnimating = false;\n this.el.classList.add('active');\n this.overlayActive = true;\n // onOpenStart callback\n if (!this._notify('open', this.options.onOpenStart, { current: () => revision === this._revision })) return;\n // Set positioning for placeholder\n this.placeholder.style.width = placeholderRect.width + 'px';\n this.placeholder.style.height = placeholderRect.height + 'px';\n // In the top layer the image is positioned in the document, starting\n // where the placeholder holds its place.\n this.el.style.position = 'absolute';\n this.el.style.inset = 'auto';\n this.el.style.left = placeholderRect.left + window.scrollX + 'px';\n this.el.style.top = placeholderRect.top + window.scrollY + 'px';\n this.el.style.willChange = 'left, top, width, height';\n // Change from width or height attribute to css\n this.attrWidth = this.el.getAttribute('width');\n this.attrHeight = this.el.getAttribute('height');\n if (this.attrWidth) {\n this.el.style.width = this.attrWidth + 'px';\n this.el.removeAttribute('width');\n }\n if (this.attrHeight) {\n this.el.style.height = this.attrHeight + 'px'; // was width, from the height attribute\n this.el.removeAttribute('height');\n }\n // The overlay, the image and the caption go into the top layer in that\n // order, so each stacks above the one before.\n this._addOverlay();\n this._showOnTop(this.el);\n if (this.caption !== '') this._addCaption();\n // Resize Image\n const widthPercent = this.originalWidth / this.windowWidth;\n const heightPercent = this.originalHeight / this.windowHeight;\n if (widthPercent > heightPercent) {\n // Width first\n const ratio = this.originalHeight / this.originalWidth;\n this.newWidth = this.windowWidth * 0.9;\n this.newHeight = this.windowWidth * 0.9 * ratio;\n } else {\n // Height first\n const ratio = this.originalWidth / this.originalHeight;\n this.newWidth = this.windowHeight * 0.9 * ratio;\n this.newHeight = this.windowHeight * 0.9;\n }\n // Handle Exit triggers\n this._windowEvents?.abort();\n this._windowEvents = controllerFor(this.el);\n const { signal } = this._windowEvents;\n window.addEventListener('scroll', this._handleWindowChange, { passive: true, signal });\n window.addEventListener('resize', this._handleWindowChange, { passive: true, signal });\n window.addEventListener('keydown', this._handleWindowEscape, { signal });\n window.addEventListener('keydown', this._handleWindowTab, { signal });\n this._animateImageIn();\n };\n\n /**\n * Close lightbox.\n */\n close = () => {\n if (this._destroyed || !this._isOpen) return;\n this._phase++;\n const revision = this._cancel();\n this._isOpen = false;\n this.doneAnimating = false;\n // onCloseStart callback\n if (!this._notify('close', this.options.onCloseStart, { current: () => revision === this._revision })) return;\n // disable exit handlers\n this._windowEvents?.abort();\n this._restoreFocus();\n if (this._overlay) this._fadeOut(this._overlay);\n if (this._photoCaption) this._fadeOut(this._photoCaption);\n this._animateImageOut();\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,11 +1,15 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
+ import {
5
+ afterFormReset
6
+ } from "./chunk-67UNY7RH.mjs";
4
7
 
5
8
  // src/ts/components/inputMask.ts
6
9
  var _defaults = Object.freeze({});
7
10
  var SLOTS = { "0": /[0-9]/, a: /\p{L}/u, "*": /[0-9\p{L}]/u };
8
11
  var DELETES = { deleteContentBackward: -1, deleteContentForward: 1 };
12
+ var deleteStep = (e) => e.isComposing || !e.cancelable ? void 0 : DELETES[e.inputType];
9
13
  var parse = (mask) => (mask.match(/\\[^]|[^]/gu) ?? []).map((part) => SLOTS[part] ? { accepts: SLOTS[part] } : { literal: part.slice(-1) });
10
14
  function landing(tokens, t, ch) {
11
15
  if (tokens[t]?.literal === ch) return t;
@@ -60,18 +64,12 @@ var InputMask = class extends Component {
60
64
  * across the literal instead.
61
65
  */
62
66
  this._onBeforeInput = (e) => {
63
- const step = DELETES[e.inputType];
67
+ const step = deleteStep(e);
64
68
  const index = step && this.el.selectionStart === this.el.selectionEnd ? this._acrossLiteral(step) : -1;
65
69
  if (index < 0) return;
66
70
  e.preventDefault();
67
71
  this._remove(index, e.inputType);
68
72
  };
69
- this._onReset = (e) => {
70
- if (e.target === this.el.form) setTimeout(this._afterReset);
71
- };
72
- this._afterReset = () => {
73
- if (!this._events.signal.aborted) this._rewrite();
74
- };
75
73
  this._format = () => {
76
74
  const caret = this._rewrite();
77
75
  if (caret !== null && this.el.ownerDocument.activeElement === this.el) this.el.setSelectionRange(caret, caret);
@@ -82,7 +80,7 @@ var InputMask = class extends Component {
82
80
  el.addEventListener("input", this._onInput, { capture: true, signal });
83
81
  el.addEventListener("compositionend", this._format, { signal });
84
82
  el.addEventListener("beforeinput", this._onBeforeInput, { signal });
85
- el.ownerDocument.addEventListener("reset", this._onReset, { capture: true, signal });
83
+ afterFormReset(el, () => this._rewrite(), signal);
86
84
  this._rewrite();
87
85
  }
88
86
  static get defaults() {
@@ -120,4 +118,4 @@ InputMask.key = "Expressive_InputMask";
120
118
  export {
121
119
  InputMask
122
120
  };
123
- //# sourceMappingURL=chunk-VJVQIXHC.mjs.map
121
+ //# sourceMappingURL=chunk-MDBZAMIV.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/inputMask.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { afterFormReset } from '../core/utils';\n\nconst _defaults = Object.freeze({});\n\n/** A mask position: a slot that takes the characters `accepts` matches, or a literal the mask writes itself. */\ntype Token = { accepts: RegExp } | { literal: string };\n\n/** What each slot character in a mask accepts. */\nconst SLOTS: Record<string, RegExp> = { '0': /[0-9]/, a: /\\p{L}/u, '*': /[0-9\\p{L}]/u };\n\n/** Which way a one-character delete from a collapsed caret goes. */\nconst DELETES: Record<string, number> = { deleteContentBackward: -1, deleteContentForward: 1 };\n/** How a delete moves, unless it is the IME's or cannot be taken over. */\nconst deleteStep = (e: InputEvent) => (e.isComposing || !e.cancelable ? undefined : DELETES[e.inputType]);\n\n/** Splits a mask into tokens. A backslash makes the character after it a literal. */\nconst parse = (mask: string): Token[] =>\n (mask.match(/\\\\[^]|[^]/gu) ?? []).map((part) => (SLOTS[part] ? { accepts: SLOTS[part] } : { literal: part.slice(-1) }));\n\n/**\n * The token `ch` lands on from token `t`: the literal at `t` when `ch` is that\n * literal, otherwise the next slot. Only the literal at `t` counts, so a\n * digit is not taken for a literal further on, such as the 1 in `+1 (000)`.\n */\nfunction landing(tokens: Token[], t: number, ch: string) {\n if ((tokens[t] as { literal?: string })?.literal === ch) return t;\n const slot = tokens.findIndex((token, i) => i >= t && 'accepts' in token);\n return slot < 0 ? tokens.length : slot;\n}\n\n/** Feeds `ch` to the mask at token `t`, keeping it in `chars` if a slot takes it. Returns the next token. */\nfunction place(tokens: Token[], t: number, ch: string, chars: string[]) {\n const at = landing(tokens, t, ch);\n const token = tokens[at];\n if (!token) return t;\n if ('literal' in token) return at + 1;\n if (!token.accepts.test(ch)) return t;\n chars.push(ch);\n return at + 1;\n}\n\n/**\n * The slot characters in `value`, in order, and how many of them come before\n * `caret`. Characters are normalized first, so full-width digits from an IME\n * fill digit slots. A character that neither fits a slot nor matches the next\n * literal is dropped, and so is any past the last slot.\n */\nfunction read(tokens: Token[], value: string, caret: number) {\n const chars: string[] = [];\n let t = 0;\n let at = 0;\n let before = 0;\n for (const typed of value) {\n for (const ch of typed.normalize('NFKC')) t = place(tokens, t, ch, chars);\n at += typed.length;\n if (at <= caret) before = chars.length;\n }\n return { chars, before };\n}\n\n/**\n * Writes `chars` into the mask's slots, with the literals that come before\n * each filled slot and none after the last. Returns the text and the index\n * just after each slot character.\n */\nfunction write(tokens: Token[], chars: string[]) {\n let text = '';\n let pending = '';\n const ends: number[] = [];\n for (const token of tokens) {\n if (ends.length === chars.length) break;\n if ('literal' in token) pending += token.literal;\n else {\n text += pending + chars[ends.length];\n pending = '';\n ends.push(text.length);\n }\n }\n return { text, ends };\n}\n\n/**\n * Input mask. Formats a text field's value to the pattern in its `data-mask`\n * attribute as people type, paste or compose: `0` takes a digit, `a` a\n * letter, `*` either, and every other character is a literal the mask writes\n * itself. The form submits the value as the field shows it.\n */\nexport class InputMask extends Component<BaseOptions> {\n declare el: HTMLInputElement;\n static key = 'Expressive_InputMask';\n private _tokens: Token[];\n\n constructor(el: HTMLInputElement, options: Partial<BaseOptions>) {\n super(el, options);\n this._tokens = parse(el.dataset.mask ?? '');\n // A mask with no slot would format every value to nothing, erasing a\n // saved value, so the component leaves such a field alone.\n if (!this._tokens.some((token) => 'accepts' in token)) return;\n const signal = this._events.signal;\n // Capture, which runs before the field's own bubble listeners, so the\n // page's input listeners read the formatted value.\n el.addEventListener('input', this._onInput, { capture: true, signal });\n // An IME writes as it composes; the mask waits until it is done. Engines\n // fire the last input before or after compositionend, and formatting\n // twice changes nothing.\n el.addEventListener('compositionend', this._format, { signal });\n el.addEventListener('beforeinput', this._onBeforeInput, { signal });\n // The mask formats the value a reset restores, in a shadow root too.\n afterFormReset(el, () => this._rewrite(), signal);\n this._rewrite();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n private _onInput = (e: InputEvent) => {\n if (!e.isComposing) this._format();\n };\n\n /**\n * Backspace after a literal, or Delete before one, would remove the\n * literal, which the mask then writes back. It removes the slot character\n * across the literal instead.\n */\n private _onBeforeInput = (e: InputEvent) => {\n const step = deleteStep(e);\n const index = step && this.el.selectionStart === this.el.selectionEnd ? this._acrossLiteral(step) : -1;\n if (index < 0) return;\n e.preventDefault();\n this._remove(index, e.inputType);\n };\n\n /** The index among the slot characters to delete when the character `step` from the caret is a literal, or -1. */\n private _acrossLiteral(step: number) {\n const { selectionStart: caret, value } = this.el;\n const here = read(this._tokens, value, caret);\n const index = here.before + Math.min(step, 0);\n // Stepping over a literal passes no slot character.\n return read(this._tokens, value, caret + step).before === here.before && index in here.chars ? index : -1;\n }\n\n /** Removes slot character `index`, puts the caret where it was, and reports the edit as typing would. */\n private _remove(index: number, inputType: string) {\n const { chars } = read(this._tokens, this.el.value, 0);\n chars.splice(index, 1);\n const { text, ends } = write(this._tokens, chars);\n this.el.value = text;\n const caret = ends[index - 1] ?? 0;\n this.el.setSelectionRange(caret, caret);\n this.el.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType }));\n }\n\n private _format = () => {\n const caret = this._rewrite();\n if (caret !== null && this.el.ownerDocument.activeElement === this.el) this.el.setSelectionRange(caret, caret);\n };\n\n /** Rewrites the value to the mask. Returns where the caret goes, or null when the value already fit. */\n private _rewrite() {\n const el = this.el;\n const { chars, before } = read(this._tokens, el.value, el.selectionEnd ?? el.value.length);\n const { text, ends } = write(this._tokens, chars);\n if (text === el.value) return null;\n el.value = text;\n return ends[before - 1] ?? 0;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Component
3
- } from "./chunk-CMGXGYUC.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
4
 
5
5
  // src/ts/components/loadingOverlay.ts
6
6
  var _defaults = {
@@ -72,4 +72,4 @@ LoadingOverlay.key = "Expressive_LoadingOverlay";
72
72
  export {
73
73
  LoadingOverlay
74
74
  };
75
- //# sourceMappingURL=chunk-4EWGD4V2.mjs.map
75
+ //# sourceMappingURL=chunk-NODZ5VAD.mjs.map
@@ -1,147 +1,150 @@
1
1
  import {
2
2
  SwipeActions
3
- } from "./chunk-Y6H2X7ZC.mjs";
3
+ } from "./chunk-3KF65KGL.mjs";
4
4
  import {
5
5
  Tabs
6
- } from "./chunk-LDXCC2L3.mjs";
6
+ } from "./chunk-QND56EW2.mjs";
7
7
  import {
8
8
  Timepicker
9
- } from "./chunk-KYIEG4U3.mjs";
9
+ } from "./chunk-VZMROW5A.mjs";
10
10
  import {
11
11
  Tooltip
12
- } from "./chunk-FCNF4GRJ.mjs";
12
+ } from "./chunk-R7A7JRC5.mjs";
13
13
  import {
14
14
  TreeSelect
15
- } from "./chunk-GCWWEZKO.mjs";
15
+ } from "./chunk-TM7HPGTV.mjs";
16
16
  import {
17
17
  TreemapChart
18
- } from "./chunk-VH4BMAZS.mjs";
18
+ } from "./chunk-UKQK5GWR.mjs";
19
19
  import {
20
20
  SankeyChart
21
- } from "./chunk-CZSQHXEV.mjs";
21
+ } from "./chunk-XDAMOMVD.mjs";
22
22
  import {
23
23
  ScatterChart
24
- } from "./chunk-752ADW4M.mjs";
24
+ } from "./chunk-SUSD4UTN.mjs";
25
25
  import {
26
26
  ScrollSpy
27
- } from "./chunk-ZJNLAGY5.mjs";
27
+ } from "./chunk-5F4URJHL.mjs";
28
28
  import {
29
29
  ShowMore
30
- } from "./chunk-X7SDA2J5.mjs";
30
+ } from "./chunk-PWKYVMND.mjs";
31
31
  import {
32
32
  NavigationRail
33
- } from "./chunk-Z4GICXR2.mjs";
33
+ } from "./chunk-EWO662ZC.mjs";
34
34
  import {
35
35
  Particles
36
- } from "./chunk-5KIHWJI2.mjs";
36
+ } from "./chunk-TMQDZSDC.mjs";
37
37
  import {
38
38
  PieChart
39
- } from "./chunk-NBJAUGPP.mjs";
39
+ } from "./chunk-2LFCOGC3.mjs";
40
40
  import {
41
41
  PullToRefresh
42
- } from "./chunk-T3BNSRP3.mjs";
42
+ } from "./chunk-HQRLBTNM.mjs";
43
43
  import {
44
44
  Questionnaire
45
- } from "./chunk-GWZ76SR4.mjs";
45
+ } from "./chunk-7ZAMOMGY.mjs";
46
46
  import {
47
47
  RadarChart
48
- } from "./chunk-6FSEUFVW.mjs";
48
+ } from "./chunk-RSNS5OYS.mjs";
49
49
  import {
50
50
  RadialChart
51
- } from "./chunk-7YQBHTK3.mjs";
51
+ } from "./chunk-UKCNELUN.mjs";
52
52
  import {
53
53
  Lightbox
54
- } from "./chunk-VMY55K2X.mjs";
54
+ } from "./chunk-MA2SZZFB.mjs";
55
55
  import {
56
56
  LoadingOverlay
57
- } from "./chunk-4EWGD4V2.mjs";
57
+ } from "./chunk-NODZ5VAD.mjs";
58
58
  import {
59
59
  Menubar
60
- } from "./chunk-2RLBDFH4.mjs";
60
+ } from "./chunk-BDATLH3H.mjs";
61
61
  import {
62
62
  MessageScroller
63
- } from "./chunk-ANKFWNWT.mjs";
63
+ } from "./chunk-LC4O5LFS.mjs";
64
64
  import {
65
65
  MixedChart
66
- } from "./chunk-VFV75DHF.mjs";
66
+ } from "./chunk-XB6Y7P5W.mjs";
67
67
  import {
68
68
  Datepicker
69
- } from "./chunk-QXKWVHBD.mjs";
69
+ } from "./chunk-H6YIKFAQ.mjs";
70
70
  import {
71
71
  FormSelect
72
- } from "./chunk-EVCVFEV3.mjs";
72
+ } from "./chunk-XJPMW5SP.mjs";
73
73
  import {
74
74
  EXPANDING_CARD_SELECTOR,
75
75
  ExpandingCard
76
- } from "./chunk-OP43LLIC.mjs";
76
+ } from "./chunk-36GELQGX.mjs";
77
77
  import {
78
78
  FunnelChart
79
- } from "./chunk-S23RJ3XY.mjs";
79
+ } from "./chunk-RKG2CBFE.mjs";
80
80
  import {
81
81
  HeatmapChart
82
- } from "./chunk-BPF3I2MN.mjs";
82
+ } from "./chunk-KOTGMCMI.mjs";
83
83
  import {
84
84
  HoverCard
85
- } from "./chunk-BIGU5RCJ.mjs";
85
+ } from "./chunk-STJR62SU.mjs";
86
86
  import {
87
87
  InputMask
88
- } from "./chunk-VJVQIXHC.mjs";
88
+ } from "./chunk-MDBZAMIV.mjs";
89
89
  import {
90
90
  Keypad
91
- } from "./chunk-QACZ6TUP.mjs";
91
+ } from "./chunk-JH3YWKA6.mjs";
92
92
  import {
93
93
  Cascader
94
- } from "./chunk-NVQ5EHCU.mjs";
94
+ } from "./chunk-QNODAANY.mjs";
95
95
  import {
96
96
  Chips
97
- } from "./chunk-WU7XJ4RR.mjs";
97
+ } from "./chunk-LXRHUQAX.mjs";
98
98
  import {
99
99
  ColorPicker
100
- } from "./chunk-2CS6TITK.mjs";
100
+ } from "./chunk-CWMQOT4O.mjs";
101
101
  import {
102
102
  CommandPalette
103
- } from "./chunk-4TRZ2AER.mjs";
103
+ } from "./chunk-7X44MKEQ.mjs";
104
104
  import {
105
105
  Confetti
106
- } from "./chunk-VR3L2WN5.mjs";
106
+ } from "./chunk-YKANQILZ.mjs";
107
107
  import {
108
108
  CurrencyInput
109
- } from "./chunk-Y6TLRA3U.mjs";
109
+ } from "./chunk-AQNFCJJ5.mjs";
110
110
  import {
111
111
  AppBar
112
- } from "./chunk-P6DRQ6KS.mjs";
112
+ } from "./chunk-7CXNATJS.mjs";
113
113
  import {
114
114
  Autocomplete
115
- } from "./chunk-VGY4M57S.mjs";
115
+ } from "./chunk-F7LAKFMX.mjs";
116
116
  import {
117
117
  Menu
118
- } from "./chunk-CSYWKEK3.mjs";
118
+ } from "./chunk-DWA5UYLJ.mjs";
119
119
  import {
120
120
  BackToTop
121
- } from "./chunk-NNHVANQA.mjs";
121
+ } from "./chunk-4WBGAQN3.mjs";
122
122
  import {
123
123
  BarChart
124
- } from "./chunk-75E5EDJF.mjs";
124
+ } from "./chunk-3XORNED5.mjs";
125
125
  import {
126
126
  ColumnChart
127
- } from "./chunk-PA7NU5AK.mjs";
127
+ } from "./chunk-26VUH75M.mjs";
128
+ import {
129
+ LineChart
130
+ } from "./chunk-IQOTGGHX.mjs";
128
131
  import {
129
132
  ButtonGroup
130
- } from "./chunk-67ZPPKXS.mjs";
133
+ } from "./chunk-FNIIH2LU.mjs";
131
134
  import {
132
135
  FloatingActionButton
133
- } from "./chunk-ILDRRG7T.mjs";
136
+ } from "./chunk-LFORZRPH.mjs";
134
137
  import {
135
138
  CARDS_SELECTOR,
136
139
  Cards,
137
140
  isCardReveal
138
- } from "./chunk-OYNUDOHR.mjs";
141
+ } from "./chunk-UTSLYQ65.mjs";
139
142
  import {
140
143
  Carousel
141
- } from "./chunk-4QUCNFSD.mjs";
144
+ } from "./chunk-3KLZRQZI.mjs";
142
145
  import {
143
- LineChart
144
- } from "./chunk-ZM3XBHWV.mjs";
146
+ Component
147
+ } from "./chunk-EB2V4OKL.mjs";
145
148
 
146
149
  // src/ts/components/registry.ts
147
150
  var AUTO_INIT_COMPONENTS = {
@@ -250,7 +253,8 @@ function sameKind(fallback, value) {
250
253
  if (!SETTABLE.has(type) || kind(value) !== type) return false;
251
254
  return type !== ARRAY || itemsMatch(fallback, value);
252
255
  }
253
- var accepts = (defaults, key, value) => Object.hasOwn(defaults, key) && !MARKUP_BLOCKED.has(key) && sameKind(defaults[key], value);
256
+ var prop = (source, key) => Reflect.get(source, key);
257
+ var accepts = (defaults, key, value) => Object.hasOwn(defaults, key) && !MARKUP_BLOCKED.has(key) && sameKind(prop(defaults, key), value);
254
258
  var reject = (rejected, key) => void rejected.push(key);
255
259
  function nested(value, fallback, rejected, path) {
256
260
  if (kind(value) !== OBJECT) return value;
@@ -261,7 +265,7 @@ function nested(value, fallback, rejected, path) {
261
265
  function pick(parsed, defaults, rejected, path = "") {
262
266
  const picked = {};
263
267
  for (const [key, value] of Object.entries(parsed)) {
264
- const kept = accepts(defaults, key, value) ? nested(value, defaults[key], rejected, `${path}${key}.`) : reject(rejected, path + key);
268
+ const kept = accepts(defaults, key, value) ? nested(value, prop(defaults, key), rejected, `${path}${key}.`) : reject(rejected, path + key);
265
269
  if (kept !== void 0) picked[key] = kept;
266
270
  }
267
271
  return picked;
@@ -290,9 +294,24 @@ function markupOptions(el, name, defaults) {
290
294
  }
291
295
  var entry = (name) => AUTO_INIT_COMPONENTS[name];
292
296
  var NAMES = Object.keys(AUTO_INIT_COMPONENTS);
297
+ var WATCH_SELECTOR = `:is(${NAMES.map((name) => entry(name).selector).join(",")}):not(.no-autoinit)`;
293
298
  function initElement(name, el, options = {}) {
294
299
  const { component } = entry(name);
295
- component.init(el, { ...markupOptions(el, name, component.defaults), ...options });
300
+ try {
301
+ component.init(el, { ...markupOptions(el, name, component.defaults), ...options });
302
+ } catch (error) {
303
+ console.error(`${name} failed to start on`, el, error);
304
+ stopElement(name, el);
305
+ }
306
+ }
307
+ function stopElement(name, el) {
308
+ const instance = entry(name).component.getInstance(el);
309
+ try {
310
+ instance?.destroy();
311
+ } catch (error) {
312
+ console.error(`${name} failed to stop on`, el, error);
313
+ Component.prototype.destroy.call(instance);
314
+ }
296
315
  }
297
316
  function claimed(name, root, self = false) {
298
317
  const { selector, filter = () => true } = entry(name);
@@ -301,15 +320,20 @@ function claimed(name, root, self = false) {
301
320
  return [...own, ...root.querySelectorAll(query)].filter(filter);
302
321
  }
303
322
  function startAdded(node, options) {
304
- if (node.nodeType !== Node.ELEMENT_NODE) return;
323
+ if (!hasClaims(node)) return;
305
324
  for (const name of NAMES) {
306
325
  claimed(name, node, true).forEach((el) => entry(name).component.getInstance(el) || initElement(name, el, options?.[name]));
307
326
  }
308
327
  }
328
+ function hasClaims(node) {
329
+ if (node.nodeType !== Node.ELEMENT_NODE) return false;
330
+ const el = node;
331
+ return el.matches(WATCH_SELECTOR) || el.querySelector(WATCH_SELECTOR) !== null;
332
+ }
309
333
  function stopRemoved(node) {
310
- if (node.nodeType !== Node.ELEMENT_NODE || node.isConnected) return;
334
+ if (node.isConnected || !hasClaims(node)) return;
311
335
  for (const name of NAMES) {
312
- claimed(name, node, true).forEach((el) => entry(name).component.getInstance(el)?.destroy());
336
+ claimed(name, node, true).forEach((el) => stopElement(name, el));
313
337
  }
314
338
  }
315
339
  function watch(context, options) {
@@ -338,4 +362,4 @@ export {
338
362
  AUTO_INIT_COMPONENTS,
339
363
  AutoInit
340
364
  };
341
- //# sourceMappingURL=chunk-UGJHCHXG.mjs.map
365
+ //# sourceMappingURL=chunk-O2WJB6TH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/registry.ts"],
4
+ "sourcesContent": ["import { Component, InitElements, InitElement } from \"../core/component\";\nimport * as Components from \"./index\";\nimport { CARDS_SELECTOR, isCardReveal } from \"./cards\";\nimport { EXPANDING_CARD_SELECTOR } from \"./expandingCard\";\n\n/** The shape every entry in the table satisfies. */\ntype AutoInitable = {\n defaults: object;\n getInstance(el: Element): { destroy(): void } | undefined;\n init(els: InitElement | InitElements<InitElement>, options: Partial<object>): unknown;\n};\n\ntype AutoInitEntry = {\n component: AutoInitable;\n selector: string;\n filter?: (el: Element) => boolean;\n};\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Snackbar,\n * CharacterCounter, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n AppBar: {\n component: Components.AppBar,\n selector:\n \"header.medium, header.large, header:has(> :is(nav:not(.tabs, .navigation-bar, .navigation-rail), .bar) > .search-bar)\",\n },\n Autocomplete: {\n component: Components.Autocomplete,\n selector: \".autocomplete\",\n },\n ButtonGroup: {\n component: Components.ButtonGroup,\n selector: \".button-group\",\n },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR, filter: isCardReveal },\n ExpandingCard: {\n component: Components.ExpandingCard,\n selector: EXPANDING_CARD_SELECTOR,\n },\n Carousel: { component: Components.Carousel, selector: \".carousel\" },\n Chips: { component: Components.Chips, selector: \".chips\" },\n Confetti: { component: Components.Confetti, selector: \".confetti\" },\n Particles: { component: Components.Particles, selector: \"canvas.particles\" },\n Keypad: { component: Components.Keypad, selector: \".keypad, .keyboard\" },\n ColorPicker: { component: Components.ColorPicker, selector: \".color-picker\" },\n ColumnChart: { component: Components.ColumnChart, selector: \".column-chart\" },\n BarChart: { component: Components.BarChart, selector: \".bar-chart\" },\n PieChart: { component: Components.PieChart, selector: \".pie-chart\" },\n HeatmapChart: { component: Components.HeatmapChart, selector: \".heatmap-chart\" },\n RadarChart: { component: Components.RadarChart, selector: \".radar-chart\" },\n RadialChart: { component: Components.RadialChart, selector: \".radial-chart\" },\n MixedChart: { component: Components.MixedChart, selector: \".mixed-chart\" },\n ScatterChart: { component: Components.ScatterChart, selector: \".scatter-chart\" },\n FunnelChart: { component: Components.FunnelChart, selector: \".funnel-chart\" },\n SankeyChart: { component: Components.SankeyChart, selector: \".sankey-chart\" },\n TreemapChart: { component: Components.TreemapChart, selector: \".treemap-chart\" },\n CommandPalette: {\n component: Components.CommandPalette,\n selector: \"dialog.command-palette\",\n },\n Questionnaire: {\n component: Components.Questionnaire,\n selector: \"form.questionnaire\",\n },\n Datepicker: {\n component: Components.Datepicker,\n selector: \".date-picker\",\n },\n LineChart: { component: Components.LineChart, selector: \".line-chart\" },\n Menu: { component: Components.Menu, selector: \".menu-trigger\" },\n MessageScroller: {\n component: Components.MessageScroller,\n selector: \".message-scroller\",\n },\n PullToRefresh: { component: Components.PullToRefresh, selector: \".pull-to-refresh\" },\n LoadingOverlay: { component: Components.LoadingOverlay, selector: \".loading-overlay\" },\n SwipeActions: { component: Components.SwipeActions, selector: \".list.swipeable\" },\n // Only the input types with a caret: setSelectionRange() throws on the rest.\n InputMask: {\n component: Components.InputMask,\n selector: 'input[data-mask]:is(:not([type]), [type=\"text\" i], [type=\"tel\" i], [type=\"search\" i], [type=\"url\" i], [type=\"password\" i])',\n },\n ShowMore: { component: Components.ShowMore, selector: \".show-more\" },\n // Only a text input can hold the formatted amount.\n CurrencyInput: { component: Components.CurrencyInput, selector: 'input[data-currency]:is(:not([type]), [type=\"text\" i])' },\n Lightbox: { component: Components.Lightbox, selector: \".lightboxed\" },\n ScrollSpy: { component: Components.ScrollSpy, selector: \".scrollspy\" },\n BackToTop: { component: Components.BackToTop, selector: \".back-to-top\" },\n // A data-tree select is a tree select, not a flat one.\n FormSelect: { component: Components.FormSelect, selector: \"select:not([data-tree])\" },\n TreeSelect: { component: Components.TreeSelect, selector: \"select[data-tree]\" },\n Cascader: { component: Components.Cascader, selector: \".cascader\" },\n NavigationRail: {\n component: Components.NavigationRail,\n selector: \".navigation-rail\",\n },\n Tabs: { component: Components.Tabs, selector: \".tabs\" },\n Timepicker: {\n component: Components.Timepicker,\n selector: \".time-picker\",\n },\n Tooltip: { component: Components.Tooltip, selector: \".tooltipped\" },\n HoverCard: { component: Components.HoverCard, selector: \".hover-card-trigger\" },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: \".fab-menu\",\n },\n // After Menu, so the bar's own menu options replace AutoInit's defaults.\n Menubar: { component: Components.Menubar, selector: \".menubar\" },\n} satisfies Record<string, AutoInitEntry>;\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<\n InstanceType<Registry[K][\"component\"]>[\"options\"]\n >;\n};\n\n/**\n * Options markup cannot set: `allowUnsafeHTML` turns off HTML escaping,\n * `minYear` and `maxYear` are internal, and Chips and Autocomplete throw\n * part way through their constructors on `data` entries of the wrong shape.\n */\nconst MARKUP_BLOCKED = new Set([\"allowUnsafeHTML\", \"minYear\", \"maxYear\", \"data\"]);\nconst OBJECT = \"[object Object]\";\nconst ARRAY = \"[object Array]\";\n/** The default kinds markup can replace with a value of the same kind. */\nconst SETTABLE = new Set([\"[object String]\", \"[object Number]\", \"[object Boolean]\", ARRAY, OBJECT]);\n\n/** The attribute a component reads its markup options from: `FormSelect` reads `data-form-select-options`. */\nconst optionsAttribute = (name: string) => `data-${name.replace(/\\B[A-Z]/g, \"-$&\").toLowerCase()}-options`;\n\n/** A value's kind as its `toString` tag, with objects that are not plain counted apart. */\nfunction kind(value: unknown) {\n const tag = Object.prototype.toString.call(value);\n return tag === OBJECT && Object.getPrototypeOf(value) !== Object.prototype ? \"other\" : tag;\n}\n\n/** Whether every item has the kind of the default array's first item, when it has one. */\nconst itemsMatch = (fallback: unknown[], value: unknown[]) =>\n !fallback.length || value.every((item) => kind(item) === kind(fallback[0]));\n\n/** Whether a markup value may replace `fallback`: both are the same settable kind. */\nfunction sameKind(fallback: unknown, value: unknown) {\n const type = kind(fallback);\n if (!SETTABLE.has(type) || kind(value) !== type) return false;\n return type !== ARRAY || itemsMatch(fallback as unknown[], value as unknown[]);\n}\n\n/** An own property of a plain object, read without an index signature on its type. */\nconst prop = (source: object, key: string): unknown => Reflect.get(source, key);\n\nconst accepts = (defaults: object, key: string, value: unknown): boolean =>\n Object.hasOwn(defaults, key) && !MARKUP_BLOCKED.has(key) && sameKind(prop(defaults, key), value);\n\n/** Records a rejected key; returns undefined so the key is left out. */\nconst reject = (rejected: string[], key: string): undefined => void rejected.push(key);\n\n/**\n * A plain object filtered against its default object, or undefined once any\n * key inside it is rejected, so the whole option keeps its default. Other\n * values pass through.\n */\nfunction nested(value: unknown, fallback: object, rejected: string[], path: string) {\n if (kind(value) !== OBJECT) return value;\n const count = rejected.length;\n const picked = pick(value as object, fallback, rejected, path);\n return rejected.length === count ? picked : undefined;\n}\n\n/**\n * Copies the entries of `parsed` that `defaults` owns and that keep their\n * default's kind. Only own keys of `defaults` are copied, so `__proto__` never\n * is. Rejected keys go into `rejected`, dotted below the top level.\n */\nfunction pick(parsed: object, defaults: object, rejected: string[], path = \"\"): Record<string, unknown> {\n const picked: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(parsed)) {\n const kept = accepts(defaults, key, value) ? nested(value, prop(defaults, key) as object, rejected, `${path}${key}.`) : reject(rejected, path + key);\n if (kept !== undefined) picked[key] = kept;\n }\n return picked;\n}\n\n/** `text` parsed as a JSON object, or null. */\nfunction parseObject(text: string): object | null {\n try {\n const value: unknown = JSON.parse(text);\n return kind(value) === OBJECT ? (value as object) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The options an element sets for component `name` in its\n * `data-<name>-options` attribute. The attribute is untrusted: a value that is\n * not valid JSON, not an object, or not the kind of its default is dropped\n * with a warning, so that option keeps its default.\n */\nfunction markupOptions(el: Element, name: string, defaults: object) {\n const attribute = optionsAttribute(name);\n const text = el.getAttribute(attribute);\n if (text === null) return {};\n const parsed = parseObject(text);\n if (!parsed) {\n console.warn(`${name} ignored ${attribute}: expected a JSON object.`, el);\n return {};\n }\n const rejected: string[] = [];\n const options = pick(parsed, defaults, rejected);\n rejected.forEach((key) => console.warn(`${name} ignored \"${key}\" in ${attribute}: markup cannot set that option to that value.`, el));\n return options;\n}\n\n// Each component's static `init` is overloaded; indexing the table widens it\n// to a union TypeScript cannot call, so widen it once, here, to the shape the\n// table satisfies.\nconst entry = (name: keyof Registry): AutoInitEntry => AUTO_INIT_COMPONENTS[name];\nconst NAMES = Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[];\nconst WATCH_SELECTOR = `:is(${NAMES.map((name) => entry(name).selector).join(\",\")}):not(.no-autoinit)`;\n\n/**\n * Starts component `name` on one element, with its markup options under\n * `options`. A constructor that throws is logged and its half-built instance\n * released, so one bad element neither stops the rest of the pass nor keeps\n * a later pass from trying again.\n */\nfunction initElement(name: keyof Registry, el: Element, options: object = {}) {\n const { component } = entry(name);\n try {\n component.init(el, { ...markupOptions(el, name, component.defaults), ...options });\n } catch (error) {\n console.error(`${name} failed to start on`, el, error);\n stopElement(name, el);\n }\n}\n\n/**\n * Destroys component `name`'s instance on one element. A teardown that throws,\n * as a half-built instance's can, is logged and the base teardown runs anyway,\n * so the listeners go and the element is free for a new instance.\n */\nfunction stopElement(name: keyof Registry, el: Element) {\n const instance = entry(name).component.getInstance(el);\n try {\n instance?.destroy();\n } catch (error) {\n console.error(`${name} failed to stop on`, el, error);\n Component.prototype.destroy.call(instance);\n }\n}\n\n/**\n * The elements under `root` that component `name` claims, plus `root` itself\n * when `self` is set. `:is()` so that `:not(.no-autoinit)` applies to the\n * whole selector: a bare `${selector}:not(...)` binds the negation to the last\n * alternative only, which would break the opt-out for any comma-separated\n * entry (Cards is the first).\n */\nfunction claimed(name: keyof Registry, root: ParentNode, self = false): Element[] {\n const { selector, filter = () => true } = entry(name);\n const query = `:is(${selector}):not(.no-autoinit)`;\n const own = self && (root as Element).matches(query) ? [root as Element] : [];\n return [...own, ...root.querySelectorAll(query)].filter(filter);\n}\n\n/** Starts the components an added element and its descendants claim, leaving existing instances alone. */\nfunction startAdded(node: Node, options?: Partial<AutoInitOptions>) {\n if (!hasClaims(node)) return;\n for (const name of NAMES) {\n claimed(name, node, true).forEach((el) => entry(name).component.getInstance(el) || initElement(name, el, options?.[name]));\n }\n}\n\n/** Skips inert mutation roots without visiting every registry entry. */\nfunction hasClaims(node: Node): node is Element {\n if (node.nodeType !== Node.ELEMENT_NODE) return false;\n const el = node as Element;\n // shortcut: matching subtrees keep ordered scans; expand only if profiling justifies lifecycle-aware discovery.\n return el.matches(WATCH_SELECTOR) || el.querySelector(WATCH_SELECTOR) !== null;\n}\n\n/**\n * Destroys the instances of a removed element and its descendants that\n * AutoInit would claim. An element that is back in the page by now was moved,\n * and keeps its instances.\n */\nfunction stopRemoved(node: Node) {\n if (node.isConnected || !hasClaims(node)) return;\n for (const name of NAMES) {\n claimed(name, node, true).forEach((el) => stopElement(name, el));\n }\n}\n\n/** Watches `context`, starting components in added markup and destroying them in removed markup. */\nfunction watch(context: Node, options?: Partial<AutoInitOptions>) {\n const handle = (records: MutationRecord[]) => {\n for (const { addedNodes, removedNodes } of records) {\n removedNodes.forEach(stopRemoved);\n addedNodes.forEach((node) => context.contains(node) && startAdded(node, options));\n }\n };\n const observer = new MutationObserver(handle);\n observer.observe(context, { childList: true, subtree: true });\n // Handle the changes not delivered yet first, so markup added just before stop() still starts.\n return () => {\n handle(observer.takeRecords());\n observer.disconnect();\n };\n}\n\n/**\n * Automatically initialize components.\n * @param context Root element or shadow root to initialize. Defaults to\n * `document.body`. Shadow roots inside it are not entered.\n * @param options Options for each component.\n * @param settings With `watch: true`, keep starting components in markup\n * added to `context` later, and destroy them when their markup is removed.\n * @returns A function that stops watching. It does nothing without `watch`.\n */\nexport function AutoInit(\n context: HTMLElement | ShadowRoot = document.body,\n options?: Partial<AutoInitOptions>,\n settings: { watch?: boolean } = {},\n): () => void {\n for (const name of NAMES) {\n claimed(name, context).forEach((el) => initElement(name, el, options?.[name]));\n }\n return settings.watch ? watch(context, options) : () => {};\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,6 +1,7 @@
1
1
  import {
2
- Utils
3
- } from "./chunk-ZVLOUDIJ.mjs";
2
+ Utils,
3
+ afterAnyFormReset
4
+ } from "./chunk-67UNY7RH.mjs";
4
5
 
5
6
  // src/ts/behaviors/imageCompare.ts
6
7
  var rangeSelector = '.image-compare > input[type="range"]';
@@ -12,6 +13,7 @@ var _ImageCompare = class _ImageCompare {
12
13
  const range = Utils.eventTarget(e);
13
14
  if (range?.matches(rangeSelector)) _ImageCompare.sync(range);
14
15
  });
16
+ afterAnyFormReset((form) => form.querySelectorAll(rangeSelector).forEach(_ImageCompare.sync));
15
17
  Utils.onDocumentReady(() => {
16
18
  document.querySelectorAll(rangeSelector).forEach((range) => _ImageCompare.sync(range));
17
19
  });
@@ -30,4 +32,4 @@ var ImageCompare = _ImageCompare;
30
32
  export {
31
33
  ImageCompare
32
34
  };
33
- //# sourceMappingURL=chunk-7YZ5CN3V.mjs.map
35
+ //# sourceMappingURL=chunk-PCABY5BN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/behaviors/imageCompare.ts"],
4
+ "sourcesContent": ["import { Utils, afterAnyFormReset } from '../core/utils';\n\nconst rangeSelector = '.image-compare > input[type=\"range\"]';\n\n/**\n * Image compare. Keeps `--md-comp-image-compare-position` on each\n * `.image-compare` in step with its range input, so the divider and the\n * revealed image follow the value. Listens on the document, so compares added\n * later follow too once moved, and a form reset moves them back.\n * `ImageCompare.sync(el)` sets one at once.\n */\nexport class ImageCompare {\n private static _initialized = false;\n\n static Init() {\n if (ImageCompare._initialized || typeof document === 'undefined') return;\n ImageCompare._initialized = true;\n document.addEventListener('input', (e) => {\n const range = Utils.eventTarget(e);\n if (range?.matches(rangeSelector)) ImageCompare.sync(<HTMLInputElement>range);\n });\n afterAnyFormReset((form) => form.querySelectorAll<HTMLInputElement>(rangeSelector).forEach(ImageCompare.sync));\n Utils.onDocumentReady(() => {\n document.querySelectorAll<HTMLInputElement>(rangeSelector).forEach((range) => ImageCompare.sync(range));\n });\n }\n\n /** Moves the divider of a compare to its range's current value. */\n static sync(range: HTMLInputElement) {\n const min = parseFloat(range.min) || 0;\n const max = Number.isNaN(parseFloat(range.max)) ? 100 : parseFloat(range.max);\n const fraction = max === min ? 0 : (parseFloat(range.value) - min) / (max - min);\n range.parentElement.style.setProperty('--md-comp-image-compare-position', `${fraction * 100}%`);\n }\n}\n"],
5
+ "mappings": ";;;;;;AAEA,IAAM,gBAAgB;AASf,IAAM,gBAAN,MAAM,cAAa;AAAA,EAGxB,OAAO,OAAO;AACZ,QAAI,cAAa,gBAAgB,OAAO,aAAa,YAAa;AAClE,kBAAa,eAAe;AAC5B,aAAS,iBAAiB,SAAS,CAAC,MAAM;AACxC,YAAM,QAAQ,MAAM,YAAY,CAAC;AACjC,UAAI,OAAO,QAAQ,aAAa,EAAG,eAAa,KAAuB,KAAK;AAAA,IAC9E,CAAC;AACD,sBAAkB,CAAC,SAAS,KAAK,iBAAmC,aAAa,EAAE,QAAQ,cAAa,IAAI,CAAC;AAC7G,UAAM,gBAAgB,MAAM;AAC1B,eAAS,iBAAmC,aAAa,EAAE,QAAQ,CAAC,UAAU,cAAa,KAAK,KAAK,CAAC;AAAA,IACxG,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,KAAK,OAAyB;AACnC,UAAM,MAAM,WAAW,MAAM,GAAG,KAAK;AACrC,UAAM,MAAM,OAAO,MAAM,WAAW,MAAM,GAAG,CAAC,IAAI,MAAM,WAAW,MAAM,GAAG;AAC5E,UAAM,WAAW,QAAQ,MAAM,KAAK,WAAW,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC5E,UAAM,cAAc,MAAM,YAAY,oCAAoC,GAAG,WAAW,GAAG,GAAG;AAAA,EAChG;AACF;AAvBa,cACI,eAAe;AADzB,IAAM,eAAN;",
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/showMore.ts
10
10
  var _defaults = {
@@ -34,7 +34,7 @@ var _ShowMore = class _ShowMore extends Component {
34
34
  this._observer = null;
35
35
  /** Shows the full text. */
36
36
  this.open = () => {
37
- if (this.isOpen || !this.button) return;
37
+ if (this.isOpen || !this._wired) return;
38
38
  this._show(true);
39
39
  this._notify("open", this.options.onOpen, { current: () => this.isOpen });
40
40
  };
@@ -71,7 +71,7 @@ var _ShowMore = class _ShowMore extends Component {
71
71
  return _defaults;
72
72
  }
73
73
  destroy() {
74
- if (this.button) {
74
+ if (this._wired) {
75
75
  this._observer.disconnect();
76
76
  if (this.isOpen) this._show(false);
77
77
  for (const name of BUTTON_ATTRIBUTES) restoreAttribute(this.button, name, this._initial[name]);
@@ -89,6 +89,10 @@ var _ShowMore = class _ShowMore extends Component {
89
89
  this.button.ariaExpanded = "false";
90
90
  this.button.setAttribute("aria-controls", this.text.id);
91
91
  }
92
+ /** Whether the constructor found the text and the button, and wired them. */
93
+ get _wired() {
94
+ return Boolean(this.text && this.button);
95
+ }
92
96
  _show(open) {
93
97
  this.isOpen = open;
94
98
  this.button.ariaExpanded = String(open);
@@ -113,4 +117,4 @@ var ShowMore = _ShowMore;
113
117
  export {
114
118
  ShowMore
115
119
  };
116
- //# sourceMappingURL=chunk-X7SDA2J5.mjs.map
120
+ //# sourceMappingURL=chunk-PWKYVMND.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ts/components/showMore.ts"],
4
- "sourcesContent": ["import { Utils, restoreAttribute } from \"../core/utils\";\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ShowMoreI18nOptions {\n /** The button's label while the full text shows. */\n showLess: string;\n}\n\nexport interface ShowMoreOptions extends BaseOptions {\n /** Called after the full text shows. */\n onOpen: ((el: Element) => void) | null;\n /** Called after the text is clamped again. */\n onClose: ((el: Element) => void) | null;\n /** The open label; `data-show-less` on the button overrides it. */\n i18n: Partial<ShowMoreI18nOptions>;\n}\n\nconst _defaults: ShowMoreOptions = {\n onOpen: null,\n onClose: null,\n i18n: { showLess: \"Show less\" },\n};\n\n// Inline, because the utilities layer beats any component rule and a\n// prefixed clamp such as medium:line-clamp-2 would beat .line-clamp-none.\nconst CLAMP_PROPERTIES = [\"-webkit-line-clamp\", \"line-clamp\"];\nconst BUTTON_ATTRIBUTES = [\"aria-expanded\", \"aria-controls\", \"hidden\"];\n\n/** The button's last label text, skipping aria-hidden icons. */\nfunction labelNode(button: HTMLElement): Text | null {\n const walker = button.ownerDocument.createTreeWalker(button, NodeFilter.SHOW_TEXT);\n let label: Text | null = null;\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (node.textContent.trim() && !node.parentElement.closest('[aria-hidden=\"true\"]')) label = node as Text;\n }\n return label;\n}\n\n/**\n * Clamped text with a button that shows all of it. A `.show-more` holds text\n * with a `line-clamp-1`, `-2` or `-3` class and a `<button>`. The button\n * hides while the clamped text fits.\n */\nexport class ShowMore extends Component<ShowMoreOptions> {\n static key = \"Expressive_ShowMore\";\n isOpen = false;\n private readonly text: HTMLElement | null;\n private readonly button: HTMLButtonElement | null;\n // Attributes as they were before init, so destroy() can restore them.\n private _initial: Record<string, string | null> = {};\n private _initialId: string | null = null;\n private _label: Text | null = null;\n private _moreLabel = \"\";\n private _observer: ResizeObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<ShowMoreOptions>) {\n super(el, options);\n this.text = el.querySelector(\":scope > :is(.line-clamp-1, .line-clamp-2, .line-clamp-3)\");\n this.button = el.querySelector(\":scope > button\");\n if (!this.text || !this.button) return;\n this._wire();\n const { signal } = this._events;\n this.button.addEventListener(\"click\", this._toggle, { signal });\n this.button.addEventListener(\"blur\", this._fit, { signal });\n this._observer = new ResizeObserver(this._fit);\n this._observer.observe(this.text);\n // A web font that swaps in can change what fits without resizing the\n // clamped box, so the observer would not report it.\n el.ownerDocument.fonts?.ready.then(this._fit);\n }\n\n static get defaults(): ShowMoreOptions {\n return _defaults;\n }\n\n /** Shows the full text. */\n open = () => {\n if (this.isOpen || !this.button) return;\n this._show(true);\n this._notify(\"open\", this.options.onOpen, { current: () => this.isOpen });\n };\n\n /** Clamps the text again. */\n close = () => {\n if (!this.isOpen) return;\n this._show(false);\n this._notify(\"close\", this.options.onClose, { current: () => !this.isOpen });\n };\n\n destroy() {\n if (this.button) {\n this._observer.disconnect();\n if (this.isOpen) this._show(false);\n for (const name of BUTTON_ATTRIBUTES) restoreAttribute(this.button, name, this._initial[name]);\n restoreAttribute(this.text, \"id\", this._initialId);\n }\n super.destroy();\n }\n\n /** Records what destroy() restores, then points the button at the text. */\n private _wire() {\n for (const name of BUTTON_ATTRIBUTES) this._initial[name] = this.button.getAttribute(name);\n this._initialId = this.text.getAttribute(\"id\");\n if (!this.text.id) this.text.id = `show-more-${Utils.guid()}`;\n this._label = labelNode(this.button);\n if (this._label) this._moreLabel = this._label.data;\n this.button.ariaExpanded = \"false\";\n this.button.setAttribute(\"aria-controls\", this.text.id);\n }\n\n private _toggle = () => (this.isOpen ? this.close() : this.open());\n\n /**\n * Hides the button while the clamped text fits. Open text keeps it. So does\n * focus, so a resize cannot hide the button someone is on and drop focus on\n * the page. The check runs again on blur, which also hides a button whose\n * text was collapsed after it widened to fit, since collapsing it then\n * leaves the box the same size.\n */\n private _fit = () => {\n if (this.isOpen || this.button.matches(\":focus\") || ShowMore.getInstance(this.el) !== this) return;\n // Firefox rounds a fractional line height up in scrollHeight only.\n this.button.hidden = this.text.scrollHeight - this.text.clientHeight <= 1;\n };\n\n private _show(open: boolean) {\n this.isOpen = open;\n this.button.ariaExpanded = String(open);\n if (this._label) this._label.data = open ? this._lessLabel() : this._moreLabel;\n this._clamp(!open);\n }\n\n private _lessLabel() {\n return this.button.dataset.showLess || this.options.i18n.showLess;\n }\n\n private _clamp(on: boolean) {\n if (on) this._restoreClamp();\n else for (const property of CLAMP_PROPERTIES) this.text.style.setProperty(property, \"unset\");\n }\n\n private _restoreClamp() {\n for (const property of CLAMP_PROPERTIES) this.text.style.removeProperty(property);\n // Leave no empty style attribute on text that had none.\n if (!this.text.style.length) this.text.removeAttribute(\"style\");\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from \"../core/utils\";\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ShowMoreI18nOptions {\n /** The button's label while the full text shows. */\n showLess: string;\n}\n\nexport interface ShowMoreOptions extends BaseOptions {\n /** Called after the full text shows. */\n onOpen: ((el: Element) => void) | null;\n /** Called after the text is clamped again. */\n onClose: ((el: Element) => void) | null;\n /** The open label; `data-show-less` on the button overrides it. */\n i18n: Partial<ShowMoreI18nOptions>;\n}\n\nconst _defaults: ShowMoreOptions = {\n onOpen: null,\n onClose: null,\n i18n: { showLess: \"Show less\" },\n};\n\n// Inline, because the utilities layer beats any component rule and a\n// prefixed clamp such as medium:line-clamp-2 would beat .line-clamp-none.\nconst CLAMP_PROPERTIES = [\"-webkit-line-clamp\", \"line-clamp\"];\nconst BUTTON_ATTRIBUTES = [\"aria-expanded\", \"aria-controls\", \"hidden\"];\n\n/** The button's last label text, skipping aria-hidden icons. */\nfunction labelNode(button: HTMLElement): Text | null {\n const walker = button.ownerDocument.createTreeWalker(button, NodeFilter.SHOW_TEXT);\n let label: Text | null = null;\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (node.textContent.trim() && !node.parentElement.closest('[aria-hidden=\"true\"]')) label = node as Text;\n }\n return label;\n}\n\n/**\n * Clamped text with a button that shows all of it. A `.show-more` holds text\n * with a `line-clamp-1`, `-2` or `-3` class and a `<button>`. The button\n * hides while the clamped text fits.\n */\nexport class ShowMore extends Component<ShowMoreOptions> {\n static key = \"Expressive_ShowMore\";\n isOpen = false;\n private readonly text: HTMLElement | null;\n private readonly button: HTMLButtonElement | null;\n // Attributes as they were before init, so destroy() can restore them.\n private _initial: Record<string, string | null> = {};\n private _initialId: string | null = null;\n private _label: Text | null = null;\n private _moreLabel = \"\";\n private _observer: ResizeObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<ShowMoreOptions>) {\n super(el, options);\n this.text = el.querySelector(\":scope > :is(.line-clamp-1, .line-clamp-2, .line-clamp-3)\");\n this.button = el.querySelector(\":scope > button\");\n if (!this.text || !this.button) return;\n this._wire();\n const { signal } = this._events;\n this.button.addEventListener(\"click\", this._toggle, { signal });\n this.button.addEventListener(\"blur\", this._fit, { signal });\n this._observer = new ResizeObserver(this._fit);\n this._observer.observe(this.text);\n // A web font that swaps in can change what fits without resizing the\n // clamped box, so the observer would not report it.\n el.ownerDocument.fonts?.ready.then(this._fit);\n }\n\n static get defaults(): ShowMoreOptions {\n return _defaults;\n }\n\n /** Shows the full text. */\n open = () => {\n if (this.isOpen || !this._wired) return;\n this._show(true);\n this._notify(\"open\", this.options.onOpen, { current: () => this.isOpen });\n };\n\n /** Clamps the text again. */\n close = () => {\n if (!this.isOpen) return;\n this._show(false);\n this._notify(\"close\", this.options.onClose, { current: () => !this.isOpen });\n };\n\n destroy() {\n if (this._wired) {\n this._observer.disconnect();\n if (this.isOpen) this._show(false);\n for (const name of BUTTON_ATTRIBUTES) restoreAttribute(this.button, name, this._initial[name]);\n restoreAttribute(this.text, \"id\", this._initialId);\n }\n super.destroy();\n }\n\n /** Records what destroy() restores, then points the button at the text. */\n private _wire() {\n for (const name of BUTTON_ATTRIBUTES) this._initial[name] = this.button.getAttribute(name);\n this._initialId = this.text.getAttribute(\"id\");\n if (!this.text.id) this.text.id = `show-more-${Utils.guid()}`;\n this._label = labelNode(this.button);\n if (this._label) this._moreLabel = this._label.data;\n this.button.ariaExpanded = \"false\";\n this.button.setAttribute(\"aria-controls\", this.text.id);\n }\n\n /** Whether the constructor found the text and the button, and wired them. */\n private get _wired() {\n return Boolean(this.text && this.button);\n }\n\n private _toggle = () => (this.isOpen ? this.close() : this.open());\n\n /**\n * Hides the button while the clamped text fits. Open text keeps it. So does\n * focus, so a resize cannot hide the button someone is on and drop focus on\n * the page. The check runs again on blur, which also hides a button whose\n * text was collapsed after it widened to fit, since collapsing it then\n * leaves the box the same size.\n */\n private _fit = () => {\n if (this.isOpen || this.button.matches(\":focus\") || ShowMore.getInstance(this.el) !== this) return;\n // Firefox rounds a fractional line height up in scrollHeight only.\n this.button.hidden = this.text.scrollHeight - this.text.clientHeight <= 1;\n };\n\n private _show(open: boolean) {\n this.isOpen = open;\n this.button.ariaExpanded = String(open);\n if (this._label) this._label.data = open ? this._lessLabel() : this._moreLabel;\n this._clamp(!open);\n }\n\n private _lessLabel() {\n return this.button.dataset.showLess || this.options.i18n.showLess;\n }\n\n private _clamp(on: boolean) {\n if (on) this._restoreClamp();\n else for (const property of CLAMP_PROPERTIES) this.text.style.setProperty(property, \"unset\");\n }\n\n private _restoreClamp() {\n for (const property of CLAMP_PROPERTIES) this.text.style.removeProperty(property);\n // Leave no empty style attribute on text that had none.\n if (!this.text.style.length) this.text.removeAttribute(\"style\");\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }