@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/autocomplete.ts"],
4
+ "sourcesContent": ["import { imageURL } from '../core/imageURL';\nimport { Utils, afterFormReset } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions } from '../core/component';\n\n/** Whether a key works the list. Alt, Ctrl and Meta stay the browser's. */\nconst isListKey = (e: KeyboardEvent) => (e.key === 'ArrowUp' || e.key === 'ArrowDown') && Utils.plainKey(e);\n\nexport interface AutocompleteData {\n /**\n * A primitive value that can be converted to string.\n * If \"text\" is not provided, it will also be used as \"option text\" as well\n */\n id: string | number;\n /**\n * This optional attribute is used as \"display value\" for the current entry.\n * When provided, it will also be taken into consideration by the standard search function.\n */\n text?: string;\n /**\n * This optional attribute is used to provide a valid image URL to the current option.\n */\n image?: string;\n /**\n * Optional attributes which describes the option.\n */\n description?: string;\n /**\n * Shows the entry dimmed and keeps every selection path from choosing or\n * removing it. The arrow keys skip it, and the result count leaves it out.\n * The `selected` option and `setMenuItems()` can still select it.\n */\n disabled?: boolean;\n /**\n * Lists the entry under this heading. Entries with the same group gather\n * where the group first appears in the results; entries without one stay\n * outside every group.\n */\n group?: string;\n}\n\nexport interface AutocompleteOptions extends BaseOptions {\n i18n: Partial<{\n loading: string;\n noResults: string;\n results: (count: number) => string;\n selected: (count: number) => string;\n create: (text: string) => string;\n }>;\n /**\n * Data object defining autocomplete options with\n * optional icon strings.\n */\n data: AutocompleteData[];\n /**\n * Flag which can be set if multiple values can be selected. The Result will be an Array.\n * @default false\n */\n isMultiSelect: boolean;\n /**\n * Callback for when autocompleted.\n */\n onAutocomplete: (entries: AutocompleteData[]) => void;\n /**\n * Minimum number of characters before autocomplete starts.\n * @default 1\n */\n minLength: number;\n /**\n * The height of the Menu which can be set via css-property.\n * @default '300px'\n */\n maxMenuHeight: string;\n /** Maximum rendered suggestions. Infinity preserves the complete list. @default Infinity */\n maxResults: number;\n /**\n * Function is called when the input text is altered and data can also be loaded asynchronously.\n * If the results are collected the items in the list can be updated via the function setMenuItems(collectedItems).\n * @param text Searched text.\n * @param autocomplete Current autocomplete instance.\n * @param signal Aborted when a newer search starts or the autocomplete is\n * destroyed. Pass it to `fetch()` so a slow, stale response never replaces\n * newer results.\n */\n onSearch: (text: string, autocomplete: Autocomplete, signal: AbortSignal) => void;\n /**\n * Milliseconds to wait after typing pauses before calling `onSearch`, so\n * remote data is fetched once per pause rather than once per key. A search\n * on focus never waits. `0` searches on every input.\n * @default 0\n */\n searchDelay: number;\n /**\n * Ends the list in an \"Add\" row when the typed text matches no suggestion\n * exactly. Choosing the row calls `onCreate` and fires `expressive:create`;\n * the selection does not change.\n * @default false\n */\n allowCreate: boolean;\n /**\n * Called when the person chooses the \"Add\" row.\n * @param text The typed text, trimmed.\n * @param autocomplete Current autocomplete instance.\n * @default null\n */\n onCreate: (text: string, autocomplete: Autocomplete) => void;\n /**\n * If true will render the key from each item directly as HTML.\n * User input MUST be properly sanitized first.\n * @default false\n */\n allowUnsafeHTML: boolean;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n /**\n * Predefined selected values\n */\n selected: number[] | string[];\n}\n\nconst _defaults: AutocompleteOptions = {\n i18n: {\n loading: 'Loading results.',\n noResults: 'No results.',\n results: count => `${count} ${count === 1 ? 'result' : 'results'} available.`,\n selected: count => `${count} ${count === 1 ? 'item' : 'items'} selected.`,\n create: text => `Add \"${text}\"`\n },\n data: [], // Autocomplete data set\n onAutocomplete: null, // Callback for when autocompleted\n menuOptions: {\n // Default menu options\n autoFocus: false,\n closeOnClick: false,\n coverTrigger: false\n },\n minLength: 1, // Min characters before autocomplete starts\n searchDelay: 0,\n allowCreate: false,\n onCreate: null,\n isMultiSelect: false,\n onSearch: (text: string, autocomplete: Autocomplete) => {\n const normSearch = text.toLocaleLowerCase();\n autocomplete.setMenuItems(\n autocomplete.options.data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n )\n );\n },\n maxMenuHeight: '300px',\n maxResults: Infinity,\n allowUnsafeHTML: false,\n selected: []\n};\n\nexport class Autocomplete extends Component<AutocompleteOptions> {\n declare el: HTMLInputElement;\n /** If the autocomplete is open. */\n isOpen: boolean;\n /**\n * Whether the user left or dismissed the field since the last search, so\n * late results must not reopen it. A field nobody has focused yet counts.\n */\n private _left = true;\n /** Number of matching autocomplete options. */\n count: number;\n /** Index of the current selected option. */\n activeIndex: number;\n private oldVal: string;\n private $active: HTMLElement | null;\n private _openTimer: ReturnType<typeof setTimeout> | undefined;\n /** Aborts the running search when a newer one starts. */\n private _searchAbort: AbortController | undefined;\n /** The search waiting for typing to pause. */\n private _searchTimer: ReturnType<typeof setTimeout> | undefined;\n // Counts selections, so a callback that selects again silences the stale event.\n private _selection = 0;\n /** The selection the field started with, which a form reset restores. */\n private _startingSelection: AutocompleteData[];\n private _statusInfo: HTMLElement;\n private _announcer: HTMLElement;\n /** The last search returned no suggestions. A text change clears it until the next one returns. */\n private _noResults = false;\n\n /**\n * The active entry, for both the eye and the screen reader. The class alone\n * was invisible to assistive technology; aria-activedescendant on the input\n * is what reports the move.\n *\n * Deliberately does not touch aria-selected. Active and selected are two\n * different things - in a multi-select the checkboxes track real choices,\n * and folding the highlight into aria-selected would announce a committed\n * choice as unselected the moment the user arrowed past it.\n */\n private _setActive(item: HTMLElement | null) {\n this.$active?.classList.remove('active');\n this.$active = item;\n if (item) {\n item.classList.add('active');\n this.el.setAttribute('aria-activedescendant', item.id);\n } else {\n this.el.removeAttribute('aria-activedescendant');\n }\n }\n private _pointerDown: boolean;\n container: HTMLElement;\n /** Instance of the menu plugin for this autocomplete. */\n menu: Menu;\n selectedValues: AutocompleteData[];\n menuItems: AutocompleteData[];\n\n constructor(el: HTMLInputElement, options: Partial<AutocompleteOptions>) {\n super(el, options);\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n // First entry wins on a duplicate id, as selectOption() picks the first.\n const byId = new Map<string | number, AutocompleteData>();\n this.options.data.forEach((entry) => byId.has(entry.id) || byId.set(entry.id, entry));\n this.selectedValues = this.options.selected.map((id) => byId.get(id) ?? { id });\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._pointerDown = false;\n this._setupMenu();\n this._startingSelection = [...this.selectedValues];\n this._setupEventHandlers();\n }\n\n static get defaults(): AutocompleteOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Autocomplete';\n\n /**\n * The three-dot loading indicator, parsed once and cloned thereafter.\n *\n * It is shown on every input change, and it used to be assigned as an\n * innerHTML string each time - re-running the HTML parser over the same\n * fixed markup on every keystroke.\n */\n private static _loadingTemplate: HTMLElement = null;\n\n private static _loadingIndicator(): HTMLElement {\n if (!Autocomplete._loadingTemplate) {\n const template = document.createElement('template');\n template.innerHTML = `<div style=\"height:100%;width:50px;\"><svg version=\"1.1\" id=\"L4\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 0 0\" xml:space=\"preserve\">\n <circle fill=\"#888c\" stroke=\"none\" cx=\"6\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.1\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"26\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.2\"/></circle>\n <circle fill=\"#888c\" stroke=\"none\" cx=\"46\" cy=\"50\" r=\"6\"><animate attributeName=\"opacity\" dur=\"1s\" values=\"0;1;0\" repeatCount=\"indefinite\" begin=\"0.3\"/></circle>\n </svg></div>`;\n Autocomplete._loadingTemplate = template.content.firstElementChild as HTMLElement;\n }\n return Autocomplete._loadingTemplate.cloneNode(true) as HTMLElement;\n }\n\n destroy() {\n // open() defers menu.open() to a timer. Without cancelling it, destroying\n // an autocomplete that was opened in the same tick let the callback run\n // against a menu whose element had already been removed.\n if (this._openTimer !== undefined) {\n clearTimeout(this._openTimer);\n this._openTimer = undefined;\n }\n this._cancelPendingSearch();\n this._searchAbort?.abort();\n this._events.abort();\n this.menu.destroy();\n this.isOpen = false;\n this._removeMenu();\n for (const name of ['role', 'aria-autocomplete', 'aria-controls', 'data-target', 'aria-haspopup', 'aria-expanded', 'aria-activedescendant']) {\n this.el.removeAttribute(name);\n }\n this._statusInfo.remove();\n this._announcer.remove();\n super.destroy();\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n this.el.addEventListener('blur', this._handleInputBlur, { signal });\n this.el.addEventListener('input', this._handleInput, { signal });\n this.el.addEventListener('focus', this._handleInputFocus, { signal });\n this.el.addEventListener('keydown', this._handleInputKeydown, { signal });\n this.el.addEventListener('click', this._handleInputClick, { signal });\n // One pair, not two. These used to be a mouse pair plus a touch pair behind\n // a `window.ontouchstart` feature detect; a pointer event covers both, and\n // the detect covered nothing the browser does not report itself.\n this.container.addEventListener('pointerdown', this._handleContainerPointerDown, { signal });\n this.container.addEventListener('mousedown', this._handleInertRowPress, { capture: true, signal });\n this.container.addEventListener('click', this._handleInertRowPress, { capture: true, signal });\n afterFormReset(this.el, this._handleReset, signal);\n }\n\n /** The form restored the input's text. The selection follows it, with no change event, as a native reset fires none. */\n private _handleReset = () => {\n this._cancelPendingSearch();\n this._searchAbort?.abort();\n this._selection++;\n this.selectedValues = [...this._startingSelection];\n if (!this.options.isMultiSelect) this._refreshInputText();\n this._updateSelectedInfo();\n this._resetAutocomplete();\n this.close();\n };\n\n _setupMenu() {\n this.container = document.createElement('menu');\n this.container.style.maxHeight = this.options.maxMenuHeight;\n this.container.id = `autocomplete-options-${Utils.guid()}`;\n this.container.classList.add('autocomplete-content');\n this.container.ariaExpanded = 'true';\n // An autocomplete is the textbook combobox, and this one already\n // implements the keyboard contract the roles promise - Up and Down move\n // the active entry, Enter commits it - so it is allowed to claim them.\n // It had none: the suggestions were an unlabelled list of <li>, and the\n // highlight moved with a class no assistive technology could see.\n this.container.setAttribute('role', 'listbox');\n this.el.setAttribute('role', 'combobox');\n this.el.setAttribute('aria-autocomplete', 'list');\n this.el.setAttribute('aria-controls', this.container.id);\n this.el.setAttribute('data-target', this.container.id);\n\n this._renderMenu();\n this.oldVal = ''; // Initial rendering must not trigger a search on empty focus.\n\n // ! Issue in Component Menu: _placeMenu moves dom-position\n this.el.parentElement.appendChild(this.container);\n\n // Initialize menu\n const menuOptions = {\n ...Autocomplete.defaults.menuOptions,\n ...this.options.menuOptions\n };\n const userOnOpenStart = menuOptions.onOpenStart;\n const userOnCloseStart = menuOptions.onCloseStart;\n menuOptions.onOpenStart = (el) => {\n this.isOpen = true;\n if (typeof userOnOpenStart === 'function') userOnOpenStart.call(this.menu, el);\n };\n menuOptions.onCloseStart = (el) => {\n this.isOpen = false;\n if (typeof userOnCloseStart === 'function') userOnCloseStart.call(this.menu, el);\n };\n // The wrapper is installed unconditionally: selecting the clicked entry is\n // how the autocomplete works, not an optional extra. Only the forwarding to\n // a user-supplied handler is conditional, and it hands over exactly what\n // Menu would have (the clicked `li`, called on the Menu instance).\n const userOnItemClick = menuOptions.onItemClick;\n menuOptions.onItemClick = (li) => {\n if (!li) return;\n this._choose(li);\n if (typeof userOnItemClick === 'function') userOnItemClick.call(this.menu, li);\n };\n this.menu = Menu.init(this.el, menuOptions);\n this.el.setAttribute('aria-haspopup', 'listbox');\n\n // ! Workaround for Label: move label up again\n // TODO: Just use PopperJS in future!\n const label = this.el.parentElement.querySelector('label');\n if (label) this.el.after(label);\n\n // Menu's trigger handlers open the list without rendering it, and its\n // keydown cancels Space and Enter, which a text field needs.\n this.el.removeEventListener('click', this.menu._handleClick);\n this.el.removeEventListener('keydown', this.menu._handleTriggerKeydown);\n if (!this.options.isMultiSelect) this._refreshInputText();\n // Set Value if already set in HTML\n if (this.el.value) this.selectOption(this.el.value);\n // Add StatusInfo\n const div = document.createElement('div');\n div.classList.add('status-info');\n div.setAttribute('aria-hidden', 'true');\n div.setAttribute('style', 'position: absolute;right:0;top:0;');\n this.el.parentElement.appendChild(div);\n this._statusInfo = div;\n this._announcer = document.createElement('div');\n this._announcer.classList.add('autocomplete-status');\n this._announcer.setAttribute('role', 'status');\n this._announcer.setAttribute('aria-live', 'polite');\n this._announcer.setAttribute('aria-atomic', 'true');\n this.el.parentElement.appendChild(this._announcer);\n this._updateSelectedInfo();\n }\n\n _removeMenu() {\n this.container.ariaExpanded = 'false';\n this.container.parentNode.removeChild(this.container);\n }\n\n _handleInputBlur = () => {\n if (!this._pointerDown) {\n this._left = true;\n this._cancelPendingSearch();\n this.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInput = () => {\n this._left = false;\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n // Check if the input isn't empty, and that focus arrived by keyboard -\n // which is what `:focus-visible` means, and used to be a global flag this\n // bundle maintained from four capture-phase document listeners. An open\n // menu is not re-rendered with the old results here: setMenuItems renders\n // the new ones. Below minLength, open() still runs to clear the list.\n if (this.oldVal !== actualValue) {\n // The old results can stay on screen until setMenuItems replaces them,\n // but none may stay active: Enter would select a result for the\n // previous query.\n this._resetCurrentElementPosition();\n // open() renders before the new search starts, so the old answer goes first.\n this._noResults = false;\n if (this.el.matches(':focus-visible')\n && (!this.menu.isOpen || actualValue.length < this.options.minLength)) this.open();\n }\n this._inputChangeDetection(actualValue, true);\n };\n\n _handleInputFocus = () => {\n this._left = false;\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n this._inputChangeDetection(actualValue);\n };\n\n _inputChangeDetection = (value: string, typed?: boolean) => {\n // Editing or clearing a single selection's text deselects it.\n const deselected = !this.options.isMultiSelect && this.selectedValues.length > 0\n && this.el.value !== (this.selectedValues[0].text || String(this.selectedValues[0].id));\n if (deselected) this.selectedValues = [];\n // Value has changed!\n if (this.oldVal !== value) {\n this._noResults = false;\n this._startSearch(typed);\n }\n if (deselected) this._triggerChanged();\n this.oldVal = value;\n };\n\n /**\n * Searches for text of at least `minLength` characters. Shorter text drops\n * the pending and running searches and the old results: it used to reach\n * onSearch too, so a remote search fetched on every first keystroke.\n */\n private _startSearch(typed?: boolean) {\n if (this.el.value.length >= this.options.minLength) {\n this._setStatusLoading();\n return this._queueSearch(typed);\n }\n this._cancelPendingSearch();\n this._searchAbort?.abort();\n this.menuItems = [];\n // Nothing is searched, so no loading indicator or old count stays.\n this._updateSelectedInfo();\n this._announce('');\n }\n\n /** Searches now, or once typing pauses for `searchDelay`. Focus never waits. */\n private _queueSearch(typed?: boolean) {\n this._cancelPendingSearch();\n const delay = this.options.searchDelay;\n if (!typed || !(delay > 0 && delay < Infinity)) return this._search(this.el.value);\n // The running search is for text the field no longer holds.\n this._searchAbort?.abort();\n this._searchTimer = setTimeout(() => {\n this._searchTimer = undefined;\n this._search(this.el.value);\n }, delay);\n }\n\n private _cancelPendingSearch() {\n clearTimeout(this._searchTimer);\n this._searchTimer = undefined;\n }\n\n /** Starts a search and aborts the one before, whose response is now stale. */\n private _search(text: string) {\n this._searchAbort?.abort();\n this._searchAbort = new AbortController();\n this.options.onSearch(text, this, this._searchAbort.signal);\n }\n\n _handleInputKeydown = Utils.ignoringComposition((e: KeyboardEvent) => {\n if (e.key === 'Escape' || e.key === 'Tab') {\n this._dismiss(e);\n return;\n }\n // Arrow keys and enter key usage\n const options = this._options();\n const numItems = options.length;\n // select element on Enter\n if (e.key === 'Enter' && this.activeIndex >= 0) {\n const liElement = options[this.activeIndex];\n if (liElement) {\n this._choose(liElement);\n e.preventDefault();\n }\n return;\n }\n // Capture up and down key\n if (isListKey(e)) {\n e.preventDefault();\n // A list that is already opening keeps its rendered results.\n if (!this.menu.isOpen && this._openTimer === undefined) {\n this.open();\n return;\n }\n if (e.key === 'ArrowUp' && this.activeIndex > 0) this.activeIndex--;\n if (e.key === 'ArrowDown' && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this._setActive(null);\n if (this.activeIndex >= 0) {\n this._setActive(options[this.activeIndex]);\n // Focus selected\n options[this.activeIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\n });\n\n private _dismiss(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n // Take the key only when it closes something, or a surrounding <dialog>\n // would cancel too. A dismissed list stays shut for late results.\n if (this.menu.isOpen || this._openTimer !== undefined) e.preventDefault();\n this._left = true;\n }\n this.close();\n this._resetCurrentElementPosition();\n }\n\n _handleInputClick = () => {\n this.open();\n };\n\n // The flag says \"a press is in flight inside the option list\", so that a blur\n // caused by that press does not close the list out from under it. Without the\n // cancel half, a cancelled gesture left the flag set and the next blur could\n // not close the list at all.\n _handleContainerPointerDown = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n this._pointerDown = true;\n // A mouse press has no implicit capture, so its release can land outside\n // the list. The document hears it wherever it lands. Adding the same\n // listener again is a no-op, so repeated presses add nothing.\n const listen = { capture: true, once: true, signal: this._events.signal };\n this.el.ownerDocument.addEventListener('pointerup', this._handleContainerPointerUp, listen);\n this.el.ownerDocument.addEventListener('pointercancel', this._handleContainerPointerUp, listen);\n };\n\n _handleContainerPointerUp = () => {\n this._pointerDown = false;\n };\n\n // The no-results row and group headings are not options, and a disabled row\n // cannot be chosen. A press on any of them would move focus to the list,\n // which nothing hands back, and Menu would report the row as chosen.\n _handleInertRowPress = (e: MouseEvent) => {\n if (!(e.target instanceof Element) || !e.target.closest('.autocomplete-no-results, .autocomplete-group-label, [aria-disabled=\"true\"]')) return;\n e.preventDefault();\n e.stopPropagation();\n };\n\n /** The rows that can be chosen. The no-results row and disabled rows are not. */\n private _options() {\n return this.container.querySelectorAll<HTMLElement>('li[role=\"option\"]:not([aria-disabled=\"true\"])');\n }\n\n _resetCurrentElementPosition() {\n this.activeIndex = -1;\n this._setActive(null);\n }\n\n _resetAutocomplete() {\n this.container.replaceChildren();\n this._resetCurrentElementPosition();\n this.oldVal = null;\n this._pointerDown = false;\n }\n\n _highlightPartialText(input: string, label: string) {\n const start = label.toLocaleLowerCase().indexOf(input.toLocaleLowerCase());\n const end = start + input.length - 1;\n //custom filters may return results where the string does not match any part\n if (start == -1 || end == -1) {\n return [label, '', ''];\n }\n return [label.slice(0, start), label.slice(start, end + 1), label.slice(end + 1)];\n }\n\n _createMenuItem(entry: AutocompleteData, selectedIds = new Set(this.selectedValues.map(entry => entry.id))) {\n const item = document.createElement('li');\n item.id = `autocomplete-option-${Utils.guid()}`;\n item.setAttribute('role', 'option');\n // role=option promises a selection state on every entry, not just the\n // chosen one - and it has to be the *real* one. A multi-select entry that\n // is already committed is selected whether or not it is the highlighted\n // row.\n const isSelected = selectedIds.has(entry.id);\n item.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n item.setAttribute('data-id', <string>entry.id);\n Autocomplete._markDisabled(item, entry);\n item.setAttribute(\n 'style',\n 'display:grid; grid-auto-flow: column; user-select: none; align-items: center;'\n );\n item.tabIndex = -1;\n // Checkbox\n if (this.options.isMultiSelect) {\n const selection = document.createElement('div');\n selection.classList.add('item-selection');\n selection.style.textAlign = 'center';\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n checkbox.checked = isSelected;\n checkbox.disabled = entry.disabled === true;\n const spacer = document.createElement('span');\n spacer.style.paddingLeft = '21px';\n selection.append(checkbox, spacer);\n item.appendChild(selection);\n }\n // Image\n const image = imageURL(entry.image, this.el.ownerDocument.baseURI);\n if (image) {\n const img = document.createElement('img');\n img.classList.add('circle');\n img.src = image;\n item.appendChild(img);\n }\n\n const div = this._createLabel(entry);\n\n const itemText = document.createElement('div');\n itemText.classList.add('item-text');\n itemText.setAttribute('style', 'padding:5px;overflow:hidden;');\n item.appendChild(itemText);\n itemText.appendChild(div);\n // Description\n if (\n typeof entry.description === 'string' ||\n (typeof entry.description === 'number' && !isNaN(entry.description))\n ) {\n const description = document.createElement('small');\n description.setAttribute(\n 'style',\n 'line-height:1.3;color:grey;white-space:nowrap;text-overflow:ellipsis;display:block;width:90%;overflow:hidden;'\n );\n description.innerText = entry.description;\n itemText.appendChild(description);\n }\n // Set Grid\n const getGridConfig = () => {\n if (this.options.isMultiSelect) {\n if (entry.image) return '40px min-content auto'; // cb-img-txt\n return '40px auto'; // cb-txt\n }\n if (entry.image) return 'min-content auto'; // img-txt\n return 'auto'; // txt\n };\n item.style.gridTemplateColumns = getGridConfig();\n return item;\n }\n\n /** Menu already ignores a click on an aria-disabled row. */\n private static _markDisabled(item: HTMLElement, entry: AutocompleteData) {\n if (entry.disabled === true) item.setAttribute('aria-disabled', 'true');\n }\n\n _createLabel(entry: AutocompleteData) {\n const inputText = this.el.value.toLocaleLowerCase();\n const label = (entry.text || entry.id).toString();\n const div = document.createElement('div');\n div.setAttribute('style', 'line-height:1.2;font-weight:500;');\n // Only a script-supplied text is HTML. An id can come from markup's\n // `selected`, which AutoInit treats as untrusted, so it stays text.\n if (this.options.allowUnsafeHTML && entry.text) this._highlightHTML(div, label, inputText);\n else this._highlightText(div, this._highlightPartialText(inputText, label));\n return div;\n }\n\n _highlightHTML(div: HTMLElement, label: string, inputText: string) {\n // Highlight inside a parsed text node. Splicing the span into the HTML\n // string put its quotes inside any attribute the match landed in, which\n // closed that attribute and let the rest of it become markup.\n div.innerHTML = label;\n const walker = document.createTreeWalker(div, NodeFilter.SHOW_TEXT);\n for (let node = walker.nextNode() as Text; node; node = walker.nextNode() as Text) {\n const [before, match] = this._highlightPartialText(inputText, node.data);\n if (!match) continue;\n const matched = node.splitText(before.length);\n matched.splitText(match.length);\n const highlight = document.createElement('span');\n highlight.classList.add('highlight');\n matched.replaceWith(highlight);\n highlight.append(matched);\n break;\n }\n }\n\n _highlightText(div: HTMLElement, parts: string[]) {\n div.appendChild(document.createTextNode(parts[0]));\n if (parts[1]) {\n const highlight = document.createElement('span');\n highlight.textContent = parts[1];\n highlight.classList.add('highlight');\n div.appendChild(highlight);\n div.appendChild(document.createTextNode(parts[2]));\n }\n }\n\n private _visibleEntries() {\n const limit = this.options.maxResults;\n return Number.isFinite(limit) && limit >= 0 ? this.menuItems.slice(0, Math.floor(limit)) : this.menuItems;\n }\n\n _renderMenu() {\n this._resetAutocomplete();\n if (this._noResults) this.container.append(this._createNoResultsRow());\n // With no results, the list shows the selected entries, so they can be\n // removed. A copy: menuItems must not share selectedValues' array.\n if (this.menuItems.length === 0) this.menuItems = [...this.selectedValues];\n const groups = new Map<string, HTMLElement>();\n const selectedIds = new Set(this.selectedValues.map(entry => entry.id));\n this._visibleEntries().forEach((entry) => this._groupList(entry.group, groups).append(this._createMenuItem(entry, selectedIds)));\n const createText = this._createText();\n if (createText) this.container.append(this._createRow(createText));\n }\n\n /** The list a row goes in: the listbox, or its group's list, made where the group first appears. */\n private _groupList(name: string | undefined, groups: Map<string, HTMLElement>) {\n if (!name) return this.container;\n if (!groups.has(name)) groups.set(name, this._createGroup(name));\n return groups.get(name);\n }\n\n /**\n * A labelled group of options, as the APG grouped listbox nests it. The\n * heading is not an option, so the arrow keys and the count pass over it.\n * Its name is set as text: only an entry's own `text` may be HTML.\n */\n private _createGroup(name: string) {\n const heading = document.createElement('li');\n heading.id = `autocomplete-group-${Utils.guid()}`;\n heading.setAttribute('role', 'presentation');\n heading.classList.add('label', 'autocomplete-group-label');\n heading.textContent = name;\n const list = document.createElement('ul');\n list.setAttribute('role', 'group');\n list.setAttribute('aria-labelledby', heading.id);\n list.append(heading);\n const wrapper = document.createElement('li');\n wrapper.setAttribute('role', 'none');\n wrapper.append(list);\n this.container.append(wrapper);\n return list;\n }\n\n /** The typed text to offer as a new value, or '' when the option is off, the text is short or a suggestion matches it. */\n private _createText() {\n const text = this.el.value.trim();\n if (!this.options.allowCreate || text.length < this.options.minLength) return '';\n const typed = text.toLocaleLowerCase();\n return this.menuItems.some((entry) => (entry.text || String(entry.id)).toLocaleLowerCase() === typed) ? '' : text;\n }\n\n /** The \"Add\" row. Its label is what the person typed, so it is set as text, never as HTML. */\n private _createRow(text: string) {\n const item = document.createElement('li');\n item.id = `autocomplete-option-${Utils.guid()}`;\n item.setAttribute('role', 'option');\n item.setAttribute('aria-selected', 'false');\n // Not data-id, which an entry's id could equal. The text is kept on the\n // row because the field can change before newer results replace it.\n item.setAttribute('data-create', text);\n item.classList.add('autocomplete-create');\n item.setAttribute('style', 'display:grid; user-select: none; align-items: center;');\n item.tabIndex = -1;\n const label = document.createElement('div');\n label.classList.add('item-text');\n label.setAttribute('style', 'padding:5px;overflow:hidden;line-height:1.2;font-weight:500;');\n label.textContent = this.options.i18n.create(text);\n item.append(label);\n return item;\n }\n\n /**\n * Shows sighted users the `i18n.noResults` that the live region announces.\n * Screen readers already hear that, and a listbox may only own options, so\n * the row is hidden from them.\n */\n private _createNoResultsRow() {\n const row = document.createElement('li');\n row.classList.add('autocomplete-no-results');\n row.setAttribute('role', 'none');\n row.setAttribute('aria-hidden', 'true');\n row.textContent = this.options.i18n.noResults;\n return row;\n }\n\n _setStatusLoading() {\n const statusElement = this._statusInfo;\n if (statusElement) statusElement.replaceChildren(Autocomplete._loadingIndicator());\n this._announce(this.options.i18n.loading);\n }\n\n private _announce(message: string) {\n if (!this._announcer) return;\n const text = this.el.matches(':focus') && this.el.value.length >= this.options.minLength ? message : '';\n if (this._announcer.textContent !== text) this._announcer.textContent = text;\n }\n\n /** Announces the entries a person can choose. Disabled ones are shown, not counted. */\n private _resultsMessage() {\n // The selected entries shown under \"No results.\" are not search results.\n const count = this._noResults ? 0 : this._visibleEntries().filter((entry) => entry.disabled !== true).length;\n return count ? this.options.i18n.results(count) : this.options.i18n.noResults;\n }\n\n _updateSelectedInfo() {\n const statusElement = this._statusInfo;\n if (statusElement) {\n if (this.options.isMultiSelect)\n statusElement.textContent = this.selectedValues.length.toString();\n else statusElement.replaceChildren();\n }\n }\n\n _refreshInputText() {\n if (this.selectedValues.length === 1) {\n const entry = this.selectedValues[0];\n this.el.value = entry.text || <string>entry.id; // Write Text to Input\n }\n }\n\n _triggerChanged() {\n // Counted before the native change, whose listeners may select again.\n const values = this.selectedValues;\n const selection = ++this._selection;\n this.el.dispatchEvent(new Event('change', { bubbles: true, cancelable: true, composed: true }));\n if (selection !== this._selection) return;\n this._notify('autocomplete', this.options.onAutocomplete, { args: [values], detail: { values }, current: () => selection === this._selection });\n }\n\n /**\n * Show autocomplete.\n */\n open = () => {\n const inputText = this.el.value.toLocaleLowerCase();\n this._resetAutocomplete();\n if (inputText.length >= this.options.minLength) {\n this._renderMenu();\n this._announce(this._resultsMessage());\n }\n // Open menu\n if (!this.menu.isOpen) {\n // Cancel first: two open() calls before the callback fires would leave\n // the earlier timer untracked, and destroy() can only cancel the one it\n // knows about.\n if (this._openTimer !== undefined) clearTimeout(this._openTimer);\n this._openTimer = setTimeout(() => {\n this._openTimer = undefined;\n this.menu.open();\n }, 0); // TODO: why?\n } else this.menu.recalculateDimensions(); // Recalculate menu when its already open\n };\n\n /**\n * Hide autocomplete.\n */\n close = () => {\n if (this._announcer) this._announcer.textContent = '';\n if (this._openTimer !== undefined) {\n clearTimeout(this._openTimer);\n this._openTimer = undefined;\n }\n this.isOpen = false;\n this.menu.close();\n };\n\n /**\n * Updates the visible or selectable items shown in the menu.\n * @param menuItems Items to be available.\n * @param selected Selected item ids\n * @param open Option to conditionally open menu\n */\n setMenuItems(menuItems: AutocompleteData[], selected: number[] | string[] = null, open: boolean = true) {\n if (Autocomplete.getInstance(this.el) !== this) return;\n // Results that arrive after the user left the field update the list\n // without opening it under an input nobody is using.\n open &&= !this._left;\n this._noResults = menuItems.length === 0;\n this.menuItems = menuItems;\n if (selected) {\n const ids = new Set<string | number>(selected);\n this.selectedValues = this.menuItems.filter((item) => ids.has(item.id));\n }\n // open() clears and renders the list itself.\n if (this.options.isMultiSelect) {\n if (!open) this._renderMenu();\n } else {\n this._refreshInputText();\n }\n if (open) this.open();\n this._updateSelectedInfo();\n this._announce(open ? this._resultsMessage() : '');\n if (selected) this._triggerChanged();\n }\n\n private _toggleOption(entry: AutocompleteData) {\n const selected = !this.selectedValues.some((selectedEntry) => selectedEntry.id === entry.id);\n if (selected) this.selectedValues.push(entry);\n else this.selectedValues = this.selectedValues.filter((selectedEntry) => selectedEntry.id !== entry.id);\n // Update the row in place. Re-rendering the list dropped the active row,\n // and its reset of oldVal made the refocus below run a new search.\n const row = Array.from(this.container.querySelectorAll('li[data-id]')).find((li) => li.getAttribute('data-id') === String(entry.id));\n if (row) {\n row.setAttribute('aria-selected', String(selected));\n row.querySelector('input').checked = selected;\n }\n this.el.focus();\n }\n\n private _selectSingle(entry: AutocompleteData) {\n // A click focuses the row, and removing it would drop focus to <body>.\n // A selection made from code leaves focus where it is.\n const refocus = Utils.focusIsIn(this.container);\n // A search still waiting would run on the chosen label and reopen the list.\n this._cancelPendingSearch();\n this.selectedValues = [entry];\n this._refreshInputText();\n this._resetAutocomplete();\n this.close();\n if (refocus) {\n // The field already shows the choice, so returning to it is not a new search.\n this.oldVal = this.el.value.toLocaleLowerCase();\n this.el.focus();\n }\n }\n\n /** Commits a row chosen by Enter or a click. */\n private _choose(li: Element) {\n if (li.hasAttribute('data-create')) this._create(li.getAttribute('data-create'));\n else this.selectOption(li.getAttribute('data-id'));\n }\n\n private _create(text: string) {\n const refocus = Utils.focusIsIn(this.container);\n // A search still waiting would reopen the list on the same text.\n this._cancelPendingSearch();\n // The field keeps the text, so returning to it is not a new search.\n this.oldVal = this.el.value.toLocaleLowerCase();\n this.close();\n if (refocus) this.el.focus();\n this._notify('create', this.options.onCreate, { args: [text, this], detail: { text } });\n }\n\n /**\n * Select a specific autocomplete option via id-property.\n * @param id The id of a data-entry.\n */\n selectOption(id: number | string) {\n // A disabled entry is never found, so it is neither chosen nor removed.\n const entry = this.menuItems.find((item) => String(item.id) === String(id) && item.disabled !== true);\n if (!entry) return;\n if (this.options.isMultiSelect) this._toggleOption(entry);\n else this._selectSingle(entry);\n this._updateSelectedInfo();\n if (this.options.isMultiSelect) this._announce(this.options.i18n.selected(this.selectedValues.length));\n this._triggerChanged();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["entry"]
7
+ }
@@ -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
  restoreAttribute
6
- } from "./chunk-ZVLOUDIJ.mjs";
6
+ } from "./chunk-67UNY7RH.mjs";
7
7
 
8
8
  // src/ts/components/buttonGroup.ts
9
9
  var _defaults = {};
@@ -210,4 +210,4 @@ ButtonGroup.key = "Expressive_ButtonGroup";
210
210
  export {
211
211
  ButtonGroup
212
212
  };
213
- //# sourceMappingURL=chunk-67ZPPKXS.mjs.map
213
+ //# sourceMappingURL=chunk-FNIIH2LU.mjs.map
@@ -0,0 +1,15 @@
1
+ // src/ts/core/imageURL.ts
2
+ function imageURL(value, base) {
3
+ if (!value) return void 0;
4
+ try {
5
+ const url = new URL(value, base);
6
+ if (/^(?:https?:|blob:|data:image\/(?:avif|bmp|gif|jpeg|png|svg\+xml|webp|x-icon)(?:;|,))/i.test(url.href)) return url.href;
7
+ } catch {
8
+ }
9
+ return void 0;
10
+ }
11
+
12
+ export {
13
+ imageURL
14
+ };
15
+ //# sourceMappingURL=chunk-GE3YMFS6.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/core/imageURL.ts"],
4
+ "sourcesContent": ["/** Accept image URLs without allowing arbitrary URL schemes. */\nexport function imageURL(value: string | null | undefined, base: string): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value, base);\n if (/^(?:https?:|blob:|data:image\\/(?:avif|bmp|gif|jpeg|png|svg\\+xml|webp|x-icon)(?:;|,))/i.test(url.href)) return url.href;\n } catch { /* Invalid images must not prevent selection. */ }\n return undefined;\n}\n"],
5
+ "mappings": ";AACO,SAAS,SAAS,OAAkC,MAAkC;AAC3F,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO,IAAI;AAC/B,QAAI,wFAAwF,KAAK,IAAI,IAAI,EAAG,QAAO,IAAI;AAAA,EACzH,QAAQ;AAAA,EAAmD;AAC3D,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Utils
3
- } from "./chunk-ZVLOUDIJ.mjs";
3
+ } from "./chunk-67UNY7RH.mjs";
4
4
 
5
5
  // src/ts/behaviors/transferList.ts
6
6
  var AVAILABLE = ".transfer-available";
@@ -29,12 +29,12 @@ var _TransferList = class _TransferList {
29
29
  const boxes = _TransferList._boxes(container, move.from).filter((box) => !box.disabled && (move.all || box.checked));
30
30
  if (!to || !boxes.length) return;
31
31
  _TransferList._record(container);
32
- const moved = boxes.map((box) => box.closest("li"));
33
- for (const [i, row] of moved.entries()) {
34
- boxes[i].checked = false;
35
- to.insertBefore(row, _TransferList._slot(container, row, to));
36
- }
37
- const rows = [...to.children].filter((row) => moved.includes(row));
32
+ const start = _TransferList._starts.get(container);
33
+ const rank = new Map([...start.available, ...start.chosen].map((row, i) => [row, i]));
34
+ const moved = new Set(boxes.map((box) => box.closest("li")));
35
+ boxes.forEach((box) => box.checked = false);
36
+ moved.forEach((row) => to.insertBefore(row, _TransferList._slot(rank, row, to)));
37
+ const rows = [...to.children].filter((row) => moved.has(row));
38
38
  _TransferList._announce(container, rows.length, to);
39
39
  container.dispatchEvent(new CustomEvent("expressive:transfer", { bubbles: true, detail: { rows, from, to } }));
40
40
  }
@@ -53,12 +53,16 @@ var _TransferList = class _TransferList {
53
53
  * row that came after it before the first move; elsewhere, or for a row the
54
54
  * page added since, none, so it goes last.
55
55
  */
56
- static _slot(container, row, to) {
57
- const start = _TransferList._starts.get(container);
58
- const order = [...start.available, ...start.chosen];
59
- const index = order.indexOf(row);
60
- if (!to.matches(AVAILABLE) || index < 0) return null;
61
- return [...to.children].find((other) => order.indexOf(other) > index) ?? null;
56
+ static _slot(rank, row, to) {
57
+ const index = rank.get(row);
58
+ if (!to.matches(AVAILABLE) || index === void 0) return null;
59
+ return _TransferList._firstAfter(rank, to, index);
60
+ }
61
+ /** The first row of `list` that started after position `index`. Walks siblings, so a move-all stays cheap. */
62
+ static _firstAfter(rank, list, index) {
63
+ let other = list.firstElementChild;
64
+ while (other && (rank.get(other) ?? -1) <= index) other = other.nextElementSibling;
65
+ return other;
62
66
  }
63
67
  static _announce(container, count, to) {
64
68
  let region = _TransferList._regions.get(container);
@@ -118,4 +122,4 @@ var TransferList = _TransferList;
118
122
  export {
119
123
  TransferList
120
124
  };
121
- //# sourceMappingURL=chunk-DZYVU75J.mjs.map
125
+ //# sourceMappingURL=chunk-GFWYMWYN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/behaviors/transferList.ts"],
4
+ "sourcesContent": ["import { Utils } from '../core/utils';\n\nconst AVAILABLE = '.transfer-available';\nconst CHOSEN = '.transfer-chosen';\n\n/** Each button's source list, destination list, and whether it moves every row or only the checked ones. */\nconst MOVES = new Map([\n ['add', { from: AVAILABLE, to: CHOSEN, all: false }],\n ['add-all', { from: AVAILABLE, to: CHOSEN, all: true }],\n ['remove', { from: CHOSEN, to: AVAILABLE, all: false }],\n ['remove-all', { from: CHOSEN, to: AVAILABLE, all: true }]\n]);\n\n/** The rows of both lists as they stood before a container's first move. */\ninterface Start {\n available: Element[];\n chosen: Element[];\n}\n\n/**\n * Transfer lists. A `.transfer-list` holds a `.transfer-available` and a\n * `.transfer-chosen` list of checkbox rows, with `[data-transfer]` buttons\n * between them. `add` and `remove` move the checked rows to the other list,\n * `add-all` and `remove-all` every row, skipping rows whose box is disabled.\n * Moved rows arrive unchecked. The chosen list keeps the order rows arrived\n * in; a row moved back returns to its slot in the order the lists had before\n * the first move. A form reset puts every row back there.\n *\n * After each move the container fires a bubbling `expressive:transfer` event\n * whose `detail` is `{ rows, from, to }`, and a polite live region beside it\n * announces the move. `TransferList.i18n.moved` holds that text.\n *\n * The checkboxes carry no name. When the form builds its data, each row of\n * the chosen list adds its checkbox value under the container's `data-name`,\n * in the chosen list's order. The listeners are on the document, so a list\n * added later needs no call, but a form inside a shadow root gets no entries.\n */\nexport class TransferList {\n static i18n = { moved: 'Moved {count} to {list}' };\n private static _starts = new WeakMap<Element, Start>();\n private static _regions = new WeakMap<Element, HTMLElement>();\n\n // A second Init adds nothing: addEventListener ignores a listener it has.\n static Init() {\n if (typeof document === 'undefined') return;\n document.addEventListener('click', TransferList._onClick);\n document.addEventListener('formdata', TransferList._onFormData, { capture: true });\n document.addEventListener('reset', TransferList._onReset, { capture: true });\n }\n\n private static _onClick(e: MouseEvent) {\n // A click on a disabled button's icon still reaches the document, so the selector skips it.\n const button = Utils.closestInPath(e, '.transfer-list [data-transfer]:not(:disabled, [aria-disabled=\"true\"])');\n const move = MOVES.get(button?.getAttribute('data-transfer'));\n if (move) TransferList._move(button.closest('.transfer-list'), move);\n }\n\n private static _move(container: Element, move: { from: string; to: string; all: boolean }) {\n const [from, to] = [move.from, move.to].map((list) => container.querySelector(`:scope > ${list}`));\n const boxes = TransferList._boxes(container, move.from).filter((box) => !box.disabled && (move.all || box.checked));\n if (!to || !boxes.length) return;\n TransferList._record(container);\n const start = TransferList._starts.get(container);\n const rank = new Map([...start.available, ...start.chosen].map((row, i) => [row, i]));\n const moved = new Set<Element>(boxes.map((box) => box.closest('li')));\n boxes.forEach((box) => (box.checked = false));\n moved.forEach((row) => to.insertBefore(row, TransferList._slot(rank, row, to)));\n const rows = [...to.children].filter((row) => moved.has(row));\n TransferList._announce(container, rows.length, to);\n container.dispatchEvent(new CustomEvent('expressive:transfer', { bubbles: true, detail: { rows, from, to } }));\n }\n\n /** The row checkboxes of one of a container's lists, in order. Only a row's own label counts, so a list nested in a row keeps its boxes. */\n private static _boxes(container: Element, list: string) {\n return [...container.querySelectorAll<HTMLInputElement>(`:scope > ${list} > li > label > input[type=\"checkbox\"]`)];\n }\n\n /** Keeps the rows of both lists as they stand before a container's first move. */\n private static _record(container: Element) {\n if (TransferList._starts.has(container)) return;\n const rows = (list: string) => [...container.querySelectorAll(`:scope > ${list} > li`)];\n TransferList._starts.set(container, { available: rows(AVAILABLE), chosen: rows(CHOSEN) });\n }\n\n /**\n * The row a moved row goes before. In the available list that is the first\n * row that came after it before the first move; elsewhere, or for a row the\n * page added since, none, so it goes last.\n */\n private static _slot(rank: Map<Element, number>, row: Element, to: Element) {\n const index = rank.get(row);\n if (!to.matches(AVAILABLE) || index === undefined) return null;\n return TransferList._firstAfter(rank, to, index);\n }\n\n /** The first row of `list` that started after position `index`. Walks siblings, so a move-all stays cheap. */\n private static _firstAfter(rank: Map<Element, number>, list: Element, index: number) {\n let other = list.firstElementChild;\n while (other && (rank.get(other) ?? -1) <= index) other = other.nextElementSibling;\n return other;\n }\n\n private static _announce(container: Element, count: number, to: Element) {\n let region = TransferList._regions.get(container);\n if (!region) {\n region = document.createElement('div');\n region.className = 'visually-hidden';\n region.setAttribute('aria-live', 'polite');\n container.after(region);\n TransferList._regions.set(container, region);\n }\n region.textContent = TransferList.i18n.moved.replace('{count}', String(count)).replace('{list}', TransferList._name(to));\n }\n\n /** A list's `aria-label`, or the text of the elements its `aria-labelledby` names. */\n private static _name(list: Element) {\n const label = list.getAttribute('aria-label');\n if (label !== null) return label;\n const root = list.getRootNode() as Document | ShadowRoot;\n const ids = (list.getAttribute('aria-labelledby') ?? '').split(/\\s+/);\n return ids.map((id) => root.getElementById(id)?.textContent.trim()).filter(Boolean).join(' ');\n }\n\n private static _onFormData(e: FormDataEvent) {\n const containers = (e.target as HTMLFormElement).querySelectorAll<HTMLElement>('.transfer-list:not([data-name=\"\"])[data-name]');\n for (const container of containers) {\n for (const box of TransferList._boxes(container, CHOSEN).filter(TransferList._submits)) {\n e.formData.append(container.dataset.name, box.value);\n }\n }\n }\n\n /**\n * Whether a chosen row submits. A disabled fieldset leaves it out, as it\n * does its own fields outside the first legend. A row's own disabled box\n * only keeps the row in place, so it still submits.\n */\n private static _submits(box: HTMLInputElement) {\n return !box.matches('fieldset[disabled] > :not(legend:first-of-type) *');\n }\n\n private static _onReset(e: Event) {\n const containers = [...(e.target as HTMLFormElement).querySelectorAll('.transfer-list')];\n // The form resets its fields after the event, and the page may cancel it,\n // so the rows go back a task later.\n setTimeout(() => {\n if (!e.defaultPrevented) containers.forEach(TransferList._restore);\n });\n }\n\n /** Puts every row a container had before its first move back in its list and order. */\n private static _restore(container: Element) {\n const start = TransferList._starts.get(container);\n if (!start) return;\n const kept = (rows: Element[]) => rows.filter((row) => container.contains(row));\n container.querySelector(`:scope > ${AVAILABLE}`)?.append(...kept(start.available));\n container.querySelector(`:scope > ${CHOSEN}`)?.append(...kept(start.chosen));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -2,10 +2,10 @@ import {
2
2
  DISMISS_DISTANCE,
3
3
  DISMISS_VELOCITY,
4
4
  installSheetDrag
5
- } from "./chunk-JUKBBN6P.mjs";
5
+ } from "./chunk-YLZOJLDI.mjs";
6
6
  import {
7
7
  Utils
8
- } from "./chunk-ZVLOUDIJ.mjs";
8
+ } from "./chunk-67UNY7RH.mjs";
9
9
 
10
10
  // src/ts/behaviors/bottomSheets.ts
11
11
  var SHEET_SELECTOR = "dialog.bottom-sheet";
@@ -20,7 +20,8 @@ var _BottomSheets = class _BottomSheets {
20
20
  motion: "--md-comp-bottom-sheet-motion",
21
21
  direction: () => 1,
22
22
  inHandle: (event, dialog) => {
23
- if (Utils.closestInPath(event, ".drag-handle")) return true;
23
+ const handle = Utils.closestInPath(event, ".drag-handle");
24
+ if (handle) return handle.parentElement === dialog;
24
25
  const rect = dialog.getBoundingClientRect();
25
26
  return event.clientY >= rect.top && event.clientY <= rect.top + 48;
26
27
  },
@@ -52,6 +53,7 @@ var _BottomSheets = class _BottomSheets {
52
53
  /** Sets an .expandable sheet to its full height or back to partial, and tells its handle. */
53
54
  static setExpanded(dialog, expanded) {
54
55
  dialog.classList.toggle("expanded", expanded);
56
+ if (expanded) dialog.addEventListener("close", _BottomSheets._onClose, { once: true });
55
57
  dialog.querySelector(":scope > button.drag-handle")?.setAttribute("aria-expanded", String(expanded));
56
58
  }
57
59
  static _onClose(event) {
@@ -62,8 +64,8 @@ var _BottomSheets = class _BottomSheets {
62
64
  const handle = Utils.closestInPath(event, ".drag-handle");
63
65
  if (!(handle instanceof HTMLButtonElement)) return;
64
66
  if (event.detail !== 0 && _BottomSheets._dragged) return;
65
- const dialog = handle.closest(SHEET_SELECTOR);
66
- if (dialog instanceof HTMLDialogElement && dialog.open) _BottomSheets._activate(dialog);
67
+ const dialog = handle.parentElement;
68
+ if (dialog?.matches(`${SHEET_SELECTOR}[open]`)) _BottomSheets._activate(dialog);
67
69
  }
68
70
  /** The handle button switches an .expandable sheet's height, and closes any other. */
69
71
  static _activate(dialog) {
@@ -82,4 +84,4 @@ var BottomSheets = _BottomSheets;
82
84
  export {
83
85
  BottomSheets
84
86
  };
85
- //# sourceMappingURL=chunk-3L3QIYLC.mjs.map
87
+ //# sourceMappingURL=chunk-H5ISU45X.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/behaviors/bottomSheets.ts"],
4
+ "sourcesContent": ["import { DISMISS_DISTANCE, DISMISS_VELOCITY, installSheetDrag } from './sheetDrag';\nimport { Utils } from '../core/utils';\n\nconst SHEET_SELECTOR = 'dialog.bottom-sheet';\n/** Past this a drag up expands an .expandable sheet, in pixels; a drag down uses the dismissal distance. */\nconst RESIZE_DISTANCE = 48;\n\n/** Whether a drag went past `distance`, or flicked, down (1) or up (-1). */\nconst toward = (sign: 1 | -1, distance: number, delta: number, velocity: number) =>\n delta * sign > distance || velocity * sign > DISMISS_VELOCITY;\n\n/**\n * Drag-to-dismiss for `dialog.bottom-sheet`, and two heights for\n * `.expandable` sheets.\n *\n * The handle is the top 48dp of the sheet, or a `.drag-handle` directly in the\n * sheet. One deeper in belongs to its own control, such as a table column or a\n * sortable row. A downward drag past 96dp, or a flick, closes. Anything else\n * snaps back. Content below the handle scrolls normally. Light-dismiss on the\n * scrim stays with {@link Dialogs}.\n *\n * The drag itself is {@link installSheetDrag}, shared with the side sheet. What\n * is here is what is not shared: a handle written as a `<button>` also closes\n * the sheet when it is *activated*, which is what makes it reachable without a\n * pointer - dragging is a pointer gesture, so a control labelled \"Dismiss\" that\n * only answers a drag promises an action a keyboard user cannot perform. A\n * handle written as any other element is decoration and does nothing here -\n * Escape still closes the sheet either way, natively.\n *\n * An `.expandable` sheet opens partly expanded. A drag up, or a flick up,\n * expands it to its full height with `.expanded`; from there a drag down\n * collapses it, and a drag down from the partial height dismisses as usual.\n * Its handle button switches between the two heights instead of closing,\n * and carries `aria-expanded`. Closing the sheet puts it back to partial.\n */\nexport class BottomSheets {\n /**\n * Whether the last pointer sequence moved. A drag ends with a `click` on the\n * element it started on, so without this the tail of a drag that snapped back\n * would dismiss the sheet the drag had just declined to dismiss.\n */\n private static _dragged = false;\n\n static Init() {\n installSheetDrag({\n selector: SHEET_SELECTOR,\n axis: 'y',\n property: '--md-comp-bottom-sheet-shift',\n motion: '--md-comp-bottom-sheet-motion',\n direction: () => 1,\n inHandle: (event, dialog) => {\n const handle = Utils.closestInPath(event, '.drag-handle');\n if (handle) return handle.parentElement === dialog;\n const rect = dialog.getBoundingClientRect();\n return event.clientY >= rect.top && event.clientY <= rect.top + 48;\n },\n onPress: () => {\n BottomSheets._dragged = false;\n },\n onRelease: (dragged) => {\n BottomSheets._dragged = dragged;\n },\n release: (dialog, delta, velocity) => BottomSheets._resize(dialog, delta, velocity)\n });\n Utils.onDocumentReady(() => {\n document.addEventListener('click', BottomSheets._onClick);\n // close does not bubble, so it is caught on its way down.\n document.addEventListener('close', BottomSheets._onClose, true);\n });\n }\n\n /**\n * For an .expandable sheet, a drag up expands it and a drag down from\n * expanded collapses it. Returns whether the drag resized the sheet.\n */\n static _resize(dialog: HTMLDialogElement, delta: number, velocity: number): boolean {\n if (!dialog.classList.contains('expandable')) return false;\n const expanded = dialog.classList.contains('expanded');\n const next = expanded ? !toward(1, DISMISS_DISTANCE, delta, velocity) : toward(-1, RESIZE_DISTANCE, delta, velocity);\n if (next === expanded) return false;\n BottomSheets.setExpanded(dialog, next);\n return true;\n }\n\n /** Sets an .expandable sheet to its full height or back to partial, and tells its handle. */\n static setExpanded(dialog: HTMLDialogElement, expanded: boolean) {\n dialog.classList.toggle('expanded', expanded);\n // Close does not leave a shadow root, so the sheet listens as well as the document.\n if (expanded) dialog.addEventListener('close', BottomSheets._onClose, { once: true });\n dialog.querySelector(':scope > button.drag-handle')?.setAttribute('aria-expanded', String(expanded));\n }\n\n private static _onClose(event: Event) {\n const dialog = event.target as Element;\n if (dialog.matches?.(`${SHEET_SELECTOR}.expandable`)) BottomSheets.setExpanded(dialog as HTMLDialogElement, false);\n }\n\n static _onClick(event: MouseEvent) {\n const handle = Utils.closestInPath(event, '.drag-handle');\n // Only a <button> is a control. A decorative <span> in the same slot is\n // exactly what it looks like, and clicking it does nothing.\n if (!(handle instanceof HTMLButtonElement)) return;\n // `detail` is 0 when the click came from Enter or Space and >= 1 when a\n // pointer produced it, so the keyboard path is decided without consulting\n // pointer state at all - a stale drag can never swallow a key press.\n if (event.detail !== 0 && BottomSheets._dragged) return;\n const dialog = handle.parentElement;\n if (dialog?.matches(`${SHEET_SELECTOR}[open]`)) BottomSheets._activate(dialog as HTMLDialogElement);\n }\n\n /** The handle button switches an .expandable sheet's height, and closes any other. */\n private static _activate(dialog: HTMLDialogElement) {\n if (dialog.classList.contains('expandable')) BottomSheets.setExpanded(dialog, !dialog.classList.contains('expanded'));\n else dialog.close();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;AAGA,IAAM,iBAAiB;AAEvB,IAAM,kBAAkB;AAGxB,IAAM,SAAS,CAAC,MAAc,UAAkB,OAAe,aAC7D,QAAQ,OAAO,YAAY,WAAW,OAAO;AA0BxC,IAAM,gBAAN,MAAM,cAAa;AAAA,EAQxB,OAAO,OAAO;AACZ,qBAAiB;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW,MAAM;AAAA,MACjB,UAAU,CAAC,OAAO,WAAW;AAC3B,cAAM,SAAS,MAAM,cAAc,OAAO,cAAc;AACxD,YAAI,OAAQ,QAAO,OAAO,kBAAkB;AAC5C,cAAM,OAAO,OAAO,sBAAsB;AAC1C,eAAO,MAAM,WAAW,KAAK,OAAO,MAAM,WAAW,KAAK,MAAM;AAAA,MAClE;AAAA,MACA,SAAS,MAAM;AACb,sBAAa,WAAW;AAAA,MAC1B;AAAA,MACA,WAAW,CAAC,YAAY;AACtB,sBAAa,WAAW;AAAA,MAC1B;AAAA,MACA,SAAS,CAAC,QAAQ,OAAO,aAAa,cAAa,QAAQ,QAAQ,OAAO,QAAQ;AAAA,IACpF,CAAC;AACD,UAAM,gBAAgB,MAAM;AAC1B,eAAS,iBAAiB,SAAS,cAAa,QAAQ;AAExD,eAAS,iBAAiB,SAAS,cAAa,UAAU,IAAI;AAAA,IAChE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAQ,QAA2B,OAAe,UAA2B;AAClF,QAAI,CAAC,OAAO,UAAU,SAAS,YAAY,EAAG,QAAO;AACrD,UAAM,WAAW,OAAO,UAAU,SAAS,UAAU;AACrD,UAAM,OAAO,WAAW,CAAC,OAAO,GAAG,kBAAkB,OAAO,QAAQ,IAAI,OAAO,IAAI,iBAAiB,OAAO,QAAQ;AACnH,QAAI,SAAS,SAAU,QAAO;AAC9B,kBAAa,YAAY,QAAQ,IAAI;AACrC,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,YAAY,QAA2B,UAAmB;AAC/D,WAAO,UAAU,OAAO,YAAY,QAAQ;AAE5C,QAAI,SAAU,QAAO,iBAAiB,SAAS,cAAa,UAAU,EAAE,MAAM,KAAK,CAAC;AACpF,WAAO,cAAc,6BAA6B,GAAG,aAAa,iBAAiB,OAAO,QAAQ,CAAC;AAAA,EACrG;AAAA,EAEA,OAAe,SAAS,OAAc;AACpC,UAAM,SAAS,MAAM;AACrB,QAAI,OAAO,UAAU,GAAG,cAAc,aAAa,EAAG,eAAa,YAAY,QAA6B,KAAK;AAAA,EACnH;AAAA,EAEA,OAAO,SAAS,OAAmB;AACjC,UAAM,SAAS,MAAM,cAAc,OAAO,cAAc;AAGxD,QAAI,EAAE,kBAAkB,mBAAoB;AAI5C,QAAI,MAAM,WAAW,KAAK,cAAa,SAAU;AACjD,UAAM,SAAS,OAAO;AACtB,QAAI,QAAQ,QAAQ,GAAG,cAAc,QAAQ,EAAG,eAAa,UAAU,MAA2B;AAAA,EACpG;AAAA;AAAA,EAGA,OAAe,UAAU,QAA2B;AAClD,QAAI,OAAO,UAAU,SAAS,YAAY,EAAG,eAAa,YAAY,QAAQ,CAAC,OAAO,UAAU,SAAS,UAAU,CAAC;AAAA,QAC/G,QAAO,MAAM;AAAA,EACpB;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAhFa,cAMI,WAAW;AANrB,IAAM,eAAN;",
6
+ "names": []
7
+ }
@@ -2,17 +2,18 @@ import {
2
2
  ModalDisplayPlugin,
3
3
  createDisplayPlugin,
4
4
  hideModal
5
- } from "./chunk-OUCHKSAW.mjs";
5
+ } from "./chunk-B55LWKBM.mjs";
6
6
  import {
7
7
  FormSelect
8
- } from "./chunk-EVCVFEV3.mjs";
8
+ } from "./chunk-XJPMW5SP.mjs";
9
9
  import {
10
10
  Component
11
- } from "./chunk-CMGXGYUC.mjs";
11
+ } from "./chunk-EB2V4OKL.mjs";
12
12
  import {
13
13
  Utils,
14
+ afterFormReset,
14
15
  pickerFooter
15
- } from "./chunk-ZVLOUDIJ.mjs";
16
+ } from "./chunk-67UNY7RH.mjs";
16
17
 
17
18
  // src/ts/components/datepicker.ts
18
19
  var MONTHS = Array.from({ length: 12 }, (_, month) => new Date(Date.UTC(2023, month, 1)));
@@ -194,7 +195,6 @@ var _Datepicker = class _Datepicker extends Component {
194
195
  this.multiple = false;
195
196
  /** What setInputValue last wrote, so reading it back does not depend on the parser. */
196
197
  this._writtenInputs = /* @__PURE__ */ new WeakMap();
197
- this._form = null;
198
198
  this._resetDates = /* @__PURE__ */ new WeakMap();
199
199
  // Counts selections, so a callback that selects again silences the stale event.
200
200
  this._selection = 0;
@@ -207,12 +207,14 @@ var _Datepicker = class _Datepicker extends Component {
207
207
  /** id linking the controls element to the table's aria-labelledby. */
208
208
  this._randId = null;
209
209
  this._focusedDate = null;
210
+ // Bound to the date inputs only, so the target is one of them.
210
211
  this._handleInputClick = (e) => {
211
- if (e.target.type == "date" && (this.options.openByDefault || this.options.container)) e.preventDefault();
212
+ const input = e.target;
213
+ if (input.type == "date" && (this.options.openByDefault || this.options.container)) e.preventDefault();
212
214
  this._batchDraws(() => {
213
- this.setDateFromInput(e.target);
215
+ this.setDateFromInput(input);
214
216
  this.draw();
215
- this.gotoDate(e.target === this.el ? this.date : this.endDate);
217
+ this.gotoDate(input === this.el ? this.date : this.endDate);
216
218
  });
217
219
  this._showDisplay();
218
220
  if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);
@@ -270,13 +272,13 @@ var _Datepicker = class _Datepicker extends Component {
270
272
  };
271
273
  this._handleCalendarClick = (e) => {
272
274
  const target = e.target;
273
- if (target.classList.contains("is-disabled")) return;
275
+ if (target.closest(".is-disabled")) return;
274
276
  this._batchDraws(() => {
275
277
  if (target.classList.contains("datepicker-day-button") && !target.classList.contains("is-empty") && !target.parentElement.classList.contains("is-disabled") && !target.parentElement.classList.contains("is-selection-disabled")) {
276
278
  const selectedDate = new Date(
277
- e.target.getAttribute("data-year"),
278
- e.target.getAttribute("data-month"),
279
- e.target.getAttribute("data-day")
279
+ Number(target.getAttribute("data-year")),
280
+ Number(target.getAttribute("data-month")),
281
+ Number(target.getAttribute("data-day"))
280
282
  );
281
283
  if (!this.multiple || this.options.isMultipleSelection) {
282
284
  this.setDate(selectedDate);
@@ -294,18 +296,17 @@ var _Datepicker = class _Datepicker extends Component {
294
296
  };
295
297
  this._handleDateRangeCalendarClick = (date) => {
296
298
  if (this.endDate == null || !_Datepicker._compareDates(date, this.endDate)) {
297
- if (_Datepicker._isDate(this.date) && date < this.date) {
298
- return;
299
- }
300
- this.setDate(date, false, _Datepicker._isDate(this.date));
299
+ this.setDate(date, false, _Datepicker._isDate(this.date) && date >= this.date);
301
300
  return;
302
301
  }
303
302
  this._clearDates();
304
303
  this.draw();
305
304
  };
305
+ // Like a day click: a picker with Ok and Cancel, which a modal always is,
306
+ // writes the cleared input on Ok, so Cancel keeps the value.
306
307
  this._handleClearClick = () => {
307
308
  this._clearDates();
308
- this.setInputValues();
309
+ if (this.options.autoSubmit) this._finishSelection();
309
310
  };
310
311
  this._clearDates = () => {
311
312
  this.date = null;
@@ -322,17 +323,13 @@ var _Datepicker = class _Datepicker extends Component {
322
323
  // A reset restores the inputs' values after its event, without a change
323
324
  // event. Drop the inputs added for extra dates and read the selection back
324
325
  // from what the reset left.
325
- this._handleFormReset = (e) => {
326
- clearTimeout(this._resetTimer);
327
- this._resetTimer = setTimeout(() => {
328
- if (e.defaultPrevented) return;
329
- if (this.options.isMultipleSelection) this._readBackMultiple();
330
- else this._readBackSingle();
331
- this.draw();
332
- });
326
+ this._readBack = () => {
327
+ if (this.options.isMultipleSelection) this._readBackMultiple();
328
+ else this._readBackSingle();
329
+ this.draw();
333
330
  };
334
331
  this._handleInputChange = (e) => {
335
- if (e["detail"]?.firedBy === this) return;
332
+ if (e instanceof CustomEvent && e.detail?.firedBy === this) return;
336
333
  this.setDateFromInput(e.target);
337
334
  };
338
335
  this._finishSelection = () => {
@@ -348,9 +345,7 @@ var _Datepicker = class _Datepicker extends Component {
348
345
  this._notify("cancel", this.options.onCancel, { args: [] });
349
346
  };
350
347
  if (this.options.displayPlugin === "modal") Object.assign(this.options, { openByDefault: true, autoSubmit: false });
351
- const { minDate, maxDate } = this.options;
352
- if (minDate) this.options.minDate = new Date(new Date(minDate.getTime()).setHours(0, 0, 0, 0));
353
- if (maxDate) this.options.maxDate = new Date(new Date(maxDate.getTime()).setHours(0, 0, 0, 0));
348
+ this._setDateBounds();
354
349
  this.id = Utils.guid();
355
350
  if (this.options.isMultipleSelection) {
356
351
  this.multiple = true;
@@ -372,10 +367,10 @@ var _Datepicker = class _Datepicker extends Component {
372
367
  } else if (fromValue && this._isSelectableDay(defDate)) {
373
368
  this.setDate(defDate, true);
374
369
  } else {
375
- this.gotoDate(defDate);
370
+ this.gotoDate(this._withinBounds(defDate));
376
371
  }
377
372
  } else {
378
- this.gotoDate(/* @__PURE__ */ new Date());
373
+ this.gotoDate(this._withinBounds(/* @__PURE__ */ new Date()));
379
374
  }
380
375
  if (this.options.isDateRange) {
381
376
  this.multiple = true;
@@ -448,7 +443,6 @@ var _Datepicker = class _Datepicker extends Component {
448
443
  }
449
444
  destroy() {
450
445
  this._events.abort();
451
- clearTimeout(this._resetTimer);
452
446
  this.dateEls?.slice(1).forEach((input) => this._removeDateInput(input));
453
447
  if (!this.options.dateRangeEndEl && this.endDateEl) this._removeDateInput(this.endDateEl);
454
448
  this.displayPlugin?.destroy();
@@ -477,7 +471,7 @@ var _Datepicker = class _Datepicker extends Component {
477
471
  this.endDateEl = this.createDateInput();
478
472
  this.endDateEl.classList.add("datepicker-end-date");
479
473
  } else {
480
- this.endDateEl = document.querySelector(this.options.dateRangeEndEl);
474
+ this.endDateEl = Utils.querySelector(this.el, this.options.dateRangeEndEl);
481
475
  if (!this.endDateEl) {
482
476
  console.warn("Specified date range end input element in dateRangeEndEl not found");
483
477
  } else {
@@ -486,10 +480,11 @@ var _Datepicker = class _Datepicker extends Component {
486
480
  }
487
481
  }
488
482
  pickerFooter(this.footer, this.options, "datepicker-clear", this._handleClearClick, this._confirm, this._cancel);
489
- if (this.options.container) {
490
- const optEl = this.options.container;
491
- this.options.container = optEl instanceof HTMLElement ? optEl : document.querySelector(optEl);
492
- this.options.container.append(this.containerEl);
483
+ const optEl = this.options.container;
484
+ const container = typeof optEl === "string" ? Utils.querySelector(this.el, optEl) : optEl;
485
+ if (container) {
486
+ this.options.container = container;
487
+ container.append(this.containerEl);
493
488
  } else {
494
489
  const appendTo = !this.endDateEl ? this.el : this.endDateEl;
495
490
  if (!this.options.openByDefault) this.containerEl.setAttribute("style", "display: none; visibility: hidden;");
@@ -541,8 +536,13 @@ var _Datepicker = class _Datepicker extends Component {
541
536
  this.setInputValue(el, this._selectedDateFor(el));
542
537
  return;
543
538
  }
539
+ const unchanged = this._shows(el, date);
544
540
  this._selectTypedMultiDate(el, date);
545
- this.setDate(date, false, isEndDate, true);
541
+ this.setDate(date, unchanged, isEndDate, true);
542
+ }
543
+ /** Whether `date` is the date already selected for `el`. */
544
+ _shows(el, date) {
545
+ return this._selectedDateFor(el)?.getTime() === date.getTime();
546
546
  }
547
547
  // setDate does not toggle a typed date into a multiple selection, so it goes
548
548
  // in here, in place of the date its input showed. Re-reading an input on
@@ -584,6 +584,10 @@ var _Datepicker = class _Datepicker extends Component {
584
584
  if (!_Datepicker._isDate(date)) {
585
585
  return;
586
586
  }
587
+ return this._withinBounds(date);
588
+ }
589
+ /** A copy of `date`, moved to minDate or maxDate when it falls outside them. */
590
+ _withinBounds(date) {
587
591
  const min = this.options.minDate, max = this.options.maxDate;
588
592
  if (_Datepicker._isDate(min) && date < min) {
589
593
  date = min;
@@ -839,7 +843,7 @@ var _Datepicker = class _Datepicker extends Component {
839
843
  }
840
844
  }
841
845
  for (const [property, className] of Object.entries(classMap)) {
842
- if (opts.hasOwnProperty(property) && opts[property]) {
846
+ if (opts[property]) {
843
847
  arr.push(className);
844
848
  }
845
849
  }
@@ -911,6 +915,24 @@ var _Datepicker = class _Datepicker extends Component {
911
915
  * Depends on the month, which is deliberately *not* part of the controls
912
916
  * cache key - so the reuse path has to recompute and reapply it.
913
917
  */
918
+ /**
919
+ * Removes the time from minDate and maxDate, on copies: the caller's Date
920
+ * objects are theirs. Each also sets the month and year bounds, which the
921
+ * arrows, the month and year lists and PageUp/PageDown read. They used to
922
+ * stay at their defaults, so the calendar paged into months where every
923
+ * day was disabled.
924
+ */
925
+ _setDateBounds() {
926
+ const { minDate, maxDate } = this.options;
927
+ if (minDate) {
928
+ this.options.minDate = new Date(new Date(minDate.getTime()).setHours(0, 0, 0, 0));
929
+ Object.assign(this.options, { minYear: minDate.getFullYear(), minMonth: minDate.getMonth() });
930
+ }
931
+ if (maxDate) {
932
+ this.options.maxDate = new Date(new Date(maxDate.getTime()).setHours(0, 0, 0, 0));
933
+ Object.assign(this.options, { maxYear: maxDate.getFullYear(), maxMonth: maxDate.getMonth() });
934
+ }
935
+ }
914
936
  _arrowState(year, month) {
915
937
  const opts = this.options;
916
938
  const isMinYear = year === opts.minYear;
@@ -1092,9 +1114,8 @@ var _Datepicker = class _Datepicker extends Component {
1092
1114
  _setupEventHandlers() {
1093
1115
  this._addInputEventHandlers(this.el);
1094
1116
  if (this.endDateEl) this._addInputEventHandlers(this.endDateEl);
1095
- this._form = this.el.form;
1096
1117
  const { signal } = this._events;
1097
- this._form?.addEventListener("reset", this._handleFormReset, { signal });
1118
+ afterFormReset(this.el, this._readBack, signal);
1098
1119
  this.calendarEl.addEventListener("click", this._handleCalendarClick, { signal });
1099
1120
  this.calendarEl.addEventListener("keydown", this._handleCalendarKeydown, { signal });
1100
1121
  this.calendarEl.addEventListener("focusin", this._handleCalendarFocus, { signal });
@@ -1146,15 +1167,15 @@ var _Datepicker = class _Datepicker extends Component {
1146
1167
  }
1147
1168
  // change view to a specific month (zero-index, e.g. 0: January)
1148
1169
  gotoMonth(month) {
1149
- if (!isNaN(month)) {
1150
- this.calendars[0].month = parseInt(month, 10);
1170
+ if (!isNaN(Number(month))) {
1171
+ this.calendars[0].month = parseInt(String(month), 10);
1151
1172
  this.adjustCalendars();
1152
1173
  }
1153
1174
  }
1154
1175
  // change view to a specific full year (e.g. "2012")
1155
1176
  gotoYear(year) {
1156
- if (!isNaN(year)) {
1157
- this.calendars[0].year = parseInt(year, 10);
1177
+ if (!isNaN(Number(year))) {
1178
+ this.calendars[0].year = parseInt(String(year), 10);
1158
1179
  this.adjustCalendars();
1159
1180
  }
1160
1181
  }
@@ -1207,4 +1228,4 @@ export {
1207
1228
  readDate,
1208
1229
  Datepicker
1209
1230
  };
1210
- //# sourceMappingURL=chunk-QXKWVHBD.mjs.map
1231
+ //# sourceMappingURL=chunk-H6YIKFAQ.mjs.map