@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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/timepicker.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils, controllerFor, pickerFooter, svgNode } from '../core/utils';\nimport { Component, BaseOptions, I18nOptions } from '../core/component';\nimport { DisplayPlugin, createDisplayPlugin, hideModal } from '../plugins/modalDisplayPlugin';\n\nexport type Views = 'hours' | 'minutes';\n\n/** The clock's fields, in the order they appear. */\nconst UNITS = ['hours', 'minutes', 'seconds'] as const;\ntype Unit = (typeof UNITS)[number];\n\n/** How far each key moves a field, wrapping round. */\nconst STEPS: Record<string, number> = { ArrowUp: 1, ArrowDown: -1, PageUp: 5, PageDown: -5 };\n\n/** A 12-hour time's hour of the day, 0 to 23. */\nconst dayHour = (hours: number, pm: boolean) => (hours % 12) + (pm ? 12 : 0);\n\n/** Each field's length in seconds and how many values it has. */\nconst SPANS: Record<Unit, [number, number]> = { hours: [3600, 24], minutes: [60, 60], seconds: [1, 60] };\n\n/**\n * The hour at a position on the 24-hour dial, 0 to 12 from the top: the\n * inner ring holds 1 to 12, the outer 13 to 23 and 00.\n */\nconst ringHour = (position: number, inner: boolean) => {\n const hour = (position % 12) + (inner ? 0 : 12);\n return hour % 12 ? hour : 12 - hour;\n};\n\n/** The last second of the day. */\nconst DAY_END = 24 * 3600 - 1;\n\n/** A clock number as two digits. */\nconst pad2 = (n: number) => String(n).padStart(2, '0');\n\n/**\n * The hour on the 24-hour clock, minute and second of a written time such as\n * '14:30', '02:30:45 PM' or 'now'. A missing part reads as 0.\n */\nfunction readTime(text: string, fromNow: number): [number, number, number] {\n const upper = text.trim().toUpperCase();\n if (upper.split(':')[0] === 'NOW') {\n const now = new Date(+new Date() + fromNow);\n return [now.getHours(), now.getMinutes(), now.getSeconds()];\n }\n const period = /AM|PM/.exec(upper)?.[0];\n const parts = upper.replace(/AM|PM/, '').split(':');\n const [hours, minutes, seconds] = [0, 1, 2].map((i) => +parts[i] || 0);\n // A written AM or PM fixes the hour on either clock: \"03:30 PM\" is 15:30\n // on a 24-hour clock too.\n return [period ? dayHour(hours, period === 'PM') : hours, minutes, seconds];\n}\n\n/** Seconds since midnight for an hour, minute and second. */\nconst daySeconds = ([hours, minutes, seconds]: number[]) => hours * 3600 + minutes * 60 + seconds;\n\n/**\n * With a `lang` on or around the input, whether that language tells the\n * time on a 12-hour clock.\n */\nfunction localeClock(el: Element): Partial<TimepickerOptions> {\n const locale = Utils.locale(el);\n if (!locale) return {};\n const cycle = new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hourCycle;\n return { twelveHour: cycle === 'h11' || cycle === 'h12' };\n}\n\nexport interface TimepickerOptions extends BaseOptions {\n /**\n * Dial radius.\n * @default 135\n */\n dialRadius: number;\n /**\n * Outer radius.\n * @default 105\n */\n outerRadius: number;\n /**\n * Inner radius.\n * @default 70\n */\n innerRadius: number;\n /**\n * Tick radius.\n * @default 20\n */\n tickRadius: number;\n /**\n * Duration of the transition from/to the hours/minutes view.\n * @default 350\n */\n duration: number;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the time picker in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the Timepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit timepicker selection to input field\n * @default true\n */\n autoSubmit: boolean;\n /**\n * Default time to set on the timepicker 'now' or '13:14'.\n * @default 'now';\n */\n defaultTime: string;\n /**\n * Millisecond offset from the defaultTime.\n * @default 0\n */\n fromNow: number;\n /**\n * Internationalization options.\n */\n i18n: Partial<I18nOptions & { hours: string; minutes: string; seconds: string }>;\n /**\n * Use 12 hour AM/PM clock instead of 24 hour clock.\n * @default true, or the clock the input's `lang` uses\n */\n twelveHour: boolean;\n /**\n * Add a seconds field after the minutes, and write `HH:MM:SS`. The dial\n * still sets hours and minutes only.\n * @default false\n */\n showSeconds: boolean;\n /**\n * The earliest time a person can choose, as 24-hour `'HH:MM'` or\n * `'HH:MM:SS'`. Without `showSeconds` it rounds up to a whole minute.\n * @default null\n */\n minTime: string | null;\n /**\n * The latest time a person can choose, as 24-hour `'HH:MM'` or\n * `'HH:MM:SS'`. Without `showSeconds` it rounds down to a whole minute.\n * @default null\n */\n maxTime: string | null;\n /**\n * Vibrate device when dragging clock hand.\n * @default true\n */\n vibrate: boolean;\n /**\n * Callback function when a time is selected.\n * @default null\n */\n onSelect: (hour: number, minute: number) => void;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for done.\n * @default null\n */\n onDone: (() => void) | null;\n /**\n * Callback function for cancel.\n * @default null\n */\n onCancel: (() => void) | null;\n /**\n * Display plugin: 'docked' for a popover under the input, or 'modal' for a\n * dialog with Cancel and Ok. A modal picker writes the input only on Ok,\n * so it clears `autoSubmit`.\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: TimepickerOptions = {\n dialRadius: 135,\n outerRadius: 105,\n innerRadius: 70,\n tickRadius: 20,\n duration: 350,\n container: null,\n defaultTime: 'now', // default time, 'now' or '13:14' e.g.\n fromNow: 0, // Millisecond offset from the defaultTime\n showClearBtn: false,\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n hours: 'Hours',\n minutes: 'Minutes',\n seconds: 'Seconds'\n },\n twelveHour: true, // change to 12 hour AM/PM clock from 24 hour\n showSeconds: false,\n minTime: null,\n maxTime: null,\n vibrate: true, // vibrate the device when dragging clock hand\n // Callbacks\n onSelect: null,\n onInputInteraction: null,\n onDone: null,\n onCancel: null,\n displayPlugin: null,\n displayPluginOptions: null,\n};\n\nexport class Timepicker extends Component<TimepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n containerEl: HTMLElement;\n plate: HTMLElement;\n digitalClock: HTMLElement;\n inputHours: HTMLInputElement;\n inputMinutes: HTMLInputElement;\n /** The seconds field, or null without `showSeconds`. */\n inputSeconds: HTMLInputElement | null;\n x0: number;\n y0: number;\n moved: boolean;\n /** Which pointer is dragging the clock hand; a second finger is ignored. */\n private _dragPointerId: number | null = null;\n /** Removes the document listeners of the drag in progress. */\n private _drag: AbortController | null = null;\n dx: number;\n dy: number;\n /**\n * Current view on the timepicker.\n * @default 'hours'\n */\n currentView: Views;\n hand: SVGElement;\n minutesView: HTMLElement;\n hours: number;\n minutes: number;\n seconds: number;\n /** The selected time. */\n time: string;\n /**\n * If the time is AM or PM on twelve-hour clock.\n * @default 'PM'\n */\n amOrPm: 'AM' | 'PM';\n static _template;\n /** Whether this device exposes the Vibration API at all. */\n canVibrate: boolean;\n _canvas: HTMLElement;\n hoursView: HTMLElement;\n spanAmPm: HTMLSpanElement;\n footer: HTMLElement;\n private _amBtn: HTMLButtonElement;\n private _pmBtn: HTMLButtonElement;\n bg: Element;\n g: Element;\n toggleViewTimer: ReturnType<typeof setTimeout>;\n vibrateTimer: ReturnType<typeof setTimeout>;\n private _autoSubmitTimer: ReturnType<typeof setTimeout>;\n private _clockResetTimer: ReturnType<typeof setTimeout>;\n private displayPlugin: DisplayPlugin;\n /** Whether the dial (ticks + SVG + AM/PM buttons) has been built yet. */\n private _clockBuilt = false;\n /** Whether the pointer last pointed at a value outside the range. */\n private _handRefused = false;\n /** The first and last allowed second of the day. */\n private _limits: [number, number] = [0, DAY_END];\n\n constructor(el: HTMLInputElement, options: Partial<TimepickerOptions>) {\n super(el, { ...localeClock(el), ...options });\n // A modal clock writes on Ok, so it has the buttons.\n this.options.autoSubmit &&= this.options.displayPlugin !== 'modal';\n this.id = Utils.guid();\n this._readLimits();\n this._insertHTMLIntoDOM();\n this._setupVariables();\n this._setupEventHandlers();\n // The dial is ~40 elements (12 or 24 hour ticks, 12 minute ticks, the SVG\n // hand and the AM/PM buttons) and is built by _ensureClockBuilt() rather\n // than here - see _pickerSetup for when that first happens.\n this._pickerSetup();\n\n this.displayPlugin = createDisplayPlugin(this.options.displayPlugin, this.el, this.containerEl, this.options.displayPluginOptions, this.cancel);\n }\n\n static get defaults(): TimepickerOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Timepicker';\n\n destroy() {\n clearTimeout(this._autoSubmitTimer);\n clearTimeout(this.toggleViewTimer);\n clearTimeout(this.vibrateTimer);\n this._cancelClockReset();\n // Drag handlers live on the document while the clock hand is held; if the\n // component is destroyed mid-drag they would otherwise outlive it.\n this._drag?.abort();\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n super.destroy();\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n this.el.addEventListener('click', this._handleInputClick, { signal });\n this.el.addEventListener('keydown', this._handleInputKeydown, { signal });\n this.plate.addEventListener('pointerdown', this._handleClockClickStart);\n this.digitalClock.addEventListener('input', this._inputFromTextField, { signal });\n this.digitalClock.addEventListener('keydown', this._handleDigitalKeydown, { signal });\n this.inputHours.addEventListener('focus', () => this.showView('hours'));\n this.inputHours.addEventListener('focusout', () => this.formatHours());\n this.inputMinutes.addEventListener('focus', () => this.showView('minutes'));\n this.inputMinutes.addEventListener('focusout', () => this.formatMinutes());\n this.inputSeconds?.addEventListener('focusout', () => this.formatSeconds());\n }\n\n _handleInputClick = () => {\n this._updateTimeFromInput();\n // Before focus(): focusing inputHours fires the handler that calls\n // showView, and an already-focused input fires nothing at all.\n this._ensureClockBuilt();\n if (this.displayPlugin) this.displayPlugin.show();\n this.inputHours.focus();\n if (typeof this.options.onInputInteraction === 'function') this.options.onInputInteraction.call(this);\n };\n\n _handleInputKeydown = Utils.ignoringComposition((e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this._handleInputClick();\n }\n });\n\n _handleClockClickStart = (e: PointerEvent) => {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n e.preventDefault();\n this._ensureClockBuilt();\n const clockPlateBR = this.plate.getBoundingClientRect();\n const offset = { x: clockPlateBR.left, y: clockPlateBR.top };\n\n this.x0 = offset.x + this.options.dialRadius;\n this.y0 = offset.y + this.options.dialRadius;\n this.moved = false;\n this._dragPointerId = e.pointerId;\n this.dx = e.clientX - this.x0;\n this.dy = e.clientY - this.y0;\n\n // Set clock hands\n this.setHand(this.dx, this.dy, false);\n // The hand follows the pointer anywhere on the page while it is held.\n // `pointercancel` ends the drag the same way `pointerup` does: without it\n // these document listeners outlived a cancelled touch, because the\n // `touchend` pair this replaced had no `touchcancel` companion.\n this._drag?.abort();\n this._drag = controllerFor(this.el);\n const { signal } = this._drag;\n document.addEventListener('pointermove', this._handleDocumentClickMove, { signal });\n document.addEventListener('pointerup', this._handleDocumentClickEnd, { signal });\n document.addEventListener('pointercancel', this._handleDocumentClickCancel, { signal });\n };\n\n _handleDocumentClickMove = (e: PointerEvent) => {\n if (e.pointerId !== this._dragPointerId) return;\n e.preventDefault();\n const x = e.clientX - this.x0;\n const y = e.clientY - this.y0;\n this.moved = true;\n this.setHand(x, y, false);\n };\n\n _handleDocumentClickEnd = (e: PointerEvent) => {\n if (e.pointerId !== this._dragPointerId) return;\n this._dragPointerId = null;\n e.preventDefault();\n this._drag.abort();\n const x = e.clientX - this.x0;\n const y = e.clientY - this.y0;\n if (this.moved && x === this.dx && y === this.dy) {\n this.setHand(x, y);\n }\n // A release on a disabled tick is no choice at all.\n if (!this._handRefused) this._chooseHand();\n };\n\n /** Take the value under the hand: move on to the minutes, or submit. */\n private _chooseHand() {\n if (this.currentView === 'hours') {\n this.inputMinutes.focus();\n this.showView('minutes', this.options.duration / 2);\n } else {\n clearTimeout(this._autoSubmitTimer);\n this._autoSubmitTimer = setTimeout(() => {\n this._autoSubmitTimer = null;\n if (this.options.autoSubmit) this.done();\n }, this.options.duration / 2);\n }\n\n const { hours, minutes } = this;\n this._notify('select', this.options.onSelect, { args: [hours, minutes], detail: { hours, minutes }, current: () => this.hours === hours && this.minutes === minutes });\n }\n\n /**\n * A cancelled pointer is not a completed selection. The browser or the OS\n * took the gesture over, so this only lets go of the drag - it must not run\n * the pointer-up path, which advances hours to minutes, fires `onSelect`,\n * and under `autoSubmit` closes the picker on a time the user never chose.\n */\n _handleDocumentClickCancel = (e: PointerEvent) => {\n if (e.pointerId !== this._dragPointerId) return;\n this._dragPointerId = null;\n this.moved = false;\n this._drag.abort();\n };\n\n /**\n * Read `minTime` and `maxTime` as seconds of the day. Without a seconds\n * field the picker writes whole minutes, so the bounds round inward to a\n * whole minute: `maxTime` takes in every second of its minute, and the\n * hidden seconds never clamp.\n */\n private _readLimits() {\n const { minTime, maxTime, showSeconds, fromNow } = this.options;\n const read = (time: string | null, fallback: number) => (time ? daySeconds(readTime(time, fromNow)) : fallback);\n let [min, max] = [read(minTime, 0), read(maxTime, DAY_END)];\n if (!showSeconds) [min, max] = [Math.ceil(min / 60) * 60, Math.floor(max / 60) * 60 + 59];\n if (min > max) return console.warn('Timepicker ignored minTime and maxTime: minTime is after maxTime.', this.el);\n this._limits = [min, max];\n }\n\n _insertHTMLIntoDOM() {\n const template = document.createElement('template');\n template.innerHTML = Timepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n this.containerEl.id = 'container-' + this.id;\n\n // Append popover to input by default\n const optEl = this.options.container;\n const containerEl = optEl instanceof HTMLElement ? optEl : document.querySelector(optEl);\n\n if (this.options.container && !!containerEl) {\n containerEl.append(this.containerEl);\n } else {\n this.el.parentElement.appendChild(this.containerEl);\n }\n }\n\n _setupVariables() {\n this.currentView = 'hours';\n // `navigator.webkitVibrate` never shipped in any browser - the probe it\n // came from was folklore. A plain feature check is the whole of it.\n this.canVibrate = typeof navigator.vibrate === 'function';\n this._canvas = this.containerEl.querySelector('.timepicker-canvas');\n this.plate = this.containerEl.querySelector('.timepicker-plate');\n this.digitalClock = this.containerEl.querySelector('.timepicker-display-column');\n this.hoursView = this.containerEl.querySelector('.timepicker-hours');\n this.minutesView = this.containerEl.querySelector('.timepicker-minutes');\n this.inputHours = this.containerEl.querySelector('.timepicker-input-hours');\n this.inputMinutes = this.containerEl.querySelector('.timepicker-input-minutes');\n this.inputSeconds = this.containerEl.querySelector('.timepicker-input-seconds');\n if (!this.options.showSeconds) this._removeSecondsField();\n // The fields are spin buttons: the arrows step them, and the hour and\n // minute fields move the hand.\n for (const unit of this._units()) {\n const [min, max] = this._bounds(unit);\n const attributes = { role: 'spinbutton', 'aria-valuemin': min, 'aria-valuemax': max, 'aria-label': this.options.i18n[unit] };\n Object.entries(attributes).forEach(([name, value]) => this._input(unit).setAttribute(name, String(value)));\n }\n this.spanAmPm = this.containerEl.querySelector('.timepicker-span-am-pm');\n this.footer = this.containerEl.querySelector('.timepicker-footer');\n this.amOrPm = 'PM';\n }\n\n private _removeSecondsField() {\n this.containerEl.querySelectorAll('.timepicker-seconds-divider, .timepicker-input-seconds-wrapper').forEach((el) => el.remove());\n this.inputSeconds = null;\n }\n\n private _input(unit: Unit): HTMLInputElement | null {\n return { hours: this.inputHours, minutes: this.inputMinutes, seconds: this.inputSeconds }[unit];\n }\n\n /** The units that have a field. */\n private _units(): Unit[] {\n return UNITS.filter((unit) => this._input(unit));\n }\n\n /** Which unit's field `target` is, if any. */\n private _unitOf(target: EventTarget): Unit | undefined {\n return this._units().find((unit) => this._input(unit) === target);\n }\n\n _pickerSetup() {\n pickerFooter(this.footer, this.options, 'timepicker-clear', this.clear, this.confirm, this.cancel);\n\n this._updateTimeFromInput();\n\n // With a docked display the container is `visibility: hidden` until\n // show(), so the dial can wait for the first interaction. Without one it\n // is on screen from the moment it is inserted and has to be ready now.\n if (!this.options.displayPlugin) this.showView('hours');\n }\n\n /**\n * Build the dial, once. Cheap to call repeatedly - every entry point that\n * touches the clock calls it first, so the picker cannot be interacted with\n * before it exists.\n */\n private _ensureClockBuilt() {\n if (this._clockBuilt) return;\n this._clockBuilt = true;\n this._clockSetup();\n // Applies the AM/PM state _updateTimeFromInput worked out before the\n // buttons existed.\n this._updateAmPmView();\n this._updateRanges();\n }\n\n _clockSetup() {\n if (this.options.twelveHour) {\n // AM Button\n this._amBtn = document.createElement('button');\n this._amBtn.type = 'button';\n this._amBtn.classList.add('am-btn');\n this._amBtn.innerText = 'AM';\n this._amBtn.addEventListener('click', this._handleAmPmClick);\n this.spanAmPm.appendChild(this._amBtn);\n // PM Button\n this._pmBtn = document.createElement('button');\n this._pmBtn.type = 'button';\n this._pmBtn.classList.add('pm-btn');\n this._pmBtn.innerText = 'PM';\n this._pmBtn.addEventListener('click', this._handleAmPmClick);\n this.spanAmPm.appendChild(this._pmBtn);\n }\n this._buildHoursView();\n this._buildMinutesView();\n this._buildSVGClock();\n }\n\n _buildSVGClock() {\n // Draw clock hands and others\n const dialRadius = this.options.dialRadius;\n const tickRadius = this.options.tickRadius;\n const diameter = dialRadius * 2;\n // The ticks, hand and pointer math all centre on dialRadius, so the\n // painted face has to be the same size or the hand sits off centre.\n this.plate.style.width = this.plate.style.height = diameter + 'px';\n const svg = svgNode('svg', { class: 'timepicker-svg', width: String(diameter), height: String(diameter) });\n const g = svgNode('g', { transform: `translate(${dialRadius},${dialRadius})` });\n const bearing = svgNode('circle', { class: 'timepicker-canvas-bearing', cx: '0', cy: '0', r: '4' });\n const hand = svgNode('line', { x1: '0', y1: '0' });\n const bg = svgNode('circle', { class: 'timepicker-canvas-bg', r: String(tickRadius) });\n g.appendChild(hand);\n g.appendChild(bg);\n g.appendChild(bearing);\n svg.appendChild(g);\n this._canvas.appendChild(svg);\n this.hand = hand;\n this.bg = bg;\n this.g = g;\n }\n\n _buildHoursView() {\n // Hours view\n if (this.options.twelveHour) {\n for (let i = 1; i < 13; i += 1) {\n const radian = (i / 6) * Math.PI;\n const radius = this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n } else {\n for (let i = 0; i < 24; i += 1) {\n const radian = (i / 6) * Math.PI;\n const inner = i > 0 && i < 13;\n const radius = inner ? this.options.innerRadius : this.options.outerRadius;\n this._buildHoursTick(i, radian, radius);\n }\n }\n }\n\n _buildHoursTick(i: number, radian: number, radius: number) {\n this._placeTick(this.hoursView, radian, radius, i === 0 ? '00' : i.toString());\n }\n\n _buildMinutesView() {\n for (let i = 0; i < 60; i += 5) {\n const radian = (i / 30) * Math.PI;\n this._placeTick(this.minutesView, radian, this.options.outerRadius, pad2(i));\n }\n }\n\n private _placeTick(view: HTMLElement, radian: number, radius: number, text: string) {\n const tick = document.createElement('div');\n tick.classList.add('timepicker-tick');\n tick.style.left =\n this.options.dialRadius + Math.sin(radian) * radius - this.options.tickRadius + 'px';\n tick.style.top =\n this.options.dialRadius - Math.cos(radian) * radius - this.options.tickRadius + 'px';\n tick.textContent = text;\n view.appendChild(tick);\n }\n\n _handleAmPmClick = (e: MouseEvent) => {\n this._handleAmPmInteraction(<HTMLElement>e.target);\n };\n\n _handleAmPmInteraction = (e: HTMLElement) => {\n this.amOrPm = e.classList.contains('am-btn') ? 'AM' : 'PM';\n this._updateAmPmView();\n this._afterChange();\n this.resetClock(null);\n }\n\n _updateAmPmView() {\n // _updateTimeFromInput settles amOrPm before the dial is built; the\n // buttons pick the state up in _ensureClockBuilt.\n if (!this._amBtn || !this._pmBtn) return;\n this._amBtn.setAttribute('aria-pressed', String(this.amOrPm === 'AM'));\n this._pmBtn.setAttribute('aria-pressed', String(this.amOrPm === 'PM'));\n this._amBtn.classList.toggle('outlined', this.amOrPm !== 'AM');\n this._pmBtn.classList.toggle('outlined', this.amOrPm !== 'PM');\n if (this.options.twelveHour) {\n if (this.amOrPm === 'PM') {\n this._amBtn.classList.remove('filled');\n this._pmBtn.classList.add('filled');\n } else if (this.amOrPm === 'AM') {\n this._amBtn.classList.add('filled');\n this._pmBtn.classList.remove('filled');\n }\n }\n }\n\n _updateTimeFromInput() {\n this._cancelClockReset();\n const [hours, minutes, seconds] = readTime(`${this.el.value || this.options.defaultTime || ''}`, this.options.fromNow);\n [this.minutes, this.seconds] = [minutes, seconds];\n this._setHours24(hours);\n this._clamp();\n this._writeFields();\n this._updateAmPmView();\n this._updateRanges();\n }\n\n /** Show the time in every field but `except`, which the person is typing in. */\n private _writeFields(except?: HTMLInputElement) {\n this._units().forEach((unit) => {\n if (this._input(unit) !== except) this._input(unit).value = pad2(this[unit]);\n });\n }\n\n /** After a change to the time: keep it in range and update what depends on it. */\n private _afterChange(except?: HTMLInputElement) {\n if (this._clamp()) this._writeFields(except);\n this._updateRanges();\n }\n\n /**\n * Give each field the allowed range of values, and disable a period with\n * no allowed time.\n */\n private _updateRanges() {\n for (const unit of this._units()) {\n const [min, max] = this._range(unit);\n this._input(unit).setAttribute('aria-valuemin', String(min));\n this._input(unit).setAttribute('aria-valuemax', String(max));\n }\n const [first, last] = this._dayRange('hours');\n if (this._amBtn) [this._amBtn.disabled, this._pmBtn.disabled] = [first > 11, last < 12];\n this._disableTicks(this.hoursView, 'hours');\n this._disableTicks(this.minutesView, 'minutes');\n }\n\n /** Mark the ticks of a dial view that are outside the range. */\n private _disableTicks(view: HTMLElement, unit: Unit) {\n view.querySelectorAll('.timepicker-tick').forEach((tick) => {\n tick.classList.toggle('is-disabled', !this._allows(unit, Number(tick.textContent)));\n });\n }\n\n /** The hour on the 24-hour clock, setting AM or PM on a 12-hour one. */\n private _setHours24(hour: number) {\n if (!this.options.twelveHour) return void (this.hours = hour);\n this.amOrPm = hour >= 12 ? 'PM' : 'AM';\n this.hours = hour % 12 || 12;\n this._updateAmPmView();\n }\n\n /** The time as seconds of the day. */\n private _time() {\n return daySeconds([this._dayValue('hours', this.hours), this.minutes, this.seconds]);\n }\n\n /** Move the time to the nearest allowed time, and say whether it moved. */\n private _clamp() {\n const time = this._time();\n const clamped = Math.min(Math.max(time, this._limits[0]), this._limits[1]);\n if (clamped === time) return false;\n this._setHours24(Math.floor(clamped / 3600));\n [this.minutes, this.seconds] = [Math.floor(clamped / 60) % 60, clamped % 60];\n return true;\n }\n\n /**\n * Show hours or minutes view on timepicker.\n * @param view The name of the view you want to switch to, 'hours' or 'minutes'.\n * @param delay\n */\n showView = (view: Views, delay: number = null) => {\n this._ensureClockBuilt();\n const isHours = view === 'hours',\n nextView = isHours ? this.hoursView : this.minutesView,\n hideView = isHours ? this.minutesView : this.hoursView;\n this.currentView = view;\n\n // Transition view\n hideView.classList.add('timepicker-dial-out');\n\n nextView.style.visibility = 'visible';\n nextView.classList.remove('timepicker-dial-out');\n\n // Reset clock hand\n this.resetClock(delay);\n // After transitions ended\n clearTimeout(this.toggleViewTimer);\n this.toggleViewTimer = setTimeout(() => {\n hideView.style.visibility = 'hidden';\n }, this.options.duration);\n };\n\n private _cancelClockReset() {\n clearTimeout(this._clockResetTimer);\n this._clockResetTimer = null;\n this._canvas?.classList.remove('timepicker-canvas-out');\n }\n\n resetClock(delay) {\n this._cancelClockReset();\n const view = this.currentView,\n value = this[view],\n isHours = view === 'hours',\n unit = Math.PI / (isHours ? 6 : 30),\n radian = value * unit,\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius,\n x = Math.sin(radian) * radius,\n y = -Math.cos(radian) * radius;\n\n if (delay) {\n this._canvas?.classList.add('timepicker-canvas-out');\n this._clockResetTimer = setTimeout(() => {\n this.setHand(x, y);\n }, delay);\n } else {\n this.setHand(x, y);\n }\n }\n\n /**\n * Enter in the hour or minute field commits the typed time. The dial ticks\n * are pointer targets only, and under `autoSubmit` there is no Ok button,\n * so without this a keyboard user could type a time but never set it.\n * Cancelling also keeps Enter from submitting a surrounding form. The\n * listener's column holds only the fields; AM/PM is a separate column.\n */\n _handleDigitalKeydown = Utils.ignoringComposition((event: KeyboardEvent) => {\n if (event.key in STEPS) return this._step(event);\n if (event.key !== 'Enter') return;\n event.preventDefault();\n // Normalize first, as leaving the field would: an emptied field takes its\n // default, and the committed time has to be the one the fields then show.\n this._formatFields();\n if (this.options.autoSubmit) this.done();\n else this.confirm();\n });\n\n /** The lowest and highest value a field can show. */\n private _bounds(unit: Unit): [number, number] {\n if (unit !== 'hours') return [0, 59];\n return this.options.twelveHour ? [1, 12] : [0, 23];\n }\n\n /** The lowest and highest allowed value of a field, given the others. */\n private _range(unit: Unit): [number, number] {\n const [min, max] = this._bounds(unit);\n const allowed = Array.from({ length: max - min + 1 }, (_, i) => min + i).filter((value) => this._allows(unit, value));\n return allowed.length ? [Math.min(...allowed), Math.max(...allowed)] : [min, max];\n }\n\n /**\n * The first and last allowed value of a field, given the fields before it,\n * with hours on the 24-hour clock. An hour is allowed when any second of\n * it is, and so is a minute.\n */\n private _dayRange(unit: Unit): number[] {\n const [size, count] = SPANS[unit];\n const start = this._time() - (this._time() % (size * count));\n return this._limits.map((limit) => Math.min(Math.max(Math.floor((limit - start) / size), 0), count - 1));\n }\n\n /** A field's value with hours on the 24-hour clock. */\n private _dayValue(unit: Unit, value: number) {\n return unit === 'hours' && this.options.twelveHour ? dayHour(value, this.amOrPm === 'PM') : value;\n }\n\n /** Whether a field can take `value` within the range. */\n private _allows(unit: Unit, value: number) {\n const [first, last] = this._dayRange(unit);\n const day = this._dayValue(unit, value);\n return Math.min(Math.max(day, first), last) === day;\n }\n\n /** The whole number typed in a field, or NaN when the field can't take it. */\n private _fieldValue(unit: Unit, text: string) {\n const value = Number(text.trim() || NaN);\n return this._takes(unit, value) ? value : NaN;\n }\n\n /** Whether a field can show `value` and the range allows it. */\n private _takes(unit: Unit, value: number) {\n const [min, max] = this._bounds(unit);\n return Number.isInteger(value) && Math.min(Math.max(value, min), max) === value && this._allows(unit, value);\n }\n\n /** Point the hand at an hour or minute. Seconds have no dial view. */\n private _moveHand(unit: Unit, value: number) {\n if (unit === 'seconds') return;\n this._cancelClockReset();\n this.drawClockFromTimeInput(value, unit === 'hours');\n }\n\n /**\n * Up and Down step a field by one, Page Up and Page Down by five, round\n * the dial: past 59 minutes comes 00. The hand follows hours and minutes.\n * Hours step round the day, so in 12-hour time passing 12 switches AM and\n * PM. Minutes and seconds wrap without carrying. With `minTime` or\n * `maxTime`, a field that is not wholly allowed stops at its last allowed\n * value instead of wrapping.\n */\n private _step(event: KeyboardEvent) {\n const input = event.target as HTMLInputElement;\n const unit = this._unitOf(input);\n if (!unit) return;\n event.preventDefault();\n const value = this._stepValue(unit, STEPS[event.key]);\n if (unit === 'hours') this._setHours24(value);\n else this[unit] = value;\n this._afterChange();\n input.value = pad2(this[unit]);\n this._moveHand(unit, this[unit]);\n }\n\n /** A field's value `step` on, with hours on the 24-hour clock. */\n private _stepValue(unit: Unit, step: number) {\n const [first, last] = this._dayRange(unit);\n const count = SPANS[unit][1];\n const next = this._dayValue(unit, this[unit]) + step;\n return first === 0 && last === count - 1 ? (next + count) % count : Math.min(Math.max(next, first), last);\n }\n\n _inputFromTextField = (event: Event) => {\n const input = event.target as HTMLInputElement;\n const unit = this._unitOf(input);\n if (!unit) return;\n // Any edit to an hour or minute cancels an older delayed hand move.\n if (unit !== 'seconds') this._cancelClockReset();\n const value = this._fieldValue(unit, input.value);\n if (Number.isNaN(value)) return;\n this[unit] = value;\n this._afterChange(input);\n this._moveHand(unit, value);\n };\n\n drawClockFromTimeInput(value, isHours) {\n const unit = Math.PI / (isHours ? 6 : 30);\n const radian = value * unit;\n let radius;\n if (this.options.twelveHour) {\n radius = this.options.outerRadius;\n } else {\n radius =\n isHours && value > 0 && value < 13 ? this.options.innerRadius : this.options.outerRadius;\n }\n this.setClockAttributes(radian, radius);\n }\n\n setHand(x, y, roundBy5: boolean = false) {\n this._cancelClockReset();\n const isHours = this.currentView === 'hours',\n unit = Math.PI / (isHours || roundBy5 ? 6 : 30),\n z = Math.sqrt(x * x + y * y),\n inner = isHours && z < (this.options.outerRadius + this.options.innerRadius) / 2;\n const radius = inner && !this.options.twelveHour ? this.options.innerRadius : this.options.outerRadius;\n let radian = Math.atan2(x, -y);\n\n // Radian should in range [0, 2PI]\n if (radian < 0) {\n radian = Math.PI * 2 + radian;\n }\n\n // Get the round value\n const position = Math.round(radian / unit);\n\n // Get the round radian\n radian = position * unit;\n\n const value = isHours ? this._hourAt(position, inner) : ((roundBy5 ? position * 5 : position) % 60);\n // The hand stays on the last allowed value.\n this._handRefused = !this._allows(this.currentView, value);\n if (this._handRefused) return;\n\n // Once hours or minutes changed, vibrate the device. The timer keeps it\n // from vibrating too frequently.\n if (this[this.currentView] !== value && this.canVibrate && this.options.vibrate && !this.vibrateTimer) {\n navigator.vibrate(10);\n this.vibrateTimer = setTimeout(() => {\n this.vibrateTimer = null;\n }, 100);\n }\n\n this[this.currentView] = value;\n (isHours ? this.inputHours : this.inputMinutes).value = pad2(value);\n\n // Set clock hand and others' position\n this.setClockAttributes(radian, radius);\n this._afterChange();\n }\n\n /** The hour at a dial position, 0 to 12 from the top. */\n private _hourAt(position: number, inner: boolean) {\n return this.options.twelveHour ? position % 12 || 12 : ringHour(position, inner);\n }\n\n setClockAttributes(radian: number, radius: number) {\n // Nothing to point at until the SVG exists.\n if (!this.hand || !this.bg) return;\n const cx1 = Math.sin(radian) * (radius - this.options.tickRadius),\n cy1 = -Math.cos(radian) * (radius - this.options.tickRadius),\n cx2 = Math.sin(radian) * radius,\n cy2 = -Math.cos(radian) * radius;\n this.hand.setAttribute('x2', cx1.toString());\n this.hand.setAttribute('y2', cy1.toString());\n this.bg.setAttribute('cx', cx2.toString());\n this.bg.setAttribute('cy', cy2.toString());\n }\n\n formatHours() {\n if (this.inputHours.value == '') this.setHoursDefault();\n this.inputHours.value = pad2(this.hours);\n }\n\n formatMinutes() {\n if (this.inputMinutes.value == '') this.minutes = new Date().getMinutes();\n this.inputMinutes.value = pad2(this.minutes);\n }\n\n formatSeconds() {\n if (this.inputSeconds.value == '') this.seconds = new Date().getSeconds();\n this.inputSeconds.value = pad2(this.seconds);\n }\n\n /** Normalize every field, as leaving it would. */\n private _formatFields() {\n this.formatHours();\n this.formatMinutes();\n if (this.inputSeconds) this.formatSeconds();\n }\n\n setHoursDefault() {\n this.hours = new Date().getHours();\n if (this.options.twelveHour) this.hours = this.hours % 12 || 12;\n this.inputHours.value = this.hours.toString();\n }\n\n done = (clearValue = null) => {\n // Set input value\n const last = this.el.value;\n let value = clearValue ? '' : this._clockTime(this.hours);\n this.time = value;\n if (!clearValue) value = this._inputValue(value);\n this.el.value = value;\n // Trigger change event\n if (value !== last) {\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n }\n };\n\n /** `HH:MM` for the given hour, or `HH:MM:SS` with a seconds field. */\n private _clockTime(hours: number) {\n const parts = this.inputSeconds ? [hours, this.minutes, this.seconds] : [hours, this.minutes];\n return parts.map(pad2).join(':');\n }\n\n // A time input accepts only 24-hour HH:mm or HH:mm:ss and empties itself\n // on anything else, so it never gets the AM/PM a text input shows.\n private _inputValue(time: string) {\n if (this.el.type === 'time') return this._clockTime(this._dayValue('hours', this.hours));\n return this.options.twelveHour ? `${time} ${this.amOrPm}` : time;\n }\n\n confirm = () => {\n this.done();\n hideModal(this.displayPlugin);\n this._notify('confirm', this.options.onDone, { args: [] });\n }\n\n cancel = () => {\n // Cancel keeps the previously submitted value in the input.\n hideModal(this.displayPlugin);\n this._notify('cancel', this.options.onCancel, { args: [] });\n }\n\n clear = () => {\n this.done(true);\n };\n\n static {\n Timepicker._template = `<div class=\"timepicker-container\">\n <div class=\"timepicker-digital-display\">\n <div class=\"timepicker-text-container\">\n <div class=\"timepicker-display-column timepicker-display-digital-clock\">\n <div class=\"timepicker-input-hours-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-hours\" />\n </div>\n <div class=\"timepicker-input-divider-wrapper\">\n <span class=\"timepicker-input-divider\">:</span>\n </div>\n <div class=\"timepicker-input-minutes-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-minutes\" />\n </div>\n <div class=\"timepicker-input-divider-wrapper timepicker-seconds-divider\">\n <span class=\"timepicker-input-divider\">:</span>\n </div>\n <div class=\"timepicker-input-seconds-wrapper\">\n <input type=\"text\" maxlength=\"2\" class=\"timepicker-input-seconds\" />\n </div>\n </div>\n <div class=\"timepicker-display-column timepicker-display-am-pm\">\n <div class=\"timepicker-span-am-pm\"></div>\n </div>\n </div>\n </div>\n <div class=\"timepicker-analog-display\">\n <div class=\"timepicker-plate\">\n <div class=\"timepicker-canvas\"></div>\n <div class=\"timepicker-dial timepicker-hours\"></div>\n <div class=\"timepicker-dial timepicker-minutes timepicker-dial-out\"></div>\n </div>\n <div class=\"timepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Utils
|
|
3
|
-
|
|
2
|
+
Utils,
|
|
3
|
+
controllerFor,
|
|
4
|
+
restoreAttribute
|
|
5
|
+
} from "./chunk-ZVLOUDIJ.mjs";
|
|
4
6
|
|
|
5
7
|
// src/ts/components/snackbar.ts
|
|
6
8
|
var _defaults = {
|
|
@@ -14,7 +16,8 @@ var _defaults = {
|
|
|
14
16
|
classes: "",
|
|
15
17
|
completeCallback: null,
|
|
16
18
|
activationPercent: 0.8,
|
|
17
|
-
root: null
|
|
19
|
+
root: null,
|
|
20
|
+
replace: false
|
|
18
21
|
};
|
|
19
22
|
var _Snackbar = class _Snackbar {
|
|
20
23
|
constructor(options = {}) {
|
|
@@ -28,29 +31,92 @@ var _Snackbar = class _Snackbar {
|
|
|
28
31
|
if (options.displayLength === void 0 && this.options.action) {
|
|
29
32
|
this.options.displayLength = Infinity;
|
|
30
33
|
}
|
|
31
|
-
if (options.dismissible === void 0
|
|
34
|
+
if (options.dismissible === void 0) this.options.dismissible = _Snackbar._needsClose(this.options);
|
|
32
35
|
this.message = this.options.text;
|
|
33
36
|
this.panning = false;
|
|
34
37
|
this.timeRemaining = this.options.displayLength;
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
this._portal = Utils.portalRoot(this.options.root ?? document.body);
|
|
39
|
+
_Snackbar._dropDetached();
|
|
40
|
+
if (this.options.snackbarId) this._requireBody();
|
|
41
|
+
else this._build();
|
|
42
|
+
if (this.options.replace) _Snackbar._replaceShown(this);
|
|
43
|
+
else _Snackbar._queue.push(this);
|
|
44
|
+
_Snackbar._advance();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether a bar gets its close button when the page does not say. One with
|
|
48
|
+
* an action waits for it, and one that never times out waits for the
|
|
49
|
+
* reader; either way, swiping must not be the only way to send it off.
|
|
50
|
+
*/
|
|
51
|
+
static _needsClose(options) {
|
|
52
|
+
return !!options.action || options.displayLength === Infinity;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Lets go of snackbars a re-render took out of the page. A persistent one
|
|
56
|
+
* would otherwise hold the queue for good.
|
|
57
|
+
*/
|
|
58
|
+
static _dropDetached() {
|
|
59
|
+
for (const snackbar of _Snackbar._snackbars.filter((shown) => !shown.el.isConnected)) {
|
|
37
60
|
snackbar._dismissed = true;
|
|
38
|
-
snackbar.
|
|
61
|
+
snackbar._remove(false);
|
|
39
62
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
63
|
+
}
|
|
64
|
+
/** Throws now, rather than when the snackbar shows, if `snackbarId` names nothing. */
|
|
65
|
+
_requireBody() {
|
|
66
|
+
if (!this._hasBody()) throw new Error("Snackbar body not found");
|
|
67
|
+
}
|
|
68
|
+
/** Whether the body a snackbar shows is still there: its own, or `snackbarId`'s. */
|
|
69
|
+
_hasBody() {
|
|
70
|
+
return !this.options.snackbarId || !!Utils.getElementById(this._portal, this.options.snackbarId);
|
|
71
|
+
}
|
|
72
|
+
_build() {
|
|
43
73
|
this.el = this._createSnackbar();
|
|
44
|
-
const root = Utils.portalRoot(this.options.root ?? document.body);
|
|
45
|
-
if (!_Snackbar._container || !_Snackbar._container.isConnected || _Snackbar._container.parentNode !== root) {
|
|
46
|
-
if (_Snackbar._container) _Snackbar._removeContainer();
|
|
47
|
-
_Snackbar._createContainer(root);
|
|
48
|
-
}
|
|
49
|
-
_Snackbar._container.appendChild(this.el);
|
|
50
74
|
this.el["Expressive_Snackbar"] = this;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Takes the snackbar on screen down at once, without starting the queue.
|
|
78
|
+
* Restoring focus can open another, which goes too.
|
|
79
|
+
*/
|
|
80
|
+
static _replaceShown(replacement) {
|
|
81
|
+
_Snackbar._replacing = true;
|
|
82
|
+
try {
|
|
83
|
+
while (_Snackbar._snackbars.length) {
|
|
84
|
+
for (const snackbar of _Snackbar._snackbars.splice(0)) {
|
|
85
|
+
snackbar._dismissed = true;
|
|
86
|
+
snackbar._restoreFocus(true);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
} finally {
|
|
90
|
+
_Snackbar._replacing = false;
|
|
91
|
+
}
|
|
92
|
+
_Snackbar._queue.unshift(replacement);
|
|
93
|
+
}
|
|
94
|
+
/** Puts the snackbar on screen and starts its countdown. */
|
|
95
|
+
_show() {
|
|
96
|
+
if (!this.el) this._build();
|
|
97
|
+
this._returnFocus = _Snackbar._focused();
|
|
98
|
+
_Snackbar._containerIn(this._portal).appendChild(this.el);
|
|
51
99
|
_Snackbar._snackbars.push(this);
|
|
52
100
|
this._animateIn();
|
|
53
101
|
this._setTimer();
|
|
102
|
+
Utils.emit(this.el, "open");
|
|
103
|
+
}
|
|
104
|
+
/** The focused element, looking inside open shadow roots. */
|
|
105
|
+
static _focused() {
|
|
106
|
+
let focused = document.activeElement;
|
|
107
|
+
while (focused?.shadowRoot?.activeElement) focused = focused.shadowRoot.activeElement;
|
|
108
|
+
return focused instanceof HTMLElement ? focused : null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* One container serves every snackbar, and only one snackbar shows at a
|
|
112
|
+
* time — so it is moved rather than duplicated when the root changes.
|
|
113
|
+
*/
|
|
114
|
+
static _containerIn(root) {
|
|
115
|
+
const container = _Snackbar._container;
|
|
116
|
+
if (container?.isConnected && container.parentNode === root) return container;
|
|
117
|
+
_Snackbar._removeContainer();
|
|
118
|
+
_Snackbar._createContainer(root);
|
|
119
|
+
return _Snackbar._container;
|
|
54
120
|
}
|
|
55
121
|
static get defaults() {
|
|
56
122
|
return _defaults;
|
|
@@ -72,7 +138,7 @@ var _Snackbar = class _Snackbar {
|
|
|
72
138
|
document.removeEventListener("pointermove", _Snackbar._onDragMove);
|
|
73
139
|
document.removeEventListener("pointerup", _Snackbar._onDragEnd);
|
|
74
140
|
document.removeEventListener("pointercancel", _Snackbar._onDragCancel);
|
|
75
|
-
_Snackbar._container
|
|
141
|
+
_Snackbar._container?.remove();
|
|
76
142
|
_Snackbar._container = null;
|
|
77
143
|
}
|
|
78
144
|
static _onDragStart(e) {
|
|
@@ -103,7 +169,7 @@ var _Snackbar = class _Snackbar {
|
|
|
103
169
|
const snackbar = _Snackbar._draggedSnackbar;
|
|
104
170
|
snackbar.deltaX = Math.abs(snackbar.xPos - e.clientX);
|
|
105
171
|
snackbar.xPos = e.clientX;
|
|
106
|
-
snackbar.velocityX = snackbar.deltaX / (Date.now() - snackbar.time);
|
|
172
|
+
snackbar.velocityX = snackbar.deltaX / Math.max(1, Date.now() - snackbar.time);
|
|
107
173
|
snackbar.time = Date.now();
|
|
108
174
|
const totalDeltaX = snackbar.xPos - snackbar.startingXPos;
|
|
109
175
|
const activationDistance = snackbar._activationDistance;
|
|
@@ -156,12 +222,30 @@ var _Snackbar = class _Snackbar {
|
|
|
156
222
|
* dismiss all snackbars.
|
|
157
223
|
*/
|
|
158
224
|
static dismissAll() {
|
|
159
|
-
for (const snackbar of [..._Snackbar._snackbars]) {
|
|
225
|
+
for (const snackbar of [..._Snackbar._queue, ..._Snackbar._snackbars]) {
|
|
160
226
|
snackbar.dismiss();
|
|
161
227
|
}
|
|
162
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Whether dismiss() is done already: the snackbar was dismissed before, or
|
|
231
|
+
* never showed and is dropped from the queue. A dropped one reports through
|
|
232
|
+
* completeCallback but fires no events, never having been in the page.
|
|
233
|
+
*/
|
|
234
|
+
_leaveQueue() {
|
|
235
|
+
if (this._dismissed) return true;
|
|
236
|
+
const index = _Snackbar._queue.indexOf(this);
|
|
237
|
+
if (index < 0) return false;
|
|
238
|
+
_Snackbar._queue.splice(index, 1);
|
|
239
|
+
this._drop();
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
_drop() {
|
|
243
|
+
this._dismissed = true;
|
|
244
|
+
if (this.el) this._remove(false);
|
|
245
|
+
this.options.completeCallback?.();
|
|
246
|
+
}
|
|
163
247
|
_createSnackbar() {
|
|
164
|
-
let snackbar = this.options.snackbarId ? Utils.getElementById(this.
|
|
248
|
+
let snackbar = this.options.snackbarId ? Utils.getElementById(this._portal, this.options.snackbarId) : document.createElement("div");
|
|
165
249
|
if (snackbar instanceof HTMLTemplateElement) {
|
|
166
250
|
const node = snackbar.content.cloneNode(true);
|
|
167
251
|
snackbar = node.firstElementChild;
|
|
@@ -172,15 +256,12 @@ var _Snackbar = class _Snackbar {
|
|
|
172
256
|
const attributes = ["class", "style", "role", "aria-live", "aria-atomic", "inert"].map((name) => [name, snackbar.getAttribute(name)]);
|
|
173
257
|
this._restoreElement = () => {
|
|
174
258
|
snackbar.replaceChildren(...children);
|
|
175
|
-
for (const [name, value] of attributes)
|
|
176
|
-
if (value === null) snackbar.removeAttribute(name);
|
|
177
|
-
else snackbar.setAttribute(name, value);
|
|
178
|
-
}
|
|
259
|
+
for (const [name, value] of attributes) restoreAttribute(snackbar, name, value);
|
|
179
260
|
placeholder.replaceWith(snackbar);
|
|
180
261
|
};
|
|
181
262
|
}
|
|
182
263
|
if (!snackbar) throw new Error("Snackbar body not found");
|
|
183
|
-
this._events =
|
|
264
|
+
this._events = controllerFor(snackbar);
|
|
184
265
|
const listenerOptions = { signal: this._events.signal };
|
|
185
266
|
snackbar.classList.add("snackbar");
|
|
186
267
|
snackbar.setAttribute("role", "status");
|
|
@@ -222,6 +303,7 @@ var _Snackbar = class _Snackbar {
|
|
|
222
303
|
if (this._dismissed) return;
|
|
223
304
|
try {
|
|
224
305
|
if (typeof this.options.onAction === "function") this.options.onAction();
|
|
306
|
+
Utils.emit(this.el, "action");
|
|
225
307
|
} finally {
|
|
226
308
|
this.dismiss();
|
|
227
309
|
}
|
|
@@ -233,7 +315,7 @@ var _Snackbar = class _Snackbar {
|
|
|
233
315
|
close.type = "button";
|
|
234
316
|
close.className = "circle";
|
|
235
317
|
close.setAttribute("aria-label", "Dismiss");
|
|
236
|
-
const icon = document.createElement("
|
|
318
|
+
const icon = document.createElement("span");
|
|
237
319
|
icon.className = "material-symbols";
|
|
238
320
|
icon.setAttribute("aria-hidden", "true");
|
|
239
321
|
icon.textContent = "close";
|
|
@@ -246,7 +328,7 @@ var _Snackbar = class _Snackbar {
|
|
|
246
328
|
}
|
|
247
329
|
return snackbar;
|
|
248
330
|
}
|
|
249
|
-
_remove() {
|
|
331
|
+
_remove(advance = true) {
|
|
250
332
|
if (this._events.signal.aborted) return;
|
|
251
333
|
this._events.abort();
|
|
252
334
|
clearTimeout(this.counterTimeout);
|
|
@@ -263,10 +345,33 @@ var _Snackbar = class _Snackbar {
|
|
|
263
345
|
else this.el.remove();
|
|
264
346
|
const index = _Snackbar._snackbars.indexOf(this);
|
|
265
347
|
if (index >= 0) _Snackbar._snackbars.splice(index, 1);
|
|
266
|
-
if (
|
|
267
|
-
|
|
348
|
+
if (advance) _Snackbar._advance();
|
|
349
|
+
}
|
|
350
|
+
/** Shows the next queued snackbar once the screen is clear, or tidies up. */
|
|
351
|
+
static _advance() {
|
|
352
|
+
while (!_Snackbar._replacing && !_Snackbar._snackbars.length) {
|
|
353
|
+
const next = _Snackbar._queue.shift();
|
|
354
|
+
if (!next) return _Snackbar._tidy();
|
|
355
|
+
_Snackbar._showOrDrop(next);
|
|
268
356
|
}
|
|
269
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* A queued snackbar completes without showing when the page it was for has
|
|
360
|
+
* gone: its `root`, such as a removed shadow host, or its authored body.
|
|
361
|
+
* Shown there, nothing could reach it to dismiss it, and the queue would stall.
|
|
362
|
+
*/
|
|
363
|
+
static _showOrDrop(next) {
|
|
364
|
+
if (_Snackbar._canShow(next)) next._show();
|
|
365
|
+
else next._drop();
|
|
366
|
+
}
|
|
367
|
+
static _canShow(next) {
|
|
368
|
+
if (!next._portal.isConnected) return false;
|
|
369
|
+
return !!next.el || next._hasBody();
|
|
370
|
+
}
|
|
371
|
+
/** Removes the container once nothing is left in it. */
|
|
372
|
+
static _tidy() {
|
|
373
|
+
if (_Snackbar._container?.childElementCount === 0) _Snackbar._removeContainer();
|
|
374
|
+
}
|
|
270
375
|
_animateIn() {
|
|
271
376
|
this.el.style.display = "";
|
|
272
377
|
this.el.style.opacity = "0";
|
|
@@ -308,19 +413,20 @@ var _Snackbar = class _Snackbar {
|
|
|
308
413
|
const focused = this.el.getRootNode().activeElement;
|
|
309
414
|
const returnFocus = focused && this.el.contains(focused) ? this._returnFocus : null;
|
|
310
415
|
this.el.inert = true;
|
|
311
|
-
if (remove) this._remove();
|
|
416
|
+
if (remove) this._remove(false);
|
|
312
417
|
if (returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });
|
|
313
418
|
}
|
|
314
419
|
/**
|
|
315
420
|
* Dismiss snackbar with animation.
|
|
316
421
|
*/
|
|
317
422
|
dismiss() {
|
|
318
|
-
if (this.
|
|
423
|
+
if (this._leaveQueue()) return;
|
|
319
424
|
this._dismissed = true;
|
|
320
425
|
clearTimeout(this.counterTimeout);
|
|
321
426
|
this.counterTimeout = null;
|
|
322
427
|
this._restoreFocus();
|
|
323
428
|
if (this._events.signal.aborted) return;
|
|
429
|
+
Utils.emit(this.el, "close");
|
|
324
430
|
const duration = this.options.outDuration;
|
|
325
431
|
const transitions = [`margin ${duration}ms ease`, `opacity ${duration}ms ease`];
|
|
326
432
|
if (this.wasSwiped) {
|
|
@@ -336,6 +442,7 @@ var _Snackbar = class _Snackbar {
|
|
|
336
442
|
this.el.style.marginTop = "-40px";
|
|
337
443
|
}, 1);
|
|
338
444
|
this._dismissTimer = setTimeout(() => {
|
|
445
|
+
Utils.emit(this.el, "closed");
|
|
339
446
|
this._remove();
|
|
340
447
|
if (typeof this.options.completeCallback === "function") {
|
|
341
448
|
this.options.completeCallback();
|
|
@@ -343,9 +450,12 @@ var _Snackbar = class _Snackbar {
|
|
|
343
450
|
}, this.options.outDuration);
|
|
344
451
|
}
|
|
345
452
|
};
|
|
453
|
+
/** Set while a replacement clears the screen; the queue waits for it. */
|
|
454
|
+
_Snackbar._replacing = false;
|
|
346
455
|
/** Which pointer owns the drag in flight; a second finger is ignored. */
|
|
347
456
|
_Snackbar._dragPointerId = null;
|
|
348
457
|
_Snackbar._snackbars = [];
|
|
458
|
+
_Snackbar._queue = [];
|
|
349
459
|
_Snackbar._container = null;
|
|
350
460
|
_Snackbar._draggedSnackbar = null;
|
|
351
461
|
var Snackbar = _Snackbar;
|
|
@@ -353,4 +463,4 @@ var Snackbar = _Snackbar;
|
|
|
353
463
|
export {
|
|
354
464
|
Snackbar
|
|
355
465
|
};
|
|
356
|
-
//# sourceMappingURL=chunk-
|
|
466
|
+
//# sourceMappingURL=chunk-KZPSAXIU.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/snackbar.ts"],
|
|
4
|
+
"sourcesContent": ["import { BaseOptions } from '../core/component';\nimport { Utils, controllerFor, restoreAttribute } from '../core/utils';\n\nexport interface SnackbarOptions extends BaseOptions {\n /**\n * The content of the Snackbar.\n * @default \"\"\n */\n text: string;\n /**\n * Optional action label. Rendered as a trailing text button.\n * @default \"\"\n */\n action: string;\n /**\n * Called when the action button is pressed. The snackbar still dismisses.\n * @default null\n */\n onAction: () => void;\n /**\n * Show a trailing close icon button.\n * Defaults to true when action is set, otherwise false.\n */\n dismissible: boolean;\n /**\n * Element id of a `<template>` (or another element) used as the snackbar body.\n * @default \"\"\n */\n snackbarId?: string;\n /**\n * Length in ms the Snackbar stays before dismissal.\n * `Infinity` keeps it on screen until the user acts.\n * When `action` is set and this is omitted, the default is Infinity.\n * @default 4000\n */\n displayLength: number;\n /**\n * Transition in duration in milliseconds.\n * @default 300\n */\n inDuration: number;\n /**\n * Transition out duration in milliseconds.\n * @default 375\n */\n outDuration: number;\n /**\n * Classes to be added to the snackbar element.\n * @default \"\"\n */\n classes: string;\n /**\n * Callback function called when the snackbar is dismissed.\n * @default null\n */\n completeCallback: () => void;\n /**\n * The percentage of the snackbar's width it takes for a drag\n * to dismiss a Snackbar.\n * @default 0.8\n */\n activationPercent: number;\n /**\n * Any element in the tree the snackbar should render into. A Snackbar has no\n * originating element to infer this from, so pass one when the page lives in\n * a shadow root \u2014 the container is appended to that root instead of to\n * `document.body`, where a root-scoped stylesheet could not reach it.\n * @default null\n */\n root: HTMLElement;\n /**\n * Show at once, dismissing the snackbar on screen without its exit\n * animation, instead of waiting in the queue behind it.\n * @default false\n */\n replace: boolean;\n}\n\nconst _defaults: SnackbarOptions = {\n text: '',\n action: '',\n onAction: null,\n dismissible: false,\n displayLength: 4000,\n inDuration: 300,\n outDuration: 375,\n classes: '',\n completeCallback: null,\n activationPercent: 0.8,\n root: null,\n replace: false\n};\n\nexport class Snackbar {\n /** The snackbar element. */\n el: HTMLElement;\n /**\n * The remaining amount of time in ms that the snackbar\n * will stay before dismissal.\n */\n timeRemaining: number;\n /**\n * Describes the current pan state of the Snackbar.\n */\n panning: boolean;\n options: SnackbarOptions;\n message: string;\n counterTimeout: ReturnType<typeof setTimeout>;\n /** Wall-clock time the snackbar is due to dismiss, for pause/resume. */\n private _deadline: number;\n wasSwiped: boolean;\n startingXPos: number;\n xPos: number;\n time: number;\n deltaX: number;\n velocityX: number;\n /** Swipe distance that dismisses, measured once when the drag starts. */\n private _activationDistance: number;\n private _dismissed = false;\n private _returnFocus: HTMLElement | null = null;\n /** The document body or shadow root the snackbar renders into. */\n private _portal: HTMLElement | ShadowRoot;\n private _events: AbortController;\n private _restoreElement: (() => void) | null = null;\n private _transitionTimer: ReturnType<typeof setTimeout>;\n private _dismissTimer: ReturnType<typeof setTimeout>;\n private _focusTimer: ReturnType<typeof setTimeout>;\n\n /** The snackbar on screen, kept until its exit animation finishes. */\n static _snackbars: Snackbar[];\n /** Snackbars waiting for the one on screen to leave, oldest first. */\n static _queue: Snackbar[];\n /** Set while a replacement clears the screen; the queue waits for it. */\n private static _replacing = false;\n static _container: HTMLElement;\n static _draggedSnackbar: Snackbar;\n /** Which pointer owns the drag in flight; a second finger is ignored. */\n static _dragPointerId: number | null = null;\n\n /**\n * Whether a bar gets its close button when the page does not say. One with\n * an action waits for it, and one that never times out waits for the\n * reader; either way, swiping must not be the only way to send it off.\n */\n private static _needsClose(options: SnackbarOptions): boolean {\n return !!options.action || options.displayLength === Infinity;\n }\n\n constructor(options: Partial<SnackbarOptions> = {}) {\n this.options = {\n ...Snackbar.defaults,\n ...options\n };\n if (options.displayLength === undefined && this.options.action) {\n this.options.displayLength = Infinity;\n }\n if (options.dismissible === undefined) this.options.dismissible = Snackbar._needsClose(this.options);\n this.message = this.options.text;\n this.panning = false;\n this.timeRemaining = this.options.displayLength;\n // Worked out now: `root` may be inside the snackbar this one replaces,\n // and gone by the time it shows.\n this._portal = Utils.portalRoot(this.options.root ?? document.body);\n // First, so an authored body a re-render orphaned is back in its place.\n Snackbar._dropDetached();\n // An authored body is taken when the snackbar shows: one waiting in the\n // queue must not claim the element the snackbar on screen is using.\n if (this.options.snackbarId) this._requireBody();\n else this._build();\n // One snackbar at a time, as Material asks. Everything goes through the\n // queue, so arrivals show in order; a replacement goes to its front once\n // the screen is cleared.\n if (this.options.replace) Snackbar._replaceShown(this);\n else Snackbar._queue.push(this);\n Snackbar._advance();\n }\n\n /**\n * Lets go of snackbars a re-render took out of the page. A persistent one\n * would otherwise hold the queue for good.\n */\n private static _dropDetached() {\n for (const snackbar of Snackbar._snackbars.filter((shown) => !shown.el.isConnected)) {\n snackbar._dismissed = true;\n snackbar._remove(false);\n }\n }\n\n /** Throws now, rather than when the snackbar shows, if `snackbarId` names nothing. */\n private _requireBody() {\n if (!this._hasBody()) throw new Error('Snackbar body not found');\n }\n\n /** Whether the body a snackbar shows is still there: its own, or `snackbarId`'s. */\n private _hasBody(): boolean {\n return !this.options.snackbarId || !!Utils.getElementById(this._portal, this.options.snackbarId);\n }\n\n private _build() {\n this.el = this._createSnackbar();\n this.el['Expressive_Snackbar'] = this;\n }\n\n /**\n * Takes the snackbar on screen down at once, without starting the queue.\n * Restoring focus can open another, which goes too.\n */\n private static _replaceShown(replacement: Snackbar) {\n // A snackbar opened by the focus restore below must not start the queue,\n // or the next waiting one would show only to be cut short here.\n Snackbar._replacing = true;\n try {\n while (Snackbar._snackbars.length) {\n for (const snackbar of Snackbar._snackbars.splice(0)) {\n snackbar._dismissed = true;\n snackbar._restoreFocus(true);\n }\n }\n } finally {\n Snackbar._replacing = false;\n }\n Snackbar._queue.unshift(replacement);\n }\n\n /** Puts the snackbar on screen and starts its countdown. */\n private _show() {\n if (!this.el) this._build();\n this._returnFocus = Snackbar._focused();\n Snackbar._containerIn(this._portal).appendChild(this.el);\n Snackbar._snackbars.push(this);\n this._animateIn();\n this._setTimer();\n Utils.emit(this.el, 'open');\n }\n\n /** The focused element, looking inside open shadow roots. */\n private static _focused(): HTMLElement | null {\n let focused = document.activeElement;\n while (focused?.shadowRoot?.activeElement) focused = focused.shadowRoot.activeElement;\n return focused instanceof HTMLElement ? focused : null;\n }\n\n /**\n * One container serves every snackbar, and only one snackbar shows at a\n * time \u2014 so it is moved rather than duplicated when the root changes.\n */\n private static _containerIn(root: HTMLElement | ShadowRoot): HTMLElement {\n const container = Snackbar._container;\n if (container?.isConnected && container.parentNode === root) return container;\n Snackbar._removeContainer();\n Snackbar._createContainer(root);\n return Snackbar._container;\n }\n\n static get defaults(): SnackbarOptions {\n return _defaults;\n }\n\n static getInstance(el: HTMLElement): Snackbar {\n return el['Expressive_Snackbar'];\n }\n\n static _createContainer(root: HTMLElement | ShadowRoot = document.body) {\n const container = document.createElement('div');\n container.setAttribute('id', 'snackbar-container');\n // One listener per stage. These used to be a touch trio on the container\n // plus a mouse trio split across the container and the document, with a\n // helper picking `targetTouches[0].clientX` or `clientX` apart afterwards.\n // Move and up stay on the document so a drag that leaves the container\n // still completes.\n container.addEventListener('pointerdown', Snackbar._onDragStart);\n document.addEventListener('pointermove', Snackbar._onDragMove);\n document.addEventListener('pointerup', Snackbar._onDragEnd);\n document.addEventListener('pointercancel', Snackbar._onDragCancel);\n root.appendChild(container);\n Snackbar._container = container;\n }\n\n static _removeContainer() {\n document.removeEventListener('pointermove', Snackbar._onDragMove);\n document.removeEventListener('pointerup', Snackbar._onDragEnd);\n document.removeEventListener('pointercancel', Snackbar._onDragCancel);\n Snackbar._container?.remove();\n Snackbar._container = null;\n }\n\n static _onDragStart(e: PointerEvent) {\n if (!e.isPrimary) return;\n if (e.pointerType === 'mouse' && e.button !== 0) return;\n const target = e.target as HTMLElement | null;\n // Don't start a swipe from the action or close \u2014 those are buttons.\n if (target && !target.closest('button, a') && target.closest('.snackbar')) {\n const snackbarElem = target.closest('.snackbar') as HTMLElement;\n const snackbar: Snackbar = snackbarElem['Expressive_Snackbar'];\n if (!snackbar) return;\n snackbar.panning = true;\n snackbar._pauseTimer();\n Snackbar._draggedSnackbar = snackbar;\n snackbar.el.classList.add('panning');\n snackbar.el.style.transition = '';\n Snackbar._dragPointerId = e.pointerId;\n snackbar.startingXPos = e.clientX;\n snackbar.velocityX = 0;\n snackbar.time = Date.now();\n snackbar.xPos = e.clientX;\n // A translateX does not change the width, so one read covers the drag.\n snackbar._activationDistance = snackbar.el.offsetWidth * snackbar.options.activationPercent;\n }\n }\n\n static _onDragMove(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n if (!!Snackbar._draggedSnackbar) {\n e.preventDefault();\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.deltaX = Math.abs(snackbar.xPos - e.clientX);\n snackbar.xPos = e.clientX;\n // Two moves in the same millisecond would divide by zero, and an\n // infinite velocity dismisses on release.\n snackbar.velocityX = snackbar.deltaX / Math.max(1, Date.now() - snackbar.time);\n snackbar.time = Date.now();\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar._activationDistance;\n snackbar.el.style.transform = `translateX(${totalDeltaX}px)`;\n snackbar.el.style.opacity = (1 - Math.abs(totalDeltaX / activationDistance)).toString();\n }\n }\n\n static _onDragEnd(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n if (!!Snackbar._draggedSnackbar) {\n const snackbar = Snackbar._draggedSnackbar;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n\n const totalDeltaX = snackbar.xPos - snackbar.startingXPos;\n const activationDistance = snackbar._activationDistance;\n const velocity = Date.now() - snackbar.time < 100 ? snackbar.velocityX : 0;\n const shouldBeDismissed = Math.abs(totalDeltaX) > activationDistance || velocity > 1;\n\n // Remove snackbar\n if (shouldBeDismissed) {\n snackbar.wasSwiped = true;\n snackbar.dismiss();\n // Animate snackbar back to original position\n } else {\n snackbar._snapBack();\n }\n Snackbar._draggedSnackbar = null;\n }\n }\n\n /**\n * A cancelled pointer is not a short swipe. Snap back and resume the timer\n * without consulting the distance travelled - the browser took the gesture\n * over, so the movement so far says nothing about what the user wanted.\n */\n static _onDragCancel(e: PointerEvent) {\n if (Snackbar._dragPointerId !== e.pointerId) return;\n Snackbar._dragPointerId = null;\n const snackbar = Snackbar._draggedSnackbar;\n if (!snackbar) return;\n snackbar.panning = false;\n snackbar.el.classList.remove('panning');\n snackbar._snapBack();\n Snackbar._draggedSnackbar = null;\n }\n\n private _snapBack() {\n this.el.style.transition = 'transform .2s, opacity .2s';\n this.el.style.transform = '';\n this.el.style.opacity = '';\n this._resumeTimer();\n }\n\n /**\n * dismiss all snackbars.\n */\n static dismissAll() {\n // The queue first, so the one on screen does not hand over to it. Copy\n // first: dismiss() splices the lists it is iterating.\n for (const snackbar of [...Snackbar._queue, ...Snackbar._snackbars]) {\n snackbar.dismiss();\n }\n }\n\n /**\n * Whether dismiss() is done already: the snackbar was dismissed before, or\n * never showed and is dropped from the queue. A dropped one reports through\n * completeCallback but fires no events, never having been in the page.\n */\n private _leaveQueue(): boolean {\n if (this._dismissed) return true;\n const index = Snackbar._queue.indexOf(this);\n if (index < 0) return false;\n Snackbar._queue.splice(index, 1);\n this._drop();\n return true;\n }\n\n private _drop() {\n this._dismissed = true;\n // An authored body was never taken, so there is nothing to give back.\n if (this.el) this._remove(false);\n this.options.completeCallback?.();\n }\n\n _createSnackbar() {\n let snackbar: HTMLElement = this.options.snackbarId\n ? Utils.getElementById(this._portal, this.options.snackbarId)\n : document.createElement('div');\n if (snackbar instanceof HTMLTemplateElement) {\n const node = snackbar.content.cloneNode(true);\n snackbar = (node as HTMLElement).firstElementChild as HTMLElement;\n } else if (snackbar && this.options.snackbarId) {\n const placeholder = document.createComment('');\n snackbar.before(placeholder);\n const children = [...snackbar.childNodes];\n const attributes = ['class', 'style', 'role', 'aria-live', 'aria-atomic', 'inert']\n .map(name => [name, snackbar.getAttribute(name)]);\n this._restoreElement = () => {\n snackbar.replaceChildren(...children);\n for (const [name, value] of attributes) restoreAttribute(snackbar, name, value);\n placeholder.replaceWith(snackbar);\n };\n }\n if (!snackbar) throw new Error('Snackbar body not found');\n this._events = controllerFor(snackbar);\n const listenerOptions = { signal: this._events.signal };\n snackbar.classList.add('snackbar');\n snackbar.setAttribute('role', 'status');\n snackbar.setAttribute('aria-live', 'polite');\n snackbar.setAttribute('aria-atomic', 'true');\n snackbar.inert = false;\n snackbar.addEventListener('focusin', (e) => {\n if (e.relatedTarget instanceof HTMLElement && !snackbar.contains(e.relatedTarget)) {\n this._returnFocus = e.relatedTarget;\n }\n this._pauseTimer();\n }, listenerOptions);\n snackbar.addEventListener('keydown', (e) => {\n if (e.key !== 'Escape' || e.defaultPrevented || this._dismissed) return;\n e.preventDefault();\n e.stopPropagation();\n this.dismiss();\n }, listenerOptions);\n snackbar.addEventListener('focusout', () => {\n clearTimeout(this._focusTimer);\n this._focusTimer = setTimeout(() => this._resumeTimer(), 0);\n }, listenerOptions);\n snackbar.addEventListener('pointerenter', () => this._pauseTimer(), listenerOptions);\n snackbar.addEventListener('pointerleave', () => this._resumeTimer(), listenerOptions);\n // Add custom classes onto snackbar\n if (this.options.classes.length > 0) {\n snackbar.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n if (this.message) {\n const text = document.createElement('p');\n text.textContent = this.message;\n snackbar.replaceChildren(text);\n }\n if (this.options.action) {\n const action = document.createElement('button');\n action.type = 'button';\n action.textContent = this.options.action;\n action.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this._dismissed) return;\n try {\n if (typeof this.options.onAction === 'function') this.options.onAction();\n Utils.emit(this.el, 'action');\n } finally {\n this.dismiss();\n }\n }, listenerOptions);\n snackbar.appendChild(action);\n }\n if (this.options.dismissible) {\n const close = document.createElement('button');\n close.type = 'button';\n close.className = 'circle';\n close.setAttribute('aria-label', 'Dismiss');\n const icon = document.createElement('span');\n icon.className = 'material-symbols';\n icon.setAttribute('aria-hidden', 'true');\n icon.textContent = 'close';\n close.appendChild(icon);\n close.addEventListener('click', (e) => {\n e.stopPropagation();\n this.dismiss();\n }, listenerOptions);\n snackbar.appendChild(close);\n }\n return snackbar;\n }\n\n private _remove(advance = true) {\n if (this._events.signal.aborted) return;\n this._events.abort();\n clearTimeout(this.counterTimeout);\n clearTimeout(this._transitionTimer);\n clearTimeout(this._dismissTimer);\n clearTimeout(this._focusTimer);\n this.counterTimeout = null;\n if (Snackbar._draggedSnackbar === this) {\n Snackbar._draggedSnackbar = null;\n Snackbar._dragPointerId = null;\n }\n this.el['Expressive_Snackbar'] = undefined;\n if (this._restoreElement) this._restoreElement();\n else this.el.remove();\n const index = Snackbar._snackbars.indexOf(this);\n if (index >= 0) Snackbar._snackbars.splice(index, 1);\n if (advance) Snackbar._advance();\n }\n\n /** Shows the next queued snackbar once the screen is clear, or tidies up. */\n private static _advance() {\n while (!Snackbar._replacing && !Snackbar._snackbars.length) {\n const next = Snackbar._queue.shift();\n if (!next) return Snackbar._tidy();\n Snackbar._showOrDrop(next);\n }\n }\n\n /**\n * A queued snackbar completes without showing when the page it was for has\n * gone: its `root`, such as a removed shadow host, or its authored body.\n * Shown there, nothing could reach it to dismiss it, and the queue would stall.\n */\n private static _showOrDrop(next: Snackbar) {\n if (Snackbar._canShow(next)) next._show();\n else next._drop();\n }\n\n private static _canShow(next: Snackbar): boolean {\n if (!next._portal.isConnected) return false;\n return !!next.el || next._hasBody();\n }\n\n /** Removes the container once nothing is left in it. */\n private static _tidy() {\n if (Snackbar._container?.childElementCount === 0) Snackbar._removeContainer();\n }\n\n _animateIn() {\n this.el.style.display = '';\n this.el.style.opacity = '0';\n this.el.style.transform = 'translateY(24px)';\n this.el.style.transition = `\n transform ${this.options.inDuration}ms ease,\n opacity ${this.options.inDuration}ms ease\n `;\n this._transitionTimer = setTimeout(() => {\n this.el.style.transform = '';\n this.el.style.opacity = '1';\n }, 1);\n }\n\n /**\n * Arm the dismissal timer.\n *\n * One timeout, not a 20ms interval ticking a counter down: the old form woke\n * the page up 50 times a second per snackbar purely to subtract 20 from a\n * number. Dragging pauses the countdown via _pauseTimer/_resumeTimer instead.\n */\n _setTimer() {\n if (this.timeRemaining === Infinity) return;\n this._deadline = Date.now() + this.timeRemaining;\n this.counterTimeout = setTimeout(() => this.dismiss(), this.timeRemaining);\n }\n\n /** Stop the countdown, banking the time that was left on it. */\n _pauseTimer() {\n if (this.counterTimeout == null) return;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this.timeRemaining = Math.max(0, this._deadline - Date.now());\n }\n\n /** Restart a countdown stopped by {@link _pauseTimer}. */\n _resumeTimer() {\n if (this._dismissed || this.panning || this.el.matches(':hover, :focus-within') || this.counterTimeout != null) return;\n this._setTimer();\n }\n\n private _restoreFocus(remove = false) {\n const focused = (this.el.getRootNode() as Document | ShadowRoot).activeElement;\n const returnFocus = focused && this.el.contains(focused) ? this._returnFocus : null;\n this.el.inert = true;\n if (remove) this._remove(false);\n if (returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n }\n\n /**\n * Dismiss snackbar with animation.\n */\n dismiss() {\n if (this._leaveQueue()) return;\n this._dismissed = true;\n clearTimeout(this.counterTimeout);\n this.counterTimeout = null;\n this._restoreFocus();\n if (this._events.signal.aborted) return;\n Utils.emit(this.el, 'close');\n const duration = this.options.outDuration;\n const transitions = [`margin ${duration}ms ease`, `opacity ${duration}ms ease`];\n\n if (this.wasSwiped) {\n // Carry on off the side the user swiped toward, from where they let go.\n const direction = this.xPos < this.startingXPos ? -1 : 1;\n this.el.style.transform = `translateX(${direction * this.el.offsetWidth}px)`;\n this.el.style.opacity = '0';\n transitions.push(`transform ${duration}ms ease`);\n }\n\n this.el.style.transition = transitions.join(', ');\n\n clearTimeout(this._transitionTimer);\n this._transitionTimer = setTimeout(() => {\n this.el.style.opacity = '0';\n this.el.style.marginTop = '-40px';\n }, 1);\n\n this._dismissTimer = setTimeout(() => {\n // While the snackbar is still in the page, so the event reaches the document.\n Utils.emit(this.el, 'closed');\n this._remove();\n // Call the optional callback\n if (typeof this.options.completeCallback === 'function') {\n this.options.completeCallback();\n }\n }, this.options.outDuration);\n }\n\n static {\n Snackbar._snackbars = [];\n Snackbar._queue = [];\n Snackbar._container = null;\n Snackbar._draggedSnackbar = null;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|