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