@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/behaviors/theme.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\n\nconst themes = ['light', 'dark', 'auto'];\nconst storageKey = 'theme';\n\n/**\n * Theme switch. A click on `[data-theme-set=\"light|dark|auto\"]` writes the\n * `theme` attribute on the root element and saves the choice in\n * `localStorage` under `theme`. Every theme control then reports whether its\n * value is current: `aria-checked` on menu item and radio roles,\n * `aria-pressed` on anything else.\n *\n * Restoring the saved choice is still the page's inline `<head>` script: the\n * bundle loads after first paint, so restoring here would flash the wrong\n * scheme. Init only marks the controls already in the page.\n */\nexport class Theme {\n private static _initialized = false;\n\n static Init() {\n if (Theme._initialized || typeof document === 'undefined') return;\n Theme._initialized = true;\n document.addEventListener('click', Theme._onClick);\n Utils.onDocumentReady(() => Theme.sync());\n }\n\n /** The current theme: the root's `theme` attribute, or `auto` without one. */\n static get(): string {\n const value = document.documentElement.getAttribute('theme');\n return themes.includes(value) ? value : 'auto';\n }\n\n /** Applies and saves a theme, then marks the controls. Unknown values are ignored. */\n static set(theme: string) {\n if (!themes.includes(theme)) return;\n document.documentElement.setAttribute('theme', theme);\n try {\n localStorage.setItem(storageKey, theme);\n } catch {\n // Storage can be disabled or full; the theme still applies to this page.\n }\n Theme.sync();\n }\n\n /** Marks every theme control in `root` as current or not. Call it after rendering new controls. */\n static sync(root: ParentNode = document) {\n const current = Theme.get();\n root.querySelectorAll('[data-theme-set]').forEach((control) => {\n const state = String(control.getAttribute('data-theme-set') === current);\n const role = control.getAttribute('role');\n const checked = role === 'menuitemradio' || role === 'radio';\n control.setAttribute(checked ? 'aria-checked' : 'aria-pressed', state);\n });\n }\n\n private static _onClick(e: MouseEvent) {\n const control = Utils.closestInPath(e, '[data-theme-set]');\n if (!control || control.matches(':disabled, [aria-disabled=\"true\"]')) return;\n Theme.set(control.getAttribute('data-theme-set'));\n // set() marks the document's controls; a shadow root's need their own pass.\n const root = control.getRootNode();\n if (root !== document) Theme.sync(root as ParentNode);\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAEA,IAAM,SAAS,CAAC,SAAS,QAAQ,MAAM;AACvC,IAAM,aAAa;AAaZ,IAAM,SAAN,MAAM,OAAM;AAAA,EAGjB,OAAO,OAAO;AACZ,QAAI,OAAM,gBAAgB,OAAO,aAAa,YAAa;AAC3D,WAAM,eAAe;AACrB,aAAS,iBAAiB,SAAS,OAAM,QAAQ;AACjD,UAAM,gBAAgB,MAAM,OAAM,KAAK,CAAC;AAAA,EAC1C;AAAA;AAAA,EAGA,OAAO,MAAc;AACnB,UAAM,QAAQ,SAAS,gBAAgB,aAAa,OAAO;AAC3D,WAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA,EAC1C;AAAA;AAAA,EAGA,OAAO,IAAI,OAAe;AACxB,QAAI,CAAC,OAAO,SAAS,KAAK,EAAG;AAC7B,aAAS,gBAAgB,aAAa,SAAS,KAAK;AACpD,QAAI;AACF,mBAAa,QAAQ,YAAY,KAAK;AAAA,IACxC,QAAQ;AAAA,IAER;AACA,WAAM,KAAK;AAAA,EACb;AAAA;AAAA,EAGA,OAAO,KAAK,OAAmB,UAAU;AACvC,UAAM,UAAU,OAAM,IAAI;AAC1B,SAAK,iBAAiB,kBAAkB,EAAE,QAAQ,CAAC,YAAY;AAC7D,YAAM,QAAQ,OAAO,QAAQ,aAAa,gBAAgB,MAAM,OAAO;AACvE,YAAM,OAAO,QAAQ,aAAa,MAAM;AACxC,YAAM,UAAU,SAAS,mBAAmB,SAAS;AACrD,cAAQ,aAAa,UAAU,iBAAiB,gBAAgB,KAAK;AAAA,IACvE,CAAC;AAAA,EACH;AAAA,EAEA,OAAe,SAAS,GAAe;AACrC,UAAM,UAAU,MAAM,cAAc,GAAG,kBAAkB;AACzD,QAAI,CAAC,WAAW,QAAQ,QAAQ,mCAAmC,EAAG;AACtE,WAAM,IAAI,QAAQ,aAAa,gBAAgB,CAAC;AAEhD,UAAM,OAAO,QAAQ,YAAY;AACjC,QAAI,SAAS,SAAU,QAAM,KAAK,IAAkB;AAAA,EACtD;AACF;AA/Ca,OACI,eAAe;AADzB,IAAM,QAAN;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Component
|
|
3
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Utils,
|
|
6
|
+
afterFormReset,
|
|
7
|
+
formEventScope
|
|
8
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
9
|
+
|
|
10
|
+
// src/ts/components/currencyInput.ts
|
|
11
|
+
var _defaults = Object.freeze({ i18n: Object.freeze({ invalid: "Enter an amount." }) });
|
|
12
|
+
var LATIN = "9876543210";
|
|
13
|
+
function groupsThree(clean, mark, decimals) {
|
|
14
|
+
if (clean.length - mark !== 4) return false;
|
|
15
|
+
const separator = clean[mark];
|
|
16
|
+
const earlier = clean.slice(0, mark).replace(/^\D+|\d/g, "");
|
|
17
|
+
if (earlier.split(separator).join("")) return false;
|
|
18
|
+
return earlier.includes(separator) || !decimals.includes(separator);
|
|
19
|
+
}
|
|
20
|
+
function split(clean, digits, decimals) {
|
|
21
|
+
const mark = Math.max(clean.lastIndexOf("."), clean.lastIndexOf(","));
|
|
22
|
+
const fraction = clean.slice(mark + 1);
|
|
23
|
+
return mark >= 0 && fraction.length <= digits && !groupsThree(clean, mark, decimals) ? [clean.slice(0, mark), fraction] : [clean, ""];
|
|
24
|
+
}
|
|
25
|
+
function decimalMarks(formats) {
|
|
26
|
+
return formats.flatMap((format) => format.formatToParts(1.5).filter((part) => part.type === "decimal").map((part) => part.value));
|
|
27
|
+
}
|
|
28
|
+
function parse(text, digits, decimals) {
|
|
29
|
+
const clean = text.replace(/[^\d.,]/g, "").replace(/[.,]+$/, "");
|
|
30
|
+
if (!/\d/.test(clean)) return null;
|
|
31
|
+
const [whole, fraction] = split(clean, digits, decimals);
|
|
32
|
+
const sign = /^\D*[-−]/.test(text) ? -1 : 1;
|
|
33
|
+
return sign * Number(`${whole.replace(/[.,]/g, "")}.${fraction}`);
|
|
34
|
+
}
|
|
35
|
+
var CurrencyInput = class extends Component {
|
|
36
|
+
constructor(el, options) {
|
|
37
|
+
super(el, options);
|
|
38
|
+
this._format = () => {
|
|
39
|
+
this._show(this.value);
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Enter fires change while the field keeps focus. Formatting then would
|
|
43
|
+
* put the next keystroke after the currency sign, so the field waits for
|
|
44
|
+
* blur.
|
|
45
|
+
*/
|
|
46
|
+
this._onChange = () => {
|
|
47
|
+
if (!this.el.matches(":focus")) this._format();
|
|
48
|
+
};
|
|
49
|
+
/** Shows the amount as a plain number to edit, with the caret at the end. */
|
|
50
|
+
this._onFocus = () => {
|
|
51
|
+
const amount = this.value;
|
|
52
|
+
if (amount === null) return;
|
|
53
|
+
const text = this._edit.format(amount);
|
|
54
|
+
this.el.value = text;
|
|
55
|
+
this.el.setSelectionRange(text.length, text.length);
|
|
56
|
+
};
|
|
57
|
+
/** Marks text that holds no amount invalid, and clears the mark once it holds one or is empty. */
|
|
58
|
+
this._validate = () => {
|
|
59
|
+
const { el } = this;
|
|
60
|
+
const invalid = el.value.trim() !== "" && this.value === null;
|
|
61
|
+
el.setCustomValidity(invalid ? this.options.i18n.invalid : "");
|
|
62
|
+
};
|
|
63
|
+
/** Puts the plain number in the form data in place of the formatted text. */
|
|
64
|
+
this._onFormData = (e) => {
|
|
65
|
+
if (!this._submitsTo(e.target)) return;
|
|
66
|
+
e.formData.set(this.el.name, String(this.value ?? this.el.value));
|
|
67
|
+
};
|
|
68
|
+
const locale = Utils.locale(el);
|
|
69
|
+
try {
|
|
70
|
+
this._display = new Intl.NumberFormat(locale, { style: "currency", currency: el.dataset.currency });
|
|
71
|
+
} catch {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this._digits = this._display.resolvedOptions().maximumFractionDigits;
|
|
75
|
+
this._edit = new Intl.NumberFormat(locale, { useGrouping: false, maximumFractionDigits: this._digits });
|
|
76
|
+
this._plain = new Intl.NumberFormat("en", { useGrouping: false, maximumFractionDigits: this._digits });
|
|
77
|
+
this._native = new Intl.NumberFormat(locale, { useGrouping: false }).format(9876543210);
|
|
78
|
+
const decimals = decimalMarks([this._display, this._edit]);
|
|
79
|
+
this._marks = Object.fromEntries(decimals.filter((mark) => !".,".includes(mark)).map((mark) => [mark, "."]));
|
|
80
|
+
this._decimals = decimals.map((mark) => this._marks[mark] ?? mark);
|
|
81
|
+
const signal = this._events.signal;
|
|
82
|
+
el.addEventListener("change", this._onChange, { capture: true, signal });
|
|
83
|
+
el.addEventListener("blur", this._format, { signal });
|
|
84
|
+
el.addEventListener("focus", this._onFocus, { signal });
|
|
85
|
+
el.addEventListener("input", this._validate, { signal });
|
|
86
|
+
formEventScope(el).addEventListener("formdata", this._onFormData, { capture: true, signal });
|
|
87
|
+
afterFormReset(el, () => this._start(), signal);
|
|
88
|
+
this._start();
|
|
89
|
+
}
|
|
90
|
+
static get defaults() {
|
|
91
|
+
return _defaults;
|
|
92
|
+
}
|
|
93
|
+
/** The amount the field holds, rounded as it shows, or null when it is empty or holds no digit. */
|
|
94
|
+
get value() {
|
|
95
|
+
return this._round(this._read(this.el.value));
|
|
96
|
+
}
|
|
97
|
+
/** Reads text in the locale's digits, or full-width ones from an IME, as an amount. */
|
|
98
|
+
_read(text) {
|
|
99
|
+
const latin = Array.from(text.normalize("NFKC"), (ch) => this._marks[ch] ?? LATIN[this._native.indexOf(ch)] ?? ch);
|
|
100
|
+
return parse(latin.join(""), this._digits, this._decimals);
|
|
101
|
+
}
|
|
102
|
+
_round(amount) {
|
|
103
|
+
return amount === null ? null : Number(this._plain.format(amount));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Formats the starting value without events. It reads as a plain number
|
|
107
|
+
* first, the form the field submits, so a saved `1.234` stays 1.234.
|
|
108
|
+
*/
|
|
109
|
+
_start() {
|
|
110
|
+
const text = this.el.value;
|
|
111
|
+
const number = Number(text);
|
|
112
|
+
this._show(this._round(text.trim() && Number.isFinite(number) ? number : this._read(text)));
|
|
113
|
+
}
|
|
114
|
+
/** Shows `amount` in the locale and currency, leaving text that reads as no amount as it is. */
|
|
115
|
+
_show(amount) {
|
|
116
|
+
if (amount !== null) this.el.value = this._display.format(amount);
|
|
117
|
+
this._validate();
|
|
118
|
+
}
|
|
119
|
+
/** Whether the field has an entry in `form`'s data. */
|
|
120
|
+
_submitsTo(form) {
|
|
121
|
+
const { el } = this;
|
|
122
|
+
return form === el.form && el.name !== "" && !el.matches(":disabled");
|
|
123
|
+
}
|
|
124
|
+
/** Stops formatting and clears the validity message, leaving the text as it is. */
|
|
125
|
+
destroy() {
|
|
126
|
+
super.destroy();
|
|
127
|
+
this.el.setCustomValidity("");
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
CurrencyInput.key = "Expressive_CurrencyInput";
|
|
131
|
+
|
|
132
|
+
export {
|
|
133
|
+
CurrencyInput
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=chunk-AQNFCJJ5.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/currencyInput.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils, afterFormReset, formEventScope } from '../core/utils';\n\nexport interface CurrencyInputOptions extends BaseOptions {\n /** `invalid` is the validity message for text that holds no amount. */\n i18n: Partial<{ invalid: string }>;\n}\n\nconst _defaults: CurrencyInputOptions = Object.freeze({ i18n: Object.freeze({ invalid: 'Enter an amount.' }) });\n\n/** Latin digits in the order `_native` holds them, to map a locale's own digits back. */\nconst LATIN = '9876543210';\n\n/**\n * Whether the separator at `mark` groups even though the currency could show\n * three digits after it. After a separator of the other kind it is a decimal,\n * as in `1.234,567`. A repeated separator groups, and so does a lone one that\n * is not one of the locale's `decimals`. The earlier separators are read from\n * the first digit, since a symbol such as `\u062F.\u0628.` may hold marks.\n */\nfunction groupsThree(clean: string, mark: number, decimals: string[]) {\n if (clean.length - mark !== 4) return false;\n const separator = clean[mark];\n const earlier = clean.slice(0, mark).replace(/^\\D+|\\d/g, '');\n if (earlier.split(separator).join('')) return false;\n return earlier.includes(separator) || !decimals.includes(separator);\n}\n\n/**\n * Splits digits and separators into whole and fraction digits. The last `.`\n * or `,` is the decimal mark when no more than `digits` digits follow it and\n * it does not group, so `1.234,5` and `1,234.50` both split at the end. Any\n * other separator groups.\n */\nfunction split(clean: string, digits: number, decimals: string[]): [string, string] {\n const mark = Math.max(clean.lastIndexOf('.'), clean.lastIndexOf(','));\n const fraction = clean.slice(mark + 1);\n return mark >= 0 && fraction.length <= digits && !groupsThree(clean, mark, decimals) ? [clean.slice(0, mark), fraction] : [clean, ''];\n}\n\n/**\n * The marks a locale writes decimals with. Some use one for currency and\n * another for plain numbers: fr-CH shows `1.234 KWD` and edits `1,234`.\n */\nfunction decimalMarks(formats: Intl.NumberFormat[]) {\n return formats.flatMap((format) => format.formatToParts(1.5).filter((part) => part.type === 'decimal').map((part) => part.value));\n}\n\n/**\n * Reads text in Latin digits as an amount, or null when it holds no digit.\n * Signs, spaces and letters are ignored, and a `-` or `\u2212` before the first\n * digit makes the amount negative. A separator after the last digit is\n * dropped, since it belongs to a symbol such as `kr.`.\n */\nfunction parse(text: string, digits: number, decimals: string[]): number | null {\n const clean = text.replace(/[^\\d.,]/g, '').replace(/[.,]+$/, '');\n if (!/\\d/.test(clean)) return null;\n const [whole, fraction] = split(clean, digits, decimals);\n const sign = /^\\D*[-\u2212]/.test(text) ? -1 : 1;\n return sign * Number(`${whole.replace(/[.,]/g, '')}.${fraction}`);\n}\n\n/**\n * Currency input. Shows a text field's amount in the page's locale and the\n * currency its `data-currency` attribute names once the field loses focus,\n * shows the plain number while it has focus, and puts the plain number in the\n * form data.\n */\nexport class CurrencyInput extends Component<CurrencyInputOptions> {\n declare el: HTMLInputElement;\n static key = 'Expressive_CurrencyInput';\n private _display: Intl.NumberFormat;\n /** Writes an amount for editing: the locale's digits and mark, no grouping or sign. */\n private _edit: Intl.NumberFormat;\n /** Writes an amount as the form submits it: Latin digits, a `.` mark, no grouping. */\n private _plain: Intl.NumberFormat;\n private _digits: number;\n /** The locale's digits for 9876543210. */\n private _native: string;\n /** Rewrites a decimal mark that is neither `.` nor `,`, such as Arabic's, to `.`. */\n private _marks: Record<string, string>;\n /** The locale's decimal marks, after `_marks`. */\n private _decimals: string[];\n\n constructor(el: HTMLInputElement, options: Partial<CurrencyInputOptions>) {\n super(el, options);\n const locale = Utils.locale(el);\n try {\n this._display = new Intl.NumberFormat(locale, { style: 'currency', currency: el.dataset.currency });\n } catch {\n // A malformed code leaves the field a plain text input.\n return;\n }\n this._digits = this._display.resolvedOptions().maximumFractionDigits;\n this._edit = new Intl.NumberFormat(locale, { useGrouping: false, maximumFractionDigits: this._digits });\n this._plain = new Intl.NumberFormat('en', { useGrouping: false, maximumFractionDigits: this._digits });\n this._native = new Intl.NumberFormat(locale, { useGrouping: false }).format(9876543210);\n const decimals = decimalMarks([this._display, this._edit]);\n this._marks = Object.fromEntries(decimals.filter((mark) => !'.,'.includes(mark)).map((mark) => [mark, '.']));\n this._decimals = decimals.map((mark) => this._marks[mark] ?? mark);\n const signal = this._events.signal;\n // Capture, so a page's change listener on the field reads the formatted\n // text. Blur covers a visit that changed nothing, which fires no change.\n el.addEventListener('change', this._onChange, { capture: true, signal });\n el.addEventListener('blur', this._format, { signal });\n el.addEventListener('focus', this._onFocus, { signal });\n el.addEventListener('input', this._validate, { signal });\n formEventScope(el).addEventListener('formdata', this._onFormData, { capture: true, signal });\n // The field formats the value a reset restores.\n afterFormReset(el, () => this._start(), signal);\n this._start();\n }\n\n static get defaults(): CurrencyInputOptions {\n return _defaults;\n }\n\n /** The amount the field holds, rounded as it shows, or null when it is empty or holds no digit. */\n get value(): number | null {\n return this._round(this._read(this.el.value));\n }\n\n /** Reads text in the locale's digits, or full-width ones from an IME, as an amount. */\n private _read(text: string) {\n const latin = Array.from(text.normalize('NFKC'), (ch) => this._marks[ch] ?? LATIN[this._native.indexOf(ch)] ?? ch);\n return parse(latin.join(''), this._digits, this._decimals);\n }\n\n private _round(amount: number | null) {\n return amount === null ? null : Number(this._plain.format(amount));\n }\n\n /**\n * Formats the starting value without events. It reads as a plain number\n * first, the form the field submits, so a saved `1.234` stays 1.234.\n */\n private _start() {\n const text = this.el.value;\n const number = Number(text);\n this._show(this._round(text.trim() && Number.isFinite(number) ? number : this._read(text)));\n }\n\n private _format = () => {\n this._show(this.value);\n };\n\n /**\n * Enter fires change while the field keeps focus. Formatting then would\n * put the next keystroke after the currency sign, so the field waits for\n * blur.\n */\n private _onChange = () => {\n if (!this.el.matches(':focus')) this._format();\n };\n\n /** Shows `amount` in the locale and currency, leaving text that reads as no amount as it is. */\n private _show(amount: number | null) {\n if (amount !== null) this.el.value = this._display.format(amount);\n this._validate();\n }\n\n /** Shows the amount as a plain number to edit, with the caret at the end. */\n private _onFocus = () => {\n const amount = this.value;\n if (amount === null) return;\n const text = this._edit.format(amount);\n this.el.value = text;\n this.el.setSelectionRange(text.length, text.length);\n };\n\n /** Marks text that holds no amount invalid, and clears the mark once it holds one or is empty. */\n private _validate = () => {\n const { el } = this;\n const invalid = el.value.trim() !== '' && this.value === null;\n el.setCustomValidity(invalid ? this.options.i18n.invalid : '');\n };\n\n /** Puts the plain number in the form data in place of the formatted text. */\n private _onFormData = (e: FormDataEvent) => {\n if (!this._submitsTo(e.target)) return;\n // ponytail: set() collapses fields that share this name into one entry; a\n // per-field swap if a form ever repeats a currency field's name.\n e.formData.set(this.el.name, String(this.value ?? this.el.value));\n };\n\n /** Whether the field has an entry in `form`'s data. */\n private _submitsTo(form: EventTarget) {\n const { el } = this;\n return form === el.form && el.name !== '' && !el.matches(':disabled');\n }\n\n /** Stops formatting and clears the validity message, leaving the text as it is. */\n destroy(): void {\n super.destroy();\n this.el.setCustomValidity('');\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DockedDisplayPlugin
|
|
3
|
+
} from "./chunk-CY2CTOVM.mjs";
|
|
4
|
+
|
|
5
|
+
// src/ts/plugins/modalDisplayPlugin.ts
|
|
6
|
+
var ModalDisplayPlugin = class {
|
|
7
|
+
constructor(el, container, onDismiss) {
|
|
8
|
+
/** Whether the picker, not the user, is closing the dialog. */
|
|
9
|
+
this._settled = false;
|
|
10
|
+
this._opener = null;
|
|
11
|
+
/** Whether the press that ends in the next click started on the scrim. */
|
|
12
|
+
this._downOnScrim = false;
|
|
13
|
+
this._handlePointerDown = (e) => {
|
|
14
|
+
this._downOnScrim = e.target === this.dialog;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* The picker fills the dialog, so a press on the dialog itself is on the
|
|
18
|
+
* scrim. A drag that starts on the picker, such as the timepicker hand,
|
|
19
|
+
* and ends on the scrim also clicks the dialog, so both ends must be there.
|
|
20
|
+
*/
|
|
21
|
+
this._handleClick = (e) => {
|
|
22
|
+
if (e.target === this.dialog && this._downOnScrim) this.dialog.close();
|
|
23
|
+
this._downOnScrim = false;
|
|
24
|
+
};
|
|
25
|
+
this._handleClose = () => {
|
|
26
|
+
const dismissed = !this._settled;
|
|
27
|
+
this._settled = false;
|
|
28
|
+
this._opener?.focus({ preventScroll: true });
|
|
29
|
+
if (dismissed) this.onDismiss();
|
|
30
|
+
};
|
|
31
|
+
this.destroy = () => {
|
|
32
|
+
this.dialog.removeEventListener("pointerdown", this._handlePointerDown);
|
|
33
|
+
this.dialog.removeEventListener("click", this._handleClick);
|
|
34
|
+
this.dialog.removeEventListener("close", this._handleClose);
|
|
35
|
+
this.dialog.remove();
|
|
36
|
+
};
|
|
37
|
+
this.show = () => {
|
|
38
|
+
if (this.dialog.open) return;
|
|
39
|
+
const root = this.dialog.getRootNode();
|
|
40
|
+
this._opener = root.activeElement;
|
|
41
|
+
this.dialog.showModal();
|
|
42
|
+
};
|
|
43
|
+
this.hide = () => {
|
|
44
|
+
if (!this.dialog.open) return;
|
|
45
|
+
this._settled = true;
|
|
46
|
+
this.dialog.close();
|
|
47
|
+
};
|
|
48
|
+
this.triggers = [el];
|
|
49
|
+
this.onDismiss = onDismiss;
|
|
50
|
+
this.dialog = document.createElement("dialog");
|
|
51
|
+
this.dialog.className = "display-modal";
|
|
52
|
+
const label = el.labels?.[0]?.textContent.trim() || el.getAttribute("aria-label");
|
|
53
|
+
if (label) this.dialog.setAttribute("aria-label", label);
|
|
54
|
+
this.dialog.append(container);
|
|
55
|
+
el.parentElement.append(this.dialog);
|
|
56
|
+
this.dialog.addEventListener("pointerdown", this._handlePointerDown);
|
|
57
|
+
this.dialog.addEventListener("click", this._handleClick);
|
|
58
|
+
this.dialog.addEventListener("close", this._handleClose);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function createDisplayPlugin(type, el, container, options, onDismiss) {
|
|
62
|
+
if (type === "modal") return new ModalDisplayPlugin(el, container, onDismiss);
|
|
63
|
+
if (type === "docked") return new DockedDisplayPlugin(el, container, options);
|
|
64
|
+
return void 0;
|
|
65
|
+
}
|
|
66
|
+
function hideModal(plugin) {
|
|
67
|
+
if (plugin instanceof ModalDisplayPlugin) plugin.hide();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export {
|
|
71
|
+
ModalDisplayPlugin,
|
|
72
|
+
createDisplayPlugin,
|
|
73
|
+
hideModal
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=chunk-B55LWKBM.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/plugins/modalDisplayPlugin.ts"],
|
|
4
|
+
"sourcesContent": ["import { DockedDisplayPlugin, DockedDisplayPluginOptions } from './dockedDisplayPlugin';\n\n/**\n * Shows a picker in a modal <dialog>, which the dialog styles draw as a\n * basic dialog over a scrim. The browser keeps focus inside it. Escape or a\n * press on the scrim closes it, and the picker hears that as Cancel; the\n * picker closes it itself through hide() on Ok or Cancel. Focus goes back\n * to the field that opened it.\n */\nexport class ModalDisplayPlugin {\n /** The fields that open the dialog, as DockedDisplayPlugin keeps them. */\n readonly triggers: HTMLElement[];\n private readonly dialog: HTMLDialogElement;\n private readonly onDismiss: () => void;\n /** Whether the picker, not the user, is closing the dialog. */\n private _settled = false;\n private _opener: HTMLElement | null = null;\n /** Whether the press that ends in the next click started on the scrim. */\n private _downOnScrim = false;\n\n constructor(el: HTMLElement, container: HTMLElement, onDismiss: () => void) {\n this.triggers = [el];\n this.onDismiss = onDismiss;\n this.dialog = document.createElement('dialog');\n this.dialog.className = 'display-modal';\n const label = (el as HTMLInputElement).labels?.[0]?.textContent.trim() || el.getAttribute('aria-label');\n if (label) this.dialog.setAttribute('aria-label', label);\n this.dialog.append(container);\n el.parentElement.append(this.dialog);\n this.dialog.addEventListener('pointerdown', this._handlePointerDown);\n this.dialog.addEventListener('click', this._handleClick);\n this.dialog.addEventListener('close', this._handleClose);\n }\n\n private _handlePointerDown = (e: PointerEvent) => {\n this._downOnScrim = e.target === this.dialog;\n };\n\n /**\n * The picker fills the dialog, so a press on the dialog itself is on the\n * scrim. A drag that starts on the picker, such as the timepicker hand,\n * and ends on the scrim also clicks the dialog, so both ends must be there.\n */\n private _handleClick = (e: MouseEvent) => {\n if (e.target === this.dialog && this._downOnScrim) this.dialog.close();\n this._downOnScrim = false;\n };\n\n private _handleClose = () => {\n const dismissed = !this._settled;\n this._settled = false;\n this._opener?.focus({ preventScroll: true });\n if (dismissed) this.onDismiss();\n };\n\n destroy = () => {\n this.dialog.removeEventListener('pointerdown', this._handlePointerDown);\n this.dialog.removeEventListener('click', this._handleClick);\n this.dialog.removeEventListener('close', this._handleClose);\n this.dialog.remove();\n };\n\n show = () => {\n if (this.dialog.open) return;\n const root = this.dialog.getRootNode() as Document | ShadowRoot;\n this._opener = root.activeElement as HTMLElement | null;\n this.dialog.showModal();\n };\n\n hide = () => {\n if (!this.dialog.open) return;\n this._settled = true;\n this.dialog.close();\n };\n}\n\nexport type DisplayPlugin = DockedDisplayPlugin | ModalDisplayPlugin;\n\n/**\n * The display plugin a picker's `displayPlugin` option names: 'docked',\n * 'modal', or none for an inline picker. `onDismiss` is the picker's Cancel.\n */\nexport function createDisplayPlugin(\n type: string | null,\n el: HTMLElement,\n container: HTMLElement,\n options: Partial<DockedDisplayPluginOptions>,\n onDismiss: () => void\n): DisplayPlugin | undefined {\n if (type === 'modal') return new ModalDisplayPlugin(el, container, onDismiss);\n if (type === 'docked') return new DockedDisplayPlugin(el, container, options);\n return undefined;\n}\n\n/** Ok and Cancel close a modal picker; a docked one stays until a click outside. */\nexport function hideModal(plugin: DisplayPlugin | undefined) {\n if (plugin instanceof ModalDisplayPlugin) plugin.hide();\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AASO,IAAM,qBAAN,MAAyB;AAAA,EAW9B,YAAY,IAAiB,WAAwB,WAAuB;AAL5E;AAAA,SAAQ,WAAW;AACnB,SAAQ,UAA8B;AAEtC;AAAA,SAAQ,eAAe;AAgBvB,SAAQ,qBAAqB,CAAC,MAAoB;AAChD,WAAK,eAAe,EAAE,WAAW,KAAK;AAAA,IACxC;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,eAAe,CAAC,MAAkB;AACxC,UAAI,EAAE,WAAW,KAAK,UAAU,KAAK,aAAc,MAAK,OAAO,MAAM;AACrE,WAAK,eAAe;AAAA,IACtB;AAEA,SAAQ,eAAe,MAAM;AAC3B,YAAM,YAAY,CAAC,KAAK;AACxB,WAAK,WAAW;AAChB,WAAK,SAAS,MAAM,EAAE,eAAe,KAAK,CAAC;AAC3C,UAAI,UAAW,MAAK,UAAU;AAAA,IAChC;AAEA,mBAAU,MAAM;AACd,WAAK,OAAO,oBAAoB,eAAe,KAAK,kBAAkB;AACtE,WAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,WAAK,OAAO,oBAAoB,SAAS,KAAK,YAAY;AAC1D,WAAK,OAAO,OAAO;AAAA,IACrB;AAEA,gBAAO,MAAM;AACX,UAAI,KAAK,OAAO,KAAM;AACtB,YAAM,OAAO,KAAK,OAAO,YAAY;AACrC,WAAK,UAAU,KAAK;AACpB,WAAK,OAAO,UAAU;AAAA,IACxB;AAEA,gBAAO,MAAM;AACX,UAAI,CAAC,KAAK,OAAO,KAAM;AACvB,WAAK,WAAW;AAChB,WAAK,OAAO,MAAM;AAAA,IACpB;AApDE,SAAK,WAAW,CAAC,EAAE;AACnB,SAAK,YAAY;AACjB,SAAK,SAAS,SAAS,cAAc,QAAQ;AAC7C,SAAK,OAAO,YAAY;AACxB,UAAM,QAAS,GAAwB,SAAS,CAAC,GAAG,YAAY,KAAK,KAAK,GAAG,aAAa,YAAY;AACtG,QAAI,MAAO,MAAK,OAAO,aAAa,cAAc,KAAK;AACvD,SAAK,OAAO,OAAO,SAAS;AAC5B,OAAG,cAAc,OAAO,KAAK,MAAM;AACnC,SAAK,OAAO,iBAAiB,eAAe,KAAK,kBAAkB;AACnE,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AACvD,SAAK,OAAO,iBAAiB,SAAS,KAAK,YAAY;AAAA,EACzD;AA0CF;AAQO,SAAS,oBACd,MACA,IACA,WACA,SACA,WAC2B;AAC3B,MAAI,SAAS,QAAS,QAAO,IAAI,mBAAmB,IAAI,WAAW,SAAS;AAC5E,MAAI,SAAS,SAAU,QAAO,IAAI,oBAAoB,IAAI,WAAW,OAAO;AAC5E,SAAO;AACT;AAGO,SAAS,UAAU,QAAmC;AAC3D,MAAI,kBAAkB,mBAAoB,QAAO,KAAK;AACxD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Utils
|
|
3
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
4
|
+
|
|
5
|
+
// src/ts/behaviors/lists.ts
|
|
6
|
+
var rowTarget = ":scope > li > :is(a[href], button):only-child";
|
|
7
|
+
var STEPS = { ArrowUp: -1, ArrowDown: 1 };
|
|
8
|
+
var _Lists = class _Lists {
|
|
9
|
+
// A second Init adds nothing: addEventListener ignores a listener it has.
|
|
10
|
+
static Init() {
|
|
11
|
+
if (typeof document === "undefined") return;
|
|
12
|
+
document.addEventListener("keydown", _Lists._onKeydown);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
_Lists._onKeydown = (e) => {
|
|
16
|
+
const list = Utils.eventTarget(e)?.closest(".list");
|
|
17
|
+
if (!list) return;
|
|
18
|
+
const target = Utils.focusTarget([...list.querySelectorAll(rowTarget)], e, STEPS);
|
|
19
|
+
if (!target) return;
|
|
20
|
+
e.preventDefault();
|
|
21
|
+
target.focus();
|
|
22
|
+
};
|
|
23
|
+
var Lists = _Lists;
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
Lists
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=chunk-BB5VXYXT.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/behaviors/lists.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\n\n/** A row that is one link or button from edge to edge, as the list docs write it. */\nconst rowTarget = ':scope > li > :is(a[href], button):only-child';\n\nconst STEPS = { ArrowUp: -1, ArrowDown: 1 };\n\n/**\n * Keys for lists of actionable rows. In a `.list` whose rows are each a\n * single link or button, Up and Down move focus to the row before or after,\n * and Home and End to the first and last, skipping disabled rows. Every row\n * stays a Tab stop and keeps its own role, so the keys are a shortcut on\n * top of native navigation rather than a listbox. Radio rows already move\n * with the arrows, and other lists are left alone.\n */\nexport class Lists {\n // A second Init adds nothing: addEventListener ignores a listener it has.\n static Init() {\n if (typeof document === 'undefined') return;\n document.addEventListener('keydown', Lists._onKeydown);\n }\n\n private static _onKeydown = (e: KeyboardEvent) => {\n const list = Utils.eventTarget(e)?.closest('.list');\n if (!list) return;\n const target = Utils.focusTarget([...list.querySelectorAll<HTMLElement>(rowTarget)], e, STEPS);\n if (!target) return;\n e.preventDefault();\n target.focus();\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;AAGA,IAAM,YAAY;AAElB,IAAM,QAAQ,EAAE,SAAS,IAAI,WAAW,EAAE;AAUnC,IAAM,SAAN,MAAM,OAAM;AAAA;AAAA,EAEjB,OAAO,OAAO;AACZ,QAAI,OAAO,aAAa,YAAa;AACrC,aAAS,iBAAiB,WAAW,OAAM,UAAU;AAAA,EACvD;AAUF;AAfa,OAOI,aAAa,CAAC,MAAqB;AAChD,QAAM,OAAO,MAAM,YAAY,CAAC,GAAG,QAAQ,OAAO;AAClD,MAAI,CAAC,KAAM;AACX,QAAM,SAAS,MAAM,YAAY,CAAC,GAAG,KAAK,iBAA8B,SAAS,CAAC,GAAG,GAAG,KAAK;AAC7F,MAAI,CAAC,OAAQ;AACb,IAAE,eAAe;AACjB,SAAO,MAAM;AACf;AAdK,IAAM,QAAN;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Menu
|
|
3
|
+
} from "./chunk-DWA5UYLJ.mjs";
|
|
4
|
+
import {
|
|
5
|
+
Component
|
|
6
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
7
|
+
import {
|
|
8
|
+
Utils
|
|
9
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
10
|
+
|
|
11
|
+
// src/ts/components/menubar.ts
|
|
12
|
+
var _defaults = {
|
|
13
|
+
menuOptions: { constrainWidth: false, coverTrigger: false }
|
|
14
|
+
};
|
|
15
|
+
var Menubar = class extends Component {
|
|
16
|
+
constructor(el, options) {
|
|
17
|
+
super(el, options);
|
|
18
|
+
this._added = [];
|
|
19
|
+
this._onFocusin = (e) => {
|
|
20
|
+
const items = this._items;
|
|
21
|
+
if (!items.includes(e.target)) return;
|
|
22
|
+
items.forEach((item) => item.tabIndex = item === e.target ? 0 : -1);
|
|
23
|
+
};
|
|
24
|
+
this._onBarKeydown = (e) => {
|
|
25
|
+
if (!Utils.plainKey(e)) return;
|
|
26
|
+
const items = this._items;
|
|
27
|
+
const index = items.indexOf(e.target);
|
|
28
|
+
if (index < 0) return;
|
|
29
|
+
const step = this._step(e.key);
|
|
30
|
+
if (step) this._focusItem(index, step, false);
|
|
31
|
+
else if (e.key === "Home") this._focusItem(-1, 1, false);
|
|
32
|
+
else if (e.key === "End") this._focusItem(items.length, -1, false);
|
|
33
|
+
else return;
|
|
34
|
+
e.preventDefault();
|
|
35
|
+
};
|
|
36
|
+
// Inside an open menu, Menu handles every key first and takes Left and
|
|
37
|
+
// Right only for submenus; whatever it leaves moves along the bar.
|
|
38
|
+
this._onMenuKeydown = (e) => {
|
|
39
|
+
const step = this._step(e.key);
|
|
40
|
+
if (!step || e.defaultPrevented || !Utils.plainKey(e)) return;
|
|
41
|
+
const items = this._items;
|
|
42
|
+
const path = e.composedPath();
|
|
43
|
+
const index = items.findIndex((item) => {
|
|
44
|
+
const menu = Menu.getInstance(item);
|
|
45
|
+
return menu?.isOpen && menu.menuEl && path.includes(menu.menuEl);
|
|
46
|
+
});
|
|
47
|
+
if (index < 0) return;
|
|
48
|
+
e.preventDefault();
|
|
49
|
+
this._focusItem(index, step, true);
|
|
50
|
+
};
|
|
51
|
+
this._setAttribute(this.el, "role", "menubar");
|
|
52
|
+
this._items.forEach((item, index) => {
|
|
53
|
+
Menu.init(item, this.options.menuOptions);
|
|
54
|
+
this._setAttribute(item, "role", "menuitem");
|
|
55
|
+
item.tabIndex = index === 0 ? 0 : -1;
|
|
56
|
+
});
|
|
57
|
+
const { signal } = this._events;
|
|
58
|
+
this.el.addEventListener("keydown", this._onBarKeydown, { signal });
|
|
59
|
+
this.el.addEventListener("focusin", this._onFocusin, { signal });
|
|
60
|
+
document.addEventListener("keydown", this._onMenuKeydown, { signal });
|
|
61
|
+
}
|
|
62
|
+
static get defaults() {
|
|
63
|
+
return _defaults;
|
|
64
|
+
}
|
|
65
|
+
destroy() {
|
|
66
|
+
this._items.forEach((item) => {
|
|
67
|
+
Menu.getInstance(item)?.destroy();
|
|
68
|
+
item.removeAttribute("tabindex");
|
|
69
|
+
});
|
|
70
|
+
this._added.forEach(({ el, name }) => el.removeAttribute(name));
|
|
71
|
+
this._added = [];
|
|
72
|
+
super.destroy();
|
|
73
|
+
}
|
|
74
|
+
get _items() {
|
|
75
|
+
return [...this.el.querySelectorAll(":scope > .menu-trigger")];
|
|
76
|
+
}
|
|
77
|
+
/** Sets an attribute the author left out, remembering it for destroy(). */
|
|
78
|
+
_setAttribute(el, name, value) {
|
|
79
|
+
if (el.hasAttribute(name)) return;
|
|
80
|
+
el.setAttribute(name, value);
|
|
81
|
+
this._added.push({ el, name });
|
|
82
|
+
}
|
|
83
|
+
_step(key) {
|
|
84
|
+
const rtl = getComputedStyle(this.el).direction === "rtl";
|
|
85
|
+
if (key === "ArrowRight") return rtl ? -1 : 1;
|
|
86
|
+
if (key === "ArrowLeft") return rtl ? 1 : -1;
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/** Focuses the first enabled item after `index` in the `step` direction, wrapping. */
|
|
90
|
+
_focusItem(index, step, open) {
|
|
91
|
+
const items = this._items;
|
|
92
|
+
const n = items.length;
|
|
93
|
+
const item = items.map((_, i) => items[((index + step * (i + 1)) % n + n) % n]).find((candidate) => !candidate.matches(':disabled, [aria-disabled="true"]'));
|
|
94
|
+
if (!item) return;
|
|
95
|
+
items.forEach((other) => {
|
|
96
|
+
const menu = Menu.getInstance(other);
|
|
97
|
+
if (other !== item && menu?.isOpen) menu.close();
|
|
98
|
+
});
|
|
99
|
+
item.focus();
|
|
100
|
+
if (open) Menu.getInstance(item)?.open();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
Menubar.key = "Expressive_Menubar";
|
|
104
|
+
|
|
105
|
+
export {
|
|
106
|
+
Menubar
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=chunk-BDATLH3H.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/menubar.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\nimport { Menu, MenuOptions } from './menu';\n\nexport interface MenubarOptions extends BaseOptions {\n /**\n * Options for each item's Menu. The defaults size the menus to their\n * content and open them below the bar.\n * @default { constrainWidth: false, coverTrigger: false }\n */\n menuOptions: Partial<MenuOptions>;\n}\n\nconst _defaults: MenubarOptions = {\n menuOptions: { constrainWidth: false, coverTrigger: false }\n};\n\n/**\n * Menubar. An application's row of menus, such as File, Edit and View. A\n * `.menubar` holds `.menu-trigger` buttons whose `data-target` menus are\n * ordinary Menus; this adds the ARIA menubar contract around them. The bar\n * is `role=\"menubar\"` and each button a `menuitem`, with one tab stop that\n * follows focus. Left and Right move between items, wrapping, and Home and\n * End go to the first and last; with a menu open, Left and Right close it\n * and open the neighbour's, unless the focused row opens or closes a\n * submenu. Down, Up, Enter and Space open a menu, and Escape closes it,\n * through Menu itself.\n */\nexport class Menubar extends Component<MenubarOptions> {\n private _added: { el: Element; name: string }[] = [];\n\n constructor(el: HTMLElement, options: Partial<MenubarOptions>) {\n super(el, options);\n this._setAttribute(this.el, 'role', 'menubar');\n this._items.forEach((item, index) => {\n Menu.init(item, this.options.menuOptions);\n this._setAttribute(item, 'role', 'menuitem');\n item.tabIndex = index === 0 ? 0 : -1;\n });\n const { signal } = this._events;\n this.el.addEventListener('keydown', this._onBarKeydown, { signal });\n this.el.addEventListener('focusin', this._onFocusin, { signal });\n document.addEventListener('keydown', this._onMenuKeydown, { signal });\n }\n\n static get defaults(): MenubarOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Menubar';\n\n destroy() {\n this._items.forEach((item) => {\n Menu.getInstance(item)?.destroy();\n item.removeAttribute('tabindex');\n });\n this._added.forEach(({ el, name }) => el.removeAttribute(name));\n this._added = [];\n super.destroy();\n }\n\n private get _items(): HTMLElement[] {\n return [...this.el.querySelectorAll<HTMLElement>(':scope > .menu-trigger')];\n }\n\n /** Sets an attribute the author left out, remembering it for destroy(). */\n private _setAttribute(el: Element, name: string, value: string) {\n if (el.hasAttribute(name)) return;\n el.setAttribute(name, value);\n this._added.push({ el, name });\n }\n\n private _step(key: string): number | null {\n const rtl = getComputedStyle(this.el).direction === 'rtl';\n if (key === 'ArrowRight') return rtl ? -1 : 1;\n if (key === 'ArrowLeft') return rtl ? 1 : -1;\n return null;\n }\n\n /** Focuses the first enabled item after `index` in the `step` direction, wrapping. */\n private _focusItem(index: number, step: number, open: boolean) {\n const items = this._items;\n const n = items.length;\n // focus() on a disabled button does nothing, which stranded every item\n // past it, and opening its menu would bypass the disabled state.\n const item = items\n .map((_, i) => items[(((index + step * (i + 1)) % n) + n) % n])\n .find((candidate) => !candidate.matches(':disabled, [aria-disabled=\"true\"]'));\n if (!item) return;\n items.forEach((other) => {\n const menu = Menu.getInstance(other);\n if (other !== item && menu?.isOpen) menu.close();\n });\n item.focus();\n if (open) Menu.getInstance(item)?.open();\n }\n\n private _onFocusin = (e: FocusEvent) => {\n const items = this._items;\n if (!items.includes(e.target as HTMLElement)) return;\n items.forEach((item) => (item.tabIndex = item === e.target ? 0 : -1));\n };\n\n private _onBarKeydown = (e: KeyboardEvent) => {\n if (!Utils.plainKey(e)) return;\n const items = this._items;\n const index = items.indexOf(e.target as HTMLElement);\n if (index < 0) return;\n const step = this._step(e.key);\n // Home and End search from just outside the ends of the bar.\n if (step) this._focusItem(index, step, false);\n else if (e.key === 'Home') this._focusItem(-1, 1, false);\n else if (e.key === 'End') this._focusItem(items.length, -1, false);\n else return;\n e.preventDefault();\n };\n\n // Inside an open menu, Menu handles every key first and takes Left and\n // Right only for submenus; whatever it leaves moves along the bar.\n private _onMenuKeydown = (e: KeyboardEvent) => {\n const step = this._step(e.key);\n if (!step || e.defaultPrevented || !Utils.plainKey(e)) return;\n const items = this._items;\n const path = e.composedPath();\n const index = items.findIndex((item) => {\n const menu = Menu.getInstance(item);\n return menu?.isOpen && menu.menuEl && path.includes(menu.menuEl);\n });\n if (index < 0) return;\n e.preventDefault();\n this._focusItem(index, step, true);\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|