@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
@@ -1,11 +1,41 @@
1
- import {
2
- Utils
3
- } from "./chunk-M372EDXD.mjs";
4
1
  import {
5
2
  Component
6
- } from "./chunk-PD6HYHAE.mjs";
3
+ } from "./chunk-CMGXGYUC.mjs";
4
+ import {
5
+ Utils,
6
+ 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) => {
@@ -90,24 +128,51 @@ var _Menu = class _Menu extends Component {
90
128
  const path = e.composedPath();
91
129
  const menuTarget = this._menuClickTargets.get(e);
92
130
  this._menuClickTargets.delete(e);
131
+ if (!menuTarget && !this.options.contextMenu && path.includes(this.el)) {
132
+ this.isTouchMoving = false;
133
+ return;
134
+ }
93
135
  const target = menuTarget ?? (path[0] || e.target);
94
136
  const inside = !!menuTarget || path.includes(this.menuEl) || this.menuEl?.contains(target);
95
137
  if (this._isSubmenuTriggerClick(target)) return;
96
- if (this.options.closeOnClick && inside && !this.isTouchMoving) {
138
+ if (inside && this._closesOnClick(target)) {
97
139
  this.close();
98
140
  } else if (!inside) {
99
141
  this._schedule(() => this.close(), 0);
100
142
  }
101
143
  this.isTouchMoving = false;
102
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
+ };
103
153
  this._handleTriggerKeydown = (e) => {
104
154
  if (this.options.contextMenu) return;
105
- const opensMenu = e.key === SPACE || e.key === Utils.keys.ENTER || e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;
106
- 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) {
107
163
  e.preventDefault();
108
164
  this.open();
165
+ } else if (this._openedByHover) {
166
+ e.preventDefault();
167
+ this._openedByHover = false;
168
+ this._focusInitialItem();
109
169
  }
110
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
+ };
111
176
  this._handleDocumentTouchmove = (e) => {
112
177
  const target = e.target;
113
178
  if (e.composedPath().includes(this.menuEl) || this.menuEl?.contains(target)) {
@@ -129,9 +194,7 @@ var _Menu = class _Menu extends Component {
129
194
  this._toggleSubmenu(li);
130
195
  return;
131
196
  }
132
- if (li && typeof this.options.onItemClick === "function") {
133
- this.options.onItemClick.call(this, li);
134
- }
197
+ if (li) this._activateItem(li);
135
198
  };
136
199
  this._handleSubmenuAlign = (e) => {
137
200
  const target = e.target;
@@ -142,17 +205,16 @@ var _Menu = class _Menu extends Component {
142
205
  }
143
206
  };
144
207
  this._handleMenuKeydown = (e) => {
145
- if (!this.isOpen || e.ctrlKey || e.metaKey || e.altKey || e.isComposing) return;
208
+ if (!this.isOpen || !Utils.plainKey(e) || Utils.isComposing(e)) return;
146
209
  const list = this._containingSubmenu(e) ?? this.menuEl;
147
210
  const rtl = getComputedStyle(list).direction === "rtl";
148
- const openKey = rtl ? Utils.keys.ARROW_LEFT : Utils.keys.ARROW_RIGHT;
149
- const backKey = rtl ? Utils.keys.ARROW_RIGHT : Utils.keys.ARROW_LEFT;
150
- 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)) {
151
214
  clearTimeout(this.filterTimeout);
152
215
  this._resetFilterQuery();
153
216
  }
154
- const arrowUpOrDown = e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;
155
- if (e.key === Utils.keys.TAB) {
217
+ if (e.key === "Tab") {
156
218
  e.preventDefault();
157
219
  this.close();
158
220
  } else if (e.key === openKey) {
@@ -175,26 +237,9 @@ var _Menu = class _Menu extends Component {
175
237
  this._closeSubmenu(parentLi);
176
238
  this._focusRow(parentLi);
177
239
  }
178
- } else if (arrowUpOrDown) {
240
+ } else if (this._moveFocus(list, e)) {
179
241
  e.preventDefault();
180
- const direction = e.key === Utils.keys.ARROW_DOWN ? 1 : -1;
181
- const row = this._focusedRow(e);
182
- let newFocusedIndex = row ? Array.from(list.children).indexOf(row) : this.focusedIndex;
183
- let hasFoundNewIndex = false;
184
- do {
185
- newFocusedIndex = newFocusedIndex + direction;
186
- if (!!list.children[newFocusedIndex] && list.children[newFocusedIndex].tabIndex !== -1) {
187
- hasFoundNewIndex = true;
188
- break;
189
- }
190
- } while (newFocusedIndex < list.children.length && newFocusedIndex >= 0);
191
- if (hasFoundNewIndex) {
192
- if (this.focusedIndex >= 0) list.children[this.focusedIndex]?.classList.remove("active");
193
- const item = list.children[newFocusedIndex];
194
- item.classList.add("active");
195
- this._focusRow(item);
196
- }
197
- } else if (e.key === Utils.keys.ENTER || e.key === SPACE) {
242
+ } else if (e.key === "Enter" || e.key === SPACE) {
198
243
  const li = this._focusedRow(e);
199
244
  e.preventDefault();
200
245
  if (li?.matches('.disabled, [aria-disabled="true"]')) return;
@@ -204,12 +249,15 @@ var _Menu = class _Menu extends Component {
204
249
  }
205
250
  const focusedElement = li ?? this.menuEl.children[this.focusedIndex];
206
251
  const activatableElement = focusedElement?.querySelector(":scope > a, :scope > button");
252
+ this._spaceActivation = e.key === SPACE;
207
253
  if (!!activatableElement) {
208
254
  activatableElement.click();
209
255
  } else if (focusedElement instanceof HTMLElement) {
210
256
  focusedElement.click();
211
257
  }
212
- } else if (e.key === Utils.keys.ESC) {
258
+ this._spaceActivation = false;
259
+ this._closeAfterEnter(e, focusedElement);
260
+ } else if (e.key === "Escape") {
213
261
  e.preventDefault();
214
262
  const openSub = this._containingSubmenu(e)?.parentElement ?? Array.from(this.menuEl.querySelectorAll("li.open")).reverse()[0];
215
263
  if (openSub) {
@@ -223,8 +271,8 @@ var _Menu = class _Menu extends Component {
223
271
  if (e.key.length === 1 && e.key !== SPACE) {
224
272
  this.filterQuery.push(keyText);
225
273
  const string = this.filterQuery.join("");
226
- const newOptionEl = Array.from(list.querySelectorAll(":scope > li")).find(
227
- (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)
228
276
  );
229
277
  if (newOptionEl) {
230
278
  this._focusRow(newOptionEl);
@@ -241,19 +289,39 @@ var _Menu = class _Menu extends Component {
241
289
  this._resetFilterQuery = () => {
242
290
  this.filterQuery = [];
243
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
+ };
244
315
  /**
245
316
  * Open menu.
246
317
  */
247
318
  this.open = () => {
248
- if (this.isOpen || this.el["Expressive_Menu"] !== this) return;
319
+ if (!this._canOpen) return;
249
320
  const transition = this._clearPendingTimers();
250
321
  this.isOpen = true;
251
- if (typeof this.options.onOpenStart === "function") {
252
- this.options.onOpenStart.call(this, this.el);
253
- }
254
- if (transition !== this._transition) return;
322
+ if (!this._notify("open", this.options.onOpenStart, { current: () => transition === this._transition })) return;
255
323
  this._resetMenuStyles();
256
- this.menuEl.style.display = "block";
324
+ if (this.menuEl.isConnected) this.menuEl.showPopover();
257
325
  this._restoreInert();
258
326
  this._placeMenu();
259
327
  this._schedule(() => this._setupTemporaryEventHandlers(), 0);
@@ -269,17 +337,16 @@ var _Menu = class _Menu extends Component {
269
337
  const root = this.menuEl.getRootNode();
270
338
  const focused = root.activeElement;
271
339
  this.isOpen = false;
340
+ this._openedByHover = false;
272
341
  this.menuEl.setAttribute("inert", "");
273
342
  clearTimeout(this.filterTimeout);
274
343
  this._resetFilterQuery();
275
344
  this.focusedIndex = -1;
345
+ this._clearActive();
276
346
  this._closeSubmenus();
277
- if (typeof this.options.onCloseStart === "function") {
278
- this.options.onCloseStart.call(this, this.el);
279
- }
280
- if (transition !== this._transition) return;
347
+ if (!this._notify("close", this.options.onCloseStart, { current: () => transition === this._transition })) return;
281
348
  this._animateOut();
282
- this._removeTemporaryEventHandlers();
349
+ this._openEvents?.abort();
283
350
  this._setExpanded(false);
284
351
  if (this.options.autoFocus && this.menuEl.contains(focused) && (root.activeElement === focused || this.el.ownerDocument.activeElement === this.el.ownerDocument.body)) {
285
352
  const back = this._contextReturn;
@@ -297,16 +364,9 @@ var _Menu = class _Menu extends Component {
297
364
  this._placeMenu();
298
365
  }
299
366
  };
300
- this.el["Expressive_Menu"] = this;
301
367
  _Menu._menus.push(this);
302
368
  this.id = Utils.getIdFromTrigger(el);
303
369
  this.menuEl = Utils.getElementById(el, this.id);
304
- this._originalInert = this.menuEl?.getAttribute("inert") ?? null;
305
- this.options = {
306
- ..._Menu.defaults,
307
- contextMenu: el.hasAttribute("data-context-menu"),
308
- ...options
309
- };
310
370
  this.isOpen = false;
311
371
  this.isScrollable = false;
312
372
  this.isTouchMoving = false;
@@ -318,6 +378,11 @@ var _Menu = class _Menu extends Component {
318
378
  if (this.id && !this.el.hasAttribute("aria-controls"))
319
379
  this.el.setAttribute("aria-controls", this.id);
320
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");
321
386
  this._moveMenuToElement();
322
387
  this._setupAccessibility();
323
388
  this._makeMenuFocusable();
@@ -327,77 +392,96 @@ var _Menu = class _Menu extends Component {
327
392
  static get defaults() {
328
393
  return _defaults;
329
394
  }
330
- /**
331
- * Initializes instances of Menu.
332
- * @param els HTML elements.
333
- * @param options Component options.
334
- */
335
- static init(els, options = {}) {
336
- return super.init(els, options, _Menu);
337
- }
338
- static getInstance(el) {
339
- return el["Expressive_Menu"];
340
- }
341
395
  destroy() {
342
396
  this._clearPendingTimers();
343
397
  this.isOpen = false;
344
398
  this._setExpanded(false);
399
+ if (this.menuEl) Utils.setAnchorName(this.el, `--menu-${this.menuEl.id}`, false);
345
400
  clearTimeout(this.filterTimeout);
346
401
  this._resetMenuStyles();
347
402
  this._restoreInert();
348
- this._removeEventHandlers();
349
- this._removeTemporaryEventHandlers();
403
+ this._events.abort();
404
+ this._openEvents?.abort();
350
405
  const index = _Menu._menus.indexOf(this);
351
406
  if (index >= 0) _Menu._menus.splice(index, 1);
352
- this.el["Expressive_Menu"] = void 0;
407
+ super.destroy();
353
408
  }
354
409
  _setupEventHandlers() {
355
- this.el.addEventListener("keydown", this._handleTriggerKeydown);
356
- 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 });
357
413
  if (this.menuEl?.querySelector(":scope > li > menu")) {
358
- this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign);
414
+ this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign, { signal });
359
415
  }
360
416
  if (this.options.contextMenu) {
361
- this.el.addEventListener("contextmenu", this._handleContextMenu);
417
+ this.el.addEventListener("contextmenu", this._handleContextMenu, { signal });
362
418
  } else if (this.options.hover) {
363
- this.el.addEventListener("mouseenter", this._handleMouseEnter);
364
- this.el.addEventListener("mouseleave", this._handleMouseLeave);
365
- this.menuEl.addEventListener("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 });
366
422
  } else {
367
- this.el.addEventListener("click", this._handleClick);
368
- }
369
- }
370
- _removeEventHandlers() {
371
- this.el.removeEventListener("keydown", this._handleTriggerKeydown);
372
- this.menuEl?.removeEventListener("click", this._handleMenuClick);
373
- this.menuEl?.removeEventListener("mouseover", this._handleSubmenuAlign);
374
- if (this.options.contextMenu) {
375
- this.el.removeEventListener("contextmenu", this._handleContextMenu);
376
- } else if (this.options.hover) {
377
- this.el.removeEventListener("mouseenter", this._handleMouseEnter);
378
- this.el.removeEventListener("mouseleave", this._handleMouseLeave);
379
- this.menuEl?.removeEventListener("mouseleave", this._handleMouseLeave);
380
- } else {
381
- this.el.removeEventListener("click", this._handleClick);
423
+ this.el.addEventListener("click", this._handleClick, { signal });
382
424
  }
383
425
  }
384
426
  _setupTemporaryEventHandlers() {
385
- document.body.addEventListener("click", this._handleDocumentClick);
386
- this.menuEl?.addEventListener("touchmove", this._handleDocumentTouchmove, { passive: true });
387
- document.body.addEventListener("touchmove", this._handleDocumentTouchmove, {
388
- 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));
389
465
  });
390
- this.menuEl?.addEventListener("keydown", this._handleMenuKeydown);
391
- window.addEventListener("resize", this._handleWindowResize);
392
- if (this.options.contextMenu) document.addEventListener("contextmenu", this._handleDocumentContextMenu);
393
- }
394
- _removeTemporaryEventHandlers() {
395
- document.body.removeEventListener("click", this._handleDocumentClick);
396
- this.menuEl?.removeEventListener("touchmove", this._handleDocumentTouchmove);
397
- document.body.removeEventListener("touchmove", this._handleDocumentTouchmove);
398
- this.menuEl?.removeEventListener("keydown", this._handleMenuKeydown);
399
- window.removeEventListener("resize", this._handleWindowResize);
400
- 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();
401
485
  }
402
486
  _setupAccessibility() {
403
487
  if (!this.menuEl) return;
@@ -406,7 +490,7 @@ var _Menu = class _Menu extends Component {
406
490
  menus.forEach((menu) => {
407
491
  if (!menu.hasAttribute("role")) menu.setAttribute("role", "menu");
408
492
  if (menu.getAttribute("role") !== "menu") return;
409
- menu.querySelectorAll(":scope > li").forEach((li) => {
493
+ menu.querySelectorAll(ROWS).forEach((li) => {
410
494
  if (li.classList.contains("divider")) {
411
495
  if (!li.hasAttribute("role")) li.setAttribute("role", "separator");
412
496
  return;
@@ -484,17 +568,22 @@ var _Menu = class _Menu extends Component {
484
568
  return null;
485
569
  }
486
570
  _restoreInert() {
487
- if (this._originalInert === null) this.menuEl?.removeAttribute("inert");
488
- 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"));
489
577
  }
490
578
  _focusRow(item) {
579
+ this._clearActive();
491
580
  this.focusedIndex = Array.from(item.parentElement.children).indexOf(item);
492
581
  item.focus({ preventScroll: true });
493
582
  item.scrollIntoView({ block: "nearest", inline: "nearest" });
494
583
  }
495
584
  _resetMenuStyles() {
496
585
  if (!this.menuEl) return;
497
- this.menuEl.style.display = "";
586
+ this.menuEl.hidePopover();
498
587
  this._resetMenuPositioningStyles();
499
588
  this.menuEl.style.transform = "";
500
589
  this.menuEl.style.opacity = "";
@@ -505,37 +594,53 @@ var _Menu = class _Menu extends Component {
505
594
  this.menuEl.style.left = "";
506
595
  this.menuEl.style.top = "";
507
596
  this.menuEl.style.transformOrigin = "";
597
+ for (const property of ANCHOR_STYLES) this.menuEl.style.removeProperty(property);
598
+ this._stopReanchoring();
508
599
  }
509
- _moveMenuToElement(containerEl = null) {
510
- if (this.options.container) {
511
- this.options.container.append(this.menuEl);
512
- return;
513
- }
514
- if (containerEl) {
515
- if (!containerEl.contains(this.menuEl)) containerEl.append(this.menuEl);
516
- return;
517
- }
518
- 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);
519
603
  }
520
604
  _makeMenuFocusable() {
521
605
  if (!this.menuEl) return;
522
- this.menuEl.popover = "";
606
+ this.menuEl.popover = "manual";
523
607
  this.menuEl.tabIndex = -1;
524
- this.menuEl.querySelectorAll(":scope li, :scope > hr").forEach((el) => {
525
- 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"]')) {
526
610
  el.setAttribute("tabindex", "-1");
527
611
  return;
528
612
  }
529
613
  if (!el.getAttribute("tabindex")) el.setAttribute("tabindex", "0");
530
614
  });
531
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
+ }
532
638
  _focusInitialItem() {
533
639
  if (!this.menuEl || !this.options.autoFocus) return;
534
- const first = Array.from(this.menuEl.children).find(
535
- (child) => child instanceof HTMLElement && child.tabIndex !== -1
536
- );
640
+ const first = this._rows(this.menuEl)[0];
537
641
  if (!first) return;
538
- this.focusedIndex = Array.from(this.menuEl.children).indexOf(first);
642
+ this._clearActive();
643
+ this.focusedIndex = Array.from(first.parentElement.children).indexOf(first);
539
644
  first.focus({ preventScroll: true });
540
645
  }
541
646
  _focusFocusedItem() {
@@ -550,31 +655,27 @@ var _Menu = class _Menu extends Component {
550
655
  });
551
656
  }
552
657
  }
553
- _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() {
554
666
  const triggerBRect = this.el.getBoundingClientRect();
555
667
  const menuBRect = this.menuEl.getBoundingClientRect();
556
668
  let idealHeight = menuBRect.height;
557
669
  let idealWidth = menuBRect.width;
558
670
  let idealXPos = triggerBRect.left - menuBRect.left;
559
671
  let idealYPos = triggerBRect.top - menuBRect.top;
560
- const menuBounds = {
561
- left: idealXPos,
562
- top: idealYPos,
563
- height: idealHeight,
564
- width: idealWidth
565
- };
566
- const alignments = Utils.checkPossibleAlignments(
567
- this.el,
568
- closestOverflowParent,
569
- menuBounds,
570
- this.options.coverTrigger ? 0 : triggerBRect.height
571
- );
672
+ const space = room(this.el, menuBRect, this.options.coverTrigger ? 0 : triggerBRect.height);
572
673
  let verticalAlignment = "top";
573
674
  let horizontalAlignment = this.options.alignment;
574
675
  idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;
575
676
  this.isScrollable = false;
576
- if (!alignments.top) {
577
- if (alignments.bottom) {
677
+ if (this._opensUp(space)) {
678
+ if (space.bottom >= 0) {
578
679
  verticalAlignment = "bottom";
579
680
  if (!this.options.coverTrigger) {
580
681
  idealYPos -= triggerBRect.height;
@@ -582,27 +683,27 @@ var _Menu = class _Menu extends Component {
582
683
  } else {
583
684
  this.isScrollable = true;
584
685
  idealHeight -= 20;
585
- if (alignments.spaceOnTop > alignments.spaceOnBottom) {
686
+ if (space.bottom > space.top) {
586
687
  verticalAlignment = "bottom";
587
- idealHeight += alignments.spaceOnTop;
588
- 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;
589
690
  } else {
590
- idealHeight += alignments.spaceOnBottom;
691
+ idealHeight += space.top;
591
692
  }
592
693
  }
593
694
  }
594
- if (!alignments[horizontalAlignment]) {
695
+ if (space[horizontalAlignment] < 0) {
595
696
  const oppositeAlignment = horizontalAlignment === "left" ? "right" : "left";
596
- if (alignments[oppositeAlignment]) {
697
+ if (space[oppositeAlignment] >= 0) {
597
698
  horizontalAlignment = oppositeAlignment;
598
699
  } else {
599
- if (alignments.spaceOnLeft > alignments.spaceOnRight) {
700
+ if (space.right > space.left) {
600
701
  horizontalAlignment = "right";
601
- idealWidth += alignments.spaceOnLeft;
602
- idealXPos -= alignments.spaceOnLeft;
702
+ idealWidth += space.right;
703
+ idealXPos -= space.right;
603
704
  } else {
604
705
  horizontalAlignment = "left";
605
- idealWidth += alignments.spaceOnRight;
706
+ idealWidth += space.left;
606
707
  }
607
708
  }
608
709
  }
@@ -635,6 +736,7 @@ var _Menu = class _Menu extends Component {
635
736
  }
636
737
  _animateIn() {
637
738
  const transition = this._transition;
739
+ const focusOnOpen = !this._openedByHover;
638
740
  const duration = this.options.inDuration;
639
741
  this.menuEl.style.transition = "none";
640
742
  this.menuEl.style.opacity = "0";
@@ -645,54 +747,71 @@ var _Menu = class _Menu extends Component {
645
747
  this.menuEl.style.transform = "scale(1)";
646
748
  }, 1);
647
749
  this._schedule(() => {
648
- this._focusInitialItem();
750
+ if (focusOnOpen) this._focusInitialItem();
649
751
  if (transition !== this._transition) return;
650
- if (typeof this.options.onOpenEnd === "function") this.options.onOpenEnd.call(this, this.el);
752
+ this._notify("opened", this.options.onOpenEnd, { current: () => transition === this._transition });
651
753
  }, duration);
652
754
  }
653
755
  _animateOut() {
756
+ const transition = this._transition;
654
757
  const duration = this.options.outDuration;
655
758
  this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;
656
759
  this.menuEl.style.opacity = "0";
657
760
  this.menuEl.style.transform = "scale(0.85)";
658
761
  this._schedule(() => {
659
762
  this._resetMenuStyles();
660
- if (typeof this.options.onCloseEnd === "function")
661
- this.options.onCloseEnd.call(this, this.el);
763
+ this._notify("closed", this.options.onCloseEnd, { current: () => transition === this._transition });
662
764
  }, duration);
663
765
  }
664
- _getClosestAncestor(el, condition) {
665
- let ancestor = el.parentNode;
666
- while (ancestor !== null && ancestor !== void 0 && ancestor !== document) {
667
- if (ancestor.nodeType === Node.ELEMENT_NODE && condition(ancestor)) {
668
- return ancestor;
669
- }
670
- ancestor = ancestor.parentNode ?? ancestor.host;
671
- }
672
- return null;
673
- }
674
766
  _placeMenu() {
675
- let closestOverflowParent = this._getClosestAncestor(
676
- this.menuEl,
677
- (ancestor) => {
678
- return !["HTML", "BODY"].includes(ancestor.tagName) && getComputedStyle(ancestor).overflow !== "visible";
679
- }
680
- );
681
- if (!closestOverflowParent) {
682
- const parent = !!this.menuEl.offsetParent ? this.menuEl.offsetParent : this.menuEl.parentNode;
683
- closestOverflowParent = parent.host ?? parent;
684
- }
685
- if (getComputedStyle(closestOverflowParent).position === "static")
686
- closestOverflowParent.style.position = "relative";
687
767
  const natural = this.menuEl.getBoundingClientRect().width;
688
768
  const triggerWidth = this.el.getBoundingClientRect().width;
689
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));
690
770
  this.menuEl.style.width = idealWidth + "px";
691
771
  if (this.options.contextMenu) {
692
- this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner(), closestOverflowParent);
772
+ this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner());
693
773
  return;
694
774
  }
695
- 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();
696
815
  this.menuEl.style.left = positionInfo.x + "px";
697
816
  this.menuEl.style.top = positionInfo.y + "px";
698
817
  this.menuEl.style.height = positionInfo.height + "px";
@@ -708,30 +827,20 @@ var _Menu = class _Menu extends Component {
708
827
  /**
709
828
  * Places a context menu with its start corner on the point, flipping to
710
829
  * the other side of the point where it would not fit. The bounds are the
711
- * viewport, narrowed to a scrolling or clipping ancestor the menu sits in;
712
- * a menu taller than them gets their height and scrolls.
830
+ * viewport; a menu taller than it gets its height and scrolls.
713
831
  *
714
832
  * The menu rests at left/top 0 of its containing block, so its rect is the
715
833
  * offset to subtract - the same trick _getMenuPosition uses. It is measured
716
834
  * without the entry animation's scale, which a second right-click can catch.
717
835
  */
718
- _placeMenuAtPoint({ x, y }, container) {
836
+ _placeMenuAtPoint({ x, y }) {
719
837
  const { transform, transition } = this.menuEl.style;
720
838
  this.menuEl.style.transition = "none";
721
839
  this.menuEl.style.transform = "none";
722
840
  const menu = this.menuEl.getBoundingClientRect();
723
841
  this.menuEl.style.transform = transform;
724
842
  this.menuEl.style.transition = transition;
725
- let bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
726
- if (container && getComputedStyle(container).overflow !== "visible") {
727
- const clip = container.getBoundingClientRect();
728
- bounds = {
729
- left: Math.max(bounds.left, clip.left),
730
- top: Math.max(bounds.top, clip.top),
731
- right: Math.min(bounds.right, clip.right),
732
- bottom: Math.min(bounds.bottom, clip.bottom)
733
- };
734
- }
843
+ const bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
735
844
  const width = menu.width;
736
845
  const height = Math.min(menu.height, bounds.bottom - bounds.top);
737
846
  this.isScrollable = height < menu.height;
@@ -751,11 +860,16 @@ var _Menu = class _Menu extends Component {
751
860
  _setExpanded(expanded) {
752
861
  if (!this.options.contextMenu) this.el.ariaExpanded = String(expanded);
753
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
+ }
754
867
  };
755
868
  _Menu._menus = [];
869
+ _Menu.key = "Expressive_Menu";
756
870
  var Menu = _Menu;
757
871
 
758
872
  export {
759
873
  Menu
760
874
  };
761
- //# sourceMappingURL=chunk-NUHMOAOY.mjs.map
875
+ //# sourceMappingURL=chunk-CSYWKEK3.mjs.map