@expressivecss/expressive 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/CHANGELOG.md +1807 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19176 -11958
  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-26VUH75M.mjs +102 -0
  64. package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2LFCOGC3.mjs +233 -0
  66. package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
  67. package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-36GELQGX.mjs} +29 -46
  68. package/dist/js/chunks/chunk-36GELQGX.mjs.map +7 -0
  69. package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-3FKWIRHW.mjs} +15 -29
  70. package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-3KF65KGL.mjs +209 -0
  72. package/dist/js/chunks/chunk-3KF65KGL.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-3KLZRQZI.mjs} +88 -116
  74. package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-3XORNED5.mjs} +3 -11
  76. package/dist/js/chunks/chunk-3XORNED5.mjs.map +7 -0
  77. package/dist/js/chunks/chunk-4WBGAQN3.mjs +113 -0
  78. package/dist/js/chunks/chunk-4WBGAQN3.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-5F4URJHL.mjs} +19 -30
  80. package/dist/js/chunks/chunk-5F4URJHL.mjs.map +7 -0
  81. package/dist/js/chunks/chunk-67UNY7RH.mjs +299 -0
  82. package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
  83. package/dist/js/chunks/chunk-7CXNATJS.mjs +97 -0
  84. package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
  85. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-7X44MKEQ.mjs} +43 -48
  86. package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
  87. package/dist/js/chunks/chunk-7ZAMOMGY.mjs +440 -0
  88. package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
  89. package/dist/js/chunks/chunk-AEG6LOAJ.mjs +54 -0
  90. package/dist/js/chunks/chunk-AEG6LOAJ.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-AQNFCJJ5.mjs +135 -0
  92. package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-B55LWKBM.mjs +75 -0
  94. package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-BB5VXYXT.mjs +28 -0
  96. package/dist/js/chunks/chunk-BB5VXYXT.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-BDATLH3H.mjs +108 -0
  98. package/dist/js/chunks/chunk-BDATLH3H.mjs.map +7 -0
  99. package/dist/js/chunks/chunk-CWMQOT4O.mjs +232 -0
  100. package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
  101. package/dist/js/chunks/chunk-CY2CTOVM.mjs +81 -0
  102. package/dist/js/chunks/chunk-CY2CTOVM.mjs.map +7 -0
  103. package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-DWA5UYLJ.mjs} +363 -218
  104. package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
  105. package/dist/js/chunks/chunk-EB2V4OKL.mjs +79 -0
  106. package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-EWO662ZC.mjs +188 -0
  108. package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-F7LAKFMX.mjs} +320 -141
  110. package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
  111. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-FNIIH2LU.mjs} +20 -33
  112. package/dist/js/chunks/chunk-FNIIH2LU.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
  114. package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
  115. package/dist/js/chunks/chunk-GFWYMWYN.mjs +125 -0
  116. package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
  117. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  118. package/dist/js/chunks/chunk-H5ISU45X.mjs +87 -0
  119. package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
  120. package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-H6YIKFAQ.mjs} +311 -186
  121. package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
  122. package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-HEH7E3KO.mjs} +155 -35
  123. package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
  124. package/dist/js/chunks/chunk-HQRLBTNM.mjs +152 -0
  125. package/dist/js/chunks/chunk-HQRLBTNM.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-I2F7MLUU.mjs +137 -0
  127. package/dist/js/chunks/chunk-I2F7MLUU.mjs.map +7 -0
  128. package/dist/js/chunks/chunk-IQOTGGHX.mjs +797 -0
  129. package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-JH3YWKA6.mjs +225 -0
  131. package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
  133. package/dist/js/chunks/chunk-JOLJAYIJ.mjs.map +7 -0
  134. package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-KOTGMCMI.mjs} +116 -24
  135. package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-LC4O5LFS.mjs} +21 -45
  137. package/dist/js/chunks/chunk-LC4O5LFS.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LEF33SCP.mjs +127 -0
  139. package/dist/js/chunks/chunk-LEF33SCP.mjs.map +7 -0
  140. package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-LFORZRPH.mjs} +21 -23
  141. package/dist/js/chunks/chunk-LFORZRPH.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-LWLNV5EC.mjs +451 -0
  143. package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-LXRHUQAX.mjs +491 -0
  145. package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
  146. package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-MA2SZZFB.mjs} +82 -111
  147. package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
  148. package/dist/js/chunks/chunk-MDBZAMIV.mjs +121 -0
  149. package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-NODZ5VAD.mjs +75 -0
  151. package/dist/js/chunks/chunk-NODZ5VAD.mjs.map +7 -0
  152. package/dist/js/chunks/chunk-O2WJB6TH.mjs +365 -0
  153. package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
  154. package/dist/js/chunks/chunk-PCABY5BN.mjs +35 -0
  155. package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PWKYVMND.mjs +120 -0
  157. package/dist/js/chunks/chunk-PWKYVMND.mjs.map +7 -0
  158. package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-QHZZT7YO.mjs} +66 -38
  159. package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
  160. package/dist/js/chunks/chunk-QND56EW2.mjs +439 -0
  161. package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
  162. package/dist/js/chunks/chunk-QNODAANY.mjs +376 -0
  163. package/dist/js/chunks/chunk-QNODAANY.mjs.map +7 -0
  164. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-QRO5FV3I.mjs} +156 -73
  165. package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
  166. package/dist/js/chunks/chunk-R7A7JRC5.mjs +440 -0
  167. package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-RKG2CBFE.mjs +74 -0
  169. package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
  170. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-RSNS5OYS.mjs} +38 -25
  171. package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
  172. package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-RUDYMEJ3.mjs} +7 -6
  173. package/dist/js/chunks/chunk-RUDYMEJ3.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-STJR62SU.mjs +161 -0
  175. package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-SUSD4UTN.mjs +220 -0
  177. package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-SYBOA5HC.mjs} +26 -48
  179. package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-T4MOBP3J.mjs +108 -0
  181. package/dist/js/chunks/chunk-T4MOBP3J.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-TM7HPGTV.mjs +342 -0
  183. package/dist/js/chunks/chunk-TM7HPGTV.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-TMQDZSDC.mjs} +71 -35
  185. package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
  186. package/dist/js/chunks/chunk-TVSX5YA2.mjs +48 -0
  187. package/dist/js/chunks/chunk-TVSX5YA2.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-UHO5CV6K.mjs +80 -0
  189. package/dist/js/chunks/chunk-UHO5CV6K.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-UKCNELUN.mjs +223 -0
  191. package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-UKQK5GWR.mjs +167 -0
  193. package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
  194. package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-UTSLYQ65.mjs} +21 -48
  195. package/dist/js/chunks/chunk-UTSLYQ65.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-VS5OJBOD.mjs +108 -0
  197. package/dist/js/chunks/chunk-VS5OJBOD.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-VZMROW5A.mjs +759 -0
  199. package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  201. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  202. package/dist/js/chunks/chunk-XB6Y7P5W.mjs +69 -0
  203. package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-XDAMOMVD.mjs +226 -0
  205. package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
  206. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-XJPMW5SP.mjs} +247 -172
  207. package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
  208. package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-YKANQILZ.mjs} +16 -21
  209. package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-YLZOJLDI.mjs +175 -0
  211. package/dist/js/chunks/chunk-YLZOJLDI.mjs.map +7 -0
  212. package/dist/js/chunks/chunk-ZK7YY322.mjs +514 -0
  213. package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
  214. package/dist/js/expressive.cjs +10266 -3628
  215. package/dist/js/expressive.cjs.map +4 -4
  216. package/dist/js/expressive.js +10266 -3628
  217. package/dist/js/expressive.js.map +4 -4
  218. package/dist/js/expressive.min.js +23 -22
  219. package/dist/js/expressive.min.js.map +4 -4
  220. package/dist/js/expressive.mjs +181 -69
  221. package/dist/js/expressive.mjs.map +2 -2
  222. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  223. package/dist/js/internal/behaviors/copy.mjs +9 -0
  224. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dataTables.mjs +8 -0
  226. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  227. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  228. package/dist/js/internal/behaviors/forms.mjs +2 -2
  229. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  230. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/lists.mjs +8 -0
  232. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  234. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  235. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  236. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  237. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  238. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/theme.mjs +8 -0
  240. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/tour.mjs +8 -0
  242. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  243. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  244. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  245. package/dist/js/internal/components/appBar.mjs +3 -2
  246. package/dist/js/internal/components/autocomplete.mjs +5 -4
  247. package/dist/js/internal/components/backToTop.mjs +9 -0
  248. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  249. package/dist/js/internal/components/barChart.mjs +5 -4
  250. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  251. package/dist/js/internal/components/buttons.mjs +3 -3
  252. package/dist/js/internal/components/cards.mjs +3 -3
  253. package/dist/js/internal/components/carousel.mjs +3 -3
  254. package/dist/js/internal/components/cascader.mjs +10 -0
  255. package/dist/js/internal/components/cascader.mjs.map +7 -0
  256. package/dist/js/internal/components/characterCounter.mjs +3 -2
  257. package/dist/js/internal/components/chips.mjs +7 -5
  258. package/dist/js/internal/components/colorPicker.mjs +9 -0
  259. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  260. package/dist/js/internal/components/columnChart.mjs +4 -3
  261. package/dist/js/internal/components/commandPalette.mjs +3 -3
  262. package/dist/js/internal/components/confetti.mjs +3 -2
  263. package/dist/js/internal/components/currencyInput.mjs +9 -0
  264. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  265. package/dist/js/internal/components/datepicker.mjs +12 -8
  266. package/dist/js/internal/components/expandingCard.mjs +3 -3
  267. package/dist/js/internal/components/funnelChart.mjs +10 -0
  268. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  269. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  270. package/dist/js/internal/components/hoverCard.mjs +9 -0
  271. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  272. package/dist/js/internal/components/index.mjs +131 -65
  273. package/dist/js/internal/components/inputMask.mjs +9 -0
  274. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  275. package/dist/js/internal/components/keypad.mjs +3 -3
  276. package/dist/js/internal/components/lightbox.mjs +3 -3
  277. package/dist/js/internal/components/lineChart.mjs +41 -4
  278. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  279. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  280. package/dist/js/internal/components/mapView.mjs +3 -3
  281. package/dist/js/internal/components/menu.mjs +3 -3
  282. package/dist/js/internal/components/menubar.mjs +10 -0
  283. package/dist/js/internal/components/menubar.mjs.map +7 -0
  284. package/dist/js/internal/components/messageScroller.mjs +3 -3
  285. package/dist/js/internal/components/mixedChart.mjs +5 -4
  286. package/dist/js/internal/components/navigationRail.mjs +3 -2
  287. package/dist/js/internal/components/particles.mjs +3 -2
  288. package/dist/js/internal/components/pieChart.mjs +4 -3
  289. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  290. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  291. package/dist/js/internal/components/questionnaire.mjs +3 -3
  292. package/dist/js/internal/components/radarChart.mjs +4 -3
  293. package/dist/js/internal/components/radialChart.mjs +4 -3
  294. package/dist/js/internal/components/registry.mjs +60 -41
  295. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  296. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  297. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scatterChart.mjs +10 -0
  299. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  300. package/dist/js/internal/components/scrollspy.mjs +3 -2
  301. package/dist/js/internal/components/select.mjs +5 -4
  302. package/dist/js/internal/components/showMore.mjs +9 -0
  303. package/dist/js/internal/components/showMore.mjs.map +7 -0
  304. package/dist/js/internal/components/slider.mjs +3 -3
  305. package/dist/js/internal/components/snackbar.mjs +2 -2
  306. package/dist/js/internal/components/swipeActions.mjs +9 -0
  307. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  308. package/dist/js/internal/components/tabs.mjs +3 -4
  309. package/dist/js/internal/components/timepicker.mjs +5 -4
  310. package/dist/js/internal/components/tooltip.mjs +3 -3
  311. package/dist/js/internal/components/treeSelect.mjs +14 -0
  312. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  313. package/dist/js/internal/components/treemapChart.mjs +10 -0
  314. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  315. package/dist/js/internal/core/component.mjs +6 -3
  316. package/dist/js/internal/core/formControl.mjs +12 -0
  317. package/dist/js/internal/core/formControl.mjs.map +7 -0
  318. package/dist/js/internal/core/imageURL.mjs +7 -0
  319. package/dist/js/internal/core/imageURL.mjs.map +7 -0
  320. package/dist/js/internal/core/spring.mjs +11 -0
  321. package/dist/js/internal/core/spring.mjs.map +7 -0
  322. package/dist/js/internal/core/utils.mjs +21 -3
  323. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  324. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  325. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  326. package/dist/js/modular.mjs +172 -69
  327. package/dist/types/behaviors/bottomSheets.d.ts +23 -5
  328. package/dist/types/behaviors/copy.d.ts +18 -0
  329. package/dist/types/behaviors/dataTables.d.ts +125 -0
  330. package/dist/types/behaviors/dialogs.d.ts +27 -1
  331. package/dist/types/behaviors/forms.d.ts +70 -4
  332. package/dist/types/behaviors/imageCompare.d.ts +13 -0
  333. package/dist/types/behaviors/lists.d.ts +12 -0
  334. package/dist/types/behaviors/paneResize.d.ts +29 -0
  335. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  336. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  337. package/dist/types/behaviors/sortable.d.ts +28 -0
  338. package/dist/types/behaviors/theme.d.ts +22 -0
  339. package/dist/types/behaviors/tour.d.ts +36 -0
  340. package/dist/types/behaviors/transferList.d.ts +53 -0
  341. package/dist/types/components/appBar.d.ts +5 -6
  342. package/dist/types/components/autocomplete.d.ts +105 -20
  343. package/dist/types/components/backToTop.d.ts +36 -0
  344. package/dist/types/components/barChart.d.ts +3 -6
  345. package/dist/types/components/buttonGroup.d.ts +2 -4
  346. package/dist/types/components/buttons.d.ts +5 -5
  347. package/dist/types/components/cards.d.ts +3 -16
  348. package/dist/types/components/carousel.d.ts +16 -15
  349. package/dist/types/components/cascader.d.ts +130 -0
  350. package/dist/types/components/characterCounter.d.ts +2 -15
  351. package/dist/types/components/chips.d.ts +80 -19
  352. package/dist/types/components/colorPicker.d.ts +56 -0
  353. package/dist/types/components/columnChart.d.ts +23 -10
  354. package/dist/types/components/commandPalette.d.ts +11 -16
  355. package/dist/types/components/confetti.d.ts +2 -4
  356. package/dist/types/components/currencyInput.d.ts +60 -0
  357. package/dist/types/components/datepicker.d.ts +107 -56
  358. package/dist/types/components/expandingCard.d.ts +4 -6
  359. package/dist/types/components/funnelChart.d.ts +35 -0
  360. package/dist/types/components/heatmapChart.d.ts +42 -8
  361. package/dist/types/components/hoverCard.d.ts +59 -0
  362. package/dist/types/components/index.d.ts +16 -1
  363. package/dist/types/components/inputMask.d.ts +28 -0
  364. package/dist/types/components/keypad.d.ts +38 -6
  365. package/dist/types/components/lightbox.d.ts +14 -20
  366. package/dist/types/components/lineChart.d.ts +212 -12
  367. package/dist/types/components/loadingOverlay.d.ts +42 -0
  368. package/dist/types/components/mapView.d.ts +138 -27
  369. package/dist/types/components/menu.d.ts +74 -22
  370. package/dist/types/components/menubar.d.ts +37 -0
  371. package/dist/types/components/messageScroller.d.ts +2 -14
  372. package/dist/types/components/mixedChart.d.ts +15 -6
  373. package/dist/types/components/navigationRail.d.ts +16 -5
  374. package/dist/types/components/particles.d.ts +22 -5
  375. package/dist/types/components/pieChart.d.ts +33 -9
  376. package/dist/types/components/pullToRefresh.d.ts +80 -0
  377. package/dist/types/components/questionnaire.d.ts +58 -16
  378. package/dist/types/components/radarChart.d.ts +10 -6
  379. package/dist/types/components/radialChart.d.ts +58 -7
  380. package/dist/types/components/registry.d.ts +73 -3
  381. package/dist/types/components/richTextEditor.d.ts +45 -22
  382. package/dist/types/components/sankeyChart.d.ts +72 -0
  383. package/dist/types/components/scatterChart.d.ts +102 -0
  384. package/dist/types/components/scrollspy.d.ts +3 -5
  385. package/dist/types/components/select.d.ts +44 -33
  386. package/dist/types/components/showMore.d.ts +53 -0
  387. package/dist/types/components/slider.d.ts +2 -15
  388. package/dist/types/components/snackbar.d.ts +68 -1
  389. package/dist/types/components/swipeActions.d.ts +81 -0
  390. package/dist/types/components/tabs.d.ts +92 -30
  391. package/dist/types/components/timepicker.d.ts +128 -27
  392. package/dist/types/components/tooltip.d.ts +57 -21
  393. package/dist/types/components/treeSelect.d.ts +106 -0
  394. package/dist/types/components/treemapChart.d.ts +56 -0
  395. package/dist/types/core/component.d.ts +49 -25
  396. package/dist/types/core/formControl.d.ts +21 -0
  397. package/dist/types/core/imageURL.d.ts +2 -0
  398. package/dist/types/core/spring.d.ts +20 -0
  399. package/dist/types/core/utils.d.ts +123 -72
  400. package/dist/types/modular.d.ts +33 -1
  401. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  402. package/dist/types/plugins/modalDisplayPlugin.d.ts +39 -0
  403. package/package.json +17 -13
  404. package/src/sass/README.md +27 -18
  405. package/src/sass/abstracts/_elevation.scss +13 -7
  406. package/src/sass/abstracts/_index.scss +1 -0
  407. package/src/sass/abstracts/_mixins.scss +864 -78
  408. package/src/sass/abstracts/_spring.scss +63 -0
  409. package/src/sass/abstracts/_variables.scss +64 -21
  410. package/src/sass/base/_fonts.scss +61 -48
  411. package/src/sass/base/_global.scss +104 -24
  412. package/src/sass/base/_index.scss +2 -0
  413. package/src/sass/base/_normalize.scss +59 -114
  414. package/src/sass/base/_print.scss +21 -0
  415. package/src/sass/base/_prose.scss +68 -0
  416. package/src/sass/base/_typography.scss +9 -5
  417. package/src/sass/components/_accordion.scss +10 -19
  418. package/src/sass/components/_alert.scss +102 -0
  419. package/src/sass/components/_aura.scss +9 -3
  420. package/src/sass/components/_avatar.scss +3 -3
  421. package/src/sass/components/_back-to-top.scss +38 -0
  422. package/src/sass/components/_badges.scss +6 -5
  423. package/src/sass/components/_bar-chart.scss +31 -90
  424. package/src/sass/components/_bottom-sheet.scss +51 -16
  425. package/src/sass/components/_breadcrumb.scss +8 -7
  426. package/src/sass/components/_button-groups.scss +30 -63
  427. package/src/sass/components/_buttons.scss +137 -94
  428. package/src/sass/components/_calendar.scss +244 -0
  429. package/src/sass/components/_cards.scss +36 -44
  430. package/src/sass/components/_carousel.scss +37 -113
  431. package/src/sass/components/_cascader.scss +131 -0
  432. package/src/sass/components/_chips.scss +36 -46
  433. package/src/sass/components/_column-chart.scss +15 -26
  434. package/src/sass/components/_command-palette.scss +4 -7
  435. package/src/sass/components/_confetti.scss +1 -4
  436. package/src/sass/components/_countdown.scss +1 -1
  437. package/src/sass/components/_data-table.scss +172 -25
  438. package/src/sass/components/_datepicker.scss +54 -40
  439. package/src/sass/components/_description-list.scss +85 -0
  440. package/src/sass/components/_dialog.scss +48 -55
  441. package/src/sass/components/_docked-display.scss +1 -3
  442. package/src/sass/components/_drag-handle.scss +16 -20
  443. package/src/sass/components/_expanding-card.scss +21 -14
  444. package/src/sass/components/_fab-menu.scss +43 -39
  445. package/src/sass/components/_funnel-chart.scss +63 -0
  446. package/src/sass/components/_heatmap-chart.scss +114 -29
  447. package/src/sass/components/_icon-buttons.scss +8 -11
  448. package/src/sass/components/_icons-material-design.scss +2 -2
  449. package/src/sass/components/_image-compare.scss +108 -0
  450. package/src/sass/components/_index.scss +20 -0
  451. package/src/sass/components/_keypad.scss +39 -19
  452. package/src/sass/components/_kpi.scss +6 -11
  453. package/src/sass/components/_lightbox.scss +24 -13
  454. package/src/sass/components/_line-chart.scss +9 -63
  455. package/src/sass/components/_list.scss +59 -14
  456. package/src/sass/components/_loading-indicator.scss +1 -0
  457. package/src/sass/components/_loading-overlay.scss +105 -0
  458. package/src/sass/components/_map.scss +37 -11
  459. package/src/sass/components/_marquee.scss +4 -3
  460. package/src/sass/components/_mega-menu.scss +128 -0
  461. package/src/sass/components/_menu.scss +146 -127
  462. package/src/sass/components/_menubar.scss +47 -0
  463. package/src/sass/components/_message-scroller.scss +2 -2
  464. package/src/sass/components/_message.scss +3 -3
  465. package/src/sass/components/_mixed-chart.scss +27 -35
  466. package/src/sass/components/_modal-display.scss +21 -0
  467. package/src/sass/components/_navbar.scss +45 -36
  468. package/src/sass/components/_navigation-bar.scss +12 -77
  469. package/src/sass/components/_navigation-rail.scss +161 -92
  470. package/src/sass/components/_org-chart.scss +192 -0
  471. package/src/sass/components/_page-footer.scss +2 -4
  472. package/src/sass/components/_pagination.scss +9 -27
  473. package/src/sass/components/_panes.scss +35 -42
  474. package/src/sass/components/_particles.scss +1 -4
  475. package/src/sass/components/_pie-chart.scss +86 -68
  476. package/src/sass/components/_popover.scss +18 -5
  477. package/src/sass/components/_progress.scss +183 -44
  478. package/src/sass/components/_pull-to-refresh.scss +90 -0
  479. package/src/sass/components/_questionnaire.scss +74 -3
  480. package/src/sass/components/_radar-chart.scss +40 -42
  481. package/src/sass/components/_radial-chart.scss +108 -46
  482. package/src/sass/components/_rich-text-editor.scss +2 -2
  483. package/src/sass/components/_sankey-chart.scss +91 -0
  484. package/src/sass/components/_scatter-chart.scss +144 -0
  485. package/src/sass/components/_scrim.scss +0 -2
  486. package/src/sass/components/_scrollspy.scss +0 -2
  487. package/src/sass/components/_search.scss +27 -26
  488. package/src/sass/components/_show-more.scss +8 -0
  489. package/src/sass/components/_side-sheet.scss +32 -51
  490. package/src/sass/components/_skeleton.scss +26 -19
  491. package/src/sass/components/_snackbar.scss +25 -21
  492. package/src/sass/components/_split-button.scss +5 -5
  493. package/src/sass/components/_stat.scss +3 -8
  494. package/src/sass/components/_stepper.scss +1 -1
  495. package/src/sass/components/_swipe-actions.scss +71 -0
  496. package/src/sass/components/_table_of_contents.scss +1 -3
  497. package/src/sass/components/_tabs.scss +49 -46
  498. package/src/sass/components/_timeline.scss +12 -12
  499. package/src/sass/components/_timepicker.scss +111 -79
  500. package/src/sass/components/_toolbar.scss +36 -47
  501. package/src/sass/components/_tooltip.scss +25 -12
  502. package/src/sass/components/_tour.scss +89 -0
  503. package/src/sass/components/_transfer-list.scss +73 -0
  504. package/src/sass/components/_transitions.scss +4 -4
  505. package/src/sass/components/_tree.scss +7 -32
  506. package/src/sass/components/_treemap-chart.scss +98 -0
  507. package/src/sass/components/forms/_checkboxes.scss +107 -44
  508. package/src/sass/components/forms/_color-picker.scss +135 -0
  509. package/src/sass/components/forms/_color-swatches.scss +85 -0
  510. package/src/sass/components/forms/_drop-zone.scss +16 -13
  511. package/src/sass/components/forms/_fieldset.scss +4 -7
  512. package/src/sass/components/forms/_file-input.scss +12 -8
  513. package/src/sass/components/forms/_index.scss +3 -1
  514. package/src/sass/components/forms/_input-fields.scss +271 -90
  515. package/src/sass/components/forms/_radio-buttons.scss +34 -117
  516. package/src/sass/components/forms/_rating.scss +2 -32
  517. package/src/sass/components/forms/_select.scss +198 -20
  518. package/src/sass/components/forms/_slider.scss +92 -98
  519. package/src/sass/components/forms/_switches.scss +62 -180
  520. package/src/sass/custom.scss +10 -1
  521. package/src/sass/expressive.scss +3 -63
  522. package/src/sass/tokens/_contrast.scss +94 -0
  523. package/src/sass/tokens/_elevation.scss +16 -0
  524. package/src/sass/tokens/_index.scss +5 -0
  525. package/src/sass/tokens/_motion.scss +109 -0
  526. package/src/sass/tokens/_reference.scss +72 -141
  527. package/src/sass/tokens/_shape.scss +38 -0
  528. package/src/sass/tokens/_stacking.scss +27 -0
  529. package/src/sass/tokens/_state.scss +0 -2
  530. package/src/sass/tokens/_theme.scss +10 -1
  531. package/src/sass/tokens/_vibrant.scss +2 -5
  532. package/src/sass/utilities/_defer-render.scss +17 -0
  533. package/src/sass/utilities/_helpers.scss +184 -27
  534. package/src/sass/utilities/_index.scss +1 -0
  535. package/src/sass/utilities/_scroll-area.scss +0 -2
  536. package/src/sass/utilities/_spacing.scss +52 -34
  537. package/src/sass/utilities/_typescale.scss +8 -1
  538. package/src/sass/utilities/_visibility.scss +46 -77
  539. package/src/sass/utilities/_z-depth.scss +7 -4
  540. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  541. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  543. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  546. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  549. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  554. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  559. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  562. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  568. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  570. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  572. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  573. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  574. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  575. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  578. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  580. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  582. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  584. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UAZSDUVP.mjs +0 -90
  587. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  589. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  591. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  594. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  596. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  597. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  599. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  600. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  603. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  604. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  605. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  606. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  607. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  608. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  609. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/tabs.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils, restoreAttribute } from '../core/utils';\n\nexport interface TabsOptions extends BaseOptions {\n /**\n * Indicator transition duration in milliseconds, on an ease-out curve. The\n * default, null, follows the --md-comp-tabs-indicator-duration and\n * --md-comp-tabs-indicator-easing spring tokens instead.\n * @default null\n */\n duration: number | null;\n /**\n * Callback for when a new tab content is shown.\n * @default null\n */\n onShow: (newContent: Element) => void;\n /**\n * Set to true to swipe between panels. The panels move into a full-width\n * scroll-snap track, so touch and trackpad swipes are native scrolling.\n * This also uses the responsiveThreshold option.\n * @default false\n */\n swipeable: boolean;\n /**\n * The maximum width of the screen, in pixels,\n * where the swipeable functionality initializes.\n * @default infinity\n */\n responsiveThreshold: number;\n}\n\n/** Left and Right move between tabs the way they point, so they swap in RTL. */\nconst STEPS = { ltr: { ArrowLeft: -1, ArrowRight: 1 }, rtl: { ArrowLeft: 1, ArrowRight: -1 } };\n\nconst _defaults: TabsOptions = {\n duration: null,\n onShow: null,\n swipeable: false,\n responsiveThreshold: Infinity // breakpoint for swipeable\n};\n\nconst scrollBehavior = (): ScrollBehavior =>\n window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'instant' : 'smooth';\n\n/** Links cannot be :disabled; a tab is turned off with a class or aria-disabled. */\nconst isDisabled = (a: Element) => a.matches('.disabled, [aria-disabled=\"true\"]');\n\n/** Shown, as far as the browser can say; a responsive utility may hide a tab. */\nconst isShown = (a: Element) => a.checkVisibility?.() ?? true;\n\n/** A tab the keyboard can reach: enabled and shown. */\nconst isUsable = (a: Element) => !isDisabled(a) && isShown(a);\n\nexport class Tabs extends Component<TabsOptions> {\n _tabLinks: NodeListOf<HTMLAnchorElement>;\n _index: number;\n _indicator: HTMLElement;\n _tabWidth: number;\n _tabsWidth: number;\n _track: HTMLElement;\n private _panels: HTMLElement[] = [];\n // The panel a programmatic scroll is heading for. Scroll events on the way\n // there pass over other panels and must not select them.\n private _scrollTarget: number | null = null;\n private _scrollTimer: ReturnType<typeof setTimeout>;\n private _trackObserver: ResizeObserver | null = null;\n private _trackWidth = -1;\n _activeTabLink: HTMLAnchorElement;\n _content: HTMLElement;\n private _originalPanels = new Map<HTMLElement, { display: string; priority: string; active: boolean; inert: boolean; marker?: Comment }>();\n private _originalLinks = new Map<HTMLAnchorElement, { active: boolean; current: string | null; selected: string | null; tabindex: string | null }>();\n /**\n * Whether the page made the strip a tablist. The roles are the author's;\n * in that mode the component keeps aria-selected and a roving tabindex, and\n * the arrow keys select as they move, as the ARIA tabs pattern asks.\n */\n private _tablist = false;\n /** The bar's own tabindex as the page wrote it, put back on destroy. */\n private _barTabindex: string | null = null;\n /** Re-chooses a tablist's Tab stop when the strip is shown, hidden or resized. */\n private _stripObserver: ResizeObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<TabsOptions>) {\n super(el, options);\n\n this._tabLinks = this._queryTabLinks();\n if (!this._tabLinks.length) {\n console.error('Tabs: no tab links (an <a> child) to show');\n return;\n }\n this._setupTablist();\n this._tabLinks.forEach(link => {\n this._originalLinks.set(link, {\n active: link.classList.contains('active'), current: link.getAttribute('aria-current'),\n selected: link.getAttribute('aria-selected'), tabindex: link.getAttribute('tabindex')\n });\n const panel = this._panelFor(link);\n if (panel) this._originalPanels.set(panel, {\n display: panel.style.display, priority: panel.style.getPropertyPriority('display'),\n active: panel.classList.contains('active'), inert: panel.inert\n });\n });\n // Swiping needs at least one panel the links resolve to.\n this.options.swipeable &&= window.innerWidth <= this.options.responsiveThreshold && this._originalPanels.size > 0;\n this._index = 0;\n this._setupActiveTabLink();\n if (this.options.swipeable) {\n this._setupSwipeableTabs();\n } else {\n this._setupNormalTabs();\n }\n // Setup tabs indicator after content to ensure accurate widths\n this._setTabsAndTabWidth();\n this._createIndicator();\n this._setupEventHandlers();\n // Labels measured before a web font arrives have the fallback's width,\n // and the strip's size need not change when the font arrives.\n document.fonts?.ready.then(() => {\n if (Tabs.getInstance(this.el) === this) this._remeasure();\n });\n }\n\n private _setupTablist() {\n this._tablist = this.el.getAttribute('role') === 'tablist';\n // Firefox makes an overflowing bar a Tab stop of its own, ahead of the\n // tabs; a tablist is one Tab stop, so the bar steps aside.\n this._barTabindex = this.el.getAttribute('tabindex');\n if (this._tablist) this.el.tabIndex = -1;\n // A strip set up inside a closed dialog has no visible tabs yet; opening\n // it changes the strip's size, and so does a window resize or a utility\n // that shows or hides a tab. The tabs are watched too: at the 840px\n // breakpoint they switch between equal and intrinsic widths inside a\n // strip that may keep its size. Each change re-measures the indicator,\n // and a tablist chooses its Tab stop again.\n this._stripObserver = new ResizeObserver(() => {\n if (this._tablist) this._refreshTabStop();\n this._remeasure();\n });\n this._stripObserver.observe(this.el);\n this._tabLinks.forEach((a) => this._stripObserver.observe(a));\n }\n\n static get defaults(): TabsOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Tabs';\n\n destroy() {\n this._stripObserver?.disconnect();\n this._stripObserver = null;\n this._indicator?.remove();\n if (this._track) {\n this._teardownSwipeableTabs();\n }\n this._originalPanels.forEach((original, panel) => {\n panel.style.setProperty('display', original.display, original.priority);\n panel.classList.toggle('active', original.active);\n panel.inert = original.inert;\n if (!panel.className) panel.removeAttribute('class');\n });\n this._originalLinks.forEach((original, link) => {\n link.classList.toggle('active', original.active);\n restoreAttribute(link, 'aria-current', original.current);\n restoreAttribute(link, 'aria-selected', original.selected);\n restoreAttribute(link, 'tabindex', original.tabindex);\n });\n restoreAttribute(this.el, 'tabindex', this._barTabindex);\n super.destroy();\n }\n\n /**\n * The index of tab that is currently shown.\n */\n get index() {\n return this._index;\n }\n\n _setupEventHandlers() {\n this.el.addEventListener('click', this._handleTabClick, { signal: this._events.signal });\n this.el.addEventListener('keydown', this._handleKeydown, { signal: this._events.signal });\n }\n\n /**\n * Left and Right move focus to the next tab, wrapping at the ends, and\n * Home and End to the first and last; disabled tabs are skipped. In link\n * tabs focus moves without choosing, and Enter follows the link. In a\n * tablist the tab that takes focus is selected too, the ARIA pattern's\n * automatic activation, since a panel here shows at once.\n */\n _handleKeydown = (e: KeyboardEvent) => {\n const steps = STEPS[getComputedStyle(this.el).direction === 'rtl' ? 'rtl' : 'ltr'];\n const target = Utils.focusTarget(Array.from(this._tabLinks).filter(isShown), e, steps, true) as HTMLAnchorElement | undefined;\n if (!target) return;\n e.preventDefault();\n target.focus();\n this._followFocus(target);\n };\n\n /**\n * In a tablist the tab that takes focus is selected; link tabs wait for\n * Enter. The page's focus handlers run inside focus(), and one may have\n * destroyed or replaced the tabs, which then are no longer this instance's.\n */\n private _followFocus(tab: HTMLAnchorElement) {\n if (this._tablist && tab !== this._activeTabLink && Tabs.getInstance(this.el) === this) this._select(tab);\n }\n\n private _remeasure() {\n this._setTabsAndTabWidth();\n if (this._tabWidth !== 0 && this._tabsWidth !== 0) this._positionIndicator();\n }\n\n _queryTabLinks() {\n return this.el.querySelectorAll<HTMLAnchorElement>(':scope > a');\n }\n\n _handleTabClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n const tabLink = target.closest('a');\n if (!tabLink || !Array.from(this._tabLinks).includes(tabLink)) return;\n\n const disabled =\n tabLink.classList.contains('disabled') ||\n tabLink.getAttribute('aria-disabled') === 'true';\n if (disabled) {\n e.preventDefault();\n return;\n }\n // Act as regular link if target attribute is specified.\n if (tabLink.hasAttribute('target')) return;\n e.preventDefault();\n this._select(tabLink);\n };\n\n private _select(tabLink: HTMLAnchorElement) {\n if (this.options.swipeable) this._clickSwipeable(tabLink);\n else this._clickTab(tabLink);\n }\n\n private _clickSwipeable(tabLink: HTMLAnchorElement) {\n if (!this._panels.includes(this._panelFor(tabLink))) return;\n // A listener may destroy the tabs or pick another one.\n if (tabLink !== this._activeTabLink && !this._showPanel(tabLink)) return;\n this._scrollToActivePanel(scrollBehavior());\n }\n\n private _clickTab(tabLink: HTMLAnchorElement) {\n // The shown tab: nothing changes, so onShow must not fire again.\n if (tabLink === this._activeTabLink) return;\n const oldContent = this._content;\n this._tabLinks = this._queryTabLinks();\n // Moves the class and aria-current together, off the old tab and onto this\n // one - they used to be able to disagree.\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n // A listener may destroy the tabs or pick another one.\n if (this._content && !this._swapPanels(oldContent)) return;\n // Update widths after content is swapped (scrollbar bugfix)\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n }\n\n /** Shows the active panel, hides the old one, then reports the change. */\n private _swapPanels(oldContent: HTMLElement | null): boolean {\n // Clear the hide rather than force 'block', so a flex or grid panel\n // keeps the display its stylesheet gives it.\n this._content.style.display = '';\n this._content.classList.add('active');\n if (oldContent && oldContent !== this._content) {\n oldContent.style.display = 'none';\n oldContent.classList.remove('active');\n }\n return this._notifyShow();\n }\n\n _createIndicator() {\n const indicator = document.createElement('span');\n indicator.classList.add('indicator');\n this.el.appendChild(indicator);\n this._indicator = indicator;\n this._positionIndicator();\n }\n\n /** Reads both positions before writing either. */\n private _positionIndicator() {\n const left = this._calcLeftPos(this._activeTabLink);\n const right = this._calcRightPos(this._activeTabLink);\n this._indicator.style.left = left + 'px';\n this._indicator.style.right = right + 'px';\n }\n\n /** The panel a link shows, or null for a `target` link or one without a hash. */\n private _panelFor(a: HTMLAnchorElement): HTMLElement | null {\n if (!a.hash || a.hasAttribute('target')) return null;\n // Looked up in the tabs' own root, so panels inside a shadow root resolve.\n return Utils.getElementById(this.el, Tabs._decodeHash(a.hash));\n }\n\n /**\n * The id a hash names. `a.hash` and `location.hash` come back\n * percent-encoded, so a non-ASCII id would never match without this. A\n * malformed escape throws, and is then taken as written.\n */\n private static _decodeHash(hash: string): string {\n try {\n return decodeURIComponent(hash.slice(1));\n } catch {\n return hash.slice(1);\n }\n }\n\n /**\n * Which tab is current, for the eye and for assistive technology.\n *\n * The class alone is a colour. Link tabs are navigation, so `aria-current`\n * is the part a screen reader reads. A strip the page made a tablist reads\n * `aria-selected` instead, with the keyboard model rule 2 asks of a\n * composite role. Either value changes as the user picks, which makes\n * keeping it the component's job, not the author's - see CONTEXT.md on\n * static semantics versus dynamic state. Writing it once in the markup and\n * never moving it left the old tab announcing itself as current.\n */\n private _setActiveTabLink(tabLink: HTMLAnchorElement, behavior: ScrollBehavior = scrollBehavior()) {\n const stop = this._tabStop(tabLink);\n Array.from(this._tabLinks).forEach(a => this._mark(a, a === tabLink, a === stop));\n this._activeTabLink = tabLink;\n this._index = Array.from(this._tabLinks).indexOf(tabLink);\n this._content = this._panelFor(tabLink);\n this._reveal(tabLink, behavior);\n }\n\n /** A tablist says selected and keeps one Tab stop; link tabs say current. */\n private _mark(a: HTMLAnchorElement, on: boolean, stop: boolean) {\n a.classList.toggle('active', on);\n if (this._tablist) {\n a.setAttribute('aria-selected', String(on));\n a.tabIndex = stop ? 0 : -1;\n } else if (on) a.setAttribute('aria-current', 'page');\n else a.removeAttribute('aria-current');\n }\n\n /**\n * The tablist's one Tab stop: the selected tab, or the first usable one\n * when the selected tab is disabled or hidden. The arrow keys skip both,\n * so a Tab stop on one would leave every other panel out of reach.\n */\n private _tabStop(selected: HTMLAnchorElement): HTMLAnchorElement {\n if (isUsable(selected)) return selected;\n // With nothing shown, as in a closed dialog, at least skip disabled tabs.\n const links = Array.from(this._tabLinks);\n return links.find(isUsable) ?? links.find((a) => !isDisabled(a)) ?? selected;\n }\n\n /** Showing or hiding the strip or a tab moves the Tab stop to a usable tab. */\n private _refreshTabStop() {\n const stop = this._tabStop(this._activeTabLink);\n this._tabLinks.forEach((a) => (a.tabIndex = a === stop ? 0 : -1));\n }\n\n /**\n * Scrolls an overflowing bar, and only the bar, so the tab is in view.\n * Measured as a visual offset, so it holds in a right-to-left bar too.\n */\n private _reveal(tab: HTMLElement, behavior: ScrollBehavior) {\n const bar = this.el.getBoundingClientRect();\n const box = tab.getBoundingClientRect();\n const left = Math.min(0, box.left - bar.left) || Math.max(0, box.right - bar.right);\n if (left) this.el.scrollBy({ left, behavior });\n }\n\n _setupActiveTabLink() {\n // If the location.hash matches one of the links, use that as the active tab.\n // If no match is found, use any with class 'active', then the first link.\n // Both sides decoded: an href may be written with or without escapes.\n const hash = location.hash && Tabs._decodeHash(location.hash);\n this._activeTabLink =\n Array.from(this._tabLinks).find(a => hash && Tabs._decodeHash(a.getAttribute('href') ?? '') === hash) ??\n this.el.querySelector<HTMLAnchorElement>('a.active') ??\n this._tabStop(this._tabLinks[0]);\n this._setActiveTabLink(this._activeTabLink, 'instant');\n\n this._originalPanels.forEach((_, panel) => panel.classList.toggle('active', panel === this._content));\n }\n\n _setupSwipeableTabs() {\n this._panels = [...new Set(Array.from(this._tabLinks, (a) => this._panelFor(a)).filter(Boolean))];\n const track = document.createElement('div');\n track.classList.add('tabs-content');\n this._panels[0].before(track);\n this._panels.forEach((panel) => {\n const marker = document.createComment('');\n panel.before(marker);\n this._originalPanels.get(panel).marker = marker;\n track.appendChild(panel);\n panel.style.display = '';\n });\n this._track = track;\n this._syncPanels();\n const options = { passive: true, signal: this._events.signal };\n track.addEventListener('scroll', this._handleTrackScroll, options);\n // A swipe or wheel that interrupts a programmatic scroll takes over from it.\n track.addEventListener('pointerdown', this._releaseScrollTarget, options);\n track.addEventListener('wheel', this._releaseScrollTarget, options);\n // A track that starts hidden (in a closed dialog or sheet) is 0px wide, so\n // the scroll below cannot reach the active panel. Re-align whenever the\n // track's width changes, which also covers window resizes. Only the width:\n // a panel growing taller mid-swipe must not pull the track back.\n this._trackObserver = new ResizeObserver(() => {\n if (track.clientWidth === this._trackWidth) return;\n this._trackWidth = track.clientWidth;\n this._scrollToActivePanel('instant');\n });\n this._trackObserver.observe(track);\n this._scrollToActivePanel('instant');\n }\n\n _teardownSwipeableTabs() {\n const track = this._track;\n this._trackObserver?.disconnect();\n this._trackObserver = null;\n this._releaseScrollTarget();\n this._originalPanels.forEach((original, panel) => original.marker?.replaceWith(panel));\n track.remove();\n this._track = undefined;\n }\n\n /** Only the shown panel is reachable; the others are off to the side. */\n private _syncPanels() {\n this._panels.forEach((panel) => {\n panel.classList.toggle('active', panel === this._content);\n panel.inert = panel !== this._content;\n });\n }\n\n /** The panel the track is mostly showing. Panels are exactly one track wide. */\n private _trackIndex() {\n return Math.round(Math.abs(this._track.scrollLeft) / (this._track.clientWidth || 1));\n }\n\n /**\n * Whether panel `index` fills the track. Compare positions, not rounded\n * indexes: a scroll still on its way to another panel can already round to\n * this one. Measured rather than computed from clientWidth, which rounds a\n * fractional track width, while the mandatory snap lands on the real edge.\n */\n private _trackAt(index: number) {\n return Math.abs(this._panels[index].getBoundingClientRect().left - this._track.getBoundingClientRect().left) < 1;\n }\n\n private _scrollToActivePanel(behavior: ScrollBehavior) {\n const index = this._panels.indexOf(this._content);\n if (index < 0 || this._trackAt(index)) return;\n // scrollLeft runs negative in a right-to-left track.\n const sign = getComputedStyle(this._track).direction === 'rtl' ? -1 : 1;\n const left = sign * index * this._track.clientWidth;\n this._scrollTarget = index;\n this._waitForScroll();\n this._track.scrollTo({ left, behavior });\n }\n\n // A smooth scroll that something cut short never arrives, and on a busy page\n // one can also take a while to start. Once the track has been still for half\n // a second, jump to the selected panel. The selection stands: a swipe or\n // wheel that took over has already released the target, so the scroll\n // events that follow choose the panel. Every scroll event restarts the wait.\n private _waitForScroll() {\n clearTimeout(this._scrollTimer);\n this._scrollTimer = setTimeout(() => {\n this._releaseScrollTarget();\n this._scrollToActivePanel('instant');\n }, 500);\n }\n\n _releaseScrollTarget = () => {\n clearTimeout(this._scrollTimer);\n this._scrollTarget = null;\n };\n\n _handleTrackScroll = () => {\n if (this._scrollTarget !== null) {\n // Release on arrival. A smooth scroll still heading to the previous\n // selection rounds to the new target on its way past, and releasing\n // there let the rest of that scroll select the panel it was heading to.\n if (this._trackAt(this._scrollTarget)) this._releaseScrollTarget();\n else this._waitForScroll();\n return;\n }\n const panel = this._panels[this._trackIndex()];\n if (!panel || panel === this._content) return;\n this._showPanel(Array.from(this._tabLinks).find((a) => this._panelFor(a) === panel));\n };\n\n private _showPanel(tabLink: HTMLAnchorElement): boolean {\n const prevIndex = this._index;\n this._setActiveTabLink(tabLink);\n this._syncPanels();\n this._setTabsAndTabWidth();\n this._animateIndicator(prevIndex);\n return this._notifyShow();\n }\n\n // After the old panel is hidden, so a listener sees one active panel.\n private _notifyShow(): boolean {\n const panel = this._content;\n return this._notify('change', this.options.onShow, { args: [panel], detail: { panel }, current: () => this._content === panel });\n }\n\n _setupNormalTabs() {\n // Hide Tabs Content\n Array.from(this._tabLinks).forEach((a) => {\n if (a === this._activeTabLink) return;\n const currContent = this._panelFor(a);\n if (currContent) currContent.style.display = 'none';\n });\n }\n\n _setTabsAndTabWidth() {\n this._tabsWidth = this.el.getBoundingClientRect().width;\n this._tabWidth = Math.max(this._tabsWidth, this.el.scrollWidth) / this._tabLinks.length;\n }\n\n _calcRightPos(el: HTMLElement): number {\n return Math.ceil(this._tabsWidth - el.offsetLeft - el.getBoundingClientRect().width);\n }\n\n _calcLeftPos(el: HTMLElement): number {\n return Math.floor(el.offsetLeft);\n }\n\n /**\n * Recalculate tab indicator position. This is useful when\n * the indicator position is not correct.\n */\n updateTabIndicator() {\n this._setTabsAndTabWidth();\n this._animateIndicator(this._index);\n }\n\n _animateIndicator(prevIndex: number): void {\n // The trailing edge waits 30% of the move, so the bar stretches toward\n // the new tab before it shrinks. On the spring tokens that delay scales\n // with the spring and drops to 0 with it under reduced motion.\n const ms = this.options.duration;\n const timing = ms == null\n ? ['var(--md-comp-tabs-indicator-duration) var(--md-comp-tabs-indicator-easing)', 'calc(var(--md-comp-tabs-indicator-duration) * 0.3)']\n : [`${ms}ms ease-out`, `${ms * 0.3}ms`];\n const [leftDelay, rightDelay] = this._index - prevIndex >= 0 ? [timing[1], '0s'] : ['0s', timing[1]];\n this._indicator.style.transition = `left ${timing[0]} ${leftDelay}, right ${timing[0]} ${rightDelay}`;\n\n this._positionIndicator();\n }\n\n /**\n * Show tab content that corresponds to the tab with the id.\n * @param tabId The id of the tab that you want to switch to.\n */\n select(tabId: string) {\n const tab = Array.from(this._tabLinks).find(a => a.getAttribute('href') === '#' + tabId);\n if (tab) tab.click();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,376 @@
1
+ import {
2
+ formAssociated,
3
+ unwrapControl,
4
+ wrapInControl
5
+ } from "./chunk-UHO5CV6K.mjs";
6
+ import {
7
+ Component
8
+ } from "./chunk-EB2V4OKL.mjs";
9
+ import {
10
+ Utils,
11
+ controllerFor,
12
+ restoreAttribute
13
+ } from "./chunk-67UNY7RH.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-QNODAANY.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
+ }