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