@expressivecss/expressive 0.14.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1589 -1
- package/README.md +9 -8
- package/dist/css/expressive.css +19304 -12021
- package/dist/css/expressive.css.map +1 -1
- package/dist/css/expressive.min.css +1 -1
- package/dist/css/expressive.min.css.map +1 -1
- package/dist/fonts/LICENSE-noto-sans-arabic +93 -0
- package/dist/fonts/LICENSE-noto-sans-hebrew +93 -0
- package/dist/fonts/LICENSE-noto-sans-thai +93 -0
- package/dist/fonts/material-symbols-outlined.woff2 +0 -0
- package/dist/fonts/material-symbols-rounded.woff2 +0 -0
- package/dist/fonts/material-symbols-sharp.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-400.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-500.woff2 +0 -0
- package/dist/fonts/noto-sans-arabic-arabic-700.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-400.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-500.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-700.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-cyrillic-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-400.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-500.woff2 +0 -0
- package/dist/fonts/noto-sans-devanagari-700.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-400.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-500.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-700.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-greek-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-400.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-500.woff2 +0 -0
- package/dist/fonts/noto-sans-hebrew-hebrew-700.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-700.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-400.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-500.woff2 +0 -0
- package/dist/fonts/noto-sans-latin-ext-700.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-400.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-500.woff2 +0 -0
- package/dist/fonts/noto-sans-thai-thai-700.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-400.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-500.woff2 +0 -0
- package/dist/fonts/noto-sans-vietnamese-700.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-400.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-500.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-700.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-cyrillic-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-greek-400.woff2 +0 -0
- package/dist/fonts/roboto-greek-500.woff2 +0 -0
- package/dist/fonts/roboto-greek-700.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-greek-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-latin-700.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-400.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-500.woff2 +0 -0
- package/dist/fonts/roboto-latin-ext-700.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-400.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-500.woff2 +0 -0
- package/dist/fonts/roboto-vietnamese-700.woff2 +0 -0
- package/dist/js/chunks/chunk-2CS6TITK.mjs +219 -0
- package/dist/js/chunks/chunk-2CS6TITK.mjs.map +7 -0
- package/dist/js/chunks/chunk-2RLBDFH4.mjs +108 -0
- package/dist/js/chunks/chunk-2RLBDFH4.mjs.map +7 -0
- package/dist/js/chunks/chunk-3L3QIYLC.mjs +85 -0
- package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +7 -0
- package/dist/js/chunks/chunk-4EWGD4V2.mjs +75 -0
- package/dist/js/chunks/chunk-4EWGD4V2.mjs.map +7 -0
- package/dist/js/chunks/chunk-4IKVPCSU.mjs +7 -0
- package/dist/js/chunks/chunk-4IKVPCSU.mjs.map +7 -0
- package/dist/js/chunks/chunk-4PIXLDNJ.mjs +127 -0
- package/dist/js/chunks/chunk-4PIXLDNJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-A7ALMYUR.mjs → chunk-4QUCNFSD.mjs} +68 -125
- package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-4TKTLGEM.mjs → chunk-4TRZ2AER.mjs} +35 -41
- package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +7 -0
- package/dist/js/chunks/{chunk-BG6ZRB5H.mjs → chunk-5KIHWJI2.mjs} +40 -26
- package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +7 -0
- package/dist/js/chunks/{chunk-YDCS5S3J.mjs → chunk-67ZPPKXS.mjs} +20 -33
- package/dist/js/chunks/chunk-67ZPPKXS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-3DHK5CZU.mjs → chunk-6FSEUFVW.mjs} +40 -29
- package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +7 -0
- package/dist/js/chunks/chunk-752ADW4M.mjs +225 -0
- package/dist/js/chunks/chunk-752ADW4M.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GVGT6MIU.mjs → chunk-75E5EDJF.mjs} +3 -11
- package/dist/js/chunks/chunk-75E5EDJF.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TBM3FT7G.mjs → chunk-7NLUI3RR.mjs} +148 -78
- package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +7 -0
- package/dist/js/chunks/chunk-7W7TV6NY.mjs +108 -0
- package/dist/js/chunks/chunk-7W7TV6NY.mjs.map +7 -0
- package/dist/js/chunks/chunk-7YQBHTK3.mjs +225 -0
- package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +7 -0
- package/dist/js/chunks/chunk-7YZ5CN3V.mjs +33 -0
- package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +7 -0
- package/dist/js/chunks/chunk-AI73GJKG.mjs +28 -0
- package/dist/js/chunks/chunk-AI73GJKG.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NS2UMNZV.mjs → chunk-ANKFWNWT.mjs} +21 -45
- package/dist/js/chunks/chunk-ANKFWNWT.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GIW4K4SE.mjs → chunk-B7DQFHA5.mjs} +37 -53
- package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +7 -0
- package/dist/js/chunks/chunk-BIGU5RCJ.mjs +153 -0
- package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GUB3TNO2.mjs → chunk-BPF3I2MN.mjs} +109 -27
- package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +7 -0
- package/dist/js/chunks/chunk-CMGXGYUC.mjs +74 -0
- package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-JIDMQGK6.mjs → chunk-CSYWKEK3.mjs} +322 -223
- package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +7 -0
- package/dist/js/chunks/chunk-CZSQHXEV.mjs +227 -0
- package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +7 -0
- package/dist/js/chunks/chunk-DZYVU75J.mjs +121 -0
- package/dist/js/chunks/chunk-DZYVU75J.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QDAL4IYN.mjs → chunk-EC26RU2D.mjs} +11 -29
- package/dist/js/chunks/chunk-EC26RU2D.mjs.map +7 -0
- package/dist/js/chunks/{chunk-3GVFZ4XO.mjs → chunk-EVCVFEV3.mjs} +238 -152
- package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +7 -0
- package/dist/js/chunks/chunk-FCNF4GRJ.mjs +445 -0
- package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-GCWWEZKO.mjs +342 -0
- package/dist/js/chunks/chunk-GCWWEZKO.mjs.map +7 -0
- package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
- package/dist/js/chunks/chunk-GVZQH2H5.mjs +54 -0
- package/dist/js/chunks/chunk-GVZQH2H5.mjs.map +7 -0
- package/dist/js/chunks/chunk-GWZ76SR4.mjs +435 -0
- package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZAS25YFD.mjs → chunk-ILDRRG7T.mjs} +21 -23
- package/dist/js/chunks/chunk-ILDRRG7T.mjs.map +7 -0
- package/dist/js/chunks/chunk-INLZWHLY.mjs +80 -0
- package/dist/js/chunks/chunk-INLZWHLY.mjs.map +7 -0
- package/dist/js/chunks/chunk-JUKBBN6P.mjs +175 -0
- package/dist/js/chunks/chunk-JUKBBN6P.mjs.map +7 -0
- package/dist/js/chunks/chunk-KYIEG4U3.mjs +730 -0
- package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KHV6DZXX.mjs → chunk-KZPSAXIU.mjs} +156 -46
- package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +7 -0
- package/dist/js/chunks/chunk-LDXCC2L3.mjs +438 -0
- package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +7 -0
- package/dist/js/chunks/chunk-NAC72P7R.mjs +137 -0
- package/dist/js/chunks/chunk-NAC72P7R.mjs.map +7 -0
- package/dist/js/chunks/chunk-NBJAUGPP.mjs +244 -0
- package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +7 -0
- package/dist/js/chunks/chunk-NNHVANQA.mjs +113 -0
- package/dist/js/chunks/chunk-NNHVANQA.mjs.map +7 -0
- package/dist/js/chunks/chunk-NVQ5EHCU.mjs +376 -0
- package/dist/js/chunks/chunk-NVQ5EHCU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-Z2NRKI7R.mjs → chunk-OP43LLIC.mjs} +44 -73
- package/dist/js/chunks/chunk-OP43LLIC.mjs.map +7 -0
- package/dist/js/chunks/chunk-OUCHKSAW.mjs +63 -0
- package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +7 -0
- package/dist/js/chunks/{chunk-PM655FXL.mjs → chunk-OYNUDOHR.mjs} +20 -48
- package/dist/js/chunks/chunk-OYNUDOHR.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UEZUJQ66.mjs → chunk-P6DRQ6KS.mjs} +36 -31
- package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +7 -0
- package/dist/js/chunks/chunk-PA7NU5AK.mjs +99 -0
- package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +7 -0
- package/dist/js/chunks/chunk-QACZ6TUP.mjs +224 -0
- package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-5HQSGDZ5.mjs → chunk-QXKWVHBD.mjs} +286 -203
- package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DAIU5SLG.mjs → chunk-ROH2HDB4.mjs} +7 -6
- package/dist/js/chunks/chunk-ROH2HDB4.mjs.map +7 -0
- package/dist/js/chunks/chunk-S23RJ3XY.mjs +86 -0
- package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FS7XY3HT.mjs → chunk-SPPHF7YZ.mjs} +36 -29
- package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-T3BNSRP3.mjs +152 -0
- package/dist/js/chunks/chunk-T3BNSRP3.mjs.map +7 -0
- package/dist/js/chunks/chunk-TFABTUAZ.mjs +108 -0
- package/dist/js/chunks/chunk-TFABTUAZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-U4B3VHFS.mjs +507 -0
- package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-UGJHCHXG.mjs +341 -0
- package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +7 -0
- package/dist/js/chunks/chunk-VFV75DHF.mjs +70 -0
- package/dist/js/chunks/chunk-VFV75DHF.mjs.map +7 -0
- package/dist/js/chunks/{chunk-4HZMB7LI.mjs → chunk-VGY4M57S.mjs} +281 -135
- package/dist/js/chunks/chunk-VGY4M57S.mjs.map +7 -0
- package/dist/js/chunks/chunk-VH4BMAZS.mjs +167 -0
- package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +7 -0
- package/dist/js/chunks/chunk-VJVQIXHC.mjs +123 -0
- package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-S3XDFGSZ.mjs → chunk-VMY55K2X.mjs} +92 -141
- package/dist/js/chunks/chunk-VMY55K2X.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UEXCIMJZ.mjs → chunk-VR3L2WN5.mjs} +11 -17
- package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +7 -0
- package/dist/js/chunks/chunk-W6FAL3TI.mjs +38 -0
- package/dist/js/chunks/chunk-W6FAL3TI.mjs.map +7 -0
- package/dist/js/chunks/chunk-WU7XJ4RR.mjs +450 -0
- package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +7 -0
- package/dist/js/chunks/chunk-X7SDA2J5.mjs +116 -0
- package/dist/js/chunks/chunk-X7SDA2J5.mjs.map +7 -0
- package/dist/js/chunks/chunk-Y6H2X7ZC.mjs +209 -0
- package/dist/js/chunks/chunk-Y6H2X7ZC.mjs.map +7 -0
- package/dist/js/chunks/chunk-Y6TLRA3U.mjs +129 -0
- package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +7 -0
- package/dist/js/chunks/chunk-Z4GICXR2.mjs +190 -0
- package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +7 -0
- package/dist/js/chunks/chunk-Z4OARDZ7.mjs +442 -0
- package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +7 -0
- package/dist/js/chunks/{chunk-MZ6Z24BX.mjs → chunk-ZJNLAGY5.mjs} +19 -34
- package/dist/js/chunks/chunk-ZJNLAGY5.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZKWUWBUB.mjs +81 -0
- package/dist/js/chunks/chunk-ZKWUWBUB.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZM3XBHWV.mjs +746 -0
- package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZO6ZLHFF.mjs +48 -0
- package/dist/js/chunks/chunk-ZO6ZLHFF.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZVLOUDIJ.mjs +251 -0
- package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +7 -0
- package/dist/js/expressive.cjs +10333 -4070
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +10333 -4070
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +23 -25
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +184 -69
- package/dist/js/expressive.mjs.map +2 -2
- package/dist/js/internal/behaviors/bottomSheets.mjs +4 -3
- package/dist/js/internal/behaviors/copy.mjs +9 -0
- package/dist/js/internal/behaviors/copy.mjs.map +7 -0
- package/dist/js/internal/behaviors/dataTables.mjs +10 -0
- package/dist/js/internal/behaviors/dataTables.mjs.map +7 -0
- package/dist/js/internal/behaviors/dialogs.mjs +2 -2
- package/dist/js/internal/behaviors/forms.mjs +2 -2
- package/dist/js/internal/behaviors/imageCompare.mjs +8 -0
- package/dist/js/internal/behaviors/imageCompare.mjs.map +7 -0
- package/dist/js/internal/behaviors/lists.mjs +8 -0
- package/dist/js/internal/behaviors/lists.mjs.map +7 -0
- package/dist/js/internal/behaviors/paneResize.mjs +8 -0
- package/dist/js/internal/behaviors/paneResize.mjs.map +7 -0
- package/dist/js/internal/behaviors/sheetDrag.mjs +7 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +4 -3
- package/dist/js/internal/behaviors/sortable.mjs +8 -0
- package/dist/js/internal/behaviors/sortable.mjs.map +7 -0
- package/dist/js/internal/behaviors/theme.mjs +8 -0
- package/dist/js/internal/behaviors/theme.mjs.map +7 -0
- package/dist/js/internal/behaviors/tour.mjs +8 -0
- package/dist/js/internal/behaviors/tour.mjs.map +7 -0
- package/dist/js/internal/behaviors/transferList.mjs +8 -0
- package/dist/js/internal/behaviors/transferList.mjs.map +7 -0
- package/dist/js/internal/components/appBar.mjs +3 -2
- package/dist/js/internal/components/autocomplete.mjs +4 -4
- package/dist/js/internal/components/backToTop.mjs +9 -0
- package/dist/js/internal/components/backToTop.mjs.map +7 -0
- package/dist/js/internal/components/barChart.mjs +5 -4
- package/dist/js/internal/components/buttonGroup.mjs +3 -2
- package/dist/js/internal/components/buttons.mjs +3 -3
- package/dist/js/internal/components/cards.mjs +3 -3
- package/dist/js/internal/components/carousel.mjs +3 -3
- package/dist/js/internal/components/cascader.mjs +10 -0
- package/dist/js/internal/components/cascader.mjs.map +7 -0
- package/dist/js/internal/components/characterCounter.mjs +3 -2
- package/dist/js/internal/components/chips.mjs +6 -5
- package/dist/js/internal/components/colorPicker.mjs +9 -0
- package/dist/js/internal/components/colorPicker.mjs.map +7 -0
- package/dist/js/internal/components/columnChart.mjs +4 -3
- package/dist/js/internal/components/commandPalette.mjs +3 -3
- package/dist/js/internal/components/confetti.mjs +3 -2
- package/dist/js/internal/components/currencyInput.mjs +9 -0
- package/dist/js/internal/components/currencyInput.mjs.map +7 -0
- package/dist/js/internal/components/datepicker.mjs +11 -8
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/funnelChart.mjs +10 -0
- package/dist/js/internal/components/funnelChart.mjs.map +7 -0
- package/dist/js/internal/components/heatmapChart.mjs +4 -3
- package/dist/js/internal/components/hoverCard.mjs +9 -0
- package/dist/js/internal/components/hoverCard.mjs.map +7 -0
- package/dist/js/internal/components/index.mjs +133 -64
- package/dist/js/internal/components/inputMask.mjs +9 -0
- package/dist/js/internal/components/inputMask.mjs.map +7 -0
- package/dist/js/internal/components/keypad.mjs +9 -0
- package/dist/js/internal/components/keypad.mjs.map +7 -0
- package/dist/js/internal/components/lightbox.mjs +3 -3
- package/dist/js/internal/components/lineChart.mjs +29 -4
- package/dist/js/internal/components/loadingOverlay.mjs +9 -0
- package/dist/js/internal/components/loadingOverlay.mjs.map +7 -0
- package/dist/js/internal/components/mapView.mjs +3 -3
- package/dist/js/internal/components/menu.mjs +3 -3
- package/dist/js/internal/components/menubar.mjs +10 -0
- package/dist/js/internal/components/menubar.mjs.map +7 -0
- package/dist/js/internal/components/messageScroller.mjs +3 -3
- package/dist/js/internal/components/mixedChart.mjs +5 -4
- package/dist/js/internal/components/navigationRail.mjs +3 -2
- package/dist/js/internal/components/particles.mjs +3 -2
- package/dist/js/internal/components/pieChart.mjs +4 -3
- package/dist/js/internal/components/pullToRefresh.mjs +9 -0
- package/dist/js/internal/components/pullToRefresh.mjs.map +7 -0
- package/dist/js/internal/components/questionnaire.mjs +3 -3
- package/dist/js/internal/components/radarChart.mjs +4 -3
- package/dist/js/internal/components/radialChart.mjs +4 -3
- package/dist/js/internal/components/registry.mjs +59 -40
- package/dist/js/internal/components/richTextEditor.mjs +3 -3
- package/dist/js/internal/components/sankeyChart.mjs +10 -0
- package/dist/js/internal/components/sankeyChart.mjs.map +7 -0
- package/dist/js/internal/components/scatterChart.mjs +10 -0
- package/dist/js/internal/components/scatterChart.mjs.map +7 -0
- package/dist/js/internal/components/scrollspy.mjs +3 -2
- package/dist/js/internal/components/select.mjs +4 -4
- package/dist/js/internal/components/showMore.mjs +9 -0
- package/dist/js/internal/components/showMore.mjs.map +7 -0
- package/dist/js/internal/components/slider.mjs +3 -3
- package/dist/js/internal/components/snackbar.mjs +2 -2
- package/dist/js/internal/components/swipeActions.mjs +9 -0
- package/dist/js/internal/components/swipeActions.mjs.map +7 -0
- package/dist/js/internal/components/tabs.mjs +3 -4
- package/dist/js/internal/components/timepicker.mjs +5 -4
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/components/treeSelect.mjs +13 -0
- package/dist/js/internal/components/treeSelect.mjs.map +7 -0
- package/dist/js/internal/components/treemapChart.mjs +10 -0
- package/dist/js/internal/components/treemapChart.mjs.map +7 -0
- package/dist/js/internal/core/component.mjs +2 -1
- package/dist/js/internal/core/formControl.mjs +12 -0
- package/dist/js/internal/core/formControl.mjs.map +7 -0
- package/dist/js/internal/core/spring.mjs +11 -0
- package/dist/js/internal/core/spring.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +11 -3
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs +13 -0
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs.map +7 -0
- package/dist/js/modular.mjs +175 -69
- package/dist/types/behaviors/bottomSheets.d.ts +19 -3
- package/dist/types/behaviors/copy.d.ts +18 -0
- package/dist/types/behaviors/dataTables.d.ts +129 -0
- package/dist/types/behaviors/dialogs.d.ts +27 -1
- package/dist/types/behaviors/forms.d.ts +68 -2
- package/dist/types/behaviors/imageCompare.d.ts +12 -0
- package/dist/types/behaviors/lists.d.ts +12 -0
- package/dist/types/behaviors/paneResize.d.ts +29 -0
- package/dist/types/behaviors/sheetDrag.d.ts +18 -0
- package/dist/types/behaviors/sideSheets.d.ts +1 -1
- package/dist/types/behaviors/sortable.d.ts +28 -0
- package/dist/types/behaviors/theme.d.ts +22 -0
- package/dist/types/behaviors/tour.d.ts +36 -0
- package/dist/types/behaviors/transferList.d.ts +51 -0
- package/dist/types/components/appBar.d.ts +5 -6
- package/dist/types/components/autocomplete.d.ts +92 -17
- package/dist/types/components/backToTop.d.ts +36 -0
- package/dist/types/components/barChart.d.ts +3 -6
- package/dist/types/components/buttonGroup.d.ts +2 -4
- package/dist/types/components/buttons.d.ts +5 -5
- package/dist/types/components/cards.d.ts +3 -16
- package/dist/types/components/carousel.d.ts +9 -15
- package/dist/types/components/cascader.d.ts +130 -0
- package/dist/types/components/characterCounter.d.ts +2 -15
- package/dist/types/components/chips.d.ts +65 -19
- package/dist/types/components/colorPicker.d.ts +42 -0
- package/dist/types/components/columnChart.d.ts +23 -10
- package/dist/types/components/commandPalette.d.ts +11 -16
- package/dist/types/components/confetti.d.ts +2 -4
- package/dist/types/components/currencyInput.d.ts +59 -0
- package/dist/types/components/datepicker.d.ts +59 -36
- package/dist/types/components/expandingCard.d.ts +6 -6
- package/dist/types/components/funnelChart.d.ts +38 -0
- package/dist/types/components/heatmapChart.d.ts +39 -8
- package/dist/types/components/hoverCard.d.ts +58 -0
- package/dist/types/components/index.d.ts +17 -1
- package/dist/types/components/inputMask.d.ts +30 -0
- package/dist/types/components/keypad.d.ts +66 -0
- package/dist/types/components/lightbox.d.ts +17 -25
- package/dist/types/components/lineChart.d.ts +176 -10
- package/dist/types/components/loadingOverlay.d.ts +42 -0
- package/dist/types/components/mapView.d.ts +26 -17
- package/dist/types/components/menu.d.ts +61 -22
- package/dist/types/components/menubar.d.ts +37 -0
- package/dist/types/components/messageScroller.d.ts +2 -14
- package/dist/types/components/mixedChart.d.ts +15 -6
- package/dist/types/components/navigationRail.d.ts +16 -5
- package/dist/types/components/particles.d.ts +8 -4
- package/dist/types/components/pieChart.d.ts +32 -7
- package/dist/types/components/pullToRefresh.d.ts +80 -0
- package/dist/types/components/questionnaire.d.ts +58 -16
- package/dist/types/components/radarChart.d.ts +10 -6
- package/dist/types/components/radialChart.d.ts +58 -8
- package/dist/types/components/registry.d.ts +77 -3
- package/dist/types/components/richTextEditor.d.ts +6 -14
- package/dist/types/components/sankeyChart.d.ts +72 -0
- package/dist/types/components/scatterChart.d.ts +102 -0
- package/dist/types/components/scrollspy.d.ts +3 -5
- package/dist/types/components/select.d.ts +43 -30
- package/dist/types/components/showMore.d.ts +51 -0
- package/dist/types/components/slider.d.ts +5 -15
- package/dist/types/components/snackbar.d.ts +62 -0
- package/dist/types/components/swipeActions.d.ts +81 -0
- package/dist/types/components/tabs.d.ts +93 -27
- package/dist/types/components/timepicker.d.ts +114 -20
- package/dist/types/components/tooltip.d.ts +56 -20
- package/dist/types/components/treeSelect.d.ts +106 -0
- package/dist/types/components/treemapChart.d.ts +56 -0
- package/dist/types/core/component.d.ts +43 -25
- package/dist/types/core/formControl.d.ts +21 -0
- package/dist/types/core/spring.d.ts +20 -0
- package/dist/types/core/utils.d.ts +85 -72
- package/dist/types/modular.d.ts +33 -1
- package/dist/types/plugins/dockedDisplayPlugin.d.ts +10 -7
- package/dist/types/plugins/modalDisplayPlugin.d.ts +32 -0
- package/package.json +10 -8
- package/src/sass/README.md +27 -18
- package/src/sass/abstracts/_breakpoints.scss +0 -1
- package/src/sass/abstracts/_elevation.scss +13 -7
- package/src/sass/abstracts/_index.scss +1 -0
- package/src/sass/abstracts/_mixins.scss +438 -92
- package/src/sass/abstracts/_spring.scss +63 -0
- package/src/sass/abstracts/_variables.scss +43 -15
- package/src/sass/base/_fonts.scss +61 -48
- package/src/sass/base/_global.scss +105 -34
- package/src/sass/base/_index.scss +3 -1
- package/src/sass/base/_normalize.scss +59 -114
- package/src/sass/base/_print.scss +21 -0
- package/src/sass/base/_prose.scss +68 -0
- package/src/sass/base/_typography.scss +9 -5
- package/src/sass/components/_accordion.scss +9 -16
- package/src/sass/components/_alert.scss +102 -0
- package/src/sass/components/_aura.scss +8 -3
- package/src/sass/components/_avatar.scss +3 -3
- package/src/sass/components/_back-to-top.scss +38 -0
- package/src/sass/components/_badges.scss +7 -13
- package/src/sass/components/_bar-chart.scss +41 -19
- package/src/sass/components/_bottom-sheet.scss +44 -16
- package/src/sass/components/_breadcrumb.scss +8 -1
- package/src/sass/components/_button-groups.scss +44 -89
- package/src/sass/components/_buttons.scss +156 -63
- package/src/sass/components/_calendar.scss +246 -0
- package/src/sass/components/_cards.scss +41 -68
- package/src/sass/components/_carousel.scss +43 -158
- package/src/sass/components/_cascader.scss +142 -0
- package/src/sass/components/_chips.scss +36 -52
- package/src/sass/components/_column-chart.scss +19 -12
- package/src/sass/components/_command-palette.scss +4 -7
- package/src/sass/components/_confetti.scss +0 -2
- package/src/sass/components/_countdown.scss +1 -1
- package/src/sass/components/_data-table.scss +162 -27
- package/src/sass/components/_datepicker.scss +57 -62
- package/src/sass/components/_description-list.scss +85 -0
- package/src/sass/components/_dialog.scss +42 -44
- package/src/sass/components/_docked-display.scss +1 -3
- package/src/sass/components/_drag-handle.scss +16 -20
- package/src/sass/components/_expanding-card.scss +20 -9
- package/src/sass/components/_fab-menu.scss +44 -32
- package/src/sass/components/_funnel-chart.scss +124 -0
- package/src/sass/components/_heatmap-chart.scss +113 -24
- package/src/sass/components/_icon-buttons.scss +7 -8
- package/src/sass/components/_icons-material-design.scss +2 -2
- package/src/sass/components/_image-compare.scss +108 -0
- package/src/sass/components/_index.scss +21 -0
- package/src/sass/components/_keypad.scss +182 -0
- package/src/sass/components/_kpi.scss +6 -11
- package/src/sass/components/_lightbox.scss +26 -20
- package/src/sass/components/_line-chart.scss +16 -2
- package/src/sass/components/_list.scss +59 -14
- package/src/sass/components/_loading-indicator.scss +1 -0
- package/src/sass/components/_loading-overlay.scss +105 -0
- package/src/sass/components/_map.scss +35 -13
- package/src/sass/components/_marquee.scss +3 -2
- package/src/sass/components/_mega-menu.scss +137 -0
- package/src/sass/components/_menu.scss +159 -182
- package/src/sass/components/_menubar.scss +59 -0
- package/src/sass/components/_message-scroller.scss +2 -2
- package/src/sass/components/_message.scss +3 -3
- package/src/sass/components/_mixed-chart.scss +37 -9
- package/src/sass/components/_modal-display.scss +21 -0
- package/src/sass/components/_navbar.scss +43 -65
- package/src/sass/components/_navigation-bar.scss +15 -77
- package/src/sass/components/_navigation-rail.scss +171 -121
- package/src/sass/components/_org-chart.scss +192 -0
- package/src/sass/components/_page-footer.scss +16 -13
- package/src/sass/components/_pagination.scss +6 -13
- package/src/sass/components/_panes.scss +33 -31
- package/src/sass/components/_particles.scss +0 -2
- package/src/sass/components/_pie-chart.scss +91 -11
- package/src/sass/components/_popover.scss +18 -5
- package/src/sass/components/_progress.scss +158 -35
- package/src/sass/components/_pull-to-refresh.scss +90 -0
- package/src/sass/components/_questionnaire.scss +74 -3
- package/src/sass/components/_radar-chart.scss +38 -10
- package/src/sass/components/_radial-chart.scss +113 -5
- package/src/sass/components/_rich-text-editor.scss +2 -2
- package/src/sass/components/_sankey-chart.scss +114 -0
- package/src/sass/components/_scatter-chart.scss +153 -0
- package/src/sass/components/_scrim.scss +0 -2
- package/src/sass/components/_scrollspy.scss +0 -2
- package/src/sass/components/_search.scss +26 -22
- package/src/sass/components/_show-more.scss +8 -0
- package/src/sass/components/_side-sheet.scss +23 -40
- package/src/sass/components/_skeleton.scss +2 -4
- package/src/sass/components/_snackbar.scss +27 -21
- package/src/sass/components/_split-button.scss +5 -5
- package/src/sass/components/_stat.scss +3 -8
- package/src/sass/components/_stepper.scss +1 -5
- package/src/sass/components/_swipe-actions.scss +71 -0
- package/src/sass/components/_tabs.scss +51 -32
- package/src/sass/components/_timeline.scss +12 -12
- package/src/sass/components/_timepicker.scss +111 -112
- package/src/sass/components/_toolbar.scss +35 -47
- package/src/sass/components/_tooltip.scss +21 -12
- package/src/sass/components/_tour.scss +89 -0
- package/src/sass/components/_transfer-list.scss +73 -0
- package/src/sass/components/_transitions.scss +4 -4
- package/src/sass/components/_tree.scss +3 -16
- package/src/sass/components/_treemap-chart.scss +122 -0
- package/src/sass/components/forms/_checkboxes.scss +140 -86
- package/src/sass/components/forms/_color-picker.scss +135 -0
- package/src/sass/components/forms/_color-swatches.scss +85 -0
- package/src/sass/components/forms/_drop-zone.scss +15 -9
- package/src/sass/components/forms/_fieldset.scss +10 -10
- package/src/sass/components/forms/_file-input.scss +6 -9
- package/src/sass/components/forms/_index.scss +3 -1
- package/src/sass/components/forms/_input-fields.scss +254 -90
- package/src/sass/components/forms/_radio-buttons.scss +40 -127
- package/src/sass/components/forms/_rating.scss +2 -32
- package/src/sass/components/forms/_select.scss +199 -23
- package/src/sass/components/forms/_slider.scss +140 -330
- package/src/sass/components/forms/_switches.scss +53 -164
- package/src/sass/custom.scss +10 -1
- package/src/sass/expressive.scss +3 -63
- package/src/sass/tokens/_contrast.scss +94 -0
- package/src/sass/tokens/_elevation.scss +16 -0
- package/src/sass/tokens/_index.scss +5 -0
- package/src/sass/tokens/_motion.scss +109 -0
- package/src/sass/tokens/_reference.scss +72 -141
- package/src/sass/tokens/_shape.scss +38 -0
- package/src/sass/tokens/_stacking.scss +27 -0
- package/src/sass/tokens/_state.scss +2 -4
- package/src/sass/tokens/_theme.scss +11 -2
- package/src/sass/tokens/_vibrant.scss +2 -5
- package/src/sass/utilities/_colors.scss +6 -1
- package/src/sass/utilities/_defer-render.scss +17 -0
- package/src/sass/utilities/_helpers.scss +183 -26
- package/src/sass/utilities/_index.scss +2 -1
- package/src/sass/utilities/_scroll-area.scss +0 -2
- package/src/sass/utilities/_spacing.scss +52 -34
- package/src/sass/utilities/_typescale.scss +8 -1
- package/src/sass/utilities/_visibility.scss +47 -76
- package/src/sass/utilities/_z-depth.scss +7 -4
- package/dist/js/chunks/chunk-3DHK5CZU.mjs.map +0 -7
- package/dist/js/chunks/chunk-3GVFZ4XO.mjs.map +0 -7
- package/dist/js/chunks/chunk-4HZMB7LI.mjs.map +0 -7
- package/dist/js/chunks/chunk-4KMNFIFZ.mjs +0 -270
- package/dist/js/chunks/chunk-4KMNFIFZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-4TKTLGEM.mjs.map +0 -7
- package/dist/js/chunks/chunk-5BKHWHYY.mjs +0 -292
- package/dist/js/chunks/chunk-5BKHWHYY.mjs.map +0 -7
- package/dist/js/chunks/chunk-5HQSGDZ5.mjs.map +0 -7
- package/dist/js/chunks/chunk-6N2XAEFK.mjs +0 -125
- package/dist/js/chunks/chunk-6N2XAEFK.mjs.map +0 -7
- package/dist/js/chunks/chunk-A7ALMYUR.mjs.map +0 -7
- package/dist/js/chunks/chunk-BG6ZRB5H.mjs.map +0 -7
- package/dist/js/chunks/chunk-CUQPB25U.mjs +0 -55
- package/dist/js/chunks/chunk-CUQPB25U.mjs.map +0 -7
- package/dist/js/chunks/chunk-DAIU5SLG.mjs.map +0 -7
- package/dist/js/chunks/chunk-FS7XY3HT.mjs.map +0 -7
- package/dist/js/chunks/chunk-GIW4K4SE.mjs.map +0 -7
- package/dist/js/chunks/chunk-GUB3TNO2.mjs.map +0 -7
- package/dist/js/chunks/chunk-GVGT6MIU.mjs.map +0 -7
- package/dist/js/chunks/chunk-GZKEFWPM.mjs +0 -181
- package/dist/js/chunks/chunk-GZKEFWPM.mjs.map +0 -7
- package/dist/js/chunks/chunk-HKT2S7VM.mjs +0 -48
- package/dist/js/chunks/chunk-HKT2S7VM.mjs.map +0 -7
- package/dist/js/chunks/chunk-ILP3PDTL.mjs +0 -187
- package/dist/js/chunks/chunk-ILP3PDTL.mjs.map +0 -7
- package/dist/js/chunks/chunk-JIDMQGK6.mjs.map +0 -7
- package/dist/js/chunks/chunk-KBNN3QDH.mjs +0 -7
- package/dist/js/chunks/chunk-KBNN3QDH.mjs.map +0 -7
- package/dist/js/chunks/chunk-KHV6DZXX.mjs.map +0 -7
- package/dist/js/chunks/chunk-KY6U46SM.mjs +0 -345
- package/dist/js/chunks/chunk-KY6U46SM.mjs.map +0 -7
- package/dist/js/chunks/chunk-LRZMJZ3T.mjs +0 -291
- package/dist/js/chunks/chunk-LRZMJZ3T.mjs.map +0 -7
- package/dist/js/chunks/chunk-LTWPGFBR.mjs +0 -59
- package/dist/js/chunks/chunk-LTWPGFBR.mjs.map +0 -7
- package/dist/js/chunks/chunk-MNPROCZF.mjs +0 -328
- package/dist/js/chunks/chunk-MNPROCZF.mjs.map +0 -7
- package/dist/js/chunks/chunk-MZ6Z24BX.mjs.map +0 -7
- package/dist/js/chunks/chunk-NS2UMNZV.mjs.map +0 -7
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs +0 -406
- package/dist/js/chunks/chunk-O5XPWXIQ.mjs.map +0 -7
- package/dist/js/chunks/chunk-PM655FXL.mjs.map +0 -7
- package/dist/js/chunks/chunk-QDAL4IYN.mjs.map +0 -7
- package/dist/js/chunks/chunk-QERLECVU.mjs +0 -572
- package/dist/js/chunks/chunk-QERLECVU.mjs.map +0 -7
- package/dist/js/chunks/chunk-QJABDLSD.mjs +0 -112
- package/dist/js/chunks/chunk-QJABDLSD.mjs.map +0 -7
- package/dist/js/chunks/chunk-RHRQKTTX.mjs +0 -139
- package/dist/js/chunks/chunk-RHRQKTTX.mjs.map +0 -7
- package/dist/js/chunks/chunk-S3XDFGSZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-SPETGK25.mjs +0 -59
- package/dist/js/chunks/chunk-SPETGK25.mjs.map +0 -7
- package/dist/js/chunks/chunk-TBM3FT7G.mjs.map +0 -7
- package/dist/js/chunks/chunk-UEXCIMJZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-UEZUJQ66.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGZSAFTX.mjs +0 -173
- package/dist/js/chunks/chunk-VGZSAFTX.mjs.map +0 -7
- package/dist/js/chunks/chunk-X7OCHZVF.mjs +0 -76
- package/dist/js/chunks/chunk-X7OCHZVF.mjs.map +0 -7
- package/dist/js/chunks/chunk-YDCS5S3J.mjs.map +0 -7
- package/dist/js/chunks/chunk-YMSXJON6.mjs +0 -79
- package/dist/js/chunks/chunk-YMSXJON6.mjs.map +0 -7
- package/dist/js/chunks/chunk-Z2NRKI7R.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZAS25YFD.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZKZKNSLC.mjs +0 -1
- /package/dist/js/chunks/{chunk-ZKZKNSLC.mjs.map → chunk-GNRSYMVH.mjs.map} +0 -0
|
@@ -0,0 +1,746 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component
|
|
3
|
+
} from "./chunk-CMGXGYUC.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Utils,
|
|
6
|
+
svgNode
|
|
7
|
+
} from "./chunk-ZVLOUDIJ.mjs";
|
|
8
|
+
|
|
9
|
+
// src/ts/components/lineChart.ts
|
|
10
|
+
var _defaults = {
|
|
11
|
+
min: null,
|
|
12
|
+
max: null,
|
|
13
|
+
watch: false
|
|
14
|
+
};
|
|
15
|
+
var COLORS = 4;
|
|
16
|
+
var LABEL_GAP = 4;
|
|
17
|
+
function labelBoxes(items, rtl) {
|
|
18
|
+
const range = document.createRange();
|
|
19
|
+
return items.map((item) => {
|
|
20
|
+
range.selectNodeContents(item);
|
|
21
|
+
const width = range.getBoundingClientRect().width;
|
|
22
|
+
const { left, right } = item.getBoundingClientRect();
|
|
23
|
+
return rtl ? { width, start: -right, end: -left } : { width, start: left, end: right };
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function labelStart(boxes, index) {
|
|
27
|
+
const box = boxes[index];
|
|
28
|
+
if (index === 0) return box.start;
|
|
29
|
+
if (index === boxes.length - 1) return box.end - box.width;
|
|
30
|
+
return (box.start + box.end - box.width) / 2;
|
|
31
|
+
}
|
|
32
|
+
function labelsFit(boxes, step) {
|
|
33
|
+
const edge = boxes[boxes.length - 1].end;
|
|
34
|
+
let previous = -Infinity;
|
|
35
|
+
for (let index = 0; index < boxes.length; index += step) {
|
|
36
|
+
const start = labelStart(boxes, index);
|
|
37
|
+
if (start < previous + LABEL_GAP || start + boxes[index].width > edge) return false;
|
|
38
|
+
previous = start + boxes[index].width;
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
function labelStep(boxes) {
|
|
43
|
+
if (boxes.every((box) => box.width + LABEL_GAP <= box.end - box.start)) return 1;
|
|
44
|
+
for (let step = 2; step <= boxes.length; step++) {
|
|
45
|
+
if (labelsFit(boxes, step)) return step;
|
|
46
|
+
}
|
|
47
|
+
return 1;
|
|
48
|
+
}
|
|
49
|
+
function thinLabels(container, items) {
|
|
50
|
+
const step = labelStep(labelBoxes(items, getComputedStyle(container).direction === "rtl"));
|
|
51
|
+
container.toggleAttribute("data-thinned", step > 1);
|
|
52
|
+
items.forEach((item, index) => item.toggleAttribute("data-skip", index % step > 0));
|
|
53
|
+
}
|
|
54
|
+
function tableChanged(records, el) {
|
|
55
|
+
const isTable = (node) => node.nodeName === "TABLE";
|
|
56
|
+
return records.some((record) => record.target !== el || [...record.addedNodes, ...record.removedNodes].some(isTable));
|
|
57
|
+
}
|
|
58
|
+
function rowLegend(className, colors, rows) {
|
|
59
|
+
const legend = document.createElement("ul");
|
|
60
|
+
legend.className = className;
|
|
61
|
+
legend.setAttribute("aria-hidden", "true");
|
|
62
|
+
legend.append(...rows.map((cells, i) => {
|
|
63
|
+
const li = document.createElement("li");
|
|
64
|
+
if (colors[i]) li.dataset.series = colors[i];
|
|
65
|
+
li.append(...cells.map((content) => Object.assign(document.createElement("span"), { textContent: content })));
|
|
66
|
+
return li;
|
|
67
|
+
}));
|
|
68
|
+
return legend;
|
|
69
|
+
}
|
|
70
|
+
function polarPoint(turn, r) {
|
|
71
|
+
const angle = turn * 2 * Math.PI;
|
|
72
|
+
return `${(r * Math.sin(angle)).toFixed(3)},${(-r * Math.cos(angle)).toFixed(3)}`;
|
|
73
|
+
}
|
|
74
|
+
var seriesColor = (i) => String(i % COLORS + 1);
|
|
75
|
+
var _gradientId = 0;
|
|
76
|
+
var startsFrom = (series) => matchMedia("(prefers-reduced-motion: reduce)").matches ? [] : series;
|
|
77
|
+
var splines = (easing) => /cubic-bezier\(([^)]*)\)/.exec(easing)?.[1] ?? "0.2, 0, 0, 1";
|
|
78
|
+
function pace(el) {
|
|
79
|
+
const style = getComputedStyle(el);
|
|
80
|
+
const dur = style.getPropertyValue("--md-sys-motion-duration-medium4").trim() || "400ms";
|
|
81
|
+
return parseFloat(dur) > 0 ? { dur, keySplines: splines(style.getPropertyValue("--md-sys-motion-easing-standard")) } : null;
|
|
82
|
+
}
|
|
83
|
+
function morph(path, from, timing) {
|
|
84
|
+
const to = path.getAttribute("d");
|
|
85
|
+
if (from === to) return;
|
|
86
|
+
path.append(svgNode("animate", { attributeName: "d", from, to, ...timing, calcMode: "spline", keyTimes: "0;1", fill: "remove" }));
|
|
87
|
+
}
|
|
88
|
+
var buttons = (nodes) => nodes.flatMap((node) => Array.from(node.querySelectorAll("button")));
|
|
89
|
+
var drawable = (series) => series.values.some((value) => value !== null);
|
|
90
|
+
var NICE = [1, 2, 2.5, 5, 10];
|
|
91
|
+
function niceStep(span, parts = 4) {
|
|
92
|
+
const raw = span / parts || 1;
|
|
93
|
+
const power = 10 ** Math.floor(Math.log10(raw));
|
|
94
|
+
return power * NICE.find((multiple) => multiple * power >= raw * (1 - 1e-9));
|
|
95
|
+
}
|
|
96
|
+
function steps(low, high, step) {
|
|
97
|
+
const values = [];
|
|
98
|
+
for (let i = Math.ceil(low / step - 1e-9); i * step <= high + step * 1e-9; i++) {
|
|
99
|
+
values.push(Number((i * step).toPrecision(12)));
|
|
100
|
+
}
|
|
101
|
+
return values;
|
|
102
|
+
}
|
|
103
|
+
function numberFormat(el, options) {
|
|
104
|
+
return new Intl.NumberFormat(Utils.locale(el), options);
|
|
105
|
+
}
|
|
106
|
+
function cellValue(cell) {
|
|
107
|
+
if (!cell) return null;
|
|
108
|
+
return numberValue(cell.dataset.value ?? cell.textContent);
|
|
109
|
+
}
|
|
110
|
+
function numberValue(raw) {
|
|
111
|
+
const text = raw.replace(/\u2212/g, "-").replace(/[\s%\p{Sc}]/gu, "");
|
|
112
|
+
if (!/^[+-]?(\d{1,3}(,\d{3})+|\d+)?(\.\d+)?(e[+-]?\d+)?$/i.test(text)) return null;
|
|
113
|
+
const value = parseFloat(text.replace(/,/g, ""));
|
|
114
|
+
return Number.isFinite(value) ? value : null;
|
|
115
|
+
}
|
|
116
|
+
function tickText(format, tick, [prefix, suffix]) {
|
|
117
|
+
return format.format(tick).replace(/^[-\u2212]?/, (sign) => sign + prefix) + suffix;
|
|
118
|
+
}
|
|
119
|
+
function signs(text) {
|
|
120
|
+
const prefix = /^[\s\p{Sc}]*/u.exec(text)[0];
|
|
121
|
+
const end = (chars) => [...chars].reverse().join("");
|
|
122
|
+
return [prefix, end(/^[\s%\p{Sc}]*/u.exec(end(text.slice(prefix.length)))[0])];
|
|
123
|
+
}
|
|
124
|
+
function affix(cells) {
|
|
125
|
+
const cell = cells.find((each) => !each?.dataset.value && cellValue(each) !== null);
|
|
126
|
+
return signs(cell?.textContent.trim() ?? "");
|
|
127
|
+
}
|
|
128
|
+
function straightPath(points) {
|
|
129
|
+
return `M${points.join("L")}${points.length > 1 ? "" : "h0"}`;
|
|
130
|
+
}
|
|
131
|
+
function monotonePath(points) {
|
|
132
|
+
const n = points.length;
|
|
133
|
+
if (n === 0) return "";
|
|
134
|
+
if (n === 1) return `M${points[0][0]},${points[0][1]}h0`;
|
|
135
|
+
const slopes = [];
|
|
136
|
+
for (let i = 0; i < n - 1; i++) {
|
|
137
|
+
slopes.push((points[i + 1][1] - points[i][1]) / (points[i + 1][0] - points[i][0]));
|
|
138
|
+
}
|
|
139
|
+
const tangents = points.map((_, i) => {
|
|
140
|
+
if (i === 0) return slopes[0];
|
|
141
|
+
if (i === n - 1) return slopes[n - 2];
|
|
142
|
+
const [a, b] = [slopes[i - 1], slopes[i]];
|
|
143
|
+
return a * b <= 0 ? 0 : 2 / (1 / a + 1 / b);
|
|
144
|
+
});
|
|
145
|
+
let d = `M${points[0][0]},${points[0][1]}`;
|
|
146
|
+
for (let i = 0; i < n - 1; i++) {
|
|
147
|
+
const [[x0, y0], [x1, y1]] = [points[i], points[i + 1]];
|
|
148
|
+
const h = (x1 - x0) / 3;
|
|
149
|
+
d += `C${x0 + h},${y0 + tangents[i] * h} ${x1 - h},${y1 - tangents[i + 1] * h} ${x1},${y1}`;
|
|
150
|
+
}
|
|
151
|
+
return d;
|
|
152
|
+
}
|
|
153
|
+
var LineChart = class extends Component {
|
|
154
|
+
constructor(el, options) {
|
|
155
|
+
super(el, options);
|
|
156
|
+
/** The values' x positions and series, read from the table. */
|
|
157
|
+
this.labels = [];
|
|
158
|
+
this.series = [];
|
|
159
|
+
/** The highlighted row, or -1. */
|
|
160
|
+
this.activeIndex = -1;
|
|
161
|
+
this._generated = [];
|
|
162
|
+
/** Watches the row labels' width, to thin them on a narrow chart. */
|
|
163
|
+
this._labelSizes = null;
|
|
164
|
+
/** With `watch`, redraws the chart when its table changes. */
|
|
165
|
+
this._tableWatch = null;
|
|
166
|
+
/** Every series in the table, shown or not, as the legend lists them. */
|
|
167
|
+
this._all = [];
|
|
168
|
+
/**
|
|
169
|
+
* During update(), the series drawn before it, which the new marks move
|
|
170
|
+
* from. Empty otherwise, and when the reader prefers less motion.
|
|
171
|
+
*/
|
|
172
|
+
this._before = [];
|
|
173
|
+
/** The columns of the series a .toggle legend hid, kept through update(). */
|
|
174
|
+
this._hidden = /* @__PURE__ */ new Set();
|
|
175
|
+
/** The table's header cells and body rows, as read. */
|
|
176
|
+
this._header = [];
|
|
177
|
+
this._rows = [];
|
|
178
|
+
/**
|
|
179
|
+
* Whether the rows run right to left: a horizontal row axis in a
|
|
180
|
+
* right-to-left context, like the labels. Bar chart rows keep their order.
|
|
181
|
+
*/
|
|
182
|
+
this._reversed = false;
|
|
183
|
+
this._onPointerMove = (e) => {
|
|
184
|
+
this.show(this._indexAt(e));
|
|
185
|
+
};
|
|
186
|
+
this._onFocus = () => {
|
|
187
|
+
if (this.activeIndex < 0 && this._plot.matches(":focus-visible")) this.show(0);
|
|
188
|
+
};
|
|
189
|
+
this._onLeave = (e) => {
|
|
190
|
+
if (e.pointerType === "touch" || this._plot.matches(":focus-visible")) return;
|
|
191
|
+
this.show(-1);
|
|
192
|
+
};
|
|
193
|
+
/** The browser took the touch to scroll the page. */
|
|
194
|
+
this._onCancel = () => {
|
|
195
|
+
this.show(-1);
|
|
196
|
+
};
|
|
197
|
+
this._onKeyDown = (e) => {
|
|
198
|
+
const next = this._keyTarget(e.key);
|
|
199
|
+
if (next === void 0) return;
|
|
200
|
+
e.preventDefault();
|
|
201
|
+
this.show(next);
|
|
202
|
+
};
|
|
203
|
+
this._build();
|
|
204
|
+
this._listen();
|
|
205
|
+
if (this.options.watch || this.el.hasAttribute("data-watch")) {
|
|
206
|
+
this._tableWatch = new MutationObserver((records) => tableChanged(records, this.el) && this.update());
|
|
207
|
+
}
|
|
208
|
+
this._watch();
|
|
209
|
+
}
|
|
210
|
+
/** The class prefix of the generated parts; ColumnChart reuses this class. */
|
|
211
|
+
get _type() {
|
|
212
|
+
return "line-chart";
|
|
213
|
+
}
|
|
214
|
+
/** The column the series start at; a scatter chart's first value column is its x axis. */
|
|
215
|
+
get _seriesFrom() {
|
|
216
|
+
return 1;
|
|
217
|
+
}
|
|
218
|
+
/** The column the series end before, as slice() takes it; a bubble chart's last column holds sizes. */
|
|
219
|
+
get _seriesTo() {
|
|
220
|
+
return void 0;
|
|
221
|
+
}
|
|
222
|
+
/** Whether the y axis always includes zero, as columns grow from it. */
|
|
223
|
+
get _fromZero() {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Whether the rows run down the plot and the values across it, as in a
|
|
228
|
+
* bar chart. The rows then keep their order in a right-to-left context.
|
|
229
|
+
*/
|
|
230
|
+
get _horizontal() {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Whether the rows go round a circle, as in a pie or radar chart. The
|
|
235
|
+
* arrows then step round it, wrapping from the last row to the first.
|
|
236
|
+
*/
|
|
237
|
+
get _circular() {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
/** Whether .axis labels the value scale, which a sparkline never does. */
|
|
241
|
+
get _axis() {
|
|
242
|
+
return this.el.classList.contains("axis") && !this.el.classList.contains("sparkline");
|
|
243
|
+
}
|
|
244
|
+
/** Whether the cursor marks each series with a point. */
|
|
245
|
+
get _points() {
|
|
246
|
+
return true;
|
|
247
|
+
}
|
|
248
|
+
/** How many rows `show()` can highlight. */
|
|
249
|
+
get _count() {
|
|
250
|
+
return this.labels.length;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Observes the table as it is now, and the chart for a table added or
|
|
254
|
+
* replaced. Reconnecting drops the changes already queued, which the
|
|
255
|
+
* caller has just drawn.
|
|
256
|
+
*/
|
|
257
|
+
_watch() {
|
|
258
|
+
if (!this._tableWatch) return;
|
|
259
|
+
this._tableWatch.disconnect();
|
|
260
|
+
this._tableWatch.observe(this.el, { childList: true });
|
|
261
|
+
const table = this.el.querySelector(":scope > table");
|
|
262
|
+
if (table) {
|
|
263
|
+
this._tableWatch.observe(table, {
|
|
264
|
+
subtree: true,
|
|
265
|
+
childList: true,
|
|
266
|
+
characterData: true,
|
|
267
|
+
attributeFilter: ["data-value", "class", "data-label"]
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/** Reads the table and draws it, when it has data. */
|
|
272
|
+
_build() {
|
|
273
|
+
this._read();
|
|
274
|
+
if (!this.labels.length || !this.series.length) return;
|
|
275
|
+
this._reversed = !this._horizontal && getComputedStyle(this.el).direction === "rtl";
|
|
276
|
+
this._render();
|
|
277
|
+
}
|
|
278
|
+
/** Whether the pointer and keys pick rows, which a sparkline's do not. */
|
|
279
|
+
get _interactive() {
|
|
280
|
+
return !this.el.classList.contains("sparkline");
|
|
281
|
+
}
|
|
282
|
+
/** Lets the pointer and keys pick rows on the plot. */
|
|
283
|
+
_listen() {
|
|
284
|
+
if (this._plot && this._interactive) {
|
|
285
|
+
this._plot.addEventListener("pointerdown", this._onPointerMove);
|
|
286
|
+
this._plot.addEventListener("pointermove", this._onPointerMove);
|
|
287
|
+
this._plot.addEventListener("pointerleave", this._onLeave);
|
|
288
|
+
this._plot.addEventListener("pointercancel", this._onCancel);
|
|
289
|
+
this._plot.addEventListener("keydown", this._onKeyDown);
|
|
290
|
+
this._plot.addEventListener("focus", this._onFocus);
|
|
291
|
+
this._plot.addEventListener("blur", this._onLeave);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
static get defaults() {
|
|
295
|
+
return _defaults;
|
|
296
|
+
}
|
|
297
|
+
destroy() {
|
|
298
|
+
this._generated.forEach((node) => node.remove());
|
|
299
|
+
this._generated = [];
|
|
300
|
+
this._labelSizes?.disconnect();
|
|
301
|
+
this._tableWatch?.disconnect();
|
|
302
|
+
super.destroy();
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Redraws the chart from its table as it is now. Focus stays on the chart,
|
|
306
|
+
* on the same legend button when one had it, and the highlighted row stays
|
|
307
|
+
* where the table still has it.
|
|
308
|
+
*/
|
|
309
|
+
update() {
|
|
310
|
+
if (this.constructor.getInstance(this.el) !== this) return;
|
|
311
|
+
const old = this._generated;
|
|
312
|
+
const active = this.el.getRootNode().activeElement;
|
|
313
|
+
const [index, focused] = [this.activeIndex, old.some((node) => node.contains(active))];
|
|
314
|
+
const button = buttons(old).indexOf(active);
|
|
315
|
+
this._generated = [];
|
|
316
|
+
this.activeIndex = -1;
|
|
317
|
+
this._plot = this._cursor = this._tooltip = void 0;
|
|
318
|
+
this._before = startsFrom(this.series);
|
|
319
|
+
this._build();
|
|
320
|
+
this._before = [];
|
|
321
|
+
if (focused) (buttons(this._generated)[button] ?? this._plot)?.focus({ preventScroll: true });
|
|
322
|
+
old.forEach((node) => node.remove());
|
|
323
|
+
this._listen();
|
|
324
|
+
this.show(Math.min(index, this._count - 1));
|
|
325
|
+
this._watch();
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Highlights one row: moves the cursor and fills the tooltip.
|
|
329
|
+
* Pass -1 to hide them. Does nothing for a chart without data.
|
|
330
|
+
*/
|
|
331
|
+
show(index) {
|
|
332
|
+
if (!this._tooltip || index === this.activeIndex) return;
|
|
333
|
+
this.activeIndex = index;
|
|
334
|
+
const hidden = index < 0 || index >= this.labels.length;
|
|
335
|
+
this._cursor.hidden = this._tooltip.hidden = hidden;
|
|
336
|
+
if (hidden) return;
|
|
337
|
+
this._cursor.replaceChildren();
|
|
338
|
+
const title = document.createElement("strong");
|
|
339
|
+
title.textContent = this.labels[index];
|
|
340
|
+
this._tooltip.replaceChildren(title);
|
|
341
|
+
this.series.forEach((series) => {
|
|
342
|
+
const value = series.values[index];
|
|
343
|
+
if (value === null) return;
|
|
344
|
+
const color = series.color;
|
|
345
|
+
const top = series.tops[index];
|
|
346
|
+
if (top !== null && this._points) {
|
|
347
|
+
const dot = document.createElement("span");
|
|
348
|
+
dot.className = series.className;
|
|
349
|
+
dot.dataset.series = color;
|
|
350
|
+
dot.style.top = `${series.y(top)}%`;
|
|
351
|
+
this._cursor.append(dot);
|
|
352
|
+
}
|
|
353
|
+
const name = document.createElement("span");
|
|
354
|
+
name.dataset.series = color;
|
|
355
|
+
name.textContent = series.name;
|
|
356
|
+
const text = document.createElement("span");
|
|
357
|
+
text.textContent = series.text[index];
|
|
358
|
+
this._tooltip.append(name, text);
|
|
359
|
+
});
|
|
360
|
+
this._place(index);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Moves the filled cursor and tooltip to a row: beside its band, with the
|
|
364
|
+
* tooltip opening back over the plot past the middle.
|
|
365
|
+
*/
|
|
366
|
+
_place(index) {
|
|
367
|
+
const x = this._x(index);
|
|
368
|
+
const side = this._horizontal ? "top" : "left";
|
|
369
|
+
this._cursor.style[side] = this._tooltip.style[side] = `${x}%`;
|
|
370
|
+
this._tooltip.classList.toggle("end", x > 50);
|
|
371
|
+
}
|
|
372
|
+
_read() {
|
|
373
|
+
const table = this.el.querySelector(":scope > table");
|
|
374
|
+
if (!table) return;
|
|
375
|
+
const headerRow = table.tHead?.rows[0] ?? table.rows[0];
|
|
376
|
+
const header = Array.from(headerRow?.cells ?? []);
|
|
377
|
+
const rows = Array.from(table.tBodies).flatMap((body) => Array.from(body.rows)).filter((row) => row !== headerRow);
|
|
378
|
+
[this._header, this._rows] = [header, rows];
|
|
379
|
+
this.labels = rows.map((row) => row.cells[0]?.textContent.trim() ?? "");
|
|
380
|
+
const from = this._seriesFrom;
|
|
381
|
+
this.series = header.slice(from, this._seriesTo).map((cell, i) => {
|
|
382
|
+
const values = rows.map((row) => cellValue(row.cells[i + from]));
|
|
383
|
+
return {
|
|
384
|
+
name: cell.textContent.trim(),
|
|
385
|
+
className: cell.className,
|
|
386
|
+
column: i + from,
|
|
387
|
+
color: seriesColor(i),
|
|
388
|
+
text: rows.map((row) => row.cells[i + from]?.textContent.trim() ?? ""),
|
|
389
|
+
values,
|
|
390
|
+
tops: values,
|
|
391
|
+
y: void 0,
|
|
392
|
+
scale: void 0,
|
|
393
|
+
affix: affix(rows.map((row) => row.cells[i + from]))
|
|
394
|
+
};
|
|
395
|
+
});
|
|
396
|
+
this._all = this.series;
|
|
397
|
+
this.series = this._shown(this._all);
|
|
398
|
+
const option = (name) => this._number(name) ?? this.options[name];
|
|
399
|
+
this._y = this._scale(this.series, option("min"), option("max"));
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* The series to draw, arranged: those the legend has not hidden, or none
|
|
403
|
+
* without data. When the ones shown hold no data, as after the table
|
|
404
|
+
* changed, the hidden ones come back, so the legend never hides the only
|
|
405
|
+
* data there is.
|
|
406
|
+
*/
|
|
407
|
+
_shown(all) {
|
|
408
|
+
const shown = all.filter((series) => !this._hidden.has(series.column));
|
|
409
|
+
this._arrange(shown);
|
|
410
|
+
if (shown.some(drawable)) return shown;
|
|
411
|
+
if (!this._hidden.size) return [];
|
|
412
|
+
this._hidden.clear();
|
|
413
|
+
return this._shown(all);
|
|
414
|
+
}
|
|
415
|
+
/** Turns the values read into what is drawn: with .stacked, running totals. */
|
|
416
|
+
_arrange(series) {
|
|
417
|
+
if (this.el.classList.contains("stacked")) this._stack(series);
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Stacks each series on the ones before it: its tops become running
|
|
421
|
+
* totals and its base the total below. A gap leaves the total unknown, so
|
|
422
|
+
* the series above break there too.
|
|
423
|
+
*/
|
|
424
|
+
_stack(series) {
|
|
425
|
+
const totals = this.labels.map(() => 0);
|
|
426
|
+
for (const each of series) {
|
|
427
|
+
each.base = [...totals];
|
|
428
|
+
each.tops = each.values.map((value, i) => totals[i] = value === null || totals[i] === null ? null : totals[i] + value);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/** A number from one of the chart's data attributes, or null. */
|
|
432
|
+
_number(name) {
|
|
433
|
+
const value = parseFloat(this.el.dataset[name] ?? "");
|
|
434
|
+
return Number.isFinite(value) ? value : null;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Fits a y scale to the series' tops, between `min` and `max` where they
|
|
438
|
+
* are set, and gives it to each series.
|
|
439
|
+
*/
|
|
440
|
+
_scale(series, min, max, fromZero = this._fromZero) {
|
|
441
|
+
const fixed = [min !== null, max !== null];
|
|
442
|
+
const stacked = this.el.classList.contains("stacked");
|
|
443
|
+
let [low, high] = [Infinity, -Infinity];
|
|
444
|
+
for (const { tops, base = [] } of series) {
|
|
445
|
+
for (const value of [...tops, ...base]) {
|
|
446
|
+
if (value === null) continue;
|
|
447
|
+
low = Math.min(low, value);
|
|
448
|
+
high = Math.max(high, value);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
if (low > high) low = high = 0;
|
|
452
|
+
if (fromZero) {
|
|
453
|
+
const [bottom, top] = [Math.min(0, low), Math.max(0, high)];
|
|
454
|
+
const room = (top - (min ?? bottom)) * 0.1 || 1;
|
|
455
|
+
min ?? (min = bottom < 0 ? bottom - room : 0);
|
|
456
|
+
max ?? (max = top + room);
|
|
457
|
+
} else {
|
|
458
|
+
const pad = (high - low) * 0.1 || 1;
|
|
459
|
+
min ?? (min = stacked ? Math.min(0, low) : low - pad);
|
|
460
|
+
max ?? (max = high + (stacked ? (high - min) * 0.1 || 1 : pad));
|
|
461
|
+
}
|
|
462
|
+
return this._apply(series, this._fit(min, max, fixed));
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* With .axis, widens each end the chart chose to a round step and lists
|
|
466
|
+
* the steps for the labels. An end set by the author stays where it is.
|
|
467
|
+
*/
|
|
468
|
+
_fit(min, max, [fixedMin, fixedMax]) {
|
|
469
|
+
if (!this._axis) return { min, max, ticks: [] };
|
|
470
|
+
const step = niceStep(max - min);
|
|
471
|
+
const low = fixedMin ? min : Math.floor(min / step + 1e-9) * step;
|
|
472
|
+
const high = fixedMax ? max : Math.ceil(max / step - 1e-9) * step;
|
|
473
|
+
return { min: low, max: high, ticks: steps(low, high, step) };
|
|
474
|
+
}
|
|
475
|
+
/** Gives the series a scale and the y function it draws with. */
|
|
476
|
+
_apply(series, scale) {
|
|
477
|
+
const y = (value) => 100 - (value - scale.min) / (scale.max - scale.min || 1) * 100;
|
|
478
|
+
for (const each of series) Object.assign(each, { y, scale });
|
|
479
|
+
return y;
|
|
480
|
+
}
|
|
481
|
+
/** Each row sits in the middle of an equal band, beside its label. */
|
|
482
|
+
_x(index) {
|
|
483
|
+
const x = (index + 0.5) / this.labels.length * 100;
|
|
484
|
+
return this._reversed ? 100 - x : x;
|
|
485
|
+
}
|
|
486
|
+
_render() {
|
|
487
|
+
const type = this._type;
|
|
488
|
+
this._plot = document.createElement("div");
|
|
489
|
+
this._plot.className = `${type}-plot`;
|
|
490
|
+
const caption = this.el.querySelector(":scope > figcaption")?.textContent.trim();
|
|
491
|
+
this._plot.setAttribute("role", "group");
|
|
492
|
+
this._plot.setAttribute("aria-roledescription", type.replace(/-/g, " "));
|
|
493
|
+
if (caption) this._plot.setAttribute("aria-label", caption);
|
|
494
|
+
if (this._interactive) this._plot.tabIndex = 0;
|
|
495
|
+
this._cursor = document.createElement("div");
|
|
496
|
+
this._cursor.className = `${type}-cursor`;
|
|
497
|
+
this._cursor.hidden = true;
|
|
498
|
+
this._tooltip = document.createElement("div");
|
|
499
|
+
this._tooltip.className = `${type}-tooltip`;
|
|
500
|
+
this._tooltip.hidden = true;
|
|
501
|
+
this._tooltip.setAttribute("aria-live", "polite");
|
|
502
|
+
this._plot.append(...this._axes(), this._draw(), this._cursor, this._tooltip);
|
|
503
|
+
this._generated = [this._plot, ...this._guides()];
|
|
504
|
+
this.el.append(...this._generated);
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* The <tfoot> row as a total to show over the plot, its value over its
|
|
508
|
+
* label, or null without one.
|
|
509
|
+
*/
|
|
510
|
+
_total(className) {
|
|
511
|
+
const footer = this.el.querySelector(":scope > table")?.tFoot?.rows[0];
|
|
512
|
+
if (!footer) return null;
|
|
513
|
+
const total = document.createElement("div");
|
|
514
|
+
total.className = className;
|
|
515
|
+
const [label, value] = [document.createElement("span"), document.createElement("strong")];
|
|
516
|
+
label.textContent = footer.cells[0]?.textContent.trim() ?? "";
|
|
517
|
+
value.textContent = footer.cells[1]?.textContent.trim() ?? "";
|
|
518
|
+
total.append(value, label);
|
|
519
|
+
return total;
|
|
520
|
+
}
|
|
521
|
+
/** The parts below the plot: the row labels and the legend. */
|
|
522
|
+
_guides() {
|
|
523
|
+
const labels = document.createElement("ol");
|
|
524
|
+
labels.className = `${this._type}-labels`;
|
|
525
|
+
labels.setAttribute("aria-hidden", "true");
|
|
526
|
+
for (const text of this.labels) {
|
|
527
|
+
const li = document.createElement("li");
|
|
528
|
+
li.append(document.createElement("span"));
|
|
529
|
+
li.firstChild.textContent = text;
|
|
530
|
+
labels.append(li);
|
|
531
|
+
}
|
|
532
|
+
this._observeLabels(labels, Array.from(labels.children));
|
|
533
|
+
return [labels, ...this._legend()];
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Thins the column labels in container whenever its width changes. A bar
|
|
537
|
+
* chart's labels run down instead, and no labels leaves nothing to watch.
|
|
538
|
+
*/
|
|
539
|
+
_observeLabels(container, items) {
|
|
540
|
+
this._labelSizes?.disconnect();
|
|
541
|
+
if (this._horizontal || !items.length) return;
|
|
542
|
+
this._labelSizes = new ResizeObserver(() => thinLabels(container, items));
|
|
543
|
+
this._labelSizes.observe(container);
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* With .axis, the value labels, behind the marks: the start scale's with
|
|
547
|
+
* a grid line at each, and a mixed chart's end scale on the far side.
|
|
548
|
+
*/
|
|
549
|
+
_axes() {
|
|
550
|
+
if (!this._axis) return [];
|
|
551
|
+
const isEnd = (series) => series.className.split(/\s+/).includes("end");
|
|
552
|
+
const start = this.series.find((series) => !isEnd(series)) ?? this.series[0];
|
|
553
|
+
const end = this.series.find((series) => series.y !== start.y);
|
|
554
|
+
return [start, end].filter(Boolean).map((series, i) => this._valueAxis(series, i > 0));
|
|
555
|
+
}
|
|
556
|
+
/** One scale's labels, each placed by --at, its value's distance down the plot. */
|
|
557
|
+
_valueAxis(series, end) {
|
|
558
|
+
const axis = document.createElement("ol");
|
|
559
|
+
axis.className = `${this._type}-axis${end ? " end" : ""}`;
|
|
560
|
+
axis.setAttribute("aria-hidden", "true");
|
|
561
|
+
const number = numberFormat(this.el, { notation: "compact", maximumSignificantDigits: 3 });
|
|
562
|
+
for (const tick of series.scale.ticks) {
|
|
563
|
+
const li = document.createElement("li");
|
|
564
|
+
const label = document.createElement("span");
|
|
565
|
+
label.textContent = tickText(number, tick, series.affix);
|
|
566
|
+
li.style.setProperty("--at", `${series.y(tick)}%`);
|
|
567
|
+
li.append(label);
|
|
568
|
+
axis.append(li);
|
|
569
|
+
}
|
|
570
|
+
return axis;
|
|
571
|
+
}
|
|
572
|
+
/**
|
|
573
|
+
* The series legend, for more than one series. With .toggle each item is
|
|
574
|
+
* a button that shows or hides its series, and the scale refits.
|
|
575
|
+
*/
|
|
576
|
+
_legend() {
|
|
577
|
+
if (this._all.length < 2) return [];
|
|
578
|
+
const toggle = this.el.classList.contains("toggle");
|
|
579
|
+
const legend = document.createElement("ul");
|
|
580
|
+
legend.className = `${this._type}-legend`;
|
|
581
|
+
if (!toggle) legend.setAttribute("aria-hidden", "true");
|
|
582
|
+
legend.append(...this._all.map((series) => {
|
|
583
|
+
const li = document.createElement("li");
|
|
584
|
+
li.dataset.series = series.color;
|
|
585
|
+
li.append(toggle ? this._toggle(series) : series.name);
|
|
586
|
+
return li;
|
|
587
|
+
}));
|
|
588
|
+
return [legend];
|
|
589
|
+
}
|
|
590
|
+
/** A button that shows or hides a series, though never the last one shown. */
|
|
591
|
+
_toggle(series) {
|
|
592
|
+
const button = document.createElement("button");
|
|
593
|
+
const shown = this.series.includes(series);
|
|
594
|
+
button.type = "button";
|
|
595
|
+
button.className = "chart-toggle";
|
|
596
|
+
button.textContent = series.name;
|
|
597
|
+
button.setAttribute("aria-pressed", String(shown));
|
|
598
|
+
if (shown && drawable(series) && this.series.filter(drawable).length < 2) button.setAttribute("aria-disabled", "true");
|
|
599
|
+
button.addEventListener("click", () => {
|
|
600
|
+
if (button.hasAttribute("aria-disabled")) return;
|
|
601
|
+
if (shown) this._hidden.add(series.column);
|
|
602
|
+
else this._hidden.delete(series.column);
|
|
603
|
+
this.update();
|
|
604
|
+
});
|
|
605
|
+
return button;
|
|
606
|
+
}
|
|
607
|
+
/** Draws the series, which fill the plot. */
|
|
608
|
+
_draw(drawn = this.series) {
|
|
609
|
+
const svg = svgNode("svg", {
|
|
610
|
+
viewBox: "0 0 100 100",
|
|
611
|
+
preserveAspectRatio: "none",
|
|
612
|
+
"aria-hidden": "true",
|
|
613
|
+
focusable: "false"
|
|
614
|
+
});
|
|
615
|
+
const timing = this._before.length ? pace(this.el) : null;
|
|
616
|
+
const starts = timing ? this._starts(drawn) : [];
|
|
617
|
+
svg.append(...drawn.map((series, i) => this._line(series, starts[i], timing)));
|
|
618
|
+
return svg;
|
|
619
|
+
}
|
|
620
|
+
/**
|
|
621
|
+
* After update(), the shape each series moves from: where it was drawn,
|
|
622
|
+
* and for a row it had no value at, its base. That is the plot bottom,
|
|
623
|
+
* or in a stack where the series below starts, so the stack stays joined.
|
|
624
|
+
*/
|
|
625
|
+
_starts(drawn) {
|
|
626
|
+
let below;
|
|
627
|
+
return drawn.map((series) => {
|
|
628
|
+
const base = !series.base ? () => 100 : below ?? this._baseY(series);
|
|
629
|
+
below = this._was(series, base);
|
|
630
|
+
return this._shape(series, below, base);
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
/** Where a series drew each row before update(), or its base for a row it had no value at. */
|
|
634
|
+
_was(series, base) {
|
|
635
|
+
const old = this._before.find((each) => each.column === series.column);
|
|
636
|
+
return (index) => {
|
|
637
|
+
const top = old?.tops[index] ?? null;
|
|
638
|
+
return top === null ? base(index) : old.y(top);
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
/** Where a stacked area's base runs: the series below, or the plot bottom when zero is off the scale. */
|
|
642
|
+
_baseY(series) {
|
|
643
|
+
return (index) => Math.min(100, series.y(series.base[index]));
|
|
644
|
+
}
|
|
645
|
+
/**
|
|
646
|
+
* A series' paths, with its rows at `top` and a stacked area's base at
|
|
647
|
+
* `base`. The line is smooth, or with .straight straight, and a gap in the
|
|
648
|
+
* data breaks it into runs.
|
|
649
|
+
*/
|
|
650
|
+
_shape(series, top, base) {
|
|
651
|
+
const runs = [[]];
|
|
652
|
+
series.tops.forEach((value, index) => {
|
|
653
|
+
if (value === null) runs.push([]);
|
|
654
|
+
else runs[runs.length - 1].push(index);
|
|
655
|
+
});
|
|
656
|
+
const filled = runs.filter((run) => run.length);
|
|
657
|
+
const points = (run, y) => run.map((index) => [this._x(index), y(index)]);
|
|
658
|
+
const curve = this.el.classList.contains("straight") ? straightPath : monotonePath;
|
|
659
|
+
const tops = filled.map((run) => curve(points(run, top)));
|
|
660
|
+
return {
|
|
661
|
+
line: tops.join(""),
|
|
662
|
+
// A stacked area runs back along the series below; the reversed curve
|
|
663
|
+
// is the same curve.
|
|
664
|
+
area: filled.map((run, r) => series.base ? `${tops[r]}L${curve(points(run, base).reverse()).slice(1)}Z` : `${tops[r]}V100H${this._x(run[0])}Z`).join(""),
|
|
665
|
+
// Round caps on zero-length lines, so CSS sizes the dots in pixels.
|
|
666
|
+
dots: filled.flatMap((run) => points(run, top)).map(([x, y]) => `M${x},${y}h0`).join("")
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
/**
|
|
670
|
+
* One series' group: its line, the fill under it, and with .points a dot
|
|
671
|
+
* at each value. After update() each path moves from its `from` shape.
|
|
672
|
+
*/
|
|
673
|
+
_line(series, from, timing) {
|
|
674
|
+
const group = svgNode("g", {
|
|
675
|
+
class: `${this._type}-series ${series.className}`.trim(),
|
|
676
|
+
"data-series": series.color
|
|
677
|
+
});
|
|
678
|
+
const shape = this._shape(series, (index) => series.y(series.tops[index]), this._baseY(series));
|
|
679
|
+
const id = `line-chart-gradient-${++_gradientId}`;
|
|
680
|
+
const gradient = svgNode("linearGradient", { id, x2: "0", y2: "1" });
|
|
681
|
+
gradient.append(svgNode("stop"), svgNode("stop", { offset: "1" }));
|
|
682
|
+
const path = (part, name, attributes = {}) => {
|
|
683
|
+
const node = svgNode("path", { class: `${this._type}-${name}`, d: shape[part], ...attributes });
|
|
684
|
+
if (from) morph(node, from[part], timing);
|
|
685
|
+
return node;
|
|
686
|
+
};
|
|
687
|
+
group.append(gradient, path("area", "area", { fill: `url(#${id})` }), path("line", "line"));
|
|
688
|
+
if (this.el.classList.contains("points")) group.append(path("dots", "points"));
|
|
689
|
+
return group;
|
|
690
|
+
}
|
|
691
|
+
/** The row under the pointer, or -1. */
|
|
692
|
+
_indexAt(e) {
|
|
693
|
+
const box = this._plot.getBoundingClientRect();
|
|
694
|
+
const fraction = this._horizontal ? (e.clientY - box.top) / box.height : (e.clientX - box.left) / box.width;
|
|
695
|
+
const index = Math.floor((this._reversed ? 1 - fraction : fraction) * this.labels.length);
|
|
696
|
+
return Math.min(this.labels.length - 1, Math.max(0, index));
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* For a circular chart, the pointer's position from the plot's middle: a
|
|
700
|
+
* fraction of a turn clockwise from the top, and its distance as a share
|
|
701
|
+
* of the plot's width.
|
|
702
|
+
*/
|
|
703
|
+
_polarAt(e) {
|
|
704
|
+
const box = this._plot.getBoundingClientRect();
|
|
705
|
+
const [x, y] = [e.clientX - box.left - box.width / 2, e.clientY - box.top - box.height / 2];
|
|
706
|
+
return [(Math.atan2(x, -y) / (2 * Math.PI) + 1) % 1, Math.hypot(x, y) / box.width];
|
|
707
|
+
}
|
|
708
|
+
/** The keys that move to the next row and to the one before. */
|
|
709
|
+
get _arrows() {
|
|
710
|
+
if (this._circular) return [["ArrowRight", "ArrowDown"], ["ArrowLeft", "ArrowUp"]];
|
|
711
|
+
if (this._horizontal) return [["ArrowDown"], ["ArrowUp"]];
|
|
712
|
+
return this._reversed ? [["ArrowLeft"], ["ArrowRight"]] : [["ArrowRight"], ["ArrowLeft"]];
|
|
713
|
+
}
|
|
714
|
+
/** The index a key moves to, or undefined for a key the chart ignores. */
|
|
715
|
+
_keyTarget(key) {
|
|
716
|
+
const last = this.labels.length - 1;
|
|
717
|
+
const [forward, back] = this._arrows;
|
|
718
|
+
const step = (by) => {
|
|
719
|
+
if (!this._circular) return Math.min(last, Math.max(0, this.activeIndex + by));
|
|
720
|
+
if (this.activeIndex < 0) return by > 0 ? 0 : last;
|
|
721
|
+
return (this.activeIndex + by + last + 1) % (last + 1);
|
|
722
|
+
};
|
|
723
|
+
if (key === "Escape") return this.activeIndex < 0 ? void 0 : -1;
|
|
724
|
+
return forward.includes(key) ? step(1) : back.includes(key) ? step(-1) : { Home: 0, End: last }[key];
|
|
725
|
+
}
|
|
726
|
+
};
|
|
727
|
+
LineChart.key = "Expressive_LineChart";
|
|
728
|
+
|
|
729
|
+
export {
|
|
730
|
+
COLORS,
|
|
731
|
+
rowLegend,
|
|
732
|
+
polarPoint,
|
|
733
|
+
seriesColor,
|
|
734
|
+
pace,
|
|
735
|
+
morph,
|
|
736
|
+
niceStep,
|
|
737
|
+
steps,
|
|
738
|
+
numberFormat,
|
|
739
|
+
cellValue,
|
|
740
|
+
numberValue,
|
|
741
|
+
tickText,
|
|
742
|
+
signs,
|
|
743
|
+
affix,
|
|
744
|
+
LineChart
|
|
745
|
+
};
|
|
746
|
+
//# sourceMappingURL=chunk-ZM3XBHWV.mjs.map
|