@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.
- package/CHANGELOG.md +1807 -1
- package/README.md +9 -8
- package/dist/css/expressive.css +19176 -11958
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
- package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
- package/dist/fonts/LICENSE-noto-sans-thai +93 -0
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-greek-400.woff2 +0 -0
- package/dist/fonts/roboto-greek-500.woff2 +0 -0
- package/dist/fonts/roboto-greek-700.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-latin-700.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
- package/dist/js/chunks/chunk-26VUH75M.mjs +102 -0
- package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
- package/dist/js/chunks/chunk-2LFCOGC3.mjs +233 -0
- package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-36GELQGX.mjs} +29 -46
- package/dist/js/chunks/chunk-36GELQGX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-3FKWIRHW.mjs} +15 -29
- package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
- package/dist/js/chunks/chunk-3KF65KGL.mjs +209 -0
- package/dist/js/chunks/chunk-3KF65KGL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-3KLZRQZI.mjs} +88 -116
- package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-3XORNED5.mjs} +3 -11
- package/dist/js/chunks/chunk-3XORNED5.mjs.map +7 -0
- package/dist/js/chunks/chunk-4WBGAQN3.mjs +113 -0
- package/dist/js/chunks/chunk-4WBGAQN3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-5F4URJHL.mjs} +19 -30
- package/dist/js/chunks/chunk-5F4URJHL.mjs.map +7 -0
- package/dist/js/chunks/chunk-67UNY7RH.mjs +299 -0
- package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
- package/dist/js/chunks/chunk-7CXNATJS.mjs +97 -0
- package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-7X44MKEQ.mjs} +43 -48
- package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
- package/dist/js/chunks/chunk-7ZAMOMGY.mjs +440 -0
- package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
- package/dist/js/chunks/chunk-AEG6LOAJ.mjs +54 -0
- package/dist/js/chunks/chunk-AEG6LOAJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-AQNFCJJ5.mjs +135 -0
- package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
- package/dist/js/chunks/chunk-B55LWKBM.mjs +75 -0
- package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
- package/dist/js/chunks/chunk-BB5VXYXT.mjs +28 -0
- package/dist/js/chunks/chunk-BB5VXYXT.mjs.map +7 -0
- package/dist/js/chunks/chunk-BDATLH3H.mjs +108 -0
- package/dist/js/chunks/chunk-BDATLH3H.mjs.map +7 -0
- package/dist/js/chunks/chunk-CWMQOT4O.mjs +232 -0
- package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
- package/dist/js/chunks/chunk-CY2CTOVM.mjs +81 -0
- package/dist/js/chunks/chunk-CY2CTOVM.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-DWA5UYLJ.mjs} +363 -218
- package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-EB2V4OKL.mjs +79 -0
- package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
- package/dist/js/chunks/chunk-EWO662ZC.mjs +188 -0
- package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-F7LAKFMX.mjs} +320 -141
- package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-FNIIH2LU.mjs} +20 -33
- package/dist/js/chunks/chunk-FNIIH2LU.mjs.map +7 -0
- package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
- package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
- package/dist/js/chunks/chunk-GFWYMWYN.mjs +125 -0
- package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
- package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
- package/dist/js/chunks/chunk-H5ISU45X.mjs +87 -0
- package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-H6YIKFAQ.mjs} +311 -186
- package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-HEH7E3KO.mjs} +155 -35
- package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
- package/dist/js/chunks/chunk-HQRLBTNM.mjs +152 -0
- package/dist/js/chunks/chunk-HQRLBTNM.mjs.map +7 -0
- package/dist/js/chunks/chunk-I2F7MLUU.mjs +137 -0
- package/dist/js/chunks/chunk-I2F7MLUU.mjs.map +7 -0
- package/dist/js/chunks/chunk-IQOTGGHX.mjs +797 -0
- package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
- package/dist/js/chunks/chunk-JH3YWKA6.mjs +225 -0
- package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
- package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
- package/dist/js/chunks/chunk-JOLJAYIJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-KOTGMCMI.mjs} +116 -24
- package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-LC4O5LFS.mjs} +21 -45
- package/dist/js/chunks/chunk-LC4O5LFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-LEF33SCP.mjs +127 -0
- package/dist/js/chunks/chunk-LEF33SCP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-LFORZRPH.mjs} +21 -23
- package/dist/js/chunks/chunk-LFORZRPH.mjs.map +7 -0
- package/dist/js/chunks/chunk-LWLNV5EC.mjs +451 -0
- package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
- package/dist/js/chunks/chunk-LXRHUQAX.mjs +491 -0
- package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-MA2SZZFB.mjs} +82 -111
- package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
- package/dist/js/chunks/chunk-MDBZAMIV.mjs +121 -0
- package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
- package/dist/js/chunks/chunk-NODZ5VAD.mjs +75 -0
- package/dist/js/chunks/chunk-NODZ5VAD.mjs.map +7 -0
- package/dist/js/chunks/chunk-O2WJB6TH.mjs +365 -0
- package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
- package/dist/js/chunks/chunk-PCABY5BN.mjs +35 -0
- package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
- package/dist/js/chunks/chunk-PWKYVMND.mjs +120 -0
- package/dist/js/chunks/chunk-PWKYVMND.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-QHZZT7YO.mjs} +66 -38
- package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
- package/dist/js/chunks/chunk-QND56EW2.mjs +439 -0
- package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
- package/dist/js/chunks/chunk-QNODAANY.mjs +376 -0
- package/dist/js/chunks/chunk-QNODAANY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-QRO5FV3I.mjs} +156 -73
- package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
- package/dist/js/chunks/chunk-R7A7JRC5.mjs +440 -0
- package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
- package/dist/js/chunks/chunk-RKG2CBFE.mjs +74 -0
- package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-RSNS5OYS.mjs} +38 -25
- package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-RUDYMEJ3.mjs} +7 -6
- package/dist/js/chunks/chunk-RUDYMEJ3.mjs.map +7 -0
- package/dist/js/chunks/chunk-STJR62SU.mjs +161 -0
- package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
- package/dist/js/chunks/chunk-SUSD4UTN.mjs +220 -0
- package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
- package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-SYBOA5HC.mjs} +26 -48
- package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
- package/dist/js/chunks/chunk-T4MOBP3J.mjs +108 -0
- package/dist/js/chunks/chunk-T4MOBP3J.mjs.map +7 -0
- package/dist/js/chunks/chunk-TM7HPGTV.mjs +342 -0
- package/dist/js/chunks/chunk-TM7HPGTV.mjs.map +7 -0
- package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-TMQDZSDC.mjs} +71 -35
- package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
- package/dist/js/chunks/chunk-TVSX5YA2.mjs +48 -0
- package/dist/js/chunks/chunk-TVSX5YA2.mjs.map +7 -0
- package/dist/js/chunks/chunk-UHO5CV6K.mjs +80 -0
- package/dist/js/chunks/chunk-UHO5CV6K.mjs.map +7 -0
- package/dist/js/chunks/chunk-UKCNELUN.mjs +223 -0
- package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
- package/dist/js/chunks/chunk-UKQK5GWR.mjs +167 -0
- package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-UTSLYQ65.mjs} +21 -48
- package/dist/js/chunks/chunk-UTSLYQ65.mjs.map +7 -0
- package/dist/js/chunks/chunk-VS5OJBOD.mjs +108 -0
- package/dist/js/chunks/chunk-VS5OJBOD.mjs.map +7 -0
- package/dist/js/chunks/chunk-VZMROW5A.mjs +759 -0
- package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
- package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
- package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
- package/dist/js/chunks/chunk-XB6Y7P5W.mjs +69 -0
- package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
- package/dist/js/chunks/chunk-XDAMOMVD.mjs +226 -0
- package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-XJPMW5SP.mjs} +247 -172
- package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-YKANQILZ.mjs} +16 -21
- package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-YLZOJLDI.mjs +175 -0
- package/dist/js/chunks/chunk-YLZOJLDI.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZK7YY322.mjs +514 -0
- package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
- package/dist/js/expressive.cjs +10266 -3628
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +10266 -3628
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +23 -22
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +181 -69
- package/dist/js/expressive.mjs.map +2 -2
- package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
- package/dist/js/internal/behaviors/copy.mjs +9 -0
- package/dist/js/internal/behaviors/copy.mjs.map +7 -0
- package/dist/js/internal/behaviors/dataTables.mjs +8 -0
- package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
- package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
- package/dist/js/internal/behaviors/lists.mjs +8 -0
- package/dist/js/internal/behaviors/lists.mjs.map +7 -0
- package/dist/js/internal/behaviors/paneResize.mjs +8 -0
- package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
- package/dist/js/internal/behaviors/sortable.mjs +8 -0
- package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
- package/dist/js/internal/behaviors/theme.mjs +8 -0
- package/dist/js/internal/behaviors/theme.mjs.map +7 -0
- package/dist/js/internal/behaviors/tour.mjs +8 -0
- package/dist/js/internal/behaviors/tour.mjs.map +7 -0
- package/dist/js/internal/behaviors/transferList.mjs +8 -0
- package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
- package/dist/js/internal/components/appBar.mjs +3 -2
- package/dist/js/internal/components/autocomplete.mjs +5 -4
- package/dist/js/internal/components/backToTop.mjs +9 -0
- package/dist/js/internal/components/backToTop.mjs.map +7 -0
- package/dist/js/internal/components/barChart.mjs +5 -4
- package/dist/js/internal/components/buttonGroup.mjs +3 -2
- package/dist/js/internal/components/buttons.mjs +3 -3
- package/dist/js/internal/components/cards.mjs +3 -3
- package/dist/js/internal/components/carousel.mjs +3 -3
- package/dist/js/internal/components/cascader.mjs +10 -0
- package/dist/js/internal/components/cascader.mjs.map +7 -0
- package/dist/js/internal/components/characterCounter.mjs +3 -2
- package/dist/js/internal/components/chips.mjs +7 -5
- package/dist/js/internal/components/colorPicker.mjs +9 -0
- package/dist/js/internal/components/colorPicker.mjs.map +7 -0
- package/dist/js/internal/components/columnChart.mjs +4 -3
- package/dist/js/internal/components/commandPalette.mjs +3 -3
- package/dist/js/internal/components/confetti.mjs +3 -2
- package/dist/js/internal/components/currencyInput.mjs +9 -0
- package/dist/js/internal/components/currencyInput.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +12 -8
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/funnelChart.mjs +10 -0
- package/dist/js/internal/components/funnelChart.mjs.map +7 -0
- package/dist/js/internal/components/heatmapChart.mjs +4 -3
- package/dist/js/internal/components/hoverCard.mjs +9 -0
- package/dist/js/internal/components/hoverCard.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +131 -65
- package/dist/js/internal/components/inputMask.mjs +9 -0
- package/dist/js/internal/components/inputMask.mjs.map +7 -0
- package/dist/js/internal/components/keypad.mjs +3 -3
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/lineChart.mjs +41 -4
- package/dist/js/internal/components/loadingOverlay.mjs +9 -0
- package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
- package/dist/js/internal/components/mapView.mjs +3 -3
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/menubar.mjs +10 -0
- package/dist/js/internal/components/menubar.mjs.map +7 -0
- package/dist/js/internal/components/messageScroller.mjs +3 -3
- package/dist/js/internal/components/mixedChart.mjs +5 -4
- package/dist/js/internal/components/navigationRail.mjs +3 -2
- package/dist/js/internal/components/particles.mjs +3 -2
- package/dist/js/internal/components/pieChart.mjs +4 -3
- package/dist/js/internal/components/pullToRefresh.mjs +9 -0
- package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
- package/dist/js/internal/components/questionnaire.mjs +3 -3
- package/dist/js/internal/components/radarChart.mjs +4 -3
- package/dist/js/internal/components/radialChart.mjs +4 -3
- package/dist/js/internal/components/registry.mjs +60 -41
- package/dist/js/internal/components/richTextEditor.mjs +3 -3
- package/dist/js/internal/components/sankeyChart.mjs +10 -0
- package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
- package/dist/js/internal/components/scatterChart.mjs +10 -0
- package/dist/js/internal/components/scatterChart.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +3 -2
- package/dist/js/internal/components/select.mjs +5 -4
- package/dist/js/internal/components/showMore.mjs +9 -0
- package/dist/js/internal/components/showMore.mjs.map +7 -0
- package/dist/js/internal/components/slider.mjs +3 -3
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/swipeActions.mjs +9 -0
- package/dist/js/internal/components/swipeActions.mjs.map +7 -0
- package/dist/js/internal/components/tabs.mjs +3 -4
- package/dist/js/internal/components/timepicker.mjs +5 -4
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/components/treeSelect.mjs +14 -0
- package/dist/js/internal/components/treeSelect.mjs.map +7 -0
- package/dist/js/internal/components/treemapChart.mjs +10 -0
- package/dist/js/internal/components/treemapChart.mjs.map +7 -0
- package/dist/js/internal/core/component.mjs +6 -3
- package/dist/js/internal/core/formControl.mjs +12 -0
- package/dist/js/internal/core/formControl.mjs.map +7 -0
- package/dist/js/internal/core/imageURL.mjs +7 -0
- package/dist/js/internal/core/imageURL.mjs.map +7 -0
- package/dist/js/internal/core/spring.mjs +11 -0
- package/dist/js/internal/core/spring.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +21 -3
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
- package/dist/js/modular.mjs +172 -69
- package/dist/types/behaviors/bottomSheets.d.ts +23 -5
- package/dist/types/behaviors/copy.d.ts +18 -0
- package/dist/types/behaviors/dataTables.d.ts +125 -0
- package/dist/types/behaviors/dialogs.d.ts +27 -1
- package/dist/types/behaviors/forms.d.ts +70 -4
- package/dist/types/behaviors/imageCompare.d.ts +13 -0
- package/dist/types/behaviors/lists.d.ts +12 -0
- package/dist/types/behaviors/paneResize.d.ts +29 -0
- package/dist/types/behaviors/sheetDrag.d.ts +18 -0
- package/dist/types/behaviors/sideSheets.d.ts +1 -1
- package/dist/types/behaviors/sortable.d.ts +28 -0
- package/dist/types/behaviors/theme.d.ts +22 -0
- package/dist/types/behaviors/tour.d.ts +36 -0
- package/dist/types/behaviors/transferList.d.ts +53 -0
- package/dist/types/components/appBar.d.ts +5 -6
- package/dist/types/components/autocomplete.d.ts +105 -20
- package/dist/types/components/backToTop.d.ts +36 -0
- package/dist/types/components/barChart.d.ts +3 -6
- package/dist/types/components/buttonGroup.d.ts +2 -4
- package/dist/types/components/buttons.d.ts +5 -5
- package/dist/types/components/cards.d.ts +3 -16
- package/dist/types/components/carousel.d.ts +16 -15
- package/dist/types/components/cascader.d.ts +130 -0
- package/dist/types/components/characterCounter.d.ts +2 -15
- package/dist/types/components/chips.d.ts +80 -19
- package/dist/types/components/colorPicker.d.ts +56 -0
- package/dist/types/components/columnChart.d.ts +23 -10
- package/dist/types/components/commandPalette.d.ts +11 -16
- package/dist/types/components/confetti.d.ts +2 -4
- package/dist/types/components/currencyInput.d.ts +60 -0
- package/dist/types/components/datepicker.d.ts +107 -56
- package/dist/types/components/expandingCard.d.ts +4 -6
- package/dist/types/components/funnelChart.d.ts +35 -0
- package/dist/types/components/heatmapChart.d.ts +42 -8
- package/dist/types/components/hoverCard.d.ts +59 -0
- package/dist/types/components/index.d.ts +16 -1
- package/dist/types/components/inputMask.d.ts +28 -0
- package/dist/types/components/keypad.d.ts +38 -6
- package/dist/types/components/lightbox.d.ts +14 -20
- package/dist/types/components/lineChart.d.ts +212 -12
- package/dist/types/components/loadingOverlay.d.ts +42 -0
- package/dist/types/components/mapView.d.ts +138 -27
- package/dist/types/components/menu.d.ts +74 -22
- package/dist/types/components/menubar.d.ts +37 -0
- package/dist/types/components/messageScroller.d.ts +2 -14
- package/dist/types/components/mixedChart.d.ts +15 -6
- package/dist/types/components/navigationRail.d.ts +16 -5
- package/dist/types/components/particles.d.ts +22 -5
- package/dist/types/components/pieChart.d.ts +33 -9
- package/dist/types/components/pullToRefresh.d.ts +80 -0
- package/dist/types/components/questionnaire.d.ts +58 -16
- package/dist/types/components/radarChart.d.ts +10 -6
- package/dist/types/components/radialChart.d.ts +58 -7
- package/dist/types/components/registry.d.ts +73 -3
- package/dist/types/components/richTextEditor.d.ts +45 -22
- package/dist/types/components/sankeyChart.d.ts +72 -0
- package/dist/types/components/scatterChart.d.ts +102 -0
- package/dist/types/components/scrollspy.d.ts +3 -5
- package/dist/types/components/select.d.ts +44 -33
- package/dist/types/components/showMore.d.ts +53 -0
- package/dist/types/components/slider.d.ts +2 -15
- package/dist/types/components/snackbar.d.ts +68 -1
- package/dist/types/components/swipeActions.d.ts +81 -0
- package/dist/types/components/tabs.d.ts +92 -30
- package/dist/types/components/timepicker.d.ts +128 -27
- package/dist/types/components/tooltip.d.ts +57 -21
- package/dist/types/components/treeSelect.d.ts +106 -0
- package/dist/types/components/treemapChart.d.ts +56 -0
- package/dist/types/core/component.d.ts +49 -25
- package/dist/types/core/formControl.d.ts +21 -0
- package/dist/types/core/imageURL.d.ts +2 -0
- package/dist/types/core/spring.d.ts +20 -0
- package/dist/types/core/utils.d.ts +123 -72
- package/dist/types/modular.d.ts +33 -1
- package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
- package/dist/types/plugins/modalDisplayPlugin.d.ts +39 -0
- package/package.json +17 -13
- package/src/sass/README.md +27 -18
- package/src/sass/abstracts/_elevation.scss +13 -7
- package/src/sass/abstracts/_index.scss +1 -0
- package/src/sass/abstracts/_mixins.scss +864 -78
- package/src/sass/abstracts/_spring.scss +63 -0
- package/src/sass/abstracts/_variables.scss +64 -21
- package/src/sass/base/_fonts.scss +61 -48
- package/src/sass/base/_global.scss +104 -24
- package/src/sass/base/_index.scss +2 -0
- package/src/sass/base/_normalize.scss +59 -114
- package/src/sass/base/_print.scss +21 -0
- package/src/sass/base/_prose.scss +68 -0
- package/src/sass/base/_typography.scss +9 -5
- package/src/sass/components/_accordion.scss +10 -19
- package/src/sass/components/_alert.scss +102 -0
- package/src/sass/components/_aura.scss +9 -3
- package/src/sass/components/_avatar.scss +3 -3
- package/src/sass/components/_back-to-top.scss +38 -0
- package/src/sass/components/_badges.scss +6 -5
- package/src/sass/components/_bar-chart.scss +31 -90
- package/src/sass/components/_bottom-sheet.scss +51 -16
- package/src/sass/components/_breadcrumb.scss +8 -7
- package/src/sass/components/_button-groups.scss +30 -63
- package/src/sass/components/_buttons.scss +137 -94
- package/src/sass/components/_calendar.scss +244 -0
- package/src/sass/components/_cards.scss +36 -44
- package/src/sass/components/_carousel.scss +37 -113
- package/src/sass/components/_cascader.scss +131 -0
- package/src/sass/components/_chips.scss +36 -46
- package/src/sass/components/_column-chart.scss +15 -26
- package/src/sass/components/_command-palette.scss +4 -7
- package/src/sass/components/_confetti.scss +1 -4
- package/src/sass/components/_countdown.scss +1 -1
- package/src/sass/components/_data-table.scss +172 -25
- package/src/sass/components/_datepicker.scss +54 -40
- package/src/sass/components/_description-list.scss +85 -0
- package/src/sass/components/_dialog.scss +48 -55
- package/src/sass/components/_docked-display.scss +1 -3
- package/src/sass/components/_drag-handle.scss +16 -20
- package/src/sass/components/_expanding-card.scss +21 -14
- package/src/sass/components/_fab-menu.scss +43 -39
- package/src/sass/components/_funnel-chart.scss +63 -0
- package/src/sass/components/_heatmap-chart.scss +114 -29
- package/src/sass/components/_icon-buttons.scss +8 -11
- package/src/sass/components/_icons-material-design.scss +2 -2
- package/src/sass/components/_image-compare.scss +108 -0
- package/src/sass/components/_index.scss +20 -0
- package/src/sass/components/_keypad.scss +39 -19
- package/src/sass/components/_kpi.scss +6 -11
- package/src/sass/components/_lightbox.scss +24 -13
- package/src/sass/components/_line-chart.scss +9 -63
- package/src/sass/components/_list.scss +59 -14
- package/src/sass/components/_loading-indicator.scss +1 -0
- package/src/sass/components/_loading-overlay.scss +105 -0
- package/src/sass/components/_map.scss +37 -11
- package/src/sass/components/_marquee.scss +4 -3
- package/src/sass/components/_mega-menu.scss +128 -0
- package/src/sass/components/_menu.scss +146 -127
- package/src/sass/components/_menubar.scss +47 -0
- package/src/sass/components/_message-scroller.scss +2 -2
- package/src/sass/components/_message.scss +3 -3
- package/src/sass/components/_mixed-chart.scss +27 -35
- package/src/sass/components/_modal-display.scss +21 -0
- package/src/sass/components/_navbar.scss +45 -36
- package/src/sass/components/_navigation-bar.scss +12 -77
- package/src/sass/components/_navigation-rail.scss +161 -92
- package/src/sass/components/_org-chart.scss +192 -0
- package/src/sass/components/_page-footer.scss +2 -4
- package/src/sass/components/_pagination.scss +9 -27
- package/src/sass/components/_panes.scss +35 -42
- package/src/sass/components/_particles.scss +1 -4
- package/src/sass/components/_pie-chart.scss +86 -68
- package/src/sass/components/_popover.scss +18 -5
- package/src/sass/components/_progress.scss +183 -44
- package/src/sass/components/_pull-to-refresh.scss +90 -0
- package/src/sass/components/_questionnaire.scss +74 -3
- package/src/sass/components/_radar-chart.scss +40 -42
- package/src/sass/components/_radial-chart.scss +108 -46
- package/src/sass/components/_rich-text-editor.scss +2 -2
- package/src/sass/components/_sankey-chart.scss +91 -0
- package/src/sass/components/_scatter-chart.scss +144 -0
- package/src/sass/components/_scrim.scss +0 -2
- package/src/sass/components/_scrollspy.scss +0 -2
- package/src/sass/components/_search.scss +27 -26
- package/src/sass/components/_show-more.scss +8 -0
- package/src/sass/components/_side-sheet.scss +32 -51
- package/src/sass/components/_skeleton.scss +26 -19
- package/src/sass/components/_snackbar.scss +25 -21
- package/src/sass/components/_split-button.scss +5 -5
- package/src/sass/components/_stat.scss +3 -8
- package/src/sass/components/_stepper.scss +1 -1
- package/src/sass/components/_swipe-actions.scss +71 -0
- package/src/sass/components/_table_of_contents.scss +1 -3
- package/src/sass/components/_tabs.scss +49 -46
- package/src/sass/components/_timeline.scss +12 -12
- package/src/sass/components/_timepicker.scss +111 -79
- package/src/sass/components/_toolbar.scss +36 -47
- package/src/sass/components/_tooltip.scss +25 -12
- package/src/sass/components/_tour.scss +89 -0
- package/src/sass/components/_transfer-list.scss +73 -0
- package/src/sass/components/_transitions.scss +4 -4
- package/src/sass/components/_tree.scss +7 -32
- package/src/sass/components/_treemap-chart.scss +98 -0
- package/src/sass/components/forms/_checkboxes.scss +107 -44
- package/src/sass/components/forms/_color-picker.scss +135 -0
- package/src/sass/components/forms/_color-swatches.scss +85 -0
- package/src/sass/components/forms/_drop-zone.scss +16 -13
- package/src/sass/components/forms/_fieldset.scss +4 -7
- package/src/sass/components/forms/_file-input.scss +12 -8
- package/src/sass/components/forms/_index.scss +3 -1
- package/src/sass/components/forms/_input-fields.scss +271 -90
- package/src/sass/components/forms/_radio-buttons.scss +34 -117
- package/src/sass/components/forms/_rating.scss +2 -32
- package/src/sass/components/forms/_select.scss +198 -20
- package/src/sass/components/forms/_slider.scss +92 -98
- package/src/sass/components/forms/_switches.scss +62 -180
- package/src/sass/custom.scss +10 -1
- package/src/sass/expressive.scss +3 -63
- package/src/sass/tokens/_contrast.scss +94 -0
- package/src/sass/tokens/_elevation.scss +16 -0
- package/src/sass/tokens/_index.scss +5 -0
- package/src/sass/tokens/_motion.scss +109 -0
- package/src/sass/tokens/_reference.scss +72 -141
- package/src/sass/tokens/_shape.scss +38 -0
- package/src/sass/tokens/_stacking.scss +27 -0
- package/src/sass/tokens/_state.scss +0 -2
- package/src/sass/tokens/_theme.scss +10 -1
- package/src/sass/tokens/_vibrant.scss +2 -5
- package/src/sass/utilities/_defer-render.scss +17 -0
- package/src/sass/utilities/_helpers.scss +184 -27
- package/src/sass/utilities/_index.scss +1 -0
- package/src/sass/utilities/_scroll-area.scss +0 -2
- package/src/sass/utilities/_spacing.scss +52 -34
- package/src/sass/utilities/_typescale.scss +8 -1
- package/src/sass/utilities/_visibility.scss +46 -77
- package/src/sass/utilities/_z-depth.scss +7 -4
- package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
- package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
- package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
- package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
- package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
- package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
- package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
- package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
- package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
- package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
- package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
- package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
- package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
- package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
- package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
- package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
- package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
- package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
- package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
- package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
- package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
- package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
- package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
- package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
- package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
- package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
- package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
- package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
- package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
- package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
- package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
- package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
- package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
- package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
- package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
- package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
- package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
- package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
- package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
- package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
- package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
- package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
- package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
- package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
- package/dist/js/chunks/chunk-UAZSDUVP.mjs +0 -90
- package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
- package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
- package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
- package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
- package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
- package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
- package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
- package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
- package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
- package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
- package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
- package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
- package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
- package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
- package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
- package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
- package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
- package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
- package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
- /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-
|
|
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,
|
|
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 (
|
|
83
|
-
|
|
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 (
|
|
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
|
-
|
|
106
|
-
|
|
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
|
|
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 ||
|
|
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 ?
|
|
149
|
-
const backKey = rtl ?
|
|
150
|
-
if ([openKey, backKey,
|
|
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
|
-
|
|
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 (
|
|
243
|
+
} else if (this._moveFocus(list, e)) {
|
|
179
244
|
e.preventDefault();
|
|
180
|
-
|
|
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
|
-
|
|
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 =
|
|
227
|
-
(el) =>
|
|
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.
|
|
322
|
+
if (!this._canOpen) return;
|
|
249
323
|
const transition = this._clearPendingTimers();
|
|
250
324
|
this.isOpen = true;
|
|
251
|
-
if (
|
|
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.
|
|
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 (
|
|
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.
|
|
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
|
|
317
|
-
if (!this.el.hasAttribute("aria-haspopup")) this.el
|
|
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
|
|
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.
|
|
349
|
-
this.
|
|
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
|
-
|
|
411
|
+
super.destroy();
|
|
353
412
|
}
|
|
354
413
|
_setupEventHandlers() {
|
|
355
|
-
|
|
356
|
-
this.
|
|
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.
|
|
421
|
+
this.el.addEventListener("contextmenu", this._handleContextMenu, { signal });
|
|
376
422
|
} else if (this.options.hover) {
|
|
377
|
-
this.el.
|
|
378
|
-
this.el.
|
|
379
|
-
this.menuEl
|
|
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.
|
|
427
|
+
this.el.addEventListener("click", this._handleClick, { signal });
|
|
382
428
|
}
|
|
383
429
|
}
|
|
384
430
|
_setupTemporaryEventHandlers() {
|
|
385
|
-
|
|
386
|
-
this.
|
|
387
|
-
|
|
388
|
-
|
|
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
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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
|
|
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"))
|
|
499
|
+
if (!menu.hasAttribute("role")) this._setAttribute(menu, "role", "menu");
|
|
408
500
|
if (menu.getAttribute("role") !== "menu") return;
|
|
409
|
-
menu.querySelectorAll(
|
|
501
|
+
menu.querySelectorAll(ROWS).forEach((li) => {
|
|
410
502
|
if (li.classList.contains("divider")) {
|
|
411
|
-
if (!li.hasAttribute("role"))
|
|
503
|
+
if (!li.hasAttribute("role")) this._setAttribute(li, "role", "separator");
|
|
412
504
|
return;
|
|
413
505
|
}
|
|
414
506
|
if (li.classList.contains("gap")) {
|
|
415
|
-
|
|
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"))
|
|
511
|
+
if (!li.hasAttribute("role")) this._setAttribute(li, "role", "presentation");
|
|
420
512
|
return;
|
|
421
513
|
}
|
|
422
|
-
if (!li.hasAttribute("role"))
|
|
514
|
+
if (!li.hasAttribute("role")) this._setAttribute(li, "role", "menuitem");
|
|
423
515
|
if (li.classList.contains("disabled") && !li.hasAttribute("aria-disabled")) {
|
|
424
|
-
|
|
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
|
-
|
|
442
|
-
|
|
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.
|
|
488
|
-
|
|
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.
|
|
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(
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
this.
|
|
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
|
|
523
|
-
this.menuEl.
|
|
524
|
-
this.menuEl
|
|
525
|
-
|
|
526
|
-
|
|
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"))
|
|
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 =
|
|
535
|
-
(child) => child instanceof HTMLElement && child.tabIndex !== -1
|
|
536
|
-
);
|
|
671
|
+
const first = this._rows(this.menuEl)[0];
|
|
537
672
|
if (!first) return;
|
|
538
|
-
this.
|
|
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
|
-
|
|
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
|
|
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 (
|
|
577
|
-
if (
|
|
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 (
|
|
717
|
+
if (space.bottom > space.top) {
|
|
586
718
|
verticalAlignment = "bottom";
|
|
587
|
-
idealHeight +=
|
|
588
|
-
idealYPos -= this.options.coverTrigger ?
|
|
719
|
+
idealHeight += space.bottom;
|
|
720
|
+
idealYPos -= this.options.coverTrigger ? space.bottom - 20 : space.bottom - 20 + triggerBRect.height;
|
|
589
721
|
} else {
|
|
590
|
-
idealHeight +=
|
|
722
|
+
idealHeight += space.top;
|
|
591
723
|
}
|
|
592
724
|
}
|
|
593
725
|
}
|
|
594
|
-
if (
|
|
726
|
+
if (space[horizontalAlignment] < 0) {
|
|
595
727
|
const oppositeAlignment = horizontalAlignment === "left" ? "right" : "left";
|
|
596
|
-
if (
|
|
728
|
+
if (space[oppositeAlignment] >= 0) {
|
|
597
729
|
horizontalAlignment = oppositeAlignment;
|
|
598
730
|
} else {
|
|
599
|
-
if (
|
|
731
|
+
if (space.right > space.left) {
|
|
600
732
|
horizontalAlignment = "right";
|
|
601
|
-
idealWidth +=
|
|
602
|
-
idealXPos -=
|
|
733
|
+
idealWidth += space.right;
|
|
734
|
+
idealXPos -= space.right;
|
|
603
735
|
} else {
|
|
604
736
|
horizontalAlignment = "left";
|
|
605
|
-
idealWidth +=
|
|
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
|
-
|
|
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
|
-
|
|
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()
|
|
803
|
+
this._placeMenuAtPoint(this._contextPoint ?? this._regionCorner());
|
|
693
804
|
return;
|
|
694
805
|
}
|
|
695
|
-
|
|
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
|
|
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 }
|
|
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
|
-
|
|
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-
|
|
906
|
+
//# sourceMappingURL=chunk-DWA5UYLJ.mjs.map
|