optikos 0.5.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 +19 -0
- package/dist/build.js +1 -1
- package/dist/{chunk-EO777UIN.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-5G5PHOZJ.js → chunk-5H533QXN.js} +2 -2
- package/dist/{chunk-632LUU52.js → chunk-5KJ5Y4GY.js} +2 -2
- package/dist/{chunk-LXWCTCZV.js → chunk-5WE2JOBY.js} +2 -2
- package/dist/{chunk-SEW5OCQF.js → chunk-6IXVTWFH.js} +2 -2
- package/dist/{chunk-MM2OC66E.js → chunk-6S4BKUGD.js} +2 -2
- package/dist/{chunk-CWIE74NX.js → chunk-6VWSTY32.js} +2 -2
- package/dist/{chunk-NWHH3CYH.js → chunk-72ESP5DB.js} +2 -2
- package/dist/{chunk-2CVMT3IW.js → chunk-74IVU356.js} +2 -2
- package/dist/{chunk-UUAGMZD2.js → chunk-76A4MY7P.js} +2 -2
- package/dist/{chunk-3BG75P7T.js → chunk-7SE4B4TC.js} +2 -2
- package/dist/{chunk-PGVLRMTQ.js → chunk-A5N2AJCE.js} +2 -2
- package/dist/{chunk-ZEIE2OCQ.js → chunk-ALNUVKDT.js} +2 -2
- package/dist/{chunk-37PYJAA2.js → chunk-ANR27GED.js} +2 -2
- package/dist/{chunk-J2TCHWYD.js → chunk-AZUWS2C5.js} +2 -2
- package/dist/{chunk-S3ILIWSW.js → chunk-BHKI2SU3.js} +2 -2
- package/dist/{chunk-GZIDE5K2.js → chunk-BIQX75P2.js} +2 -2
- package/dist/{chunk-MQEALOU3.js → chunk-BPCD37A2.js} +2 -2
- package/dist/{chunk-GLAY4RJF.js → chunk-CGSCBLG2.js} +2 -2
- package/dist/{chunk-T5OGUCY2.js → chunk-DHUBCB4H.js} +2 -2
- package/dist/{chunk-2I4Y7I7C.js → chunk-EKRWJJ65.js} +2 -2
- package/dist/chunk-EO2IXU2W.js +2 -0
- package/dist/chunk-EO2IXU2W.js.map +7 -0
- package/dist/{chunk-Z6HZY2YG.js → chunk-EQ4IWYLW.js} +2 -2
- package/dist/{chunk-5PYJ6FJK.js → chunk-EXBGOHG7.js} +2 -2
- package/dist/{chunk-U25QSLAH.js → chunk-FTZMF2QX.js} +2 -2
- package/dist/{chunk-XNRZJP4E.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-G26R2F3W.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-6PPRYSLN.js → chunk-HHOSKOO6.js} +2 -2
- package/dist/{chunk-3OA3P37P.js → chunk-I5KHVFJ4.js} +2 -2
- package/dist/{chunk-L6DOWGBO.js → chunk-IB5T27PW.js} +2 -2
- package/dist/{chunk-JBOKM5YA.js → chunk-IE7KRNFJ.js} +2 -2
- package/dist/{chunk-3FK52VQX.js → chunk-J2YP2YD3.js} +2 -2
- package/dist/{chunk-OADWLPSF.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-NEVDHDJ4.js → chunk-KP7O5MVL.js} +2 -2
- package/dist/{chunk-ESRS5ZQV.js → chunk-KVUELLYF.js} +2 -2
- package/dist/{chunk-AJN66F32.js → chunk-LRUKKIYA.js} +2 -2
- package/dist/{chunk-A36JFIA3.js → chunk-M2XOIEPY.js} +2 -2
- package/dist/{chunk-SEUIIPHS.js → chunk-MBRCE5A7.js} +2 -2
- package/dist/{chunk-ADHKL2GM.js → chunk-MMPPDQ2E.js} +2 -2
- package/dist/{chunk-BTGJ3MP4.js → chunk-MRDX3RVJ.js} +2 -2
- package/dist/{chunk-FSR6BDVO.js → chunk-NAWQBQ57.js} +2 -2
- package/dist/{chunk-6NP4AEV4.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-MGSCSS7X.js → chunk-OK3SN5PN.js} +2 -2
- package/dist/{chunk-6TZJO2G2.js → chunk-OQFQDTLL.js} +2 -2
- package/dist/chunk-OVEQUN4V.js +2 -0
- package/dist/chunk-OVEQUN4V.js.map +7 -0
- package/dist/{chunk-RMATRKXV.js → chunk-PMIIQMVH.js} +2 -2
- package/dist/{chunk-DIOJGTUN.js → chunk-QT5JRZZJ.js} +2 -2
- package/dist/{chunk-J5BZAKC6.js → chunk-R52OSARY.js} +2 -2
- package/dist/{chunk-QVBDBGS4.js → chunk-RI62AESU.js} +2 -2
- package/dist/{chunk-6BOM5KZR.js → chunk-RRGAJ7T4.js} +2 -2
- package/dist/{chunk-LHWY6G6Q.js → chunk-SQTM4QFP.js} +2 -2
- package/dist/{chunk-M7HLHGQV.js → chunk-TAFHKT6O.js} +2 -2
- package/dist/{chunk-3TCITFUU.js → chunk-TBM35UV6.js} +2 -2
- package/dist/{chunk-FNZI6MFG.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-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-BRGT4O6Q.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-OB3VIRQR.js → chunk-VOCGAAG7.js} +2 -2
- package/dist/{chunk-CXZKCBQE.js → chunk-WHWPLMIG.js} +2 -2
- package/dist/{chunk-5GCTM37D.js → chunk-WVJSNE6Q.js} +2 -2
- package/dist/{chunk-UCWICDYG.js → chunk-WWETTEUZ.js} +2 -2
- package/dist/{chunk-2I7HDIOU.js → chunk-XI4IBUE3.js} +2 -2
- package/dist/{chunk-ZLYZFHEN.js → chunk-YAKKOVRI.js} +2 -2
- package/dist/{chunk-HG7OOHGD.js → chunk-YF5GWNM7.js} +2 -2
- package/dist/{chunk-QOSTS5I3.js → chunk-YRCR5ELY.js} +2 -2
- package/dist/{chunk-UL364TLO.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 +1 -1
- 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 +1 -1
- 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/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/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/label.css +14 -0
- package/dist/css/quicksearch.css +13 -0
- package/dist/css/stat.css +14 -0
- 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 +163 -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/data/quicksearch/quicksearch.d.ts +13 -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/core/component.d.ts +6 -3
- package/dist/types/core/container.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/layout/layout.d.ts +5 -0
- package/dist/ui.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-AQ3RTHG5.js +0 -2
- package/dist/chunk-AQ3RTHG5.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-DLRGB5NY.js +0 -2
- package/dist/chunk-DLRGB5NY.js.map +0 -7
- package/dist/chunk-GNKVLJ5H.js +0 -2
- package/dist/chunk-GNKVLJ5H.js.map +0 -7
- package/dist/chunk-NAUSRVB6.js +0 -2
- package/dist/chunk-NAUSRVB6.js.map +0 -7
- package/dist/chunk-TVO3Z2BM.js +0 -2
- package/dist/chunk-TVO3Z2BM.js.map +0 -7
- package/dist/chunk-UDXO3KM3.js.map +0 -7
- package/dist/chunk-YJTUFK4P.js +0 -2
- /package/dist/{chunk-EO777UIN.js.map → chunk-4DW5WBZB.js.map} +0 -0
- /package/dist/{chunk-I5A74NMJ.js.map → chunk-4Z4E3BZ2.js.map} +0 -0
- /package/dist/{chunk-5G5PHOZJ.js.map → chunk-5H533QXN.js.map} +0 -0
- /package/dist/{chunk-632LUU52.js.map → chunk-5KJ5Y4GY.js.map} +0 -0
- /package/dist/{chunk-LXWCTCZV.js.map → chunk-5WE2JOBY.js.map} +0 -0
- /package/dist/{chunk-SEW5OCQF.js.map → chunk-6IXVTWFH.js.map} +0 -0
- /package/dist/{chunk-MM2OC66E.js.map → chunk-6S4BKUGD.js.map} +0 -0
- /package/dist/{chunk-CWIE74NX.js.map → chunk-6VWSTY32.js.map} +0 -0
- /package/dist/{chunk-NWHH3CYH.js.map → chunk-72ESP5DB.js.map} +0 -0
- /package/dist/{chunk-2CVMT3IW.js.map → chunk-74IVU356.js.map} +0 -0
- /package/dist/{chunk-UUAGMZD2.js.map → chunk-76A4MY7P.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-ZEIE2OCQ.js.map → chunk-ALNUVKDT.js.map} +0 -0
- /package/dist/{chunk-37PYJAA2.js.map → chunk-ANR27GED.js.map} +0 -0
- /package/dist/{chunk-J2TCHWYD.js.map → chunk-AZUWS2C5.js.map} +0 -0
- /package/dist/{chunk-S3ILIWSW.js.map → chunk-BHKI2SU3.js.map} +0 -0
- /package/dist/{chunk-GZIDE5K2.js.map → chunk-BIQX75P2.js.map} +0 -0
- /package/dist/{chunk-MQEALOU3.js.map → chunk-BPCD37A2.js.map} +0 -0
- /package/dist/{chunk-GLAY4RJF.js.map → chunk-CGSCBLG2.js.map} +0 -0
- /package/dist/{chunk-T5OGUCY2.js.map → chunk-DHUBCB4H.js.map} +0 -0
- /package/dist/{chunk-2I4Y7I7C.js.map → chunk-EKRWJJ65.js.map} +0 -0
- /package/dist/{chunk-Z6HZY2YG.js.map → chunk-EQ4IWYLW.js.map} +0 -0
- /package/dist/{chunk-5PYJ6FJK.js.map → chunk-EXBGOHG7.js.map} +0 -0
- /package/dist/{chunk-U25QSLAH.js.map → chunk-FTZMF2QX.js.map} +0 -0
- /package/dist/{chunk-XNRZJP4E.js.map → chunk-G7NNOLOG.js.map} +0 -0
- /package/dist/{chunk-4OB2IM5L.js.map → chunk-GX32KEG2.js.map} +0 -0
- /package/dist/{chunk-G26R2F3W.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-6PPRYSLN.js.map → chunk-HHOSKOO6.js.map} +0 -0
- /package/dist/{chunk-3OA3P37P.js.map → chunk-I5KHVFJ4.js.map} +0 -0
- /package/dist/{chunk-L6DOWGBO.js.map → chunk-IB5T27PW.js.map} +0 -0
- /package/dist/{chunk-JBOKM5YA.js.map → chunk-IE7KRNFJ.js.map} +0 -0
- /package/dist/{chunk-3FK52VQX.js.map → chunk-J2YP2YD3.js.map} +0 -0
- /package/dist/{chunk-OADWLPSF.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-NEVDHDJ4.js.map → chunk-KP7O5MVL.js.map} +0 -0
- /package/dist/{chunk-ESRS5ZQV.js.map → chunk-KVUELLYF.js.map} +0 -0
- /package/dist/{chunk-AJN66F32.js.map → chunk-LRUKKIYA.js.map} +0 -0
- /package/dist/{chunk-A36JFIA3.js.map → chunk-M2XOIEPY.js.map} +0 -0
- /package/dist/{chunk-SEUIIPHS.js.map → chunk-MBRCE5A7.js.map} +0 -0
- /package/dist/{chunk-ADHKL2GM.js.map → chunk-MMPPDQ2E.js.map} +0 -0
- /package/dist/{chunk-BTGJ3MP4.js.map → chunk-MRDX3RVJ.js.map} +0 -0
- /package/dist/{chunk-FSR6BDVO.js.map → chunk-NAWQBQ57.js.map} +0 -0
- /package/dist/{chunk-6NP4AEV4.js.map → chunk-NBR5IRZT.js.map} +0 -0
- /package/dist/{chunk-MGSCSS7X.js.map → chunk-OK3SN5PN.js.map} +0 -0
- /package/dist/{chunk-6TZJO2G2.js.map → chunk-OQFQDTLL.js.map} +0 -0
- /package/dist/{chunk-RMATRKXV.js.map → chunk-PMIIQMVH.js.map} +0 -0
- /package/dist/{chunk-DIOJGTUN.js.map → chunk-QT5JRZZJ.js.map} +0 -0
- /package/dist/{chunk-J5BZAKC6.js.map → chunk-R52OSARY.js.map} +0 -0
- /package/dist/{chunk-QVBDBGS4.js.map → chunk-RI62AESU.js.map} +0 -0
- /package/dist/{chunk-6BOM5KZR.js.map → chunk-RRGAJ7T4.js.map} +0 -0
- /package/dist/{chunk-LHWY6G6Q.js.map → chunk-SQTM4QFP.js.map} +0 -0
- /package/dist/{chunk-M7HLHGQV.js.map → chunk-TAFHKT6O.js.map} +0 -0
- /package/dist/{chunk-3TCITFUU.js.map → chunk-TBM35UV6.js.map} +0 -0
- /package/dist/{chunk-FNZI6MFG.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-BRGT4O6Q.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-OB3VIRQR.js.map → chunk-VOCGAAG7.js.map} +0 -0
- /package/dist/{chunk-CXZKCBQE.js.map → chunk-WHWPLMIG.js.map} +0 -0
- /package/dist/{chunk-5GCTM37D.js.map → chunk-WVJSNE6Q.js.map} +0 -0
- /package/dist/{chunk-UCWICDYG.js.map → chunk-WWETTEUZ.js.map} +0 -0
- /package/dist/{chunk-2I7HDIOU.js.map → chunk-XI4IBUE3.js.map} +0 -0
- /package/dist/{chunk-ZLYZFHEN.js.map → chunk-YAKKOVRI.js.map} +0 -0
- /package/dist/{chunk-HG7OOHGD.js.map → chunk-YF5GWNM7.js.map} +0 -0
- /package/dist/{chunk-QOSTS5I3.js.map → chunk-YRCR5ELY.js.map} +0 -0
- /package/dist/{chunk-UL364TLO.js.map → chunk-YVEGWCYD.js.map} +0 -0
- /package/dist/{chunk-MQ5BYGFY.js.map → chunk-ZYHMTPW4.js.map} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TextField, type TextFieldConfig } from '../textfield/textfield.js';
|
|
2
|
-
export interface MaskFieldConfig extends TextFieldConfig {
|
|
2
|
+
export interface MaskFieldConfig extends TextFieldConfig<string | null> {
|
|
3
3
|
/**
|
|
4
4
|
* The pattern: `0` a digit, `A` a letter, `*` any character, `\` makes the next character a literal. A list picks the
|
|
5
5
|
* pattern by length: `['000.000.000-00', '00.000.000/0000-00']` is a CPF until the 12th digit, then a CNPJ.
|
|
@@ -8,19 +8,38 @@ export interface MaskFieldConfig extends TextFieldConfig {
|
|
|
8
8
|
mask: string | string[];
|
|
9
9
|
/** The value is only what was typed into the slots (`12345678900`), not the formatted text (`123.456.789-00`). Default false. */
|
|
10
10
|
raw?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* A value the app already holds but only shows masked (`'***.***.***-12'`): it is displayed read-only, `getValue()` is
|
|
13
|
+
* `null` while untouched (keep what is saved), and typing (or Enter) replaces it. Esc on an empty replacement keeps it.
|
|
14
|
+
*/
|
|
15
|
+
stored?: string;
|
|
11
16
|
}
|
|
12
17
|
/** A text field that formats what is typed into a pattern (phone, tax id, postal code, plate...). */
|
|
13
|
-
export declare class MaskField extends TextField<string, MaskFieldConfig> {
|
|
18
|
+
export declare class MaskField extends TextField<string | null, MaskFieldConfig> {
|
|
14
19
|
protected baseCls: string;
|
|
15
20
|
private masks;
|
|
21
|
+
private keeping;
|
|
22
|
+
constructor(config: MaskFieldConfig);
|
|
16
23
|
private compiled;
|
|
17
24
|
/** What was typed into the slots: the literals of the patterns are dropped (with a `*` slot, only where the text repeats one). */
|
|
18
25
|
private extract;
|
|
19
26
|
private pick;
|
|
20
27
|
private format;
|
|
21
28
|
private norm;
|
|
22
|
-
protected display(v: string): string;
|
|
23
|
-
|
|
29
|
+
protected display(v: string | null): string;
|
|
30
|
+
/** A saved value that was not touched counts as filled in (so `required` is satisfied). */
|
|
31
|
+
protected isEmpty(v: string | null): boolean;
|
|
32
|
+
getValue(): string | null;
|
|
33
|
+
setValue(v: string | null, silent?: boolean): void;
|
|
34
|
+
/** `true` while the saved value is shown and nothing has replaced it. */
|
|
35
|
+
isStored(): boolean;
|
|
36
|
+
/** Back to the saved value (what Esc does on an empty replacement). */
|
|
37
|
+
keepStored(): void;
|
|
38
|
+
/** Opens the field for a new value. */
|
|
39
|
+
replaceStored(): void;
|
|
40
|
+
private showStored;
|
|
41
|
+
protected applyValue(v: string | null): void;
|
|
42
|
+
protected onRender(): void;
|
|
24
43
|
protected createControl(): HTMLDivElement;
|
|
25
44
|
protected onInput(): void;
|
|
26
45
|
protected check(): string;
|
|
@@ -13,6 +13,12 @@ export interface CarouselConfig extends ContainerConfig {
|
|
|
13
13
|
/** Default `true`. */
|
|
14
14
|
arrows?: boolean;
|
|
15
15
|
active?: number;
|
|
16
|
+
/** `slide` (default) scrolls the row; `fade` stacks the items and cross-fades them (one at a time, no swipe). */
|
|
17
|
+
transition?: 'slide' | 'fade';
|
|
18
|
+
/** Puts the dots, the play button and the caption over the bottom of the content, on a scrim. */
|
|
19
|
+
overlay?: boolean;
|
|
20
|
+
/** One caption per item, shown for the active one. */
|
|
21
|
+
captions?: string[];
|
|
16
22
|
}
|
|
17
23
|
/** Pages through its items on a scroll-snap row: images, cards or any component. */
|
|
18
24
|
export declare class Carousel extends Container<CarouselConfig> {
|
|
@@ -22,6 +28,7 @@ export declare class Carousel extends Container<CarouselConfig> {
|
|
|
22
28
|
private nextBtn;
|
|
23
29
|
private dotsEl;
|
|
24
30
|
private toggleBtn;
|
|
31
|
+
private captionEl;
|
|
25
32
|
private index;
|
|
26
33
|
private stopped;
|
|
27
34
|
private scrollTimer?;
|
|
@@ -40,6 +47,7 @@ export declare class Carousel extends Container<CarouselConfig> {
|
|
|
40
47
|
private set;
|
|
41
48
|
/** Slides, dots, arrows: everything that follows the item count or the active one. */
|
|
42
49
|
private refresh;
|
|
50
|
+
setCaptions(captions: string[]): void;
|
|
43
51
|
getActive(): number;
|
|
44
52
|
/** Goes to item `i` (kept between 0 and the last position). `before-change` can cancel. */
|
|
45
53
|
goTo(i: number): void;
|
|
@@ -19,6 +19,8 @@ export interface NavMenuConfig extends ComponentConfig {
|
|
|
19
19
|
active?: string;
|
|
20
20
|
/** Rail: icons only. */
|
|
21
21
|
collapsed?: boolean;
|
|
22
|
+
/** Width (px or CSS) the parent container takes while collapsed, and gives back on expand: the sidebar follows the rail. */
|
|
23
|
+
railWidth?: number | string;
|
|
22
24
|
/** Opening a group closes the others at its level. */
|
|
23
25
|
accordion?: boolean;
|
|
24
26
|
}
|
|
@@ -36,6 +38,7 @@ export declare class NavMenu extends Component<NavMenuConfig> {
|
|
|
36
38
|
private flyout?;
|
|
37
39
|
private flyoutOf?;
|
|
38
40
|
private hoverTimer?;
|
|
41
|
+
private parentWidth?;
|
|
39
42
|
protected onRender(): void;
|
|
40
43
|
getItem(id: string, list?: NavItem[]): NavItem | undefined;
|
|
41
44
|
private parentsOf;
|
|
@@ -63,6 +66,7 @@ export declare class NavMenu extends Component<NavMenuConfig> {
|
|
|
63
66
|
/** Rail mode: a group's children in a Menu beside its icon (title as the header, badges kept). */
|
|
64
67
|
private openFlyout;
|
|
65
68
|
setCollapsed(collapsed: boolean): void;
|
|
69
|
+
private fit;
|
|
66
70
|
/** Hides what does not match and opens the groups that have a match; empty text clears the filter. */
|
|
67
71
|
filter(text: string): void;
|
|
68
72
|
private rows;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '../components/data/quicksearch/quicksearch.js';
|
|
@@ -17,8 +17,11 @@ export interface ComponentConfig {
|
|
|
17
17
|
/** A permission name: without it (per `setPermissionResolver`) the component is hidden, or disabled with `permissionMode: 'disable'`. */
|
|
18
18
|
permission?: string;
|
|
19
19
|
permissionMode?: 'hide' | 'disable';
|
|
20
|
-
/**
|
|
21
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Component-scoped tokens: `{ radius: '0' }` on a button sets `--op-button-radius` (keys starting with `--` are used as is).
|
|
22
|
+
* A string names themes for this component and everything inside it: `'dark'`, `'dark tenant-dark'` (the `data-op-theme` attribute).
|
|
23
|
+
*/
|
|
24
|
+
theme?: string | Record<string, string | number>;
|
|
22
25
|
/**
|
|
23
26
|
* Default `true`: the component keeps its size when only its *state* changes (loading, searching, invalid).
|
|
24
27
|
* The CSS reserves room for the state's extra content instead of growing. `false` lets it fit the content.
|
|
@@ -92,7 +95,7 @@ export declare class Component<C extends ComponentConfig = ComponentConfig> exte
|
|
|
92
95
|
setFlex(v: number | string): void;
|
|
93
96
|
setStableSize(stable: boolean): void;
|
|
94
97
|
setTooltip(text: string): void;
|
|
95
|
-
setTheme(theme: Record<string, string | number>): void;
|
|
98
|
+
setTheme(theme: string | Record<string, string | number>): void;
|
|
96
99
|
/** Shows (or removes) a loading mask. A string is shown as text under the spinner. */
|
|
97
100
|
setLoading(loading: boolean | string): void;
|
|
98
101
|
/** The element that receives focus on `focus()`. */
|
|
@@ -13,6 +13,8 @@ export interface TabPanelConfig {
|
|
|
13
13
|
export interface ContainerConfig extends ComponentConfig, TabPanelConfig {
|
|
14
14
|
items?: Array<AnyConfig | Component | string>;
|
|
15
15
|
layout?: LayoutSpec;
|
|
16
|
+
/** Shortcut for the layout option of the same name: under this width (px) a `border` layout turns its west/east regions into drawers and numeric `columns` collapse to one. */
|
|
17
|
+
narrowBelow?: number;
|
|
16
18
|
/** Config merged into every item that does not set the key itself. */
|
|
17
19
|
defaults?: Record<string, unknown>;
|
|
18
20
|
/** `type` used by items that do not declare one. */
|
package/dist/types/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './components/data/gridexport/gridexport.js';
|
|
|
26
26
|
export * from './components/data/gridstate/gridstate.js';
|
|
27
27
|
export * from './components/data/grouping/grouping.js';
|
|
28
28
|
export * from './components/data/pagination/pagination.js';
|
|
29
|
+
export * from './components/data/quicksearch/quicksearch.js';
|
|
29
30
|
export * from './components/data/rowediting/rowediting.js';
|
|
30
31
|
export * from './components/data/searchgrid/searchgrid.js';
|
|
31
32
|
export * from './components/data/table/table.js';
|
|
@@ -35,6 +36,7 @@ export * from './components/data/tree/tree.js';
|
|
|
35
36
|
export * from './components/data/treegrid/treegrid.js';
|
|
36
37
|
export * from './components/data/viewmanager/viewmanager.js';
|
|
37
38
|
export * from './components/dates/calendar/calendar.js';
|
|
39
|
+
export * from './components/feedback/alert/alert.js';
|
|
38
40
|
export * from './components/feedback/spinner/spinner.js';
|
|
39
41
|
export * from './components/fields/checkbox/checkbox.js';
|
|
40
42
|
export * from './components/fields/checkboxgroup/checkboxgroup.js';
|
|
@@ -16,8 +16,13 @@ export interface Layout {
|
|
|
16
16
|
isNarrow?(): boolean;
|
|
17
17
|
setNarrow?(narrow: boolean): void;
|
|
18
18
|
}
|
|
19
|
+
/** `type` plus that layout's options; the common ones are typed for the editor. */
|
|
19
20
|
export type LayoutConfig = {
|
|
20
21
|
type: string;
|
|
22
|
+
narrowBelow?: number;
|
|
23
|
+
gap?: number | string;
|
|
24
|
+
columns?: number | string;
|
|
25
|
+
open?: 'west' | 'east';
|
|
21
26
|
[option: string]: unknown;
|
|
22
27
|
};
|
|
23
28
|
export type LayoutSpec = string | LayoutConfig | Layout;
|
package/dist/ui.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as b,b as c,c as d,d as e,e as f,f as g,g as h,h as i,i as j,j as k}from"./chunk-LLHDEUIA.js";import{a}from"./chunk-
|
|
1
|
+
import{a as b,b as c,c as d,d as e,e as f,f as g,g as h,h as i,i as j,j as k}from"./chunk-LLHDEUIA.js";import{a}from"./chunk-WWETTEUZ.js";import"./chunk-VADYSXHY.js";import"./chunk-J6D4T4WY.js";import"./chunk-GYGX4VYF.js";import"./chunk-OQFQDTLL.js";import"./chunk-MMPPDQ2E.js";import"./chunk-XI4IBUE3.js";import"./chunk-MBRCE5A7.js";import"./chunk-EO2IXU2W.js";import"./chunk-4DW5WBZB.js";import"./chunk-NAWQBQ57.js";import"./chunk-I5KHVFJ4.js";import"./chunk-YRCR5ELY.js";import"./chunk-NYXRPWIB.js";import"./chunk-BHKI2SU3.js";import"./chunk-MRDX3RVJ.js";import"./chunk-LRUKKIYA.js";import"./chunk-IB5T27PW.js";import"./chunk-JF4WPGJQ.js";import"./chunk-WVJSNE6Q.js";import"./chunk-R52OSARY.js";import"./chunk-DHUBCB4H.js";import"./chunk-VOCGAAG7.js";import"./chunk-TJJL2GSJ.js";import"./chunk-5WE2JOBY.js";import"./chunk-IE7KRNFJ.js";import"./chunk-EQ4IWYLW.js";import"./chunk-FTZMF2QX.js";import"./chunk-H2KFAM7L.js";import"./chunk-TJXH3F7Z.js";import"./chunk-6IXVTWFH.js";import"./chunk-BPCD37A2.js";import"./chunk-NBR5IRZT.js";import"./chunk-SQTM4QFP.js";import"./chunk-OVEQUN4V.js";import"./chunk-VCYCNSJY.js";import"./chunk-KVUELLYF.js";import"./chunk-QT5JRZZJ.js";import"./chunk-2GKIF7A6.js";import"./chunk-OWEQT2HN.js";import"./chunk-U5RENLU4.js";import"./chunk-E4VNLYO2.js";import"./chunk-676AKAGF.js";import"./chunk-VV7CFMPZ.js";import"./chunk-RI62AESU.js";import"./chunk-TIPK3SCJ.js";import"./chunk-KMBTJ5AG.js";import"./chunk-PZSHOSOS.js";import"./chunk-IODSL7KU.js";import"./chunk-XFDNXSU5.js";import"./chunk-L5SQQFO7.js";import"./chunk-3VDLX7ET.js";import"./chunk-S4QD5NID.js";import"./chunk-6NCXO5ZP.js";import"./chunk-4AA4FQEM.js";import"./chunk-2UPUC4RK.js";import"./chunk-V5G5JECN.js";import"./chunk-4C666HHU.js";export{d as Direction,c as LabelPos,g as LayoutKind,j as Op,e as Region,h as Selection,f as Side,k as ThemeName,i as ToastType,b as Variant,a as ui};
|
|
2
2
|
//# sourceMappingURL=ui.js.map
|
package/package.json
CHANGED
package/dist/chunk-AQ3RTHG5.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as n}from"./chunk-TIPK3SCJ.js";import{f as o}from"./chunk-UDXO3KM3.js";var t=class extends o{baseCls="op-label";build(){let e=document.createElement(this.config.for?"label":"span");return e.className="op-label",this.config.for&&(e.htmlFor=this.config.for),e}onRender(){this.setText(this.config.text??""),this.setVariant(this.config.variant??"default")}setText(e){this.config.text=e,this.rendered&&(this.el.textContent=e)}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let i of["default","muted","title"])this.el.classList.toggle(`op-label--${i}`,i===e)}};n("label",t);export{t as a};
|
|
2
|
-
//# sourceMappingURL=chunk-AQ3RTHG5.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/base/label/label.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\n\nexport interface LabelConfig extends ComponentConfig {\n text?: string;\n /** Id of the field this label names (renders a `<label for>`). */\n for?: string;\n variant?: 'default' | 'muted' | 'title';\n}\n\nexport class Label extends Component<LabelConfig> {\n protected override baseCls = 'op-label';\n protected override build() {\n const el = document.createElement(this.config.for ? 'label' : 'span');\n el.className = 'op-label';\n if (this.config.for) (el as HTMLLabelElement).htmlFor = this.config.for;\n return el;\n }\n protected override onRender() {\n this.setText(this.config.text ?? '');\n this.setVariant(this.config.variant ?? 'default');\n }\n setText(text: string) {\n this.config.text = text;\n if (this.rendered) this.el.textContent = text;\n }\n setVariant(variant: NonNullable<LabelConfig['variant']>) {\n this.config.variant = variant;\n if (!this.rendered) return;\n for (const v of ['default', 'muted', 'title']) this.el.classList.toggle(`op-label--${v}`, v === variant);\n }\n}\nregister('label', Label);\n"],
|
|
5
|
-
"mappings": "gFAUO,IAAMA,EAAN,cAAoBC,CAAuB,CAC7B,QAAU,WACV,OAAQ,CACzB,IAAMC,EAAK,SAAS,cAAc,KAAK,OAAO,IAAM,QAAU,MAAM,EACpE,OAAAA,EAAG,UAAY,WACX,KAAK,OAAO,MAAMA,EAAwB,QAAU,KAAK,OAAO,KAC7DA,CACT,CACmB,UAAW,CAC5B,KAAK,QAAQ,KAAK,OAAO,MAAQ,EAAE,EACnC,KAAK,WAAW,KAAK,OAAO,SAAW,SAAS,CAClD,CACA,QAAQC,EAAc,CACpB,KAAK,OAAO,KAAOA,EACf,KAAK,WAAU,KAAK,GAAG,YAAcA,EAC3C,CACA,WAAWC,EAA8C,CAEvD,GADA,KAAK,OAAO,QAAUA,EAClB,EAAC,KAAK,SACV,QAAWC,IAAK,CAAC,UAAW,QAAS,OAAO,EAAG,KAAK,GAAG,UAAU,OAAO,aAAaA,CAAC,GAAIA,IAAMD,CAAO,CACzG,CACF,EACAE,EAAS,QAASN,CAAK",
|
|
6
|
-
"names": ["Label", "Component", "el", "text", "variant", "v", "register"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/layout/layout.ts", "../src/core/container.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Component } from '../core/component';\nimport type { Container } from '../core/container';\nimport { px } from '../core/dom';\n\nexport interface Layout {\n init(c: Container): void;\n add?(c: Container, cmp: Component, index: number): void;\n remove?(c: Container, cmp: Component, index: number): void;\n /** Card only. */\n activate?(c: Container, cmp: Component): void;\n getActive?(c: Container): Component | undefined;\n /** Border only: below `narrowBelow` the west/east regions become drawers; these open and close them. */\n openRegion?(name: string): void;\n closeRegion?(name?: string): void;\n toggleRegion?(name: string): void;\n isRegionOpen?(name: string): boolean;\n /** Layouts that adapt to the width: whether the container is currently narrow, and a way to force it (tests, previews). */\n isNarrow?(): boolean;\n setNarrow?(narrow: boolean): void;\n}\n\nexport type LayoutConfig = { type: string; [option: string]: unknown };\nexport type LayoutSpec = string | LayoutConfig | Layout;\nexport type LayoutFactory = (config: Record<string, any>) => Layout;\n\nconst factories = new Map<string, LayoutFactory>();\n\n/** Registers a layout strategy under a name; users add their own the same way. */\nexport function registerLayout(name: string, factory: LayoutFactory): void {\n factories.set(name, factory);\n}\n\nexport function createLayout(spec: LayoutSpec): Layout {\n if (typeof spec === 'object' && 'init' in spec) return spec as Layout;\n const cfg = (typeof spec === 'string' ? { type: spec } : spec) as LayoutConfig;\n const f = factories.get(cfg.type);\n if (!f) throw new Error(`Optikos: unknown layout \"${cfg.type}\"`);\n return f(cfg);\n}\n\n/**\n * Keeps the class `is-narrow` on the container body while it is narrower than `below` px (a ResizeObserver on the\n * container itself, not the window, so a layout inside a small panel adapts too). Emits `narrow-change` on the container.\n */\nfunction watchNarrow(c: Container, below: number, on?: (narrow: boolean) => void) {\n const body = c.getBody();\n let narrow = false;\n const set = (n: boolean) => {\n if (n === narrow) return;\n narrow = n;\n body.classList.toggle('is-narrow', n);\n on?.(n);\n c.emit('narrow-change', n);\n };\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => body.clientWidth > 0 && set(body.clientWidth < below));\n ro.observe(body);\n c.own(() => ro.disconnect());\n }\n return { isNarrow: () => narrow, setNarrow: set };\n}\n\n/** Layouts that are only a class plus custom properties; the CSS does the work. */\nconst cssLayout =\n (name: string, vars: string[] = []): LayoutFactory =>\n (cfg) => ({\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', `op-layout-${name}`);\n for (const v of vars) if (cfg[v] != null) body.style.setProperty(`--op-layout-${v}`, px(cfg[v]));\n },\n });\n\nregisterLayout('fit', cssLayout('fit'));\nconst hbox = cssLayout('hbox', ['gap', 'align', 'justify', 'wrap']);\n/** `stackBelow: 600`: under that width the row becomes a column. */\nregisterLayout('hbox', (cfg) => {\n const base = hbox(cfg);\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n ...base,\n init(c) {\n base.init(c);\n if (cfg.stackBelow) {\n c.getBody().classList.add('op-layout-stack');\n w = watchNarrow(c, Number(cfg.stackBelow));\n }\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\nregisterLayout('vbox', cssLayout('vbox', ['gap', 'align', 'justify', 'wrap']));\n\n/** Numeric `columns` collapse to one column under `narrowBelow` px (default 480; `0` turns it off). */\nregisterLayout('grid', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-grid');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n const cols = cfg.columns ?? 1;\n if (typeof cols === 'number') {\n body.style.setProperty('--op-layout-columns', String(cols));\n const below = cfg.narrowBelow == null ? 480 : Number(cfg.narrowBelow);\n if (below > 0 && cols > 1) w = watchNarrow(c, below);\n } else body.style.gridTemplateColumns = cols;\n },\n add(_c, cmp) {\n const span = cmp.config.colspan;\n if (span) cmp.el.style.gridColumn = span === 'full' ? '1 / -1' : `span ${span}`;\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\n/**\n * Regions around a center. Under `narrowBelow` px (default 768) the west and east regions leave the grid and become\n * drawers over the center, closed until `openRegion('west')` (or `open: 'west'` in the layout config, to start open).\n * A scrim behind an open drawer closes it on click; Esc closes it too.\n */\nregisterLayout('border', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n let cont!: Container;\n const regions = () => Array.from(cont.getBody().children).filter((e): e is HTMLElement => e instanceof HTMLElement && (e.dataset.region === 'west' || e.dataset.region === 'east'));\n const find = (name: string) => regions().find((e) => e.dataset.region === name);\n const sync = () => cont.getBody().classList.toggle('has-open-region', regions().some((e) => e.classList.contains('is-open')));\n const close = (name?: string) => {\n for (const e of regions()) if (!name || e.dataset.region === name) e.classList.remove('is-open');\n sync();\n };\n return {\n init(c) {\n cont = c;\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-border');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n w = watchNarrow(c, cfg.narrowBelow == null ? 768 : Number(cfg.narrowBelow), (narrow) => {\n if (!narrow) close();\n else if (cfg.open) find(String(cfg.open))?.classList.add('is-open'), sync();\n });\n // the scrim is the body's own ::after: a click that lands on the body itself (not a child) closes the drawer\n c.listen(body, 'click', (e: Event) => e.target === body && close());\n c.listen(body, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && body.classList.contains('has-open-region') && body.classList.contains('is-narrow')) {\n e.stopPropagation();\n close();\n }\n });\n },\n add(_c, cmp) {\n const region = cmp.config.region ?? 'center';\n cmp.el.style.gridArea = region;\n cmp.el.dataset.region = region;\n },\n openRegion(name) {\n const e = find(name);\n if (!e || !w?.isNarrow()) return;\n close();\n e.classList.add('is-open');\n sync();\n (e.querySelector<HTMLElement>('input,button,[tabindex]') ?? e).focus?.();\n },\n closeRegion: close,\n toggleRegion(name) {\n if (find(name)?.classList.contains('is-open')) close(name);\n else this.openRegion!(name);\n },\n isRegionOpen: (name) => !!find(name)?.classList.contains('is-open'),\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\nregisterLayout('card', (cfg) => {\n let active: Component | undefined;\n // children that were never rendered (lazy tabs) only get the flag; their DOM is not built just to hide it\n const show = (c: Container, cmp: Component | undefined) => {\n active = cmp;\n for (const i of c.items) {\n if (i.rendered) i.el.hidden = i !== cmp;\n else i.config.hidden = i !== cmp;\n }\n c.emit('activate', cmp);\n };\n return {\n init(c) {\n c.getBody().classList.add('op-layout', 'op-layout-fit');\n const a = cfg.activeItem ?? c.config.activeItem ?? 0;\n show(c, typeof a === 'number' ? c.items[a] : c.items.find((i) => i.id === a));\n },\n add(c, cmp) {\n cmp.el.hidden = cmp !== active && !!active;\n if (!active) show(c, cmp);\n },\n remove(c, cmp, index) {\n if (cmp === active) show(c, c.items[Math.min(index, c.items.length - 1)]);\n },\n activate: show,\n getActive: () => active,\n };\n});\n", "import { Component, type ComponentConfig, type Parent } from './component';\nimport { create, type AnyConfig } from './registry';\nimport { createLayout, type Layout, type LayoutSpec } from '../layout/layout';\n\n/** What a Tabs header reads from its panel (any Container, not just Panel). */\nexport interface TabPanelConfig {\n title?: string;\n icon?: string;\n closable?: boolean;\n reloadable?: boolean;\n /** Called by the tab's \u21BB; a returned Promise keeps the tab busy until it settles. */\n onReload?: (panel: any) => void | Promise<unknown>;\n}\n\nexport interface ContainerConfig extends ComponentConfig, TabPanelConfig {\n items?: Array<AnyConfig | Component | string>;\n layout?: LayoutSpec;\n /** Config merged into every item that does not set the key itself. */\n defaults?: Record<string, unknown>;\n /** `type` used by items that do not declare one. */\n defaultType?: string;\n /** Layout `card`: initial visible child (index or id). */\n activeItem?: number | string;\n}\n\nexport class Container<C extends ContainerConfig = ContainerConfig> extends Component<C> implements Parent {\n protected override baseCls = 'op-container';\n protected defaultLayout: LayoutSpec | undefined;\n items: Component[] = [];\n layout?: Layout;\n\n constructor(config: C = {} as C) {\n super(config);\n this.items = (config.items ?? []).map((i) => this.make(i));\n }\n\n /** Element that holds the children. Panels override it. */\n getBody(): HTMLElement {\n return this.el;\n }\n\n /** Turns shorthand strings (`'->'`) into configs. Subclasses override; the base has none. */\n protected shorthand(s: string): AnyConfig {\n throw new Error(`Optikos: no shorthand for item \"${s}\" in ${this.baseCls}`);\n }\n\n private make(item: AnyConfig | Component | string): Component {\n if (typeof item === 'string') item = this.shorthand(item);\n const c = item instanceof Component ? item : create({ type: this.config.defaultType, ...this.config.defaults, ...item });\n c.parent = this;\n return c;\n }\n\n protected override onRender(): void {\n const spec = this.config.layout ?? this.defaultLayout;\n if (spec) (this.layout = createLayout(spec)).init(this);\n this.items.forEach((c, i) => this.attach(c, i));\n }\n\n protected attach(c: Component, index: number): void {\n const body = this.getBody();\n const next = this.items.slice(index + 1).find((x) => x.rendered && x.el.parentNode === body);\n body.insertBefore(c.el, next?.el ?? null);\n this.layout?.add?.(this, c, index);\n if (this.mounted) c.notifyMount();\n }\n\n add(item: AnyConfig | Component | string): Component {\n return this.insert(this.items.length, item);\n }\n\n insert(index: number, item: AnyConfig | Component | string): Component {\n const c = this.make(item);\n this.items.splice(index, 0, c);\n if (this.rendered) this.attach(c, index);\n this.emit('add', c);\n return c;\n }\n\n /** Removes a child (by instance, id or index). Destroys it unless `destroy` is `false`. */\n remove(child: Component | string | number, destroy = true): Component | undefined {\n const i = typeof child === 'number' ? child : this.items.findIndex((c) => c === child || c.id === child);\n const c = this.items[i];\n if (!c) return;\n this.items.splice(i, 1);\n c.parent = undefined;\n this.layout?.remove?.(this, c, i);\n if (destroy) c.destroy();\n else if (c.rendered) c.el.remove();\n this.emit('remove', c);\n return c;\n }\n\n removeAll(destroy = true): void {\n for (const c of [...this.items]) this.remove(c, destroy);\n }\n\n getItems(): Component[] {\n return this.items;\n }\n\n /** Direct child by id. */\n get(id: string): Component | undefined {\n return this.items.find((c) => c.id === id);\n }\n\n /** All descendants (depth-first) matching `fn`. */\n query(fn: (c: Component) => boolean): Component[] {\n const out: Component[] = [];\n for (const c of this.items) {\n if (fn(c)) out.push(c);\n if (c instanceof Container) out.push(...c.query(fn));\n }\n return out;\n }\n\n /** Layout `card`: which child is visible. */\n getActiveItem(): Component | undefined {\n return this.layout?.getActive?.(this);\n }\n setActiveItem(item: Component | string | number): void {\n const c = typeof item === 'number' ? this.items[item] : this.items.find((x) => x === item || x.id === item);\n if (c) this.layout?.activate?.(this, c);\n }\n\n override notifyMount(): void {\n super.notifyMount();\n for (const c of this.items) c.notifyMount();\n }\n\n protected override onDestroy(): void {\n for (const c of [...this.items]) c.destroy();\n }\n\n override setDisabled(disabled: boolean): void {\n super.setDisabled(disabled);\n for (const c of this.items) c.setDisabled(disabled);\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["factories", "registerLayout", "name", "factory", "createLayout", "spec", "cfg", "f", "watchNarrow", "c", "below", "on", "body", "narrow", "set", "n", "ro", "cssLayout", "vars", "v", "px", "hbox", "base", "w", "cols", "_c", "cmp", "span", "cont", "regions", "e", "find", "sync", "close", "region", "active", "show", "i", "a", "index", "Container", "_Container", "Component", "config", "i", "s", "item", "c", "create", "spec", "createLayout", "index", "body", "next", "x", "child", "destroy", "id", "fn", "out", "disabled"]
|
|
7
|
-
}
|
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-DLRGB5NY.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as u}from"./chunk-ZEIE2OCQ.js";import{c as o}from"./chunk-DIOJGTUN.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-UDXO3KM3.js";import{b as e}from"./chunk-PZSHOSOS.js";import{b as c}from"./chunk-XFDNXSU5.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-DLRGB5NY.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-GNKVLJ5H.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as v}from"./chunk-MQEALOU3.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-GNKVLJ5H.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-NAUSRVB6.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as c}from"./chunk-EO777UIN.js";import{a as h}from"./chunk-OB3VIRQR.js";import{a as p}from"./chunk-QVBDBGS4.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-NAUSRVB6.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
|
-
}
|
package/dist/chunk-TVO3Z2BM.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as g}from"./chunk-LHWY6G6Q.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{e as h,f as m}from"./chunk-S4QD5NID.js";h("en",{maskIncomplete:"Complete the format {mask}"});h("pt-BR",{maskIncomplete:"Complete o formato {mask}"});var f={0:/\d/,A:/\p{L}/u,"*":/./su};function u(l){let t=[];for(let e=0;e<l.length;e++){let i=l[e];i==="\\"&&e+1<l.length?t.push({lit:l[++e]}):t.push(i in f?{kind:i}:{lit:i})}return t}var c=l=>l.filter(t=>"kind"in t).length,p=class extends g{baseCls="op-field op-textfield op-maskfield";masks=[];compiled(){let t=this.config.mask;return this.masks=(Array.isArray(t)?t:[t]).map(u).sort((e,i)=>c(e)-c(i))}extract(t){let e=this.masks.length?this.masks:this.compiled(),i=new Set(e.flatMap(r=>r.flatMap(o=>"lit"in o?[o.lit]:[]))),s=e.some(r=>r.some(o=>"kind"in o&&o.kind==="*")),n="";for(let r of t)i.has(r)&&(!s||!/[\p{L}\d]/u.test(r))||(n+=r);return n}pick(t){let e=this.masks.length?this.masks:this.compiled();return e.find(i=>c(i)>=t.length)??e[e.length-1]}format(t,e=this.pick(t)){let i="",s=0;for(let n of e){if(s>=t.length)break;if("lit"in n){i+=n.lit;continue}for(;s<t.length&&!f[n.kind].test(t[s]);)s++;s<t.length&&(i+=t[s++])}return i}norm(t){let e=this.format(this.extract(t??""));return this.config.raw?this.extract(e):e}display(t){return this.format(this.extract(t??""))}setValue(t,e=!1){super.setValue(this.norm(t),e)}createControl(){let t=super.createControl(),e=this.compiled()[0];return this.config.placeholder||(this.input.placeholder=e.map(i=>"lit"in i?i.lit:"_").join("")),this.masks.every(i=>i.every(s=>"lit"in s||s.kind==="0"))&&this.input.setAttribute("inputmode","numeric"),t}onInput(){let t=this.input,e=t.selectionStart??t.value.length,i=this.extract(t.value.slice(0,e)).length,s=this.extract(t.value),n=this.format(s),r=e>=t.value.length;if(t.value=n,!r&&document.activeElement===t){let o=0,a=0;for(;a<n.length&&o<i;)this.extract(n[a++]).length&&o++;t.setSelectionRange(a,a)}this.el.classList.toggle("has-value",!!n),this.commit(this.config.raw?this.extract(n):n),this.error&&this.validate()}check(){let t=super.check(),e=this.extract(this.value??"");if(t||!e)return t;let i=this.pick(e);return e.length<c(i)?m("maskIncomplete",{mask:i.map(s=>"lit"in s?s.lit:"_").join("")}):""}setMask(t){this.config.mask=t,this.compiled(),this.rendered&&this.setValue(this.value,!0)}};d("maskfield",p);export{p as a};
|
|
2
|
-
//# sourceMappingURL=chunk-TVO3Z2BM.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/fields/maskfield/maskfield.ts"],
|
|
4
|
-
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { maskIncomplete: 'Complete the format {mask}' });\naddMessages('pt-BR', { maskIncomplete: 'Complete o formato {mask}' });\n\nexport interface MaskFieldConfig extends TextFieldConfig {\n /**\n * The pattern: `0` a digit, `A` a letter, `*` any character, `\\` makes the next character a literal. A list picks the\n * pattern by length: `['000.000.000-00', '00.000.000/0000-00']` is a CPF until the 12th digit, then a CNPJ.\n * The core knows no country: formats like these belong to the app.\n */\n mask: string | string[];\n /** The value is only what was typed into the slots (`12345678900`), not the formatted text (`123.456.789-00`). Default false. */\n raw?: boolean;\n}\n\ntype Slot = { kind: '0' | 'A' | '*' } | { lit: string };\nconst KINDS: Record<string, RegExp> = { 0: /\\d/, A: /\\p{L}/u, '*': /./su };\n\nfunction compile(mask: string): Slot[] {\n const out: Slot[] = [];\n for (let i = 0; i < mask.length; i++) {\n const ch = mask[i];\n if (ch === '\\\\' && i + 1 < mask.length) out.push({ lit: mask[++i] });\n else out.push(ch in KINDS ? { kind: ch as '0' | 'A' | '*' } : { lit: ch });\n }\n return out;\n}\nconst slots = (m: Slot[]) => m.filter((s) => 'kind' in s).length;\n\n/** A text field that formats what is typed into a pattern (phone, tax id, postal code, plate...). */\nexport class MaskField extends TextField<string, MaskFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-maskfield';\n private masks: Slot[][] = [];\n\n private compiled(): Slot[][] {\n const m = this.config.mask;\n return (this.masks = (Array.isArray(m) ? m : [m]).map(compile).sort((a, b) => slots(a) - slots(b)));\n }\n\n /** What was typed into the slots: the literals of the patterns are dropped (with a `*` slot, only where the text repeats one). */\n private extract(text: string): string {\n const masks = this.masks.length ? this.masks : this.compiled();\n const lits = new Set(masks.flatMap((m) => m.flatMap((s) => ('lit' in s ? [s.lit] : []))));\n const wild = masks.some((m) => m.some((s) => 'kind' in s && s.kind === '*'));\n let out = '';\n for (const ch of text) if (!(lits.has(ch) && (!wild || !/[\\p{L}\\d]/u.test(ch)))) out += ch;\n return out;\n }\n\n private pick(raw: string): Slot[] {\n const masks = this.masks.length ? this.masks : this.compiled();\n return masks.find((m) => slots(m) >= raw.length) ?? masks[masks.length - 1];\n }\n\n private format(raw: string, mask = this.pick(raw)): string {\n let out = '';\n let i = 0;\n for (const s of mask) {\n if (i >= raw.length) break;\n if ('lit' in s) {\n out += s.lit;\n continue;\n }\n while (i < raw.length && !KINDS[s.kind].test(raw[i])) i++;\n if (i < raw.length) out += raw[i++];\n }\n return out;\n }\n\n private norm(v: string | null): string {\n const text = this.format(this.extract(v ?? ''));\n return this.config.raw ? this.extract(text) : text;\n }\n\n protected override display(v: string): string {\n return this.format(this.extract(v ?? ''));\n }\n\n override setValue(v: string, silent = false): void {\n super.setValue(this.norm(v), silent);\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const sample = this.compiled()[0];\n if (!this.config.placeholder) this.input.placeholder = sample.map((s) => ('lit' in s ? s.lit : '_')).join('');\n if (this.masks.every((m) => m.every((s) => 'lit' in s || s.kind === '0'))) this.input.setAttribute('inputmode', 'numeric');\n return wrap;\n }\n\n protected override onInput() {\n const input = this.input;\n const caret = input.selectionStart ?? input.value.length;\n const before = this.extract(input.value.slice(0, caret)).length;\n const raw = this.extract(input.value);\n const text = this.format(raw);\n const atEnd = caret >= input.value.length;\n input.value = text;\n if (!atEnd && document.activeElement === input) {\n // the caret stays after the same number of typed characters\n let n = 0;\n let pos = 0;\n while (pos < text.length && n < before) if (this.extract(text[pos++]).length) n++;\n input.setSelectionRange(pos, pos);\n }\n this.el.classList.toggle('has-value', !!text);\n this.commit(this.config.raw ? this.extract(text) : text);\n if (this.error) this.validate();\n }\n\n protected override check(): string {\n const base = super.check();\n const raw = this.extract(this.value ?? '');\n if (base || !raw) return base;\n const mask = this.pick(raw);\n if (raw.length < slots(mask)) return t('maskIncomplete', { mask: mask.map((s) => ('lit' in s ? s.lit : '_')).join('') });\n return '';\n }\n\n setMask(mask: string | string[]) {\n this.config.mask = mask;\n this.compiled();\n if (this.rendered) this.setValue(this.value, true);\n }\n}\nregister('maskfield', MaskField);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "KINDS", "compile", "mask", "out", "i", "ch", "slots", "m", "s", "MaskField", "TextField", "a", "b", "text", "masks", "lits", "wild", "raw", "v", "silent", "wrap", "sample", "input", "caret", "before", "atEnd", "n", "pos", "base", "t", "register"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/core/permission.ts", "../src/core/component.ts"],
|
|
4
|
-
"sourcesContent": ["export type PermissionMode = 'hide' | 'disable';\n\nlet resolver: ((permission: string) => boolean) | undefined;\nlet mode: PermissionMode = 'hide';\n\n/** The app's answer to \"may the user do this?\". Without one, every `permission` is granted. */\nexport function setPermissionResolver(fn: ((permission: string) => boolean) | undefined): void {\n resolver = fn;\n}\n\n/** What a component without access does by default: `hide` (default) or `disable`. A component's `permissionMode` wins. */\nexport function setPermissionMode(m: PermissionMode): void {\n mode = m;\n}\n\nexport const allowed = (permission?: string): boolean => !permission || !resolver || resolver(permission);\nexport const permissionMode = (): PermissionMode => mode;\n\n/** Applies each item's `permission` to a list: denied items are dropped (`hide`) or come back `disabled` (`disable`). Nested `items` too. */\nexport function gate<T extends { permission?: string }>(list: T[] | undefined): T[] | undefined {\n return list?.flatMap((i) => {\n const sub = (i as { items?: T[] }).items;\n if (allowed(i.permission)) return [sub ? { ...i, items: gate(sub) } : i];\n return mode === 'hide' ? [] : [{ ...i, disabled: sub ? () => true : true }];\n });\n}\n", "import { Emitter, type Handler } from './emitter';\nimport { h, uid, kebab, px } from './dom';\nimport { t } from './i18n';\nimport { allowed, permissionMode } from './permission';\n\nexport interface ComponentConfig {\n type?: string;\n id?: string;\n cls?: string;\n style?: string | Record<string, string | number>;\n hidden?: boolean;\n disabled?: boolean;\n width?: number | string;\n height?: number | string;\n flex?: number | string;\n tooltip?: string;\n /** Inside a Form: shown only while this returns true (given the form values). A field hidden this way neither validates nor goes into `getValues`. */\n showIf?: (values: Record<string, any>) => boolean;\n /** Inside a Form: enabled only while this returns true (given the form values). */\n enableIf?: (values: Record<string, any>) => boolean;\n /** A permission name: without it (per `setPermissionResolver`) the component is hidden, or disabled with `permissionMode: 'disable'`. */\n permission?: string;\n permissionMode?: 'hide' | 'disable';\n /** Component-scoped tokens: `{ radius: '0' }` on a button sets `--op-button-radius`. Keys starting with `--` are used as is. */\n theme?: Record<string, string | number>;\n /**\n * Default `true`: the component keeps its size when only its *state* changes (loading, searching, invalid).\n * The CSS reserves room for the state's extra content instead of growing. `false` lets it fit the content.\n * Does not apply to new *content* (`setText` with a longer text).\n */\n stableSize?: boolean;\n /** `true` or a text: shows a mask with a spinner over the component. */\n loading?: boolean | string;\n ariaLabel?: string;\n /** Layout `border`: where the item goes. */\n region?: 'north' | 'south' | 'west' | 'east' | 'center';\n /** Layout `grid`: columns spanned; `'full'` takes the whole row. */\n colspan?: number | 'full';\n listeners?: Record<string, Handler>;\n renderTo?: string | HTMLElement;\n /** Free slot for application data. */\n data?: unknown;\n}\n\n/** Anything that owns children (Container) and accepts being asked to drop one. */\nexport interface Parent {\n remove(child: Component, destroy?: boolean): unknown;\n}\n\nexport class Component<C extends ComponentConfig = ComponentConfig> extends Emitter {\n static type?: string;\n /** Called with every new component, config in hand: `optikos/dev` uses it to warn about options nobody reads. */\n static onCreate?: (c: Component<any>) => void;\n config: C;\n readonly id: string;\n parent?: Component & Parent;\n rendered = false;\n mounted = false;\n destroyed = false;\n protected baseCls = 'op-component';\n protected tag: keyof HTMLElementTagNameMap = 'div';\n private _el?: HTMLElement;\n private disposers: Array<() => void> = [];\n private mask?: HTMLElement;\n\n constructor(config: C = {} as C) {\n super();\n this.config = { ...config, type: config.type ?? (new.target as typeof Component).type };\n this.id = config.id ?? uid('op');\n Component.onCreate?.(this);\n for (const k in config.listeners) this.on(k, config.listeners[k]);\n // `new` and `create` must agree: a microtask, because the subclass constructor has not finished yet. `create` mounts first.\n if (config.renderTo) queueMicrotask(() => !this.mounted && !this.destroyed && !this.parent && this.mount(config.renderTo));\n }\n\n /** The root element. Built on first access. */\n get el(): HTMLElement {\n return this._el ?? this.render();\n }\n\n // ---- lifecycle (template method) ----------------------------------------------------------\n\n /** Builds the root element. Subclasses override to create their own DOM. */\n protected build(): HTMLElement {\n return h(this.tag, this.baseCls);\n }\n protected onRender(): void {}\n protected onMount(): void {}\n protected onDestroy(): void {}\n\n /** Builds the DOM once. Safe to call repeatedly. */\n render(): HTMLElement {\n if (this._el) return this._el;\n const el = (this._el = this.build());\n this.rendered = true;\n const c = this.config;\n el.id = this.id;\n if (c.cls) el.classList.add(...c.cls.split(/\\s+/).filter(Boolean));\n if (typeof c.style === 'string') el.style.cssText += c.style;\n else if (c.style) for (const k in c.style) el.style.setProperty(kebab(k), String(c.style[k]));\n if (c.width != null) el.style.width = px(c.width);\n if (c.height != null) el.style.height = px(c.height);\n if (c.flex != null) el.style.flex = String(c.flex);\n if (c.ariaLabel) el.setAttribute('aria-label', c.ariaLabel);\n this.setStableSize(c.stableSize !== false);\n if (c.hidden || this.denied('hide')) el.hidden = true;\n if (c.tooltip) el.dataset.opTip = c.tooltip;\n if (c.theme) this.setTheme(c.theme);\n this.onRender();\n if (c.disabled || this.denied('disable')) this.setDisabled(true);\n if (c.loading) this.setLoading(c.loading);\n return el;\n }\n\n /** Appends to a target (default `document.body`) and fires `onMount` for the whole subtree. */\n mount(target: string | HTMLElement = document.body): this {\n const parent = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (!parent) throw new Error(`Optikos: mount target not found: ${String(target)}`);\n parent.appendChild(this.el);\n this.notifyMount();\n return this;\n }\n\n /** Called when the element becomes part of a mounted tree. Containers override to reach children. */\n notifyMount(): void {\n if (this.mounted || this.destroyed) return;\n this.mounted = true;\n this.onMount();\n this.emit('mount');\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.onDestroy();\n for (const d of this.disposers.splice(0).reverse()) d();\n this.parent?.remove(this, false);\n this.parent = undefined;\n this._el?.remove();\n this.emit('destroy');\n this.clearListeners();\n }\n\n // ---- resources released on destroy --------------------------------------------------------\n\n /** Registers a function to run on `destroy` (listeners, timers, effects). Returns it. */\n own<F extends () => void>(fn: F): F {\n this.disposers.push(fn);\n return fn;\n }\n\n /** Adds a DOM listener released on `destroy`. */\n listen(target: EventTarget, type: string, fn: (e: any) => void, opts?: AddEventListenerOptions | boolean): () => void {\n target.addEventListener(type, fn, opts);\n return this.own(() => target.removeEventListener(type, fn, opts));\n }\n\n /** `setTimeout` released on `destroy`; returns the cancel function. */\n later(fn: () => void, ms: number): () => void {\n const id = setTimeout(fn, ms);\n return this.own(() => clearTimeout(id));\n }\n\n // ---- common state / setters ---------------------------------------------------------------\n\n protected onDisabled(_disabled: boolean): void {}\n\n setDisabled(disabled: boolean): void {\n this.config.disabled = disabled || this.denied('disable');\n disabled = !!this.config.disabled;\n if (!this.rendered) return;\n this.el.classList.toggle('is-disabled', disabled);\n this.onDisabled(disabled);\n }\n\n /** The user lacks `config.permission` and the way to deal with it is `mode`. */\n private denied(mode: 'hide' | 'disable'): boolean {\n return !allowed(this.config.permission) && (this.config.permissionMode ?? permissionMode()) === mode;\n }\n\n show(): void {\n if (this.denied('hide')) return;\n this.config.hidden = false;\n if (this.rendered) this.el.hidden = false;\n this.emit('show');\n }\n hide(): void {\n this.config.hidden = true;\n if (this.rendered) this.el.hidden = true;\n this.emit('hide');\n }\n isHidden(): boolean {\n return !!this.config.hidden;\n }\n\n addCls(name: string): void {\n this.el.classList.add(name);\n }\n removeCls(name: string): void {\n this.el.classList.remove(name);\n }\n toggleCls(name: string, on?: boolean): void {\n this.el.classList.toggle(name, on);\n }\n\n setWidth(v: number | string): void {\n this.config.width = v;\n if (this.rendered) this.el.style.width = px(v);\n }\n setHeight(v: number | string): void {\n this.config.height = v;\n if (this.rendered) this.el.style.height = px(v);\n }\n setFlex(v: number | string): void {\n this.config.flex = v;\n if (this.rendered) this.el.style.flex = String(v);\n }\n\n setStableSize(stable: boolean): void {\n this.config.stableSize = stable;\n if (this.rendered) this.el.classList.toggle('op-stable', stable);\n }\n\n setTooltip(text: string): void {\n this.config.tooltip = text;\n if (!this.rendered) return;\n if (text) this.el.dataset.opTip = text;\n else delete this.el.dataset.opTip;\n }\n\n setTheme(theme: Record<string, string | number>): void {\n const prefix = '--' + this.baseCls + '-';\n for (const k in theme) this.el.style.setProperty(k.startsWith('--') ? k : prefix + kebab(k), String(theme[k]));\n }\n\n /** Shows (or removes) a loading mask. A string is shown as text under the spinner. */\n setLoading(loading: boolean | string): void {\n this.config.loading = loading;\n if (!this.rendered) return;\n const el = this.el;\n this.mask?.remove();\n this.mask = undefined;\n el.classList.toggle('is-loading', !!loading);\n if (loading) el.setAttribute('aria-busy', 'true');\n else el.removeAttribute('aria-busy');\n if (loading) {\n this.mask = h('div', 'op-mask', {}, h('span', 'op-spinner', { role: 'progressbar', 'aria-label': t('loading') }), typeof loading === 'string' ? h('div', 'op-mask__text', {}, loading) : null);\n el.append(this.mask);\n }\n for (const child of Array.from(el.children)) if (child !== this.mask) child.toggleAttribute('inert', !!loading);\n }\n\n /** The element that receives focus on `focus()`. */\n protected focusEl(): HTMLElement {\n return this.el;\n }\n focus(): void {\n this.focusEl().focus();\n }\n}\n"],
|
|
5
|
-
"mappings": "6IAEA,IAAIA,EACAC,EAAuB,OAGpB,SAASC,EAAsBC,EAAyD,CAC7FH,EAAWG,CACb,CAGO,SAASC,EAAkBC,EAAyB,CACzDJ,EAAOI,CACT,CAEO,IAAMC,EAAWC,GAAiC,CAACA,GAAc,CAACP,GAAYA,EAASO,CAAU,EAC3FC,EAAiB,IAAsBP,EAG7C,SAASQ,EAAwCC,EAAwC,CAC9F,OAAOA,GAAM,QAASC,GAAM,CAC1B,IAAMC,EAAOD,EAAsB,MACnC,OAAIL,EAAQK,EAAE,UAAU,EAAU,CAACC,EAAM,CAAE,GAAGD,EAAG,MAAOF,EAAKG,CAAG,CAAE,EAAID,CAAC,EAChEV,IAAS,OAAS,CAAC,EAAI,CAAC,CAAE,GAAGU,EAAG,SAAUC,EAAM,IAAM,GAAO,EAAK,CAAC,CAC5E,CAAC,CACH,CCwBO,IAAMC,EAAN,MAAMC,UAA+DC,CAAQ,CAClF,OAAO,KAEP,OAAO,SACP,OACS,GACT,OACA,SAAW,GACX,QAAU,GACV,UAAY,GACF,QAAU,eACV,IAAmC,MACrC,IACA,UAA+B,CAAC,EAChC,KAER,YAAYC,EAAY,CAAC,EAAQ,CAC/B,MAAM,EACN,KAAK,OAAS,CAAE,GAAGA,EAAQ,KAAMA,EAAO,MAAS,WAAgC,IAAK,EACtF,KAAK,GAAKA,EAAO,IAAMC,EAAI,IAAI,EAC/BH,EAAU,WAAW,IAAI,EACzB,QAAWI,KAAKF,EAAO,UAAW,KAAK,GAAGE,EAAGF,EAAO,UAAUE,CAAC,CAAC,EAE5DF,EAAO,UAAU,eAAe,IAAM,CAAC,KAAK,SAAW,CAAC,KAAK,WAAa,CAAC,KAAK,QAAU,KAAK,MAAMA,EAAO,QAAQ,CAAC,CAC3H,CAGA,IAAI,IAAkB,CACpB,OAAO,KAAK,KAAO,KAAK,OAAO,CACjC,CAKU,OAAqB,CAC7B,OAAOG,EAAE,KAAK,IAAK,KAAK,OAAO,CACjC,CACU,UAAiB,CAAC,CAClB,SAAgB,CAAC,CACjB,WAAkB,CAAC,CAG7B,QAAsB,CACpB,GAAI,KAAK,IAAK,OAAO,KAAK,IAC1B,IAAMC,EAAM,KAAK,IAAM,KAAK,MAAM,EAClC,KAAK,SAAW,GAChB,IAAMC,EAAI,KAAK,OAGf,GAFAD,EAAG,GAAK,KAAK,GACTC,EAAE,KAAKD,EAAG,UAAU,IAAI,GAAGC,EAAE,IAAI,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC,EAC7D,OAAOA,EAAE,OAAU,SAAUD,EAAG,MAAM,SAAWC,EAAE,cAC9CA,EAAE,MAAO,QAAWH,KAAKG,EAAE,MAAOD,EAAG,MAAM,YAAYE,EAAMJ,CAAC,EAAG,OAAOG,EAAE,MAAMH,CAAC,CAAC,CAAC,EAC5F,OAAIG,EAAE,OAAS,OAAMD,EAAG,MAAM,MAAQG,EAAGF,EAAE,KAAK,GAC5CA,EAAE,QAAU,OAAMD,EAAG,MAAM,OAASG,EAAGF,EAAE,MAAM,GAC/CA,EAAE,MAAQ,OAAMD,EAAG,MAAM,KAAO,OAAOC,EAAE,IAAI,GAC7CA,EAAE,WAAWD,EAAG,aAAa,aAAcC,EAAE,SAAS,EAC1D,KAAK,cAAcA,EAAE,aAAe,EAAK,GACrCA,EAAE,QAAU,KAAK,OAAO,MAAM,KAAGD,EAAG,OAAS,IAC7CC,EAAE,UAASD,EAAG,QAAQ,MAAQC,EAAE,SAChCA,EAAE,OAAO,KAAK,SAASA,EAAE,KAAK,EAClC,KAAK,SAAS,GACVA,EAAE,UAAY,KAAK,OAAO,SAAS,IAAG,KAAK,YAAY,EAAI,EAC3DA,EAAE,SAAS,KAAK,WAAWA,EAAE,OAAO,EACjCD,CACT,CAGA,MAAMI,EAA+B,SAAS,KAAY,CACxD,IAAMC,EAAS,OAAOD,GAAW,SAAW,SAAS,cAA2BA,CAAM,EAAIA,EAC1F,GAAI,CAACC,EAAQ,MAAM,IAAI,MAAM,oCAAoC,OAAOD,CAAM,CAAC,EAAE,EACjF,OAAAC,EAAO,YAAY,KAAK,EAAE,EAC1B,KAAK,YAAY,EACV,IACT,CAGA,aAAoB,CACd,KAAK,SAAW,KAAK,YACzB,KAAK,QAAU,GACf,KAAK,QAAQ,EACb,KAAK,KAAK,OAAO,EACnB,CAEA,SAAgB,CACd,GAAI,MAAK,UACT,MAAK,UAAY,GACjB,KAAK,UAAU,EACf,QAAWC,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAGA,EAAE,EACtD,KAAK,QAAQ,OAAO,KAAM,EAAK,EAC/B,KAAK,OAAS,OACd,KAAK,KAAK,OAAO,EACjB,KAAK,KAAK,SAAS,EACnB,KAAK,eAAe,EACtB,CAKA,IAA0BC,EAAU,CAClC,YAAK,UAAU,KAAKA,CAAE,EACfA,CACT,CAGA,OAAOH,EAAqBI,EAAcD,EAAsBE,EAAsD,CACpH,OAAAL,EAAO,iBAAiBI,EAAMD,EAAIE,CAAI,EAC/B,KAAK,IAAI,IAAML,EAAO,oBAAoBI,EAAMD,EAAIE,CAAI,CAAC,CAClE,CAGA,MAAMF,EAAgBG,EAAwB,CAC5C,IAAMC,EAAK,WAAWJ,EAAIG,CAAE,EAC5B,OAAO,KAAK,IAAI,IAAM,aAAaC,CAAE,CAAC,CACxC,CAIU,WAAWC,EAA0B,CAAC,CAEhD,YAAYC,EAAyB,CACnC,KAAK,OAAO,SAAWA,GAAY,KAAK,OAAO,SAAS,EACxDA,EAAW,CAAC,CAAC,KAAK,OAAO,SACpB,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,cAAeA,CAAQ,EAChD,KAAK,WAAWA,CAAQ,EAC1B,CAGQ,OAAOC,EAAmC,CAChD,MAAO,CAACC,EAAQ,KAAK,OAAO,UAAU,IAAM,KAAK,OAAO,gBAAkBC,EAAe,KAAOF,CAClG,CAEA,MAAa,CACP,KAAK,OAAO,MAAM,IACtB,KAAK,OAAO,OAAS,GACjB,KAAK,WAAU,KAAK,GAAG,OAAS,IACpC,KAAK,KAAK,MAAM,EAClB,CACA,MAAa,CACX,KAAK,OAAO,OAAS,GACjB,KAAK,WAAU,KAAK,GAAG,OAAS,IACpC,KAAK,KAAK,MAAM,CAClB,CACA,UAAoB,CAClB,MAAO,CAAC,CAAC,KAAK,OAAO,MACvB,CAEA,OAAOG,EAAoB,CACzB,KAAK,GAAG,UAAU,IAAIA,CAAI,CAC5B,CACA,UAAUA,EAAoB,CAC5B,KAAK,GAAG,UAAU,OAAOA,CAAI,CAC/B,CACA,UAAUA,EAAcC,EAAoB,CAC1C,KAAK,GAAG,UAAU,OAAOD,EAAMC,CAAE,CACnC,CAEA,SAASC,EAA0B,CACjC,KAAK,OAAO,MAAQA,EAChB,KAAK,WAAU,KAAK,GAAG,MAAM,MAAQhB,EAAGgB,CAAC,EAC/C,CACA,UAAUA,EAA0B,CAClC,KAAK,OAAO,OAASA,EACjB,KAAK,WAAU,KAAK,GAAG,MAAM,OAAShB,EAAGgB,CAAC,EAChD,CACA,QAAQA,EAA0B,CAChC,KAAK,OAAO,KAAOA,EACf,KAAK,WAAU,KAAK,GAAG,MAAM,KAAO,OAAOA,CAAC,EAClD,CAEA,cAAcC,EAAuB,CACnC,KAAK,OAAO,WAAaA,EACrB,KAAK,UAAU,KAAK,GAAG,UAAU,OAAO,YAAaA,CAAM,CACjE,CAEA,WAAWC,EAAoB,CAC7B,KAAK,OAAO,QAAUA,EACjB,KAAK,WACNA,EAAM,KAAK,GAAG,QAAQ,MAAQA,EAC7B,OAAO,KAAK,GAAG,QAAQ,MAC9B,CAEA,SAASC,EAA8C,CACrD,IAAMC,EAAS,KAAO,KAAK,QAAU,IACrC,QAAWzB,KAAKwB,EAAO,KAAK,GAAG,MAAM,YAAYxB,EAAE,WAAW,IAAI,EAAIA,EAAIyB,EAASrB,EAAMJ,CAAC,EAAG,OAAOwB,EAAMxB,CAAC,CAAC,CAAC,CAC/G,CAGA,WAAW0B,EAAiC,CAE1C,GADA,KAAK,OAAO,QAAUA,EAClB,CAAC,KAAK,SAAU,OACpB,IAAMxB,EAAK,KAAK,GAChB,KAAK,MAAM,OAAO,EAClB,KAAK,KAAO,OACZA,EAAG,UAAU,OAAO,aAAc,CAAC,CAACwB,CAAO,EACvCA,EAASxB,EAAG,aAAa,YAAa,MAAM,EAC3CA,EAAG,gBAAgB,WAAW,EAC/BwB,IACF,KAAK,KAAOzB,EAAE,MAAO,UAAW,CAAC,EAAGA,EAAE,OAAQ,aAAc,CAAE,KAAM,cAAe,aAAc0B,EAAE,SAAS,CAAE,CAAC,EAAG,OAAOD,GAAY,SAAWzB,EAAE,MAAO,gBAAiB,CAAC,EAAGyB,CAAO,EAAI,IAAI,EAC7LxB,EAAG,OAAO,KAAK,IAAI,GAErB,QAAW0B,KAAS,MAAM,KAAK1B,EAAG,QAAQ,EAAO0B,IAAU,KAAK,MAAMA,EAAM,gBAAgB,QAAS,CAAC,CAACF,CAAO,CAChH,CAGU,SAAuB,CAC/B,OAAO,KAAK,EACd,CACA,OAAc,CACZ,KAAK,QAAQ,EAAE,MAAM,CACvB,CACF",
|
|
6
|
-
"names": ["resolver", "mode", "setPermissionResolver", "fn", "setPermissionMode", "m", "allowed", "permission", "permissionMode", "gate", "list", "i", "sub", "Component", "_Component", "Emitter", "config", "uid", "k", "h", "el", "c", "kebab", "px", "target", "parent", "d", "fn", "type", "opts", "ms", "id", "_disabled", "disabled", "mode", "allowed", "permissionMode", "name", "on", "v", "stable", "text", "theme", "prefix", "loading", "t", "child"]
|
|
7
|
-
}
|
package/dist/chunk-YJTUFK4P.js
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|