@expressivecss/expressive 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1502 -1
- package/README.md +9 -8
- package/dist/css/expressive.css +19247 -11923
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
- package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
- package/dist/fonts/LICENSE-noto-sans-thai +93 -0
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-greek-400.woff2 +0 -0
- package/dist/fonts/roboto-greek-500.woff2 +0 -0
- package/dist/fonts/roboto-greek-700.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-latin-700.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
- package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
- package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
- package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
- package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
- package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
- package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
- package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
- package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
- package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
- package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
- package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
- package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-4QUCNFSD.mjs} +64 -113
- package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-4TRZ2AER.mjs} +35 -41
- package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
- package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-5KIHWJI2.mjs} +40 -26
- package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
- package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-67ZPPKXS.mjs} +20 -33
- package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-6FSEUFVW.mjs} +39 -26
- package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
- package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
- package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
- package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-75E5EDJF.mjs} +3 -11
- package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-7NLUI3RR.mjs} +139 -66
- package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
- package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
- package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
- package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
- package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
- package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
- package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
- package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
- package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-ANKFWNWT.mjs} +21 -45
- package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
- package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-B7DQFHA5.mjs} +30 -47
- package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
- package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
- package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-BPF3I2MN.mjs} +109 -24
- package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
- package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
- package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-CSYWKEK3.mjs} +310 -196
- package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
- package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
- package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
- package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
- package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
- package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-EC26RU2D.mjs} +11 -29
- package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
- package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-EVCVFEV3.mjs} +235 -146
- package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
- package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
- package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
- package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
- package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
- package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
- package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
- package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
- package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
- package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-ILDRRG7T.mjs} +21 -23
- package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
- package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
- package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
- package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
- package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
- package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
- package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-KZPSAXIU.mjs} +142 -32
- package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
- package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
- package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
- package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
- package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
- package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
- package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
- package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
- package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
- package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
- package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-OP43LLIC.mjs} +28 -45
- package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
- package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
- package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-OYNUDOHR.mjs} +19 -47
- package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UAZSDUVP.mjs → chunk-P6DRQ6KS.mjs} +36 -30
- package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
- package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
- package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
- package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
- package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-QXKWVHBD.mjs} +265 -161
- package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-ROH2HDB4.mjs} +7 -6
- package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
- package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
- package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-SPPHF7YZ.mjs} +36 -29
- package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
- package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
- package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
- package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
- package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
- package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
- package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
- package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-VGY4M57S.mjs} +266 -120
- package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
- package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
- package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
- package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
- package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-VMY55K2X.mjs} +76 -109
- package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-VR3L2WN5.mjs} +11 -17
- package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
- package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
- package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
- package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
- package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
- package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
- package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
- package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
- package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
- package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
- package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
- package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
- package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
- package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
- package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-ZJNLAGY5.mjs} +19 -30
- package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
- package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
- package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
- package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
- package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
- package/dist/js/expressive.cjs +10613 -4327
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +10613 -4327
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +23 -22
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +182 -71
- package/dist/js/expressive.mjs.map +2 -2
- package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
- package/dist/js/internal/behaviors/copy.mjs +9 -0
- package/dist/js/internal/behaviors/copy.mjs.map +7 -0
- package/dist/js/internal/behaviors/dataTables.mjs +10 -0
- package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
- package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
- package/dist/js/internal/behaviors/lists.mjs +8 -0
- package/dist/js/internal/behaviors/lists.mjs.map +7 -0
- package/dist/js/internal/behaviors/paneResize.mjs +8 -0
- package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
- package/dist/js/internal/behaviors/sortable.mjs +8 -0
- package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
- package/dist/js/internal/behaviors/theme.mjs +8 -0
- package/dist/js/internal/behaviors/theme.mjs.map +7 -0
- package/dist/js/internal/behaviors/tour.mjs +8 -0
- package/dist/js/internal/behaviors/tour.mjs.map +7 -0
- package/dist/js/internal/behaviors/transferList.mjs +8 -0
- package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
- package/dist/js/internal/components/appBar.mjs +3 -2
- package/dist/js/internal/components/autocomplete.mjs +4 -4
- package/dist/js/internal/components/backToTop.mjs +9 -0
- package/dist/js/internal/components/backToTop.mjs.map +7 -0
- package/dist/js/internal/components/barChart.mjs +5 -4
- package/dist/js/internal/components/buttonGroup.mjs +3 -2
- package/dist/js/internal/components/buttons.mjs +3 -3
- package/dist/js/internal/components/cards.mjs +3 -3
- package/dist/js/internal/components/carousel.mjs +3 -3
- package/dist/js/internal/components/cascader.mjs +10 -0
- package/dist/js/internal/components/cascader.mjs.map +7 -0
- package/dist/js/internal/components/characterCounter.mjs +3 -2
- package/dist/js/internal/components/chips.mjs +6 -5
- package/dist/js/internal/components/colorPicker.mjs +9 -0
- package/dist/js/internal/components/colorPicker.mjs.map +7 -0
- package/dist/js/internal/components/columnChart.mjs +4 -3
- package/dist/js/internal/components/commandPalette.mjs +3 -3
- package/dist/js/internal/components/confetti.mjs +3 -2
- package/dist/js/internal/components/currencyInput.mjs +9 -0
- package/dist/js/internal/components/currencyInput.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +11 -8
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/funnelChart.mjs +10 -0
- package/dist/js/internal/components/funnelChart.mjs.map +7 -0
- package/dist/js/internal/components/heatmapChart.mjs +4 -3
- package/dist/js/internal/components/hoverCard.mjs +9 -0
- package/dist/js/internal/components/hoverCard.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +131 -66
- package/dist/js/internal/components/inputMask.mjs +9 -0
- package/dist/js/internal/components/inputMask.mjs.map +7 -0
- package/dist/js/internal/components/keypad.mjs +3 -3
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/lineChart.mjs +25 -4
- package/dist/js/internal/components/loadingOverlay.mjs +9 -0
- package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
- package/dist/js/internal/components/mapView.mjs +3 -3
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/menubar.mjs +10 -0
- package/dist/js/internal/components/menubar.mjs.map +7 -0
- package/dist/js/internal/components/messageScroller.mjs +3 -3
- package/dist/js/internal/components/mixedChart.mjs +5 -4
- package/dist/js/internal/components/navigationRail.mjs +3 -2
- package/dist/js/internal/components/particles.mjs +3 -2
- package/dist/js/internal/components/pieChart.mjs +4 -3
- package/dist/js/internal/components/pullToRefresh.mjs +9 -0
- package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
- package/dist/js/internal/components/questionnaire.mjs +3 -3
- package/dist/js/internal/components/radarChart.mjs +4 -3
- package/dist/js/internal/components/radialChart.mjs +4 -3
- package/dist/js/internal/components/registry.mjs +59 -41
- package/dist/js/internal/components/richTextEditor.mjs +3 -3
- package/dist/js/internal/components/sankeyChart.mjs +10 -0
- package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
- package/dist/js/internal/components/scatterChart.mjs +10 -0
- package/dist/js/internal/components/scatterChart.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +3 -2
- package/dist/js/internal/components/select.mjs +4 -4
- package/dist/js/internal/components/showMore.mjs +9 -0
- package/dist/js/internal/components/showMore.mjs.map +7 -0
- package/dist/js/internal/components/slider.mjs +3 -3
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/swipeActions.mjs +9 -0
- package/dist/js/internal/components/swipeActions.mjs.map +7 -0
- package/dist/js/internal/components/tabs.mjs +3 -4
- package/dist/js/internal/components/timepicker.mjs +5 -4
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/components/treeSelect.mjs +13 -0
- package/dist/js/internal/components/treeSelect.mjs.map +7 -0
- package/dist/js/internal/components/treemapChart.mjs +10 -0
- package/dist/js/internal/components/treemapChart.mjs.map +7 -0
- package/dist/js/internal/core/component.mjs +2 -1
- package/dist/js/internal/core/formControl.mjs +12 -0
- package/dist/js/internal/core/formControl.mjs.map +7 -0
- package/dist/js/internal/core/spring.mjs +11 -0
- package/dist/js/internal/core/spring.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +11 -3
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
- package/dist/js/modular.mjs +173 -71
- package/dist/types/behaviors/bottomSheets.d.ts +19 -3
- package/dist/types/behaviors/copy.d.ts +18 -0
- package/dist/types/behaviors/dataTables.d.ts +129 -0
- package/dist/types/behaviors/dialogs.d.ts +27 -1
- package/dist/types/behaviors/forms.d.ts +68 -2
- package/dist/types/behaviors/imageCompare.d.ts +12 -0
- package/dist/types/behaviors/lists.d.ts +12 -0
- package/dist/types/behaviors/paneResize.d.ts +29 -0
- package/dist/types/behaviors/sheetDrag.d.ts +18 -0
- package/dist/types/behaviors/sideSheets.d.ts +1 -1
- package/dist/types/behaviors/sortable.d.ts +28 -0
- package/dist/types/behaviors/theme.d.ts +22 -0
- package/dist/types/behaviors/tour.d.ts +36 -0
- package/dist/types/behaviors/transferList.d.ts +51 -0
- package/dist/types/components/appBar.d.ts +5 -6
- package/dist/types/components/autocomplete.d.ts +91 -17
- package/dist/types/components/backToTop.d.ts +36 -0
- package/dist/types/components/barChart.d.ts +3 -6
- package/dist/types/components/buttonGroup.d.ts +2 -4
- package/dist/types/components/buttons.d.ts +5 -5
- package/dist/types/components/cards.d.ts +3 -16
- package/dist/types/components/carousel.d.ts +9 -15
- package/dist/types/components/cascader.d.ts +130 -0
- package/dist/types/components/characterCounter.d.ts +2 -15
- package/dist/types/components/chips.d.ts +65 -19
- package/dist/types/components/colorPicker.d.ts +42 -0
- package/dist/types/components/columnChart.d.ts +23 -10
- package/dist/types/components/commandPalette.d.ts +11 -16
- package/dist/types/components/confetti.d.ts +2 -4
- package/dist/types/components/currencyInput.d.ts +59 -0
- package/dist/types/components/datepicker.d.ts +56 -32
- package/dist/types/components/expandingCard.d.ts +4 -6
- package/dist/types/components/funnelChart.d.ts +38 -0
- package/dist/types/components/heatmapChart.d.ts +39 -8
- package/dist/types/components/hoverCard.d.ts +58 -0
- package/dist/types/components/index.d.ts +16 -1
- package/dist/types/components/inputMask.d.ts +30 -0
- package/dist/types/components/keypad.d.ts +38 -6
- package/dist/types/components/lightbox.d.ts +14 -20
- package/dist/types/components/lineChart.d.ts +172 -10
- package/dist/types/components/loadingOverlay.d.ts +42 -0
- package/dist/types/components/mapView.d.ts +26 -17
- package/dist/types/components/menu.d.ts +60 -22
- package/dist/types/components/menubar.d.ts +37 -0
- package/dist/types/components/messageScroller.d.ts +2 -14
- package/dist/types/components/mixedChart.d.ts +15 -6
- package/dist/types/components/navigationRail.d.ts +16 -5
- package/dist/types/components/particles.d.ts +8 -4
- package/dist/types/components/pieChart.d.ts +32 -7
- package/dist/types/components/pullToRefresh.d.ts +80 -0
- package/dist/types/components/questionnaire.d.ts +58 -16
- package/dist/types/components/radarChart.d.ts +10 -6
- package/dist/types/components/radialChart.d.ts +58 -7
- package/dist/types/components/registry.d.ts +73 -3
- package/dist/types/components/richTextEditor.d.ts +6 -14
- package/dist/types/components/sankeyChart.d.ts +72 -0
- package/dist/types/components/scatterChart.d.ts +102 -0
- package/dist/types/components/scrollspy.d.ts +3 -5
- package/dist/types/components/select.d.ts +43 -30
- package/dist/types/components/showMore.d.ts +51 -0
- package/dist/types/components/slider.d.ts +3 -15
- package/dist/types/components/snackbar.d.ts +61 -0
- package/dist/types/components/swipeActions.d.ts +81 -0
- package/dist/types/components/tabs.d.ts +89 -27
- package/dist/types/components/timepicker.d.ts +113 -21
- package/dist/types/components/tooltip.d.ts +56 -20
- package/dist/types/components/treeSelect.d.ts +106 -0
- package/dist/types/components/treemapChart.d.ts +56 -0
- package/dist/types/core/component.d.ts +43 -25
- package/dist/types/core/formControl.d.ts +21 -0
- package/dist/types/core/spring.d.ts +20 -0
- package/dist/types/core/utils.d.ts +85 -72
- package/dist/types/modular.d.ts +33 -1
- package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -8
- package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
- package/package.json +10 -8
- package/src/sass/README.md +27 -18
- package/src/sass/abstracts/_elevation.scss +13 -7
- package/src/sass/abstracts/_index.scss +1 -0
- package/src/sass/abstracts/_mixins.scss +422 -36
- package/src/sass/abstracts/_spring.scss +63 -0
- package/src/sass/abstracts/_variables.scss +39 -21
- package/src/sass/base/_fonts.scss +61 -48
- package/src/sass/base/_global.scss +104 -24
- package/src/sass/base/_index.scss +2 -0
- package/src/sass/base/_normalize.scss +59 -114
- package/src/sass/base/_print.scss +21 -0
- package/src/sass/base/_prose.scss +68 -0
- package/src/sass/base/_typography.scss +9 -5
- package/src/sass/components/_accordion.scss +9 -16
- package/src/sass/components/_alert.scss +102 -0
- package/src/sass/components/_aura.scss +8 -3
- package/src/sass/components/_avatar.scss +3 -3
- package/src/sass/components/_back-to-top.scss +38 -0
- package/src/sass/components/_badges.scss +6 -5
- package/src/sass/components/_bar-chart.scss +41 -19
- package/src/sass/components/_bottom-sheet.scss +44 -16
- package/src/sass/components/_breadcrumb.scss +8 -1
- package/src/sass/components/_button-groups.scss +15 -25
- package/src/sass/components/_buttons.scss +156 -63
- package/src/sass/components/_calendar.scss +246 -0
- package/src/sass/components/_cards.scss +36 -44
- package/src/sass/components/_carousel.scss +27 -103
- package/src/sass/components/_cascader.scss +142 -0
- package/src/sass/components/_chips.scss +36 -46
- package/src/sass/components/_column-chart.scss +19 -12
- package/src/sass/components/_command-palette.scss +4 -7
- package/src/sass/components/_confetti.scss +0 -2
- package/src/sass/components/_countdown.scss +1 -1
- package/src/sass/components/_data-table.scss +162 -25
- package/src/sass/components/_datepicker.scss +54 -40
- package/src/sass/components/_description-list.scss +85 -0
- package/src/sass/components/_dialog.scss +42 -41
- package/src/sass/components/_docked-display.scss +1 -3
- package/src/sass/components/_drag-handle.scss +16 -20
- package/src/sass/components/_expanding-card.scss +20 -9
- package/src/sass/components/_fab-menu.scss +44 -32
- package/src/sass/components/_funnel-chart.scss +124 -0
- package/src/sass/components/_heatmap-chart.scss +111 -22
- package/src/sass/components/_icon-buttons.scss +7 -7
- package/src/sass/components/_icons-material-design.scss +2 -2
- package/src/sass/components/_image-compare.scss +108 -0
- package/src/sass/components/_index.scss +20 -0
- package/src/sass/components/_keypad.scss +39 -19
- package/src/sass/components/_kpi.scss +6 -11
- package/src/sass/components/_lightbox.scss +24 -13
- package/src/sass/components/_line-chart.scss +16 -2
- package/src/sass/components/_list.scss +59 -14
- package/src/sass/components/_loading-indicator.scss +1 -0
- package/src/sass/components/_loading-overlay.scss +105 -0
- package/src/sass/components/_map.scss +33 -11
- package/src/sass/components/_marquee.scss +3 -2
- package/src/sass/components/_mega-menu.scss +137 -0
- package/src/sass/components/_menu.scss +143 -123
- package/src/sass/components/_menubar.scss +59 -0
- package/src/sass/components/_message-scroller.scss +2 -2
- package/src/sass/components/_message.scss +3 -3
- package/src/sass/components/_mixed-chart.scss +37 -9
- package/src/sass/components/_modal-display.scss +21 -0
- package/src/sass/components/_navbar.scss +34 -20
- package/src/sass/components/_navigation-bar.scss +15 -77
- package/src/sass/components/_navigation-rail.scss +151 -92
- package/src/sass/components/_org-chart.scss +192 -0
- package/src/sass/components/_page-footer.scss +1 -1
- package/src/sass/components/_pagination.scss +6 -13
- package/src/sass/components/_panes.scss +32 -26
- package/src/sass/components/_particles.scss +0 -2
- package/src/sass/components/_pie-chart.scss +91 -11
- package/src/sass/components/_popover.scss +18 -5
- package/src/sass/components/_progress.scss +152 -31
- package/src/sass/components/_pull-to-refresh.scss +90 -0
- package/src/sass/components/_questionnaire.scss +74 -3
- package/src/sass/components/_radar-chart.scss +38 -10
- package/src/sass/components/_radial-chart.scss +113 -5
- package/src/sass/components/_rich-text-editor.scss +2 -2
- package/src/sass/components/_sankey-chart.scss +114 -0
- package/src/sass/components/_scatter-chart.scss +153 -0
- package/src/sass/components/_scrim.scss +0 -2
- package/src/sass/components/_scrollspy.scss +0 -2
- package/src/sass/components/_search.scss +26 -22
- package/src/sass/components/_show-more.scss +8 -0
- package/src/sass/components/_side-sheet.scss +23 -37
- package/src/sass/components/_skeleton.scss +2 -4
- package/src/sass/components/_snackbar.scss +27 -21
- package/src/sass/components/_split-button.scss +5 -5
- package/src/sass/components/_stat.scss +3 -8
- package/src/sass/components/_stepper.scss +1 -1
- package/src/sass/components/_swipe-actions.scss +71 -0
- package/src/sass/components/_tabs.scss +51 -32
- package/src/sass/components/_timeline.scss +12 -12
- package/src/sass/components/_timepicker.scss +109 -78
- package/src/sass/components/_toolbar.scss +35 -43
- package/src/sass/components/_tooltip.scss +21 -12
- package/src/sass/components/_tour.scss +89 -0
- package/src/sass/components/_transfer-list.scss +73 -0
- package/src/sass/components/_transitions.scss +4 -4
- package/src/sass/components/_tree.scss +3 -16
- package/src/sass/components/_treemap-chart.scss +122 -0
- package/src/sass/components/forms/_checkboxes.scss +106 -24
- package/src/sass/components/forms/_color-picker.scss +135 -0
- package/src/sass/components/forms/_color-swatches.scss +85 -0
- package/src/sass/components/forms/_drop-zone.scss +15 -9
- package/src/sass/components/forms/_fieldset.scss +7 -7
- package/src/sass/components/forms/_file-input.scss +6 -8
- package/src/sass/components/forms/_index.scss +3 -1
- package/src/sass/components/forms/_input-fields.scss +254 -90
- package/src/sass/components/forms/_radio-buttons.scss +33 -94
- package/src/sass/components/forms/_rating.scss +2 -32
- package/src/sass/components/forms/_select.scss +199 -20
- package/src/sass/components/forms/_slider.scss +91 -94
- package/src/sass/components/forms/_switches.scss +53 -164
- package/src/sass/custom.scss +10 -1
- package/src/sass/expressive.scss +3 -63
- package/src/sass/tokens/_contrast.scss +94 -0
- package/src/sass/tokens/_elevation.scss +16 -0
- package/src/sass/tokens/_index.scss +5 -0
- package/src/sass/tokens/_motion.scss +109 -0
- package/src/sass/tokens/_reference.scss +72 -141
- package/src/sass/tokens/_shape.scss +38 -0
- package/src/sass/tokens/_stacking.scss +27 -0
- package/src/sass/tokens/_state.scss +0 -2
- package/src/sass/tokens/_theme.scss +10 -1
- package/src/sass/tokens/_vibrant.scss +2 -5
- package/src/sass/utilities/_defer-render.scss +17 -0
- package/src/sass/utilities/_helpers.scss +183 -26
- package/src/sass/utilities/_index.scss +1 -0
- package/src/sass/utilities/_scroll-area.scss +0 -2
- package/src/sass/utilities/_spacing.scss +52 -34
- package/src/sass/utilities/_typescale.scss +8 -1
- package/src/sass/utilities/_visibility.scss +47 -76
- package/src/sass/utilities/_z-depth.scss +7 -4
- package/dist/js/chunks/chunk-33QVDDGR.mjs +0 -270
- package/dist/js/chunks/chunk-33QVDDGR.mjs.map +0 -7
- package/dist/js/chunks/chunk-45FER6RI.mjs +0 -59
- package/dist/js/chunks/chunk-45FER6RI.mjs.map +0 -7
- package/dist/js/chunks/chunk-5CEAOLUA.mjs.map +0 -7
- package/dist/js/chunks/chunk-6VATUZC6.mjs +0 -295
- package/dist/js/chunks/chunk-6VATUZC6.mjs.map +0 -7
- package/dist/js/chunks/chunk-74MXKKLN.mjs.map +0 -7
- package/dist/js/chunks/chunk-AIURVCG6.mjs +0 -55
- package/dist/js/chunks/chunk-AIURVCG6.mjs.map +0 -7
- package/dist/js/chunks/chunk-BGZLF6JZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-C6CHEWYP.mjs.map +0 -7
- package/dist/js/chunks/chunk-CK2XCICY.mjs.map +0 -7
- package/dist/js/chunks/chunk-CXXM2L4F.mjs +0 -344
- package/dist/js/chunks/chunk-CXXM2L4F.mjs.map +0 -7
- package/dist/js/chunks/chunk-DXGRXYYL.mjs.map +0 -7
- package/dist/js/chunks/chunk-FM5CZOUB.mjs.map +0 -7
- package/dist/js/chunks/chunk-GJL6GCIU.mjs.map +0 -7
- package/dist/js/chunks/chunk-K3HZMFMD.mjs +0 -135
- package/dist/js/chunks/chunk-K3HZMFMD.mjs.map +0 -7
- package/dist/js/chunks/chunk-KHXZ2A4K.mjs.map +0 -7
- package/dist/js/chunks/chunk-KQACNQ22.mjs +0 -7
- package/dist/js/chunks/chunk-KQACNQ22.mjs.map +0 -7
- package/dist/js/chunks/chunk-KUFHW3DS.mjs.map +0 -7
- package/dist/js/chunks/chunk-KVJAVDBC.mjs.map +0 -7
- package/dist/js/chunks/chunk-L27Q6ZMI.mjs.map +0 -7
- package/dist/js/chunks/chunk-LQWUDNHZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-M372EDXD.mjs +0 -322
- package/dist/js/chunks/chunk-M372EDXD.mjs.map +0 -7
- package/dist/js/chunks/chunk-M3MURWMB.mjs +0 -82
- package/dist/js/chunks/chunk-M3MURWMB.mjs.map +0 -7
- package/dist/js/chunks/chunk-NUHMOAOY.mjs.map +0 -7
- package/dist/js/chunks/chunk-OWG3LMUL.mjs +0 -169
- package/dist/js/chunks/chunk-OWG3LMUL.mjs.map +0 -7
- package/dist/js/chunks/chunk-PD6HYHAE.mjs +0 -48
- package/dist/js/chunks/chunk-PD6HYHAE.mjs.map +0 -7
- package/dist/js/chunks/chunk-PDG64UHF.mjs.map +0 -7
- package/dist/js/chunks/chunk-PO3AXVR3.mjs +0 -546
- package/dist/js/chunks/chunk-PO3AXVR3.mjs.map +0 -7
- package/dist/js/chunks/chunk-QYGK36OG.mjs +0 -181
- package/dist/js/chunks/chunk-QYGK36OG.mjs.map +0 -7
- package/dist/js/chunks/chunk-SFI2U4YW.mjs.map +0 -7
- package/dist/js/chunks/chunk-SMY7GJSS.mjs.map +0 -7
- package/dist/js/chunks/chunk-TCCA2HDG.mjs +0 -414
- package/dist/js/chunks/chunk-TCCA2HDG.mjs.map +0 -7
- package/dist/js/chunks/chunk-TSZYSW7F.mjs.map +0 -7
- package/dist/js/chunks/chunk-UAZSDUVP.mjs.map +0 -7
- package/dist/js/chunks/chunk-UBRZZWRA.mjs +0 -127
- package/dist/js/chunks/chunk-UBRZZWRA.mjs.map +0 -7
- package/dist/js/chunks/chunk-UCOE7ZDL.mjs +0 -287
- package/dist/js/chunks/chunk-UCOE7ZDL.mjs.map +0 -7
- package/dist/js/chunks/chunk-UETTGDLI.mjs.map +0 -7
- package/dist/js/chunks/chunk-UNCRDLP6.mjs +0 -136
- package/dist/js/chunks/chunk-UNCRDLP6.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGNYF6FB.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGPGBNGL.mjs +0 -68
- package/dist/js/chunks/chunk-VGPGBNGL.mjs.map +0 -7
- package/dist/js/chunks/chunk-VKAUVTQY.mjs +0 -1
- package/dist/js/chunks/chunk-VM4FTS7L.mjs +0 -48
- package/dist/js/chunks/chunk-VM4FTS7L.mjs.map +0 -7
- package/dist/js/chunks/chunk-WDK4T63U.mjs.map +0 -7
- package/dist/js/chunks/chunk-WOCCTVUF.mjs +0 -185
- package/dist/js/chunks/chunk-WOCCTVUF.mjs.map +0 -7
- package/dist/js/chunks/chunk-WQYN5L4E.mjs +0 -107
- package/dist/js/chunks/chunk-WQYN5L4E.mjs.map +0 -7
- package/dist/js/chunks/chunk-X4ISMKE2.mjs.map +0 -7
- package/dist/js/chunks/chunk-XAEAEHIX.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZX6M7SWO.mjs.map +0 -7
- /package/dist/js/chunks/{chunk-VKAUVTQY.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Component
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CMGXGYUC.mjs";
|
|
4
4
|
|
|
5
5
|
// src/ts/components/particles.ts
|
|
6
6
|
var _defaults = {
|
|
@@ -12,9 +12,9 @@ var _defaults = {
|
|
|
12
12
|
vx: 0,
|
|
13
13
|
vy: 0
|
|
14
14
|
};
|
|
15
|
-
var Particles = class
|
|
15
|
+
var Particles = class extends Component {
|
|
16
16
|
constructor(el, options) {
|
|
17
|
-
super(el, options
|
|
17
|
+
super(el, options);
|
|
18
18
|
this._particles = [];
|
|
19
19
|
this._width = 0;
|
|
20
20
|
this._height = 0;
|
|
@@ -23,53 +23,66 @@ var Particles = class _Particles extends Component {
|
|
|
23
23
|
// Pointer offset from the canvas center, kept from its last move inside.
|
|
24
24
|
this._mouse = { x: 0, y: 0 };
|
|
25
25
|
this._still = false;
|
|
26
|
+
this._visible = true;
|
|
27
|
+
this._motion = null;
|
|
28
|
+
this._theme = null;
|
|
26
29
|
this._resizeObserver = null;
|
|
27
30
|
this._visibility = null;
|
|
31
|
+
this._onMotion = () => {
|
|
32
|
+
this._still = this._motion.matches;
|
|
33
|
+
if (this._still) {
|
|
34
|
+
for (const p of this._particles) p.alpha = p.targetAlpha;
|
|
35
|
+
this._paint();
|
|
36
|
+
}
|
|
37
|
+
this._animate();
|
|
38
|
+
};
|
|
39
|
+
this._repaint = () => {
|
|
40
|
+
if (this._still) this._paint();
|
|
41
|
+
};
|
|
28
42
|
this._onPointerMove = (e) => {
|
|
29
43
|
const r = this.el.getBoundingClientRect();
|
|
30
44
|
const x = e.clientX - r.left - r.width / 2;
|
|
31
45
|
const y = e.clientY - r.top - r.height / 2;
|
|
32
46
|
if (Math.abs(x) < r.width / 2 && Math.abs(y) < r.height / 2) this._mouse = { x, y };
|
|
33
47
|
};
|
|
34
|
-
this.el["Expressive_Particles"] = this;
|
|
35
|
-
this.options = { ..._Particles.defaults, ...options };
|
|
36
48
|
this._ctx = this.el.getContext("2d");
|
|
37
49
|
if (!this._ctx) return;
|
|
38
50
|
this._style = getComputedStyle(this.el);
|
|
39
|
-
this.
|
|
51
|
+
this._motion = matchMedia("(prefers-reduced-motion: reduce)");
|
|
52
|
+
const { signal } = this._events;
|
|
53
|
+
this._motion.addEventListener("change", this._onMotion, { signal });
|
|
54
|
+
matchMedia("(prefers-color-scheme: dark)").addEventListener("change", this._repaint, { signal });
|
|
55
|
+
this._theme = new MutationObserver(this._repaint);
|
|
56
|
+
this._theme.observe(document.documentElement, { attributes: true, attributeFilter: ["theme"], subtree: true });
|
|
57
|
+
this._still = this._motion.matches;
|
|
40
58
|
this._reset();
|
|
41
|
-
|
|
42
|
-
this.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
this._start();
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
this._visibility = new IntersectionObserver(([entry]) => entry.isIntersecting ? this._start() : this._stop());
|
|
59
|
+
this._resizeObserver = new ResizeObserver(() => {
|
|
60
|
+
if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._reset();
|
|
61
|
+
});
|
|
62
|
+
this._resizeObserver.observe(this.el);
|
|
63
|
+
this._visibility = new IntersectionObserver((entries) => {
|
|
64
|
+
this._visible = entries[entries.length - 1].isIntersecting;
|
|
65
|
+
this._animate();
|
|
66
|
+
});
|
|
53
67
|
this._visibility.observe(this.el);
|
|
54
68
|
}
|
|
55
69
|
static get defaults() {
|
|
56
70
|
return _defaults;
|
|
57
71
|
}
|
|
58
|
-
static init(els, options = {}) {
|
|
59
|
-
return super.init(els, options, _Particles);
|
|
60
|
-
}
|
|
61
|
-
static getInstance(el) {
|
|
62
|
-
return el["Expressive_Particles"];
|
|
63
|
-
}
|
|
64
72
|
destroy() {
|
|
65
73
|
this._stop();
|
|
74
|
+
this._theme?.disconnect();
|
|
66
75
|
this._resizeObserver?.disconnect();
|
|
67
76
|
this._visibility?.disconnect();
|
|
68
77
|
if (this._ctx) {
|
|
69
78
|
this._ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
70
79
|
this._ctx.clearRect(0, 0, this.el.width, this.el.height);
|
|
71
80
|
}
|
|
72
|
-
|
|
81
|
+
super.destroy();
|
|
82
|
+
}
|
|
83
|
+
_animate() {
|
|
84
|
+
if (this._visible && !this._still) this._start();
|
|
85
|
+
else this._stop();
|
|
73
86
|
}
|
|
74
87
|
_start() {
|
|
75
88
|
if (this._frame) return;
|
|
@@ -147,8 +160,9 @@ var Particles = class _Particles extends Component {
|
|
|
147
160
|
ctx.globalAlpha = 1;
|
|
148
161
|
}
|
|
149
162
|
};
|
|
163
|
+
Particles.key = "Expressive_Particles";
|
|
150
164
|
|
|
151
165
|
export {
|
|
152
166
|
Particles
|
|
153
167
|
};
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
168
|
+
//# sourceMappingURL=chunk-5KIHWJI2.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/particles.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions } from '../core/component';\n\nexport interface ParticlesOptions extends BaseOptions {\n /**\n * Number of particles.\n * @default 100\n */\n quantity: number;\n /**\n * How firmly particles hold their place against the pointer. Lower\n * follows the pointer further.\n * @default 50\n */\n staticity: number;\n /**\n * Frames a particle takes to catch up with the pointer. Higher is slower.\n * @default 50\n */\n ease: number;\n /**\n * Base radius in pixels. Each particle adds 0 or 1 to it.\n * @default 0.4\n */\n size: number;\n /**\n * A CSS color. Empty uses the canvas's CSS `color`, which defaults to the\n * theme's on-surface color.\n * @default ''\n */\n color: string;\n /**\n * Horizontal drift in pixels per frame. Negative drifts left.\n * @default 0\n */\n vx: number;\n /**\n * Vertical drift in pixels per frame. Negative drifts up.\n * @default 0\n */\n vy: number;\n}\n\nconst _defaults: ParticlesOptions = {\n quantity: 100,\n staticity: 50,\n ease: 50,\n size: 0.4,\n color: '',\n vx: 0,\n vy: 0\n};\n\ninterface Particle {\n x: number;\n y: number;\n translateX: number;\n translateY: number;\n size: number;\n alpha: number;\n targetAlpha: number;\n dx: number;\n dy: number;\n magnetism: number;\n}\n\n/**\n * Particles. A `<canvas class=\"particles\">` covers its nearest positioned\n * ancestor with slowly drifting dots that lean toward the pointer. Under\n * reduced motion the dots are drawn once and stay still.\n */\nexport class Particles extends Component<ParticlesOptions> {\n declare el: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D | null;\n private _style: CSSStyleDeclaration;\n private _particles: Particle[] = [];\n private _width = 0;\n private _height = 0;\n private _frame = 0;\n private _last = 0;\n // Pointer offset from the canvas center, kept from its last move inside.\n private _mouse = { x: 0, y: 0 };\n private _still = false;\n private _visible = true;\n private _motion: MediaQueryList | null = null;\n private _theme: MutationObserver | null = null;\n private _resizeObserver: ResizeObserver | null = null;\n private _visibility: IntersectionObserver | null = null;\n\n constructor(el: HTMLElement, options: Partial<ParticlesOptions>) {\n super(el, options);\n this._ctx = this.el.getContext('2d');\n if (!this._ctx) return;\n this._style = getComputedStyle(this.el);\n this._motion = matchMedia('(prefers-reduced-motion: reduce)');\n const { signal } = this._events;\n this._motion.addEventListener('change', this._onMotion, { signal });\n // Still dots are painted once, so a theme or color-scheme change\n // repaints them. Moving ones read the color every frame anyway.\n matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this._repaint, { signal });\n this._theme = new MutationObserver(this._repaint);\n this._theme.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n this._still = this._motion.matches;\n this._reset();\n this._resizeObserver = new ResizeObserver(() => {\n if (this.el.clientWidth !== this._width || this.el.clientHeight !== this._height) this._reset();\n });\n this._resizeObserver.observe(this.el);\n // Animates only while on screen. A canvas scrolled away, hidden or\n // removed without destroy() stops drawing and following the pointer.\n // Entries arrive oldest first, so the last one is the current state.\n this._visibility = new IntersectionObserver((entries) => {\n this._visible = entries[entries.length - 1].isIntersecting;\n this._animate();\n });\n this._visibility.observe(this.el);\n }\n\n static get defaults(): ParticlesOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Particles';\n\n destroy() {\n this._stop();\n this._theme?.disconnect();\n this._resizeObserver?.disconnect();\n this._visibility?.disconnect();\n if (this._ctx) {\n this._ctx.setTransform(1, 0, 0, 1, 0, 0);\n this._ctx.clearRect(0, 0, this.el.width, this.el.height);\n }\n super.destroy();\n }\n\n private _animate() {\n if (this._visible && !this._still) this._start();\n else this._stop();\n }\n\n private _onMotion = () => {\n this._still = this._motion.matches;\n if (this._still) {\n for (const p of this._particles) p.alpha = p.targetAlpha;\n this._paint();\n }\n this._animate();\n };\n\n private _repaint = () => {\n if (this._still) this._paint();\n };\n\n private _start() {\n if (this._frame) return;\n window.addEventListener('pointermove', this._onPointerMove, { passive: true });\n this._frame = requestAnimationFrame((now) => { this._last = now; this._draw(now); });\n }\n\n private _stop() {\n cancelAnimationFrame(this._frame);\n this._frame = 0;\n window.removeEventListener('pointermove', this._onPointerMove);\n }\n\n private _onPointerMove = (e: PointerEvent) => {\n const r = this.el.getBoundingClientRect();\n const x = e.clientX - r.left - r.width / 2;\n const y = e.clientY - r.top - r.height / 2;\n if (Math.abs(x) < r.width / 2 && Math.abs(y) < r.height / 2) this._mouse = { x, y };\n };\n\n // Matches the pixel buffer to the canvas box and scatters a new set.\n private _reset() {\n this._width = this.el.clientWidth;\n this._height = this.el.clientHeight;\n this.el.width = Math.round(this._width * devicePixelRatio);\n this.el.height = Math.round(this._height * devicePixelRatio);\n this._particles = Array.from({ length: this.options.quantity }, () => this._particle());\n if (this._still) {\n for (const p of this._particles) p.alpha = p.targetAlpha;\n this._paint();\n }\n }\n\n private _particle(): Particle {\n return {\n x: Math.floor(Math.random() * this._width),\n y: Math.floor(Math.random() * this._height),\n translateX: 0,\n translateY: 0,\n size: Math.floor(Math.random() * 2) + this.options.size,\n alpha: 0,\n targetAlpha: Math.round((Math.random() * 0.6 + 0.1) * 10) / 10,\n dx: (Math.random() - 0.5) * 0.1,\n dy: (Math.random() - 0.5) * 0.1,\n magnetism: 0.1 + Math.random() * 4\n };\n }\n\n private _draw(now: number) {\n // Frames are counted at 60 per second whatever the display rate.\n const step = Math.min((now - this._last) / (1000 / 60), 4);\n this._last = now;\n const { staticity, ease, vx, vy } = this.options;\n const follow = Math.min(step / ease, 1);\n this._particles = this._particles.map((p) => {\n p.x += (p.dx + vx) * step;\n p.y += (p.dy + vy) * step;\n p.translateX += (this._mouse.x / (staticity / p.magnetism) - p.translateX) * follow;\n p.translateY += (this._mouse.y / (staticity / p.magnetism) - p.translateY) * follow;\n // Fades in, and fades out within 20px of an edge.\n const x = p.x + p.translateX;\n const y = p.y + p.translateY;\n const edge = Math.min(x - p.size, this._width - x - p.size, y - p.size, this._height - y - p.size) / 20;\n p.alpha = edge > 1 ? Math.min(p.alpha + 0.02 * step, p.targetAlpha) : p.targetAlpha * edge;\n const gone = p.x < -p.size || p.x > this._width + p.size || p.y < -p.size || p.y > this._height + p.size;\n return gone ? this._particle() : p;\n });\n this._paint();\n this._frame = requestAnimationFrame((t) => this._draw(t));\n }\n\n private _paint() {\n const ctx = this._ctx!;\n const dpr = devicePixelRatio;\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, this.el.width, this.el.height);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n // Read every frame, so a theme or color-scheme change applies at once.\n ctx.fillStyle = this.options.color || this._style.color;\n for (const p of this._particles) {\n if (p.alpha <= 0) continue;\n ctx.globalAlpha = p.alpha;\n ctx.beginPath();\n ctx.arc(p.x + p.translateX, p.y + p.translateY, p.size, 0, 2 * Math.PI);\n ctx.fill();\n }\n ctx.globalAlpha = 1;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Component
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CMGXGYUC.mjs";
|
|
4
|
+
import {
|
|
5
|
+
restoreAttribute
|
|
6
|
+
} from "./chunk-ZVLOUDIJ.mjs";
|
|
4
7
|
|
|
5
8
|
// src/ts/components/buttonGroup.ts
|
|
6
9
|
var _defaults = {};
|
|
7
10
|
var VALID_SELECTION_MODES = /* @__PURE__ */ new Set(["single", "multiple"]);
|
|
8
11
|
var PRESSED_CLASS = "button-group-pressed";
|
|
9
12
|
var MAX_ICON_COMPRESSION = 0.15;
|
|
10
|
-
var ButtonGroup = class
|
|
13
|
+
var ButtonGroup = class extends Component {
|
|
11
14
|
constructor(el, options = {}) {
|
|
12
|
-
super(el, options
|
|
15
|
+
super(el, options);
|
|
13
16
|
this._pressedStyles = /* @__PURE__ */ new Map();
|
|
14
17
|
this._releaseStyles = /* @__PURE__ */ new Map();
|
|
15
18
|
this._releaseTimer = null;
|
|
@@ -34,6 +37,7 @@ var ButtonGroup = class _ButtonGroup extends Component {
|
|
|
34
37
|
});
|
|
35
38
|
}
|
|
36
39
|
item.setAttribute("aria-pressed", willSelect ? "true" : "false");
|
|
40
|
+
this._notify("change", null, { detail: { button: item, pressed: willSelect } });
|
|
37
41
|
};
|
|
38
42
|
this._handlePointerDown = (event) => {
|
|
39
43
|
if (event.button !== 0) return;
|
|
@@ -69,46 +73,28 @@ var ButtonGroup = class _ButtonGroup extends Component {
|
|
|
69
73
|
for (const [item, style] of this._releaseStyles) item.style.width = style.width;
|
|
70
74
|
this._releaseStyles.clear();
|
|
71
75
|
};
|
|
72
|
-
|
|
73
|
-
this.options = { ..._ButtonGroup.defaults, ...options };
|
|
76
|
+
const { signal } = this._events;
|
|
74
77
|
if (this._selectionMode) {
|
|
75
78
|
this._normalizeSelection();
|
|
76
|
-
this.el.addEventListener("click", this._handleClick, true);
|
|
79
|
+
this.el.addEventListener("click", this._handleClick, { capture: true, signal });
|
|
77
80
|
}
|
|
78
|
-
this.el.addEventListener("pointerdown", this._handlePointerDown);
|
|
79
|
-
this.el.addEventListener("keydown", this._handleKeyDown);
|
|
80
|
-
this.el.addEventListener("focusout", this._handleFocusOut);
|
|
81
|
-
document.addEventListener("pointerup", this._resetPress);
|
|
82
|
-
document.addEventListener("pointercancel", this._resetPress);
|
|
83
|
-
document.addEventListener("keyup", this._handleKeyUp);
|
|
84
|
-
window.addEventListener("blur", this._resetPress);
|
|
81
|
+
this.el.addEventListener("pointerdown", this._handlePointerDown, { signal });
|
|
82
|
+
this.el.addEventListener("keydown", this._handleKeyDown, { signal });
|
|
83
|
+
this.el.addEventListener("focusout", this._handleFocusOut, { signal });
|
|
84
|
+
document.addEventListener("pointerup", this._resetPress, { signal });
|
|
85
|
+
document.addEventListener("pointercancel", this._resetPress, { signal });
|
|
86
|
+
document.addEventListener("keyup", this._handleKeyUp, { signal });
|
|
87
|
+
window.addEventListener("blur", this._resetPress, { signal });
|
|
85
88
|
}
|
|
86
89
|
static get defaults() {
|
|
87
90
|
return _defaults;
|
|
88
91
|
}
|
|
89
|
-
static init(els, options = {}) {
|
|
90
|
-
return super.init(els, options, _ButtonGroup);
|
|
91
|
-
}
|
|
92
|
-
static getInstance(el) {
|
|
93
|
-
return el["Expressive_ButtonGroup"];
|
|
94
|
-
}
|
|
95
92
|
destroy() {
|
|
96
93
|
this._resetPress();
|
|
97
94
|
this._finishRelease();
|
|
98
|
-
this.
|
|
99
|
-
this.el.removeEventListener("pointerdown", this._handlePointerDown);
|
|
100
|
-
this.el.removeEventListener("keydown", this._handleKeyDown);
|
|
101
|
-
this.el.removeEventListener("focusout", this._handleFocusOut);
|
|
102
|
-
document.removeEventListener("pointerup", this._resetPress);
|
|
103
|
-
document.removeEventListener("pointercancel", this._resetPress);
|
|
104
|
-
document.removeEventListener("keyup", this._handleKeyUp);
|
|
105
|
-
window.removeEventListener("blur", this._resetPress);
|
|
106
|
-
for (const [item, value] of this._originalPressed) {
|
|
107
|
-
if (value === null) item.removeAttribute("aria-pressed");
|
|
108
|
-
else item.setAttribute("aria-pressed", value);
|
|
109
|
-
}
|
|
95
|
+
for (const [item, value] of this._originalPressed) restoreAttribute(item, "aria-pressed", value);
|
|
110
96
|
this._originalPressed.clear();
|
|
111
|
-
|
|
97
|
+
super.destroy();
|
|
112
98
|
}
|
|
113
99
|
get _selectionMode() {
|
|
114
100
|
const mode = this.el.dataset.selection;
|
|
@@ -219,8 +205,9 @@ var ButtonGroup = class _ButtonGroup extends Component {
|
|
|
219
205
|
return Math.max(0, rect.width - minimumWidth);
|
|
220
206
|
}
|
|
221
207
|
};
|
|
208
|
+
ButtonGroup.key = "Expressive_ButtonGroup";
|
|
222
209
|
|
|
223
210
|
export {
|
|
224
211
|
ButtonGroup
|
|
225
212
|
};
|
|
226
|
-
//# sourceMappingURL=chunk-
|
|
213
|
+
//# sourceMappingURL=chunk-67ZPPKXS.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/buttonGroup.ts"],
|
|
4
|
+
"sourcesContent": ["import { restoreAttribute } from '../core/utils';\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ButtonGroupOptions extends BaseOptions {}\n\ntype SavedItemStyle = {\n width: string;\n baseWidth: number;\n};\n\nconst _defaults: ButtonGroupOptions = {};\nconst VALID_SELECTION_MODES = new Set([\"single\", \"multiple\"]);\nconst PRESSED_CLASS = \"button-group-pressed\";\nconst MAX_ICON_COMPRESSION = 0.15;\n\n/**\n * Coordinates Material button-group press geometry and optional toggle state.\n *\n * Standard groups redistribute the pressed item's 15% width growth from its\n * immediate neighbors. `data-selection=\"single|multiple\"` also enables\n * `aria-pressed` state management.\n */\nexport class ButtonGroup extends Component<ButtonGroupOptions> {\n private _pressedStyles = new Map<HTMLElement, SavedItemStyle>();\n private _releaseStyles = new Map<HTMLElement, SavedItemStyle>();\n private _releaseTimer: number | null = null;\n private _originalPressed = new Map<HTMLButtonElement, string | null>();\n private _activeItem: HTMLElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<ButtonGroupOptions> = {}) {\n super(el, options);\n\n const { signal } = this._events;\n if (this._selectionMode) {\n this._normalizeSelection();\n this.el.addEventListener(\"click\", this._handleClick, { capture: true, signal });\n }\n this.el.addEventListener(\"pointerdown\", this._handlePointerDown, { signal });\n this.el.addEventListener(\"keydown\", this._handleKeyDown, { signal });\n this.el.addEventListener(\"focusout\", this._handleFocusOut, { signal });\n document.addEventListener(\"pointerup\", this._resetPress, { signal });\n document.addEventListener(\"pointercancel\", this._resetPress, { signal });\n document.addEventListener(\"keyup\", this._handleKeyUp, { signal });\n window.addEventListener(\"blur\", this._resetPress, { signal });\n }\n\n static get defaults() {\n return _defaults;\n }\n\n static key = 'Expressive_ButtonGroup';\n\n destroy() {\n this._resetPress();\n this._finishRelease();\n for (const [item, value] of this._originalPressed) restoreAttribute(item, \"aria-pressed\", value);\n this._originalPressed.clear();\n super.destroy();\n }\n\n private get _selectionMode(): \"single\" | \"multiple\" | null {\n const mode = this.el.dataset.selection;\n return VALID_SELECTION_MODES.has(mode) ? (mode as \"single\" | \"multiple\") : null;\n }\n\n private get _items(): HTMLElement[] {\n return Array.from(this.el.children).filter(\n (child): child is HTMLElement =>\n child instanceof HTMLButtonElement ||\n (child instanceof HTMLAnchorElement && child.classList.contains(\"button\")),\n );\n }\n\n private get _toggleItems(): HTMLButtonElement[] {\n return this._items.filter(\n (item): item is HTMLButtonElement => item instanceof HTMLButtonElement,\n );\n }\n\n private _normalizeSelection() {\n const items = this._toggleItems;\n items.forEach((item) => {\n this._rememberPressed(item);\n if (![\"true\", \"false\"].includes(item.getAttribute(\"aria-pressed\") || \"\")) {\n item.setAttribute(\"aria-pressed\", \"false\");\n }\n });\n\n if (this._selectionMode === \"single\") {\n const selected = items.filter((item) => item.getAttribute(\"aria-pressed\") === \"true\");\n selected.slice(1).forEach((item) => item.setAttribute(\"aria-pressed\", \"false\"));\n }\n\n if (\n this.el.hasAttribute(\"data-selection-required\") &&\n !items.some((item) => item.getAttribute(\"aria-pressed\") === \"true\")\n ) {\n items.find((item) => !this._isDisabled(item))?.setAttribute(\"aria-pressed\", \"true\");\n }\n }\n\n private _itemFromEvent(event: Event): HTMLElement | null {\n if (!(event.target instanceof Element)) return null;\n const item = event.target.closest(\"button, a.button\");\n return item instanceof HTMLElement && item.parentElement === this.el ? item : null;\n }\n\n private _isDisabled(item: HTMLElement): boolean {\n return (\n (item instanceof HTMLButtonElement && item.disabled) ||\n item.getAttribute(\"aria-disabled\") === \"true\" ||\n item.classList.contains(\"disabled\")\n );\n }\n\n private _handleClick = (event: MouseEvent) => {\n if (!this._selectionMode) return;\n const item = this._itemFromEvent(event);\n if (!(item instanceof HTMLButtonElement) || this._isDisabled(item)) return;\n this._rememberPressed(item);\n\n const willSelect = item.getAttribute(\"aria-pressed\") !== \"true\";\n const selectedCount = this._toggleItems.filter(\n (button) => button.getAttribute(\"aria-pressed\") === \"true\",\n ).length;\n if (\n !willSelect &&\n this.el.hasAttribute(\"data-selection-required\") &&\n selectedCount === 1\n ) {\n return;\n }\n if (this._selectionMode === \"single\" && willSelect) {\n this._toggleItems.forEach((button) => {\n this._rememberPressed(button);\n button.setAttribute(\"aria-pressed\", \"false\");\n });\n }\n item.setAttribute(\"aria-pressed\", willSelect ? \"true\" : \"false\");\n this._notify(\"change\", null, { detail: { button: item, pressed: willSelect } });\n };\n\n private _rememberPressed(item: HTMLButtonElement) {\n if (!this._originalPressed.has(item)) {\n this._originalPressed.set(item, item.getAttribute(\"aria-pressed\"));\n }\n }\n\n private _handlePointerDown = (event: PointerEvent) => {\n if (event.button !== 0) return;\n const item = this._itemFromEvent(event);\n if (item && !this._isDisabled(item)) this._startPress(item);\n };\n\n private _handleKeyDown = (event: KeyboardEvent) => {\n if (event.repeat || (event.key !== \" \" && event.key !== \"Enter\")) return;\n const item = this._itemFromEvent(event);\n if (item && !this._isDisabled(item)) this._startPress(item);\n };\n\n private _handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === \" \" || event.key === \"Enter\") this._resetPress();\n };\n\n private _handleFocusOut = (event: FocusEvent) => {\n if (event.target === this._activeItem) this._resetPress();\n };\n\n private _startPress(item: HTMLElement) {\n if (this._activeItem) return;\n this._finishRelease();\n\n const items = this._items;\n const activeIndex = items.indexOf(item);\n if (activeIndex < 0) return;\n\n this._activeItem = item;\n item.classList.add(PRESSED_CLASS);\n if (this.el.classList.contains(\"connected\") || items.length < 2) return;\n\n const rects = items.map((candidate) => candidate.getBoundingClientRect());\n const activeWidth = rects[activeIndex].width;\n if (activeWidth <= 0) return;\n\n const parsedMultiplier = Number.parseFloat(\n getComputedStyle(this.el).getPropertyValue(\n \"--md-comp-button-group-pressed-item-width-multiplier\",\n ),\n );\n const multiplier = Number.isFinite(parsedMultiplier) ? parsedMultiplier : 0.15;\n const desiredGrowth = activeWidth * multiplier;\n const neighborIndexes = [activeIndex - 1, activeIndex + 1].filter(\n (index) => index >= 0 && index < items.length,\n );\n const compression = new Map<number, number>();\n\n if (neighborIndexes.length === 1) {\n const index = neighborIndexes[0];\n compression.set(\n index,\n Math.min(desiredGrowth, this._compressionCapacity(items[index], rects[index])),\n );\n } else {\n const half = desiredGrowth / 2;\n for (const index of neighborIndexes) {\n compression.set(\n index,\n Math.min(half, this._compressionCapacity(items[index], rects[index])),\n );\n }\n let remaining = desiredGrowth - [...compression.values()].reduce((sum, value) => sum + value, 0);\n for (const index of neighborIndexes) {\n if (remaining <= 0) break;\n const capacity =\n this._compressionCapacity(items[index], rects[index]) - compression.get(index);\n const extra = Math.min(remaining, capacity);\n compression.set(index, compression.get(index) + extra);\n remaining -= extra;\n }\n }\n\n const actualGrowth = [...compression.values()].reduce((sum, value) => sum + value, 0);\n if (actualGrowth <= 0) return;\n\n items.forEach((candidate, index) => {\n this._pressedStyles.set(candidate, {\n width: candidate.style.width,\n baseWidth: rects[index].width,\n });\n candidate.style.width = `${rects[index].width}px`;\n });\n void this.el.offsetWidth;\n items.forEach((candidate, index) => {\n const adjustment =\n index === activeIndex ? actualGrowth : -(compression.get(index) || 0);\n candidate.style.width = `${rects[index].width + adjustment}px`;\n });\n }\n\n private _compressionCapacity(item: HTMLElement, rect: DOMRect): number {\n const minimumWidth = item.classList.contains(\"icon-button\")\n ? rect.width * (1 - MAX_ICON_COMPRESSION)\n : rect.height;\n return Math.max(0, rect.width - minimumWidth);\n }\n\n private _resetPress = () => {\n this._activeItem?.classList.remove(PRESSED_CLASS);\n this._activeItem = null;\n if (!this._pressedStyles.size) return;\n this._finishRelease();\n this._releaseStyles = new Map(this._pressedStyles);\n for (const [item, style] of this._releaseStyles) {\n item.style.width = `${style.baseWidth}px`;\n }\n this._pressedStyles.clear();\n this._releaseTimer = window.setTimeout(this._finishRelease, 200);\n };\n\n private _finishRelease = () => {\n if (this._releaseTimer !== null) window.clearTimeout(this._releaseTimer);\n this._releaseTimer = null;\n for (const [item, style] of this._releaseStyles) item.style.width = style.width;\n this._releaseStyles.clear();\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAUA,IAAM,YAAgC,CAAC;AACvC,IAAM,wBAAwB,oBAAI,IAAI,CAAC,UAAU,UAAU,CAAC;AAC5D,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAStB,IAAM,cAAN,cAA0B,UAA8B;AAAA,EAO7D,YAAY,IAAiB,UAAuC,CAAC,GAAG;AACtE,UAAM,IAAI,OAAO;AAPnB,SAAQ,iBAAiB,oBAAI,IAAiC;AAC9D,SAAQ,iBAAiB,oBAAI,IAAiC;AAC9D,SAAQ,gBAA+B;AACvC,SAAQ,mBAAmB,oBAAI,IAAsC;AACrE,SAAQ,cAAkC;AAwF1C,SAAQ,eAAe,CAAC,UAAsB;AAC5C,UAAI,CAAC,KAAK,eAAgB;AAC1B,YAAM,OAAO,KAAK,eAAe,KAAK;AACtC,UAAI,EAAE,gBAAgB,sBAAsB,KAAK,YAAY,IAAI,EAAG;AACpE,WAAK,iBAAiB,IAAI;AAE1B,YAAM,aAAa,KAAK,aAAa,cAAc,MAAM;AACzD,YAAM,gBAAgB,KAAK,aAAa;AAAA,QACtC,CAAC,WAAW,OAAO,aAAa,cAAc,MAAM;AAAA,MACtD,EAAE;AACF,UACE,CAAC,cACD,KAAK,GAAG,aAAa,yBAAyB,KAC9C,kBAAkB,GAClB;AACA;AAAA,MACF;AACA,UAAI,KAAK,mBAAmB,YAAY,YAAY;AAClD,aAAK,aAAa,QAAQ,CAAC,WAAW;AACpC,eAAK,iBAAiB,MAAM;AAC5B,iBAAO,aAAa,gBAAgB,OAAO;AAAA,QAC7C,CAAC;AAAA,MACH;AACA,WAAK,aAAa,gBAAgB,aAAa,SAAS,OAAO;AAC/D,WAAK,QAAQ,UAAU,MAAM,EAAE,QAAQ,EAAE,QAAQ,MAAM,SAAS,WAAW,EAAE,CAAC;AAAA,IAChF;AAQA,SAAQ,qBAAqB,CAAC,UAAwB;AACpD,UAAI,MAAM,WAAW,EAAG;AACxB,YAAM,OAAO,KAAK,eAAe,KAAK;AACtC,UAAI,QAAQ,CAAC,KAAK,YAAY,IAAI,EAAG,MAAK,YAAY,IAAI;AAAA,IAC5D;AAEA,SAAQ,iBAAiB,CAAC,UAAyB;AACjD,UAAI,MAAM,UAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAU;AAClE,YAAM,OAAO,KAAK,eAAe,KAAK;AACtC,UAAI,QAAQ,CAAC,KAAK,YAAY,IAAI,EAAG,MAAK,YAAY,IAAI;AAAA,IAC5D;AAEA,SAAQ,eAAe,CAAC,UAAyB;AAC/C,UAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,QAAS,MAAK,YAAY;AAAA,IACnE;AAEA,SAAQ,kBAAkB,CAAC,UAAsB;AAC/C,UAAI,MAAM,WAAW,KAAK,YAAa,MAAK,YAAY;AAAA,IAC1D;AAgFA,SAAQ,cAAc,MAAM;AAC1B,WAAK,aAAa,UAAU,OAAO,aAAa;AAChD,WAAK,cAAc;AACnB,UAAI,CAAC,KAAK,eAAe,KAAM;AAC/B,WAAK,eAAe;AACpB,WAAK,iBAAiB,IAAI,IAAI,KAAK,cAAc;AACjD,iBAAW,CAAC,MAAM,KAAK,KAAK,KAAK,gBAAgB;AAC/C,aAAK,MAAM,QAAQ,GAAG,MAAM,SAAS;AAAA,MACvC;AACA,WAAK,eAAe,MAAM;AAC1B,WAAK,gBAAgB,OAAO,WAAW,KAAK,gBAAgB,GAAG;AAAA,IACjE;AAEA,SAAQ,iBAAiB,MAAM;AAC7B,UAAI,KAAK,kBAAkB,KAAM,QAAO,aAAa,KAAK,aAAa;AACvE,WAAK,gBAAgB;AACrB,iBAAW,CAAC,MAAM,KAAK,KAAK,KAAK,eAAgB,MAAK,MAAM,QAAQ,MAAM;AAC1E,WAAK,eAAe,MAAM;AAAA,IAC5B;AAxOE,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,QAAI,KAAK,gBAAgB;AACvB,WAAK,oBAAoB;AACzB,WAAK,GAAG,iBAAiB,SAAS,KAAK,cAAc,EAAE,SAAS,MAAM,OAAO,CAAC;AAAA,IAChF;AACA,SAAK,GAAG,iBAAiB,eAAe,KAAK,oBAAoB,EAAE,OAAO,CAAC;AAC3E,SAAK,GAAG,iBAAiB,WAAW,KAAK,gBAAgB,EAAE,OAAO,CAAC;AACnE,SAAK,GAAG,iBAAiB,YAAY,KAAK,iBAAiB,EAAE,OAAO,CAAC;AACrE,aAAS,iBAAiB,aAAa,KAAK,aAAa,EAAE,OAAO,CAAC;AACnE,aAAS,iBAAiB,iBAAiB,KAAK,aAAa,EAAE,OAAO,CAAC;AACvE,aAAS,iBAAiB,SAAS,KAAK,cAAc,EAAE,OAAO,CAAC;AAChE,WAAO,iBAAiB,QAAQ,KAAK,aAAa,EAAE,OAAO,CAAC;AAAA,EAC9D;AAAA,EAEA,WAAW,WAAW;AACpB,WAAO;AAAA,EACT;AAAA,EAIA,UAAU;AACR,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK,iBAAkB,kBAAiB,MAAM,gBAAgB,KAAK;AAC/F,SAAK,iBAAiB,MAAM;AAC5B,UAAM,QAAQ;AAAA,EAChB;AAAA,EAEA,IAAY,iBAA+C;AACzD,UAAM,OAAO,KAAK,GAAG,QAAQ;AAC7B,WAAO,sBAAsB,IAAI,IAAI,IAAK,OAAiC;AAAA,EAC7E;AAAA,EAEA,IAAY,SAAwB;AAClC,WAAO,MAAM,KAAK,KAAK,GAAG,QAAQ,EAAE;AAAA,MAClC,CAAC,UACC,iBAAiB,qBAChB,iBAAiB,qBAAqB,MAAM,UAAU,SAAS,QAAQ;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,IAAY,eAAoC;AAC9C,WAAO,KAAK,OAAO;AAAA,MACjB,CAAC,SAAoC,gBAAgB;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,sBAAsB;AAC5B,UAAM,QAAQ,KAAK;AACnB,UAAM,QAAQ,CAAC,SAAS;AACtB,WAAK,iBAAiB,IAAI;AAC1B,UAAI,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,KAAK,aAAa,cAAc,KAAK,EAAE,GAAG;AACxE,aAAK,aAAa,gBAAgB,OAAO;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,QAAI,KAAK,mBAAmB,UAAU;AACpC,YAAM,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,cAAc,MAAM,MAAM;AACpF,eAAS,MAAM,CAAC,EAAE,QAAQ,CAAC,SAAS,KAAK,aAAa,gBAAgB,OAAO,CAAC;AAAA,IAChF;AAEA,QACE,KAAK,GAAG,aAAa,yBAAyB,KAC9C,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,cAAc,MAAM,MAAM,GAClE;AACA,YAAM,KAAK,CAAC,SAAS,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG,aAAa,gBAAgB,MAAM;AAAA,IACpF;AAAA,EACF;AAAA,EAEQ,eAAe,OAAkC;AACvD,QAAI,EAAE,MAAM,kBAAkB,SAAU,QAAO;AAC/C,UAAM,OAAO,MAAM,OAAO,QAAQ,kBAAkB;AACpD,WAAO,gBAAgB,eAAe,KAAK,kBAAkB,KAAK,KAAK,OAAO;AAAA,EAChF;AAAA,EAEQ,YAAY,MAA4B;AAC9C,WACG,gBAAgB,qBAAqB,KAAK,YAC3C,KAAK,aAAa,eAAe,MAAM,UACvC,KAAK,UAAU,SAAS,UAAU;AAAA,EAEtC;AAAA,EA6BQ,iBAAiB,MAAyB;AAChD,QAAI,CAAC,KAAK,iBAAiB,IAAI,IAAI,GAAG;AACpC,WAAK,iBAAiB,IAAI,MAAM,KAAK,aAAa,cAAc,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EAsBQ,YAAY,MAAmB;AACrC,QAAI,KAAK,YAAa;AACtB,SAAK,eAAe;AAEpB,UAAM,QAAQ,KAAK;AACnB,UAAM,cAAc,MAAM,QAAQ,IAAI;AACtC,QAAI,cAAc,EAAG;AAErB,SAAK,cAAc;AACnB,SAAK,UAAU,IAAI,aAAa;AAChC,QAAI,KAAK,GAAG,UAAU,SAAS,WAAW,KAAK,MAAM,SAAS,EAAG;AAEjE,UAAM,QAAQ,MAAM,IAAI,CAAC,cAAc,UAAU,sBAAsB,CAAC;AACxE,UAAM,cAAc,MAAM,WAAW,EAAE;AACvC,QAAI,eAAe,EAAG;AAEtB,UAAM,mBAAmB,OAAO;AAAA,MAC9B,iBAAiB,KAAK,EAAE,EAAE;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,OAAO,SAAS,gBAAgB,IAAI,mBAAmB;AAC1E,UAAM,gBAAgB,cAAc;AACpC,UAAM,kBAAkB,CAAC,cAAc,GAAG,cAAc,CAAC,EAAE;AAAA,MACzD,CAAC,UAAU,SAAS,KAAK,QAAQ,MAAM;AAAA,IACzC;AACA,UAAM,cAAc,oBAAI,IAAoB;AAE5C,QAAI,gBAAgB,WAAW,GAAG;AAChC,YAAM,QAAQ,gBAAgB,CAAC;AAC/B,kBAAY;AAAA,QACV;AAAA,QACA,KAAK,IAAI,eAAe,KAAK,qBAAqB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC;AAAA,MAC/E;AAAA,IACF,OAAO;AACL,YAAM,OAAO,gBAAgB;AAC7B,iBAAW,SAAS,iBAAiB;AACnC,oBAAY;AAAA,UACV;AAAA,UACA,KAAK,IAAI,MAAM,KAAK,qBAAqB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,CAAC;AAAA,QACtE;AAAA,MACF;AACA,UAAI,YAAY,gBAAgB,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAC/F,iBAAW,SAAS,iBAAiB;AACnC,YAAI,aAAa,EAAG;AACpB,cAAM,WACJ,KAAK,qBAAqB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,YAAY,IAAI,KAAK;AAC/E,cAAM,QAAQ,KAAK,IAAI,WAAW,QAAQ;AAC1C,oBAAY,IAAI,OAAO,YAAY,IAAI,KAAK,IAAI,KAAK;AACrD,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,GAAG,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AACpF,QAAI,gBAAgB,EAAG;AAEvB,UAAM,QAAQ,CAAC,WAAW,UAAU;AAClC,WAAK,eAAe,IAAI,WAAW;AAAA,QACjC,OAAO,UAAU,MAAM;AAAA,QACvB,WAAW,MAAM,KAAK,EAAE;AAAA,MAC1B,CAAC;AACD,gBAAU,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,KAAK;AAAA,IAC/C,CAAC;AACD,SAAK,KAAK,GAAG;AACb,UAAM,QAAQ,CAAC,WAAW,UAAU;AAClC,YAAM,aACJ,UAAU,cAAc,eAAe,EAAE,YAAY,IAAI,KAAK,KAAK;AACrE,gBAAU,MAAM,QAAQ,GAAG,MAAM,KAAK,EAAE,QAAQ,UAAU;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB,MAAmB,MAAuB;AACrE,UAAM,eAAe,KAAK,UAAU,SAAS,aAAa,IACtD,KAAK,SAAS,IAAI,wBAClB,KAAK;AACT,WAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY;AAAA,EAC9C;AAqBF;AAnPa,YA4BJ,MAAM;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
LineChart,
|
|
3
|
-
polarPoint
|
|
4
|
-
|
|
3
|
+
polarPoint
|
|
4
|
+
} from "./chunk-ZM3XBHWV.mjs";
|
|
5
|
+
import {
|
|
5
6
|
svgNode
|
|
6
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZVLOUDIJ.mjs";
|
|
7
8
|
|
|
8
9
|
// src/ts/components/radarChart.ts
|
|
9
10
|
var RINGS = 4;
|
|
11
|
+
function runs(values) {
|
|
12
|
+
const list = [[]];
|
|
13
|
+
values.forEach((value, i) => value === null ? list.push([]) : list[list.length - 1].push(i));
|
|
14
|
+
if (list.length > 1) list[0] = [...list.pop(), ...list[0]];
|
|
15
|
+
return list.filter((run) => run.length);
|
|
16
|
+
}
|
|
17
|
+
var closed = (corners) => `M${corners.join("L")}Z`;
|
|
18
|
+
var open = (corners) => `M${corners.join("L")}${corners.length > 1 ? "" : "h0"}`;
|
|
19
|
+
var wedge = (corners) => `M0,0L${corners.join("L")}Z`;
|
|
10
20
|
var RadarChart = class extends LineChart {
|
|
11
21
|
get _type() {
|
|
12
22
|
return "radar-chart";
|
|
13
23
|
}
|
|
14
|
-
get _key() {
|
|
15
|
-
return "Expressive_RadarChart";
|
|
16
|
-
}
|
|
17
24
|
/** The scale starts at zero, the middle, so shapes compare by size. */
|
|
18
25
|
get _fromZero() {
|
|
19
26
|
return true;
|
|
@@ -21,12 +28,6 @@ var RadarChart = class extends LineChart {
|
|
|
21
28
|
get _circular() {
|
|
22
29
|
return true;
|
|
23
30
|
}
|
|
24
|
-
static init(els, options = {}) {
|
|
25
|
-
return super.init(els, options);
|
|
26
|
-
}
|
|
27
|
-
static getInstance(el) {
|
|
28
|
-
return el["Expressive_RadarChart"];
|
|
29
|
-
}
|
|
30
31
|
/**
|
|
31
32
|
* The cursor is a spoke turned by --turn, and the tooltip sits past its
|
|
32
33
|
* tip. LineChart's points on the spoke keep their top, a share of the
|
|
@@ -54,6 +55,28 @@ var RadarChart = class extends LineChart {
|
|
|
54
55
|
const [turn] = this._polarAt(e);
|
|
55
56
|
return Math.round(turn * this.labels.length) % this.labels.length;
|
|
56
57
|
}
|
|
58
|
+
/** The grid rings' shares of the radius: one per .axis label above zero, or quarters. */
|
|
59
|
+
_rings(share) {
|
|
60
|
+
if (!this._axis) return Array.from({ length: RINGS }, (_, r) => (r + 1) / RINGS);
|
|
61
|
+
return this.series[0].scale.ticks.filter((tick) => tick > 0).map(share);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* One series' group: its outline, broken at a gap like a line chart's,
|
|
65
|
+
* its .area fill and its .points.
|
|
66
|
+
*/
|
|
67
|
+
_series(series, corner) {
|
|
68
|
+
const group = svgNode("g", {
|
|
69
|
+
class: `radar-chart-series ${series.className}`.trim(),
|
|
70
|
+
"data-series": series.color
|
|
71
|
+
});
|
|
72
|
+
const lines = runs(series.values).map((run) => run.map(corner));
|
|
73
|
+
const [outline, fill] = series.values.includes(null) ? [open, wedge] : [closed, closed];
|
|
74
|
+
group.append(svgNode("path", { class: "radar-chart-shape", d: lines.map(outline).join("") }));
|
|
75
|
+
const list = this.el.classList;
|
|
76
|
+
if (list.contains("area")) group.append(svgNode("path", { class: "radar-chart-area", d: lines.map(fill).join("") }));
|
|
77
|
+
if (list.contains("points")) group.append(svgNode("path", { class: "radar-chart-points", d: lines.flat().map((c) => `M${c}h0`).join("") }));
|
|
78
|
+
return group;
|
|
79
|
+
}
|
|
57
80
|
/**
|
|
58
81
|
* An SVG in a -50 to 50 box: the rings and spokes of the grid, then each
|
|
59
82
|
* series' shape, with its points for .points. The rim is the box's edge;
|
|
@@ -67,20 +90,9 @@ var RadarChart = class extends LineChart {
|
|
|
67
90
|
const svg = svgNode("svg", { viewBox: "-50 -50 100 100", "aria-hidden": "true", focusable: "false" });
|
|
68
91
|
svg.append(svgNode("path", {
|
|
69
92
|
class: "radar-chart-grid",
|
|
70
|
-
d:
|
|
93
|
+
d: this._rings(share).map(ring).join("") + rows.map((i) => `M0,0L${at(i, 1)}`).join("")
|
|
71
94
|
}));
|
|
72
|
-
|
|
73
|
-
this.series.forEach((series, s) => {
|
|
74
|
-
const group = svgNode("g", {
|
|
75
|
-
class: `radar-chart-series ${series.className}`.trim(),
|
|
76
|
-
"data-series": seriesColor(s)
|
|
77
|
-
});
|
|
78
|
-
const drawn = rows.filter((i) => series.values[i] !== null);
|
|
79
|
-
const corners = drawn.map((i) => at(i, share(series.values[i])));
|
|
80
|
-
group.append(svgNode("path", { class: "radar-chart-shape", d: corners.length ? `M${corners.join("L")}Z` : "" }));
|
|
81
|
-
if (points) group.append(svgNode("path", { class: "radar-chart-points", d: corners.map((c) => `M${c}h0`).join("") }));
|
|
82
|
-
svg.append(group);
|
|
83
|
-
});
|
|
95
|
+
this.series.forEach((series) => svg.append(this._series(series, (i) => at(i, share(series.values[i])))));
|
|
84
96
|
const labels = document.createElement("ol");
|
|
85
97
|
labels.className = "radar-chart-axes";
|
|
86
98
|
labels.setAttribute("aria-hidden", "true");
|
|
@@ -96,8 +108,9 @@ var RadarChart = class extends LineChart {
|
|
|
96
108
|
return web;
|
|
97
109
|
}
|
|
98
110
|
};
|
|
111
|
+
RadarChart.key = "Expressive_RadarChart";
|
|
99
112
|
|
|
100
113
|
export {
|
|
101
114
|
RadarChart
|
|
102
115
|
};
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
116
|
+
//# sourceMappingURL=chunk-6FSEUFVW.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/radarChart.ts"],
|
|
4
|
+
"sourcesContent": ["import { LineChart, LineChartOptions, polarPoint, Series } from './lineChart';\nimport { svgNode as node } from '../core/utils';\n\nexport type RadarChartOptions = LineChartOptions;\n\n/** Grid rings, evenly spaced from the middle to the rim. */\nconst RINGS = 4;\n\n/**\n * A series' rows split at its gaps into runs, the last carrying on round\n * past the top spoke into the first.\n */\nfunction runs(values: (number | null)[]) {\n const list: number[][] = [[]];\n values.forEach((value, i) => (value === null ? list.push([]) : list[list.length - 1].push(i)));\n if (list.length > 1) list[0] = [...list.pop()!, ...list[0]];\n return list.filter((run) => run.length);\n}\n\n// A run of corners as a path: closed round a whole shape; open where a gap\n// breaks it, a dot for a lone corner; and filled as a wedge from the middle.\nconst closed = (corners: string[]) => `M${corners.join('L')}Z`;\nconst open = (corners: string[]) => `M${corners.join('L')}${corners.length > 1 ? '' : 'h0'}`;\nconst wedge = (corners: string[]) => `M0,0L${corners.join('L')}Z`;\n\n/**\n * Radar chart. It reads its <table> like LineChart, but each row is a spoke,\n * clockwise from the top, and each value column is a series drawn as a\n * shape joining its values on the spokes, from zero in the middle to the\n * scale's top at the rim. The row labels sit round the rim.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class RadarChart extends LineChart {\n protected get _type() {\n return 'radar-chart';\n }\n\n /** The scale starts at zero, the middle, so shapes compare by size. */\n protected get _fromZero() {\n return true;\n }\n\n protected get _circular() {\n return true;\n }\n\n static key = 'Expressive_RadarChart';\n\n /**\n * The cursor is a spoke turned by --turn, and the tooltip sits past its\n * tip. LineChart's points on the spoke keep their top, a share of the\n * radius, which stops at the rim and the middle like the shapes.\n */\n protected _place(index: number) {\n for (const dot of this._cursor.children as HTMLCollectionOf<HTMLElement>) {\n dot.style.top = `${Math.min(100, Math.max(0, parseFloat(dot.style.top)))}%`;\n }\n const turn = this._turn(index);\n this._cursor.style.setProperty('--turn', String(turn));\n this._tooltip.style.setProperty('--turn', String(turn));\n // On the right half it opens leftwards, over the chart.\n this._tooltip.classList.toggle('end', turn > 0 && turn < 0.5);\n }\n\n /** A row's spoke as a fraction of a turn clockwise from the top. */\n private _turn(index: number) {\n return index / this.labels.length;\n }\n\n /** Only the legend; the labels go round the rim in _draw. */\n protected _guides(): Element[] {\n return this._legend();\n }\n\n /** The nearest spoke to the pointer, by its angle from the middle. */\n protected _indexAt(e: PointerEvent) {\n const [turn] = this._polarAt(e);\n return Math.round(turn * this.labels.length) % this.labels.length;\n }\n\n /** The grid rings' shares of the radius: one per .axis label above zero, or quarters. */\n private _rings(share: (value: number) => number) {\n if (!this._axis) return Array.from({ length: RINGS }, (_, r) => (r + 1) / RINGS);\n return this.series[0].scale.ticks.filter((tick) => tick > 0).map(share);\n }\n\n /**\n * One series' group: its outline, broken at a gap like a line chart's,\n * its .area fill and its .points.\n */\n private _series(series: Series, corner: (index: number) => string) {\n const group = node('g', {\n class: `radar-chart-series ${series.className}`.trim(),\n 'data-series': series.color\n });\n const lines = runs(series.values).map((run) => run.map(corner));\n const [outline, fill] = series.values.includes(null) ? [open, wedge] : [closed, closed];\n group.append(node('path', { class: 'radar-chart-shape', d: lines.map(outline).join('') }));\n const list = this.el.classList;\n if (list.contains('area')) group.append(node('path', { class: 'radar-chart-area', d: lines.map(fill).join('') }));\n // Round caps on zero-length lines, so CSS sizes the points in pixels.\n if (list.contains('points')) group.append(node('path', { class: 'radar-chart-points', d: lines.flat().map((c) => `M${c}h0`).join('') }));\n return group;\n }\n\n /**\n * An SVG in a -50 to 50 box: the rings and spokes of the grid, then each\n * series' shape, with its points for .points. The rim is the box's edge;\n * the labels round it are HTML.\n */\n protected _draw(): Element {\n const at = (index: number, share: number) => polarPoint(this._turn(index), 50 * share);\n // The rim is the scale's top, so _y is the distance in from the rim.\n const share = (value: number) => Math.min(1, Math.max(0, 1 - this._y(value) / 100));\n const rows = this.labels.map((_, i) => i);\n const ring = (r: number) => `M${rows.map((i) => at(i, r)).join('L')}Z`;\n\n const svg = node('svg', { viewBox: '-50 -50 100 100', 'aria-hidden': 'true', focusable: 'false' });\n svg.append(node('path', {\n class: 'radar-chart-grid',\n d: this._rings(share).map(ring).join('')\n + rows.map((i) => `M0,0L${at(i, 1)}`).join('')\n }));\n this.series.forEach((series) => svg.append(this._series(series, (i) => at(i, share(series.values[i]!)))));\n\n const labels = document.createElement('ol');\n labels.className = 'radar-chart-axes';\n labels.setAttribute('aria-hidden', 'true');\n this.labels.forEach((text, i) => {\n const li = document.createElement('li');\n li.textContent = text;\n li.style.setProperty('--turn', String(this._turn(i)));\n labels.append(li);\n });\n\n const web = document.createElement('div');\n web.className = 'radar-chart-web';\n web.append(svg, labels);\n return web;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["share"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LineChart,
|
|
3
|
+
affix,
|
|
4
|
+
cellValue,
|
|
5
|
+
morph,
|
|
6
|
+
numberFormat,
|
|
7
|
+
pace,
|
|
8
|
+
tickText
|
|
9
|
+
} from "./chunk-ZM3XBHWV.mjs";
|
|
10
|
+
import {
|
|
11
|
+
svgNode
|
|
12
|
+
} from "./chunk-ZVLOUDIJ.mjs";
|
|
13
|
+
|
|
14
|
+
// src/ts/components/scatterChart.ts
|
|
15
|
+
var dots = (marks) => marks.map(({ x, y }) => `M${x},${y}h0`).join("");
|
|
16
|
+
var place = ({ row, series }) => `${row} ${series.column}`;
|
|
17
|
+
var span = (text) => Object.assign(document.createElement("span"), { textContent: text });
|
|
18
|
+
var ms = (time) => parseFloat(time) * (time.trim().endsWith("ms") ? 1 : 1e3);
|
|
19
|
+
function sized(path, size, was, timing) {
|
|
20
|
+
path.style.setProperty("--scatter-chart-size", `${size}`);
|
|
21
|
+
if (!timing || !was || was.size === size) return;
|
|
22
|
+
path.animate({ "--scatter-chart-size": [`${was.size}`, `${size}`] }, { duration: ms(timing.dur), easing: `cubic-bezier(${timing.keySplines})` });
|
|
23
|
+
}
|
|
24
|
+
var ScatterChart = class extends LineChart {
|
|
25
|
+
get _type() {
|
|
26
|
+
return "scatter-chart";
|
|
27
|
+
}
|
|
28
|
+
get _seriesFrom() {
|
|
29
|
+
return 2;
|
|
30
|
+
}
|
|
31
|
+
get _seriesTo() {
|
|
32
|
+
return this._bubble ? -1 : void 0;
|
|
33
|
+
}
|
|
34
|
+
get _bubble() {
|
|
35
|
+
return this.el.classList.contains("bubble");
|
|
36
|
+
}
|
|
37
|
+
static get defaults() {
|
|
38
|
+
return { ...LineChart.defaults, xMin: null, xMax: null };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reads each row's x value into `_xs` and its size into `_sizes`, which
|
|
42
|
+
* the scales and the points use, and leaves out the values of rows
|
|
43
|
+
* without either, so they neither draw nor stretch a scale. Nothing stacks.
|
|
44
|
+
*/
|
|
45
|
+
_arrange(series) {
|
|
46
|
+
const xs = this._xs = this._rows.map((row) => cellValue(row.cells[1]));
|
|
47
|
+
const sizes = this._sizes = this._rows.map((row) => this._size(row));
|
|
48
|
+
for (const each of series) {
|
|
49
|
+
each.values = each.tops = each.values.map((value, row) => xs[row] === null || sizes[row] === null ? null : value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** A row's size: 1 without .bubble, or its last cell's value, null unless positive. */
|
|
53
|
+
_size(row) {
|
|
54
|
+
if (!this._bubble) return 1;
|
|
55
|
+
const size = cellValue(row.cells[this._header.length - 1]) ?? 0;
|
|
56
|
+
return size > 0 ? size : null;
|
|
57
|
+
}
|
|
58
|
+
get _count() {
|
|
59
|
+
return this._marks?.length ?? 0;
|
|
60
|
+
}
|
|
61
|
+
/** Highlights one point, numbered as `_marks` lists them. Pass -1 to hide the tooltip. */
|
|
62
|
+
show(index) {
|
|
63
|
+
if (!this._tooltip || index === this.activeIndex) return;
|
|
64
|
+
this.activeIndex = index;
|
|
65
|
+
const mark = this._marks[index];
|
|
66
|
+
this._cursor.hidden = this._tooltip.hidden = !mark;
|
|
67
|
+
if (mark) this._fill(mark);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Puts the marker on a point, at a bubble's size, and fills the tooltip
|
|
71
|
+
* beside it: the row, its x header and text, the series and its text, and
|
|
72
|
+
* with .bubble the size header and text, as the author wrote them. Past
|
|
73
|
+
* the middle the tooltip opens back over the plot.
|
|
74
|
+
*/
|
|
75
|
+
_fill({ row, series, x, y, size }) {
|
|
76
|
+
this._cursor.dataset.series = series.color;
|
|
77
|
+
this._cursor.style.setProperty("--scatter-chart-size", `${size}`);
|
|
78
|
+
for (const part of [this._cursor, this._tooltip]) Object.assign(part.style, { left: `${x}%`, top: `${y}%` });
|
|
79
|
+
this._tooltip.classList.toggle("end", x > 50);
|
|
80
|
+
const [title, name] = [document.createElement("strong"), span(series.name)];
|
|
81
|
+
title.textContent = this.labels[row];
|
|
82
|
+
name.dataset.series = series.color;
|
|
83
|
+
const sizeText = this._bubble ? this._cellText(row, this._header.length - 1) : [];
|
|
84
|
+
this._tooltip.replaceChildren(title, ...this._cellText(row, 1), name, span(series.text[row]), ...sizeText);
|
|
85
|
+
}
|
|
86
|
+
/** A column's header, without a swatch since it names no series, and the row's text in it. */
|
|
87
|
+
_cellText(row, column) {
|
|
88
|
+
const header = span(this._header[column].textContent.trim());
|
|
89
|
+
header.className = "x";
|
|
90
|
+
return [header, span(this._rows[row].cells[column]?.textContent.trim() ?? "")];
|
|
91
|
+
}
|
|
92
|
+
/** The point nearest the pointer, or -1 with none. */
|
|
93
|
+
_indexAt(e) {
|
|
94
|
+
const [plot, box] = [this._plot, this._plot.getBoundingClientRect()];
|
|
95
|
+
const away = ({ x, y }) => Math.hypot(
|
|
96
|
+
box.left + plot.clientLeft + x / 100 * plot.clientWidth - e.clientX,
|
|
97
|
+
box.top + plot.clientTop + y / 100 * plot.clientHeight - e.clientY
|
|
98
|
+
);
|
|
99
|
+
return this._marks.reduce((nearest, mark, i) => nearest < 0 || away(mark) < away(this._marks[nearest]) ? i : nearest, -1);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Steps through the points in table order. The arrows keep their meaning
|
|
103
|
+
* in a right-to-left chart, since table order is no direction on screen.
|
|
104
|
+
*/
|
|
105
|
+
_keyTarget(key) {
|
|
106
|
+
if (key === "Escape") return this.activeIndex < 0 ? void 0 : -1;
|
|
107
|
+
const last = this._marks.length - 1;
|
|
108
|
+
const step = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }[key];
|
|
109
|
+
if (step) return Math.min(last, Math.max(0, this.activeIndex + step));
|
|
110
|
+
return { Home: 0, End: last }[key];
|
|
111
|
+
}
|
|
112
|
+
_read() {
|
|
113
|
+
[this._drawn, this._marks] = [this._marks ?? [], []];
|
|
114
|
+
super._read();
|
|
115
|
+
if (!this.series.length) return;
|
|
116
|
+
this._xFit = this._xScale();
|
|
117
|
+
this._xAffix = affix(this._rows.map((row) => row.cells[1]));
|
|
118
|
+
}
|
|
119
|
+
/** The x scale over the rows with a point, between `xMin` and `xMax` where they are set. */
|
|
120
|
+
_xScale() {
|
|
121
|
+
const [low, high] = this._xRange();
|
|
122
|
+
const [min, max] = [this._xEnd("xMin"), this._xEnd("xMax")];
|
|
123
|
+
return this._fit(min ?? low, max ?? high, [min !== null, max !== null]);
|
|
124
|
+
}
|
|
125
|
+
/** The x values of the rows with a point, with 10% of their span to spare each side. */
|
|
126
|
+
_xRange() {
|
|
127
|
+
const xs = this._xs.filter((_, row) => this._hasPoint(row));
|
|
128
|
+
if (!xs.length) return [-1, 1];
|
|
129
|
+
const [low, high] = [xs.reduce((a, b) => Math.min(a, b)), xs.reduce((a, b) => Math.max(a, b))];
|
|
130
|
+
const pad = (high - low) * 0.1 || 1;
|
|
131
|
+
return [low - pad, high + pad];
|
|
132
|
+
}
|
|
133
|
+
/** An x scale end from its data attribute or option, or null. */
|
|
134
|
+
_xEnd(name) {
|
|
135
|
+
return this._number(name) ?? this.options[name] ?? null;
|
|
136
|
+
}
|
|
137
|
+
/** A value's distance across the plot from its inline start, in percent. */
|
|
138
|
+
_xAt(value) {
|
|
139
|
+
const { min, max } = this._xFit;
|
|
140
|
+
const x = (value - min) / (max - min || 1) * 100;
|
|
141
|
+
return this._reversed ? 100 - x : x;
|
|
142
|
+
}
|
|
143
|
+
/** Whether any series shown draws a point in a row. */
|
|
144
|
+
_hasPoint(row) {
|
|
145
|
+
return this.series.some((series) => series.values[row] !== null);
|
|
146
|
+
}
|
|
147
|
+
/** The points, each diameter the square root of its row's share of the largest size drawn, so areas follow sizes. */
|
|
148
|
+
_layout() {
|
|
149
|
+
const largest = this._sizes.reduce((most, size, row) => this._hasPoint(row) ? Math.max(most, size) : most, 0);
|
|
150
|
+
return this.labels.flatMap((_, row) => this.series.filter((series) => series.values[row] !== null).map((series) => ({
|
|
151
|
+
row,
|
|
152
|
+
series,
|
|
153
|
+
x: this._xAt(this._xs[row]),
|
|
154
|
+
y: series.y(series.values[row]),
|
|
155
|
+
size: Math.sqrt(this._sizes[row] / largest)
|
|
156
|
+
})));
|
|
157
|
+
}
|
|
158
|
+
/** One group per series, its points round caps on zero-length lines, so CSS sizes them in pixels. */
|
|
159
|
+
_draw() {
|
|
160
|
+
this._marks = this._layout();
|
|
161
|
+
const svg = svgNode("svg", {
|
|
162
|
+
viewBox: "0 0 100 100",
|
|
163
|
+
preserveAspectRatio: "none",
|
|
164
|
+
"aria-hidden": "true",
|
|
165
|
+
focusable: "false"
|
|
166
|
+
});
|
|
167
|
+
const timing = this._before.length ? pace(this.el) : null;
|
|
168
|
+
const was = new Map(this._drawn.map((old) => [place(old), old]));
|
|
169
|
+
svg.append(...this.series.map((series) => this._group(series, timing, was)));
|
|
170
|
+
return svg;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* A series' points, in one path, or with .bubble one path each, largest
|
|
174
|
+
* first so smaller bubbles stay on top.
|
|
175
|
+
*/
|
|
176
|
+
_group(series, timing, was) {
|
|
177
|
+
const group = svgNode("g", {
|
|
178
|
+
class: `scatter-chart-series ${series.className}`.trim(),
|
|
179
|
+
"data-series": series.color
|
|
180
|
+
});
|
|
181
|
+
const marks = this._marks.filter((mark) => mark.series === series);
|
|
182
|
+
const sets = this._bubble ? marks.sort((a, b) => b.size - a.size).map((mark) => [mark]) : [marks];
|
|
183
|
+
group.append(...sets.map((set) => this._pointPath(set, timing, was)));
|
|
184
|
+
return group;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* A path of points. After update() each moves from where its row's point
|
|
188
|
+
* in the same column was drawn, or appears where it is.
|
|
189
|
+
*/
|
|
190
|
+
_pointPath(marks, timing, was) {
|
|
191
|
+
const path = svgNode("path", { class: "scatter-chart-points", d: dots(marks) });
|
|
192
|
+
if (timing) morph(path, dots(marks.map((mark) => was.get(place(mark)) ?? mark)), timing);
|
|
193
|
+
if (this._bubble) sized(path, marks[0].size, was.get(place(marks[0])), timing);
|
|
194
|
+
return path;
|
|
195
|
+
}
|
|
196
|
+
/** With .axis, the y scale's labels, and the x scale's below the plot with a grid line at each. */
|
|
197
|
+
_axes() {
|
|
198
|
+
return this._axis ? [...super._axes(), this._xAxis()] : [];
|
|
199
|
+
}
|
|
200
|
+
_xAxis() {
|
|
201
|
+
const axis = document.createElement("ol");
|
|
202
|
+
axis.className = "scatter-chart-axis x";
|
|
203
|
+
axis.setAttribute("aria-hidden", "true");
|
|
204
|
+
const number = numberFormat(this.el, { notation: "compact", maximumSignificantDigits: 3 });
|
|
205
|
+
for (const tick of this._xFit.ticks) {
|
|
206
|
+
const li = document.createElement("li");
|
|
207
|
+
const label = document.createElement("span");
|
|
208
|
+
label.textContent = tickText(number, tick, this._xAffix);
|
|
209
|
+
li.style.setProperty("--at", `${this._xAt(tick)}%`);
|
|
210
|
+
li.append(label);
|
|
211
|
+
axis.append(li);
|
|
212
|
+
}
|
|
213
|
+
return axis;
|
|
214
|
+
}
|
|
215
|
+
/** The legend only: the rows have no labels along an axis. */
|
|
216
|
+
_guides() {
|
|
217
|
+
return this._legend();
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
ScatterChart.key = "Expressive_ScatterChart";
|
|
221
|
+
|
|
222
|
+
export {
|
|
223
|
+
ScatterChart
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=chunk-752ADW4M.mjs.map
|