@expressivecss/expressive 0.15.0 → 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 (602) hide show
  1. package/CHANGELOG.md +1502 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19247 -11923
  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-KVJAVDBC.mjs → chunk-4QUCNFSD.mjs} +64 -113
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-6FSEUFVW.mjs} +39 -26
  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-CK2XCICY.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-7NLUI3RR.mjs} +139 -66
  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-LQWUDNHZ.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-B7DQFHA5.mjs} +30 -47
  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-VGNYF6FB.mjs → chunk-BPF3I2MN.mjs} +109 -24
  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-NUHMOAOY.mjs → chunk-CSYWKEK3.mjs} +310 -196
  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-74MXKKLN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-EVCVFEV3.mjs} +235 -146
  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-PDG64UHF.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-BGZLF6JZ.mjs → chunk-KZPSAXIU.mjs} +142 -32
  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-DXGRXYYL.mjs → chunk-OP43LLIC.mjs} +28 -45
  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-TSZYSW7F.mjs → chunk-OYNUDOHR.mjs} +19 -47
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UAZSDUVP.mjs → chunk-P6DRQ6KS.mjs} +36 -30
  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-GJL6GCIU.mjs → chunk-QXKWVHBD.mjs} +265 -161
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-X4ISMKE2.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-SMY7GJSS.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-ZX6M7SWO.mjs → chunk-VGY4M57S.mjs} +266 -120
  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-SFI2U4YW.mjs → chunk-VMY55K2X.mjs} +76 -109
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-KUFHW3DS.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-FM5CZOUB.mjs → chunk-ZJNLAGY5.mjs} +19 -30
  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 +10613 -4327
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10613 -4327
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -22
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +182 -71
  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 +131 -66
  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 +3 -3
  274. package/dist/js/internal/components/lightbox.mjs +3 -3
  275. package/dist/js/internal/components/lineChart.mjs +25 -4
  276. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  277. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  278. package/dist/js/internal/components/mapView.mjs +3 -3
  279. package/dist/js/internal/components/menu.mjs +3 -3
  280. package/dist/js/internal/components/menubar.mjs +10 -0
  281. package/dist/js/internal/components/menubar.mjs.map +7 -0
  282. package/dist/js/internal/components/messageScroller.mjs +3 -3
  283. package/dist/js/internal/components/mixedChart.mjs +5 -4
  284. package/dist/js/internal/components/navigationRail.mjs +3 -2
  285. package/dist/js/internal/components/particles.mjs +3 -2
  286. package/dist/js/internal/components/pieChart.mjs +4 -3
  287. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  288. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  289. package/dist/js/internal/components/questionnaire.mjs +3 -3
  290. package/dist/js/internal/components/radarChart.mjs +4 -3
  291. package/dist/js/internal/components/radialChart.mjs +4 -3
  292. package/dist/js/internal/components/registry.mjs +59 -41
  293. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  294. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  295. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  296. package/dist/js/internal/components/scatterChart.mjs +10 -0
  297. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scrollspy.mjs +3 -2
  299. package/dist/js/internal/components/select.mjs +4 -4
  300. package/dist/js/internal/components/showMore.mjs +9 -0
  301. package/dist/js/internal/components/showMore.mjs.map +7 -0
  302. package/dist/js/internal/components/slider.mjs +3 -3
  303. package/dist/js/internal/components/snackbar.mjs +2 -2
  304. package/dist/js/internal/components/swipeActions.mjs +9 -0
  305. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  306. package/dist/js/internal/components/tabs.mjs +3 -4
  307. package/dist/js/internal/components/timepicker.mjs +5 -4
  308. package/dist/js/internal/components/tooltip.mjs +3 -3
  309. package/dist/js/internal/components/treeSelect.mjs +13 -0
  310. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  311. package/dist/js/internal/components/treemapChart.mjs +10 -0
  312. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  313. package/dist/js/internal/core/component.mjs +2 -1
  314. package/dist/js/internal/core/formControl.mjs +12 -0
  315. package/dist/js/internal/core/formControl.mjs.map +7 -0
  316. package/dist/js/internal/core/spring.mjs +11 -0
  317. package/dist/js/internal/core/spring.mjs.map +7 -0
  318. package/dist/js/internal/core/utils.mjs +11 -3
  319. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  320. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  322. package/dist/js/modular.mjs +173 -71
  323. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  324. package/dist/types/behaviors/copy.d.ts +18 -0
  325. package/dist/types/behaviors/dataTables.d.ts +129 -0
  326. package/dist/types/behaviors/dialogs.d.ts +27 -1
  327. package/dist/types/behaviors/forms.d.ts +68 -2
  328. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  329. package/dist/types/behaviors/lists.d.ts +12 -0
  330. package/dist/types/behaviors/paneResize.d.ts +29 -0
  331. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  332. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  333. package/dist/types/behaviors/sortable.d.ts +28 -0
  334. package/dist/types/behaviors/theme.d.ts +22 -0
  335. package/dist/types/behaviors/tour.d.ts +36 -0
  336. package/dist/types/behaviors/transferList.d.ts +51 -0
  337. package/dist/types/components/appBar.d.ts +5 -6
  338. package/dist/types/components/autocomplete.d.ts +91 -17
  339. package/dist/types/components/backToTop.d.ts +36 -0
  340. package/dist/types/components/barChart.d.ts +3 -6
  341. package/dist/types/components/buttonGroup.d.ts +2 -4
  342. package/dist/types/components/buttons.d.ts +5 -5
  343. package/dist/types/components/cards.d.ts +3 -16
  344. package/dist/types/components/carousel.d.ts +9 -15
  345. package/dist/types/components/cascader.d.ts +130 -0
  346. package/dist/types/components/characterCounter.d.ts +2 -15
  347. package/dist/types/components/chips.d.ts +65 -19
  348. package/dist/types/components/colorPicker.d.ts +42 -0
  349. package/dist/types/components/columnChart.d.ts +23 -10
  350. package/dist/types/components/commandPalette.d.ts +11 -16
  351. package/dist/types/components/confetti.d.ts +2 -4
  352. package/dist/types/components/currencyInput.d.ts +59 -0
  353. package/dist/types/components/datepicker.d.ts +56 -32
  354. package/dist/types/components/expandingCard.d.ts +4 -6
  355. package/dist/types/components/funnelChart.d.ts +38 -0
  356. package/dist/types/components/heatmapChart.d.ts +39 -8
  357. package/dist/types/components/hoverCard.d.ts +58 -0
  358. package/dist/types/components/index.d.ts +16 -1
  359. package/dist/types/components/inputMask.d.ts +30 -0
  360. package/dist/types/components/keypad.d.ts +38 -6
  361. package/dist/types/components/lightbox.d.ts +14 -20
  362. package/dist/types/components/lineChart.d.ts +172 -10
  363. package/dist/types/components/loadingOverlay.d.ts +42 -0
  364. package/dist/types/components/mapView.d.ts +26 -17
  365. package/dist/types/components/menu.d.ts +60 -22
  366. package/dist/types/components/menubar.d.ts +37 -0
  367. package/dist/types/components/messageScroller.d.ts +2 -14
  368. package/dist/types/components/mixedChart.d.ts +15 -6
  369. package/dist/types/components/navigationRail.d.ts +16 -5
  370. package/dist/types/components/particles.d.ts +8 -4
  371. package/dist/types/components/pieChart.d.ts +32 -7
  372. package/dist/types/components/pullToRefresh.d.ts +80 -0
  373. package/dist/types/components/questionnaire.d.ts +58 -16
  374. package/dist/types/components/radarChart.d.ts +10 -6
  375. package/dist/types/components/radialChart.d.ts +58 -7
  376. package/dist/types/components/registry.d.ts +73 -3
  377. package/dist/types/components/richTextEditor.d.ts +6 -14
  378. package/dist/types/components/sankeyChart.d.ts +72 -0
  379. package/dist/types/components/scatterChart.d.ts +102 -0
  380. package/dist/types/components/scrollspy.d.ts +3 -5
  381. package/dist/types/components/select.d.ts +43 -30
  382. package/dist/types/components/showMore.d.ts +51 -0
  383. package/dist/types/components/slider.d.ts +3 -15
  384. package/dist/types/components/snackbar.d.ts +61 -0
  385. package/dist/types/components/swipeActions.d.ts +81 -0
  386. package/dist/types/components/tabs.d.ts +89 -27
  387. package/dist/types/components/timepicker.d.ts +113 -21
  388. package/dist/types/components/tooltip.d.ts +56 -20
  389. package/dist/types/components/treeSelect.d.ts +106 -0
  390. package/dist/types/components/treemapChart.d.ts +56 -0
  391. package/dist/types/core/component.d.ts +43 -25
  392. package/dist/types/core/formControl.d.ts +21 -0
  393. package/dist/types/core/spring.d.ts +20 -0
  394. package/dist/types/core/utils.d.ts +85 -72
  395. package/dist/types/modular.d.ts +33 -1
  396. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  397. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  398. package/package.json +10 -8
  399. package/src/sass/README.md +27 -18
  400. package/src/sass/abstracts/_elevation.scss +13 -7
  401. package/src/sass/abstracts/_index.scss +1 -0
  402. package/src/sass/abstracts/_mixins.scss +422 -36
  403. package/src/sass/abstracts/_spring.scss +63 -0
  404. package/src/sass/abstracts/_variables.scss +39 -21
  405. package/src/sass/base/_fonts.scss +61 -48
  406. package/src/sass/base/_global.scss +104 -24
  407. package/src/sass/base/_index.scss +2 -0
  408. package/src/sass/base/_normalize.scss +59 -114
  409. package/src/sass/base/_print.scss +21 -0
  410. package/src/sass/base/_prose.scss +68 -0
  411. package/src/sass/base/_typography.scss +9 -5
  412. package/src/sass/components/_accordion.scss +9 -16
  413. package/src/sass/components/_alert.scss +102 -0
  414. package/src/sass/components/_aura.scss +8 -3
  415. package/src/sass/components/_avatar.scss +3 -3
  416. package/src/sass/components/_back-to-top.scss +38 -0
  417. package/src/sass/components/_badges.scss +6 -5
  418. package/src/sass/components/_bar-chart.scss +41 -19
  419. package/src/sass/components/_bottom-sheet.scss +44 -16
  420. package/src/sass/components/_breadcrumb.scss +8 -1
  421. package/src/sass/components/_button-groups.scss +15 -25
  422. package/src/sass/components/_buttons.scss +156 -63
  423. package/src/sass/components/_calendar.scss +246 -0
  424. package/src/sass/components/_cards.scss +36 -44
  425. package/src/sass/components/_carousel.scss +27 -103
  426. package/src/sass/components/_cascader.scss +142 -0
  427. package/src/sass/components/_chips.scss +36 -46
  428. package/src/sass/components/_column-chart.scss +19 -12
  429. package/src/sass/components/_command-palette.scss +4 -7
  430. package/src/sass/components/_confetti.scss +0 -2
  431. package/src/sass/components/_countdown.scss +1 -1
  432. package/src/sass/components/_data-table.scss +162 -25
  433. package/src/sass/components/_datepicker.scss +54 -40
  434. package/src/sass/components/_description-list.scss +85 -0
  435. package/src/sass/components/_dialog.scss +42 -41
  436. package/src/sass/components/_docked-display.scss +1 -3
  437. package/src/sass/components/_drag-handle.scss +16 -20
  438. package/src/sass/components/_expanding-card.scss +20 -9
  439. package/src/sass/components/_fab-menu.scss +44 -32
  440. package/src/sass/components/_funnel-chart.scss +124 -0
  441. package/src/sass/components/_heatmap-chart.scss +111 -22
  442. package/src/sass/components/_icon-buttons.scss +7 -7
  443. package/src/sass/components/_icons-material-design.scss +2 -2
  444. package/src/sass/components/_image-compare.scss +108 -0
  445. package/src/sass/components/_index.scss +20 -0
  446. package/src/sass/components/_keypad.scss +39 -19
  447. package/src/sass/components/_kpi.scss +6 -11
  448. package/src/sass/components/_lightbox.scss +24 -13
  449. package/src/sass/components/_line-chart.scss +16 -2
  450. package/src/sass/components/_list.scss +59 -14
  451. package/src/sass/components/_loading-indicator.scss +1 -0
  452. package/src/sass/components/_loading-overlay.scss +105 -0
  453. package/src/sass/components/_map.scss +33 -11
  454. package/src/sass/components/_marquee.scss +3 -2
  455. package/src/sass/components/_mega-menu.scss +137 -0
  456. package/src/sass/components/_menu.scss +143 -123
  457. package/src/sass/components/_menubar.scss +59 -0
  458. package/src/sass/components/_message-scroller.scss +2 -2
  459. package/src/sass/components/_message.scss +3 -3
  460. package/src/sass/components/_mixed-chart.scss +37 -9
  461. package/src/sass/components/_modal-display.scss +21 -0
  462. package/src/sass/components/_navbar.scss +34 -20
  463. package/src/sass/components/_navigation-bar.scss +15 -77
  464. package/src/sass/components/_navigation-rail.scss +151 -92
  465. package/src/sass/components/_org-chart.scss +192 -0
  466. package/src/sass/components/_page-footer.scss +1 -1
  467. package/src/sass/components/_pagination.scss +6 -13
  468. package/src/sass/components/_panes.scss +32 -26
  469. package/src/sass/components/_particles.scss +0 -2
  470. package/src/sass/components/_pie-chart.scss +91 -11
  471. package/src/sass/components/_popover.scss +18 -5
  472. package/src/sass/components/_progress.scss +152 -31
  473. package/src/sass/components/_pull-to-refresh.scss +90 -0
  474. package/src/sass/components/_questionnaire.scss +74 -3
  475. package/src/sass/components/_radar-chart.scss +38 -10
  476. package/src/sass/components/_radial-chart.scss +113 -5
  477. package/src/sass/components/_rich-text-editor.scss +2 -2
  478. package/src/sass/components/_sankey-chart.scss +114 -0
  479. package/src/sass/components/_scatter-chart.scss +153 -0
  480. package/src/sass/components/_scrim.scss +0 -2
  481. package/src/sass/components/_scrollspy.scss +0 -2
  482. package/src/sass/components/_search.scss +26 -22
  483. package/src/sass/components/_show-more.scss +8 -0
  484. package/src/sass/components/_side-sheet.scss +23 -37
  485. package/src/sass/components/_skeleton.scss +2 -4
  486. package/src/sass/components/_snackbar.scss +27 -21
  487. package/src/sass/components/_split-button.scss +5 -5
  488. package/src/sass/components/_stat.scss +3 -8
  489. package/src/sass/components/_stepper.scss +1 -1
  490. package/src/sass/components/_swipe-actions.scss +71 -0
  491. package/src/sass/components/_tabs.scss +51 -32
  492. package/src/sass/components/_timeline.scss +12 -12
  493. package/src/sass/components/_timepicker.scss +109 -78
  494. package/src/sass/components/_toolbar.scss +35 -43
  495. package/src/sass/components/_tooltip.scss +21 -12
  496. package/src/sass/components/_tour.scss +89 -0
  497. package/src/sass/components/_transfer-list.scss +73 -0
  498. package/src/sass/components/_transitions.scss +4 -4
  499. package/src/sass/components/_tree.scss +3 -16
  500. package/src/sass/components/_treemap-chart.scss +122 -0
  501. package/src/sass/components/forms/_checkboxes.scss +106 -24
  502. package/src/sass/components/forms/_color-picker.scss +135 -0
  503. package/src/sass/components/forms/_color-swatches.scss +85 -0
  504. package/src/sass/components/forms/_drop-zone.scss +15 -9
  505. package/src/sass/components/forms/_fieldset.scss +7 -7
  506. package/src/sass/components/forms/_file-input.scss +6 -8
  507. package/src/sass/components/forms/_index.scss +3 -1
  508. package/src/sass/components/forms/_input-fields.scss +254 -90
  509. package/src/sass/components/forms/_radio-buttons.scss +33 -94
  510. package/src/sass/components/forms/_rating.scss +2 -32
  511. package/src/sass/components/forms/_select.scss +199 -20
  512. package/src/sass/components/forms/_slider.scss +91 -94
  513. package/src/sass/components/forms/_switches.scss +53 -164
  514. package/src/sass/custom.scss +10 -1
  515. package/src/sass/expressive.scss +3 -63
  516. package/src/sass/tokens/_contrast.scss +94 -0
  517. package/src/sass/tokens/_elevation.scss +16 -0
  518. package/src/sass/tokens/_index.scss +5 -0
  519. package/src/sass/tokens/_motion.scss +109 -0
  520. package/src/sass/tokens/_reference.scss +72 -141
  521. package/src/sass/tokens/_shape.scss +38 -0
  522. package/src/sass/tokens/_stacking.scss +27 -0
  523. package/src/sass/tokens/_state.scss +0 -2
  524. package/src/sass/tokens/_theme.scss +10 -1
  525. package/src/sass/tokens/_vibrant.scss +2 -5
  526. package/src/sass/utilities/_defer-render.scss +17 -0
  527. package/src/sass/utilities/_helpers.scss +183 -26
  528. package/src/sass/utilities/_index.scss +1 -0
  529. package/src/sass/utilities/_scroll-area.scss +0 -2
  530. package/src/sass/utilities/_spacing.scss +52 -34
  531. package/src/sass/utilities/_typescale.scss +8 -1
  532. package/src/sass/utilities/_visibility.scss +47 -76
  533. package/src/sass/utilities/_z-depth.scss +7 -4
  534. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  535. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  536. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  537. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  540. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  541. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  543. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  548. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  553. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  556. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  562. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  564. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  567. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  568. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  569. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  570. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  572. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  574. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  578. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  582. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  584. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  587. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  589. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  590. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  592. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  593. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  594. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  596. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  598. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  599. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  602. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,376 @@
1
+ import {
2
+ formAssociated,
3
+ unwrapControl,
4
+ wrapInControl
5
+ } from "./chunk-INLZWHLY.mjs";
6
+ import {
7
+ Component
8
+ } from "./chunk-CMGXGYUC.mjs";
9
+ import {
10
+ Utils,
11
+ controllerFor,
12
+ restoreAttribute
13
+ } from "./chunk-ZVLOUDIJ.mjs";
14
+
15
+ // src/ts/components/cascader.ts
16
+ var CONTROL = "expressive-cascader-control";
17
+ var INPUT_ATTRIBUTES = ["readonly", "role", "aria-haspopup", "aria-expanded", "aria-controls", "aria-required", "aria-invalid"];
18
+ var OPEN_KEYS = ["Enter", " ", "ArrowDown"];
19
+ var RTL_KEYS = { ArrowLeft: "ArrowRight", ArrowRight: "ArrowLeft" };
20
+ var SEPARATOR = " / ";
21
+ var ownText = (li) => Array.from(li.childNodes, (node) => node.nodeName === "UL" ? " " : node.textContent).join("").replace(/\s+/g, " ").trim();
22
+ function parse(list, parent) {
23
+ if (!list) return [];
24
+ return Array.from(list.querySelectorAll(":scope > li"), (source) => {
25
+ const node = { value: source.dataset.value ?? "", label: ownText(source), parent, children: [], source };
26
+ node.children = parse(source.querySelector(":scope > ul"), node);
27
+ return node;
28
+ });
29
+ }
30
+ var samePath = (a, b) => a.length === b.length && a.every((node, i) => node === b[i]);
31
+ var flatten = (nodes) => nodes.flatMap((node) => [node, ...flatten(node.children)]);
32
+ function pathTo(node) {
33
+ const path = [];
34
+ for (let at = node; at; at = at.parent) path.unshift(at);
35
+ return path;
36
+ }
37
+ var _defaults = {
38
+ i18n: { required: "Choose an option." }
39
+ };
40
+ var Cascader = class extends Component {
41
+ constructor(el, options = {}) {
42
+ super(el, options);
43
+ /** The chosen path, from the first column to a leaf, or empty. */
44
+ this._path = [];
45
+ /** Whether the popover is open. */
46
+ this.isOpen = false;
47
+ /** The path shown while the popover is open, which a leaf commits. */
48
+ this._open = [];
49
+ /** The open listbox columns, one per level of the open path. */
50
+ this._columns = [];
51
+ /** Each rendered option's node. */
52
+ this._nodes = /* @__PURE__ */ new Map();
53
+ /** Each node's current option; choosing a branch again renders it anew. */
54
+ this._rendered = /* @__PURE__ */ new Map();
55
+ /** The last press inside the field, which the document listener lets through. */
56
+ this._insidePress = null;
57
+ /** Listeners that last while the popover is open. */
58
+ this._openEvents = null;
59
+ /** A label id the component gave, which destroy() takes back. */
60
+ this._stampedLabel = null;
61
+ this._ids = 0;
62
+ /** The path the field started with, which a form reset puts back. */
63
+ this._initialPath = [];
64
+ /** The form control wrapping a named input, which the form reads instead of it. */
65
+ this._control = null;
66
+ /** The form name the input had, which the control submits under. */
67
+ this._formName = "";
68
+ this._required = false;
69
+ /** What each key does on an option, by its left-to-right name. */
70
+ this._keys = {
71
+ ArrowDown: (option, e) => this._move(option, e),
72
+ ArrowUp: (option, e) => this._move(option, e),
73
+ Home: (option, e) => this._move(option, e),
74
+ End: (option, e) => this._move(option, e),
75
+ ArrowRight: (option) => this._forward(option),
76
+ ArrowLeft: (option) => this._back(option),
77
+ Enter: (option) => this._activate(option),
78
+ " ": (option) => this._activate(option),
79
+ Escape: () => this._dismiss(),
80
+ Tab: () => this._dismiss()
81
+ };
82
+ this._handleInputKeydown = Utils.ignoringComposition((e) => {
83
+ if (this.isOpen || !OPEN_KEYS.includes(e.key)) return;
84
+ e.preventDefault();
85
+ this.open();
86
+ });
87
+ this._handleOptionKeydown = (e) => {
88
+ const option = e.target.closest('[role="option"]');
89
+ const action = option && this._keys[this._keyName(e)];
90
+ if (!action || !Utils.plainKey(e)) return;
91
+ e.preventDefault();
92
+ action(option, e);
93
+ };
94
+ /** A submit or checkValidity() found no path: the input says so to assistive technology. */
95
+ this._handleInvalid = () => {
96
+ this.input.setAttribute("aria-invalid", "true");
97
+ };
98
+ this._handleInputClick = () => {
99
+ if (this.isOpen) this.close();
100
+ else this.open();
101
+ };
102
+ /** A click on a branch keeps focus on it; one on a leaf commits. */
103
+ this._handleOptionClick = (e) => {
104
+ const option = e.target.closest('[role="option"]');
105
+ if (!option) return;
106
+ this._focus(option);
107
+ this._pick(option);
108
+ };
109
+ // Marked rather than found on the composed path, which a document listener
110
+ // cannot see into when the field sits in a closed shadow root.
111
+ this._handleInsidePointer = (e) => {
112
+ this._insidePress = e;
113
+ };
114
+ /** A press outside the field and the popover closes it, leaving focus where the press puts it. */
115
+ this._handleOutsidePointer = (e) => {
116
+ if (e !== this._insidePress) this.close();
117
+ };
118
+ this.input = this.el.querySelector(":scope > input");
119
+ this._options = parse(this.el.querySelector(":scope > .cascader-options"), null);
120
+ if (!this.input) return;
121
+ this._saved = INPUT_ATTRIBUTES.map((name) => this.input.getAttribute(name));
122
+ this.popover = document.createElement("div");
123
+ this.popover.id = `cascader-${Utils.guid()}`;
124
+ this.popover.className = "cascader-popover";
125
+ this.popover.setAttribute("popover", "manual");
126
+ this.popover.setAttribute("role", "dialog");
127
+ this.el.append(this.popover);
128
+ this._labelledBy = this.input.getAttribute("aria-labelledby") ?? this._labelId();
129
+ this._name(this.popover);
130
+ this.input.readOnly = true;
131
+ this.input.setAttribute("role", "combobox");
132
+ this.input.setAttribute("aria-haspopup", "dialog");
133
+ this.input.setAttribute("aria-expanded", "false");
134
+ this.input.setAttribute("aria-controls", this.popover.id);
135
+ this._path = this._initialPath = this._startingPath();
136
+ this._show();
137
+ this._takeName();
138
+ const { signal } = this._events;
139
+ this.input.addEventListener("click", this._handleInputClick, { signal });
140
+ this.input.addEventListener("keydown", this._handleInputKeydown, { signal });
141
+ this.popover.addEventListener("click", this._handleOptionClick, { signal });
142
+ this.popover.addEventListener("keydown", this._handleOptionKeydown, { signal });
143
+ }
144
+ static get defaults() {
145
+ return _defaults;
146
+ }
147
+ /** The values of the chosen path, from the first column on. */
148
+ get value() {
149
+ return this._path.map((node) => node.value);
150
+ }
151
+ /** Opens the popover at the chosen path, with focus on its leaf or on the first option. */
152
+ open() {
153
+ if (this.isOpen || this.input.matches(":disabled")) return;
154
+ this.isOpen = true;
155
+ this._columns = [this._addColumn(this._options, null)];
156
+ this._open = [];
157
+ this._path.forEach((node, level) => this._choose(level, node));
158
+ this._showPopover();
159
+ this._focus(this._optionFor(this._path.at(-1)) ?? this._columns[0].querySelector('[role="option"]'));
160
+ }
161
+ /** Closes the popover, keeping the chosen path. */
162
+ close() {
163
+ if (!this.isOpen) return;
164
+ this.isOpen = false;
165
+ this._openEvents.abort();
166
+ this.popover.hidePopover?.();
167
+ this.popover.replaceChildren();
168
+ this._columns = [];
169
+ this._nodes.clear();
170
+ this._rendered.clear();
171
+ this.input.setAttribute("aria-expanded", "false");
172
+ }
173
+ destroy() {
174
+ if (this.input) {
175
+ this.close();
176
+ this._giveNameBack();
177
+ this._stampedLabel?.removeAttribute("id");
178
+ this.popover.remove();
179
+ INPUT_ATTRIBUTES.forEach((name, i) => restoreAttribute(this.input, name, this._saved[i]));
180
+ }
181
+ super.destroy();
182
+ }
183
+ /** The path to the first leaf marked data-selected; a marked branch does not count. */
184
+ _startingPath() {
185
+ return pathTo(flatten(this._options).find((node) => !node.children.length && node.source.hasAttribute("data-selected")));
186
+ }
187
+ /** Shows the popover anchored to the input, until a press outside closes it. */
188
+ _showPopover() {
189
+ this.popover.showPopover?.({ source: this.input });
190
+ this.input.setAttribute("aria-expanded", "true");
191
+ this._openEvents = controllerFor(this.el);
192
+ const { signal } = this._openEvents;
193
+ this.el.addEventListener("pointerdown", this._handleInsidePointer, { signal });
194
+ document.addEventListener("pointerdown", this._handleOutsidePointer, { signal });
195
+ }
196
+ /** The id of the input's first label, given one if it has none, or null. */
197
+ _labelId() {
198
+ const label = this.input.labels?.[0];
199
+ if (!label) return null;
200
+ if (!label.id) {
201
+ label.id = `${this.popover.id}-label`;
202
+ this._stampedLabel = label;
203
+ }
204
+ return label.id;
205
+ }
206
+ /** Names the popover or the first column after the field. */
207
+ _name(el) {
208
+ if (this._labelledBy) el.setAttribute("aria-labelledby", this._labelledBy);
209
+ else restoreAttribute(el, "aria-label", this.input.getAttribute("aria-label"));
210
+ }
211
+ /** A listbox of `nodes`, named after the option that opened it, or after the field for the first. */
212
+ _addColumn(nodes, opener) {
213
+ const column = document.createElement("ul");
214
+ column.setAttribute("role", "listbox");
215
+ if (opener) column.setAttribute("aria-labelledby", this._optionFor(opener).id);
216
+ else this._name(column);
217
+ column.append(...nodes.map((node) => this._addOption(node)));
218
+ column.firstElementChild?.setAttribute("tabindex", "0");
219
+ this.popover.append(column);
220
+ return column;
221
+ }
222
+ _addOption(node) {
223
+ const option = document.createElement("li");
224
+ option.id = `${this.popover.id}-${this._ids++}`;
225
+ option.setAttribute("role", "option");
226
+ option.setAttribute("aria-selected", "false");
227
+ option.tabIndex = -1;
228
+ option.textContent = node.label;
229
+ if (node.children.length) {
230
+ const chevron = document.createElement("span");
231
+ chevron.className = "cascader-chevron";
232
+ chevron.setAttribute("aria-hidden", "true");
233
+ option.append(chevron);
234
+ }
235
+ this._nodes.set(option, node);
236
+ this._rendered.set(node, option);
237
+ return option;
238
+ }
239
+ /** The rendered option for `node`, if it is shown. */
240
+ _optionFor(node) {
241
+ return this._rendered.get(node);
242
+ }
243
+ /**
244
+ * Puts `node` on the open path at `level`: it is selected in its column,
245
+ * the columns after it go, and a branch shows its children next.
246
+ */
247
+ _choose(level, node) {
248
+ this._open = [...this._open.slice(0, level), node];
249
+ this._columns.splice(level + 1).forEach((column) => column.remove());
250
+ this._columns[level].querySelectorAll('[role="option"]').forEach((option) => {
251
+ const selected = this._nodes.get(option) === node;
252
+ option.setAttribute("aria-selected", String(selected));
253
+ option.setAttribute("tabindex", selected ? "0" : "-1");
254
+ });
255
+ if (node.children.length) this._columns.push(this._addColumn(node.children, node));
256
+ }
257
+ /** Moves focus to an option and makes it its column's tab stop. */
258
+ _focus(option) {
259
+ if (!(option instanceof HTMLElement)) return;
260
+ option.parentElement.querySelectorAll('[tabindex="0"]').forEach((other) => other.setAttribute("tabindex", "-1"));
261
+ option.tabIndex = 0;
262
+ option.focus();
263
+ }
264
+ /**
265
+ * A named input would submit the path's labels. The control submits under
266
+ * that name instead, one value per level, so the input gives its name and
267
+ * required up until destroy().
268
+ */
269
+ _takeName() {
270
+ this._formName = this.input.getAttribute("name") ?? "";
271
+ if (this._formName && formAssociated()) this._wrap();
272
+ }
273
+ /** Wraps the input in the control, which takes its required too. */
274
+ _wrap() {
275
+ this._required = this.input.required;
276
+ this.input.required = false;
277
+ if (this._required) this.input.setAttribute("aria-required", "true");
278
+ this._control = wrapInControl(CONTROL, this.input, () => this._sync());
279
+ this._control.onFormReset = () => this._reset();
280
+ this._control.addEventListener("invalid", this._handleInvalid, { signal: this._events.signal });
281
+ this._sync();
282
+ }
283
+ /** After the path changes: one form value per level, and a required field's validity. */
284
+ _sync() {
285
+ if (!this._control) return;
286
+ const data = new FormData();
287
+ this.value.forEach((value) => data.append(this._formName, value));
288
+ this._control.internals.setFormValue(data);
289
+ this._validate();
290
+ }
291
+ /** A required field is missing a value until a path is committed; the message anchors at the input. */
292
+ _validate() {
293
+ const missing = this._required && !this._path.length;
294
+ this._control.internals.setValidity({ valueMissing: missing }, missing ? this._requiredMessage : "", this.input);
295
+ if (!missing) restoreAttribute(this.input, "aria-invalid", this._saved[INPUT_ATTRIBUTES.indexOf("aria-invalid")]);
296
+ }
297
+ /** A validity flag needs a message, so an empty i18n.required falls back to the default. */
298
+ get _requiredMessage() {
299
+ return this.options.i18n.required || _defaults.i18n.required;
300
+ }
301
+ /** A form reset puts the starting path back without firing events. */
302
+ _reset() {
303
+ this.close();
304
+ this._path = this._initialPath;
305
+ this._show();
306
+ this._sync();
307
+ }
308
+ /** Unwraps the input and gives it its name and required back. */
309
+ _giveNameBack() {
310
+ if (!this._control) return;
311
+ unwrapControl(this._control, this.input);
312
+ this._control = null;
313
+ this.input.required = this._required;
314
+ }
315
+ /** Commits the open path, ending at a leaf: the input shows it, and changes to it fire input and change. */
316
+ _commit() {
317
+ const changed = !samePath(this._open, this._path);
318
+ this._path = this._open;
319
+ this._show();
320
+ this._sync();
321
+ this.close();
322
+ this.input.focus();
323
+ if (!changed) return;
324
+ this.input.dispatchEvent(new Event("input", { bubbles: true }));
325
+ this.input.dispatchEvent(new Event("change", { bubbles: true }));
326
+ }
327
+ /** Chooses an option: a branch opens its children, and a leaf commits the path. */
328
+ _pick(option) {
329
+ if (this.input.matches(":disabled")) return this.close();
330
+ const node = this._nodes.get(option);
331
+ this._choose(this._columns.indexOf(option.parentElement), node);
332
+ if (!node.children.length) this._commit();
333
+ }
334
+ /** Moves into the next column from a branch; a leaf has none. */
335
+ _forward(option) {
336
+ if (this._nodes.get(option).children.length) this._enter(option);
337
+ }
338
+ /** Enter and Space: a branch opens the next column, and a leaf commits. */
339
+ _activate(option) {
340
+ if (this._nodes.get(option).children.length) this._enter(option);
341
+ else this._pick(option);
342
+ }
343
+ /** Chooses a branch and moves focus to the first option of its column. */
344
+ _enter(option) {
345
+ this._pick(option);
346
+ this._focus(this._columns.at(-1)?.firstElementChild);
347
+ }
348
+ /** Back to the option that opened this column, leaving the columns as they are. */
349
+ _back(option) {
350
+ const level = this._columns.indexOf(option.parentElement);
351
+ if (level > 0) this._focus(this._optionFor(this._open[level - 1]));
352
+ }
353
+ /** Closes without committing and returns focus to the input. */
354
+ _dismiss() {
355
+ this.close();
356
+ this.input.focus();
357
+ }
358
+ /** Up, Down, Home and End within a column, without wrapping. */
359
+ _move(option, e) {
360
+ this._focus(Utils.focusTarget(Array.from(option.parentElement.children), e, { ArrowDown: 1, ArrowUp: -1 }));
361
+ }
362
+ /** The key's left-to-right name, so ArrowLeft and ArrowRight follow the columns under dir="rtl". */
363
+ _keyName(e) {
364
+ return getComputedStyle(this.el).direction === "rtl" ? RTL_KEYS[e.key] ?? e.key : e.key;
365
+ }
366
+ /** Shows the chosen path's labels in the input. */
367
+ _show() {
368
+ this.input.value = this._path.map((node) => node.label).join(SEPARATOR);
369
+ }
370
+ };
371
+ Cascader.key = "Expressive_Cascader";
372
+
373
+ export {
374
+ Cascader
375
+ };
376
+ //# sourceMappingURL=chunk-NVQ5EHCU.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/cascader.ts"],
4
+ "sourcesContent": ["import { Utils, controllerFor, restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\nimport { FormControl, formAssociated, wrapInControl, unwrapControl } from '../core/formControl';\n\n/** One option from the author's nested lists. */\ninterface CascaderNode {\n value: string;\n label: string;\n parent: CascaderNode | null;\n children: CascaderNode[];\n source: HTMLLIElement;\n}\n\n/** The form control a named field submits through, wrapping its input. */\nconst CONTROL = 'expressive-cascader-control';\n\n/** The input attributes the component sets, put back by destroy(). */\nconst INPUT_ATTRIBUTES = ['readonly', 'role', 'aria-haspopup', 'aria-expanded', 'aria-controls', 'aria-required', 'aria-invalid'];\n\n/** Keys that open the popover from the input; Alt+ArrowDown is ArrowDown too. */\nconst OPEN_KEYS = ['Enter', ' ', 'ArrowDown'];\n\n/** Arrow keys swapped under dir=\"rtl\", where the next column is to the left. */\nconst RTL_KEYS: Record<string, string> = { ArrowLeft: 'ArrowRight', ArrowRight: 'ArrowLeft' };\n\n/** How the input shows a committed path. */\nconst SEPARATOR = ' / ';\n\n/** An option's own text, without the text of the lists nested in it. */\nconst ownText = (li: Element) =>\n Array.from(li.childNodes, (node) => (node.nodeName === 'UL' ? ' ' : node.textContent)).join('').replace(/\\s+/g, ' ').trim();\n\n/** The options in a list, each with the options nested under it. */\nfunction parse(list: Element | null, parent: CascaderNode | null): CascaderNode[] {\n if (!list) return [];\n return Array.from(list.querySelectorAll<HTMLLIElement>(':scope > li'), (source) => {\n const node: CascaderNode = { value: source.dataset.value ?? '', label: ownText(source), parent, children: [], source };\n node.children = parse(source.querySelector(':scope > ul'), node);\n return node;\n });\n}\n\n/** Whether two paths hold the same options. */\nconst samePath = (a: CascaderNode[], b: CascaderNode[]) => a.length === b.length && a.every((node, i) => node === b[i]);\n\n/** Every option, depth first, which is document order. */\nconst flatten = (nodes: CascaderNode[]): CascaderNode[] => nodes.flatMap((node) => [node, ...flatten(node.children)]);\n\n/** The options from the first one to `node`. */\nfunction pathTo(node: CascaderNode | undefined): CascaderNode[] {\n const path: CascaderNode[] = [];\n for (let at = node; at; at = at.parent) path.unshift(at);\n return path;\n}\n\nexport interface CascaderI18nOptions {\n /** What a required field says while no path is chosen. */\n required: string;\n}\n\nexport interface CascaderOptions extends BaseOptions {\n /**\n * Text the cascader shows.\n * @default { required: 'Choose an option.' }\n */\n i18n: CascaderI18nOptions;\n}\n\nconst _defaults: CascaderOptions = {\n i18n: { required: 'Choose an option.' }\n};\n\nexport class Cascader extends Component<CascaderOptions> {\n /** The text input that shows the chosen path. */\n input: HTMLInputElement;\n /** The popover of columns. */\n popover: HTMLElement;\n /** The options from the author's lists. */\n private _options: CascaderNode[];\n /** The chosen path, from the first column to a leaf, or empty. */\n private _path: CascaderNode[] = [];\n /** Whether the popover is open. */\n isOpen = false;\n /** The input's attributes before the component started. */\n private _saved: (string | null)[];\n /** The path shown while the popover is open, which a leaf commits. */\n private _open: CascaderNode[] = [];\n /** The open listbox columns, one per level of the open path. */\n private _columns: HTMLElement[] = [];\n /** Each rendered option's node. */\n private _nodes = new Map<Element, CascaderNode>();\n /** Each node's current option; choosing a branch again renders it anew. */\n private _rendered = new Map<CascaderNode, HTMLElement>();\n /** The last press inside the field, which the document listener lets through. */\n private _insidePress: Event | null = null;\n /** Listeners that last while the popover is open. */\n private _openEvents: AbortController | null = null;\n /** What names the popover and the first column: the input's own aria-labelledby or its label's id. */\n private _labelledBy: string | null;\n /** A label id the component gave, which destroy() takes back. */\n private _stampedLabel: HTMLLabelElement | null = null;\n private _ids = 0;\n /** The path the field started with, which a form reset puts back. */\n private _initialPath: CascaderNode[] = [];\n /** The form control wrapping a named input, which the form reads instead of it. */\n private _control: FormControl | null = null;\n /** The form name the input had, which the control submits under. */\n private _formName = '';\n private _required = false;\n\n constructor(el: HTMLElement, options: Partial<CascaderOptions> = {}) {\n super(el, options);\n this.input = this.el.querySelector<HTMLInputElement>(':scope > input');\n this._options = parse(this.el.querySelector(':scope > .cascader-options'), null);\n if (!this.input) return;\n this._saved = INPUT_ATTRIBUTES.map((name) => this.input.getAttribute(name));\n this.popover = document.createElement('div');\n this.popover.id = `cascader-${Utils.guid()}`;\n this.popover.className = 'cascader-popover';\n this.popover.setAttribute('popover', 'manual');\n this.popover.setAttribute('role', 'dialog');\n this.el.append(this.popover);\n this._labelledBy = this.input.getAttribute('aria-labelledby') ?? this._labelId();\n this._name(this.popover);\n this.input.readOnly = true;\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'dialog');\n this.input.setAttribute('aria-expanded', 'false');\n this.input.setAttribute('aria-controls', this.popover.id);\n this._path = this._initialPath = this._startingPath();\n this._show();\n this._takeName();\n const { signal } = this._events;\n this.input.addEventListener('click', this._handleInputClick, { signal });\n this.input.addEventListener('keydown', this._handleInputKeydown, { signal });\n this.popover.addEventListener('click', this._handleOptionClick, { signal });\n this.popover.addEventListener('keydown', this._handleOptionKeydown, { signal });\n }\n\n static get defaults(): CascaderOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Cascader';\n\n /** The values of the chosen path, from the first column on. */\n get value(): string[] {\n return this._path.map((node) => node.value);\n }\n\n /** Opens the popover at the chosen path, with focus on its leaf or on the first option. */\n open() {\n if (this.isOpen || this.input.matches(':disabled')) return;\n this.isOpen = true;\n this._columns = [this._addColumn(this._options, null)];\n this._open = [];\n this._path.forEach((node, level) => this._choose(level, node));\n this._showPopover();\n this._focus(this._optionFor(this._path.at(-1)) ?? this._columns[0].querySelector('[role=\"option\"]'));\n }\n\n /** Closes the popover, keeping the chosen path. */\n close() {\n if (!this.isOpen) return;\n this.isOpen = false;\n this._openEvents.abort();\n this.popover.hidePopover?.();\n this.popover.replaceChildren();\n this._columns = [];\n this._nodes.clear();\n this._rendered.clear();\n this.input.setAttribute('aria-expanded', 'false');\n }\n\n destroy() {\n if (this.input) {\n this.close();\n this._giveNameBack();\n this._stampedLabel?.removeAttribute('id');\n this.popover.remove();\n INPUT_ATTRIBUTES.forEach((name, i) => restoreAttribute(this.input, name, this._saved[i]));\n }\n super.destroy();\n }\n\n /** The path to the first leaf marked data-selected; a marked branch does not count. */\n private _startingPath() {\n return pathTo(flatten(this._options).find((node) => !node.children.length && node.source.hasAttribute('data-selected')));\n }\n\n /** Shows the popover anchored to the input, until a press outside closes it. */\n private _showPopover() {\n (this.popover as HTMLElement & { showPopover(options?: { source?: HTMLElement }): void }).showPopover?.({ source: this.input });\n this.input.setAttribute('aria-expanded', 'true');\n this._openEvents = controllerFor(this.el);\n const { signal } = this._openEvents;\n this.el.addEventListener('pointerdown', this._handleInsidePointer, { signal });\n document.addEventListener('pointerdown', this._handleOutsidePointer, { signal });\n }\n\n /** The id of the input's first label, given one if it has none, or null. */\n private _labelId() {\n const label = this.input.labels?.[0];\n if (!label) return null;\n if (!label.id) {\n label.id = `${this.popover.id}-label`;\n this._stampedLabel = label;\n }\n return label.id;\n }\n\n /** Names the popover or the first column after the field. */\n private _name(el: HTMLElement) {\n if (this._labelledBy) el.setAttribute('aria-labelledby', this._labelledBy);\n else restoreAttribute(el, 'aria-label', this.input.getAttribute('aria-label'));\n }\n\n /** A listbox of `nodes`, named after the option that opened it, or after the field for the first. */\n private _addColumn(nodes: CascaderNode[], opener: CascaderNode | null) {\n const column = document.createElement('ul');\n column.setAttribute('role', 'listbox');\n if (opener) column.setAttribute('aria-labelledby', this._optionFor(opener).id);\n else this._name(column);\n column.append(...nodes.map((node) => this._addOption(node)));\n column.firstElementChild?.setAttribute('tabindex', '0');\n this.popover.append(column);\n return column;\n }\n\n private _addOption(node: CascaderNode) {\n const option = document.createElement('li');\n option.id = `${this.popover.id}-${this._ids++}`;\n option.setAttribute('role', 'option');\n option.setAttribute('aria-selected', 'false');\n option.tabIndex = -1;\n option.textContent = node.label;\n if (node.children.length) {\n const chevron = document.createElement('span');\n chevron.className = 'cascader-chevron';\n chevron.setAttribute('aria-hidden', 'true');\n option.append(chevron);\n }\n this._nodes.set(option, node);\n this._rendered.set(node, option);\n return option;\n }\n\n /** The rendered option for `node`, if it is shown. */\n private _optionFor(node: CascaderNode | undefined): HTMLElement | undefined {\n return this._rendered.get(node);\n }\n\n /**\n * Puts `node` on the open path at `level`: it is selected in its column,\n * the columns after it go, and a branch shows its children next.\n */\n private _choose(level: number, node: CascaderNode) {\n this._open = [...this._open.slice(0, level), node];\n this._columns.splice(level + 1).forEach((column) => column.remove());\n this._columns[level].querySelectorAll('[role=\"option\"]').forEach((option) => {\n const selected = this._nodes.get(option) === node;\n option.setAttribute('aria-selected', String(selected));\n option.setAttribute('tabindex', selected ? '0' : '-1');\n });\n if (node.children.length) this._columns.push(this._addColumn(node.children, node));\n }\n\n /** Moves focus to an option and makes it its column's tab stop. */\n private _focus(option: Element | null | undefined) {\n if (!(option instanceof HTMLElement)) return;\n option.parentElement.querySelectorAll('[tabindex=\"0\"]').forEach((other) => other.setAttribute('tabindex', '-1'));\n option.tabIndex = 0;\n option.focus();\n }\n\n /**\n * A named input would submit the path's labels. The control submits under\n * that name instead, one value per level, so the input gives its name and\n * required up until destroy().\n */\n private _takeName() {\n this._formName = this.input.getAttribute('name') ?? '';\n // ponytail: without form-associated custom elements (jsdom) the input keeps its name and submits the labels.\n if (this._formName && formAssociated()) this._wrap();\n }\n\n /** Wraps the input in the control, which takes its required too. */\n private _wrap() {\n this._required = this.input.required;\n this.input.required = false;\n if (this._required) this.input.setAttribute('aria-required', 'true');\n this._control = wrapInControl(CONTROL, this.input, () => this._sync());\n this._control.onFormReset = () => this._reset();\n this._control.addEventListener('invalid', this._handleInvalid, { signal: this._events.signal });\n this._sync();\n }\n\n /** After the path changes: one form value per level, and a required field's validity. */\n private _sync() {\n if (!this._control) return;\n const data = new FormData();\n this.value.forEach((value) => data.append(this._formName, value));\n this._control.internals.setFormValue(data);\n this._validate();\n }\n\n /** A required field is missing a value until a path is committed; the message anchors at the input. */\n private _validate() {\n const missing = this._required && !this._path.length;\n this._control.internals.setValidity({ valueMissing: missing }, missing ? this._requiredMessage : '', this.input);\n if (!missing) restoreAttribute(this.input, 'aria-invalid', this._saved[INPUT_ATTRIBUTES.indexOf('aria-invalid')]);\n }\n\n /** A validity flag needs a message, so an empty i18n.required falls back to the default. */\n private get _requiredMessage() {\n return this.options.i18n.required || _defaults.i18n.required;\n }\n\n /** A form reset puts the starting path back without firing events. */\n private _reset() {\n this.close();\n this._path = this._initialPath;\n this._show();\n this._sync();\n }\n\n /** Unwraps the input and gives it its name and required back. */\n private _giveNameBack() {\n if (!this._control) return;\n unwrapControl(this._control, this.input);\n this._control = null;\n this.input.required = this._required;\n }\n\n /** Commits the open path, ending at a leaf: the input shows it, and changes to it fire input and change. */\n private _commit() {\n const changed = !samePath(this._open, this._path);\n this._path = this._open;\n this._show();\n this._sync();\n this.close();\n this.input.focus();\n if (!changed) return;\n this.input.dispatchEvent(new Event('input', { bubbles: true }));\n this.input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n /** Chooses an option: a branch opens its children, and a leaf commits the path. */\n private _pick(option: Element) {\n if (this.input.matches(':disabled')) return this.close();\n const node = this._nodes.get(option);\n this._choose(this._columns.indexOf(option.parentElement), node);\n if (!node.children.length) this._commit();\n }\n\n /** Moves into the next column from a branch; a leaf has none. */\n private _forward(option: HTMLElement) {\n if (this._nodes.get(option).children.length) this._enter(option);\n }\n\n /** Enter and Space: a branch opens the next column, and a leaf commits. */\n private _activate(option: HTMLElement) {\n if (this._nodes.get(option).children.length) this._enter(option);\n else this._pick(option);\n }\n\n /** Chooses a branch and moves focus to the first option of its column. */\n private _enter(option: HTMLElement) {\n this._pick(option);\n this._focus(this._columns.at(-1)?.firstElementChild);\n }\n\n /** Back to the option that opened this column, leaving the columns as they are. */\n private _back(option: HTMLElement) {\n const level = this._columns.indexOf(option.parentElement);\n if (level > 0) this._focus(this._optionFor(this._open[level - 1]));\n }\n\n /** Closes without committing and returns focus to the input. */\n private _dismiss() {\n this.close();\n this.input.focus();\n }\n\n /** Up, Down, Home and End within a column, without wrapping. */\n private _move(option: HTMLElement, e: KeyboardEvent) {\n this._focus(Utils.focusTarget(Array.from(option.parentElement.children) as HTMLElement[], e, { ArrowDown: 1, ArrowUp: -1 }));\n }\n\n /** What each key does on an option, by its left-to-right name. */\n private _keys: Record<string, (option: HTMLElement, e: KeyboardEvent) => void> = {\n ArrowDown: (option, e) => this._move(option, e),\n ArrowUp: (option, e) => this._move(option, e),\n Home: (option, e) => this._move(option, e),\n End: (option, e) => this._move(option, e),\n ArrowRight: (option) => this._forward(option),\n ArrowLeft: (option) => this._back(option),\n Enter: (option) => this._activate(option),\n ' ': (option) => this._activate(option),\n Escape: () => this._dismiss(),\n Tab: () => this._dismiss(),\n };\n\n /** The key's left-to-right name, so ArrowLeft and ArrowRight follow the columns under dir=\"rtl\". */\n private _keyName(e: KeyboardEvent) {\n return getComputedStyle(this.el).direction === 'rtl' ? RTL_KEYS[e.key] ?? e.key : e.key;\n }\n\n _handleInputKeydown = Utils.ignoringComposition((e: KeyboardEvent) => {\n if (this.isOpen || !OPEN_KEYS.includes(e.key)) return;\n e.preventDefault();\n this.open();\n });\n\n _handleOptionKeydown = (e: KeyboardEvent) => {\n const option = (e.target as Element).closest<HTMLElement>('[role=\"option\"]');\n const action = option && this._keys[this._keyName(e)];\n // Alt, Ctrl and Meta combinations belong to the browser; Shift+Tab still closes.\n if (!action || !Utils.plainKey(e)) return;\n e.preventDefault();\n action(option, e);\n };\n\n /** A submit or checkValidity() found no path: the input says so to assistive technology. */\n _handleInvalid = () => {\n this.input.setAttribute('aria-invalid', 'true');\n };\n\n _handleInputClick = () => {\n if (this.isOpen) this.close();\n else this.open();\n };\n\n /** A click on a branch keeps focus on it; one on a leaf commits. */\n _handleOptionClick = (e: MouseEvent) => {\n const option = (e.target as Element).closest('[role=\"option\"]');\n if (!option) return;\n this._focus(option);\n this._pick(option);\n };\n\n // Marked rather than found on the composed path, which a document listener\n // cannot see into when the field sits in a closed shadow root.\n _handleInsidePointer = (e: PointerEvent) => {\n this._insidePress = e;\n };\n\n /** A press outside the field and the popover closes it, leaving focus where the press puts it. */\n _handleOutsidePointer = (e: PointerEvent) => {\n if (e !== this._insidePress) this.close();\n };\n\n /** Shows the chosen path's labels in the input. */\n private _show() {\n this.input.value = this._path.map((node) => node.label).join(SEPARATOR);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,9 +1,10 @@
1
- import {
2
- Utils
3
- } from "./chunk-M372EDXD.mjs";
4
1
  import {
5
2
  Component
6
- } from "./chunk-PD6HYHAE.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ restoreAttribute
7
+ } from "./chunk-ZVLOUDIJ.mjs";
7
8
 
8
9
  // src/ts/components/expandingCard.ts
9
10
  var _defaults = {
@@ -11,27 +12,23 @@ var _defaults = {
11
12
  onClose: null
12
13
  };
13
14
  var EXPANDING_CARD_SELECTOR = "article.expanding-card:has(> dialog.expanding-card-dialog)";
14
- var ExpandingCard = class _ExpandingCard extends Component {
15
+ var ExpandingCard = class extends Component {
15
16
  constructor(el, options) {
16
- super(el, options, _ExpandingCard);
17
+ super(el, options);
17
18
  this.isOpen = false;
18
19
  this.closeGeneration = 0;
20
+ // Trigger attributes as they were before init, so destroy() can restore them.
21
+ this._initialTrigger = {};
19
22
  this._setupEventHandlers = () => {
20
- this.trigger?.addEventListener("click", this.open);
21
- this.trigger?.addEventListener("keypress", this._handleTriggerKeypress);
22
- this.closeButton?.addEventListener("click", this.close);
23
- this.dialog?.addEventListener("cancel", this._handleCancel);
24
- this.dialog?.addEventListener("close", this._handleNativeClose);
25
- };
26
- this._removeEventHandlers = () => {
27
- this.trigger?.removeEventListener("click", this.open);
28
- this.trigger?.removeEventListener("keypress", this._handleTriggerKeypress);
29
- this.closeButton?.removeEventListener("click", this.close);
30
- this.dialog?.removeEventListener("cancel", this._handleCancel);
31
- this.dialog?.removeEventListener("close", this._handleNativeClose);
23
+ const { signal } = this._events;
24
+ this.trigger?.addEventListener("click", this.open, { signal });
25
+ this.trigger?.addEventListener("keypress", this._handleTriggerKeypress, { signal });
26
+ this.closeButton?.addEventListener("click", this.close, { signal });
27
+ this.dialog?.addEventListener("cancel", this._handleCancel, { signal });
28
+ this.dialog?.addEventListener("close", this._handleNativeClose, { signal });
32
29
  };
33
30
  this._handleTriggerKeypress = (event) => {
34
- if (event.key === Utils.keys.ENTER || event.key === " ") {
31
+ if (event.key === "Enter" || event.key === " ") {
35
32
  event.preventDefault();
36
33
  this.open();
37
34
  }
@@ -42,7 +39,9 @@ var ExpandingCard = class _ExpandingCard extends Component {
42
39
  };
43
40
  this._handleNativeClose = () => {
44
41
  if (this.dialog.open) return;
42
+ const wasOpen = this.isOpen;
45
43
  this._collapse();
44
+ if (wasOpen) this._notify("close", this.options.onClose, { current: () => !this.isOpen });
46
45
  };
47
46
  this._setTransitionOrigin = () => {
48
47
  if (!this.dialog) return;
@@ -67,23 +66,18 @@ var ExpandingCard = class _ExpandingCard extends Component {
67
66
  this._setTransitionOrigin();
68
67
  this.isOpen = true;
69
68
  this.trigger.ariaExpanded = "true";
70
- this.dialog.ariaExpanded = "true";
71
69
  this.dialog.showModal();
72
70
  void this.dialog.offsetWidth;
73
71
  this.dialog.classList.add("expanded");
74
72
  this.closeButton?.focus();
75
- if (typeof this.options.onOpen === "function") {
76
- this.options.onOpen.call(this, this.el);
77
- }
73
+ this._notify("open", this.options.onOpen, { current: () => this.isOpen });
78
74
  };
79
75
  this.close = () => {
80
76
  if (!this.isOpen || !this.dialog || !this.trigger) return;
81
77
  this._setTransitionOrigin();
82
78
  this._collapse();
83
79
  const generation = this.closeGeneration;
84
- if (typeof this.options.onClose === "function") {
85
- this.options.onClose.call(this, this.el);
86
- }
80
+ this._notify("close", this.options.onClose, { current: () => !this.isOpen });
87
81
  const finish = () => {
88
82
  if (generation !== this.closeGeneration || this.isOpen || !this.dialog.open) return;
89
83
  this.dialog.close();
@@ -96,11 +90,6 @@ var ExpandingCard = class _ExpandingCard extends Component {
96
90
  if (transitions.length === 0) finish();
97
91
  else void Promise.allSettled(transitions.map((animation) => animation.finished)).then(finish);
98
92
  };
99
- this.el["Expressive_ExpandingCard"] = this;
100
- this.options = {
101
- ..._ExpandingCard.defaults,
102
- ...options
103
- };
104
93
  this.dialog = this.el.querySelector(
105
94
  ":scope > dialog.expanding-card-dialog"
106
95
  );
@@ -109,6 +98,8 @@ var ExpandingCard = class _ExpandingCard extends Component {
109
98
  );
110
99
  this.closeButton = this.dialog?.querySelector(".expanding-card-close") ?? null;
111
100
  if (this.trigger && this.dialog) {
101
+ for (const name of ["aria-expanded", "aria-controls", "tabindex", "role"])
102
+ this._initialTrigger[name] = this.trigger.getAttribute(name);
112
103
  this.trigger.ariaExpanded = "false";
113
104
  if (this.dialog.id)
114
105
  this.trigger.setAttribute("aria-controls", this.dialog.id);
@@ -116,34 +107,25 @@ var ExpandingCard = class _ExpandingCard extends Component {
116
107
  this.trigger.tabIndex = 0;
117
108
  this.trigger.setAttribute("role", "button");
118
109
  }
119
- this.dialog.ariaExpanded = "false";
120
110
  this._setupEventHandlers();
121
111
  }
122
112
  }
123
113
  static get defaults() {
124
114
  return _defaults;
125
115
  }
126
- static init(els, options) {
127
- return super.init(els, options, _ExpandingCard);
128
- }
129
- static getInstance(el) {
130
- return el["Expressive_ExpandingCard"];
131
- }
132
116
  destroy() {
133
- this._removeEventHandlers();
117
+ this._events.abort();
134
118
  this._collapse();
135
119
  if (this.dialog?.open) this.dialog.close();
136
- this.el["Expressive_ExpandingCard"] = void 0;
120
+ for (const [name, value] of Object.entries(this._initialTrigger)) restoreAttribute(this.trigger, name, value);
121
+ super.destroy();
137
122
  }
138
123
  /** Marks the card closed and invalidates any pending close. */
139
124
  _collapse() {
140
125
  this.closeGeneration++;
141
126
  this.isOpen = false;
142
127
  if (this.trigger) this.trigger.ariaExpanded = "false";
143
- if (this.dialog) {
144
- this.dialog.ariaExpanded = "false";
145
- this.dialog.classList.remove("expanded");
146
- }
128
+ this.dialog?.classList.remove("expanded");
147
129
  }
148
130
  static Init() {
149
131
  Utils.onDocumentReady(() => {
@@ -155,9 +137,10 @@ var ExpandingCard = class _ExpandingCard extends Component {
155
137
  });
156
138
  }
157
139
  };
140
+ ExpandingCard.key = "Expressive_ExpandingCard";
158
141
 
159
142
  export {
160
143
  EXPANDING_CARD_SELECTOR,
161
144
  ExpandingCard
162
145
  };
163
- //# sourceMappingURL=chunk-DXGRXYYL.mjs.map
146
+ //# sourceMappingURL=chunk-OP43LLIC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/expandingCard.ts"],
4
+ "sourcesContent": ["import { Utils, restoreAttribute } from \"../core/utils\";\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ExpandingCardOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: ExpandingCardOptions = {\n onOpen: null,\n onClose: null,\n};\n\nexport const EXPANDING_CARD_SELECTOR =\n \"article.expanding-card:has(> dialog.expanding-card-dialog)\";\n\n/**\n * Morphs a compact card into a full-screen modal detail surface.\n */\nexport class ExpandingCard extends Component<ExpandingCardOptions> {\n isOpen: boolean = false;\n private readonly trigger: HTMLElement | null;\n private readonly dialog: HTMLDialogElement | null;\n private readonly closeButton: HTMLElement | null;\n private closeGeneration = 0;\n // Trigger attributes as they were before init, so destroy() can restore them.\n private _initialTrigger: Record<string, string | null> = {};\n\n constructor(el: HTMLElement, options: Partial<ExpandingCardOptions>) {\n super(el, options);\n\n this.dialog = this.el.querySelector(\n \":scope > dialog.expanding-card-dialog\",\n );\n this.trigger = this.el.querySelector(\n \":scope > .expanding-card-trigger, :scope > figure > .expanding-card-trigger\",\n );\n this.closeButton =\n this.dialog?.querySelector(\".expanding-card-close\") ?? null;\n\n if (this.trigger && this.dialog) {\n for (const name of [\"aria-expanded\", \"aria-controls\", \"tabindex\", \"role\"])\n this._initialTrigger[name] = this.trigger.getAttribute(name);\n this.trigger.ariaExpanded = \"false\";\n if (this.dialog.id)\n this.trigger.setAttribute(\"aria-controls\", this.dialog.id);\n if (!this.trigger.matches(\"a[href], button, input, select, textarea\")) {\n this.trigger.tabIndex = 0;\n this.trigger.setAttribute(\"role\", \"button\");\n }\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): ExpandingCardOptions {\n return _defaults;\n }\n\n static key = 'Expressive_ExpandingCard';\n\n destroy() {\n this._events.abort();\n this._collapse();\n if (this.dialog?.open) this.dialog.close();\n for (const [name, value] of Object.entries(this._initialTrigger)) restoreAttribute(this.trigger, name, value);\n super.destroy();\n }\n\n private _setupEventHandlers = () => {\n const { signal } = this._events;\n this.trigger?.addEventListener(\"click\", this.open, { signal });\n this.trigger?.addEventListener(\"keypress\", this._handleTriggerKeypress, { signal });\n this.closeButton?.addEventListener(\"click\", this.close, { signal });\n this.dialog?.addEventListener(\"cancel\", this._handleCancel, { signal });\n this.dialog?.addEventListener(\"close\", this._handleNativeClose, { signal });\n };\n\n private _handleTriggerKeypress = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === \" \") {\n event.preventDefault();\n this.open();\n }\n };\n\n private _handleCancel = (event: Event) => {\n event.preventDefault();\n this.close();\n };\n\n private _handleNativeClose = () => {\n // A queued close event can arrive after a caller has reopened the dialog.\n if (this.dialog.open) return;\n // dialog.close() and <form method=\"dialog\"> bypass close(), so report here.\n const wasOpen = this.isOpen;\n this._collapse();\n if (wasOpen) this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n };\n\n /** Marks the card closed and invalidates any pending close. */\n private _collapse() {\n this.closeGeneration++;\n this.isOpen = false;\n if (this.trigger) this.trigger.ariaExpanded = \"false\";\n this.dialog?.classList.remove(\"expanded\");\n }\n\n private _setTransitionOrigin = () => {\n if (!this.dialog) return;\n const card = this.el.getBoundingClientRect();\n const media = this.el.querySelector<HTMLElement>(\n \":scope > figure, :scope > img\",\n );\n const mediaRect = media?.getBoundingClientRect();\n const set = (side: string, px: number) =>\n this.dialog.style.setProperty(\n `--md-comp-expanding-card-from-${side}`,\n `${Math.max(0, px)}px`,\n );\n\n set(\"top\", card.top);\n set(\"right\", window.innerWidth - card.right);\n set(\"bottom\", window.innerHeight - card.bottom);\n set(\"left\", card.left);\n set(\"media-height\", mediaRect?.height ?? 0);\n };\n\n open: () => void = () => {\n if (this.isOpen || !this.dialog || !this.trigger) return;\n this.closeGeneration++;\n\n this._setTransitionOrigin();\n this.isOpen = true;\n this.trigger.ariaExpanded = \"true\";\n this.dialog.showModal();\n // Commit the clipped start frame before asking CSS to expand it.\n void this.dialog.offsetWidth;\n this.dialog.classList.add(\"expanded\");\n this.closeButton?.focus();\n\n this._notify('open', this.options.onOpen, { current: () => this.isOpen });\n };\n\n close: () => void = () => {\n if (!this.isOpen || !this.dialog || !this.trigger) return;\n this._setTransitionOrigin();\n this._collapse();\n const generation = this.closeGeneration;\n\n this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n\n const finish = () => {\n if (generation !== this.closeGeneration || this.isOpen || !this.dialog.open) return;\n this.dialog.close();\n if (this.dialog.isConnected && this.trigger.isConnected) this.trigger.focus();\n };\n const reducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n // Wait only for the container's actual clip transition, not arbitrary\n // animations in consumer content. Cancellation also completes cleanup.\n const transitions = reducedMotion ? [] : (this.dialog.getAnimations?.() ?? [])\n .filter((animation) => (animation as CSSTransition).transitionProperty === \"clip-path\");\n if (transitions.length === 0) finish();\n else void Promise.allSettled(transitions.map((animation) => animation.finished)).then(finish);\n };\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.querySelectorAll(EXPANDING_CARD_SELECTOR).forEach((el) => {\n if (el[\"Expressive_ExpandingCard\"] == undefined) {\n this.init(el as HTMLElement);\n }\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }