@expressivecss/expressive 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (609) hide show
  1. package/CHANGELOG.md +1807 -1
  2. package/README.md +9 -8
  3. package/dist/css/expressive.css +19176 -11958
  4. package/dist/css/expressive.css.map +1 -1
  5. package/dist/css/expressive.min.css +1 -1
  6. package/dist/css/expressive.min.css.map +1 -1
  7. package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
  8. package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
  9. package/dist/fonts/LICENSE-noto-sans-thai +93 -0
  10. package/dist/fonts/material-symbols-outlined.woff2 +0 -0
  11. package/dist/fonts/material-symbols-rounded.woff2 +0 -0
  12. package/dist/fonts/material-symbols-sharp.woff2 +0 -0
  13. package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
  14. package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
  15. package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
  16. package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
  17. package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
  18. package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
  19. package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
  20. package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
  21. package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
  22. package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
  23. package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
  24. package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
  25. package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
  26. package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
  27. package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
  28. package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
  29. package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
  30. package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
  31. package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
  32. package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
  33. package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
  34. package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
  35. package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
  36. package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
  37. package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
  38. package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
  39. package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
  40. package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
  41. package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
  42. package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
  43. package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
  44. package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
  45. package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
  46. package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
  47. package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
  48. package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
  49. package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
  50. package/dist/fonts/roboto-greek-400.woff2 +0 -0
  51. package/dist/fonts/roboto-greek-500.woff2 +0 -0
  52. package/dist/fonts/roboto-greek-700.woff2 +0 -0
  53. package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
  54. package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
  55. package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
  56. package/dist/fonts/roboto-latin-700.woff2 +0 -0
  57. package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
  58. package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
  59. package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
  60. package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
  61. package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
  62. package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
  63. package/dist/js/chunks/chunk-26VUH75M.mjs +102 -0
  64. package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
  65. package/dist/js/chunks/chunk-2LFCOGC3.mjs +233 -0
  66. package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
  67. package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-36GELQGX.mjs} +29 -46
  68. package/dist/js/chunks/chunk-36GELQGX.mjs.map +7 -0
  69. package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-3FKWIRHW.mjs} +15 -29
  70. package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
  71. package/dist/js/chunks/chunk-3KF65KGL.mjs +209 -0
  72. package/dist/js/chunks/chunk-3KF65KGL.mjs.map +7 -0
  73. package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-3KLZRQZI.mjs} +88 -116
  74. package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
  75. package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-3XORNED5.mjs} +3 -11
  76. package/dist/js/chunks/chunk-3XORNED5.mjs.map +7 -0
  77. package/dist/js/chunks/chunk-4WBGAQN3.mjs +113 -0
  78. package/dist/js/chunks/chunk-4WBGAQN3.mjs.map +7 -0
  79. package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-5F4URJHL.mjs} +19 -30
  80. package/dist/js/chunks/chunk-5F4URJHL.mjs.map +7 -0
  81. package/dist/js/chunks/chunk-67UNY7RH.mjs +299 -0
  82. package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
  83. package/dist/js/chunks/chunk-7CXNATJS.mjs +97 -0
  84. package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
  85. package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-7X44MKEQ.mjs} +43 -48
  86. package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
  87. package/dist/js/chunks/chunk-7ZAMOMGY.mjs +440 -0
  88. package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
  89. package/dist/js/chunks/chunk-AEG6LOAJ.mjs +54 -0
  90. package/dist/js/chunks/chunk-AEG6LOAJ.mjs.map +7 -0
  91. package/dist/js/chunks/chunk-AQNFCJJ5.mjs +135 -0
  92. package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
  93. package/dist/js/chunks/chunk-B55LWKBM.mjs +75 -0
  94. package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
  95. package/dist/js/chunks/chunk-BB5VXYXT.mjs +28 -0
  96. package/dist/js/chunks/chunk-BB5VXYXT.mjs.map +7 -0
  97. package/dist/js/chunks/chunk-BDATLH3H.mjs +108 -0
  98. package/dist/js/chunks/chunk-BDATLH3H.mjs.map +7 -0
  99. package/dist/js/chunks/chunk-CWMQOT4O.mjs +232 -0
  100. package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
  101. package/dist/js/chunks/chunk-CY2CTOVM.mjs +81 -0
  102. package/dist/js/chunks/chunk-CY2CTOVM.mjs.map +7 -0
  103. package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-DWA5UYLJ.mjs} +363 -218
  104. package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
  105. package/dist/js/chunks/chunk-EB2V4OKL.mjs +79 -0
  106. package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
  107. package/dist/js/chunks/chunk-EWO662ZC.mjs +188 -0
  108. package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
  109. package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-F7LAKFMX.mjs} +320 -141
  110. package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
  111. package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-FNIIH2LU.mjs} +20 -33
  112. package/dist/js/chunks/chunk-FNIIH2LU.mjs.map +7 -0
  113. package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
  114. package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
  115. package/dist/js/chunks/chunk-GFWYMWYN.mjs +125 -0
  116. package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
  117. package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
  118. package/dist/js/chunks/chunk-H5ISU45X.mjs +87 -0
  119. package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
  120. package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-H6YIKFAQ.mjs} +311 -186
  121. package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
  122. package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-HEH7E3KO.mjs} +155 -35
  123. package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
  124. package/dist/js/chunks/chunk-HQRLBTNM.mjs +152 -0
  125. package/dist/js/chunks/chunk-HQRLBTNM.mjs.map +7 -0
  126. package/dist/js/chunks/chunk-I2F7MLUU.mjs +137 -0
  127. package/dist/js/chunks/chunk-I2F7MLUU.mjs.map +7 -0
  128. package/dist/js/chunks/chunk-IQOTGGHX.mjs +797 -0
  129. package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
  130. package/dist/js/chunks/chunk-JH3YWKA6.mjs +225 -0
  131. package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
  132. package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
  133. package/dist/js/chunks/chunk-JOLJAYIJ.mjs.map +7 -0
  134. package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-KOTGMCMI.mjs} +116 -24
  135. package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
  136. package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-LC4O5LFS.mjs} +21 -45
  137. package/dist/js/chunks/chunk-LC4O5LFS.mjs.map +7 -0
  138. package/dist/js/chunks/chunk-LEF33SCP.mjs +127 -0
  139. package/dist/js/chunks/chunk-LEF33SCP.mjs.map +7 -0
  140. package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-LFORZRPH.mjs} +21 -23
  141. package/dist/js/chunks/chunk-LFORZRPH.mjs.map +7 -0
  142. package/dist/js/chunks/chunk-LWLNV5EC.mjs +451 -0
  143. package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
  144. package/dist/js/chunks/chunk-LXRHUQAX.mjs +491 -0
  145. package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
  146. package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-MA2SZZFB.mjs} +82 -111
  147. package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
  148. package/dist/js/chunks/chunk-MDBZAMIV.mjs +121 -0
  149. package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
  150. package/dist/js/chunks/chunk-NODZ5VAD.mjs +75 -0
  151. package/dist/js/chunks/chunk-NODZ5VAD.mjs.map +7 -0
  152. package/dist/js/chunks/chunk-O2WJB6TH.mjs +365 -0
  153. package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
  154. package/dist/js/chunks/chunk-PCABY5BN.mjs +35 -0
  155. package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
  156. package/dist/js/chunks/chunk-PWKYVMND.mjs +120 -0
  157. package/dist/js/chunks/chunk-PWKYVMND.mjs.map +7 -0
  158. package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-QHZZT7YO.mjs} +66 -38
  159. package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
  160. package/dist/js/chunks/chunk-QND56EW2.mjs +439 -0
  161. package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
  162. package/dist/js/chunks/chunk-QNODAANY.mjs +376 -0
  163. package/dist/js/chunks/chunk-QNODAANY.mjs.map +7 -0
  164. package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-QRO5FV3I.mjs} +156 -73
  165. package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
  166. package/dist/js/chunks/chunk-R7A7JRC5.mjs +440 -0
  167. package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
  168. package/dist/js/chunks/chunk-RKG2CBFE.mjs +74 -0
  169. package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
  170. package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-RSNS5OYS.mjs} +38 -25
  171. package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
  172. package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-RUDYMEJ3.mjs} +7 -6
  173. package/dist/js/chunks/chunk-RUDYMEJ3.mjs.map +7 -0
  174. package/dist/js/chunks/chunk-STJR62SU.mjs +161 -0
  175. package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
  176. package/dist/js/chunks/chunk-SUSD4UTN.mjs +220 -0
  177. package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
  178. package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-SYBOA5HC.mjs} +26 -48
  179. package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
  180. package/dist/js/chunks/chunk-T4MOBP3J.mjs +108 -0
  181. package/dist/js/chunks/chunk-T4MOBP3J.mjs.map +7 -0
  182. package/dist/js/chunks/chunk-TM7HPGTV.mjs +342 -0
  183. package/dist/js/chunks/chunk-TM7HPGTV.mjs.map +7 -0
  184. package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-TMQDZSDC.mjs} +71 -35
  185. package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
  186. package/dist/js/chunks/chunk-TVSX5YA2.mjs +48 -0
  187. package/dist/js/chunks/chunk-TVSX5YA2.mjs.map +7 -0
  188. package/dist/js/chunks/chunk-UHO5CV6K.mjs +80 -0
  189. package/dist/js/chunks/chunk-UHO5CV6K.mjs.map +7 -0
  190. package/dist/js/chunks/chunk-UKCNELUN.mjs +223 -0
  191. package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
  192. package/dist/js/chunks/chunk-UKQK5GWR.mjs +167 -0
  193. package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
  194. package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-UTSLYQ65.mjs} +21 -48
  195. package/dist/js/chunks/chunk-UTSLYQ65.mjs.map +7 -0
  196. package/dist/js/chunks/chunk-VS5OJBOD.mjs +108 -0
  197. package/dist/js/chunks/chunk-VS5OJBOD.mjs.map +7 -0
  198. package/dist/js/chunks/chunk-VZMROW5A.mjs +759 -0
  199. package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
  200. package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
  201. package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
  202. package/dist/js/chunks/chunk-XB6Y7P5W.mjs +69 -0
  203. package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
  204. package/dist/js/chunks/chunk-XDAMOMVD.mjs +226 -0
  205. package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
  206. package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-XJPMW5SP.mjs} +247 -172
  207. package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
  208. package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-YKANQILZ.mjs} +16 -21
  209. package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
  210. package/dist/js/chunks/chunk-YLZOJLDI.mjs +175 -0
  211. package/dist/js/chunks/chunk-YLZOJLDI.mjs.map +7 -0
  212. package/dist/js/chunks/chunk-ZK7YY322.mjs +514 -0
  213. package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
  214. package/dist/js/expressive.cjs +10266 -3628
  215. package/dist/js/expressive.cjs.map +4 -4
  216. package/dist/js/expressive.js +10266 -3628
  217. package/dist/js/expressive.js.map +4 -4
  218. package/dist/js/expressive.min.js +23 -22
  219. package/dist/js/expressive.min.js.map +4 -4
  220. package/dist/js/expressive.mjs +181 -69
  221. package/dist/js/expressive.mjs.map +2 -2
  222. package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
  223. package/dist/js/internal/behaviors/copy.mjs +9 -0
  224. package/dist/js/internal/behaviors/copy.mjs.map +7 -0
  225. package/dist/js/internal/behaviors/dataTables.mjs +8 -0
  226. package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
  227. package/dist/js/internal/behaviors/dialogs.mjs +2 -2
  228. package/dist/js/internal/behaviors/forms.mjs +2 -2
  229. package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
  230. package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
  231. package/dist/js/internal/behaviors/lists.mjs +8 -0
  232. package/dist/js/internal/behaviors/lists.mjs.map +7 -0
  233. package/dist/js/internal/behaviors/paneResize.mjs +8 -0
  234. package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
  235. package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
  236. package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
  237. package/dist/js/internal/behaviors/sortable.mjs +8 -0
  238. package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
  239. package/dist/js/internal/behaviors/theme.mjs +8 -0
  240. package/dist/js/internal/behaviors/theme.mjs.map +7 -0
  241. package/dist/js/internal/behaviors/tour.mjs +8 -0
  242. package/dist/js/internal/behaviors/tour.mjs.map +7 -0
  243. package/dist/js/internal/behaviors/transferList.mjs +8 -0
  244. package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
  245. package/dist/js/internal/components/appBar.mjs +3 -2
  246. package/dist/js/internal/components/autocomplete.mjs +5 -4
  247. package/dist/js/internal/components/backToTop.mjs +9 -0
  248. package/dist/js/internal/components/backToTop.mjs.map +7 -0
  249. package/dist/js/internal/components/barChart.mjs +5 -4
  250. package/dist/js/internal/components/buttonGroup.mjs +3 -2
  251. package/dist/js/internal/components/buttons.mjs +3 -3
  252. package/dist/js/internal/components/cards.mjs +3 -3
  253. package/dist/js/internal/components/carousel.mjs +3 -3
  254. package/dist/js/internal/components/cascader.mjs +10 -0
  255. package/dist/js/internal/components/cascader.mjs.map +7 -0
  256. package/dist/js/internal/components/characterCounter.mjs +3 -2
  257. package/dist/js/internal/components/chips.mjs +7 -5
  258. package/dist/js/internal/components/colorPicker.mjs +9 -0
  259. package/dist/js/internal/components/colorPicker.mjs.map +7 -0
  260. package/dist/js/internal/components/columnChart.mjs +4 -3
  261. package/dist/js/internal/components/commandPalette.mjs +3 -3
  262. package/dist/js/internal/components/confetti.mjs +3 -2
  263. package/dist/js/internal/components/currencyInput.mjs +9 -0
  264. package/dist/js/internal/components/currencyInput.mjs.map +7 -0
  265. package/dist/js/internal/components/datepicker.mjs +12 -8
  266. package/dist/js/internal/components/expandingCard.mjs +3 -3
  267. package/dist/js/internal/components/funnelChart.mjs +10 -0
  268. package/dist/js/internal/components/funnelChart.mjs.map +7 -0
  269. package/dist/js/internal/components/heatmapChart.mjs +4 -3
  270. package/dist/js/internal/components/hoverCard.mjs +9 -0
  271. package/dist/js/internal/components/hoverCard.mjs.map +7 -0
  272. package/dist/js/internal/components/index.mjs +131 -65
  273. package/dist/js/internal/components/inputMask.mjs +9 -0
  274. package/dist/js/internal/components/inputMask.mjs.map +7 -0
  275. package/dist/js/internal/components/keypad.mjs +3 -3
  276. package/dist/js/internal/components/lightbox.mjs +3 -3
  277. package/dist/js/internal/components/lineChart.mjs +41 -4
  278. package/dist/js/internal/components/loadingOverlay.mjs +9 -0
  279. package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
  280. package/dist/js/internal/components/mapView.mjs +3 -3
  281. package/dist/js/internal/components/menu.mjs +3 -3
  282. package/dist/js/internal/components/menubar.mjs +10 -0
  283. package/dist/js/internal/components/menubar.mjs.map +7 -0
  284. package/dist/js/internal/components/messageScroller.mjs +3 -3
  285. package/dist/js/internal/components/mixedChart.mjs +5 -4
  286. package/dist/js/internal/components/navigationRail.mjs +3 -2
  287. package/dist/js/internal/components/particles.mjs +3 -2
  288. package/dist/js/internal/components/pieChart.mjs +4 -3
  289. package/dist/js/internal/components/pullToRefresh.mjs +9 -0
  290. package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
  291. package/dist/js/internal/components/questionnaire.mjs +3 -3
  292. package/dist/js/internal/components/radarChart.mjs +4 -3
  293. package/dist/js/internal/components/radialChart.mjs +4 -3
  294. package/dist/js/internal/components/registry.mjs +60 -41
  295. package/dist/js/internal/components/richTextEditor.mjs +3 -3
  296. package/dist/js/internal/components/sankeyChart.mjs +10 -0
  297. package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
  298. package/dist/js/internal/components/scatterChart.mjs +10 -0
  299. package/dist/js/internal/components/scatterChart.mjs.map +7 -0
  300. package/dist/js/internal/components/scrollspy.mjs +3 -2
  301. package/dist/js/internal/components/select.mjs +5 -4
  302. package/dist/js/internal/components/showMore.mjs +9 -0
  303. package/dist/js/internal/components/showMore.mjs.map +7 -0
  304. package/dist/js/internal/components/slider.mjs +3 -3
  305. package/dist/js/internal/components/snackbar.mjs +2 -2
  306. package/dist/js/internal/components/swipeActions.mjs +9 -0
  307. package/dist/js/internal/components/swipeActions.mjs.map +7 -0
  308. package/dist/js/internal/components/tabs.mjs +3 -4
  309. package/dist/js/internal/components/timepicker.mjs +5 -4
  310. package/dist/js/internal/components/tooltip.mjs +3 -3
  311. package/dist/js/internal/components/treeSelect.mjs +14 -0
  312. package/dist/js/internal/components/treeSelect.mjs.map +7 -0
  313. package/dist/js/internal/components/treemapChart.mjs +10 -0
  314. package/dist/js/internal/components/treemapChart.mjs.map +7 -0
  315. package/dist/js/internal/core/component.mjs +6 -3
  316. package/dist/js/internal/core/formControl.mjs +12 -0
  317. package/dist/js/internal/core/formControl.mjs.map +7 -0
  318. package/dist/js/internal/core/imageURL.mjs +7 -0
  319. package/dist/js/internal/core/imageURL.mjs.map +7 -0
  320. package/dist/js/internal/core/spring.mjs +11 -0
  321. package/dist/js/internal/core/spring.mjs.map +7 -0
  322. package/dist/js/internal/core/utils.mjs +21 -3
  323. package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
  324. package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
  325. package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
  326. package/dist/js/modular.mjs +172 -69
  327. package/dist/types/behaviors/bottomSheets.d.ts +23 -5
  328. package/dist/types/behaviors/copy.d.ts +18 -0
  329. package/dist/types/behaviors/dataTables.d.ts +125 -0
  330. package/dist/types/behaviors/dialogs.d.ts +27 -1
  331. package/dist/types/behaviors/forms.d.ts +70 -4
  332. package/dist/types/behaviors/imageCompare.d.ts +13 -0
  333. package/dist/types/behaviors/lists.d.ts +12 -0
  334. package/dist/types/behaviors/paneResize.d.ts +29 -0
  335. package/dist/types/behaviors/sheetDrag.d.ts +18 -0
  336. package/dist/types/behaviors/sideSheets.d.ts +1 -1
  337. package/dist/types/behaviors/sortable.d.ts +28 -0
  338. package/dist/types/behaviors/theme.d.ts +22 -0
  339. package/dist/types/behaviors/tour.d.ts +36 -0
  340. package/dist/types/behaviors/transferList.d.ts +53 -0
  341. package/dist/types/components/appBar.d.ts +5 -6
  342. package/dist/types/components/autocomplete.d.ts +105 -20
  343. package/dist/types/components/backToTop.d.ts +36 -0
  344. package/dist/types/components/barChart.d.ts +3 -6
  345. package/dist/types/components/buttonGroup.d.ts +2 -4
  346. package/dist/types/components/buttons.d.ts +5 -5
  347. package/dist/types/components/cards.d.ts +3 -16
  348. package/dist/types/components/carousel.d.ts +16 -15
  349. package/dist/types/components/cascader.d.ts +130 -0
  350. package/dist/types/components/characterCounter.d.ts +2 -15
  351. package/dist/types/components/chips.d.ts +80 -19
  352. package/dist/types/components/colorPicker.d.ts +56 -0
  353. package/dist/types/components/columnChart.d.ts +23 -10
  354. package/dist/types/components/commandPalette.d.ts +11 -16
  355. package/dist/types/components/confetti.d.ts +2 -4
  356. package/dist/types/components/currencyInput.d.ts +60 -0
  357. package/dist/types/components/datepicker.d.ts +107 -56
  358. package/dist/types/components/expandingCard.d.ts +4 -6
  359. package/dist/types/components/funnelChart.d.ts +35 -0
  360. package/dist/types/components/heatmapChart.d.ts +42 -8
  361. package/dist/types/components/hoverCard.d.ts +59 -0
  362. package/dist/types/components/index.d.ts +16 -1
  363. package/dist/types/components/inputMask.d.ts +28 -0
  364. package/dist/types/components/keypad.d.ts +38 -6
  365. package/dist/types/components/lightbox.d.ts +14 -20
  366. package/dist/types/components/lineChart.d.ts +212 -12
  367. package/dist/types/components/loadingOverlay.d.ts +42 -0
  368. package/dist/types/components/mapView.d.ts +138 -27
  369. package/dist/types/components/menu.d.ts +74 -22
  370. package/dist/types/components/menubar.d.ts +37 -0
  371. package/dist/types/components/messageScroller.d.ts +2 -14
  372. package/dist/types/components/mixedChart.d.ts +15 -6
  373. package/dist/types/components/navigationRail.d.ts +16 -5
  374. package/dist/types/components/particles.d.ts +22 -5
  375. package/dist/types/components/pieChart.d.ts +33 -9
  376. package/dist/types/components/pullToRefresh.d.ts +80 -0
  377. package/dist/types/components/questionnaire.d.ts +58 -16
  378. package/dist/types/components/radarChart.d.ts +10 -6
  379. package/dist/types/components/radialChart.d.ts +58 -7
  380. package/dist/types/components/registry.d.ts +73 -3
  381. package/dist/types/components/richTextEditor.d.ts +45 -22
  382. package/dist/types/components/sankeyChart.d.ts +72 -0
  383. package/dist/types/components/scatterChart.d.ts +102 -0
  384. package/dist/types/components/scrollspy.d.ts +3 -5
  385. package/dist/types/components/select.d.ts +44 -33
  386. package/dist/types/components/showMore.d.ts +53 -0
  387. package/dist/types/components/slider.d.ts +2 -15
  388. package/dist/types/components/snackbar.d.ts +68 -1
  389. package/dist/types/components/swipeActions.d.ts +81 -0
  390. package/dist/types/components/tabs.d.ts +92 -30
  391. package/dist/types/components/timepicker.d.ts +128 -27
  392. package/dist/types/components/tooltip.d.ts +57 -21
  393. package/dist/types/components/treeSelect.d.ts +106 -0
  394. package/dist/types/components/treemapChart.d.ts +56 -0
  395. package/dist/types/core/component.d.ts +49 -25
  396. package/dist/types/core/formControl.d.ts +21 -0
  397. package/dist/types/core/imageURL.d.ts +2 -0
  398. package/dist/types/core/spring.d.ts +20 -0
  399. package/dist/types/core/utils.d.ts +123 -72
  400. package/dist/types/modular.d.ts +33 -1
  401. package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
  402. package/dist/types/plugins/modalDisplayPlugin.d.ts +39 -0
  403. package/package.json +17 -13
  404. package/src/sass/README.md +27 -18
  405. package/src/sass/abstracts/_elevation.scss +13 -7
  406. package/src/sass/abstracts/_index.scss +1 -0
  407. package/src/sass/abstracts/_mixins.scss +864 -78
  408. package/src/sass/abstracts/_spring.scss +63 -0
  409. package/src/sass/abstracts/_variables.scss +64 -21
  410. package/src/sass/base/_fonts.scss +61 -48
  411. package/src/sass/base/_global.scss +104 -24
  412. package/src/sass/base/_index.scss +2 -0
  413. package/src/sass/base/_normalize.scss +59 -114
  414. package/src/sass/base/_print.scss +21 -0
  415. package/src/sass/base/_prose.scss +68 -0
  416. package/src/sass/base/_typography.scss +9 -5
  417. package/src/sass/components/_accordion.scss +10 -19
  418. package/src/sass/components/_alert.scss +102 -0
  419. package/src/sass/components/_aura.scss +9 -3
  420. package/src/sass/components/_avatar.scss +3 -3
  421. package/src/sass/components/_back-to-top.scss +38 -0
  422. package/src/sass/components/_badges.scss +6 -5
  423. package/src/sass/components/_bar-chart.scss +31 -90
  424. package/src/sass/components/_bottom-sheet.scss +51 -16
  425. package/src/sass/components/_breadcrumb.scss +8 -7
  426. package/src/sass/components/_button-groups.scss +30 -63
  427. package/src/sass/components/_buttons.scss +137 -94
  428. package/src/sass/components/_calendar.scss +244 -0
  429. package/src/sass/components/_cards.scss +36 -44
  430. package/src/sass/components/_carousel.scss +37 -113
  431. package/src/sass/components/_cascader.scss +131 -0
  432. package/src/sass/components/_chips.scss +36 -46
  433. package/src/sass/components/_column-chart.scss +15 -26
  434. package/src/sass/components/_command-palette.scss +4 -7
  435. package/src/sass/components/_confetti.scss +1 -4
  436. package/src/sass/components/_countdown.scss +1 -1
  437. package/src/sass/components/_data-table.scss +172 -25
  438. package/src/sass/components/_datepicker.scss +54 -40
  439. package/src/sass/components/_description-list.scss +85 -0
  440. package/src/sass/components/_dialog.scss +48 -55
  441. package/src/sass/components/_docked-display.scss +1 -3
  442. package/src/sass/components/_drag-handle.scss +16 -20
  443. package/src/sass/components/_expanding-card.scss +21 -14
  444. package/src/sass/components/_fab-menu.scss +43 -39
  445. package/src/sass/components/_funnel-chart.scss +63 -0
  446. package/src/sass/components/_heatmap-chart.scss +114 -29
  447. package/src/sass/components/_icon-buttons.scss +8 -11
  448. package/src/sass/components/_icons-material-design.scss +2 -2
  449. package/src/sass/components/_image-compare.scss +108 -0
  450. package/src/sass/components/_index.scss +20 -0
  451. package/src/sass/components/_keypad.scss +39 -19
  452. package/src/sass/components/_kpi.scss +6 -11
  453. package/src/sass/components/_lightbox.scss +24 -13
  454. package/src/sass/components/_line-chart.scss +9 -63
  455. package/src/sass/components/_list.scss +59 -14
  456. package/src/sass/components/_loading-indicator.scss +1 -0
  457. package/src/sass/components/_loading-overlay.scss +105 -0
  458. package/src/sass/components/_map.scss +37 -11
  459. package/src/sass/components/_marquee.scss +4 -3
  460. package/src/sass/components/_mega-menu.scss +128 -0
  461. package/src/sass/components/_menu.scss +146 -127
  462. package/src/sass/components/_menubar.scss +47 -0
  463. package/src/sass/components/_message-scroller.scss +2 -2
  464. package/src/sass/components/_message.scss +3 -3
  465. package/src/sass/components/_mixed-chart.scss +27 -35
  466. package/src/sass/components/_modal-display.scss +21 -0
  467. package/src/sass/components/_navbar.scss +45 -36
  468. package/src/sass/components/_navigation-bar.scss +12 -77
  469. package/src/sass/components/_navigation-rail.scss +161 -92
  470. package/src/sass/components/_org-chart.scss +192 -0
  471. package/src/sass/components/_page-footer.scss +2 -4
  472. package/src/sass/components/_pagination.scss +9 -27
  473. package/src/sass/components/_panes.scss +35 -42
  474. package/src/sass/components/_particles.scss +1 -4
  475. package/src/sass/components/_pie-chart.scss +86 -68
  476. package/src/sass/components/_popover.scss +18 -5
  477. package/src/sass/components/_progress.scss +183 -44
  478. package/src/sass/components/_pull-to-refresh.scss +90 -0
  479. package/src/sass/components/_questionnaire.scss +74 -3
  480. package/src/sass/components/_radar-chart.scss +40 -42
  481. package/src/sass/components/_radial-chart.scss +108 -46
  482. package/src/sass/components/_rich-text-editor.scss +2 -2
  483. package/src/sass/components/_sankey-chart.scss +91 -0
  484. package/src/sass/components/_scatter-chart.scss +144 -0
  485. package/src/sass/components/_scrim.scss +0 -2
  486. package/src/sass/components/_scrollspy.scss +0 -2
  487. package/src/sass/components/_search.scss +27 -26
  488. package/src/sass/components/_show-more.scss +8 -0
  489. package/src/sass/components/_side-sheet.scss +32 -51
  490. package/src/sass/components/_skeleton.scss +26 -19
  491. package/src/sass/components/_snackbar.scss +25 -21
  492. package/src/sass/components/_split-button.scss +5 -5
  493. package/src/sass/components/_stat.scss +3 -8
  494. package/src/sass/components/_stepper.scss +1 -1
  495. package/src/sass/components/_swipe-actions.scss +71 -0
  496. package/src/sass/components/_table_of_contents.scss +1 -3
  497. package/src/sass/components/_tabs.scss +49 -46
  498. package/src/sass/components/_timeline.scss +12 -12
  499. package/src/sass/components/_timepicker.scss +111 -79
  500. package/src/sass/components/_toolbar.scss +36 -47
  501. package/src/sass/components/_tooltip.scss +25 -12
  502. package/src/sass/components/_tour.scss +89 -0
  503. package/src/sass/components/_transfer-list.scss +73 -0
  504. package/src/sass/components/_transitions.scss +4 -4
  505. package/src/sass/components/_tree.scss +7 -32
  506. package/src/sass/components/_treemap-chart.scss +98 -0
  507. package/src/sass/components/forms/_checkboxes.scss +107 -44
  508. package/src/sass/components/forms/_color-picker.scss +135 -0
  509. package/src/sass/components/forms/_color-swatches.scss +85 -0
  510. package/src/sass/components/forms/_drop-zone.scss +16 -13
  511. package/src/sass/components/forms/_fieldset.scss +4 -7
  512. package/src/sass/components/forms/_file-input.scss +12 -8
  513. package/src/sass/components/forms/_index.scss +3 -1
  514. package/src/sass/components/forms/_input-fields.scss +271 -90
  515. package/src/sass/components/forms/_radio-buttons.scss +34 -117
  516. package/src/sass/components/forms/_rating.scss +2 -32
  517. package/src/sass/components/forms/_select.scss +198 -20
  518. package/src/sass/components/forms/_slider.scss +92 -98
  519. package/src/sass/components/forms/_switches.scss +62 -180
  520. package/src/sass/custom.scss +10 -1
  521. package/src/sass/expressive.scss +3 -63
  522. package/src/sass/tokens/_contrast.scss +94 -0
  523. package/src/sass/tokens/_elevation.scss +16 -0
  524. package/src/sass/tokens/_index.scss +5 -0
  525. package/src/sass/tokens/_motion.scss +109 -0
  526. package/src/sass/tokens/_reference.scss +72 -141
  527. package/src/sass/tokens/_shape.scss +38 -0
  528. package/src/sass/tokens/_stacking.scss +27 -0
  529. package/src/sass/tokens/_state.scss +0 -2
  530. package/src/sass/tokens/_theme.scss +10 -1
  531. package/src/sass/tokens/_vibrant.scss +2 -5
  532. package/src/sass/utilities/_defer-render.scss +17 -0
  533. package/src/sass/utilities/_helpers.scss +184 -27
  534. package/src/sass/utilities/_index.scss +1 -0
  535. package/src/sass/utilities/_scroll-area.scss +0 -2
  536. package/src/sass/utilities/_spacing.scss +52 -34
  537. package/src/sass/utilities/_typescale.scss +8 -1
  538. package/src/sass/utilities/_visibility.scss +46 -77
  539. package/src/sass/utilities/_z-depth.scss +7 -4
  540. package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
  541. package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
  542. package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
  543. package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
  544. package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
  545. package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
  546. package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
  547. package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
  548. package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
  549. package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
  550. package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
  551. package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
  552. package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
  553. package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
  554. package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
  555. package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
  556. package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
  557. package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
  558. package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
  559. package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
  560. package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
  561. package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
  562. package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
  563. package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
  564. package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
  565. package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
  566. package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
  567. package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
  568. package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
  569. package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
  570. package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
  571. package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
  572. package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
  573. package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
  574. package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
  575. package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
  576. package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
  577. package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
  578. package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
  579. package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
  580. package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
  581. package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
  582. package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
  583. package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
  584. package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
  585. package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
  586. package/dist/js/chunks/chunk-UAZSDUVP.mjs +0 -90
  587. package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
  588. package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
  589. package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
  590. package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
  591. package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
  592. package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
  593. package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
  594. package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
  595. package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
  596. package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
  597. package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
  598. package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
  599. package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
  600. package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
  601. package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
  602. package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
  603. package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
  604. package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
  605. package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
  606. package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
  607. package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
  608. package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
  609. /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
@@ -1,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-EB2V4OKL.mjs";
4
+ import {
5
+ Utils,
6
+ controllerFor,
7
+ restoreAttribute
8
+ } from "./chunk-67UNY7RH.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
@@ -40,6 +76,10 @@ var _Menu = class _Menu extends Component {
40
76
  this._contextPoint = null;
41
77
  /** What had focus when a context menu opened; focus goes back there. */
42
78
  this._contextReturn = null;
79
+ /** Each attribute setup wrote, with the value it had before, for destroy(). */
80
+ this._originalAttributes = /* @__PURE__ */ new Map();
81
+ /** Where the menu was before it moved next to the trigger. */
82
+ this._originalPlace = { parent: null, next: null };
43
83
  this._handleContextMenu = (e) => {
44
84
  if (e.defaultPrevented) {
45
85
  this.close();
@@ -75,39 +115,67 @@ var _Menu = class _Menu extends Component {
75
115
  }
76
116
  };
77
117
  this._handleMouseEnter = () => {
118
+ if (this.isOpen) return;
119
+ this._openedByHover = true;
78
120
  this.open();
79
121
  };
122
+ // A hover menu stays open while the pointer moves onto its content or onto
123
+ // the trigger of an open menu. relatedTarget is null when the pointer
124
+ // leaves the window entirely.
80
125
  this._handleMouseLeave = (e) => {
81
126
  const toEl = e.relatedTarget;
82
- if (!toEl) {
83
- this.close();
84
- return;
85
- }
86
- const leaveToActiveMenuTrigger = toEl.closest(".menu-trigger")?.["Expressive_Menu"]?.isOpen;
87
- if (!leaveToActiveMenuTrigger && !this.menuEl?.contains(toEl)) this.close();
127
+ if (toEl && (this.menuEl?.contains(toEl) || _Menu._inOpenTrigger(toEl))) return;
128
+ this.close();
88
129
  };
89
130
  this._handleDocumentClick = (e) => {
90
131
  const path = e.composedPath();
91
132
  const menuTarget = this._menuClickTargets.get(e);
92
133
  this._menuClickTargets.delete(e);
134
+ if (!menuTarget && !this.options.contextMenu && path.includes(this.el)) {
135
+ this.isTouchMoving = false;
136
+ return;
137
+ }
93
138
  const target = menuTarget ?? (path[0] || e.target);
94
139
  const inside = !!menuTarget || path.includes(this.menuEl) || this.menuEl?.contains(target);
95
140
  if (this._isSubmenuTriggerClick(target)) return;
96
- if (this.options.closeOnClick && inside && !this.isTouchMoving) {
141
+ if (inside && this._closesOnClick(target)) {
97
142
  this.close();
98
143
  } else if (!inside) {
99
144
  this._schedule(() => this.close(), 0);
100
145
  }
101
146
  this.isTouchMoving = false;
102
147
  };
148
+ // A hover-opened menu does not hold focus, so its own keydown handler never
149
+ // sees Escape. Close it from wherever focus is, without moving focus, and
150
+ // take the key only when it was pressed on the trigger.
151
+ this._handleDocumentKeydown = (e) => {
152
+ if (e.key !== "Escape" || !this._openedByHover) return;
153
+ if (Utils.focusIsIn(this.el)) e.preventDefault();
154
+ this.close();
155
+ };
103
156
  this._handleTriggerKeydown = (e) => {
104
157
  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) {
158
+ if (e.key === "Escape" && this.isOpen && Utils.plainKey(e) && !Utils.isComposing(e)) {
159
+ e.preventDefault();
160
+ this.close();
161
+ return;
162
+ }
163
+ const opensMenu = [SPACE, "Enter", "ArrowDown", "ArrowUp"].includes(e.key);
164
+ if (!opensMenu) return;
165
+ if (!this.isOpen) {
107
166
  e.preventDefault();
108
167
  this.open();
168
+ } else if (this._openedByHover) {
169
+ e.preventDefault();
170
+ this._openedByHover = false;
171
+ this._focusInitialItem();
109
172
  }
110
173
  };
174
+ // A scroll ends without a click, which is the only other place the flag is
175
+ // cleared, so a new gesture has to clear it or the next tap is ignored.
176
+ this._handleMenuPointerdown = () => {
177
+ this.isTouchMoving = false;
178
+ };
111
179
  this._handleDocumentTouchmove = (e) => {
112
180
  const target = e.target;
113
181
  if (e.composedPath().includes(this.menuEl) || this.menuEl?.contains(target)) {
@@ -118,7 +186,7 @@ var _Menu = class _Menu extends Component {
118
186
  const target = e.target;
119
187
  this._menuClickTargets.set(e, target);
120
188
  const li = target.closest("li");
121
- if (li?.matches('.disabled, [aria-disabled="true"]')) {
189
+ if (li?.matches('.disabled, [aria-disabled="true"], .divider, .gap, .label, .optgroup')) {
122
190
  e.preventDefault();
123
191
  e.stopPropagation();
124
192
  return;
@@ -129,9 +197,7 @@ var _Menu = class _Menu extends Component {
129
197
  this._toggleSubmenu(li);
130
198
  return;
131
199
  }
132
- if (li && typeof this.options.onItemClick === "function") {
133
- this.options.onItemClick.call(this, li);
134
- }
200
+ if (li) this._activateItem(li);
135
201
  };
136
202
  this._handleSubmenuAlign = (e) => {
137
203
  const target = e.target;
@@ -142,17 +208,16 @@ var _Menu = class _Menu extends Component {
142
208
  }
143
209
  };
144
210
  this._handleMenuKeydown = (e) => {
145
- if (!this.isOpen || e.ctrlKey || e.metaKey || e.altKey || e.isComposing) return;
211
+ if (!this.isOpen || !Utils.plainKey(e) || Utils.isComposing(e)) return;
146
212
  const list = this._containingSubmenu(e) ?? this.menuEl;
147
213
  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)) {
214
+ const openKey = rtl ? "ArrowLeft" : "ArrowRight";
215
+ const backKey = rtl ? "ArrowRight" : "ArrowLeft";
216
+ if ([openKey, backKey, "ArrowUp", "ArrowDown", "Escape", "Tab"].includes(e.key)) {
151
217
  clearTimeout(this.filterTimeout);
152
218
  this._resetFilterQuery();
153
219
  }
154
- const arrowUpOrDown = e.key === Utils.keys.ARROW_DOWN || e.key === Utils.keys.ARROW_UP;
155
- if (e.key === Utils.keys.TAB) {
220
+ if (e.key === "Tab") {
156
221
  e.preventDefault();
157
222
  this.close();
158
223
  } else if (e.key === openKey) {
@@ -175,26 +240,9 @@ var _Menu = class _Menu extends Component {
175
240
  this._closeSubmenu(parentLi);
176
241
  this._focusRow(parentLi);
177
242
  }
178
- } else if (arrowUpOrDown) {
243
+ } else if (this._moveFocus(list, e)) {
179
244
  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) {
245
+ } else if (e.key === "Enter" || e.key === SPACE) {
198
246
  const li = this._focusedRow(e);
199
247
  e.preventDefault();
200
248
  if (li?.matches('.disabled, [aria-disabled="true"]')) return;
@@ -204,12 +252,15 @@ var _Menu = class _Menu extends Component {
204
252
  }
205
253
  const focusedElement = li ?? this.menuEl.children[this.focusedIndex];
206
254
  const activatableElement = focusedElement?.querySelector(":scope > a, :scope > button");
255
+ this._spaceActivation = e.key === SPACE;
207
256
  if (!!activatableElement) {
208
257
  activatableElement.click();
209
258
  } else if (focusedElement instanceof HTMLElement) {
210
259
  focusedElement.click();
211
260
  }
212
- } else if (e.key === Utils.keys.ESC) {
261
+ this._spaceActivation = false;
262
+ this._closeAfterEnter(e, focusedElement);
263
+ } else if (e.key === "Escape") {
213
264
  e.preventDefault();
214
265
  const openSub = this._containingSubmenu(e)?.parentElement ?? Array.from(this.menuEl.querySelectorAll("li.open")).reverse()[0];
215
266
  if (openSub) {
@@ -223,8 +274,8 @@ var _Menu = class _Menu extends Component {
223
274
  if (e.key.length === 1 && e.key !== SPACE) {
224
275
  this.filterQuery.push(keyText);
225
276
  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)
277
+ const newOptionEl = this._rows(list).find(
278
+ (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
279
  );
229
280
  if (newOptionEl) {
230
281
  this._focusRow(newOptionEl);
@@ -241,19 +292,39 @@ var _Menu = class _Menu extends Component {
241
292
  this._resetFilterQuery = () => {
242
293
  this.filterQuery = [];
243
294
  };
295
+ // Below the trigger, or above it for placement 'top', starting at its left
296
+ // edge for alignment 'left' or its right edge for 'right', with the flips
297
+ // position-try-fallbacks offers.
298
+ // The height is capped to the room on the chosen side, so a long menu
299
+ // scrolls there, as in the measured path.
300
+ this._reanchorFrame = 0;
301
+ /**
302
+ * At most once a frame while the menu is open and something outside it
303
+ * scrolls, an anchored menu chooses its side again and a measured one
304
+ * follows its trigger, keeping its own scroll position. A context menu
305
+ * stays where it opened, and the menu's own scrolling moves nothing.
306
+ */
307
+ this._reanchor = (event) => {
308
+ if (this._reanchorFrame || this.options.contextMenu || this.menuEl.contains(event.target)) return;
309
+ this._reanchorFrame = requestAnimationFrame(() => {
310
+ this._reanchorFrame = 0;
311
+ if (!this.isOpen) return;
312
+ if (this.menuEl.style.getPropertyValue("position-anchor")) return this._placeAnchored();
313
+ const { scrollTop } = this.menuEl;
314
+ this.recalculateDimensions();
315
+ this.menuEl.scrollTop = scrollTop;
316
+ });
317
+ };
244
318
  /**
245
319
  * Open menu.
246
320
  */
247
321
  this.open = () => {
248
- if (this.isOpen || this.el["Expressive_Menu"] !== this) return;
322
+ if (!this._canOpen) return;
249
323
  const transition = this._clearPendingTimers();
250
324
  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;
325
+ if (!this._notify("open", this.options.onOpenStart, { current: () => transition === this._transition })) return;
255
326
  this._resetMenuStyles();
256
- this.menuEl.style.display = "block";
327
+ if (this.menuEl.isConnected) this.menuEl.showPopover();
257
328
  this._restoreInert();
258
329
  this._placeMenu();
259
330
  this._schedule(() => this._setupTemporaryEventHandlers(), 0);
@@ -269,17 +340,16 @@ var _Menu = class _Menu extends Component {
269
340
  const root = this.menuEl.getRootNode();
270
341
  const focused = root.activeElement;
271
342
  this.isOpen = false;
343
+ this._openedByHover = false;
272
344
  this.menuEl.setAttribute("inert", "");
273
345
  clearTimeout(this.filterTimeout);
274
346
  this._resetFilterQuery();
275
347
  this.focusedIndex = -1;
348
+ this._clearActive();
276
349
  this._closeSubmenus();
277
- if (typeof this.options.onCloseStart === "function") {
278
- this.options.onCloseStart.call(this, this.el);
279
- }
280
- if (transition !== this._transition) return;
350
+ if (!this._notify("close", this.options.onCloseStart, { current: () => transition === this._transition })) return;
281
351
  this._animateOut();
282
- this._removeTemporaryEventHandlers();
352
+ this._openEvents?.abort();
283
353
  this._setExpanded(false);
284
354
  if (this.options.autoFocus && this.menuEl.contains(focused) && (root.activeElement === focused || this.el.ownerDocument.activeElement === this.el.ownerDocument.body)) {
285
355
  const back = this._contextReturn;
@@ -297,27 +367,25 @@ var _Menu = class _Menu extends Component {
297
367
  this._placeMenu();
298
368
  }
299
369
  };
300
- this.el["Expressive_Menu"] = this;
301
370
  _Menu._menus.push(this);
302
371
  this.id = Utils.getIdFromTrigger(el);
303
372
  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
373
  this.isOpen = false;
311
374
  this.isScrollable = false;
312
375
  this.isTouchMoving = false;
313
376
  this.focusedIndex = -1;
314
377
  this.filterQuery = [];
315
378
  if (!this.options.contextMenu) {
316
- this.el.ariaExpanded = "false";
317
- if (!this.el.hasAttribute("aria-haspopup")) this.el.setAttribute("aria-haspopup", "menu");
379
+ this._setAttribute(this.el, "aria-expanded", "false");
380
+ if (!this.el.hasAttribute("aria-haspopup")) this._setAttribute(this.el, "aria-haspopup", "menu");
318
381
  if (this.id && !this.el.hasAttribute("aria-controls"))
319
- this.el.setAttribute("aria-controls", this.id);
382
+ this._setAttribute(this.el, "aria-controls", this.id);
320
383
  }
384
+ if (!this.menuEl) {
385
+ console.warn(`Menu skipped: no element matches target "${this.id}".`, el);
386
+ return;
387
+ }
388
+ this._originalInert = this.menuEl.getAttribute("inert");
321
389
  this._moveMenuToElement();
322
390
  this._setupAccessibility();
323
391
  this._makeMenuFocusable();
@@ -327,101 +395,125 @@ var _Menu = class _Menu extends Component {
327
395
  static get defaults() {
328
396
  return _defaults;
329
397
  }
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
398
  destroy() {
342
399
  this._clearPendingTimers();
343
400
  this.isOpen = false;
344
401
  this._setExpanded(false);
402
+ if (this.menuEl) Utils.setAnchorName(this.el, `--menu-${this.menuEl.id}`, false);
345
403
  clearTimeout(this.filterTimeout);
346
404
  this._resetMenuStyles();
347
405
  this._restoreInert();
348
- this._removeEventHandlers();
349
- this._removeTemporaryEventHandlers();
406
+ this._restoreSetup();
407
+ this._events.abort();
408
+ this._openEvents?.abort();
350
409
  const index = _Menu._menus.indexOf(this);
351
410
  if (index >= 0) _Menu._menus.splice(index, 1);
352
- this.el["Expressive_Menu"] = void 0;
411
+ super.destroy();
353
412
  }
354
413
  _setupEventHandlers() {
355
- this.el.addEventListener("keydown", this._handleTriggerKeydown);
356
- this.menuEl?.addEventListener("click", this._handleMenuClick);
414
+ const { signal } = this._events;
415
+ this.el.addEventListener("keydown", this._handleTriggerKeydown, { signal });
416
+ this.menuEl?.addEventListener("click", this._handleMenuClick, { signal });
357
417
  if (this.menuEl?.querySelector(":scope > li > menu")) {
358
- this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign);
359
- }
360
- if (this.options.contextMenu) {
361
- this.el.addEventListener("contextmenu", this._handleContextMenu);
362
- } 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);
366
- } else {
367
- this.el.addEventListener("click", this._handleClick);
418
+ this.menuEl.addEventListener("mouseover", this._handleSubmenuAlign, { signal });
368
419
  }
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
420
  if (this.options.contextMenu) {
375
- this.el.removeEventListener("contextmenu", this._handleContextMenu);
421
+ this.el.addEventListener("contextmenu", this._handleContextMenu, { signal });
376
422
  } 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);
423
+ this.el.addEventListener("mouseenter", this._handleMouseEnter, { signal });
424
+ this.el.addEventListener("mouseleave", this._handleMouseLeave, { signal });
425
+ this.menuEl.addEventListener("mouseleave", this._handleMouseLeave, { signal });
380
426
  } else {
381
- this.el.removeEventListener("click", this._handleClick);
427
+ this.el.addEventListener("click", this._handleClick, { signal });
382
428
  }
383
429
  }
384
430
  _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
431
+ this._openEvents?.abort();
432
+ this._openEvents = controllerFor(this.el);
433
+ const { signal } = this._openEvents;
434
+ const passive = { passive: true, signal };
435
+ document.addEventListener("click", this._handleDocumentClick, { signal });
436
+ this.menuEl?.addEventListener("pointerdown", this._handleMenuPointerdown, passive);
437
+ this.menuEl?.addEventListener("touchmove", this._handleDocumentTouchmove, passive);
438
+ document.addEventListener("touchmove", this._handleDocumentTouchmove, passive);
439
+ this.menuEl?.addEventListener("keydown", this._handleMenuKeydown, { signal });
440
+ document.addEventListener("keydown", this._handleDocumentKeydown, { signal });
441
+ window.addEventListener("resize", this._handleWindowResize, { signal });
442
+ for (const target of [window, ...shadowRoots(this.el)]) {
443
+ target.addEventListener("scroll", this._reanchor, { capture: true, passive: true, signal });
444
+ }
445
+ if (this.options.contextMenu) document.addEventListener("contextmenu", this._handleDocumentContextMenu, { signal });
446
+ }
447
+ static _inOpenTrigger(el) {
448
+ const trigger = el.closest(".menu-trigger");
449
+ return Boolean(trigger && _Menu.getInstance(trigger)?.isOpen);
450
+ }
451
+ _activateItem(li) {
452
+ const checked = this._toggleChecked(li);
453
+ if (!this._notify("select", this.options.onItemClick, { args: [li], detail: { item: li } })) return;
454
+ if (checked !== null) this._notify("change", null, { detail: { item: li, checked } });
455
+ }
456
+ // A menuitemcheckbox flips aria-checked, and a menuitemradio checks itself
457
+ // and unchecks its group, before anyone hears of the click. Any other row,
458
+ // or a radio that was already checked, returns null.
459
+ _toggleChecked(li) {
460
+ const role = li.getAttribute("role");
461
+ if (role === "menuitemradio") return this._checkRadio(li);
462
+ if (role !== "menuitemcheckbox") return null;
463
+ const checked = li.getAttribute("aria-checked") !== "true";
464
+ li.setAttribute("aria-checked", String(checked));
465
+ return checked;
466
+ }
467
+ // A radio's group is its parent list: a <ul role="group">, or for radio
468
+ // rows outside any group, their menu.
469
+ _checkRadio(li) {
470
+ if (li.getAttribute("aria-checked") === "true") return null;
471
+ li.parentElement.querySelectorAll(':scope > li[role="menuitemradio"]').forEach((radio) => {
472
+ radio.setAttribute("aria-checked", String(radio === li));
389
473
  });
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);
474
+ return true;
475
+ }
476
+ _isCheckboxRow(el) {
477
+ return el?.closest("li")?.getAttribute("role") === "menuitemcheckbox";
478
+ }
479
+ // isTouchMoving: a scroll on mobile is not a choice.
480
+ _closesOnClick(target) {
481
+ return this.options.closeOnClick && !this.isTouchMoving && !this._keepsOpen(target);
482
+ }
483
+ // Click and Space keep a checkbox menu open so several items can be
484
+ // toggled. Space keeps a radio menu open too; a click on a radio closes it.
485
+ _keepsOpen(target) {
486
+ const role = target.closest("li")?.getAttribute("role");
487
+ if (role === "menuitemcheckbox") return true;
488
+ return this._spaceActivation && role === "menuitemradio";
489
+ }
490
+ // Enter toggles a checkbox item and then closes, as it does on any item.
491
+ _closeAfterEnter(e, row) {
492
+ if (e.key === "Enter" && this.options.closeOnClick && this._isCheckboxRow(row)) this.close();
401
493
  }
402
494
  _setupAccessibility() {
403
495
  if (!this.menuEl) return;
404
- if (!this.menuEl.hasAttribute("role")) this.menuEl.setAttribute("role", "menu");
496
+ if (!this.menuEl.hasAttribute("role")) this._setAttribute(this.menuEl, "role", "menu");
405
497
  const menus = [this.menuEl, ...this.menuEl.querySelectorAll("menu")];
406
498
  menus.forEach((menu) => {
407
- if (!menu.hasAttribute("role")) menu.setAttribute("role", "menu");
499
+ if (!menu.hasAttribute("role")) this._setAttribute(menu, "role", "menu");
408
500
  if (menu.getAttribute("role") !== "menu") return;
409
- menu.querySelectorAll(":scope > li").forEach((li) => {
501
+ menu.querySelectorAll(ROWS).forEach((li) => {
410
502
  if (li.classList.contains("divider")) {
411
- if (!li.hasAttribute("role")) li.setAttribute("role", "separator");
503
+ if (!li.hasAttribute("role")) this._setAttribute(li, "role", "separator");
412
504
  return;
413
505
  }
414
506
  if (li.classList.contains("gap")) {
415
- li.setAttribute("aria-hidden", "true");
507
+ this._setAttribute(li, "aria-hidden", "true");
416
508
  return;
417
509
  }
418
510
  if (li.classList.contains("label") || li.classList.contains("optgroup")) {
419
- if (!li.hasAttribute("role")) li.setAttribute("role", "presentation");
511
+ if (!li.hasAttribute("role")) this._setAttribute(li, "role", "presentation");
420
512
  return;
421
513
  }
422
- if (!li.hasAttribute("role")) li.setAttribute("role", "menuitem");
514
+ if (!li.hasAttribute("role")) this._setAttribute(li, "role", "menuitem");
423
515
  if (li.classList.contains("disabled") && !li.hasAttribute("aria-disabled")) {
424
- li.setAttribute("aria-disabled", "true");
516
+ this._setAttribute(li, "aria-disabled", "true");
425
517
  }
426
518
  });
427
519
  });
@@ -438,8 +530,8 @@ var _Menu = class _Menu extends Component {
438
530
  this.menuEl?.querySelectorAll("li").forEach((li) => {
439
531
  if (!li.querySelector(":scope > menu")) return;
440
532
  const trigger = li.querySelector(":scope > a, :scope > button, :scope > span") ?? li;
441
- trigger.setAttribute("aria-haspopup", "menu");
442
- trigger.setAttribute("aria-expanded", "false");
533
+ this._setAttribute(trigger, "aria-haspopup", "menu");
534
+ this._setAttribute(trigger, "aria-expanded", "false");
443
535
  });
444
536
  }
445
537
  _toggleSubmenu(li) {
@@ -484,17 +576,22 @@ var _Menu = class _Menu extends Component {
484
576
  return null;
485
577
  }
486
578
  _restoreInert() {
487
- if (this._originalInert === null) this.menuEl?.removeAttribute("inert");
488
- else this.menuEl?.setAttribute("inert", this._originalInert);
579
+ if (this.menuEl) restoreAttribute(this.menuEl, "inert", this._originalInert);
580
+ }
581
+ // focusedIndex is reset on close and only covers one list, so clearing by
582
+ // index left an old highlight behind after reopening or a typeahead jump.
583
+ _clearActive() {
584
+ this.menuEl?.querySelectorAll("li.active").forEach((li) => li.classList.remove("active"));
489
585
  }
490
586
  _focusRow(item) {
587
+ this._clearActive();
491
588
  this.focusedIndex = Array.from(item.parentElement.children).indexOf(item);
492
589
  item.focus({ preventScroll: true });
493
590
  item.scrollIntoView({ block: "nearest", inline: "nearest" });
494
591
  }
495
592
  _resetMenuStyles() {
496
593
  if (!this.menuEl) return;
497
- this.menuEl.style.display = "";
594
+ if (this.menuEl.popover) this.menuEl.hidePopover();
498
595
  this._resetMenuPositioningStyles();
499
596
  this.menuEl.style.transform = "";
500
597
  this.menuEl.style.opacity = "";
@@ -505,37 +602,76 @@ var _Menu = class _Menu extends Component {
505
602
  this.menuEl.style.left = "";
506
603
  this.menuEl.style.top = "";
507
604
  this.menuEl.style.transformOrigin = "";
605
+ for (const property of ANCHOR_STYLES) this.menuEl.style.removeProperty(property);
606
+ this._stopReanchoring();
508
607
  }
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);
608
+ _moveMenuToElement() {
609
+ this._originalPlace = { parent: this.menuEl.parentNode, next: this.menuEl.nextSibling };
610
+ if (this.options.container) this.options.container.append(this.menuEl);
611
+ else this.el.after(this.menuEl);
612
+ }
613
+ /** Keeps the value an attribute had before setup first changed it, which destroy() puts back. */
614
+ _keepAttribute(el, name) {
615
+ const saved = this._originalAttributes.get(el) ?? /* @__PURE__ */ new Map();
616
+ if (!saved.has(name)) saved.set(name, el.getAttribute(name));
617
+ this._originalAttributes.set(el, saved);
618
+ }
619
+ _setAttribute(el, name, value) {
620
+ this._keepAttribute(el, name);
621
+ el.setAttribute(name, value);
622
+ }
623
+ /**
624
+ * Puts back the attributes setup wrote and the menu where it was, so a
625
+ * destroyed trigger is no longer announced as a menu button. The place is
626
+ * only used while it is still in the page.
627
+ */
628
+ _restoreSetup() {
629
+ this._originalAttributes.forEach((saved, el) => saved.forEach((value, name) => restoreAttribute(el, name, value)));
630
+ this._originalAttributes.clear();
631
+ const { parent, next } = this._originalPlace;
632
+ if (parent?.isConnected) parent.insertBefore(this.menuEl, next?.parentNode === parent ? next : null);
519
633
  }
520
634
  _makeMenuFocusable() {
521
635
  if (!this.menuEl) return;
522
- this.menuEl.popover = "";
523
- 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")) {
526
- el.setAttribute("tabindex", "-1");
636
+ this._keepAttribute(this.menuEl, "popover");
637
+ this.menuEl.popover = "manual";
638
+ this._setAttribute(this.menuEl, "tabindex", "-1");
639
+ this.menuEl.querySelectorAll(":scope li").forEach((el) => {
640
+ if (el.matches('.divider, .gap, .label, .optgroup, [role="none"]')) {
641
+ this._setAttribute(el, "tabindex", "-1");
527
642
  return;
528
643
  }
529
- if (!el.getAttribute("tabindex")) el.setAttribute("tabindex", "0");
644
+ if (!el.getAttribute("tabindex")) this._setAttribute(el, "tabindex", "0");
530
645
  });
531
646
  }
647
+ /**
648
+ * Moves focus for Up, Down, Home or End among the list's focusable rows,
649
+ * without wrapping, and says whether the key was one of those.
650
+ */
651
+ _moveFocus(list, e) {
652
+ const rows = this._rows(list);
653
+ const from = this._focusedRow(e) ?? list.children[this.focusedIndex];
654
+ const index = Utils._keyIndex(e.key, rows.indexOf(from), rows.length, STEPS);
655
+ if (Number.isNaN(index)) return false;
656
+ const row = rows[index];
657
+ if (row) {
658
+ this._focusRow(row);
659
+ row.classList.add("active");
660
+ }
661
+ return true;
662
+ }
663
+ /** The list's rows that take focus, in document order. */
664
+ _rows(list) {
665
+ return Array.from(list.querySelectorAll(ROWS)).filter(
666
+ (row) => row instanceof HTMLElement && row.tabIndex !== -1
667
+ );
668
+ }
532
669
  _focusInitialItem() {
533
670
  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
- );
671
+ const first = this._rows(this.menuEl)[0];
537
672
  if (!first) return;
538
- this.focusedIndex = Array.from(this.menuEl.children).indexOf(first);
673
+ this._clearActive();
674
+ this.focusedIndex = Array.from(first.parentElement.children).indexOf(first);
539
675
  first.focus({ preventScroll: true });
540
676
  }
541
677
  _focusFocusedItem() {
@@ -550,31 +686,27 @@ var _Menu = class _Menu extends Component {
550
686
  });
551
687
  }
552
688
  }
553
- _getMenuPosition(closestOverflowParent) {
689
+ /**
690
+ * Whether a measured menu opens upward: when there is no room below, or
691
+ * when placement 'top' asks for it and there is room above.
692
+ */
693
+ _opensUp(space) {
694
+ return space.top < 0 || this.options.placement === "top" && space.bottom >= 0;
695
+ }
696
+ _getMenuPosition() {
554
697
  const triggerBRect = this.el.getBoundingClientRect();
555
698
  const menuBRect = this.menuEl.getBoundingClientRect();
556
699
  let idealHeight = menuBRect.height;
557
700
  let idealWidth = menuBRect.width;
558
701
  let idealXPos = triggerBRect.left - menuBRect.left;
559
702
  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
- );
703
+ const space = room(this.el, menuBRect, this.options.coverTrigger ? 0 : triggerBRect.height);
572
704
  let verticalAlignment = "top";
573
705
  let horizontalAlignment = this.options.alignment;
574
706
  idealYPos += this.options.coverTrigger ? 0 : triggerBRect.height;
575
707
  this.isScrollable = false;
576
- if (!alignments.top) {
577
- if (alignments.bottom) {
708
+ if (this._opensUp(space)) {
709
+ if (space.bottom >= 0) {
578
710
  verticalAlignment = "bottom";
579
711
  if (!this.options.coverTrigger) {
580
712
  idealYPos -= triggerBRect.height;
@@ -582,27 +714,27 @@ var _Menu = class _Menu extends Component {
582
714
  } else {
583
715
  this.isScrollable = true;
584
716
  idealHeight -= 20;
585
- if (alignments.spaceOnTop > alignments.spaceOnBottom) {
717
+ if (space.bottom > space.top) {
586
718
  verticalAlignment = "bottom";
587
- idealHeight += alignments.spaceOnTop;
588
- idealYPos -= this.options.coverTrigger ? alignments.spaceOnTop - 20 : alignments.spaceOnTop - 20 + triggerBRect.height;
719
+ idealHeight += space.bottom;
720
+ idealYPos -= this.options.coverTrigger ? space.bottom - 20 : space.bottom - 20 + triggerBRect.height;
589
721
  } else {
590
- idealHeight += alignments.spaceOnBottom;
722
+ idealHeight += space.top;
591
723
  }
592
724
  }
593
725
  }
594
- if (!alignments[horizontalAlignment]) {
726
+ if (space[horizontalAlignment] < 0) {
595
727
  const oppositeAlignment = horizontalAlignment === "left" ? "right" : "left";
596
- if (alignments[oppositeAlignment]) {
728
+ if (space[oppositeAlignment] >= 0) {
597
729
  horizontalAlignment = oppositeAlignment;
598
730
  } else {
599
- if (alignments.spaceOnLeft > alignments.spaceOnRight) {
731
+ if (space.right > space.left) {
600
732
  horizontalAlignment = "right";
601
- idealWidth += alignments.spaceOnLeft;
602
- idealXPos -= alignments.spaceOnLeft;
733
+ idealWidth += space.right;
734
+ idealXPos -= space.right;
603
735
  } else {
604
736
  horizontalAlignment = "left";
605
- idealWidth += alignments.spaceOnRight;
737
+ idealWidth += space.left;
606
738
  }
607
739
  }
608
740
  }
@@ -635,6 +767,7 @@ var _Menu = class _Menu extends Component {
635
767
  }
636
768
  _animateIn() {
637
769
  const transition = this._transition;
770
+ const focusOnOpen = !this._openedByHover;
638
771
  const duration = this.options.inDuration;
639
772
  this.menuEl.style.transition = "none";
640
773
  this.menuEl.style.opacity = "0";
@@ -645,54 +778,71 @@ var _Menu = class _Menu extends Component {
645
778
  this.menuEl.style.transform = "scale(1)";
646
779
  }, 1);
647
780
  this._schedule(() => {
648
- this._focusInitialItem();
781
+ if (focusOnOpen) this._focusInitialItem();
649
782
  if (transition !== this._transition) return;
650
- if (typeof this.options.onOpenEnd === "function") this.options.onOpenEnd.call(this, this.el);
783
+ this._notify("opened", this.options.onOpenEnd, { current: () => transition === this._transition });
651
784
  }, duration);
652
785
  }
653
786
  _animateOut() {
787
+ const transition = this._transition;
654
788
  const duration = this.options.outDuration;
655
789
  this.menuEl.style.transition = `opacity ${duration}ms ease, transform ${duration}ms ease`;
656
790
  this.menuEl.style.opacity = "0";
657
791
  this.menuEl.style.transform = "scale(0.85)";
658
792
  this._schedule(() => {
659
793
  this._resetMenuStyles();
660
- if (typeof this.options.onCloseEnd === "function")
661
- this.options.onCloseEnd.call(this, this.el);
794
+ this._notify("closed", this.options.onCloseEnd, { current: () => transition === this._transition });
662
795
  }, duration);
663
796
  }
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
797
  _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
798
  const natural = this.menuEl.getBoundingClientRect().width;
688
799
  const triggerWidth = this.el.getBoundingClientRect().width;
689
800
  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
801
  this.menuEl.style.width = idealWidth + "px";
691
802
  if (this.options.contextMenu) {
692
- this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner(), closestOverflowParent);
803
+ this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner());
693
804
  return;
694
805
  }
695
- const positionInfo = this._getMenuPosition(closestOverflowParent);
806
+ if (anchorSupported && !this.options.coverTrigger && !transformed(this.el)) this._anchorMenu();
807
+ else this._placeByCoordinates();
808
+ }
809
+ /**
810
+ * The side an anchored menu opens on: the one asked for when the whole
811
+ * menu fits there, or else the roomier one. The anchored height is capped
812
+ * to its side, so a menu that would only shrink never sets off the
813
+ * flip-block fallback, and the choice is made here.
814
+ */
815
+ _side() {
816
+ const rect = this.el.getBoundingClientRect();
817
+ const room2 = { top: rect.top, bottom: window.innerHeight - rect.bottom };
818
+ const [asked, other] = this.options.placement === "top" ? ["top", "bottom"] : ["bottom", "top"];
819
+ return room2[asked] >= this.menuEl.scrollHeight || room2[asked] >= room2[other] ? asked : other;
820
+ }
821
+ _anchorMenu() {
822
+ const name = `--menu-${this.menuEl.id}`;
823
+ Utils.setAnchorName(this.el, name, true);
824
+ const style = this.menuEl.style;
825
+ style.position = "fixed";
826
+ style.inset = "auto";
827
+ style.maxHeight = "100%";
828
+ style.setProperty("position-anchor", name);
829
+ this._placeAnchored();
830
+ }
831
+ _stopReanchoring() {
832
+ cancelAnimationFrame(this._reanchorFrame);
833
+ this._reanchorFrame = 0;
834
+ }
835
+ /** The anchored menu's side, the edge it starts from and its growth origin. */
836
+ _placeAnchored() {
837
+ const style = this.menuEl.style;
838
+ const [side, edge] = [this._side(), this.options.alignment === "right" ? "left" : "right"];
839
+ style.setProperty("position-area", `${side} span-${edge}`);
840
+ style.setProperty("position-try-fallbacks", "flip-block, flip-inline, flip-block flip-inline");
841
+ style.transformOrigin = `${edge === "left" ? "100%" : "0"} ${side === "top" ? "100%" : "0"}`;
842
+ this.isScrollable = this.menuEl.scrollHeight > this.menuEl.clientHeight;
843
+ }
844
+ _placeByCoordinates() {
845
+ const positionInfo = this._getMenuPosition();
696
846
  this.menuEl.style.left = positionInfo.x + "px";
697
847
  this.menuEl.style.top = positionInfo.y + "px";
698
848
  this.menuEl.style.height = positionInfo.height + "px";
@@ -708,30 +858,20 @@ var _Menu = class _Menu extends Component {
708
858
  /**
709
859
  * Places a context menu with its start corner on the point, flipping to
710
860
  * 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.
861
+ * viewport; a menu taller than it gets its height and scrolls.
713
862
  *
714
863
  * The menu rests at left/top 0 of its containing block, so its rect is the
715
864
  * offset to subtract - the same trick _getMenuPosition uses. It is measured
716
865
  * without the entry animation's scale, which a second right-click can catch.
717
866
  */
718
- _placeMenuAtPoint({ x, y }, container) {
867
+ _placeMenuAtPoint({ x, y }) {
719
868
  const { transform, transition } = this.menuEl.style;
720
869
  this.menuEl.style.transition = "none";
721
870
  this.menuEl.style.transform = "none";
722
871
  const menu = this.menuEl.getBoundingClientRect();
723
872
  this.menuEl.style.transform = transform;
724
873
  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
- }
874
+ const bounds = { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight };
735
875
  const width = menu.width;
736
876
  const height = Math.min(menu.height, bounds.bottom - bounds.top);
737
877
  this.isScrollable = height < menu.height;
@@ -751,11 +891,16 @@ var _Menu = class _Menu extends Component {
751
891
  _setExpanded(expanded) {
752
892
  if (!this.options.contextMenu) this.el.ariaExpanded = String(expanded);
753
893
  }
894
+ // A trigger whose target never resolved has no menu to open.
895
+ get _canOpen() {
896
+ return !this.isOpen && !!this.menuEl && _Menu.getInstance(this.el) === this;
897
+ }
754
898
  };
755
899
  _Menu._menus = [];
900
+ _Menu.key = "Expressive_Menu";
756
901
  var Menu = _Menu;
757
902
 
758
903
  export {
759
904
  Menu
760
905
  };
761
- //# sourceMappingURL=chunk-NUHMOAOY.mjs.map
906
+ //# sourceMappingURL=chunk-DWA5UYLJ.mjs.map