@expressivecss/expressive 0.14.1 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (603) hide show
  1. package/CHANGELOG.md +1589 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19304 -12021
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
  64. package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
  66. package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
  67. package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
  68. package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
  69. package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
  70. package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
  72. package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
  73. package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
  74. package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
  76. package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
  77. package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
  78. package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
  80. package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
  81. package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
  82. package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
  83. package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
  84. package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
  85. package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
  86. package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
  87. package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
  88. package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
  89. package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
  90. package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
  92. package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
  94. package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
  96. package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
  98. package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
  99. package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
  100. package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
  101. package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
  102. package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
  103. package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
  104. package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
  105. package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
  106. package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
  108. package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
  110. package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
  111. package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
  112. package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
  114. package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
  115. package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
  116. package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
  117. package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
  118. package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
  119. package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
  120. package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
  121. package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
  122. package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
  123. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  124. package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
  125. package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
  127. package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
  128. package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
  129. package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
  131. package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
  133. package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
  134. package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
  135. package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
  137. package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
  139. package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
  140. package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
  141. package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
  143. package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
  145. package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
  146. package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
  147. package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
  148. package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
  149. package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
  151. package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
  152. package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
  153. package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
  154. package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
  155. package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
  157. package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
  158. package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
  159. package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
  160. package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
  161. package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
  162. package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
  163. package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
  164. package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
  165. package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
  166. package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
  167. package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
  169. package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
  170. package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
  171. package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
  172. package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
  173. package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
  175. package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
  177. package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
  179. package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
  181. package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
  183. package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
  185. package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
  186. package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
  187. package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  189. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
  191. package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
  193. package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
  194. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
  195. package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
  197. package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
  199. package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
  201. package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
  202. package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
  203. package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
  205. package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
  206. package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
  207. package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
  208. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
  209. package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
  211. package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
  212. package/dist/js/expressive.cjs +10333 -4070
  213. package/dist/js/expressive.cjs.map +4 -4
  214. package/dist/js/expressive.js +10333 -4070
  215. package/dist/js/expressive.js.map +4 -4
  216. package/dist/js/expressive.min.js +23 -25
  217. package/dist/js/expressive.min.js.map +4 -4
  218. package/dist/js/expressive.mjs +184 -69
  219. package/dist/js/expressive.mjs.map +2 -2
  220. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  221. package/dist/js/internal/behaviors/copy.mjs +9 -0
  222. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  223. package/dist/js/internal/behaviors/dataTables.mjs +10 -0
  224. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  226. package/dist/js/internal/behaviors/forms.mjs +2 -2
  227. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  228. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  229. package/dist/js/internal/behaviors/lists.mjs +8 -0
  230. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  232. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  234. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  235. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  236. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  237. package/dist/js/internal/behaviors/theme.mjs +8 -0
  238. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/tour.mjs +8 -0
  240. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  242. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  243. package/dist/js/internal/components/appBar.mjs +3 -2
  244. package/dist/js/internal/components/autocomplete.mjs +4 -4
  245. package/dist/js/internal/components/backToTop.mjs +9 -0
  246. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  247. package/dist/js/internal/components/barChart.mjs +5 -4
  248. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  249. package/dist/js/internal/components/buttons.mjs +3 -3
  250. package/dist/js/internal/components/cards.mjs +3 -3
  251. package/dist/js/internal/components/carousel.mjs +3 -3
  252. package/dist/js/internal/components/cascader.mjs +10 -0
  253. package/dist/js/internal/components/cascader.mjs.map +7 -0
  254. package/dist/js/internal/components/characterCounter.mjs +3 -2
  255. package/dist/js/internal/components/chips.mjs +6 -5
  256. package/dist/js/internal/components/colorPicker.mjs +9 -0
  257. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  258. package/dist/js/internal/components/columnChart.mjs +4 -3
  259. package/dist/js/internal/components/commandPalette.mjs +3 -3
  260. package/dist/js/internal/components/confetti.mjs +3 -2
  261. package/dist/js/internal/components/currencyInput.mjs +9 -0
  262. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  263. package/dist/js/internal/components/datepicker.mjs +11 -8
  264. package/dist/js/internal/components/expandingCard.mjs +3 -3
  265. package/dist/js/internal/components/funnelChart.mjs +10 -0
  266. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  267. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  268. package/dist/js/internal/components/hoverCard.mjs +9 -0
  269. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  270. package/dist/js/internal/components/index.mjs +133 -64
  271. package/dist/js/internal/components/inputMask.mjs +9 -0
  272. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  273. package/dist/js/internal/components/keypad.mjs +9 -0
  274. package/dist/js/internal/components/keypad.mjs.map +7 -0
  275. package/dist/js/internal/components/lightbox.mjs +3 -3
  276. package/dist/js/internal/components/lineChart.mjs +29 -4
  277. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  278. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  279. package/dist/js/internal/components/mapView.mjs +3 -3
  280. package/dist/js/internal/components/menu.mjs +3 -3
  281. package/dist/js/internal/components/menubar.mjs +10 -0
  282. package/dist/js/internal/components/menubar.mjs.map +7 -0
  283. package/dist/js/internal/components/messageScroller.mjs +3 -3
  284. package/dist/js/internal/components/mixedChart.mjs +5 -4
  285. package/dist/js/internal/components/navigationRail.mjs +3 -2
  286. package/dist/js/internal/components/particles.mjs +3 -2
  287. package/dist/js/internal/components/pieChart.mjs +4 -3
  288. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  289. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  290. package/dist/js/internal/components/questionnaire.mjs +3 -3
  291. package/dist/js/internal/components/radarChart.mjs +4 -3
  292. package/dist/js/internal/components/radialChart.mjs +4 -3
  293. package/dist/js/internal/components/registry.mjs +59 -40
  294. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  295. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  296. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  297. package/dist/js/internal/components/scatterChart.mjs +10 -0
  298. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  299. package/dist/js/internal/components/scrollspy.mjs +3 -2
  300. package/dist/js/internal/components/select.mjs +4 -4
  301. package/dist/js/internal/components/showMore.mjs +9 -0
  302. package/dist/js/internal/components/showMore.mjs.map +7 -0
  303. package/dist/js/internal/components/slider.mjs +3 -3
  304. package/dist/js/internal/components/snackbar.mjs +2 -2
  305. package/dist/js/internal/components/swipeActions.mjs +9 -0
  306. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  307. package/dist/js/internal/components/tabs.mjs +3 -4
  308. package/dist/js/internal/components/timepicker.mjs +5 -4
  309. package/dist/js/internal/components/tooltip.mjs +3 -3
  310. package/dist/js/internal/components/treeSelect.mjs +13 -0
  311. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  312. package/dist/js/internal/components/treemapChart.mjs +10 -0
  313. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  314. package/dist/js/internal/core/component.mjs +2 -1
  315. package/dist/js/internal/core/formControl.mjs +12 -0
  316. package/dist/js/internal/core/formControl.mjs.map +7 -0
  317. package/dist/js/internal/core/spring.mjs +11 -0
  318. package/dist/js/internal/core/spring.mjs.map +7 -0
  319. package/dist/js/internal/core/utils.mjs +11 -3
  320. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  321. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  322. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  323. package/dist/js/modular.mjs +175 -69
  324. package/dist/types/behaviors/bottomSheets.d.ts +19 -3
  325. package/dist/types/behaviors/copy.d.ts +18 -0
  326. package/dist/types/behaviors/dataTables.d.ts +129 -0
  327. package/dist/types/behaviors/dialogs.d.ts +27 -1
  328. package/dist/types/behaviors/forms.d.ts +68 -2
  329. package/dist/types/behaviors/imageCompare.d.ts +12 -0
  330. package/dist/types/behaviors/lists.d.ts +12 -0
  331. package/dist/types/behaviors/paneResize.d.ts +29 -0
  332. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  333. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  334. package/dist/types/behaviors/sortable.d.ts +28 -0
  335. package/dist/types/behaviors/theme.d.ts +22 -0
  336. package/dist/types/behaviors/tour.d.ts +36 -0
  337. package/dist/types/behaviors/transferList.d.ts +51 -0
  338. package/dist/types/components/appBar.d.ts +5 -6
  339. package/dist/types/components/autocomplete.d.ts +92 -17
  340. package/dist/types/components/backToTop.d.ts +36 -0
  341. package/dist/types/components/barChart.d.ts +3 -6
  342. package/dist/types/components/buttonGroup.d.ts +2 -4
  343. package/dist/types/components/buttons.d.ts +5 -5
  344. package/dist/types/components/cards.d.ts +3 -16
  345. package/dist/types/components/carousel.d.ts +9 -15
  346. package/dist/types/components/cascader.d.ts +130 -0
  347. package/dist/types/components/characterCounter.d.ts +2 -15
  348. package/dist/types/components/chips.d.ts +65 -19
  349. package/dist/types/components/colorPicker.d.ts +42 -0
  350. package/dist/types/components/columnChart.d.ts +23 -10
  351. package/dist/types/components/commandPalette.d.ts +11 -16
  352. package/dist/types/components/confetti.d.ts +2 -4
  353. package/dist/types/components/currencyInput.d.ts +59 -0
  354. package/dist/types/components/datepicker.d.ts +59 -36
  355. package/dist/types/components/expandingCard.d.ts +6 -6
  356. package/dist/types/components/funnelChart.d.ts +38 -0
  357. package/dist/types/components/heatmapChart.d.ts +39 -8
  358. package/dist/types/components/hoverCard.d.ts +58 -0
  359. package/dist/types/components/index.d.ts +17 -1
  360. package/dist/types/components/inputMask.d.ts +30 -0
  361. package/dist/types/components/keypad.d.ts +66 -0
  362. package/dist/types/components/lightbox.d.ts +17 -25
  363. package/dist/types/components/lineChart.d.ts +176 -10
  364. package/dist/types/components/loadingOverlay.d.ts +42 -0
  365. package/dist/types/components/mapView.d.ts +26 -17
  366. package/dist/types/components/menu.d.ts +61 -22
  367. package/dist/types/components/menubar.d.ts +37 -0
  368. package/dist/types/components/messageScroller.d.ts +2 -14
  369. package/dist/types/components/mixedChart.d.ts +15 -6
  370. package/dist/types/components/navigationRail.d.ts +16 -5
  371. package/dist/types/components/particles.d.ts +8 -4
  372. package/dist/types/components/pieChart.d.ts +32 -7
  373. package/dist/types/components/pullToRefresh.d.ts +80 -0
  374. package/dist/types/components/questionnaire.d.ts +58 -16
  375. package/dist/types/components/radarChart.d.ts +10 -6
  376. package/dist/types/components/radialChart.d.ts +58 -8
  377. package/dist/types/components/registry.d.ts +77 -3
  378. package/dist/types/components/richTextEditor.d.ts +6 -14
  379. package/dist/types/components/sankeyChart.d.ts +72 -0
  380. package/dist/types/components/scatterChart.d.ts +102 -0
  381. package/dist/types/components/scrollspy.d.ts +3 -5
  382. package/dist/types/components/select.d.ts +43 -30
  383. package/dist/types/components/showMore.d.ts +51 -0
  384. package/dist/types/components/slider.d.ts +5 -15
  385. package/dist/types/components/snackbar.d.ts +62 -0
  386. package/dist/types/components/swipeActions.d.ts +81 -0
  387. package/dist/types/components/tabs.d.ts +93 -27
  388. package/dist/types/components/timepicker.d.ts +114 -20
  389. package/dist/types/components/tooltip.d.ts +56 -20
  390. package/dist/types/components/treeSelect.d.ts +106 -0
  391. package/dist/types/components/treemapChart.d.ts +56 -0
  392. package/dist/types/core/component.d.ts +43 -25
  393. package/dist/types/core/formControl.d.ts +21 -0
  394. package/dist/types/core/spring.d.ts +20 -0
  395. package/dist/types/core/utils.d.ts +85 -72
  396. package/dist/types/modular.d.ts +33 -1
  397. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
  398. package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
  399. package/package.json +10 -8
  400. package/src/sass/README.md +27 -18
  401. package/src/sass/abstracts/_breakpoints.scss +0 -1
  402. package/src/sass/abstracts/_elevation.scss +13 -7
  403. package/src/sass/abstracts/_index.scss +1 -0
  404. package/src/sass/abstracts/_mixins.scss +438 -92
  405. package/src/sass/abstracts/_spring.scss +63 -0
  406. package/src/sass/abstracts/_variables.scss +43 -15
  407. package/src/sass/base/_fonts.scss +61 -48
  408. package/src/sass/base/_global.scss +105 -34
  409. package/src/sass/base/_index.scss +3 -1
  410. package/src/sass/base/_normalize.scss +59 -114
  411. package/src/sass/base/_print.scss +21 -0
  412. package/src/sass/base/_prose.scss +68 -0
  413. package/src/sass/base/_typography.scss +9 -5
  414. package/src/sass/components/_accordion.scss +9 -16
  415. package/src/sass/components/_alert.scss +102 -0
  416. package/src/sass/components/_aura.scss +8 -3
  417. package/src/sass/components/_avatar.scss +3 -3
  418. package/src/sass/components/_back-to-top.scss +38 -0
  419. package/src/sass/components/_badges.scss +7 -13
  420. package/src/sass/components/_bar-chart.scss +41 -19
  421. package/src/sass/components/_bottom-sheet.scss +44 -16
  422. package/src/sass/components/_breadcrumb.scss +8 -1
  423. package/src/sass/components/_button-groups.scss +44 -89
  424. package/src/sass/components/_buttons.scss +156 -63
  425. package/src/sass/components/_calendar.scss +246 -0
  426. package/src/sass/components/_cards.scss +41 -68
  427. package/src/sass/components/_carousel.scss +43 -158
  428. package/src/sass/components/_cascader.scss +142 -0
  429. package/src/sass/components/_chips.scss +36 -52
  430. package/src/sass/components/_column-chart.scss +19 -12
  431. package/src/sass/components/_command-palette.scss +4 -7
  432. package/src/sass/components/_confetti.scss +0 -2
  433. package/src/sass/components/_countdown.scss +1 -1
  434. package/src/sass/components/_data-table.scss +162 -27
  435. package/src/sass/components/_datepicker.scss +57 -62
  436. package/src/sass/components/_description-list.scss +85 -0
  437. package/src/sass/components/_dialog.scss +42 -44
  438. package/src/sass/components/_docked-display.scss +1 -3
  439. package/src/sass/components/_drag-handle.scss +16 -20
  440. package/src/sass/components/_expanding-card.scss +20 -9
  441. package/src/sass/components/_fab-menu.scss +44 -32
  442. package/src/sass/components/_funnel-chart.scss +124 -0
  443. package/src/sass/components/_heatmap-chart.scss +113 -24
  444. package/src/sass/components/_icon-buttons.scss +7 -8
  445. package/src/sass/components/_icons-material-design.scss +2 -2
  446. package/src/sass/components/_image-compare.scss +108 -0
  447. package/src/sass/components/_index.scss +21 -0
  448. package/src/sass/components/_keypad.scss +182 -0
  449. package/src/sass/components/_kpi.scss +6 -11
  450. package/src/sass/components/_lightbox.scss +26 -20
  451. package/src/sass/components/_line-chart.scss +16 -2
  452. package/src/sass/components/_list.scss +59 -14
  453. package/src/sass/components/_loading-indicator.scss +1 -0
  454. package/src/sass/components/_loading-overlay.scss +105 -0
  455. package/src/sass/components/_map.scss +35 -13
  456. package/src/sass/components/_marquee.scss +3 -2
  457. package/src/sass/components/_mega-menu.scss +137 -0
  458. package/src/sass/components/_menu.scss +159 -182
  459. package/src/sass/components/_menubar.scss +59 -0
  460. package/src/sass/components/_message-scroller.scss +2 -2
  461. package/src/sass/components/_message.scss +3 -3
  462. package/src/sass/components/_mixed-chart.scss +37 -9
  463. package/src/sass/components/_modal-display.scss +21 -0
  464. package/src/sass/components/_navbar.scss +43 -65
  465. package/src/sass/components/_navigation-bar.scss +15 -77
  466. package/src/sass/components/_navigation-rail.scss +171 -121
  467. package/src/sass/components/_org-chart.scss +192 -0
  468. package/src/sass/components/_page-footer.scss +16 -13
  469. package/src/sass/components/_pagination.scss +6 -13
  470. package/src/sass/components/_panes.scss +33 -31
  471. package/src/sass/components/_particles.scss +0 -2
  472. package/src/sass/components/_pie-chart.scss +91 -11
  473. package/src/sass/components/_popover.scss +18 -5
  474. package/src/sass/components/_progress.scss +158 -35
  475. package/src/sass/components/_pull-to-refresh.scss +90 -0
  476. package/src/sass/components/_questionnaire.scss +74 -3
  477. package/src/sass/components/_radar-chart.scss +38 -10
  478. package/src/sass/components/_radial-chart.scss +113 -5
  479. package/src/sass/components/_rich-text-editor.scss +2 -2
  480. package/src/sass/components/_sankey-chart.scss +114 -0
  481. package/src/sass/components/_scatter-chart.scss +153 -0
  482. package/src/sass/components/_scrim.scss +0 -2
  483. package/src/sass/components/_scrollspy.scss +0 -2
  484. package/src/sass/components/_search.scss +26 -22
  485. package/src/sass/components/_show-more.scss +8 -0
  486. package/src/sass/components/_side-sheet.scss +23 -40
  487. package/src/sass/components/_skeleton.scss +2 -4
  488. package/src/sass/components/_snackbar.scss +27 -21
  489. package/src/sass/components/_split-button.scss +5 -5
  490. package/src/sass/components/_stat.scss +3 -8
  491. package/src/sass/components/_stepper.scss +1 -5
  492. package/src/sass/components/_swipe-actions.scss +71 -0
  493. package/src/sass/components/_tabs.scss +51 -32
  494. package/src/sass/components/_timeline.scss +12 -12
  495. package/src/sass/components/_timepicker.scss +111 -112
  496. package/src/sass/components/_toolbar.scss +35 -47
  497. package/src/sass/components/_tooltip.scss +21 -12
  498. package/src/sass/components/_tour.scss +89 -0
  499. package/src/sass/components/_transfer-list.scss +73 -0
  500. package/src/sass/components/_transitions.scss +4 -4
  501. package/src/sass/components/_tree.scss +3 -16
  502. package/src/sass/components/_treemap-chart.scss +122 -0
  503. package/src/sass/components/forms/_checkboxes.scss +140 -86
  504. package/src/sass/components/forms/_color-picker.scss +135 -0
  505. package/src/sass/components/forms/_color-swatches.scss +85 -0
  506. package/src/sass/components/forms/_drop-zone.scss +15 -9
  507. package/src/sass/components/forms/_fieldset.scss +10 -10
  508. package/src/sass/components/forms/_file-input.scss +6 -9
  509. package/src/sass/components/forms/_index.scss +3 -1
  510. package/src/sass/components/forms/_input-fields.scss +254 -90
  511. package/src/sass/components/forms/_radio-buttons.scss +40 -127
  512. package/src/sass/components/forms/_rating.scss +2 -32
  513. package/src/sass/components/forms/_select.scss +199 -23
  514. package/src/sass/components/forms/_slider.scss +140 -330
  515. package/src/sass/components/forms/_switches.scss +53 -164
  516. package/src/sass/custom.scss +10 -1
  517. package/src/sass/expressive.scss +3 -63
  518. package/src/sass/tokens/_contrast.scss +94 -0
  519. package/src/sass/tokens/_elevation.scss +16 -0
  520. package/src/sass/tokens/_index.scss +5 -0
  521. package/src/sass/tokens/_motion.scss +109 -0
  522. package/src/sass/tokens/_reference.scss +72 -141
  523. package/src/sass/tokens/_shape.scss +38 -0
  524. package/src/sass/tokens/_stacking.scss +27 -0
  525. package/src/sass/tokens/_state.scss +2 -4
  526. package/src/sass/tokens/_theme.scss +11 -2
  527. package/src/sass/tokens/_vibrant.scss +2 -5
  528. package/src/sass/utilities/_colors.scss +6 -1
  529. package/src/sass/utilities/_defer-render.scss +17 -0
  530. package/src/sass/utilities/_helpers.scss +183 -26
  531. package/src/sass/utilities/_index.scss +2 -1
  532. package/src/sass/utilities/_scroll-area.scss +0 -2
  533. package/src/sass/utilities/_spacing.scss +52 -34
  534. package/src/sass/utilities/_typescale.scss +8 -1
  535. package/src/sass/utilities/_visibility.scss +47 -76
  536. package/src/sass/utilities/_z-depth.scss +7 -4
  537. package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
  538. package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
  539. package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
  540. package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
  541. package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
  543. package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
  544. package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
  546. package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
  547. package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
  549. package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
  551. package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
  554. package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
  558. package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
  559. package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
  560. package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
  562. package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
  565. package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
  568. package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
  570. package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
  572. package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
  573. package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
  574. package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
  575. package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
  578. package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
  580. package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
  582. package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
  584. package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
  586. package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
  587. package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
  589. package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
  591. package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
  594. package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
  596. package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
  597. package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
  599. package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
  600. package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
  603. /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -1,11 +1,41 @@
1
- import {
2
- Utils
3
- } from "./chunk-MNPROCZF.mjs";
4
1
  import {
5
2
  Component
6
- } from "./chunk-LTWPGFBR.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ controllerFor,
7
+ restoreAttribute
8
+ } from "./chunk-ZVLOUDIJ.mjs";
7
9
 
8
10
  // src/ts/components/menu.ts
11
+ var parentOf = (el) => el.parentElement ?? (el.getRootNode().host || null);
12
+ var IDENTITY = { translate: /^(none|0px( 0px){0,2})$/, rotate: /^(none|(\S+ )*0deg)$/, scale: /^(none|1( 1){0,2})$/ };
13
+ function transformed(el) {
14
+ for (let node = parentOf(el); node; node = parentOf(node)) {
15
+ const style = getComputedStyle(node);
16
+ if (!new DOMMatrixReadOnly(style.transform).isIdentity) return true;
17
+ if (Object.entries(IDENTITY).some(([property, identity]) => !identity.test(style.getPropertyValue(property)))) return true;
18
+ }
19
+ return false;
20
+ }
21
+ function shadowRoots(el) {
22
+ const roots = [];
23
+ for (let root = el.getRootNode(); "host" in root; root = root.host.getRootNode()) roots.push(root);
24
+ return roots;
25
+ }
26
+ function room(el, menu, offset) {
27
+ const rect = el.getBoundingClientRect();
28
+ return {
29
+ left: window.innerWidth - (rect.left + menu.width),
30
+ right: rect.right - menu.width,
31
+ top: window.innerHeight - (rect.top + menu.height + offset),
32
+ bottom: rect.bottom - (menu.height + offset)
33
+ };
34
+ }
35
+ var STEPS = { ArrowUp: -1, ArrowDown: 1 };
36
+ var ROWS = ':scope > li, :scope > li > ul[role="group"] > li';
37
+ var anchorSupported = typeof CSS !== "undefined" && !!CSS.supports?.("anchor-name: --a");
38
+ var ANCHOR_STYLES = ["position", "inset", "max-height", "position-anchor", "position-area", "position-try-fallbacks"];
9
39
  var MIN_SURFACE_WIDTH = 112;
10
40
  var MAX_SURFACE_WIDTH = 280;
11
41
  var _defaults = {
@@ -14,6 +44,7 @@ var _defaults = {
14
44
  constrainWidth: true,
15
45
  container: null,
16
46
  coverTrigger: false,
47
+ placement: "bottom",
17
48
  closeOnClick: true,
18
49
  hover: false,
19
50
  contextMenu: false,
@@ -28,10 +59,15 @@ var _defaults = {
28
59
  var SPACE = " ";
29
60
  var _Menu = class _Menu extends Component {
30
61
  constructor(el, options) {
31
- super(el, options, _Menu);
62
+ super(el, { contextMenu: el.hasAttribute("data-context-menu"), ...options });
32
63
  this._pendingTimers = /* @__PURE__ */ new Set();
33
64
  this._transition = 0;
34
65
  this._menuClickTargets = /* @__PURE__ */ new WeakMap();
66
+ // True while Space activates a row, so the click it sends can keep a radio
67
+ // menu open.
68
+ this._spaceActivation = false;
69
+ /** Whether the pointer opened the menu, so opening leaves focus where it was. */
70
+ this._openedByHover = false;
35
71
  /**
36
72
  * Viewport point the open context menu belongs to. Null outside a
37
73
  * right-click, so a keyboard or programmatic open uses the region's corner
@@ -75,6 +111,8 @@ var _Menu = class _Menu extends Component {
75
111
  }
76
112
  };
77
113
  this._handleMouseEnter = () => {
114
+ if (this.isOpen) return;
115
+ this._openedByHover = true;
78
116
  this.open();
79
117
  };
80
118
  this._handleMouseLeave = (e) => {
@@ -83,42 +121,58 @@ var _Menu = class _Menu extends Component {
83
121
  this.close();
84
122
  return;
85
123
  }
86
- const leaveToMenuContent = !!(this.menuEl && toEl && this.menuEl.contains(toEl));
87
- let leaveToActiveMenuTrigger = false;
88
- const closestTrigger = toEl.closest(".menu-trigger");
89
- if (closestTrigger && !!closestTrigger["Expressive_Menu"] && closestTrigger["Expressive_Menu"].isOpen) {
90
- leaveToActiveMenuTrigger = true;
91
- }
92
- if (!leaveToActiveMenuTrigger && !leaveToMenuContent) {
93
- this.close();
94
- }
124
+ const leaveToActiveMenuTrigger = toEl.closest(".menu-trigger")?.["Expressive_Menu"]?.isOpen;
125
+ if (!leaveToActiveMenuTrigger && !this.menuEl?.contains(toEl)) this.close();
95
126
  };
96
127
  this._handleDocumentClick = (e) => {
97
128
  const path = e.composedPath();
98
129
  const menuTarget = this._menuClickTargets.get(e);
99
130
  this._menuClickTargets.delete(e);
131
+ if (!menuTarget && !this.options.contextMenu && path.includes(this.el)) {
132
+ this.isTouchMoving = false;
133
+ return;
134
+ }
100
135
  const target = menuTarget ?? (path[0] || e.target);
101
136
  const inside = !!menuTarget || path.includes(this.menuEl) || this.menuEl?.contains(target);
102
137
  if (this._isSubmenuTriggerClick(target)) return;
103
- if (this.options.closeOnClick && inside && !this.isTouchMoving) {
138
+ if (inside && this._closesOnClick(target)) {
104
139
  this.close();
105
140
  } else if (!inside) {
106
- this._schedule(() => {
107
- if (this.isOpen) {
108
- this.close();
109
- }
110
- }, 0);
141
+ this._schedule(() => this.close(), 0);
111
142
  }
112
143
  this.isTouchMoving = false;
113
144
  };
145
+ // A hover-opened menu does not hold focus, so its own keydown handler never
146
+ // sees Escape. Close it from wherever focus is, without moving focus, and
147
+ // take the key only when it was pressed on the trigger.
148
+ this._handleDocumentKeydown = (e) => {
149
+ if (e.key !== "Escape" || !this._openedByHover) return;
150
+ if (Utils.focusIsIn(this.el)) e.preventDefault();
151
+ this.close();
152
+ };
114
153
  this._handleTriggerKeydown = (e) => {
115
154
  if (this.options.contextMenu) return;
116
- const opensMenu = e.key === SPACE || e.key === Utils.keys.ENTER || e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;
117
- if (opensMenu && !this.isOpen) {
155
+ if (e.key === "Escape" && this.isOpen && Utils.plainKey(e) && !Utils.isComposing(e)) {
156
+ e.preventDefault();
157
+ this.close();
158
+ return;
159
+ }
160
+ const opensMenu = [SPACE, "Enter", "ArrowDown", "ArrowUp"].includes(e.key);
161
+ if (!opensMenu) return;
162
+ if (!this.isOpen) {
118
163
  e.preventDefault();
119
164
  this.open();
165
+ } else if (this._openedByHover) {
166
+ e.preventDefault();
167
+ this._openedByHover = false;
168
+ this._focusInitialItem();
120
169
  }
121
170
  };
171
+ // A scroll ends without a click, which is the only other place the flag is
172
+ // cleared, so a new gesture has to clear it or the next tap is ignored.
173
+ this._handleMenuPointerdown = () => {
174
+ this.isTouchMoving = false;
175
+ };
122
176
  this._handleDocumentTouchmove = (e) => {
123
177
  const target = e.target;
124
178
  if (e.composedPath().includes(this.menuEl) || this.menuEl?.contains(target)) {
@@ -140,9 +194,7 @@ var _Menu = class _Menu extends Component {
140
194
  this._toggleSubmenu(li);
141
195
  return;
142
196
  }
143
- if (li && typeof this.options.onItemClick === "function") {
144
- this.options.onItemClick.call(this, li);
145
- }
197
+ if (li) this._activateItem(li);
146
198
  };
147
199
  this._handleSubmenuAlign = (e) => {
148
200
  const target = e.target;
@@ -153,17 +205,16 @@ var _Menu = class _Menu extends Component {
153
205
  }
154
206
  };
155
207
  this._handleMenuKeydown = (e) => {
156
- if (!this.isOpen || e.ctrlKey || e.metaKey || e.altKey || e.isComposing) return;
208
+ if (!this.isOpen || !Utils.plainKey(e) || Utils.isComposing(e)) return;
157
209
  const list = this._containingSubmenu(e) ?? this.menuEl;
158
210
  const rtl = getComputedStyle(list).direction === "rtl";
159
- const openKey = rtl ? Utils.keys.ARROW_LEFT : Utils.keys.ARROW_RIGHT;
160
- const backKey = rtl ? Utils.keys.ARROW_RIGHT : Utils.keys.ARROW_LEFT;
161
- if ([openKey, backKey, Utils.keys.ARROW_UP, Utils.keys.ARROW_DOWN, Utils.keys.ESC, Utils.keys.TAB].includes(e.key)) {
211
+ const openKey = rtl ? "ArrowLeft" : "ArrowRight";
212
+ const backKey = rtl ? "ArrowRight" : "ArrowLeft";
213
+ if ([openKey, backKey, "ArrowUp", "ArrowDown", "Escape", "Tab"].includes(e.key)) {
162
214
  clearTimeout(this.filterTimeout);
163
215
  this._resetFilterQuery();
164
216
  }
165
- const arrowUpOrDown = e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;
166
- if (e.key === Utils.keys.TAB) {
217
+ if (e.key === "Tab") {
167
218
  e.preventDefault();
168
219
  this.close();
169
220
  } else if (e.key === openKey) {
@@ -183,30 +234,12 @@ var _Menu = class _Menu extends Component {
183
234
  if (submenu) {
184
235
  e.preventDefault();
185
236
  const parentLi = submenu.parentElement;
186
- parentLi.classList.remove("open", "submenu-start");
187
- this._syncSubmenuAria(parentLi, false);
237
+ this._closeSubmenu(parentLi);
188
238
  this._focusRow(parentLi);
189
239
  }
190
- } else if (arrowUpOrDown && this.isOpen) {
240
+ } else if (this._moveFocus(list, e)) {
191
241
  e.preventDefault();
192
- const direction = e.key === Utils.keys.ARROW_DOWN ? 1 : -1;
193
- const row = this._focusedRow(e);
194
- let newFocusedIndex = row ? Array.from(list.children).indexOf(row) : this.focusedIndex;
195
- let hasFoundNewIndex = false;
196
- do {
197
- newFocusedIndex = newFocusedIndex + direction;
198
- if (!!list.children[newFocusedIndex] && list.children[newFocusedIndex].tabIndex !== -1) {
199
- hasFoundNewIndex = true;
200
- break;
201
- }
202
- } while (newFocusedIndex < list.children.length && newFocusedIndex >= 0);
203
- if (hasFoundNewIndex) {
204
- if (this.focusedIndex >= 0) list.children[this.focusedIndex]?.classList.remove("active");
205
- const item = list.children[newFocusedIndex];
206
- item.classList.add("active");
207
- this._focusRow(item);
208
- }
209
- } else if ((e.key === Utils.keys.ENTER || e.key === SPACE) && this.isOpen) {
242
+ } else if (e.key === "Enter" || e.key === SPACE) {
210
243
  const li = this._focusedRow(e);
211
244
  e.preventDefault();
212
245
  if (li?.matches('.disabled, [aria-disabled="true"]')) return;
@@ -216,28 +249,30 @@ var _Menu = class _Menu extends Component {
216
249
  }
217
250
  const focusedElement = li ?? this.menuEl.children[this.focusedIndex];
218
251
  const activatableElement = focusedElement?.querySelector(":scope > a, :scope > button");
252
+ this._spaceActivation = e.key === SPACE;
219
253
  if (!!activatableElement) {
220
254
  activatableElement.click();
221
255
  } else if (focusedElement instanceof HTMLElement) {
222
256
  focusedElement.click();
223
257
  }
224
- } else if (e.key === Utils.keys.ESC && this.isOpen) {
258
+ this._spaceActivation = false;
259
+ this._closeAfterEnter(e, focusedElement);
260
+ } else if (e.key === "Escape") {
225
261
  e.preventDefault();
226
262
  const openSub = this._containingSubmenu(e)?.parentElement ?? Array.from(this.menuEl.querySelectorAll("li.open")).reverse()[0];
227
263
  if (openSub) {
228
- openSub.classList.remove("open", "submenu-start");
229
- this._syncSubmenuAria(openSub, false);
264
+ this._closeSubmenu(openSub);
230
265
  this._focusRow(openSub);
231
266
  } else {
232
267
  this.close();
233
268
  }
234
269
  }
235
270
  const keyText = e.key.toLowerCase();
236
- if (e.key.length === 1 && e.key !== SPACE && !e.ctrlKey && !e.metaKey && !e.altKey && !e.isComposing) {
271
+ if (e.key.length === 1 && e.key !== SPACE) {
237
272
  this.filterQuery.push(keyText);
238
273
  const string = this.filterQuery.join("");
239
- const newOptionEl = Array.from(list.querySelectorAll(":scope > li")).find(
240
- (el) => el.tabIndex !== -1 && !el.matches('.disabled, [aria-disabled="true"]') && Array.from(el.childNodes).filter((node) => !(node instanceof Element && node.matches("menu"))).map((node) => node.textContent).join("").trim().toLowerCase().startsWith(string)
274
+ const newOptionEl = this._rows(list).find(
275
+ (el) => !el.matches('.disabled, [aria-disabled="true"]') && Array.from(el.childNodes).filter((node) => !(node instanceof Element && node.matches("menu"))).map((node) => node.textContent).join("").trim().toLowerCase().startsWith(string)
241
276
  );
242
277
  if (newOptionEl) {
243
278
  this._focusRow(newOptionEl);
@@ -254,19 +289,39 @@ var _Menu = class _Menu extends Component {
254
289
  this._resetFilterQuery = () => {
255
290
  this.filterQuery = [];
256
291
  };
292
+ // Below the trigger, or above it for placement 'top', starting at its left
293
+ // edge for alignment 'left' or its right edge for 'right', with the flips
294
+ // position-try-fallbacks offers.
295
+ // The height is capped to the room on the chosen side, so a long menu
296
+ // scrolls there, as in the measured path.
297
+ this._reanchorFrame = 0;
298
+ /**
299
+ * At most once a frame while the menu is open and something outside it
300
+ * scrolls, an anchored menu chooses its side again and a measured one
301
+ * follows its trigger, keeping its own scroll position. A context menu
302
+ * stays where it opened, and the menu's own scrolling moves nothing.
303
+ */
304
+ this._reanchor = (event) => {
305
+ if (this._reanchorFrame || this.options.contextMenu || this.menuEl.contains(event.target)) return;
306
+ this._reanchorFrame = requestAnimationFrame(() => {
307
+ this._reanchorFrame = 0;
308
+ if (!this.isOpen) return;
309
+ if (this.menuEl.style.getPropertyValue("position-anchor")) return this._placeAnchored();
310
+ const { scrollTop } = this.menuEl;
311
+ this.recalculateDimensions();
312
+ this.menuEl.scrollTop = scrollTop;
313
+ });
314
+ };
257
315
  /**
258
316
  * Open menu.
259
317
  */
260
318
  this.open = () => {
261
- if (this.isOpen || this.el["Expressive_Menu"] !== this) return;
319
+ if (!this._canOpen) return;
262
320
  const transition = this._clearPendingTimers();
263
321
  this.isOpen = true;
264
- if (typeof this.options.onOpenStart === "function") {
265
- this.options.onOpenStart.call(this, this.el);
266
- }
267
- if (transition !== this._transition) return;
322
+ if (!this._notify("open", this.options.onOpenStart, { current: () => transition === this._transition })) return;
268
323
  this._resetMenuStyles();
269
- this.menuEl.style.display = "block";
324
+ if (this.menuEl.isConnected) this.menuEl.showPopover();
270
325
  this._restoreInert();
271
326
  this._placeMenu();
272
327
  this._schedule(() => this._setupTemporaryEventHandlers(), 0);
@@ -282,17 +337,16 @@ var _Menu = class _Menu extends Component {
282
337
  const root = this.menuEl.getRootNode();
283
338
  const focused = root.activeElement;
284
339
  this.isOpen = false;
340
+ this._openedByHover = false;
285
341
  this.menuEl.setAttribute("inert", "");
286
342
  clearTimeout(this.filterTimeout);
287
343
  this._resetFilterQuery();
288
344
  this.focusedIndex = -1;
345
+ this._clearActive();
289
346
  this._closeSubmenus();
290
- if (typeof this.options.onCloseStart === "function") {
291
- this.options.onCloseStart.call(this, this.el);
292
- }
293
- if (transition !== this._transition) return;
347
+ if (!this._notify("close", this.options.onCloseStart, { current: () => transition === this._transition })) return;
294
348
  this._animateOut();
295
- this._removeTemporaryEventHandlers();
349
+ this._openEvents?.abort();
296
350
  this._setExpanded(false);
297
351
  if (this.options.autoFocus && this.menuEl.contains(focused) && (root.activeElement === focused || this.el.ownerDocument.activeElement === this.el.ownerDocument.body)) {
298
352
  const back = this._contextReturn;
@@ -310,16 +364,9 @@ var _Menu = class _Menu extends Component {
310
364
  this._placeMenu();
311
365
  }
312
366
  };
313
- this.el["Expressive_Menu"] = this;
314
367
  _Menu._menus.push(this);
315
368
  this.id = Utils.getIdFromTrigger(el);
316
369
  this.menuEl = Utils.getElementById(el, this.id);
317
- this._originalInert = this.menuEl?.getAttribute("inert") ?? null;
318
- this.options = {
319
- ..._Menu.defaults,
320
- contextMenu: el.hasAttribute("data-context-menu"),
321
- ...options
322
- };
323
370
  this.isOpen = false;
324
371
  this.isScrollable = false;
325
372
  this.isTouchMoving = false;
@@ -331,6 +378,11 @@ var _Menu = class _Menu extends Component {
331
378
  if (this.id && !this.el.hasAttribute("aria-controls"))
332
379
  this.el.setAttribute("aria-controls", this.id);
333
380
  }
381
+ if (!this.menuEl) {
382
+ console.warn(`Menu skipped: no element matches target "${this.id}".`, el);
383
+ return;
384
+ }
385
+ this._originalInert = this.menuEl.getAttribute("inert");
334
386
  this._moveMenuToElement();
335
387
  this._setupAccessibility();
336
388
  this._makeMenuFocusable();
@@ -340,77 +392,96 @@ var _Menu = class _Menu extends Component {
340
392
  static get defaults() {
341
393
  return _defaults;
342
394
  }
343
- /**
344
- * Initializes instances of Menu.
345
- * @param els HTML elements.
346
- * @param options Component options.
347
- */
348
- static init(els, options = {}) {
349
- return super.init(els, options, _Menu);
350
- }
351
- static getInstance(el) {
352
- return el["Expressive_Menu"];
353
- }
354
395
  destroy() {
355
396
  this._clearPendingTimers();
356
397
  this.isOpen = false;
357
398
  this._setExpanded(false);
399
+ if (this.menuEl) Utils.setAnchorName(this.el, `--menu-${this.menuEl.id}`, false);
358
400
  clearTimeout(this.filterTimeout);
359
401
  this._resetMenuStyles();
360
402
  this._restoreInert();
361
- this._removeEventHandlers();
362
- this._removeTemporaryEventHandlers();
403
+ this._events.abort();
404
+ this._openEvents?.abort();
363
405
  const index = _Menu._menus.indexOf(this);
364
406
  if (index >= 0) _Menu._menus.splice(index, 1);
365
- this.el["Expressive_Menu"] = void 0;
407
+ super.destroy();
366
408
  }
367
409
  _setupEventHandlers() {
368
- this.el.addEventListener("keydown", this._handleTriggerKeydown);
369
- this.menuEl?.addEventListener("click", this._handleMenuClick);
410
+ const { signal } = this._events;
411
+ this.el.addEventListener("keydown", this._handleTriggerKeydown, { signal });
412
+ this.menuEl?.addEventListener("click", this._handleMenuClick, { signal });
370
413
  if (this.menuEl?.querySelector(":scope > li > menu")) {
371
- this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign);
372
- }
373
- if (this.options.contextMenu) {
374
- this.el.addEventListener("contextmenu", this._handleContextMenu);
375
- } else if (this.options.hover) {
376
- this.el.addEventListener("mouseenter", this._handleMouseEnter);
377
- this.el.addEventListener("mouseleave", this._handleMouseLeave);
378
- this.menuEl.addEventListener("mouseleave", this._handleMouseLeave);
379
- } else {
380
- this.el.addEventListener("click", this._handleClick);
414
+ this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign, { signal });
381
415
  }
382
- }
383
- _removeEventHandlers() {
384
- this.el.removeEventListener("keydown", this._handleTriggerKeydown);
385
- this.menuEl?.removeEventListener("click", this._handleMenuClick);
386
- this.menuEl?.removeEventListener("mouseover", this._handleSubmenuAlign);
387
416
  if (this.options.contextMenu) {
388
- this.el.removeEventListener("contextmenu", this._handleContextMenu);
417
+ this.el.addEventListener("contextmenu", this._handleContextMenu, { signal });
389
418
  } else if (this.options.hover) {
390
- this.el.removeEventListener("mouseenter", this._handleMouseEnter);
391
- this.el.removeEventListener("mouseleave", this._handleMouseLeave);
392
- this.menuEl?.removeEventListener("mouseleave", this._handleMouseLeave);
419
+ this.el.addEventListener("mouseenter", this._handleMouseEnter, { signal });
420
+ this.el.addEventListener("mouseleave", this._handleMouseLeave, { signal });
421
+ this.menuEl.addEventListener("mouseleave", this._handleMouseLeave, { signal });
393
422
  } else {
394
- this.el.removeEventListener("click", this._handleClick);
423
+ this.el.addEventListener("click", this._handleClick, { signal });
395
424
  }
396
425
  }
397
426
  _setupTemporaryEventHandlers() {
398
- document.body.addEventListener("click", this._handleDocumentClick);
399
- this.menuEl?.addEventListener("touchmove", this._handleDocumentTouchmove, { passive: true });
400
- document.body.addEventListener("touchmove", this._handleDocumentTouchmove, {
401
- passive: true
427
+ this._openEvents?.abort();
428
+ this._openEvents = controllerFor(this.el);
429
+ const { signal } = this._openEvents;
430
+ const passive = { passive: true, signal };
431
+ document.addEventListener("click", this._handleDocumentClick, { signal });
432
+ this.menuEl?.addEventListener("pointerdown", this._handleMenuPointerdown, passive);
433
+ this.menuEl?.addEventListener("touchmove", this._handleDocumentTouchmove, passive);
434
+ document.addEventListener("touchmove", this._handleDocumentTouchmove, passive);
435
+ this.menuEl?.addEventListener("keydown", this._handleMenuKeydown, { signal });
436
+ document.addEventListener("keydown", this._handleDocumentKeydown, { signal });
437
+ window.addEventListener("resize", this._handleWindowResize, { signal });
438
+ for (const target of [window, ...shadowRoots(this.el)]) {
439
+ target.addEventListener("scroll", this._reanchor, { capture: true, passive: true, signal });
440
+ }
441
+ if (this.options.contextMenu) document.addEventListener("contextmenu", this._handleDocumentContextMenu, { signal });
442
+ }
443
+ _activateItem(li) {
444
+ const checked = this._toggleChecked(li);
445
+ if (!this._notify("select", this.options.onItemClick, { args: [li], detail: { item: li } })) return;
446
+ if (checked !== null) this._notify("change", null, { detail: { item: li, checked } });
447
+ }
448
+ // A menuitemcheckbox flips aria-checked, and a menuitemradio checks itself
449
+ // and unchecks its group, before anyone hears of the click. Any other row,
450
+ // or a radio that was already checked, returns null.
451
+ _toggleChecked(li) {
452
+ const role = li.getAttribute("role");
453
+ if (role === "menuitemradio") return this._checkRadio(li);
454
+ if (role !== "menuitemcheckbox") return null;
455
+ const checked = li.getAttribute("aria-checked") !== "true";
456
+ li.setAttribute("aria-checked", String(checked));
457
+ return checked;
458
+ }
459
+ // A radio's group is its parent list: a <ul role="group">, or for radio
460
+ // rows outside any group, their menu.
461
+ _checkRadio(li) {
462
+ if (li.getAttribute("aria-checked") === "true") return null;
463
+ li.parentElement.querySelectorAll(':scope > li[role="menuitemradio"]').forEach((radio) => {
464
+ radio.setAttribute("aria-checked", String(radio === li));
402
465
  });
403
- this.menuEl?.addEventListener("keydown", this._handleMenuKeydown);
404
- window.addEventListener("resize", this._handleWindowResize);
405
- if (this.options.contextMenu) document.addEventListener("contextmenu", this._handleDocumentContextMenu);
406
- }
407
- _removeTemporaryEventHandlers() {
408
- document.body.removeEventListener("click", this._handleDocumentClick);
409
- this.menuEl?.removeEventListener("touchmove", this._handleDocumentTouchmove);
410
- document.body.removeEventListener("touchmove", this._handleDocumentTouchmove);
411
- this.menuEl?.removeEventListener("keydown", this._handleMenuKeydown);
412
- window.removeEventListener("resize", this._handleWindowResize);
413
- document.removeEventListener("contextmenu", this._handleDocumentContextMenu);
466
+ return true;
467
+ }
468
+ _isCheckboxRow(el) {
469
+ return el?.closest("li")?.getAttribute("role") === "menuitemcheckbox";
470
+ }
471
+ // isTouchMoving: a scroll on mobile is not a choice.
472
+ _closesOnClick(target) {
473
+ return this.options.closeOnClick && !this.isTouchMoving && !this._keepsOpen(target);
474
+ }
475
+ // Click and Space keep a checkbox menu open so several items can be
476
+ // toggled. Space keeps a radio menu open too; a click on a radio closes it.
477
+ _keepsOpen(target) {
478
+ const role = target.closest("li")?.getAttribute("role");
479
+ if (role === "menuitemcheckbox") return true;
480
+ return this._spaceActivation && role === "menuitemradio";
481
+ }
482
+ // Enter toggles a checkbox item and then closes, as it does on any item.
483
+ _closeAfterEnter(e, row) {
484
+ if (e.key === "Enter" && this.options.closeOnClick && this._isCheckboxRow(row)) this.close();
414
485
  }
415
486
  _setupAccessibility() {
416
487
  if (!this.menuEl) return;
@@ -419,7 +490,7 @@ var _Menu = class _Menu extends Component {
419
490
  menus.forEach((menu) => {
420
491
  if (!menu.hasAttribute("role")) menu.setAttribute("role", "menu");
421
492
  if (menu.getAttribute("role") !== "menu") return;
422
- menu.querySelectorAll(":scope > li").forEach((li) => {
493
+ menu.querySelectorAll(ROWS).forEach((li) => {
423
494
  if (li.classList.contains("divider")) {
424
495
  if (!li.hasAttribute("role")) li.setAttribute("role", "separator");
425
496
  return;
@@ -458,10 +529,7 @@ var _Menu = class _Menu extends Component {
458
529
  _toggleSubmenu(li) {
459
530
  const open = !li.classList.contains("open");
460
531
  li.parentElement?.querySelectorAll(":scope > li.open").forEach((other) => {
461
- if (other !== li) {
462
- other.classList.remove("open", "submenu-start");
463
- this._syncSubmenuAria(other, false);
464
- }
532
+ if (other !== li) this._closeSubmenu(other);
465
533
  });
466
534
  li.classList.toggle("open", open);
467
535
  if (open) this._alignSubmenu(li);
@@ -478,11 +546,12 @@ var _Menu = class _Menu extends Component {
478
546
  const rect = menu.getBoundingClientRect();
479
547
  if (rect.left < 8 || rect.right > window.innerWidth - 8) li.classList.add("submenu-start");
480
548
  }
549
+ _closeSubmenu(li) {
550
+ li.classList.remove("open", "submenu-start");
551
+ this._syncSubmenuAria(li, false);
552
+ }
481
553
  _closeSubmenus() {
482
- this.menuEl?.querySelectorAll("li.open").forEach((li) => {
483
- li.classList.remove("open", "submenu-start");
484
- this._syncSubmenuAria(li, false);
485
- });
554
+ this.menuEl?.querySelectorAll("li.open").forEach((li) => this._closeSubmenu(li));
486
555
  }
487
556
  _containingSubmenu(e) {
488
557
  const target = e.target;
@@ -499,17 +568,22 @@ var _Menu = class _Menu extends Component {
499
568
  return null;
500
569
  }
501
570
  _restoreInert() {
502
- if (this._originalInert === null) this.menuEl?.removeAttribute("inert");
503
- else this.menuEl?.setAttribute("inert", this._originalInert);
571
+ if (this.menuEl) restoreAttribute(this.menuEl, "inert", this._originalInert);
572
+ }
573
+ // focusedIndex is reset on close and only covers one list, so clearing by
574
+ // index left an old highlight behind after reopening or a typeahead jump.
575
+ _clearActive() {
576
+ this.menuEl?.querySelectorAll("li.active").forEach((li) => li.classList.remove("active"));
504
577
  }
505
578
  _focusRow(item) {
579
+ this._clearActive();
506
580
  this.focusedIndex = Array.from(item.parentElement.children).indexOf(item);
507
581
  item.focus({ preventScroll: true });
508
582
  item.scrollIntoView({ block: "nearest", inline: "nearest" });
509
583
  }
510
584
  _resetMenuStyles() {
511
585
  if (!this.menuEl) return;
512
- this.menuEl.style.display = "";
586
+ this.menuEl.hidePopover();
513
587
  this._resetMenuPositioningStyles();
514
588
  this.menuEl.style.transform = "";
515
589
  this.menuEl.style.opacity = "";
@@ -520,37 +594,53 @@ var _Menu = class _Menu extends Component {
520
594
  this.menuEl.style.left = "";
521
595
  this.menuEl.style.top = "";
522
596
  this.menuEl.style.transformOrigin = "";
597
+ for (const property of ANCHOR_STYLES) this.menuEl.style.removeProperty(property);
598
+ this._stopReanchoring();
523
599
  }
524
- _moveMenuToElement(containerEl = null) {
525
- if (this.options.container) {
526
- this.options.container.append(this.menuEl);
527
- return;
528
- }
529
- if (containerEl) {
530
- if (!containerEl.contains(this.menuEl)) containerEl.append(this.menuEl);
531
- return;
532
- }
533
- this.el.after(this.menuEl);
600
+ _moveMenuToElement() {
601
+ if (this.options.container) this.options.container.append(this.menuEl);
602
+ else this.el.after(this.menuEl);
534
603
  }
535
604
  _makeMenuFocusable() {
536
605
  if (!this.menuEl) return;
537
- this.menuEl.popover = "";
606
+ this.menuEl.popover = "manual";
538
607
  this.menuEl.tabIndex = -1;
539
- this.menuEl.querySelectorAll(":scope li, :scope > hr").forEach((el) => {
540
- if (el instanceof HTMLHRElement || el.classList.contains("divider") || el.classList.contains("gap") || el.classList.contains("label") || el.classList.contains("optgroup")) {
608
+ this.menuEl.querySelectorAll(":scope li").forEach((el) => {
609
+ if (el.matches('.divider, .gap, .label, .optgroup, [role="none"]')) {
541
610
  el.setAttribute("tabindex", "-1");
542
611
  return;
543
612
  }
544
613
  if (!el.getAttribute("tabindex")) el.setAttribute("tabindex", "0");
545
614
  });
546
615
  }
616
+ /**
617
+ * Moves focus for Up, Down, Home or End among the list's focusable rows,
618
+ * without wrapping, and says whether the key was one of those.
619
+ */
620
+ _moveFocus(list, e) {
621
+ const rows = this._rows(list);
622
+ const from = this._focusedRow(e) ?? list.children[this.focusedIndex];
623
+ const index = Utils._keyIndex(e.key, rows.indexOf(from), rows.length, STEPS);
624
+ if (Number.isNaN(index)) return false;
625
+ const row = rows[index];
626
+ if (row) {
627
+ this._focusRow(row);
628
+ row.classList.add("active");
629
+ }
630
+ return true;
631
+ }
632
+ /** The list's rows that take focus, in document order. */
633
+ _rows(list) {
634
+ return Array.from(list.querySelectorAll(ROWS)).filter(
635
+ (row) => row instanceof HTMLElement && row.tabIndex !== -1
636
+ );
637
+ }
547
638
  _focusInitialItem() {
548
639
  if (!this.menuEl || !this.options.autoFocus) return;
549
- const first = Array.from(this.menuEl.children).find(
550
- (child) => child instanceof HTMLElement && child.tabIndex !== -1
551
- );
640
+ const first = this._rows(this.menuEl)[0];
552
641
  if (!first) return;
553
- this.focusedIndex = Array.from(this.menuEl.children).indexOf(first);
642
+ this._clearActive();
643
+ this.focusedIndex = Array.from(first.parentElement.children).indexOf(first);
554
644
  first.focus({ preventScroll: true });
555
645
  }
556
646
  _focusFocusedItem() {
@@ -565,31 +655,27 @@ var _Menu = class _Menu extends Component {
565
655
  });
566
656
  }
567
657
  }
568
- _getMenuPosition(closestOverflowParent) {
658
+ /**
659
+ * Whether a measured menu opens upward: when there is no room below, or
660
+ * when placement 'top' asks for it and there is room above.
661
+ */
662
+ _opensUp(space) {
663
+ return space.top < 0 || this.options.placement === "top" && space.bottom >= 0;
664
+ }
665
+ _getMenuPosition() {
569
666
  const triggerBRect = this.el.getBoundingClientRect();
570
667
  const menuBRect = this.menuEl.getBoundingClientRect();
571
668
  let idealHeight = menuBRect.height;
572
669
  let idealWidth = menuBRect.width;
573
670
  let idealXPos = triggerBRect.left - menuBRect.left;
574
671
  let idealYPos = triggerBRect.top - menuBRect.top;
575
- const menuBounds = {
576
- left: idealXPos,
577
- top: idealYPos,
578
- height: idealHeight,
579
- width: idealWidth
580
- };
581
- const alignments = Utils.checkPossibleAlignments(
582
- this.el,
583
- closestOverflowParent,
584
- menuBounds,
585
- this.options.coverTrigger ? 0 : triggerBRect.height
586
- );
672
+ const space = room(this.el, menuBRect, this.options.coverTrigger ? 0 : triggerBRect.height);
587
673
  let verticalAlignment = "top";
588
674
  let horizontalAlignment = this.options.alignment;
589
675
  idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;
590
676
  this.isScrollable = false;
591
- if (!alignments.top) {
592
- if (alignments.bottom) {
677
+ if (this._opensUp(space)) {
678
+ if (space.bottom >= 0) {
593
679
  verticalAlignment = "bottom";
594
680
  if (!this.options.coverTrigger) {
595
681
  idealYPos -= triggerBRect.height;
@@ -597,27 +683,27 @@ var _Menu = class _Menu extends Component {
597
683
  } else {
598
684
  this.isScrollable = true;
599
685
  idealHeight -= 20;
600
- if (alignments.spaceOnTop > alignments.spaceOnBottom) {
686
+ if (space.bottom > space.top) {
601
687
  verticalAlignment = "bottom";
602
- idealHeight += alignments.spaceOnTop;
603
- idealYPos -= this.options.coverTrigger ? alignments.spaceOnTop - 20 : alignments.spaceOnTop - 20 + triggerBRect.height;
688
+ idealHeight += space.bottom;
689
+ idealYPos -= this.options.coverTrigger ? space.bottom - 20 : space.bottom - 20 + triggerBRect.height;
604
690
  } else {
605
- idealHeight += alignments.spaceOnBottom;
691
+ idealHeight += space.top;
606
692
  }
607
693
  }
608
694
  }
609
- if (!alignments[horizontalAlignment]) {
695
+ if (space[horizontalAlignment] < 0) {
610
696
  const oppositeAlignment = horizontalAlignment === "left" ? "right" : "left";
611
- if (alignments[oppositeAlignment]) {
697
+ if (space[oppositeAlignment] >= 0) {
612
698
  horizontalAlignment = oppositeAlignment;
613
699
  } else {
614
- if (alignments.spaceOnLeft > alignments.spaceOnRight) {
700
+ if (space.right > space.left) {
615
701
  horizontalAlignment = "right";
616
- idealWidth += alignments.spaceOnLeft;
617
- idealXPos -= alignments.spaceOnLeft;
702
+ idealWidth += space.right;
703
+ idealXPos -= space.right;
618
704
  } else {
619
705
  horizontalAlignment = "left";
620
- idealWidth += alignments.spaceOnRight;
706
+ idealWidth += space.left;
621
707
  }
622
708
  }
623
709
  }
@@ -650,6 +736,7 @@ var _Menu = class _Menu extends Component {
650
736
  }
651
737
  _animateIn() {
652
738
  const transition = this._transition;
739
+ const focusOnOpen = !this._openedByHover;
653
740
  const duration = this.options.inDuration;
654
741
  this.menuEl.style.transition = "none";
655
742
  this.menuEl.style.opacity = "0";
@@ -660,54 +747,71 @@ var _Menu = class _Menu extends Component {
660
747
  this.menuEl.style.transform = "scale(1)";
661
748
  }, 1);
662
749
  this._schedule(() => {
663
- this._focusInitialItem();
750
+ if (focusOnOpen) this._focusInitialItem();
664
751
  if (transition !== this._transition) return;
665
- if (typeof this.options.onOpenEnd === "function") this.options.onOpenEnd.call(this, this.el);
752
+ this._notify("opened", this.options.onOpenEnd, { current: () => transition === this._transition });
666
753
  }, duration);
667
754
  }
668
755
  _animateOut() {
756
+ const transition = this._transition;
669
757
  const duration = this.options.outDuration;
670
758
  this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;
671
759
  this.menuEl.style.opacity = "0";
672
760
  this.menuEl.style.transform = "scale(0.85)";
673
761
  this._schedule(() => {
674
762
  this._resetMenuStyles();
675
- if (typeof this.options.onCloseEnd === "function")
676
- this.options.onCloseEnd.call(this, this.el);
763
+ this._notify("closed", this.options.onCloseEnd, { current: () => transition === this._transition });
677
764
  }, duration);
678
765
  }
679
- _getClosestAncestor(el, condition) {
680
- let ancestor = el.parentNode;
681
- while (ancestor !== null && ancestor !== void 0 && ancestor !== document) {
682
- if (ancestor.nodeType === Node.ELEMENT_NODE && condition(ancestor)) {
683
- return ancestor;
684
- }
685
- ancestor = ancestor.parentNode ?? ancestor.host;
686
- }
687
- return null;
688
- }
689
766
  _placeMenu() {
690
- let closestOverflowParent = this._getClosestAncestor(
691
- this.menuEl,
692
- (ancestor) => {
693
- return !["HTML", "BODY"].includes(ancestor.tagName) && getComputedStyle(ancestor).overflow !== "visible";
694
- }
695
- );
696
- if (!closestOverflowParent) {
697
- const parent = !!this.menuEl.offsetParent ? this.menuEl.offsetParent : this.menuEl.parentNode;
698
- closestOverflowParent = parent.host ?? parent;
699
- }
700
- if (getComputedStyle(closestOverflowParent).position === "static")
701
- closestOverflowParent.style.position = "relative";
702
767
  const natural = this.menuEl.getBoundingClientRect().width;
703
768
  const triggerWidth = this.el.getBoundingClientRect().width;
704
769
  const idealWidth = this.options.constrainWidth && !this.options.contextMenu && triggerWidth >= MIN_SURFACE_WIDTH ? triggerWidth : Math.min(MAX_SURFACE_WIDTH, Math.max(MIN_SURFACE_WIDTH, natural));
705
770
  this.menuEl.style.width = idealWidth + "px";
706
771
  if (this.options.contextMenu) {
707
- this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner(), closestOverflowParent);
772
+ this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner());
708
773
  return;
709
774
  }
710
- const positionInfo = this._getMenuPosition(closestOverflowParent);
775
+ if (anchorSupported && !this.options.coverTrigger && !transformed(this.el)) this._anchorMenu();
776
+ else this._placeByCoordinates();
777
+ }
778
+ /**
779
+ * The side an anchored menu opens on: the one asked for when the whole
780
+ * menu fits there, or else the roomier one. The anchored height is capped
781
+ * to its side, so a menu that would only shrink never sets off the
782
+ * flip-block fallback, and the choice is made here.
783
+ */
784
+ _side() {
785
+ const rect = this.el.getBoundingClientRect();
786
+ const room2 = { top: rect.top, bottom: window.innerHeight - rect.bottom };
787
+ const [asked, other] = this.options.placement === "top" ? ["top", "bottom"] : ["bottom", "top"];
788
+ return room2[asked] >= this.menuEl.scrollHeight || room2[asked] >= room2[other] ? asked : other;
789
+ }
790
+ _anchorMenu() {
791
+ const name = `--menu-${this.menuEl.id}`;
792
+ Utils.setAnchorName(this.el, name, true);
793
+ const style = this.menuEl.style;
794
+ style.position = "fixed";
795
+ style.inset = "auto";
796
+ style.maxHeight = "100%";
797
+ style.setProperty("position-anchor", name);
798
+ this._placeAnchored();
799
+ }
800
+ _stopReanchoring() {
801
+ cancelAnimationFrame(this._reanchorFrame);
802
+ this._reanchorFrame = 0;
803
+ }
804
+ /** The anchored menu's side, the edge it starts from and its growth origin. */
805
+ _placeAnchored() {
806
+ const style = this.menuEl.style;
807
+ const [side, edge] = [this._side(), this.options.alignment === "right" ? "left" : "right"];
808
+ style.setProperty("position-area", `${side} span-${edge}`);
809
+ style.setProperty("position-try-fallbacks", "flip-block, flip-inline, flip-block flip-inline");
810
+ style.transformOrigin = `${edge === "left" ? "100%" : "0"} ${side === "top" ? "100%" : "0"}`;
811
+ this.isScrollable = this.menuEl.scrollHeight > this.menuEl.clientHeight;
812
+ }
813
+ _placeByCoordinates() {
814
+ const positionInfo = this._getMenuPosition();
711
815
  this.menuEl.style.left = positionInfo.x + "px";
712
816
  this.menuEl.style.top = positionInfo.y + "px";
713
817
  this.menuEl.style.height = positionInfo.height + "px";
@@ -723,30 +827,20 @@ var _Menu = class _Menu extends Component {
723
827
  /**
724
828
  * Places a context menu with its start corner on the point, flipping to
725
829
  * the other side of the point where it would not fit. The bounds are the
726
- * viewport, narrowed to a scrolling or clipping ancestor the menu sits in;
727
- * a menu taller than them gets their height and scrolls.
830
+ * viewport; a menu taller than it gets its height and scrolls.
728
831
  *
729
832
  * The menu rests at left/top 0 of its containing block, so its rect is the
730
833
  * offset to subtract - the same trick _getMenuPosition uses. It is measured
731
834
  * without the entry animation's scale, which a second right-click can catch.
732
835
  */
733
- _placeMenuAtPoint({ x, y }, container) {
836
+ _placeMenuAtPoint({ x, y }) {
734
837
  const { transform, transition } = this.menuEl.style;
735
838
  this.menuEl.style.transition = "none";
736
839
  this.menuEl.style.transform = "none";
737
840
  const menu = this.menuEl.getBoundingClientRect();
738
841
  this.menuEl.style.transform = transform;
739
842
  this.menuEl.style.transition = transition;
740
- let bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
741
- if (container && getComputedStyle(container).overflow !== "visible") {
742
- const clip = container.getBoundingClientRect();
743
- bounds = {
744
- left: Math.max(bounds.left, clip.left),
745
- top: Math.max(bounds.top, clip.top),
746
- right: Math.min(bounds.right, clip.right),
747
- bottom: Math.min(bounds.bottom, clip.bottom)
748
- };
749
- }
843
+ const bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
750
844
  const width = menu.width;
751
845
  const height = Math.min(menu.height, bounds.bottom - bounds.top);
752
846
  this.isScrollable = height < menu.height;
@@ -766,11 +860,16 @@ var _Menu = class _Menu extends Component {
766
860
  _setExpanded(expanded) {
767
861
  if (!this.options.contextMenu) this.el.ariaExpanded = String(expanded);
768
862
  }
863
+ // A trigger whose target never resolved has no menu to open.
864
+ get _canOpen() {
865
+ return !this.isOpen && !!this.menuEl && this.el["Expressive_Menu"] === this;
866
+ }
769
867
  };
770
868
  _Menu._menus = [];
869
+ _Menu.key = "Expressive_Menu";
771
870
  var Menu = _Menu;
772
871
 
773
872
  export {
774
873
  Menu
775
874
  };
776
- //# sourceMappingURL=chunk-JIDMQGK6.mjs.map
875
+ //# sourceMappingURL=chunk-CSYWKEK3.mjs.map