@expressivecss/expressive 0.16.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 +306 -1
- package/README.md +1 -1
- package/dist/css/expressive.css +540 -646
- 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/js/chunks/{chunk-PA7NU5AK.mjs → chunk-26VUH75M.mjs} +6 -3
- package/dist/js/chunks/chunk-26VUH75M.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NBJAUGPP.mjs → chunk-2LFCOGC3.mjs} +12 -23
- package/dist/js/chunks/chunk-2LFCOGC3.mjs.map +7 -0
- package/dist/js/chunks/{chunk-OP43LLIC.mjs → chunk-36GELQGX.mjs} +4 -4
- package/dist/js/chunks/{chunk-OP43LLIC.mjs.map → chunk-36GELQGX.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-EC26RU2D.mjs → chunk-3FKWIRHW.mjs} +6 -2
- package/dist/js/chunks/chunk-3FKWIRHW.mjs.map +7 -0
- package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs → chunk-3KF65KGL.mjs} +3 -3
- package/dist/js/chunks/{chunk-4QUCNFSD.mjs → chunk-3KLZRQZI.mjs} +31 -10
- package/dist/js/chunks/chunk-3KLZRQZI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-75E5EDJF.mjs → chunk-3XORNED5.mjs} +2 -2
- package/dist/js/chunks/{chunk-NNHVANQA.mjs → chunk-4WBGAQN3.mjs} +3 -3
- package/dist/js/chunks/{chunk-ZJNLAGY5.mjs → chunk-5F4URJHL.mjs} +2 -2
- package/dist/js/chunks/{chunk-ZVLOUDIJ.mjs → chunk-67UNY7RH.mjs} +50 -2
- package/dist/js/chunks/chunk-67UNY7RH.mjs.map +7 -0
- package/dist/js/chunks/{chunk-P6DRQ6KS.mjs → chunk-7CXNATJS.mjs} +6 -5
- package/dist/js/chunks/chunk-7CXNATJS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-4TRZ2AER.mjs → chunk-7X44MKEQ.mjs} +15 -14
- package/dist/js/chunks/chunk-7X44MKEQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GWZ76SR4.mjs → chunk-7ZAMOMGY.mjs} +12 -7
- package/dist/js/chunks/chunk-7ZAMOMGY.mjs.map +7 -0
- package/dist/js/chunks/{chunk-GVZQH2H5.mjs → chunk-AEG6LOAJ.mjs} +2 -2
- package/dist/js/chunks/{chunk-Y6TLRA3U.mjs → chunk-AQNFCJJ5.mjs} +27 -21
- package/dist/js/chunks/chunk-AQNFCJJ5.mjs.map +7 -0
- package/dist/js/chunks/{chunk-OUCHKSAW.mjs → chunk-B55LWKBM.mjs} +16 -4
- package/dist/js/chunks/chunk-B55LWKBM.mjs.map +7 -0
- package/dist/js/chunks/{chunk-AI73GJKG.mjs → chunk-BB5VXYXT.mjs} +2 -2
- package/dist/js/chunks/{chunk-2RLBDFH4.mjs → chunk-BDATLH3H.mjs} +4 -4
- package/dist/js/chunks/{chunk-2CS6TITK.mjs → chunk-CWMQOT4O.mjs} +23 -10
- package/dist/js/chunks/chunk-CWMQOT4O.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZKWUWBUB.mjs → chunk-CY2CTOVM.mjs} +2 -2
- package/dist/js/chunks/{chunk-CSYWKEK3.mjs → chunk-DWA5UYLJ.mjs} +58 -27
- package/dist/js/chunks/chunk-DWA5UYLJ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-CMGXGYUC.mjs → chunk-EB2V4OKL.mjs} +14 -9
- package/dist/js/chunks/chunk-EB2V4OKL.mjs.map +7 -0
- package/dist/js/chunks/{chunk-Z4GICXR2.mjs → chunk-EWO662ZC.mjs} +5 -7
- package/dist/js/chunks/chunk-EWO662ZC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VGY4M57S.mjs → chunk-F7LAKFMX.mjs} +67 -34
- package/dist/js/chunks/chunk-F7LAKFMX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-67ZPPKXS.mjs → chunk-FNIIH2LU.mjs} +3 -3
- package/dist/js/chunks/chunk-GE3YMFS6.mjs +15 -0
- package/dist/js/chunks/chunk-GE3YMFS6.mjs.map +7 -0
- package/dist/js/chunks/{chunk-DZYVU75J.mjs → chunk-GFWYMWYN.mjs} +18 -14
- package/dist/js/chunks/chunk-GFWYMWYN.mjs.map +7 -0
- package/dist/js/chunks/{chunk-3L3QIYLC.mjs → chunk-H5ISU45X.mjs} +8 -6
- package/dist/js/chunks/chunk-H5ISU45X.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QXKWVHBD.mjs → chunk-H6YIKFAQ.mjs} +67 -46
- package/dist/js/chunks/chunk-H6YIKFAQ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-KZPSAXIU.mjs → chunk-HEH7E3KO.mjs} +22 -12
- package/dist/js/chunks/chunk-HEH7E3KO.mjs.map +7 -0
- package/dist/js/chunks/{chunk-T3BNSRP3.mjs → chunk-HQRLBTNM.mjs} +3 -3
- package/dist/js/chunks/{chunk-NAC72P7R.mjs → chunk-I2F7MLUU.mjs} +2 -2
- package/dist/js/chunks/{chunk-ZM3XBHWV.mjs → chunk-IQOTGGHX.mjs} +86 -35
- package/dist/js/chunks/chunk-IQOTGGHX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-QACZ6TUP.mjs → chunk-JH3YWKA6.mjs} +5 -4
- package/dist/js/chunks/chunk-JH3YWKA6.mjs.map +7 -0
- package/dist/js/chunks/chunk-JOLJAYIJ.mjs +7 -0
- package/dist/js/chunks/{chunk-4IKVPCSU.mjs.map → chunk-JOLJAYIJ.mjs.map} +1 -1
- package/dist/js/chunks/{chunk-BPF3I2MN.mjs → chunk-KOTGMCMI.mjs} +9 -2
- package/dist/js/chunks/chunk-KOTGMCMI.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ANKFWNWT.mjs → chunk-LC4O5LFS.mjs} +3 -3
- package/dist/js/chunks/{chunk-4PIXLDNJ.mjs → chunk-LEF33SCP.mjs} +2 -2
- package/dist/js/chunks/{chunk-ILDRRG7T.mjs → chunk-LFORZRPH.mjs} +3 -3
- package/dist/js/chunks/{chunk-Z4OARDZ7.mjs → chunk-LWLNV5EC.mjs} +26 -17
- package/dist/js/chunks/chunk-LWLNV5EC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-WU7XJ4RR.mjs → chunk-LXRHUQAX.mjs} +66 -25
- package/dist/js/chunks/chunk-LXRHUQAX.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VMY55K2X.mjs → chunk-MA2SZZFB.mjs} +11 -7
- package/dist/js/chunks/chunk-MA2SZZFB.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VJVQIXHC.mjs → chunk-MDBZAMIV.mjs} +8 -10
- package/dist/js/chunks/chunk-MDBZAMIV.mjs.map +7 -0
- package/dist/js/chunks/{chunk-4EWGD4V2.mjs → chunk-NODZ5VAD.mjs} +2 -2
- package/dist/js/chunks/{chunk-UGJHCHXG.mjs → chunk-O2WJB6TH.mjs} +79 -55
- package/dist/js/chunks/chunk-O2WJB6TH.mjs.map +7 -0
- package/dist/js/chunks/{chunk-7YZ5CN3V.mjs → chunk-PCABY5BN.mjs} +5 -3
- package/dist/js/chunks/chunk-PCABY5BN.mjs.map +7 -0
- package/dist/js/chunks/{chunk-X7SDA2J5.mjs → chunk-PWKYVMND.mjs} +9 -5
- package/dist/js/chunks/{chunk-X7SDA2J5.mjs.map → chunk-PWKYVMND.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-SPPHF7YZ.mjs → chunk-QHZZT7YO.mjs} +35 -14
- package/dist/js/chunks/chunk-QHZZT7YO.mjs.map +7 -0
- package/dist/js/chunks/{chunk-LDXCC2L3.mjs → chunk-QND56EW2.mjs} +5 -4
- package/dist/js/chunks/chunk-QND56EW2.mjs.map +7 -0
- package/dist/js/chunks/{chunk-NVQ5EHCU.mjs → chunk-QNODAANY.mjs} +4 -4
- package/dist/js/chunks/{chunk-7NLUI3RR.mjs → chunk-QRO5FV3I.mjs} +23 -13
- package/dist/js/chunks/chunk-QRO5FV3I.mjs.map +7 -0
- package/dist/js/chunks/{chunk-FCNF4GRJ.mjs → chunk-R7A7JRC5.mjs} +6 -11
- package/dist/js/chunks/chunk-R7A7JRC5.mjs.map +7 -0
- package/dist/js/chunks/{chunk-S23RJ3XY.mjs → chunk-RKG2CBFE.mjs} +4 -16
- package/dist/js/chunks/chunk-RKG2CBFE.mjs.map +7 -0
- package/dist/js/chunks/{chunk-6FSEUFVW.mjs → chunk-RSNS5OYS.mjs} +6 -6
- package/dist/js/chunks/chunk-RSNS5OYS.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ROH2HDB4.mjs → chunk-RUDYMEJ3.mjs} +2 -2
- package/dist/js/chunks/{chunk-BIGU5RCJ.mjs → chunk-STJR62SU.mjs} +13 -5
- package/dist/js/chunks/chunk-STJR62SU.mjs.map +7 -0
- package/dist/js/chunks/{chunk-752ADW4M.mjs → chunk-SUSD4UTN.mjs} +27 -32
- package/dist/js/chunks/chunk-SUSD4UTN.mjs.map +7 -0
- package/dist/js/chunks/{chunk-B7DQFHA5.mjs → chunk-SYBOA5HC.mjs} +7 -12
- package/dist/js/chunks/chunk-SYBOA5HC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-TFABTUAZ.mjs → chunk-T4MOBP3J.mjs} +2 -2
- package/dist/js/chunks/{chunk-GCWWEZKO.mjs → chunk-TM7HPGTV.mjs} +3 -3
- package/dist/js/chunks/{chunk-5KIHWJI2.mjs → chunk-TMQDZSDC.mjs} +34 -12
- package/dist/js/chunks/chunk-TMQDZSDC.mjs.map +7 -0
- package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs → chunk-TVSX5YA2.mjs} +3 -3
- package/dist/js/chunks/{chunk-INLZWHLY.mjs → chunk-UHO5CV6K.mjs} +2 -2
- package/dist/js/chunks/{chunk-INLZWHLY.mjs.map → chunk-UHO5CV6K.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-7YQBHTK3.mjs → chunk-UKCNELUN.mjs} +6 -8
- package/dist/js/chunks/chunk-UKCNELUN.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VH4BMAZS.mjs → chunk-UKQK5GWR.mjs} +13 -13
- package/dist/js/chunks/chunk-UKQK5GWR.mjs.map +7 -0
- package/dist/js/chunks/{chunk-OYNUDOHR.mjs → chunk-UTSLYQ65.mjs} +7 -6
- package/dist/js/chunks/{chunk-OYNUDOHR.mjs.map → chunk-UTSLYQ65.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-7W7TV6NY.mjs → chunk-VS5OJBOD.mjs} +2 -2
- package/dist/js/chunks/{chunk-7W7TV6NY.mjs.map → chunk-VS5OJBOD.mjs.map} +2 -2
- package/dist/js/chunks/{chunk-KYIEG4U3.mjs → chunk-VZMROW5A.mjs} +43 -14
- package/dist/js/chunks/chunk-VZMROW5A.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VFV75DHF.mjs → chunk-XB6Y7P5W.mjs} +11 -12
- package/dist/js/chunks/chunk-XB6Y7P5W.mjs.map +7 -0
- package/dist/js/chunks/{chunk-CZSQHXEV.mjs → chunk-XDAMOMVD.mjs} +20 -21
- package/dist/js/chunks/chunk-XDAMOMVD.mjs.map +7 -0
- package/dist/js/chunks/{chunk-EVCVFEV3.mjs → chunk-XJPMW5SP.mjs} +21 -35
- package/dist/js/chunks/chunk-XJPMW5SP.mjs.map +7 -0
- package/dist/js/chunks/{chunk-VR3L2WN5.mjs → chunk-YKANQILZ.mjs} +7 -6
- package/dist/js/chunks/chunk-YKANQILZ.mjs.map +7 -0
- package/dist/js/chunks/{chunk-JUKBBN6P.mjs → chunk-YLZOJLDI.mjs} +2 -2
- package/dist/js/chunks/{chunk-U4B3VHFS.mjs → chunk-ZK7YY322.mjs} +28 -21
- package/dist/js/chunks/chunk-ZK7YY322.mjs.map +7 -0
- package/dist/js/expressive.cjs +2739 -2387
- package/dist/js/expressive.cjs.map +4 -4
- package/dist/js/expressive.js +2739 -2387
- package/dist/js/expressive.js.map +4 -4
- package/dist/js/expressive.min.js +7 -7
- package/dist/js/expressive.min.js.map +4 -4
- package/dist/js/expressive.mjs +76 -75
- package/dist/js/expressive.mjs.map +1 -1
- package/dist/js/internal/behaviors/bottomSheets.mjs +3 -3
- package/dist/js/internal/behaviors/copy.mjs +3 -3
- package/dist/js/internal/behaviors/dataTables.mjs +2 -4
- 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 +2 -2
- package/dist/js/internal/behaviors/lists.mjs +2 -2
- package/dist/js/internal/behaviors/paneResize.mjs +2 -2
- package/dist/js/internal/behaviors/sheetDrag.mjs +2 -2
- package/dist/js/internal/behaviors/sideSheets.mjs +3 -3
- package/dist/js/internal/behaviors/sortable.mjs +2 -2
- package/dist/js/internal/behaviors/theme.mjs +2 -2
- package/dist/js/internal/behaviors/tour.mjs +2 -2
- package/dist/js/internal/behaviors/transferList.mjs +2 -2
- package/dist/js/internal/components/appBar.mjs +3 -3
- package/dist/js/internal/components/autocomplete.mjs +5 -4
- package/dist/js/internal/components/backToTop.mjs +3 -3
- package/dist/js/internal/components/barChart.mjs +5 -5
- package/dist/js/internal/components/buttonGroup.mjs +3 -3
- 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 +4 -4
- package/dist/js/internal/components/characterCounter.mjs +3 -3
- package/dist/js/internal/components/chips.mjs +7 -6
- package/dist/js/internal/components/colorPicker.mjs +3 -3
- package/dist/js/internal/components/columnChart.mjs +4 -4
- package/dist/js/internal/components/commandPalette.mjs +3 -3
- package/dist/js/internal/components/confetti.mjs +3 -3
- package/dist/js/internal/components/currencyInput.mjs +3 -3
- package/dist/js/internal/components/datepicker.mjs +8 -7
- package/dist/js/internal/components/expandingCard.mjs +3 -3
- package/dist/js/internal/components/funnelChart.mjs +4 -4
- package/dist/js/internal/components/heatmapChart.mjs +4 -4
- package/dist/js/internal/components/hoverCard.mjs +3 -3
- package/dist/js/internal/components/index.mjs +60 -59
- package/dist/js/internal/components/inputMask.mjs +3 -3
- 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 +23 -7
- package/dist/js/internal/components/loadingOverlay.mjs +3 -3
- 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 +4 -4
- package/dist/js/internal/components/messageScroller.mjs +3 -3
- package/dist/js/internal/components/mixedChart.mjs +5 -5
- package/dist/js/internal/components/navigationRail.mjs +3 -3
- package/dist/js/internal/components/particles.mjs +3 -3
- package/dist/js/internal/components/pieChart.mjs +4 -4
- package/dist/js/internal/components/pullToRefresh.mjs +3 -3
- package/dist/js/internal/components/questionnaire.mjs +3 -3
- package/dist/js/internal/components/radarChart.mjs +4 -4
- package/dist/js/internal/components/radialChart.mjs +4 -4
- package/dist/js/internal/components/registry.mjs +59 -58
- package/dist/js/internal/components/richTextEditor.mjs +3 -3
- package/dist/js/internal/components/sankeyChart.mjs +4 -4
- package/dist/js/internal/components/scatterChart.mjs +4 -4
- package/dist/js/internal/components/scrollspy.mjs +3 -3
- package/dist/js/internal/components/select.mjs +5 -4
- package/dist/js/internal/components/showMore.mjs +3 -3
- 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 +3 -3
- package/dist/js/internal/components/tabs.mjs +3 -3
- package/dist/js/internal/components/timepicker.mjs +5 -5
- package/dist/js/internal/components/tooltip.mjs +3 -3
- package/dist/js/internal/components/treeSelect.mjs +6 -5
- package/dist/js/internal/components/treemapChart.mjs +4 -4
- package/dist/js/internal/core/component.mjs +6 -4
- package/dist/js/internal/core/formControl.mjs +2 -2
- package/dist/js/internal/core/imageURL.mjs +7 -0
- package/dist/js/internal/core/imageURL.mjs.map +7 -0
- package/dist/js/internal/core/utils.mjs +11 -1
- package/dist/js/internal/plugins/dockedDisplayPlugin.mjs +2 -2
- package/dist/js/internal/plugins/modalDisplayPlugin.mjs +3 -3
- package/dist/js/modular.mjs +76 -75
- package/dist/types/behaviors/bottomSheets.d.ts +5 -3
- package/dist/types/behaviors/dataTables.d.ts +2 -6
- package/dist/types/behaviors/forms.d.ts +7 -7
- package/dist/types/behaviors/imageCompare.d.ts +2 -1
- package/dist/types/behaviors/transferList.d.ts +2 -0
- package/dist/types/components/autocomplete.d.ts +14 -3
- package/dist/types/components/carousel.d.ts +7 -0
- package/dist/types/components/chips.d.ts +15 -0
- package/dist/types/components/colorPicker.d.ts +14 -0
- package/dist/types/components/currencyInput.d.ts +5 -4
- package/dist/types/components/datepicker.d.ts +54 -27
- package/dist/types/components/funnelChart.d.ts +1 -4
- package/dist/types/components/heatmapChart.d.ts +3 -0
- package/dist/types/components/hoverCard.d.ts +1 -0
- package/dist/types/components/inputMask.d.ts +0 -2
- package/dist/types/components/lineChart.d.ts +43 -5
- package/dist/types/components/mapView.d.ts +113 -11
- package/dist/types/components/menu.d.ts +14 -0
- package/dist/types/components/particles.d.ts +14 -1
- package/dist/types/components/pieChart.d.ts +1 -2
- package/dist/types/components/richTextEditor.d.ts +40 -9
- package/dist/types/components/select.d.ts +1 -3
- package/dist/types/components/showMore.d.ts +2 -0
- package/dist/types/components/slider.d.ts +0 -1
- package/dist/types/components/snackbar.d.ts +7 -1
- package/dist/types/components/tabs.d.ts +3 -3
- package/dist/types/components/timepicker.d.ts +15 -6
- package/dist/types/components/tooltip.d.ts +1 -1
- package/dist/types/components/treemapChart.d.ts +2 -2
- package/dist/types/core/component.d.ts +9 -3
- package/dist/types/core/imageURL.d.ts +2 -0
- package/dist/types/core/utils.d.ts +39 -1
- package/dist/types/modular.d.ts +1 -1
- package/dist/types/plugins/modalDisplayPlugin.d.ts +8 -1
- package/package.json +8 -6
- package/src/sass/abstracts/_mixins.scss +459 -59
- package/src/sass/abstracts/_variables.scss +25 -0
- package/src/sass/components/_accordion.scss +1 -3
- package/src/sass/components/_aura.scss +1 -0
- package/src/sass/components/_back-to-top.scss +3 -3
- package/src/sass/components/_bar-chart.scss +2 -83
- package/src/sass/components/_bottom-sheet.scss +7 -0
- package/src/sass/components/_breadcrumb.scss +1 -7
- package/src/sass/components/_button-groups.scss +15 -38
- package/src/sass/components/_buttons.scss +24 -74
- package/src/sass/components/_calendar.scss +1 -3
- package/src/sass/components/_carousel.scss +10 -10
- package/src/sass/components/_cascader.scss +3 -14
- package/src/sass/components/_column-chart.scss +1 -19
- package/src/sass/components/_confetti.scss +3 -4
- package/src/sass/components/_data-table.scss +10 -0
- package/src/sass/components/_dialog.scss +10 -18
- package/src/sass/components/_expanding-card.scss +1 -5
- package/src/sass/components/_fab-menu.scss +4 -12
- package/src/sass/components/_funnel-chart.scss +1 -62
- package/src/sass/components/_heatmap-chart.scss +2 -6
- package/src/sass/components/_icon-buttons.scss +1 -4
- package/src/sass/components/_line-chart.scss +2 -70
- package/src/sass/components/_map.scss +4 -0
- package/src/sass/components/_marquee.scss +3 -3
- package/src/sass/components/_mega-menu.scss +8 -17
- package/src/sass/components/_menu.scss +10 -11
- package/src/sass/components/_menubar.scss +1 -13
- package/src/sass/components/_mixed-chart.scss +1 -37
- package/src/sass/components/_navbar.scss +11 -16
- package/src/sass/components/_navigation-bar.scss +2 -5
- package/src/sass/components/_navigation-rail.scss +25 -15
- package/src/sass/components/_page-footer.scss +1 -3
- package/src/sass/components/_pagination.scss +3 -14
- package/src/sass/components/_panes.scss +3 -16
- package/src/sass/components/_particles.scss +3 -4
- package/src/sass/components/_pie-chart.scss +8 -70
- package/src/sass/components/_progress.scss +31 -13
- package/src/sass/components/_radar-chart.scss +2 -32
- package/src/sass/components/_radial-chart.scss +2 -48
- package/src/sass/components/_sankey-chart.scss +5 -28
- package/src/sass/components/_scatter-chart.scss +2 -11
- package/src/sass/components/_search.scss +1 -4
- package/src/sass/components/_side-sheet.scss +9 -14
- package/src/sass/components/_skeleton.scss +24 -15
- package/src/sass/components/_snackbar.scss +11 -13
- package/src/sass/components/_table_of_contents.scss +1 -3
- package/src/sass/components/_tabs.scss +4 -20
- package/src/sass/components/_timepicker.scss +2 -1
- package/src/sass/components/_toolbar.scss +1 -4
- package/src/sass/components/_tooltip.scss +9 -5
- package/src/sass/components/_tree.scss +5 -17
- package/src/sass/components/_treemap-chart.scss +2 -26
- package/src/sass/components/forms/_checkboxes.scss +2 -21
- package/src/sass/components/forms/_drop-zone.scss +1 -4
- package/src/sass/components/forms/_fieldset.scss +1 -4
- package/src/sass/components/forms/_file-input.scss +6 -0
- package/src/sass/components/forms/_input-fields.scss +21 -4
- package/src/sass/components/forms/_radio-buttons.scss +2 -24
- package/src/sass/components/forms/_select.scss +6 -7
- package/src/sass/components/forms/_slider.scss +1 -4
- package/src/sass/components/forms/_switches.scss +14 -21
- package/src/sass/utilities/_helpers.scss +1 -1
- package/src/sass/utilities/_visibility.scss +1 -3
- package/dist/js/chunks/chunk-2CS6TITK.mjs.map +0 -7
- package/dist/js/chunks/chunk-3L3QIYLC.mjs.map +0 -7
- package/dist/js/chunks/chunk-4IKVPCSU.mjs +0 -7
- package/dist/js/chunks/chunk-4QUCNFSD.mjs.map +0 -7
- package/dist/js/chunks/chunk-4TRZ2AER.mjs.map +0 -7
- package/dist/js/chunks/chunk-5KIHWJI2.mjs.map +0 -7
- package/dist/js/chunks/chunk-6FSEUFVW.mjs.map +0 -7
- package/dist/js/chunks/chunk-752ADW4M.mjs.map +0 -7
- package/dist/js/chunks/chunk-7NLUI3RR.mjs.map +0 -7
- package/dist/js/chunks/chunk-7YQBHTK3.mjs.map +0 -7
- package/dist/js/chunks/chunk-7YZ5CN3V.mjs.map +0 -7
- package/dist/js/chunks/chunk-B7DQFHA5.mjs.map +0 -7
- package/dist/js/chunks/chunk-BIGU5RCJ.mjs.map +0 -7
- package/dist/js/chunks/chunk-BPF3I2MN.mjs.map +0 -7
- package/dist/js/chunks/chunk-CMGXGYUC.mjs.map +0 -7
- package/dist/js/chunks/chunk-CSYWKEK3.mjs.map +0 -7
- package/dist/js/chunks/chunk-CZSQHXEV.mjs.map +0 -7
- package/dist/js/chunks/chunk-DZYVU75J.mjs.map +0 -7
- package/dist/js/chunks/chunk-EC26RU2D.mjs.map +0 -7
- package/dist/js/chunks/chunk-EVCVFEV3.mjs.map +0 -7
- package/dist/js/chunks/chunk-FCNF4GRJ.mjs.map +0 -7
- package/dist/js/chunks/chunk-GWZ76SR4.mjs.map +0 -7
- package/dist/js/chunks/chunk-KYIEG4U3.mjs.map +0 -7
- package/dist/js/chunks/chunk-KZPSAXIU.mjs.map +0 -7
- package/dist/js/chunks/chunk-LDXCC2L3.mjs.map +0 -7
- package/dist/js/chunks/chunk-NBJAUGPP.mjs.map +0 -7
- package/dist/js/chunks/chunk-OUCHKSAW.mjs.map +0 -7
- package/dist/js/chunks/chunk-P6DRQ6KS.mjs.map +0 -7
- package/dist/js/chunks/chunk-PA7NU5AK.mjs.map +0 -7
- package/dist/js/chunks/chunk-QACZ6TUP.mjs.map +0 -7
- package/dist/js/chunks/chunk-QXKWVHBD.mjs.map +0 -7
- package/dist/js/chunks/chunk-S23RJ3XY.mjs.map +0 -7
- package/dist/js/chunks/chunk-SPPHF7YZ.mjs.map +0 -7
- package/dist/js/chunks/chunk-U4B3VHFS.mjs.map +0 -7
- package/dist/js/chunks/chunk-UGJHCHXG.mjs.map +0 -7
- package/dist/js/chunks/chunk-VFV75DHF.mjs.map +0 -7
- package/dist/js/chunks/chunk-VGY4M57S.mjs.map +0 -7
- package/dist/js/chunks/chunk-VH4BMAZS.mjs.map +0 -7
- package/dist/js/chunks/chunk-VJVQIXHC.mjs.map +0 -7
- package/dist/js/chunks/chunk-VMY55K2X.mjs.map +0 -7
- package/dist/js/chunks/chunk-VR3L2WN5.mjs.map +0 -7
- package/dist/js/chunks/chunk-WU7XJ4RR.mjs.map +0 -7
- package/dist/js/chunks/chunk-Y6TLRA3U.mjs.map +0 -7
- package/dist/js/chunks/chunk-Z4GICXR2.mjs.map +0 -7
- package/dist/js/chunks/chunk-Z4OARDZ7.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZM3XBHWV.mjs.map +0 -7
- package/dist/js/chunks/chunk-ZVLOUDIJ.mjs.map +0 -7
- /package/dist/js/chunks/{chunk-Y6H2X7ZC.mjs.map → chunk-3KF65KGL.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-75E5EDJF.mjs.map → chunk-3XORNED5.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-NNHVANQA.mjs.map → chunk-4WBGAQN3.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZJNLAGY5.mjs.map → chunk-5F4URJHL.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-GVZQH2H5.mjs.map → chunk-AEG6LOAJ.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-AI73GJKG.mjs.map → chunk-BB5VXYXT.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-2RLBDFH4.mjs.map → chunk-BDATLH3H.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZKWUWBUB.mjs.map → chunk-CY2CTOVM.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-67ZPPKXS.mjs.map → chunk-FNIIH2LU.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-T3BNSRP3.mjs.map → chunk-HQRLBTNM.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-NAC72P7R.mjs.map → chunk-I2F7MLUU.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ANKFWNWT.mjs.map → chunk-LC4O5LFS.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-4PIXLDNJ.mjs.map → chunk-LEF33SCP.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ILDRRG7T.mjs.map → chunk-LFORZRPH.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-4EWGD4V2.mjs.map → chunk-NODZ5VAD.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-NVQ5EHCU.mjs.map → chunk-QNODAANY.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ROH2HDB4.mjs.map → chunk-RUDYMEJ3.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-TFABTUAZ.mjs.map → chunk-T4MOBP3J.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-GCWWEZKO.mjs.map → chunk-TM7HPGTV.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-ZO6ZLHFF.mjs.map → chunk-TVSX5YA2.mjs.map} +0 -0
- /package/dist/js/chunks/{chunk-JUKBBN6P.mjs.map → chunk-YLZOJLDI.mjs.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/keypad.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, BaseOptions } from '../core/component';\nimport { Utils } from '../core/utils';\n\nexport interface KeypadOptions extends BaseOptions {\n /**\n * Called after every key press with the text typed ('7', 'A', ' ') or the\n * function key's name ('Backspace', 'Enter', 'Shift').\n * @default null\n */\n onKey: ((key: string) => void) | null;\n /** Text the keypad writes. */\n i18n: Partial<KeypadI18n>;\n}\n\nexport interface KeypadI18n {\n /**\n * The validation message for a field whose keypad-typed value is shorter\n * than its minlength, which the browser only checks after typing.\n */\n tooShort: (minLength: number) => string;\n}\n\nconst _defaults: KeypadOptions = {\n onKey: null,\n i18n: {\n tooShort: (minLength) => `Use at least ${minLength} characters.`\n }\n};\n\ntype Field = HTMLInputElement | HTMLTextAreaElement;\ntype Root = Document | ShadowRoot;\n\nconst isField = (el: unknown): el is Field => el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement;\n\nconst instances = new Set<Keypad>();\n// Fields that have had focus, so their caret is one a person placed.\nconst touched = new WeakSet<Field>();\n// Fields a keypad typed into, with that keypad. A value set by script skips\n// minlength, so the keypad checks the length itself on every input.\nconst typed = new WeakMap<Field, Keypad>();\n// The too-short message a keypad set on a field, so it clears only that one.\nconst marked = new WeakMap<Field, string>();\n\n/** Sets the keypad's too-short message, unless the page set one; '' clears the keypad's own. */\nfunction markShort(field: Field, message: string) {\n if (!message) return unmark(field);\n if (field.validity.customError) return;\n field.setCustomValidity(message);\n marked.set(field, message);\n}\n\n/** Clears the keypad's message, unless the page has since put its own in its place. */\nconst unmark = (field: Field) => {\n if (marked.get(field) === field.validationMessage) field.setCustomValidity('');\n marked.delete(field);\n};\nlet segmenter: Intl.Segmenter | undefined;\n\n// One listener per document or shadow root serves every keypad in it, kept\n// while any keypad lives there. A key inside a keypad belongs to that keypad.\n// A `data-key` key inside a field's `.field` wrapper, such as a trailing\n// Backspace, belongs to the keypad that controls the field, found at press\n// time: a field rendered after init or a changed aria-controls still works,\n// and a press runs once however many keypads share the field. Other buttons\n// there, such as a password toggle, stay their own.\nfunction keyFor(e: Event): [Keypad, HTMLButtonElement] | null {\n const key = (e.target as Element).closest?.('button');\n if (!key) return null;\n const keypad = key.closest('.keypad, .keyboard')?.['Expressive_Keypad'] as Keypad | undefined;\n if (keypad) return [keypad, key];\n const wrapper = key.dataset.key && key.closest('.field');\n if (!wrapper) return null;\n for (const other of instances) {\n const field = other.target;\n if (field && wrapper.contains(field)) return [other, key];\n }\n return null;\n}\n\nconst rootListeners: [string, EventListener][] = [\n // A pointer press on a key would move focus off the field and hide its\n // caret. Keep focus where it is while the field has it.\n ['mousedown', (e) => {\n const hit = keyFor(e);\n if (hit && hit[0]._root?.activeElement === hit[0].target) e.preventDefault();\n }],\n ['click', (e) => {\n const hit = keyFor(e);\n if (hit) hit[0]._press(hit[1]);\n }],\n ['focusin', (e) => {\n if (isField(e.target)) touched.add(e.target);\n }],\n ['input', (e) => {\n if (isField(e.target)) typed.get(e.target)?._checkLength(e.target);\n }],\n // A reset empties the fields, so the keypad's messages go with their values.\n ['reset', (e) => {\n for (const el of (e.target as HTMLFormElement).elements ?? []) if (isField(el)) unmark(el);\n }],\n // A hardware key held down in a field lights the keypad key it matches.\n ['keydown', (e) => light(e, true)],\n ['keyup', (e) => light(e, false)]\n];\nconst attachEvents = ['focusin', 'mousedown', 'click'];\n\n/** Lights or clears the key matching a hardware key; a release clears it wherever focus went. */\nfunction light(e: Event, on: boolean) {\n for (const keypad of instances) {\n if (!on || keypad.target === e.target) keypad._light((e as KeyboardEvent).key, on);\n }\n}\n\n/** Whether a button types its value or runs a function key; any other button is not a key. */\nconst isKey = (key: HTMLButtonElement) => !key.disabled && (!!key.dataset.key || key.hasAttribute('value'));\n\n/** Whether a keypad key is the one a hardware key names, by its function or, ignoring case, its value. */\nconst matches = (key: HTMLButtonElement, name: string) =>\n key.dataset.key === name || (key.hasAttribute('value') && key.value.toLowerCase() === name.toLowerCase());\n\n/**\n * Keypad and keyboard. A `.keypad` or `.keyboard` whose `aria-controls`\n * names a text field types into it: a key's `value` is inserted at the caret,\n * and `data-key=\"Backspace\"`, `\"Enter\"`, `\"Shift\"` and `\"CapsLock\"` edit,\n * submit and capitalize. A `data-key=\"Layer\"` key shows the elements whose\n * `data-layer` matches its `value` and hides the other layers. The field\n * receives the same `input` event typing would fire.\n */\nexport class Keypad extends Component<KeypadOptions> {\n /** @internal */\n _root: Root | null;\n /** Fields this keypad typed into, whose messages it clears on destroy. */\n private _fields = new Set<Field>();\n\n constructor(el: HTMLElement, options: Partial<KeypadOptions>) {\n super(el, options);\n this._root = null;\n instances.add(this);\n this._attach();\n }\n\n // Listen on the keypad's document (9) or shadow root (11). A keypad\n // initialized while detached has neither yet, so it waits on its own element\n // for the first focus or press after insertion. The root listeners added\n // then still hear that same event as it bubbles up.\n private _attach = () => {\n const root = this.el.getRootNode();\n const attached = root.nodeType === 9 || root.nodeType === 11;\n this._waitForInsertion(!attached);\n if (!attached) return;\n this._root = root as Root;\n this._listen('addEventListener');\n const active = this._root.activeElement;\n if (isField(active)) touched.add(active);\n };\n\n private _waitForInsertion(wait: boolean) {\n for (const type of attachEvents) this.el[wait ? 'addEventListener' : 'removeEventListener'](type, this._attach);\n }\n\n // Only the first keypad on a root adds the listeners, and only the last removes them.\n private _listen(method: 'addEventListener' | 'removeEventListener') {\n if (!this._root || this._shared()) return;\n for (const [type, listener] of rootListeners) this._root[method](type, listener);\n }\n\n static get defaults(): KeypadOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Keypad';\n\n destroy() {\n instances.delete(this);\n for (const field of this._fields) {\n unmark(field);\n if (typed.get(field) === this) typed.delete(field);\n }\n this._waitForInsertion(false);\n this._listen('removeEventListener');\n super.destroy();\n }\n\n /** The text field named by `aria-controls`, if there is one. */\n get target(): Field | null {\n const id = this.el.getAttribute('aria-controls');\n const field = id ? Utils.getElementById(this.el, id) : null;\n return isField(field) ? field : null;\n }\n\n // Whether another keypad already listens on this one's root.\n private _shared() {\n for (const other of instances) if (other !== this && other._root === this._root) return true;\n return false;\n }\n\n /** @internal */\n _press(key: HTMLButtonElement) {\n if (!isKey(key)) return;\n // Run the key first: an optional call skips its argument when there is no onKey.\n const pressed = this._act(key);\n this.options.onKey?.(pressed);\n }\n\n /** Runs a key and returns what onKey hears: the typed text or the function key's name. */\n private _act(key: HTMLButtonElement) {\n const name = key.dataset.key;\n if (name === 'Layer') return this._layer(key);\n if (name === 'Shift' || name === 'CapsLock') return this._latch(key, name);\n return this._type(key, name);\n }\n\n /** Shift and Caps Lock latch: pressed until pressed again, or for Shift until the next character. */\n private _latch(key: HTMLButtonElement, name: string) {\n key.setAttribute('aria-pressed', String(key.getAttribute('aria-pressed') !== 'true'));\n return name;\n }\n\n /** Shows the layer the key names and hides the others. */\n private _layer(key: HTMLButtonElement) {\n for (const part of this.el.querySelectorAll<HTMLElement>('[data-layer]')) part.hidden = part.dataset.layer !== key.value;\n return 'Layer';\n }\n\n private _type(key: HTMLButtonElement, name: string | undefined) {\n const text = name ? '' : this._case(key.value);\n const field = this._editable;\n if (field) this._apply(field, name, text);\n return name ?? text;\n }\n\n /** A character as Shift or Caps Lock writes it. Shift is one-shot: it releases after one character. */\n private _case(text: string) {\n const shift = this.el.querySelector('[data-key=\"Shift\"][aria-pressed=\"true\"]');\n shift?.setAttribute('aria-pressed', 'false');\n const upper = shift || this.el.querySelector('[data-key=\"CapsLock\"][aria-pressed=\"true\"]');\n return upper ? text.toUpperCase() : text;\n }\n\n /** The target field, unless it is disabled or read-only. */\n private get _editable(): Field | null {\n const field = this.target;\n return field && !field.matches(':disabled') && !field.readOnly ? field : null;\n }\n\n private _apply(field: Field, name: string | undefined, text: string) {\n if (name === 'Enter') return this._enter(field);\n if (name === 'Backspace') return this._edit(field, '', 'deleteContentBackward');\n if (text) this._edit(field, text, 'insertText');\n }\n\n /** Enter submits an input's form and starts a new line in a textarea. */\n private _enter(field: Field) {\n if (field instanceof HTMLInputElement) field.form?.requestSubmit();\n else this._edit(field, '\\n', 'insertLineBreak');\n }\n\n /** @internal Lights or clears every key a hardware key matches. */\n _light(name: string, on: boolean) {\n for (const key of this.el.querySelectorAll<HTMLButtonElement>('button')) {\n if (matches(key, name)) key.classList.toggle('pressed', on);\n }\n }\n\n /** @internal A non-empty value shorter than minlength is invalid, as typing would make it. */\n _checkLength(field: Field) {\n // Without minlength a field keeps any message the page set.\n if (field.minLength < 1) return;\n const short = field.value.length > 0 && field.value.length < field.minLength;\n markShort(field, short ? this.options.i18n.tooShort!(field.minLength) : '');\n }\n\n private _edit(field: Field, text: string, inputType: string) {\n const { value } = field;\n // Number and email inputs expose no selection; type at the end.\n let start = field.selectionStart ?? value.length;\n let end = field.selectionEnd ?? value.length;\n // A field that has never had focus may report its caret at 0. Type at the\n // end, where a reader expects the next character.\n if (start === 0 && end === 0 && !touched.has(field)) start = end = value.length;\n // Backspace removes the whole character before the caret, emoji included.\n // A short tail holds the last grapheme, so long text is not walked.\n if (inputType === 'deleteContentBackward' && start === end && start) {\n const tail = value.slice(Math.max(0, start - 64), start);\n start -= (segmenter ??= new Intl.Segmenter()).segment(tail).containing(tail.length - 1).segment.length;\n }\n if (start === end && !text) return;\n if (text && field.maxLength >= 0 && value.length - (end - start) + text.length > field.maxLength) return;\n const next = value.slice(0, start) + text + value.slice(end);\n field.value = next;\n // A number input empties itself on a partial value such as \"12.\" or \"-\".\n // Keep what was there; the docs point decimals and signs at a text field.\n if (next && !field.value) {\n field.value = value;\n return;\n }\n if (field.selectionStart !== null) field.setSelectionRange(start + text.length, start + text.length);\n touched.add(field);\n typed.set(field, this);\n this._fields.add(field);\n // Composed, so listeners outside a shadow root hear it as they do typing.\n field.dispatchEvent(new InputEvent('input', { bubbles: true, composed: true, inputType, data: text || null }));\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/datepicker.ts"],
|
|
4
|
-
"sourcesContent": ["import { Utils, pickerFooter } from '../core/utils';\nimport { FormSelect } from './select';\nimport { BaseOptions, Component, I18nOptions } from '../core/component';\nimport { DisplayPlugin, ModalDisplayPlugin, createDisplayPlugin, hideModal } from '../plugins/modalDisplayPlugin';\n\nexport interface DateI18nOptions extends I18nOptions {\n previousMonth: string;\n nextMonth: string;\n months: string[];\n monthsShort: string[];\n weekdays: string[];\n weekdaysShort: string[];\n weekdaysAbbrev: string[];\n}\n\n/** A day in each month, and each weekday from Sunday: 1 January 2023 was one. */\nconst MONTHS = Array.from({ length: 12 }, (_, month) => new Date(Date.UTC(2023, month, 1)));\nconst WEEKDAYS = Array.from({ length: 7 }, (_, day) => new Date(Date.UTC(2023, 0, 1 + day)));\n\ntype WeekLocale = Intl.Locale & { getWeekInfo?(): { firstDay: number }; weekInfo?: { firstDay: number } };\n\n/**\n * Month and weekday names in a language, as Intl writes them, and its first\n * day of the week where the browser knows it. The button words are not\n * dates, so they stay as given.\n */\nfunction localeDates(locale: string) {\n const names = (dates: Date[], options: Intl.DateTimeFormatOptions) => {\n // The picker draws Gregorian dates, so the names are Gregorian too: in fa\n // the default calendar is Persian, whose first month is not January.\n const format = new Intl.DateTimeFormat(locale, { ...options, calendar: 'gregory', timeZone: 'UTC' });\n return dates.map((date) => format.format(date));\n };\n const intl = new Intl.Locale(locale) as WeekLocale;\n // Intl counts the days from Monday (1) to Sunday (7); firstDay counts from Sunday (0).\n const week = intl.getWeekInfo?.() ?? intl.weekInfo;\n return {\n week: week ? { firstDay: week.firstDay % 7 } : {},\n i18n: {\n months: names(MONTHS, { month: 'long' }),\n monthsShort: names(MONTHS, { month: 'short' }),\n weekdays: names(WEEKDAYS, { weekday: 'long' }),\n weekdaysShort: names(WEEKDAYS, { weekday: 'short' }),\n weekdaysAbbrev: names(WEEKDAYS, { weekday: 'narrow' })\n }\n };\n}\n\ntype DateParts = { year?: number; month?: number; day?: number };\ntype Reader = [pattern: string, set: (parts: DateParts, text: string) => void];\n\nconst escapeRegExp = (text: string) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\nconst NUMBER = '(\\\\d{1,2})';\n/** A pattern for any of `names`, and what sets `key` to the index of the one found. */\nconst named = (names: string[], key?: keyof DateParts): Reader => [\n `(${names.map(escapeRegExp).join('|')})`,\n (parts, text) => key && (parts[key] = names.findIndex((name) => name.toLowerCase() === text.toLowerCase()))\n];\n\n/** How each format token reads back. Weekday names are read past, not used. */\nconst READERS: Record<string, (i18n: Partial<DateI18nOptions>) => Reader> = {\n d: () => [NUMBER, (parts, text) => (parts.day = +text)],\n dd: () => [NUMBER, (parts, text) => (parts.day = +text)],\n ddd: (i18n) => named(i18n.weekdaysShort),\n dddd: (i18n) => named(i18n.weekdays),\n m: () => [NUMBER, (parts, text) => (parts.month = +text - 1)],\n mm: () => [NUMBER, (parts, text) => (parts.month = +text - 1)],\n mmm: (i18n) => named(i18n.monthsShort, 'month'),\n mmmm: (i18n) => named(i18n.months, 'month'),\n // As Date.parse reads them: 00 to 49 in this century, 50 to 99 in the last.\n yy: () => ['(\\\\d{2})', (parts, text) => (parts.year = +text + (+text < 50 ? 2000 : 1900))],\n yyyy: () => ['(\\\\d{4})', (parts, text) => (parts.year = +text)]\n};\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n/** What each `format` token writes for a date. */\nconst FORMATS: Record<string, (date: Date, i18n: Partial<DateI18nOptions>) => string | number> = {\n d: (date) => date.getDate(),\n dd: (date) => pad(date.getDate()),\n ddd: (date, i18n) => i18n.weekdaysShort[date.getDay()],\n dddd: (date, i18n) => i18n.weekdays[date.getDay()],\n m: (date) => date.getMonth() + 1,\n mm: (date) => pad(date.getMonth() + 1),\n mmm: (date, i18n) => i18n.monthsShort[date.getMonth()],\n mmmm: (date, i18n) => i18n.months[date.getMonth()],\n yy: (date) => String(date.getFullYear()).slice(2),\n yyyy: (date) => date.getFullYear()\n};\n\n/**\n * Reads a date written in a string format with the names it was written\n * in, so a German \"M\u00E4r 15, 2026\" reads back as Date.parse never would.\n * Null for text that does not fit the format, or a day the month lacks.\n */\nexport function readDate(value: string, format: string, i18n: Partial<DateI18nOptions>): Date | null {\n const readers: Reader[] = [];\n const pattern = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g).map((token) => {\n const reader = READERS[token]?.(i18n);\n if (reader) readers.push(reader);\n return reader ? reader[0] : escapeRegExp(token);\n });\n const match = new RegExp(`^\\\\s*${pattern.join('')}\\\\s*$`, 'iu').exec(value);\n if (!match) return null;\n const parts: DateParts = {};\n readers.forEach(([, set], i) => set(parts, match[i + 1]));\n // setFullYear keeps a year below 100, which the Date constructor moves to the 1900s.\n const date = new Date(2000, 0, 1);\n date.setFullYear(parts.year, parts.month, parts.day);\n const same = [date.getFullYear(), date.getMonth(), date.getDate()].join() === [parts.year, parts.month, parts.day].join();\n return same ? date : null;\n}\n\n/**\n * The options under the page's: with a `lang` on or around the input, its\n * month and weekday names and first day of the week.\n */\nfunction withLocale(el: Element, options: Partial<DatepickerOptions> = {}): Partial<DatepickerOptions> {\n const locale = Utils.locale(el);\n if (!locale) return options;\n const { week, i18n } = localeDates(locale);\n return { ...week, ...options, i18n: { ...i18n, ...options.i18n } };\n}\n\nexport interface DatepickerOptions extends BaseOptions {\n /**\n * The date output format for the input field value\n * or a function taking the date and outputting the\n * formatted date string.\n * @default 'mmm dd, yyyy'\n */\n format: string | ((d: Date) => string);\n /**\n * Used to create date object from current input string.\n * Receives the format string, or an empty string when format is a function.\n * Not called for blank input.\n * @default null\n */\n parse: ((value: string, format: string) => Date) | null;\n /**\n * The initial condition if the datepicker is based on date range.\n * @default false\n */\n isDateRange: boolean;\n /**\n * The selector of the user specified date range end element\n */\n dateRangeEndEl: string | null;\n /**\n * The initial condition if the datepicker is based on multiple date selection.\n * @default false\n */\n isMultipleSelection: boolean;\n /**\n * The initial date to view when first opened.\n * @default null\n */\n defaultDate: Date | null;\n /**\n * The initial end date to view when first opened.\n * @default null\n */\n defaultEndDate: Date | null;\n /**\n * Make the `defaultDate` the initial selected value.\n * @default false\n */\n setDefaultDate: boolean;\n /**\n * Make the `defaultEndDate` the initial selected value.\n * @default false\n */\n setDefaultEndDate: boolean;\n /**\n * Prevent selection of any date on the weekend.\n * @default false\n */\n disableWeekends: boolean;\n /**\n * Custom function to disable certain days.\n * @default null\n */\n disableDayFn: ((day: Date) => boolean) | null;\n /**\n * First day of week (0: Sunday, 1: Monday etc).\n * @default 0, or the first day in the input's `lang` where the browser knows it\n */\n firstDay: number;\n /**\n * The earliest date that can be selected.\n * @default null\n */\n minDate: Date | null;\n /**\n * The latest date that can be selected.\n * @default null\n */\n maxDate: Date | null;\n /**\n * Number of years either side, or array of upper/lower range.\n * @default 10\n */\n yearRange: number | number[];\n /**\n * Sort year range in reverse order.\n * @default false\n */\n yearRangeReverse: boolean;\n /**\n * Changes Datepicker to RTL.\n * @default false\n */\n isRTL: boolean;\n /**\n * Show month after year in Datepicker title.\n * @default false\n */\n showMonthAfterYear: boolean;\n /**\n * Render days of the calendar grid that fall in the next\n * or previous month.\n * @default false\n */\n showDaysInNextAndPreviousMonths: boolean;\n /**\n * Specify if the docked datepicker is in open state by default\n */\n openByDefault: boolean;\n /**\n * Specify a DOM element OR selector for a DOM element to render\n * the calendar in, by default it will be placed before the input.\n * @default null\n */\n container: HTMLElement | string | null;\n /**\n * Show the clear button in the datepicker.\n * @default false\n */\n showClearBtn: boolean;\n /**\n * Autosubmit calendar day select to input field\n * @default true\n */\n autoSubmit: boolean;\n /**\n * Internationalization options. With a `lang` on or around the input, the\n * month and weekday names default to that language's, as Intl writes them.\n */\n i18n: Partial<DateI18nOptions>;\n /**\n * An array of string returned by `Date.toDateString()`,\n * indicating there are events in the specified days.\n * @default []\n */\n events: string[];\n /**\n * Callback function when date is selected,\n * first parameter is the newly selected date.\n * @default null\n */\n onSelect: ((selectedDate: Date) => void) | null;\n /**\n * Callback function when Datepicker HTML is refreshed.\n * @default null\n */\n onDraw: (() => void) | null;\n /**\n * Callback function for interaction with input field.\n * @default null\n */\n onInputInteraction: (() => void) | null;\n /**\n * Callback function for interaction with confirm button.\n * @default null\n */\n onConfirm: (() => void) | null;\n /**\n * Callback function for interaction with close button.\n * @default null\n */\n onCancel: (() => void) | null;\n\n /** Field used for internal calculations DO NOT CHANGE IT */\n minYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxYear?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n minMonth?: number;\n /** Field used for internal calculations DO NOT CHANGE IT */\n maxMonth?: number;\n /**\n * Display plugin: 'docked' for a popover under the input, or 'modal' for a\n * dialog with Cancel and Ok. A modal picker is always open inside its\n * dialog and writes the input only on Ok, so it sets `openByDefault` and\n * clears `autoSubmit`.\n */\n displayPlugin: string;\n /**\n * Configurable display plugin options\n */\n displayPluginOptions: object;\n}\n\nconst _defaults: DatepickerOptions = {\n // the default output format for the input field value\n format: 'mmm dd, yyyy',\n // Used to create date object from current input string\n parse: null,\n // The initial condition if the datepicker is based on date range\n isDateRange: false,\n // The selector of the user specified date range end element\n dateRangeEndEl: null,\n // The initial condition if the datepicker is based on multiple date selection\n isMultipleSelection: false,\n // The initial date to view when first opened\n defaultDate: null,\n // The initial end date to view when first opened\n defaultEndDate: null,\n // Make the `defaultDate` the initial selected value\n setDefaultDate: false,\n // Make the `defaultEndDate` the initial selected value\n setDefaultEndDate: false,\n disableWeekends: false,\n disableDayFn: null,\n // First day of week (0: Sunday, 1: Monday etc)\n firstDay: 0,\n // The earliest date that can be selected\n minDate: null,\n // Thelatest date that can be selected\n maxDate: null,\n // Number of years either side, or array of upper/lower range\n yearRange: 10,\n // used internally (don't config outside)\n minYear: 0,\n maxYear: 9999,\n minMonth: undefined,\n maxMonth: undefined,\n isRTL: false,\n yearRangeReverse: false,\n // Render the month after year in the calendar title\n showMonthAfterYear: false,\n // Render days of the calendar grid that fall in the next or previous month\n showDaysInNextAndPreviousMonths: false,\n // Specify if docked picker is in open state by default\n openByDefault: false,\n // Specify a DOM element to render the calendar in\n container: null,\n // Show clear button\n showClearBtn: false,\n // Autosubmit\n autoSubmit: true,\n // internationalization\n i18n: {\n cancel: 'Cancel',\n clear: 'Clear',\n done: 'Ok',\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n ],\n monthsShort: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec'\n ],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n weekdaysAbbrev: ['S', 'M', 'T', 'W', 'T', 'F', 'S']\n },\n // events array\n events: [],\n // callback function\n onSelect: null,\n onDraw: null,\n onInputInteraction: null,\n displayPlugin: null,\n displayPluginOptions: null,\n onConfirm: null,\n onCancel: null,\n};\n\nexport class Datepicker extends Component<DatepickerOptions> {\n declare el: HTMLInputElement;\n id: string;\n multiple: boolean = false;\n calendarEl: HTMLElement;\n containerEl: HTMLElement;\n dateTextEl: HTMLElement;\n endDateEl: HTMLInputElement;\n dateEls: HTMLInputElement[];\n /** The selected Date. */\n date: Date;\n endDate: null | Date;\n dates: Date[];\n calendars: [{ month: number; year: number }];\n private displayPlugin: DisplayPlugin;\n /** What setInputValue last wrote, so reading it back does not depend on the parser. */\n private _writtenInputs = new WeakMap<HTMLInputElement, { value: string; date: Date | null }>();\n private _form: HTMLFormElement | null = null;\n private _resetDates = new WeakMap<HTMLInputElement, { value: string; date: Date | null }>();\n // Counts selections, so a callback that selects again silences the stale event.\n private _selection = 0;\n private _resetTimer: ReturnType<typeof setTimeout>;\n private footer: HTMLElement;\n /** Nesting depth of {@link _batchDraws}; > 0 means draws are being collected. */\n private _drawDepth = 0;\n /** Whether a draw was requested while batching. */\n private _drawDirty = false;\n /** Shape of the currently rendered controls; see {@link _controlsCacheKey}. */\n private _controlsKey: string = null;\n /** id linking the controls element to the table's aria-labelledby. */\n private _randId: string = null;\n private _focusedDate: Date = null;\n static _template: string;\n\n constructor(el: HTMLInputElement, options: Partial<DatepickerOptions>) {\n options = withLocale(el, options);\n super(el, options);\n\n // A modal calendar is always open in its dialog and writes on Ok.\n if (this.options.displayPlugin === 'modal') Object.assign(this.options, { openByDefault: true, autoSubmit: false });\n\n // Remove time component from minDate and maxDate options, on copies: the\n // caller's Date objects are theirs.\n const { minDate, maxDate } = this.options;\n if (minDate) this.options.minDate = new Date(new Date(minDate.getTime()).setHours(0, 0, 0, 0));\n if (maxDate) this.options.maxDate = new Date(new Date(maxDate.getTime()).setHours(0, 0, 0, 0));\n\n this.id = Utils.guid();\n if (this.options.isMultipleSelection) {\n this.multiple = true;\n this.dates = [];\n this.dateEls = [el];\n }\n\n this._setupVariables();\n this._insertHTMLIntoDOM();\n this._setupEventHandlers();\n\n const fromValue = !this.options.defaultDate;\n if (fromValue) {\n this.options.defaultDate = this._parseInput(this.el.value);\n }\n\n const defDate = this.options.defaultDate;\n if (Datepicker._isDate(defDate)) {\n if (this.options.setDefaultDate) {\n this.setDate(defDate, true);\n this.setInputValue(this.el, defDate);\n } else if (fromValue && this._isSelectableDay(defDate)) {\n // The input already holds this date, so it is the selection, as it\n // is once the input is clicked. Its text is left as written.\n this.setDate(defDate, true);\n } else {\n this.gotoDate(defDate);\n }\n } else {\n this.gotoDate(new Date());\n }\n if (this.options.isDateRange) {\n this.multiple = true;\n const defEndDate = this.options.defaultEndDate;\n if (Datepicker._isDate(defEndDate)) {\n if (this.options.setDefaultEndDate) {\n this.setDate(defEndDate, true, true);\n this.setInputValue(this.endDateEl, defEndDate);\n }\n }\n }\n this.displayPlugin = createDisplayPlugin(this.options.displayPlugin, this.el, this.containerEl, this.options.displayPluginOptions, this._cancel);\n if (this.endDateEl) this.displayPlugin?.triggers.push(this.endDateEl);\n // A form reset brings back these texts long after the cache of written\n // values has moved on, so keep the dates they stood for.\n for (const input of [this.el, this.endDateEl]) this._rememberResetDate(input);\n }\n\n // Only a default the picker wrote needs this: any other default text parses\n // at reset exactly as it did here.\n private _rememberResetDate(input: HTMLInputElement | undefined) {\n const written = input && this._writtenInputs.get(input);\n if (written && written.value === input.defaultValue) this._resetDates.set(input, written);\n }\n\n static get defaults() {\n return _defaults;\n }\n\n /**\n * Escape a value for interpolation into the calendar markup.\n *\n * `draw()` assembles the calendar as an HTML string, so every value that is\n * not a number this class computed itself has to go through here. In\n * practice that means the i18n strings: month and weekday names are the one\n * part of a datepicker that routinely comes from a translation file, and a\n * translation file is as trustworthy as whatever wrote it.\n */\n static _escape(value: unknown): string {\n return String(value ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n static _isDate(obj) {\n return /Date/.test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n }\n\n /**\n * A value read without a custom parser: in the picker's own string format\n * with its names, or else as an ISO date or by the browser.\n */\n private _readDefault(value: string, el: HTMLInputElement): Date {\n const { format, i18n } = this.options;\n // A native date input's value is ISO, whatever the display format.\n const read = typeof format === 'string' && el.type !== 'date' ? readDate(value, format, i18n) : null;\n return read ?? Datepicker._parseDate(value);\n }\n\n private static _parseDate(value: string): Date {\n value = value.trim();\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return new Date(Date.parse(value));\n // An ISO time without an offset is local. Reject days that roll into the next month.\n const date = new Date(value + 'T00:00:00');\n return date.getDate() === Number(value.slice(-2)) ? date : new Date(NaN);\n }\n\n private _parseInput(value: string, el: HTMLInputElement = this.el as HTMLInputElement): Date {\n if (!value.trim() || !this.options.parse) return this._readDefault(value, el);\n return this.options.parse(\n value,\n typeof this.options.format === 'string' ? this.options.format : ''\n );\n }\n\n /**\n * @deprecated as this function has no effect without any return statement or global parameter setter.\n */\n static _setToStartOfDay(date) {\n if (Datepicker._isDate(date)) date.setHours(0, 0, 0, 0);\n }\n\n static _compareDates(a, b) {\n // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n return a.getTime() === b.getTime();\n }\n\n static key = 'Expressive_Datepicker';\n\n destroy() {\n this._events.abort();\n clearTimeout(this._resetTimer);\n this.dateEls?.slice(1).forEach(input => this._removeDateInput(input));\n if (!this.options.dateRangeEndEl && this.endDateEl) this._removeDateInput(this.endDateEl);\n this.displayPlugin?.destroy();\n this.containerEl.remove();\n this.destroySelects();\n this._removeDateOverlay();\n super.destroy();\n }\n\n // CSS paints data-date over a native date input's own text.\n private _removeDateOverlay() {\n this.el.classList.remove('datepicker-date-input');\n for (const input of [this.el, this.endDateEl]) if (input?.type === 'date') input.removeAttribute('data-date');\n }\n\n destroySelects() {\n this._formSelect('.orig-select-year')?.destroy();\n this._formSelect('.orig-select-month')?.destroy();\n }\n\n _insertHTMLIntoDOM() {\n // HTML5 input date field support\n if (this.el.type == 'date') {\n this.el.classList.add('datepicker-date-input');\n }\n\n // `!x === null` is always false, so this never ran; _renderDateInputFormat\n // now no-ops on its own when there is no hint element to fill in.\n this._renderDateInputFormat(this.el);\n\n if (this.options.isDateRange) {\n this.containerEl.classList.add('daterange');\n if (!this.options.dateRangeEndEl) {\n this.endDateEl = this.createDateInput();\n this.endDateEl.classList.add('datepicker-end-date');\n } else {\n // querySelector returns null, never undefined: the old check compared\n // against undefined, so a miss skipped the warning and fell through to\n // dereferencing null.\n this.endDateEl = document.querySelector(this.options.dateRangeEndEl);\n if (!this.endDateEl) {\n console.warn('Specified date range end input element in dateRangeEndEl not found');\n } else {\n this._renderDateInputFormat(this.endDateEl);\n }\n }\n }\n\n pickerFooter(this.footer, this.options, 'datepicker-clear', this._handleClearClick, this._confirm, this._cancel);\n\n if (this.options.container) {\n const optEl = this.options.container;\n this.options.container =\n optEl instanceof HTMLElement ? optEl : (document.querySelector(optEl) as HTMLElement);\n this.options.container.append(this.containerEl);\n } else {\n const appendTo = !this.endDateEl ? this.el : this.endDateEl;\n if (!this.options.openByDefault) (this.containerEl as HTMLElement).setAttribute('style', 'display: none; visibility: hidden;');\n appendTo.parentElement.after(this.containerEl);\n }\n }\n\n /**\n * Renders the date input format into the optional `.datepicker-format` hint\n * next to the input, if the consumer provided one.\n */\n _renderDateInputFormat(el: HTMLInputElement) {\n const formatEl = el.parentElement?.querySelector('.datepicker-format');\n if (!formatEl) return;\n // textContent, and nothing at all for a function format: this used to be\n // `innerHTML = format.toString()`, which rendered a format string as\n // markup and dumped a function's entire source into the page.\n formatEl.textContent =\n typeof this.options.format === 'function' ? '' : String(this.options.format);\n }\n\n /**\n * Gets a string representation of the given date.\n */\n toString(date: Date = this.date, format: string | ((d: Date) => string) = null): string {\n format = format || this.options.format;\n if (typeof format === 'function') return format(date);\n if (!Datepicker._isDate(date)) return '';\n // String Format\n return this.formatDate(date, format);\n }\n\n /**\n * Returns the formatted date.\n */\n formatDate(date: Date, format: string) {\n const formatArray = format.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);\n return formatArray\n .map((label) => (FORMATS[label] ? FORMATS[label](date, this.options.i18n) : label))\n .join('');\n }\n\n /**\n * Sets date from input field.\n */\n setDateFromInput(el: HTMLInputElement) {\n // The native input's overlay follows edits, including cleared or partial values.\n this._syncDataDate(el);\n if ((this.options.isDateRange || !this.options.isMultipleSelection) && !el.value.trim()) {\n this.setSingleDate(null, el === this.endDateEl);\n this.draw();\n return;\n }\n const parsedDate = this._dateInInput(el);\n if (!Datepicker._isDate(parsedDate)) return;\n const date = new Date(parsedDate.getTime());\n Datepicker._setToStartOfDay(date);\n const isEndDate = el === this.endDateEl;\n // A day the calendar would not let anyone pick, or a range end before its\n // start, puts the input back to the date already chosen. The typed text\n // is what the form submits, so it cannot be left behind a clamped date.\n const outOfOrder = this.options.isDateRange && (isEndDate\n ? this.date && date < this.date\n : this.endDate && date > this.endDate);\n if (outOfOrder || this._isDisabledDay(date)) {\n this.setInputValue(el, this._selectedDateFor(el));\n return;\n }\n this._selectTypedMultiDate(el, date);\n this.setDate(date, false, isEndDate, true);\n }\n\n // setDate does not toggle a typed date into a multiple selection, so it goes\n // in here, in place of the date its input showed. Re-reading an input on\n // click leaves the selection as it was.\n private _selectTypedMultiDate(el: HTMLInputElement, date: Date) {\n if (!this.options.isMultipleSelection) return;\n const shown = this._selectedDateFor(el);\n this.dates = this.dates.filter((day) => day !== shown && day.getTime() !== date.getTime());\n this.setMultiDate(date);\n }\n\n /**\n * Set a date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param preventOnSelect Undocumented as of 5 March 2018.\n * @param isEndDate\n * @param fromUserInput\n */\n setDate(\n date: Date = null,\n preventOnSelect: boolean = false,\n isEndDate: boolean = false,\n fromUserInput: boolean = false\n ) {\n const selectedDate = this.validateDate(date);\n if (!selectedDate) {\n return;\n }\n Datepicker._setToStartOfDay(selectedDate);\n // Silent updates count too: they replace whatever an outer call reports.\n const selection = ++this._selection;\n if (!this.options.isMultipleSelection) this.setSingleDate(selectedDate, isEndDate);\n else if (!fromUserInput) this.setMultiDate(selectedDate);\n this.gotoDate(selectedDate);\n if (preventOnSelect) return;\n this._notify('select', this.options.onSelect, { args: [selectedDate], detail: { date: selectedDate }, current: () => selection === this._selection });\n }\n\n validateDate(date: Date) {\n if (!date) {\n this._renderDateDisplay(date);\n return this.draw();\n }\n if (typeof date === 'string') {\n date = Datepicker._parseDate(date);\n }\n if (!Datepicker._isDate(date)) {\n return;\n }\n const min = this.options.minDate,\n max = this.options.maxDate;\n if (Datepicker._isDate(min) && date < min) {\n date = min;\n } else if (Datepicker._isDate(max) && date > max) {\n date = max;\n }\n return new Date(date.getTime());\n }\n\n /**\n * The date an input holds. Without a custom parser, Date.parse reads\n * \"05/10/2026\" from a dd/mm/yyyy format as 10 May, so reuse the date behind\n * a value the picker wrote, or behind the value the input resets to.\n */\n _dateInInput(el: HTMLInputElement): Date | null {\n const known = !this.options.parse && [this._writtenInputs.get(el), this._resetDates.get(el)]\n .find((entry) => entry?.value === el.value);\n return known ? known.date : this._parseInput(el.value, el);\n }\n\n /** The selected date an input shows: its place in `dates` for a multiple selection. */\n _selectedDateFor(el: HTMLInputElement): Date | null {\n if (this.options.isMultipleSelection) return this.dates[this.dateEls.indexOf(el)] ?? null;\n return el === this.endDateEl ? this.endDate : this.date;\n }\n\n /** `_isDisabledDay` for a date that may carry a time of day. */\n _isSelectableDay(date: Date): boolean {\n const day = new Date(date.getTime());\n Datepicker._setToStartOfDay(day);\n return !this._isDisabledDay(day);\n }\n\n /** Whether the calendar shows `day` as disabled: outside the bounds, or refused by an option. */\n _isDisabledDay(day: Date): boolean {\n return this._isOutOfBounds(day) || this._isRefusedDay(day);\n }\n\n _isOutOfBounds(day: Date): boolean {\n const { minDate, maxDate } = this.options;\n return (minDate && day < minDate) || (maxDate && day > maxDate);\n }\n\n _isRefusedDay(day: Date): boolean {\n const { disableWeekends, disableDayFn } = this.options;\n return (disableWeekends && [0, 6].includes(day.getDay())) || !!disableDayFn?.(day);\n }\n\n /**\n * Set a single date on the datepicker.\n * @param date Date to set on the datepicker.\n * @param isEndDate\n */\n setSingleDate(date: Date, isEndDate: boolean) {\n if (!isEndDate) {\n this.date = date;\n } else {\n this.endDate = date;\n }\n }\n\n /**\n * Set a multi date on the datepicker.\n * @param date Date to set on the datepicker.\n */\n setMultiDate(date: Date) {\n const index = this.dates.findIndex((item) => item.getTime() === date.getTime());\n if (index === -1) {\n this.dates.push(date);\n } else {\n this.dates.splice(index, 1);\n }\n this.dates.sort((a: Date, b: Date) => a.getTime() - b.getTime());\n }\n\n /**\n * Sets the data-date attribute on the date input field\n */\n setDataDate(el, date) {\n el.setAttribute('data-date', Datepicker._isDate(date) ? this.toString(date) : '');\n }\n\n /**\n * Sets dates on the input values.\n */\n setInputValues() {\n if (!this.options?.isMultipleSelection) {\n this.setInputValue(this.el, this.date);\n if (this.options?.isDateRange) {\n this.setInputValue(this.endDateEl, this.endDate);\n }\n return;\n }\n this.setMultipleSelectionInputValues();\n }\n\n setMultipleSelectionInputValues() {\n const count = Math.max(1, this.dates.length);\n for (const input of this.dateEls.splice(count)) this._removeDateInput(input);\n while (this.dateEls.length < count) this.dateEls.push(this.createDateInput());\n this.dateEls.forEach((input, index) => this.setInputValue(input, this.dates[index] ?? null));\n }\n\n /**\n * Sets given date as the input value on the given element.\n */\n setInputValue(el, date) {\n if (!el) return;\n if (el.type == 'date') this.setDataDate(el, date);\n if (!Datepicker._isDate(date)) {\n el.value = '';\n } else if (el.type == 'date') {\n el.value = this.formatDate(date, 'yyyy-mm-dd');\n } else {\n el.value = this.toString(date);\n }\n this._writtenInputs.set(el, { value: el.value, date: Datepicker._isDate(date) ? new Date(date.getTime()) : null });\n el.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n cancelable: true,\n composed: true,\n detail: { firedBy: this }\n })\n );\n }\n\n /**\n * Renders the date in the modal head section.\n */\n _renderDateDisplay(date: Date, endDate: Date = null) {\n const displayDate = Datepicker._isDate(date) ? date : new Date();\n // @todo should we include an option for date formatting by component options?\n // textContent: formatDate splices i18n month and weekday names in.\n if (!this.options.isDateRange) {\n this.dateTextEl.textContent = this.formatDate(displayDate, 'ddd, mmm d');\n } else {\n const displayEndDate = Datepicker._isDate(endDate) ? endDate : new Date();\n this.dateTextEl.textContent = `${this.formatDate(displayDate, 'mmm d')} - ${this.formatDate(displayEndDate, 'mmm d')}`;\n }\n }\n\n /**\n * Change date view to a specific date on the datepicker.\n * @param date Date to show on the datepicker.\n */\n gotoDate(date: Date) {\n let newCalendar = true;\n if (!Datepicker._isDate(date)) {\n return;\n }\n if (this.calendars) {\n const firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n lastVisibleDate = new Date(\n this.calendars[this.calendars.length - 1].year,\n this.calendars[this.calendars.length - 1].month,\n 1\n ),\n visibleDate = date.getTime();\n // get the end of the month\n lastVisibleDate.setMonth(lastVisibleDate.getMonth() + 1);\n lastVisibleDate.setDate(lastVisibleDate.getDate() - 1);\n newCalendar =\n visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate;\n }\n if (newCalendar) {\n this.calendars = [\n {\n month: date.getMonth(),\n year: date.getFullYear()\n }\n ];\n }\n this.adjustCalendars();\n }\n\n adjustCalendars() {\n this.calendars[0] = this.adjustCalendar(this.calendars[0]);\n this.draw();\n }\n\n adjustCalendar(calendar) {\n if (calendar.month < 0) {\n calendar.year -= Math.ceil(Math.abs(calendar.month) / 12);\n calendar.month += 12;\n }\n if (calendar.month > 11) {\n calendar.year += Math.floor(Math.abs(calendar.month) / 12);\n calendar.month -= 12;\n }\n return calendar;\n }\n\n nextMonth() {\n this.calendars[0].month++;\n this.adjustCalendars();\n }\n\n prevMonth() {\n this.calendars[0].month--;\n this.adjustCalendars();\n }\n\n render(year, month, randId) {\n const now = new Date(),\n // Day 0 of the next month is the last of this one.\n days = new Date(year, month + 1, 0).getDate(),\n data = [];\n let before = new Date(year, month, 1).getDay(),\n row = [];\n Datepicker._setToStartOfDay(now);\n if (this.options.firstDay > 0) {\n before -= this.options.firstDay;\n if (before < 0) {\n before += 7;\n }\n }\n const previousMonth = month === 0 ? 11 : month - 1,\n nextMonth = month === 11 ? 0 : month + 1,\n yearOfPreviousMonth = month === 0 ? year - 1 : year,\n yearOfNextMonth = month === 11 ? year + 1 : year,\n daysInPreviousMonth = new Date(year, month, 0).getDate();\n const cells = Math.ceil((days + before) / 7) * 7;\n for (let i = 0, r = 0; i < cells; i++) {\n const day = new Date(year, month, 1 + (i - before)),\n isToday = Datepicker._compareDates(day, now),\n hasEvent = this.options.events.indexOf(day.toDateString()) !== -1,\n isEmpty = i < before || i >= days + before,\n isDisabled = this._isDisabledDay(day),\n isDateRangeStart = this.options.isDateRange && this.date && this.endDate && Datepicker._compareDates(this.date, day),\n isDateRangeEnd = this.options.isDateRange && this.endDate && Datepicker._compareDates(this.endDate, day),\n isDateRange =\n this.options.isDateRange &&\n [this.date, this.endDate].every(Datepicker._isDate) &&\n day > this.date &&\n day < this.endDate;\n let dayNumber = 1 + (i - before),\n monthNumber = month,\n yearNumber = year;\n\n let isSelected = false;\n if (Datepicker._isDate(this.date)) {\n isSelected = Datepicker._compareDates(day, this.date);\n }\n\n if (!isSelected && Datepicker._isDate(this.endDate)) {\n isSelected = Datepicker._compareDates(day, this.endDate);\n }\n\n if (\n this.options.isMultipleSelection &&\n this.dates?.some((item) => item.getTime() === day.getTime())\n ) {\n isSelected = true;\n }\n\n if (isEmpty) {\n if (i < before) {\n dayNumber = daysInPreviousMonth + dayNumber;\n monthNumber = previousMonth;\n yearNumber = yearOfPreviousMonth;\n } else {\n dayNumber = dayNumber - days;\n monthNumber = nextMonth;\n yearNumber = yearOfNextMonth;\n }\n }\n\n const dayConfig = {\n day: dayNumber,\n month: monthNumber,\n year: yearNumber,\n hasEvent: hasEvent,\n isSelected: isSelected,\n isToday: isToday,\n isDisabled: isDisabled,\n isEmpty: isEmpty,\n showDaysInNextAndPreviousMonths: this.options.showDaysInNextAndPreviousMonths,\n isDateRangeStart: isDateRangeStart,\n isDateRangeEnd: isDateRangeEnd,\n isDateRange: isDateRange\n };\n\n row.push(this.renderDay(dayConfig));\n\n if (++r === 7) {\n data.push(this.renderRow(row, this.options.isRTL, false));\n row = [];\n r = 0;\n }\n }\n return this.renderTable(this.options, data, randId);\n }\n\n renderDay(opts) {\n const classMap = {\n isDisabled: 'is-disabled',\n isToday: 'is-today',\n isSelected: 'is-selected',\n hasEvent: 'has-event',\n isDateRangeStart: 'is-daterange-start',\n isDateRangeEnd: 'is-daterange-end',\n isDateRange: 'is-daterange'\n },\n ariaSelected = opts.isSelected === true || opts.isDateRange === true,\n arr = ['datepicker-day'];\n\n if (opts.isEmpty) {\n if (opts.showDaysInNextAndPreviousMonths) {\n arr.push('is-outside-current-month');\n arr.push('is-selection-disabled');\n } else {\n return '<td class=\"is-empty\"></td>';\n }\n }\n\n for (const [property, className] of Object.entries(classMap)) {\n if (opts.hasOwnProperty(property) && opts[property]) {\n arr.push(className);\n }\n }\n\n const day = Datepicker._escape(opts.day);\n const month = Datepicker._escape(opts.month);\n const year = Datepicker._escape(opts.year);\n return (\n `<td data-day=\"${day}\" class=\"${arr.join(' ')}\" aria-selected=\"${ariaSelected}\">` +\n `<button class=\"datepicker-day-button\" type=\"button\" data-year=\"${year}\" data-month=\"${month}\" data-day=\"${day}\">${day}</button>` +\n '</td>'\n );\n }\n\n /** Assemble calendar cells; reject unsupported elements and attributes. */\n renderRow(days, isRTL, isRowSelected) {\n const row =\n '<tr class=\"datepicker-row' +\n (isRowSelected ? ' is-selected' : '') +\n '\">' +\n Datepicker._calendarMarkup((isRTL ? days.reverse() : days).join(''), 'tr') +\n '</tr>';\n return row;\n }\n\n /** Assemble calendar rows; reject unsupported elements and attributes. */\n renderTable(opts, data, randId) {\n return (\n '<div class=\"datepicker-table-wrapper\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"datepicker-table\" role=\"grid\" aria-labelledby=\"' +\n Datepicker._escape(randId) +\n '\">' +\n this.renderHead(opts) +\n this.renderBody(data) +\n '</table></div>'\n );\n }\n\n renderHead(opts) {\n const arr = [];\n let i;\n for (i = 0; i < 7; i++) {\n const full = Datepicker._escape(this.renderDayName(opts, i));\n const abbrev = Datepicker._escape(this.renderDayName(opts, i, true));\n arr.push(`<th scope=\"col\"><abbr title=\"${full}\">${abbrev}</abbr></th>`);\n }\n return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n }\n\n /** Wrap calendar rows after validating and encoding their contents. */\n renderBody(rows) {\n const html = rows.join('');\n // Always sanitize row markup before insertion to avoid propagating unsafe library input.\n const safeHtml = Datepicker._calendarMarkup(html, 'tbody');\n return '<tbody>' + safeHtml + '</tbody>';\n }\n\n private static _calendarMarkup(html: string, parent: string): string {\n const template = document.createElement('template');\n // Template contents stay inert. Only rebuilt, encoded markup leaves here.\n template.innerHTML = html;\n const childOf: Record<string, 'tr' | 'td' | 'button'> = { tbody: 'tr', tr: 'td', td: 'button' };\n const attributes = {\n tr: ['class'],\n td: ['class', 'data-day', 'aria-selected'],\n button: ['class', 'type', 'data-year', 'data-month', 'data-day', 'aria-label', 'disabled', 'tabindex']\n };\n const render = (node: Node, container: string): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n if (container === 'tbody' || container === 'tr') {\n if (node.textContent.trim()) throw new TypeError('Unsupported calendar row content');\n }\n return Datepicker._escape(node.textContent);\n }\n if (!(node instanceof HTMLElement)) throw new TypeError('Unsupported calendar row content');\n const tag = childOf[container];\n if (!tag || node.localName !== tag) {\n throw new TypeError('Unsupported calendar row element');\n }\n if ([...node.attributes].some(attr => !attributes[tag].includes(attr.name))) {\n throw new TypeError('Unsupported calendar row attribute');\n }\n if (tag === 'button' && node.getAttribute('type') !== 'button') {\n throw new TypeError('Calendar day buttons require type=\"button\"');\n }\n const attrs = attributes[tag].filter(name => node.hasAttribute(name))\n .map(name => ` ${name}=\"${Datepicker._escape(node.getAttribute(name))}\"`).join('');\n return `<${tag}${attrs}>${[...node.childNodes].map(child => render(child, tag)).join('')}</${tag}>`;\n };\n return [...template.content.childNodes].map(node => render(node, parent)).join('');\n }\n\n /**\n * Whether each month arrow is usable at this position in the allowed range.\n *\n * Depends on the month, which is deliberately *not* part of the controls\n * cache key - so the reuse path has to recompute and reapply it.\n */\n private _arrowState(year: number, month: number) {\n const opts = this.options;\n const isMinYear = year === opts.minYear;\n const isMaxYear = year === opts.maxYear;\n return {\n prev: !(isMinYear && (month === 0 || opts.minMonth >= month)),\n next: !(isMaxYear && (month === 11 || opts.maxMonth <= month))\n };\n }\n\n /**\n * Identifies the *shape* of the controls - everything that changes which\n * options the month and year selects contain, as opposed to which one is\n * picked. While this is stable the two FormSelects can be left alone.\n *\n * `year` is in the key because a numeric `yearRange` centres the year list\n * on the displayed year, so paging across a year boundary does change it.\n */\n private _controlsCacheKey(year: number): string {\n const o = this.options;\n return [\n year,\n o.minYear,\n o.maxYear,\n o.minMonth,\n o.maxMonth,\n Array.isArray(o.yearRange) ? o.yearRange.join('-') : o.yearRange,\n o.yearRangeReverse,\n o.showMonthAfterYear\n ].join('|');\n }\n\n renderTitle(instance, c, year, month, refYear, randId) {\n const opts = this.options,\n isMinYear = year === opts.minYear,\n isMaxYear = year === opts.maxYear;\n let i,\n j,\n arr = [],\n html =\n '<div id=\"' +\n Datepicker._escape(randId) +\n '\" class=\"datepicker-controls\" role=\"heading\" aria-live=\"assertive\">';\n\n // Decided up front. These used to be computed *below* the month-prev\n // button that reads `prev`, so the previous arrow was never disabled at\n // the start of the allowed range.\n const { prev, next } = this._arrowState(year, month);\n\n for (i = 0; i < 12; i++) {\n arr.push(\n '<option value=\"' +\n (year === refYear ? i - c : 12 + i - c) +\n '\"' +\n (i === month ? ' selected=\"selected\"' : '') +\n ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth)\n ? 'disabled=\"disabled\"'\n : '') +\n '>' +\n Datepicker._escape(opts.i18n.months[i]) +\n '</option>'\n );\n }\n\n const monthHtml =\n '<select class=\"datepicker-select orig-select-month\" tabindex=\"-1\">' +\n arr.join('') +\n '</select>';\n\n if (Array.isArray(opts.yearRange)) {\n i = opts.yearRange[0];\n j = opts.yearRange[1] + 1;\n } else {\n i = year - opts.yearRange;\n j = 1 + year + opts.yearRange;\n }\n\n for (arr = []; i < j && i <= opts.maxYear; i++) {\n if (i >= opts.minYear) {\n arr.push(`<option value=\"${i}\" ${i === year ? 'selected=\"selected\"' : ''}>${i}</option>`);\n }\n }\n if (opts.yearRangeReverse) arr.reverse();\n\n const yearHtml = `<select class=\"datepicker-select orig-select-year\" tabindex=\"-1\">${arr.join('')}</select>`;\n\n const leftArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.41 16.09l-4.58-4.59 4.58-4.59L14 5.5l-6 6 6 6z\"/><path d=\"M0-.5h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-prev${prev ? '' : ' is-disabled'}\" type=\"button\" aria-label=\"${Datepicker._escape(opts.i18n.previousMonth)}\">${leftArrow}</button>`;\n\n html += '<div class=\"selects-container\">';\n if (opts.showMonthAfterYear) {\n html += yearHtml + monthHtml;\n } else {\n html += monthHtml + yearHtml;\n }\n html += '</div>';\n\n const rightArrow =\n '<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M8.59 16.34l4.58-4.59-4.58-4.59L10 5.75l6 6-6 6z\"/><path d=\"M0-.25h24v24H0z\" fill=\"none\"/></svg>';\n html += `<button class=\"month-next${next ? '' : ' is-disabled'}\" type=\"button\" aria-label=\"${Datepicker._escape(opts.i18n.nextMonth)}\">${rightArrow}</button>`;\n\n return (html += '</div>');\n }\n\n /**\n * Run `fn`, collapsing every draw it triggers into a single one at the end.\n *\n * A single input click reaches draw() three times - once through\n * setDateFromInput -> setDate -> gotoDate, once directly, and once through\n * the trailing gotoDate - and each one destroys two FormSelect instances,\n * reparses the calendar and builds two fresh FormSelects. The three calls\n * cannot simply be deleted: the direct draw() is what covers an empty input\n * (setDate bails before drawing when the value does not parse), and the\n * trailing gotoDate re-centres on a date validateDate may have clamped to\n * minDate/maxDate. So they are collected instead of removed.\n *\n * Deliberately synchronous: the constructor and callers read calendarEl\n * immediately after init(), which a microtask-deferred draw would leave\n * empty.\n */\n private _batchDraws(fn: () => void) {\n this._drawDepth++;\n try {\n fn();\n } finally {\n this._drawDepth--;\n if (this._drawDepth === 0 && this._drawDirty) {\n this._drawDirty = false;\n this.draw();\n }\n }\n }\n\n // refresh HTML\n draw() {\n // Inside a batch, note that a draw is due and let the batch do it once.\n if (this._drawDepth > 0) {\n this._drawDirty = true;\n return;\n }\n const active = (this.calendarEl.getRootNode() as Document | ShadowRoot).activeElement;\n const restoreDayFocus = active?.matches('.datepicker-day-button') && this.calendarEl.contains(active);\n const restoreArrow = this.calendarEl.contains(active) && active?.matches('.month-prev, .month-next')\n ? active.classList.contains('month-prev') ? '.month-prev' : '.month-next' : null;\n const restoreSelect = this._selectFocusRestorer(active);\n const year = this.calendars[0].year;\n const month = this.calendars[0].month;\n\n this._renderDateDisplay(this.date, this.endDate);\n\n // Only the day grid changes when you page within a year. Rebuilding the\n // controls as well meant tearing down and reconstructing two FormSelects -\n // each with its own <ul> of 12 or 21+ options, an input, a caret and a\n // Menu - on every single draw.\n const key = this._controlsCacheKey(year);\n if (key === this._controlsKey && this.calendarEl.querySelector('.datepicker-controls')) {\n this._reuseControls(year, month);\n } else {\n this._controlsKey = key;\n // Held across table re-renders: the table's aria-labelledby points at\n // the controls element's id.\n this._randId = 'datepicker-title-' + Utils.guid();\n this._rebuildControls(year, month);\n }\n this._renderCalendarTable(year, month);\n this._syncCalendarFocus(!!restoreDayFocus);\n if (restoreArrow) this.calendarEl.querySelector<HTMLButtonElement>(restoreArrow)?.focus();\n restoreSelect();\n\n if (typeof this.options.onDraw === 'function') {\n this.options.onDraw.call(this);\n }\n }\n\n private _formSelect(selector: string): FormSelect | undefined {\n const el = this.calendarEl.querySelector<HTMLElement>(selector);\n return el ? FormSelect.getInstance(el) : undefined;\n }\n\n /**\n * Picking a year rebuilds both selects under the focus, which is on the old\n * input or in its menu. The returned callback, run after the redraw, gives\n * focus to the matching new input if the old one went with the rebuild.\n */\n private _selectFocusRestorer(active: Element | null) {\n const holdsFocus = (select?: FormSelect) =>\n !!select && (select.input === active || !!select.menuEl?.contains(active));\n const selector = ['.orig-select-year', '.orig-select-month'].find((s) => holdsFocus(this._formSelect(s)));\n return () => {\n if (selector && !active.isConnected) this._formSelect(selector)?.input.focus();\n };\n }\n\n /** Tear down the two FormSelects and render the controls from scratch. */\n private _rebuildControls(year: number, month: number) {\n this.destroySelects();\n this.calendarEl.innerHTML = this.renderTitle(this, 0, year, month, year, this._randId);\n\n const yearSelect = this.calendarEl.querySelector('.orig-select-year') as HTMLSelectElement;\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n // @todo fix accessibility\n FormSelect.init(yearSelect, {\n classes: 'select-year',\n menuOptions: { container: Utils.portalRoot(this.el), constrainWidth: false }\n });\n FormSelect.init(monthSelect, {\n classes: 'select-month',\n menuOptions: { container: Utils.portalRoot(this.el), constrainWidth: false }\n });\n\n // Add change handlers for select\n yearSelect.addEventListener('change', this._handleYearChange);\n monthSelect.addEventListener('change', this._handleMonthChange);\n }\n\n /**\n * Keep the existing controls and bring them up to date: the selected month,\n * and the arrow states, which depend on the month rather than on the key.\n */\n private _reuseControls(year: number, month: number) {\n const monthSelect = this.calendarEl.querySelector('.orig-select-month') as HTMLSelectElement;\n if (monthSelect && monthSelect.value !== month.toString()) {\n monthSelect.value = month.toString();\n // Assigning .value fires no change event, so the wrapper needs telling.\n FormSelect.getInstance(monthSelect)?.refresh();\n }\n\n const { prev, next } = this._arrowState(year, month);\n this.calendarEl.querySelector('.month-prev')?.classList.toggle('is-disabled', !prev);\n this.calendarEl.querySelector('.month-next')?.classList.toggle('is-disabled', !next);\n }\n\n /** Replace just the day grid, leaving the controls in place. */\n private _renderCalendarTable(year: number, month: number) {\n const html = this.render(year, month, this._randId);\n const existing = this.calendarEl.querySelector('.datepicker-table-wrapper');\n if (existing) existing.outerHTML = html;\n else this.calendarEl.insertAdjacentHTML('beforeend', html);\n }\n\n _setupEventHandlers() {\n this._addInputEventHandlers(this.el);\n if (this.endDateEl) this._addInputEventHandlers(this.endDateEl);\n this._form = this.el.form;\n const { signal } = this._events;\n this._form?.addEventListener('reset', this._handleFormReset, { signal });\n this.calendarEl.addEventListener('click', this._handleCalendarClick, { signal });\n this.calendarEl.addEventListener('keydown', this._handleCalendarKeydown, { signal });\n this.calendarEl.addEventListener('focusin', this._handleCalendarFocus, { signal });\n }\n\n _setupVariables() {\n const template = document.createElement('template');\n template.innerHTML = Datepicker._template.trim();\n\n this.containerEl = <HTMLElement>template.content.firstChild;\n\n this.calendarEl = this.containerEl.querySelector('.datepicker-calendar');\n this.dateTextEl = this.containerEl.querySelector('.date-text');\n this.footer = this.containerEl.querySelector('.datepicker-footer');\n }\n\n /** A date input's listeners. An input the picker removes keeps them, but no event reaches it then. */\n private _addInputEventHandlers(input: HTMLInputElement) {\n const { signal } = this._events;\n input.addEventListener('click', this._handleInputClick, { signal });\n input.addEventListener('keydown', this._handleInputKeydown, { signal });\n input.addEventListener('change', this._handleInputChange, { signal });\n }\n\n private _removeDateInput(input: HTMLInputElement) {\n const focused = (input.getRootNode() as Document | ShadowRoot).activeElement === input;\n input.remove();\n if (focused && document.activeElement === document.body) this.el.focus();\n }\n\n _handleInputClick = (e) => {\n // Block the native date picker only when the calendar is shown to replace it.\n if (e.target.type == 'date' && (this.options.openByDefault || this.options.container)) e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this.draw();\n this.gotoDate(<HTMLElement>e.target === this.el ? this.date : this.endDate);\n });\n this._showDisplay();\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n };\n\n /** Shows a docked or modal calendar. A modal takes focus from the input, so the selected day gets it. */\n private _showDisplay() {\n this.displayPlugin?.show();\n if (this.displayPlugin instanceof ModalDisplayPlugin) this._syncCalendarFocus(true);\n }\n\n _handleInputKeydown = Utils.ignoringComposition((e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this._batchDraws(() => {\n this.setDateFromInput(e.target as HTMLInputElement);\n this._focusedDate = e.target === this.endDateEl ? this.endDate : this.date;\n this.draw();\n });\n if (this.displayPlugin) this.displayPlugin.show();\n this._syncCalendarFocus(true);\n if (this.options.onInputInteraction) this.options.onInputInteraction.call(this);\n }\n });\n\n private _dayDate(button: HTMLElement) {\n const date = new Date(0);\n date.setFullYear(Number(button.dataset.year), Number(button.dataset.month), Number(button.dataset.day));\n Datepicker._setToStartOfDay(date);\n return date;\n }\n\n private _syncCalendarFocus(restore = false) {\n const buttons = [...this.calendarEl.querySelectorAll<HTMLButtonElement>('.datepicker-day-button')];\n const current = buttons.filter(button => !button.parentElement.classList.contains('is-selection-disabled'));\n // Today at midnight: day buttons compare by exact time.\n const preferred = this._focusedDate || this.date || new Date(new Date().setHours(0, 0, 0, 0));\n const target = current.find(button => Datepicker._compareDates(this._dayDate(button), preferred))\n || current.find(button => button.parentElement.classList.contains('is-selected'))\n || current.find(button => !button.parentElement.classList.contains('is-disabled')) || current[0];\n for (const button of buttons) {\n button.tabIndex = button === target ? 0 : -1;\n button.setAttribute('aria-disabled', String(button.parentElement.matches('.is-disabled, .is-selection-disabled')));\n }\n if (target) {\n this._focusedDate = this._dayDate(target);\n if (restore) target.focus();\n }\n }\n\n private _handleCalendarFocus = (event: FocusEvent) => {\n const button = event.target as HTMLElement;\n if (!button.matches('.datepicker-day-button')) return;\n this._focusedDate = this._dayDate(button);\n this._syncCalendarFocus();\n };\n\n private _handleCalendarKeydown = (event: KeyboardEvent) => {\n const button = event.target as HTMLElement;\n if (!button.matches('.datepicker-day-button') || !Utils.plainKey(event)) return;\n const date = this._dayDate(button);\n const weekday = (date.getDay() - this.options.firstDay + 7) % 7;\n const offsets = { ArrowLeft: this.options.isRTL ? 1 : -1, ArrowRight: this.options.isRTL ? -1 : 1,\n ArrowUp: -7, ArrowDown: 7, Home: -weekday, End: 6 - weekday };\n if (Object.hasOwn(offsets, event.key)) date.setDate(date.getDate() + offsets[event.key]);\n else if (event.key === 'PageUp' || event.key === 'PageDown') {\n const day = date.getDate();\n date.setDate(1);\n date.setMonth(date.getMonth() + (event.key === 'PageUp' ? -1 : 1) * (event.shiftKey ? 12 : 1));\n const last = new Date(date.getTime());\n last.setMonth(last.getMonth() + 1, 0);\n date.setDate(Math.min(day, last.getDate()));\n } else return;\n event.preventDefault();\n const { minDate, maxDate, minYear, maxYear, minMonth, maxMonth } = this.options;\n if (minDate && date < minDate) date.setTime(minDate.getTime());\n if (maxDate && date > maxDate) date.setTime(maxDate.getTime());\n if (date.getFullYear() < minYear || date.getFullYear() > maxYear\n || (date.getFullYear() === minYear && date.getMonth() < (minMonth ?? 0))\n || (date.getFullYear() === maxYear && date.getMonth() > (maxMonth ?? 11))) return;\n this._focusedDate = date;\n // Moving within the shown month only moves focus; redrawing the grid on\n // every held arrow key rebuilt 42 cells for nothing.\n const { year, month } = this.calendars[0];\n if (date.getFullYear() === year && date.getMonth() === month) this._syncCalendarFocus(true);\n else this.gotoDate(date);\n };\n\n _handleCalendarClick = (e) => {\n const target = <HTMLElement>e.target;\n if (target.classList.contains('is-disabled')) return;\n\n this._batchDraws(() => {\n if (\n target.classList.contains('datepicker-day-button') &&\n !target.classList.contains('is-empty') &&\n !target.parentElement.classList.contains('is-disabled') &&\n !target.parentElement.classList.contains('is-selection-disabled')\n ) {\n const selectedDate = new Date(\n e.target.getAttribute('data-year'),\n e.target.getAttribute('data-month'),\n e.target.getAttribute('data-day')\n );\n\n if (!this.multiple || this.options.isMultipleSelection) {\n this.setDate(selectedDate);\n }\n\n // Selecting a range end draws a second time on top of setDate's.\n if (this.options.isDateRange) {\n this._handleDateRangeCalendarClick(selectedDate);\n }\n\n if (this.options.autoSubmit) this._finishSelection();\n } else if (target.closest('.month-prev')) {\n this.prevMonth();\n } else if (target.closest('.month-next')) {\n this.nextMonth();\n }\n });\n };\n\n _handleDateRangeCalendarClick = (date: Date) => {\n if (this.endDate == null || !Datepicker._compareDates(date, this.endDate)) {\n if (Datepicker._isDate(this.date) && date < this.date) {\n return;\n }\n\n this.setDate(date, false, Datepicker._isDate(this.date));\n return;\n }\n\n this._clearDates();\n this.draw();\n };\n\n _handleClearClick = () => {\n this._clearDates();\n this.setInputValues();\n };\n\n _clearDates = () => {\n this.date = null;\n this.endDate = null;\n this.dates?.splice(0);\n this.draw();\n };\n\n _handleMonthChange = (e) => {\n this.gotoMonth(e.target.value);\n };\n\n _handleYearChange = (e) => {\n this.gotoYear(e.target.value);\n };\n\n // change view to a specific month (zero-index, e.g. 0: January)\n gotoMonth(month) {\n if (!isNaN(month)) {\n this.calendars[0].month = parseInt(month, 10);\n this.adjustCalendars();\n }\n }\n\n // change view to a specific full year (e.g. \"2012\")\n gotoYear(year) {\n if (!isNaN(year)) {\n this.calendars[0].year = parseInt(year, 10);\n this.adjustCalendars();\n }\n }\n\n // A reset restores the inputs' values after its event, without a change\n // event. Drop the inputs added for extra dates and read the selection back\n // from what the reset left.\n _handleFormReset = (e: Event) => {\n clearTimeout(this._resetTimer);\n this._resetTimer = setTimeout(() => {\n if (e.defaultPrevented) return;\n if (this.options.isMultipleSelection) this._readBackMultiple();\n else this._readBackSingle();\n this.draw();\n });\n };\n\n private _readBackMultiple() {\n for (const input of this.dateEls.splice(1)) this._removeDateInput(input);\n this.dates = [];\n this._syncDataDate(this.el);\n const date = this._dateInInput(this.el);\n if (Datepicker._isDate(date) && this._isSelectableDay(date)) this.setDate(date, true);\n }\n\n /** A native date input's overlay text follows its value, including an empty one. */\n private _syncDataDate(el: HTMLInputElement) {\n if (el.type === 'date') this.setDataDate(el, Datepicker._parseDate(el.value));\n }\n\n private _readBackSingle() {\n this.setSingleDate(null, false);\n this.setSingleDate(null, true);\n for (const input of [this.el, this.endDateEl]) if (input) this.setDateFromInput(input);\n }\n\n _handleInputChange = (e: Event) => {\n // Prevent change event from being fired when triggered by the plugin\n if (e['detail']?.firedBy === this) return;\n this.setDateFromInput(e.target as HTMLInputElement);\n };\n\n renderDayName(opts, day, abbr: boolean = false) {\n day += opts.firstDay;\n while (day >= 7) {\n day -= 7;\n }\n return abbr ? opts.i18n.weekdaysAbbrev[day] : opts.i18n.weekdays[day];\n }\n\n createDateInput() {\n const dateInput = <HTMLInputElement>this.el.cloneNode(true);\n // cloneNode copies the id too, and two elements sharing one id break every\n // lookup that goes through it.\n dateInput.removeAttribute('id');\n dateInput.classList.add('no-autoinit');\n this._addInputEventHandlers(dateInput);\n this.el.parentElement.appendChild(dateInput);\n return dateInput;\n }\n\n _finishSelection = () => {\n this.setInputValues();\n };\n\n _confirm = () => {\n this._finishSelection();\n hideModal(this.displayPlugin);\n this._notify('confirm', this.options.onConfirm, { args: [] });\n }\n\n _cancel = () => {\n hideModal(this.displayPlugin);\n this._notify('cancel', this.options.onCancel, { args: [] });\n };\n\n static {\n Datepicker._template = `\n <div class=\"datepicker-container\">\n <div class=\"datepicker-date-display\">\n <span class=\"date-text\"></span>\n </div>\n <div class=\"datepicker-calendar-container\">\n <div class=\"datepicker-calendar\"></div>\n <div class=\"datepicker-footer\"></div>\n </div>\n </div>`;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/funnelChart.ts"],
|
|
4
|
-
"sourcesContent": ["import { LineChart, LineChartOptions, numberFormat } from './lineChart';\n\nexport type FunnelChartOptions = LineChartOptions;\n\n/**\n * Each value's stage width as a percentage of the largest value, or null\n * for a row with no stage: a gap, zero or a negative value.\n */\nfunction widths(values: (number | null)[]): (number | null)[] {\n const largest = values.reduce<number>((max, value) => Math.max(max, value ?? 0), 0);\n return values.map((value) => (value! > 0 ? (value! / largest) * 100 : null));\n}\n\n/** A stage `width` percent of the plot wide, which grows from `from` percent. */\nfunction stage(width: number, from: number | null | undefined) {\n const span = document.createElement('span');\n span.dataset.series = '1';\n span.style.setProperty('--width', String(width));\n if (from != null) span.style.setProperty('--from-width', String(from));\n return span;\n}\n\n/**\n * Funnel chart. It reads its <table> like LineChart, but draws each row of\n * the first value column as a stage, top to bottom in table order, as wide\n * as its value against the largest one and centered on the plot. Further\n * columns show in the tooltip, which also gives each stage's value as a\n * percentage of the first row's. The up and down arrows move the tooltip\n * between rows.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class FunnelChart extends LineChart {\n protected get _type() {\n return 'funnel-chart';\n }\n\n protected get _horizontal() {\n return true;\n }\n\n /** A funnel has no value axis. */\n protected get _axis() {\n return false;\n }\n\n protected get _points() {\n return false;\n }\n\n static key = 'Expressive_FunnelChart';\n\n /** Every stage is the first series' color, so the tooltip's swatches all match it. */\n protected _read() {\n super._read();\n for (const series of this.series) series.color = '1';\n }\n\n show(index: number) {\n // Skipping a repeat keeps the percentage from being added twice.\n if (!this._tooltip || index === this.activeIndex) return;\n super.show(index);\n this._addShare(index);\n }\n\n /** Writes a row's share after its first value in the tooltip. */\n private _addShare(index: number) {\n const share = this._share(index);\n // A row with a share has a first value, so the first value text is its own.\n const text = this._tooltip.querySelector('span:nth-of-type(2)');\n if (share && text) text.textContent += ` (${share})`;\n }\n\n /**\n * A row's value as a percentage of the first row's, in whole percentages\n * with a tenth below 10%, or '' when either row has no stage.\n */\n private _share(index: number) {\n const values = this.series[0].values;\n const [first, value] = [values[0], values[index]];\n if (!(first! > 0 && value! > 0)) return '';\n const share = value! / first!;\n return numberFormat(this.el, { style: 'percent', maximumFractionDigits: share < 0.1 ? 1 : 0 }).format(share);\n }\n\n /** A funnel has one series of stages, so it has no legend. */\n protected _legend(): Element[] {\n return [];\n }\n\n /**\n * A row per table row, holding its stage. After update(), each stage\n * starts from its old width, which CSS reads as --from-width.\n */\n protected _draw(): Element {\n const stages = document.createElement('div');\n stages.className = 'funnel-chart-stages';\n stages.setAttribute('aria-hidden', 'true');\n this._plot.style.setProperty('--rows', String(this.labels.length));\n const was = widths(this._before[0]?.values ?? []);\n widths(this.series[0].values).forEach((width, i) => {\n const row = document.createElement('div');\n if (width !== null) row.append(stage(width, was[i]));\n stages.append(row);\n });\n return stages;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;AAQA,SAAS,OAAO,QAA8C;AAC5D,QAAM,UAAU,OAAO,OAAe,CAAC,KAAK,UAAU,KAAK,IAAI,KAAK,SAAS,CAAC,GAAG,CAAC;AAClF,SAAO,OAAO,IAAI,CAAC,UAAW,QAAS,IAAK,QAAS,UAAW,MAAM,IAAK;AAC7E;AAGA,SAAS,MAAM,OAAe,MAAiC;AAC7D,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,OAAK,QAAQ,SAAS;AACtB,OAAK,MAAM,YAAY,WAAW,OAAO,KAAK,CAAC;AAC/C,MAAI,QAAQ,KAAM,MAAK,MAAM,YAAY,gBAAgB,OAAO,IAAI,CAAC;AACrE,SAAO;AACT;AAaO,IAAM,cAAN,cAA0B,UAAU;AAAA,EACzC,IAAc,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,IAAc,cAAc;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAc,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,IAAc,UAAU;AACtB,WAAO;AAAA,EACT;AAAA;AAAA,EAKU,QAAQ;AAChB,UAAM,MAAM;AACZ,eAAW,UAAU,KAAK,OAAQ,QAAO,QAAQ;AAAA,EACnD;AAAA,EAEA,KAAK,OAAe;AAElB,QAAI,CAAC,KAAK,YAAY,UAAU,KAAK,YAAa;AAClD,UAAM,KAAK,KAAK;AAChB,SAAK,UAAU,KAAK;AAAA,EACtB;AAAA;AAAA,EAGQ,UAAU,OAAe;AAC/B,UAAM,QAAQ,KAAK,OAAO,KAAK;AAE/B,UAAM,OAAO,KAAK,SAAS,cAAc,qBAAqB;AAC9D,QAAI,SAAS,KAAM,MAAK,eAAe,KAAK,KAAK;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO,OAAe;AAC5B,UAAM,SAAS,KAAK,OAAO,CAAC,EAAE;AAC9B,UAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,OAAO,KAAK,CAAC;AAChD,QAAI,EAAE,QAAS,KAAK,QAAS,GAAI,QAAO;AACxC,UAAM,QAAQ,QAAS;AACvB,WAAO,aAAa,KAAK,IAAI,EAAE,OAAO,WAAW,uBAAuB,QAAQ,MAAM,IAAI,EAAE,CAAC,EAAE,OAAO,KAAK;AAAA,EAC7G;AAAA;AAAA,EAGU,UAAqB;AAC7B,WAAO,CAAC;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,QAAiB;AACzB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,aAAa,eAAe,MAAM;AACzC,SAAK,MAAM,MAAM,YAAY,UAAU,OAAO,KAAK,OAAO,MAAM,CAAC;AACjE,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,GAAG,UAAU,CAAC,CAAC;AAChD,WAAO,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,MAAM;AAClD,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,UAAU,KAAM,KAAI,OAAO,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC;AACnD,aAAO,OAAO,GAAG;AAAA,IACnB,CAAC;AACD,WAAO;AAAA,EACT;AACF;AA3Ea,YAkBJ,MAAM;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/richTextEditor.ts"],
|
|
4
|
-
"sourcesContent": ["import { Utils } from '../core/utils';\nimport { Component, BaseOptions } from '../core/component';\n\n/**\n * The parts of a Tiptap `Editor` this component uses. Declared here so the\n * published types do not depend on Tiptap.\n */\nexport interface RichTextEditorInstance {\n commands: object;\n isEditable: boolean;\n isEmpty: boolean;\n chain(): any;\n can(): any;\n isActive(name: string, attributes?: object): boolean;\n getHTML(): string;\n on(event: string, callback: () => void): unknown;\n off(event: string, callback: () => void): unknown;\n destroy(): void;\n}\n\nexport interface RichTextEditorOptions extends BaseOptions {\n /**\n * Tiptap's `Editor` class. ExpressiveCSS does not bundle Tiptap, so the\n * page imports it and passes it in.\n * @default null\n */\n Editor: (new (options: any) => RichTextEditorInstance) | null;\n /**\n * Tiptap extensions, usually `[StarterKit]`.\n * @default []\n */\n extensions: unknown[];\n}\n\nconst _defaults: RichTextEditorOptions = {\n Editor: null,\n extensions: []\n};\n\ntype Action = { command: string; attributes?: object; active?: string };\n\n// Copied from the textarea onto the editable element.\nconst NAMING = ['aria-label', 'aria-labelledby', 'aria-describedby'];\n\n/**\n * A rich text editor built on Tiptap: a `.rich-text-editor` holding a\n * `<textarea>` and, usually, a `.toolbar` of `[data-command]` buttons.\n *\n * The textarea's value is the starting HTML. The component hides it, mounts\n * the editor after it and writes the editor's HTML back on every change, so\n * the textarea still submits with its form. A button's `data-command` names a\n * Tiptap command and `data-attributes` holds its JSON argument. Buttons are\n * disabled when their command cannot run, and `toggle*` commands report their\n * state with `aria-pressed` and `.active`.\n */\nexport class RichTextEditor extends Component<RichTextEditorOptions> {\n /** The Tiptap editor. */\n editor: RichTextEditorInstance | null = null;\n /** The form value. */\n textarea: HTMLTextAreaElement | null;\n /** The element the editor is mounted in. */\n content: HTMLElement | null = null;\n private _actions = new Map<HTMLButtonElement, Action>();\n private _label: HTMLLabelElement | null = null;\n private _required = false;\n private _form: HTMLFormElement | null = null;\n\n constructor(el: HTMLElement, options: Partial<RichTextEditorOptions>) {\n super(el, options);\n this.textarea = el.querySelector(':scope > textarea');\n if (!this.textarea || !this.options.Editor) {\n console.error('RichTextEditor needs a <textarea> child and the Tiptap Editor class in options.Editor.');\n return;\n }\n\n for (const button of el.querySelectorAll<HTMLButtonElement>('button[data-command]')) {\n const command = button.dataset.command;\n let attributes: object | undefined;\n try {\n attributes = button.dataset.attributes ? JSON.parse(button.dataset.attributes) : undefined;\n } catch {\n // One bad button must not stop the editor, or later elements, mounting.\n console.warn('RichTextEditor ignored invalid JSON in data-attributes:', button.dataset.attributes);\n }\n // toggleBulletList is active while the selection is in a bulletList.\n const active = command.startsWith('toggle') ? command[6].toLowerCase() + command.slice(7) : undefined;\n this._actions.set(button, { command, attributes, active });\n }\n\n const attributes: Record<string, string> = { role: 'textbox', 'aria-multiline': 'true' };\n for (const name of NAMING) {\n const value = this.textarea.getAttribute(name);\n if (value) attributes[name] = value;\n }\n // A <label for> names the hidden textarea, so it has to name the editor\n // instead, and a click on it has to focus the editor.\n this._label = this.textarea.labels?.[0] ?? null;\n if (this._label && !attributes['aria-labelledby']) {\n if (!this._label.id) this._label.id = `rich-text-editor-label-${Utils.guid()}`;\n attributes['aria-labelledby'] = this._label.id;\n this._label.addEventListener('click', this._handleLabelClick, { signal: this._events.signal });\n }\n // A hidden required textarea blocks submit with no message, because the\n // browser cannot focus it to report. The editor takes over: it carries\n // aria-required, and an empty editor cancels submit and takes focus.\n this._required = this.textarea.required;\n if (this._required) {\n attributes['aria-required'] = 'true';\n this.textarea.required = false;\n this._form = this.textarea.form;\n this._form?.addEventListener('submit', this._handleSubmit, { capture: true, signal: this._events.signal });\n }\n\n this.content = document.createElement('div');\n this.content.className = 'rich-text-editor-content';\n this.textarea.after(this.content);\n this.textarea.hidden = true;\n this.editor = new this.options.Editor({\n element: this.content,\n extensions: this.options.extensions,\n content: this.textarea.value,\n editable: !(this.textarea.disabled || this.textarea.readOnly),\n editorProps: { attributes }\n });\n this.editor.on('update', this._handleUpdate);\n this.editor.on('transaction', this._handleTransaction);\n this._handleTransaction();\n el.addEventListener('click', this._handleClick, { signal: this._events.signal });\n }\n\n static get defaults(): RichTextEditorOptions {\n return _defaults;\n }\n\n static key = 'Expressive_RichTextEditor';\n\n destroy() {\n super.destroy();\n if (!this.editor) return;\n this.editor.off('update', this._handleUpdate);\n this.editor.off('transaction', this._handleTransaction);\n this.editor.destroy();\n this.editor = null;\n this.content.remove();\n this.textarea.hidden = false;\n this.textarea.required = this._required;\n for (const button of this._actions.keys()) {\n button.disabled = false;\n button.classList.remove('active');\n button.removeAttribute('aria-pressed');\n }\n }\n\n private _handleClick = (e: MouseEvent) => {\n const button = (e.target as Element).closest<HTMLButtonElement>('button[data-command]');\n const action = this._actions.get(button);\n if (action && !button.disabled) this.editor.chain().focus()[action.command](action.attributes).run();\n };\n\n private _handleLabelClick = () => {\n this.editor.chain().focus().run();\n };\n\n private _skipsValidation(e: SubmitEvent) {\n return this._form.noValidate || !!(e.submitter as HTMLButtonElement | null)?.formNoValidate;\n }\n\n private _handleSubmit = (e: SubmitEvent) => {\n if (this._skipsValidation(e) || !this.editor.isEditable || !this.editor.isEmpty) return;\n e.preventDefault();\n e.stopImmediatePropagation();\n this.editor.chain().focus().run();\n };\n\n private _handleUpdate = () => {\n this.textarea.value = this.editor.isEmpty ? '' : this.editor.getHTML();\n this.textarea.dispatchEvent(new Event('input', { bubbles: true }));\n };\n\n private _handleTransaction = () => {\n const can = this.editor.isEditable && this.editor.can();\n for (const [button, { command, attributes, active }] of this._actions) {\n button.disabled = !can || !(command in this.editor.commands) || !can[command](attributes);\n if (!active) continue;\n const on = this.editor.isActive(active, attributes);\n button.setAttribute('aria-pressed', String(on));\n button.classList.toggle('active', on);\n }\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["attributes"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/behaviors/dataTables.ts"],
|
|
4
|
-
"sourcesContent": ["import { numberValue } from '../components/lineChart';\nimport { Utils, controllerFor } from '../core/utils';\n\n/** The rows of a table's bodies that hold records, not a row's detail. */\nconst ROWS = ':scope > tbody > tr:not(.data-table-detail)';\n/** A checkbox in a row's first cell, which selects the row. */\nconst BOX = ':scope > :first-child input[type=\"checkbox\"]';\n/**\n * A column's resize handle: a drag-handle button ending a cell of the first\n * header row, the row whose cells set the widths of a fixed table layout.\n */\nconst HANDLE = '.data-table > table > thead > tr:first-child > th > button.drag-handle:last-child';\n/** How far an arrow key resizes a column; Shift moves four times as far. */\nconst STEP = 16;\n/** How each sort direction orders the rows. */\nconst ORDER = { ascending: 1, descending: -1 };\n/** A menu checkbox item that shows and hides the column of the header cell it names. */\nconst TOGGLE = '[role=\"menuitemcheckbox\"][data-column]';\n/** Marks a cell hidden with its column, so showing the column never shows a cell the author hid. */\nconst HIDDEN = 'data-column-hidden';\nconst FILTER = 'input[type=\"search\"][data-table-filter]';\nconst FILTERED = 'data-table-filter-hidden';\nconst PAGED = 'data-table-page-hidden';\nconst PAGE_BUTTON = 'button[type=\"button\"]:is([data-table-page=\"previous\"], [data-table-page=\"next\"])';\nconst PAGE_STEP: Record<string, number> = { previous: -1, next: 1 };\nconst PAGE_SIZE = 'select[data-table-page-size]:not([multiple], :disabled):not(:has(option:checked:disabled))';\n\ninterface TablePageState { page: number; pageSize: number; total: number; }\ntype PageView = TablePageState & { server?: boolean };\n\nfunction validPageState(state: TablePageState) {\n if (!state) return false;\n return [[state.page, 1], [state.pageSize, 1], [state.total, 0]].every(\n ([value, minimum]) => Number.isSafeInteger(value) && value >= minimum\n );\n}\n\nfunction pageIndex(page: number, total: number, size: number) {\n return Math.min(Math.max(page, 1), Math.ceil(total / size));\n}\n\nfunction positivePageSize(value: string | null) {\n const size = Number(value);\n return Number.isSafeInteger(size) && size > 0 ? size : 0;\n}\n\nfunction pageSize(wrapper: Element) {\n return positivePageSize(wrapper.getAttribute('data-page-size'));\n}\n\n/** Controls belong to their nearest wrapper, never an enclosing table. */\nfunction tableControl(wrapper: Element, selector: string) {\n return Array.from(wrapper.querySelectorAll<HTMLElement>(selector)).find((el) => el.closest('.data-table') === wrapper);\n}\n\n/** Enabled selection and result counts use the same visible record set. */\nfunction visibleRecord(row: HTMLTableRowElement) {\n if (row.closest(`[hidden], [${FILTERED}], [${PAGED}]`)) return false;\n if (row.checkVisibility) return row.checkVisibility({ visibilityProperty: true });\n const style = getComputedStyle(row);\n return style.display !== 'none' && !['hidden', 'collapse'].includes(style.visibility);\n}\n\n/** The cell of a body row that covers a column, counting colspan. */\nfunction cellAt(row: HTMLTableRowElement, column: number) {\n let end = 0;\n for (const cell of Array.from(row.cells)) {\n end += cell.colSpan;\n if (column < end) return cell;\n }\n}\n\n/** A cell's sort text: its `data-value`, or else its text. */\nfunction cellText(row: HTMLTableRowElement, column: number) {\n const cell = cellAt(row, column);\n return (cell?.dataset.value ?? cell?.textContent ?? '').trim();\n}\n\n/** Marks the columns a cell covers, in its row and the rows its rowspan reaches. */\nfunction cover(taken: Set<number>[], row: number, column: number, cell: HTMLTableCellElement) {\n for (let r = row; r < row + Math.max(1, cell.rowSpan); r++) {\n for (let c = column; c < column + cell.colSpan; c++) (taken[r] ??= new Set()).add(c);\n }\n}\n\n/**\n * The column each header cell starts at. A grouped header's cells sit\n * after the ones a colspan or rowspan carries over, so a cell's place in its\n * row is not its column.\n */\nfunction headerColumns(head: HTMLTableSectionElement) {\n const [taken, columns] = [[] as Set<number>[], new Map<Element, number>()];\n Array.from(head.rows).forEach((row, r) => {\n let column = 0;\n for (const cell of Array.from(row.cells)) {\n while (taken[r]?.has(column)) column++;\n columns.set(cell, column);\n cover(taken, r, column, cell);\n column += cell.colSpan;\n }\n });\n return columns;\n}\n\n/**\n * The header cell a column toggle names: a cell of a data table's first\n * header row that spans one column. The id is looked up in the item's own\n * document or shadow root.\n */\nfunction toggledHeader(item: Element) {\n const root = item.getRootNode() as Document | ShadowRoot;\n const header = root.getElementById?.(item.getAttribute('data-column')) as HTMLTableCellElement;\n return header?.matches('.data-table > table > thead > tr:first-child > th') && header.colSpan === 1 ? header : null;\n}\n\n/** A column's cells, one per row, leaving out cells that span several columns. */\nfunction columnCells(table: HTMLTableElement, column: number) {\n const head = [...headerColumns(table.tHead)].filter(([, each]) => each === column).map(([cell]) => cell as HTMLTableCellElement);\n const rows = table.querySelectorAll<HTMLTableRowElement>(':scope > tbody > tr, :scope > tfoot > tr');\n return [...head, ...Array.from(rows, (row) => cellAt(row, column))].filter((cell) => cell?.colSpan === 1);\n}\n\nfunction conceal(cell: HTMLTableCellElement) {\n if (cell.hidden) return;\n cell.hidden = true;\n cell.setAttribute(HIDDEN, '');\n}\n\nfunction reveal(cell: HTMLTableCellElement) {\n if (!cell.hasAttribute(HIDDEN)) return;\n cell.hidden = false;\n cell.removeAttribute(HIDDEN);\n}\n\n/** Shows or hides the column a toggle names, as its `aria-checked` says. */\nfunction applyToggle(item: Element) {\n const header = toggledHeader(item);\n if (!header) return;\n const table = header.closest('table');\n const show = item.getAttribute('aria-checked') === 'true';\n columnCells(table, headerColumns(table.tHead).get(header)).forEach(show ? reveal : conceal);\n refit(table, header);\n}\n\n/**\n * Keeps a resized table as wide as its visible columns. A column shown for\n * the first time since the widths were held takes its content's width, no\n * narrower than the minimum token.\n */\nfunction refit(table: HTMLTableElement, header: HTMLTableCellElement) {\n if (table.style.tableLayout !== 'fixed') return;\n if (!header.hidden && !header.style.width) header.style.width = `${Math.max(bounds(header)[0], header.scrollWidth)}px`;\n fit(table);\n}\n\n/** The visible cells of a table's first row, which set its column widths under the fixed layout. */\nfunction firstCells(table: HTMLTableElement) {\n return Array.from(table.rows[0]?.cells ?? []).filter((cell) => !cell.hidden);\n}\n\n/** Sizes a table to the sum of its columns, so it scrolls once they outgrow the wrapper. */\nfunction fit(table: HTMLTableElement) {\n table.style.width = `${firstCells(table).reduce((sum, cell) => sum + parseFloat(cell.style.width), 0)}px`;\n}\n\n/**\n * Holds every column at its current width under the fixed table layout, so\n * resizing one column leaves the others alone. The automatic layout shares a\n * change among all of them.\n */\nfunction freeze(table: HTMLTableElement) {\n if (table.style.tableLayout === 'fixed') return;\n const cells = firstCells(table);\n // Measure every cell before writing any, so no write reflows a later read.\n const sizes = cells.map((cell) => cell.getBoundingClientRect().width);\n cells.forEach((cell, i) => (cell.style.width = `${sizes[i]}px`));\n table.style.tableLayout = 'fixed';\n fit(table);\n}\n\n/** The narrowest and widest a column may get: its minimum token, and the wrapper's inner width. */\nfunction bounds(header: HTMLTableCellElement): [number, number] {\n const min = parseFloat(getComputedStyle(header).minWidth) || 0;\n return [min, Math.max(min, header.closest('.data-table').clientWidth)];\n}\n\n/** The next of a column's narrow, middle and wide widths, wrapping to narrow. */\nfunction nextStep(header: HTMLTableCellElement) {\n const [min, max] = bounds(header);\n const current = header.getBoundingClientRect().width;\n return [min, (min + max) / 2, max].find((width) => width > current + 1) ?? min;\n}\n\n/**\n * The width a key asks for, or undefined for another key. The arrow toward\n * the column's inline-end edge widens it; Home and End jump to the bounds.\n */\nfunction keyWidth(header: HTMLTableCellElement, e: KeyboardEvent) {\n const [min, max] = bounds(header);\n const amount = (e.shiftKey ? 4 : 1) * STEP * (getComputedStyle(header).direction === 'rtl' ? -1 : 1);\n const current = header.getBoundingClientRect().width;\n const widths: Record<string, number> = { ArrowRight: current + amount, ArrowLeft: current - amount, Home: min, End: max };\n return widths[e.key];\n}\n\n/**\n * Data tables. In a `.data-table`, a checkbox in the first header cell\n * selects every row, and shows mixed while only some are selected. With\n * `data-sort` on the wrapper, a button in a header cell sorts the rows by\n * that column and moves `aria-sort`. Both fire events from the wrapper:\n * `expressive:change` with the selected rows, and a cancelable\n * `expressive:sort`, which a server-sorted table cancels to sort the rows\n * itself. A `.drag-handle` button ending a header cell resizes its column\n * and fires `expressive:resize` with `{ header, column, width }`. A menu\n * checkbox item with `data-column` naming a first-row header cell's id\n * hides that column while it is unchecked.\n * Marked search inputs request `expressive:filter` with `{ query }`.\n * Cancel to keep records and counts server-owned across silent sync calls.\n * A positive `data-page-size` opts into local record-group paging through\n * authored Previous/Next buttons; selections on other pages stay checked.\n * A marked single select changes the size while preserving a valid page.\n * Page/size controls request cancelable `expressive:page` before a local\n * default. setPage accepts server state whose records stay application-owned.\n */\nexport class DataTables {\n private static _initialized = false;\n private static _dragged = false;\n private static _serverFilters = new WeakMap<Element, Event>();\n private static _pages = new WeakMap<Element, PageView>();\n private static _pageRequests = new WeakMap<Element, Event>();\n\n static Init() {\n if (DataTables._initialized || typeof document === 'undefined') return;\n DataTables._initialized = true;\n // A checkbox's input event crosses shadow roots; its change event does not.\n document.addEventListener('input', DataTables._onChange);\n document.addEventListener('input', DataTables._onFilter);\n document.addEventListener('input', DataTables._onPageSize);\n document.addEventListener('change', DataTables._onPageSize);\n document.addEventListener('click', DataTables._onClick);\n document.addEventListener('click', DataTables._onPage);\n document.addEventListener('pointerdown', DataTables._onPointerDown);\n document.addEventListener('click', DataTables._onHandleClick);\n document.addEventListener('keydown', DataTables._onKeyDown);\n document.addEventListener('expressive:change', DataTables._onToggle);\n Utils.onDocumentReady(() => document.querySelectorAll('.data-table').forEach(DataTables.sync));\n }\n\n /**\n * Shows on a table's select-all box whether all, some or none of its rows\n * are selected. This runs for the tables in the page when it loads; call\n * it for a `.data-table` rendered later with rows already checked, or\n * after checking rows from script, which fires no change. It also shows\n * and hides the columns that column toggles name, as their\n * `aria-checked` says.\n * It reapplies a local query, or preserves application records and counts\n * after a canceled filter request. It fires no events.\n * Local paging preserves the current page where possible and clamps it\n * after record changes, before synchronizing the page's select-all state.\n * Accepted server pages retain all supplied visible records and use their\n * application total for status and bounds, without local filtering.\n */\n static sync(wrapper: Element) {\n const table = wrapper.querySelector<HTMLTableElement>(':scope > table');\n if (table) {\n table.querySelectorAll(`:scope > tbody > tr[${PAGED}]`).forEach((row) => row.removeAttribute(PAGED));\n if (DataTables._pages.get(wrapper)?.server) {\n table.querySelectorAll(`:scope > tbody > tr[${FILTERED}]`).forEach((row) => row.removeAttribute(FILTERED));\n }\n DataTables._filter(wrapper, table);\n DataTables._page(wrapper, table);\n DataTables._select(DataTables._all(table), DataTables._enabled(table), false);\n }\n (wrapper.getRootNode() as ParentNode).querySelectorAll(TOGGLE).forEach((item) => {\n if (wrapper.contains(toggledHeader(item))) applyToggle(item);\n });\n }\n\n /** Accepts application page state without slicing its records; null restores local paging. */\n static setPage(wrapper: Element, state: TablePageState | null): boolean {\n if (!wrapper?.matches?.('.data-table:has(> table)')) return false;\n if (!DataTables._storePage(wrapper, state)) return false;\n DataTables._pageRequests.delete(wrapper);\n DataTables.sync(wrapper);\n return true;\n }\n\n private static _storePage(wrapper: Element, state: TablePageState | null) {\n if (state === null) {\n DataTables._pages.delete(wrapper);\n return true;\n }\n if (!state) return false;\n const accepted = { page: state.page, pageSize: state.pageSize, total: state.total };\n if (!validPageState(accepted)) return false;\n wrapper.setAttribute('data-page-size', String(accepted.pageSize));\n DataTables._pages.set(wrapper, { ...accepted, server: true });\n return true;\n }\n\n /** A column's width in pixels, read from its header cell. */\n static width(header: Element) {\n return header.getBoundingClientRect().width;\n }\n\n /**\n * Sets a column's width from its header cell, between the\n * `--md-comp-data-table-column-min-width` token and the wrapper's inner\n * width. It fires no event, so a page can restore saved widths with it.\n */\n static setWidth(header: HTMLTableCellElement, width: number) {\n const table = header.closest('table');\n const [min, max] = bounds(header);\n freeze(table);\n header.style.width = `${Math.round(Math.min(Math.max(width, min), max))}px`;\n fit(table);\n }\n\n /**\n * A table's select-all box: a checkbox in a header cell of the first\n * column. In a grouped header the first cell of a later row can belong to\n * another column, so the column is counted, not the cell's place.\n */\n private static _all(table: HTMLTableElement) {\n const head = table.tHead;\n const box = 'input[type=\"checkbox\"]';\n const cell = head && [...headerColumns(head)].find(([each, column]) => column === 0 && each.querySelector(box))?.[0];\n return cell?.querySelector<HTMLInputElement>(box);\n }\n\n /** The enabled record boxes visible in the current view. */\n private static _enabled(table: HTMLTableElement) {\n // :disabled also covers a box inside a disabled fieldset.\n return DataTables._boxes(table).filter((each) => !each.matches(':disabled') && visibleRecord(each.closest('tr')));\n }\n\n /** The selection checkboxes of a table's record rows. */\n private static _boxes(table: HTMLTableElement) {\n return Array.from(table.querySelectorAll<HTMLTableRowElement>(ROWS), (row) =>\n row.querySelector<HTMLInputElement>(BOX)).filter(Boolean);\n }\n\n private static _onChange = (e: Event) => {\n const box = Utils.eventTarget(e);\n const wrapper = box?.closest('.data-table');\n const table = wrapper?.querySelector<HTMLTableElement>(':scope > table');\n if (!table) return;\n const [all, boxes] = [DataTables._all(table), DataTables._boxes(table)];\n if (box !== all && !boxes.includes(box as HTMLInputElement)) return;\n DataTables._select(all, DataTables._enabled(table), box === all);\n Utils.emit(wrapper, 'change', { selected: boxes.filter((each) => each.checked).map((each) => each.closest('tr')) });\n };\n\n private static _onFilter = (e: Event) => {\n const input = Utils.closestInPath(e, `.data-table ${FILTER}`) as HTMLInputElement;\n if (!input) return;\n const wrapper = input.closest('.data-table');\n // A listener may replace rows, sync or dispatch a newer request before returning.\n DataTables._serverFilters.set(wrapper, e);\n if (Utils.emit(wrapper, 'filter', { query: input.value.trim() }, true) && DataTables._serverFilters.get(wrapper) === e) {\n DataTables._serverFilters.delete(wrapper);\n DataTables._resetPage(wrapper);\n }\n };\n\n /** Filters record groups without changing author hiding or expansion state. */\n private static _filter(wrapper: Element, table: HTMLTableElement) {\n const input = tableControl(wrapper, FILTER) as HTMLInputElement;\n if (!input) return;\n const locale = Utils.locale(table);\n const query = DataTables._serverRecords(wrapper) ? '' : input.value.trim().toLocaleLowerCase(locale);\n const headers = table.tHead ? [...headerColumns(table.tHead)] : [];\n const columns = headers.filter(([cell]) => cell.hasAttribute('data-filter') && (cell as HTMLTableCellElement).colSpan === 1).map(([, column]) => column);\n const groups = DataTables._records(table);\n // Read visibility between write batches, so filtering causes one layout, not one per record.\n groups.forEach(([row]) => row.removeAttribute(FILTERED));\n const matches = groups.map(([row]) => visibleRecord(row) && DataTables._matches(row, columns, query, locale));\n groups.forEach((group, index) => group.forEach((row) => row.toggleAttribute(FILTERED, !matches[index])));\n DataTables._filterCount(wrapper, locale, matches.filter(Boolean).length);\n }\n\n /** A server-filtered table's count belongs to the application. */\n private static _filterCount(wrapper: Element, locale: string, matches: number) {\n if (DataTables._serverRecords(wrapper)) return;\n const count = tableControl(wrapper, '[data-table-filter-count]');\n if (count) count.textContent = new Intl.NumberFormat(locale).format(matches);\n }\n\n private static _serverRecords(wrapper: Element) {\n return DataTables._pages.get(wrapper)?.server || DataTables._serverFilters.has(wrapper);\n }\n\n private static _matches(row: HTMLTableRowElement, columns: number[], query: string, locale: string) {\n return !query || columns.some((column) => cellText(row, column).toLocaleLowerCase(locale).includes(query));\n }\n\n private static _onPage = (e: MouseEvent) => {\n const button = Utils.closestInPath(e, `.data-table[data-page-size] ${PAGE_BUTTON}:not(:disabled, [aria-disabled=\"true\"])`) as HTMLButtonElement;\n if (!button) return;\n const wrapper = button.closest('.data-table');\n if (!pageSize(wrapper)) return;\n DataTables._advancePage(wrapper, PAGE_STEP[button.dataset.tablePage], e);\n };\n\n private static _advancePage(wrapper: Element, step: number, event: Event) {\n const view = DataTables._pageState(wrapper);\n const page = pageIndex(view.page + step, view.total, pageSize(wrapper));\n if (page < 1 || page === view.page) return;\n DataTables._requestPage(wrapper, { page, pageSize: pageSize(wrapper) }, event);\n }\n\n private static _onPageSize = (e: Event) => {\n if (!e.composed) return;\n const control = Utils.closestInPath(e, `.data-table[data-page-size] ${PAGE_SIZE}`) as HTMLSelectElement;\n if (!control) return;\n DataTables._setPageSize(control.closest('.data-table'), control.value, e);\n };\n\n private static _setPageSize(wrapper: Element, value: string, event: Event) {\n const size = positivePageSize(value);\n if (!size || !pageSize(wrapper) || size === pageSize(wrapper)) return;\n const view = DataTables._pageState(wrapper);\n const page = Math.max(1, pageIndex(view.page, view.total, size));\n DataTables._requestPage(wrapper, { page, pageSize: size }, event);\n }\n\n private static _requestPage(wrapper: Element, request: Pick<TablePageState, 'page' | 'pageSize'>, event: Event) {\n const view = DataTables._pageState(wrapper);\n DataTables._pageRequests.set(wrapper, event);\n if (!Utils.emit(wrapper, 'page', request, true)) return;\n if (DataTables._pageRequests.get(wrapper) !== event) return;\n if (view.server) return;\n wrapper.setAttribute('data-page-size', String(request.pageSize));\n DataTables._pages.set(wrapper, { ...view, ...request });\n DataTables.sync(wrapper);\n }\n\n private static _pageState(wrapper: Element): PageView {\n const previous = DataTables._pages.get(wrapper);\n if (previous) return previous;\n const table = wrapper.querySelector<HTMLTableElement>(':scope > table');\n const total = table ? DataTables._records(table).filter(([row]) => visibleRecord(row)).length : 0;\n return { page: 1, pageSize: pageSize(wrapper), total };\n }\n\n /** Filter visibility is settled before paging; details consume no slots. */\n private static _page(wrapper: Element, table: HTMLTableElement) {\n const size = pageSize(wrapper);\n if (!size) return;\n const groups = DataTables._records(table);\n const eligible = groups.filter(([row]) => visibleRecord(row));\n const view = DataTables._pageView(wrapper, eligible.length, size);\n DataTables._pages.set(wrapper, view);\n const displayed = view.server ? eligible : eligible.slice((view.page - 1) * size, view.page * size);\n const shown = new Set(displayed.map(([row]) => row));\n groups.forEach((group) => group.forEach((row) => row.toggleAttribute(PAGED, !shown.has(group[0]))));\n DataTables._pageControls(wrapper, view.page, Math.ceil(view.total / size));\n }\n\n private static _pageView(wrapper: Element, total: number, size: number): PageView {\n const previous = DataTables._pages.get(wrapper) ?? { page: 1, pageSize: size, total };\n const records = previous.server ? previous.total : total;\n return { ...previous, page: pageIndex(previous.page, records, size), pageSize: size, total: records };\n }\n\n private static _pageControls(wrapper: Element, page: number, pages: number) {\n wrapper.querySelectorAll<HTMLButtonElement>(PAGE_BUTTON).forEach((button) => {\n if (button.closest('.data-table') !== wrapper) return;\n const unavailable = button.dataset.tablePage === 'previous' ? page <= 1 : page >= pages;\n button.setAttribute('aria-disabled', String(unavailable));\n });\n const status = tableControl(wrapper, '[data-table-page-status]');\n if (status) {\n const number = new Intl.NumberFormat(Utils.locale(wrapper));\n status.textContent = `${number.format(page)} / ${number.format(pages)}`;\n }\n }\n\n /** Sorting resets only opted-in tables; ordinary table behavior stays unchanged. */\n private static _firstPage(wrapper: Element) {\n if (!pageSize(wrapper)) return;\n DataTables._resetPage(wrapper);\n }\n\n private static _resetPage(wrapper: Element) {\n if (DataTables._pages.get(wrapper)?.server) return;\n DataTables._pages.delete(wrapper);\n DataTables.sync(wrapper);\n }\n\n /**\n * Checks every enabled row when the select-all box changed, then shows on\n * it whether all, some or none of them are checked.\n */\n private static _select(all: HTMLInputElement | null | undefined, boxes: HTMLInputElement[], fromAll: boolean) {\n if (!all) return;\n if (fromAll) boxes.forEach((each) => (each.checked = all.checked));\n const checked = boxes.filter((each) => each.checked).length;\n // Mixed is some but not all: a remainder only when 0 < checked < length.\n all.indeterminate = checked % boxes.length > 0;\n all.checked = checked > 0 && !all.indeterminate;\n }\n\n private static _onClick = (e: MouseEvent) => {\n const button = Utils.closestInPath(e, '.data-table[data-sort] > table > thead > tr > th > button:not([aria-haspopup], :disabled, [aria-disabled=\"true\"], .drag-handle)');\n if (!button) return;\n const header = button.parentElement as HTMLTableCellElement;\n const wrapper = header.closest('.data-table');\n const direction = header.getAttribute('aria-sort') === 'ascending' ? 'descending' : 'ascending';\n header.closest('thead').querySelectorAll('th[aria-sort]').forEach((cell) => cell.removeAttribute('aria-sort'));\n header.setAttribute('aria-sort', direction);\n const column = headerColumns(header.closest('thead')).get(header);\n if (Utils.emit(wrapper, 'sort', { header, column, direction }, true)) {\n DataTables._sort(header.closest('table'), header, column, ORDER[direction]);\n DataTables._firstPage(wrapper);\n }\n };\n\n /** Menu's change from a column toggle; a data table's own change has no item. */\n private static _onToggle = (e: CustomEvent<{ item?: Element }>) => {\n const item = e.detail?.item;\n if (item?.matches?.(TOGGLE)) applyToggle(item);\n };\n\n private static _onPointerDown = (e: PointerEvent) => {\n const handle = Utils.closestInPath(e, HANDLE) as HTMLElement;\n if (handle && e.button === 0) DataTables._drag(handle, e);\n };\n\n /**\n * Moves a column's inline-end edge with the pointer. A few pixels of\n * travel is still a click.\n */\n private static _drag(handle: HTMLElement, start: PointerEvent) {\n const header = handle.parentElement as HTMLTableCellElement;\n const from = DataTables.width(header);\n const sign = getComputedStyle(header).direction === 'rtl' ? -1 : 1;\n DataTables._dragged = false;\n handle.setPointerCapture(start.pointerId);\n const drag = controllerFor(handle);\n const { signal } = drag;\n handle.addEventListener('pointermove', (e) => {\n const delta = e.clientX - start.clientX;\n if (Math.abs(delta) < 4 && !DataTables._dragged) return;\n DataTables._dragged = true;\n DataTables.setWidth(header, from + sign * delta);\n }, { signal });\n const end = () => {\n drag.abort();\n if (DataTables._dragged) DataTables._resized(header, from);\n };\n handle.addEventListener('pointerup', end, { signal });\n handle.addEventListener('pointercancel', end, { signal });\n }\n\n /**\n * Steps a column through narrow, middle and wide: the single-pointer\n * alternative to dragging. The click that ends a mouse drag is not a\n * request to step; a keyboard click (detail 0) always is.\n */\n private static _onHandleClick = (e: MouseEvent) => {\n const handle = Utils.closestInPath(e, HANDLE);\n if (!handle || (e.detail !== 0 && DataTables._dragged)) return;\n const header = handle.parentElement as HTMLTableCellElement;\n DataTables._resizeTo(header, nextStep(header));\n };\n\n private static _onKeyDown = (e: KeyboardEvent) => {\n const handle = Utils.closestInPath(e, HANDLE);\n if (!handle || !Utils.plainKey(e)) return;\n const header = handle.parentElement as HTMLTableCellElement;\n const width = keyWidth(header, e);\n if (width === undefined) return;\n e.preventDefault();\n DataTables._resizeTo(header, width);\n };\n\n /** Sets a column's width and fires `expressive:resize` if it changed. */\n private static _resizeTo(header: HTMLTableCellElement, width: number) {\n const from = DataTables.width(header);\n DataTables.setWidth(header, width);\n DataTables._resized(header, from);\n }\n\n /** Fires `expressive:resize` from the wrapper when a column's width moved off `from`. */\n private static _resized(header: HTMLTableCellElement, from: number) {\n const width = DataTables.width(header);\n if (Math.abs(width - from) < 0.5) return;\n const column = headerColumns(header.closest('thead')).get(header);\n Utils.emit(header.closest('.data-table'), 'resize', { header, column, width });\n }\n\n /**\n * Reorders each body's rows by one column. A detail row moves with the\n * row before it.\n */\n private static _sort(table: HTMLTableElement, header: HTMLTableCellElement, column: number, order: number) {\n if (DataTables._pages.get(table.closest('.data-table'))?.server) return;\n const compare = DataTables._compare(table, header);\n for (const body of Array.from(table.tBodies)) {\n const groups = DataTables._groups(body);\n groups.sort(([a], [b]) => order * compare(cellText(a, column), cellText(b, column)));\n body.append(...groups.flat());\n }\n }\n\n /**\n * How a column compares: a `.numeric` header's as numbers, as a chart\n * reads them, with text that is not a number first; any other as text in\n * the page's language, with digit runs as numbers.\n */\n private static _compare(table: HTMLTableElement, header: HTMLTableCellElement) {\n if (!header.classList.contains('numeric')) return new Intl.Collator(Utils.locale(table), { numeric: true, sensitivity: 'base' }).compare;\n const number = (text: string) => numberValue(text) ?? -Infinity;\n return (a: string, b: string) => number(a) - number(b);\n }\n\n private static _records(table: HTMLTableElement) {\n return Array.from(table.tBodies).flatMap(DataTables._groups).filter(([row]) => !row.classList.contains('data-table-detail'));\n }\n\n /** A body's rows in groups: each record row with the detail rows after it. */\n private static _groups(body: HTMLTableSectionElement) {\n const groups: HTMLTableRowElement[][] = [];\n for (const row of Array.from(body.rows)) {\n if (groups.length && row.classList.contains('data-table-detail')) groups[groups.length - 1].push(row);\n else groups.push([row]);\n }\n return groups;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/registry.ts"],
|
|
4
|
-
"sourcesContent": ["import { InitElements, InitElement } from \"../core/component\";\nimport * as Components from \"./index\";\nimport { CARDS_SELECTOR, isCardReveal } from \"./cards\";\nimport { EXPANDING_CARD_SELECTOR } from \"./expandingCard\";\n\n/**\n * The components `AutoInit()` starts, in initialization order, with the\n * selector each one claims.\n *\n * This table is the single source of truth: the options type below and the\n * init calls in `AutoInit()` are both derived from it, so wiring up a new\n * auto-initialized component means adding one line here (plus its export in\n * ./index.ts) - not four hand-synchronized edits that fail silently when one\n * is forgotten.\n *\n * A component that should only ever be constructed explicitly (Snackbar,\n * CharacterCounter, ...) simply stays out of this table.\n */\nexport const AUTO_INIT_COMPONENTS = {\n AppBar: {\n component: Components.AppBar,\n selector:\n \"header.medium, header.large, header:has(> :is(nav:not(.tabs, .navigation-bar, .navigation-rail), .bar) > .search-bar)\",\n },\n Autocomplete: {\n component: Components.Autocomplete,\n selector: \".autocomplete\",\n },\n ButtonGroup: {\n component: Components.ButtonGroup,\n selector: \".button-group\",\n },\n // Shared with Cards.Init() - see CARDS_SELECTOR. This entry used to read\n // '.cards', which no card markup uses.\n Cards: { component: Components.Cards, selector: CARDS_SELECTOR, filter: isCardReveal },\n ExpandingCard: {\n component: Components.ExpandingCard,\n selector: EXPANDING_CARD_SELECTOR,\n },\n Carousel: { component: Components.Carousel, selector: \".carousel\" },\n Chips: { component: Components.Chips, selector: \".chips\" },\n Confetti: { component: Components.Confetti, selector: \".confetti\" },\n Particles: { component: Components.Particles, selector: \"canvas.particles\" },\n Keypad: { component: Components.Keypad, selector: \".keypad, .keyboard\" },\n ColorPicker: { component: Components.ColorPicker, selector: \".color-picker\" },\n ColumnChart: { component: Components.ColumnChart, selector: \".column-chart\" },\n BarChart: { component: Components.BarChart, selector: \".bar-chart\" },\n PieChart: { component: Components.PieChart, selector: \".pie-chart\" },\n HeatmapChart: { component: Components.HeatmapChart, selector: \".heatmap-chart\" },\n RadarChart: { component: Components.RadarChart, selector: \".radar-chart\" },\n RadialChart: { component: Components.RadialChart, selector: \".radial-chart\" },\n MixedChart: { component: Components.MixedChart, selector: \".mixed-chart\" },\n ScatterChart: { component: Components.ScatterChart, selector: \".scatter-chart\" },\n FunnelChart: { component: Components.FunnelChart, selector: \".funnel-chart\" },\n SankeyChart: { component: Components.SankeyChart, selector: \".sankey-chart\" },\n TreemapChart: { component: Components.TreemapChart, selector: \".treemap-chart\" },\n CommandPalette: {\n component: Components.CommandPalette,\n selector: \"dialog.command-palette\",\n },\n Questionnaire: {\n component: Components.Questionnaire,\n selector: \"form.questionnaire\",\n },\n Datepicker: {\n component: Components.Datepicker,\n selector: \".date-picker\",\n },\n LineChart: { component: Components.LineChart, selector: \".line-chart\" },\n Menu: { component: Components.Menu, selector: \".menu-trigger\" },\n MessageScroller: {\n component: Components.MessageScroller,\n selector: \".message-scroller\",\n },\n PullToRefresh: { component: Components.PullToRefresh, selector: \".pull-to-refresh\" },\n LoadingOverlay: { component: Components.LoadingOverlay, selector: \".loading-overlay\" },\n SwipeActions: { component: Components.SwipeActions, selector: \".list.swipeable\" },\n // Only the input types with a caret: setSelectionRange() throws on the rest.\n InputMask: {\n component: Components.InputMask,\n selector: 'input[data-mask]:is(:not([type]), [type=\"text\" i], [type=\"tel\" i], [type=\"search\" i], [type=\"url\" i], [type=\"password\" i])',\n },\n ShowMore: { component: Components.ShowMore, selector: \".show-more\" },\n // Only a text input can hold the formatted amount.\n CurrencyInput: { component: Components.CurrencyInput, selector: 'input[data-currency]:is(:not([type]), [type=\"text\" i])' },\n Lightbox: { component: Components.Lightbox, selector: \".lightboxed\" },\n ScrollSpy: { component: Components.ScrollSpy, selector: \".scrollspy\" },\n BackToTop: { component: Components.BackToTop, selector: \".back-to-top\" },\n // A data-tree select is a tree select, not a flat one.\n FormSelect: { component: Components.FormSelect, selector: \"select:not([data-tree])\" },\n TreeSelect: { component: Components.TreeSelect, selector: \"select[data-tree]\" },\n Cascader: { component: Components.Cascader, selector: \".cascader\" },\n NavigationRail: {\n component: Components.NavigationRail,\n selector: \".navigation-rail\",\n },\n Tabs: { component: Components.Tabs, selector: \".tabs\" },\n Timepicker: {\n component: Components.Timepicker,\n selector: \".time-picker\",\n },\n Tooltip: { component: Components.Tooltip, selector: \".tooltipped\" },\n HoverCard: { component: Components.HoverCard, selector: \".hover-card-trigger\" },\n FloatingActionButton: {\n component: Components.FloatingActionButton,\n selector: \".fab-menu\",\n },\n // After Menu, so the bar's own menu options replace AutoInit's defaults.\n Menubar: { component: Components.Menubar, selector: \".menubar\" },\n};\n\ntype Registry = typeof AUTO_INIT_COMPONENTS;\n\n/**\n * Per-component options accepted by {@link AutoInit}, derived from the table\n * above - each key takes that component's own options type.\n */\nexport type AutoInitOptions = {\n [K in keyof Registry]?: Partial<\n InstanceType<Registry[K][\"component\"]>[\"options\"]\n >;\n};\n\n/** The shape every entry in the table satisfies; see the cast in AutoInit. */\ntype AutoInitable = {\n defaults: object;\n getInstance(el: Element): { destroy(): void } | undefined;\n init(els: InitElement | InitElements<InitElement>, options: Partial<object>): unknown;\n};\n\ntype AutoInitEntry = {\n component: AutoInitable;\n selector: string;\n filter?: (el: Element) => boolean;\n};\n\n/**\n * Options markup cannot set: `allowUnsafeHTML` turns off HTML escaping,\n * `minYear` and `maxYear` are internal, and Chips and Autocomplete throw\n * part way through their constructors on `data` entries of the wrong shape.\n */\nconst MARKUP_BLOCKED = new Set([\"allowUnsafeHTML\", \"minYear\", \"maxYear\", \"data\"]);\nconst OBJECT = \"[object Object]\";\nconst ARRAY = \"[object Array]\";\n/** The default kinds markup can replace with a value of the same kind. */\nconst SETTABLE = new Set([\"[object String]\", \"[object Number]\", \"[object Boolean]\", ARRAY, OBJECT]);\n\n/** The attribute a component reads its markup options from: `FormSelect` reads `data-form-select-options`. */\nconst optionsAttribute = (name: string) => `data-${name.replace(/\\B[A-Z]/g, \"-$&\").toLowerCase()}-options`;\n\n/** A value's kind as its `toString` tag, with objects that are not plain counted apart. */\nfunction kind(value: unknown) {\n const tag = Object.prototype.toString.call(value);\n return tag === OBJECT && Object.getPrototypeOf(value) !== Object.prototype ? \"other\" : tag;\n}\n\n/** Whether every item has the kind of the default array's first item, when it has one. */\nconst itemsMatch = (fallback: unknown[], value: unknown[]) =>\n !fallback.length || value.every((item) => kind(item) === kind(fallback[0]));\n\n/** Whether a markup value may replace `fallback`: both are the same settable kind. */\nfunction sameKind(fallback: unknown, value: unknown) {\n const type = kind(fallback);\n if (!SETTABLE.has(type) || kind(value) !== type) return false;\n return type !== ARRAY || itemsMatch(fallback as unknown[], value as unknown[]);\n}\n\nconst accepts = (defaults: object, key: string, value: unknown) =>\n Object.hasOwn(defaults, key) && !MARKUP_BLOCKED.has(key) && sameKind(defaults[key], value);\n\n/** Records a rejected key; returns undefined so the key is left out. */\nconst reject = (rejected: string[], key: string) => void rejected.push(key);\n\n/**\n * A plain object filtered against its default object, or undefined once any\n * key inside it is rejected, so the whole option keeps its default. Other\n * values pass through.\n */\nfunction nested(value: unknown, fallback: object, rejected: string[], path: string) {\n if (kind(value) !== OBJECT) return value;\n const count = rejected.length;\n const picked = pick(value as object, fallback, rejected, path);\n return rejected.length === count ? picked : undefined;\n}\n\n/**\n * Copies the entries of `parsed` that `defaults` owns and that keep their\n * default's kind. Only own keys of `defaults` are copied, so `__proto__` never\n * is. Rejected keys go into `rejected`, dotted below the top level.\n */\nfunction pick(parsed: object, defaults: object, rejected: string[], path = \"\"): Record<string, unknown> {\n const picked: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(parsed)) {\n const kept = accepts(defaults, key, value) ? nested(value, defaults[key], rejected, `${path}${key}.`) : reject(rejected, path + key);\n if (kept !== undefined) picked[key] = kept;\n }\n return picked;\n}\n\n/** `text` parsed as a JSON object, or null. */\nfunction parseObject(text: string): object | null {\n try {\n const value: unknown = JSON.parse(text);\n return kind(value) === OBJECT ? (value as object) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * The options an element sets for component `name` in its\n * `data-<name>-options` attribute. The attribute is untrusted: a value that is\n * not valid JSON, not an object, or not the kind of its default is dropped\n * with a warning, so that option keeps its default.\n */\nfunction markupOptions(el: Element, name: string, defaults: object) {\n const attribute = optionsAttribute(name);\n const text = el.getAttribute(attribute);\n if (text === null) return {};\n const parsed = parseObject(text);\n if (!parsed) {\n console.warn(`${name} ignored ${attribute}: expected a JSON object.`, el);\n return {};\n }\n const rejected: string[] = [];\n const options = pick(parsed, defaults, rejected);\n rejected.forEach((key) => console.warn(`${name} ignored \"${key}\" in ${attribute}: markup cannot set that option to that value.`, el));\n return options;\n}\n\n// Each component's static `init` is overloaded; indexing the table widens it\n// to a union TypeScript cannot call, so narrow it once, here.\nconst entry = (name: keyof Registry) => AUTO_INIT_COMPONENTS[name] as unknown as AutoInitEntry;\nconst NAMES = Object.keys(AUTO_INIT_COMPONENTS) as (keyof Registry)[];\n\n/** Starts component `name` on one element, with its markup options under `options`. */\nfunction initElement(name: keyof Registry, el: Element, options: object = {}) {\n const { component } = entry(name);\n component.init(el, { ...markupOptions(el, name, component.defaults), ...options });\n}\n\n/**\n * The elements under `root` that component `name` claims, plus `root` itself\n * when `self` is set. `:is()` so that `:not(.no-autoinit)` applies to the\n * whole selector: a bare `${selector}:not(...)` binds the negation to the last\n * alternative only, which would break the opt-out for any comma-separated\n * entry (Cards is the first).\n */\nfunction claimed(name: keyof Registry, root: ParentNode, self = false): Element[] {\n const { selector, filter = () => true } = entry(name);\n const query = `:is(${selector}):not(.no-autoinit)`;\n const own = self && (root as Element).matches(query) ? [root as Element] : [];\n return [...own, ...root.querySelectorAll(query)].filter(filter);\n}\n\n/** Starts the components an added element and its descendants claim, leaving existing instances alone. */\nfunction startAdded(node: Node, options?: Partial<AutoInitOptions>) {\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n for (const name of NAMES) {\n claimed(name, node as Element, true).forEach((el) => entry(name).component.getInstance(el) || initElement(name, el, options?.[name]));\n }\n}\n\n/**\n * Destroys the instances of a removed element and its descendants that\n * AutoInit would claim. An element that is back in the page by now was moved,\n * and keeps its instances.\n */\nfunction stopRemoved(node: Node) {\n if (node.nodeType !== Node.ELEMENT_NODE || node.isConnected) return;\n for (const name of NAMES) {\n claimed(name, node as Element, true).forEach((el) => entry(name).component.getInstance(el)?.destroy());\n }\n}\n\n/** Watches `context`, starting components in added markup and destroying them in removed markup. */\nfunction watch(context: Node, options?: Partial<AutoInitOptions>) {\n const handle = (records: MutationRecord[]) => {\n for (const { addedNodes, removedNodes } of records) {\n removedNodes.forEach(stopRemoved);\n addedNodes.forEach((node) => context.contains(node) && startAdded(node, options));\n }\n };\n const observer = new MutationObserver(handle);\n observer.observe(context, { childList: true, subtree: true });\n // Handle the changes not delivered yet first, so markup added just before stop() still starts.\n return () => {\n handle(observer.takeRecords());\n observer.disconnect();\n };\n}\n\n/**\n * Automatically initialize components.\n * @param context Root element or shadow root to initialize. Defaults to\n * `document.body`. Shadow roots inside it are not entered.\n * @param options Options for each component.\n * @param settings With `watch: true`, keep starting components in markup\n * added to `context` later, and destroy them when their markup is removed.\n * @returns A function that stops watching. It does nothing without `watch`.\n */\nexport function AutoInit(\n context: HTMLElement | ShadowRoot = document.body,\n options?: Partial<AutoInitOptions>,\n settings: { watch?: boolean } = {},\n): () => void {\n for (const name of NAMES) {\n claimed(name, context).forEach((el) => initElement(name, el, options?.[name]));\n }\n return settings.watch ? watch(context, options) : () => {};\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ts/components/mixedChart.ts"],
|
|
4
|
-
"sourcesContent": ["import { ColumnChart } from './columnChart';\nimport { LineChart, LineChartOptions, Series, niceStep, steps } from './lineChart';\n\nexport type MixedChartOptions = LineChartOptions;\n\n/** The low end and round step that cover min to max in exactly `parts` steps. */\nfunction fitSteps(min: number, max: number, parts: number): [low: number, step: number] {\n let step = niceStep(max - min, parts);\n // A floored start can leave the top short; the next round step covers it.\n while (Math.floor(min / step) * step + parts * step < max) step = niceStep(step * parts * 1.001, parts);\n return [Math.floor(min / step) * step, step];\n}\n\n/** Whether a series header cell has a class. */\nconst has = (series: Series, name: string) => series.className.split(/\\s+/).includes(name);\n\n/**\n * Mixed chart. It reads its <table> like LineChart, and draws each series\n * by its header cell's class: `column` as columns from zero, `area` as a\n * line with a fill under it, and anything else as a line. Series with\n * `end` are drawn against a second scale, set by `data-end-min` and\n * `data-end-max`, so values of different sizes or units share the plot.\n * With `stacked` the columns stack; `points` and `straight` apply to the\n * lines as in LineChart.\n *\n * Call `update()` after changing the table, or start it with `watch` or\n * `data-watch`.\n */\nexport class MixedChart extends ColumnChart {\n protected get _type() {\n return 'mixed-chart';\n }\n\n protected get _points() {\n return true;\n }\n\n static key = 'Expressive_MixedChart';\n\n /**\n * With .stacked, the columns on each scale stack on the ones before them;\n * the lines and areas keep their own values.\n */\n protected _stack(series: Series[]) {\n const columns = series.filter((each) => has(each, 'column'));\n super._stack(columns.filter((each) => !has(each, 'end')));\n super._stack(columns.filter((each) => has(each, 'end')));\n }\n\n /** The start scale, then the end scale; each includes zero if it has columns. */\n protected _scale(series: Series[], min: number | null, max: number | null) {\n const end = series.filter((each) => has(each, 'end'));\n const start = series.filter((each) => !end.includes(each));\n const columns = (list: Series[]) => list.some((each) => has(each, 'column'));\n const endRange = [this._number('endMin'), this._number('endMax')] as const;\n const y = super._scale(start, min, max, columns(start));\n super._scale(end, ...endRange, columns(end));\n // Only scales the chart chose itself can stretch to line up.\n if ([min, max, ...endRange].every((value) => value === null)) this._align(start, end);\n return y;\n }\n\n /**\n * With .axis, widens the end scale to as many round steps as the start\n * scale has, so its labels fall on the start scale's grid lines.\n */\n private _align(start: Series[], end: Series[]) {\n const parts = start.length ? start[0].scale.ticks.length - 1 : 0;\n if (parts < 1 || !end.length) return;\n const [low, step] = fitSteps(end[0].scale.min, end[0].scale.max, parts);\n const high = low + parts * step;\n this._apply(end, { min: low, max: high, ticks: steps(low, high, step) });\n }\n\n /** Columns behind, then the lines and areas over them. */\n protected _draw(): Element {\n const marks = document.createElement('div');\n marks.className = 'mixed-chart-marks';\n const columns = super._draw(this.series.filter((series) => has(series, 'column')));\n columns.className = 'mixed-chart-columns';\n marks.append(columns, LineChart.prototype['_draw'].call(this, this.series.filter((series) => !has(series, 'column'))));\n return marks;\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;AAMA,SAAS,SAAS,KAAa,KAAa,OAA4C;AACtF,MAAI,OAAO,SAAS,MAAM,KAAK,KAAK;AAEpC,SAAO,KAAK,MAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,OAAO,IAAK,QAAO,SAAS,OAAO,QAAQ,OAAO,KAAK;AACtG,SAAO,CAAC,KAAK,MAAM,MAAM,IAAI,IAAI,MAAM,IAAI;AAC7C;AAGA,IAAM,MAAM,CAAC,QAAgB,SAAiB,OAAO,UAAU,MAAM,KAAK,EAAE,SAAS,IAAI;AAclF,IAAM,aAAN,cAAyB,YAAY;AAAA,EAC1C,IAAc,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,IAAc,UAAU;AACtB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,OAAO,QAAkB;AACjC,UAAM,UAAU,OAAO,OAAO,CAAC,SAAS,IAAI,MAAM,QAAQ,CAAC;AAC3D,UAAM,OAAO,QAAQ,OAAO,CAAC,SAAS,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;AACxD,UAAM,OAAO,QAAQ,OAAO,CAAC,SAAS,IAAI,MAAM,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA;AAAA,EAGU,OAAO,QAAkB,KAAoB,KAAoB;AACzE,UAAM,MAAM,OAAO,OAAO,CAAC,SAAS,IAAI,MAAM,KAAK,CAAC;AACpD,UAAM,QAAQ,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC;AACzD,UAAM,UAAU,CAAC,SAAmB,KAAK,KAAK,CAAC,SAAS,IAAI,MAAM,QAAQ,CAAC;AAC3E,UAAM,WAAW,CAAC,KAAK,QAAQ,QAAQ,GAAG,KAAK,QAAQ,QAAQ,CAAC;AAChE,UAAM,IAAI,MAAM,OAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,CAAC;AACtD,UAAM,OAAO,KAAK,GAAG,UAAU,QAAQ,GAAG,CAAC;AAE3C,QAAI,CAAC,KAAK,KAAK,GAAG,QAAQ,EAAE,MAAM,CAAC,UAAU,UAAU,IAAI,EAAG,MAAK,OAAO,OAAO,GAAG;AACpF,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,OAAO,OAAiB,KAAe;AAC7C,UAAM,QAAQ,MAAM,SAAS,MAAM,CAAC,EAAE,MAAM,MAAM,SAAS,IAAI;AAC/D,QAAI,QAAQ,KAAK,CAAC,IAAI,OAAQ;AAC9B,UAAM,CAAC,KAAK,IAAI,IAAI,SAAS,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK;AACtE,UAAM,OAAO,MAAM,QAAQ;AAC3B,SAAK,OAAO,KAAK,EAAE,KAAK,KAAK,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,IAAI,EAAE,CAAC;AAAA,EACzE;AAAA;AAAA,EAGU,QAAiB;AACzB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,UAAU,MAAM,MAAM,KAAK,OAAO,OAAO,CAAC,WAAW,IAAI,QAAQ,QAAQ,CAAC,CAAC;AACjF,YAAQ,YAAY;AACpB,UAAM,OAAO,SAAS,UAAU,UAAU,OAAO,EAAE,KAAK,MAAM,KAAK,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACrH,WAAO;AAAA,EACT;AACF;AAvDa,WASJ,MAAM;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|