@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,9 +1,9 @@
|
|
|
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
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
7
7
|
|
|
8
8
|
// src/ts/components/mapView.ts
|
|
9
9
|
var OPENFREEMAP = "https://tiles.openfreemap.org/styles/";
|
|
@@ -14,7 +14,14 @@ var _defaults = {
|
|
|
14
14
|
zoom: 1,
|
|
15
15
|
mapOptions: {}
|
|
16
16
|
};
|
|
17
|
-
var
|
|
17
|
+
var isLngLat = (value) => value.length === 2 && value.every(Number.isFinite) && Math.abs(value[1]) <= 90;
|
|
18
|
+
var lngLat = (el) => {
|
|
19
|
+
const value = el.dataset.lngLat.split(",").map((part) => part.trim() ? Number(part) : NaN);
|
|
20
|
+
if (isLngLat(value)) return value;
|
|
21
|
+
console.warn(`MapView skipped data-lng-lat="${el.dataset.lngLat}": expected "longitude,latitude".`, el);
|
|
22
|
+
return null;
|
|
23
|
+
};
|
|
24
|
+
var positioned = (elements) => elements.map((el) => [el, lngLat(el)]).filter((pair) => pair[1] !== null);
|
|
18
25
|
function arc([x0, y0], [x2, y2], steps = 32) {
|
|
19
26
|
const bow = x2 >= x0 ? 0.25 : -0.25;
|
|
20
27
|
const x1 = (x0 + x2) / 2 - (y2 - y0) * bow;
|
|
@@ -24,10 +31,15 @@ function arc([x0, y0], [x2, y2], steps = 32) {
|
|
|
24
31
|
return [u * u * x0 + 2 * u * t * x1 + t * t * x2, u * u * y0 + 2 * u * t * y1 + t * t * y2];
|
|
25
32
|
});
|
|
26
33
|
}
|
|
27
|
-
var
|
|
34
|
+
var ARROWS = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, -1], ArrowDown: [0, 1] };
|
|
35
|
+
var plainArrow = (e) => Utils.plainKey(e) ? ARROWS[e.key] : void 0;
|
|
36
|
+
var MapView = class extends Component {
|
|
28
37
|
constructor(el, options) {
|
|
29
|
-
super(el, options
|
|
30
|
-
/**
|
|
38
|
+
super(el, options);
|
|
39
|
+
/**
|
|
40
|
+
* The MapLibre map, with the full type of the `maplibregl` passed to the
|
|
41
|
+
* constructor; `init()` and `getInstance()` see the `MapInstance` subset.
|
|
42
|
+
*/
|
|
31
43
|
this.map = null;
|
|
32
44
|
/** The MapLibre markers made from `.map-marker` children, in order. */
|
|
33
45
|
this.markers = [];
|
|
@@ -38,11 +50,27 @@ var MapView = class _MapView extends Component {
|
|
|
38
50
|
this._styleReady = false;
|
|
39
51
|
this._dark = false;
|
|
40
52
|
this._location = null;
|
|
41
|
-
this._media = null;
|
|
42
53
|
this._observer = null;
|
|
43
54
|
// Looked up once: `move` fires every frame of a pan or zoom.
|
|
44
55
|
this._zoomIn = [];
|
|
45
56
|
this._zoomOut = [];
|
|
57
|
+
// The draggable marker a tap picked up, waiting for the tap that drops it.
|
|
58
|
+
this._picked = null;
|
|
59
|
+
// The marker whose drag just ended, so the click that follows does not pick it up.
|
|
60
|
+
this._dragged = null;
|
|
61
|
+
// Undoes what the map added to the page's markup, for destroy().
|
|
62
|
+
this._restore = [];
|
|
63
|
+
this._actions = {
|
|
64
|
+
"zoom-in": () => this.map.zoomIn(),
|
|
65
|
+
"zoom-out": () => this.map.zoomOut(),
|
|
66
|
+
compass: () => this.map.resetNorthPitch(),
|
|
67
|
+
locate: (button) => this._locate(button),
|
|
68
|
+
fullscreen: () => this._toggleFullscreen(),
|
|
69
|
+
"pan-up": () => this._pan(0, -1),
|
|
70
|
+
"pan-down": () => this._pan(0, 1),
|
|
71
|
+
"pan-left": () => this._pan(-1, 0),
|
|
72
|
+
"pan-right": () => this._pan(1, 0)
|
|
73
|
+
};
|
|
46
74
|
this._handleStyleLoad = () => {
|
|
47
75
|
this._styleReady = true;
|
|
48
76
|
for (const overlay of this._overlays.values()) overlay.draw();
|
|
@@ -68,39 +96,19 @@ var MapView = class _MapView extends Component {
|
|
|
68
96
|
this._handleClick = (e) => {
|
|
69
97
|
const target = e.target;
|
|
70
98
|
const button = target.closest(".map-controls [data-action]");
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
else if (action === "zoom-out") this.map.zoomOut();
|
|
74
|
-
else if (action === "compass") this.map.resetNorthPitch();
|
|
75
|
-
else if (action === "locate") this._locate(button);
|
|
76
|
-
else if (action === "fullscreen") {
|
|
77
|
-
if (document.fullscreenElement === this.el) document.exitFullscreen();
|
|
78
|
-
else this.el.requestFullscreen();
|
|
79
|
-
} else {
|
|
80
|
-
const marker = target.closest(".map-marker");
|
|
81
|
-
if (this._markerPopups.has(marker)) this._toggle(marker);
|
|
82
|
-
}
|
|
99
|
+
if (button) this._actions[button.dataset.action]?.(button);
|
|
100
|
+
else this._tapMarker(target.closest(".map-marker"));
|
|
83
101
|
};
|
|
84
102
|
// A click on the map closes marker popups, but not the one being toggled.
|
|
85
103
|
this._handleMapClick = (e) => {
|
|
86
104
|
const target = e.originalEvent.target;
|
|
105
|
+
this._drop(target, e.lngLat);
|
|
87
106
|
for (const [marker, popup] of this._markerPopups) {
|
|
88
107
|
if (!marker.contains(target) && !popup.getElement()?.contains(target)) popup.remove();
|
|
89
108
|
}
|
|
90
109
|
};
|
|
91
110
|
this._handleKeydown = (e) => {
|
|
92
|
-
if (e.key
|
|
93
|
-
for (const popup of this._popups) {
|
|
94
|
-
if (popup.getElement()?.contains(e.target)) {
|
|
95
|
-
e.preventDefault();
|
|
96
|
-
popup.remove();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
this.el["Expressive_MapView"] = this;
|
|
101
|
-
this.options = {
|
|
102
|
-
..._MapView.defaults,
|
|
103
|
-
...options
|
|
111
|
+
if (e.key === "Escape") this._escape(e);
|
|
104
112
|
};
|
|
105
113
|
const lib = this.options.maplibregl;
|
|
106
114
|
if (!lib) {
|
|
@@ -111,60 +119,50 @@ var MapView = class _MapView extends Component {
|
|
|
111
119
|
this._zoomIn = [...this._buttons("zoom-in")];
|
|
112
120
|
this._zoomOut = [...this._buttons("zoom-out")];
|
|
113
121
|
this._dark = this._isDark();
|
|
114
|
-
|
|
122
|
+
const init = {
|
|
115
123
|
...this.options.mapOptions,
|
|
116
124
|
container: el,
|
|
117
125
|
style: this._style(),
|
|
118
126
|
center: this.options.center,
|
|
119
127
|
zoom: this.options.zoom
|
|
120
|
-
}
|
|
128
|
+
};
|
|
129
|
+
this.map = new lib.Map(init);
|
|
121
130
|
this.map.on("style.load", this._handleStyleLoad);
|
|
122
131
|
this.map.on("move", this._sync);
|
|
123
132
|
this.map.on("click", this._handleMapClick);
|
|
124
133
|
const children = this._children.filter((child) => child instanceof HTMLElement);
|
|
125
134
|
const claimed = /* @__PURE__ */ new Set();
|
|
126
|
-
for (const marker of children.filter((child) => child.matches(".map-marker[data-lng-lat]"))) {
|
|
135
|
+
for (const [marker, at] of positioned(children.filter((child) => child.matches(".map-marker[data-lng-lat]")))) {
|
|
127
136
|
const target = marker.hasAttribute("aria-controls") ? Utils.getElementById(marker, marker.getAttribute("aria-controls")) : null;
|
|
128
137
|
const popup = target?.parentElement === el && target.matches(".map-popup") ? target : null;
|
|
129
138
|
if (popup) claimed.add(popup);
|
|
130
|
-
this._addMarker(marker, popup);
|
|
139
|
+
this._addMarker(marker, popup, at);
|
|
131
140
|
}
|
|
132
|
-
for (const popup of children.filter((child) => child.matches(".map-popup[data-lng-lat]") && !claimed.has(child))) {
|
|
133
|
-
this._popup(popup, 0).setLngLat(
|
|
141
|
+
for (const [popup, at] of positioned(children.filter((child) => child.matches(".map-popup[data-lng-lat]") && !claimed.has(child)))) {
|
|
142
|
+
this._popup(popup, 0).setLngLat(at).addTo(this.map);
|
|
134
143
|
}
|
|
144
|
+
const { signal } = this._events;
|
|
135
145
|
if (this._themed()) {
|
|
136
|
-
|
|
137
|
-
this._media.addEventListener("change", this._handleScheme);
|
|
146
|
+
matchMedia("(prefers-color-scheme: dark)").addEventListener("change", this._handleScheme, { signal });
|
|
138
147
|
this._observer = new MutationObserver(this._handleScheme);
|
|
139
148
|
this._observer.observe(document.documentElement, { attributes: true, attributeFilter: ["theme"], subtree: true });
|
|
140
149
|
}
|
|
141
150
|
for (const button of this._buttons("fullscreen")) button.hidden = !document.fullscreenEnabled;
|
|
142
|
-
document.addEventListener("fullscreenchange", this._handleFullscreen);
|
|
143
|
-
el.addEventListener("click", this._handleClick);
|
|
144
|
-
el.addEventListener("keydown", this._handleKeydown);
|
|
151
|
+
document.addEventListener("fullscreenchange", this._handleFullscreen, { signal });
|
|
152
|
+
el.addEventListener("click", this._handleClick, { signal });
|
|
153
|
+
el.addEventListener("keydown", this._handleKeydown, { signal });
|
|
145
154
|
this._sync();
|
|
146
155
|
}
|
|
147
|
-
static get defaults() {
|
|
148
|
-
return _defaults;
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Initializes instances of MapView.
|
|
152
|
-
* @param els HTML elements.
|
|
153
|
-
* @param options Component options.
|
|
154
|
-
*/
|
|
155
156
|
static init(els, options = {}) {
|
|
156
|
-
return super.init(els, options
|
|
157
|
+
return super.init.call(this, els, options);
|
|
157
158
|
}
|
|
158
|
-
static
|
|
159
|
-
return
|
|
159
|
+
static get defaults() {
|
|
160
|
+
return _defaults;
|
|
160
161
|
}
|
|
161
162
|
destroy() {
|
|
162
|
-
|
|
163
|
+
super.destroy();
|
|
163
164
|
if (!this.map) return;
|
|
164
|
-
this.
|
|
165
|
-
this.el.removeEventListener("keydown", this._handleKeydown);
|
|
166
|
-
document.removeEventListener("fullscreenchange", this._handleFullscreen);
|
|
167
|
-
this._media?.removeEventListener("change", this._handleScheme);
|
|
165
|
+
this._releaseMarkers();
|
|
168
166
|
this._observer?.disconnect();
|
|
169
167
|
for (const overlay of this._overlays.values()) overlay.off?.();
|
|
170
168
|
for (const popup of this._popups) popup.remove();
|
|
@@ -209,8 +207,9 @@ var MapView = class _MapView extends Component {
|
|
|
209
207
|
const clusters = `${id}-clusters`, points = `${id}-points`;
|
|
210
208
|
const zoomIn = async (e) => {
|
|
211
209
|
const [feature] = e.features;
|
|
212
|
-
const
|
|
213
|
-
|
|
210
|
+
const source = this.map.getSource(id);
|
|
211
|
+
const zoom = await source.getClusterExpansionZoom(feature.properties.cluster_id).catch(() => null);
|
|
212
|
+
if (zoom !== null) this.map?.easeTo({ center: feature.geometry.coordinates, zoom });
|
|
214
213
|
};
|
|
215
214
|
const pointer = () => {
|
|
216
215
|
this.map.getCanvas().style.cursor = "pointer";
|
|
@@ -309,16 +308,13 @@ var MapView = class _MapView extends Component {
|
|
|
309
308
|
this._overlays.set(id, overlay);
|
|
310
309
|
if (this._styleReady) overlay.draw();
|
|
311
310
|
}
|
|
312
|
-
_addMarker(element, content) {
|
|
311
|
+
_addMarker(element, content, at) {
|
|
313
312
|
const marker = new this.options.maplibregl.Marker({
|
|
314
313
|
element,
|
|
315
314
|
draggable: element.hasAttribute("data-draggable")
|
|
316
|
-
}).setLngLat(
|
|
317
|
-
marker.on("dragend", () =>
|
|
318
|
-
|
|
319
|
-
element.dataset.lngLat = `${lng},${lat}`;
|
|
320
|
-
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
321
|
-
});
|
|
315
|
+
}).setLngLat(at).addTo(this.map);
|
|
316
|
+
marker.on("dragend", () => this._moved(marker));
|
|
317
|
+
if (element.hasAttribute("data-draggable")) this._makeMovable(element, marker);
|
|
322
318
|
this.markers.push(marker);
|
|
323
319
|
if (!content) return;
|
|
324
320
|
element.setAttribute("aria-expanded", "false");
|
|
@@ -330,6 +326,70 @@ var MapView = class _MapView extends Component {
|
|
|
330
326
|
});
|
|
331
327
|
this._markerPopups.set(element, popup);
|
|
332
328
|
}
|
|
329
|
+
/** A marker moved: its `data-lng-lat` holds the new place, and it fires `change`. */
|
|
330
|
+
_moved(marker) {
|
|
331
|
+
const element = marker.getElement();
|
|
332
|
+
const { lng, lat } = marker.getLngLat();
|
|
333
|
+
element.dataset.lngLat = `${lng},${lat}`;
|
|
334
|
+
element.dispatchEvent(new Event("change", { bubbles: true }));
|
|
335
|
+
}
|
|
336
|
+
// A drag is not the only way to move it (WCAG 2.5.7): a tap picks it up,
|
|
337
|
+
// and the arrow keys nudge it. A button is already a control; anything
|
|
338
|
+
// else becomes one, and destroy() takes that back off.
|
|
339
|
+
_makeMovable(element, marker) {
|
|
340
|
+
const added = element instanceof HTMLButtonElement ? [] : ["role", "tabindex"].filter((name) => !element.hasAttribute(name));
|
|
341
|
+
if (added.includes("role")) element.setAttribute("role", "button");
|
|
342
|
+
if (added.includes("tabindex")) element.tabIndex = 0;
|
|
343
|
+
element.setAttribute("aria-pressed", "false");
|
|
344
|
+
this._restore.push(() => ["aria-pressed", ...added].forEach((name) => element.removeAttribute(name)));
|
|
345
|
+
element.addEventListener("keydown", (e) => this._nudge(e, marker), { signal: this._events.signal });
|
|
346
|
+
marker.on("dragstart", () => this._dragged = element);
|
|
347
|
+
marker.on("dragend", () => setTimeout(() => {
|
|
348
|
+
this._dragged = null;
|
|
349
|
+
}));
|
|
350
|
+
}
|
|
351
|
+
/** Takes back the attributes `_makeMovable()` added. Destroy removes its listeners. */
|
|
352
|
+
_releaseMarkers() {
|
|
353
|
+
this._restore.splice(0).forEach((undo) => undo());
|
|
354
|
+
this._picked = null;
|
|
355
|
+
}
|
|
356
|
+
/** The arrow keys move a focused draggable marker 10px, and the map stays put. */
|
|
357
|
+
_nudge(e, marker) {
|
|
358
|
+
const step = plainArrow(e);
|
|
359
|
+
if (!step) return;
|
|
360
|
+
e.preventDefault();
|
|
361
|
+
e.stopPropagation();
|
|
362
|
+
const at = this.map.project(marker.getLngLat());
|
|
363
|
+
marker.setLngLat(this.map.unproject([at.x + step[0] * 10, at.y + step[1] * 10]));
|
|
364
|
+
this._moved(marker);
|
|
365
|
+
}
|
|
366
|
+
/** Picks a marker up, or puts down the one already picked up. */
|
|
367
|
+
_pick(element) {
|
|
368
|
+
this._picked?.setAttribute("aria-pressed", "false");
|
|
369
|
+
this._picked = element;
|
|
370
|
+
element?.setAttribute("aria-pressed", "true");
|
|
371
|
+
}
|
|
372
|
+
// A tap on a draggable marker picks it up, or puts it back down; the click
|
|
373
|
+
// that ends a drag does neither.
|
|
374
|
+
_tapMarker(element) {
|
|
375
|
+
if (element?.matches("[data-draggable][aria-pressed]")) this._tapMovable(element);
|
|
376
|
+
else if (this._markerPopups.has(element)) this._toggle(element);
|
|
377
|
+
}
|
|
378
|
+
_tapMovable(element) {
|
|
379
|
+
if (this._dragged !== element) this._pick(this._picked === element ? null : element);
|
|
380
|
+
}
|
|
381
|
+
/** A third of the map's width or height in a direction. */
|
|
382
|
+
_pan(x, y) {
|
|
383
|
+
const { width, height } = this.el.getBoundingClientRect();
|
|
384
|
+
this.map.panBy([x * width / 3, y * height / 3]);
|
|
385
|
+
}
|
|
386
|
+
// Either can be refused (an iframe without allowfullscreen, say). The
|
|
387
|
+
// button state follows fullscreenchange, so there is nothing to undo.
|
|
388
|
+
_toggleFullscreen() {
|
|
389
|
+
const request = document.fullscreenElement === this.el ? document.exitFullscreen() : this.el.requestFullscreen();
|
|
390
|
+
request.catch(() => {
|
|
391
|
+
});
|
|
392
|
+
}
|
|
333
393
|
_popup(content, offset) {
|
|
334
394
|
const popup = new this.options.maplibregl.Popup({ closeOnClick: false, maxWidth: "none", offset }).setDOMContent(content);
|
|
335
395
|
this._popups.push(popup);
|
|
@@ -380,16 +440,39 @@ var MapView = class _MapView extends Component {
|
|
|
380
440
|
_isDark() {
|
|
381
441
|
return this._color("light-dark(black, white)") === "rgba(255, 255, 255, 1)";
|
|
382
442
|
}
|
|
383
|
-
_themed() {
|
|
384
|
-
const style = this.options.style;
|
|
443
|
+
_themed(style = this.options.style) {
|
|
385
444
|
return typeof style === "object" && "light" in style && "dark" in style;
|
|
386
445
|
}
|
|
387
446
|
_style() {
|
|
388
|
-
|
|
447
|
+
const style = this.options.style;
|
|
448
|
+
return this._themed(style) ? style[this._dark ? "dark" : "light"] : style;
|
|
449
|
+
}
|
|
450
|
+
// A tap on the map, not on a marker, puts a picked-up marker there.
|
|
451
|
+
_drop(target, at) {
|
|
452
|
+
if (!this._picked || target.closest?.(".map-marker")) return;
|
|
453
|
+
const marker = this.markers.find((m) => m.getElement() === this._picked);
|
|
454
|
+
marker.setLngLat(at);
|
|
455
|
+
this._moved(marker);
|
|
456
|
+
this._pick(null);
|
|
457
|
+
}
|
|
458
|
+
// Escape puts down a picked-up marker first, then closes a popup.
|
|
459
|
+
_escape(e) {
|
|
460
|
+
if (this._picked) {
|
|
461
|
+
e.preventDefault();
|
|
462
|
+
this._pick(null);
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
for (const popup of this._popups) {
|
|
466
|
+
if (popup.getElement()?.contains(e.target)) {
|
|
467
|
+
e.preventDefault();
|
|
468
|
+
popup.remove();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
389
471
|
}
|
|
390
472
|
};
|
|
473
|
+
MapView.key = "Expressive_MapView";
|
|
391
474
|
|
|
392
475
|
export {
|
|
393
476
|
MapView
|
|
394
477
|
};
|
|
395
|
-
//# sourceMappingURL=chunk-
|
|
478
|
+
//# sourceMappingURL=chunk-QRO5FV3I.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/mapView.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions, InitElement, InitElements } from '../core/component';\n\n/** `[longitude, latitude]`, MapLibre's order. */\nexport type LngLat = [number, number];\n\n/**\n * The parts of the `maplibre-gl` module this component uses. Declared here so\n * the published types do not depend on MapLibre.\n */\nexport interface MapLibre {\n Map: new (options: MapInit) => MapInstance;\n Marker: new (options: object) => MapMarker;\n Popup: new (options: object) => MapPopup;\n}\n\n/**\n * What `new Map()` gets. Only the container is declared; the style, center,\n * zoom and `mapOptions` ride along, and MapLibre types them itself.\n */\nexport interface MapInit {\n container: HTMLElement;\n}\n\n/** A point on the map, as MapLibre hands it back. */\nexport interface MapLngLat {\n lng: number;\n lat: number;\n}\n\n/** A map click, with the DOM event behind it and, on a layer, the features hit. */\nexport interface MapMouseEvent {\n originalEvent: MouseEvent;\n lngLat: MapLngLat;\n features?: Array<{ properties: Record<string, unknown>; geometry: { coordinates: LngLat } }>;\n}\n\nexport interface MapMarker {\n getElement(): HTMLElement;\n getLngLat(): MapLngLat;\n setLngLat(at: LngLat | MapLngLat): this;\n addTo(map: MapInstance): this;\n on(event: 'dragstart' | 'dragend', callback: () => void): unknown;\n remove(): unknown;\n}\n\nexport interface MapPopup {\n getElement(): HTMLElement | undefined;\n setDOMContent(content: Node): this;\n setLngLat(at: LngLat | MapLngLat): this;\n addTo(map: MapInstance): this;\n isOpen(): boolean;\n on(event: 'open' | 'close', callback: () => void): unknown;\n remove(): unknown;\n}\n\n/** A style layer, as `getStyle()` lists them. */\nexport interface MapLayer {\n id: string;\n source?: string;\n layout?: Record<string, unknown>;\n}\n\n/** A source, as `getSource()` returns it. */\nexport interface MapSource {\n type: string;\n}\n\n/** A clustered GeoJSON source, which is what `addClusters()` registers. */\nexport interface MapClusterSource extends MapSource {\n getClusterExpansionZoom(clusterId: unknown): Promise<number>;\n}\n\n/** The parts of a `maplibre-gl` `Map` this component calls. */\nexport interface MapInstance {\n on(event: string, listener: (e: MapMouseEvent) => void): unknown;\n on(event: string, layer: string, listener: (e: MapMouseEvent) => void): unknown;\n off(event: string, layer: string, listener: (e: MapMouseEvent) => void): unknown;\n remove(): void;\n zoomIn(): unknown;\n zoomOut(): unknown;\n resetNorthPitch(): unknown;\n getZoom(): number;\n getMinZoom(): number;\n getMaxZoom(): number;\n getBearing(): number;\n getCanvas(): HTMLCanvasElement;\n getStyle(): { glyphs?: string; layers: MapLayer[] };\n setStyle(style: string | object | null, options?: { diff?: boolean }): unknown;\n getSource(id: string): MapSource | undefined;\n addSource(id: string, source: object): unknown;\n removeSource(id: string): unknown;\n addLayer(layer: object): unknown;\n removeLayer(id: string): unknown;\n project(at: MapLngLat): { x: number; y: number };\n unproject(point: [number, number]): MapLngLat;\n panBy(offset: [number, number]): unknown;\n flyTo(options: { center: LngLat; zoom: number }): unknown;\n easeTo(options: { center: LngLat; zoom: number }): unknown;\n}\n\n/** A style for each color scheme. The map follows the page's theme. */\nexport interface MapThemedStyle {\n light: string | object;\n dark: string | object;\n}\n\nexport interface MapViewOptions<L extends MapLibre = MapLibre> extends BaseOptions {\n /**\n * The `maplibre-gl` module. ExpressiveCSS does not bundle MapLibre, so the\n * page imports it and passes it in.\n * @default null\n */\n maplibregl: L | null;\n /**\n * A MapLibre style URL or object, or `{ light, dark }` to follow the theme.\n * @default OpenFreeMap Positron and Dark\n */\n style: string | object | MapThemedStyle;\n /**\n * Starting `[longitude, latitude]`.\n * @default [0, 20]\n */\n center: LngLat;\n /**\n * Starting zoom level.\n * @default 1\n */\n zoom: number;\n /**\n * More MapLibre `Map` options, such as `maxZoom` or `bearing`.\n * @default {}\n */\n mapOptions: object;\n}\n\nexport interface MapLineOptions {\n /** CSS color. Defaults to the route or arc color token. */\n color?: string;\n /** Width in pixels. Routes default to 4, arcs to 2. */\n width?: number;\n /** 0 to 1. */\n opacity?: number;\n /** Dash and gap lengths in line widths, such as `[2, 2]`. */\n dashArray?: number[];\n}\n\nexport interface MapArc {\n from: LngLat;\n to: LngLat;\n}\n\nexport interface MapClusterOptions {\n /** CSS color. Defaults to the cluster color token. */\n color?: string;\n /**\n * Pixels within which points join a cluster.\n * @default 50\n */\n radius?: number;\n /**\n * Last zoom level that clusters points.\n * @default 14\n */\n maxZoom?: number;\n}\n\nconst OPENFREEMAP = 'https://tiles.openfreemap.org/styles/';\n\nconst _defaults: MapViewOptions = {\n maplibregl: null,\n style: { light: `${OPENFREEMAP}positron`, dark: `${OPENFREEMAP}dark` },\n center: [0, 20],\n zoom: 1,\n mapOptions: {}\n};\n\ntype Overlay = { draw: () => void; off?: () => void };\n\nconst isLngLat = (value: number[]): value is LngLat =>\n value.length === 2 && value.every(Number.isFinite) && Math.abs(value[1]) <= 90;\n\n// MapLibre throws on a bad position only after the map exists, which leaked\n// the map and stopped every later element in the same init(). A value that\n// is not \"lng,lat\", such as Google's lat,lng order past 90, is skipped.\nconst lngLat = (el: HTMLElement): LngLat | null => {\n // Number('') is 0, so an empty part (\"12.5,\") becomes NaN and fails.\n const value = el.dataset.lngLat.split(',').map((part) => (part.trim() ? Number(part) : NaN));\n if (isLngLat(value)) return value;\n console.warn(`MapView skipped data-lng-lat=\"${el.dataset.lngLat}\": expected \"longitude,latitude\".`, el);\n return null;\n};\n\n/** The elements with a usable `data-lng-lat`, each paired with its position. */\nconst positioned = (elements: HTMLElement[]) =>\n elements.map((el) => [el, lngLat(el)] as const).filter((pair): pair is readonly [HTMLElement, LngLat] => pair[1] !== null);\n\n// A quadratic B\u00E9zier from `from` to `to`, bowed north of an eastward line.\n// ponytail: drawn in degrees, so an arc across the antimeridian goes the long\n// way round; split it at \u00B1180 if that matters.\nfunction arc([x0, y0]: LngLat, [x2, y2]: LngLat, steps = 32): LngLat[] {\n const bow = x2 >= x0 ? 0.25 : -0.25;\n const x1 = (x0 + x2) / 2 - (y2 - y0) * bow;\n const y1 = (y0 + y2) / 2 + (x2 - x0) * bow;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps, u = 1 - t;\n return [u * u * x0 + 2 * u * t * x1 + t * t * x2, u * u * y0 + 2 * u * t * y1 + t * t * y2];\n });\n}\n\n// How far each arrow key nudges a focused draggable marker, in steps.\nconst ARROWS: Record<string, [number, number]> = { ArrowLeft: [-1, 0], ArrowRight: [1, 0], ArrowUp: [0, -1], ArrowDown: [0, 1] };\nconst plainArrow = (e: KeyboardEvent) => (Utils.plainKey(e) ? ARROWS[e.key] : undefined);\n\n/**\n * An interactive map built on MapLibre: a `.map` holding `.map-marker`,\n * `.map-popup` and `.map-controls` children.\n *\n * Each marker sits at its `data-lng-lat`. A marker button with\n * `aria-controls` opens the `.map-popup` it names; a popup with its own\n * `data-lng-lat` and no marker opens at init. Buttons in `.map-controls`\n * run their `data-action`: `zoom-in`, `zoom-out`, `compass`, `locate`,\n * `fullscreen` or `pan-up`, `pan-down`, `pan-left` and `pan-right`. A\n * `data-draggable` marker moves without a drag too: a tap picks it up and\n * the next tap on the map drops it, and the arrow keys nudge it. Routes, arcs and clusters are data, so they are added from\n * script. The default style follows the page's light or dark theme, and\n * line and cluster colors come from the theme.\n *\n * The class is `MapView` rather than `Map` so importing it does not shadow\n * JavaScript's `Map`.\n */\nexport class MapView<L extends MapLibre = MapLibre> extends Component<MapViewOptions<L>> {\n /**\n * The MapLibre map, with the full type of the `maplibregl` passed to the\n * constructor; `init()` and `getInstance()` see the `MapInstance` subset.\n */\n map: InstanceType<L['Map']> | null = null;\n /** The MapLibre markers made from `.map-marker` children, in order. */\n markers: MapMarker[] = [];\n private _children: Element[] = [];\n private _popups: MapPopup[] = [];\n private _markerPopups = new Map<HTMLElement, MapPopup>();\n private _overlays = new Map<string, Overlay>();\n private _styleReady = false;\n private _dark = false;\n private _location: MapMarker | null = null;\n private _observer: MutationObserver | null = null;\n // Looked up once: `move` fires every frame of a pan or zoom.\n private _zoomIn: HTMLButtonElement[] = [];\n private _zoomOut: HTMLButtonElement[] = [];\n // The draggable marker a tap picked up, waiting for the tap that drops it.\n private _picked: HTMLElement | null = null;\n // The marker whose drag just ended, so the click that follows does not pick it up.\n private _dragged: HTMLElement | null = null;\n // Undoes what the map added to the page's markup, for destroy().\n private _restore: (() => void)[] = [];\n private _actions: Record<string, (button: HTMLButtonElement) => void> = {\n 'zoom-in': () => this.map.zoomIn(),\n 'zoom-out': () => this.map.zoomOut(),\n compass: () => this.map.resetNorthPitch(),\n locate: (button) => this._locate(button),\n fullscreen: () => this._toggleFullscreen(),\n 'pan-up': () => this._pan(0, -1),\n 'pan-down': () => this._pan(0, 1),\n 'pan-left': () => this._pan(-1, 0),\n 'pan-right': () => this._pan(1, 0)\n };\n\n /** Initializes a map, typed by the `maplibregl` passed in. */\n static init<L extends MapLibre>(this: typeof MapView, el: HTMLElement, options?: Partial<MapViewOptions<L>>): MapView<L>;\n /** Initializes a map on each element, typed by the `maplibregl` passed in. */\n static init<L extends MapLibre>(this: typeof MapView, els: InitElements<InitElement>, options?: Partial<MapViewOptions<L>>): MapView<L>[];\n static init(els: HTMLElement | InitElements<InitElement>, options: Partial<MapViewOptions> = {}): MapView | MapView[] {\n return super.init.call(this, els as InitElements<InitElement>, options);\n }\n\n constructor(el: HTMLElement, options: Partial<MapViewOptions<L>>) {\n super(el, options);\n const lib = this.options.maplibregl;\n if (!lib) {\n console.error('MapView needs the maplibre-gl module in options.maplibregl.');\n return;\n }\n\n this._children = [...el.children];\n this._zoomIn = [...this._buttons('zoom-in')];\n this._zoomOut = [...this._buttons('zoom-out')];\n this._dark = this._isDark();\n const init = {\n ...this.options.mapOptions,\n container: el,\n style: this._style(),\n center: this.options.center,\n zoom: this.options.zoom\n };\n // `new` on a generic constructor yields the constraint, not L's instance.\n this.map = new lib.Map(init) as InstanceType<L['Map']>;\n this.map.on('style.load', this._handleStyleLoad);\n this.map.on('move', this._sync);\n this.map.on('click', this._handleMapClick);\n\n const children = this._children.filter((child): child is HTMLElement => child instanceof HTMLElement);\n const claimed = new Set<Element>();\n for (const [marker, at] of positioned(children.filter((child) => child.matches('.map-marker[data-lng-lat]')))) {\n const target = marker.hasAttribute('aria-controls') ? Utils.getElementById(marker, marker.getAttribute('aria-controls')) : null;\n const popup = target?.parentElement === el && target.matches('.map-popup') ? target : null;\n if (popup) claimed.add(popup);\n this._addMarker(marker, popup, at);\n }\n for (const [popup, at] of positioned(children.filter((child) => child.matches('.map-popup[data-lng-lat]') && !claimed.has(child)))) {\n this._popup(popup, 0).setLngLat(at).addTo(this.map);\n }\n\n const { signal } = this._events;\n if (this._themed()) {\n matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this._handleScheme, { signal });\n this._observer = new MutationObserver(this._handleScheme);\n this._observer.observe(document.documentElement, { attributes: true, attributeFilter: ['theme'], subtree: true });\n }\n for (const button of this._buttons('fullscreen')) button.hidden = !document.fullscreenEnabled;\n document.addEventListener('fullscreenchange', this._handleFullscreen, { signal });\n el.addEventListener('click', this._handleClick, { signal });\n el.addEventListener('keydown', this._handleKeydown, { signal });\n this._sync();\n }\n\n static get defaults(): MapViewOptions {\n return _defaults;\n }\n\n static key = 'Expressive_MapView';\n\n destroy() {\n super.destroy();\n if (!this.map) return;\n this._releaseMarkers();\n this._observer?.disconnect();\n for (const overlay of this._overlays.values()) overlay.off?.();\n for (const popup of this._popups) popup.remove();\n for (const marker of this.markers) {\n marker.remove();\n const element: HTMLElement = marker.getElement();\n element.classList.remove(...[...element.classList].filter((name) => name.startsWith('maplibregl-')));\n element.style.removeProperty('transform');\n element.style.removeProperty('opacity');\n if (element.hasAttribute('aria-controls')) element.removeAttribute('aria-expanded');\n }\n this._location?.remove();\n this._location = null;\n this.map.remove();\n this.map = null;\n this.markers = [];\n this._popups = [];\n this._markerPopups.clear();\n this._overlays.clear();\n this.el.style.removeProperty('--md-comp-map-bearing');\n for (const button of this.el.querySelectorAll<HTMLButtonElement>('.map-controls [data-action]')) {\n button.disabled = false;\n button.hidden = false;\n button.removeAttribute('aria-pressed');\n }\n this.el.append(...this._children);\n }\n\n /** Draws a line through `[longitude, latitude]` points. Replaces an overlay with the same id. */\n addRoute(id: string, coordinates: LngLat[], options: MapLineOptions = {}) {\n this._line(id, { type: 'LineString', coordinates }, 'route', { width: 4, ...options });\n }\n\n /** Draws a curved line for each `{ from, to }`. Replaces an overlay with the same id. */\n addArcs(id: string, arcs: MapArc[], options: MapLineOptions = {}) {\n this._line(id, { type: 'MultiLineString', coordinates: arcs.map(({ from, to }) => arc(from, to)) }, 'arc', { width: 2, ...options });\n }\n\n /**\n * Draws GeoJSON points, or the URL of a GeoJSON file, as clusters that\n * show their count and zoom in when clicked. The layers are\n * `${id}-clusters`, `${id}-count` and `${id}-points`.\n */\n addClusters(id: string, data: object | string, options: MapClusterOptions = {}) {\n const clusters = `${id}-clusters`, points = `${id}-points`;\n const zoomIn = async (e: MapMouseEvent) => {\n const [feature] = e.features;\n // `_draw` registered this id as a clustered GeoJSON source.\n const source = this.map.getSource(id) as MapClusterSource;\n // The data may have changed since the click, leaving no such cluster.\n const zoom = await source.getClusterExpansionZoom(feature.properties.cluster_id).catch((): null => null);\n // destroy() may have run while the zoom was looked up.\n if (zoom !== null) this.map?.easeTo({ center: feature.geometry.coordinates, zoom });\n };\n const pointer = () => { this.map.getCanvas().style.cursor = 'pointer'; };\n const reset = () => { this.map.getCanvas().style.cursor = ''; };\n const listen = (method: 'on' | 'off') => {\n this.map[method]('click', clusters, zoomIn);\n for (const layer of [clusters, points]) {\n this.map[method]('mouseenter', layer, pointer);\n this.map[method]('mouseleave', layer, reset);\n }\n };\n this._draw(id, {\n draw: () => {\n const color = options.color ?? this._color('var(--md-comp-map-cluster-color)');\n const surface = this._color('var(--md-comp-map-marker-ring-color)');\n this.map.addSource(id, {\n type: 'geojson',\n data,\n cluster: true,\n clusterRadius: options.radius ?? 50,\n clusterMaxZoom: options.maxZoom ?? 14\n });\n this.map.addLayer({\n id: clusters,\n type: 'circle',\n source: id,\n filter: ['has', 'point_count'],\n paint: {\n 'circle-color': color,\n 'circle-radius': ['step', ['get', 'point_count'], 16, 10, 20, 100, 26],\n 'circle-stroke-width': 6,\n 'circle-stroke-color': color,\n 'circle-stroke-opacity': 0.3\n }\n });\n // A symbol layer needs the style's glyphs and one of its fonts.\n const style = this.map.getStyle();\n const font = style.glyphs && style.layers.find((layer) => layer.layout?.['text-font'])?.layout['text-font'];\n if (font) {\n this.map.addLayer({\n id: `${id}-count`,\n type: 'symbol',\n source: id,\n filter: ['has', 'point_count'],\n layout: { 'text-field': ['get', 'point_count_abbreviated'], 'text-font': font, 'text-size': 12 },\n paint: { 'text-color': this._color('var(--md-comp-map-cluster-label-color)') }\n });\n }\n this.map.addLayer({\n id: points,\n type: 'circle',\n source: id,\n filter: ['!', ['has', 'point_count']],\n paint: { 'circle-color': color, 'circle-radius': 6, 'circle-stroke-width': 2, 'circle-stroke-color': surface }\n });\n },\n off: () => listen('off')\n });\n listen('on');\n }\n\n /** Removes a route, arcs or clusters added with this id. */\n removeOverlay(id: string) {\n const overlay = this._overlays.get(id);\n if (!overlay) return;\n this._overlays.delete(id);\n overlay.off?.();\n if (!this._styleReady || !this.map.getSource(id)) return;\n for (const layer of this.map.getStyle().layers) if (layer.source === id) this.map.removeLayer(layer.id);\n this.map.removeSource(id);\n }\n\n private _line(id: string, geometry: object, token: string, options: MapLineOptions) {\n this._draw(id, {\n draw: () => {\n this.map.addSource(id, { type: 'geojson', data: { type: 'Feature', properties: {}, geometry } });\n this.map.addLayer({\n id,\n type: 'line',\n source: id,\n layout: { 'line-cap': 'round', 'line-join': 'round' },\n paint: {\n 'line-color': options.color ?? this._color(`var(--md-comp-map-${token}-color)`),\n 'line-width': options.width,\n 'line-opacity': options.opacity ?? 1,\n ...(options.dashArray && { 'line-dasharray': options.dashArray })\n }\n });\n }\n });\n }\n\n // Sources and layers go with the style, so every overlay is drawn again\n // when a theme change swaps it.\n private _draw(id: string, overlay: Overlay) {\n this.removeOverlay(id);\n this._overlays.set(id, overlay);\n if (this._styleReady) overlay.draw();\n }\n\n private _addMarker(element: HTMLElement, content: HTMLElement | null, at: LngLat) {\n const marker = new this.options.maplibregl.Marker({\n element,\n draggable: element.hasAttribute('data-draggable')\n }).setLngLat(at).addTo(this.map);\n marker.on('dragend', () => this._moved(marker));\n if (element.hasAttribute('data-draggable')) this._makeMovable(element, marker);\n this.markers.push(marker);\n if (!content) return;\n element.setAttribute('aria-expanded', 'false');\n const popup = this._popup(content, 16);\n popup.on('open', () => element.setAttribute('aria-expanded', 'true'));\n popup.on('close', () => {\n element.setAttribute('aria-expanded', 'false');\n if (!document.activeElement || document.activeElement === document.body) element.focus();\n });\n this._markerPopups.set(element, popup);\n }\n\n /** A marker moved: its `data-lng-lat` holds the new place, and it fires `change`. */\n private _moved(marker: MapMarker) {\n const element: HTMLElement = marker.getElement();\n const { lng, lat } = marker.getLngLat();\n element.dataset.lngLat = `${lng},${lat}`;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n\n // A drag is not the only way to move it (WCAG 2.5.7): a tap picks it up,\n // and the arrow keys nudge it. A button is already a control; anything\n // else becomes one, and destroy() takes that back off.\n private _makeMovable(element: HTMLElement, marker: MapMarker) {\n const added = element instanceof HTMLButtonElement ? [] : ['role', 'tabindex'].filter((name) => !element.hasAttribute(name));\n if (added.includes('role')) element.setAttribute('role', 'button');\n if (added.includes('tabindex')) element.tabIndex = 0;\n element.setAttribute('aria-pressed', 'false');\n this._restore.push(() => ['aria-pressed', ...added].forEach((name) => element.removeAttribute(name)));\n element.addEventListener('keydown', (e) => this._nudge(e, marker), { signal: this._events.signal });\n marker.on('dragstart', () => (this._dragged = element));\n marker.on('dragend', () => setTimeout(() => { this._dragged = null; }));\n }\n\n /** Takes back the attributes `_makeMovable()` added. Destroy removes its listeners. */\n private _releaseMarkers() {\n this._restore.splice(0).forEach((undo) => undo());\n this._picked = null;\n }\n\n /** The arrow keys move a focused draggable marker 10px, and the map stays put. */\n private _nudge(e: KeyboardEvent, marker: MapMarker) {\n const step = plainArrow(e);\n if (!step) return;\n e.preventDefault();\n e.stopPropagation();\n const at = this.map.project(marker.getLngLat());\n marker.setLngLat(this.map.unproject([at.x + step[0] * 10, at.y + step[1] * 10]));\n this._moved(marker);\n }\n\n /** Picks a marker up, or puts down the one already picked up. */\n private _pick(element: HTMLElement | null) {\n this._picked?.setAttribute('aria-pressed', 'false');\n this._picked = element;\n element?.setAttribute('aria-pressed', 'true');\n }\n\n // A tap on a draggable marker picks it up, or puts it back down; the click\n // that ends a drag does neither.\n private _tapMarker(element: HTMLElement | null) {\n // aria-pressed: one skipped for a bad data-lng-lat is no marker to pick up.\n if (element?.matches('[data-draggable][aria-pressed]')) this._tapMovable(element);\n else if (this._markerPopups.has(element)) this._toggle(element);\n }\n\n private _tapMovable(element: HTMLElement) {\n if (this._dragged !== element) this._pick(this._picked === element ? null : element);\n }\n\n /** A third of the map's width or height in a direction. */\n private _pan(x: number, y: number) {\n const { width, height } = this.el.getBoundingClientRect();\n this.map.panBy([(x * width) / 3, (y * height) / 3]);\n }\n\n // Either can be refused (an iframe without allowfullscreen, say). The\n // button state follows fullscreenchange, so there is nothing to undo.\n private _toggleFullscreen() {\n const request = document.fullscreenElement === this.el ? document.exitFullscreen() : this.el.requestFullscreen();\n request.catch(() => {});\n }\n\n private _popup(content: HTMLElement, offset: number) {\n const popup = new this.options.maplibregl.Popup({ closeOnClick: false, maxWidth: 'none', offset }).setDOMContent(content);\n this._popups.push(popup);\n return popup;\n }\n\n private _toggle(marker: HTMLElement) {\n const popup = this._markerPopups.get(marker);\n if (popup.isOpen()) popup.remove();\n else popup.setLngLat(this.markers.find((m) => m.getElement() === marker).getLngLat()).addTo(this.map);\n }\n\n private _buttons(action: string) {\n return this.el.querySelectorAll<HTMLButtonElement>(`.map-controls [data-action=\"${action}\"]`);\n }\n\n private _locate(button: HTMLButtonElement) {\n navigator.geolocation?.getCurrentPosition(\n ({ coords }) => {\n if (!this.map) return;\n const center: LngLat = [coords.longitude, coords.latitude];\n if (!this._location) {\n const dot = document.createElement('span');\n dot.className = 'map-marker location';\n dot.setAttribute('aria-hidden', 'true');\n this._location = new this.options.maplibregl.Marker({ element: dot });\n }\n this._location.setLngLat(center).addTo(this.map);\n this.map.flyTo({ center, zoom: Math.max(this.map.getZoom(), 14) });\n },\n (error) => { if (this.map && error.code === error.PERMISSION_DENIED) button.disabled = true; }\n );\n }\n\n // Resolves a CSS color where the map is, so light-dark() and scoped\n // themes apply, then paints it on a canvas to read back the sRGB value.\n // MapLibre does not parse the oklch() the theme tokens compute to.\n private _color(value: string) {\n const probe = document.createElement('span');\n probe.hidden = true;\n probe.style.color = value;\n this.el.append(probe);\n const context = document.createElement('canvas').getContext('2d', { willReadFrequently: true });\n context.fillStyle = getComputedStyle(probe).color;\n probe.remove();\n context.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = context.getImageData(0, 0, 1, 1).data;\n return `rgba(${r}, ${g}, ${b}, ${Math.round((a / 255) * 100) / 100})`;\n }\n\n private _isDark() {\n return this._color('light-dark(black, white)') === 'rgba(255, 255, 255, 1)';\n }\n\n private _themed(style: MapViewOptions['style'] = this.options.style): style is MapThemedStyle {\n return typeof style === 'object' && 'light' in style && 'dark' in style;\n }\n\n private _style() {\n const style = this.options.style;\n return this._themed(style) ? style[this._dark ? 'dark' : 'light'] : style;\n }\n\n private _handleStyleLoad = () => {\n this._styleReady = true;\n for (const overlay of this._overlays.values()) overlay.draw();\n };\n\n private _handleScheme = () => {\n const dark = this._isDark();\n if (dark === this._dark) return;\n this._dark = dark;\n this._styleReady = false;\n this.map.setStyle(this._style(), { diff: false });\n };\n\n private _sync = () => {\n const zoom = this.map.getZoom();\n for (const button of this._zoomIn) button.disabled = zoom >= this.map.getMaxZoom();\n for (const button of this._zoomOut) button.disabled = zoom <= this.map.getMinZoom();\n this.el.style.setProperty('--md-comp-map-bearing', `${-this.map.getBearing()}deg`);\n };\n\n private _handleFullscreen = () => {\n for (const button of this._buttons('fullscreen')) {\n button.setAttribute('aria-pressed', String(document.fullscreenElement === this.el));\n }\n };\n\n private _handleClick = (e: MouseEvent) => {\n const target = e.target as Element;\n const button = target.closest<HTMLButtonElement>('.map-controls [data-action]');\n if (button) this._actions[button.dataset.action]?.(button);\n else this._tapMarker(target.closest<HTMLElement>('.map-marker'));\n };\n\n // A click on the map closes marker popups, but not the one being toggled.\n private _handleMapClick = (e: MapMouseEvent) => {\n const target = e.originalEvent.target as Node;\n this._drop(target, e.lngLat);\n for (const [marker, popup] of this._markerPopups) {\n if (!marker.contains(target) && !popup.getElement()?.contains(target)) popup.remove();\n }\n };\n\n // A tap on the map, not on a marker, puts a picked-up marker there.\n private _drop(target: Node, at: MapLngLat) {\n if (!this._picked || (target as Element).closest?.('.map-marker')) return;\n const marker = this.markers.find((m) => m.getElement() === this._picked);\n marker.setLngLat(at);\n this._moved(marker);\n this._pick(null);\n }\n\n private _handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') this._escape(e);\n };\n\n // Escape puts down a picked-up marker first, then closes a popup.\n private _escape(e: KeyboardEvent) {\n if (this._picked) {\n e.preventDefault();\n this._pick(null);\n return;\n }\n for (const popup of this._popups) {\n if (popup.getElement()?.contains(e.target as Node)) {\n e.preventDefault();\n popup.remove();\n }\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|