optikos 0.4.0 → 0.5.1
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 +38 -0
- package/dist/build.js +2 -0
- package/dist/build.js.map +7 -0
- package/dist/{chunk-FCJI2JF7.js → chunk-34KVSA2V.js} +2 -2
- package/dist/{chunk-M7FNPRV4.js → chunk-4DW5WBZB.js} +2 -2
- package/dist/chunk-4QAHVGGE.js +2 -0
- package/dist/chunk-4QAHVGGE.js.map +7 -0
- package/dist/{chunk-I5A74NMJ.js → chunk-4Z4E3BZ2.js} +2 -2
- package/dist/chunk-5H533QXN.js +2 -0
- package/dist/chunk-5H533QXN.js.map +7 -0
- package/dist/chunk-5KJ5Y4GY.js +2 -0
- package/dist/chunk-5KJ5Y4GY.js.map +7 -0
- package/dist/chunk-5WE2JOBY.js +2 -0
- package/dist/chunk-5WE2JOBY.js.map +7 -0
- package/dist/{chunk-SEW5OCQF.js → chunk-6IXVTWFH.js} +2 -2
- package/dist/{chunk-NJ5IFOPR.js → chunk-6S4BKUGD.js} +2 -2
- package/dist/{chunk-CWIE74NX.js → chunk-6VWSTY32.js} +2 -2
- package/dist/{chunk-F4HZUAKM.js → chunk-72ESP5DB.js} +2 -2
- package/dist/chunk-74IVU356.js +3 -0
- package/dist/chunk-74IVU356.js.map +7 -0
- package/dist/chunk-76A4MY7P.js +2 -0
- package/dist/chunk-76A4MY7P.js.map +7 -0
- package/dist/{chunk-3BG75P7T.js → chunk-7SE4B4TC.js} +2 -2
- package/dist/{chunk-PGVLRMTQ.js → chunk-A5N2AJCE.js} +2 -2
- package/dist/{chunk-3QRA3XOA.js → chunk-ALNUVKDT.js} +2 -2
- package/dist/{chunk-NQV4THNE.js → chunk-ANR27GED.js} +2 -2
- package/dist/{chunk-EXIADWI7.js → chunk-AZUWS2C5.js} +2 -2
- package/dist/{chunk-Z6L55FTN.js → chunk-BHKI2SU3.js} +2 -2
- package/dist/{chunk-GZIDE5K2.js → chunk-BIQX75P2.js} +2 -2
- package/dist/{chunk-MNSDGJKA.js → chunk-BPCD37A2.js} +2 -2
- package/dist/chunk-CGSCBLG2.js +2 -0
- package/dist/chunk-CGSCBLG2.js.map +7 -0
- package/dist/{chunk-R32HPK7R.js → chunk-DHUBCB4H.js} +2 -2
- package/dist/chunk-DY3ZYMXD.js +2 -0
- package/dist/chunk-DY3ZYMXD.js.map +7 -0
- package/dist/{chunk-JSEI44A7.js → chunk-EKRWJJ65.js} +2 -2
- package/dist/chunk-EO2IXU2W.js +2 -0
- package/dist/chunk-EO2IXU2W.js.map +7 -0
- package/dist/{chunk-JE56CJX2.js → chunk-EQ4IWYLW.js} +2 -2
- package/dist/{chunk-5PYJ6FJK.js → chunk-EXBGOHG7.js} +2 -2
- package/dist/{chunk-UQRQH2JW.js → chunk-FTZMF2QX.js} +2 -2
- package/dist/{chunk-XFIREDWO.js → chunk-G7NNOLOG.js} +2 -2
- package/dist/chunk-GPEA3UWY.js +2 -0
- package/dist/chunk-GPEA3UWY.js.map +7 -0
- package/dist/{chunk-4OB2IM5L.js → chunk-GX32KEG2.js} +2 -2
- package/dist/{chunk-ZSPJZ3ZH.js → chunk-GYGX4VYF.js} +2 -2
- package/dist/{chunk-BIGL3ZVD.js → chunk-H2EC3QP4.js} +2 -2
- package/dist/{chunk-HRW25TMU.js → chunk-H2KFAM7L.js} +2 -2
- package/dist/{chunk-6LJK4QWF.js → chunk-HHOSKOO6.js} +2 -2
- package/dist/{chunk-JJLOUMCJ.js → chunk-I5KHVFJ4.js} +2 -2
- package/dist/{chunk-N2LS4JD6.js → chunk-IB5T27PW.js} +2 -2
- package/dist/{chunk-5BMG5ZBY.js → chunk-IE7KRNFJ.js} +2 -2
- package/dist/chunk-IODSL7KU.js +2 -0
- package/dist/chunk-IODSL7KU.js.map +7 -0
- package/dist/{chunk-3FK52VQX.js → chunk-J2YP2YD3.js} +2 -2
- package/dist/{chunk-3FCIZKIN.js → chunk-J6D4T4WY.js} +2 -2
- package/dist/{chunk-H25XXQVH.js → chunk-JF4WPGJQ.js} +2 -2
- package/dist/chunk-K44IJHPF.js +2 -0
- package/dist/{chunk-UDXO3KM3.js → chunk-KMBTJ5AG.js} +2 -2
- package/dist/chunk-KMBTJ5AG.js.map +7 -0
- package/dist/chunk-KNWO4NXX.js +2 -0
- package/dist/chunk-KNWO4NXX.js.map +7 -0
- package/dist/{chunk-JLKIHXZP.js → chunk-KP7O5MVL.js} +2 -2
- package/dist/{chunk-HLS5FI55.js → chunk-KVUELLYF.js} +2 -2
- package/dist/chunk-LLHDEUIA.js +2 -0
- package/dist/chunk-LLHDEUIA.js.map +7 -0
- package/dist/{chunk-CMV3F6HR.js → chunk-LRUKKIYA.js} +2 -2
- package/dist/{chunk-DWTDNKXX.js → chunk-M2XOIEPY.js} +2 -2
- package/dist/{chunk-P4O57S6N.js → chunk-MBRCE5A7.js} +2 -2
- package/dist/{chunk-CFGCB37K.js → chunk-MMPPDQ2E.js} +2 -2
- package/dist/{chunk-643FOYQB.js → chunk-MRDX3RVJ.js} +2 -2
- package/dist/{chunk-6PZPBPAD.js → chunk-NAWQBQ57.js} +2 -2
- package/dist/{chunk-RG6SHPHF.js → chunk-NBR5IRZT.js} +2 -2
- package/dist/chunk-NSUAVAWO.js +2 -0
- package/dist/chunk-NSUAVAWO.js.map +7 -0
- package/dist/chunk-NYXRPWIB.js +2 -0
- package/dist/chunk-NYXRPWIB.js.map +7 -0
- package/dist/{chunk-J5QPFJ7M.js → chunk-OK3SN5PN.js} +2 -2
- package/dist/{chunk-NNR2FNHG.js → chunk-OQFQDTLL.js} +2 -2
- package/dist/chunk-OVEQUN4V.js +2 -0
- package/dist/chunk-OVEQUN4V.js.map +7 -0
- package/dist/{chunk-GEBAYD6N.js → chunk-PMIIQMVH.js} +2 -2
- package/dist/{chunk-DIOJGTUN.js → chunk-QT5JRZZJ.js} +2 -2
- package/dist/{chunk-IUOEPAWG.js → chunk-R52OSARY.js} +2 -2
- package/dist/{chunk-XR677UYD.js → chunk-RI62AESU.js} +2 -2
- package/dist/{chunk-6BOM5KZR.js → chunk-RRGAJ7T4.js} +2 -2
- package/dist/{chunk-2YRQULDC.js → chunk-SQTM4QFP.js} +2 -2
- package/dist/{chunk-FPU53CCV.js → chunk-TAFHKT6O.js} +2 -2
- package/dist/{chunk-3TCITFUU.js → chunk-TBM35UV6.js} +2 -2
- package/dist/{chunk-YDX2PCVL.js → chunk-TBOQ6HZZ.js} +2 -2
- package/dist/{chunk-GEJKFE4X.js → chunk-TJJL2GSJ.js} +2 -2
- package/dist/{chunk-3F4MN2BU.js → chunk-TJXH3F7Z.js} +2 -2
- package/dist/chunk-TMBGEZSD.js +2 -0
- package/dist/chunk-TMBGEZSD.js.map +7 -0
- package/dist/{chunk-BQEFLPDA.js → chunk-U5RENLU4.js} +2 -2
- package/dist/chunk-U5RENLU4.js.map +7 -0
- package/dist/chunk-UXL7KG46.js +2 -0
- package/dist/chunk-UXL7KG46.js.map +7 -0
- package/dist/{chunk-DWA45BWR.js → chunk-VADYSXHY.js} +2 -2
- package/dist/{chunk-Q6FY4L2F.js → chunk-VBLCO5Q7.js} +2 -2
- package/dist/{chunk-ESCLDVFS.js → chunk-VCK5WWMQ.js} +2 -2
- package/dist/{chunk-BCVOUMJJ.js → chunk-VCYCNSJY.js} +2 -2
- package/dist/{chunk-4AZ44KV4.js → chunk-VOCGAAG7.js} +2 -2
- package/dist/{chunk-AT7VFZRB.js → chunk-WHWPLMIG.js} +2 -2
- package/dist/{chunk-S2CMWKVB.js → chunk-WVJSNE6Q.js} +2 -2
- package/dist/chunk-WWETTEUZ.js +2 -0
- package/dist/{chunk-YXOKWCYS.js.map → chunk-WWETTEUZ.js.map} +4 -4
- package/dist/chunk-XFDNXSU5.js +2 -0
- package/dist/{chunk-XQHATUKN.js.map → chunk-XFDNXSU5.js.map} +3 -3
- package/dist/{chunk-U5L76VVB.js → chunk-XI4IBUE3.js} +2 -2
- package/dist/{chunk-4S3HRFQB.js → chunk-YAKKOVRI.js} +2 -2
- package/dist/{chunk-HG7OOHGD.js → chunk-YF5GWNM7.js} +2 -2
- package/dist/{chunk-4CWYF4O7.js → chunk-YRCR5ELY.js} +2 -2
- package/dist/{chunk-C3MWS7P2.js → chunk-YVEGWCYD.js} +2 -2
- package/dist/{chunk-MQ5BYGFY.js → chunk-ZYHMTPW4.js} +2 -2
- package/dist/components/alert.js +2 -0
- package/dist/components/alert.js.map +7 -0
- package/dist/components/avatar.js +1 -1
- package/dist/components/badge.js +1 -1
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/carousel.js +1 -1
- package/dist/components/chart.js +1 -1
- package/dist/components/chat.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkboxgroup.js +1 -1
- package/dist/components/chip.js +1 -1
- package/dist/components/codeviewer.js +1 -1
- package/dist/components/columntotals.js +2 -0
- package/dist/components/columntotals.js.map +7 -0
- package/dist/components/combobox.js +1 -1
- package/dist/components/commandpalette.js +1 -1
- package/dist/components/container.js +1 -1
- package/dist/components/dataview.js +1 -1
- package/dist/components/datefield.js +1 -1
- package/dist/components/daterangefield.js +1 -1
- package/dist/components/datetimefield.js +1 -1
- package/dist/components/dial.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/exportbar.js +2 -0
- package/dist/components/exportbar.js.map +7 -0
- package/dist/components/fieldgroup.js +1 -1
- package/dist/components/fieldlist.js +1 -1
- package/dist/components/fieldset.js +1 -1
- package/dist/components/filterbuilder.js +1 -1
- package/dist/components/form.js +1 -1
- package/dist/components/formactions.js +1 -1
- package/dist/components/formerrors.js +1 -1
- package/dist/components/formsection.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/gridexport.js +1 -1
- package/dist/components/grouping.js +1 -1
- package/dist/components/icon.js +1 -1
- package/dist/components/image.js +1 -1
- package/dist/components/imagecanvas.js +1 -1
- package/dist/components/imagefield.js +1 -1
- package/dist/components/inputgroup.js +1 -1
- package/dist/components/label.js +1 -1
- package/dist/components/listbox.js +1 -1
- package/dist/components/lookupfield.js +1 -1
- package/dist/components/maskfield.js +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/messagebox.js +1 -1
- package/dist/components/navmenu.js +1 -1
- package/dist/components/numberfield.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/panel.js +1 -1
- package/dist/components/pickerfield.js +1 -1
- package/dist/components/quicksearch.js +2 -0
- package/dist/components/quicksearch.js.map +7 -0
- package/dist/components/radiogroup.js +1 -1
- package/dist/components/searchgrid.js +1 -1
- package/dist/components/secretfield.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/shortcuts.js +1 -1
- package/dist/components/slider.js +1 -1
- package/dist/components/spacer.js +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/stat.js +1 -1
- package/dist/components/stepform.js +1 -1
- package/dist/components/stepper.js +1 -1
- package/dist/components/suggestfield.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/textfield.js +1 -1
- package/dist/components/timeentry.js +2 -0
- package/dist/components/timeentry.js.map +7 -0
- package/dist/components/timefield.js +1 -1
- package/dist/components/timeline.js +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toolbar.js +1 -1
- package/dist/components/tree.js +1 -1
- package/dist/components/treegrid.js +1 -1
- package/dist/components/viewmanager.js +1 -1
- package/dist/components/viewport.js +1 -1
- package/dist/components/widget.js +1 -1
- package/dist/components/window.js +1 -1
- package/dist/core.js +1 -1
- package/dist/css/alert.css +60 -0
- package/dist/css/carousel.css +60 -0
- package/dist/css/columntotals.css +56 -0
- package/dist/css/exportbar.css +9 -0
- package/dist/css/grid.css +12 -0
- package/dist/css/grouping.css +7 -0
- package/dist/css/label.css +14 -0
- package/dist/css/quicksearch.css +13 -0
- package/dist/css/stat.css +14 -0
- package/dist/css/timeentry.css +116 -0
- package/dist/css/timeline.css +45 -0
- package/dist/data.js +1 -1
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +2 -2
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/optikos.css +411 -0
- package/dist/types/build/build.d.ts +49 -0
- package/dist/types/build/index.d.ts +1 -0
- package/dist/types/components/alert.d.ts +1 -0
- package/dist/types/components/base/label/label.d.ts +11 -1
- package/dist/types/components/charts/stat/stat.d.ts +7 -1
- package/dist/types/components/columntotals.d.ts +1 -0
- package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
- package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
- package/dist/types/components/data/grid/footer.d.ts +6 -0
- package/dist/types/components/data/grouping/controls.d.ts +27 -0
- package/dist/types/components/data/grouping/grouping.d.ts +15 -3
- package/dist/types/components/data/quicksearch/quicksearch.d.ts +13 -0
- package/dist/types/components/data/timeentry/timeentry.d.ts +37 -0
- package/dist/types/components/data/timeline/timeline.d.ts +3 -0
- package/dist/types/components/exportbar.d.ts +1 -0
- package/dist/types/components/feedback/alert/alert.d.ts +28 -0
- package/dist/types/components/fields/datetimefield/datetimefield.d.ts +2 -0
- package/dist/types/components/fields/maskfield/maskfield.d.ts +23 -4
- package/dist/types/components/layout/carousel/carousel.d.ts +8 -0
- package/dist/types/components/navigation/navmenu/navmenu.d.ts +4 -0
- package/dist/types/components/quicksearch.d.ts +1 -0
- package/dist/types/components/timeentry.d.ts +1 -0
- package/dist/types/core/component.d.ts +6 -3
- package/dist/types/core/container.d.ts +2 -0
- package/dist/types/data/column.d.ts +4 -2
- package/dist/types/index.d.ts +6 -0
- package/dist/types/layout/layout.d.ts +5 -0
- package/dist/ui.js +1 -1
- package/package.json +5 -1
- package/dist/chunk-2HNQ2XRY.js +0 -2
- package/dist/chunk-2HNQ2XRY.js.map +0 -7
- package/dist/chunk-5PWPAN62.js +0 -2
- package/dist/chunk-5PWPAN62.js.map +0 -7
- package/dist/chunk-AQ3RTHG5.js +0 -2
- package/dist/chunk-AQ3RTHG5.js.map +0 -7
- package/dist/chunk-BJWREA76.js +0 -2
- package/dist/chunk-BJWREA76.js.map +0 -7
- package/dist/chunk-BQEFLPDA.js.map +0 -7
- package/dist/chunk-DJUSVBD5.js +0 -2
- package/dist/chunk-DJUSVBD5.js.map +0 -7
- package/dist/chunk-GFFZTFQH.js +0 -2
- package/dist/chunk-GFFZTFQH.js.map +0 -7
- package/dist/chunk-PMOXLQ72.js +0 -2
- package/dist/chunk-PMOXLQ72.js.map +0 -7
- package/dist/chunk-SB4ICXBV.js +0 -2
- package/dist/chunk-SB4ICXBV.js.map +0 -7
- package/dist/chunk-SWCB2GMN.js +0 -2
- package/dist/chunk-SWCB2GMN.js.map +0 -7
- package/dist/chunk-TQPQ4UEA.js +0 -2
- package/dist/chunk-TQPQ4UEA.js.map +0 -7
- package/dist/chunk-UDXO3KM3.js.map +0 -7
- package/dist/chunk-XQHATUKN.js +0 -2
- package/dist/chunk-YJTUFK4P.js +0 -2
- package/dist/chunk-YXOKWCYS.js +0 -2
- /package/dist/{chunk-FCJI2JF7.js.map → chunk-34KVSA2V.js.map} +0 -0
- /package/dist/{chunk-M7FNPRV4.js.map → chunk-4DW5WBZB.js.map} +0 -0
- /package/dist/{chunk-I5A74NMJ.js.map → chunk-4Z4E3BZ2.js.map} +0 -0
- /package/dist/{chunk-SEW5OCQF.js.map → chunk-6IXVTWFH.js.map} +0 -0
- /package/dist/{chunk-NJ5IFOPR.js.map → chunk-6S4BKUGD.js.map} +0 -0
- /package/dist/{chunk-CWIE74NX.js.map → chunk-6VWSTY32.js.map} +0 -0
- /package/dist/{chunk-F4HZUAKM.js.map → chunk-72ESP5DB.js.map} +0 -0
- /package/dist/{chunk-3BG75P7T.js.map → chunk-7SE4B4TC.js.map} +0 -0
- /package/dist/{chunk-PGVLRMTQ.js.map → chunk-A5N2AJCE.js.map} +0 -0
- /package/dist/{chunk-3QRA3XOA.js.map → chunk-ALNUVKDT.js.map} +0 -0
- /package/dist/{chunk-NQV4THNE.js.map → chunk-ANR27GED.js.map} +0 -0
- /package/dist/{chunk-EXIADWI7.js.map → chunk-AZUWS2C5.js.map} +0 -0
- /package/dist/{chunk-Z6L55FTN.js.map → chunk-BHKI2SU3.js.map} +0 -0
- /package/dist/{chunk-GZIDE5K2.js.map → chunk-BIQX75P2.js.map} +0 -0
- /package/dist/{chunk-MNSDGJKA.js.map → chunk-BPCD37A2.js.map} +0 -0
- /package/dist/{chunk-R32HPK7R.js.map → chunk-DHUBCB4H.js.map} +0 -0
- /package/dist/{chunk-JSEI44A7.js.map → chunk-EKRWJJ65.js.map} +0 -0
- /package/dist/{chunk-JE56CJX2.js.map → chunk-EQ4IWYLW.js.map} +0 -0
- /package/dist/{chunk-5PYJ6FJK.js.map → chunk-EXBGOHG7.js.map} +0 -0
- /package/dist/{chunk-UQRQH2JW.js.map → chunk-FTZMF2QX.js.map} +0 -0
- /package/dist/{chunk-XFIREDWO.js.map → chunk-G7NNOLOG.js.map} +0 -0
- /package/dist/{chunk-4OB2IM5L.js.map → chunk-GX32KEG2.js.map} +0 -0
- /package/dist/{chunk-ZSPJZ3ZH.js.map → chunk-GYGX4VYF.js.map} +0 -0
- /package/dist/{chunk-BIGL3ZVD.js.map → chunk-H2EC3QP4.js.map} +0 -0
- /package/dist/{chunk-HRW25TMU.js.map → chunk-H2KFAM7L.js.map} +0 -0
- /package/dist/{chunk-6LJK4QWF.js.map → chunk-HHOSKOO6.js.map} +0 -0
- /package/dist/{chunk-JJLOUMCJ.js.map → chunk-I5KHVFJ4.js.map} +0 -0
- /package/dist/{chunk-N2LS4JD6.js.map → chunk-IB5T27PW.js.map} +0 -0
- /package/dist/{chunk-5BMG5ZBY.js.map → chunk-IE7KRNFJ.js.map} +0 -0
- /package/dist/{chunk-3FK52VQX.js.map → chunk-J2YP2YD3.js.map} +0 -0
- /package/dist/{chunk-3FCIZKIN.js.map → chunk-J6D4T4WY.js.map} +0 -0
- /package/dist/{chunk-H25XXQVH.js.map → chunk-JF4WPGJQ.js.map} +0 -0
- /package/dist/{chunk-YJTUFK4P.js.map → chunk-K44IJHPF.js.map} +0 -0
- /package/dist/{chunk-JLKIHXZP.js.map → chunk-KP7O5MVL.js.map} +0 -0
- /package/dist/{chunk-HLS5FI55.js.map → chunk-KVUELLYF.js.map} +0 -0
- /package/dist/{chunk-CMV3F6HR.js.map → chunk-LRUKKIYA.js.map} +0 -0
- /package/dist/{chunk-DWTDNKXX.js.map → chunk-M2XOIEPY.js.map} +0 -0
- /package/dist/{chunk-P4O57S6N.js.map → chunk-MBRCE5A7.js.map} +0 -0
- /package/dist/{chunk-CFGCB37K.js.map → chunk-MMPPDQ2E.js.map} +0 -0
- /package/dist/{chunk-643FOYQB.js.map → chunk-MRDX3RVJ.js.map} +0 -0
- /package/dist/{chunk-6PZPBPAD.js.map → chunk-NAWQBQ57.js.map} +0 -0
- /package/dist/{chunk-RG6SHPHF.js.map → chunk-NBR5IRZT.js.map} +0 -0
- /package/dist/{chunk-J5QPFJ7M.js.map → chunk-OK3SN5PN.js.map} +0 -0
- /package/dist/{chunk-NNR2FNHG.js.map → chunk-OQFQDTLL.js.map} +0 -0
- /package/dist/{chunk-GEBAYD6N.js.map → chunk-PMIIQMVH.js.map} +0 -0
- /package/dist/{chunk-DIOJGTUN.js.map → chunk-QT5JRZZJ.js.map} +0 -0
- /package/dist/{chunk-IUOEPAWG.js.map → chunk-R52OSARY.js.map} +0 -0
- /package/dist/{chunk-XR677UYD.js.map → chunk-RI62AESU.js.map} +0 -0
- /package/dist/{chunk-6BOM5KZR.js.map → chunk-RRGAJ7T4.js.map} +0 -0
- /package/dist/{chunk-2YRQULDC.js.map → chunk-SQTM4QFP.js.map} +0 -0
- /package/dist/{chunk-FPU53CCV.js.map → chunk-TAFHKT6O.js.map} +0 -0
- /package/dist/{chunk-3TCITFUU.js.map → chunk-TBM35UV6.js.map} +0 -0
- /package/dist/{chunk-YDX2PCVL.js.map → chunk-TBOQ6HZZ.js.map} +0 -0
- /package/dist/{chunk-GEJKFE4X.js.map → chunk-TJJL2GSJ.js.map} +0 -0
- /package/dist/{chunk-3F4MN2BU.js.map → chunk-TJXH3F7Z.js.map} +0 -0
- /package/dist/{chunk-DWA45BWR.js.map → chunk-VADYSXHY.js.map} +0 -0
- /package/dist/{chunk-Q6FY4L2F.js.map → chunk-VBLCO5Q7.js.map} +0 -0
- /package/dist/{chunk-ESCLDVFS.js.map → chunk-VCK5WWMQ.js.map} +0 -0
- /package/dist/{chunk-BCVOUMJJ.js.map → chunk-VCYCNSJY.js.map} +0 -0
- /package/dist/{chunk-4AZ44KV4.js.map → chunk-VOCGAAG7.js.map} +0 -0
- /package/dist/{chunk-AT7VFZRB.js.map → chunk-WHWPLMIG.js.map} +0 -0
- /package/dist/{chunk-S2CMWKVB.js.map → chunk-WVJSNE6Q.js.map} +0 -0
- /package/dist/{chunk-U5L76VVB.js.map → chunk-XI4IBUE3.js.map} +0 -0
- /package/dist/{chunk-4S3HRFQB.js.map → chunk-YAKKOVRI.js.map} +0 -0
- /package/dist/{chunk-HG7OOHGD.js.map → chunk-YF5GWNM7.js.map} +0 -0
- /package/dist/{chunk-4CWYF4O7.js.map → chunk-YRCR5ELY.js.map} +0 -0
- /package/dist/{chunk-C3MWS7P2.js.map → chunk-YVEGWCYD.js.map} +0 -0
- /package/dist/{chunk-MQ5BYGFY.js.map → chunk-ZYHMTPW4.js.map} +0 -0
package/dist/chunk-DJUSVBD5.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as b,c as d}from"./chunk-DIOJGTUN.js";import{c as m}from"./chunk-BQEFLPDA.js";import{a as f}from"./chunk-TIPK3SCJ.js";import{b as r,e as v,f as h}from"./chunk-PZSHOSOS.js";import{e as p,f as l}from"./chunk-S4QD5NID.js";b({play:'<path d="m6 3 14 9-14 9z"/>',pause:'<rect x="14" y="4" width="4" height="16" rx="1"/><rect x="6" y="4" width="4" height="16" rx="1"/>'});p("en",{carousel:"Carousel",carouselSlide:"{n} of {total}",carouselGo:"Go to {n}",carouselPrev:"Previous",carouselNext:"Next",carouselPause:"Pause",carouselPlay:"Play"});p("pt-BR",{carousel:"Carrossel",carouselSlide:"{n} de {total}",carouselGo:"Ir para {n}",carouselPrev:"Anterior",carouselNext:"Pr\xF3ximo",carouselPlay:"Tocar",carouselPause:"Pausar"});var u=class extends m{baseCls="op-carousel";track;prevBtn;nextBtn;dotsEl;toggleBtn;index=0;stopped=!1;scrollTimer;playTimer;get perView(){return Math.max(1,this.config.perView??1)}get last(){return Math.max(0,this.items.length-this.perView)}build(){let t=(e,o,n,c)=>{let a=r("button",`op-carousel__${e}`,{type:"button","aria-label":l(n)},d(o));return this.listen(a,"click",()=>{this.interact(),c()}),a};return this.prevBtn=t("prev","chevron-left","carouselPrev",()=>this.prev()),this.nextBtn=t("next","chevron-right","carouselNext",()=>this.next()),this.toggleBtn=t("toggle","pause","carouselPause",()=>this.isPlaying()?this.pause():this.play()),this.track=r("div","op-carousel__track",{tabindex:0}),this.dotsEl=r("div","op-carousel__dots"),r("div",this.baseCls,{role:"region","aria-roledescription":"carousel"},r("div","op-carousel__viewport",{},this.track,this.prevBtn,this.nextBtn),r("div","op-carousel__bar",{},this.dotsEl,this.toggleBtn))}getBody(){return this.track}onRender(){let t=this.config;this.el.setAttribute("aria-label",t.ariaLabel??l("carousel")),this.track.setAttribute("aria-label",t.ariaLabel??l("carousel")),this.el.style.setProperty("--op-carousel-per-view",String(this.perView)),t.gap!=null&&this.el.style.setProperty("--op-carousel-gap",v(t.gap)),super.onRender(),this.index=h(t.active??0,0,this.last),this.on("add",()=>this.refresh()),this.on("remove",()=>this.refresh()),this.listen(this.track,"scroll",()=>{clearTimeout(this.scrollTimer),this.scrollTimer=setTimeout(()=>this.settle(),90)}),this.listen(this.el,"keydown",e=>{let o=e.target;if(o!==this.track&&!o.closest(".op-carousel__prev, .op-carousel__next, .op-carousel__dots, .op-carousel__toggle"))return;let n={ArrowLeft:()=>this.step(-1),ArrowRight:()=>this.step(1),Home:()=>this.goTo(0),End:()=>this.goTo(this.last)};n[e.key]&&(e.preventDefault(),this.interact(),n[e.key]())}),this.listen(this.track,"pointerdown",()=>this.interact());for(let e of["pointerenter","pointerleave","focusin","focusout"])this.listen(this.el,e,()=>this.tick());this.own(()=>{clearTimeout(this.scrollTimer),clearInterval(this.playTimer)}),this.refresh(),this.tick()}onMount(){this.align(!1)}settle(){let t=this.stride();if(!t||this.destroyed)return;let e=h(Math.round(Math.abs(this.track.scrollLeft)/t),0,this.last);e!==this.index&&this.set(e)}stride(){let[t,e]=this.items;return e?Math.abs(e.el.offsetLeft-t.el.offsetLeft):0}align(t){let e=getComputedStyle(this.track).direction==="rtl"?-1:1;this.track.style.scrollBehavior=t?"":"auto",this.track.scrollLeft=e*this.index*this.stride()}set(t){let e=this.index;this.index=t,this.config.active=t,this.refresh(),this.emit("change",t,e)}refresh(){if(this.destroyed)return;let t=this.items.length;this.index=h(this.index,0,this.last),this.items.forEach((i,s)=>{i.el.setAttribute("role","group"),i.el.setAttribute("aria-roledescription","slide"),i.el.setAttribute("aria-label",l("carouselSlide",{n:s+1,total:t})),i.el.toggleAttribute("inert",s<this.index||s>=this.index+this.perView)});let e=t>this.perView,o=this.config.dots!==!1&&e;this.dotsEl.hidden=!o,o&&this.dotsEl.children.length!==this.last+1&&this.dotsEl.replaceChildren(...Array.from({length:this.last+1},(i,s)=>{let g=r("button","op-carousel__dot",{type:"button","aria-label":l("carouselGo",{n:s+1})});return this.listen(g,"click",()=>{this.interact(),this.goTo(s)}),g})),[...this.dotsEl.children].forEach((i,s)=>s===this.index?i.setAttribute("aria-current","true"):i.removeAttribute("aria-current"));let n=this.config.arrows!==!1&&e;this.prevBtn.hidden=this.nextBtn.hidden=!n;let c=!!this.config.loop;this.prevBtn.disabled=!c&&this.index===0,this.nextBtn.disabled=!c&&this.index===this.last,this.el.classList.toggle("is-first",this.index===0),this.el.classList.toggle("is-last",this.index===this.last),this.toggleBtn.hidden=!this.config.autoplay||!e;let a=this.isPlaying();this.el.classList.toggle("is-playing",a),this.toggleBtn.replaceChildren(d(a?"pause":"play")),this.toggleBtn.setAttribute("aria-label",l(a?"carouselPause":"carouselPlay")),this.track.setAttribute("aria-live",a?"off":"polite")}getActive(){return this.index}goTo(t){t=h(t,0,this.last),!(t===this.index||this.emit("before-change",t)===!1)&&(this.set(t),this.rendered&&this.align(!0))}setActive(t){this.goTo(t)}step(t){let e=this.index+t;this.goTo(this.config.loop?e<0?this.last:e>this.last?0:e:e)}next(){this.step(1)}prev(){this.step(-1)}isPlaying(){return!!this.config.autoplay&&!this.stopped&&!this.reduced()}reduced(){return!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches}play(){this.stopped=!1,this.refresh(),this.tick()}pause(){this.stopped=!0,this.refresh(),this.tick()}interact(){this.stopped||this.pause()}tick(){clearInterval(this.playTimer),this.playTimer=void 0,!(!this.isPlaying()||this.el.matches(":hover, :focus-within")||this.items.length<=this.perView)&&(this.playTimer=setInterval(()=>this.goTo(this.index>=this.last?0:this.index+1),this.config.autoplay))}};f("carousel",u);export{u as a};
|
|
2
|
-
//# sourceMappingURL=chunk-DJUSVBD5.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/layout/carousel/carousel.ts"],
|
|
4
|
-
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { register } from '../../../core/registry';\nimport { h, clamp, px } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { iconEl, registerIcons } from '../../base/icon/icon';\n\nregisterIcons({ play: '<path d=\"m6 3 14 9-14 9z\"/>', pause: '<rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/>' });\n\naddMessages('en', { carousel: 'Carousel', carouselSlide: '{n} of {total}', carouselGo: 'Go to {n}', carouselPrev: 'Previous', carouselNext: 'Next', carouselPause: 'Pause', carouselPlay: 'Play' });\naddMessages('pt-BR', { carousel: 'Carrossel', carouselSlide: '{n} de {total}', carouselGo: 'Ir para {n}', carouselPrev: 'Anterior', carouselNext: 'Pr\u00F3ximo', carouselPlay: 'Tocar', carouselPause: 'Pausar' });\n\nexport interface CarouselConfig extends ContainerConfig {\n /** Items shown together. Default 1. */\n perView?: number;\n /** Space between items (px or CSS length). */\n gap?: number | string;\n /** Past the last item goes to the first (and the other way). */\n loop?: boolean;\n /** ms between items; 0 (default) is off. */\n autoplay?: number;\n /** Default `true`. */\n dots?: boolean;\n /** Default `true`. */\n arrows?: boolean;\n active?: number;\n}\n\n/** Pages through its items on a scroll-snap row: images, cards or any component. */\nexport class Carousel extends Container<CarouselConfig> {\n protected override baseCls = 'op-carousel';\n private track!: HTMLElement;\n private prevBtn!: HTMLButtonElement;\n private nextBtn!: HTMLButtonElement;\n private dotsEl!: HTMLElement;\n private toggleBtn!: HTMLButtonElement;\n private index = 0;\n private stopped = false;\n private scrollTimer?: ReturnType<typeof setTimeout>;\n private playTimer?: ReturnType<typeof setInterval>;\n\n private get perView() {\n return Math.max(1, this.config.perView ?? 1);\n }\n /** Positions the row can rest on: it moves one item at a time. */\n private get last() {\n return Math.max(0, this.items.length - this.perView);\n }\n\n protected override build(): HTMLElement {\n const btn = (cls: string, icon: string, key: string, fn: () => void) => {\n const b = h('button', `op-carousel__${cls}`, { type: 'button', 'aria-label': t(key) }, iconEl(icon));\n this.listen(b, 'click', () => {\n this.interact();\n fn();\n });\n return b;\n };\n this.prevBtn = btn('prev', 'chevron-left', 'carouselPrev', () => this.prev());\n this.nextBtn = btn('next', 'chevron-right', 'carouselNext', () => this.next());\n this.toggleBtn = btn('toggle', 'pause', 'carouselPause', () => (this.isPlaying() ? this.pause() : this.play()));\n this.track = h('div', 'op-carousel__track', { tabindex: 0 });\n this.dotsEl = h('div', 'op-carousel__dots');\n return h('div', this.baseCls, { role: 'region', 'aria-roledescription': 'carousel' },\n h('div', 'op-carousel__viewport', {}, this.track, this.prevBtn, this.nextBtn),\n h('div', 'op-carousel__bar', {}, this.dotsEl, this.toggleBtn));\n }\n\n override getBody(): HTMLElement {\n return this.track;\n }\n\n protected override onRender() {\n const c = this.config;\n this.el.setAttribute('aria-label', c.ariaLabel ?? t('carousel'));\n this.track.setAttribute('aria-label', c.ariaLabel ?? t('carousel'));\n this.el.style.setProperty('--op-carousel-per-view', String(this.perView));\n if (c.gap != null) this.el.style.setProperty('--op-carousel-gap', px(c.gap));\n super.onRender();\n this.index = clamp(c.active ?? 0, 0, this.last);\n this.on('add', () => this.refresh());\n this.on('remove', () => this.refresh());\n this.listen(this.track, 'scroll', () => {\n clearTimeout(this.scrollTimer);\n this.scrollTimer = setTimeout(() => this.settle(), 90);\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const el = e.target as HTMLElement;\n if (el !== this.track && !el.closest('.op-carousel__prev, .op-carousel__next, .op-carousel__dots, .op-carousel__toggle')) return;\n const keys: Record<string, () => void> = { ArrowLeft: () => this.step(-1), ArrowRight: () => this.step(1), Home: () => this.goTo(0), End: () => this.goTo(this.last) };\n if (!keys[e.key]) return;\n e.preventDefault();\n this.interact();\n keys[e.key]();\n });\n this.listen(this.track, 'pointerdown', () => this.interact());\n for (const ev of ['pointerenter', 'pointerleave', 'focusin', 'focusout']) this.listen(this.el, ev, () => this.tick());\n this.own(() => {\n clearTimeout(this.scrollTimer);\n clearInterval(this.playTimer);\n });\n this.refresh();\n this.tick();\n }\n\n protected override onMount() {\n this.align(false);\n }\n\n /** Reads the item at the left edge from the scroll position (after a swipe or a trackpad scroll). */\n private settle() {\n const stride = this.stride();\n if (!stride || this.destroyed) return;\n const i = clamp(Math.round(Math.abs(this.track.scrollLeft) / stride), 0, this.last);\n if (i !== this.index) this.set(i);\n }\n\n private stride(): number {\n const [a, b] = this.items;\n return b ? Math.abs(b.el.offsetLeft - a.el.offsetLeft) : 0;\n }\n\n private align(smooth: boolean) {\n const sign = getComputedStyle(this.track).direction === 'rtl' ? -1 : 1;\n this.track.style.scrollBehavior = smooth ? '' : 'auto';\n this.track.scrollLeft = sign * this.index * this.stride();\n }\n\n private set(i: number) {\n const old = this.index;\n this.index = i;\n this.config.active = i;\n this.refresh();\n this.emit('change', i, old);\n }\n\n /** Slides, dots, arrows: everything that follows the item count or the active one. */\n private refresh() {\n if (this.destroyed) return;\n const n = this.items.length;\n this.index = clamp(this.index, 0, this.last);\n this.items.forEach((c, i) => {\n c.el.setAttribute('role', 'group');\n c.el.setAttribute('aria-roledescription', 'slide');\n c.el.setAttribute('aria-label', t('carouselSlide', { n: i + 1, total: n }));\n c.el.toggleAttribute('inert', i < this.index || i >= this.index + this.perView);\n });\n const paged = n > this.perView;\n const dots = this.config.dots !== false && paged;\n this.dotsEl.hidden = !dots;\n if (dots && this.dotsEl.children.length !== this.last + 1) {\n this.dotsEl.replaceChildren(...Array.from({ length: this.last + 1 }, (_, i) => {\n const d = h('button', 'op-carousel__dot', { type: 'button', 'aria-label': t('carouselGo', { n: i + 1 }) });\n this.listen(d, 'click', () => {\n this.interact();\n this.goTo(i);\n });\n return d;\n }));\n }\n [...this.dotsEl.children].forEach((d, i) => (i === this.index ? d.setAttribute('aria-current', 'true') : d.removeAttribute('aria-current')));\n const arrows = this.config.arrows !== false && paged;\n this.prevBtn.hidden = this.nextBtn.hidden = !arrows;\n const loop = !!this.config.loop;\n this.prevBtn.disabled = !loop && this.index === 0;\n this.nextBtn.disabled = !loop && this.index === this.last;\n this.el.classList.toggle('is-first', this.index === 0);\n this.el.classList.toggle('is-last', this.index === this.last);\n this.toggleBtn.hidden = !this.config.autoplay || !paged;\n const playing = this.isPlaying();\n this.el.classList.toggle('is-playing', playing);\n this.toggleBtn.replaceChildren(iconEl(playing ? 'pause' : 'play'));\n this.toggleBtn.setAttribute('aria-label', t(playing ? 'carouselPause' : 'carouselPlay'));\n this.track.setAttribute('aria-live', playing ? 'off' : 'polite');\n }\n\n getActive(): number {\n return this.index;\n }\n\n /** Goes to item `i` (kept between 0 and the last position). `before-change` can cancel. */\n goTo(i: number): void {\n i = clamp(i, 0, this.last);\n if (i === this.index || this.emit('before-change', i) === false) return;\n this.set(i);\n if (this.rendered) this.align(true);\n }\n setActive(i: number): void {\n this.goTo(i);\n }\n private step(d: 1 | -1) {\n const to = this.index + d;\n this.goTo(this.config.loop ? (to < 0 ? this.last : to > this.last ? 0 : to) : to);\n }\n next(): void {\n this.step(1);\n }\n prev(): void {\n this.step(-1);\n }\n\n // ---- autoplay -----------------------------------------------------------------------------\n\n isPlaying(): boolean {\n return !!this.config.autoplay && !this.stopped && !this.reduced();\n }\n private reduced(): boolean {\n return !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n }\n play(): void {\n this.stopped = false;\n this.refresh();\n this.tick();\n }\n pause(): void {\n this.stopped = true;\n this.refresh();\n this.tick();\n }\n /** Any use of the controls ends autoplay for good (WCAG 2.2.2). */\n private interact() {\n if (!this.stopped) this.pause();\n }\n /** Runs the timer only while playing and nothing holds the pointer or the focus. */\n private tick() {\n clearInterval(this.playTimer);\n this.playTimer = undefined;\n if (!this.isPlaying() || this.el.matches(':hover, :focus-within') || this.items.length <= this.perView) return;\n this.playTimer = setInterval(() => this.goTo(this.index >= this.last ? 0 : this.index + 1), this.config.autoplay);\n }\n}\nregister('carousel', Carousel);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["registerIcons", "addMessages", "Carousel", "Container", "btn", "cls", "icon", "key", "fn", "b", "h", "t", "iconEl", "c", "px", "clamp", "el", "keys", "ev", "stride", "i", "a", "smooth", "sign", "old", "n", "paged", "dots", "_", "d", "arrows", "loop", "playing", "to", "register"]
|
|
7
|
-
}
|
package/dist/chunk-GFFZTFQH.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as z}from"./chunk-BCVOUMJJ.js";import{a as G}from"./chunk-MNSDGJKA.js";import{a as $}from"./chunk-RG6SHPHF.js";import{a as R}from"./chunk-2YRQULDC.js";import{a as b}from"./chunk-HLS5FI55.js";import{c as C}from"./chunk-DIOJGTUN.js";import{a as x,b as L}from"./chunk-OWEQT2HN.js";import{a as _}from"./chunk-TIPK3SCJ.js";import{a as H}from"./chunk-2HNQ2XRY.js";import{c as A}from"./chunk-L5SQQFO7.js";import{c as S,e as E,f as T}from"./chunk-UDXO3KM3.js";import{b as d}from"./chunk-PZSHOSOS.js";import{e as w,f as g}from"./chunk-S4QD5NID.js";w("en",{gridSelected:"{n} selected",gridSelectAll:"Select all {n}",gridClearSel:"Clear selection",gridSelectRow:"Select row",gridSelectPage:"Select all rows",gridRowActions:"Row actions",gridColumns:"Columns",gridResize:"Resize column",gridGroupAll:"All",gridOtherCols:"Other",gridGroups:"Column groups",gridColumnSearch:"Search columns",gridNoColumns:"No matching columns"});w("pt-BR",{gridSelected:"{n} selecionado(s)",gridSelectAll:"Selecionar todos os {n}",gridClearSel:"Limpar sele\xE7\xE3o",gridSelectRow:"Selecionar linha",gridSelectPage:"Selecionar todas as linhas",gridRowActions:"A\xE7\xF5es da linha",gridColumns:"Colunas",gridResize:"Redimensionar coluna",gridGroupAll:"Todas",gridOtherCols:"Outras",gridGroups:"Grupos de colunas",gridColumnSearch:"Buscar colunas",gridNoColumns:"Nenhuma coluna encontrada"});var v="__select",m="__actions",K={field:v,width:44,align:"center",cls:"op-grid__selcell",locked:"start"},P={field:m,width:44,align:"center",cls:"op-grid__actcell",locked:"end"},B="var(--op-grid-row-height, var(--op-row-height))",k=class extends T{baseCls="op-grid";store;offStore;headEl;headRow;viewport;emptyEl;table;pager;v;entries;lockEdge=[-1,-1];selected=new Set;active=-1;anchor=-1;justDragged=!1;cv=0;selAll;barEl;bulkEl;bulkCount;bulkBtns=[];selectAllBtn;rowMenu;colDd;colList;colSearch;colChips;colGroup="";cols(){let e=this.config;return[...e.checkboxSelection?[K]:[],...this.userCols(),...e.rowActions?.length?[P]:[]]}userCols(){let e=(this.config.columns??[]).filter(t=>!t.hidden);return[...e.filter(t=>t.locked==="start"),...e.filter(t=>!t.locked),...e.filter(t=>t.locked==="end")]}visibleActions(){return this.config.rowActionsMode==="visible"&&!!this.config.rowActions?.length}mode(){return this.config.checkboxSelection?"multi":this.config.selection??"single"}build(){let e=this.config;e.rowActions=E(e.rowActions),e.bulkActions=E(e.bulkActions),e.columns=e.columns.filter(i=>S(i.permission));let t=d("div",this.baseCls);return this.headRow=d("div","op-grid__row op-grid__header-row",{role:"row"}),this.headEl=d("div","op-grid__header",{},this.headRow),this.viewport=d("div","op-grid__viewport"),this.emptyEl=d("div","op-grid__empty"),(e.columnMenu||e.bulkActions?.length)&&(this.bulkEl=d("div","op-grid__bulk"),this.bulkEl.hidden=!0,this.barEl=d("div","op-grid__bar",{},this.bulkEl),t.append(this.barEl)),this.table=d("div","op-grid__table",{role:"grid",tabindex:0,"aria-multiselectable":e.selection==="multi"||e.checkboxSelection?"true":null},this.headEl,this.viewport,this.emptyEl),t.append(this.table),t.classList.toggle("op-grid--striped",!!e.striped),e.paging&&(this.pager=new z({cls:"op-grid__pager"}),t.append(this.pager.el)),t}onRender(){let e=this.config;if(this.bindStore(e.store??new A({data:e.data??[]})),this.buildHeader(),this.buildBar(),this.v=x({scroller:this.viewport,count:this.count(),rowHeight:e.rowHeight??(L(this.el,B)||36),render:(t,i)=>this.renderRow(t,i),rowCls:"op-grid__row op-grid__body-row"}),this.own(()=>this.v.destroy()),this.sync(),this.listen(this.viewport,"scroll",()=>this.onScrollX(),{passive:!0}),this.listen(this.viewport,"click",t=>this.onRowEvent(t,"row-click")),this.listen(this.viewport,"dblclick",t=>this.onRowEvent(t,"row-dblclick")),this.listen(this.el,"keydown",t=>this.onKey(t)),this.listen(this.headRow,"change",t=>{t.target===this.selAll&&(this.selAll.checked?this.store.each(i=>this.selected.add(i)):this.config.keepSelection?this.store.each(i=>this.selected.delete(i)):this.selected.clear(),this.changed())}),e.reorderableColumns&&this.initColumnDrag(),e.resizableColumns&&this.initColumnResize(),this.listen(this.headRow,"click",t=>{if(this.justDragged||t.target.closest(".op-grid__resizer"))return;let i=t.target.closest("[data-field]"),s=i&&this.userCols().find(r=>r.field===i.dataset.field);s&&(this.emit("column-click",s),s.sortable&&this.sortBy(s))}),typeof ResizeObserver<"u"){let t=new ResizeObserver(()=>this.layout());t.observe(this.viewport),this.own(()=>t.disconnect())}this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(e.pageSize??20)),this.own(()=>this.pager?.destroy());for(let t of e.plugins??[]){let i=t.init(this);i&&this.own(i),t.destroy&&this.own(()=>t.destroy())}}cellAt(e){let t=e?.closest?.(".op-grid__body-row .op-grid__cell"),i=Number(t?.parentElement?.dataset.i),s=t&&this.cols()[Number(t.getAttribute("aria-colindex"))-1],r=t&&this.recAt(i);return s&&r&&![v,m].includes(s.field)?{index:i,record:r,column:s,el:t}:void 0}getCell(e,t){let i=this.cols().findIndex(s=>s.field===t);return document.getElementById(`${this.id}-r${e}`)?.querySelector(`[aria-colindex="${i+1}"]`)??void 0}getColumns(){return this.userCols()}getActive(){return this.active}notifyMount(){super.notifyMount(),this.layout(),this.pager?.notifyMount()}onScrollX(){let e=this.viewport,t=Math.max(0,e.scrollWidth-e.clientWidth-e.scrollLeft);this.headEl.scrollLeft=e.scrollLeft,this.el.style.setProperty("--op-grid-scroll-x",`${e.scrollLeft}px`),this.el.style.setProperty("--op-grid-scroll-end",`${t}px`),this.el.classList.toggle("is-scrolled-start",e.scrollLeft>0),this.el.classList.toggle("is-scrolled-end",t>0)}layout(){if(this.rendered){if(!this.config.rowHeight){let e=L(this.el,B);e&&this.v.setRowHeight(e)}this.headEl.style.paddingInlineEnd=`${this.viewport.offsetWidth-this.viewport.clientWidth}px`,this.v.refresh(),this.onScrollX()}}bindStore(e){this.offStore?.(),this.store=e;let t=e.subscribe(s=>{this.rendered&&(this.sync(),s.type==="sort"&&this.paintSort())}),i=e.on("loading",s=>this.setLoading(s));this.offStore=()=>(t(),i()),this.own(()=>this.offStore?.())}sync(){let e=this.selected.size;if(!this.config.keepSelection)for(let t of this.selected)this.store.indexOf(t)<0&&this.selected.delete(t);this.active=Math.min(this.active,this.count()-1),this.v.setCount(this.count()),this.table.setAttribute("aria-rowcount",String(this.store.totalCount+1)),this.emptyEl.textContent=this.config.emptyText??g("empty"),this.emptyEl.hidden=this.count()>0||!!this.config.loading,this.el.classList.toggle("is-empty",this.count()===0),this.updateActiveDescendant(),this.paintSelection(),this.selected.size!==e&&this.emit("select",this.getSelection())}setStore(e){this.config.store=e,this.selected.clear(),this.active=this.anchor=-1,this.rendered&&(this.bindStore(e),this.pager?.setStore(e),this.paintSort(),this.sync())}getStore(){return this.render(),this.store}count(){return this.entries?this.entries.length:this.store.count}recAt(e){return this.entries?this.entries[e]?.rec:this.store.getAt(e)}setRowLayout(e){this.entries=e,this.rendered&&this.sync()}getRowEntry(e){return this.entries?this.entries[e]:(t=>t&&{rec:t})(this.store.getAt(e))}getRowCount(){return this.count()}layoutColumns(){let e=this.cols(),t=this.visibleActions()?this.config.rowActions.length:1,i=n=>n.field===m?`calc(${t} * var(--op-grid-action-size) + ${t+1} * var(--op-grid-action-gap))`:`${n.width}px`,s=n=>n.field===m?i(n):`${n.width??140}px`,r=e.map(n=>n.locked?s(n):n.width?`${n.width}px`:`minmax(${n.minWidth??96}px, ${n.flex??1}fr)`).join(" "),o=n=>n.reduce((c,[a,h])=>(this.el.style.setProperty(`--op-grid-lock-${a}`,c.length?`calc(${c.join(" + ")})`:"0px"),[...c,s(h)]),[]),l=e.map((n,c)=>[c,n]);o(l.filter(([,n])=>n.locked==="start")),o(l.filter(([,n])=>n.locked==="end").reverse()),this.lockEdge=[e.map(n=>n.locked).lastIndexOf("start"),e.findIndex(n=>n.locked==="end")],this.el.style.setProperty("--op-grid-cols",r),this.el.style.setProperty("--op-grid-min-width",`${e.reduce((n,c)=>n+(c.field===m?t*36:c.width??(c.locked?140:c.minWidth??96)),0)}px`)}lock(e,t,i){t.locked&&(e.classList.add("is-locked",`is-locked-${t.locked}`),e.classList.toggle("is-lock-edge",this.lockEdge[t.locked==="start"?0:1]===i),e.style.setProperty("--_lock",`var(--op-grid-lock-${i})`))}buildHeader(){let e=this.cols();this.layoutColumns(),this.el.classList.toggle("op-grid--actions-visible",this.visibleActions()),this.el.classList.toggle("op-grid--reorderable",!!this.config.reorderableColumns),this.el.classList.toggle("op-grid--resizable",!!this.config.resizableColumns),this.table.setAttribute("aria-colcount",String(e.length)),this.selAll=void 0,this.headRow.replaceChildren(...e.map((i,s)=>{let r=i.header??i.field,o=d("div",`op-grid__cell op-grid__hcell${i.align?` op-grid__cell--${i.align}`:""}${i.sortable?" is-sortable":""}`,{role:"columnheader","aria-colindex":s+1,"data-field":i.field});this.lock(o,i,s),i.field===v?o.append(this.selAll=d("input","op-grid__check",{type:"checkbox","aria-label":g("gridSelectPage")})):i.field===m?o.append(d("span","op-sr-only",{},g("gridRowActions"))):i.sortable?o.append(d("button","op-grid__sort",{type:"button"},d("span","op-grid__label",{},r),d("span","op-grid__arrow",{"aria-hidden":"true"},C("arrow-up")))):o.append(d("span","op-grid__label",{},r));let l=i.field!==v&&i.field!==m;return this.config.reorderableColumns&&l&&o.classList.add("is-reorderable"),this.canResize(i)&&o.append(d("span","op-grid__resizer",{role:"separator","aria-orientation":"vertical","aria-label":`${g("gridResize")} ${r}`})),l&&!i.sortable&&(this.config.reorderableColumns||this.canResize(i))&&(o.tabIndex=0),o}));let t=this.groupBand(e);this.headEl.replaceChildren(...t?[t]:[],this.headRow),this.paintSort()}groupBand(e){if(this.config.groupHeaders===!1||!e.some(s=>s.group))return null;let t=[],i=0;for(;i<e.length;){let s=e[i].group??"",r=1;for(;i+r<e.length&&(e[i+r].group??"")===s;)r++;let o=d("div",`op-grid__gcell${s?"":" is-empty"}`,{role:"columnheader","aria-colindex":i+1,"aria-colspan":r},s);o.style.gridColumn=`span ${r}`,t.push(o),i+=r}return d("div","op-grid__row op-grid__group-row",{role:"row"},...t)}getColumnGroups(){return[...new Set(this.config.columns.map(e=>e.group).filter(e=>!!e))]}setColumnGroupVisible(e,t){let i=this.config.columns.filter(s=>(s.group??"")===e);if(i.length){for(let s of i)s.hidden=!t;this.config.columns.some(s=>!s.hidden)||(i[0].hidden=!1),this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}}setColumnLocked(e,t){let i=this.config.columns.find(s=>s.field===e);!i||i.locked===(t??void 0)||(this.setColumns(this.config.columns.map(s=>s===i?{...s,locked:t??void 0}:s)),this.emit("columns-change",this.getColumnState()))}setColumns(e){this.config.columns=e,this.rendered&&(this.cv++,this.buildHeader(),this.paintSelection(),this.v.refresh())}getColumnState(){return this.config.columns.map(e=>({field:e.field,hidden:!!e.hidden,width:e.width,locked:e.locked}))}setColumnState(e){let t=new Map(this.config.columns.map(s=>[s.field,s])),i=e.flatMap(s=>{let r=t.get(s.field);return t.delete(s.field),r?[{...r,hidden:s.hidden,width:s.width??r.width,locked:"locked"in s?s.locked:r.locked}]:[]});this.setColumns([...i,...t.values()]),this.emit("columns-change",this.getColumnState())}canResize(e){return!!this.config.resizableColumns&&e.field!==v&&e.field!==m&&e.resizable!==!1}setColumnWidth(e,t){let i=this.config.columns.find(s=>s.field===e);i&&(i.width=t==null?void 0:Math.round(Math.max(i.minWidth??48,Math.min(t,i.maxWidth??1/0))),this.layoutColumns(),this.emit("column-resize",e,i.width),this.emit("columns-change",this.getColumnState()))}initColumnResize(){let e=this.headRow;this.listen(e,"pointerdown",t=>{let i=t.target.closest(".op-grid__resizer");if(!i||t.button)return;t.preventDefault();let s=i.parentElement,r=s.dataset.field,o=this.config.columns.find(u=>u.field===r),l=t.clientX,n=s.getBoundingClientRect().width||o.width||96;this.el.classList.add("is-resizing");let c=o.width,a=u=>{let p=Math.round(Math.max(o.minWidth??48,Math.min(n+(u.clientX-l)*(this.dir()==="rtl"?-1:1),o.maxWidth??1/0)));o.width=c=p,this.layoutColumns()},h=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h),this.el.classList.remove("is-resizing"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),c!==void 0&&(this.emit("column-resize",r,c),this.emit("columns-change",this.getColumnState()))};document.addEventListener("pointermove",a),document.addEventListener("pointerup",h),this.own(()=>(document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h)))}),this.listen(e,"dblclick",t=>{let i=t.target.closest(".op-grid__resizer");i&&this.setColumnWidth(i.parentElement.dataset.field,void 0)}),this.listen(e,"keydown",t=>{if(!(t.altKey&&t.shiftKey)||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;let i=t.target.closest(".op-grid__hcell"),s=i&&this.config.columns.find(o=>o.field===i.dataset.field);if(!i||!s||!this.canResize(s))return;t.preventDefault();let r=i.getBoundingClientRect().width||s.width||96;this.setColumnWidth(s.field,r+(t.key==="ArrowRight"?16:-16))})}dir(){return getComputedStyle(this.el).direction}moveColumn(e,t){let i=this.config.columns,s=i.find(h=>h.field===e);if(!s||e===t)return;let r=this.userCols(),o=r.indexOf(s),l=[...i.filter(h=>h!==s)],n=t==null?void 0:l.find(h=>h.field===t),c=r.filter(h=>h!==s).pop(),a=n?l.indexOf(n):c?l.indexOf(c)+1:l.length;l.splice(a,0,s),!l.every((h,u)=>h===i[u])&&(this.setColumns(l),this.emit("column-move",e,o,this.userCols().indexOf(s)),this.emit("columns-change",this.getColumnState()))}initColumnDrag(){let e=this.headRow,t=()=>Array.from(e.querySelectorAll(".is-reorderable"));this.listen(e,"pointerdown",i=>{let s=i.target.closest(".is-reorderable");if(!s||i.button||i.target.closest(".op-grid__resizer"))return;let r=s.dataset.field,o=i.clientX,l,n,c=null,a=u=>{if(!l){if(Math.abs(u.clientX-o)<6)return;l=d("div","op-grid__ghost",{},s.textContent??""),n=d("div","op-grid__drop"),this.el.append(l),this.headEl.append(n),s.classList.add("is-dragging-col")}l.style.left=`${u.clientX}px`,l.style.top=`${u.clientY}px`;let p=t(),f=p.find(O=>{let M=O.getBoundingClientRect();return u.clientX<M.left+M.width/2});c=f?f.dataset.field:null;let y=(f??p[p.length-1])?.getBoundingClientRect(),D=this.headEl.getBoundingClientRect();y&&n&&(n.style.left=`${(f?y.left:y.right)-D.left+this.headEl.scrollLeft}px`)},h=()=>{document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h),l&&(l.remove(),n?.remove(),s.classList.remove("is-dragging-col"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),this.moveColumn(r,c))};document.addEventListener("pointermove",a),document.addEventListener("pointerup",h),this.own(()=>(document.removeEventListener("pointermove",a),document.removeEventListener("pointerup",h)))}),this.listen(e,"keydown",i=>{if(!i.altKey||i.shiftKey||i.key!=="ArrowLeft"&&i.key!=="ArrowRight")return;let s=i.target.closest(".is-reorderable");if(!s)return;i.preventDefault();let r=this.userCols(),o=r.findIndex(c=>c.field===s.dataset.field),l=i.key==="ArrowLeft"?o-1:o+1;if(l<0||l>=r.length)return;this.moveColumn(r[o].field,i.key==="ArrowLeft"?r[l].field:r[l+1]?.field??null);let n=e.querySelector(`[data-field="${CSS.escape(r[o].field)}"]`);(n?.querySelector("button")??n)?.focus()})}paintSort(){let e=this.store.getSorters()[0];for(let t of Array.from(this.headRow.children)){let i=!!e&&t.dataset.field===e.field;t.classList.toggle("is-sorted-asc",i&&e.dir==="asc"),t.classList.toggle("is-sorted-desc",i&&e.dir==="desc"),t.classList.contains("is-sortable")&&t.setAttribute("aria-sort",i?e.dir==="asc"?"ascending":"descending":"none")}}sortBy(e){let t=this.store.getSorters()[0],i=t?.field===e.field?t.dir==="asc"?"desc":null:"asc";this.emit("before-sort",e.field,i)!==!1&&(this.store.sort(i?e.field:null,i??void 0),this.emit("sort",e.field,i))}rowIndexOffset(){return this.store.pageSize?(this.store.page-1)*this.store.pageSize:0}renderRow(e,t){let i=this.getRowEntry(t);if(!i)return;let s=i.rec,r=this.cols();e.id=`${this.id}-r${t}`,e.dataset.i=String(t),e.setAttribute("role","row"),e.setAttribute("aria-rowindex",String(this.rowIndexOffset()+t+2));let o=!!s&&this.selected.has(s);e.dataset.ec&&e.classList.remove(...e.dataset.ec.split(" ")),e.dataset.ec=i.cls??"",i.cls&&e.classList.add(...i.cls.split(" "));for(let[n,c]of[["aria-level",i.level],["aria-expanded",i.expanded]])c==null?e.removeAttribute(n):e.setAttribute(n,String(c));e.setAttribute("aria-selected",this.mode()==="none"||!s?"false":String(o)),e.classList.toggle("is-selected",o),e.classList.toggle("is-active",t===this.active),e.classList.toggle("is-odd",t%2===1),(e.dataset.cv!==String(this.cv)||e.dataset.cn!==String(r.length))&&(e.dataset.cv=String(this.cv),e.dataset.cn=String(r.length),e.replaceChildren(...r.map((n,c)=>{let a=d("div",`op-grid__cell${n.align?` op-grid__cell--${n.align}`:""}${n.cls?` ${n.cls}`:""}`,{role:"gridcell","aria-colindex":c+1});return this.lock(a,n,c),a})));let l=Array.from(e.children).filter(n=>n.classList.contains("op-grid__cell"));if(!s){for(let n of l)n.replaceChildren();return i.paint?.(l,e)}r.forEach((n,c)=>{let a=e.children[c];if(a.classList.contains("is-editing"))return;if(n.field===v){let u=a.firstElementChild??a.appendChild(d("input","op-grid__check",{type:"checkbox",tabindex:-1,"aria-label":g("gridSelectRow")}));u.checked=o;return}if(n.field===m){let u=this.config.rowActions??[];if(!this.visibleActions()){a.firstChild||a.append(d("button","op-grid__actbtn",{type:"button",tabindex:-1,"aria-label":g("gridRowActions"),"aria-haspopup":"menu"},C("more")));return}(a.children.length!==u.length||a.firstElementChild?.dataset.a==null)&&a.replaceChildren(...u.map((p,f)=>d("button",`op-grid__actbtn${p.variant==="danger"?" is-danger":""}`,{type:"button",tabindex:-1,"data-a":f,"aria-label":p.text,title:p.text},p.icon?C(p.icon):p.text))),u.forEach((p,f)=>a.children[f].disabled=!!p.disabled?.(s));return}let h=H(n,s);typeof h=="string"?a.textContent=h:a.replaceChildren(h)}),i.paint?.(l,e)}indexOfEvent(e){let t=e.target.closest(".op-grid__body-row");return t?Number(t.dataset.i):-1}onRowEvent(e,t){let i=this.indexOfEvent(e),s=this.recAt(i);if(s){if(t==="row-click"){let r=e.target.closest(".op-grid__actbtn");if(r){if(r.dataset.a==null)return this.openRowMenu(s,r);r.disabled||this.config.rowActions[Number(r.dataset.a)].handler(s,this);return}this.setActive(i,!1),this.pick(i,e)}this.emit(t,s,i,e)}}getSelection(){return[...this.selected]}select(e,t={}){let i=typeof e=="number"?this.recAt(e):e,s=this.mode();!i||s==="none"||((s==="single"||!t.add)&&this.selected.clear(),this.selected.add(i),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.v?.refresh(),this.paintSelection(),this.emit("select",this.getSelection())}selectAllFiltered(){if(this.mode()==="multi"){for(let e of this.store.getFiltered())this.selected.add(e);this.changed()}}pick(e,t){let i=this.mode(),s=this.recAt(e);if(!(!s||i==="none")){if(i==="multi"&&t.shiftKey&&this.anchor>=0){this.config.checkboxSelection||this.selected.clear();for(let r=Math.min(this.anchor,e);r<=Math.max(this.anchor,e);r++){let o=this.recAt(r);o&&this.selected.add(o)}}else i==="multi"&&(t.ctrlKey||t.metaKey||this.config.checkboxSelection)?(this.selected.delete(s)||this.selected.add(s),this.anchor=e):(this.selected.clear(),this.selected.add(s),this.anchor=e);this.changed()}}setActive(e,t=!0){this.active=e,t&&e>=0&&this.v.scrollTo(e),this.v.refresh(),this.updateActiveDescendant()}updateActiveDescendant(){this.active>=0&&this.active<this.count()?this.table.setAttribute("aria-activedescendant",`${this.id}-r${this.active}`):this.table.removeAttribute("aria-activedescendant")}focusRow(e){this.render(),this.setActive(Math.max(0,Math.min(e,this.count()-1))),this.table.focus()}focusEl(){return this.table}scrollToRow(e){this.v?.scrollTo(e)}onKey(e){let t=e.target;if(t.closest(".op-grid__header")||t!==this.table&&t.matches("input:not([type=checkbox]),textarea,select,[contenteditable]"))return;let i=this.count();if(!i)return;if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&this.active>=0&&this.config.rowActions?.length){e.preventDefault();let n=this.recAt(this.active);return n?this.openRowMenu(n,document.getElementById(`${this.id}-r${this.active}`)??this.el):void 0}let s=Math.max(1,Math.floor((this.viewport.clientHeight||400)/this.config.rowHeight||10)),r=this.active<0?0:this.active,o=this.mode(),l={ArrowDown:Math.min(i-1,this.active<0?0:r+1),ArrowUp:Math.max(0,r-1),Home:0,End:i-1,PageDown:Math.min(i-1,r+s),PageUp:Math.max(0,r-s)};if(e.key in l){e.preventDefault();let n=l[e.key];this.setActive(n),(o==="single"||o==="multi"&&!e.ctrlKey&&!e.metaKey&&!this.config.checkboxSelection)&&this.pick(n,e)}else e.key===" "&&this.active>=0?(e.preventDefault(),o==="multi"?this.pick(this.active,{ctrlKey:!0}):this.pick(this.active,e)):e.key==="Enter"&&this.active>=0?this.emit("row-activate",this.recAt(this.active),this.active):(e.key==="a"||e.key==="A")&&(e.ctrlKey||e.metaKey)&&o==="multi"&&(e.preventDefault(),this.store.each(n=>this.selected.add(n)),this.changed())}refresh(){this.v?.refresh()}buildBar(){let e=this.config;if(!this.barEl)return;this.bulkCount=d("span","op-grid__count",{"aria-live":"polite"}),this.selectAllBtn=new b({text:"",variant:"ghost",handler:()=>this.selectAllFiltered()}),this.bulkBtns=(e.bulkActions??[]).map(i=>new b({text:i.text,icon:i.icon,variant:i.variant==="danger"?"danger":"default",handler:()=>i.handler(this.getSelection(),this)}));let t=new b({text:g("gridClearSel"),variant:"ghost",handler:()=>this.deselectAll()});this.bulkEl.append(this.bulkCount,this.selectAllBtn.el,...this.bulkBtns.map(i=>i.el),t.el),this.own(()=>[this.selectAllBtn,...this.bulkBtns,t].forEach(i=>i?.destroy())),e.columnMenu&&this.buildColumnMenu(),this.paintSelection()}paintSelection(){if(!this.rendered)return;let e=this.store.count,t=0;if(this.store.each(r=>this.selected.has(r)&&t++),this.selAll&&(this.selAll.checked=e>0&&t===e,this.selAll.indeterminate=t>0&&t<e),!this.bulkEl)return;let i=this.selected.size;if(this.bulkEl.hidden=!i||!this.config.bulkActions?.length,this.bulkEl.hidden)return;this.bulkCount.textContent=g("gridSelected",{n:i});let s=this.store.getFiltered().length;this.selectAllBtn.el.hidden=!(this.mode()==="multi"&&t===e&&s>e&&i<s),this.selectAllBtn.setText(g("gridSelectAll",{n:s}))}openRowMenu(e,t){this.rowMenu??=new G({}),this.rowMenu.setItems((this.config.rowActions??[]).map(i=>({text:i.text,icon:i.icon,disabled:!!i.disabled?.(e),handler:()=>i.handler(e,this)}))),this.rowMenu.showBy(t)}buildColumnMenu(){let e=new b({text:g("gridColumns"),icon:"columns",variant:"ghost"});this.colSearch=new R({placeholder:g("gridColumnSearch"),clearable:!0}),this.colChips=d("div","op-grid__colchips",{role:"group","aria-label":g("gridGroups")}),this.colList=d("div","op-grid__collist",{role:"group","aria-label":g("gridColumns")});let t=d("div","op-grid__colempty",{},g("gridNoColumns"));t.hidden=!0;let i=d("div","op-grid__colmenu",{},this.colSearch.el,this.colChips,this.colList,t);this.colDd=new $({anchor:e.el,content:i,placement:"bottom-end",role:"dialog",autoFocus:!1}),this.barEl.append(e.el),this.own(()=>e.destroy());let s=()=>{let r=(this.colSearch.getValue()??"").toLowerCase(),o=0,l,n=0,c=()=>l&&(l.hidden=n===0);for(let a of Array.from(this.colList.children)){if(a.classList.contains("op-grid__colgroup")){c(),l=a,n=0;continue}let h=a.dataset.group??"",u=!this.colGroup||h===this.colGroup,p=!r||h.toLowerCase().includes(r)||a.textContent.toLowerCase().includes(r);a.hidden=!(u&&p),a.hidden||(o++,n++)}c(),t.hidden=o>0};this.colSearch.on("change",s),this.listen(this.colChips,"click",r=>{let o=r.target.closest("[data-g]");o&&(this.colGroup=o.dataset.g,this.paintColumnList(),s())}),e.on("click",()=>{if(this.colDd.isOpen())return this.colDd.close();this.colSearch.setValue(""),this.colGroup="",this.paintColumnList(),this.colDd.open(),this.colList.querySelector("input")?.focus()}),this.listen(this.colList,"change",r=>{let o=r.target;if(o.dataset.groupToggle!=null)this.setColumnGroupVisible(o.dataset.groupToggle,o.checked);else{let l=this.config.columns.find(n=>n.field===o.value);if(!l)return;l.hidden=!o.checked,this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}this.paintColumnList(),s()})}paintColumnList(){let e=this.config.columns,t=this.getColumnGroups(),i=this.userCols().length===1?this.userCols()[0]:null,s=o=>{let l=d("input","op-grid__check",{type:"checkbox",value:o.field});return l.checked=!o.hidden,l.disabled=o===i,d("label","op-grid__colitem",{"data-group":o.group??""},l,d("span","",{},o.header??o.field))};if(this.colChips.hidden=t.length<2,this.colChips.replaceChildren(...[["",g("gridGroupAll")],...t.map(o=>[o,o])].map(([o,l])=>d("button",`op-grid__colchip${this.colGroup===o?" is-on":""}`,{type:"button","data-g":o,"aria-pressed":String(this.colGroup===o)},l))),!t.length)return this.colList.replaceChildren(...e.map(s));let r=[];for(let o of[...t,""]){let l=e.filter(a=>(a.group??"")===o);if(!l.length)continue;let n=l.filter(a=>!a.hidden).length,c=d("input","op-grid__check",{type:"checkbox","data-group-toggle":o,"aria-label":o||g("gridOtherCols")});c.checked=n===l.length,c.indeterminate=n>0&&n<l.length,r.push(d("div","op-grid__colgroup",{"data-group":o},d("label","",{},c,d("span","",{},o||g("gridOtherCols"))),d("span","op-grid__colcount",{},`${n}/${l.length}`)),...l.map(s))}this.colList.replaceChildren(...r)}onDestroy(){this.pager?.destroy(),this.rowMenu?.destroy(),this.colDd?.destroy(),this.colSearch?.destroy()}};_("grid",k);export{k as a};
|
|
2
|
-
//# sourceMappingURL=chunk-GFFZTFQH.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/data/grid/grid.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { virtualize, measure } from '../../../core/virtual';\nimport { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport { cellContent, type Column } from '../../../data/column';\nimport { allowed, gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Pagination } from '../pagination/pagination';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Menu } from '../../overlays/menu/menu';\n\naddMessages('en', {\n gridSelected: '{n} selected',\n gridSelectAll: 'Select all {n}',\n gridClearSel: 'Clear selection',\n gridSelectRow: 'Select row',\n gridSelectPage: 'Select all rows',\n gridRowActions: 'Row actions',\n gridColumns: 'Columns',\n gridResize: 'Resize column',\n gridGroupAll: 'All',\n gridOtherCols: 'Other',\n gridGroups: 'Column groups',\n gridColumnSearch: 'Search columns',\n gridNoColumns: 'No matching columns',\n});\naddMessages('pt-BR', {\n gridSelected: '{n} selecionado(s)',\n gridSelectAll: 'Selecionar todos os {n}',\n gridClearSel: 'Limpar sele\u00E7\u00E3o',\n gridSelectRow: 'Selecionar linha',\n gridSelectPage: 'Selecionar todas as linhas',\n gridRowActions: 'A\u00E7\u00F5es da linha',\n gridColumns: 'Colunas',\n gridResize: 'Redimensionar coluna',\n gridGroupAll: 'Todas',\n gridOtherCols: 'Outras',\n gridGroups: 'Grupos de colunas',\n gridColumnSearch: 'Buscar colunas',\n gridNoColumns: 'Nenhuma coluna encontrada',\n});\n\nexport interface GridConfig<T extends Record<string, any> = any> extends ComponentConfig {\n store?: Store<T>;\n /** Used when no `store` is given. */\n data?: Partial<T>[];\n columns: Column<T>[];\n selection?: 'none' | 'single' | 'multi';\n /** Row height in px. Default: measured from the `--op-grid-row-height` / `--op-row-height` tokens. */\n rowHeight?: number;\n /** Adds a Pagination bar bound to the store (give the store a `pageSize`, or set it here). */\n paging?: boolean;\n pageSize?: number;\n emptyText?: string;\n striped?: boolean;\n /** Adds a leading checkbox column with a select-all in the header. Implies multi selection; a row click toggles. */\n checkboxSelection?: boolean;\n /** Keep selected records when the page or the filters change. Default false. */\n keepSelection?: boolean;\n /** Buttons shown in a bar above the header while records are selected. */\n bulkActions?: GridAction<T>[];\n /** Actions at the end of every row (see `rowActionsMode`). */\n rowActions?: GridRowAction<T>[];\n /** Optional features (`cellEditing()`...). See `GridPlugin`. */\n plugins?: GridPlugin<T>[];\n /** `'menu'` (default): one \"\u22EF\" button opens a menu. `'visible'`: every action is an icon button, always shown (dimmed until the row is hovered, active or selected). */\n rowActionsMode?: 'menu' | 'visible';\n /** A \"Columns\" button in the bar: toggle columns on and off, with search. */\n columnMenu?: boolean;\n /** Drag a header to a new place (or Alt+\u2190/\u2192 on a focused header). `column-move` and `columns-change` fire; ViewManager saves the order. */\n reorderableColumns?: boolean;\n /** A handle on each header's edge: drag to resize (double-click resets), Alt+Shift+\u2190/\u2192 on a focused header. Widths are part of `getColumnState`. */\n resizableColumns?: boolean;\n /** Show the group labels (`Column.group`) as a band over the header. Default true when any column has a group. */\n groupHeaders?: boolean;\n}\n\n/** Extends a Grid without growing its base: `init` runs once the grid is rendered and may return a cleanup. */\nexport interface GridPlugin<T extends Record<string, any> = any> {\n init(grid: Grid<T>): void | (() => void);\n destroy?(): void;\n}\n\n/**\n * One displayed row. Without a row layout every store record is a row; a plugin (grouping, tree) replaces the list with\n * its own, mixing records with rows that are not records (a group header, a total).\n */\nexport interface RowEntry<T extends Record<string, any> = any> {\n /** The record this row shows; absent on a header or total row (which cannot be selected). */\n rec?: Model<T>;\n /** `aria-level` and, with `expanded`, `aria-expanded`: for rows that open and close (a group, a tree node). */\n level?: number;\n expanded?: boolean;\n /** Extra classes on the row (`op-grid__row--group`...). */\n cls?: string;\n /** Fills the row's cells after the grid did (or, on a row without a record, instead of it). */\n paint?(cells: HTMLElement[], row: HTMLElement): void;\n}\n\n/** What `cellAt` finds under a DOM node: the row index, its record, the column and the cell element. */\nexport interface GridCell<T extends Record<string, any> = any> {\n index: number;\n record: Model<T>;\n column: Column<T>;\n el: HTMLElement;\n}\n\nexport interface GridAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Left out (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n handler: (records: Model<T>[], grid: Grid<T>) => void;\n}\nexport interface GridRowAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Left out (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n /** Disabled for the records where this returns true. */\n disabled?: (record: Model<T>) => boolean;\n handler: (record: Model<T>, grid: Grid<T>) => void;\n}\nexport interface ColumnState {\n field: string;\n hidden: boolean;\n width?: number;\n locked?: 'start' | 'end';\n}\n\nconst SEL = '__select';\nconst ACT = '__actions';\nconst SEL_COL: Column = { field: SEL, width: 44, align: 'center', cls: 'op-grid__selcell', locked: 'start' };\nconst ACT_COL: Column = { field: ACT, width: 44, align: 'center', cls: 'op-grid__actcell', locked: 'end' };\n\nconst ROW = 'var(--op-grid-row-height, var(--op-row-height))';\n\n/** Data grid with a virtualized body: only the visible rows (plus a small overscan) exist in the DOM. */\n/** `T` is the record shape; `new Grid({ store })` infers it from a typed `Store<T>`. */\nexport class Grid<T extends Record<string, any> = any> extends Component<GridConfig<T>> {\n protected override baseCls = 'op-grid';\n private store!: Store<T>;\n private offStore?: () => void;\n private headEl!: HTMLElement;\n private headRow!: HTMLElement;\n private viewport!: HTMLElement;\n private emptyEl!: HTMLElement;\n /** The focusable `role=grid` part (header + rows); the root also holds the bulk bar and the pager, which a grid may not contain. */\n private table!: HTMLElement;\n private pager?: Pagination;\n private v!: ReturnType<typeof virtualize>;\n private entries?: RowEntry<T>[];\n private lockEdge = [-1, -1];\n private selected = new Set<Model<T>>();\n private active = -1;\n private anchor = -1;\n private justDragged = false;\n private cv = 0; // bumps when the columns change, so pooled rows rebuild their cells\n private selAll?: HTMLInputElement;\n private barEl?: HTMLElement;\n private bulkEl?: HTMLElement;\n private bulkCount?: HTMLElement;\n private bulkBtns: Button[] = [];\n private selectAllBtn?: Button;\n private rowMenu?: Menu;\n private colDd?: Dropdown;\n private colList?: HTMLElement;\n private colSearch?: TextField;\n private colChips?: HTMLElement;\n private colGroup = '';\n\n private cols(): Column[] {\n const c = this.config;\n return [...(c.checkboxSelection ? [SEL_COL] : []), ...this.userCols(), ...(c.rowActions?.length ? [ACT_COL] : [])];\n }\n /** Visible columns; the locked ones are kept together at their edge, whatever the order they were given or dragged to. */\n private userCols(): Column[] {\n const vis = (this.config.columns ?? []).filter((c) => !c.hidden);\n return [...vis.filter((c) => c.locked === 'start'), ...vis.filter((c) => !c.locked), ...vis.filter((c) => c.locked === 'end')];\n }\n private visibleActions(): boolean {\n return this.config.rowActionsMode === 'visible' && !!this.config.rowActions?.length;\n }\n private mode(): 'none' | 'single' | 'multi' {\n return this.config.checkboxSelection ? 'multi' : (this.config.selection ?? 'single');\n }\n\n protected override build() {\n const c = this.config;\n c.rowActions = gate(c.rowActions);\n c.bulkActions = gate(c.bulkActions);\n c.columns = c.columns.filter((col) => allowed(col.permission));\n const el = h('div', this.baseCls);\n this.headRow = h('div', 'op-grid__row op-grid__header-row', { role: 'row' });\n this.headEl = h('div', 'op-grid__header', {}, this.headRow);\n this.viewport = h('div', 'op-grid__viewport');\n this.emptyEl = h('div', 'op-grid__empty');\n if (c.columnMenu || c.bulkActions?.length) {\n this.bulkEl = h('div', 'op-grid__bulk');\n this.bulkEl.hidden = true;\n this.barEl = h('div', 'op-grid__bar', {}, this.bulkEl);\n el.append(this.barEl);\n }\n this.table = h('div', 'op-grid__table', { role: 'grid', tabindex: 0, 'aria-multiselectable': c.selection === 'multi' || c.checkboxSelection ? 'true' : null }, this.headEl, this.viewport, this.emptyEl);\n el.append(this.table);\n el.classList.toggle('op-grid--striped', !!c.striped);\n if (c.paging) {\n this.pager = new Pagination({ cls: 'op-grid__pager' });\n el.append(this.pager.el);\n }\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.bindStore(c.store ?? new Store<T>({ data: c.data ?? [] }));\n this.buildHeader();\n this.buildBar();\n this.v = virtualize({\n scroller: this.viewport,\n count: this.count(),\n rowHeight: c.rowHeight ?? (measure(this.el, ROW) || 36),\n render: (row, i) => this.renderRow(row, i),\n rowCls: 'op-grid__row op-grid__body-row',\n });\n this.own(() => this.v.destroy());\n this.sync();\n\n this.listen(this.viewport, 'scroll', () => this.onScrollX(), { passive: true });\n this.listen(this.viewport, 'click', (e: MouseEvent) => this.onRowEvent(e, 'row-click'));\n this.listen(this.viewport, 'dblclick', (e: MouseEvent) => this.onRowEvent(e, 'row-dblclick'));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.headRow, 'change', (e: Event) => {\n if (e.target !== this.selAll) return;\n if (this.selAll!.checked) this.store.each((r) => this.selected.add(r));\n else if (this.config.keepSelection) this.store.each((r) => this.selected.delete(r));\n else this.selected.clear();\n this.changed();\n });\n if (c.reorderableColumns) this.initColumnDrag();\n if (c.resizableColumns) this.initColumnResize();\n this.listen(this.headRow, 'click', (e: Event) => {\n if (this.justDragged || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-field]');\n const col = cell && this.userCols().find((x) => x.field === cell.dataset.field);\n if (!col) return;\n this.emit('column-click', col);\n if (col.sortable) this.sortBy(col);\n });\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => this.layout());\n ro.observe(this.viewport);\n this.own(() => ro.disconnect());\n }\n if (this.pager) {\n this.pager.setStore(this.store);\n if (!this.store.pageSize) this.store.setPageSize(c.pageSize ?? 20);\n }\n this.own(() => this.pager?.destroy());\n for (const p of c.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n if (p.destroy) this.own(() => p.destroy!());\n }\n }\n\n /** The row, record, column and cell element under a node (e.g. an event target), if it is a body cell. */\n cellAt(node: EventTarget | null): GridCell<T> | undefined {\n const cell = (node as HTMLElement | null)?.closest?.<HTMLElement>('.op-grid__body-row .op-grid__cell');\n const index = Number(cell?.parentElement?.dataset.i);\n const column = cell && this.cols()[Number(cell.getAttribute('aria-colindex')) - 1];\n const record = cell && this.recAt(index);\n return column && record && ![SEL, ACT].includes(column.field) ? { index, record, column, el: cell } : undefined;\n }\n\n /** The body cell of row `index` and column `field`, when that row is in the DOM (rows are virtualized). */\n getCell(index: number, field: string): HTMLElement | undefined {\n const n = this.cols().findIndex((c) => c.field === field);\n return document.getElementById(`${this.id}-r${index}`)?.querySelector<HTMLElement>(`[aria-colindex=\"${n + 1}\"]`) ?? undefined;\n }\n\n /** The visible data columns, in order (no checkbox/action columns). */\n getColumns(): Column<T>[] {\n return this.userCols();\n }\n\n /** The active row index (keyboard cursor), or -1. */\n getActive(): number {\n return this.active;\n }\n\n override notifyMount() {\n super.notifyMount();\n this.layout();\n this.pager?.notifyMount();\n }\n\n /** The header follows the body sideways; its locked cells hold still, and the edges say when there is more to scroll. */\n private onScrollX() {\n const v = this.viewport;\n const end = Math.max(0, v.scrollWidth - v.clientWidth - v.scrollLeft);\n this.headEl.scrollLeft = v.scrollLeft;\n this.el.style.setProperty('--op-grid-scroll-x', `${v.scrollLeft}px`);\n this.el.style.setProperty('--op-grid-scroll-end', `${end}px`);\n this.el.classList.toggle('is-scrolled-start', v.scrollLeft > 0);\n this.el.classList.toggle('is-scrolled-end', end > 0);\n }\n\n /** Re-measures row height and scrollbar (needed after the grid becomes visible or resizes). */\n private layout() {\n if (!this.rendered) return;\n if (!this.config.rowHeight) {\n const hgt = measure(this.el, ROW);\n if (hgt) this.v.setRowHeight(hgt);\n }\n this.headEl.style.paddingInlineEnd = `${this.viewport.offsetWidth - this.viewport.clientWidth}px`;\n this.v.refresh();\n this.onScrollX();\n }\n\n // ---- store ---------------------------------------------------------------------------------\n\n private bindStore(store: Store<T>) {\n this.offStore?.();\n this.store = store;\n const offChange = store.subscribe((c) => {\n if (!this.rendered) return;\n this.sync();\n if (c.type === 'sort') this.paintSort();\n });\n const offLoading = store.on('loading', (on: boolean) => this.setLoading(on));\n this.offStore = () => (offChange(), offLoading());\n this.own(() => this.offStore?.());\n }\n\n /** Brings count, selection and the empty state in line with the store. */\n private sync() {\n const before = this.selected.size;\n if (!this.config.keepSelection) for (const r of this.selected) if (this.store.indexOf(r) < 0) this.selected.delete(r);\n this.active = Math.min(this.active, this.count() - 1);\n this.v.setCount(this.count());\n this.table.setAttribute('aria-rowcount', String(this.store.totalCount + 1));\n this.emptyEl.textContent = this.config.emptyText ?? t('empty');\n this.emptyEl.hidden = this.count() > 0 || !!this.config.loading;\n this.el.classList.toggle('is-empty', this.count() === 0);\n this.updateActiveDescendant();\n this.paintSelection();\n if (this.selected.size !== before) this.emit('select', this.getSelection());\n }\n\n setStore(store: Store<T>) {\n this.config.store = store;\n this.selected.clear();\n this.active = this.anchor = -1;\n if (!this.rendered) return;\n this.bindStore(store);\n this.pager?.setStore(store);\n this.paintSort();\n this.sync();\n }\n getStore(): Store<T> {\n this.render();\n return this.store;\n }\n\n private count(): number {\n return this.entries ? this.entries.length : this.store.count;\n }\n private recAt(i: number): Model<T> | undefined {\n return this.entries ? this.entries[i]?.rec : this.store.getAt(i);\n }\n\n /** For plugins: replaces the displayed rows (`undefined` goes back to one row per store record) and repaints. */\n setRowLayout(rows: RowEntry<T>[] | undefined): void {\n this.entries = rows;\n if (this.rendered) this.sync();\n }\n /** The displayed row `i`: its record, or the header/total a plugin put there. */\n getRowEntry(i: number): RowEntry<T> | undefined {\n return this.entries ? this.entries[i] : ((rec) => rec && { rec })(this.store.getAt(i));\n }\n /** How many rows are displayed (records plus whatever a plugin added). */\n getRowCount(): number {\n return this.count();\n }\n\n // ---- header / columns ----------------------------------------------------------------------\n\n /** Column widths \u2192 the CSS grid template shared by the header and every row. */\n private layoutColumns() {\n const cols = this.cols();\n const n = this.visibleActions() ? this.config.rowActions!.length : 1;\n const wide = (c: Column) => (c.field === ACT ? `calc(${n} * var(--op-grid-action-size) + ${n + 1} * var(--op-grid-action-gap))` : `${c.width}px`);\n const px = (c: Column) => (c.field === ACT ? wide(c) : `${c.width ?? 140}px`);\n const tpl = cols.map((c) => (c.locked ? px(c) : c.width ? `${c.width}px` : `minmax(${c.minWidth ?? 96}px, ${c.flex ?? 1}fr)`)).join(' ');\n // a locked cell sticks at the sum of the locked widths before it (or, for the end, after it)\n const sums = (list: Array<[number, Column]>) => list.reduce<string[]>((acc, [n, c]) => (this.el.style.setProperty(`--op-grid-lock-${n}`, acc.length ? `calc(${acc.join(' + ')})` : '0px'), [...acc, px(c)]), []);\n const at = cols.map((c, n): [number, Column] => [n, c]);\n sums(at.filter(([, c]) => c.locked === 'start'));\n sums(at.filter(([, c]) => c.locked === 'end').reverse());\n this.lockEdge = [cols.map((c) => c.locked).lastIndexOf('start'), cols.findIndex((c) => c.locked === 'end')];\n this.el.style.setProperty('--op-grid-cols', tpl);\n this.el.style.setProperty('--op-grid-min-width', `${cols.reduce((sum, c) => sum + (c.field === ACT ? n * 36 : (c.width ?? (c.locked ? 140 : (c.minWidth ?? 96)))), 0)}px`);\n }\n\n /** Classes and offset of a locked cell (header or body); `n` is the column's place. */\n private lock(cell: HTMLElement, c: Column, n: number) {\n if (!c.locked) return;\n cell.classList.add('is-locked', `is-locked-${c.locked}`);\n cell.classList.toggle('is-lock-edge', this.lockEdge[c.locked === 'start' ? 0 : 1] === n);\n cell.style.setProperty('--_lock', `var(--op-grid-lock-${n})`);\n }\n\n private buildHeader() {\n const cols = this.cols();\n this.layoutColumns();\n this.el.classList.toggle('op-grid--actions-visible', this.visibleActions());\n this.el.classList.toggle('op-grid--reorderable', !!this.config.reorderableColumns);\n this.el.classList.toggle('op-grid--resizable', !!this.config.resizableColumns);\n this.table.setAttribute('aria-colcount', String(cols.length));\n this.selAll = undefined;\n this.headRow.replaceChildren(\n ...cols.map((c, i) => {\n const label = c.header ?? c.field;\n const cell = h('div', `op-grid__cell op-grid__hcell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.sortable ? ' is-sortable' : ''}`, { role: 'columnheader', 'aria-colindex': i + 1, 'data-field': c.field });\n this.lock(cell, c, i);\n if (c.field === SEL) cell.append((this.selAll = h('input', 'op-grid__check', { type: 'checkbox', 'aria-label': t('gridSelectPage') })));\n else if (c.field === ACT) cell.append(h('span', 'op-sr-only', {}, t('gridRowActions')));\n else if (c.sortable) cell.append(h('button', 'op-grid__sort', { type: 'button' }, h('span', 'op-grid__label', {}, label), h('span', 'op-grid__arrow', { 'aria-hidden': 'true' }, iconEl('arrow-up'))));\n else cell.append(h('span', 'op-grid__label', {}, label));\n const user = c.field !== SEL && c.field !== ACT;\n if (this.config.reorderableColumns && user) cell.classList.add('is-reorderable');\n if (this.canResize(c)) {\n cell.append(h('span', 'op-grid__resizer', { role: 'separator', 'aria-orientation': 'vertical', 'aria-label': `${t('gridResize')} ${label}` }));\n }\n // a sortable header already has its button to focus; the others need a tab stop to be moved/resized by keyboard\n if (user && !c.sortable && (this.config.reorderableColumns || this.canResize(c))) cell.tabIndex = 0;\n return cell;\n }),\n );\n const band = this.groupBand(cols);\n this.headEl.replaceChildren(...(band ? [band] : []), this.headRow);\n this.paintSort();\n }\n\n /** Labels over runs of neighbouring columns that share a group (a dragged column can split a group: it shows twice). */\n private groupBand(cols: Column[]): HTMLElement | null {\n if (this.config.groupHeaders === false || !cols.some((c) => c.group)) return null;\n const cells: HTMLElement[] = [];\n let i = 0;\n while (i < cols.length) {\n const g = cols[i].group ?? '';\n let n = 1;\n while (i + n < cols.length && (cols[i + n].group ?? '') === g) n++;\n const cell = h('div', `op-grid__gcell${g ? '' : ' is-empty'}`, { role: 'columnheader', 'aria-colindex': i + 1, 'aria-colspan': n }, g);\n cell.style.gridColumn = `span ${n}`;\n cells.push(cell);\n i += n;\n }\n return h('div', 'op-grid__row op-grid__group-row', { role: 'row' }, ...cells);\n }\n\n /** The group labels in the order they first appear. */\n getColumnGroups(): string[] {\n return [...new Set(this.config.columns.map((c) => c.group).filter((g): g is string => !!g))];\n }\n\n /** Shows or hides every column of a group at once (at least one column always stays visible). */\n setColumnGroupVisible(group: string, visible: boolean): void {\n const cols = this.config.columns.filter((c) => (c.group ?? '') === group);\n if (!cols.length) return;\n for (const c of cols) c.hidden = !visible;\n if (!this.config.columns.some((c) => !c.hidden)) cols[0].hidden = false;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n\n /** Pins a column to the start or the end while the body scrolls sideways (`null` releases it). A locked column needs a `width` (default 140). */\n setColumnLocked(field: string, locked: 'start' | 'end' | null): void {\n const col = this.config.columns.find((c) => c.field === field);\n if (!col || col.locked === (locked ?? undefined)) return;\n this.setColumns(this.config.columns.map((c) => (c === col ? { ...c, locked: locked ?? undefined } : c)));\n this.emit('columns-change', this.getColumnState());\n }\n\n setColumns(columns: Column[]) {\n this.config.columns = columns;\n if (!this.rendered) return;\n this.cv++;\n this.buildHeader();\n this.paintSelection();\n this.v.refresh();\n }\n\n /** Order, visibility and width of every column; save it and give it back to `setColumnState`. */\n getColumnState(): ColumnState[] {\n return this.config.columns.map((c) => ({ field: c.field, hidden: !!c.hidden, width: c.width, locked: c.locked }));\n }\n /** Restores a saved state: columns follow its order (unknown ones keep their place at the end). */\n setColumnState(state: ColumnState[]): void {\n const by = new Map(this.config.columns.map((c) => [c.field, c]));\n const ordered = state.flatMap((s) => {\n const c = by.get(s.field);\n by.delete(s.field);\n return c ? [{ ...c, hidden: s.hidden, width: s.width ?? c.width, locked: 'locked' in s ? s.locked : c.locked }] : [];\n });\n this.setColumns([...ordered, ...by.values()]);\n this.emit('columns-change', this.getColumnState());\n }\n\n // ---- column drag ---------------------------------------------------------------------------\n\n // ---- column resize -------------------------------------------------------------------------\n\n private canResize(c: Column): boolean {\n return !!this.config.resizableColumns && c.field !== SEL && c.field !== ACT && c.resizable !== false;\n }\n\n /** Sets a column's width in px (clamped to `minWidth`/`maxWidth`); `undefined` gives it back its flexible width. */\n setColumnWidth(field: string, width: number | undefined): void {\n const col = this.config.columns.find((x) => x.field === field);\n if (!col) return;\n col.width = width == null ? undefined : Math.round(Math.max(col.minWidth ?? 48, Math.min(width, col.maxWidth ?? Infinity)));\n this.layoutColumns();\n this.emit('column-resize', field, col.width);\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnResize(): void {\n const head = this.headRow;\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (!grip || e.button) return;\n e.preventDefault();\n const cell = grip.parentElement!;\n const field = cell.dataset.field!;\n const col = this.config.columns.find((x) => x.field === field)!;\n const x0 = e.clientX;\n const w0 = cell.getBoundingClientRect().width || col.width || 96; // a flexible column starts from what it shows now\n this.el.classList.add('is-resizing');\n let last = col.width;\n const move = (m: PointerEvent) => {\n // set without events while dragging; one event when it ends\n const w = Math.round(Math.max(col.minWidth ?? 48, Math.min(w0 + (m.clientX - x0) * (this.dir() === 'rtl' ? -1 : 1), col.maxWidth ?? Infinity)));\n col.width = last = w;\n this.layoutColumns();\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n this.el.classList.remove('is-resizing');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n if (last !== undefined) {\n this.emit('column-resize', field, last);\n this.emit('columns-change', this.getColumnState());\n }\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // double-click on the handle: back to the flexible width\n this.listen(head, 'dblclick', (e: Event) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (grip) this.setColumnWidth(grip.parentElement!.dataset.field!, undefined);\n });\n // keyboard: Alt+Shift+\u2190/\u2192 on a focused header\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!(e.altKey && e.shiftKey) || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__hcell');\n const col = cell && this.config.columns.find((x) => x.field === cell.dataset.field);\n if (!cell || !col || !this.canResize(col)) return;\n e.preventDefault();\n const w = cell.getBoundingClientRect().width || col.width || 96;\n this.setColumnWidth(col.field, w + (e.key === 'ArrowRight' ? 16 : -16));\n });\n }\n\n private dir(): string {\n return getComputedStyle(this.el).direction;\n }\n\n /** Moves a (user) column in front of `before` (or to the end when null). Hidden columns keep their places. */\n moveColumn(field: string, before: string | null): void {\n const cols = this.config.columns;\n const col = cols.find((x) => x.field === field);\n if (!col || field === before) return;\n const vis = this.userCols();\n const from = vis.indexOf(col);\n const next = [...cols.filter((x) => x !== col)];\n const target = before == null ? undefined : next.find((x) => x.field === before);\n const lastVis = vis.filter((x) => x !== col).pop();\n const at = target ? next.indexOf(target) : lastVis ? next.indexOf(lastVis) + 1 : next.length;\n next.splice(at, 0, col);\n if (next.every((x, i) => x === cols[i])) return;\n this.setColumns(next);\n this.emit('column-move', field, from, this.userCols().indexOf(col));\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnDrag(): void {\n const head = this.headRow;\n const cellsOf = () => Array.from(head.querySelectorAll<HTMLElement>('.is-reorderable'));\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell || e.button || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const field = cell.dataset.field!;\n const x0 = e.clientX;\n let ghost: HTMLElement | undefined;\n let mark: HTMLElement | undefined;\n let before: string | null = null;\n const move = (m: PointerEvent) => {\n if (!ghost) {\n if (Math.abs(m.clientX - x0) < 6) return; // a click, not a drag\n ghost = h('div', 'op-grid__ghost', {}, cell.textContent ?? '');\n mark = h('div', 'op-grid__drop');\n this.el.append(ghost);\n this.headEl.append(mark);\n cell.classList.add('is-dragging-col');\n }\n ghost.style.left = `${m.clientX}px`;\n ghost.style.top = `${m.clientY}px`;\n // the drop boundary is the nearest cell edge: before the first cell whose middle is right of the pointer\n const cells = cellsOf();\n const hit = cells.find((c) => {\n const r = c.getBoundingClientRect();\n return m.clientX < r.left + r.width / 2;\n });\n before = hit ? hit.dataset.field! : null;\n const edge = hit ?? cells[cells.length - 1];\n const r = edge?.getBoundingClientRect();\n const hr = this.headEl.getBoundingClientRect();\n if (r && mark) mark.style.left = `${(hit ? r.left : r.right) - hr.left + this.headEl.scrollLeft}px`;\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n if (!ghost) return;\n ghost.remove();\n mark?.remove();\n cell.classList.remove('is-dragging-col');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.moveColumn(field, before);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // keyboard: Alt+\u2190 / Alt+\u2192 on a focused header moves its column one step\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey || e.shiftKey || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell) return;\n e.preventDefault();\n const vis = this.userCols();\n const i = vis.findIndex((x) => x.field === cell.dataset.field);\n const j = e.key === 'ArrowLeft' ? i - 1 : i + 1;\n if (j < 0 || j >= vis.length) return;\n this.moveColumn(vis[i].field, e.key === 'ArrowLeft' ? vis[j].field : (vis[j + 1]?.field ?? null));\n const again = head.querySelector<HTMLElement>(`[data-field=\"${CSS.escape(vis[i].field)}\"]`);\n (again?.querySelector<HTMLElement>('button') ?? again)?.focus();\n });\n }\n\n private paintSort() {\n const s = this.store.getSorters()[0];\n for (const cell of Array.from(this.headRow.children) as HTMLElement[]) {\n const on = !!s && cell.dataset.field === s.field;\n cell.classList.toggle('is-sorted-asc', on && s.dir === 'asc');\n cell.classList.toggle('is-sorted-desc', on && s.dir === 'desc');\n if (cell.classList.contains('is-sortable')) cell.setAttribute('aria-sort', on ? (s.dir === 'asc' ? 'ascending' : 'descending') : 'none');\n }\n }\n\n /** asc \u2192 desc \u2192 unsorted. */\n private sortBy(col: Column) {\n const s = this.store.getSorters()[0];\n const dir = s?.field === col.field ? (s.dir === 'asc' ? 'desc' : null) : 'asc';\n if (this.emit('before-sort', col.field, dir) === false) return;\n this.store.sort(dir ? col.field : null, dir ?? undefined);\n this.emit('sort', col.field, dir);\n }\n\n // ---- rows ----------------------------------------------------------------------------------\n\n private rowIndexOffset(): number {\n return this.store.pageSize ? (this.store.page - 1) * this.store.pageSize : 0;\n }\n\n private renderRow(row: HTMLElement, i: number) {\n const entry = this.getRowEntry(i);\n if (!entry) return;\n const rec = entry.rec;\n const cols = this.cols();\n row.id = `${this.id}-r${i}`;\n row.dataset.i = String(i);\n row.setAttribute('role', 'row');\n row.setAttribute('aria-rowindex', String(this.rowIndexOffset() + i + 2));\n const sel = !!rec && this.selected.has(rec);\n if (row.dataset.ec) row.classList.remove(...row.dataset.ec.split(' '));\n row.dataset.ec = entry.cls ?? '';\n if (entry.cls) row.classList.add(...entry.cls.split(' '));\n for (const [a, v] of [['aria-level', entry.level], ['aria-expanded', entry.expanded]] as const) {\n if (v == null) row.removeAttribute(a);\n else row.setAttribute(a, String(v));\n }\n row.setAttribute('aria-selected', this.mode() === 'none' || !rec ? 'false' : String(sel));\n row.classList.toggle('is-selected', sel);\n row.classList.toggle('is-active', i === this.active);\n row.classList.toggle('is-odd', i % 2 === 1);\n if (row.dataset.cv !== String(this.cv) || row.dataset.cn !== String(cols.length)) {\n row.dataset.cv = String(this.cv);\n row.dataset.cn = String(cols.length);\n row.replaceChildren(\n ...cols.map((c, n) => {\n const cell = h('div', `op-grid__cell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.cls ? ` ${c.cls}` : ''}`, { role: 'gridcell', 'aria-colindex': n + 1 });\n this.lock(cell, c, n);\n return cell;\n }),\n );\n }\n const cells = (Array.from(row.children) as HTMLElement[]).filter((c) => c.classList.contains('op-grid__cell')); // a plugin may add its own child (an edit bar)\n if (!rec) {\n for (const cell of cells) cell.replaceChildren();\n return entry.paint?.(cells, row);\n }\n cols.forEach((c, n) => {\n const cell = row.children[n] as HTMLElement;\n if (cell.classList.contains('is-editing')) return; // an editor plugin owns this cell until it finishes\n if (c.field === SEL) {\n const box = (cell.firstElementChild as HTMLInputElement | null) ?? cell.appendChild(h('input', 'op-grid__check', { type: 'checkbox', tabindex: -1, 'aria-label': t('gridSelectRow') }));\n box.checked = sel;\n return;\n }\n if (c.field === ACT) {\n const acts = this.config.rowActions ?? [];\n if (!this.visibleActions()) {\n if (!cell.firstChild) cell.append(h('button', 'op-grid__actbtn', { type: 'button', tabindex: -1, 'aria-label': t('gridRowActions'), 'aria-haspopup': 'menu' }, iconEl('more')));\n return;\n }\n if (cell.children.length !== acts.length || (cell.firstElementChild as HTMLElement | null)?.dataset.a == null) {\n cell.replaceChildren(...acts.map((a, k) => h('button', `op-grid__actbtn${a.variant === 'danger' ? ' is-danger' : ''}`, { type: 'button', tabindex: -1, 'data-a': k, 'aria-label': a.text, title: a.text }, a.icon ? iconEl(a.icon) : a.text)));\n }\n acts.forEach((a, k) => ((cell.children[k] as HTMLButtonElement).disabled = !!a.disabled?.(rec)));\n return;\n }\n const content = cellContent(c, rec);\n if (typeof content === 'string') cell.textContent = content;\n else cell.replaceChildren(content);\n });\n entry.paint?.(cells, row);\n }\n\n private indexOfEvent(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__body-row');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private onRowEvent(e: MouseEvent, name: string) {\n const i = this.indexOfEvent(e);\n const rec = this.recAt(i);\n if (!rec) return;\n if (name === 'row-click') {\n const btn = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-grid__actbtn');\n if (btn) {\n if (btn.dataset.a == null) return this.openRowMenu(rec, btn);\n if (!btn.disabled) this.config.rowActions![Number(btn.dataset.a)].handler(rec, this);\n return;\n }\n this.setActive(i, false);\n this.pick(i, e);\n }\n this.emit(name, rec, i, e);\n }\n\n // ---- selection / keyboard ------------------------------------------------------------------\n\n getSelection(): Model<T>[] {\n return [...this.selected];\n }\n\n /** Selects a record or row index. `add` keeps the current selection (multi mode). */\n select(target: Model<T> | number, opts: { add?: boolean } = {}): void {\n const rec = typeof target === 'number' ? this.recAt(target) : target;\n const mode = this.mode();\n if (!rec || mode === 'none') return;\n if (mode === 'single' || !opts.add) this.selected.clear();\n this.selected.add(rec);\n this.changed();\n }\n\n deselectAll(): void {\n if (!this.selected.size) return;\n this.selected.clear();\n this.changed();\n }\n\n private changed() {\n this.v?.refresh();\n this.paintSelection();\n this.emit('select', this.getSelection());\n }\n\n /** Selects every record that matches the filters, across pages (a remote store: the loaded page). */\n selectAllFiltered(): void {\n if (this.mode() !== 'multi') return;\n for (const r of this.store.getFiltered()) this.selected.add(r);\n this.changed();\n }\n\n /** Click semantics: plain = replace, ctrl/meta = toggle, shift = range from the anchor (multi only). */\n private pick(i: number, e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean }) {\n const mode = this.mode();\n const rec = this.recAt(i);\n if (!rec || mode === 'none') return;\n if (mode === 'multi' && e.shiftKey && this.anchor >= 0) {\n if (!this.config.checkboxSelection) this.selected.clear();\n for (let k = Math.min(this.anchor, i); k <= Math.max(this.anchor, i); k++) {\n const r = this.recAt(k);\n if (r) this.selected.add(r);\n }\n } else if (mode === 'multi' && (e.ctrlKey || e.metaKey || this.config.checkboxSelection)) {\n if (!this.selected.delete(rec)) this.selected.add(rec);\n this.anchor = i;\n } else {\n this.selected.clear();\n this.selected.add(rec);\n this.anchor = i;\n }\n this.changed();\n }\n\n private setActive(i: number, scroll = true) {\n this.active = i;\n if (scroll && i >= 0) this.v.scrollTo(i);\n this.v.refresh();\n this.updateActiveDescendant();\n }\n\n private updateActiveDescendant() {\n if (this.active >= 0 && this.active < this.count()) this.table.setAttribute('aria-activedescendant', `${this.id}-r${this.active}`);\n else this.table.removeAttribute('aria-activedescendant');\n }\n\n focusRow(i: number) {\n this.render();\n this.setActive(Math.max(0, Math.min(i, this.count() - 1)));\n this.table.focus();\n }\n\n protected override focusEl(): HTMLElement {\n return this.table;\n }\n\n scrollToRow(i: number) {\n this.v?.scrollTo(i);\n }\n\n private onKey(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (target.closest('.op-grid__header')) return; // header buttons keep their own keys\n if (target !== this.table && target.matches('input:not([type=checkbox]),textarea,select,[contenteditable]')) return; // an editor in a cell keeps its keys\n const n = this.count();\n if (!n) return;\n if ((e.key === 'ContextMenu' || (e.shiftKey && e.key === 'F10')) && this.active >= 0 && this.config.rowActions?.length) {\n e.preventDefault();\n const arec = this.recAt(this.active);\n if (!arec) return;\n return this.openRowMenu(arec, document.getElementById(`${this.id}-r${this.active}`) ?? this.el);\n }\n const page = Math.max(1, Math.floor((this.viewport.clientHeight || 400) / this.config.rowHeight! || 10));\n const cur = this.active < 0 ? 0 : this.active;\n const mode = this.mode();\n const targets: Record<string, number> = {\n ArrowDown: Math.min(n - 1, this.active < 0 ? 0 : cur + 1),\n ArrowUp: Math.max(0, cur - 1),\n Home: 0,\n End: n - 1,\n PageDown: Math.min(n - 1, cur + page),\n PageUp: Math.max(0, cur - page),\n };\n if (e.key in targets) {\n e.preventDefault();\n const to = targets[e.key];\n this.setActive(to);\n if (mode === 'single' || (mode === 'multi' && !e.ctrlKey && !e.metaKey && !this.config.checkboxSelection)) this.pick(to, e);\n } else if (e.key === ' ' && this.active >= 0) {\n e.preventDefault();\n if (mode === 'multi') this.pick(this.active, { ctrlKey: true });\n else this.pick(this.active, e);\n } else if (e.key === 'Enter' && this.active >= 0) {\n this.emit('row-activate', this.recAt(this.active), this.active);\n } else if ((e.key === 'a' || e.key === 'A') && (e.ctrlKey || e.metaKey) && mode === 'multi') {\n e.preventDefault();\n this.store.each((r) => this.selected.add(r));\n this.changed();\n }\n }\n\n refresh() {\n this.v?.refresh();\n }\n\n // ---- bar: bulk actions and the column menu ------------------------------------------------\n\n private buildBar() {\n const c = this.config;\n if (!this.barEl) return;\n this.bulkCount = h('span', 'op-grid__count', { 'aria-live': 'polite' });\n this.selectAllBtn = new Button({ text: '', variant: 'ghost', handler: () => this.selectAllFiltered() });\n this.bulkBtns = (c.bulkActions ?? []).map((a) => new Button({ text: a.text, icon: a.icon, variant: a.variant === 'danger' ? 'danger' : 'default', handler: () => a.handler(this.getSelection(), this) }));\n const clear = new Button({ text: t('gridClearSel'), variant: 'ghost', handler: () => this.deselectAll() });\n this.bulkEl!.append(this.bulkCount, this.selectAllBtn.el, ...this.bulkBtns.map((b) => b.el), clear.el);\n this.own(() => [this.selectAllBtn, ...this.bulkBtns, clear].forEach((b) => b?.destroy()));\n if (c.columnMenu) this.buildColumnMenu();\n this.paintSelection();\n }\n\n /** Header checkbox state and the bulk bar, from the current selection. */\n private paintSelection() {\n if (!this.rendered) return;\n const n = this.store.count;\n let k = 0;\n this.store.each((r) => this.selected.has(r) && k++);\n if (this.selAll) {\n this.selAll.checked = n > 0 && k === n;\n this.selAll.indeterminate = k > 0 && k < n;\n }\n if (!this.bulkEl) return;\n const size = this.selected.size;\n this.bulkEl.hidden = !size || !this.config.bulkActions?.length;\n if (this.bulkEl.hidden) return;\n this.bulkCount!.textContent = t('gridSelected', { n: size });\n const more = this.store.getFiltered().length;\n this.selectAllBtn!.el.hidden = !(this.mode() === 'multi' && k === n && more > n && size < more);\n this.selectAllBtn!.setText(t('gridSelectAll', { n: more }));\n }\n\n private openRowMenu(rec: Model<T>, btn: HTMLElement) {\n this.rowMenu ??= new Menu({});\n this.rowMenu.setItems((this.config.rowActions ?? []).map((a) => ({ text: a.text, icon: a.icon, disabled: !!a.disabled?.(rec), handler: () => a.handler(rec, this) })));\n this.rowMenu.showBy(btn);\n }\n private buildColumnMenu() {\n const btn = new Button({ text: t('gridColumns'), icon: 'columns', variant: 'ghost' });\n this.colSearch = new TextField({ placeholder: t('gridColumnSearch'), clearable: true });\n this.colChips = h('div', 'op-grid__colchips', { role: 'group', 'aria-label': t('gridGroups') });\n this.colList = h('div', 'op-grid__collist', { role: 'group', 'aria-label': t('gridColumns') });\n const none = h('div', 'op-grid__colempty', {}, t('gridNoColumns'));\n none.hidden = true;\n const panel = h('div', 'op-grid__colmenu', {}, this.colSearch.el, this.colChips, this.colList, none);\n this.colDd = new Dropdown({ anchor: btn.el, content: panel, placement: 'bottom-end', role: 'dialog', autoFocus: false });\n this.barEl!.append(btn.el);\n this.own(() => btn.destroy());\n /** Search text and the group chip decide what is listed; a search that names a group shows the whole group. */\n const filter = () => {\n const q = (this.colSearch!.getValue() ?? '').toLowerCase();\n let shown = 0;\n let head: HTMLElement | undefined;\n let rowsInGroup = 0;\n const closeGroup = () => head && (head.hidden = rowsInGroup === 0);\n for (const el of Array.from(this.colList!.children) as HTMLElement[]) {\n if (el.classList.contains('op-grid__colgroup')) {\n closeGroup();\n head = el;\n rowsInGroup = 0;\n continue;\n }\n const g = el.dataset.group ?? '';\n const byChip = !this.colGroup || g === this.colGroup;\n const byText = !q || g.toLowerCase().includes(q) || el.textContent!.toLowerCase().includes(q);\n el.hidden = !(byChip && byText);\n if (!el.hidden) (shown++, rowsInGroup++);\n }\n closeGroup();\n none.hidden = shown > 0;\n };\n this.colSearch.on('change', filter);\n this.listen(this.colChips, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-g]');\n if (!b) return;\n this.colGroup = b.dataset.g!;\n this.paintColumnList();\n filter();\n });\n btn.on('click', () => {\n if (this.colDd!.isOpen()) return this.colDd!.close();\n this.colSearch!.setValue('');\n this.colGroup = '';\n this.paintColumnList();\n this.colDd!.open();\n this.colList!.querySelector<HTMLElement>('input')?.focus(); // not the search field: a phone keyboard would cover the list\n });\n this.listen(this.colList, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.dataset.groupToggle != null) this.setColumnGroupVisible(input.dataset.groupToggle, input.checked);\n else {\n const col = this.config.columns.find((x) => x.field === input.value);\n if (!col) return;\n col.hidden = !input.checked;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n this.paintColumnList();\n filter();\n });\n }\n\n private paintColumnList() {\n const cols = this.config.columns;\n const groups = this.getColumnGroups();\n const last = this.userCols().length === 1 ? this.userCols()[0] : null; // at least one column stays visible\n const row = (c: Column) => {\n const box = h('input', 'op-grid__check', { type: 'checkbox', value: c.field });\n box.checked = !c.hidden;\n box.disabled = c === last;\n return h('label', 'op-grid__colitem', { 'data-group': c.group ?? '' }, box, h('span', '', {}, c.header ?? c.field));\n };\n this.colChips!.hidden = groups.length < 2;\n this.colChips!.replaceChildren(...[['', t('gridGroupAll')], ...groups.map((g) => [g, g])].map(([g, label]) => h('button', `op-grid__colchip${this.colGroup === g ? ' is-on' : ''}`, { type: 'button', 'data-g': g, 'aria-pressed': String(this.colGroup === g) }, label)));\n if (!groups.length) return this.colList!.replaceChildren(...cols.map(row));\n const out: HTMLElement[] = [];\n for (const g of [...groups, '']) {\n const items = cols.filter((c) => (c.group ?? '') === g);\n if (!items.length) continue;\n const on = items.filter((c) => !c.hidden).length;\n const toggle = h('input', 'op-grid__check', { type: 'checkbox', 'data-group-toggle': g, 'aria-label': g || t('gridOtherCols') });\n toggle.checked = on === items.length;\n toggle.indeterminate = on > 0 && on < items.length;\n out.push(h('div', 'op-grid__colgroup', { 'data-group': g }, h('label', '', {}, toggle, h('span', '', {}, g || t('gridOtherCols'))), h('span', 'op-grid__colcount', {}, `${on}/${items.length}`)), ...items.map(row));\n }\n this.colList!.replaceChildren(...out);\n }\n\n protected override onDestroy() {\n this.pager?.destroy();\n this.rowMenu?.destroy();\n this.colDd?.destroy();\n this.colSearch?.destroy();\n }\n}\nregister('grid', Grid);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "SEL", "ACT", "SEL_COL", "ACT_COL", "ROW", "Grid", "Component", "c", "vis", "gate", "col", "allowed", "el", "h", "Pagination", "Store", "virtualize", "measure", "row", "e", "r", "cell", "x", "ro", "p", "off", "node", "index", "column", "record", "field", "n", "v", "end", "hgt", "store", "offChange", "offLoading", "on", "before", "t", "i", "rows", "rec", "cols", "wide", "px", "tpl", "sums", "list", "acc", "at", "sum", "label", "iconEl", "user", "band", "cells", "g", "group", "visible", "locked", "columns", "state", "by", "ordered", "width", "head", "grip", "x0", "w0", "last", "move", "m", "w", "up", "from", "next", "target", "lastVis", "cellsOf", "ghost", "mark", "hit", "hr", "j", "again", "s", "dir", "entry", "sel", "a", "box", "acts", "k", "content", "cellContent", "name", "btn", "opts", "mode", "scroll", "arec", "page", "cur", "targets", "to", "Button", "clear", "b", "size", "more", "Menu", "TextField", "none", "panel", "Dropdown", "filter", "q", "shown", "rowsInGroup", "closeGroup", "byChip", "byText", "input", "groups", "out", "items", "toggle", "register"]
|
|
7
|
-
}
|
package/dist/chunk-PMOXLQ72.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as u}from"./chunk-3QRA3XOA.js";import{c as o}from"./chunk-DIOJGTUN.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{b as c}from"./chunk-XQHATUKN.js";import{f as h}from"./chunk-UDXO3KM3.js";import{b as e}from"./chunk-PZSHOSOS.js";import{d as p,e as s,f as a}from"./chunk-S4QD5NID.js";s("en",{statUp:"up {n}",statDown:"down {n}",statFlat:"unchanged"});s("pt-BR",{statUp:"subiu {n}",statDown:"caiu {n}",statFlat:"sem varia\xE7\xE3o"});var l=class extends h{baseCls="op-stat";labelEl;valueEl;deltaEl;captionEl;chart;build(){return this.labelEl=e("div","op-stat__label"),this.valueEl=e("div","op-stat__value"),this.deltaEl=e("span","op-stat__delta"),this.captionEl=e("span","op-stat__caption"),e("div",this.baseCls,{},this.labelEl,e("div","op-stat__row",{},this.valueEl,this.deltaEl),this.captionEl)}onRender(){let t=this.config;this.setLabel(t.label),this.setValue(t.value??null),this.setDelta(t.delta),this.setCaption(t.caption??""),this.setTrend(t.trend)}setLabel(t){this.config.label=t,this.rendered&&this.labelEl.replaceChildren(...this.config.icon?[o(this.config.icon)]:[],t)}setValue(t){this.config.value=t,this.rendered&&(this.valueEl.textContent=t==null?"\u2014":typeof t=="number"?c(this.config.format??"number",t):t)}setDelta(t){if(this.config.delta=t,!this.rendered)return;let i=(t??0)>0,r=(this.config.good??"up")==="up"?i:!i;if(this.deltaEl.hidden=t==null,this.deltaEl.className=`op-stat__delta ${t?r?"is-good":"is-bad":"is-flat"}`,t==null)return;let n=new Intl.NumberFormat(p()._lang,{style:"percent",maximumFractionDigits:1,signDisplay:"exceptZero"}).format(t);this.deltaEl.replaceChildren(o(t?i?"arrow-up":"arrow-down":"minus"),e("span","",{"aria-hidden":"true"},n),e("span","op-sr-only",{},t?a(i?"statUp":"statDown",{n:n.replace(/^[+-]/,"")}):a("statFlat")))}setCaption(t){this.config.caption=t,this.rendered&&(this.captionEl.textContent=t,this.captionEl.hidden=!t)}setTrend(t){if(this.config.trend=t,!this.rendered)return;if(!t?.length)return this.chart?.destroy(),void(this.chart=void 0);let i=t.map((r,n)=>({i:n,v:r}));if(this.chart)return this.chart.setData(i);this.chart=new u({kind:"sparkline",x:"i",series:["v"],data:i,cls:"op-stat__spark",ariaLabel:this.config.label}),this.el.append(this.chart.el),this.chart.notifyMount()}onDestroy(){this.chart?.destroy()}};d("stat",l);export{l as a};
|
|
2
|
-
//# sourceMappingURL=chunk-PMOXLQ72.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/charts/stat/stat.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport { format, type Formatter } from '../../../data/format';\nimport { iconEl } from '../../base/icon/icon';\nimport { Chart } from '../chart/chart';\n\naddMessages('en', { statUp: 'up {n}', statDown: 'down {n}', statFlat: 'unchanged' });\naddMessages('pt-BR', { statUp: 'subiu {n}', statDown: 'caiu {n}', statFlat: 'sem varia\u00E7\u00E3o' });\n\nexport interface StatConfig extends ComponentConfig {\n label: string;\n value?: number | string | null;\n /** Name of a registered format (`money`, `percent`...) or a function, for a numeric `value`. */\n format?: string | Formatter;\n /** The change since the last period, as a fraction (`0.125` shows `+12.5%`). */\n delta?: number;\n /** Which way is good news. `down` for costs, errors or waiting times. Default `up`. */\n good?: 'up' | 'down';\n /** Small text under the value (\"vs last week\"). */\n caption?: string;\n icon?: string;\n /** Numbers for a sparkline beside the value. */\n trend?: number[];\n}\n\n/** A KPI tile: a label, a big value, the change since last time and an optional sparkline. */\nexport class Stat extends Component<StatConfig> {\n protected override baseCls = 'op-stat';\n private labelEl!: HTMLElement;\n private valueEl!: HTMLElement;\n private deltaEl!: HTMLElement;\n private captionEl!: HTMLElement;\n private chart?: Chart;\n\n protected override build() {\n this.labelEl = h('div', 'op-stat__label');\n this.valueEl = h('div', 'op-stat__value');\n this.deltaEl = h('span', 'op-stat__delta');\n this.captionEl = h('span', 'op-stat__caption');\n return h('div', this.baseCls, {}, this.labelEl, h('div', 'op-stat__row', {}, this.valueEl, this.deltaEl), this.captionEl);\n }\n\n protected override onRender() {\n const c = this.config;\n this.setLabel(c.label);\n this.setValue(c.value ?? null);\n this.setDelta(c.delta);\n this.setCaption(c.caption ?? '');\n this.setTrend(c.trend);\n }\n\n setLabel(label: string) {\n this.config.label = label;\n if (!this.rendered) return;\n this.labelEl.replaceChildren(...(this.config.icon ? [iconEl(this.config.icon)] : []), label);\n }\n\n setValue(value: number | string | null) {\n this.config.value = value;\n if (this.rendered) this.valueEl.textContent = value == null ? '\u2014' : typeof value === 'number' ? format(this.config.format ?? 'number', value) : value;\n }\n\n setDelta(delta: number | undefined) {\n this.config.delta = delta;\n if (!this.rendered) return;\n const up = (delta ?? 0) > 0;\n const good = (this.config.good ?? 'up') === 'up' ? up : !up;\n this.deltaEl.hidden = delta == null;\n this.deltaEl.className = `op-stat__delta ${!delta ? 'is-flat' : good ? 'is-good' : 'is-bad'}`;\n if (delta == null) return;\n const text = new Intl.NumberFormat(getLocale()._lang, { style: 'percent', maximumFractionDigits: 1, signDisplay: 'exceptZero' }).format(delta);\n this.deltaEl.replaceChildren(iconEl(!delta ? 'minus' : up ? 'arrow-up' : 'arrow-down'), h('span', '', { 'aria-hidden': 'true' }, text), h('span', 'op-sr-only', {}, !delta ? t('statFlat') : t(up ? 'statUp' : 'statDown', { n: text.replace(/^[+-]/, '') })));\n }\n\n setCaption(caption: string) {\n this.config.caption = caption;\n if (this.rendered) {\n this.captionEl.textContent = caption;\n this.captionEl.hidden = !caption;\n }\n }\n\n setTrend(trend: number[] | undefined) {\n this.config.trend = trend;\n if (!this.rendered) return;\n if (!trend?.length) return void (this.chart?.destroy(), (this.chart = undefined));\n const data = trend.map((v, i) => ({ i, v }));\n if (this.chart) return this.chart.setData(data);\n this.chart = new Chart({ kind: 'sparkline', x: 'i', series: ['v'], data, cls: 'op-stat__spark', ariaLabel: this.config.label });\n this.el.append(this.chart.el);\n this.chart.notifyMount();\n }\n\n protected override onDestroy() {\n this.chart?.destroy();\n }\n}\nregister('stat', Stat);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "Stat", "Component", "h", "c", "label", "iconEl", "value", "format", "delta", "up", "good", "text", "getLocale", "t", "caption", "trend", "data", "v", "i", "Chart", "register"]
|
|
7
|
-
}
|
package/dist/chunk-SB4ICXBV.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as T}from"./chunk-DIOJGTUN.js";import{a as E}from"./chunk-TIPK3SCJ.js";import{f as I}from"./chunk-UDXO3KM3.js";import{b as s}from"./chunk-PZSHOSOS.js";import{d as _,e as b,f}from"./chunk-S4QD5NID.js";b("en",{timeline:"Timeline",tlNow:"Now",tlFromTo:"{from} to {to}"});b("pt-BR",{timeline:"Linha do tempo",tlNow:"Agora",tlFromTo:"{from} at\xE9 {to}"});var C=/^\d{1,2}:\d{2}$/,d=a=>String(a).padStart(2,"0"),w=864e5,$=(a,e)=>/^\d{4}-\d{2}/.test(a)&&!isNaN(+new Date(a))?new Intl.DateTimeFormat(_()._lang,e).format(new Date(/^\d{4}-\d{2}-\d{2}$/.test(a)?`${a}T00:00`:a)):a,M=class extends I{baseCls="op-timeline";items=[];scale;build(){return s("div",this.baseCls)}onRender(){this.el.classList.add(`op-timeline--${this.config.mode??"list"}`);let e=this.config.store;e&&this.own(e.subscribe(()=>this.setItems(e.getFiltered().map(i=>i.data)))),this.setItems(e?e.getFiltered().map(i=>i.data):this.config.items??[]);for(let i of this.config.plugins??[]){let l=i.init(this);l&&this.own(l)}this.listen(this.el,"click",i=>this.pick(i.target)),this.listen(this.el,"keydown",i=>i.key==="Enter"&&this.pick(i.target))}pick(e){let i=Number(e.closest("[data-i]")?.dataset.i);this.items[i]&&this.emit("select",this.items[i])}getItems(){return this.items}getScale(){return this.scale}setItems(e){this.items=e,this.rendered&&this.paint()}paint(){this.el.setAttribute("role","list"),this.el.setAttribute("aria-label",this.config.ariaLabel??f("timeline")),this.el.replaceChildren(...this.config.mode==="range"?this.range():this.list()),this.emit("paint")}list(){return this.items.map((e,i)=>s("div",`op-timeline__item${e.tone&&e.tone!=="default"?` is-${e.tone}`:""}`,{role:"listitem","data-i":i,tabindex:0},s("div","op-timeline__when",{},e.time?$(e.time,/T/.test(e.time)?{dateStyle:"medium",timeStyle:"short"}:{dateStyle:"medium"}):""),s("div","op-timeline__marker",{"aria-hidden":"true"},e.icon?T(e.icon):null),s("div","op-timeline__body",{},s("div","op-timeline__title",{},e.title),e.text?s("div","op-timeline__text",{},e.text):null)))}range(){let e=this.config,i=C.test(e.from??this.items.find(t=>t.start)?.start??""),l=t=>i?(Number(t.slice(0,-3))*60+Number(t.slice(-2)))*6e4:+new Date(/^\d{4}-\d{2}-\d{2}$/.test(t)?`${t}T00:00`:t),c=this.items.filter(t=>t.start).map(t=>({x:t,a:l(t.start),b:l(t.end??t.start)+(!i&&t.end&&/^\d{4}-\d{2}-\d{2}$/.test(t.end)?w:0)}));if(!c.length&&!(e.from&&e.to))return[];let r=e.from?l(e.from):Math.min(...c.map(t=>t.a)),m=e.to?l(e.to)+(/^\d{4}-\d{2}-\d{2}$/.test(e.to)?w:0):Math.max(...c.map(t=>t.b),r+1),p=t=>`${(Math.min(Math.max((t-r)/(m-r),0),1)*100).toFixed(3)}%`,D=[...e.lanes??[],...c.map(t=>t.x.lane??"").filter((t,o,n)=>n.indexOf(t)===o&&!(e.lanes??[]).includes(t))];this.scale={lo:r,hi:m,clock:i,parse:l,format:t=>i?`${d(Math.floor(t/36e5))}:${d(Math.round(t/6e4)%60)}`:(o=>`${o.getFullYear()}-${d(o.getMonth()+1)}-${d(o.getDate())}T${d(o.getHours())}:${d(o.getMinutes())}`)(new Date(t))};let y=!i&&m-r>62*w,v=[],S=(t,o)=>{let n=s("span","op-timeline__tick",{},o);n.style.insetInlineStart=p(t),v.push(n)};if(i)for(let t=Math.ceil(r/36e5)*36e5,o=(m-r)/36e5>14?72e5:36e5;t<m;t+=o)S(t,this.scale.format(t));else for(let t=new Date(r);+t<m;y?t.setMonth(t.getMonth()+1,1):t.setDate(t.getDate()+1))t.setHours(0,0,0,0),!(+t<r)&&S(+t,new Intl.DateTimeFormat(_()._lang,y?{month:"short"}:{day:"numeric",month:"short"}).format(t));let g=[s("div","op-timeline__axis",{},s("span","op-timeline__lane-name"),s("div","op-timeline__track",{"aria-hidden":"true"},...v))];for(let t of D){let o=c.filter(n=>(n.x.lane??"")===t).map(({x:n,a:k,b:L})=>{let h=s("div",`op-timeline__bar${n.tone&&n.tone!=="default"?` is-${n.tone}`:""}`,{role:"listitem",tabindex:0,"data-i":this.items.indexOf(n),"aria-label":`${n.title}, ${f("tlFromTo",{from:$(n.start,{dateStyle:"medium",timeStyle:/T/.test(n.start)?"short":void 0}),to:$(n.end??n.start,{dateStyle:"medium",timeStyle:/T/.test(n.end??"")?"short":void 0})})}`},n.icon?T(n.icon):null,s("span","op-timeline__bar-text",{},n.title));return h.title=n.text??n.title,h.style.insetInlineStart=p(k),h.style.insetInlineEnd=`calc(100% - ${p(Math.max(L,k+(m-r)/200))})`,h});g.push(s("div","op-timeline__lane",{role:"group","aria-label":t},s("span","op-timeline__lane-name",{},t),s("div","op-timeline__track",{},...o)))}let u=Date.now();if(e.now!==!1&&!i&&u>=r&&u<=m){let t=s("div","op-timeline__now",{"aria-hidden":"true",title:f("tlNow")});t.style.insetInlineStart=p(u),g.push(s("div","op-timeline__nowrow",{"aria-hidden":"true"},s("span","op-timeline__lane-name"),s("div","op-timeline__track",{},t)))}return g}};E("timeline",M);export{M as a};
|
|
2
|
-
//# sourceMappingURL=chunk-SB4ICXBV.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/data/timeline/timeline.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', { timeline: 'Timeline', tlNow: 'Now', tlFromTo: '{from} to {to}' });\naddMessages('pt-BR', { timeline: 'Linha do tempo', tlNow: 'Agora', tlFromTo: '{from} at\u00E9 {to}' });\n\nexport interface TimelineItem {\n id?: string | number;\n title: string;\n text?: string;\n icon?: string;\n tone?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n /** `list`: when it happened (an ISO date or time, or any text). */\n time?: string;\n /** `range`: ISO dates or date-times. */\n start?: string;\n end?: string;\n /** `range`: the row (a person, a room, a phase). */\n lane?: string;\n}\n\nexport interface TimelineConfig extends ComponentConfig {\n /** `list`: events one under the other, with a marker (default). `range`: a schedule: bars over a time axis, one row per `lane`. */\n mode?: 'list' | 'range';\n items?: TimelineItem[];\n /** Items from a Store (its records are `TimelineItem`s). */\n store?: Store<any>;\n /** `range`: the order of the rows. Default: order of appearance. */\n lanes?: string[];\n /** `range`: the window shown. Default: from the first start to the last end. */\n from?: string;\n to?: string;\n /** `range`: a marker at the current time. Default true. */\n now?: boolean;\n /** Optional features (`timeEntry()`...). See `TimelinePlugin`. */\n plugins?: TimelinePlugin[];\n}\n\n/** Extends a Timeline without growing its base: `init` runs once it is rendered and may return a cleanup. The timeline fires `paint` after every repaint. */\nexport interface TimelinePlugin {\n init(timeline: Timeline): void | (() => void);\n}\n\n/** The time axis of a `range` timeline: its ends in ms, and how to read and write the item dates (`clock`: `'HH:mm'` of one day, else ISO). */\nexport interface TimelineScale {\n lo: number;\n hi: number;\n clock: boolean;\n parse(v: string): number;\n format(ms: number): string;\n}\n\nconst CLOCK = /^\\d{1,2}:\\d{2}$/;\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst DAY = 86400000;\nconst when = (v: string, o: Intl.DateTimeFormatOptions) => (/^\\d{4}-\\d{2}/.test(v) && !isNaN(+new Date(v)) ? new Intl.DateTimeFormat(getLocale()._lang, o).format(new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v)) : v);\n\n/** Events as a vertical list, or a schedule (phases, staff shifts) as bars on a time axis. Click or Enter on an item fires `select`. */\nexport class Timeline extends Component<TimelineConfig> {\n protected override baseCls = 'op-timeline';\n private items: TimelineItem[] = [];\n private scale?: TimelineScale;\n\n protected override build() {\n return h('div', this.baseCls);\n }\n\n protected override onRender() {\n this.el.classList.add(`op-timeline--${this.config.mode ?? 'list'}`);\n const store = this.config.store;\n if (store) this.own(store.subscribe(() => this.setItems(store.getFiltered().map((r) => r.data))));\n this.setItems(store ? store.getFiltered().map((r) => r.data) : (this.config.items ?? []));\n for (const p of this.config.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n }\n this.listen(this.el, 'click', (e: Event) => this.pick(e.target as HTMLElement));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => e.key === 'Enter' && this.pick(e.target as HTMLElement));\n }\n\n private pick(el: HTMLElement) {\n const i = Number(el.closest<HTMLElement>('[data-i]')?.dataset.i);\n if (this.items[i]) this.emit('select', this.items[i]);\n }\n\n getItems(): TimelineItem[] {\n return this.items;\n }\n\n /** The time axis of a `range` timeline (set by the last paint), for plugins. */\n getScale(): TimelineScale | undefined {\n return this.scale;\n }\n\n setItems(items: TimelineItem[]) {\n this.items = items;\n if (this.rendered) this.paint();\n }\n\n private paint() {\n this.el.setAttribute('role', 'list');\n this.el.setAttribute('aria-label', this.config.ariaLabel ?? t('timeline'));\n this.el.replaceChildren(...(this.config.mode === 'range' ? this.range() : this.list()));\n this.emit('paint');\n }\n\n private list(): HTMLElement[] {\n return this.items.map((it, i) =>\n h('div', `op-timeline__item${it.tone && it.tone !== 'default' ? ` is-${it.tone}` : ''}`, { role: 'listitem', 'data-i': i, tabindex: 0 },\n h('div', 'op-timeline__when', {}, it.time ? when(it.time, /T/.test(it.time) ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }) : ''),\n h('div', 'op-timeline__marker', { 'aria-hidden': 'true' }, it.icon ? iconEl(it.icon) : null),\n h('div', 'op-timeline__body', {}, h('div', 'op-timeline__title', {}, it.title), it.text ? h('div', 'op-timeline__text', {}, it.text) : null),\n ),\n );\n }\n\n private range(): HTMLElement[] {\n const c = this.config;\n const clock = CLOCK.test(c.from ?? this.items.find((x) => x.start)?.start ?? '');\n const ms = (v: string) => (clock ? (Number(v.slice(0, -3)) * 60 + Number(v.slice(-2))) * 60000 : +new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v));\n const spans = this.items.filter((x) => x.start).map((x) => ({ x, a: ms(x.start!), b: ms(x.end ?? x.start!) + (!clock && x.end && /^\\d{4}-\\d{2}-\\d{2}$/.test(x.end) ? DAY : 0) }));\n if (!spans.length && !(c.from && c.to)) return [];\n const lo = c.from ? ms(c.from) : Math.min(...spans.map((s) => s.a));\n const hi = c.to ? ms(c.to) + (/^\\d{4}-\\d{2}-\\d{2}$/.test(c.to) ? DAY : 0) : Math.max(...spans.map((s) => s.b), lo + 1);\n const pct = (v: number) => `${(Math.min(Math.max((v - lo) / (hi - lo), 0), 1) * 100).toFixed(3)}%`;\n const lanes = [...(c.lanes ?? []), ...spans.map((s) => s.x.lane ?? '').filter((l, i, a) => a.indexOf(l) === i && !(c.lanes ?? []).includes(l))];\n this.scale = { lo, hi, clock, parse: ms, format: (v) => (clock ? `${pad(Math.floor(v / 3600000))}:${pad(Math.round(v / 60000) % 60)}` : ((d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`)(new Date(v))) };\n const long = !clock && hi - lo > 62 * DAY;\n const tickEls: HTMLElement[] = [];\n const tickAt = (at: number, text: string) => {\n const tick = h('span', 'op-timeline__tick', {}, text);\n tick.style.insetInlineStart = pct(at);\n tickEls.push(tick);\n };\n if (clock) for (let at = Math.ceil(lo / 3600000) * 3600000, hop = (hi - lo) / 3600000 > 14 ? 7200000 : 3600000; at < hi; at += hop) tickAt(at, this.scale.format(at));\n else\n for (let d = new Date(lo); +d < hi; long ? d.setMonth(d.getMonth() + 1, 1) : d.setDate(d.getDate() + 1)) {\n d.setHours(0, 0, 0, 0);\n if (+d < lo) continue;\n tickAt(+d, new Intl.DateTimeFormat(getLocale()._lang, long ? { month: 'short' } : { day: 'numeric', month: 'short' }).format(d));\n }\n const out: HTMLElement[] = [h('div', 'op-timeline__axis', {}, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', { 'aria-hidden': 'true' }, ...tickEls))];\n for (const lane of lanes) {\n const bars = spans.filter((s) => (s.x.lane ?? '') === lane).map(({ x, a, b }) => {\n const bar = h('div', `op-timeline__bar${x.tone && x.tone !== 'default' ? ` is-${x.tone}` : ''}`, { role: 'listitem', tabindex: 0, 'data-i': this.items.indexOf(x), 'aria-label': `${x.title}, ${t('tlFromTo', { from: when(x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.start!) ? 'short' : undefined }), to: when(x.end ?? x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.end ?? '') ? 'short' : undefined }) })}` }, x.icon ? iconEl(x.icon) : null, h('span', 'op-timeline__bar-text', {}, x.title));\n bar.title = x.text ?? x.title;\n bar.style.insetInlineStart = pct(a);\n bar.style.insetInlineEnd = `calc(100% - ${pct(Math.max(b, a + (hi - lo) / 200))})`;\n return bar;\n });\n out.push(h('div', 'op-timeline__lane', { role: 'group', 'aria-label': lane }, h('span', 'op-timeline__lane-name', {}, lane), h('div', 'op-timeline__track', {}, ...bars)));\n }\n const now = Date.now();\n if (c.now !== false && !clock && now >= lo && now <= hi) {\n const mark = h('div', 'op-timeline__now', { 'aria-hidden': 'true', title: t('tlNow') });\n mark.style.insetInlineStart = pct(now);\n out.push(h('div', 'op-timeline__nowrow', { 'aria-hidden': 'true' }, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', {}, mark)));\n }\n return out;\n }\n}\nregister('timeline', Timeline);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "CLOCK", "pad", "n", "DAY", "when", "v", "o", "getLocale", "Timeline", "Component", "h", "store", "r", "p", "off", "e", "el", "items", "t", "it", "iconEl", "c", "clock", "x", "ms", "spans", "lo", "s", "hi", "pct", "lanes", "l", "i", "a", "d", "long", "tickEls", "tickAt", "at", "text", "tick", "hop", "out", "lane", "bars", "b", "bar", "now", "mark", "register"]
|
|
7
|
-
}
|
package/dist/chunk-SWCB2GMN.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as v}from"./chunk-MNSDGJKA.js";import{c as p}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{e as c,f}from"./chunk-UDXO3KM3.js";import{b as a}from"./chunk-PZSHOSOS.js";var m=class extends f{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;flyout;flyoutOf;hoverTimer;onRender(){let e=this.config;this.items=c(e.items)??[],this.active=e.active;let i=t=>t.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&i(s.items)));i(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",t=>{let s=t.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",t=>this.onKey(t)),this.listen(this.root,"pointerover",t=>{let s=t.target.closest(".op-navmenu__item.is-group");this.hoverTimer?.(),!(!this.config.collapsed||!s||s.dataset.id===this.flyoutOf)&&(this.hoverTimer=this.later(()=>this.openFlyout(s.dataset.id,!1),200))}),this.listen(this.root,"pointerleave",()=>this.hoverTimer?.()),this.own(()=>this.flyout?.destroy()),this.listen(this.root,"focusin",t=>{let s=t.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,i=this.items){for(let t of i){if(t.id===e)return t;let s=t.items&&this.getItem(e,t.items);if(s)return s}}parentsOf(e,i=this.items,t=[]){for(let s of i){if(s.id===e)return t;let n=s.items&&this.parentsOf(e,s.items,[...t,s]);if(n)return n}}openParents(e){for(let i of this.parentsOf(e)??[])this.open.add(i.id)}matches(e,i){return e.text.toLowerCase().includes(i)||!!e.items?.some(t=>this.matches(t,i))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(i=>this.visible(i))}isOpen(e){return this.config.collapsed?!1:this.query?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(t=>this.visible(t)).map(t=>this.node(t,1)));let i=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(t=>t.tabIndex=t===i?0:-1)}node(e,i){let t=!!e.items,s=t&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),l=t&&!!this.active&&!!this.parentsOf(this.active)?.some(d=>d.id===e.id),o=n&&t,h=a("div",`op-navmenu__item${t?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${l&&n?" has-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":i,"aria-expanded":t?String(o?this.flyoutOf===e.id:s):null,"aria-current":e.id===this.active?"page":null,"aria-haspopup":o?"menu":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return h.style.setProperty("--_level",String(i-1)),h.append(a("span","op-navmenu__icon",{},e.icon?p(e.icon):o?e.text.charAt(0).toUpperCase():""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&h.append(a("span","op-navmenu__badge",{},String(e.badge))),t&&h.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},p("chevron-down"))),r.append(h),t&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(d=>this.visible(d)).map(d=>this.node(d,i+1)))),r}activate(e){let i=this.getItem(e);if(!(!i||i.disabled)){if(i.items&&this.config.collapsed)return this.openFlyout(e,!0);if(i.items)return this.toggle(e);this.select(e)}}select(e){let i=this.getItem(e);!i||i.disabled||this.emit("before-select",i)===!1||(this.setActive(e),this.emit("select",i))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let i=this.getItem(e);if(!(!i?.items||this.open.has(e))){if(this.config.accordion)for(let t of this.siblings(e))this.open.delete(t.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",i)}}collapse(e){let i=this.getItem(e);!i?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",i))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let i=this.parentsOf(e)??[];return(i.length?i[i.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=i=>i.forEach(t=>t.items&&(this.open.add(t.id),e(t.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=c(e)??[],this.config.items=e,this.rendered&&this.paint()}updateItem(e,i){let t=this.getItem(e);t&&(Object.assign(t,i),this.rendered&&this.paint())}openFlyout(e,i){let t=this.getItem(e),s=this.root.querySelector(`[data-id="${CSS.escape(e)}"]`);if(!t?.items||!s)return;let n=(r,l)=>r.filter(o=>this.visible(o)).map(o=>({text:o.text,icon:o.icon,badge:o.badge,disabled:o.disabled,group:l?t.text:void 0,items:o.items?n(o.items,!1):void 0,handler:o.items?void 0:()=>this.select(o.id)}));this.flyout||(this.flyout=new v({cls:"op-navmenu__flyout"}),this.flyout.on("hide",()=>{let r=this.flyoutOf;this.flyoutOf=void 0,r&&this.root.querySelector(`[data-id="${CSS.escape(r)}"]`)?.setAttribute("aria-expanded","false")}),this.listen(this.flyout.el,"keydown",r=>r.key==="ArrowLeft"&&!r.target.closest('.op-menu__item[aria-expanded="true"]')&&this.flyout.hide())),this.flyout.hide(),this.flyoutOf=e,this.flyout.setItems(n(t.items,!0)),s.setAttribute("aria-expanded","true"),this.flyout.showBy(s,"right-start",i)}setCollapsed(e){this.config.collapsed=e,e||this.flyout?.hide(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(i=>i.tabIndex=i===e?0:-1),e.focus())}onKey(e){let i=e.target.closest(".op-navmenu__item");if(!i)return;let t=this.rows(),s=t.indexOf(i),n=this.getItem(i.dataset.id),r=i.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(t[s+1]);break;case"ArrowUp":this.focusRow(t[s-1]);break;case"Home":this.focusRow(t[0]);break;case"End":this.focusRow(t[t.length-1]);break;case"ArrowRight":n.items&&this.config.collapsed?this.openFlyout(n.id,!0):n.items&&!r?this.expand(n.id):n.items&&this.focusRow(t[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let o=this.parentsOf(n.id)?.pop();o&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(o.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}if(e.preventDefault(),this.flyout?.el.contains(document.activeElement))return;this.focusId=document.activeElement?.dataset?.id??n.id;let l=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);l&&document.activeElement!==l&&this.focusRow(l)}};u("navmenu",m);export{m as a};
|
|
2
|
-
//# sourceMappingURL=chunk-SWCB2GMN.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/navigation/navmenu/navmenu.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Hidden (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n /** Rail mode: the floating menu of a group, and the group it belongs to. */\n private flyout?: Menu;\n private flyoutOf?: string;\n private hoverTimer?: () => void;\n\n protected override onRender() {\n const c = this.config;\n this.items = gate(c.items) ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n // rail: hovering a group's icon opens its menu (after a short pause, so passing over the rail does not)\n this.listen(this.root, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item.is-group');\n this.hoverTimer?.();\n if (!this.config.collapsed || !row || row.dataset.id === this.flyoutOf) return;\n this.hoverTimer = this.later(() => this.openFlyout(row.dataset.id!, false), 200);\n });\n this.listen(this.root, 'pointerleave', () => this.hoverTimer?.());\n this.own(() => this.flyout?.destroy());\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n if (this.config.collapsed) return false; // rail: a group's children live in its floating menu\n return this.query ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const holdsActive = group && !!this.active && !!this.parentsOf(this.active)?.some((p) => p.id === i.id);\n const flying = rail && group;\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${holdsActive && rail ? ' has-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(flying ? this.flyoutOf === i.id : open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-haspopup': flying ? 'menu' : null, 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n // in the rail a group shows its icon (or its initial) and opens a floating menu\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : flying ? i.text.charAt(0).toUpperCase() : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items && this.config.collapsed) return this.openFlyout(id, true);\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = gate(items) ?? [];\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n /** Rail mode: a group's children in a Menu beside its icon (title as the header, badges kept). */\n private openFlyout(id: string, focus: boolean) {\n const group = this.getItem(id);\n const row = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(id)}\"]`);\n if (!group?.items || !row) return;\n const entries = (list: NavItem[], top: boolean): MenuEntry[] =>\n list.filter((c) => this.visible(c)).map((c) => ({\n text: c.text, icon: c.icon, badge: c.badge, disabled: c.disabled, group: top ? group.text : undefined,\n items: c.items ? entries(c.items, false) : undefined,\n handler: c.items ? undefined : () => this.select(c.id),\n }));\n if (!this.flyout) {\n this.flyout = new Menu({ cls: 'op-navmenu__flyout' });\n this.flyout.on('hide', () => {\n const was = this.flyoutOf;\n this.flyoutOf = undefined;\n if (was) this.root.querySelector(`[data-id=\"${CSS.escape(was)}\"]`)?.setAttribute('aria-expanded', 'false');\n });\n // \u2190 closes it (the Menu only does that for submenus) and gives the focus back to the icon\n this.listen(this.flyout.el, 'keydown', (e: KeyboardEvent) => e.key === 'ArrowLeft' && !(e.target as HTMLElement).closest('.op-menu__item[aria-expanded=\"true\"]') && this.flyout!.hide());\n }\n this.flyout.hide();\n this.flyoutOf = id;\n this.flyout.setItems(entries(group.items, true));\n row.setAttribute('aria-expanded', 'true');\n this.flyout.showBy(row, 'right-start', focus);\n }\n\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!collapsed) this.flyout?.hide();\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && this.config.collapsed) this.openFlyout(item.id, true);\n else if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n if (this.flyout?.el.contains(document.activeElement)) return; // the focus went to the rail's floating menu: leave it there\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["NavMenu", "Component", "c", "gate", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "holdsActive", "flying", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "focus", "entries", "top", "Menu", "was", "collapsed", "text", "rows", "item", "parent", "again", "register"]
|
|
7
|
-
}
|
package/dist/chunk-TQPQ4UEA.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as c}from"./chunk-M7FNPRV4.js";import{a as h}from"./chunk-4AZ44KV4.js";import{a as p}from"./chunk-XR677UYD.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as m}from"./chunk-PZSHOSOS.js";import{e as n,f as a}from"./chunk-S4QD5NID.js";n("en",{dtDate:"Date",dtTime:"Time",datetime:"Enter a date and a time"});n("pt-BR",{dtDate:"Data",dtTime:"Hora",datetime:"Informe a data e a hora"});var r=o=>String(o).padStart(2,"0"),d=class extends p{baseCls="op-field op-datetimefield";date;time;emptyValue(){return null}isEmpty(e){return!e}createControl(){let{min:e,max:t,step:s}=this.config;this.date=new h({min:e,max:t,ariaLabel:a("dtDate")}),this.time=new c({step:s,ariaLabel:a("dtTime")});for(let i of[this.date,this.time])i.on("change",()=>this.compose());return this.own(()=>(this.date.destroy(),this.time.destroy())),this.inputEl=this.date.el.querySelector("input"),m("div","op-datetimefield__parts",{role:"group"},this.date.el,this.time.el)}compose(){let e=this.date.getValue(),t=this.time.getValue(),s=null;e&&t&&(s=this.config.utc?new Date(+e.slice(0,4),+e.slice(5,7)-1,+e.slice(8),+t.slice(0,2),+t.slice(3)).toISOString():`${e}T${t}`),this.commit(s)}applyValue(e){let t=null,s=null;if(e){let i=this.config.utc?new Date(e):void 0;[t,s]=i?[`${i.getFullYear()}-${r(i.getMonth()+1)}-${r(i.getDate())}`,`${r(i.getHours())}:${r(i.getMinutes())}`]:e.split("T").map(l=>l.slice(0,l.includes(":")?5:10))}this.date.setValue(t,!0),this.time.setValue(s,!0)}getDisplayText(){return this.value?[this.date.getDisplayText(),this.time.getDisplayText()].join(" "):""}check(){let[e,t]=[this.date.getValue(),this.time.getValue()];return!this.date.isValid()||!this.time.isValid()||!!e!=!!t?a("datetime"):super.check()}onDisabled(e){this.date.setDisabled(e),this.time.setDisabled(e)}onReadonly(e){this.date.setReadonly(e),this.time.setReadonly(e)}setMin(e){this.config.min=e,this.date.setMin(e)}setMax(e){this.config.max=e,this.date.setMax(e)}};u("datetimefield",d);export{d as a};
|
|
2
|
-
//# sourceMappingURL=chunk-TQPQ4UEA.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/fields/datetimefield/datetimefield.ts"],
|
|
4
|
-
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { DateField } from '../datefield/datefield';\nimport { TimeField } from '../timefield/timefield';\n\naddMessages('en', { dtDate: 'Date', dtTime: 'Time', datetime: 'Enter a date and a time' });\naddMessages('pt-BR', { dtDate: 'Data', dtTime: 'Hora', datetime: 'Informe a data e a hora' });\n\nexport interface DateTimeFieldConfig extends FieldConfig<string | null> {\n /** Earliest and latest date, `YYYY-MM-DD`. */\n min?: string;\n max?: string;\n /** Minutes moved by \u2191/\u2193 in the time part. */\n step?: number;\n /** The value is the ISO instant (`2026-11-10T17:30:00.000Z`) of what the user typed, in their time zone. Default: the local `YYYY-MM-DDTHH:mm`. */\n utc?: boolean;\n}\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** A date and a time of day side by side. The value is one ISO string (local, or UTC with `utc`) or null. */\nexport class DateTimeField extends Field<string | null, DateTimeFieldConfig> {\n protected override baseCls = 'op-field op-datetimefield';\n private date!: DateField;\n private time!: TimeField;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: string | null) {\n return !v;\n }\n\n protected createControl() {\n const { min, max, step } = this.config;\n this.date = new DateField({ min, max, ariaLabel: t('dtDate') });\n this.time = new TimeField({ step, ariaLabel: t('dtTime') });\n for (const f of [this.date, this.time]) f.on('change', () => this.compose());\n this.own(() => (this.date.destroy(), this.time.destroy()));\n this.inputEl = this.date.el.querySelector('input')!;\n return h('div', 'op-datetimefield__parts', { role: 'group' }, this.date.el, this.time.el);\n }\n\n /** Both parts \u2192 the value. One part alone is not a value yet (`check` says so). */\n private compose() {\n const d = this.date.getValue();\n const tm = this.time.getValue();\n let v: string | null = null;\n if (d && tm) v = this.config.utc ? new Date(+d.slice(0, 4), +d.slice(5, 7) - 1, +d.slice(8), +tm.slice(0, 2), +tm.slice(3)).toISOString() : `${d}T${tm}`;\n this.commit(v);\n }\n\n protected applyValue(v: string | null) {\n let d: string | null = null;\n let tm: string | null = null;\n if (v) {\n const x = this.config.utc ? new Date(v) : undefined;\n [d, tm] = x ? [`${x.getFullYear()}-${pad(x.getMonth() + 1)}-${pad(x.getDate())}`, `${pad(x.getHours())}:${pad(x.getMinutes())}`] : v.split('T').map((s) => s.slice(0, s.includes(':') ? 5 : 10));\n }\n this.date.setValue(d, true);\n this.time.setValue(tm, true);\n }\n\n override getDisplayText() {\n return this.value ? [this.date.getDisplayText(), this.time.getDisplayText()].join(' ') : '';\n }\n\n protected override check(): string {\n const [d, tm] = [this.date.getValue(), this.time.getValue()];\n if (!this.date.isValid() || !this.time.isValid() || (!!d !== !!tm)) return t('datetime');\n return super.check();\n }\n\n protected override onDisabled(disabled: boolean) {\n this.date.setDisabled(disabled);\n this.time.setDisabled(disabled);\n }\n protected override onReadonly(readonly: boolean) {\n this.date.setReadonly(readonly);\n this.time.setReadonly(readonly);\n }\n\n setMin(min: string | undefined) {\n this.config.min = min;\n this.date.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.date.setMax(max);\n }\n}\nregister('datetimefield', DateTimeField);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "pad", "n", "DateTimeField", "Field", "v", "min", "max", "step", "DateField", "t", "TimeField", "f", "h", "d", "tm", "x", "s", "disabled", "readonly", "register"]
|
|
7
|
-
}
|