@expressivecss/expressive 0.15.0 → 0.17.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 +1807 -1
- package/README.md +9 -8
- package/dist/css/expressive.css +19176 -11958
- 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-26VUH75M.mjs +102 -0
- package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
- package/dist/js/chunks/chunk-2LFCOGC3.mjs +233 -0
- package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DXGRXYYL.mjs → chunk-36GELQGX.mjs} +29 -46
- package/dist/js/chunks/chunk-36GELQGX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-74MXKKLN.mjs → chunk-3FKWIRHW.mjs} +15 -29
- package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
- package/dist/js/chunks/chunk-3KF65KGL.mjs +209 -0
- package/dist/js/chunks/chunk-3KF65KGL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KVJAVDBC.mjs → chunk-3KLZRQZI.mjs} +88 -116
- package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-CK2XCICY.mjs → chunk-3XORNED5.mjs} +3 -11
- package/dist/js/chunks/chunk-3XORNED5.mjs.map +7 -0
- package/dist/js/chunks/chunk-4WBGAQN3.mjs +113 -0
- package/dist/js/chunks/chunk-4WBGAQN3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FM5CZOUB.mjs → chunk-5F4URJHL.mjs} +19 -30
- package/dist/js/chunks/chunk-5F4URJHL.mjs.map +7 -0
- package/dist/js/chunks/chunk-67UNY7RH.mjs +299 -0
- package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
- package/dist/js/chunks/chunk-7CXNATJS.mjs +97 -0
- package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-UETTGDLI.mjs → chunk-7X44MKEQ.mjs} +43 -48
- package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
- package/dist/js/chunks/chunk-7ZAMOMGY.mjs +440 -0
- package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
- package/dist/js/chunks/chunk-AEG6LOAJ.mjs +54 -0
- package/dist/js/chunks/chunk-AEG6LOAJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-AQNFCJJ5.mjs +135 -0
- package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
- package/dist/js/chunks/chunk-B55LWKBM.mjs +75 -0
- package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
- package/dist/js/chunks/chunk-BB5VXYXT.mjs +28 -0
- package/dist/js/chunks/chunk-BB5VXYXT.mjs.map +7 -0
- package/dist/js/chunks/chunk-BDATLH3H.mjs +108 -0
- package/dist/js/chunks/chunk-BDATLH3H.mjs.map +7 -0
- package/dist/js/chunks/chunk-CWMQOT4O.mjs +232 -0
- package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
- package/dist/js/chunks/chunk-CY2CTOVM.mjs +81 -0
- package/dist/js/chunks/chunk-CY2CTOVM.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NUHMOAOY.mjs → chunk-DWA5UYLJ.mjs} +363 -218
- package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
- package/dist/js/chunks/chunk-EB2V4OKL.mjs +79 -0
- package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
- package/dist/js/chunks/chunk-EWO662ZC.mjs +188 -0
- package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZX6M7SWO.mjs → chunk-F7LAKFMX.mjs} +320 -141
- package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-L27Q6ZMI.mjs → chunk-FNIIH2LU.mjs} +20 -33
- package/dist/js/chunks/chunk-FNIIH2LU.mjs.map +7 -0
- package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
- package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
- package/dist/js/chunks/chunk-GFWYMWYN.mjs +125 -0
- package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
- package/dist/js/chunks/chunk-GNRSYMVH.mjs +1 -0
- package/dist/js/chunks/chunk-H5ISU45X.mjs +87 -0
- package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GJL6GCIU.mjs → chunk-H6YIKFAQ.mjs} +311 -186
- package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-BGZLF6JZ.mjs → chunk-HEH7E3KO.mjs} +155 -35
- package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
- package/dist/js/chunks/chunk-HQRLBTNM.mjs +152 -0
- package/dist/js/chunks/chunk-HQRLBTNM.mjs.map +7 -0
- package/dist/js/chunks/chunk-I2F7MLUU.mjs +137 -0
- package/dist/js/chunks/chunk-I2F7MLUU.mjs.map +7 -0
- package/dist/js/chunks/chunk-IQOTGGHX.mjs +797 -0
- package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
- package/dist/js/chunks/chunk-JH3YWKA6.mjs +225 -0
- package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
- package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
- package/dist/js/chunks/chunk-JOLJAYIJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VGNYF6FB.mjs → chunk-KOTGMCMI.mjs} +116 -24
- package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LQWUDNHZ.mjs → chunk-LC4O5LFS.mjs} +21 -45
- package/dist/js/chunks/chunk-LC4O5LFS.mjs.map +7 -0
- package/dist/js/chunks/chunk-LEF33SCP.mjs +127 -0
- package/dist/js/chunks/chunk-LEF33SCP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-PDG64UHF.mjs → chunk-LFORZRPH.mjs} +21 -23
- package/dist/js/chunks/chunk-LFORZRPH.mjs.map +7 -0
- package/dist/js/chunks/chunk-LWLNV5EC.mjs +451 -0
- package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
- package/dist/js/chunks/chunk-LXRHUQAX.mjs +491 -0
- package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SFI2U4YW.mjs → chunk-MA2SZZFB.mjs} +82 -111
- package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
- package/dist/js/chunks/chunk-MDBZAMIV.mjs +121 -0
- package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
- package/dist/js/chunks/chunk-NODZ5VAD.mjs +75 -0
- package/dist/js/chunks/chunk-NODZ5VAD.mjs.map +7 -0
- package/dist/js/chunks/chunk-O2WJB6TH.mjs +365 -0
- package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
- package/dist/js/chunks/chunk-PCABY5BN.mjs +35 -0
- package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
- package/dist/js/chunks/chunk-PWKYVMND.mjs +120 -0
- package/dist/js/chunks/chunk-PWKYVMND.mjs.map +7 -0
- package/dist/js/chunks/{chunk-SMY7GJSS.mjs → chunk-QHZZT7YO.mjs} +66 -38
- package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
- package/dist/js/chunks/chunk-QND56EW2.mjs +439 -0
- package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
- package/dist/js/chunks/chunk-QNODAANY.mjs +376 -0
- package/dist/js/chunks/chunk-QNODAANY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KHXZ2A4K.mjs → chunk-QRO5FV3I.mjs} +156 -73
- package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
- package/dist/js/chunks/chunk-R7A7JRC5.mjs +440 -0
- package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
- package/dist/js/chunks/chunk-RKG2CBFE.mjs +74 -0
- package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
- package/dist/js/chunks/{chunk-XAEAEHIX.mjs → chunk-RSNS5OYS.mjs} +38 -25
- package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-X4ISMKE2.mjs → chunk-RUDYMEJ3.mjs} +7 -6
- package/dist/js/chunks/chunk-RUDYMEJ3.mjs.map +7 -0
- package/dist/js/chunks/chunk-STJR62SU.mjs +161 -0
- package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
- package/dist/js/chunks/chunk-SUSD4UTN.mjs +220 -0
- package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
- package/dist/js/chunks/{chunk-5CEAOLUA.mjs → chunk-SYBOA5HC.mjs} +26 -48
- package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
- package/dist/js/chunks/chunk-T4MOBP3J.mjs +108 -0
- package/dist/js/chunks/chunk-T4MOBP3J.mjs.map +7 -0
- package/dist/js/chunks/chunk-TM7HPGTV.mjs +342 -0
- package/dist/js/chunks/chunk-TM7HPGTV.mjs.map +7 -0
- package/dist/js/chunks/{chunk-C6CHEWYP.mjs → chunk-TMQDZSDC.mjs} +71 -35
- package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
- package/dist/js/chunks/chunk-TVSX5YA2.mjs +48 -0
- package/dist/js/chunks/chunk-TVSX5YA2.mjs.map +7 -0
- package/dist/js/chunks/chunk-UHO5CV6K.mjs +80 -0
- package/dist/js/chunks/chunk-UHO5CV6K.mjs.map +7 -0
- package/dist/js/chunks/chunk-UKCNELUN.mjs +223 -0
- package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
- package/dist/js/chunks/chunk-UKQK5GWR.mjs +167 -0
- package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TSZYSW7F.mjs → chunk-UTSLYQ65.mjs} +21 -48
- package/dist/js/chunks/chunk-UTSLYQ65.mjs.map +7 -0
- package/dist/js/chunks/chunk-VS5OJBOD.mjs +108 -0
- package/dist/js/chunks/chunk-VS5OJBOD.mjs.map +7 -0
- package/dist/js/chunks/chunk-VZMROW5A.mjs +759 -0
- package/dist/js/chunks/chunk-VZMROW5A.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-XB6Y7P5W.mjs +69 -0
- package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
- package/dist/js/chunks/chunk-XDAMOMVD.mjs +226 -0
- package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-WDK4T63U.mjs → chunk-XJPMW5SP.mjs} +247 -172
- package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KUFHW3DS.mjs → chunk-YKANQILZ.mjs} +16 -21
- package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
- package/dist/js/chunks/chunk-YLZOJLDI.mjs +175 -0
- package/dist/js/chunks/chunk-YLZOJLDI.mjs.map +7 -0
- package/dist/js/chunks/chunk-ZK7YY322.mjs +514 -0
- package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
- package/dist/js/expressive.cjs +10266 -3628
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +10266 -3628
- 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 +181 -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 +8 -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 +5 -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 +7 -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 +12 -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 -65
- 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 +41 -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 +60 -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 +5 -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 +14 -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 +6 -3
- package/dist/js/internal/core/formControl.mjs +12 -0
- package/dist/js/internal/core/formControl.mjs.map +7 -0
- package/dist/js/internal/core/imageURL.mjs +7 -0
- package/dist/js/internal/core/imageURL.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 +21 -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 +172 -69
- package/dist/types/behaviors/bottomSheets.d.ts +23 -5
- package/dist/types/behaviors/copy.d.ts +18 -0
- package/dist/types/behaviors/dataTables.d.ts +125 -0
- package/dist/types/behaviors/dialogs.d.ts +27 -1
- package/dist/types/behaviors/forms.d.ts +70 -4
- package/dist/types/behaviors/imageCompare.d.ts +13 -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 +53 -0
- package/dist/types/components/appBar.d.ts +5 -6
- package/dist/types/components/autocomplete.d.ts +105 -20
- 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 +16 -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 +80 -19
- package/dist/types/components/colorPicker.d.ts +56 -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 +60 -0
- package/dist/types/components/datepicker.d.ts +107 -56
- package/dist/types/components/expandingCard.d.ts +4 -6
- package/dist/types/components/funnelChart.d.ts +35 -0
- package/dist/types/components/heatmapChart.d.ts +42 -8
- package/dist/types/components/hoverCard.d.ts +59 -0
- package/dist/types/components/index.d.ts +16 -1
- package/dist/types/components/inputMask.d.ts +28 -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 +212 -12
- package/dist/types/components/loadingOverlay.d.ts +42 -0
- package/dist/types/components/mapView.d.ts +138 -27
- package/dist/types/components/menu.d.ts +74 -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 +22 -5
- package/dist/types/components/pieChart.d.ts +33 -9
- 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 +45 -22
- 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 +44 -33
- package/dist/types/components/showMore.d.ts +53 -0
- package/dist/types/components/slider.d.ts +2 -15
- package/dist/types/components/snackbar.d.ts +68 -1
- package/dist/types/components/swipeActions.d.ts +81 -0
- package/dist/types/components/tabs.d.ts +92 -30
- package/dist/types/components/timepicker.d.ts +128 -27
- package/dist/types/components/tooltip.d.ts +57 -21
- 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 +49 -25
- package/dist/types/core/formControl.d.ts +21 -0
- package/dist/types/core/imageURL.d.ts +2 -0
- package/dist/types/core/spring.d.ts +20 -0
- package/dist/types/core/utils.d.ts +123 -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 +39 -0
- package/package.json +17 -13
- 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 +864 -78
- package/src/sass/abstracts/_spring.scss +63 -0
- package/src/sass/abstracts/_variables.scss +64 -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 +10 -19
- package/src/sass/components/_alert.scss +102 -0
- package/src/sass/components/_aura.scss +9 -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 +31 -90
- package/src/sass/components/_bottom-sheet.scss +51 -16
- package/src/sass/components/_breadcrumb.scss +8 -7
- package/src/sass/components/_button-groups.scss +30 -63
- package/src/sass/components/_buttons.scss +137 -94
- package/src/sass/components/_calendar.scss +244 -0
- package/src/sass/components/_cards.scss +36 -44
- package/src/sass/components/_carousel.scss +37 -113
- package/src/sass/components/_cascader.scss +131 -0
- package/src/sass/components/_chips.scss +36 -46
- package/src/sass/components/_column-chart.scss +15 -26
- package/src/sass/components/_command-palette.scss +4 -7
- package/src/sass/components/_confetti.scss +1 -4
- package/src/sass/components/_countdown.scss +1 -1
- package/src/sass/components/_data-table.scss +172 -25
- package/src/sass/components/_datepicker.scss +54 -40
- package/src/sass/components/_description-list.scss +85 -0
- package/src/sass/components/_dialog.scss +48 -55
- 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 +21 -14
- package/src/sass/components/_fab-menu.scss +43 -39
- package/src/sass/components/_funnel-chart.scss +63 -0
- package/src/sass/components/_heatmap-chart.scss +114 -29
- package/src/sass/components/_icon-buttons.scss +8 -11
- 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 +9 -63
- 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 +37 -11
- package/src/sass/components/_marquee.scss +4 -3
- package/src/sass/components/_mega-menu.scss +128 -0
- package/src/sass/components/_menu.scss +146 -127
- package/src/sass/components/_menubar.scss +47 -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 +27 -35
- package/src/sass/components/_modal-display.scss +21 -0
- package/src/sass/components/_navbar.scss +45 -36
- package/src/sass/components/_navigation-bar.scss +12 -77
- package/src/sass/components/_navigation-rail.scss +161 -92
- package/src/sass/components/_org-chart.scss +192 -0
- package/src/sass/components/_page-footer.scss +2 -4
- package/src/sass/components/_pagination.scss +9 -27
- package/src/sass/components/_panes.scss +35 -42
- package/src/sass/components/_particles.scss +1 -4
- package/src/sass/components/_pie-chart.scss +86 -68
- package/src/sass/components/_popover.scss +18 -5
- package/src/sass/components/_progress.scss +183 -44
- 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 +40 -42
- package/src/sass/components/_radial-chart.scss +108 -46
- package/src/sass/components/_rich-text-editor.scss +2 -2
- package/src/sass/components/_sankey-chart.scss +91 -0
- package/src/sass/components/_scatter-chart.scss +144 -0
- package/src/sass/components/_scrim.scss +0 -2
- package/src/sass/components/_scrollspy.scss +0 -2
- package/src/sass/components/_search.scss +27 -26
- package/src/sass/components/_show-more.scss +8 -0
- package/src/sass/components/_side-sheet.scss +32 -51
- package/src/sass/components/_skeleton.scss +26 -19
- package/src/sass/components/_snackbar.scss +25 -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/_table_of_contents.scss +1 -3
- package/src/sass/components/_tabs.scss +49 -46
- package/src/sass/components/_timeline.scss +12 -12
- package/src/sass/components/_timepicker.scss +111 -79
- package/src/sass/components/_toolbar.scss +36 -47
- package/src/sass/components/_tooltip.scss +25 -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 +7 -32
- package/src/sass/components/_treemap-chart.scss +98 -0
- package/src/sass/components/forms/_checkboxes.scss +107 -44
- 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 +16 -13
- package/src/sass/components/forms/_fieldset.scss +4 -7
- package/src/sass/components/forms/_file-input.scss +12 -8
- package/src/sass/components/forms/_index.scss +3 -1
- package/src/sass/components/forms/_input-fields.scss +271 -90
- package/src/sass/components/forms/_radio-buttons.scss +34 -117
- package/src/sass/components/forms/_rating.scss +2 -32
- package/src/sass/components/forms/_select.scss +198 -20
- package/src/sass/components/forms/_slider.scss +92 -98
- package/src/sass/components/forms/_switches.scss +62 -180
- 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 +184 -27
- 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 +46 -77
- 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 +0 -90
- 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,19 +1,26 @@
|
|
|
1
1
|
import {
|
|
2
2
|
LineChart,
|
|
3
3
|
polarPoint,
|
|
4
|
-
|
|
4
|
+
splitRuns
|
|
5
|
+
} from "./chunk-IQOTGGHX.mjs";
|
|
6
|
+
import {
|
|
5
7
|
svgNode
|
|
6
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
7
9
|
|
|
8
10
|
// src/ts/components/radarChart.ts
|
|
9
11
|
var RINGS = 4;
|
|
12
|
+
function runs(values) {
|
|
13
|
+
const list = splitRuns(values);
|
|
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-RSNS5OYS.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/radarChart.ts"],
|
|
4
|
+
"sourcesContent": ["import { LineChart, LineChartOptions, polarPoint, Series, splitRuns } 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 = splitRuns(values);\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
|
+
}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
2
|
installSheetDrag
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YLZOJLDI.mjs";
|
|
4
4
|
|
|
5
5
|
// src/ts/behaviors/sideSheets.ts
|
|
6
|
-
var startDocked = (dialog) => dialog.classList.contains("
|
|
6
|
+
var startDocked = (dialog) => dialog.classList.contains("start");
|
|
7
7
|
var leftDocked = (dialog) => startDocked(dialog) !== (getComputedStyle(dialog).direction === "rtl");
|
|
8
8
|
var SideSheets = class {
|
|
9
9
|
static Init() {
|
|
10
10
|
installSheetDrag({
|
|
11
|
-
selector: "dialog.side-sheet
|
|
11
|
+
selector: "dialog.side-sheet",
|
|
12
12
|
axis: "x",
|
|
13
13
|
property: "--md-comp-side-sheet-shift",
|
|
14
|
+
motion: "--md-comp-side-sheet-motion",
|
|
14
15
|
direction: (dialog) => leftDocked(dialog) ? -1 : 1,
|
|
15
16
|
inHandle: (event, dialog) => {
|
|
16
|
-
const
|
|
17
|
-
if (
|
|
17
|
+
const header = dialog.querySelector(":scope > header");
|
|
18
|
+
if (header && event.composedPath().includes(header)) return true;
|
|
18
19
|
const rect = dialog.getBoundingClientRect();
|
|
19
20
|
return leftDocked(dialog) ? event.clientX >= rect.right - 24 && event.clientX <= rect.right : event.clientX >= rect.left && event.clientX <= rect.left + 24;
|
|
20
21
|
}
|
|
@@ -25,4 +26,4 @@ var SideSheets = class {
|
|
|
25
26
|
export {
|
|
26
27
|
SideSheets
|
|
27
28
|
};
|
|
28
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
//# sourceMappingURL=chunk-RUDYMEJ3.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/behaviors/sideSheets.ts"],
|
|
4
|
+
"sourcesContent": ["import { installSheetDrag } from './sheetDrag';\n\nconst startDocked = (dialog: HTMLDialogElement): boolean => dialog.classList.contains('start');\n\nconst leftDocked = (dialog: HTMLDialogElement): boolean =>\n startDocked(dialog) !== (getComputedStyle(dialog).direction === 'rtl');\n\n/**\n * Drag-to-dismiss for side sheets (`dialog.side-sheet`).\n *\n * Grab the header or the inner 24dp edge and drag toward the docked side.\n * Past 96dp, or a flick, closes. Light-dismiss on the scrim stays with\n * {@link Dialogs}. The drag itself is {@link installSheetDrag}, shared with\n * the bottom sheet.\n */\nexport class SideSheets {\n static Init() {\n installSheetDrag({\n selector: 'dialog.side-sheet',\n axis: 'x',\n property: '--md-comp-side-sheet-shift',\n motion: '--md-comp-side-sheet-motion',\n direction: (dialog) => (leftDocked(dialog) ? -1 : 1),\n inHandle: (event, dialog) => {\n // Only the sheet's own top bar: a <header> in its content, or one\n // around the dialog, is not a handle, so selecting text there is safe.\n const header = dialog.querySelector(':scope > header');\n if (header && event.composedPath().includes(header)) return true;\n const rect = dialog.getBoundingClientRect();\n return leftDocked(dialog)\n ? event.clientX >= rect.right - 24 && event.clientX <= rect.right\n : event.clientX >= rect.left && event.clientX <= rect.left + 24;\n }\n });\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAEA,IAAM,cAAc,CAAC,WAAuC,OAAO,UAAU,SAAS,OAAO;AAE7F,IAAM,aAAa,CAAC,WAClB,YAAY,MAAM,OAAO,iBAAiB,MAAM,EAAE,cAAc;AAU3D,IAAM,aAAN,MAAiB;AAAA,EACtB,OAAO,OAAO;AACZ,qBAAiB;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW,CAAC,WAAY,WAAW,MAAM,IAAI,KAAK;AAAA,MAClD,UAAU,CAAC,OAAO,WAAW;AAG3B,cAAM,SAAS,OAAO,cAAc,iBAAiB;AACrD,YAAI,UAAU,MAAM,aAAa,EAAE,SAAS,MAAM,EAAG,QAAO;AAC5D,cAAM,OAAO,OAAO,sBAAsB;AAC1C,eAAO,WAAW,MAAM,IACpB,MAAM,WAAW,KAAK,QAAQ,MAAM,MAAM,WAAW,KAAK,QAC1D,MAAM,WAAW,KAAK,QAAQ,MAAM,WAAW,KAAK,OAAO;AAAA,MACjE;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component
|
|
3
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Utils
|
|
6
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
7
|
+
|
|
8
|
+
// src/ts/components/hoverCard.ts
|
|
9
|
+
var _defaults = {
|
|
10
|
+
enterDelay: 500,
|
|
11
|
+
exitDelay: 300
|
|
12
|
+
};
|
|
13
|
+
var owners = /* @__PURE__ */ new WeakMap();
|
|
14
|
+
var HoverCard = class extends Component {
|
|
15
|
+
constructor(el, options) {
|
|
16
|
+
super(el, options);
|
|
17
|
+
/** Whether the instance has the card showing. */
|
|
18
|
+
this._shown = false;
|
|
19
|
+
/** What keeps the card wanted: the pointer, keyboard focus, or both. */
|
|
20
|
+
this._holds = /* @__PURE__ */ new Set();
|
|
21
|
+
/** The anchor name the card is placed against while this link shows it. */
|
|
22
|
+
this._anchorName = `--hover-card-${Utils.guid()}`;
|
|
23
|
+
/**
|
|
24
|
+
* Show the card now, without enterDelay.
|
|
25
|
+
*/
|
|
26
|
+
this.open = () => {
|
|
27
|
+
clearTimeout(this._timeout);
|
|
28
|
+
if (!this.cardEl || this._shown) return;
|
|
29
|
+
owners.get(this.cardEl)?.close();
|
|
30
|
+
this.cardEl.showPopover.call(this.cardEl, { source: this.el });
|
|
31
|
+
owners.set(this.cardEl, this);
|
|
32
|
+
this._shown = true;
|
|
33
|
+
this._listenForEscape(true);
|
|
34
|
+
this._anchor(true);
|
|
35
|
+
this._notify("open");
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Hide the card now, without exitDelay.
|
|
39
|
+
*/
|
|
40
|
+
this.close = () => {
|
|
41
|
+
clearTimeout(this._timeout);
|
|
42
|
+
if (!this._shown) return;
|
|
43
|
+
this.cardEl.hidePopover();
|
|
44
|
+
this._hidden();
|
|
45
|
+
this._notify("close");
|
|
46
|
+
};
|
|
47
|
+
// A touch is a tap that follows the link, never a hover; pointer events
|
|
48
|
+
// say so, and the mouse events a tap sends afterwards are not listened to.
|
|
49
|
+
this._handlePointerEnter = (e) => {
|
|
50
|
+
if (e.pointerType !== "touch") this._hold("pointer");
|
|
51
|
+
};
|
|
52
|
+
this._handlePointerLeave = (e) => {
|
|
53
|
+
if (e.pointerType !== "touch") this._release("pointer");
|
|
54
|
+
};
|
|
55
|
+
// A pointer press also focuses the link, and the hover already covers it,
|
|
56
|
+
// so only keyboard focus holds the card from the link.
|
|
57
|
+
this._handleLinkFocus = () => {
|
|
58
|
+
if (this.el.matches(":focus-visible")) this._hold("focus");
|
|
59
|
+
};
|
|
60
|
+
// Links can share a card, and each listens on it. Only the link showing the
|
|
61
|
+
// card is held by it; the others would take the card away after enterDelay.
|
|
62
|
+
this._handleCardEnter = (e) => {
|
|
63
|
+
if (this._shown) this._handlePointerEnter(e);
|
|
64
|
+
};
|
|
65
|
+
this._handleCardFocus = () => {
|
|
66
|
+
if (this._shown) this._hold("focus");
|
|
67
|
+
};
|
|
68
|
+
this._handleFocusOut = (e) => {
|
|
69
|
+
const next = e.relatedTarget;
|
|
70
|
+
if (!next || !(this.el.contains(next) || this.cardEl.contains(next))) this._release("focus");
|
|
71
|
+
};
|
|
72
|
+
// Escape always hides the card, but it is only the card's key when focus is
|
|
73
|
+
// on the link or in the card; otherwise it still reaches the dialog or menu
|
|
74
|
+
// that has focus. An engine that does not know popover="hint" treats the
|
|
75
|
+
// card as manual, which Escape would not close.
|
|
76
|
+
this._handleKeydown = (e) => {
|
|
77
|
+
if (e.key !== "Escape" || Utils.isComposing(e)) return;
|
|
78
|
+
if (Utils.focusIsIn(this.el, this.cardEl)) this._takeEscape(e);
|
|
79
|
+
this.close();
|
|
80
|
+
};
|
|
81
|
+
this._handleToggle = (e) => {
|
|
82
|
+
if (e.newState !== "closed" || !this._shown) return;
|
|
83
|
+
this._hidden();
|
|
84
|
+
this._notify("close");
|
|
85
|
+
};
|
|
86
|
+
this.cardEl = Utils.getElementById(el, el.getAttribute("aria-details") ?? "");
|
|
87
|
+
if (!this.cardEl) {
|
|
88
|
+
console.error(`HoverCard: aria-details names no element; the link shows no card.`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const { signal } = this._events;
|
|
92
|
+
this.cardEl.addEventListener("toggle", this._handleToggle, { signal });
|
|
93
|
+
for (const target of [this.el, this.cardEl]) {
|
|
94
|
+
target.addEventListener("pointerleave", this._handlePointerLeave, { signal });
|
|
95
|
+
target.addEventListener("focusout", this._handleFocusOut, { signal });
|
|
96
|
+
}
|
|
97
|
+
this.el.addEventListener("pointerenter", this._handlePointerEnter, { signal });
|
|
98
|
+
this.cardEl.addEventListener("pointerenter", this._handleCardEnter, { signal });
|
|
99
|
+
this.el.addEventListener("focus", this._handleLinkFocus, { signal });
|
|
100
|
+
this.cardEl.addEventListener("focusin", this._handleCardFocus, { signal });
|
|
101
|
+
}
|
|
102
|
+
static get defaults() {
|
|
103
|
+
return _defaults;
|
|
104
|
+
}
|
|
105
|
+
destroy() {
|
|
106
|
+
clearTimeout(this._timeout);
|
|
107
|
+
if (this._shown) {
|
|
108
|
+
this.cardEl.hidePopover();
|
|
109
|
+
this._hidden();
|
|
110
|
+
}
|
|
111
|
+
super.destroy();
|
|
112
|
+
}
|
|
113
|
+
_hidden() {
|
|
114
|
+
this._shown = false;
|
|
115
|
+
this._listenForEscape(false);
|
|
116
|
+
this._anchor(false);
|
|
117
|
+
}
|
|
118
|
+
// `source` anchors the card too, but Firefox keeps the first source's
|
|
119
|
+
// anchor for good, so a card two links share would stay at the first. A
|
|
120
|
+
// named anchor, set only while the card shows, follows the link that shows it.
|
|
121
|
+
_anchor(on) {
|
|
122
|
+
Utils.setAnchorName(this.el, this._anchorName, on);
|
|
123
|
+
if (on) this.cardEl.style.setProperty("position-anchor", this._anchorName);
|
|
124
|
+
else this.cardEl.style.removeProperty("position-anchor");
|
|
125
|
+
for (const el of [this.el, this.cardEl]) if (!el.getAttribute("style")) el.removeAttribute("style");
|
|
126
|
+
}
|
|
127
|
+
/** Wanted cards show after enterDelay; once nothing holds the card, it hides after exitDelay. */
|
|
128
|
+
_schedule() {
|
|
129
|
+
clearTimeout(this._timeout);
|
|
130
|
+
const wanted = this._holds.size > 0;
|
|
131
|
+
if (wanted === this._shown) return;
|
|
132
|
+
const [change, delay] = wanted ? [this.open, this.options.enterDelay] : [this.close, this.options.exitDelay];
|
|
133
|
+
this._timeout = setTimeout(change, delay);
|
|
134
|
+
}
|
|
135
|
+
_hold(by) {
|
|
136
|
+
this._holds.add(by);
|
|
137
|
+
this._schedule();
|
|
138
|
+
}
|
|
139
|
+
_release(by) {
|
|
140
|
+
this._holds.delete(by);
|
|
141
|
+
this._schedule();
|
|
142
|
+
}
|
|
143
|
+
/** Escape is listened for only while the card shows. close() removes it, and destroy() through the signal. */
|
|
144
|
+
_listenForEscape(on) {
|
|
145
|
+
const doc = this.el.ownerDocument;
|
|
146
|
+
if (on) doc.addEventListener("keydown", this._handleKeydown, { capture: true, signal: this._events.signal });
|
|
147
|
+
else doc.removeEventListener("keydown", this._handleKeydown, true);
|
|
148
|
+
}
|
|
149
|
+
/** Keeps Escape from the page and, when focus is in the card, takes it back to the link before the card hides. */
|
|
150
|
+
_takeEscape(e) {
|
|
151
|
+
e.preventDefault();
|
|
152
|
+
e.stopPropagation();
|
|
153
|
+
if (Utils.focusIsIn(this.cardEl)) this.el.focus();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
HoverCard.key = "Expressive_HoverCard";
|
|
157
|
+
|
|
158
|
+
export {
|
|
159
|
+
HoverCard
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=chunk-STJR62SU.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/hoverCard.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\n\nexport interface HoverCardOptions extends BaseOptions {\n /**\n * How long the pointer or keyboard focus rests on the link before the card shows.\n * @default 500\n */\n enterDelay: number;\n /**\n * How long the card stays after the pointer and focus leave the link and the card.\n * @default 300\n */\n exitDelay: number;\n}\n\nconst _defaults: HoverCardOptions = {\n enterDelay: 500,\n exitDelay: 300\n};\n\n// Links can share one card, such as a name mentioned twice; the link that\n// last showed it owns it, and the next one takes it over.\nconst owners = new WeakMap<HTMLElement, HoverCard>();\n\n/**\n * Hover card. A `.hover-card-trigger` link names its card, a `.popover` with\n * `popover=\"hint\"`, in `aria-details`. The card shows against the link after\n * `enterDelay` and stays while the pointer or focus is on either.\n */\nexport class HoverCard extends Component<HoverCardOptions> {\n /** The card the link's `aria-details` names, or null when it names none. */\n cardEl: HTMLElement | null;\n /** Whether the instance has the card showing. */\n private _shown = false;\n /** What keeps the card wanted: the pointer, keyboard focus, or both. */\n private _holds = new Set<'pointer' | 'focus'>();\n private _timeout: ReturnType<typeof setTimeout>;\n /** The anchor name the card is placed against while this link shows it. */\n private _anchorName = `--hover-card-${Utils.guid()}`;\n\n constructor(el: HTMLElement, options: Partial<HoverCardOptions>) {\n super(el, options);\n this.cardEl = Utils.getElementById(el, el.getAttribute('aria-details') ?? '');\n if (!this.cardEl) {\n console.error(`HoverCard: aria-details names no element; the link shows no card.`);\n return;\n }\n // The browser hides a hint card itself on a click elsewhere, on Escape\n // and when another hint opens.\n const { signal } = this._events;\n this.cardEl.addEventListener('toggle', this._handleToggle, { signal });\n for (const target of [this.el, this.cardEl]) {\n target.addEventListener('pointerleave', this._handlePointerLeave, { signal });\n target.addEventListener('focusout', this._handleFocusOut, { signal });\n }\n this.el.addEventListener('pointerenter', this._handlePointerEnter, { signal });\n this.cardEl.addEventListener('pointerenter', this._handleCardEnter, { signal });\n this.el.addEventListener('focus', this._handleLinkFocus, { signal });\n this.cardEl.addEventListener('focusin', this._handleCardFocus, { signal });\n }\n\n static get defaults(): HoverCardOptions {\n return _defaults;\n }\n\n static key = 'Expressive_HoverCard';\n\n destroy() {\n clearTimeout(this._timeout);\n if (this._shown) {\n this.cardEl.hidePopover();\n this._hidden();\n }\n super.destroy();\n }\n\n /**\n * Show the card now, without enterDelay.\n */\n open = () => {\n clearTimeout(this._timeout);\n if (!this.cardEl || this._shown) return;\n owners.get(this.cardEl)?.close();\n // `source` makes the link the card's anchor and invoker, so Tab moves from\n // the link into the card. It throws for a card without the popover\n // attribute, before any state changes.\n (this.cardEl.showPopover as (options?: { source?: Element }) => void).call(this.cardEl, { source: this.el });\n owners.set(this.cardEl, this);\n this._shown = true;\n this._listenForEscape(true);\n this._anchor(true);\n this._notify('open');\n };\n\n /**\n * Hide the card now, without exitDelay.\n */\n close = () => {\n clearTimeout(this._timeout);\n if (!this._shown) return;\n this.cardEl.hidePopover();\n this._hidden();\n this._notify('close');\n };\n\n private _hidden() {\n this._shown = false;\n this._listenForEscape(false);\n this._anchor(false);\n }\n\n // `source` anchors the card too, but Firefox keeps the first source's\n // anchor for good, so a card two links share would stay at the first. A\n // named anchor, set only while the card shows, follows the link that shows it.\n private _anchor(on: boolean) {\n Utils.setAnchorName(this.el, this._anchorName, on);\n if (on) this.cardEl.style.setProperty('position-anchor', this._anchorName);\n else this.cardEl.style.removeProperty('position-anchor');\n for (const el of [this.el, this.cardEl]) if (!el.getAttribute('style')) el.removeAttribute('style');\n }\n\n /** Wanted cards show after enterDelay; once nothing holds the card, it hides after exitDelay. */\n private _schedule() {\n clearTimeout(this._timeout);\n const wanted = this._holds.size > 0;\n if (wanted === this._shown) return;\n const [change, delay] = wanted ? [this.open, this.options.enterDelay] as const : [this.close, this.options.exitDelay] as const;\n this._timeout = setTimeout(change, delay);\n }\n\n private _hold(by: 'pointer' | 'focus') {\n this._holds.add(by);\n this._schedule();\n }\n\n private _release(by: 'pointer' | 'focus') {\n this._holds.delete(by);\n this._schedule();\n }\n\n // A touch is a tap that follows the link, never a hover; pointer events\n // say so, and the mouse events a tap sends afterwards are not listened to.\n private _handlePointerEnter = (e: PointerEvent) => {\n if (e.pointerType !== 'touch') this._hold('pointer');\n };\n\n private _handlePointerLeave = (e: PointerEvent) => {\n if (e.pointerType !== 'touch') this._release('pointer');\n };\n\n // A pointer press also focuses the link, and the hover already covers it,\n // so only keyboard focus holds the card from the link.\n private _handleLinkFocus = () => {\n if (this.el.matches(':focus-visible')) this._hold('focus');\n };\n\n // Links can share a card, and each listens on it. Only the link showing the\n // card is held by it; the others would take the card away after enterDelay.\n private _handleCardEnter = (e: PointerEvent) => {\n if (this._shown) this._handlePointerEnter(e);\n };\n\n private _handleCardFocus = () => {\n if (this._shown) this._hold('focus');\n };\n\n private _handleFocusOut = (e: FocusEvent) => {\n const next = e.relatedTarget as Node | null;\n if (!next || !(this.el.contains(next) || this.cardEl.contains(next))) this._release('focus');\n };\n\n /** Escape is listened for only while the card shows. close() removes it, and destroy() through the signal. */\n private _listenForEscape(on: boolean) {\n const doc = this.el.ownerDocument;\n if (on) doc.addEventListener('keydown', this._handleKeydown, { capture: true, signal: this._events.signal });\n else doc.removeEventListener('keydown', this._handleKeydown, true);\n }\n\n // Escape always hides the card, but it is only the card's key when focus is\n // on the link or in the card; otherwise it still reaches the dialog or menu\n // that has focus. An engine that does not know popover=\"hint\" treats the\n // card as manual, which Escape would not close.\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || Utils.isComposing(e)) return;\n if (Utils.focusIsIn(this.el, this.cardEl)) this._takeEscape(e);\n this.close();\n };\n\n /** Keeps Escape from the page and, when focus is in the card, takes it back to the link before the card hides. */\n private _takeEscape(e: KeyboardEvent) {\n e.preventDefault();\n e.stopPropagation();\n if (Utils.focusIsIn(this.cardEl)) this.el.focus();\n }\n\n private _handleToggle = (e: Event) => {\n if ((e as ToggleEvent).newState !== 'closed' || !this._shown) return;\n this._hidden();\n this._notify('close');\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LineChart,
|
|
3
|
+
affix,
|
|
4
|
+
cellValue,
|
|
5
|
+
linearKey,
|
|
6
|
+
morph,
|
|
7
|
+
pace,
|
|
8
|
+
textSpan,
|
|
9
|
+
tickAxis,
|
|
10
|
+
tickFormat,
|
|
11
|
+
tickText
|
|
12
|
+
} from "./chunk-IQOTGGHX.mjs";
|
|
13
|
+
import {
|
|
14
|
+
svgNode
|
|
15
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
16
|
+
|
|
17
|
+
// src/ts/components/scatterChart.ts
|
|
18
|
+
var dots = (marks) => marks.map(({ x, y }) => `M${x},${y}h0`).join("");
|
|
19
|
+
var place = ({ row, series }) => `${row} ${series.column}`;
|
|
20
|
+
var ms = (time) => parseFloat(time) * (time.trim().endsWith("ms") ? 1 : 1e3);
|
|
21
|
+
function sized(path, size, was, timing) {
|
|
22
|
+
path.style.setProperty("--scatter-chart-size", `${size}`);
|
|
23
|
+
if (!timing || !was || was.size === size) return;
|
|
24
|
+
path.animate({ "--scatter-chart-size": [`${was.size}`, `${size}`] }, { duration: ms(timing.dur), easing: `cubic-bezier(${timing.keySplines})` });
|
|
25
|
+
}
|
|
26
|
+
var ScatterChart = class extends LineChart {
|
|
27
|
+
get _type() {
|
|
28
|
+
return "scatter-chart";
|
|
29
|
+
}
|
|
30
|
+
get _seriesFrom() {
|
|
31
|
+
return 2;
|
|
32
|
+
}
|
|
33
|
+
get _seriesTo() {
|
|
34
|
+
return this._bubble ? -1 : void 0;
|
|
35
|
+
}
|
|
36
|
+
get _bubble() {
|
|
37
|
+
return this.el.classList.contains("bubble");
|
|
38
|
+
}
|
|
39
|
+
static get defaults() {
|
|
40
|
+
return { ...LineChart.defaults, xMin: null, xMax: null };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reads each row's x value into `_xs` and its size into `_sizes`, which
|
|
44
|
+
* the scales and the points use, and leaves out the values of rows
|
|
45
|
+
* without either, so they neither draw nor stretch a scale. Nothing stacks.
|
|
46
|
+
*/
|
|
47
|
+
_arrange(series) {
|
|
48
|
+
const xs = this._xs = this._rows.map((row) => cellValue(row.cells[1]));
|
|
49
|
+
const sizes = this._sizes = this._rows.map((row) => this._size(row));
|
|
50
|
+
for (const each of series) {
|
|
51
|
+
each.values = each.tops = each.values.map((value, row) => xs[row] === null || sizes[row] === null ? null : value);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** A row's size: 1 without .bubble, or its last cell's value, null unless positive. */
|
|
55
|
+
_size(row) {
|
|
56
|
+
if (!this._bubble) return 1;
|
|
57
|
+
const size = cellValue(row.cells[this._header.length - 1]) ?? 0;
|
|
58
|
+
return size > 0 ? size : null;
|
|
59
|
+
}
|
|
60
|
+
get _count() {
|
|
61
|
+
return this._marks?.length ?? 0;
|
|
62
|
+
}
|
|
63
|
+
/** Highlights one point, numbered as `_marks` lists them. Pass -1 to hide the tooltip. */
|
|
64
|
+
show(index) {
|
|
65
|
+
if (!this._tooltip || index === this.activeIndex) return;
|
|
66
|
+
this.activeIndex = index;
|
|
67
|
+
const mark = this._marks[index];
|
|
68
|
+
this._cursor.hidden = this._tooltip.hidden = !mark;
|
|
69
|
+
if (mark) this._fill(mark);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Puts the marker on a point, at a bubble's size, and fills the tooltip
|
|
73
|
+
* beside it: the row, its x header and text, the series and its text, and
|
|
74
|
+
* with .bubble the size header and text, as the author wrote them. Past
|
|
75
|
+
* the middle the tooltip opens back over the plot.
|
|
76
|
+
*/
|
|
77
|
+
_fill({ row, series, x, y, size }) {
|
|
78
|
+
this._cursor.dataset.series = series.color;
|
|
79
|
+
this._cursor.style.setProperty("--scatter-chart-size", `${size}`);
|
|
80
|
+
for (const part of [this._cursor, this._tooltip]) Object.assign(part.style, { left: `${x}%`, top: `${y}%` });
|
|
81
|
+
this._tooltip.classList.toggle("end", x > 50);
|
|
82
|
+
const [title, name] = [document.createElement("strong"), textSpan(series.name)];
|
|
83
|
+
title.textContent = this.labels[row];
|
|
84
|
+
name.dataset.series = series.color;
|
|
85
|
+
const sizeText = this._bubble ? this._cellText(row, this._header.length - 1) : [];
|
|
86
|
+
this._tooltip.replaceChildren(title, ...this._cellText(row, 1), name, textSpan(series.text[row]), ...sizeText);
|
|
87
|
+
}
|
|
88
|
+
/** A column's header, without a swatch since it names no series, and the row's text in it. */
|
|
89
|
+
_cellText(row, column) {
|
|
90
|
+
const header = textSpan(this._header[column].textContent.trim());
|
|
91
|
+
header.className = "x";
|
|
92
|
+
return [header, textSpan(this._rows[row].cells[column]?.textContent.trim() ?? "")];
|
|
93
|
+
}
|
|
94
|
+
/** The point nearest the pointer, or -1 with none. */
|
|
95
|
+
_indexAt(e) {
|
|
96
|
+
const [plot, box] = [this._plot, this._plot.getBoundingClientRect()];
|
|
97
|
+
const left = box.left + plot.clientLeft;
|
|
98
|
+
const top = box.top + plot.clientTop;
|
|
99
|
+
const [width, height] = [plot.clientWidth, plot.clientHeight];
|
|
100
|
+
let nearest = -1;
|
|
101
|
+
let distance = Infinity;
|
|
102
|
+
this._marks.forEach(({ x, y }, i) => {
|
|
103
|
+
const away = Math.hypot(left + x / 100 * width - e.clientX, top + y / 100 * height - e.clientY);
|
|
104
|
+
if (nearest < 0 || away < distance) {
|
|
105
|
+
nearest = i;
|
|
106
|
+
distance = away;
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return nearest;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Steps through the points in table order. The arrows keep their meaning
|
|
113
|
+
* in a right-to-left chart, since table order is no direction on screen.
|
|
114
|
+
*/
|
|
115
|
+
_keyTarget(key) {
|
|
116
|
+
return linearKey(key, this.activeIndex, this._marks.length - 1);
|
|
117
|
+
}
|
|
118
|
+
_read() {
|
|
119
|
+
[this._drawn, this._marks] = [this._marks ?? [], []];
|
|
120
|
+
super._read();
|
|
121
|
+
if (!this.series.length) return;
|
|
122
|
+
this._xFit = this._xScale();
|
|
123
|
+
this._xAffix = affix(this._rows.map((row) => row.cells[1]));
|
|
124
|
+
}
|
|
125
|
+
/** The x scale over the rows with a point, between `xMin` and `xMax` where they are set. */
|
|
126
|
+
_xScale() {
|
|
127
|
+
const [low, high] = this._xRange();
|
|
128
|
+
const [min, max] = [this._xEnd("xMin"), this._xEnd("xMax")];
|
|
129
|
+
return this._fit(min ?? low, max ?? high, [min !== null, max !== null]);
|
|
130
|
+
}
|
|
131
|
+
/** The x values of the rows with a point, with 10% of their span to spare each side. */
|
|
132
|
+
_xRange() {
|
|
133
|
+
const xs = this._xs.filter((_, row) => this._hasPoint(row));
|
|
134
|
+
if (!xs.length) return [-1, 1];
|
|
135
|
+
const [low, high] = [xs.reduce((a, b) => Math.min(a, b)), xs.reduce((a, b) => Math.max(a, b))];
|
|
136
|
+
const pad = (high - low) * 0.1 || 1;
|
|
137
|
+
return [low - pad, high + pad];
|
|
138
|
+
}
|
|
139
|
+
/** An x scale end from its data attribute or option, or null. */
|
|
140
|
+
_xEnd(name) {
|
|
141
|
+
return this._number(name) ?? this.options[name] ?? null;
|
|
142
|
+
}
|
|
143
|
+
/** A value's distance across the plot from its inline start, in percent. */
|
|
144
|
+
_xAt(value) {
|
|
145
|
+
const { min, max } = this._xFit;
|
|
146
|
+
const x = (value - min) / (max - min || 1) * 100;
|
|
147
|
+
return this._reversed ? 100 - x : x;
|
|
148
|
+
}
|
|
149
|
+
/** Whether any series shown draws a point in a row. */
|
|
150
|
+
_hasPoint(row) {
|
|
151
|
+
return this.series.some((series) => series.values[row] !== null);
|
|
152
|
+
}
|
|
153
|
+
/** The points, each diameter the square root of its row's share of the largest size drawn, so areas follow sizes. */
|
|
154
|
+
_layout() {
|
|
155
|
+
const largest = this._sizes.reduce((most, size, row) => this._hasPoint(row) ? Math.max(most, size) : most, 0);
|
|
156
|
+
return this.labels.flatMap((_, row) => this.series.filter((series) => series.values[row] !== null).map((series) => ({
|
|
157
|
+
row,
|
|
158
|
+
series,
|
|
159
|
+
x: this._xAt(this._xs[row]),
|
|
160
|
+
y: series.y(series.values[row]),
|
|
161
|
+
size: Math.sqrt(this._sizes[row] / largest)
|
|
162
|
+
})));
|
|
163
|
+
}
|
|
164
|
+
/** One group per series, its points round caps on zero-length lines, so CSS sizes them in pixels. */
|
|
165
|
+
_draw() {
|
|
166
|
+
this._marks = this._layout();
|
|
167
|
+
const svg = svgNode("svg", {
|
|
168
|
+
viewBox: "0 0 100 100",
|
|
169
|
+
preserveAspectRatio: "none",
|
|
170
|
+
"aria-hidden": "true",
|
|
171
|
+
focusable: "false"
|
|
172
|
+
});
|
|
173
|
+
const timing = this._before.length ? pace(this.el) : null;
|
|
174
|
+
const was = new Map(this._drawn.map((old) => [place(old), old]));
|
|
175
|
+
svg.append(...this.series.map((series) => this._group(series, timing, was)));
|
|
176
|
+
return svg;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* A series' points, in one path, or with .bubble one path each, largest
|
|
180
|
+
* first so smaller bubbles stay on top.
|
|
181
|
+
*/
|
|
182
|
+
_group(series, timing, was) {
|
|
183
|
+
const group = svgNode("g", {
|
|
184
|
+
class: `scatter-chart-series ${series.className}`.trim(),
|
|
185
|
+
"data-series": series.color
|
|
186
|
+
});
|
|
187
|
+
const marks = this._marks.filter((mark) => mark.series === series);
|
|
188
|
+
const sets = this._bubble ? marks.sort((a, b) => b.size - a.size).map((mark) => [mark]) : [marks];
|
|
189
|
+
group.append(...sets.map((set) => this._pointPath(set, timing, was)));
|
|
190
|
+
return group;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* A path of points. After update() each moves from where its row's point
|
|
194
|
+
* in the same column was drawn, or appears where it is.
|
|
195
|
+
*/
|
|
196
|
+
_pointPath(marks, timing, was) {
|
|
197
|
+
const path = svgNode("path", { class: "scatter-chart-points", d: dots(marks) });
|
|
198
|
+
if (timing) morph(path, dots(marks.map((mark) => was.get(place(mark)) ?? mark)), timing);
|
|
199
|
+
if (this._bubble) sized(path, marks[0].size, was.get(place(marks[0])), timing);
|
|
200
|
+
return path;
|
|
201
|
+
}
|
|
202
|
+
/** With .axis, the y scale's labels, and the x scale's below the plot with a grid line at each. */
|
|
203
|
+
_axes() {
|
|
204
|
+
return this._axis ? [...super._axes(), this._xAxis()] : [];
|
|
205
|
+
}
|
|
206
|
+
_xAxis() {
|
|
207
|
+
const number = tickFormat(this.el, this._xFit.ticks);
|
|
208
|
+
return tickAxis("scatter-chart-axis x", this._xFit.ticks, (tick) => tickText(number, tick, this._xAffix), (tick) => this._xAt(tick));
|
|
209
|
+
}
|
|
210
|
+
/** The legend only: the rows have no labels along an axis. */
|
|
211
|
+
_guides() {
|
|
212
|
+
return this._legend();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
ScatterChart.key = "Expressive_ScatterChart";
|
|
216
|
+
|
|
217
|
+
export {
|
|
218
|
+
ScatterChart
|
|
219
|
+
};
|
|
220
|
+
//# sourceMappingURL=chunk-SUSD4UTN.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/scatterChart.ts"],
|
|
4
|
+
"sourcesContent": ["import { svgNode } from '../core/utils';\nimport { LineChart, LineChartOptions, ChartScale, Series, affix, cellValue, linearKey, morph, tickFormat, pace, textSpan as span, tickAxis, tickText } from './lineChart';\n\nexport interface ScatterChartOptions extends LineChartOptions {\n /**\n * Lowest value on the x axis. Defaults to the data minimum less 10% of\n * the range. Overridden by `data-x-min` on the chart.\n */\n xMin: number | null;\n /**\n * Highest value on the x axis. Defaults to the data maximum plus 10% of\n * the range. Overridden by `data-x-max` on the chart.\n */\n xMax: number | null;\n}\n\n/**\n * A drawn point: its row and series, where it sits in the plot, in percent,\n * and its diameter as a share of the largest bubble's.\n */\ninterface Mark {\n row: number;\n series: Series;\n x: number;\n y: number;\n size: number;\n}\n\n/** Points as path data: round caps on zero-length lines. */\nconst dots = (marks: Mark[]) => marks.map(({ x, y }) => `M${x},${y}h0`).join('');\n\n/** A point's row and series column, which update() matches old and new points by. */\nconst place = ({ row, series }: Mark) => `${row} ${series.column}`;\n\n/** A CSS time, such as 400ms or 0.4s, in milliseconds. */\nconst ms = (time: string) => parseFloat(time) * (time.trim().endsWith('ms') ? 1 : 1000);\n\n/**\n * Sizes a bubble, and with motion timing grows or shrinks it from its old\n * point's size. The Web Animations API, since SVG animation cannot reach a\n * size that CSS computes from a token.\n */\nfunction sized(path: SVGElement, size: number, was: Mark | undefined, timing: ReturnType<typeof pace>) {\n path.style.setProperty('--scatter-chart-size', `${size}`);\n if (!timing || !was || was.size === size) return;\n path.animate({ '--scatter-chart-size': [`${was.size}`, `${size}`] }, { duration: ms(timing.dur), easing: `cubic-bezier(${timing.keySplines})` });\n}\n\n/**\n * Scatter chart. It reads its <table> like LineChart, but the first value\n * column is the x axis: each row draws one point per later column, at the\n * row's x value and that column's y value. A row without an x value, or a\n * cell without a y value, draws no point.\n *\n * With `.bubble`, the last column sizes each row's points, so their areas\n * follow its values, and a row without a positive size draws no point.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class ScatterChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** Each row's x value, or null. */\n private _xs: (number | null)[];\n /** Each row's size: 1 without .bubble, or the last cell's value, null unless positive. */\n private _sizes: (number | null)[];\n /** The x scale. */\n private _xFit: ChartScale;\n /** The signs around the x column's numbers, which its axis labels repeat. */\n private _xAffix: [string, string];\n /** The drawn points, row by row and within a row by series. */\n private _marks: Mark[];\n /** During update(), the points drawn before it, which the new ones move from. */\n private _drawn: Mark[];\n\n protected get _type() {\n return 'scatter-chart';\n }\n\n protected get _seriesFrom() {\n return 2;\n }\n\n protected get _seriesTo() {\n return this._bubble ? -1 : undefined;\n }\n\n private get _bubble() {\n return this.el.classList.contains('bubble');\n }\n\n static get defaults(): ScatterChartOptions {\n return { ...LineChart.defaults, xMin: null, xMax: null };\n }\n\n static key = 'Expressive_ScatterChart';\n\n /**\n * Reads each row's x value into `_xs` and its size into `_sizes`, which\n * the scales and the points use, and leaves out the values of rows\n * without either, so they neither draw nor stretch a scale. Nothing stacks.\n */\n protected _arrange(series: Series[]) {\n const xs = (this._xs = this._rows.map((row) => cellValue(row.cells[1])));\n const sizes = (this._sizes = this._rows.map((row) => this._size(row)));\n for (const each of series) {\n each.values = each.tops = each.values.map((value, row) => (xs[row] === null || sizes[row] === null ? null : value));\n }\n }\n\n /** A row's size: 1 without .bubble, or its last cell's value, null unless positive. */\n private _size(row: HTMLTableRowElement) {\n if (!this._bubble) return 1;\n const size = cellValue(row.cells[this._header.length - 1]) ?? 0;\n return size > 0 ? size : null;\n }\n\n protected get _count() {\n return this._marks?.length ?? 0;\n }\n\n /** Highlights one point, numbered as `_marks` lists them. Pass -1 to hide the tooltip. */\n show(index: number) {\n if (!this._tooltip || index === this.activeIndex) return;\n this.activeIndex = index;\n const mark = this._marks[index];\n this._cursor.hidden = this._tooltip.hidden = !mark;\n if (mark) this._fill(mark);\n }\n\n /**\n * Puts the marker on a point, at a bubble's size, and fills the tooltip\n * beside it: the row, its x header and text, the series and its text, and\n * with .bubble the size header and text, as the author wrote them. Past\n * the middle the tooltip opens back over the plot.\n */\n private _fill({ row, series, x, y, size }: Mark) {\n this._cursor.dataset.series = series.color;\n this._cursor.style.setProperty('--scatter-chart-size', `${size}`);\n for (const part of [this._cursor, this._tooltip]) Object.assign(part.style, { left: `${x}%`, top: `${y}%` });\n this._tooltip.classList.toggle('end', x > 50);\n const [title, name] = [document.createElement('strong'), span(series.name)];\n title.textContent = this.labels[row];\n name.dataset.series = series.color;\n const sizeText = this._bubble ? this._cellText(row, this._header.length - 1) : [];\n this._tooltip.replaceChildren(title, ...this._cellText(row, 1), name, span(series.text[row]), ...sizeText);\n }\n\n /** A column's header, without a swatch since it names no series, and the row's text in it. */\n private _cellText(row: number, column: number) {\n const header = span(this._header[column].textContent.trim());\n header.className = 'x';\n return [header, span(this._rows[row].cells[column]?.textContent.trim() ?? '')];\n }\n\n /** The point nearest the pointer, or -1 with none. */\n protected _indexAt(e: PointerEvent) {\n const [plot, box] = [this._plot, this._plot.getBoundingClientRect()];\n const left = box.left + plot.clientLeft;\n const top = box.top + plot.clientTop;\n const [width, height] = [plot.clientWidth, plot.clientHeight];\n let nearest = -1;\n let distance = Infinity;\n this._marks.forEach(({ x, y }, i) => {\n const away = Math.hypot(left + (x / 100) * width - e.clientX, top + (y / 100) * height - e.clientY);\n if (nearest < 0 || away < distance) {\n nearest = i;\n distance = away;\n }\n });\n return nearest;\n }\n\n /**\n * Steps through the points in table order. The arrows keep their meaning\n * in a right-to-left chart, since table order is no direction on screen.\n */\n protected _keyTarget(key: string): number | undefined {\n return linearKey(key, this.activeIndex, this._marks.length - 1);\n }\n\n protected _read() {\n [this._drawn, this._marks] = [this._marks ?? [], []];\n super._read();\n if (!this.series.length) return;\n this._xFit = this._xScale();\n this._xAffix = affix(this._rows.map((row) => row.cells[1]));\n }\n\n /** The x scale over the rows with a point, between `xMin` and `xMax` where they are set. */\n private _xScale(): ChartScale {\n const [low, high] = this._xRange();\n const [min, max] = [this._xEnd('xMin'), this._xEnd('xMax')];\n return this._fit(min ?? low, max ?? high, [min !== null, max !== null]);\n }\n\n /** The x values of the rows with a point, with 10% of their span to spare each side. */\n private _xRange(): [number, number] {\n const xs = this._xs.filter((_, row) => this._hasPoint(row)) as number[];\n if (!xs.length) return [-1, 1];\n const [low, high] = [xs.reduce((a, b) => Math.min(a, b)), xs.reduce((a, b) => Math.max(a, b))];\n const pad = (high - low) * 0.1 || 1;\n return [low - pad, high + pad];\n }\n\n /** An x scale end from its data attribute or option, or null. */\n private _xEnd(name: 'xMin' | 'xMax') {\n return this._number(name) ?? (this.options as Partial<ScatterChartOptions>)[name] ?? null;\n }\n\n /** A value's distance across the plot from its inline start, in percent. */\n private _xAt(value: number) {\n const { min, max } = this._xFit;\n const x = ((value - min) / (max - min || 1)) * 100;\n return this._reversed ? 100 - x : x;\n }\n\n /** Whether any series shown draws a point in a row. */\n private _hasPoint(row: number) {\n return this.series.some((series) => series.values[row] !== null);\n }\n\n /** The points, each diameter the square root of its row's share of the largest size drawn, so areas follow sizes. */\n private _layout(): Mark[] {\n const largest = this._sizes.reduce<number>((most, size, row) => (this._hasPoint(row) ? Math.max(most, size!) : most), 0);\n return this.labels.flatMap((_, row) => this.series\n .filter((series) => series.values[row] !== null)\n .map((series) => ({\n row,\n series,\n x: this._xAt(this._xs[row]!),\n y: series.y(series.values[row]!),\n size: Math.sqrt(this._sizes[row]! / largest)\n })));\n }\n\n /** One group per series, its points round caps on zero-length lines, so CSS sizes them in pixels. */\n protected _draw(): Element {\n this._marks = this._layout();\n const svg = svgNode('svg', {\n viewBox: '0 0 100 100',\n preserveAspectRatio: 'none',\n 'aria-hidden': 'true',\n focusable: 'false'\n });\n const timing = this._before.length ? pace(this.el) : null;\n const was = new Map(this._drawn.map((old) => [place(old), old]));\n svg.append(...this.series.map((series) => this._group(series, timing, was)));\n return svg;\n }\n\n /**\n * A series' points, in one path, or with .bubble one path each, largest\n * first so smaller bubbles stay on top.\n */\n private _group(series: Series, timing: ReturnType<typeof pace>, was: Map<string, Mark>) {\n const group = svgNode('g', {\n class: `scatter-chart-series ${series.className}`.trim(),\n 'data-series': series.color\n });\n const marks = this._marks.filter((mark) => mark.series === series);\n const sets = this._bubble ? marks.sort((a, b) => b.size - a.size).map((mark) => [mark]) : [marks];\n group.append(...sets.map((set) => this._pointPath(set, timing, was)));\n return group;\n }\n\n /**\n * A path of points. After update() each moves from where its row's point\n * in the same column was drawn, or appears where it is.\n */\n private _pointPath(marks: Mark[], timing: ReturnType<typeof pace>, was: Map<string, Mark>) {\n const path = svgNode('path', { class: 'scatter-chart-points', d: dots(marks) });\n if (timing) morph(path, dots(marks.map((mark) => was.get(place(mark)) ?? mark)), timing);\n if (this._bubble) sized(path, marks[0].size, was.get(place(marks[0])), timing);\n return path;\n }\n\n /** With .axis, the y scale's labels, and the x scale's below the plot with a grid line at each. */\n protected _axes(): Element[] {\n return this._axis ? [...super._axes(), this._xAxis()] : [];\n }\n\n private _xAxis() {\n const number = tickFormat(this.el, this._xFit.ticks);\n return tickAxis('scatter-chart-axis x', this._xFit.ticks, (tick) => tickText(number, tick, this._xAffix), (tick) => this._xAt(tick));\n }\n\n /** The legend only: the rows have no labels along an axis. */\n protected _guides(): Element[] {\n return this._legend();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|