@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
@@ -1,15 +1,16 @@
1
- import {
2
- Utils
3
- } from "./chunk-M372EDXD.mjs";
4
1
  import {
5
2
  Component
6
- } from "./chunk-PD6HYHAE.mjs";
3
+ } from "./chunk-EB2V4OKL.mjs";
4
+ import {
5
+ restoreAttribute
6
+ } from "./chunk-67UNY7RH.mjs";
7
7
 
8
8
  // src/ts/components/buttons.ts
9
9
  var _defaults = {};
10
- var FloatingActionButton = class _FloatingActionButton extends Component {
10
+ var FloatingActionButton = class extends Component {
11
11
  constructor(el, options) {
12
- super(el, options, _FloatingActionButton);
12
+ super(el, options);
13
+ this._addedExpanded = false;
13
14
  this.open = () => {
14
15
  if (this.isOpen) return;
15
16
  this.isOpen = true;
@@ -39,56 +40,53 @@ var FloatingActionButton = class _FloatingActionButton extends Component {
39
40
  else if (this._list?.contains(control)) this.close();
40
41
  };
41
42
  this._handleAnchorKeydown = (e) => {
42
- if (e.key === Utils.keys.ENTER || e.key === " ") {
43
+ if (e.key === "Enter" || e.key === " ") {
43
44
  e.preventDefault();
44
45
  this._toggle();
45
46
  }
46
47
  };
47
48
  this._handleDocumentKeydown = (e) => {
48
- if (e.key === Utils.keys.ESC && !e.defaultPrevented) this.close();
49
+ if (e.key === "Escape" && !e.defaultPrevented) this.close();
49
50
  };
50
51
  this._handleDocumentClick = (e) => {
51
52
  if (e.composedPath().includes(this.el)) return;
52
53
  this.close();
53
54
  };
54
- this.el["Expressive_FloatingActionButton"] = this;
55
- this.options = { ..._FloatingActionButton.defaults, ...options };
56
55
  this.isOpen = false;
57
56
  this._anchor = this.el.querySelector(":scope > a, :scope > button");
58
57
  this._list = this.el.querySelector(":scope > ul, :scope > menu");
59
58
  this._listWasInert = this._list?.inert ?? false;
60
59
  this.el.classList.remove("active");
61
60
  if (this._list) this._list.inert = true;
61
+ this._addedExpanded = !!this._anchor && !this._anchor.hasAttribute("aria-expanded");
62
62
  this._anchor?.setAttribute("aria-expanded", "false");
63
63
  if (this._anchor instanceof HTMLAnchorElement && !this._anchor.hasAttribute("href")) {
64
- if (this._anchor.tabIndex < 0) this._anchor.tabIndex = 0;
65
- this._anchor.addEventListener("keydown", this._handleAnchorKeydown);
64
+ if (!this._anchor.hasAttribute("tabindex") || this._anchor.tabIndex < 0) {
65
+ this._anchorTabIndex = this._anchor.getAttribute("tabindex");
66
+ this._anchor.tabIndex = 0;
67
+ }
68
+ this._anchor.addEventListener("keydown", this._handleAnchorKeydown, { signal: this._events.signal });
66
69
  }
67
- this.el.addEventListener("click", this._handleFABClick);
70
+ this.el.addEventListener("click", this._handleFABClick, { signal: this._events.signal });
68
71
  }
69
72
  static get defaults() {
70
73
  return _defaults;
71
74
  }
72
- static init(els, options = {}) {
73
- return super.init(els, options, _FloatingActionButton);
74
- }
75
- static getInstance(el) {
76
- return el["Expressive_FloatingActionButton"];
77
- }
78
75
  destroy() {
79
76
  this.close();
80
77
  if (this._list) this._list.inert = this._listWasInert;
81
- this.el.removeEventListener("click", this._handleFABClick);
82
- this._anchor?.removeEventListener("keydown", this._handleAnchorKeydown);
83
- this.el["Expressive_FloatingActionButton"] = void 0;
78
+ if (this._addedExpanded) this._anchor.removeAttribute("aria-expanded");
79
+ if (this._anchorTabIndex !== void 0) restoreAttribute(this._anchor, "tabindex", this._anchorTabIndex);
80
+ super.destroy();
84
81
  }
85
82
  _toggle() {
86
83
  if (this.isOpen) this.close();
87
84
  else this.open();
88
85
  }
89
86
  };
87
+ FloatingActionButton.key = "Expressive_FloatingActionButton";
90
88
 
91
89
  export {
92
90
  FloatingActionButton
93
91
  };
94
- //# sourceMappingURL=chunk-PDG64UHF.mjs.map
92
+ //# sourceMappingURL=chunk-LFORZRPH.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/buttons.ts"],
4
+ "sourcesContent": ["import { restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport type FloatingActionButtonOptions = BaseOptions;\n\nconst _defaults: FloatingActionButtonOptions = {};\n\nexport class FloatingActionButton extends Component<FloatingActionButtonOptions> {\n isOpen: boolean;\n private _anchor: HTMLElement | null;\n private _list: HTMLElement | null;\n private _listWasInert: boolean;\n private _addedExpanded = false;\n private _anchorTabIndex: string | null | undefined;\n\n constructor(el: HTMLElement, options: Partial<FloatingActionButtonOptions>) {\n super(el, options);\n this.isOpen = false;\n this._anchor = this.el.querySelector(':scope > a, :scope > button');\n this._list = this.el.querySelector(':scope > ul, :scope > menu');\n this._listWasInert = this._list?.inert ?? false;\n this.el.classList.remove('active');\n if (this._list) this._list.inert = true;\n this._addedExpanded = !!this._anchor && !this._anchor.hasAttribute('aria-expanded');\n this._anchor?.setAttribute('aria-expanded', 'false');\n if (this._anchor instanceof HTMLAnchorElement && !this._anchor.hasAttribute('href')) {\n // An <a> reports tabIndex 0 with or without href, but it only takes focus\n // without href once it has the attribute.\n if (!this._anchor.hasAttribute('tabindex') || this._anchor.tabIndex < 0) {\n this._anchorTabIndex = this._anchor.getAttribute('tabindex');\n this._anchor.tabIndex = 0;\n }\n this._anchor.addEventListener('keydown', this._handleAnchorKeydown, { signal: this._events.signal });\n }\n this.el.addEventListener('click', this._handleFABClick, { signal: this._events.signal });\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static key = 'Expressive_FloatingActionButton';\n\n destroy() {\n this.close();\n if (this._list) this._list.inert = this._listWasInert;\n if (this._addedExpanded) this._anchor.removeAttribute('aria-expanded');\n if (this._anchorTabIndex !== undefined) restoreAttribute(this._anchor, 'tabindex', this._anchorTabIndex);\n super.destroy();\n }\n\n open = (): void => {\n if (this.isOpen) return;\n this.isOpen = true;\n if (this._list) this._list.inert = false;\n this.el.classList.add('active');\n this._anchor?.setAttribute('aria-expanded', 'true');\n document.addEventListener('click', this._handleDocumentClick);\n document.addEventListener('keydown', this._handleDocumentKeydown);\n };\n\n close = (): void => {\n if (!this.isOpen) return;\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n if (focused && this._list?.contains(focused)) this._anchor?.focus();\n if (this._list) this._list.inert = true;\n this.isOpen = false;\n this.el.classList.remove('active');\n this._anchor?.setAttribute('aria-expanded', 'false');\n document.removeEventListener('click', this._handleDocumentClick);\n document.removeEventListener('keydown', this._handleDocumentKeydown);\n };\n\n private _handleFABClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Element)) return;\n const control = target.closest('a, button');\n if (!control || control.matches(':disabled, [aria-disabled=\"true\"]')) return;\n if (control === this._anchor) this._toggle();\n else if (this._list?.contains(control)) this.close();\n };\n\n private _handleAnchorKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._toggle();\n }\n };\n\n private _handleDocumentKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && !e.defaultPrevented) this.close();\n };\n\n private _handleDocumentClick = (e: MouseEvent) => {\n if (e.composedPath().includes(this.el)) return;\n this.close();\n };\n\n private _toggle() {\n if (this.isOpen) this.close();\n else this.open();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,451 @@
1
+ import {
2
+ Utils
3
+ } from "./chunk-67UNY7RH.mjs";
4
+
5
+ // src/ts/behaviors/forms.ts
6
+ var FILE_RULES = '.drop-zone input[type="file"]:is([data-validate-types], [data-max-size], [data-max-files])';
7
+ function fileLimit(input, attribute) {
8
+ const value = (input.getAttribute(attribute) || "").trim();
9
+ if (!/^\d+$/.test(value)) return 0;
10
+ const limit = Number(value);
11
+ return Number.isSafeInteger(limit) ? limit : 0;
12
+ }
13
+ function fileSpecifier(value) {
14
+ if (value.endsWith("/*")) return /^(image|audio|video)\/\*$/.test(value);
15
+ return /^\.[^\s/\\]+$/.test(value) || /^[!#$%&'*+.^_`|~0-9a-z-]+\/[!#$%&'*+.^_`|~0-9a-z-]+$/.test(value);
16
+ }
17
+ function fileMatches(file, specifier) {
18
+ if (specifier.startsWith(".")) return file.name.toLowerCase().endsWith(specifier);
19
+ if (specifier.endsWith("/*")) return file.type.toLowerCase().startsWith(specifier.slice(0, -1));
20
+ return file.type.toLowerCase() === specifier;
21
+ }
22
+ var _Forms = class _Forms {
23
+ /**
24
+ * Validates a `.validate` field: marks it `invalid` and `aria-invalid`
25
+ * when it fails its constraints or `data-length`, and clears both when it
26
+ * passes. An empty optional field never fails. The field is described by
27
+ * its `[data-error]` supporting text, so the error the CSS shows there is
28
+ * read with it.
29
+ * Marked drop-zone file inputs also validate type/size rules and synchronize their
30
+ * native custom validity and zone-level error text, without emitting events.
31
+ * @param textfield
32
+ */
33
+ static validateField(textfield) {
34
+ if (!textfield) {
35
+ console.error("No text field element found");
36
+ return;
37
+ }
38
+ if (_Forms._validatedFile(textfield)) {
39
+ _Forms._validateFiles(textfield);
40
+ return;
41
+ }
42
+ if (!textfield.classList.contains("validate")) return;
43
+ _Forms._markInvalid(textfield, _Forms._fails(textfield));
44
+ _Forms._describeByError(textfield);
45
+ }
46
+ static _markInvalid(field, invalid) {
47
+ field.classList.toggle("invalid", invalid);
48
+ if (invalid) field.setAttribute("aria-invalid", "true");
49
+ else field.removeAttribute("aria-invalid");
50
+ }
51
+ /** Whether a field fails its constraints or is longer than `data-length`. */
52
+ static _fails(field) {
53
+ return !_Forms._blankOptional(field) && (!field.validity.valid || field.value.length > parseInt(field.getAttribute("data-length")));
54
+ }
55
+ /** An empty field that is not required, and holds no half-typed number or date, never fails. */
56
+ static _blankOptional(field) {
57
+ return field.value.length === 0 && !field.validity.badInput && !field.required;
58
+ }
59
+ /** Adds the field's `[data-error]` supporting text to its aria-describedby. */
60
+ static _describeByError(field) {
61
+ const error = field.parentElement?.querySelector(":scope > [data-error]");
62
+ if (error) _Forms._addDescription(field, _Forms._idOf(error));
63
+ }
64
+ static _idOf(el) {
65
+ if (!el.id) el.id = `field-error-${Utils.guid()}`;
66
+ return el.id;
67
+ }
68
+ /** Adds an id to a field's aria-describedby once, after the page's own. */
69
+ static _addDescription(field, id) {
70
+ const ids = (field.getAttribute("aria-describedby") ?? "").split(/\s+/).filter(Boolean);
71
+ if (!ids.includes(id)) field.setAttribute("aria-describedby", [...ids, id].join(" "));
72
+ }
73
+ /**
74
+ * Resizes the given TextArea after updating the
75
+ * value content dynamically.
76
+ * @param e EventTarget
77
+ */
78
+ static textareaAutoResize(e) {
79
+ const textarea = e;
80
+ if (!textarea) return;
81
+ if (!textarea.hasAttribute("original-height")) _Forms._measureTextarea(textarea);
82
+ const originalHeight = parseInt(textarea.getAttribute("original-height"));
83
+ if (isNaN(originalHeight)) return;
84
+ textarea.style.height = "auto";
85
+ const borders = textarea.offsetHeight - textarea.clientHeight;
86
+ const contentHeight = textarea.scrollHeight + borders;
87
+ textarea.style.height = Math.max(originalHeight, contentHeight) + "px";
88
+ }
89
+ // A hidden textarea (closed dialog, inactive tab) measures 0. Storing that
90
+ // would pin it collapsed, so it waits for a focus or input to measure.
91
+ static _measureTextarea(textarea) {
92
+ const height = textarea.getBoundingClientRect().height;
93
+ if (height) textarea.setAttribute("original-height", height.toString());
94
+ }
95
+ static _validatedFile(input) {
96
+ return input.matches(FILE_RULES) || _Forms._fileErrors.has(input);
97
+ }
98
+ static _rejectedTypes(input) {
99
+ const accepted = input.accept.split(",").map((value) => value.trim().toLowerCase()).filter(fileSpecifier);
100
+ if (!accepted.length) return [];
101
+ return Array.from(input.files ?? []).filter((file) => !accepted.some((specifier) => fileMatches(file, specifier)));
102
+ }
103
+ static _validateFiles(input) {
104
+ if (input.matches(":disabled")) return;
105
+ _Forms._bindShadowForm(input);
106
+ const failure = _Forms._checkFiles(input);
107
+ _Forms._showFileError(input, failure?.message ?? input.validationMessage);
108
+ return failure;
109
+ }
110
+ static _checkFiles(input) {
111
+ _Forms._clearFileError(input);
112
+ if (!input.matches(FILE_RULES)) {
113
+ _Forms._fileErrors.delete(input);
114
+ return;
115
+ }
116
+ _Forms._fileErrors.set(input, "");
117
+ const failure = _Forms._fileFailure(input);
118
+ if (failure) _Forms._setFileError(input, failure.message);
119
+ return failure;
120
+ }
121
+ static _fileFailure(input) {
122
+ return _Forms._typeFailure(input) ?? _Forms._sizeFailure(input) ?? _Forms._countFailure(input);
123
+ }
124
+ static _typeFailure(input) {
125
+ if (!input.hasAttribute("data-validate-types")) return;
126
+ const rejected = _Forms._rejectedTypes(input);
127
+ if (rejected.length) return { rejected, reason: "type", message: _Forms._fileTypeMessage(input) };
128
+ }
129
+ static _sizeFailure(input) {
130
+ const limit = fileLimit(input, "data-max-size");
131
+ if (!limit) return;
132
+ const rejected = Array.from(input.files ?? []).filter((file) => file.size > limit);
133
+ if (!rejected.length) return;
134
+ return { rejected, reason: "size", message: _Forms._fileSizeMessage(input, limit) };
135
+ }
136
+ static _fileSizeMessage(input, limit) {
137
+ return _Forms._fileError(input)?.getAttribute("data-error-size")?.trim() || `Maximum file size: ${limit} bytes.`;
138
+ }
139
+ static _countFailure(input) {
140
+ const limit = fileLimit(input, "data-max-files");
141
+ if (!limit) return;
142
+ const rejected = Array.from(input.files ?? []);
143
+ if (rejected.length > limit) return { rejected, reason: "count", message: _Forms._fileCountMessage(input, limit) };
144
+ }
145
+ static _fileCountMessage(input, limit) {
146
+ return _Forms._fileError(input)?.getAttribute("data-error-count")?.trim() || `Maximum file count: ${limit}.`;
147
+ }
148
+ static _clearFileError(input) {
149
+ const owned = _Forms._fileErrors.get(input);
150
+ if (owned && owned === input.validationMessage) input.setCustomValidity("");
151
+ }
152
+ static _setFileError(input, message) {
153
+ if (input.validity.customError) return;
154
+ input.setCustomValidity(message);
155
+ _Forms._fileErrors.set(input, message);
156
+ }
157
+ static _fileTypeMessage(input) {
158
+ const error = _Forms._fileError(input);
159
+ return error?.getAttribute("data-error")?.trim() || `Choose files matching: ${input.accept}.`;
160
+ }
161
+ static _fileError(input) {
162
+ return Array.from(input.closest(".drop-zone")?.children ?? []).find((child) => child.hasAttribute("data-error"));
163
+ }
164
+ static _showFileError(input, message) {
165
+ _Forms._markInvalid(input, !input.validity.valid);
166
+ const error = _Forms._fileError(input);
167
+ if (!error) return;
168
+ _Forms._addDescription(input, _Forms._idOf(error));
169
+ error.textContent = message;
170
+ error.hidden = !message;
171
+ }
172
+ static _updateDropZone(input) {
173
+ _Forms._bindShadowForm(input);
174
+ const zone = input.closest(".drop-zone");
175
+ const files = Array.from(input.files ?? []);
176
+ const failure = _Forms._validateDropZone(input);
177
+ _Forms.listDropZoneFiles(zone, input);
178
+ _Forms._reportFileRejection(input, files, failure);
179
+ }
180
+ static _validateDropZone(input) {
181
+ if (_Forms._validatedFile(input)) return _Forms._validateFiles(input);
182
+ _Forms.validateField(input);
183
+ }
184
+ static _reportFileRejection(input, files, failure) {
185
+ if (!input.matches(FILE_RULES)) {
186
+ _Forms._fileSelections.delete(input);
187
+ return;
188
+ }
189
+ if (!_Forms._newFileSelection(input, files)) return;
190
+ if (!failure) return;
191
+ Utils.emit(input.closest(".drop-zone"), "reject", { input, files: files.slice(), rejected: failure.rejected.slice(), reason: failure.reason });
192
+ }
193
+ static _newFileSelection(input, files) {
194
+ const constraints = JSON.stringify([input.hasAttribute("data-validate-types"), input.accept, fileLimit(input, "data-max-size"), fileLimit(input, "data-max-files")]);
195
+ const previous = _Forms._fileSelections.get(input);
196
+ _Forms._fileSelections.set(input, { files, constraints });
197
+ return !previous || previous.constraints !== constraints || previous.files.length !== files.length || !previous.files.every((file, index) => file === files[index]);
198
+ }
199
+ // Submit and reset do not leave a shadow root, so the document never hears
200
+ // them. Adding the same listener again does nothing.
201
+ static _bindShadowForm(input) {
202
+ if (!input.getRootNode().host) return;
203
+ for (const type of ["submit", "reset"]) input.form?.addEventListener(type, _Forms.resetFormExtras, true);
204
+ }
205
+ static _resetFileInput(input) {
206
+ if (input.files?.length) return;
207
+ _Forms._fileSelections.delete(input);
208
+ _Forms._resetFileList(input);
209
+ _Forms._resetFileValidity(input);
210
+ }
211
+ static _resetFileList(input) {
212
+ const zone = input.closest(".drop-zone");
213
+ if (!zone) return;
214
+ _Forms.listDropZoneFiles(zone, input);
215
+ zone.classList.remove("dragover");
216
+ }
217
+ static _resetFileValidity(input) {
218
+ if (input.matches(":disabled")) return;
219
+ if (!_Forms._validatedFile(input)) return;
220
+ _Forms._clearFileError(input);
221
+ _Forms._fileErrors.delete(input);
222
+ _Forms._showFileError(input, input.validationMessage);
223
+ }
224
+ static _afterReset(form) {
225
+ const fields = Array.from(form.elements);
226
+ fields.filter((field) => field instanceof HTMLInputElement && field.type === "file").forEach(_Forms._resetFileInput);
227
+ fields.filter((field) => field.classList.contains("validate")).forEach((field) => _Forms._markInvalid(field, false));
228
+ fields.filter((field) => field.classList.contains("expressive-textarea")).forEach(_Forms.textareaAutoResize);
229
+ const summary = form.querySelector(".error-summary");
230
+ if (!summary) return;
231
+ summary.hidden = true;
232
+ summary.querySelector("ul, ol")?.replaceChildren();
233
+ }
234
+ /**
235
+ * Safe to call more than once: the root entry calls it on import, and a page
236
+ * that also loads the modular entry may call it again.
237
+ */
238
+ static Init() {
239
+ if (_Forms._initialized) return;
240
+ _Forms._initialized = true;
241
+ Utils.onDocumentReady(() => {
242
+ document.addEventListener("input", _Forms._onFileInput);
243
+ document.addEventListener("change", (e) => {
244
+ const target = Utils.eventTarget(e);
245
+ if (!(target instanceof HTMLInputElement)) return;
246
+ if (target.matches('.drop-zone input[type="file"]')) {
247
+ _Forms._onFileInput(e);
248
+ return;
249
+ }
250
+ _Forms.validateField(target);
251
+ });
252
+ document.addEventListener("click", _Forms.togglePassword);
253
+ document.addEventListener("click", _Forms.stepNumber);
254
+ document.addEventListener("submit", _Forms.resetFormExtras, true);
255
+ document.addEventListener("submit", _Forms.summarizeErrors, true);
256
+ document.addEventListener("click", _Forms.focusSummaryField);
257
+ document.addEventListener("reset", _Forms.resetFormExtras, true);
258
+ for (const type of ["dragenter", "dragover", "dragleave", "drop"]) {
259
+ document.addEventListener(type, _Forms.markDropZone);
260
+ }
261
+ document.querySelectorAll(".expressive-textarea").forEach((textArea) => {
262
+ _Forms.InitTextarea(textArea);
263
+ });
264
+ document.querySelectorAll('.file-field input[type="file"]').forEach((fileInput) => {
265
+ _Forms.InitFileInputPath(fileInput);
266
+ });
267
+ });
268
+ }
269
+ /**
270
+ * A .password-toggle button shows or hides the password in its field. The
271
+ * button's own name stays put ("Show password"); aria-pressed carries the
272
+ * state, so there is no generated text to translate.
273
+ */
274
+ static togglePassword(e) {
275
+ const button = Utils.closestInPath(e, ".password-toggle");
276
+ const input = button?.closest(".field")?.querySelector(
277
+ 'input[type="password"], input[data-password]'
278
+ );
279
+ if (!input) return;
280
+ _Forms._bindShadowForm(input);
281
+ const show = input.type === "password";
282
+ input.toggleAttribute("data-password", show);
283
+ input.type = show ? "text" : "password";
284
+ button.setAttribute("aria-pressed", String(show));
285
+ }
286
+ /**
287
+ * A [data-step="up"] or [data-step="down"] button in a .field steps the
288
+ * field's number input as the arrow keys would, within min, max and step,
289
+ * and fires input and change if the value moved. A disabled, read-only or step="any" input
290
+ * is left alone; stepUp() would throw on step="any".
291
+ */
292
+ static stepNumber(e) {
293
+ const button = Utils.closestInPath(e, ".field > [data-step]:not(:disabled)");
294
+ const input = button?.parentElement.querySelector(
295
+ ':scope > input[type="number"]:not(:disabled, [readonly], [step="any"])'
296
+ );
297
+ if (!input) return;
298
+ const before = input.value;
299
+ input[button.dataset.step === "down" ? "stepDown" : "stepUp"]();
300
+ if (input.value === before) return;
301
+ input.dispatchEvent(new Event("input", { bubbles: true, composed: true }));
302
+ input.dispatchEvent(new Event("change", { bubbles: true }));
303
+ }
304
+ /**
305
+ * A revealed password goes back to type="password" when its form is
306
+ * submitted or reset, so it is never sent or autofilled as plain text and
307
+ * a reset field does not stay revealed. Reset fires no input or change
308
+ * event, so a reset form also drops its file lists, `.validate` errors and
309
+ * error summary, and fits each auto-resizing textarea to its restored text.
310
+ * That cleanup waits for the native reset and respects later cancellation.
311
+ */
312
+ static resetFormExtras(e) {
313
+ const form = e.target;
314
+ if (!(form instanceof HTMLFormElement)) return;
315
+ form.querySelectorAll("input[data-password]").forEach((input) => {
316
+ input.removeAttribute("data-password");
317
+ input.type = "password";
318
+ input.closest(".field")?.querySelector(".password-toggle")?.setAttribute("aria-pressed", "false");
319
+ });
320
+ if (e.type === "reset") {
321
+ setTimeout(() => {
322
+ if (!e.defaultPrevented) _Forms._afterReset(form);
323
+ }, 0);
324
+ }
325
+ }
326
+ /**
327
+ * Error summary. A `novalidate` form holding a `.error-summary` is checked
328
+ * when it is submitted. While any field is invalid the submit stops, as it
329
+ * would natively, and the summary's list gets one link per invalid field,
330
+ * "Label: browser message", before the summary is shown and focused. A
331
+ * valid submit hides it again. A submitter with `formnovalidate` skips the
332
+ * check.
333
+ */
334
+ static summarizeErrors(e) {
335
+ const form = e.target;
336
+ if (!(form instanceof HTMLFormElement)) return;
337
+ const summary = form.querySelector(".error-summary");
338
+ const list = summary?.querySelector("ul, ol");
339
+ if (!list || e.submitter?.hasAttribute("formnovalidate")) return;
340
+ if (form.checkValidity()) {
341
+ summary.hidden = true;
342
+ list.replaceChildren();
343
+ return;
344
+ }
345
+ e.preventDefault();
346
+ e.stopPropagation();
347
+ const seen = /* @__PURE__ */ new Set();
348
+ const items = [...form.elements].flatMap((field) => {
349
+ if (!field.willValidate || field.validity.valid) return [];
350
+ if (field.type === "radio") {
351
+ if (seen.has(field.name)) return [];
352
+ seen.add(field.name);
353
+ }
354
+ if (!field.id) field.id = `field-${Utils.guid()}`;
355
+ const group = field.type === "radio" ? field.closest("fieldset")?.querySelector("legend") : null;
356
+ const named = group ?? field.labels?.[0] ?? field.closest(".field")?.querySelector("label");
357
+ const text = named?.cloneNode(true);
358
+ text?.querySelectorAll("select, textarea").forEach((control) => control.remove());
359
+ const label = text?.textContent ?? field.getAttribute("aria-label") ?? "";
360
+ const link = document.createElement("a");
361
+ link.href = `#${field.id}`;
362
+ link.textContent = [label.replace(/\s+/g, " ").trim(), field.validationMessage].filter(Boolean).join(": ");
363
+ const item = document.createElement("li");
364
+ item.append(link);
365
+ return [item];
366
+ });
367
+ list.replaceChildren(...items);
368
+ if (!summary.hasAttribute("tabindex")) summary.tabIndex = -1;
369
+ summary.hidden = false;
370
+ summary.focus();
371
+ }
372
+ /**
373
+ * A summary link focuses its field instead of only scrolling to it. An
374
+ * enhanced select passes that focus on to its generated input itself.
375
+ */
376
+ static focusSummaryField(e) {
377
+ const link = Utils.closestInPath(e, '.error-summary a[href^="#"]');
378
+ const field = link && Utils.getElementById(link, link.getAttribute("href").slice(1));
379
+ if (!field) return;
380
+ e.preventDefault();
381
+ field.focus();
382
+ }
383
+ /**
384
+ * The native file input covers its .drop-zone, so the browser already takes
385
+ * a dropped file. This only shows the drag: the input is the topmost
386
+ * element, so every drag event over the zone targets it and leaving it is
387
+ * leaving the zone.
388
+ */
389
+ static markDropZone(e) {
390
+ const input = Utils.eventTarget(e);
391
+ if (!(input instanceof HTMLInputElement) || input.type !== "file") return;
392
+ const zone = input.closest(".drop-zone");
393
+ if (!zone) return;
394
+ const over = e.type === "dragenter" || e.type === "dragover";
395
+ zone.classList.toggle("dragover", over && !input.disabled);
396
+ }
397
+ /** Lists the chosen files, name and size, in the zone's .drop-zone-files. */
398
+ static listDropZoneFiles(zone, input) {
399
+ const list = Array.from(zone.querySelectorAll(".drop-zone-files")).find((list2) => list2.closest(".drop-zone") === zone);
400
+ if (!list) return;
401
+ const size = (bytes) => {
402
+ const [value, unit] = bytes >= 1e6 ? [bytes / 1e6, "megabyte"] : bytes >= 1e3 ? [bytes / 1e3, "kilobyte"] : [bytes, "byte"];
403
+ return new Intl.NumberFormat(void 0, { style: "unit", unit, maximumFractionDigits: 1 }).format(value);
404
+ };
405
+ list.replaceChildren(
406
+ ...Array.from(input.files ?? [], (file) => {
407
+ const item = document.createElement("li");
408
+ const name = document.createElement("span");
409
+ const meta = document.createElement("span");
410
+ name.textContent = file.name;
411
+ meta.textContent = size(file.size);
412
+ item.append(name, meta);
413
+ return item;
414
+ })
415
+ );
416
+ }
417
+ static InitTextarea(textarea) {
418
+ textarea.removeAttribute("original-height");
419
+ _Forms.textareaAutoResize(textarea);
420
+ textarea.addEventListener("input", (e) => _Forms.textareaAutoResize(e.target));
421
+ textarea.addEventListener("focus", () => {
422
+ if (!textarea.hasAttribute("original-height")) _Forms.textareaAutoResize(textarea);
423
+ });
424
+ }
425
+ static InitFileInputPath(fileInput) {
426
+ fileInput.addEventListener("change", () => {
427
+ const fileField = fileInput.closest(".file-field");
428
+ const pathInput = fileField?.querySelector("input.file-path");
429
+ if (!pathInput) return;
430
+ pathInput.value = Array.from(fileInput.files, (f) => f.name).join(", ");
431
+ pathInput.dispatchEvent(
432
+ new Event("change", { bubbles: true, cancelable: true, composed: true })
433
+ );
434
+ });
435
+ }
436
+ };
437
+ _Forms._initialized = false;
438
+ _Forms._fileErrors = /* @__PURE__ */ new WeakMap();
439
+ _Forms._fileSelections = /* @__PURE__ */ new WeakMap();
440
+ _Forms._onFileInput = (event) => {
441
+ const input = Utils.closestInPath(event, '.drop-zone input[type="file"]');
442
+ if (!input) return;
443
+ if (input.matches(":disabled")) return;
444
+ _Forms._updateDropZone(input);
445
+ };
446
+ var Forms = _Forms;
447
+
448
+ export {
449
+ Forms
450
+ };
451
+ //# sourceMappingURL=chunk-LWLNV5EC.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/behaviors/forms.ts"],
4
+ "sourcesContent": ["import { Utils } from '../core/utils';\n\nconst FILE_RULES = '.drop-zone input[type=\"file\"]:is([data-validate-types], [data-max-size], [data-max-files])';\n\ninterface FileFailure {\n rejected: File[];\n reason: 'type' | 'size' | 'count';\n message: string;\n}\n\nfunction fileLimit(input: HTMLInputElement, attribute: string) {\n const value = (input.getAttribute(attribute) || '').trim();\n if (!/^\\d+$/.test(value)) return 0;\n const limit = Number(value);\n return Number.isSafeInteger(limit) ? limit : 0;\n}\n\nfunction fileSpecifier(value: string) {\n if (value.endsWith('/*')) return /^(image|audio|video)\\/\\*$/.test(value);\n return /^\\.[^\\s/\\\\]+$/.test(value) ||\n /^[!#$%&'*+.^_`|~0-9a-z-]+\\/[!#$%&'*+.^_`|~0-9a-z-]+$/.test(value);\n}\n\nfunction fileMatches(file: File, specifier: string) {\n if (specifier.startsWith('.')) return file.name.toLowerCase().endsWith(specifier);\n if (specifier.endsWith('/*')) return file.type.toLowerCase().startsWith(specifier.slice(0, -1));\n return file.type.toLowerCase() === specifier;\n}\n\nexport class Forms {\n /**\n * Validates a `.validate` field: marks it `invalid` and `aria-invalid`\n * when it fails its constraints or `data-length`, and clears both when it\n * passes. An empty optional field never fails. The field is described by\n * its `[data-error]` supporting text, so the error the CSS shows there is\n * read with it.\n * Marked drop-zone file inputs also validate type/size rules and synchronize their\n * native custom validity and zone-level error text, without emitting events.\n * @param textfield\n */\n static validateField(textfield: HTMLInputElement) {\n if (!textfield) {\n console.error('No text field element found');\n return;\n }\n if (Forms._validatedFile(textfield)) {\n Forms._validateFiles(textfield);\n return;\n }\n if (!textfield.classList.contains('validate')) return;\n Forms._markInvalid(textfield, Forms._fails(textfield));\n Forms._describeByError(textfield);\n }\n\n private static _markInvalid(field: HTMLInputElement, invalid: boolean) {\n field.classList.toggle('invalid', invalid);\n if (invalid) field.setAttribute('aria-invalid', 'true');\n else field.removeAttribute('aria-invalid');\n }\n\n /** Whether a field fails its constraints or is longer than `data-length`. */\n private static _fails(field: HTMLInputElement) {\n return !Forms._blankOptional(field) && (!field.validity.valid || field.value.length > parseInt(field.getAttribute('data-length')));\n }\n\n /** An empty field that is not required, and holds no half-typed number or date, never fails. */\n private static _blankOptional(field: HTMLInputElement) {\n return field.value.length === 0 && !field.validity.badInput && !field.required;\n }\n\n /** Adds the field's `[data-error]` supporting text to its aria-describedby. */\n private static _describeByError(field: HTMLInputElement) {\n const error = field.parentElement?.querySelector(':scope > [data-error]');\n if (error) Forms._addDescription(field, Forms._idOf(error));\n }\n\n private static _idOf(el: Element) {\n if (!el.id) el.id = `field-error-${Utils.guid()}`;\n return el.id;\n }\n\n /** Adds an id to a field's aria-describedby once, after the page's own. */\n private static _addDescription(field: HTMLInputElement, id: string) {\n const ids = (field.getAttribute('aria-describedby') ?? '').split(/\\s+/).filter(Boolean);\n if (!ids.includes(id)) field.setAttribute('aria-describedby', [...ids, id].join(' '));\n }\n\n /**\n * Resizes the given TextArea after updating the\n * value content dynamically.\n * @param e EventTarget\n */\n static textareaAutoResize(e: EventTarget) {\n const textarea = e as HTMLTextAreaElement;\n if (!textarea) return;\n\n // Measure the textarea against itself: collapse it to its natural height,\n // then read the content height back. `.expressive-textarea` is\n // `overflow-y: hidden`, so scrollHeight is the full content height and\n // offsetHeight - clientHeight is exactly the borders (no scrollbar to\n // account for) - which border-box sizing needs added back.\n //\n // This replaces a mirror div that the value was copied into via\n // `innerHTML = innerHTML.replace(...)` - a full serialize and reparse of\n // the text on every keystroke, plus getComputedStyle and seven style\n // writes, run twice per keystroke because it was bound to keydown and\n // keyup both.\n if (!textarea.hasAttribute('original-height')) Forms._measureTextarea(textarea);\n // Not measured yet when it was hidden.\n const originalHeight = parseInt(textarea.getAttribute('original-height'));\n if (isNaN(originalHeight)) return;\n\n textarea.style.height = 'auto';\n // Three reads after a single write: one layout flush for the whole resize.\n const borders = textarea.offsetHeight - textarea.clientHeight;\n const contentHeight = textarea.scrollHeight + borders;\n textarea.style.height = Math.max(originalHeight, contentHeight) + 'px';\n }\n\n // A hidden textarea (closed dialog, inactive tab) measures 0. Storing that\n // would pin it collapsed, so it waits for a focus or input to measure.\n private static _measureTextarea(textarea: HTMLTextAreaElement) {\n const height = textarea.getBoundingClientRect().height;\n if (height) textarea.setAttribute('original-height', height.toString());\n }\n\n private static _initialized = false;\n private static _fileErrors = new WeakMap<HTMLInputElement, string>();\n private static _fileSelections = new WeakMap<HTMLInputElement, { files: File[]; constraints: string }>();\n\n private static _validatedFile(input: HTMLInputElement) {\n return input.matches(FILE_RULES) || Forms._fileErrors.has(input);\n }\n\n private static _rejectedTypes(input: HTMLInputElement) {\n const accepted = input.accept.split(',').map((value) => value.trim().toLowerCase()).filter(fileSpecifier);\n if (!accepted.length) return [];\n return Array.from(input.files ?? []).filter((file) => !accepted.some((specifier) => fileMatches(file, specifier)));\n }\n\n private static _validateFiles(input: HTMLInputElement) {\n if (input.matches(':disabled')) return;\n Forms._bindShadowForm(input);\n const failure = Forms._checkFiles(input);\n Forms._showFileError(input, failure?.message ?? input.validationMessage);\n return failure;\n }\n\n private static _checkFiles(input: HTMLInputElement) {\n Forms._clearFileError(input);\n if (!input.matches(FILE_RULES)) {\n Forms._fileErrors.delete(input);\n return;\n }\n Forms._fileErrors.set(input, '');\n const failure = Forms._fileFailure(input);\n if (failure) Forms._setFileError(input, failure.message);\n return failure;\n }\n\n private static _fileFailure(input: HTMLInputElement) {\n return Forms._typeFailure(input) ?? Forms._sizeFailure(input) ?? Forms._countFailure(input);\n }\n\n private static _typeFailure(input: HTMLInputElement): FileFailure | undefined {\n if (!input.hasAttribute('data-validate-types')) return;\n const rejected = Forms._rejectedTypes(input);\n if (rejected.length) return { rejected, reason: 'type', message: Forms._fileTypeMessage(input) };\n }\n\n private static _sizeFailure(input: HTMLInputElement): FileFailure | undefined {\n const limit = fileLimit(input, 'data-max-size');\n if (!limit) return;\n const rejected = Array.from(input.files ?? []).filter((file) => file.size > limit);\n if (!rejected.length) return;\n return { rejected, reason: 'size', message: Forms._fileSizeMessage(input, limit) };\n }\n\n private static _fileSizeMessage(input: HTMLInputElement, limit: number) {\n return Forms._fileError(input)?.getAttribute('data-error-size')?.trim() || `Maximum file size: ${limit} bytes.`;\n }\n\n private static _countFailure(input: HTMLInputElement): FileFailure | undefined {\n const limit = fileLimit(input, 'data-max-files');\n if (!limit) return;\n const rejected = Array.from(input.files ?? []);\n if (rejected.length > limit) return { rejected, reason: 'count', message: Forms._fileCountMessage(input, limit) };\n }\n\n private static _fileCountMessage(input: HTMLInputElement, limit: number) {\n return Forms._fileError(input)?.getAttribute('data-error-count')?.trim() || `Maximum file count: ${limit}.`;\n }\n\n private static _clearFileError(input: HTMLInputElement) {\n const owned = Forms._fileErrors.get(input);\n if (owned && owned === input.validationMessage) input.setCustomValidity('');\n }\n\n private static _setFileError(input: HTMLInputElement, message: string) {\n if (input.validity.customError) return;\n input.setCustomValidity(message);\n Forms._fileErrors.set(input, message);\n }\n\n private static _fileTypeMessage(input: HTMLInputElement) {\n const error = Forms._fileError(input);\n return error?.getAttribute('data-error')?.trim() || `Choose files matching: ${input.accept}.`;\n }\n\n private static _fileError(input: HTMLInputElement) {\n return Array.from(input.closest('.drop-zone')?.children ?? [])\n .find((child) => child.hasAttribute('data-error')) as HTMLElement | undefined;\n }\n\n private static _showFileError(input: HTMLInputElement, message: string) {\n Forms._markInvalid(input, !input.validity.valid);\n const error = Forms._fileError(input);\n if (!error) return;\n Forms._addDescription(input, Forms._idOf(error));\n error.textContent = message;\n error.hidden = !message;\n }\n\n private static _onFileInput = (event: Event) => {\n const input = Utils.closestInPath<HTMLInputElement>(event, '.drop-zone input[type=\"file\"]');\n if (!input) return;\n if (input.matches(':disabled')) return;\n Forms._updateDropZone(input);\n };\n\n private static _updateDropZone(input: HTMLInputElement) {\n Forms._bindShadowForm(input);\n const zone = input.closest('.drop-zone');\n const files = Array.from(input.files ?? []);\n const failure = Forms._validateDropZone(input);\n Forms.listDropZoneFiles(zone, input);\n Forms._reportFileRejection(input, files, failure);\n }\n\n private static _validateDropZone(input: HTMLInputElement) {\n if (Forms._validatedFile(input)) return Forms._validateFiles(input);\n Forms.validateField(input);\n }\n\n private static _reportFileRejection(input: HTMLInputElement, files: File[], failure?: FileFailure) {\n if (!input.matches(FILE_RULES)) {\n Forms._fileSelections.delete(input);\n return;\n }\n if (!Forms._newFileSelection(input, files)) return;\n if (!failure) return;\n Utils.emit(input.closest('.drop-zone'), 'reject', { input, files: files.slice(), rejected: failure.rejected.slice(), reason: failure.reason });\n }\n\n private static _newFileSelection(input: HTMLInputElement, files: File[]) {\n const constraints = JSON.stringify([input.hasAttribute('data-validate-types'), input.accept, fileLimit(input, 'data-max-size'), fileLimit(input, 'data-max-files')]);\n const previous = Forms._fileSelections.get(input);\n Forms._fileSelections.set(input, { files, constraints });\n return !previous || previous.constraints !== constraints || previous.files.length !== files.length ||\n !previous.files.every((file, index) => file === files[index]);\n }\n\n // Submit and reset do not leave a shadow root, so the document never hears\n // them. Adding the same listener again does nothing.\n private static _bindShadowForm(input: HTMLInputElement) {\n if (!(input.getRootNode() as ShadowRoot).host) return;\n for (const type of ['submit', 'reset']) input.form?.addEventListener(type, Forms.resetFormExtras, true);\n }\n\n private static _resetFileInput(input: HTMLInputElement) {\n if (input.files?.length) return;\n Forms._fileSelections.delete(input);\n Forms._resetFileList(input);\n Forms._resetFileValidity(input);\n }\n\n private static _resetFileList(input: HTMLInputElement) {\n const zone = input.closest('.drop-zone');\n if (!zone) return;\n Forms.listDropZoneFiles(zone, input);\n zone.classList.remove('dragover');\n }\n\n private static _resetFileValidity(input: HTMLInputElement) {\n if (input.matches(':disabled')) return;\n if (!Forms._validatedFile(input)) return;\n Forms._clearFileError(input);\n Forms._fileErrors.delete(input);\n Forms._showFileError(input, input.validationMessage);\n }\n\n private static _afterReset(form: HTMLFormElement) {\n const fields = Array.from(form.elements);\n fields.filter((field): field is HTMLInputElement =>\n field instanceof HTMLInputElement && field.type === 'file').forEach(Forms._resetFileInput);\n fields.filter((field) => field.classList.contains('validate'))\n .forEach((field: HTMLInputElement) => Forms._markInvalid(field, false));\n fields.filter((field) => field.classList.contains('expressive-textarea')).forEach(Forms.textareaAutoResize);\n const summary = form.querySelector<HTMLElement>('.error-summary');\n if (!summary) return;\n summary.hidden = true;\n summary.querySelector('ul, ol')?.replaceChildren();\n }\n\n /**\n * Safe to call more than once: the root entry calls it on import, and a page\n * that also loads the modular entry may call it again.\n */\n static Init() {\n if (Forms._initialized) return;\n Forms._initialized = true;\n Utils.onDocumentReady(() => {\n document.addEventListener('input', Forms._onFileInput);\n document.addEventListener('change', (e: Event) => {\n const target = Utils.eventTarget(e);\n if (!(target instanceof HTMLInputElement)) return;\n if (target.matches('.drop-zone input[type=\"file\"]')) {\n Forms._onFileInput(e);\n return;\n }\n // The sibling-label loop that used to live here compared\n // `tagName == 'label'` (tagName is uppercase) so it never matched,\n // and no rule in the Sass styles `label.active` anyway - the\n // floating label is driven by CSS, not by a class from here.\n Forms.validateField(target);\n });\n\n document.addEventListener('click', Forms.togglePassword);\n document.addEventListener('click', Forms.stepNumber);\n // Capture, so the password is hidden again before any submit handler\n // reads the form or the browser offers to save it.\n document.addEventListener('submit', Forms.resetFormExtras, true);\n document.addEventListener('submit', Forms.summarizeErrors, true);\n document.addEventListener('click', Forms.focusSummaryField);\n document.addEventListener('reset', Forms.resetFormExtras, true);\n for (const type of ['dragenter', 'dragover', 'dragleave', 'drop']) {\n document.addEventListener(type, Forms.markDropZone);\n }\n\n document.querySelectorAll('.expressive-textarea').forEach((textArea: HTMLTextAreaElement) => {\n Forms.InitTextarea(textArea);\n });\n\n // File Input Path\n document\n .querySelectorAll('.file-field input[type=\"file\"]')\n .forEach((fileInput: HTMLInputElement) => {\n Forms.InitFileInputPath(fileInput);\n });\n });\n }\n\n /**\n * A .password-toggle button shows or hides the password in its field. The\n * button's own name stays put (\"Show password\"); aria-pressed carries the\n * state, so there is no generated text to translate.\n */\n static togglePassword(e: MouseEvent) {\n const button = Utils.closestInPath(e, '.password-toggle');\n const input = button?.closest('.field')?.querySelector<HTMLInputElement>(\n 'input[type=\"password\"], input[data-password]'\n );\n if (!input) return;\n Forms._bindShadowForm(input);\n const show = input.type === 'password';\n // Marked so the input is still found once it has become type=\"text\".\n input.toggleAttribute('data-password', show);\n input.type = show ? 'text' : 'password';\n button.setAttribute('aria-pressed', String(show));\n }\n\n /**\n * A [data-step=\"up\"] or [data-step=\"down\"] button in a .field steps the\n * field's number input as the arrow keys would, within min, max and step,\n * and fires input and change if the value moved. A disabled, read-only or step=\"any\" input\n * is left alone; stepUp() would throw on step=\"any\".\n */\n static stepNumber(e: MouseEvent) {\n const button = Utils.closestInPath(e, '.field > [data-step]:not(:disabled)') as HTMLElement | null;\n const input = button?.parentElement!.querySelector<HTMLInputElement>(\n ':scope > input[type=\"number\"]:not(:disabled, [readonly], [step=\"any\"])'\n );\n if (!input) return;\n const before = input.value;\n input[button!.dataset.step === 'down' ? 'stepDown' : 'stepUp']();\n if (input.value === before) return;\n input.dispatchEvent(new Event('input', { bubbles: true, composed: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n /**\n * A revealed password goes back to type=\"password\" when its form is\n * submitted or reset, so it is never sent or autofilled as plain text and\n * a reset field does not stay revealed. Reset fires no input or change\n * event, so a reset form also drops its file lists, `.validate` errors and\n * error summary, and fits each auto-resizing textarea to its restored text.\n * That cleanup waits for the native reset and respects later cancellation.\n */\n static resetFormExtras(e: Event) {\n const form = e.target;\n if (!(form instanceof HTMLFormElement)) return;\n form.querySelectorAll<HTMLInputElement>('input[data-password]').forEach((input) => {\n input.removeAttribute('data-password');\n input.type = 'password';\n input.closest('.field')?.querySelector('.password-toggle')?.setAttribute('aria-pressed', 'false');\n });\n if (e.type === 'reset') {\n // Native events can run microtasks between listeners, before a later cancellation.\n setTimeout(() => {\n if (!e.defaultPrevented) Forms._afterReset(form);\n }, 0);\n }\n }\n\n /**\n * Error summary. A `novalidate` form holding a `.error-summary` is checked\n * when it is submitted. While any field is invalid the submit stops, as it\n * would natively, and the summary's list gets one link per invalid field,\n * \"Label: browser message\", before the summary is shown and focused. A\n * valid submit hides it again. A submitter with `formnovalidate` skips the\n * check.\n */\n static summarizeErrors(e: SubmitEvent) {\n const form = e.target;\n if (!(form instanceof HTMLFormElement)) return;\n const summary = form.querySelector<HTMLElement>('.error-summary');\n const list = summary?.querySelector('ul, ol');\n if (!list || e.submitter?.hasAttribute('formnovalidate')) return;\n // checkValidity fires `invalid` on each field, which FormSelect needs to\n // mark its generated field.\n if (form.checkValidity()) {\n summary.hidden = true;\n list.replaceChildren();\n return;\n }\n e.preventDefault();\n // Stop here, in the capture phase, so the page's own submit handlers do\n // not run for a form the browser would not have submitted.\n e.stopPropagation();\n const seen = new Set<string>();\n const items = [...form.elements].flatMap((field: HTMLInputElement) => {\n if (!field.willValidate || field.validity.valid) return [];\n // One entry per radio group.\n if (field.type === 'radio') {\n if (seen.has(field.name)) return [];\n seen.add(field.name);\n }\n if (!field.id) field.id = `field-${Utils.guid()}`;\n const group = field.type === 'radio' ? field.closest('fieldset')?.querySelector('legend') : null;\n // An enhanced select's label names the generated input, so fall back to\n // the label in the same .field.\n const named = group ?? field.labels?.[0] ?? field.closest('.field')?.querySelector('label');\n // A label can wrap its control; a select's options are not its name.\n const text = named?.cloneNode(true) as Element;\n text?.querySelectorAll('select, textarea').forEach((control) => control.remove());\n const label = text?.textContent ?? field.getAttribute('aria-label') ?? '';\n const link = document.createElement('a');\n link.href = `#${field.id}`;\n link.textContent = [label.replace(/\\s+/g, ' ').trim(), field.validationMessage].filter(Boolean).join(': ');\n const item = document.createElement('li');\n item.append(link);\n return [item];\n });\n list.replaceChildren(...items);\n if (!summary.hasAttribute('tabindex')) summary.tabIndex = -1;\n summary.hidden = false;\n summary.focus();\n }\n\n /**\n * A summary link focuses its field instead of only scrolling to it. An\n * enhanced select passes that focus on to its generated input itself.\n */\n static focusSummaryField(e: MouseEvent) {\n const link = Utils.closestInPath(e, '.error-summary a[href^=\"#\"]');\n const field = link && Utils.getElementById(link, link.getAttribute('href').slice(1));\n if (!field) return;\n e.preventDefault();\n field.focus();\n }\n\n /**\n * The native file input covers its .drop-zone, so the browser already takes\n * a dropped file. This only shows the drag: the input is the topmost\n * element, so every drag event over the zone targets it and leaving it is\n * leaving the zone.\n */\n static markDropZone(e: DragEvent) {\n const input = Utils.eventTarget(e);\n if (!(input instanceof HTMLInputElement) || input.type !== 'file') return;\n const zone = input.closest('.drop-zone');\n if (!zone) return;\n const over = e.type === 'dragenter' || e.type === 'dragover';\n zone.classList.toggle('dragover', over && !input.disabled);\n }\n\n /** Lists the chosen files, name and size, in the zone's .drop-zone-files. */\n static listDropZoneFiles(zone: Element, input: HTMLInputElement) {\n const list = Array.from(zone.querySelectorAll('.drop-zone-files')).find((list) => list.closest('.drop-zone') === zone);\n if (!list) return;\n const size = (bytes: number) => {\n const [value, unit] =\n bytes >= 1e6 ? [bytes / 1e6, 'megabyte'] : bytes >= 1e3 ? [bytes / 1e3, 'kilobyte'] : [bytes, 'byte'];\n return new Intl.NumberFormat(undefined, { style: 'unit', unit, maximumFractionDigits: 1 }).format(value);\n };\n list.replaceChildren(\n ...Array.from(input.files ?? [], (file) => {\n const item = document.createElement('li');\n const name = document.createElement('span');\n const meta = document.createElement('span');\n name.textContent = file.name;\n meta.textContent = size(file.size);\n item.append(name, meta);\n return item;\n })\n );\n }\n\n static InitTextarea(textarea: HTMLTextAreaElement) {\n // Measured afresh by textareaAutoResize, which skips a hidden textarea.\n textarea.removeAttribute('original-height');\n Forms.textareaAutoResize(textarea);\n // `input` rather than keydown + keyup: it fires once per actual value\n // change and also covers paste, drag-drop and IME composition, which the\n // key events missed.\n textarea.addEventListener('input', (e) => Forms.textareaAutoResize(e.target));\n // One that was hidden at init gets its first measurement once shown.\n textarea.addEventListener('focus', () => {\n if (!textarea.hasAttribute('original-height')) Forms.textareaAutoResize(textarea);\n });\n }\n\n static InitFileInputPath(fileInput: HTMLInputElement) {\n fileInput.addEventListener('change', () => {\n const fileField = fileInput.closest('.file-field');\n const pathInput = fileField?.querySelector<HTMLInputElement>('input.file-path');\n if (!pathInput) return;\n pathInput.value = Array.from(fileInput.files, (f) => f.name).join(', ');\n pathInput.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["list"]
7
+ }