@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
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LineChart,
|
|
3
|
+
ROW_COLORS,
|
|
4
|
+
numberFormat,
|
|
5
|
+
percentLabel,
|
|
6
|
+
polarPoint,
|
|
7
|
+
rowLegend,
|
|
8
|
+
signs,
|
|
9
|
+
tintTooltip
|
|
10
|
+
} from "./chunk-IQOTGGHX.mjs";
|
|
11
|
+
import {
|
|
12
|
+
svgNode
|
|
13
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
14
|
+
|
|
15
|
+
// src/ts/components/pieChart.ts
|
|
16
|
+
var RADIUS = 46;
|
|
17
|
+
var WHOLE = 1 - 1e-5;
|
|
18
|
+
var GROWN = 1.06;
|
|
19
|
+
var LABEL_SHARE = 0.05;
|
|
20
|
+
var _maskId = 0;
|
|
21
|
+
function decimals(text) {
|
|
22
|
+
const [, fraction = "", exponent = "0"] = /(?:\.(\d+))?(?:e([+-]?\d+))?$/i.exec(text.replace(/[^\d.e+-]/gi, ""));
|
|
23
|
+
return Math.max(0, fraction.length - Number(exponent));
|
|
24
|
+
}
|
|
25
|
+
function stack(names, away, anchor) {
|
|
26
|
+
names.sort(([a], [b]) => (a - b) * away);
|
|
27
|
+
const ys = names.map(([y]) => y);
|
|
28
|
+
if (anchor !== void 0) ys.unshift(anchor);
|
|
29
|
+
const first = ys.length - names.length;
|
|
30
|
+
names.forEach(([, name], k) => {
|
|
31
|
+
const tops = ys.slice(0, first + k + 1).map((y, j) => `calc(50cqw + ${y} * var(--pie-chart-name-at) + ${(first + k - j) * away} * var(--pie-chart-name-step))`);
|
|
32
|
+
name.style.setProperty("--pie-chart-name-top", `${away > 0 ? "max" : "min"}(${tops.join(", ")})`);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
var PieChart = class extends LineChart {
|
|
36
|
+
get _type() {
|
|
37
|
+
return "pie-chart";
|
|
38
|
+
}
|
|
39
|
+
/** A pie has no value axis. */
|
|
40
|
+
get _axis() {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
get _points() {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
get _circular() {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
_read() {
|
|
50
|
+
super._read();
|
|
51
|
+
const small = this._small();
|
|
52
|
+
if (!small) return;
|
|
53
|
+
const sum = this.series[0].values.reduce((total, value, i) => total + (small[i] ? Math.max(0, value) : 0), 0);
|
|
54
|
+
const text = this._written(sum, this._rows.filter((_, i) => small[i]).map((row) => row.cells[1]));
|
|
55
|
+
const keep = (list, other) => [...list.filter((_, i) => !small[i]), other];
|
|
56
|
+
this.labels = keep(this.labels, this.el.dataset.otherLabel || "Other");
|
|
57
|
+
this.series = this.series.map((series, i) => {
|
|
58
|
+
const values = keep(series.values, i ? null : sum);
|
|
59
|
+
return { ...series, values, tops: values, text: keep(series.text, i ? "" : text) };
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The group's sum written like its cells: with their signs, and to their
|
|
64
|
+
* decimals, or compact when data-value stands behind text such as "$38M".
|
|
65
|
+
*/
|
|
66
|
+
_written(sum, cells) {
|
|
67
|
+
const texts = cells.map((cell) => cell.textContent.trim());
|
|
68
|
+
const [prefix, suffix] = signs(texts[0]);
|
|
69
|
+
return `${prefix}${numberFormat(this.el, this._precision(texts, cells)).format(sum)}${suffix}`;
|
|
70
|
+
}
|
|
71
|
+
_precision(texts, cells) {
|
|
72
|
+
if (cells.some((cell) => cell.dataset.value)) return { notation: "compact", maximumSignificantDigits: 3 };
|
|
73
|
+
const digits = Math.max(0, ...texts.map(decimals));
|
|
74
|
+
return digits > 20 ? { maximumSignificantDigits: 3 } : { maximumFractionDigits: digits };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Which rows data-other groups: those with a value under that percentage
|
|
78
|
+
* of the whole. Null when it groups nothing, as one small row is clearer
|
|
79
|
+
* by its own name.
|
|
80
|
+
*/
|
|
81
|
+
_small() {
|
|
82
|
+
const percent = this._number("other");
|
|
83
|
+
const values = this.series[0]?.values.map((value) => value === null ? null : Math.max(0, value));
|
|
84
|
+
if (!values || !(percent > 0)) return null;
|
|
85
|
+
const total = values.reduce((sum, value) => sum + (value ?? 0), 0);
|
|
86
|
+
const small = values.map((value) => value !== null && value / total * 100 < percent - 1e-9);
|
|
87
|
+
return small.filter(Boolean).length > 1 ? small : null;
|
|
88
|
+
}
|
|
89
|
+
show(index) {
|
|
90
|
+
if (!this._tooltip || index === this.activeIndex) return;
|
|
91
|
+
super.show(index);
|
|
92
|
+
this._slices.forEach((slice, i) => slice?.classList.toggle("active", i === index));
|
|
93
|
+
if (this._tooltip.hidden) return;
|
|
94
|
+
tintTooltip(this._tooltip, this._colors[index]);
|
|
95
|
+
}
|
|
96
|
+
/** CSS places the tooltip on the slice's middle from --turn. */
|
|
97
|
+
_place(index) {
|
|
98
|
+
const middle = (this._turns[index][0] + this._turns[index][1]) / 2;
|
|
99
|
+
this._tooltip.style.setProperty("--turn", String(middle));
|
|
100
|
+
this._tooltip.classList.toggle("end", middle < 0.5);
|
|
101
|
+
}
|
|
102
|
+
/** The row's share of the whole as a percentage, or '' for none. */
|
|
103
|
+
_share(index) {
|
|
104
|
+
const [start, end] = this._turns[index];
|
|
105
|
+
if (end <= start) return "";
|
|
106
|
+
return percentLabel(this.el, end - start, this._percents ?? (this._percents = []));
|
|
107
|
+
}
|
|
108
|
+
// ponytail: names only move up or down their side, so many thin slices
|
|
109
|
+
// near the top or bottom run into the caption or legend; group them as "Other".
|
|
110
|
+
/**
|
|
111
|
+
* Each slice's row name outside it, on the slice's middle, with a leader
|
|
112
|
+
* line back to the slice. Names on the right half run rightwards and those
|
|
113
|
+
* on the left run leftwards.
|
|
114
|
+
*/
|
|
115
|
+
_names() {
|
|
116
|
+
const names = document.createElement("div");
|
|
117
|
+
names.className = "pie-chart-names";
|
|
118
|
+
const sides = [[], [], [], []];
|
|
119
|
+
this._turns.forEach(([start, end], i) => {
|
|
120
|
+
if (end <= start) return;
|
|
121
|
+
const turn = (start + end) / 2;
|
|
122
|
+
const y = -Math.cos(turn * 2 * Math.PI);
|
|
123
|
+
const name = document.createElement("span");
|
|
124
|
+
name.dataset.series = this._colors[i];
|
|
125
|
+
name.style.setProperty("--turn", String(turn));
|
|
126
|
+
name.classList.toggle("end", turn >= 0.5);
|
|
127
|
+
const text = document.createElement("span");
|
|
128
|
+
text.textContent = this.labels[i];
|
|
129
|
+
name.append(text);
|
|
130
|
+
names.append(name);
|
|
131
|
+
sides[(turn >= 0.5 ? 2 : 0) + Number(y >= 0)].push([y, name]);
|
|
132
|
+
});
|
|
133
|
+
for (const i of [0, 2]) {
|
|
134
|
+
stack(sides[i], -1);
|
|
135
|
+
stack(sides[i + 1], 1, sides[i][0]?.[0]);
|
|
136
|
+
}
|
|
137
|
+
return names;
|
|
138
|
+
}
|
|
139
|
+
/** The legend: every row with its color, its cell and its share. */
|
|
140
|
+
_guides() {
|
|
141
|
+
this._percents = [];
|
|
142
|
+
const text = this.series[0].text;
|
|
143
|
+
return [rowLegend("pie-chart-legend", this._colors, this.labels.map((label, i) => [label, text[i], this._share(i)]))];
|
|
144
|
+
}
|
|
145
|
+
/** The row under the pointer by its angle from the middle, or -1 off the slices. */
|
|
146
|
+
_indexAt(e) {
|
|
147
|
+
const [turn, share] = this._polarAt(e);
|
|
148
|
+
const distance = share * 100;
|
|
149
|
+
const hole = this.el.classList.contains("donut") ? parseFloat(getComputedStyle(this.el).getPropertyValue("--md-comp-pie-chart-hole")) || 0 : 0;
|
|
150
|
+
if (distance < RADIUS * hole) return -1;
|
|
151
|
+
const index = this._turns.findIndex(([start, end]) => start <= turn && turn < end);
|
|
152
|
+
return distance > RADIUS * (index === this.activeIndex ? GROWN : 1) ? -1 : index;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* An SVG of slices in a -50 to 50 box, under a mask that cuts the gaps
|
|
156
|
+
* between them and the donut's hole, which CSS sizes. The values and the
|
|
157
|
+
* total are HTML over it.
|
|
158
|
+
*/
|
|
159
|
+
_draw() {
|
|
160
|
+
const values = this.series[0].values.map((value) => Math.max(0, value ?? 0));
|
|
161
|
+
const total = values.reduce((sum, value) => sum + value, 0);
|
|
162
|
+
let turn = 0;
|
|
163
|
+
this._turns = values.map((value) => [turn, turn += total ? value / total : 0]);
|
|
164
|
+
const drawn = this._turns.filter(([start, end]) => end > start);
|
|
165
|
+
let slice = 0;
|
|
166
|
+
this._colors = this._turns.map(([start, end]) => {
|
|
167
|
+
if (end <= start) return void 0;
|
|
168
|
+
const index = slice++;
|
|
169
|
+
return String(index === drawn.length - 1 && index > 0 && index % ROW_COLORS === 0 ? 2 : index % ROW_COLORS + 1);
|
|
170
|
+
});
|
|
171
|
+
const pie = document.createElement("div");
|
|
172
|
+
pie.className = "pie-chart-pie";
|
|
173
|
+
pie.setAttribute("aria-hidden", "true");
|
|
174
|
+
const svg = svgNode("svg", { viewBox: "-50 -50 100 100", focusable: "false" });
|
|
175
|
+
const id = `pie-chart-mask-${++_maskId}`;
|
|
176
|
+
const area = { x: "-50", y: "-50", width: "100", height: "100" };
|
|
177
|
+
const mask = svgNode("mask", { id, maskUnits: "userSpaceOnUse", ...area });
|
|
178
|
+
mask.append(
|
|
179
|
+
svgNode("rect", { ...area, fill: "white" }),
|
|
180
|
+
svgNode("path", {
|
|
181
|
+
class: "pie-chart-gaps",
|
|
182
|
+
stroke: "black",
|
|
183
|
+
d: drawn.length > 1 ? drawn.map(([start]) => `M0,0L${polarPoint(start, 50)}`).join("") : ""
|
|
184
|
+
}),
|
|
185
|
+
svgNode("circle", { class: "pie-chart-hole", r: String(RADIUS), fill: "black" })
|
|
186
|
+
);
|
|
187
|
+
const slices = svgNode("g", { mask: `url(#${id})` });
|
|
188
|
+
const arc = `A${RADIUS},${RADIUS} 0`;
|
|
189
|
+
this._slices = this._turns.map(([start, end], i) => {
|
|
190
|
+
if (end <= start) return null;
|
|
191
|
+
const slice2 = svgNode("path", {
|
|
192
|
+
class: "pie-chart-slice",
|
|
193
|
+
"data-series": this._colors[i],
|
|
194
|
+
// A whole circle is two half arcs; one arc cannot end where it starts.
|
|
195
|
+
d: end - start >= WHOLE ? `M0,${-RADIUS}${arc} 1 1 0,${RADIUS}${arc} 1 1 0,${-RADIUS}Z` : `M0,0L${polarPoint(start, RADIUS)}${arc} ${end - start > 0.5 ? 1 : 0} 1 ${polarPoint(end, RADIUS)}Z`
|
|
196
|
+
});
|
|
197
|
+
slices.append(slice2);
|
|
198
|
+
return slice2;
|
|
199
|
+
});
|
|
200
|
+
svg.append(mask, slices);
|
|
201
|
+
pie.append(svg, ...this._texts());
|
|
202
|
+
const middle = this._total("pie-chart-total");
|
|
203
|
+
if (middle) pie.append(middle);
|
|
204
|
+
return pie;
|
|
205
|
+
}
|
|
206
|
+
/** The .values shares on the slices and the .labels names outside them. */
|
|
207
|
+
_texts() {
|
|
208
|
+
const texts = [];
|
|
209
|
+
if (this.el.classList.contains("values")) texts.push(this._values());
|
|
210
|
+
if (this.el.classList.contains("labels") && !this.el.classList.contains("sparkline")) texts.push(this._names());
|
|
211
|
+
return texts;
|
|
212
|
+
}
|
|
213
|
+
/** Each slice's share on it, except on slices too thin to hold it. */
|
|
214
|
+
_values() {
|
|
215
|
+
const labels = document.createElement("div");
|
|
216
|
+
labels.className = "pie-chart-values";
|
|
217
|
+
this._turns.forEach(([start, end], i) => {
|
|
218
|
+
if (end - start < LABEL_SHARE) return;
|
|
219
|
+
const label = document.createElement("span");
|
|
220
|
+
label.dataset.series = this._colors[i];
|
|
221
|
+
label.style.setProperty("--turn", String((start + end) / 2));
|
|
222
|
+
label.textContent = this._share(i);
|
|
223
|
+
labels.append(label);
|
|
224
|
+
});
|
|
225
|
+
return labels;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
PieChart.key = "Expressive_PieChart";
|
|
229
|
+
|
|
230
|
+
export {
|
|
231
|
+
PieChart
|
|
232
|
+
};
|
|
233
|
+
//# sourceMappingURL=chunk-2LFCOGC3.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/pieChart.ts"],
|
|
4
|
+
"sourcesContent": ["import { LineChart, LineChartOptions, ROW_COLORS as COLORS, numberFormat, percentLabel, polarPoint as at, rowLegend, signs, tintTooltip } from './lineChart';\nimport { svgNode as node } from '../core/utils';\n\nexport type PieChartOptions = LineChartOptions;\n\n// ponytail: rows past six repeat the colors; data-other groups the small ones.\n/** The pie's radius in a 100-unit box, leaving room for the active slice to grow. */\nconst RADIUS = 46;\n/**\n * Slices at least this share are drawn whole. polarPoint rounds to 0.001, so\n * a slice within about 3.5e-6 of whole would end where it starts and its\n * single arc would draw nothing. The rest of the pie is too thin to see.\n */\nconst WHOLE = 1 - 1e-5;\n/** The active slice's scale, as in _pie-chart.scss. */\nconst GROWN = 1.06;\n/** Slices smaller than this share get no .values label. */\nconst LABEL_SHARE = 0.05;\nlet _maskId = 0;\n\n/** How many decimals a cell's number has, counting an exponent: \"2.5e-3\" has 4. */\nfunction decimals(text: string) {\n // Keeping only the number's characters first keeps the match linear.\n const [, fraction = '', exponent = '0'] = /(?:\\.(\\d+))?(?:e([+-]?\\d+))?$/i.exec(text.replace(/[^\\d.e+-]/gi, ''))!;\n return Math.max(0, fraction.length - Number(exponent));\n}\n\n/**\n * Sets each name's --pie-chart-name-top so neighbours on one side of the pie sit at least\n * --pie-chart-name-step apart, pushed away from the middle line: down below\n * it (`away` 1) and up above it (-1). Each top is the furthest of the natural\n * places of the names before it, plus a step for every name between. An\n * `anchor` is a fixed place before the first name, the unmoved innermost\n * name across the middle line.\n */\nfunction stack(names: [number, HTMLElement][], away: number, anchor?: number) {\n names.sort(([a], [b]) => (a - b) * away);\n const ys = names.map(([y]) => y);\n if (anchor !== undefined) ys.unshift(anchor);\n const first = ys.length - names.length;\n names.forEach(([, name], k) => {\n const tops = ys.slice(0, first + k + 1).map((y, j) =>\n `calc(50cqw + ${y} * var(--pie-chart-name-at) + ${(first + k - j) * away} * var(--pie-chart-name-step))`);\n name.style.setProperty('--pie-chart-name-top', `${away > 0 ? 'max' : 'min'}(${tops.join(', ')})`);\n });\n}\n\n/**\n * Pie chart. It reads its <table> like LineChart, but draws each row of the\n * first value column as a slice of the whole, clockwise from the top, with\n * a legend of every row and its share. With `.donut`, a <tfoot> row is the\n * total in the middle. Further columns show in the tooltip. With\n * `data-other`, rows under that percentage of the whole become one row,\n * last, named by `data-other-label` (\"Other\" by default); the table keeps\n * every row.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class PieChart extends LineChart {\n // No initializers: LineChart's constructor draws before they would run.\n /** Each row's start and end, as fractions of a turn clockwise from the top. */\n private _turns: [number, number][];\n /** Each row's color, or undefined for a row with no slice. */\n private _colors: (string | undefined)[];\n private _slices: (SVGPathElement | null)[];\n /** Percent formatters by fraction digits, rebuilt once per legend. */\n private _percents: Intl.NumberFormat[];\n\n protected get _type() {\n return 'pie-chart';\n }\n\n /** A pie has no value axis. */\n protected get _axis() {\n return false;\n }\n\n protected get _points() {\n return false;\n }\n\n protected get _circular() {\n return true;\n }\n\n protected _read() {\n super._read();\n const small = this._small();\n if (!small) return;\n const sum = this.series[0].values.reduce<number>((total, value, i) => total + (small[i] ? Math.max(0, value!) : 0), 0);\n const text = this._written(sum, this._rows.filter((_, i) => small[i]).map((row) => row.cells[1]));\n const keep = <T>(list: T[], other: T) => [...list.filter((_, i) => !small[i]), other];\n this.labels = keep(this.labels, this.el.dataset.otherLabel || 'Other');\n // Only the first column adds up; further columns have no value for the group.\n this.series = this.series.map((series, i) => {\n const values = keep(series.values, i ? null : sum);\n return { ...series, values, tops: values, text: keep(series.text, i ? '' : text) };\n });\n }\n\n /**\n * The group's sum written like its cells: with their signs, and to their\n * decimals, or compact when data-value stands behind text such as \"$38M\".\n */\n private _written(sum: number, cells: HTMLTableCellElement[]) {\n const texts = cells.map((cell) => cell.textContent.trim());\n const [prefix, suffix] = signs(texts[0]);\n return `${prefix}${numberFormat(this.el, this._precision(texts, cells)).format(sum)}${suffix}`;\n }\n\n private _precision(texts: string[], cells: HTMLTableCellElement[]): Intl.NumberFormatOptions {\n if (cells.some((cell) => cell.dataset.value)) return { notation: 'compact', maximumSignificantDigits: 3 };\n const digits = Math.max(0, ...texts.map(decimals));\n // Older engines take at most 20 fraction digits; past that, keep the sum's first digits.\n return digits > 20 ? { maximumSignificantDigits: 3 } : { maximumFractionDigits: digits };\n }\n\n /**\n * Which rows data-other groups: those with a value under that percentage\n * of the whole. Null when it groups nothing, as one small row is clearer\n * by its own name.\n */\n private _small() {\n const percent = this._number('other');\n const values = this.series[0]?.values.map((value) => (value === null ? null : Math.max(0, value)));\n if (!values || !(percent! > 0)) return null;\n const total = values.reduce<number>((sum, value) => sum + (value ?? 0), 0);\n // A row exactly at the percentage stays, despite rounding in the division.\n const small = values.map((value) => value !== null && (value / total) * 100 < percent! - 1e-9);\n return small.filter(Boolean).length > 1 ? small : null;\n }\n\n static key = 'Expressive_PieChart';\n\n show(index: number) {\n if (!this._tooltip || index === this.activeIndex) return;\n super.show(index);\n this._slices.forEach((slice, i) => slice?.classList.toggle('active', i === index));\n // LineChart hides the tooltip for -1 and for an index past the last row.\n if (this._tooltip.hidden) return;\n\n tintTooltip(this._tooltip, this._colors[index]);\n }\n\n /** CSS places the tooltip on the slice's middle from --turn. */\n protected _place(index: number) {\n const middle = (this._turns[index][0] + this._turns[index][1]) / 2;\n this._tooltip.style.setProperty('--turn', String(middle));\n // On the right half it opens leftwards, over the pie.\n this._tooltip.classList.toggle('end', middle < 0.5);\n }\n\n /** The row's share of the whole as a percentage, or '' for none. */\n protected _share(index: number) {\n const [start, end] = this._turns[index];\n if (end <= start) return '';\n return percentLabel(this.el, end - start, (this._percents ??= []));\n }\n\n // ponytail: names only move up or down their side, so many thin slices\n // near the top or bottom run into the caption or legend; group them as \"Other\".\n /**\n * Each slice's row name outside it, on the slice's middle, with a leader\n * line back to the slice. Names on the right half run rightwards and those\n * on the left run leftwards.\n */\n private _names() {\n const names = document.createElement('div');\n names.className = 'pie-chart-names';\n // Right above, right below, left above and left below the middle line.\n const sides: [number, HTMLElement][][] = [[], [], [], []];\n this._turns.forEach(([start, end], i) => {\n if (end <= start) return;\n const turn = (start + end) / 2;\n const y = -Math.cos(turn * 2 * Math.PI);\n const name = document.createElement('span');\n name.dataset.series = this._colors[i];\n name.style.setProperty('--turn', String(turn));\n name.classList.toggle('end', turn >= 0.5);\n // The text is cut short inside the name, which draws the leader line.\n const text = document.createElement('span');\n text.textContent = this.labels[i];\n name.append(text);\n names.append(name);\n sides[(turn >= 0.5 ? 2 : 0) + Number(y >= 0)].push([y, name]);\n });\n // Names below the line start a step under the innermost name above it.\n for (const i of [0, 2]) {\n stack(sides[i], -1);\n stack(sides[i + 1], 1, sides[i][0]?.[0]);\n }\n return names;\n }\n\n /** The legend: every row with its color, its cell and its share. */\n protected _guides(): Element[] {\n // A redraw picks up a changed lang attribute.\n this._percents = [];\n const text = this.series[0].text;\n return [rowLegend('pie-chart-legend', this._colors, this.labels.map((label, i) => [label, text[i], this._share(i)]))];\n }\n\n /** The row under the pointer by its angle from the middle, or -1 off the slices. */\n protected _indexAt(e: PointerEvent) {\n const [turn, share] = this._polarAt(e);\n // The distance in the SVG's 100-unit box.\n const distance = share * 100;\n const hole = this.el.classList.contains('donut')\n ? parseFloat(getComputedStyle(this.el).getPropertyValue('--md-comp-pie-chart-hole')) || 0\n : 0;\n if (distance < RADIUS * hole) return -1;\n const index = this._turns.findIndex(([start, end]) => start <= turn && turn < end);\n // The active slice is drawn larger, so the pointer stays on it to its edge.\n return distance > RADIUS * (index === this.activeIndex ? GROWN : 1) ? -1 : index;\n }\n\n /**\n * An SVG of slices in a -50 to 50 box, under a mask that cuts the gaps\n * between them and the donut's hole, which CSS sizes. The values and the\n * total are HTML over it.\n */\n protected _draw(): Element {\n const values = this.series[0].values.map((value) => Math.max(0, value ?? 0));\n const total = values.reduce((sum, value) => sum + value, 0);\n let turn = 0;\n this._turns = values.map((value) => [turn, (turn += total ? value / total : 0)]);\n // Colors go round the drawn slices; the last skips the first's color beside it.\n const drawn = this._turns.filter(([start, end]) => end > start);\n let slice = 0;\n this._colors = this._turns.map(([start, end]) => {\n if (end <= start) return undefined;\n const index = slice++;\n return String(index === drawn.length - 1 && index > 0 && index % COLORS === 0 ? 2 : (index % COLORS) + 1);\n });\n\n const pie = document.createElement('div');\n pie.className = 'pie-chart-pie';\n pie.setAttribute('aria-hidden', 'true');\n const svg = node('svg', { viewBox: '-50 -50 100 100', focusable: 'false' });\n const id = `pie-chart-mask-${++_maskId}`;\n const area = { x: '-50', y: '-50', width: '100', height: '100' };\n const mask = node('mask', { id, maskUnits: 'userSpaceOnUse', ...area });\n mask.append(\n node('rect', { ...area, fill: 'white' }),\n node('path', {\n class: 'pie-chart-gaps',\n stroke: 'black',\n d: drawn.length > 1 ? drawn.map(([start]) => `M0,0L${at(start, 50)}`).join('') : ''\n }),\n node('circle', { class: 'pie-chart-hole', r: String(RADIUS), fill: 'black' })\n );\n\n const slices = node('g', { mask: `url(#${id})` });\n const arc = `A${RADIUS},${RADIUS} 0`;\n this._slices = this._turns.map(([start, end], i) => {\n if (end <= start) return null;\n const slice = node('path', {\n class: 'pie-chart-slice',\n 'data-series': this._colors[i],\n // A whole circle is two half arcs; one arc cannot end where it starts.\n d: end - start >= WHOLE\n ? `M0,${-RADIUS}${arc} 1 1 0,${RADIUS}${arc} 1 1 0,${-RADIUS}Z`\n : `M0,0L${at(start, RADIUS)}${arc} ${end - start > 0.5 ? 1 : 0} 1 ${at(end, RADIUS)}Z`\n }) as SVGPathElement;\n slices.append(slice);\n return slice;\n });\n svg.append(mask, slices);\n pie.append(svg, ...this._texts());\n\n const middle = this._total('pie-chart-total');\n if (middle) pie.append(middle);\n return pie;\n }\n\n /** The .values shares on the slices and the .labels names outside them. */\n private _texts(): Element[] {\n const texts: Element[] = [];\n if (this.el.classList.contains('values')) texts.push(this._values());\n if (this.el.classList.contains('labels') && !this.el.classList.contains('sparkline')) texts.push(this._names());\n return texts;\n }\n\n /** Each slice's share on it, except on slices too thin to hold it. */\n private _values() {\n const labels = document.createElement('div');\n labels.className = 'pie-chart-values';\n this._turns.forEach(([start, end], i) => {\n if (end - start < LABEL_SHARE) return;\n const label = document.createElement('span');\n label.dataset.series = this._colors[i];\n label.style.setProperty('--turn', String((start + end) / 2));\n label.textContent = this._share(i);\n labels.append(label);\n });\n return labels;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["slice"]
|
|
7
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Utils
|
|
3
|
-
} from "./chunk-M372EDXD.mjs";
|
|
4
1
|
import {
|
|
5
2
|
Component
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Utils,
|
|
6
|
+
restoreAttribute
|
|
7
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
7
8
|
|
|
8
9
|
// src/ts/components/expandingCard.ts
|
|
9
10
|
var _defaults = {
|
|
@@ -11,27 +12,23 @@ var _defaults = {
|
|
|
11
12
|
onClose: null
|
|
12
13
|
};
|
|
13
14
|
var EXPANDING_CARD_SELECTOR = "article.expanding-card:has(> dialog.expanding-card-dialog)";
|
|
14
|
-
var ExpandingCard = class
|
|
15
|
+
var ExpandingCard = class extends Component {
|
|
15
16
|
constructor(el, options) {
|
|
16
|
-
super(el, options
|
|
17
|
+
super(el, options);
|
|
17
18
|
this.isOpen = false;
|
|
18
19
|
this.closeGeneration = 0;
|
|
20
|
+
// Trigger attributes as they were before init, so destroy() can restore them.
|
|
21
|
+
this._initialTrigger = {};
|
|
19
22
|
this._setupEventHandlers = () => {
|
|
20
|
-
|
|
21
|
-
this.trigger?.addEventListener("
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
24
|
-
this.dialog?.addEventListener("
|
|
25
|
-
|
|
26
|
-
this._removeEventHandlers = () => {
|
|
27
|
-
this.trigger?.removeEventListener("click", this.open);
|
|
28
|
-
this.trigger?.removeEventListener("keypress", this._handleTriggerKeypress);
|
|
29
|
-
this.closeButton?.removeEventListener("click", this.close);
|
|
30
|
-
this.dialog?.removeEventListener("cancel", this._handleCancel);
|
|
31
|
-
this.dialog?.removeEventListener("close", this._handleNativeClose);
|
|
23
|
+
const { signal } = this._events;
|
|
24
|
+
this.trigger?.addEventListener("click", this.open, { signal });
|
|
25
|
+
this.trigger?.addEventListener("keypress", this._handleTriggerKeypress, { signal });
|
|
26
|
+
this.closeButton?.addEventListener("click", this.close, { signal });
|
|
27
|
+
this.dialog?.addEventListener("cancel", this._handleCancel, { signal });
|
|
28
|
+
this.dialog?.addEventListener("close", this._handleNativeClose, { signal });
|
|
32
29
|
};
|
|
33
30
|
this._handleTriggerKeypress = (event) => {
|
|
34
|
-
if (event.key ===
|
|
31
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
35
32
|
event.preventDefault();
|
|
36
33
|
this.open();
|
|
37
34
|
}
|
|
@@ -42,7 +39,9 @@ var ExpandingCard = class _ExpandingCard extends Component {
|
|
|
42
39
|
};
|
|
43
40
|
this._handleNativeClose = () => {
|
|
44
41
|
if (this.dialog.open) return;
|
|
42
|
+
const wasOpen = this.isOpen;
|
|
45
43
|
this._collapse();
|
|
44
|
+
if (wasOpen) this._notify("close", this.options.onClose, { current: () => !this.isOpen });
|
|
46
45
|
};
|
|
47
46
|
this._setTransitionOrigin = () => {
|
|
48
47
|
if (!this.dialog) return;
|
|
@@ -67,23 +66,18 @@ var ExpandingCard = class _ExpandingCard extends Component {
|
|
|
67
66
|
this._setTransitionOrigin();
|
|
68
67
|
this.isOpen = true;
|
|
69
68
|
this.trigger.ariaExpanded = "true";
|
|
70
|
-
this.dialog.ariaExpanded = "true";
|
|
71
69
|
this.dialog.showModal();
|
|
72
70
|
void this.dialog.offsetWidth;
|
|
73
71
|
this.dialog.classList.add("expanded");
|
|
74
72
|
this.closeButton?.focus();
|
|
75
|
-
|
|
76
|
-
this.options.onOpen.call(this, this.el);
|
|
77
|
-
}
|
|
73
|
+
this._notify("open", this.options.onOpen, { current: () => this.isOpen });
|
|
78
74
|
};
|
|
79
75
|
this.close = () => {
|
|
80
76
|
if (!this.isOpen || !this.dialog || !this.trigger) return;
|
|
81
77
|
this._setTransitionOrigin();
|
|
82
78
|
this._collapse();
|
|
83
79
|
const generation = this.closeGeneration;
|
|
84
|
-
|
|
85
|
-
this.options.onClose.call(this, this.el);
|
|
86
|
-
}
|
|
80
|
+
this._notify("close", this.options.onClose, { current: () => !this.isOpen });
|
|
87
81
|
const finish = () => {
|
|
88
82
|
if (generation !== this.closeGeneration || this.isOpen || !this.dialog.open) return;
|
|
89
83
|
this.dialog.close();
|
|
@@ -96,11 +90,6 @@ var ExpandingCard = class _ExpandingCard extends Component {
|
|
|
96
90
|
if (transitions.length === 0) finish();
|
|
97
91
|
else void Promise.allSettled(transitions.map((animation) => animation.finished)).then(finish);
|
|
98
92
|
};
|
|
99
|
-
this.el["Expressive_ExpandingCard"] = this;
|
|
100
|
-
this.options = {
|
|
101
|
-
..._ExpandingCard.defaults,
|
|
102
|
-
...options
|
|
103
|
-
};
|
|
104
93
|
this.dialog = this.el.querySelector(
|
|
105
94
|
":scope > dialog.expanding-card-dialog"
|
|
106
95
|
);
|
|
@@ -109,6 +98,8 @@ var ExpandingCard = class _ExpandingCard extends Component {
|
|
|
109
98
|
);
|
|
110
99
|
this.closeButton = this.dialog?.querySelector(".expanding-card-close") ?? null;
|
|
111
100
|
if (this.trigger && this.dialog) {
|
|
101
|
+
for (const name of ["aria-expanded", "aria-controls", "tabindex", "role"])
|
|
102
|
+
this._initialTrigger[name] = this.trigger.getAttribute(name);
|
|
112
103
|
this.trigger.ariaExpanded = "false";
|
|
113
104
|
if (this.dialog.id)
|
|
114
105
|
this.trigger.setAttribute("aria-controls", this.dialog.id);
|
|
@@ -116,48 +107,40 @@ var ExpandingCard = class _ExpandingCard extends Component {
|
|
|
116
107
|
this.trigger.tabIndex = 0;
|
|
117
108
|
this.trigger.setAttribute("role", "button");
|
|
118
109
|
}
|
|
119
|
-
this.dialog.ariaExpanded = "false";
|
|
120
110
|
this._setupEventHandlers();
|
|
121
111
|
}
|
|
122
112
|
}
|
|
123
113
|
static get defaults() {
|
|
124
114
|
return _defaults;
|
|
125
115
|
}
|
|
126
|
-
static init(els, options) {
|
|
127
|
-
return super.init(els, options, _ExpandingCard);
|
|
128
|
-
}
|
|
129
|
-
static getInstance(el) {
|
|
130
|
-
return el["Expressive_ExpandingCard"];
|
|
131
|
-
}
|
|
132
116
|
destroy() {
|
|
133
|
-
this.
|
|
117
|
+
this._events.abort();
|
|
134
118
|
this._collapse();
|
|
135
119
|
if (this.dialog?.open) this.dialog.close();
|
|
136
|
-
|
|
120
|
+
for (const [name, value] of Object.entries(this._initialTrigger)) restoreAttribute(this.trigger, name, value);
|
|
121
|
+
super.destroy();
|
|
137
122
|
}
|
|
138
123
|
/** Marks the card closed and invalidates any pending close. */
|
|
139
124
|
_collapse() {
|
|
140
125
|
this.closeGeneration++;
|
|
141
126
|
this.isOpen = false;
|
|
142
127
|
if (this.trigger) this.trigger.ariaExpanded = "false";
|
|
143
|
-
|
|
144
|
-
this.dialog.ariaExpanded = "false";
|
|
145
|
-
this.dialog.classList.remove("expanded");
|
|
146
|
-
}
|
|
128
|
+
this.dialog?.classList.remove("expanded");
|
|
147
129
|
}
|
|
148
130
|
static Init() {
|
|
149
131
|
Utils.onDocumentReady(() => {
|
|
150
132
|
document.querySelectorAll(EXPANDING_CARD_SELECTOR).forEach((el) => {
|
|
151
|
-
if (el
|
|
133
|
+
if (this.getInstance(el) === void 0) {
|
|
152
134
|
this.init(el);
|
|
153
135
|
}
|
|
154
136
|
});
|
|
155
137
|
});
|
|
156
138
|
}
|
|
157
139
|
};
|
|
140
|
+
ExpandingCard.key = "Expressive_ExpandingCard";
|
|
158
141
|
|
|
159
142
|
export {
|
|
160
143
|
EXPANDING_CARD_SELECTOR,
|
|
161
144
|
ExpandingCard
|
|
162
145
|
};
|
|
163
|
-
//# sourceMappingURL=chunk-
|
|
146
|
+
//# sourceMappingURL=chunk-36GELQGX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/expandingCard.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils, restoreAttribute } from \"../core/utils\";\nimport { Component, BaseOptions } from \"../core/component\";\n\nexport interface ExpandingCardOptions extends BaseOptions {\n onOpen: (el: Element) => void;\n onClose: (el: Element) => void;\n}\n\nconst _defaults: ExpandingCardOptions = {\n onOpen: null,\n onClose: null,\n};\n\nexport const EXPANDING_CARD_SELECTOR =\n \"article.expanding-card:has(> dialog.expanding-card-dialog)\";\n\n/**\n * Morphs a compact card into a full-screen modal detail surface.\n */\nexport class ExpandingCard extends Component<ExpandingCardOptions> {\n isOpen: boolean = false;\n private readonly trigger: HTMLElement | null;\n private readonly dialog: HTMLDialogElement | null;\n private readonly closeButton: HTMLElement | null;\n private closeGeneration = 0;\n // Trigger attributes as they were before init, so destroy() can restore them.\n private _initialTrigger: Record<string, string | null> = {};\n\n constructor(el: HTMLElement, options: Partial<ExpandingCardOptions>) {\n super(el, options);\n\n this.dialog = this.el.querySelector(\n \":scope > dialog.expanding-card-dialog\",\n );\n this.trigger = this.el.querySelector(\n \":scope > .expanding-card-trigger, :scope > figure > .expanding-card-trigger\",\n );\n this.closeButton =\n this.dialog?.querySelector(\".expanding-card-close\") ?? null;\n\n if (this.trigger && this.dialog) {\n for (const name of [\"aria-expanded\", \"aria-controls\", \"tabindex\", \"role\"])\n this._initialTrigger[name] = this.trigger.getAttribute(name);\n this.trigger.ariaExpanded = \"false\";\n if (this.dialog.id)\n this.trigger.setAttribute(\"aria-controls\", this.dialog.id);\n if (!this.trigger.matches(\"a[href], button, input, select, textarea\")) {\n this.trigger.tabIndex = 0;\n this.trigger.setAttribute(\"role\", \"button\");\n }\n this._setupEventHandlers();\n }\n }\n\n static get defaults(): ExpandingCardOptions {\n return _defaults;\n }\n\n static key = 'Expressive_ExpandingCard';\n\n destroy() {\n this._events.abort();\n this._collapse();\n if (this.dialog?.open) this.dialog.close();\n for (const [name, value] of Object.entries(this._initialTrigger)) restoreAttribute(this.trigger, name, value);\n super.destroy();\n }\n\n private _setupEventHandlers = () => {\n const { signal } = this._events;\n this.trigger?.addEventListener(\"click\", this.open, { signal });\n this.trigger?.addEventListener(\"keypress\", this._handleTriggerKeypress, { signal });\n this.closeButton?.addEventListener(\"click\", this.close, { signal });\n this.dialog?.addEventListener(\"cancel\", this._handleCancel, { signal });\n this.dialog?.addEventListener(\"close\", this._handleNativeClose, { signal });\n };\n\n private _handleTriggerKeypress = (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === \" \") {\n event.preventDefault();\n this.open();\n }\n };\n\n private _handleCancel = (event: Event) => {\n event.preventDefault();\n this.close();\n };\n\n private _handleNativeClose = () => {\n // A queued close event can arrive after a caller has reopened the dialog.\n if (this.dialog.open) return;\n // dialog.close() and <form method=\"dialog\"> bypass close(), so report here.\n const wasOpen = this.isOpen;\n this._collapse();\n if (wasOpen) this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n };\n\n /** Marks the card closed and invalidates any pending close. */\n private _collapse() {\n this.closeGeneration++;\n this.isOpen = false;\n if (this.trigger) this.trigger.ariaExpanded = \"false\";\n this.dialog?.classList.remove(\"expanded\");\n }\n\n private _setTransitionOrigin = () => {\n if (!this.dialog) return;\n const card = this.el.getBoundingClientRect();\n const media = this.el.querySelector<HTMLElement>(\n \":scope > figure, :scope > img\",\n );\n const mediaRect = media?.getBoundingClientRect();\n const set = (side: string, px: number) =>\n this.dialog.style.setProperty(\n `--md-comp-expanding-card-from-${side}`,\n `${Math.max(0, px)}px`,\n );\n\n set(\"top\", card.top);\n set(\"right\", window.innerWidth - card.right);\n set(\"bottom\", window.innerHeight - card.bottom);\n set(\"left\", card.left);\n set(\"media-height\", mediaRect?.height ?? 0);\n };\n\n open: () => void = () => {\n if (this.isOpen || !this.dialog || !this.trigger) return;\n this.closeGeneration++;\n\n this._setTransitionOrigin();\n this.isOpen = true;\n this.trigger.ariaExpanded = \"true\";\n this.dialog.showModal();\n // Commit the clipped start frame before asking CSS to expand it.\n void this.dialog.offsetWidth;\n this.dialog.classList.add(\"expanded\");\n this.closeButton?.focus();\n\n this._notify('open', this.options.onOpen, { current: () => this.isOpen });\n };\n\n close: () => void = () => {\n if (!this.isOpen || !this.dialog || !this.trigger) return;\n this._setTransitionOrigin();\n this._collapse();\n const generation = this.closeGeneration;\n\n this._notify('close', this.options.onClose, { current: () => !this.isOpen });\n\n const finish = () => {\n if (generation !== this.closeGeneration || this.isOpen || !this.dialog.open) return;\n this.dialog.close();\n if (this.dialog.isConnected && this.trigger.isConnected) this.trigger.focus();\n };\n const reducedMotion = window.matchMedia(\n \"(prefers-reduced-motion: reduce)\",\n ).matches;\n // Wait only for the container's actual clip transition, not arbitrary\n // animations in consumer content. Cancellation also completes cleanup.\n const transitions = reducedMotion ? [] : (this.dialog.getAnimations?.() ?? [])\n .filter((animation) => (animation as CSSTransition).transitionProperty === \"clip-path\");\n if (transitions.length === 0) finish();\n else void Promise.allSettled(transitions.map((animation) => animation.finished)).then(finish);\n };\n\n static Init() {\n Utils.onDocumentReady(() => {\n document.querySelectorAll(EXPANDING_CARD_SELECTOR).forEach((el) => {\n if (this.getInstance(el) === undefined) {\n this.init(el as HTMLElement);\n }\n });\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Component
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
4
|
+
import {
|
|
5
|
+
afterFormReset
|
|
6
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
4
7
|
|
|
5
8
|
// src/ts/components/characterCounter.ts
|
|
6
9
|
var _defaults = Object.freeze({});
|
|
7
|
-
var CharacterCounter = class
|
|
10
|
+
var CharacterCounter = class extends Component {
|
|
8
11
|
constructor(el, options) {
|
|
9
|
-
super(el,
|
|
12
|
+
super(el, options);
|
|
10
13
|
this.updateCounter = () => {
|
|
11
14
|
const maxLength = parseInt(this.el.getAttribute("maxlength")), actualLength = this.el.value.length;
|
|
12
15
|
this.isValidLength = actualLength <= maxLength;
|
|
@@ -17,49 +20,31 @@ var CharacterCounter = class _CharacterCounter extends Component {
|
|
|
17
20
|
}
|
|
18
21
|
this.counterEl.textContent = counterString;
|
|
19
22
|
};
|
|
20
|
-
this.el["Expressive_CharacterCounter"] = this;
|
|
21
|
-
this.options = {
|
|
22
|
-
..._CharacterCounter.defaults,
|
|
23
|
-
...options
|
|
24
|
-
};
|
|
25
23
|
this.isInvalid = false;
|
|
26
24
|
this.isValidLength = false;
|
|
27
25
|
this._setupCounter();
|
|
28
26
|
this._setupEventHandlers();
|
|
27
|
+
this.updateCounter();
|
|
29
28
|
}
|
|
30
29
|
static get defaults() {
|
|
31
30
|
return _defaults;
|
|
32
31
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Initializes instances of CharacterCounter.
|
|
35
|
-
* @param els HTML elements.
|
|
36
|
-
* @param options Component options.
|
|
37
|
-
*/
|
|
38
|
-
static init(els, options = {}) {
|
|
39
|
-
return super.init(els, options, _CharacterCounter);
|
|
40
|
-
}
|
|
41
|
-
static getInstance(el) {
|
|
42
|
-
return el["Expressive_CharacterCounter"];
|
|
43
|
-
}
|
|
44
32
|
destroy() {
|
|
45
|
-
|
|
46
|
-
this.el["Expressive_CharacterCounter"] = void 0;
|
|
33
|
+
super.destroy();
|
|
47
34
|
this._removeCounter();
|
|
35
|
+
if (this.isInvalid) this.el.classList.remove("invalid");
|
|
48
36
|
}
|
|
49
37
|
_setupEventHandlers() {
|
|
50
|
-
|
|
51
|
-
this.el.addEventListener("
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.el.removeEventListener("focus", this.updateCounter, true);
|
|
55
|
-
this.el.removeEventListener("input", this.updateCounter, true);
|
|
38
|
+
const options = { capture: true, signal: this._events.signal };
|
|
39
|
+
this.el.addEventListener("focus", this.updateCounter, options);
|
|
40
|
+
this.el.addEventListener("input", this.updateCounter, options);
|
|
41
|
+
afterFormReset(this.el, this.updateCounter, this._events.signal);
|
|
56
42
|
}
|
|
57
43
|
_setupCounter() {
|
|
58
44
|
this.counterEl = document.createElement("span");
|
|
59
45
|
this.counterEl.classList.add("character-counter");
|
|
60
46
|
this.counterEl.setAttribute("aria-live", "polite");
|
|
61
47
|
this.counterEl.setAttribute("aria-atomic", "true");
|
|
62
|
-
this.counterEl.style.float = "right";
|
|
63
48
|
this.counterEl.style.fontSize = "12px";
|
|
64
49
|
this.counterEl.style.height = "1";
|
|
65
50
|
this.el.parentElement.appendChild(this.counterEl);
|
|
@@ -78,8 +63,9 @@ var CharacterCounter = class _CharacterCounter extends Component {
|
|
|
78
63
|
}
|
|
79
64
|
}
|
|
80
65
|
};
|
|
66
|
+
CharacterCounter.key = "Expressive_CharacterCounter";
|
|
81
67
|
|
|
82
68
|
export {
|
|
83
69
|
CharacterCounter
|
|
84
70
|
};
|
|
85
|
-
//# sourceMappingURL=chunk-
|
|
71
|
+
//# sourceMappingURL=chunk-3FKWIRHW.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/characterCounter.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { afterFormReset } from '../core/utils';\n\nconst _defaults = Object.freeze({});\n\ntype InputElement = HTMLInputElement | HTMLTextAreaElement;\n\nexport class CharacterCounter extends Component<BaseOptions> {\n declare el: InputElement;\n /** Stores the reference to the counter HTML element. */\n counterEl: HTMLSpanElement;\n /** Specifies whether the input is valid or not. */\n isInvalid: boolean;\n /** Specifies whether the input text has valid length or not. */\n isValidLength: boolean;\n\n constructor(el: HTMLInputElement | HTMLTextAreaElement, options: Partial<BaseOptions>) {\n super(el, options);\n\n this.isInvalid = false;\n this.isValidLength = false;\n\n this._setupCounter();\n this._setupEventHandlers();\n // A prefilled field shows its count and over-length state before focus.\n this.updateCounter();\n }\n\n static get defaults(): BaseOptions {\n return _defaults;\n }\n\n static key = 'Expressive_CharacterCounter';\n\n destroy() {\n super.destroy();\n this._removeCounter();\n if (this.isInvalid) this.el.classList.remove('invalid');\n }\n\n _setupEventHandlers() {\n const options = { capture: true, signal: this._events.signal };\n this.el.addEventListener('focus', this.updateCounter, options);\n this.el.addEventListener('input', this.updateCounter, options);\n // A form reset restores the value without an input event.\n afterFormReset(this.el, this.updateCounter, this._events.signal);\n }\n\n _setupCounter() {\n this.counterEl = document.createElement('span');\n this.counterEl.classList.add('character-counter');\n // The count is the whole point of the component and it changes as the\n // user types, so it has to be a live region - otherwise a screen reader\n // user reaches the limit without ever being told one existed. Polite so\n // it waits for a pause instead of interrupting every keystroke, and\n // atomic so \"18/20\" is read as one figure rather than a changed digit.\n this.counterEl.setAttribute('aria-live', 'polite');\n this.counterEl.setAttribute('aria-atomic', 'true');\n this.counterEl.style.fontSize = '12px';\n this.counterEl.style.height = '1';\n this.el.parentElement.appendChild(this.counterEl);\n }\n\n _removeCounter() {\n this.counterEl.remove();\n }\n\n updateCounter = () => {\n const maxLength = parseInt(this.el.getAttribute('maxlength')),\n actualLength = this.el.value.length;\n\n this.isValidLength = actualLength <= maxLength;\n let counterString = actualLength.toString();\n if (maxLength) {\n counterString += '/' + maxLength;\n this._validateInput();\n }\n this.counterEl.textContent = counterString;\n };\n\n _validateInput() {\n if (this.isValidLength && this.isInvalid) {\n this.isInvalid = false;\n this.el.classList.remove('invalid');\n } else if (!this.isValidLength && !this.isInvalid) {\n this.isInvalid = true;\n this.el.classList.remove('valid');\n this.el.classList.add('invalid');\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAGA,IAAM,YAAY,OAAO,OAAO,CAAC,CAAC;AAI3B,IAAM,mBAAN,cAA+B,UAAuB;AAAA,EAS3D,YAAY,IAA4C,SAA+B;AACrF,UAAM,IAAI,OAAO;AAkDnB,yBAAgB,MAAM;AACpB,YAAM,YAAY,SAAS,KAAK,GAAG,aAAa,WAAW,CAAC,GAC1D,eAAe,KAAK,GAAG,MAAM;AAE/B,WAAK,gBAAgB,gBAAgB;AACrC,UAAI,gBAAgB,aAAa,SAAS;AAC1C,UAAI,WAAW;AACb,yBAAiB,MAAM;AACvB,aAAK,eAAe;AAAA,MACtB;AACA,WAAK,UAAU,cAAc;AAAA,IAC/B;AA3DE,SAAK,YAAY;AACjB,SAAK,gBAAgB;AAErB,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAEzB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAW,WAAwB;AACjC,WAAO;AAAA,EACT;AAAA,EAIA,UAAU;AACR,UAAM,QAAQ;AACd,SAAK,eAAe;AACpB,QAAI,KAAK,UAAW,MAAK,GAAG,UAAU,OAAO,SAAS;AAAA,EACxD;AAAA,EAEA,sBAAsB;AACpB,UAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,KAAK,QAAQ,OAAO;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,OAAO;AAC7D,SAAK,GAAG,iBAAiB,SAAS,KAAK,eAAe,OAAO;AAE7D,mBAAe,KAAK,IAAI,KAAK,eAAe,KAAK,QAAQ,MAAM;AAAA,EACjE;AAAA,EAEA,gBAAgB;AACd,SAAK,YAAY,SAAS,cAAc,MAAM;AAC9C,SAAK,UAAU,UAAU,IAAI,mBAAmB;AAMhD,SAAK,UAAU,aAAa,aAAa,QAAQ;AACjD,SAAK,UAAU,aAAa,eAAe,MAAM;AACjD,SAAK,UAAU,MAAM,WAAW;AAChC,SAAK,UAAU,MAAM,SAAS;AAC9B,SAAK,GAAG,cAAc,YAAY,KAAK,SAAS;AAAA,EAClD;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU,OAAO;AAAA,EACxB;AAAA,EAeA,iBAAiB;AACf,QAAI,KAAK,iBAAiB,KAAK,WAAW;AACxC,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,SAAS;AAAA,IACpC,WAAW,CAAC,KAAK,iBAAiB,CAAC,KAAK,WAAW;AACjD,WAAK,YAAY;AACjB,WAAK,GAAG,UAAU,OAAO,OAAO;AAChC,WAAK,GAAG,UAAU,IAAI,SAAS;AAAA,IACjC;AAAA,EACF;AACF;AAnFa,iBAyBJ,MAAM;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|