@expressivecss/expressive 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/CHANGELOG.md +1502 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19247 -11923
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-4QUCNFSD.mjs} +64 -113
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-6FSEUFVW.mjs} +39 -26
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-7NLUI3RR.mjs} +139 -66
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-B7DQFHA5.mjs} +30 -47
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-BPF3I2MN.mjs} +109 -24
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-CSYWKEK3.mjs} +310 -196
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-EVCVFEV3.mjs} +235 -146
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-KZPSAXIU.mjs} +142 -32
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-OP43LLIC.mjs} +28 -45
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-OYNUDOHR.mjs} +19 -47
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UAZSDUVP.mjs → chunk-P6DRQ6KS.mjs} +36 -30
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-QXKWVHBD.mjs} +265 -161
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-VGY4M57S.mjs} +266 -120
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-VMY55K2X.mjs} +76 -109
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-ZJNLAGY5.mjs} +19 -30
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10613 -4327
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10613 -4327
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -22
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +182 -71
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +131 -66
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +3 -3
  274. package/dist/js/internal/components/lightbox.mjs +3 -3
  275. package/dist/js/internal/components/lineChart.mjs +25 -4
  276. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  277. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  278. package/dist/js/internal/components/mapView.mjs +3 -3
  279. package/dist/js/internal/components/menu.mjs +3 -3
  280. package/dist/js/internal/components/menubar.mjs +10 -0
  281. package/dist/js/internal/components/menubar.mjs.map +7 -0
  282. package/dist/js/internal/components/messageScroller.mjs +3 -3
  283. package/dist/js/internal/components/mixedChart.mjs +5 -4
  284. package/dist/js/internal/components/navigationRail.mjs +3 -2
  285. package/dist/js/internal/components/particles.mjs +3 -2
  286. package/dist/js/internal/components/pieChart.mjs +4 -3
  287. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  288. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  289. package/dist/js/internal/components/questionnaire.mjs +3 -3
  290. package/dist/js/internal/components/radarChart.mjs +4 -3
  291. package/dist/js/internal/components/radialChart.mjs +4 -3
  292. package/dist/js/internal/components/registry.mjs +59 -41
  293. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  294. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  295. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  296. package/dist/js/internal/components/scatterChart.mjs +10 -0
  297. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scrollspy.mjs +3 -2
  299. package/dist/js/internal/components/select.mjs +4 -4
  300. package/dist/js/internal/components/showMore.mjs +9 -0
  301. package/dist/js/internal/components/showMore.mjs.map +7 -0
  302. package/dist/js/internal/components/slider.mjs +3 -3
  303. package/dist/js/internal/components/snackbar.mjs +2 -2
  304. package/dist/js/internal/components/swipeActions.mjs +9 -0
  305. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  306. package/dist/js/internal/components/tabs.mjs +3 -4
  307. package/dist/js/internal/components/timepicker.mjs +5 -4
  308. package/dist/js/internal/components/tooltip.mjs +3 -3
  309. package/dist/js/internal/components/treeSelect.mjs +13 -0
  310. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  311. package/dist/js/internal/components/treemapChart.mjs +10 -0
  312. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  313. package/dist/js/internal/core/component.mjs +2 -1
  314. package/dist/js/internal/core/formControl.mjs +12 -0
  315. package/dist/js/internal/core/formControl.mjs.map +7 -0
  316. package/dist/js/internal/core/spring.mjs +11 -0
  317. package/dist/js/internal/core/spring.mjs.map +7 -0
  318. package/dist/js/internal/core/utils.mjs +11 -3
  319. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  320. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  322. package/dist/js/modular.mjs +173 -71
  323. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  324. package/dist/types/behaviors/copy.d.ts +18 -0
  325. package/dist/types/behaviors/dataTables.d.ts +129 -0
  326. package/dist/types/behaviors/dialogs.d.ts +27 -1
  327. package/dist/types/behaviors/forms.d.ts +68 -2
  328. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  329. package/dist/types/behaviors/lists.d.ts +12 -0
  330. package/dist/types/behaviors/paneResize.d.ts +29 -0
  331. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  332. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  333. package/dist/types/behaviors/sortable.d.ts +28 -0
  334. package/dist/types/behaviors/theme.d.ts +22 -0
  335. package/dist/types/behaviors/tour.d.ts +36 -0
  336. package/dist/types/behaviors/transferList.d.ts +51 -0
  337. package/dist/types/components/appBar.d.ts +5 -6
  338. package/dist/types/components/autocomplete.d.ts +91 -17
  339. package/dist/types/components/backToTop.d.ts +36 -0
  340. package/dist/types/components/barChart.d.ts +3 -6
  341. package/dist/types/components/buttonGroup.d.ts +2 -4
  342. package/dist/types/components/buttons.d.ts +5 -5
  343. package/dist/types/components/cards.d.ts +3 -16
  344. package/dist/types/components/carousel.d.ts +9 -15
  345. package/dist/types/components/cascader.d.ts +130 -0
  346. package/dist/types/components/characterCounter.d.ts +2 -15
  347. package/dist/types/components/chips.d.ts +65 -19
  348. package/dist/types/components/colorPicker.d.ts +42 -0
  349. package/dist/types/components/columnChart.d.ts +23 -10
  350. package/dist/types/components/commandPalette.d.ts +11 -16
  351. package/dist/types/components/confetti.d.ts +2 -4
  352. package/dist/types/components/currencyInput.d.ts +59 -0
  353. package/dist/types/components/datepicker.d.ts +56 -32
  354. package/dist/types/components/expandingCard.d.ts +4 -6
  355. package/dist/types/components/funnelChart.d.ts +38 -0
  356. package/dist/types/components/heatmapChart.d.ts +39 -8
  357. package/dist/types/components/hoverCard.d.ts +58 -0
  358. package/dist/types/components/index.d.ts +16 -1
  359. package/dist/types/components/inputMask.d.ts +30 -0
  360. package/dist/types/components/keypad.d.ts +38 -6
  361. package/dist/types/components/lightbox.d.ts +14 -20
  362. package/dist/types/components/lineChart.d.ts +172 -10
  363. package/dist/types/components/loadingOverlay.d.ts +42 -0
  364. package/dist/types/components/mapView.d.ts +26 -17
  365. package/dist/types/components/menu.d.ts +60 -22
  366. package/dist/types/components/menubar.d.ts +37 -0
  367. package/dist/types/components/messageScroller.d.ts +2 -14
  368. package/dist/types/components/mixedChart.d.ts +15 -6
  369. package/dist/types/components/navigationRail.d.ts +16 -5
  370. package/dist/types/components/particles.d.ts +8 -4
  371. package/dist/types/components/pieChart.d.ts +32 -7
  372. package/dist/types/components/pullToRefresh.d.ts +80 -0
  373. package/dist/types/components/questionnaire.d.ts +58 -16
  374. package/dist/types/components/radarChart.d.ts +10 -6
  375. package/dist/types/components/radialChart.d.ts +58 -7
  376. package/dist/types/components/registry.d.ts +73 -3
  377. package/dist/types/components/richTextEditor.d.ts +6 -14
  378. package/dist/types/components/sankeyChart.d.ts +72 -0
  379. package/dist/types/components/scatterChart.d.ts +102 -0
  380. package/dist/types/components/scrollspy.d.ts +3 -5
  381. package/dist/types/components/select.d.ts +43 -30
  382. package/dist/types/components/showMore.d.ts +51 -0
  383. package/dist/types/components/slider.d.ts +3 -15
  384. package/dist/types/components/snackbar.d.ts +61 -0
  385. package/dist/types/components/swipeActions.d.ts +81 -0
  386. package/dist/types/components/tabs.d.ts +89 -27
  387. package/dist/types/components/timepicker.d.ts +113 -21
  388. package/dist/types/components/tooltip.d.ts +56 -20
  389. package/dist/types/components/treeSelect.d.ts +106 -0
  390. package/dist/types/components/treemapChart.d.ts +56 -0
  391. package/dist/types/core/component.d.ts +43 -25
  392. package/dist/types/core/formControl.d.ts +21 -0
  393. package/dist/types/core/spring.d.ts +20 -0
  394. package/dist/types/core/utils.d.ts +85 -72
  395. package/dist/types/modular.d.ts +33 -1
  396. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  397. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  398. package/package.json +10 -8
  399. package/src/sass/README.md +27 -18
  400. package/src/sass/abstracts/_elevation.scss +13 -7
  401. package/src/sass/abstracts/_index.scss +1 -0
  402. package/src/sass/abstracts/_mixins.scss +422 -36
  403. package/src/sass/abstracts/_spring.scss +63 -0
  404. package/src/sass/abstracts/_variables.scss +39 -21
  405. package/src/sass/base/_fonts.scss +61 -48
  406. package/src/sass/base/_global.scss +104 -24
  407. package/src/sass/base/_index.scss +2 -0
  408. package/src/sass/base/_normalize.scss +59 -114
  409. package/src/sass/base/_print.scss +21 -0
  410. package/src/sass/base/_prose.scss +68 -0
  411. package/src/sass/base/_typography.scss +9 -5
  412. package/src/sass/components/_accordion.scss +9 -16
  413. package/src/sass/components/_alert.scss +102 -0
  414. package/src/sass/components/_aura.scss +8 -3
  415. package/src/sass/components/_avatar.scss +3 -3
  416. package/src/sass/components/_back-to-top.scss +38 -0
  417. package/src/sass/components/_badges.scss +6 -5
  418. package/src/sass/components/_bar-chart.scss +41 -19
  419. package/src/sass/components/_bottom-sheet.scss +44 -16
  420. package/src/sass/components/_breadcrumb.scss +8 -1
  421. package/src/sass/components/_button-groups.scss +15 -25
  422. package/src/sass/components/_buttons.scss +156 -63
  423. package/src/sass/components/_calendar.scss +246 -0
  424. package/src/sass/components/_cards.scss +36 -44
  425. package/src/sass/components/_carousel.scss +27 -103
  426. package/src/sass/components/_cascader.scss +142 -0
  427. package/src/sass/components/_chips.scss +36 -46
  428. package/src/sass/components/_column-chart.scss +19 -12
  429. package/src/sass/components/_command-palette.scss +4 -7
  430. package/src/sass/components/_confetti.scss +0 -2
  431. package/src/sass/components/_countdown.scss +1 -1
  432. package/src/sass/components/_data-table.scss +162 -25
  433. package/src/sass/components/_datepicker.scss +54 -40
  434. package/src/sass/components/_description-list.scss +85 -0
  435. package/src/sass/components/_dialog.scss +42 -41
  436. package/src/sass/components/_docked-display.scss +1 -3
  437. package/src/sass/components/_drag-handle.scss +16 -20
  438. package/src/sass/components/_expanding-card.scss +20 -9
  439. package/src/sass/components/_fab-menu.scss +44 -32
  440. package/src/sass/components/_funnel-chart.scss +124 -0
  441. package/src/sass/components/_heatmap-chart.scss +111 -22
  442. package/src/sass/components/_icon-buttons.scss +7 -7
  443. package/src/sass/components/_icons-material-design.scss +2 -2
  444. package/src/sass/components/_image-compare.scss +108 -0
  445. package/src/sass/components/_index.scss +20 -0
  446. package/src/sass/components/_keypad.scss +39 -19
  447. package/src/sass/components/_kpi.scss +6 -11
  448. package/src/sass/components/_lightbox.scss +24 -13
  449. package/src/sass/components/_line-chart.scss +16 -2
  450. package/src/sass/components/_list.scss +59 -14
  451. package/src/sass/components/_loading-indicator.scss +1 -0
  452. package/src/sass/components/_loading-overlay.scss +105 -0
  453. package/src/sass/components/_map.scss +33 -11
  454. package/src/sass/components/_marquee.scss +3 -2
  455. package/src/sass/components/_mega-menu.scss +137 -0
  456. package/src/sass/components/_menu.scss +143 -123
  457. package/src/sass/components/_menubar.scss +59 -0
  458. package/src/sass/components/_message-scroller.scss +2 -2
  459. package/src/sass/components/_message.scss +3 -3
  460. package/src/sass/components/_mixed-chart.scss +37 -9
  461. package/src/sass/components/_modal-display.scss +21 -0
  462. package/src/sass/components/_navbar.scss +34 -20
  463. package/src/sass/components/_navigation-bar.scss +15 -77
  464. package/src/sass/components/_navigation-rail.scss +151 -92
  465. package/src/sass/components/_org-chart.scss +192 -0
  466. package/src/sass/components/_page-footer.scss +1 -1
  467. package/src/sass/components/_pagination.scss +6 -13
  468. package/src/sass/components/_panes.scss +32 -26
  469. package/src/sass/components/_particles.scss +0 -2
  470. package/src/sass/components/_pie-chart.scss +91 -11
  471. package/src/sass/components/_popover.scss +18 -5
  472. package/src/sass/components/_progress.scss +152 -31
  473. package/src/sass/components/_pull-to-refresh.scss +90 -0
  474. package/src/sass/components/_questionnaire.scss +74 -3
  475. package/src/sass/components/_radar-chart.scss +38 -10
  476. package/src/sass/components/_radial-chart.scss +113 -5
  477. package/src/sass/components/_rich-text-editor.scss +2 -2
  478. package/src/sass/components/_sankey-chart.scss +114 -0
  479. package/src/sass/components/_scatter-chart.scss +153 -0
  480. package/src/sass/components/_scrim.scss +0 -2
  481. package/src/sass/components/_scrollspy.scss +0 -2
  482. package/src/sass/components/_search.scss +26 -22
  483. package/src/sass/components/_show-more.scss +8 -0
  484. package/src/sass/components/_side-sheet.scss +23 -37
  485. package/src/sass/components/_skeleton.scss +2 -4
  486. package/src/sass/components/_snackbar.scss +27 -21
  487. package/src/sass/components/_split-button.scss +5 -5
  488. package/src/sass/components/_stat.scss +3 -8
  489. package/src/sass/components/_stepper.scss +1 -1
  490. package/src/sass/components/_swipe-actions.scss +71 -0
  491. package/src/sass/components/_tabs.scss +51 -32
  492. package/src/sass/components/_timeline.scss +12 -12
  493. package/src/sass/components/_timepicker.scss +109 -78
  494. package/src/sass/components/_toolbar.scss +35 -43
  495. package/src/sass/components/_tooltip.scss +21 -12
  496. package/src/sass/components/_tour.scss +89 -0
  497. package/src/sass/components/_transfer-list.scss +73 -0
  498. package/src/sass/components/_transitions.scss +4 -4
  499. package/src/sass/components/_tree.scss +3 -16
  500. package/src/sass/components/_treemap-chart.scss +122 -0
  501. package/src/sass/components/forms/_checkboxes.scss +106 -24
  502. package/src/sass/components/forms/_color-picker.scss +135 -0
  503. package/src/sass/components/forms/_color-swatches.scss +85 -0
  504. package/src/sass/components/forms/_drop-zone.scss +15 -9
  505. package/src/sass/components/forms/_fieldset.scss +7 -7
  506. package/src/sass/components/forms/_file-input.scss +6 -8
  507. package/src/sass/components/forms/_index.scss +3 -1
  508. package/src/sass/components/forms/_input-fields.scss +254 -90
  509. package/src/sass/components/forms/_radio-buttons.scss +33 -94
  510. package/src/sass/components/forms/_rating.scss +2 -32
  511. package/src/sass/components/forms/_select.scss +199 -20
  512. package/src/sass/components/forms/_slider.scss +91 -94
  513. package/src/sass/components/forms/_switches.scss +53 -164
  514. package/src/sass/custom.scss +10 -1
  515. package/src/sass/expressive.scss +3 -63
  516. package/src/sass/tokens/_contrast.scss +94 -0
  517. package/src/sass/tokens/_elevation.scss +16 -0
  518. package/src/sass/tokens/_index.scss +5 -0
  519. package/src/sass/tokens/_motion.scss +109 -0
  520. package/src/sass/tokens/_reference.scss +72 -141
  521. package/src/sass/tokens/_shape.scss +38 -0
  522. package/src/sass/tokens/_stacking.scss +27 -0
  523. package/src/sass/tokens/_state.scss +0 -2
  524. package/src/sass/tokens/_theme.scss +10 -1
  525. package/src/sass/tokens/_vibrant.scss +2 -5
  526. package/src/sass/utilities/_defer-render.scss +17 -0
  527. package/src/sass/utilities/_helpers.scss +183 -26
  528. package/src/sass/utilities/_index.scss +1 -0
  529. package/src/sass/utilities/_scroll-area.scss +0 -2
  530. package/src/sass/utilities/_spacing.scss +52 -34
  531. package/src/sass/utilities/_typescale.scss +8 -1
  532. package/src/sass/utilities/_visibility.scss +47 -76
  533. package/src/sass/utilities/_z-depth.scss +7 -4
  534. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  535. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  536. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  537. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  540. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  541. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  543. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  548. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  553. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  556. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  562. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  564. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  567. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  568. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  569. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  570. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  572. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  574. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  578. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  582. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  584. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  587. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  589. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  590. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  592. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  593. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  594. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  596. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  598. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  599. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  602. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/ts/components/navigationRail.ts"],
4
+ "sourcesContent": ["import { Component, BaseOptions } from '../core/component';\n\nexport interface NavigationRailOptions extends BaseOptions {\n /**\n * Called before the rail expands.\n */\n onOpenStart: (el: HTMLElement) => void;\n /**\n * Called after the rail expands.\n */\n onOpenEnd: (el: HTMLElement) => void;\n /**\n * Called before the rail collapses.\n */\n onCloseStart: (el: HTMLElement) => void;\n /**\n * Called after the rail collapses.\n */\n onCloseEnd: (el: HTMLElement) => void;\n}\n\nconst _defaults: NavigationRailOptions = {\n onOpenStart: null,\n onOpenEnd: null,\n onCloseStart: null,\n onCloseEnd: null\n};\n\nconst COMPACT = '(width < 600px)';\n// Delay before a hovered destination opens its panel, and before the panel\n// closes once the pointer leaves; it covers the trip across the rail's padding.\nconst HOVER_DELAY = 200;\n\n/** The focused element, followed down through open shadow roots. */\nfunction deepActiveElement(root: Document | ShadowRoot): Element | null {\n let active = root.activeElement;\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n return active;\n}\n\n/**\n * Navigation rail. Layout is CSS (collapsed / .expanded). This class\n * toggles that class from the menu button, closes a compact overlay on\n * Escape or a scrim tap, and keeps aria-expanded in sync. A destination's\n * .navigation-rail-panel is a native popover; this class also opens it on\n * mouse hover.\n */\nexport class NavigationRail extends Component<NavigationRailOptions> {\n isExpanded: boolean;\n private _toggle: HTMLButtonElement | null;\n private _mql: MediaQueryList;\n private _hoverPanel: HTMLElement | null = null;\n private _hoverTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(el: HTMLElement, options: Partial<NavigationRailOptions>) {\n super(el, options);\n\n this._toggle = this._findToggle();\n this._mql = window.matchMedia(COMPACT);\n this.isExpanded = this.el.classList.contains('expanded');\n this._sync();\n const { signal } = this._events;\n this.el.addEventListener('click', this._onClick, { signal });\n this.el.addEventListener('pointerover', this._onPointerOver, { signal });\n this.el.addEventListener('pointerleave', this._onPointerLeave, { signal });\n document.addEventListener('keydown', this._onKeyDown, { signal });\n }\n\n static get defaults(): NavigationRailOptions {\n return _defaults;\n }\n\n static key = 'Expressive_NavigationRail';\n\n destroy() {\n clearTimeout(this._hoverTimer);\n super.destroy();\n }\n\n /**\n * Expands the rail. On compact windows the overlay (scrim) is CSS.\n */\n expand = () => {\n if (this.isExpanded) return;\n if (!this._notify('open', this.options.onOpenStart, { current: () => !this.isExpanded })) return;\n this.isExpanded = true;\n this.el.classList.add('expanded');\n this._sync();\n this._notify('opened', this.options.onOpenEnd, { current: () => this.isExpanded });\n };\n\n /**\n * Collapses the rail.\n */\n collapse = () => {\n if (!this.isExpanded) return;\n if (!this._notify('close', this.options.onCloseStart, { current: () => this.isExpanded })) return;\n this.isExpanded = false;\n this.el.classList.remove('expanded');\n this._sync();\n this._notify('closed', this.options.onCloseEnd, { current: () => !this.isExpanded });\n };\n\n /**\n * Toggles expanded / collapsed.\n */\n toggle = () => {\n if (this.isExpanded) this.collapse();\n else this.expand();\n };\n\n private _findToggle(): HTMLButtonElement | null {\n const first = this.el.querySelector(':scope > button:not(.button, [popovertarget])');\n return first instanceof HTMLButtonElement ? first : null;\n }\n\n private _isCompact() {\n return this._mql.matches;\n }\n\n private _isModal() {\n return this.el.classList.contains('modal') || this._isCompact();\n }\n\n private _sync() {\n this.el.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n this._toggle?.setAttribute('aria-expanded', this.isExpanded ? 'true' : 'false');\n }\n\n /** The side panel of the enabled destination around `target`, if any. */\n private _panelAt(target: EventTarget | null): HTMLElement | null {\n const trigger = target instanceof Element ? target.closest('button[popovertarget]:enabled') : null;\n const panel = (trigger as HTMLButtonElement | null)?.popoverTargetElement;\n return panel?.classList.contains('navigation-rail-panel') ? (panel as HTMLElement) : null;\n }\n\n // Looks the panel up again because the trigger can be disabled during the delay.\n private _hoverOpen(target: Element) {\n const panel = this._panelAt(target);\n if (!panel || panel.matches(':popover-open')) return;\n // `source` makes the trigger the panel's anchor and invoker, as a click would.\n (panel.showPopover as (options?: { source?: Element | null }) => void).call(panel, {\n source: target.closest('button[popovertarget]')\n });\n this._hoverPanel = panel;\n }\n\n // Closes the hover-opened panel after the delay, unless the pointer is still inside it.\n private _hoverClose(target: Element | null = null) {\n const panel = this._hoverPanel;\n if (!panel || panel.contains(target)) return;\n this._hoverTimer = setTimeout(() => {\n // Keyboard focus inside the panel keeps it open, as a click would.\n const root = this.el.getRootNode() as Document | ShadowRoot;\n if (panel.matches(':popover-open') && !panel.contains(root.activeElement)) panel.hidePopover();\n if (this._hoverPanel === panel) this._hoverPanel = null;\n }, HOVER_DELAY);\n }\n\n private _onPointerOver = (e: PointerEvent) => {\n if (e.pointerType !== 'mouse') return;\n clearTimeout(this._hoverTimer);\n const target = e.target as Element;\n const panel = this._panelAt(target);\n if (!panel) this._hoverClose(target);\n // Hovering the open panel's own trigger leaves it as it is.\n else if (panel !== this._hoverPanel) {\n this._hoverTimer = setTimeout(() => this._hoverOpen(target), HOVER_DELAY);\n }\n };\n\n // The panel is a descendant, so moving onto it does not leave the rail.\n private _onPointerLeave = (e: PointerEvent) => {\n if (e.pointerType !== 'mouse') return;\n clearTimeout(this._hoverTimer);\n this._hoverClose();\n };\n\n // Clicking a hover-opened panel's trigger keeps it open instead of toggling\n // it shut; either way the panel no longer follows the pointer.\n private _pinPanel(e: MouseEvent): boolean {\n const panel = this._panelAt(e.target);\n if (!panel) return false;\n clearTimeout(this._hoverTimer);\n if (panel === this._hoverPanel && panel.matches(':popover-open')) e.preventDefault();\n this._hoverPanel = null;\n return true;\n }\n\n private _onClick = (e: MouseEvent) => {\n const target = e.target;\n if (!(target instanceof Node) || this._pinPanel(e)) return;\n if (this._toggle?.contains(target)) {\n this.toggle();\n e.preventDefault();\n return;\n }\n if (this._isScrimClick(e) && this.isExpanded && this._isModal()) {\n this.collapse();\n }\n };\n\n // Escape closes an open side panel before the rail, and reports whether a\n // panel took the key. A hover-opened panel has no focus to return to, so\n // focus inside it goes back to its trigger.\n private _escapePanel(e: KeyboardEvent): boolean {\n // A pending hover would reopen a panel Escape just dismissed.\n clearTimeout(this._hoverTimer);\n this._hoverPanel = null;\n const panel = Array.from(this.el.querySelectorAll<HTMLElement>('.navigation-rail-panel')).find(\n (el) => el.matches(':popover-open')\n );\n if (!panel) return false;\n // A popover open inside the panel is on top; the browser closes it first.\n if (panel.querySelector(':popover-open')) return true;\n const root = this.el.getRootNode() as Document | ShadowRoot;\n const hadFocus = panel.contains(root.activeElement);\n panel.hidePopover();\n if (hadFocus) (panel.previousElementSibling as HTMLElement | null)?.focus();\n e.preventDefault();\n return true;\n }\n\n // The scrim is the rail's own ::before, so a click on blank space inside the\n // rail targets the rail just as a scrim click does. Only a click beside the\n // rail's box landed on the scrim; a modal rail spans the full height.\n private _isScrimClick(e: MouseEvent) {\n if (e.target !== this.el) return false;\n const { left, right } = this.el.getBoundingClientRect();\n return e.clientX < left || e.clientX > right;\n }\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || e.defaultPrevented || this._escapePanel(e)) return;\n if (this.isExpanded && this._isModal()) {\n const root = this.el.getRootNode() as Document | ShadowRoot;\n const restoreFocus = this.el.contains(root.activeElement);\n const focused = deepActiveElement(root);\n this.collapse();\n if (!this.isExpanded && restoreFocus && deepActiveElement(root) === focused) {\n this._toggle?.focus();\n }\n }\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,442 @@
1
+ import {
2
+ Utils
3
+ } from "./chunk-ZVLOUDIJ.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._bindFileReset(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._bindFileReset(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
+ static _bindFileReset(input) {
200
+ if (!input.getRootNode().host) return;
201
+ const form = input.form;
202
+ if (!form || _Forms._fileResetForms.has(form)) return;
203
+ _Forms._fileResetForms.add(form);
204
+ form.addEventListener("reset", _Forms.resetFormExtras);
205
+ }
206
+ static _resetFileInput(input) {
207
+ if (input.files?.length) return;
208
+ _Forms._fileSelections.delete(input);
209
+ _Forms._resetFileList(input);
210
+ _Forms._resetFileValidity(input);
211
+ }
212
+ static _resetFileList(input) {
213
+ const zone = input.closest(".drop-zone");
214
+ if (!zone) return;
215
+ _Forms.listDropZoneFiles(zone, input);
216
+ zone.classList.remove("dragover");
217
+ }
218
+ static _resetFileValidity(input) {
219
+ if (input.matches(":disabled")) return;
220
+ if (!_Forms._validatedFile(input)) return;
221
+ _Forms._clearFileError(input);
222
+ _Forms._fileErrors.delete(input);
223
+ _Forms._showFileError(input, input.validationMessage);
224
+ }
225
+ static _resetDropZones(form) {
226
+ Array.from(form.elements).filter((field) => field instanceof HTMLInputElement && field.type === "file").forEach(_Forms._resetFileInput);
227
+ }
228
+ /**
229
+ * Safe to call more than once: the root entry calls it on import, and a page
230
+ * that also loads the modular entry may call it again.
231
+ */
232
+ static Init() {
233
+ if (_Forms._initialized) return;
234
+ _Forms._initialized = true;
235
+ Utils.onDocumentReady(() => {
236
+ document.addEventListener("input", _Forms._onFileInput);
237
+ document.addEventListener("change", (e) => {
238
+ const target = Utils.eventTarget(e);
239
+ if (!(target instanceof HTMLInputElement)) return;
240
+ if (target.matches('.drop-zone input[type="file"]')) {
241
+ _Forms._onFileInput(e);
242
+ return;
243
+ }
244
+ _Forms.validateField(target);
245
+ });
246
+ document.addEventListener("click", _Forms.togglePassword);
247
+ document.addEventListener("click", _Forms.stepNumber);
248
+ document.addEventListener("submit", _Forms.resetFormExtras, true);
249
+ document.addEventListener("submit", _Forms.summarizeErrors, true);
250
+ document.addEventListener("click", _Forms.focusSummaryField);
251
+ document.addEventListener("reset", _Forms.resetFormExtras, true);
252
+ for (const type of ["dragenter", "dragover", "dragleave", "drop"]) {
253
+ document.addEventListener(type, _Forms.markDropZone);
254
+ }
255
+ document.querySelectorAll(".expressive-textarea").forEach((textArea) => {
256
+ _Forms.InitTextarea(textArea);
257
+ });
258
+ document.querySelectorAll('.file-field input[type="file"]').forEach((fileInput) => {
259
+ _Forms.InitFileInputPath(fileInput);
260
+ });
261
+ });
262
+ }
263
+ /**
264
+ * A .password-toggle button shows or hides the password in its field. The
265
+ * button's own name stays put ("Show password"); aria-pressed carries the
266
+ * state, so there is no generated text to translate.
267
+ */
268
+ static togglePassword(e) {
269
+ const button = Utils.closestInPath(e, ".password-toggle");
270
+ const input = button?.closest(".field")?.querySelector(
271
+ 'input[type="password"], input[data-password]'
272
+ );
273
+ if (!input) return;
274
+ const show = input.type === "password";
275
+ input.toggleAttribute("data-password", show);
276
+ input.type = show ? "text" : "password";
277
+ button.setAttribute("aria-pressed", String(show));
278
+ }
279
+ /**
280
+ * A [data-step="up"] or [data-step="down"] button in a .field steps the
281
+ * field's number input as the arrow keys would, within min, max and step,
282
+ * and fires input and change. A disabled, read-only or step="any" input
283
+ * is left alone; stepUp() would throw on step="any".
284
+ */
285
+ static stepNumber(e) {
286
+ const button = Utils.closestInPath(e, ".field > [data-step]:not(:disabled)");
287
+ const input = button?.parentElement.querySelector(
288
+ ':scope > input[type="number"]:not(:disabled, [readonly], [step="any"])'
289
+ );
290
+ if (!input) return;
291
+ input[button.dataset.step === "down" ? "stepDown" : "stepUp"]();
292
+ input.dispatchEvent(new Event("input", { bubbles: true, composed: true }));
293
+ input.dispatchEvent(new Event("change", { bubbles: true }));
294
+ }
295
+ /**
296
+ * A revealed password goes back to type="password" when its form is
297
+ * submitted or reset, so it is never sent or autofilled as plain text and
298
+ * a reset field does not stay revealed. A reset form also drops the file
299
+ * lists it would otherwise leave showing: reset fires no change event.
300
+ * File cleanup waits for native reset and respects later cancellation.
301
+ */
302
+ static resetFormExtras(e) {
303
+ const form = e.target;
304
+ if (!(form instanceof HTMLFormElement)) return;
305
+ form.querySelectorAll("input[data-password]").forEach((input) => {
306
+ input.removeAttribute("data-password");
307
+ input.type = "password";
308
+ input.closest(".field")?.querySelector(".password-toggle")?.setAttribute("aria-pressed", "false");
309
+ });
310
+ if (e.type === "reset") {
311
+ setTimeout(() => {
312
+ if (!e.defaultPrevented) _Forms._resetDropZones(form);
313
+ }, 0);
314
+ }
315
+ }
316
+ /**
317
+ * Error summary. A `novalidate` form holding a `.error-summary` is checked
318
+ * when it is submitted. While any field is invalid the submit stops, as it
319
+ * would natively, and the summary's list gets one link per invalid field,
320
+ * "Label: browser message", before the summary is shown and focused. A
321
+ * valid submit hides it again. A submitter with `formnovalidate` skips the
322
+ * check.
323
+ */
324
+ static summarizeErrors(e) {
325
+ const form = e.target;
326
+ if (!(form instanceof HTMLFormElement)) return;
327
+ const summary = form.querySelector(".error-summary");
328
+ const list = summary?.querySelector("ul, ol");
329
+ if (!list || e.submitter?.hasAttribute("formnovalidate")) return;
330
+ if (form.checkValidity()) {
331
+ summary.hidden = true;
332
+ list.replaceChildren();
333
+ return;
334
+ }
335
+ e.preventDefault();
336
+ e.stopPropagation();
337
+ const seen = /* @__PURE__ */ new Set();
338
+ const items = [...form.elements].flatMap((field) => {
339
+ if (!field.willValidate || field.validity.valid) return [];
340
+ if (field.type === "radio") {
341
+ if (seen.has(field.name)) return [];
342
+ seen.add(field.name);
343
+ }
344
+ if (!field.id) field.id = `field-${Utils.guid()}`;
345
+ const group = field.type === "radio" ? field.closest("fieldset")?.querySelector("legend") : null;
346
+ const named = group ?? field.labels?.[0] ?? field.closest(".field")?.querySelector("label");
347
+ const text = named?.cloneNode(true);
348
+ text?.querySelectorAll("select, textarea").forEach((control) => control.remove());
349
+ const label = text?.textContent ?? field.getAttribute("aria-label") ?? "";
350
+ const link = document.createElement("a");
351
+ link.href = `#${field.id}`;
352
+ link.textContent = [label.replace(/\s+/g, " ").trim(), field.validationMessage].filter(Boolean).join(": ");
353
+ const item = document.createElement("li");
354
+ item.append(link);
355
+ return [item];
356
+ });
357
+ list.replaceChildren(...items);
358
+ if (!summary.hasAttribute("tabindex")) summary.tabIndex = -1;
359
+ summary.hidden = false;
360
+ summary.focus();
361
+ }
362
+ /**
363
+ * A summary link focuses its field instead of only scrolling to it. An
364
+ * enhanced select passes that focus on to its generated input itself.
365
+ */
366
+ static focusSummaryField(e) {
367
+ const link = Utils.closestInPath(e, '.error-summary a[href^="#"]');
368
+ const field = link && Utils.getElementById(link, link.getAttribute("href").slice(1));
369
+ if (!field) return;
370
+ e.preventDefault();
371
+ field.focus();
372
+ }
373
+ /**
374
+ * The native file input covers its .drop-zone, so the browser already takes
375
+ * a dropped file. This only shows the drag: the input is the topmost
376
+ * element, so every drag event over the zone targets it and leaving it is
377
+ * leaving the zone.
378
+ */
379
+ static markDropZone(e) {
380
+ const input = Utils.eventTarget(e);
381
+ if (!(input instanceof HTMLInputElement) || input.type !== "file") return;
382
+ const zone = input.closest(".drop-zone");
383
+ if (!zone) return;
384
+ const over = e.type === "dragenter" || e.type === "dragover";
385
+ zone.classList.toggle("dragover", over && !input.disabled);
386
+ }
387
+ /** Lists the chosen files, name and size, in the zone's .drop-zone-files. */
388
+ static listDropZoneFiles(zone, input) {
389
+ const list = Array.from(zone.querySelectorAll(".drop-zone-files")).find((list2) => list2.closest(".drop-zone") === zone);
390
+ if (!list) return;
391
+ const size = (bytes) => {
392
+ const [value, unit] = bytes >= 1e6 ? [bytes / 1e6, "megabyte"] : bytes >= 1e3 ? [bytes / 1e3, "kilobyte"] : [bytes, "byte"];
393
+ return new Intl.NumberFormat(void 0, { style: "unit", unit, maximumFractionDigits: 1 }).format(value);
394
+ };
395
+ list.replaceChildren(
396
+ ...Array.from(input.files ?? [], (file) => {
397
+ const item = document.createElement("li");
398
+ const name = document.createElement("span");
399
+ const meta = document.createElement("span");
400
+ name.textContent = file.name;
401
+ meta.textContent = size(file.size);
402
+ item.append(name, meta);
403
+ return item;
404
+ })
405
+ );
406
+ }
407
+ static InitTextarea(textarea) {
408
+ textarea.removeAttribute("original-height");
409
+ _Forms.textareaAutoResize(textarea);
410
+ textarea.addEventListener("input", (e) => _Forms.textareaAutoResize(e.target));
411
+ textarea.addEventListener("focus", () => {
412
+ if (!textarea.hasAttribute("original-height")) _Forms.textareaAutoResize(textarea);
413
+ });
414
+ }
415
+ static InitFileInputPath(fileInput) {
416
+ fileInput.addEventListener("change", () => {
417
+ const fileField = fileInput.closest(".file-field");
418
+ const pathInput = fileField?.querySelector("input.file-path");
419
+ if (!pathInput) return;
420
+ pathInput.value = Array.from(fileInput.files, (f) => f.name).join(", ");
421
+ pathInput.dispatchEvent(
422
+ new Event("change", { bubbles: true, cancelable: true, composed: true })
423
+ );
424
+ });
425
+ }
426
+ };
427
+ _Forms._initialized = false;
428
+ _Forms._fileErrors = /* @__PURE__ */ new WeakMap();
429
+ _Forms._fileSelections = /* @__PURE__ */ new WeakMap();
430
+ _Forms._fileResetForms = /* @__PURE__ */ new WeakSet();
431
+ _Forms._onFileInput = (event) => {
432
+ const input = Utils.closestInPath(event, '.drop-zone input[type="file"]');
433
+ if (!input) return;
434
+ if (input.matches(":disabled")) return;
435
+ _Forms._updateDropZone(input);
436
+ };
437
+ var Forms = _Forms;
438
+
439
+ export {
440
+ Forms
441
+ };
442
+ //# sourceMappingURL=chunk-Z4OARDZ7.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 private static _fileResetForms = new WeakSet<HTMLFormElement>();\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._bindFileReset(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(event, '.drop-zone input[type=\"file\"]') as HTMLInputElement;\n if (!input) return;\n if (input.matches(':disabled')) return;\n Forms._updateDropZone(input);\n };\n\n private static _updateDropZone(input: HTMLInputElement) {\n Forms._bindFileReset(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 private static _bindFileReset(input: HTMLInputElement) {\n if (!(input.getRootNode() as ShadowRoot).host) return;\n const form = input.form;\n if (!form || Forms._fileResetForms.has(form)) return;\n Forms._fileResetForms.add(form);\n form.addEventListener('reset', Forms.resetFormExtras);\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 _resetDropZones(form: HTMLFormElement) {\n Array.from(form.elements).filter((field): field is HTMLInputElement =>\n field instanceof HTMLInputElement && field.type === 'file').forEach(Forms._resetFileInput);\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 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. 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 input[button!.dataset.step === 'down' ? 'stepDown' : 'stepUp']();\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. A reset form also drops the file\n * lists it would otherwise leave showing: reset fires no change event.\n * File cleanup waits for 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._resetDropZones(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
+ }