@expressivecss/expressive 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/CHANGELOG.md +1589 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19304 -12021
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10333 -4070
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10333 -4070
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -25
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +184 -69
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +133 -64
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +9 -0
  274. package/dist/js/internal/components/keypad.mjs.map +7 -0
  275. package/dist/js/internal/components/lightbox.mjs +3 -3
  276. package/dist/js/internal/components/lineChart.mjs +29 -4
  277. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  278. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  279. package/dist/js/internal/components/mapView.mjs +3 -3
  280. package/dist/js/internal/components/menu.mjs +3 -3
  281. package/dist/js/internal/components/menubar.mjs +10 -0
  282. package/dist/js/internal/components/menubar.mjs.map +7 -0
  283. package/dist/js/internal/components/messageScroller.mjs +3 -3
  284. package/dist/js/internal/components/mixedChart.mjs +5 -4
  285. package/dist/js/internal/components/navigationRail.mjs +3 -2
  286. package/dist/js/internal/components/particles.mjs +3 -2
  287. package/dist/js/internal/components/pieChart.mjs +4 -3
  288. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  289. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  290. package/dist/js/internal/components/questionnaire.mjs +3 -3
  291. package/dist/js/internal/components/radarChart.mjs +4 -3
  292. package/dist/js/internal/components/radialChart.mjs +4 -3
  293. package/dist/js/internal/components/registry.mjs +59 -40
  294. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  295. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  296. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  297. package/dist/js/internal/components/scatterChart.mjs +10 -0
  298. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  299. package/dist/js/internal/components/scrollspy.mjs +3 -2
  300. package/dist/js/internal/components/select.mjs +4 -4
  301. package/dist/js/internal/components/showMore.mjs +9 -0
  302. package/dist/js/internal/components/showMore.mjs.map +7 -0
  303. package/dist/js/internal/components/slider.mjs +3 -3
  304. package/dist/js/internal/components/snackbar.mjs +2 -2
  305. package/dist/js/internal/components/swipeActions.mjs +9 -0
  306. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  307. package/dist/js/internal/components/tabs.mjs +3 -4
  308. package/dist/js/internal/components/timepicker.mjs +5 -4
  309. package/dist/js/internal/components/tooltip.mjs +3 -3
  310. package/dist/js/internal/components/treeSelect.mjs +13 -0
  311. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  312. package/dist/js/internal/components/treemapChart.mjs +10 -0
  313. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  314. package/dist/js/internal/core/component.mjs +2 -1
  315. package/dist/js/internal/core/formControl.mjs +12 -0
  316. package/dist/js/internal/core/formControl.mjs.map +7 -0
  317. package/dist/js/internal/core/spring.mjs +11 -0
  318. package/dist/js/internal/core/spring.mjs.map +7 -0
  319. package/dist/js/internal/core/utils.mjs +11 -3
  320. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  322. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  323. package/dist/js/modular.mjs +175 -69
  324. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  325. package/dist/types/behaviors/copy.d.ts +18 -0
  326. package/dist/types/behaviors/dataTables.d.ts +129 -0
  327. package/dist/types/behaviors/dialogs.d.ts +27 -1
  328. package/dist/types/behaviors/forms.d.ts +68 -2
  329. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  330. package/dist/types/behaviors/lists.d.ts +12 -0
  331. package/dist/types/behaviors/paneResize.d.ts +29 -0
  332. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  333. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  334. package/dist/types/behaviors/sortable.d.ts +28 -0
  335. package/dist/types/behaviors/theme.d.ts +22 -0
  336. package/dist/types/behaviors/tour.d.ts +36 -0
  337. package/dist/types/behaviors/transferList.d.ts +51 -0
  338. package/dist/types/components/appBar.d.ts +5 -6
  339. package/dist/types/components/autocomplete.d.ts +92 -17
  340. package/dist/types/components/backToTop.d.ts +36 -0
  341. package/dist/types/components/barChart.d.ts +3 -6
  342. package/dist/types/components/buttonGroup.d.ts +2 -4
  343. package/dist/types/components/buttons.d.ts +5 -5
  344. package/dist/types/components/cards.d.ts +3 -16
  345. package/dist/types/components/carousel.d.ts +9 -15
  346. package/dist/types/components/cascader.d.ts +130 -0
  347. package/dist/types/components/characterCounter.d.ts +2 -15
  348. package/dist/types/components/chips.d.ts +65 -19
  349. package/dist/types/components/colorPicker.d.ts +42 -0
  350. package/dist/types/components/columnChart.d.ts +23 -10
  351. package/dist/types/components/commandPalette.d.ts +11 -16
  352. package/dist/types/components/confetti.d.ts +2 -4
  353. package/dist/types/components/currencyInput.d.ts +59 -0
  354. package/dist/types/components/datepicker.d.ts +59 -36
  355. package/dist/types/components/expandingCard.d.ts +6 -6
  356. package/dist/types/components/funnelChart.d.ts +38 -0
  357. package/dist/types/components/heatmapChart.d.ts +39 -8
  358. package/dist/types/components/hoverCard.d.ts +58 -0
  359. package/dist/types/components/index.d.ts +17 -1
  360. package/dist/types/components/inputMask.d.ts +30 -0
  361. package/dist/types/components/keypad.d.ts +66 -0
  362. package/dist/types/components/lightbox.d.ts +17 -25
  363. package/dist/types/components/lineChart.d.ts +176 -10
  364. package/dist/types/components/loadingOverlay.d.ts +42 -0
  365. package/dist/types/components/mapView.d.ts +26 -17
  366. package/dist/types/components/menu.d.ts +61 -22
  367. package/dist/types/components/menubar.d.ts +37 -0
  368. package/dist/types/components/messageScroller.d.ts +2 -14
  369. package/dist/types/components/mixedChart.d.ts +15 -6
  370. package/dist/types/components/navigationRail.d.ts +16 -5
  371. package/dist/types/components/particles.d.ts +8 -4
  372. package/dist/types/components/pieChart.d.ts +32 -7
  373. package/dist/types/components/pullToRefresh.d.ts +80 -0
  374. package/dist/types/components/questionnaire.d.ts +58 -16
  375. package/dist/types/components/radarChart.d.ts +10 -6
  376. package/dist/types/components/radialChart.d.ts +58 -8
  377. package/dist/types/components/registry.d.ts +77 -3
  378. package/dist/types/components/richTextEditor.d.ts +6 -14
  379. package/dist/types/components/sankeyChart.d.ts +72 -0
  380. package/dist/types/components/scatterChart.d.ts +102 -0
  381. package/dist/types/components/scrollspy.d.ts +3 -5
  382. package/dist/types/components/select.d.ts +43 -30
  383. package/dist/types/components/showMore.d.ts +51 -0
  384. package/dist/types/components/slider.d.ts +5 -15
  385. package/dist/types/components/snackbar.d.ts +62 -0
  386. package/dist/types/components/swipeActions.d.ts +81 -0
  387. package/dist/types/components/tabs.d.ts +93 -27
  388. package/dist/types/components/timepicker.d.ts +114 -20
  389. package/dist/types/components/tooltip.d.ts +56 -20
  390. package/dist/types/components/treeSelect.d.ts +106 -0
  391. package/dist/types/components/treemapChart.d.ts +56 -0
  392. package/dist/types/core/component.d.ts +43 -25
  393. package/dist/types/core/formControl.d.ts +21 -0
  394. package/dist/types/core/spring.d.ts +20 -0
  395. package/dist/types/core/utils.d.ts +85 -72
  396. package/dist/types/modular.d.ts +33 -1
  397. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
  398. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  399. package/package.json +10 -8
  400. package/src/sass/README.md +27 -18
  401. package/src/sass/abstracts/_breakpoints.scss +0 -1
  402. package/src/sass/abstracts/_elevation.scss +13 -7
  403. package/src/sass/abstracts/_index.scss +1 -0
  404. package/src/sass/abstracts/_mixins.scss +438 -92
  405. package/src/sass/abstracts/_spring.scss +63 -0
  406. package/src/sass/abstracts/_variables.scss +43 -15
  407. package/src/sass/base/_fonts.scss +61 -48
  408. package/src/sass/base/_global.scss +105 -34
  409. package/src/sass/base/_index.scss +3 -1
  410. package/src/sass/base/_normalize.scss +59 -114
  411. package/src/sass/base/_print.scss +21 -0
  412. package/src/sass/base/_prose.scss +68 -0
  413. package/src/sass/base/_typography.scss +9 -5
  414. package/src/sass/components/_accordion.scss +9 -16
  415. package/src/sass/components/_alert.scss +102 -0
  416. package/src/sass/components/_aura.scss +8 -3
  417. package/src/sass/components/_avatar.scss +3 -3
  418. package/src/sass/components/_back-to-top.scss +38 -0
  419. package/src/sass/components/_badges.scss +7 -13
  420. package/src/sass/components/_bar-chart.scss +41 -19
  421. package/src/sass/components/_bottom-sheet.scss +44 -16
  422. package/src/sass/components/_breadcrumb.scss +8 -1
  423. package/src/sass/components/_button-groups.scss +44 -89
  424. package/src/sass/components/_buttons.scss +156 -63
  425. package/src/sass/components/_calendar.scss +246 -0
  426. package/src/sass/components/_cards.scss +41 -68
  427. package/src/sass/components/_carousel.scss +43 -158
  428. package/src/sass/components/_cascader.scss +142 -0
  429. package/src/sass/components/_chips.scss +36 -52
  430. package/src/sass/components/_column-chart.scss +19 -12
  431. package/src/sass/components/_command-palette.scss +4 -7
  432. package/src/sass/components/_confetti.scss +0 -2
  433. package/src/sass/components/_countdown.scss +1 -1
  434. package/src/sass/components/_data-table.scss +162 -27
  435. package/src/sass/components/_datepicker.scss +57 -62
  436. package/src/sass/components/_description-list.scss +85 -0
  437. package/src/sass/components/_dialog.scss +42 -44
  438. package/src/sass/components/_docked-display.scss +1 -3
  439. package/src/sass/components/_drag-handle.scss +16 -20
  440. package/src/sass/components/_expanding-card.scss +20 -9
  441. package/src/sass/components/_fab-menu.scss +44 -32
  442. package/src/sass/components/_funnel-chart.scss +124 -0
  443. package/src/sass/components/_heatmap-chart.scss +113 -24
  444. package/src/sass/components/_icon-buttons.scss +7 -8
  445. package/src/sass/components/_icons-material-design.scss +2 -2
  446. package/src/sass/components/_image-compare.scss +108 -0
  447. package/src/sass/components/_index.scss +21 -0
  448. package/src/sass/components/_keypad.scss +182 -0
  449. package/src/sass/components/_kpi.scss +6 -11
  450. package/src/sass/components/_lightbox.scss +26 -20
  451. package/src/sass/components/_line-chart.scss +16 -2
  452. package/src/sass/components/_list.scss +59 -14
  453. package/src/sass/components/_loading-indicator.scss +1 -0
  454. package/src/sass/components/_loading-overlay.scss +105 -0
  455. package/src/sass/components/_map.scss +35 -13
  456. package/src/sass/components/_marquee.scss +3 -2
  457. package/src/sass/components/_mega-menu.scss +137 -0
  458. package/src/sass/components/_menu.scss +159 -182
  459. package/src/sass/components/_menubar.scss +59 -0
  460. package/src/sass/components/_message-scroller.scss +2 -2
  461. package/src/sass/components/_message.scss +3 -3
  462. package/src/sass/components/_mixed-chart.scss +37 -9
  463. package/src/sass/components/_modal-display.scss +21 -0
  464. package/src/sass/components/_navbar.scss +43 -65
  465. package/src/sass/components/_navigation-bar.scss +15 -77
  466. package/src/sass/components/_navigation-rail.scss +171 -121
  467. package/src/sass/components/_org-chart.scss +192 -0
  468. package/src/sass/components/_page-footer.scss +16 -13
  469. package/src/sass/components/_pagination.scss +6 -13
  470. package/src/sass/components/_panes.scss +33 -31
  471. package/src/sass/components/_particles.scss +0 -2
  472. package/src/sass/components/_pie-chart.scss +91 -11
  473. package/src/sass/components/_popover.scss +18 -5
  474. package/src/sass/components/_progress.scss +158 -35
  475. package/src/sass/components/_pull-to-refresh.scss +90 -0
  476. package/src/sass/components/_questionnaire.scss +74 -3
  477. package/src/sass/components/_radar-chart.scss +38 -10
  478. package/src/sass/components/_radial-chart.scss +113 -5
  479. package/src/sass/components/_rich-text-editor.scss +2 -2
  480. package/src/sass/components/_sankey-chart.scss +114 -0
  481. package/src/sass/components/_scatter-chart.scss +153 -0
  482. package/src/sass/components/_scrim.scss +0 -2
  483. package/src/sass/components/_scrollspy.scss +0 -2
  484. package/src/sass/components/_search.scss +26 -22
  485. package/src/sass/components/_show-more.scss +8 -0
  486. package/src/sass/components/_side-sheet.scss +23 -40
  487. package/src/sass/components/_skeleton.scss +2 -4
  488. package/src/sass/components/_snackbar.scss +27 -21
  489. package/src/sass/components/_split-button.scss +5 -5
  490. package/src/sass/components/_stat.scss +3 -8
  491. package/src/sass/components/_stepper.scss +1 -5
  492. package/src/sass/components/_swipe-actions.scss +71 -0
  493. package/src/sass/components/_tabs.scss +51 -32
  494. package/src/sass/components/_timeline.scss +12 -12
  495. package/src/sass/components/_timepicker.scss +111 -112
  496. package/src/sass/components/_toolbar.scss +35 -47
  497. package/src/sass/components/_tooltip.scss +21 -12
  498. package/src/sass/components/_tour.scss +89 -0
  499. package/src/sass/components/_transfer-list.scss +73 -0
  500. package/src/sass/components/_transitions.scss +4 -4
  501. package/src/sass/components/_tree.scss +3 -16
  502. package/src/sass/components/_treemap-chart.scss +122 -0
  503. package/src/sass/components/forms/_checkboxes.scss +140 -86
  504. package/src/sass/components/forms/_color-picker.scss +135 -0
  505. package/src/sass/components/forms/_color-swatches.scss +85 -0
  506. package/src/sass/components/forms/_drop-zone.scss +15 -9
  507. package/src/sass/components/forms/_fieldset.scss +10 -10
  508. package/src/sass/components/forms/_file-input.scss +6 -9
  509. package/src/sass/components/forms/_index.scss +3 -1
  510. package/src/sass/components/forms/_input-fields.scss +254 -90
  511. package/src/sass/components/forms/_radio-buttons.scss +40 -127
  512. package/src/sass/components/forms/_rating.scss +2 -32
  513. package/src/sass/components/forms/_select.scss +199 -23
  514. package/src/sass/components/forms/_slider.scss +140 -330
  515. package/src/sass/components/forms/_switches.scss +53 -164
  516. package/src/sass/custom.scss +10 -1
  517. package/src/sass/expressive.scss +3 -63
  518. package/src/sass/tokens/_contrast.scss +94 -0
  519. package/src/sass/tokens/_elevation.scss +16 -0
  520. package/src/sass/tokens/_index.scss +5 -0
  521. package/src/sass/tokens/_motion.scss +109 -0
  522. package/src/sass/tokens/_reference.scss +72 -141
  523. package/src/sass/tokens/_shape.scss +38 -0
  524. package/src/sass/tokens/_stacking.scss +27 -0
  525. package/src/sass/tokens/_state.scss +2 -4
  526. package/src/sass/tokens/_theme.scss +11 -2
  527. package/src/sass/tokens/_vibrant.scss +2 -5
  528. package/src/sass/utilities/_colors.scss +6 -1
  529. package/src/sass/utilities/_defer-render.scss +17 -0
  530. package/src/sass/utilities/_helpers.scss +183 -26
  531. package/src/sass/utilities/_index.scss +2 -1
  532. package/src/sass/utilities/_scroll-area.scss +0 -2
  533. package/src/sass/utilities/_spacing.scss +52 -34
  534. package/src/sass/utilities/_typescale.scss +8 -1
  535. package/src/sass/utilities/_visibility.scss +47 -76
  536. package/src/sass/utilities/_z-depth.scss +7 -4
  537. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  540. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
  541. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
  543. package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
  544. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
  547. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
  551. package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
  558. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
  560. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
  562. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  565. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
  568. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
  570. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
  572. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
  574. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
  578. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
  582. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
  584. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
  586. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  587. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
  589. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
  594. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
  596. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
  599. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  603. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/select.ts"],
4
- "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n menuOptions: {}\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** The generated menu element. */\n menuEl: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the menu plugin for this select. */\n menu: Menu;\n /** The field wrapper around the native select. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n private _values: ValueStruct[];\n private _createdWrapper: boolean;\n private _originalLabels = new Map<HTMLLabelElement, { for: string | null; id: string | null }>();\n private _labelPlaceholder: Comment;\n private _form: HTMLFormElement | null;\n private _resetTimer: ReturnType<typeof setTimeout>;\n private _validationMessage: HTMLElement | null = null;\n nativeTabIndex: number;\n\n constructor(el: HTMLSelectElement, options: FormSelectOptions) {\n super(el, options, FormSelect);\n if (this.el.classList.contains('browser-default')) return;\n this.el['Expressive_FormSelect'] = this;\n\n this.options = {\n ...FormSelect.defaults,\n ...options\n };\n\n this.isMultiple = this.el.multiple;\n this.nativeTabIndex = this.el.tabIndex ?? -1;\n this.el.tabIndex = -1;\n this._values = [];\n this._createdWrapper = false;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of FormSelect.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLSelectElement, options?: Partial<FormSelectOptions>): FormSelect;\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLSelectElement | InitElement>,\n options?: Partial<FormSelectOptions>\n ): FormSelect[];\n /**\n * Initializes instances of FormSelect.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLSelectElement | InitElements<HTMLSelectElement | InitElement>,\n options: Partial<FormSelectOptions> = {}\n ): FormSelect | FormSelect[] {\n return super.init(els, options, FormSelect);\n }\n\n static getInstance(el: HTMLElement): FormSelect {\n return el['Expressive_FormSelect'];\n }\n\n destroy() {\n this._removeEventHandlers();\n this._clearValidationError();\n // The Menu holds itself in the static Menu._menus registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.menu?.destroy();\n this._removeMenu();\n this.el.tabIndex = this.nativeTabIndex;\n this.el['Expressive_FormSelect'] = undefined;\n }\n\n /**\n * Re-read the native `<select>` and update the generated menu to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Adding or removing `<option>`s also requires this \u2014 the menu is\n * rebuilt from the native list, the field and Menu instance stay put.\n */\n refresh() {\n if (!this.menuEl) return;\n this._bindForm();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = this._values.find(value => value.optionEl.contains(root.activeElement))?.el;\n this.input.disabled = this.el.matches(':disabled');\n this.wrapper.classList.toggle('disabled', this.input.disabled);\n if (this.input.disabled) this.menu?.close();\n else if (!this.menu) this._initMenu();\n this.input.removeAttribute('aria-activedescendant');\n this._rebuildOptions();\n this._handleSelectChange();\n if (this.menu) this.menu.focusedIndex = -1;\n if (this.menu?.isOpen) {\n this.menu.recalculateDimensions();\n if (focused) (this._values.find(value => value.el === focused)?.optionEl ?? this.input).focus();\n }\n }\n\n _setupEventHandlers() {\n this._setupOptionHandlers();\n this.el.addEventListener('change', this._handleSelectChange);\n this.el.addEventListener('invalid', this._handleInvalid);\n this.el.addEventListener('focus', this._handleNativeFocus);\n this.input.addEventListener('click', this._handleInputClick);\n this.menuEl.addEventListener('focusin', this._handleOptionFocus);\n this._bindForm();\n }\n\n private _bindForm() {\n this._form?.removeEventListener('reset', this._handleReset);\n this._form = this.el.form;\n this._form?.addEventListener('reset', this._handleReset);\n }\n\n _removeEventHandlers() {\n this._removeOptionHandlers();\n this.el.removeEventListener('change', this._handleSelectChange);\n this.el.removeEventListener('invalid', this._handleInvalid);\n this.el.removeEventListener('focus', this._handleNativeFocus);\n this.input?.removeEventListener('click', this._handleInputClick);\n this.menuEl?.removeEventListener('focusin', this._handleOptionFocus);\n this._form?.removeEventListener('reset', this._handleReset);\n clearTimeout(this._resetTimer);\n }\n\n private _setupOptionHandlers() {\n this.menuEl.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick);\n el.addEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n private _removeOptionHandlers() {\n this.menuEl?.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.removeEventListener('click', this._handleOptionClick);\n el.removeEventListener('keydown', this._handleOptionKeydown);\n });\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n this._setSelectedStates();\n this._syncValidationError();\n };\n\n private _handleInvalid = (e: Event) => {\n if (e.defaultPrevented) return;\n if (!this._validationMessage) {\n this._validationMessage = document.createElement('small');\n this._validationMessage.id = this.input.id + '-error';\n this._validationMessage.className = 'supporting-text';\n this._validationMessage.style.color = 'var(--md-sys-color-error)';\n this.wrapper.append(this._validationMessage);\n this.input.setAttribute('aria-describedby',\n [this.input.getAttribute('aria-describedby'), this._validationMessage.id].filter(Boolean).join(' '));\n }\n this.input.ariaInvalid = 'true';\n this._syncValidationError();\n };\n\n // Native reporting chooses the control; static checks never focus. Wait until\n // reporting finishes so Firefox dismisses its native popup when focus moves.\n private _handleNativeFocus = () => queueMicrotask(() => {\n if (FormSelect.getInstance(this.el) === this && this.el.matches(':focus')) this.input.focus();\n });\n\n private _syncValidationError() {\n if (!this._validationMessage) return;\n if (this.el.willValidate && !this.el.validity.valid) {\n this._validationMessage.textContent = this.el.validationMessage;\n } else this._clearValidationError();\n }\n\n private _clearValidationError() {\n if (!this._validationMessage) return;\n const descriptions = this.input.getAttribute('aria-describedby')?.split(/\\s+/)\n .filter(id => id !== this._validationMessage.id).join(' ');\n if (descriptions) this.input.setAttribute('aria-describedby', descriptions);\n else this.input.removeAttribute('aria-describedby');\n this.input.ariaInvalid = this.el.ariaInvalid;\n this._validationMessage.remove();\n this._validationMessage = null;\n }\n\n private _handleReset = (e: Event) => {\n clearTimeout(this._resetTimer);\n this._resetTimer = setTimeout(() => {\n if (!e.defaultPrevented) {\n this._handleSelectChange();\n this._clearValidationError();\n }\n }, 0);\n };\n\n // Named rather than inline so that _removeEventHandlers can actually detach\n // it - an anonymous listener per option was unremovable.\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n private _handleOptionFocus = (e: FocusEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li[role=\"option\"]');\n if (li?.id) this.input.setAttribute('aria-activedescendant', li.id);\n };\n\n _arraysEqual<T, E>(a: T[], b: (E | T)[]) {\n if (a === b) return true;\n if (a == null || b == null) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; ++i) if (a[i] !== b[i]) return false;\n return true;\n }\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (this.el.matches(':disabled')) return;\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n if (!value || value.el.matches(':disabled')) return;\n const previousSelectedValues = this.getSelectedValues();\n if (this.isMultiple) {\n this._toggleEntryFromArray(value);\n } else {\n this._deselectAll();\n this._selectValue(value);\n }\n this._handleSelectChange();\n const actualSelectedValues = this.getSelectedValues();\n const selectionHasChanged = !this._arraysEqual(previousSelectedValues, actualSelectedValues);\n if (selectionHasChanged)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n if (!this.isMultiple) this.menu?.close();\n }\n\n _handleInputClick = () => {\n if (this.menu && this.menu.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n _setupMenu() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n Array.from(this.el.labels ?? []).forEach(label => {\n this._originalLabels.set(label, { for: label.getAttribute('for'), id: label.getAttribute('id') });\n });\n if (this.labelEl && !this.el.closest('label')) {\n this._labelPlaceholder = document.createComment('');\n this.labelEl.before(this._labelPlaceholder);\n }\n\n this._setupWrapper();\n this._hideNativeSelect();\n if (this.el.matches(':disabled')) this.wrapper.classList.add('disabled');\n\n this.menuEl = document.createElement('menu');\n this.menuEl.id = `select-options-${Utils.guid()}`;\n this.menuEl.setAttribute('popover', 'auto');\n this.menuEl.setAttribute('role', 'listbox');\n this.menuEl.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.menuEl.classList.add('multiple-select-menu');\n this._buildOptions();\n this.wrapper.append(this.menuEl);\n\n this._buildInput();\n this._buildCaret();\n this._initMenu();\n this._setSelectedStates();\n if (this._labelPlaceholder) this.input.after(this.labelEl);\n }\n\n private _setupWrapper() {\n const parent = this.el.parentElement;\n const reuse =\n parent &&\n parent.matches('.field') &&\n !parent.querySelector(':scope > .hide-select') &&\n !parent.querySelector(':scope > input, :scope > textarea');\n if (reuse) {\n this.wrapper = parent as HTMLDivElement;\n this._createdWrapper = false;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('field');\n this._createdWrapper = true;\n this.el.before(this.wrapper);\n }\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n\n private _hideNativeSelect() {\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n hiddenDiv.ariaHidden = 'true';\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n if (this._createdWrapper) this.wrapper.append(hiddenDiv);\n }\n\n private _buildInput() {\n this.input = document.createElement('input');\n this.input.id = 'select-input-' + Utils.guid();\n // FormSelect owns this Menu. A later AutoInit must not replace it before\n // FormSelect can destroy its own instance during reinitialization.\n this.input.classList.add('menu-trigger', 'no-autoinit');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.menuEl.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString();\n this.input.disabled = this.el.matches(':disabled');\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'listbox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-controls', this.menuEl.id);\n this.input.placeholder = ' ';\n\n this._originalLabels.forEach((_, label) => { label.htmlFor = this.input.id; });\n // Moving the first label can change DOM order. Preserve the original naming\n // order without overriding an author's explicit accessible name.\n if (this._labelPlaceholder && this._originalLabels.size > 1 && !this.input.getAttribute('aria-label') && !this.input.getAttribute('aria-labelledby')) {\n this.input.setAttribute('aria-labelledby', Array.from(this._originalLabels.keys(), (label, index) => {\n if (!label.id) label.id = `${this.input.id}-label-${index}`;\n return label.id;\n }).join(' '));\n }\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n }\n\n private _buildCaret() {\n const caret = document.createElement('span');\n caret.classList.add('caret');\n caret.setAttribute('aria-hidden', 'true');\n this.wrapper.prepend(caret);\n }\n\n private _initMenu() {\n if (this.el.matches(':disabled')) return;\n const menuOptions = { ...this.options.menuOptions };\n menuOptions.coverTrigger = false;\n const userOnOpenEnd = menuOptions.onOpenEnd;\n const userOnCloseEnd = menuOptions.onCloseEnd;\n menuOptions.onOpenEnd = () => {\n const selectedOption = this.menuEl.querySelector('.selected');\n if (selectedOption) {\n this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.menu._focusFocusedItem();\n if (this.menu.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.menuEl.getBoundingClientRect().top;\n scrollOffset -= this.menuEl.clientHeight / 2;\n this.menuEl.scrollTop = scrollOffset;\n }\n if (selectedOption.id) this.input.setAttribute('aria-activedescendant', selectedOption.id);\n }\n this.input.ariaExpanded = 'true';\n if (userOnOpenEnd && typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.menu, this.el);\n };\n menuOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (userOnCloseEnd && typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.menu, this.el);\n };\n menuOptions.closeOnClick = false;\n this.menu = Menu.init(this.input, menuOptions);\n }\n\n private _nativeOptions(): (HTMLOptGroupElement | HTMLOptionElement)[] {\n return <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n }\n\n private _buildOptions() {\n this.selectOptions = this._nativeOptions();\n this._values = [];\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._addOptionToValues(realOption as HTMLOptionElement, virtualOption);\n } else if (realOption.tagName === 'OPTGROUP') {\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this.menuEl.append(groupParent);\n\n const groupChildren = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((child) => {\n const virtualOption = this._createAndAppendOptionWithIcon(child, 'optgroup-option');\n groupChildren.push(virtualOption.id);\n this._addOptionToValues(child, virtualOption);\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n\n private _rebuildOptions() {\n this._removeOptionHandlers();\n this.menuEl.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.menu?._makeMenuFocusable();\n }\n\n _addOptionToValues(realOption: HTMLOptionElement, virtualOption: HTMLElement) {\n this._values.push({ el: realOption, optionEl: virtualOption });\n }\n\n _removeMenu() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.menuEl?.remove();\n const hide = this.el.parentElement;\n if (hide?.classList.contains('hide-select')) hide.replaceWith(this.el);\n this._originalLabels.forEach((original, label) => {\n for (const name of ['for', 'id'] as const) {\n if (original[name] === null) label.removeAttribute(name);\n else label.setAttribute(name, original[name]);\n }\n });\n this._labelPlaceholder?.replaceWith(this.labelEl);\n if (!this.wrapper) return;\n if (this._createdWrapper) {\n this.wrapper.replaceWith(this.el);\n } else {\n this.wrapper.classList.remove('disabled');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.remove(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.id = 'select-option-' + Utils.guid();\n li.setAttribute('role', 'option');\n li.tabIndex = 0;\n const disabled = this.el.matches(':disabled') || realOption.matches(':disabled');\n if (disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n li.tabIndex = -1;\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n const iconUrl = realOption.getAttribute('data-icon');\n let imageUrl: URL | undefined;\n if (iconUrl) {\n try {\n const url = new URL(iconUrl, this.el.ownerDocument.baseURI);\n if (['http:', 'https:', 'blob:'].includes(url.protocol) ||\n /^data:image\\/(?:avif|bmp|gif|jpeg|png|svg\\+xml|webp|x-icon)(?:;|,)/i.test(url.href)) {\n imageUrl = url;\n }\n } catch { /* Invalid icons must not prevent selection. */ }\n }\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (imageUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = imageUrl.href;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n this.menuEl.append(li);\n return li;\n }\n\n _selectValue(value: ValueStruct) {\n value.el.selected = true;\n value.optionEl.classList.add('selected');\n value.optionEl.ariaSelected = 'true';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = true;\n }\n\n _deselectValue(value: ValueStruct) {\n value.el.selected = false;\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n const checkbox = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = false;\n }\n\n _deselectAll() {\n this._values.forEach((value) => this._deselectValue(value));\n }\n\n _isValueSelected(value: ValueStruct) {\n return value.el.selected;\n }\n\n _toggleEntryFromArray(value: ValueStruct) {\n if (this._isValueSelected(value)) this._deselectValue(value);\n else this._selectValue(value);\n }\n\n _getSelectedOptions(): HTMLOptionElement[] {\n return Array.prototype.filter.call(\n this.el.selectedOptions,\n (realOption: HTMLOptionElement) => realOption\n );\n }\n\n _setValueToInput() {\n this.input.value = this._getSelectedOptions().map(option => option.textContent.trim()).join(', ');\n }\n\n _setSelectedStates() {\n this._values.forEach((value) => {\n const optionIsSelected = value.el.selected;\n const cb = <HTMLInputElement>value.optionEl.querySelector('input[type=\"checkbox\"]');\n if (cb) cb.checked = optionIsSelected;\n if (optionIsSelected) {\n this._activateOption(this.menuEl, value.optionEl);\n } else {\n value.optionEl.classList.remove('selected');\n value.optionEl.ariaSelected = 'false';\n }\n });\n }\n\n _activateOption(ul: HTMLElement, li: HTMLElement) {\n if (!li) return;\n if (!this.isMultiple)\n ul.querySelectorAll('li.selected').forEach((row) => row.classList.remove('selected'));\n li.classList.add('selected');\n li.ariaSelected = 'true';\n }\n\n getSelectedValues() {\n return this._getSelectedOptions().map((realOption) => realOption.value);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["value"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/autocomplete.ts"],
4
- "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\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\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 }>;\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 /**\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 */\n onSearch: (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 },\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 isMultiSelect: false,\n onSearch: (text: string, autocomplete: Autocomplete) => {\n const normSearch = text.toLocaleLowerCase();\n const data = autocomplete.options.data;\n autocomplete.setMenuItems(\n data.filter((option) =>\n option.id.toString().toLocaleLowerCase().includes(normSearch)\n || option.text?.toLocaleLowerCase().includes(normSearch)\n\n )\n );\n autocomplete.options.data = data;\n },\n maxMenuHeight: '300px',\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 /** 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 private _statusInfo: HTMLElement;\n private _announcer: HTMLElement;\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 static _keydown: boolean;\n selectedValues: AutocompleteData[];\n menuItems: AutocompleteData[];\n\n constructor(el: HTMLInputElement, options: Partial<AutocompleteOptions>) {\n super(el, options, Autocomplete);\n this.el['Expressive_Autocomplete'] = this;\n\n this.options = {\n ...Autocomplete.defaults,\n ...options,\n i18n: { ...Autocomplete.defaults.i18n, ...options?.i18n }\n };\n\n this.isOpen = false;\n this.count = 0;\n this.activeIndex = -1;\n this.oldVal = '';\n this.selectedValues = this.options.selected.map((id) => this.options.data.find(entry => entry.id === id) ?? { id });\n this.menuItems = this.options.data || [];\n this.$active = null;\n this._pointerDown = false;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): AutocompleteOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Autocomplete.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLInputElement, options?: Partial<AutocompleteOptions>): Autocomplete;\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<HTMLInputElement | InitElement>,\n options?: Partial<AutocompleteOptions>\n ): Autocomplete[];\n /**\n * Initializes instances of Autocomplete.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLInputElement | InitElements<HTMLInputElement | InitElement>,\n options: Partial<AutocompleteOptions> = {}\n ): Autocomplete | Autocomplete[] {\n return super.init(els, options, Autocomplete);\n }\n\n static getInstance(el: HTMLElement): Autocomplete {\n return el['Expressive_Autocomplete'];\n }\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._removeEventHandlers();\n this.menu.destroy();\n this.isOpen = false;\n this._removeMenu();\n this._statusInfo.remove();\n this._announcer.remove();\n this.el['Expressive_Autocomplete'] = undefined;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('blur', this._handleInputBlur);\n this.el.addEventListener('input', this._handleInput);\n this.el.addEventListener('keyup', this._handleInputKeyup);\n this.el.addEventListener('focus', this._handleInputFocus);\n this.el.addEventListener('keydown', this._handleInputKeydown);\n this.el.addEventListener('click', this._handleInputClick);\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);\n this.container.addEventListener('pointerup', this._handleContainerPointerUp);\n this.container.addEventListener('pointercancel', this._handleContainerPointerUp);\n }\n\n _removeEventHandlers() {\n this.el.removeEventListener('blur', this._handleInputBlur);\n this.el.removeEventListener('input', this._handleInput);\n this.el.removeEventListener('keyup', this._handleInputKeyup);\n this.el.removeEventListener('focus', this._handleInputFocus);\n this.el.removeEventListener('keydown', this._handleInputKeydown);\n this.el.removeEventListener('click', this._handleInputClick);\n this.container.removeEventListener('pointerdown', this._handleContainerPointerDown);\n this.container.removeEventListener('pointerup', this._handleContainerPointerUp);\n this.container.removeEventListener('pointercancel', this._handleContainerPointerUp);\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.menuItems.forEach((menuItem) => {\n const itemElement = this._createMenuItem(menuItem);\n this.container.append(itemElement);\n });\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 const entryID = li.getAttribute('data-id');\n this.selectOption(entryID);\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 // Sketchy removal of menu click handler\n this.el.removeEventListener('click', this.menu._handleClick);\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.close();\n this._resetAutocomplete();\n }\n };\n\n _handleInputKeyup = () => {\n Autocomplete._keydown = false;\n };\n\n _handleInput = () => {\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 if (this.el.matches(':focus-visible')\n && (!this.menu.isOpen || actualValue.length < this.options.minLength)) this.open();\n }\n this._inputChangeDetection(actualValue);\n };\n\n _handleInputFocus = () => {\n this.count = 0;\n const actualValue = this.el.value.toLocaleLowerCase();\n this._inputChangeDetection(actualValue);\n };\n\n _inputChangeDetection = (value: string) => {\n if (!this.options.isMultiSelect && this.selectedValues.length && this.el.value !== (this.selectedValues[0].text || String(this.selectedValues[0].id))) {\n this.selectedValues = [];\n }\n // Value has changed!\n if (this.oldVal !== value) {\n this._setStatusLoading();\n this.options.onSearch(this.el.value, this);\n }\n // Reset Single-Select when Input cleared\n if (!this.options.isMultiSelect && this.el.value.length === 0) {\n this.selectedValues = [];\n this._triggerChanged();\n }\n this.oldVal = value;\n };\n\n _handleInputKeydown = (e: KeyboardEvent) => {\n Autocomplete._keydown = true;\n if (e.key === Utils.keys.ESC || e.key === 'Tab') {\n this.close();\n this._resetCurrentElementPosition();\n return;\n }\n // Arrow keys and enter key usage\n const numItems = this.container.querySelectorAll('li').length;\n // select element on Enter\n if (e.key === Utils.keys.ENTER && this.activeIndex >= 0) {\n const liElement = this.container.querySelectorAll('li')[this.activeIndex];\n if (liElement) {\n this.selectOption(liElement.getAttribute('data-id'));\n e.preventDefault();\n }\n return;\n }\n // Capture up and down key\n if (e.key === Utils.keys.ARROW_UP || e.key === Utils.keys.ARROW_DOWN) {\n e.preventDefault();\n if (e.key === Utils.keys.ARROW_UP && this.activeIndex > 0) this.activeIndex--;\n if (e.key === Utils.keys.ARROW_DOWN && this.activeIndex < numItems - 1)\n this.activeIndex++;\n this._setActive(null);\n if (this.activeIndex >= 0) {\n this._setActive(this.container.querySelectorAll('li')[this.activeIndex]);\n // Focus selected\n this.container.children[this.activeIndex].scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'nearest'\n });\n }\n }\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 };\n\n _handleContainerPointerUp = () => {\n this._pointerDown = false;\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) {\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 = this.selectedValues.some((sel) => sel.id === entry.id);\n item.setAttribute('aria-selected', isSelected ? 'true' : 'false');\n item.setAttribute('data-id', <string>entry.id);\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 const spacer = document.createElement('span');\n spacer.style.paddingLeft = '21px';\n selection.append(checkbox, spacer);\n item.appendChild(selection);\n }\n // Image\n if (entry.image) {\n const img = document.createElement('img');\n img.classList.add('circle');\n img.src = entry.image;\n item.appendChild(img);\n }\n\n // Text\n const inputText = this.el.value.toLocaleLowerCase();\n const label = (entry.text || entry.id).toString();\n const parts = this._highlightPartialText(inputText, label);\n const div = document.createElement('div');\n div.setAttribute('style', 'line-height:1.2;font-weight:500;');\n if (this.options.allowUnsafeHTML) {\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 } else {\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 const itemText = document.createElement('div');\n itemText.classList.add('item-text');\n itemText.setAttribute('style', 'padding:5px;overflow:hidden;');\n item.appendChild(itemText);\n item.querySelector('.item-text').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 item.querySelector('.item-text').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 _renderMenu() {\n this._resetAutocomplete();\n // Check if Data is empty\n if (this.menuItems.length === 0) {\n this.menuItems = this.selectedValues; // Show selected Items\n }\n for (let i = 0; i < this.menuItems.length; i++) {\n const item = this._createMenuItem(this.menuItems[i]);\n this.container.append(item);\n }\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 _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 this.el.dispatchEvent(new Event('change', { bubbles: true, cancelable: true, composed: true }));\n // Trigger Autocomplete Event\n if (typeof this.options.onAutocomplete === 'function')\n this.options.onAutocomplete.call(this, this.selectedValues);\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.menuItems.length ? this.options.i18n.results(this.menuItems.length) : this.options.i18n.noResults);\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 (this.el['Expressive_Autocomplete'] !== this) return;\n const resultCount = menuItems.length;\n this.menuItems = menuItems;\n this.options.data = menuItems;\n if (selected) {\n this.selectedValues = this.menuItems.filter(\n (item) => !(selected.indexOf(<never>item.id) === -1)\n );\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 ? resultCount ? this.options.i18n.results(resultCount) : this.options.i18n.noResults : '');\n this._triggerChanged();\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 const entry = this.menuItems.find((item) => item.id == id);\n if (!entry) return;\n // Toggle Checkbox\n /* const li = this.container.querySelector('li[data-id=\"' + id + '\"]');\n if (!li) return;*/\n if (this.options.isMultiSelect) {\n /* const checkbox = <HTMLInputElement | null>li.querySelector('input[type=\"checkbox\"]');\n checkbox.checked = !checkbox.checked;*/\n if (!(this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id === entry.id\n ).length >= 1)) this.selectedValues.push(entry);\n else this.selectedValues = this.selectedValues.filter(\n (selectedEntry) => selectedEntry.id !== entry.id\n );\n this._renderMenu();\n this.el.focus();\n } else {\n // Single-Select\n this.selectedValues = [entry];\n this._refreshInputText();\n this._resetAutocomplete();\n this.close();\n }\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": []
7
- }
@@ -1,270 +0,0 @@
1
- import {
2
- Utils
3
- } from "./chunk-MNPROCZF.mjs";
4
- import {
5
- Component
6
- } from "./chunk-LTWPGFBR.mjs";
7
-
8
- // src/ts/components/questionnaire.ts
9
- var _defaults = {
10
- progressLabel: "Question {current} of {total}",
11
- requiredMessage: "Choose an answer to continue."
12
- };
13
- var NAVIGATION = ["previous", "skip", "next"];
14
- var Questionnaire = class _Questionnaire extends Component {
15
- constructor(el, options) {
16
- super(el, options, _Questionnaire);
17
- this._active = null;
18
- this._generated = [];
19
- this._generatedIds = [];
20
- /** Set while one submission's invalid events arrive, so only the first opens. */
21
- this._reporting = false;
22
- /** Shows the question at `index` without checking the current one. */
23
- this.goTo = (index) => {
24
- const item = this.items[index];
25
- if (!item) return;
26
- this._active = item;
27
- this._render();
28
- const controls = this._controls(item).filter((control) => !control.disabled);
29
- (controls.find((control) => control.checked) ?? controls[0])?.focus();
30
- };
31
- /** Checks the shown question and moves to the next one if it is answered. */
32
- this.next = () => {
33
- if (this._validate(this._active)) this.goTo(this.index + 1);
34
- };
35
- /** Moves to the previous question. */
36
- this.previous = () => this.goTo(this.index - 1);
37
- /** Clears the answer to the shown question and moves to the next one. */
38
- this.skip = () => {
39
- if (!this._active) return;
40
- for (const control of this._controls(this._active)) {
41
- const isChoice = control instanceof HTMLInputElement && (control.type === "radio" || control.type === "checkbox");
42
- if (isChoice ? !control.checked : !control.value) continue;
43
- if (isChoice) control.checked = false;
44
- else control.value = "";
45
- control.dispatchEvent(new Event("change", { bubbles: true }));
46
- }
47
- this.goTo(this.index + 1);
48
- };
49
- this._handleClick = (e) => {
50
- const button = e.target.closest?.("button");
51
- if (!button || !this._buttons().includes(button)) return;
52
- if (NAVIGATION.includes(button.value)) {
53
- e.preventDefault();
54
- this[button.value]();
55
- return;
56
- }
57
- this._syncRequired();
58
- };
59
- // Enter in a field moves on instead of submitting the form early.
60
- this._handleKeydown = (e) => {
61
- if (e.key !== "Enter" || e.defaultPrevented || e.isComposing) return;
62
- if (!(e.target instanceof HTMLInputElement) || this.index >= this.items.length - 1) return;
63
- e.preventDefault();
64
- this.next();
65
- };
66
- // A submission found an unanswered question, possibly a hidden one. Open the
67
- // first instead of letting the browser report a control it cannot show.
68
- // One submission fires its invalid events in a single task.
69
- this._handleInvalid = (e) => {
70
- const item = this.items.find((item2) => item2.contains(e.target));
71
- if (!item) return;
72
- e.preventDefault();
73
- if (this._reporting) return;
74
- this._reporting = true;
75
- setTimeout(() => this._reporting = false);
76
- this._active = item;
77
- this._render();
78
- this._validate(item);
79
- };
80
- // An answer clears the question's error.
81
- this._handleInput = (e) => {
82
- this._syncRequired();
83
- const item = e.target.closest?.("fieldset");
84
- if (item instanceof HTMLFieldSetElement && item.classList.contains("invalid")) this._setInvalid(item, false);
85
- };
86
- this.el["Expressive_Questionnaire"] = this;
87
- const progressLabel = el.dataset.progressLabel;
88
- this.options = {
89
- ..._Questionnaire.defaults,
90
- ...progressLabel ? { progressLabel } : {},
91
- ...options
92
- };
93
- this._progress = document.createElement("div");
94
- this._progress.className = "questionnaire-progress";
95
- this._progressText = document.createElement("span");
96
- this._progressText.id = `questionnaire-progress-${Utils.guid()}`;
97
- this._progressBar = document.createElement("progress");
98
- this._progressBar.className = "progress";
99
- this._progressBar.setAttribute("aria-labelledby", this._progressText.id);
100
- this._progress.append(this._progressText, this._progressBar);
101
- this.el.prepend(this._progress);
102
- for (const item of this._fieldsets()) {
103
- const ids = Array.from(item.querySelectorAll(":scope > p:not(.questionnaire-error)")).map((p) => this._ensureId(p, "questionnaire-description"));
104
- if (ids.length && !item.hasAttribute("aria-describedby")) {
105
- item.setAttribute("aria-describedby", ids.join(" "));
106
- this._generatedIds.push(item);
107
- }
108
- }
109
- this._active = this.items[0] ?? null;
110
- this._syncRequired();
111
- this._render();
112
- this._observer = new MutationObserver(() => {
113
- this._syncRequired();
114
- this._render();
115
- });
116
- this._observer.observe(this.el, { attributes: true, subtree: true, attributeFilter: ["disabled"] });
117
- this.el.addEventListener("click", this._handleClick);
118
- this.el.addEventListener("keydown", this._handleKeydown);
119
- this.el.addEventListener("input", this._handleInput);
120
- this.el.addEventListener("invalid", this._handleInvalid, true);
121
- }
122
- static get defaults() {
123
- return _defaults;
124
- }
125
- /**
126
- * Initializes instances of Questionnaire.
127
- * @param els HTML elements.
128
- * @param options Component options.
129
- */
130
- static init(els, options = {}) {
131
- return super.init(els, options, _Questionnaire);
132
- }
133
- static getInstance(el) {
134
- return el["Expressive_Questionnaire"];
135
- }
136
- /** The questions that apply: every fieldset child that is not disabled. */
137
- get items() {
138
- return this._fieldsets().filter((item) => !item.disabled);
139
- }
140
- /** Position of the shown question in `items`. */
141
- get index() {
142
- return this.items.indexOf(this._active);
143
- }
144
- destroy() {
145
- this._observer.disconnect();
146
- this.el.removeEventListener("click", this._handleClick);
147
- this.el.removeEventListener("keydown", this._handleKeydown);
148
- this.el.removeEventListener("input", this._handleInput);
149
- this.el.removeEventListener("invalid", this._handleInvalid, true);
150
- for (const item of this._fieldsets()) {
151
- if (item.hasAttribute("data-required")) for (const control of this._controls(item)) control.setCustomValidity("");
152
- item.hidden = false;
153
- this._setInvalid(item, false);
154
- }
155
- for (const button of this._buttons()) button.hidden = false;
156
- this._progress.remove();
157
- for (const el of this._generated) el.remove();
158
- for (const el of this._generatedIds) {
159
- el.removeAttribute(el instanceof HTMLFieldSetElement ? "aria-describedby" : "id");
160
- }
161
- this.el["Expressive_Questionnaire"] = void 0;
162
- }
163
- _fieldsets() {
164
- return Array.from(this.el.querySelectorAll(":scope > fieldset"));
165
- }
166
- /** The footer's navigation and submit buttons. */
167
- _buttons() {
168
- return Array.from(this.el.querySelectorAll(":scope > footer > button")).filter(
169
- (button) => NAVIGATION.includes(button.value) || button.type === "submit"
170
- );
171
- }
172
- _controls(item) {
173
- return Array.from(item.elements).filter(
174
- (el) => el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement || el instanceof HTMLInputElement && el.type !== "button" && el.type !== "submit"
175
- );
176
- }
177
- _required(item) {
178
- return item.hasAttribute("data-required") || this._controls(item).some((control) => control.required);
179
- }
180
- _ensureId(el, prefix) {
181
- if (!el.id) {
182
- el.id = `${prefix}-${Utils.guid()}`;
183
- this._generatedIds.push(el);
184
- }
185
- return el.id;
186
- }
187
- _render() {
188
- const items = this.items;
189
- if (!items.includes(this._active)) {
190
- const all = this._fieldsets();
191
- const after = all.slice(all.indexOf(this._active) + 1).find((item) => !item.disabled);
192
- this._active = after ?? items[items.length - 1] ?? null;
193
- }
194
- const index = items.indexOf(this._active);
195
- const last = index === items.length - 1;
196
- for (const item of this._fieldsets()) item.hidden = item !== this._active;
197
- for (const button of this._buttons()) {
198
- if (button.value === "previous") button.hidden = index <= 0;
199
- else if (button.value === "skip") button.hidden = last || !this._active || this._required(this._active);
200
- else if (button.value === "next") button.hidden = last;
201
- else button.hidden = !last;
202
- }
203
- this._progressText.textContent = this.options.progressLabel.replace("{current}", String(index + 1)).replace("{total}", String(items.length));
204
- this._progressBar.max = Math.max(items.length, 1);
205
- this._progressBar.value = index + 1;
206
- }
207
- /**
208
- * Puts "choose at least one" on the first enabled checkbox of each
209
- * data-required group with none checked, so the browser's validation, and
210
- * every way of submitting, sees it. A disabled checkbox is not sent, so it
211
- * does not count.
212
- */
213
- _syncRequired() {
214
- for (const item of this._fieldsets()) {
215
- if (!item.hasAttribute("data-required")) continue;
216
- const boxes = this._controls(item).filter(
217
- (control) => control instanceof HTMLInputElement && control.type === "checkbox"
218
- );
219
- const enabled = boxes.filter((box) => !box.disabled);
220
- for (const box of boxes) box.setCustomValidity("");
221
- if (enabled.length && !enabled.some((box) => box.checked)) {
222
- const error = item.querySelector(":scope > .questionnaire-error:not([data-generated])");
223
- enabled[0].setCustomValidity(error?.textContent.trim() || this.options.requiredMessage);
224
- }
225
- }
226
- }
227
- /** The first control in the question that still needs an answer. */
228
- _invalidControl(item) {
229
- return this._controls(item).find((control) => control.willValidate && !control.validity.valid);
230
- }
231
- /** Shows the question's error and returns false when it needs an answer. */
232
- _validate(item) {
233
- this._syncRequired();
234
- const invalid = item && this._invalidControl(item);
235
- if (!invalid) return true;
236
- let error = item.querySelector(":scope > .questionnaire-error");
237
- if (!error) {
238
- error = document.createElement("p");
239
- error.className = "questionnaire-error";
240
- error.dataset.generated = "";
241
- error.textContent = invalid.validationMessage || this.options.requiredMessage;
242
- item.append(error);
243
- this._generated.push(error);
244
- }
245
- this._setInvalid(item, true);
246
- invalid.focus();
247
- return false;
248
- }
249
- _setInvalid(item, invalid) {
250
- item.classList.toggle("invalid", invalid);
251
- const error = item.querySelector(":scope > .questionnaire-error");
252
- const described = (item.getAttribute("aria-describedby") ?? "").split(" ").filter((id) => id && id !== error?.id);
253
- if (invalid && error) described.push(this._ensureId(error, "questionnaire-error"));
254
- if (described.length) item.setAttribute("aria-describedby", described.join(" "));
255
- else item.removeAttribute("aria-describedby");
256
- for (const control of this._controls(item)) {
257
- if (invalid) control.setAttribute("aria-invalid", "true");
258
- else control.removeAttribute("aria-invalid");
259
- }
260
- if (!invalid && this._generated.includes(error)) {
261
- error.remove();
262
- this._generated.splice(this._generated.indexOf(error), 1);
263
- }
264
- }
265
- };
266
-
267
- export {
268
- Questionnaire
269
- };
270
- //# sourceMappingURL=chunk-4KMNFIFZ.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/questionnaire.ts"],
4
- "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement } from '../core/component';\n\nexport interface QuestionnaireOptions extends BaseOptions {\n /**\n * Text above the progress bar. `{current}` and `{total}` are replaced with\n * the question number and the number of questions. `data-progress-label`\n * on the form sets it.\n * @default 'Question {current} of {total}'\n */\n progressLabel: string;\n /**\n * Error shown when a question has no `.questionnaire-error` of its own and\n * the browser gives no validation message, as for a `data-required` group\n * of checkboxes.\n * @default 'Choose an answer to continue.'\n */\n requiredMessage: string;\n}\n\nconst _defaults: QuestionnaireOptions = {\n progressLabel: 'Question {current} of {total}',\n requiredMessage: 'Choose an answer to continue.'\n};\n\nconst NAVIGATION = ['previous', 'skip', 'next'];\n\ntype Control = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * A multi-step questionnaire: a <form class=\"questionnaire\"> whose\n * <fieldset> children are the questions, shown one at a time, and a <footer>\n * of buttons. `value=\"previous\"`, `value=\"skip\"` and `value=\"next\"` mark the\n * navigation buttons; a submit button sends the form on the last question.\n *\n * A question is required when one of its controls is `required`, or when the\n * fieldset has `data-required` (at least one enabled checkbox, held as a\n * custom validity on the first one). Next and every way of submitting check\n * it with the browser's own validation; an optional question gets Skip, which\n * clears its answer. A disabled fieldset is left out, so a page can switch\n * questions on and off from earlier answers.\n *\n * Without JavaScript every question shows at once and the submit button sends\n * the form. The answers are ordinary form controls, so FormData reads them.\n */\nexport class Questionnaire extends Component<QuestionnaireOptions> {\n declare el: HTMLFormElement;\n private _active: HTMLFieldSetElement | null = null;\n private _progress: HTMLElement;\n private _progressText: HTMLElement;\n private _progressBar: HTMLProgressElement;\n private _generated: HTMLElement[] = [];\n private _generatedIds: HTMLElement[] = [];\n private _observer: MutationObserver;\n /** Set while one submission's invalid events arrive, so only the first opens. */\n private _reporting = false;\n\n constructor(el: HTMLFormElement, options: Partial<QuestionnaireOptions>) {\n super(el, options, Questionnaire);\n this.el['Expressive_Questionnaire'] = this;\n const progressLabel = el.dataset.progressLabel;\n this.options = {\n ...Questionnaire.defaults,\n ...(progressLabel ? { progressLabel } : {}),\n ...options\n };\n\n this._progress = document.createElement('div');\n this._progress.className = 'questionnaire-progress';\n this._progressText = document.createElement('span');\n this._progressText.id = `questionnaire-progress-${Utils.guid()}`;\n this._progressBar = document.createElement('progress');\n this._progressBar.className = 'progress';\n this._progressBar.setAttribute('aria-labelledby', this._progressText.id);\n this._progress.append(this._progressText, this._progressBar);\n this.el.prepend(this._progress);\n\n for (const item of this._fieldsets()) {\n const ids = Array.from(item.querySelectorAll<HTMLElement>(':scope > p:not(.questionnaire-error)'))\n .map((p) => this._ensureId(p, 'questionnaire-description'));\n if (ids.length && !item.hasAttribute('aria-describedby')) {\n item.setAttribute('aria-describedby', ids.join(' '));\n this._generatedIds.push(item);\n }\n }\n\n this._active = this.items[0] ?? null;\n this._syncRequired();\n this._render();\n // A page enabling or disabling a question from an earlier answer changes\n // the count and the buttons.\n this._observer = new MutationObserver(() => {\n this._syncRequired();\n this._render();\n });\n this._observer.observe(this.el, { attributes: true, subtree: true, attributeFilter: ['disabled'] });\n this.el.addEventListener('click', this._handleClick);\n this.el.addEventListener('keydown', this._handleKeydown);\n this.el.addEventListener('input', this._handleInput);\n // invalid does not bubble.\n this.el.addEventListener('invalid', this._handleInvalid, true);\n }\n\n static get defaults(): QuestionnaireOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of Questionnaire.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<QuestionnaireOptions>): Questionnaire;\n /**\n * Initializes instances of Questionnaire.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InitElement>,\n options?: Partial<QuestionnaireOptions>\n ): Questionnaire[];\n /**\n * Initializes instances of Questionnaire.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<QuestionnaireOptions> = {}\n ): Questionnaire | Questionnaire[] {\n return super.init(els, options, Questionnaire);\n }\n\n static getInstance(el: HTMLElement): Questionnaire {\n return el['Expressive_Questionnaire'];\n }\n\n /** The questions that apply: every fieldset child that is not disabled. */\n get items(): HTMLFieldSetElement[] {\n return this._fieldsets().filter((item) => !item.disabled);\n }\n\n /** Position of the shown question in `items`. */\n get index(): number {\n return this.items.indexOf(this._active);\n }\n\n /** Shows the question at `index` without checking the current one. */\n goTo = (index: number) => {\n const item = this.items[index];\n if (!item) return;\n this._active = item;\n this._render();\n const controls = this._controls(item).filter((control) => !control.disabled);\n (controls.find((control) => (control as HTMLInputElement).checked) ?? controls[0])?.focus();\n };\n\n /** Checks the shown question and moves to the next one if it is answered. */\n next = () => {\n if (this._validate(this._active)) this.goTo(this.index + 1);\n };\n\n /** Moves to the previous question. */\n previous = () => this.goTo(this.index - 1);\n\n /** Clears the answer to the shown question and moves to the next one. */\n skip = () => {\n if (!this._active) return;\n for (const control of this._controls(this._active)) {\n const isChoice = control instanceof HTMLInputElement && (control.type === 'radio' || control.type === 'checkbox');\n if (isChoice ? !control.checked : !control.value) continue;\n if (isChoice) control.checked = false;\n else control.value = '';\n control.dispatchEvent(new Event('change', { bubbles: true }));\n }\n this.goTo(this.index + 1);\n };\n\n destroy() {\n this._observer.disconnect();\n this.el.removeEventListener('click', this._handleClick);\n this.el.removeEventListener('keydown', this._handleKeydown);\n this.el.removeEventListener('input', this._handleInput);\n this.el.removeEventListener('invalid', this._handleInvalid, true);\n for (const item of this._fieldsets()) {\n if (item.hasAttribute('data-required')) for (const control of this._controls(item)) control.setCustomValidity('');\n item.hidden = false;\n this._setInvalid(item, false);\n }\n for (const button of this._buttons()) button.hidden = false;\n this._progress.remove();\n for (const el of this._generated) el.remove();\n for (const el of this._generatedIds) {\n el.removeAttribute(el instanceof HTMLFieldSetElement ? 'aria-describedby' : 'id');\n }\n this.el['Expressive_Questionnaire'] = undefined;\n }\n\n private _fieldsets() {\n return Array.from(this.el.querySelectorAll<HTMLFieldSetElement>(':scope > fieldset'));\n }\n\n /** The footer's navigation and submit buttons. */\n private _buttons() {\n return Array.from(this.el.querySelectorAll<HTMLButtonElement>(':scope > footer > button')).filter(\n (button) => NAVIGATION.includes(button.value) || button.type === 'submit'\n );\n }\n\n private _controls(item: HTMLFieldSetElement) {\n return Array.from(item.elements).filter(\n (el): el is Control =>\n el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement ||\n (el instanceof HTMLInputElement && el.type !== 'button' && el.type !== 'submit')\n );\n }\n\n private _required(item: HTMLFieldSetElement) {\n return item.hasAttribute('data-required') || this._controls(item).some((control) => control.required);\n }\n\n private _ensureId(el: HTMLElement, prefix: string) {\n if (!el.id) {\n el.id = `${prefix}-${Utils.guid()}`;\n this._generatedIds.push(el);\n }\n return el.id;\n }\n\n private _render() {\n const items = this.items;\n // The shown question was switched off: carry on from the next one.\n if (!items.includes(this._active)) {\n const all = this._fieldsets();\n const after = all.slice(all.indexOf(this._active) + 1).find((item) => !item.disabled);\n this._active = after ?? items[items.length - 1] ?? null;\n }\n const index = items.indexOf(this._active);\n const last = index === items.length - 1;\n for (const item of this._fieldsets()) item.hidden = item !== this._active;\n for (const button of this._buttons()) {\n if (button.value === 'previous') button.hidden = index <= 0;\n else if (button.value === 'skip') button.hidden = last || !this._active || this._required(this._active);\n else if (button.value === 'next') button.hidden = last;\n else button.hidden = !last;\n }\n this._progressText.textContent = this.options.progressLabel\n .replace('{current}', String(index + 1))\n .replace('{total}', String(items.length));\n this._progressBar.max = Math.max(items.length, 1);\n this._progressBar.value = index + 1;\n }\n\n /**\n * Puts \"choose at least one\" on the first enabled checkbox of each\n * data-required group with none checked, so the browser's validation, and\n * every way of submitting, sees it. A disabled checkbox is not sent, so it\n * does not count.\n */\n private _syncRequired() {\n for (const item of this._fieldsets()) {\n if (!item.hasAttribute('data-required')) continue;\n const boxes = this._controls(item).filter(\n (control): control is HTMLInputElement => control instanceof HTMLInputElement && control.type === 'checkbox'\n );\n const enabled = boxes.filter((box) => !box.disabled);\n for (const box of boxes) box.setCustomValidity('');\n if (enabled.length && !enabled.some((box) => box.checked)) {\n const error = item.querySelector<HTMLElement>(':scope > .questionnaire-error:not([data-generated])');\n enabled[0].setCustomValidity(error?.textContent.trim() || this.options.requiredMessage);\n }\n }\n }\n\n /** The first control in the question that still needs an answer. */\n private _invalidControl(item: HTMLFieldSetElement): Control | undefined {\n return this._controls(item).find((control) => control.willValidate && !control.validity.valid);\n }\n\n /** Shows the question's error and returns false when it needs an answer. */\n private _validate(item: HTMLFieldSetElement | null) {\n this._syncRequired();\n const invalid = item && this._invalidControl(item);\n if (!invalid) return true;\n let error = item.querySelector<HTMLElement>(':scope > .questionnaire-error');\n if (!error) {\n error = document.createElement('p');\n error.className = 'questionnaire-error';\n error.dataset.generated = '';\n error.textContent = invalid.validationMessage || this.options.requiredMessage;\n item.append(error);\n this._generated.push(error);\n }\n this._setInvalid(item, true);\n invalid.focus();\n return false;\n }\n\n private _setInvalid(item: HTMLFieldSetElement, invalid: boolean) {\n item.classList.toggle('invalid', invalid);\n const error = item.querySelector<HTMLElement>(':scope > .questionnaire-error');\n const described = (item.getAttribute('aria-describedby') ?? '').split(' ').filter((id) => id && id !== error?.id);\n if (invalid && error) described.push(this._ensureId(error, 'questionnaire-error'));\n if (described.length) item.setAttribute('aria-describedby', described.join(' '));\n else item.removeAttribute('aria-describedby');\n for (const control of this._controls(item)) {\n if (invalid) control.setAttribute('aria-invalid', 'true');\n else control.removeAttribute('aria-invalid');\n }\n if (!invalid && this._generated.includes(error)) {\n error.remove();\n this._generated.splice(this._generated.indexOf(error), 1);\n }\n }\n\n private _handleClick = (e: MouseEvent) => {\n const button = (e.target as Element).closest?.('button');\n if (!button || !this._buttons().includes(button)) return;\n if (NAVIGATION.includes(button.value)) {\n // Also stops a navigation button written without type=\"button\" from\n // submitting the form.\n e.preventDefault();\n this[button.value as 'previous' | 'skip' | 'next']();\n return;\n }\n // Submit by click or Enter: catch answers a script set without an event.\n this._syncRequired();\n };\n\n // Enter in a field moves on instead of submitting the form early.\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Enter' || e.defaultPrevented || e.isComposing) return;\n if (!(e.target instanceof HTMLInputElement) || this.index >= this.items.length - 1) return;\n e.preventDefault();\n this.next();\n };\n\n // A submission found an unanswered question, possibly a hidden one. Open the\n // first instead of letting the browser report a control it cannot show.\n // One submission fires its invalid events in a single task.\n private _handleInvalid = (e: Event) => {\n const item = this.items.find((item) => item.contains(e.target as Node));\n if (!item) return;\n e.preventDefault();\n if (this._reporting) return;\n this._reporting = true;\n setTimeout(() => (this._reporting = false));\n this._active = item;\n this._render();\n this._validate(item);\n };\n\n // An answer clears the question's error.\n private _handleInput = (e: Event) => {\n this._syncRequired();\n const item = (e.target as Element).closest?.('fieldset');\n if (item instanceof HTMLFieldSetElement && item.classList.contains('invalid')) this._setInvalid(item, false);\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["item"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/ts/components/commandPalette.ts"],
4
- "sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElements, InitElement, Openable } from '../core/component';\n\nexport interface CommandPaletteOptions extends BaseOptions {\n /**\n * Letter that toggles the palette together with Command on Apple platforms\n * or Ctrl elsewhere. A key event the page has already handled is left\n * alone. `null` turns the shortcut off. `data-shortcut` on the dialog sets\n * it; an empty `data-shortcut` turns it off.\n * @default 'k'\n */\n shortcut: string | null;\n /**\n * If true, the palette closes after a command runs.\n * @default true\n */\n closeOnRun: boolean;\n}\n\nconst _defaults: CommandPaletteOptions = {\n shortcut: 'k',\n closeOnRun: true\n};\n\n// On Apple platforms Ctrl+letter is text editing (Ctrl+K deletes to the end\n// of the line), so only Command opens the palette there.\nconst APPLE = typeof navigator !== 'undefined' && /Mac|iPhone|iPad|iPod/.test(navigator.platform);\n\n/** Case- and accent-insensitive text for matching. */\nconst fold = (text: string) =>\n text.normalize('NFD').replace(/\\p{Diacritic}/gu, '').toLowerCase();\n\n/**\n * A command palette: a native modal <dialog class=\"command-palette\"> holding\n * a search input and a list of commands. Typing filters the list; the arrow\n * keys move through what is left and Enter runs it, while focus stays in the\n * input. The dialog owns modality, Escape and returning focus.\n *\n * The input is a combobox and the list a listbox of options, with the active\n * option reported through aria-activedescendant. A command is the link or\n * button inside an option; running it clicks that element, so a page wires\n * commands with ordinary hrefs and click handlers.\n */\nexport class CommandPalette extends Component<CommandPaletteOptions> implements Openable {\n declare el: HTMLDialogElement;\n /** The search input. */\n input: HTMLInputElement;\n /** The list of commands. */\n list: HTMLElement;\n private _active: HTMLElement | null = null;\n private _generatedIds: HTMLElement[] = [];\n /** Wires and refilters commands the page adds or removes later. */\n private _observer: MutationObserver | null = null;\n\n constructor(el: HTMLDialogElement, options: Partial<CommandPaletteOptions>) {\n super(el, options, CommandPalette);\n this.el['Expressive_CommandPalette'] = this;\n const shortcut = el.dataset.shortcut;\n this.options = {\n ...CommandPalette.defaults,\n ...(shortcut !== undefined ? { shortcut: shortcut || null } : {}),\n ...options\n };\n this.input = el.querySelector(':scope > input');\n this.list = el.querySelector(':scope > :is(ul, ol)');\n if (!this.input || !this.list) {\n console.error('CommandPalette needs an <input> and a <ul> as children of the dialog.');\n return;\n }\n this._setupAccessibility();\n this._filter();\n // A page adding commands while the user arrows through the list keeps\n // their place.\n this._observer = new MutationObserver(() => this._filter(true));\n // Also refilter when the page hides, shows, disables or enables a command.\n // Not aria-disabled: _filter writes that itself, which would loop.\n this._observer.observe(this.list, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['hidden', 'disabled']\n });\n this.input.addEventListener('input', this._handleInput);\n this.input.addEventListener('keydown', this._handleKeydown);\n this.list.addEventListener('click', this._handleListClick);\n this.list.addEventListener('pointermove', this._handlePointerMove);\n this.el.addEventListener('close', this._handleClose);\n document.addEventListener('keydown', this._handleShortcut);\n }\n\n static get defaults(): CommandPaletteOptions {\n return _defaults;\n }\n\n /**\n * Initializes instance of CommandPalette.\n * @param el HTML element.\n * @param options Component options.\n */\n static init(el: HTMLElement, options?: Partial<CommandPaletteOptions>): CommandPalette;\n /**\n * Initializes instances of CommandPalette.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: InitElements<InitElement>,\n options?: Partial<CommandPaletteOptions>\n ): CommandPalette[];\n /**\n * Initializes instances of CommandPalette.\n * @param els HTML elements.\n * @param options Component options.\n */\n static init(\n els: HTMLElement | InitElements<InitElement>,\n options: Partial<CommandPaletteOptions> = {}\n ): CommandPalette | CommandPalette[] {\n return super.init(els, options, CommandPalette);\n }\n\n static getInstance(el: HTMLElement): CommandPalette {\n return el['Expressive_CommandPalette'];\n }\n\n /** If the palette is open. */\n get isOpen() {\n return this.el.open;\n }\n\n /** Opens the palette as a modal dialog with the search input focused. */\n open = () => {\n if (!this.el.open) this.el.showModal();\n this.input?.focus();\n };\n\n /** Closes the palette. The dialog returns focus to where it was. */\n close = () => {\n if (this.el.open) this.el.close();\n };\n\n destroy() {\n this._observer?.disconnect();\n document.removeEventListener('keydown', this._handleShortcut);\n this.el.removeEventListener('close', this._handleClose);\n if (this.input && this.list) {\n this.input.removeEventListener('input', this._handleInput);\n this.input.removeEventListener('keydown', this._handleKeydown);\n this.list.removeEventListener('click', this._handleListClick);\n this.list.removeEventListener('pointermove', this._handlePointerMove);\n for (const name of ['role', 'aria-controls', 'aria-expanded', 'aria-autocomplete', 'aria-activedescendant']) {\n this.input.removeAttribute(name);\n }\n this.list.removeAttribute('role');\n for (const item of this._items()) {\n for (const name of ['role', 'aria-selected', 'aria-disabled', 'data-filtered']) item.removeAttribute(name);\n item.classList.remove('active');\n this._action(item)?.removeAttribute('tabindex');\n }\n for (const label of this._labels()) {\n label.removeAttribute('role');\n label.removeAttribute('data-filtered');\n }\n for (const el of this._generatedIds) el.removeAttribute('id');\n const empty = this._empty();\n if (empty) empty.hidden = false;\n }\n this.el['Expressive_CommandPalette'] = undefined;\n }\n\n private _items() {\n return Array.from(this.list.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && !child.classList.contains('label')\n );\n }\n\n private _labels() {\n return Array.from(this.list.querySelectorAll<HTMLElement>(':scope > .label'));\n }\n\n private _empty() {\n return this.el.querySelector<HTMLElement>(':scope > .command-palette-empty');\n }\n\n private _action(item: HTMLElement) {\n return item.querySelector<HTMLElement>(':scope > :is(a[href], button)');\n }\n\n private _ensureId(el: HTMLElement, prefix: string) {\n if (!el.id) {\n el.id = `${prefix}-${Utils.guid()}`;\n this._generatedIds.push(el);\n }\n return el.id;\n }\n\n private _setupAccessibility() {\n this.list.setAttribute('role', 'listbox');\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-controls', this._ensureId(this.list, 'command-palette-list'));\n this.input.setAttribute('aria-expanded', 'true');\n this.input.setAttribute('aria-autocomplete', 'list');\n }\n\n /** Every command, including ones added since the last pass, is an option. */\n private _wireItems() {\n for (const item of this._items()) {\n if (item.getAttribute('role') === 'option') continue;\n item.setAttribute('role', 'option');\n this._ensureId(item, 'command-palette-option');\n // Focus stays in the input; the commands are reached with the arrows.\n this._action(item)?.setAttribute('tabindex', '-1');\n }\n // A listbox holds only options; a group heading is a visual divider.\n for (const label of this._labels()) label.setAttribute('role', 'none');\n }\n\n /** Commands on screen: neither hidden by the page nor filtered out. */\n private _shown() {\n return this._items().filter((item) => !item.hidden && !item.hasAttribute('data-filtered'));\n }\n\n /** Shown commands the arrows and Enter can reach: disabled ones are skipped. */\n private _visible() {\n return this._shown().filter((item) => item.getAttribute('aria-disabled') !== 'true');\n }\n\n /** A disabled link or button cannot run, so its option says so. */\n private _isDisabled(item: HTMLElement) {\n const action = this._action(item);\n return !!action && (action.matches(':disabled') || action.getAttribute('aria-disabled') === 'true');\n }\n\n private _setActive(item: HTMLElement | null) {\n if (this._active === item) return;\n this._active?.classList.remove('active');\n this._active?.removeAttribute('aria-selected');\n this._active = item;\n if (item) {\n item.classList.add('active');\n item.setAttribute('aria-selected', 'true');\n this.input.setAttribute('aria-activedescendant', item.id);\n item.scrollIntoView({ block: 'nearest' });\n } else {\n this.input.removeAttribute('aria-activedescendant');\n }\n }\n\n /**\n * Shows the commands matching the query. Filtering marks rows with\n * data-filtered rather than hidden, so a command the page hides stays\n * hidden. `keepActive` holds the active command while it is still\n * reachable, for list changes the user did not make.\n */\n private _filter(keepActive = false) {\n this._wireItems();\n const terms = fold(this.input.value).split(/\\s+/).filter(Boolean);\n for (const item of this._items()) {\n // data-keywords may sit on the row or on its link or button.\n const keywords = item.dataset.keywords ?? this._action(item)?.dataset.keywords ?? '';\n const text = fold(`${item.textContent} ${keywords}`);\n item.toggleAttribute('data-filtered', !terms.every((term) => text.includes(term)));\n if (this._isDisabled(item)) item.setAttribute('aria-disabled', 'true');\n else item.removeAttribute('aria-disabled');\n }\n // A heading stays only while one of the commands under it does.\n for (const label of this._labels()) {\n let next = label.nextElementSibling as HTMLElement | null;\n let any = false;\n while (next && !next.classList.contains('label')) {\n if (!next.hidden && !next.hasAttribute('data-filtered')) any = true;\n next = next.nextElementSibling as HTMLElement | null;\n }\n label.toggleAttribute('data-filtered', !any);\n }\n const visible = this._visible();\n const empty = this._empty();\n if (empty) empty.hidden = this._shown().length > 0;\n this._setActive(keepActive && visible.includes(this._active) ? this._active : visible[0] ?? null);\n }\n\n private _move(step: number) {\n const visible = this._visible();\n if (!visible.length) return;\n const index = visible.indexOf(this._active);\n this._setActive(visible[(index + step + visible.length) % visible.length]);\n }\n\n /** Runs a command by clicking its link or button; the click handler closes. */\n private _run(item: HTMLElement) {\n (this._action(item) ?? item).click();\n }\n\n _handleInput = () => this._filter();\n\n _handleKeydown = (e: KeyboardEvent) => {\n if (e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP) {\n e.preventDefault();\n this._move(e.key === Utils.keys.ARROW_DOWN ? 1 : -1);\n } else if (e.key === Utils.keys.ENTER && !e.isComposing && e.keyCode !== 229 && this._active) {\n // keyCode 229 is the Enter that confirms an IME composition in Safari,\n // which reports isComposing false for it.\n e.preventDefault();\n this._run(this._active);\n }\n };\n\n _handleListClick = (e: MouseEvent) => {\n const item = (<Element>e.target).closest<HTMLElement>('[role=\"option\"]');\n if (!item || !this.list.contains(item) || item.getAttribute('aria-disabled') === 'true') return;\n const action = this._action(item);\n // A click on the row's padding runs its command; that click comes back\n // through here and closes the palette.\n if (action && !action.contains(<Node>e.target)) {\n action.click();\n return;\n }\n if (this.options.closeOnRun) this.close();\n };\n\n _handlePointerMove = (e: PointerEvent) => {\n const item = (<Element>e.target).closest<HTMLElement>('[role=\"option\"]');\n if (item && this.list.contains(item) && item.getAttribute('aria-disabled') !== 'true') this._setActive(item);\n };\n\n /**\n * Each opening starts from the full list. The close event is queued, so a\n * palette reopened straight away may already be open again; its new search\n * is left alone.\n */\n _handleClose = () => {\n if (this.el.open) return;\n this.input.value = '';\n this._filter();\n };\n\n _handleShortcut = (e: KeyboardEvent) => {\n const { shortcut } = this.options;\n if (!shortcut || e.defaultPrevented || e.altKey || e.shiftKey) return;\n if (!(APPLE ? e.metaKey && !e.ctrlKey : e.ctrlKey && !e.metaKey)) return;\n // A non-Latin layout reports its own letter in e.key, so fall back to the\n // physical key there. A Latin layout matches on the letter it types.\n const letter = shortcut.toLowerCase();\n const latin = /^[a-z]$/i.test(e.key);\n const hit = e.key.toLowerCase() === letter ||\n (!latin && /^[a-z]$/.test(letter) && e.code === `Key${letter.toUpperCase()}`);\n if (!hit) return;\n e.preventDefault();\n if (this.el.open) this.close();\n else this.open();\n };\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }