@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,13 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
imageURL
|
|
3
|
+
} from "./chunk-GE3YMFS6.mjs";
|
|
1
4
|
import {
|
|
2
5
|
Menu
|
|
3
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DWA5UYLJ.mjs";
|
|
4
7
|
import {
|
|
5
8
|
Component
|
|
6
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
7
10
|
import {
|
|
8
11
|
Utils,
|
|
12
|
+
afterFormReset,
|
|
9
13
|
restoreAttribute
|
|
10
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
11
15
|
|
|
12
16
|
// src/ts/components/select.ts
|
|
13
17
|
var _defaults = {
|
|
@@ -21,6 +25,8 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
21
25
|
super(el, options);
|
|
22
26
|
this._originalLabels = /* @__PURE__ */ new Map();
|
|
23
27
|
this._validationMessage = null;
|
|
28
|
+
this._bindReset = () => {
|
|
29
|
+
};
|
|
24
30
|
this._handleSelectChange = () => {
|
|
25
31
|
this._setValueToInput();
|
|
26
32
|
this._setSelectedStates();
|
|
@@ -47,15 +53,10 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
47
53
|
this._handleNativeFocus = () => queueMicrotask(() => {
|
|
48
54
|
if (this.constructor.getInstance(this.el) === this && this.el.matches(":focus")) this.input.focus();
|
|
49
55
|
});
|
|
50
|
-
this._handleReset = (
|
|
51
|
-
|
|
52
|
-
this.
|
|
53
|
-
|
|
54
|
-
this._resetSearch();
|
|
55
|
-
this._handleSelectChange();
|
|
56
|
-
this._clearValidationError();
|
|
57
|
-
}
|
|
58
|
-
}, 0);
|
|
56
|
+
this._handleReset = () => {
|
|
57
|
+
this._resetSearch();
|
|
58
|
+
this._handleSelectChange();
|
|
59
|
+
this._clearValidationError();
|
|
59
60
|
};
|
|
60
61
|
this._handleOptionKeydown = (e) => {
|
|
61
62
|
if (e.key === " " || e.key === "Enter") this._handleOptionClick(e);
|
|
@@ -93,7 +94,7 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
93
94
|
this._searchNavigate(e);
|
|
94
95
|
};
|
|
95
96
|
if (this.el.classList.contains("browser-default") || new.target === _FormSelect && this.el.matches("[data-tree]")) {
|
|
96
|
-
this.el
|
|
97
|
+
Reflect.set(this.el, new.target.key, void 0);
|
|
97
98
|
return;
|
|
98
99
|
}
|
|
99
100
|
this.isMultiple = this.el.multiple;
|
|
@@ -114,7 +115,6 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
114
115
|
destroy() {
|
|
115
116
|
this._events.abort();
|
|
116
117
|
if (!this.menuEl) return;
|
|
117
|
-
clearTimeout(this._resetTimer);
|
|
118
118
|
this._clearValidationError();
|
|
119
119
|
this.menu?.destroy();
|
|
120
120
|
this._removeMenu();
|
|
@@ -131,7 +131,7 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
131
131
|
*/
|
|
132
132
|
refresh() {
|
|
133
133
|
if (!this.menuEl) return;
|
|
134
|
-
this.
|
|
134
|
+
this._bindReset();
|
|
135
135
|
const root = this.menuEl.getRootNode();
|
|
136
136
|
const focused = this._values.find((value) => value.optionEl.contains(root.activeElement))?.el;
|
|
137
137
|
this.input.disabled = this.el.matches(":disabled");
|
|
@@ -160,12 +160,7 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
160
160
|
this.el.addEventListener("focus", this._handleNativeFocus, { signal });
|
|
161
161
|
this.input.addEventListener("click", this._handleInputClick, { signal });
|
|
162
162
|
this.menuEl.addEventListener("focusin", this._handleOptionFocus, { signal });
|
|
163
|
-
this.
|
|
164
|
-
}
|
|
165
|
-
_bindForm() {
|
|
166
|
-
this._form?.removeEventListener("reset", this._handleReset);
|
|
167
|
-
this._form = this.el.form;
|
|
168
|
-
this._form?.addEventListener("reset", this._handleReset, { signal: this._events.signal });
|
|
163
|
+
this._bindReset = afterFormReset(this.el, this._handleReset, signal);
|
|
169
164
|
}
|
|
170
165
|
// A rebuild replaces the rows, and no event reaches the old ones.
|
|
171
166
|
_setupOptionHandlers() {
|
|
@@ -345,9 +340,9 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
345
340
|
this._filterGroups();
|
|
346
341
|
}
|
|
347
342
|
_filterGroups() {
|
|
343
|
+
const visible = new Set(this._values.filter(({ optionEl }) => !optionEl.hidden).map(({ optionEl }) => optionEl.id));
|
|
348
344
|
for (const group of this._searchResults.querySelectorAll(":scope > li.optgroup")) {
|
|
349
|
-
|
|
350
|
-
group.hidden = !this._values.some(({ optionEl }) => ids.has(optionEl.id) && !optionEl.hidden);
|
|
345
|
+
group.hidden = !group.getAttribute("aria-owns").split(" ").some((id) => visible.has(id));
|
|
351
346
|
}
|
|
352
347
|
}
|
|
353
348
|
_searchRows() {
|
|
@@ -561,21 +556,12 @@ var _FormSelect = class _FormSelect extends Component {
|
|
|
561
556
|
}
|
|
562
557
|
li.appendChild(span);
|
|
563
558
|
const iconUrl = realOption.getAttribute("data-icon");
|
|
564
|
-
|
|
565
|
-
if (iconUrl) {
|
|
566
|
-
try {
|
|
567
|
-
const url = new URL(iconUrl, this.el.ownerDocument.baseURI);
|
|
568
|
-
if (["http:", "https:", "blob:"].includes(url.protocol) || /^data:image\/(?:avif|bmp|gif|jpeg|png|svg\+xml|webp|x-icon)(?:;|,)/i.test(url.href)) {
|
|
569
|
-
imageUrl = url;
|
|
570
|
-
}
|
|
571
|
-
} catch {
|
|
572
|
-
}
|
|
573
|
-
}
|
|
559
|
+
const imageUrl = imageURL(iconUrl, this.el.ownerDocument.baseURI);
|
|
574
560
|
const classes = realOption.getAttribute("class")?.split(" ").filter(Boolean);
|
|
575
561
|
if (imageUrl) {
|
|
576
562
|
const img = document.createElement("img");
|
|
577
563
|
if (classes?.length) img.classList.add(...classes);
|
|
578
|
-
img.src = imageUrl
|
|
564
|
+
img.src = imageUrl;
|
|
579
565
|
img.ariaHidden = "true";
|
|
580
566
|
li.prepend(img);
|
|
581
567
|
}
|
|
@@ -604,4 +590,4 @@ var FormSelect = _FormSelect;
|
|
|
604
590
|
export {
|
|
605
591
|
FormSelect
|
|
606
592
|
};
|
|
607
|
-
//# sourceMappingURL=chunk-
|
|
593
|
+
//# sourceMappingURL=chunk-XJPMW5SP.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/select.ts"],
|
|
4
|
+
"sourcesContent": ["import { imageURL } from '../core/imageURL';\nimport { Utils, afterFormReset, restoreAttribute } from '../core/utils';\nimport { Menu, MenuOptions } from './menu';\nimport { Component, BaseOptions } from '../core/component';\n\nexport interface FormSelectOptions extends BaseOptions {\n /**\n * Classes to be added to the select wrapper element.\n * @default \"\"\n */\n classes: string;\n /**\n * Pass options object to select menu initialization.\n * @default {}\n */\n menuOptions: Partial<MenuOptions>;\n /** Show a separate popup search field for supported select modes. */\n searchable: boolean;\n i18n: Partial<{ searchLabel: string; noResults: string }>;\n}\n\nconst _defaults: FormSelectOptions = {\n classes: '',\n menuOptions: {},\n searchable: false,\n i18n: { searchLabel: 'Search options', noResults: 'No results' }\n};\n\ntype ValueStruct = {\n el: HTMLOptionElement;\n optionEl: HTMLElement;\n};\n\nexport class FormSelect extends Component<FormSelectOptions> {\n declare el: HTMLSelectElement;\n /** If this is a multiple select. */\n isMultiple: boolean;\n /**\n * Label associated with the current select element.\n * Is \"null\", if not detected.\n */\n labelEl: HTMLLabelElement;\n /** The generated menu element. */\n menuEl: HTMLElement;\n /** Text input that shows current selected option. */\n input: HTMLInputElement;\n /** Instance of the menu plugin for this select. */\n menu: Menu;\n /** The field wrapper around the native select. */\n wrapper: HTMLDivElement;\n selectOptions: (HTMLOptionElement | HTMLOptGroupElement)[];\n protected _values: ValueStruct[];\n private _createdWrapper: boolean;\n private _originalLabels = new Map<HTMLLabelElement, { for: string | null; id: string | null }>();\n private _labelPlaceholder: Comment;\n private _validationMessage: HTMLElement | null = null;\n private _bindReset: () => void = () => {};\n nativeTabIndex: number;\n private _searchable: boolean;\n protected _searchInput: HTMLInputElement;\n private _searchResults: HTMLElement;\n private _searchStatus: HTMLElement;\n\n constructor(el: HTMLSelectElement, options: Partial<FormSelectOptions>) {\n super(el, options);\n // A browser-default select stays native, with no instance on it, and a\n // tree select belongs to TreeSelect, which a page's FormSelect.init() on\n // every select must not wrap a second time.\n if (this.el.classList.contains('browser-default') || (new.target === FormSelect && this.el.matches('[data-tree]'))) {\n Reflect.set(this.el, new.target.key, undefined);\n return;\n }\n\n this.isMultiple = this.el.multiple;\n this._searchable = this._canSearch();\n this.nativeTabIndex = this.el.tabIndex;\n this.el.tabIndex = -1;\n this._values = [];\n this._createdWrapper = false;\n this._setupMenu();\n this._setupEventHandlers();\n }\n\n static get defaults(): FormSelectOptions {\n return _defaults;\n }\n\n static key = 'Expressive_FormSelect';\n\n protected _canSearch() {\n return this.constructor === FormSelect && this.options.searchable;\n }\n\n destroy() {\n this._events.abort();\n // A skipped select built nothing and holds no instance key. The control\n // may belong to a TreeSelect, or to a later instance, so leave it alone.\n if (!this.menuEl) return;\n this._clearValidationError();\n // The Menu holds itself in the static Menu._menus registry\n // until its own destroy() runs, so dropping the elements is not enough -\n // every rebuilt select used to leave an instance behind for good.\n this.menu?.destroy();\n this._removeMenu();\n this.el.tabIndex = this.nativeTabIndex;\n super.destroy();\n }\n\n /**\n * Re-read the native `<select>` and update the generated menu to match.\n *\n * Assigning `select.value` from script fires no `change` event, so nothing\n * else syncs the visible input text or the `.selected` state on the virtual\n * options. Adding or removing `<option>`s also requires this \u2014 the menu is\n * rebuilt from the native list, the field and Menu instance stay put.\n */\n refresh() {\n if (!this.menuEl) return;\n this._bindReset();\n const root = this.menuEl.getRootNode() as Document | ShadowRoot;\n const focused = this._values.find(value => value.optionEl.contains(root.activeElement))?.el;\n this.input.disabled = this.el.matches(':disabled');\n this.wrapper.classList.toggle('disabled', this.input.disabled);\n if (this.input.disabled) this.menu?.close();\n else if (!this.menu) this._initMenu();\n this.input.removeAttribute('aria-activedescendant');\n this._rebuildOptions();\n this._handleSelectChange();\n if (this.menu) this.menu.focusedIndex = -1;\n if (this.menu?.isOpen) {\n this.menu.recalculateDimensions();\n this._restoreOptionFocus(focused);\n }\n }\n\n private _restoreOptionFocus(option: HTMLOptionElement) {\n if (!option) return;\n const rows = this._values.filter(({ el, optionEl }) => el === option && optionEl.tabIndex === 0).map(({ optionEl }) => optionEl);\n (rows[0] || this._searchInput || this.input).focus();\n }\n\n _setupEventHandlers() {\n const { signal } = this._events;\n this._setupOptionHandlers();\n this.el.addEventListener('change', this._handleSelectChange, { signal });\n this.el.addEventListener('invalid', this._handleInvalid, { signal });\n this.el.addEventListener('focus', this._handleNativeFocus, { signal });\n this.input.addEventListener('click', this._handleInputClick, { signal });\n this.menuEl.addEventListener('focusin', this._handleOptionFocus, { signal });\n this._bindReset = afterFormReset(this.el, this._handleReset, signal);\n }\n\n // A rebuild replaces the rows, and no event reaches the old ones.\n protected _setupOptionHandlers() {\n const { signal } = this._events;\n this.menuEl.querySelectorAll('li:not(.optgroup)').forEach((el) => {\n el.addEventListener('click', this._handleOptionClick, { signal });\n el.addEventListener('keydown', this._handleOptionKeydown, { signal });\n });\n }\n\n _handleSelectChange = () => {\n this._setValueToInput();\n this._setSelectedStates();\n this._syncValidationError();\n };\n\n private _handleInvalid = (e: Event) => {\n if (e.defaultPrevented) return;\n if (!this._validationMessage) {\n this._validationMessage = document.createElement('small');\n this._validationMessage.id = this.input.id + '-error';\n this._validationMessage.className = 'supporting-text';\n this._validationMessage.style.color = 'var(--md-sys-color-error)';\n this.wrapper.append(this._validationMessage);\n this.input.setAttribute('aria-describedby',\n [this.input.getAttribute('aria-describedby'), this._validationMessage.id].filter(Boolean).join(' '));\n }\n this.input.ariaInvalid = 'true';\n this._syncValidationError();\n };\n\n // Native reporting chooses the control; static checks never focus. Wait until\n // reporting finishes so Firefox dismisses its native popup when focus moves.\n private _handleNativeFocus = () => queueMicrotask(() => {\n // The instance's own class: a TreeSelect sits under its own key.\n if ((this.constructor as typeof FormSelect).getInstance(this.el) === this && this.el.matches(':focus')) this.input.focus();\n });\n\n private _syncValidationError() {\n if (!this._validationMessage) return;\n if (this.el.willValidate && !this.el.validity.valid) {\n this._validationMessage.textContent = this.el.validationMessage;\n } else this._clearValidationError();\n }\n\n private _clearValidationError() {\n if (!this._validationMessage) return;\n const descriptions = this.input.getAttribute('aria-describedby')?.split(/\\s+/)\n .filter(id => id !== this._validationMessage.id).join(' ');\n if (descriptions) this.input.setAttribute('aria-describedby', descriptions);\n else this.input.removeAttribute('aria-describedby');\n this.input.ariaInvalid = this.el.ariaInvalid;\n this._validationMessage.remove();\n this._validationMessage = null;\n }\n\n private _handleReset = () => {\n this._resetSearch();\n this._handleSelectChange();\n this._clearValidationError();\n };\n\n _handleOptionKeydown = (e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') this._handleOptionClick(e);\n };\n\n _handleOptionClick = (e: MouseEvent | KeyboardEvent) => {\n // Canceling a click on the multi-select checkbox itself reverts the box\n // after _setSelectedStates has set it, leaving it out of step with the option.\n if (!(e.target as Element).matches('input[type=\"checkbox\"]')) e.preventDefault();\n const virtualOption = (e.target as HTMLLIElement).closest('li');\n this._selectOptionElement(virtualOption);\n e.stopPropagation();\n };\n\n private _handleOptionFocus = (e: FocusEvent) => {\n if (this._searchInput) return;\n const target = e.target;\n if (!(target instanceof Element)) return;\n const li = target.closest('li[role=\"option\"]');\n if (li) this.input.setAttribute('aria-activedescendant', li.id);\n };\n\n _selectOptionElement(virtualOption: HTMLElement) {\n if (virtualOption.hidden) return;\n if (this.el.matches(':disabled')) return;\n if (\n !virtualOption.classList.contains('disabled') &&\n !virtualOption.classList.contains('optgroup')\n ) {\n const value = this._values.find((value) => value.optionEl === virtualOption);\n if (!value || value.el.matches(':disabled')) return;\n const previousSelectedValues = JSON.stringify(this.getSelectedValues());\n // Selecting one option of a single select deselects the others.\n value.el.selected = !this.isMultiple || !value.el.selected;\n this._handleSelectChange();\n if (JSON.stringify(this.getSelectedValues()) !== previousSelectedValues)\n this.el.dispatchEvent(\n new Event('change', { bubbles: true, cancelable: true, composed: true })\n );\n // Only a real selection closes; a disabled option is inert.\n if (!this.isMultiple) this._closeSingleSelect();\n }\n }\n\n _handleInputClick = () => {\n if (this.menu && this.menu.isOpen) {\n this._setValueToInput();\n this._setSelectedStates();\n }\n };\n\n private _closeSingleSelect() {\n this.menu?.close();\n if (this._searchInput) this.input.focus();\n }\n\n _setupMenu() {\n // The DOM already knows which labels belong to this control. Building a\n // selector out of the id instead meant an id with any CSS-special\n // character either threw or matched something else entirely.\n this.labelEl = this.el.labels?.[0] ?? null;\n Array.from(this.el.labels ?? []).forEach(label => {\n this._originalLabels.set(label, { for: label.getAttribute('for'), id: label.getAttribute('id') });\n });\n if (this.labelEl && !this.el.closest('label')) {\n this._labelPlaceholder = document.createComment('');\n this.labelEl.before(this._labelPlaceholder);\n }\n\n this._setupWrapper();\n this._hideNativeSelect();\n if (this.el.matches(':disabled')) this.wrapper.classList.add('disabled');\n\n this.menuEl = document.createElement(this._searchable ? 'div' : 'menu');\n // Disabled controls skip Menu initialization but must keep their popup hidden.\n this.menuEl.popover = 'manual';\n this.menuEl.id = `select-options-${Utils.guid()}`;\n this.menuEl.setAttribute('role', 'listbox');\n this.menuEl.ariaMultiSelectable = this.isMultiple.toString();\n if (this.isMultiple) this.menuEl.classList.add('multiple-select-menu');\n this._buildOptions();\n this.wrapper.append(this.menuEl);\n\n this._buildInput();\n if (this._searchable) this._buildSearch();\n this._buildCaret();\n this._initMenu();\n this._setSelectedStates();\n if (this._labelPlaceholder) this.input.after(this.labelEl);\n }\n\n private _setupWrapper() {\n const parent = this.el.parentElement;\n const reuse =\n parent &&\n parent.matches('.field') &&\n !parent.querySelector(':scope > .hide-select') &&\n !parent.querySelector(':scope > input, :scope > textarea');\n if (reuse) {\n this.wrapper = parent as HTMLDivElement;\n this._createdWrapper = false;\n } else {\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('field');\n this._createdWrapper = true;\n this.el.before(this.wrapper);\n }\n if (this.options.classes.length > 0) {\n this.wrapper.classList.add(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n\n private _hideNativeSelect() {\n const hiddenDiv = document.createElement('div');\n hiddenDiv.classList.add('hide-select');\n hiddenDiv.ariaHidden = 'true';\n this.el.before(hiddenDiv);\n hiddenDiv.appendChild(this.el);\n if (this._createdWrapper) this.wrapper.append(hiddenDiv);\n }\n\n private _buildInput() {\n this.input = document.createElement('input');\n this.input.id = 'select-input-' + Utils.guid();\n // FormSelect owns this Menu. A later AutoInit must not replace it before\n // FormSelect can destroy its own instance during reinitialization.\n this.input.classList.add('menu-trigger', 'no-autoinit');\n this.input.type = 'text';\n this.input.readOnly = true;\n this.input.setAttribute('data-target', this.menuEl.id);\n this.input.ariaReadOnly = 'true';\n this.input.ariaRequired = this.el.hasAttribute('required').toString();\n this.input.disabled = this.el.matches(':disabled');\n this.input.setAttribute('tabindex', this.nativeTabIndex.toString());\n\n const attrs = this.el.attributes;\n for (let i = 0; i < attrs.length; ++i) {\n const attr = attrs[i];\n if (attr.name.startsWith('aria-')) this.input.setAttribute(attr.name, attr.value);\n }\n\n this.input.setAttribute('role', 'combobox');\n this.input.setAttribute('aria-haspopup', 'listbox');\n this.input.ariaExpanded = 'false';\n this.input.setAttribute('aria-controls', this.menuEl.id);\n this.input.placeholder = ' ';\n\n this._originalLabels.forEach((_, label) => { label.htmlFor = this.input.id; });\n // Moving the first label can change DOM order. Preserve the original naming\n // order without overriding an author's explicit accessible name.\n if (this._labelPlaceholder && this._originalLabels.size > 1 && !this.input.getAttribute('aria-label') && !this.input.getAttribute('aria-labelledby')) {\n this.input.setAttribute('aria-labelledby', Array.from(this._originalLabels.keys(), (label, index) => {\n if (!label.id) label.id = `${this.input.id}-label-${index}`;\n return label.id;\n }).join(' '));\n }\n\n this.wrapper.prepend(this.input);\n this._setValueToInput();\n }\n\n private _buildCaret() {\n const caret = document.createElement('span');\n caret.classList.add('caret');\n caret.setAttribute('aria-hidden', 'true');\n this.wrapper.prepend(caret);\n }\n\n private _buildSearch() {\n this.menuEl.classList.add('select-search-popup');\n this.menuEl.setAttribute('role', 'dialog');\n this.menuEl.removeAttribute('aria-multiselectable');\n this.menuEl.classList.remove('multiple-select-menu');\n this.input.setAttribute('aria-haspopup', 'dialog');\n this._searchResults = this._searchList();\n this._searchInput = document.createElement('input');\n this._searchInput.type = 'search';\n this._searchInput.placeholder = this.options.i18n.searchLabel;\n this._searchInput.setAttribute('aria-label', this.options.i18n.searchLabel);\n this._searchStatus = document.createElement('div');\n this._searchStatus.setAttribute('role', 'status');\n this.menuEl.append(this._searchInput, this._searchStatus, this._searchResults);\n this._searchInput.addEventListener('input', this._filterOptions, { signal: this._events.signal });\n this.menuEl.addEventListener('keydown', this._handleSearchKeydown, { signal: this._events.signal, capture: true });\n this._nameSearch();\n this._filterOptions();\n }\n\n protected _searchList(): HTMLElement {\n const list = document.createElement('menu');\n list.id = this.menuEl.id + '-list';\n list.setAttribute('role', 'listbox');\n list.ariaMultiSelectable = this.isMultiple.toString();\n list.classList.toggle('multiple-select-menu', this.isMultiple);\n list.append(...this.menuEl.childNodes);\n return list;\n }\n\n private _nameSearch() {\n const labels = Array.from(this._originalLabels.keys(), (label, index) => {\n if (!label.id) label.id = this.input.id + '-label-' + index;\n return label.id;\n }).join(' ');\n const attribute = this.input.hasAttribute('aria-labelledby') ? 'aria-labelledby' : 'aria-label';\n const name = this.input.getAttribute(attribute);\n [this.menuEl, this._searchResults].forEach(el => el.setAttribute(name ? attribute : 'aria-labelledby', name || labels));\n }\n\n private _filterOptions = () => {\n const query = this._searchInput.value.trim().toLowerCase();\n this._filterSearch(query);\n this._searchStatus.textContent = this._values.some(({ optionEl }) => !optionEl.hidden) ? '' : this.options.i18n.noResults;\n this.input.removeAttribute('aria-activedescendant');\n this.menu?.recalculateDimensions();\n };\n\n protected _filterSearch(query: string) {\n this._values.forEach(({ el, optionEl }) => {\n optionEl.hidden = !el.textContent.trim().toLowerCase().includes(query);\n optionEl.tabIndex = optionEl.hidden || el.matches(':disabled') ? -1 : 0;\n });\n this._filterGroups();\n }\n\n private _filterGroups() {\n const visible = new Set(this._values.filter(({ optionEl }) => !optionEl.hidden).map(({ optionEl }) => optionEl.id));\n for (const group of this._searchResults.querySelectorAll<HTMLElement>(':scope > li.optgroup')) {\n group.hidden = !group.getAttribute('aria-owns').split(' ').some(id => visible.has(id));\n }\n }\n\n protected _searchRows() {\n return this._values.map(({ optionEl }) => optionEl).filter(row => row.tabIndex !== -1);\n }\n\n private _handleSearchKeydown = (e: KeyboardEvent) => {\n e.stopPropagation();\n if (!Utils.plainKey(e) || Utils.isComposing(e)) return;\n if (this._searchDismissKey(e)) return;\n this._searchNavigate(e);\n };\n\n private _searchDismissKey(e: KeyboardEvent) {\n if (e.key === 'Tab') {\n this._searchTab(e);\n return true;\n }\n if (e.key !== 'Escape') return false;\n e.preventDefault();\n this._closeSingleSelect();\n return true;\n }\n\n private _searchTab(e: KeyboardEvent) {\n if (e.shiftKey) {\n e.preventDefault();\n this._searchBackwardTab(e);\n return;\n }\n const first = this._searchRows()[0];\n if (e.target === this._searchInput && first) {\n e.preventDefault();\n first.focus();\n return;\n }\n // Let the browser advance from the trigger, including across shadow roots.\n this._closeSingleSelect();\n }\n\n private _searchBackwardTab(e: KeyboardEvent) {\n if (e.target === this._searchInput) this._closeSingleSelect();\n else this._searchInput.focus();\n }\n\n protected _searchNavigate(e: KeyboardEvent) {\n if (e.target === this._searchInput) {\n this._searchInputKey(e);\n return;\n }\n this._searchRowKey(e);\n }\n\n private _searchInputKey(e: KeyboardEvent) {\n if (e.key === 'Enter') e.preventDefault();\n if (!['ArrowDown', 'ArrowUp'].includes(e.key)) return;\n e.preventDefault();\n const rows = this._searchRows();\n this._focusSearchRow(rows[e.key === 'ArrowUp' ? rows.length - 1 : 0]);\n }\n\n private _focusSearchRow(row: HTMLElement) {\n if (row) row.focus();\n }\n\n private _searchRowKey(e: KeyboardEvent) {\n if (['Enter', ' '].includes(e.key)) {\n e.preventDefault();\n this._selectOptionElement(e.target as HTMLElement);\n return;\n }\n const target = Utils.focusTarget([this._searchInput, ...this._searchRows()], e, { ArrowDown: 1, ArrowUp: -1 });\n if (!target) return;\n e.preventDefault();\n if (e.key === 'Home') this._searchRows()[0]?.focus();\n else target.focus();\n }\n\n private _clearSearch() {\n if (!this._searchInput) return;\n this._searchInput.value = '';\n this._filterOptions();\n }\n\n private _resetSearch() {\n if (!this._searchInput) return;\n this.menu?.close();\n this._clearSearch();\n }\n\n private _bindSearchClose(options: Partial<MenuOptions>) {\n const onCloseStart = options.onCloseStart;\n options.onCloseStart = () => {\n this._clearSearch();\n return onCloseStart?.call(this.menu, this.el);\n };\n }\n\n private _initMenu() {\n if (this.el.matches(':disabled')) return;\n const menuOptions = { ...this.options.menuOptions };\n if (this._searchInput) this._bindSearchClose(menuOptions);\n menuOptions.coverTrigger = false;\n const userOnOpenEnd = menuOptions.onOpenEnd;\n const userOnCloseEnd = menuOptions.onCloseEnd;\n menuOptions.onOpenEnd = () => {\n this._focusMenu();\n this.input.ariaExpanded = 'true';\n if (typeof userOnOpenEnd === 'function')\n userOnOpenEnd.call(this.menu, this.el);\n };\n menuOptions.onCloseEnd = () => {\n this.input.ariaExpanded = 'false';\n this.input.removeAttribute('aria-activedescendant');\n if (typeof userOnCloseEnd === 'function')\n userOnCloseEnd.call(this.menu, this.el);\n };\n menuOptions.closeOnClick = false;\n this.menu = Menu.init(this.input, menuOptions);\n }\n\n private _focusMenu() {\n if (!this._searchInput) return this._focusSelected();\n // Opening can finish after the user has already reached a result.\n if (this.menu.options.autoFocus && !Utils.focusIsIn(this.menuEl)) this._searchInput.focus();\n }\n\n /** Moves focus to the selected row of the opened menu, centred when it scrolls. */\n protected _focusSelected() {\n const selectedOption = this.menuEl.querySelector('.selected');\n if (!selectedOption) return;\n this.menu.focusedIndex = [...selectedOption.parentNode.children].indexOf(selectedOption);\n this.menu._focusFocusedItem();\n if (this.menu.isScrollable) {\n let scrollOffset =\n selectedOption.getBoundingClientRect().top -\n this.menuEl.getBoundingClientRect().top;\n scrollOffset -= this.menuEl.clientHeight / 2;\n this.menuEl.scrollTop = scrollOffset;\n }\n if (selectedOption.id) this.input.setAttribute('aria-activedescendant', selectedOption.id);\n }\n\n protected _nativeOptions(): (HTMLOptGroupElement | HTMLOptionElement)[] {\n return <(HTMLOptGroupElement | HTMLOptionElement)[]>(\n Array.from(this.el.children).filter((el) => ['OPTION', 'OPTGROUP'].includes(el.tagName))\n );\n }\n\n private get _optionList() {\n return this._searchResults ?? this.menuEl;\n }\n\n protected _buildOptions() {\n this.selectOptions = this._nativeOptions();\n this._values = [];\n this.selectOptions.forEach((realOption) => {\n if (realOption.tagName === 'OPTION') {\n const virtualOption = this._createAndAppendOptionWithIcon(\n realOption,\n this.isMultiple ? 'multiple' : undefined\n );\n this._values.push({ el: realOption as HTMLOptionElement, optionEl: virtualOption });\n } else if (realOption.tagName === 'OPTGROUP') {\n const groupId = 'opt-group-' + Utils.guid();\n const groupParent = document.createElement('li');\n groupParent.classList.add('optgroup');\n groupParent.tabIndex = -1;\n groupParent.setAttribute('role', 'group');\n groupParent.setAttribute('aria-labelledby', groupId);\n // Built as nodes, not markup: the optgroup's label attribute is\n // author content that may come from a server, and interpolating it\n // into innerHTML let it close the span and inject an element.\n const groupLabel = document.createElement('span');\n groupLabel.id = groupId;\n groupLabel.setAttribute('role', 'presentation');\n groupLabel.textContent = realOption.getAttribute('label') ?? '';\n groupParent.replaceChildren(groupLabel);\n this._optionList.append(groupParent);\n\n const groupChildren: string[] = [];\n const selectOptions = <HTMLOptionElement[]>(\n Array.from(realOption.children).filter((el) => el.tagName === 'OPTION')\n );\n selectOptions.forEach((child) => {\n const virtualOption = this._createAndAppendOptionWithIcon(child, 'optgroup-option');\n groupChildren.push(virtualOption.id);\n this._values.push({ el: child, optionEl: virtualOption });\n });\n groupParent.setAttribute('aria-owns', groupChildren.join(' '));\n }\n });\n }\n\n private _rebuildOptions() {\n this._optionList.replaceChildren();\n this._buildOptions();\n this._setupOptionHandlers();\n this.menu?._makeMenuFocusable();\n if (this._searchInput) this._filterOptions();\n }\n\n _removeMenu() {\n this.wrapper?.querySelector(':scope > .caret')?.remove();\n this.input?.remove();\n this.menuEl?.remove();\n const hide = this.el.parentElement;\n if (hide?.classList.contains('hide-select')) hide.replaceWith(this.el);\n this._originalLabels.forEach((original, label) => {\n for (const name of ['for', 'id'] as const) restoreAttribute(label, name, original[name]);\n });\n this._labelPlaceholder?.replaceWith(this.labelEl);\n if (!this.wrapper) return;\n if (this._createdWrapper) {\n this.wrapper.replaceWith(this.el);\n } else {\n this.wrapper.classList.remove('disabled');\n if (this.options.classes.length > 0) {\n this.wrapper.classList.remove(...this.options.classes.split(' ').filter(Boolean));\n }\n }\n }\n\n _createAndAppendOptionWithIcon(\n realOption: HTMLOptionElement | HTMLOptGroupElement,\n type: string\n ) {\n const li = document.createElement('li');\n li.id = 'select-option-' + Utils.guid();\n li.setAttribute('role', 'option');\n li.tabIndex = 0;\n const disabled = this.el.matches(':disabled') || realOption.matches(':disabled');\n if (disabled) {\n li.classList.add('disabled');\n li.ariaDisabled = 'true';\n li.tabIndex = -1;\n }\n if (type === 'optgroup-option') li.classList.add(type);\n\n // Text / Checkbox. An <option>'s content model is text, so its markup is\n // its text - copying it as nodes rather than through innerHTML keeps it\n // that way instead of handing it back to the parser.\n const optionText = realOption.textContent;\n const span = document.createElement('span');\n if (this.isMultiple && !disabled) {\n const label = document.createElement('label');\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.tabIndex = -1;\n const labelText = document.createElement('span');\n labelText.textContent = optionText;\n label.append(checkbox, labelText);\n span.appendChild(label);\n } else {\n span.textContent = optionText;\n }\n li.appendChild(span);\n\n const iconUrl = realOption.getAttribute('data-icon');\n const imageUrl = imageURL(iconUrl, this.el.ownerDocument.baseURI);\n // filter(Boolean): a doubled or trailing space yields an empty string,\n // and classList.add('') throws.\n const classes = realOption.getAttribute('class')?.split(' ').filter(Boolean);\n if (imageUrl) {\n const img = document.createElement('img');\n if (classes?.length) img.classList.add(...classes);\n img.src = imageUrl;\n img.ariaHidden = 'true';\n li.prepend(img);\n }\n this._optionList.append(li);\n return li;\n }\n\n _setValueToInput() {\n this.input.value = Array.from(this.el.selectedOptions, (option) => option.textContent.trim()).join(', ');\n }\n\n /** Shows each option's selection on its row and checkbox. */\n _setSelectedStates() {\n this._values.forEach(({ el, optionEl }) => {\n optionEl.classList.toggle('selected', el.selected);\n optionEl.ariaSelected = String(el.selected);\n const checkbox = optionEl.querySelector<HTMLInputElement>('input[type=\"checkbox\"]');\n if (checkbox) checkbox.checked = el.selected;\n });\n }\n\n getSelectedValues() {\n return Array.from(this.el.selectedOptions, (option) => option.value);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["value"]
|
|
7
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Component
|
|
3
|
-
|
|
2
|
+
Component,
|
|
3
|
+
defined
|
|
4
|
+
} from "./chunk-EB2V4OKL.mjs";
|
|
4
5
|
|
|
5
6
|
// src/ts/components/confetti.ts
|
|
6
7
|
var _defaults = {
|
|
@@ -39,14 +40,14 @@ var _Confetti = class _Confetti extends Component {
|
|
|
39
40
|
* Bursts over the whole viewport. Resolves when the last piece is gone.
|
|
40
41
|
*/
|
|
41
42
|
static fire(options = {}) {
|
|
42
|
-
return burst(viewportCanvas, document.body, { ..._Confetti.defaults, ...options });
|
|
43
|
+
return burst(viewportCanvas, document.body, { ..._Confetti.defaults, ...defined(options) });
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
46
|
* Bursts on this canvas, or from this element's center over the viewport.
|
|
46
47
|
* Resolves when the last piece is gone.
|
|
47
48
|
*/
|
|
48
49
|
fire(options = {}) {
|
|
49
|
-
const merged = { ...this.options, ...options };
|
|
50
|
+
const merged = { ...this.options, ...defined(options) };
|
|
50
51
|
if (this.el instanceof HTMLCanvasElement) {
|
|
51
52
|
const canvas = this.el;
|
|
52
53
|
return burst(() => canvas, canvas.parentElement ?? document.body, merged);
|
|
@@ -141,7 +142,7 @@ function stop(canvas) {
|
|
|
141
142
|
scene.ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
142
143
|
if (scene.overlay) {
|
|
143
144
|
canvas.remove();
|
|
144
|
-
overlay = null;
|
|
145
|
+
if (overlay === canvas) overlay = null;
|
|
145
146
|
}
|
|
146
147
|
for (const resolve of scene.done) resolve();
|
|
147
148
|
}
|
|
@@ -205,4 +206,4 @@ function themeColors(themed) {
|
|
|
205
206
|
export {
|
|
206
207
|
Confetti
|
|
207
208
|
};
|
|
208
|
-
//# sourceMappingURL=chunk-
|
|
209
|
+
//# sourceMappingURL=chunk-YKANQILZ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/components/confetti.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, BaseOptions, defined } from '../core/component';\n\nexport type ConfettiShape = 'square' | 'circle' | 'star';\n\nexport interface ConfettiOptions extends BaseOptions {\n /**\n * Pieces per burst.\n * @default 50\n */\n particleCount: number;\n /**\n * Launch direction in degrees. 90 is straight up, 0 is right.\n * @default 90\n */\n angle: number;\n /**\n * How far the pieces fan out from the angle, in degrees.\n * @default 45\n */\n spread: number;\n /**\n * Launch speed in pixels per frame.\n * @default 45\n */\n startVelocity: number;\n /**\n * Share of its speed a piece keeps each frame.\n * @default 0.9\n */\n decay: number;\n /**\n * Pull toward the bottom. 0 floats, 1 is normal.\n * @default 1\n */\n gravity: number;\n /**\n * Sideways push per frame. Negative drifts left.\n * @default 0\n */\n drift: number;\n /**\n * Frames a piece lives while it fades out.\n * @default 200\n */\n ticks: number;\n /**\n * Launch point as fractions of the canvas, 0 to 1. A missing side is\n * 0.5. A trigger element ignores it and launches from its own center.\n * @default { x: 0.5, y: 0.5 }\n */\n origin: { x?: number; y?: number };\n /**\n * CSS colors. Empty uses the theme's primary, secondary and tertiary\n * colors and their containers.\n * @default []\n */\n colors: string[];\n /**\n * @default ['square', 'circle']\n */\n shapes: ConfettiShape[];\n /**\n * Piece size multiplier.\n * @default 1\n */\n scalar: number;\n /**\n * On a canvas, wait for `fire()` instead of bursting once at init.\n * @default false\n */\n manualStart: boolean;\n}\n\nconst _defaults: ConfettiOptions = {\n particleCount: 50,\n angle: 90,\n spread: 45,\n startVelocity: 45,\n decay: 0.9,\n gravity: 1,\n drift: 0,\n ticks: 200,\n origin: { x: 0.5, y: 0.5 },\n colors: [],\n shapes: ['square', 'circle'],\n scalar: 1,\n manualStart: false\n};\n\nconst THEME_COLORS = ['primary', 'secondary', 'tertiary', 'primary-container', 'secondary-container', 'tertiary-container'];\n// Used when the page has no theme tokens.\nconst FALLBACK_COLORS = ['#26ccff', '#a25afd', '#ff5e7e', '#88ff5a', '#fcff42', '#ffa62d', '#ff36ff'];\nconst RAD = Math.PI / 180;\n\ninterface Piece {\n x: number;\n y: number;\n velocity: number;\n angle: number;\n wobble: number;\n wobbleSpeed: number;\n tilt: number;\n tick: number;\n color: string;\n shape: ConfettiShape;\n options: ConfettiOptions;\n}\n\ninterface Scene {\n ctx: CanvasRenderingContext2D;\n pieces: Piece[];\n frame: number;\n last: number;\n done: (() => void)[];\n overlay: boolean;\n}\n\nconst scenes = new Map<HTMLCanvasElement, Scene>();\nlet overlay: HTMLCanvasElement | null = null;\n\n/**\n * Confetti. Bursts of theme-colored pieces drawn on a canvas.\n *\n * - `Confetti.fire(options)` bursts over the whole viewport.\n * - Any other `.confetti` element bursts from its center when clicked.\n * - A `<canvas class=\"confetti\">` bursts inside its own box, once at init\n * unless `manualStart`, and again on each `fire()`.\n *\n * The viewport canvas is a manual popover, so it draws above an open modal\n * dialog, and it ignores the pointer. Nothing is drawn when the reader\n * prefers reduced motion.\n */\nexport class Confetti extends Component<ConfettiOptions> {\n private _onClick = () => { this.fire(); };\n\n constructor(el: HTMLElement, options: Partial<ConfettiOptions>) {\n super(el, options);\n if (!(el instanceof HTMLCanvasElement)) el.addEventListener('click', this._onClick, { signal: this._events.signal });\n else if (!this.options.manualStart) this.fire();\n }\n\n static get defaults(): ConfettiOptions {\n return _defaults;\n }\n\n static key = 'Expressive_Confetti';\n\n /**\n * Bursts over the whole viewport. Resolves when the last piece is gone.\n */\n static fire(options: Partial<ConfettiOptions> = {}): Promise<void> {\n // An option set to undefined keeps its default, as it does at init.\n return burst(viewportCanvas, document.body, { ...Confetti.defaults, ...defined(options) });\n }\n\n /**\n * Bursts on this canvas, or from this element's center over the viewport.\n * Resolves when the last piece is gone.\n */\n fire(options: Partial<ConfettiOptions> = {}): Promise<void> {\n const merged = { ...this.options, ...defined(options) };\n if (this.el instanceof HTMLCanvasElement) {\n const canvas = this.el;\n return burst(() => canvas, canvas.parentElement ?? document.body, merged);\n }\n const r = this.el.getBoundingClientRect();\n merged.origin = { x: (r.left + r.width / 2) / innerWidth, y: (r.top + r.height / 2) / innerHeight };\n return burst(viewportCanvas, this.el.parentElement ?? document.body, merged);\n }\n\n destroy() {\n if (this.el instanceof HTMLCanvasElement) stop(this.el);\n super.destroy();\n }\n}\n\n// `themed` is where the theme colors are read, so a scoped theme applies.\nfunction burst(getCanvas: () => HTMLCanvasElement, themed: Element, o: ConfettiOptions): Promise<void> {\n if (matchMedia('(prefers-reduced-motion: reduce)').matches) return Promise.resolve();\n const canvas = getCanvas();\n let scene = scenes.get(canvas);\n if (!scene) {\n const ctx = canvas.getContext('2d');\n if (!ctx) return Promise.resolve();\n scene = { ctx, pieces: [], frame: 0, last: 0, done: [], overlay: canvas === overlay };\n scenes.set(canvas, scene);\n }\n const { width, height } = fit(canvas);\n const colors = o.colors.length ? o.colors : themeColors(themed);\n const x = (o.origin.x ?? 0.5) * width;\n const y = (o.origin.y ?? 0.5) * height;\n for (let i = 0; i < o.particleCount; i++) {\n scene.pieces.push({\n x, y,\n velocity: o.startVelocity * (0.5 + Math.random()),\n angle: -o.angle * RAD + (0.5 - Math.random()) * o.spread * RAD,\n wobble: Math.random() * 10,\n wobbleSpeed: 0.05 + Math.random() * 0.05,\n tilt: (0.25 + Math.random() / 2) * Math.PI,\n tick: 0,\n color: colors[i % colors.length],\n shape: o.shapes[Math.floor(Math.random() * o.shapes.length)] ?? 'square',\n options: o\n });\n }\n const s = scene;\n if (!s.frame) s.frame = requestAnimationFrame((now) => { s.last = now; draw(canvas, s, now); });\n return new Promise((resolve) => s.done.push(resolve));\n}\n\nfunction draw(canvas: HTMLCanvasElement, scene: Scene, now: number) {\n // Frames are counted at 60 per second whatever the display rate.\n const step = Math.min((now - scene.last) / (1000 / 60), 4);\n scene.last = now;\n const { width, height } = fit(canvas);\n const { ctx } = scene;\n const dpr = canvas.width / (width || 1);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n scene.pieces = scene.pieces.filter((p) => {\n const o = p.options;\n p.x += (Math.cos(p.angle) * p.velocity + o.drift) * step;\n p.y += (Math.sin(p.angle) * p.velocity + o.gravity * 3) * step;\n p.velocity *= o.decay ** step;\n p.wobble += p.wobbleSpeed * step;\n p.tilt += 0.1 * step;\n p.tick += step;\n if (p.tick >= o.ticks) return false;\n const size = 8 * o.scalar;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.translate(p.x + 10 * o.scalar * Math.cos(p.wobble), p.y + 10 * o.scalar * Math.sin(p.wobble));\n ctx.rotate(p.tilt);\n ctx.scale(1, Math.cos(p.wobble));\n ctx.globalAlpha = 1 - p.tick / o.ticks;\n ctx.fillStyle = p.color;\n ctx.beginPath();\n if (p.shape === 'circle') ctx.arc(0, 0, size / 2, 0, 2 * Math.PI);\n else if (p.shape === 'star') star(ctx, size * 0.75);\n else ctx.rect(-size / 2, -size / 2, size, size);\n ctx.fill();\n return true;\n });\n if (scene.pieces.length) scene.frame = requestAnimationFrame((t) => draw(canvas, scene, t));\n else stop(canvas);\n}\n\nfunction stop(canvas: HTMLCanvasElement) {\n const scene = scenes.get(canvas);\n if (!scene) return;\n cancelAnimationFrame(scene.frame);\n scenes.delete(canvas);\n scene.ctx.setTransform(1, 0, 0, 1, 0, 0);\n scene.ctx.clearRect(0, 0, canvas.width, canvas.height);\n if (scene.overlay) {\n canvas.remove();\n // A newer overlay may have replaced one the page removed.\n if (overlay === canvas) overlay = null;\n }\n for (const resolve of scene.done) resolve();\n}\n\nfunction star(ctx: CanvasRenderingContext2D, r: number) {\n for (let i = 0; i < 10; i++) {\n const a = (i * Math.PI) / 5 - Math.PI / 2;\n const d = i % 2 ? r / 2 : r;\n ctx.lineTo(Math.cos(a) * d, Math.sin(a) * d);\n }\n ctx.closePath();\n}\n\n// Matches the canvas's pixel buffer to its box and the screen's pixel ratio.\nfunction fit(canvas: HTMLCanvasElement) {\n const width = canvas.clientWidth;\n const height = canvas.clientHeight;\n const w = Math.round(width * devicePixelRatio);\n const h = Math.round(height * devicePixelRatio);\n if (canvas.width !== w || canvas.height !== h) {\n canvas.width = w;\n canvas.height = h;\n }\n return { width, height };\n}\n\nfunction viewportCanvas(): HTMLCanvasElement {\n if (overlay?.isConnected) return overlay;\n overlay = document.createElement('canvas');\n overlay.className = 'confetti-overlay';\n overlay.setAttribute('aria-hidden', 'true');\n // Inline, so the overlay works even where the stylesheet does not reach.\n Object.assign(overlay.style, {\n position: 'fixed', inset: '0', width: '100%', height: '100%', margin: '0', padding: '0',\n // The fallback keeps the order where the sheet, and so the token, is absent.\n border: '0', background: 'transparent', pointerEvents: 'none', zIndex: 'var(--expressive-z-confetti, 10001)'\n });\n document.body.append(overlay);\n if (typeof overlay.showPopover === 'function') {\n overlay.popover = 'manual';\n overlay.showPopover();\n }\n return overlay;\n}\n\n// Resolves each theme color token through `color`, so light-dark() and\n// relative colors reach the canvas as plain colors.\nfunction themeColors(themed: Element): string[] {\n const probe = document.createElement('span');\n probe.hidden = true;\n themed.append(probe);\n const style = getComputedStyle(probe);\n const colors = THEME_COLORS.filter((role) => style.getPropertyValue(`--md-sys-color-${role}`).trim()).map((role) => {\n probe.style.color = `var(--md-sys-color-${role})`;\n return getComputedStyle(probe).color;\n });\n probe.remove();\n return colors.length ? colors : FALLBACK_COLORS;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAyEA,IAAM,YAA6B;AAAA,EACjC,eAAe;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ,EAAE,GAAG,KAAK,GAAG,IAAI;AAAA,EACzB,QAAQ,CAAC;AAAA,EACT,QAAQ,CAAC,UAAU,QAAQ;AAAA,EAC3B,QAAQ;AAAA,EACR,aAAa;AACf;AAEA,IAAM,eAAe,CAAC,WAAW,aAAa,YAAY,qBAAqB,uBAAuB,oBAAoB;AAE1H,IAAM,kBAAkB,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AACpG,IAAM,MAAM,KAAK,KAAK;AAyBtB,IAAM,SAAS,oBAAI,IAA8B;AACjD,IAAI,UAAoC;AAcjC,IAAM,YAAN,MAAM,kBAAiB,UAA2B;AAAA,EAGvD,YAAY,IAAiB,SAAmC;AAC9D,UAAM,IAAI,OAAO;AAHnB,SAAQ,WAAW,MAAM;AAAE,WAAK,KAAK;AAAA,IAAG;AAItC,QAAI,EAAE,cAAc,mBAAoB,IAAG,iBAAiB,SAAS,KAAK,UAAU,EAAE,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAAA,aAC1G,CAAC,KAAK,QAAQ,YAAa,MAAK,KAAK;AAAA,EAChD;AAAA,EAEA,WAAW,WAA4B;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,KAAK,UAAoC,CAAC,GAAkB;AAEjE,WAAO,MAAM,gBAAgB,SAAS,MAAM,EAAE,GAAG,UAAS,UAAU,GAAG,QAAQ,OAAO,EAAE,CAAC;AAAA,EAC3F;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,UAAoC,CAAC,GAAkB;AAC1D,UAAM,SAAS,EAAE,GAAG,KAAK,SAAS,GAAG,QAAQ,OAAO,EAAE;AACtD,QAAI,KAAK,cAAc,mBAAmB;AACxC,YAAM,SAAS,KAAK;AACpB,aAAO,MAAM,MAAM,QAAQ,OAAO,iBAAiB,SAAS,MAAM,MAAM;AAAA,IAC1E;AACA,UAAM,IAAI,KAAK,GAAG,sBAAsB;AACxC,WAAO,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,KAAK,YAAY,IAAI,EAAE,MAAM,EAAE,SAAS,KAAK,YAAY;AAClG,WAAO,MAAM,gBAAgB,KAAK,GAAG,iBAAiB,SAAS,MAAM,MAAM;AAAA,EAC7E;AAAA,EAEA,UAAU;AACR,QAAI,KAAK,cAAc,kBAAmB,MAAK,KAAK,EAAE;AACtD,UAAM,QAAQ;AAAA,EAChB;AACF;AA1Ca,UAaJ,MAAM;AAbR,IAAM,WAAN;AA6CP,SAAS,MAAM,WAAoC,QAAiB,GAAmC;AACrG,MAAI,WAAW,kCAAkC,EAAE,QAAS,QAAO,QAAQ,QAAQ;AACnF,QAAM,SAAS,UAAU;AACzB,MAAI,QAAQ,OAAO,IAAI,MAAM;AAC7B,MAAI,CAAC,OAAO;AACV,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,IAAK,QAAO,QAAQ,QAAQ;AACjC,YAAQ,EAAE,KAAK,QAAQ,CAAC,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,WAAW,QAAQ;AACpF,WAAO,IAAI,QAAQ,KAAK;AAAA,EAC1B;AACA,QAAM,EAAE,OAAO,OAAO,IAAI,IAAI,MAAM;AACpC,QAAM,SAAS,EAAE,OAAO,SAAS,EAAE,SAAS,YAAY,MAAM;AAC9D,QAAM,KAAK,EAAE,OAAO,KAAK,OAAO;AAChC,QAAM,KAAK,EAAE,OAAO,KAAK,OAAO;AAChC,WAAS,IAAI,GAAG,IAAI,EAAE,eAAe,KAAK;AACxC,UAAM,OAAO,KAAK;AAAA,MAChB;AAAA,MAAG;AAAA,MACH,UAAU,EAAE,iBAAiB,MAAM,KAAK,OAAO;AAAA,MAC/C,OAAO,CAAC,EAAE,QAAQ,OAAO,MAAM,KAAK,OAAO,KAAK,EAAE,SAAS;AAAA,MAC3D,QAAQ,KAAK,OAAO,IAAI;AAAA,MACxB,aAAa,OAAO,KAAK,OAAO,IAAI;AAAA,MACpC,OAAO,OAAO,KAAK,OAAO,IAAI,KAAK,KAAK;AAAA,MACxC,MAAM;AAAA,MACN,OAAO,OAAO,IAAI,OAAO,MAAM;AAAA,MAC/B,OAAO,EAAE,OAAO,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,OAAO,MAAM,CAAC,KAAK;AAAA,MAChE,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,IAAI;AACV,MAAI,CAAC,EAAE,MAAO,GAAE,QAAQ,sBAAsB,CAAC,QAAQ;AAAE,MAAE,OAAO;AAAK,SAAK,QAAQ,GAAG,GAAG;AAAA,EAAG,CAAC;AAC9F,SAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,KAAK,KAAK,OAAO,CAAC;AACtD;AAEA,SAAS,KAAK,QAA2B,OAAc,KAAa;AAElE,QAAM,OAAO,KAAK,KAAK,MAAM,MAAM,SAAS,MAAO,KAAK,CAAC;AACzD,QAAM,OAAO;AACb,QAAM,EAAE,OAAO,OAAO,IAAI,IAAI,MAAM;AACpC,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,MAAM,OAAO,SAAS,SAAS;AACrC,MAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACjC,MAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,QAAM,SAAS,MAAM,OAAO,OAAO,CAAC,MAAM;AACxC,UAAM,IAAI,EAAE;AACZ,MAAE,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,WAAW,EAAE,SAAS;AACpD,MAAE,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,WAAW,EAAE,UAAU,KAAK;AAC1D,MAAE,YAAY,EAAE,SAAS;AACzB,MAAE,UAAU,EAAE,cAAc;AAC5B,MAAE,QAAQ,MAAM;AAChB,MAAE,QAAQ;AACV,QAAI,EAAE,QAAQ,EAAE,MAAO,QAAO;AAC9B,UAAM,OAAO,IAAI,EAAE;AACnB,QAAI,aAAa,KAAK,GAAG,GAAG,KAAK,GAAG,CAAC;AACrC,QAAI,UAAU,EAAE,IAAI,KAAK,EAAE,SAAS,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,SAAS,KAAK,IAAI,EAAE,MAAM,CAAC;AAChG,QAAI,OAAO,EAAE,IAAI;AACjB,QAAI,MAAM,GAAG,KAAK,IAAI,EAAE,MAAM,CAAC;AAC/B,QAAI,cAAc,IAAI,EAAE,OAAO,EAAE;AACjC,QAAI,YAAY,EAAE;AAClB,QAAI,UAAU;AACd,QAAI,EAAE,UAAU,SAAU,KAAI,IAAI,GAAG,GAAG,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,aACvD,EAAE,UAAU,OAAQ,MAAK,KAAK,OAAO,IAAI;AAAA,QAC7C,KAAI,KAAK,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,MAAM,IAAI;AAC9C,QAAI,KAAK;AACT,WAAO;AAAA,EACT,CAAC;AACD,MAAI,MAAM,OAAO,OAAQ,OAAM,QAAQ,sBAAsB,CAAC,MAAM,KAAK,QAAQ,OAAO,CAAC,CAAC;AAAA,MACrF,MAAK,MAAM;AAClB;AAEA,SAAS,KAAK,QAA2B;AACvC,QAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,MAAI,CAAC,MAAO;AACZ,uBAAqB,MAAM,KAAK;AAChC,SAAO,OAAO,MAAM;AACpB,QAAM,IAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACvC,QAAM,IAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACrD,MAAI,MAAM,SAAS;AACjB,WAAO,OAAO;AAEd,QAAI,YAAY,OAAQ,WAAU;AAAA,EACpC;AACA,aAAW,WAAW,MAAM,KAAM,SAAQ;AAC5C;AAEA,SAAS,KAAK,KAA+B,GAAW;AACtD,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,UAAM,IAAK,IAAI,KAAK,KAAM,IAAI,KAAK,KAAK;AACxC,UAAM,IAAI,IAAI,IAAI,IAAI,IAAI;AAC1B,QAAI,OAAO,KAAK,IAAI,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC;AAAA,EAC7C;AACA,MAAI,UAAU;AAChB;AAGA,SAAS,IAAI,QAA2B;AACtC,QAAM,QAAQ,OAAO;AACrB,QAAM,SAAS,OAAO;AACtB,QAAM,IAAI,KAAK,MAAM,QAAQ,gBAAgB;AAC7C,QAAM,IAAI,KAAK,MAAM,SAAS,gBAAgB;AAC9C,MAAI,OAAO,UAAU,KAAK,OAAO,WAAW,GAAG;AAC7C,WAAO,QAAQ;AACf,WAAO,SAAS;AAAA,EAClB;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAEA,SAAS,iBAAoC;AAC3C,MAAI,SAAS,YAAa,QAAO;AACjC,YAAU,SAAS,cAAc,QAAQ;AACzC,UAAQ,YAAY;AACpB,UAAQ,aAAa,eAAe,MAAM;AAE1C,SAAO,OAAO,QAAQ,OAAO;AAAA,IAC3B,UAAU;AAAA,IAAS,OAAO;AAAA,IAAK,OAAO;AAAA,IAAQ,QAAQ;AAAA,IAAQ,QAAQ;AAAA,IAAK,SAAS;AAAA;AAAA,IAEpF,QAAQ;AAAA,IAAK,YAAY;AAAA,IAAe,eAAe;AAAA,IAAQ,QAAQ;AAAA,EACzE,CAAC;AACD,WAAS,KAAK,OAAO,OAAO;AAC5B,MAAI,OAAO,QAAQ,gBAAgB,YAAY;AAC7C,YAAQ,UAAU;AAClB,YAAQ,YAAY;AAAA,EACtB;AACA,SAAO;AACT;AAIA,SAAS,YAAY,QAA2B;AAC9C,QAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,QAAM,SAAS;AACf,SAAO,OAAO,KAAK;AACnB,QAAM,QAAQ,iBAAiB,KAAK;AACpC,QAAM,SAAS,aAAa,OAAO,CAAC,SAAS,MAAM,iBAAiB,kBAAkB,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,SAAS;AAClH,UAAM,MAAM,QAAQ,sBAAsB,IAAI;AAC9C,WAAO,iBAAiB,KAAK,EAAE;AAAA,EACjC,CAAC;AACD,QAAM,OAAO;AACb,SAAO,OAAO,SAAS,SAAS;AAClC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "./chunk-W6FAL3TI.mjs";
|
|
6
6
|
import {
|
|
7
7
|
Utils
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
9
9
|
|
|
10
10
|
// src/ts/behaviors/sheetDrag.ts
|
|
11
11
|
var REDUCED = "(prefers-reduced-motion: reduce)";
|
|
@@ -172,4 +172,4 @@ export {
|
|
|
172
172
|
DISMISS_VELOCITY,
|
|
173
173
|
installSheetDrag
|
|
174
174
|
};
|
|
175
|
-
//# sourceMappingURL=chunk-
|
|
175
|
+
//# sourceMappingURL=chunk-YLZOJLDI.mjs.map
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
numberValue
|
|
3
|
-
} from "./chunk-ZM3XBHWV.mjs";
|
|
4
1
|
import {
|
|
5
2
|
Utils,
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
afterAnyFormReset,
|
|
4
|
+
controllerFor,
|
|
5
|
+
numberValue
|
|
6
|
+
} from "./chunk-67UNY7RH.mjs";
|
|
8
7
|
|
|
9
8
|
// src/ts/behaviors/dataTables.ts
|
|
10
9
|
var ROWS = ":scope > tbody > tr:not(.data-table-detail)";
|
|
@@ -40,8 +39,15 @@ function tableControl(wrapper, selector) {
|
|
|
40
39
|
return Array.from(wrapper.querySelectorAll(selector)).find((el) => el.closest(".data-table") === wrapper);
|
|
41
40
|
}
|
|
42
41
|
function visibleRecord(row) {
|
|
43
|
-
|
|
44
|
-
if (row
|
|
42
|
+
const table = row.closest("table");
|
|
43
|
+
if (hiddenInTable(row, table)) return false;
|
|
44
|
+
return table.checkVisibility?.() ? row.checkVisibility({ visibilityProperty: true }) : styledVisible(row);
|
|
45
|
+
}
|
|
46
|
+
function hiddenInTable(row, table) {
|
|
47
|
+
const hidden = row.closest(`[hidden], [${FILTERED}], [${PAGED}]`);
|
|
48
|
+
return hidden !== null && table.contains(hidden);
|
|
49
|
+
}
|
|
50
|
+
function styledVisible(row) {
|
|
45
51
|
const style = getComputedStyle(row);
|
|
46
52
|
return style.display !== "none" && !["hidden", "collapse"].includes(style.visibility);
|
|
47
53
|
}
|
|
@@ -151,6 +157,7 @@ var _DataTables = class _DataTables {
|
|
|
151
157
|
document.addEventListener("click", _DataTables._onHandleClick);
|
|
152
158
|
document.addEventListener("keydown", _DataTables._onKeyDown);
|
|
153
159
|
document.addEventListener("expressive:change", _DataTables._onToggle);
|
|
160
|
+
afterAnyFormReset((form) => form.querySelectorAll(".data-table").forEach(_DataTables.sync));
|
|
154
161
|
Utils.onDocumentReady(() => document.querySelectorAll(".data-table").forEach(_DataTables.sync));
|
|
155
162
|
}
|
|
156
163
|
/**
|
|
@@ -384,26 +391,26 @@ var _DataTables = class _DataTables {
|
|
|
384
391
|
}
|
|
385
392
|
/**
|
|
386
393
|
* Reorders each body's rows by one column. A detail row moves with the
|
|
387
|
-
* row before it.
|
|
394
|
+
* row before it. Numeric columns put nonnumbers first; text uses the page's language.
|
|
388
395
|
*/
|
|
389
396
|
static _sort(table, header, column, order) {
|
|
390
397
|
if (_DataTables._pages.get(table.closest(".data-table"))?.server) return;
|
|
398
|
+
const numeric = header.classList.contains("numeric");
|
|
391
399
|
const compare = _DataTables._compare(table, header);
|
|
392
400
|
for (const body of Array.from(table.tBodies)) {
|
|
393
|
-
const groups = _DataTables._groups(body)
|
|
394
|
-
|
|
395
|
-
|
|
401
|
+
const groups = _DataTables._groups(body).map((rows) => {
|
|
402
|
+
const text = cellText(rows[0], column);
|
|
403
|
+
return { rows, text, value: numeric ? numberValue(text) ?? -Infinity : 0 };
|
|
404
|
+
});
|
|
405
|
+
groups.sort((a, b) => order * compare(a, b));
|
|
406
|
+
body.append(...groups.flatMap(({ rows }) => rows));
|
|
396
407
|
}
|
|
397
408
|
}
|
|
398
|
-
/**
|
|
399
|
-
* How a column compares: a `.numeric` header's as numbers, as a chart
|
|
400
|
-
* reads them, with text that is not a number first; any other as text in
|
|
401
|
-
* the page's language, with digit runs as numbers.
|
|
402
|
-
*/
|
|
409
|
+
/** Compares prepared numeric keys or text in the page's language. */
|
|
403
410
|
static _compare(table, header) {
|
|
404
|
-
if (
|
|
405
|
-
const
|
|
406
|
-
return (a, b) =>
|
|
411
|
+
if (header.classList.contains("numeric")) return (a, b) => a.value - b.value;
|
|
412
|
+
const compare = new Intl.Collator(Utils.locale(table), { numeric: true, sensitivity: "base" }).compare;
|
|
413
|
+
return (a, b) => compare(a.text, b.text);
|
|
407
414
|
}
|
|
408
415
|
static _records(table) {
|
|
409
416
|
return Array.from(table.tBodies).flatMap(_DataTables._groups).filter(([row]) => !row.classList.contains("data-table-detail"));
|
|
@@ -424,7 +431,7 @@ _DataTables._serverFilters = /* @__PURE__ */ new WeakMap();
|
|
|
424
431
|
_DataTables._pages = /* @__PURE__ */ new WeakMap();
|
|
425
432
|
_DataTables._pageRequests = /* @__PURE__ */ new WeakMap();
|
|
426
433
|
_DataTables._onChange = (e) => {
|
|
427
|
-
const box = Utils.
|
|
434
|
+
const box = Utils.closestInPath(e, 'input[type="checkbox"]');
|
|
428
435
|
const wrapper = box?.closest(".data-table");
|
|
429
436
|
const table = wrapper?.querySelector(":scope > table");
|
|
430
437
|
if (!table) return;
|
|
@@ -504,4 +511,4 @@ var DataTables = _DataTables;
|
|
|
504
511
|
export {
|
|
505
512
|
DataTables
|
|
506
513
|
};
|
|
507
|
-
//# sourceMappingURL=chunk-
|
|
514
|
+
//# sourceMappingURL=chunk-ZK7YY322.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ts/behaviors/dataTables.ts"],
|
|
4
|
+
"sourcesContent": ["import { Utils, afterAnyFormReset, controllerFor, numberValue } 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 };\ntype SortKey = { text: string; value: number };\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/**\n * Enabled selection and result counts use the same visible record set. Only\n * hiding inside the table counts: a table in a closed tab, dialog or details\n * still has its records, and has no layout to check, so the row's own style\n * decides there.\n */\nfunction visibleRecord(row: HTMLTableRowElement) {\n const table = row.closest('table');\n if (hiddenInTable(row, table)) return false;\n return table.checkVisibility?.() ? row.checkVisibility({ visibilityProperty: true }) : styledVisible(row);\n}\n\nfunction hiddenInTable(row: HTMLTableRowElement, table: HTMLTableElement) {\n const hidden = row.closest(`[hidden], [${FILTERED}], [${PAGED}]`);\n return hidden !== null && table.contains(hidden);\n}\n\nfunction styledVisible(row: HTMLTableRowElement) {\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 // A reset restores the row boxes without an event; select-all follows them.\n afterAnyFormReset((form) => form.querySelectorAll('.data-table').forEach(DataTables.sync));\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.closestInPath(e, 'input[type=\"checkbox\"]');\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<HTMLInputElement>(e, `.data-table ${FILTER}`);\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<HTMLButtonElement>(e, `.data-table[data-page-size] ${PAGE_BUTTON}:not(:disabled, [aria-disabled=\"true\"])`);\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<HTMLSelectElement>(e, `.data-table[data-page-size] ${PAGE_SIZE}`);\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<HTMLElement>(e, HANDLE);\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. Numeric columns put nonnumbers first; text uses the page's language.\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 numeric = header.classList.contains('numeric');\n const compare = DataTables._compare(table, header);\n for (const body of Array.from(table.tBodies)) {\n const groups = DataTables._groups(body).map((rows) => {\n const text = cellText(rows[0], column);\n return { rows, text, value: numeric ? numberValue(text) ?? -Infinity : 0 };\n });\n groups.sort((a, b) => order * compare(a, b));\n body.append(...groups.flatMap(({ rows }) => rows));\n }\n }\n\n /** Compares prepared numeric keys or text in the page's language. */\n private static _compare(table: HTMLTableElement, header: HTMLTableCellElement) {\n if (header.classList.contains('numeric')) return (a: SortKey, b: SortKey) => a.value - b.value;\n const compare = new Intl.Collator(Utils.locale(table), { numeric: true, sensitivity: 'base' }).compare;\n return (a: SortKey, b: SortKey) => compare(a.text, b.text);\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
|
+
}
|