optikos 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -1
- package/dist/bind.js +1 -1
- package/dist/bind.js.map +4 -4
- package/dist/build.js +2 -0
- package/dist/build.js.map +7 -0
- package/dist/chunk-2CVMT3IW.js +3 -0
- package/dist/chunk-2CVMT3IW.js.map +7 -0
- package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
- package/dist/{chunk-5BC72727.js → chunk-2I4Y7I7C.js} +2 -2
- package/dist/{chunk-Z2Z52GFT.js → chunk-2I7HDIOU.js} +2 -2
- package/dist/chunk-2QMI2RRB.js +2 -0
- package/dist/chunk-2QMI2RRB.js.map +7 -0
- package/dist/chunk-34KVSA2V.js +3 -0
- package/dist/chunk-34KVSA2V.js.map +7 -0
- package/dist/chunk-37PYJAA2.js +2 -0
- package/dist/{chunk-UXXJOU5J.js.map → chunk-37PYJAA2.js.map} +1 -1
- package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
- package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
- package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
- package/dist/chunk-3OA3P37P.js +2 -0
- package/dist/chunk-3OA3P37P.js.map +7 -0
- package/dist/chunk-3TCITFUU.js +2 -0
- package/dist/chunk-3TCITFUU.js.map +7 -0
- package/dist/chunk-3VDLX7ET.js +2 -0
- package/dist/chunk-3VDLX7ET.js.map +7 -0
- package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
- package/dist/chunk-5G5PHOZJ.js +2 -0
- package/dist/chunk-5G5PHOZJ.js.map +7 -0
- package/dist/{chunk-EDUMAMK4.js → chunk-5GCTM37D.js} +2 -2
- package/dist/chunk-5PYJ6FJK.js +2 -0
- package/dist/chunk-5PYJ6FJK.js.map +7 -0
- package/dist/chunk-632LUU52.js +2 -0
- package/dist/chunk-632LUU52.js.map +7 -0
- package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
- package/dist/{chunk-Z2JBUHKA.js → chunk-6NP4AEV4.js} +2 -2
- package/dist/chunk-6PPRYSLN.js +2 -0
- package/dist/chunk-6PPRYSLN.js.map +7 -0
- package/dist/{chunk-NXSTUFS7.js → chunk-6TZJO2G2.js} +2 -2
- package/dist/chunk-7Y2GHQRB.js +2 -0
- package/dist/chunk-A36JFIA3.js +2 -0
- package/dist/chunk-A36JFIA3.js.map +7 -0
- package/dist/{chunk-G2KUK6AT.js → chunk-ADHKL2GM.js} +2 -2
- package/dist/{chunk-JI265XFO.js → chunk-AJN66F32.js} +2 -2
- package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
- package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
- package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
- package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
- package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
- package/dist/{chunk-HXDTGP2K.js → chunk-BRGT4O6Q.js} +2 -2
- package/dist/{chunk-OGRFQTXA.js → chunk-BTGJ3MP4.js} +2 -2
- package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
- package/dist/{chunk-M242VYZA.js → chunk-CXZKCBQE.js} +2 -2
- package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
- package/dist/chunk-DJUSVBD5.js +2 -0
- package/dist/chunk-DJUSVBD5.js.map +7 -0
- package/dist/chunk-DLRGB5NY.js +2 -0
- package/dist/chunk-DLRGB5NY.js.map +7 -0
- package/dist/chunk-DY3ZYMXD.js +2 -0
- package/dist/chunk-DY3ZYMXD.js.map +7 -0
- package/dist/chunk-EO777UIN.js +2 -0
- package/dist/chunk-EO777UIN.js.map +7 -0
- package/dist/chunk-ESCLDVFS.js +2 -0
- package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
- package/dist/{chunk-2ZUZ5HDL.js → chunk-ESRS5ZQV.js} +2 -2
- package/dist/{chunk-RNN55473.js → chunk-FNZI6MFG.js} +2 -2
- package/dist/{chunk-RNN55473.js.map → chunk-FNZI6MFG.js.map} +1 -1
- package/dist/{chunk-JK74QK3M.js → chunk-FSR6BDVO.js} +2 -2
- package/dist/{chunk-6VBK2I5B.js → chunk-G26R2F3W.js} +2 -2
- package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
- package/dist/chunk-GFJRGBQR.js +2 -0
- package/dist/chunk-GFJRGBQR.js.map +7 -0
- package/dist/chunk-GLAY4RJF.js +2 -0
- package/dist/chunk-GLAY4RJF.js.map +7 -0
- package/dist/chunk-GNKVLJ5H.js +2 -0
- package/dist/chunk-GNKVLJ5H.js.map +7 -0
- package/dist/chunk-GZIDE5K2.js +2 -0
- package/dist/chunk-GZIDE5K2.js.map +7 -0
- package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
- package/dist/chunk-HG7OOHGD.js +2 -0
- package/dist/chunk-HG7OOHGD.js.map +7 -0
- package/dist/chunk-HRW25TMU.js +2 -0
- package/dist/chunk-HX6TWXTX.js +2 -0
- package/dist/chunk-HX6TWXTX.js.map +7 -0
- package/dist/chunk-I5A74NMJ.js +2 -0
- package/dist/chunk-I5A74NMJ.js.map +7 -0
- package/dist/chunk-IODSL7KU.js +2 -0
- package/dist/chunk-IODSL7KU.js.map +7 -0
- package/dist/chunk-J2TCHWYD.js +2 -0
- package/dist/chunk-J2TCHWYD.js.map +7 -0
- package/dist/chunk-J5BZAKC6.js +2 -0
- package/dist/chunk-J5BZAKC6.js.map +7 -0
- package/dist/chunk-JBOKM5YA.js +2 -0
- package/dist/{chunk-KLLAY2IM.js.map → chunk-JBOKM5YA.js.map} +2 -2
- package/dist/chunk-L5SQQFO7.js +2 -0
- package/dist/chunk-L5SQQFO7.js.map +7 -0
- package/dist/chunk-L6DOWGBO.js +2 -0
- package/dist/chunk-L6DOWGBO.js.map +7 -0
- package/dist/{chunk-W3H7GTJY.js → chunk-LHWY6G6Q.js} +2 -2
- package/dist/chunk-LLHDEUIA.js +2 -0
- package/dist/chunk-LLHDEUIA.js.map +7 -0
- package/dist/chunk-LXWCTCZV.js +2 -0
- package/dist/chunk-LXWCTCZV.js.map +7 -0
- package/dist/chunk-M2ZRKHE4.js +2 -0
- package/dist/chunk-M2ZRKHE4.js.map +7 -0
- package/dist/{chunk-Q26YZYTD.js → chunk-M7HLHGQV.js} +2 -2
- package/dist/{chunk-IHE2MQ3W.js → chunk-MGSCSS7X.js} +2 -2
- package/dist/chunk-MM2OC66E.js +4 -0
- package/dist/{chunk-XX2MVWFS.js.map → chunk-MM2OC66E.js.map} +1 -1
- package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
- package/dist/chunk-MQEALOU3.js +3 -0
- package/dist/chunk-MQEALOU3.js.map +7 -0
- package/dist/chunk-NAUSRVB6.js +2 -0
- package/dist/chunk-NAUSRVB6.js.map +7 -0
- package/dist/chunk-NEVDHDJ4.js +3 -0
- package/dist/chunk-NEVDHDJ4.js.map +7 -0
- package/dist/{chunk-5QUY72FX.js → chunk-NWHH3CYH.js} +2 -2
- package/dist/chunk-OADWLPSF.js +2 -0
- package/dist/chunk-OADWLPSF.js.map +7 -0
- package/dist/{chunk-3TAW4AKH.js → chunk-OB3VIRQR.js} +2 -2
- package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
- package/dist/chunk-Q6FY4L2F.js +2 -0
- package/dist/chunk-Q6FY4L2F.js.map +7 -0
- package/dist/{chunk-TZOQWCVH.js → chunk-QOSTS5I3.js} +2 -2
- package/dist/chunk-QVBDBGS4.js +2 -0
- package/dist/chunk-QVBDBGS4.js.map +7 -0
- package/dist/{chunk-3S24ZRPK.js → chunk-RMATRKXV.js} +2 -2
- package/dist/{chunk-I4SP6JTU.js → chunk-S3ILIWSW.js} +2 -2
- package/dist/chunk-S4QD5NID.js +2 -0
- package/dist/chunk-S4QD5NID.js.map +7 -0
- package/dist/{chunk-XHOBNSBO.js → chunk-SEUIIPHS.js} +2 -2
- package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
- package/dist/chunk-T5OGUCY2.js +2 -0
- package/dist/chunk-T5OGUCY2.js.map +7 -0
- package/dist/chunk-TMBGEZSD.js +2 -0
- package/dist/chunk-TMBGEZSD.js.map +7 -0
- package/dist/chunk-TVO3Z2BM.js +2 -0
- package/dist/chunk-TVO3Z2BM.js.map +7 -0
- package/dist/{chunk-LQRFNQ2N.js → chunk-U25QSLAH.js} +2 -2
- package/dist/chunk-UCWICDYG.js +2 -0
- package/dist/chunk-UCWICDYG.js.map +7 -0
- package/dist/chunk-UDXO3KM3.js +2 -0
- package/dist/chunk-UDXO3KM3.js.map +7 -0
- package/dist/{chunk-FEHGU6EP.js → chunk-UL364TLO.js} +2 -2
- package/dist/chunk-UUAGMZD2.js +2 -0
- package/dist/chunk-UUAGMZD2.js.map +7 -0
- package/dist/chunk-V5G5JECN.js +2 -0
- package/dist/chunk-V5G5JECN.js.map +7 -0
- package/dist/chunk-XFDNXSU5.js +2 -0
- package/dist/chunk-XFDNXSU5.js.map +7 -0
- package/dist/{chunk-JBLRAM7Z.js → chunk-XNRZJP4E.js} +2 -2
- package/dist/chunk-YJTUFK4P.js +2 -0
- package/dist/chunk-YLFSCQL3.js +2 -0
- package/dist/chunk-YLFSCQL3.js.map +7 -0
- package/dist/chunk-Z6HZY2YG.js +2 -0
- package/dist/chunk-Z6HZY2YG.js.map +7 -0
- package/dist/chunk-ZEIE2OCQ.js +2 -0
- package/dist/chunk-ZEIE2OCQ.js.map +7 -0
- package/dist/{chunk-2YZB6XQR.js → chunk-ZLYZFHEN.js} +2 -2
- package/dist/components/avatar.js +2 -0
- package/dist/components/avatar.js.map +7 -0
- 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 +2 -0
- package/dist/components/carousel.js.map +7 -0
- package/dist/components/cellediting.js +1 -1
- package/dist/components/chart.js +2 -0
- package/dist/components/chart.js.map +7 -0
- package/dist/components/chat.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkboxgroup.js +1 -1
- package/dist/components/chip.js +1 -1
- package/dist/components/codeviewer.js +1 -1
- package/dist/components/columntotals.js +2 -0
- package/dist/components/columntotals.js.map +7 -0
- package/dist/components/combobox.js +1 -1
- package/dist/components/commandpalette.js +1 -1
- package/dist/components/container.js +1 -1
- package/dist/components/dataview.js +1 -1
- package/dist/components/datefield.js +1 -1
- package/dist/components/daterangefield.js +1 -1
- package/dist/components/datetimefield.js +2 -0
- package/dist/components/datetimefield.js.map +7 -0
- package/dist/components/dial.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/exportbar.js +2 -0
- package/dist/components/exportbar.js.map +7 -0
- package/dist/components/fieldgroup.js +1 -1
- package/dist/components/fieldlist.js +1 -1
- package/dist/components/fieldset.js +1 -1
- package/dist/components/filterbuilder.js +1 -1
- package/dist/components/form.js +1 -1
- package/dist/components/formactions.js +1 -1
- package/dist/components/formerrors.js +1 -1
- package/dist/components/formsection.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/gridexport.js +2 -0
- package/dist/components/gridexport.js.map +7 -0
- package/dist/components/gridstate.js +2 -0
- package/dist/components/gridstate.js.map +7 -0
- package/dist/components/grouping.js +2 -0
- package/dist/components/grouping.js.map +7 -0
- package/dist/components/icon.js +1 -1
- package/dist/components/image.js +2 -0
- package/dist/components/image.js.map +7 -0
- package/dist/components/imagecanvas.js +2 -0
- package/dist/components/imagecanvas.js.map +7 -0
- package/dist/components/imagefield.js +2 -0
- package/dist/components/imagefield.js.map +7 -0
- 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 +2 -0
- package/dist/components/maskfield.js.map +7 -0
- 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/radiogroup.js +1 -1
- package/dist/components/rowediting.js +2 -0
- package/dist/components/rowediting.js.map +7 -0
- 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 +2 -0
- package/dist/components/shortcuts.js.map +7 -0
- 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 +2 -0
- package/dist/components/stat.js.map +7 -0
- package/dist/components/stepform.js +1 -1
- package/dist/components/stepper.js +1 -1
- package/dist/components/suggestfield.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/textfield.js +1 -1
- package/dist/components/timeentry.js +2 -0
- package/dist/components/timeentry.js.map +7 -0
- package/dist/components/timefield.js +2 -0
- package/dist/components/timefield.js.map +7 -0
- package/dist/components/timeline.js +2 -0
- package/dist/components/timeline.js.map +7 -0
- 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 +2 -0
- package/dist/components/treegrid.js.map +7 -0
- 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/avatar.css +68 -0
- package/dist/css/base.css +9 -0
- package/dist/css/carousel.css +119 -0
- package/dist/css/chart.css +168 -0
- package/dist/css/columntotals.css +56 -0
- package/dist/css/core.css +36 -0
- package/dist/css/datetimefield.css +15 -0
- package/dist/css/exportbar.css +9 -0
- package/dist/css/grid.css +52 -0
- package/dist/css/gridexport.css +35 -0
- package/dist/css/grouping.css +56 -0
- package/dist/css/image.css +46 -0
- package/dist/css/imagecanvas.css +75 -0
- package/dist/css/imagefield.css +103 -0
- package/dist/css/rowediting.css +39 -0
- package/dist/css/shortcuts.css +34 -0
- package/dist/css/stat.css +64 -0
- package/dist/css/stepform.css +1 -0
- package/dist/css/timeentry.css +116 -0
- package/dist/css/timeline.css +185 -0
- package/dist/css/treegrid.css +35 -0
- package/dist/css/window.css +2 -2
- package/dist/data.js +1 -1
- package/dist/dev.js +2 -0
- package/dist/dev.js.map +7 -0
- package/dist/index.js +16 -5
- package/dist/index.js.map +4 -4
- package/dist/optikos.css +1480 -142
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +7 -0
- package/dist/themes/dark.css +7 -0
- package/dist/types/bind/index.d.ts +1 -1
- package/dist/types/bind/viewmodel.d.ts +33 -0
- package/dist/types/build/build.d.ts +49 -0
- package/dist/types/build/index.d.ts +1 -0
- package/dist/types/components/avatar.d.ts +1 -0
- package/dist/types/components/base/avatar/avatar.d.ts +22 -0
- package/dist/types/components/base/image/image.d.ts +25 -0
- package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
- package/dist/types/components/carousel.d.ts +1 -0
- package/dist/types/components/chart.d.ts +1 -0
- package/dist/types/components/charts/chart/chart.d.ts +64 -0
- package/dist/types/components/charts/stat/stat.d.ts +34 -0
- package/dist/types/components/columntotals.d.ts +1 -0
- package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
- package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
- package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
- package/dist/types/components/data/grid/footer.d.ts +6 -0
- package/dist/types/components/data/grid/grid.d.ts +37 -0
- package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
- package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
- package/dist/types/components/data/grouping/controls.d.ts +27 -0
- package/dist/types/components/data/grouping/grouping.d.ts +43 -0
- package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
- package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
- package/dist/types/components/data/timeentry/timeentry.d.ts +37 -0
- package/dist/types/components/data/timeline/timeline.d.ts +63 -0
- package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
- package/dist/types/components/datetimefield.d.ts +1 -0
- package/dist/types/components/exportbar.d.ts +1 -0
- package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
- package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
- package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
- package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
- package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
- package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
- package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
- package/dist/types/components/form/form/form.d.ts +5 -0
- package/dist/types/components/form/stepform/stepform.d.ts +1 -1
- package/dist/types/components/gridexport.d.ts +1 -0
- package/dist/types/components/gridstate.d.ts +1 -0
- package/dist/types/components/grouping.d.ts +1 -0
- package/dist/types/components/image.d.ts +1 -0
- package/dist/types/components/imagecanvas.d.ts +1 -0
- package/dist/types/components/imagefield.d.ts +1 -0
- package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
- package/dist/types/components/maskfield.d.ts +1 -0
- package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
- package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
- package/dist/types/components/overlays/menu/menu.d.ts +4 -1
- package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
- package/dist/types/components/overlays/window/window.d.ts +14 -1
- package/dist/types/components/rowediting.d.ts +1 -0
- package/dist/types/components/shortcuts.d.ts +1 -0
- package/dist/types/components/stat.d.ts +1 -0
- package/dist/types/components/timeentry.d.ts +1 -0
- package/dist/types/components/timefield.d.ts +1 -0
- package/dist/types/components/timeline.d.ts +1 -0
- package/dist/types/components/treegrid.d.ts +1 -0
- package/dist/types/core/component.d.ts +7 -0
- package/dist/types/core/container.d.ts +10 -1
- package/dist/types/core/dev.d.ts +2 -0
- package/dist/types/core/field.d.ts +4 -0
- package/dist/types/core/i18n.d.ts +2 -0
- package/dist/types/core/index.d.ts +4 -1
- package/dist/types/core/path.d.ts +2 -0
- package/dist/types/core/permission.d.ts +11 -0
- package/dist/types/core/state.d.ts +9 -0
- package/dist/types/data/column.d.ts +11 -1
- package/dist/types/data/index.d.ts +1 -1
- package/dist/types/data/model.d.ts +2 -0
- package/dist/types/data/store.d.ts +21 -0
- package/dist/types/dev/index.d.ts +2 -0
- package/dist/types/dev/keys.d.ts +1 -0
- package/dist/types/index.d.ts +21 -0
- package/dist/types/testing/index.d.ts +25 -0
- package/dist/types/themes/color.d.ts +14 -0
- package/dist/types/themes/contrast.d.ts +15 -0
- package/dist/types/themes/define.d.ts +25 -3
- package/dist/types/themes/index.d.ts +3 -1
- package/dist/types/themes/seeds.d.ts +11 -0
- package/dist/types/ui/ui.d.ts +6 -0
- package/dist/ui.js +1 -1
- package/package.json +13 -1
- package/dist/chunk-2ZRNGG2N.js +0 -2
- package/dist/chunk-2ZRNGG2N.js.map +0 -7
- package/dist/chunk-4EQEHJB3.js +0 -2
- package/dist/chunk-4EQEHJB3.js.map +0 -7
- package/dist/chunk-4LZZ244E.js +0 -2
- package/dist/chunk-4LZZ244E.js.map +0 -7
- package/dist/chunk-4SYIIX5A.js +0 -2
- package/dist/chunk-4SYIIX5A.js.map +0 -7
- package/dist/chunk-7KMIFXHZ.js +0 -2
- package/dist/chunk-7KMIFXHZ.js.map +0 -7
- package/dist/chunk-A2NKDOYN.js +0 -2
- package/dist/chunk-A2NKDOYN.js.map +0 -7
- package/dist/chunk-CKXS375P.js +0 -2
- package/dist/chunk-CKXS375P.js.map +0 -7
- package/dist/chunk-EJGWCKE4.js +0 -2
- package/dist/chunk-EJGWCKE4.js.map +0 -7
- package/dist/chunk-ELYARUCN.js +0 -2
- package/dist/chunk-EV73ADN2.js +0 -2
- package/dist/chunk-EV73ADN2.js.map +0 -7
- package/dist/chunk-GD5JGKM7.js +0 -2
- package/dist/chunk-GD5JGKM7.js.map +0 -7
- package/dist/chunk-GZ7X34QP.js +0 -2
- package/dist/chunk-KCEUD232.js +0 -2
- package/dist/chunk-KCEUD232.js.map +0 -7
- package/dist/chunk-KLLAY2IM.js +0 -2
- package/dist/chunk-LBJSMXLV.js +0 -2
- package/dist/chunk-LBJSMXLV.js.map +0 -7
- package/dist/chunk-LW2WRUVL.js +0 -2
- package/dist/chunk-LW2WRUVL.js.map +0 -7
- package/dist/chunk-MW3RWBZ7.js +0 -2
- package/dist/chunk-MW3RWBZ7.js.map +0 -7
- package/dist/chunk-OEAXCCVM.js +0 -2
- package/dist/chunk-OEAXCCVM.js.map +0 -7
- package/dist/chunk-UB5RYS7T.js +0 -2
- package/dist/chunk-UB5RYS7T.js.map +0 -7
- package/dist/chunk-UXXJOU5J.js +0 -2
- package/dist/chunk-VU3GIDZ3.js +0 -2
- package/dist/chunk-VU3GIDZ3.js.map +0 -7
- package/dist/chunk-W2BAFOCN.js +0 -3
- package/dist/chunk-W2BAFOCN.js.map +0 -7
- package/dist/chunk-WFGTQZIQ.js +0 -2
- package/dist/chunk-WFGTQZIQ.js.map +0 -7
- package/dist/chunk-XX2MVWFS.js +0 -4
- package/dist/chunk-XYZ6VZ5T.js +0 -2
- package/dist/chunk-YBAYEU25.js +0 -2
- package/dist/chunk-YF75HKL6.js +0 -2
- package/dist/chunk-YF75HKL6.js.map +0 -7
- /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
- /package/dist/{chunk-5BC72727.js.map → chunk-2I4Y7I7C.js.map} +0 -0
- /package/dist/{chunk-Z2Z52GFT.js.map → chunk-2I7HDIOU.js.map} +0 -0
- /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
- /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
- /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
- /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
- /package/dist/{chunk-EDUMAMK4.js.map → chunk-5GCTM37D.js.map} +0 -0
- /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
- /package/dist/{chunk-Z2JBUHKA.js.map → chunk-6NP4AEV4.js.map} +0 -0
- /package/dist/{chunk-NXSTUFS7.js.map → chunk-6TZJO2G2.js.map} +0 -0
- /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
- /package/dist/{chunk-G2KUK6AT.js.map → chunk-ADHKL2GM.js.map} +0 -0
- /package/dist/{chunk-JI265XFO.js.map → chunk-AJN66F32.js.map} +0 -0
- /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
- /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
- /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
- /package/dist/{chunk-HXDTGP2K.js.map → chunk-BRGT4O6Q.js.map} +0 -0
- /package/dist/{chunk-OGRFQTXA.js.map → chunk-BTGJ3MP4.js.map} +0 -0
- /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
- /package/dist/{chunk-M242VYZA.js.map → chunk-CXZKCBQE.js.map} +0 -0
- /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
- /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-ESRS5ZQV.js.map} +0 -0
- /package/dist/{chunk-JK74QK3M.js.map → chunk-FSR6BDVO.js.map} +0 -0
- /package/dist/{chunk-6VBK2I5B.js.map → chunk-G26R2F3W.js.map} +0 -0
- /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
- /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
- /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
- /package/dist/{chunk-W3H7GTJY.js.map → chunk-LHWY6G6Q.js.map} +0 -0
- /package/dist/{chunk-Q26YZYTD.js.map → chunk-M7HLHGQV.js.map} +0 -0
- /package/dist/{chunk-IHE2MQ3W.js.map → chunk-MGSCSS7X.js.map} +0 -0
- /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
- /package/dist/{chunk-5QUY72FX.js.map → chunk-NWHH3CYH.js.map} +0 -0
- /package/dist/{chunk-3TAW4AKH.js.map → chunk-OB3VIRQR.js.map} +0 -0
- /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
- /package/dist/{chunk-TZOQWCVH.js.map → chunk-QOSTS5I3.js.map} +0 -0
- /package/dist/{chunk-3S24ZRPK.js.map → chunk-RMATRKXV.js.map} +0 -0
- /package/dist/{chunk-I4SP6JTU.js.map → chunk-S3ILIWSW.js.map} +0 -0
- /package/dist/{chunk-XHOBNSBO.js.map → chunk-SEUIIPHS.js.map} +0 -0
- /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
- /package/dist/{chunk-LQRFNQ2N.js.map → chunk-U25QSLAH.js.map} +0 -0
- /package/dist/{chunk-FEHGU6EP.js.map → chunk-UL364TLO.js.map} +0 -0
- /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XNRZJP4E.js.map} +0 -0
- /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
- /package/dist/{chunk-2YZB6XQR.js.map → chunk-ZLYZFHEN.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/navigation/tabs/tabs.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport '../../layout/panel/reload';\nimport { Component } from '../../../core/component';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport { allowed, permissionMode } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n tabErrors: 'errors',\n});\naddMessages('pt-BR', {\n tabErrors: 'erros',\n});\n\nexport interface TabsConfig extends ContainerConfig {\n /** Initially active tab (index or id). */\n active?: number | string;\n position?: 'top' | 'left';\n /** Build a panel's DOM only the first time its tab is activated. Default true. */\n lazy?: boolean;\n /** Default `closable` for tabs. */\n closable?: boolean;\n /** Default `reloadable` for tabs: a \u21BB in the tab that calls the panel's `onReload`. */\n reloadable?: boolean;\n}\n\n/**\n * Items are the panels. Each may carry `title`, `icon`, `closable` and `disabled` for its tab header.\n * Tabs reuse the `card` layout of Container for the panels.\n */\nexport class Tabs extends Container<TabsConfig> {\n protected override baseCls = 'op-tabs';\n private barEl!: HTMLElement;\n private panelsEl!: HTMLElement;\n private tabs = new Map<Component, HTMLElement>();\n private pending = new Set<Component>();\n private rover?: ReturnType<typeof roving>;\n\n constructor(config: TabsConfig = {}) {\n super({ defaultType: 'container', ...config });\n // a panel the user may not see is not a tab at all (a hidden panel would leave its header behind)\n for (const p of this.items.filter((x) => !allowed(x.config.permission) && (x.config.permissionMode ?? permissionMode()) === 'hide')) this.remove(p);\n }\n\n override getBody() {\n return this.panelsEl;\n }\n\n protected override build() {\n const left = this.config.position === 'left';\n const el = h('div', `op-tabs${left ? ' op-tabs--left' : ''}`);\n this.barEl = h('div', 'op-tabs__bar', { role: 'tablist', 'aria-orientation': left ? 'vertical' : 'horizontal' });\n this.panelsEl = h('div', 'op-tabs__panels');\n el.append(this.barEl, this.panelsEl);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout = { type: 'card', activeItem: c.active ?? 0 };\n this.items.forEach((p) => this.addHeader(p));\n this.rover = roving(this.barEl, {\n selector: '[role=tab]',\n orientation: c.position === 'left' ? 'vertical' : 'horizontal',\n onMove: (tab) => this.setActive(this.items.find((p) => this.tabs.get(p) === tab)!),\n });\n this.own(() => this.rover?.destroy());\n this.on('activate', (p?: Component) => this.syncHeaders(p));\n this.listen(this.barEl, 'click', (e: Event) => {\n const target = e.target as HTMLElement;\n const tab = target.closest<HTMLElement>('[role=tab]');\n const panel = this.items.find((p) => this.tabs.get(p) === tab);\n if (!panel) return;\n if (target.closest('.op-tabs__close')) this.closeTab(panel);\n else if (target.closest('.op-tabs__reload')) (this.setActive(panel), void this.reloadTab(panel));\n else this.setActive(panel);\n });\n this.listen(this.barEl, 'keydown', (e: KeyboardEvent) => {\n const panel = this.items.find((p) => this.tabs.get(p) === (e.target as HTMLElement).closest('[role=tab]'));\n if (e.key === 'Delete' && panel) this.closeTab(panel);\n else if (panel && (e.key === 'r' || e.key === 'R') && !e.ctrlKey && !e.metaKey && !e.altKey && this.tabConfig(panel).reloadable) void this.reloadTab(panel);\n });\n super.onRender();\n }\n\n private forcing?: Component;\n\n /** Lazy panels (everything but the active one) are attached the first time they are activated. */\n protected override attach(p: Component, index: number) {\n if (this.config.lazy !== false && p !== this.getActiveItem() && p !== this.forcing) {\n this.pending.add(p);\n return;\n }\n super.attach(p, index);\n p.el.setAttribute('role', 'tabpanel');\n p.el.tabIndex = 0; // APG: the panel is reachable by Tab even when its content has nothing focusable (or scrolls)\n const tab = this.tabs.get(p);\n if (tab) {\n p.el.setAttribute('aria-labelledby', tab.id);\n tab.setAttribute('aria-controls', p.el.id);\n }\n }\n\n /** Builds a pending panel's DOM now. */\n private ensure(p: Component) {\n if (!this.pending.delete(p)) return;\n this.forcing = p;\n this.attach(p, this.items.indexOf(p));\n this.forcing = undefined;\n }\n\n private tabConfig(p: Component) {\n const c = p.config as AnyConfig;\n return { title: (c.title as string) ?? '', icon: c.icon as string | undefined, closable: (c.closable as boolean) ?? this.config.closable ?? false, reloadable: (c.reloadable as boolean) ?? this.config.reloadable ?? false, disabled: !!c.disabled };\n }\n\n private addHeader(p: Component) {\n const { title, icon, closable, reloadable, disabled } = this.tabConfig(p);\n const tab = h('div', 'op-tabs__tab', { role: 'tab', id: `${p.id}-tab`, tabindex: -1, 'aria-selected': 'false', 'aria-disabled': disabled ? 'true' : null });\n tab.append(icon ? iconEl(icon) : '', h('span', 'op-tabs__title', {}, title));\n if (reloadable) tab.append(h('span', 'op-tabs__reload', { 'aria-hidden': 'true', 'data-op-tip': t('reload') }, iconEl('refresh')));\n if (closable) tab.append(h('span', 'op-tabs__close', { 'aria-hidden': 'true', 'data-op-tip': t('close') }, iconEl('x')));\n this.tabs.set(p, tab);\n this.barEl.append(...[...this.items].filter((x) => this.tabs.has(x)).map((x) => this.tabs.get(x)!));\n }\n\n private syncHeaders(active?: Component) {\n for (const [p, tab] of this.tabs) {\n const on = p === active;\n tab.setAttribute('aria-selected', String(on));\n tab.classList.toggle('is-active', on);\n }\n const tab = active && this.tabs.get(active);\n this.rover?.sync(tab || undefined);\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n getActive(): Component | undefined {\n return this.getActiveItem();\n }\n\n /** Activates a tab (instance, id or index). `before-change` can cancel. */\n setActive(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const prev = this.getActiveItem();\n if (!p || p === prev || this.tabConfig(p).disabled) return;\n if (this.emit('before-change', p, prev) === false) return;\n this.ensure(p);\n this.setActiveItem(p);\n this.emit('change', p, this.items.indexOf(p));\n }\n\n override insert(index: number, item: AnyConfig | Component | string): Component {\n const p = super.insert(index, item);\n if (this.rendered) {\n this.addHeader(p);\n this.ensure(p); // a tab added after render becomes the active one right away\n this.setActive(p);\n }\n return p;\n }\n\n /**\n * Reloads a tab: calls its panel's `onReload` (`before-reload` can cancel). While a returned Promise is pending the panel\n * shows its loading mask and the tab's \u21BB spins; `reload(panel)` fires when it is done.\n */\n async reloadTab(tab: Component | string | number): Promise<boolean> {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const head = p && this.tabs.get(p);\n if (!p || head?.classList.contains('is-reloading') || this.emit('before-reload', p) === false) return false;\n head?.classList.add('is-reloading');\n const busy = (p.config as AnyConfig).onReload?.(p) as unknown;\n if (busy instanceof Promise) {\n p.setLoading(true);\n await busy.catch(() => undefined);\n p.setLoading(false);\n }\n head?.classList.remove('is-reloading');\n this.emit('reload', p);\n return true;\n }\n\n /** Closes a tab (`before-close` can cancel). The neighbor becomes active. */\n closeTab(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n if (!p || this.emit('before-close', p) === false) return;\n this.remove(p);\n this.emit('close', p);\n }\n\n override remove(child: Component | string | number, destroy = true): Component | undefined {\n const p = typeof child === 'number' ? this.items[child] : typeof child === 'string' ? this.items.find((x) => x.id === child) : child;\n const hadFocus = p && this.tabs.get(p)?.contains(document.activeElement);\n const removed = super.remove(child, destroy);\n if (p) {\n this.tabs.get(p)?.remove();\n this.tabs.delete(p);\n this.pending.delete(p);\n const active = this.getActiveItem();\n if (active) this.ensure(active);\n if (hadFocus && active) this.tabs.get(active)?.focus();\n }\n return removed;\n }\n\n /** Marks a tab header: a badge with the number of errors in its panel and a dot while something in it changed. */\n setTabState(tab: Component, state: { errors?: number; dirty?: boolean }): void {\n const el = this.tabs.get(tab);\n if (!el) return;\n el.classList.toggle('has-error', !!state.errors);\n el.classList.toggle('is-dirty', !!state.dirty);\n let badge = el.querySelector<HTMLElement>('.op-tabs__badge');\n if (!state.errors) return badge?.remove();\n if (!badge) {\n badge = h('span', 'op-tabs__badge');\n el.insertBefore(badge, el.querySelector('.op-tabs__close'));\n }\n badge.replaceChildren(String(state.errors), h('span', 'op-sr-only', {}, ` ${t('tabErrors')}`));\n }\n\n setTitle(tab: Component, title: string) {\n (tab.config as AnyConfig).title = title;\n const el = this.tabs.get(tab)?.querySelector('.op-tabs__title');\n if (el) el.textContent = title;\n }\n}\nregister('tabs', Tabs);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "Tabs", "Container", "config", "p", "x", "allowed", "permissionMode", "left", "el", "h", "c", "roving", "tab", "target", "panel", "index", "title", "icon", "closable", "reloadable", "disabled", "iconEl", "t", "active", "on", "prev", "item", "head", "busy", "child", "destroy", "hadFocus", "removed", "state", "badge", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n=class{handlers=new Map;on(e,t){let s=this.handlers.get(e);return s?s.push(t):this.handlers.set(e,[t]),()=>this.off(e,t)}once(e,t){let s=this.on(e,(...r)=>(s(),t(...r)));return s}off(e,t){if(!t)this.handlers.delete(e);else{let s=this.handlers.get(e);s&&this.handlers.set(e,s.filter(r=>r!==t))}}emit(e,...t){let s=!0;for(let r of this.handlers.get(e)??[])r(...t)===!1&&(s=!1);return s}clearListeners(){this.handlers.clear()}};export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3VDLX7ET.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/emitter.ts"],
|
|
4
|
+
"sourcesContent": ["export type Handler = (...args: any[]) => unknown;\n\n/** Minimal observer. A handler that returns `false` makes `emit` return `false` (used by `before-*` events). */\nexport class Emitter {\n private handlers = new Map<string, Handler[]>();\n\n /** Subscribes; returns the unsubscribe function. */\n on(name: string, fn: Handler): () => void {\n const list = this.handlers.get(name);\n if (list) list.push(fn);\n else this.handlers.set(name, [fn]);\n return () => this.off(name, fn);\n }\n\n once(name: string, fn: Handler): () => void {\n const off = this.on(name, (...a) => {\n off();\n return fn(...a);\n });\n return off;\n }\n\n off(name: string, fn?: Handler): void {\n if (!fn) this.handlers.delete(name);\n else {\n const list = this.handlers.get(name);\n if (list) this.handlers.set(name, list.filter((f) => f !== fn));\n }\n }\n\n /** Returns `false` if any handler returned `false` (the event was cancelled). */\n emit(name: string, ...args: unknown[]): boolean {\n let ok = true;\n for (const fn of this.handlers.get(name) ?? []) if (fn(...args) === false) ok = false;\n return ok;\n }\n\n clearListeners(): void {\n this.handlers.clear();\n }\n}\n"],
|
|
5
|
+
"mappings": "AAGO,IAAMA,EAAN,KAAc,CACX,SAAW,IAAI,IAGvB,GAAGC,EAAcC,EAAyB,CACxC,IAAMC,EAAO,KAAK,SAAS,IAAIF,CAAI,EACnC,OAAIE,EAAMA,EAAK,KAAKD,CAAE,EACjB,KAAK,SAAS,IAAID,EAAM,CAACC,CAAE,CAAC,EAC1B,IAAM,KAAK,IAAID,EAAMC,CAAE,CAChC,CAEA,KAAKD,EAAcC,EAAyB,CAC1C,IAAME,EAAM,KAAK,GAAGH,EAAM,IAAII,KAC5BD,EAAI,EACGF,EAAG,GAAGG,CAAC,EACf,EACD,OAAOD,CACT,CAEA,IAAIH,EAAcC,EAAoB,CACpC,GAAI,CAACA,EAAI,KAAK,SAAS,OAAOD,CAAI,MAC7B,CACH,IAAME,EAAO,KAAK,SAAS,IAAIF,CAAI,EAC/BE,GAAM,KAAK,SAAS,IAAIF,EAAME,EAAK,OAAQG,GAAMA,IAAMJ,CAAE,CAAC,CAChE,CACF,CAGA,KAAKD,KAAiBM,EAA0B,CAC9C,IAAIC,EAAK,GACT,QAAWN,KAAM,KAAK,SAAS,IAAID,CAAI,GAAK,CAAC,EAAOC,EAAG,GAAGK,CAAI,IAAM,KAAOC,EAAK,IAChF,OAAOA,CACT,CAEA,gBAAuB,CACrB,KAAK,SAAS,MAAM,CACtB,CACF",
|
|
6
|
+
"names": ["Emitter", "name", "fn", "list", "off", "a", "f", "args", "ok"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as d}from"./chunk-DIOJGTUN.js";import{c as r}from"./chunk-BQEFLPDA.js";import{a as n}from"./chunk-TIPK3SCJ.js";import{b as i,c as o}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-S4QD5NID.js";var s=class extends r{baseCls="op-fieldset";tag="fieldset";legend;bodyEl;toggleBtn;descEl;getBody(){return this.bodyEl}build(){let e=super.build();return this.legend=i("legend","op-fieldset__legend"),this.descEl=i("p","op-fieldset__desc",{id:o("op-fs-desc")}),this.bodyEl=i("div","op-fieldset__body"),e.append(this.legend,this.descEl,this.bodyEl),e}onRender(){this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},super.onRender(),this.setVariant(this.config.variant??"box"),this.setDescription(this.config.description??""),this.config.collapsible&&(this.toggleBtn=i("button","op-fieldset__toggle",{type:"button"},d("chevron-up")),this.listen(this.toggleBtn,"click",()=>this.toggle()),this.legend.prepend(this.toggleBtn)),this.setTitle(this.config.title??""),this.setCollapsed(!!this.config.collapsed)}setTitle(e){if(this.config.title=e,!this.rendered)return;let t=this.legend.querySelector(".op-fieldset__title");t||(this.legend.append(t=i("span","op-fieldset__title")),this.config.collapsible&&this.listen(t,"click",()=>this.toggle())),t.textContent=e,this.legend.hidden=!e&&!this.config.collapsible}setDescription(e){this.config.description=e,this.rendered&&(this.descEl.textContent=e,this.descEl.hidden=!e,e?this.el.setAttribute("aria-describedby",this.descEl.id):this.el.removeAttribute("aria-describedby"))}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let t of["box","line","plain"])this.el.classList.toggle(`op-fieldset--${t}`,t===e)}setCollapsed(e){this.config.collapsed=e,this.rendered&&(this.el.classList.toggle("is-collapsed",e),this.bodyEl.hidden=e,e?this.descEl.hidden=!0:this.descEl.hidden=!this.config.description,this.toggleBtn?.setAttribute("aria-expanded",String(!e)),this.toggleBtn?.setAttribute("aria-label",l(e?"expand":"collapse")))}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}};n("fieldset",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-4OB2IM5L.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as I}from"./chunk-DY3ZYMXD.js";import{a as D}from"./chunk-MQEALOU3.js";import{a as S}from"./chunk-ESRS5ZQV.js";import{a as B,c as T}from"./chunk-DIOJGTUN.js";import{b as x}from"./chunk-PZSHOSOS.js";import{b as R}from"./chunk-IODSL7KU.js";import{b as L}from"./chunk-XFDNXSU5.js";import{e as v,f}from"./chunk-S4QD5NID.js";v("en",{gcExpand:"Expand all",gcCollapse:"Collapse all",gcBy:"Group by",gcNone:"No grouping",gcActions:"Groups"});v("pt-BR",{gcExpand:"Expandir tudo",gcCollapse:"Recolher tudo",gcBy:"Agrupar por",gcNone:"Sem agrupamento",gcActions:"Grupos"});B({expand:'<path d="m7 15 5 5 5-5M7 9l5-5 5 5"/>',collapse:'<path d="m7 20 5-5 5 5M7 4l5 5 5-5"/>'});function N(i,n,c){let a=new Map,E=x("div","op-groupcontrols op-footer-group",{role:"group","aria-label":f("gcActions")}),y=(d,u,g,w,_)=>{let k=new S({icon:u,variant:"ghost",ariaLabel:g,tooltip:g,hidden:!w,handler:()=>_(k)});k.mount(E),a.set(d,k)};y("expand","expand",f("gcExpand"),c.expand!==!1,()=>n.expandAll()),y("collapse","collapse",f("gcCollapse"),c.collapse!==!1,()=>n.collapseAll());let h=c.current?c.choices.findIndex(d=>d.field===c.current):-1,b=new D({});y("by","list",f("gcBy"),c.by!==!1&&c.choices.length>0,d=>{b.setItems([...c.choices.map((u,g)=>({text:u.text,checked:h===g,handler:()=>(h=g,n.setGroupBy(u.field??u.by))})),"-",{text:f("gcNone"),handler:()=>(h=-1,n.setGroupBy(null))}]),b.showBy(d.el)});let M=I(i,E);return{set:(d,u)=>a.get(d)?.[u?"show":"hide"](),disable:(d,u)=>a.get(d)?.setDisabled(u),destroy(){M(),b.destroy(),a.forEach(d=>d.destroy())}}}v("en",{groupTotal:"Total",groupCount:"{n}",groupToggle:"Toggle group"});v("pt-BR",{groupTotal:"Total",groupCount:"{n}",groupToggle:"Alternar grupo"});function X(i={}){let n,c=i.by??(i.field?o=>o.data[i.field]:void 0),a=new Set,E=!!i.collapsed,y=[],h=[],b,M=i.summary??"group",d=o=>o.filter(t=>!t.classList.contains("op-grid__selcell")&&!t.classList.contains("op-grid__actcell"));function u(o,t,s){return{cls:`op-grid__row--total ${s}`,paint(p,G){G.setAttribute("aria-label",o);let e=n.getColumns();d(p).forEach((r,m)=>{let l=e[m];if(!l)return;let A=l.summary?(C=>l.summaryRenderer?l.summaryRenderer(C,l):C==null?"":l.format?L(l.format,C):String(C))(R(l,t)):m===0?o:"";r.replaceChildren(A),r.classList.toggle("op-grid__cell--right",l.align==="right")})}}}function g(){let t=n.getStore().getRange();if(!c)return n.setRowLayout(void 0);let s=new Map;for(let e of t){let r=c(e);s.set(r,[...s.get(r)??[],e])}if(y=[...s.keys()],E){for(let e of y)a.add(String(e));E=!1}let p=[],G=n.getColumns().some(e=>e.summary);for(let[e,r]of s){let m=!a.has(String(e));if(p.push({level:1,expanded:m,cls:"op-grid__row--group",paint(l,A){let[C]=d(l);C.classList.add("is-group-label"),C.replaceChildren(x("span","op-grid__twist",{"aria-hidden":"true"},T("chevron-down")),x("span","op-grid__group-name",{},i.label?i.label(e,r):String(e??"\u2014")),x("span","op-grid__group-count",{},f("groupCount",{n:r.length}))),A.dataset.group=String(e)}}),!!m){for(let l of r)p.push({rec:l,level:2,cls:"is-grouped"});G&&M!=="grand"&&p.push(u(f("groupTotal"),r,"is-group-total"))}}G&&M!=="group"&&p.push(u(f("groupTotal"),t,"is-grand-total")),n.setRowLayout(p)}function w(o,t){let s=String(o),p=t??a.has(s);p!==!a.has(s)&&(p?a.delete(s):a.add(s),g(),n.emit("group-toggle",o,p))}let _=o=>{let t=o?.closest(".op-grid__row--group");return t?y.find(s=>String(s)===t.dataset.group):void 0},k={init(o){n=o;let t=o.el,s=t.querySelector("[role=grid]"),p=e=>{let r=_(e.target);(r!==void 0||e.target.closest(".op-grid__row--group"))&&w(r)},G=e=>{if(e.target!==s)return;let r=n.getRowEntry(n.getActive());if(!r||r.rec||r.level!==1)return;let m=_(document.getElementById(`${n.id}-r${n.getActive()}`)),l=r.expanded;if(e.key==="Enter"||e.key===" ")w(m);else if(e.key==="ArrowRight"&&!l)w(m,!0);else if(e.key==="ArrowLeft"&&l)w(m,!1);else return;e.preventDefault(),e.stopPropagation()};if(t.addEventListener("click",p),t.addEventListener("keydown",G,!0),h=[H(o),()=>t.removeEventListener("click",p),()=>t.removeEventListener("keydown",G,!0),()=>n.setRowLayout(void 0)],g(),i.controls){let e=i.controls===!0?{}:i.controls;b=N(o,k,{...e,choices:i.choices??[],current:i.field}),h.push(b.destroy)}return()=>h.forEach(e=>e())},expandAll(){a.clear(),g()},collapseAll(){for(let o of y)a.add(String(o));g()},toggle:w,setControlVisible:(o,t)=>b?.set(o,t),setControlDisabled:(o,t)=>b?.disable(o,t),setGroupBy(o){c=o===null?void 0:typeof o=="string"?t=>t.data[o]:o,a.clear(),g()}};return k;function H(o){return o.getStore().subscribe(t=>queueMicrotask(()=>!o.destroyed&&g()))}}export{X as a};
|
|
2
|
+
//# sourceMappingURL=chunk-5G5PHOZJ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/grouping/controls.ts", "../src/components/data/grouping/grouping.ts"],
|
|
4
|
+
"sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Model } from '../../../data/model';\nimport { Button } from '../../base/button/button';\nimport { registerIcons } from '../../base/icon/icon';\nimport { Menu } from '../../overlays/menu/menu';\nimport { addFooterGroup } from '../grid/footer';\nimport type { Grid } from '../grid/grid';\n\naddMessages('en', { gcExpand: 'Expand all', gcCollapse: 'Collapse all', gcBy: 'Group by', gcNone: 'No grouping', gcActions: 'Groups' });\naddMessages('pt-BR', { gcExpand: 'Expandir tudo', gcCollapse: 'Recolher tudo', gcBy: 'Agrupar por', gcNone: 'Sem agrupamento', gcActions: 'Grupos' });\n\nregisterIcons({ expand: '<path d=\"m7 15 5 5 5-5M7 9l5-5 5 5\"/>', collapse: '<path d=\"m7 20 5-5 5 5M7 4l5 5 5-5\"/>' });\n\nexport type GroupingControl = 'expand' | 'collapse' | 'by';\n\n/** A way to group, offered in the \"Group by\" menu: a record field or any function of the record. */\nexport interface GroupChoice {\n text: string;\n field?: string;\n by?: (rec: Model) => unknown;\n}\n\ninterface Target {\n expandAll(): void;\n collapseAll(): void;\n setGroupBy(by: string | ((rec: Model) => unknown) | null): void;\n}\n\n/** Icon buttons in the grid's footer row (beside the pager): expand all, collapse all and a \"Group by\" menu. */\nexport function groupingControls(grid: Grid, target: Target, o: { expand?: boolean; collapse?: boolean; by?: boolean; choices: GroupChoice[]; current?: string }) {\n const buttons = new Map<GroupingControl, Button>();\n const group = h('div', 'op-groupcontrols op-footer-group', { role: 'group', 'aria-label': t('gcActions') });\n const add = (action: GroupingControl, icon: string, label: string, on: boolean, handler: (b: Button) => void) => {\n const b = new Button({ icon, variant: 'ghost', ariaLabel: label, tooltip: label, hidden: !on, handler: () => handler(b) });\n b.mount(group);\n buttons.set(action, b);\n };\n add('expand', 'expand', t('gcExpand'), o.expand !== false, () => target.expandAll());\n add('collapse', 'collapse', t('gcCollapse'), o.collapse !== false, () => target.collapseAll());\n let chosen = o.current ? o.choices.findIndex((c) => c.field === o.current) : -1;\n const menu = new Menu({});\n add('by', 'list', t('gcBy'), o.by !== false && o.choices.length > 0, (b) => {\n menu.setItems([\n ...o.choices.map((c, i) => ({ text: c.text, checked: chosen === i, handler: () => ((chosen = i), target.setGroupBy((c.field ?? c.by)!)) })),\n '-',\n { text: t('gcNone'), handler: () => ((chosen = -1), target.setGroupBy(null)) },\n ]);\n menu.showBy(b.el);\n });\n const leave = addFooterGroup(grid, group);\n return {\n set: (a: GroupingControl, visible: boolean) => buttons.get(a)?.[visible ? 'show' : 'hide'](),\n disable: (a: GroupingControl, disabled: boolean) => buttons.get(a)?.setDisabled(disabled),\n destroy() {\n leave();\n menu.destroy();\n buttons.forEach((b) => b.destroy());\n },\n };\n}\n", "// Row grouping with totals for the Grid, as a plugin: `plugins: [grouping({ field: 'event' })]`.\nimport { format } from '../../../data/format';\nimport type { Model } from '../../../data/model';\nimport { summarize } from '../../../data/column';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\nimport { groupingControls, type GroupChoice, type GroupingControl } from './controls';\nimport type { Grid, GridPlugin, RowEntry } from '../grid/grid';\n\naddMessages('en', { groupTotal: 'Total', groupCount: '{n}', groupToggle: 'Toggle group' });\naddMessages('pt-BR', { groupTotal: 'Total', groupCount: '{n}', groupToggle: 'Alternar grupo' });\n\nexport { summarize };\nexport type { GroupChoice, GroupingControl };\n\nexport interface GroupingOptions {\n /** Record field to group by. */\n field?: string;\n /** Or any function of the record (a year, a range): its result is the group. */\n by?: (rec: Model) => unknown;\n /** Text of a group header (before the count). Default: the key. */\n label?: (key: unknown, recs: Model[]) => string;\n /** Total rows of the columns that have a `summary`: `group` (under each group), `grand` (at the end) or `both`. Default `group`. */\n summary?: 'group' | 'grand' | 'both';\n /** Start with every group closed. */\n collapsed?: boolean;\n /** Icon buttons inside the grid, beside the pager: expand all, collapse all and, with `choices`, a \"Group by\" menu. `false` leaves one out. */\n controls?: boolean | { expand?: boolean; collapse?: boolean; by?: boolean };\n /** The ways to group offered by the controls' menu (a field or a function each). */\n choices?: GroupChoice[];\n}\n\nexport interface Grouping extends GridPlugin {\n expandAll(): void;\n collapseAll(): void;\n /** Changes what to group by; `null` shows the plain list. */\n setGroupBy(by: string | ((rec: Model) => unknown) | null): void;\n /** Opens or closes one group by its key. */\n toggle(key: unknown, open?: boolean): void;\n /** The in-grid controls: show or hide one. */\n setControlVisible(control: GroupingControl, visible: boolean): void;\n setControlDisabled(control: GroupingControl, disabled: boolean): void;\n}\n\n/**\n * Groups the rows of the current page (a remote store groups what it loaded, not the whole set) under a header with\n * its count; the header toggles by click, Enter/Space, \u2192 and \u2190. Sorting works inside each group. Group headers and total\n * rows are virtual rows like any other. Fires `group-toggle(key, open)` on the grid.\n */\nexport function grouping(options: GroupingOptions = {}): Grouping {\n let grid!: Grid;\n let by = options.by ?? (options.field ? (r: Model) => r.data[options.field!] : undefined);\n const closed = new Set<string>();\n let all = !!options.collapsed;\n let keys: unknown[] = [];\n let off: Array<() => void> = [];\n let controls: ReturnType<typeof groupingControls> | undefined;\n\n const where = options.summary ?? 'group';\n\n /** The cells of the user columns in a row (the checkbox and action cells are not). */\n const userCells = (cells: HTMLElement[]) => cells.filter((c) => !c.classList.contains('op-grid__selcell') && !c.classList.contains('op-grid__actcell'));\n\n function totals(label: string, recs: Model[], cls: string): RowEntry {\n return {\n cls: `op-grid__row--total ${cls}`,\n paint(cells, row) {\n row.setAttribute('aria-label', label);\n const cols = grid.getColumns();\n userCells(cells).forEach((cell, n) => {\n const col = cols[n];\n if (!col) return;\n const out = col.summary ? ((v) => (col.summaryRenderer ? col.summaryRenderer(v, col) : v == null ? '' : col.format ? format(col.format, v) : String(v)))(summarize(col, recs)) : n === 0 ? label : '';\n cell.replaceChildren(out);\n cell.classList.toggle('op-grid__cell--right', col.align === 'right');\n });\n },\n };\n }\n\n function build() {\n const store = grid.getStore();\n const recs = store.getRange();\n if (!by) return grid.setRowLayout(undefined);\n const groups = new Map<unknown, Model[]>();\n for (const r of recs) {\n const k = by(r);\n groups.set(k, [...(groups.get(k) ?? []), r]);\n }\n keys = [...groups.keys()];\n if (all) {\n for (const k of keys) closed.add(String(k));\n all = false;\n }\n const rows: RowEntry[] = [];\n const hasSummary = grid.getColumns().some((c) => c.summary);\n for (const [key, list] of groups) {\n const open = !closed.has(String(key));\n rows.push({\n level: 1,\n expanded: open,\n cls: 'op-grid__row--group',\n paint(cells, row) {\n const [label] = userCells(cells);\n label.classList.add('is-group-label');\n label.replaceChildren(\n h('span', 'op-grid__twist', { 'aria-hidden': 'true' }, iconEl('chevron-down')),\n h('span', 'op-grid__group-name', {}, options.label ? options.label(key, list) : String(key ?? '\u2014')),\n h('span', 'op-grid__group-count', {}, t('groupCount', { n: list.length })),\n );\n row.dataset.group = String(key);\n },\n });\n if (!open) continue;\n for (const rec of list) rows.push({ rec, level: 2, cls: 'is-grouped' });\n if (hasSummary && where !== 'grand') rows.push(totals(t('groupTotal'), list, 'is-group-total'));\n }\n if (hasSummary && where !== 'group') rows.push(totals(t('groupTotal'), recs, 'is-grand-total'));\n grid.setRowLayout(rows);\n }\n\n function toggle(key: unknown, open?: boolean) {\n const id = String(key);\n const to = open ?? closed.has(id);\n if (to === !closed.has(id)) return;\n if (to) closed.delete(id);\n else closed.add(id);\n build();\n grid.emit('group-toggle', key, to);\n }\n\n const keyOfRow = (el: Element | null) => {\n const row = el?.closest<HTMLElement>('.op-grid__row--group');\n return row ? keys.find((k) => String(k) === row.dataset.group) : undefined;\n };\n\n const plugin: Grouping = {\n init(g) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n const onClick = (e: Event) => {\n const k = keyOfRow(e.target as Element);\n if (k !== undefined || (e.target as Element).closest('.op-grid__row--group')) toggle(k);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.target !== table) return;\n const active = grid.getRowEntry(grid.getActive());\n if (!active || active.rec || active.level !== 1) return;\n const k = keyOfRow(document.getElementById(`${grid.id}-r${grid.getActive()}`));\n const open = active.expanded;\n if (e.key === 'Enter' || e.key === ' ') toggle(k);\n else if (e.key === 'ArrowRight' && !open) toggle(k, true);\n else if (e.key === 'ArrowLeft' && open) toggle(k, false);\n else return;\n e.preventDefault();\n e.stopPropagation();\n };\n el.addEventListener('click', onClick);\n el.addEventListener('keydown', onKey, true);\n off = [store(g), () => el.removeEventListener('click', onClick), () => el.removeEventListener('keydown', onKey, true), () => grid.setRowLayout(undefined)];\n build();\n if (options.controls) {\n const c = options.controls === true ? {} : options.controls;\n controls = groupingControls(g, plugin, { ...c, choices: options.choices ?? [], current: options.field });\n off.push(controls.destroy);\n }\n return () => off.forEach((f) => f());\n },\n expandAll() {\n closed.clear();\n build();\n },\n collapseAll() {\n for (const k of keys) closed.add(String(k));\n build();\n },\n toggle,\n setControlVisible: (c, visible) => controls?.set(c, visible),\n setControlDisabled: (c, disabled) => controls?.disable(c, disabled),\n setGroupBy(next) {\n by = next === null ? undefined : typeof next === 'string' ? (r: Model) => r.data[next] : next;\n closed.clear();\n build();\n },\n };\n return plugin;\n\n function store(g: Grid) {\n return g.getStore().subscribe((c) => queueMicrotask(() => !g.destroyed && build()));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "registerIcons", "groupingControls", "grid", "target", "o", "buttons", "group", "h", "t", "add", "action", "icon", "label", "on", "handler", "b", "Button", "chosen", "c", "menu", "Menu", "i", "leave", "addFooterGroup", "a", "visible", "disabled", "addMessages", "grouping", "options", "grid", "by", "r", "closed", "all", "keys", "off", "controls", "where", "userCells", "cells", "c", "totals", "label", "recs", "cls", "row", "cols", "cell", "n", "col", "out", "v", "format", "summarize", "build", "groups", "k", "rows", "hasSummary", "key", "list", "open", "h", "iconEl", "t", "rec", "toggle", "id", "to", "keyOfRow", "el", "plugin", "g", "table", "onClick", "onKey", "active", "store", "groupingControls", "f", "visible", "disabled", "next"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as m}from"./chunk-GEJKFE4X.js";import{a as g}from"./chunk-LHWY6G6Q.js";import{a as f}from"./chunk-6NP4AEV4.js";import{c as h}from"./chunk-DIOJGTUN.js";import{f as a,g as o}from"./chunk-2GKIF7A6.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as c}from"./chunk-PZSHOSOS.js";import{f as n}from"./chunk-S4QD5NID.js";var b=/\s*(?:–|—|\s-\s|\sto\s|\sa\s)\s*/,d=p=>a(p,{day:"2-digit",month:"2-digit",year:"numeric"}),l=class extends g{baseCls="op-field op-textfield op-picker op-datefield op-daterange";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e?.start}parse(e){if(this.garbage=!1,!e.trim())return null;let[r,s]=e.trim().split(b),t=o(r),i=s?o(s):null;return!t||s&&!i?(this.garbage=!0,null):i&&i<t?{start:i,end:t}:{start:t,end:i??t}}display(e){return e?.start?e.end&&e.end!==e.start?`${d(e.start)} \u2013 ${d(e.end)}`:d(e.start):""}createControl(){let e=super.createControl(),r=this.input;r.setAttribute("role","combobox"),r.setAttribute("aria-haspopup","dialog"),r.setAttribute("aria-expanded","false");let s=c("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},h("calendar"));this.listen(s,"mousedown",i=>i.preventDefault()),this.listen(s,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(s);let t=this.config;return this.cal=new m({range:!0,value:t.value,min:t.min,max:t.max,firstDay:t.firstDay}),this.dd=new f({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",i=>{this.dd.close(),this.setValue(i),r.focus()}),this.dd.on("open",()=>{r.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{r.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let i=document.activeElement;!this.el.contains(i)&&!this.dd.el.contains(i)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),r=this.value;if(e||!r)return e;let{min:s,max:t}=this.config;return s&&r.start<s?n("dateMin",{n:a(s)}):t&&(r.end??r.start)>t?n("dateMax",{n:a(t)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};u("daterangefield",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-5GCTM37D.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as f,c as v}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{f as d}from"./chunk-UDXO3KM3.js";import{b as a,f as m}from"./chunk-PZSHOSOS.js";import{e as g,f as l}from"./chunk-S4QD5NID.js";f({maximize:'<path d="M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M16 21h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/>'});g("en",{imgZoomIn:"Zoom in",imgZoomOut:"Zoom out",imgReset:"Reset zoom",imgError:"The image could not be loaded"});g("pt-BR",{imgZoomIn:"Aumentar",imgZoomOut:"Diminuir",imgReset:"Restaurar zoom",imgError:"N\xE3o foi poss\xEDvel carregar a imagem"});var p=class extends d{baseCls="op-imagecanvas";stage;img;status;zoom=1;x=0;y=0;pointers=new Map;onRender(){let i=this.config;if(this.img=a("img","op-imagecanvas__img",{draggable:!1}),this.status=a("div","op-imagecanvas__status",{role:"status"}),this.stage=a("div","op-imagecanvas__stage",{tabindex:0,role:"img"},this.img),this.el.append(this.stage,this.status),i.zoomable!==!1&&i.showTools!==!1){let e=(t,s,o)=>{let r=a("button","op-imagecanvas__tool",{type:"button","aria-label":l(s),title:l(s)},v(t));return this.listen(r,"click",o),r};this.el.append(a("div","op-imagecanvas__tools",{},e("minus","imgZoomOut",()=>this.zoomBy(.8)),e("plus","imgZoomIn",()=>this.zoomBy(1.25)),e("maximize","imgReset",()=>this.reset())))}i.ratio&&(this.el.style.aspectRatio=i.ratio),this.listen(this.img,"load",()=>{this.setLoading(!1),this.el.classList.remove("is-error"),this.status.textContent="",this.emit("load")}),this.listen(this.img,"error",()=>{this.setLoading(!1),this.el.classList.add("is-error"),this.status.textContent=l("imgError"),this.emit("error")}),i.zoomable!==!1&&this.bindZoom(),this.setFit(i.fit??"contain"),this.setAlt(i.alt??""),this.setSrc(i.src??"")}bindZoom(){let i=this.stage;this.listen(i,"wheel",t=>{!t.ctrlKey&&!t.metaKey||(t.preventDefault(),this.zoomBy(Math.exp(-t.deltaY*.01),t.clientX,t.clientY))},{passive:!1}),this.listen(i,"dblclick",t=>this.zoom>1?this.reset():this.zoomBy(2,t.clientX,t.clientY)),this.listen(i,"pointerdown",t=>{this.pointers.set(t.pointerId,{x:t.clientX,y:t.clientY}),i.setPointerCapture?.(t.pointerId),this.el.classList.toggle("is-dragging",this.zoom>1)}),this.listen(i,"pointermove",t=>{let s=this.pointers.get(t.pointerId);if(!s)return;let o=[...this.pointers].filter(([n])=>n!==t.pointerId),r=t.clientX-s.x,h=t.clientY-s.y;if(o.length){let n=o[0][1],c=Math.hypot(s.x-n.x,s.y-n.y),y=Math.hypot(t.clientX-n.x,t.clientY-n.y);c&&this.zoomBy(y/c,(t.clientX+n.x)/2,(t.clientY+n.y)/2)}else this.zoom>1&&this.pan(r,h);s.x=t.clientX,s.y=t.clientY});let e=t=>{this.pointers.delete(t.pointerId),this.el.classList.remove("is-dragging")};this.listen(i,"pointerup",e),this.listen(i,"pointercancel",e),this.listen(i,"keydown",t=>{let o={ArrowLeft:[40,0],ArrowRight:[-40,0],ArrowUp:[0,40],ArrowDown:[0,-40]};if(t.key==="+"||t.key==="=")this.zoomBy(1.25);else if(t.key==="-")this.zoomBy(.8);else if(t.key==="0")this.reset();else if(o[t.key]&&this.zoom>1)this.pan(...o[t.key]);else return;t.preventDefault()})}pan(i,e){this.x+=i,this.y+=e,this.paint()}paint(){let i=this.stage.clientWidth,e=this.stage.clientHeight;this.x=m(this.x,-((this.zoom-1)*i)/2,(this.zoom-1)*i/2),this.y=m(this.y,-((this.zoom-1)*e)/2,(this.zoom-1)*e/2),this.img.style.transform=this.zoom===1?"":`translate(${this.x}px, ${this.y}px) scale(${this.zoom})`,this.el.classList.toggle("is-zoomed",this.zoom>1)}zoomTo(i,e,t){let s=m(i,1,this.config.maxZoom??8);if(s===this.zoom||!this.rendered)return;let o=this.stage.getBoundingClientRect(),r=e==null?0:e-(o.left+o.width/2),h=t==null?0:t-(o.top+o.height/2),n=s/this.zoom;this.x=r-(r-this.x)*n,this.y=h-(h-this.y)*n,this.zoom=s,this.paint(),this.emit("zoom",s)}zoomBy(i,e,t){this.zoomTo(this.zoom*i,e,t)}reset(){this.x=this.y=0,this.zoomTo(1),this.paint()}getZoom(){return this.zoom}setSrc(i){this.config.src=i,this.rendered&&(this.zoom=1,this.x=this.y=0,this.paint(),this.el.classList.remove("is-error"),this.status.textContent="",this.setLoading(!!i),i?this.img.src=i:this.img.removeAttribute("src"))}setAlt(i){this.config.alt=i,this.rendered&&(this.img.alt="",this.stage.setAttribute("aria-label",i))}setFit(i){this.config.fit=i,this.rendered&&(this.img.style.objectFit=i)}};u("imagecanvas",p);export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-5PYJ6FJK.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/base/imagecanvas/imagecanvas.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h, clamp } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { iconEl, registerIcons } from '../icon/icon';\n\nregisterIcons({ maximize: '<path d=\"M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M16 21h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\"/>' });\n\naddMessages('en', { imgZoomIn: 'Zoom in', imgZoomOut: 'Zoom out', imgReset: 'Reset zoom', imgError: 'The image could not be loaded' });\naddMessages('pt-BR', { imgZoomIn: 'Aumentar', imgZoomOut: 'Diminuir', imgReset: 'Restaurar zoom', imgError: 'N\u00E3o foi poss\u00EDvel carregar a imagem' });\n\nexport interface ImageCanvasConfig extends ComponentConfig {\n src?: string;\n alt?: string;\n /** How the image fills the box at zoom 1. Default `contain`. */\n fit?: 'contain' | 'cover';\n /** Default `true`. */\n zoomable?: boolean;\n /** Default 8. */\n maxZoom?: number;\n /** The zoom buttons. Default `true`. */\n showTools?: boolean;\n /** CSS `aspect-ratio` of the box (e.g. `'16 / 9'`). */\n ratio?: string;\n}\n\n/** An image that fills its box, with zoom and pan. A plain `<img>` moved by a CSS transform. */\nexport class ImageCanvas extends Component<ImageCanvasConfig> {\n protected override baseCls = 'op-imagecanvas';\n private stage!: HTMLElement;\n private img!: HTMLImageElement;\n private status!: HTMLElement;\n private zoom = 1;\n private x = 0;\n private y = 0;\n private pointers = new Map<number, { x: number; y: number }>();\n\n protected override onRender() {\n const c = this.config;\n this.img = h('img', 'op-imagecanvas__img', { draggable: false });\n this.status = h('div', 'op-imagecanvas__status', { role: 'status' });\n this.stage = h('div', 'op-imagecanvas__stage', { tabindex: 0, role: 'img' }, this.img);\n this.el.append(this.stage, this.status);\n if (c.zoomable !== false && c.showTools !== false) {\n const btn = (icon: string, key: string, fn: () => void) => {\n const b = h('button', 'op-imagecanvas__tool', { type: 'button', 'aria-label': t(key), title: t(key) }, iconEl(icon));\n this.listen(b, 'click', fn);\n return b;\n };\n this.el.append(h('div', 'op-imagecanvas__tools', {},\n btn('minus', 'imgZoomOut', () => this.zoomBy(0.8)),\n btn('plus', 'imgZoomIn', () => this.zoomBy(1.25)),\n btn('maximize', 'imgReset', () => this.reset())));\n }\n if (c.ratio) this.el.style.aspectRatio = c.ratio;\n this.listen(this.img, 'load', () => {\n this.setLoading(false);\n this.el.classList.remove('is-error');\n this.status.textContent = '';\n this.emit('load');\n });\n this.listen(this.img, 'error', () => {\n this.setLoading(false);\n this.el.classList.add('is-error');\n this.status.textContent = t('imgError');\n this.emit('error');\n });\n if (c.zoomable !== false) this.bindZoom();\n this.setFit(c.fit ?? 'contain');\n this.setAlt(c.alt ?? '');\n this.setSrc(c.src ?? '');\n }\n\n private bindZoom() {\n const s = this.stage;\n this.listen(s, 'wheel', (e: WheelEvent) => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n this.zoomBy(Math.exp(-e.deltaY * 0.01), e.clientX, e.clientY);\n }, { passive: false });\n this.listen(s, 'dblclick', (e: MouseEvent) => (this.zoom > 1 ? this.reset() : this.zoomBy(2, e.clientX, e.clientY)));\n this.listen(s, 'pointerdown', (e: PointerEvent) => {\n this.pointers.set(e.pointerId, { x: e.clientX, y: e.clientY });\n s.setPointerCapture?.(e.pointerId);\n this.el.classList.toggle('is-dragging', this.zoom > 1);\n });\n this.listen(s, 'pointermove', (e: PointerEvent) => {\n const p = this.pointers.get(e.pointerId);\n if (!p) return;\n const others = [...this.pointers].filter(([id]) => id !== e.pointerId);\n const dx = e.clientX - p.x;\n const dy = e.clientY - p.y;\n if (others.length) {\n const q = others[0][1];\n const before = Math.hypot(p.x - q.x, p.y - q.y);\n const after = Math.hypot(e.clientX - q.x, e.clientY - q.y);\n if (before) this.zoomBy(after / before, (e.clientX + q.x) / 2, (e.clientY + q.y) / 2);\n } else if (this.zoom > 1) this.pan(dx, dy);\n p.x = e.clientX;\n p.y = e.clientY;\n });\n const up = (e: PointerEvent) => {\n this.pointers.delete(e.pointerId);\n this.el.classList.remove('is-dragging');\n };\n this.listen(s, 'pointerup', up);\n this.listen(s, 'pointercancel', up);\n this.listen(s, 'keydown', (e: KeyboardEvent) => {\n const step = 40;\n const pan: Record<string, [number, number]> = { ArrowLeft: [step, 0], ArrowRight: [-step, 0], ArrowUp: [0, step], ArrowDown: [0, -step] };\n if (e.key === '+' || e.key === '=') this.zoomBy(1.25);\n else if (e.key === '-') this.zoomBy(0.8);\n else if (e.key === '0') this.reset();\n else if (pan[e.key] && this.zoom > 1) this.pan(...pan[e.key]);\n else return;\n e.preventDefault();\n });\n }\n\n private pan(dx: number, dy: number) {\n this.x += dx;\n this.y += dy;\n this.paint();\n }\n\n /** Keeps the image covering the box, then moves it. */\n private paint() {\n const w = this.stage.clientWidth;\n const hh = this.stage.clientHeight;\n this.x = clamp(this.x, -((this.zoom - 1) * w) / 2, ((this.zoom - 1) * w) / 2);\n this.y = clamp(this.y, -((this.zoom - 1) * hh) / 2, ((this.zoom - 1) * hh) / 2);\n this.img.style.transform = this.zoom === 1 ? '' : `translate(${this.x}px, ${this.y}px) scale(${this.zoom})`;\n this.el.classList.toggle('is-zoomed', this.zoom > 1);\n }\n\n /** Zooms to `level` (1 to `maxZoom`), keeping the point under the pointer (client coordinates) still; the centre by default. */\n zoomTo(level: number, clientX?: number, clientY?: number): void {\n const next = clamp(level, 1, this.config.maxZoom ?? 8);\n if (next === this.zoom || !this.rendered) return;\n const r = this.stage.getBoundingClientRect();\n const px = clientX == null ? 0 : clientX - (r.left + r.width / 2);\n const py = clientY == null ? 0 : clientY - (r.top + r.height / 2);\n const k = next / this.zoom;\n this.x = px - (px - this.x) * k;\n this.y = py - (py - this.y) * k;\n this.zoom = next;\n this.paint();\n this.emit('zoom', next);\n }\n zoomBy(factor: number, clientX?: number, clientY?: number): void {\n this.zoomTo(this.zoom * factor, clientX, clientY);\n }\n reset(): void {\n this.x = this.y = 0;\n this.zoomTo(1);\n this.paint();\n }\n getZoom(): number {\n return this.zoom;\n }\n\n setSrc(src: string): void {\n this.config.src = src;\n if (!this.rendered) return;\n this.zoom = 1;\n this.x = this.y = 0;\n this.paint();\n this.el.classList.remove('is-error');\n this.status.textContent = '';\n this.setLoading(!!src);\n if (src) this.img.src = src;\n else this.img.removeAttribute('src');\n }\n setAlt(alt: string): void {\n this.config.alt = alt;\n if (!this.rendered) return;\n this.img.alt = '';\n this.stage.setAttribute('aria-label', alt);\n }\n setFit(fit: 'contain' | 'cover'): void {\n this.config.fit = fit;\n if (this.rendered) this.img.style.objectFit = fit;\n }\n}\nregister('imagecanvas', ImageCanvas);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["registerIcons", "addMessages", "ImageCanvas", "Component", "c", "h", "btn", "icon", "key", "fn", "b", "t", "iconEl", "s", "e", "p", "others", "id", "dx", "dy", "q", "before", "after", "up", "pan", "w", "hh", "clamp", "level", "clientX", "clientY", "next", "r", "px", "py", "k", "factor", "src", "alt", "fit", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as s}from"./chunk-4OB2IM5L.js";import{a as o}from"./chunk-UCWICDYG.js";import{a as c}from"./chunk-OADWLPSF.js";import{a as p}from"./chunk-LXWCTCZV.js";var C=r=>{let e=r.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").toLowerCase();return e.charAt(0).toUpperCase()+e.slice(1)},d=r=>r.label??C(r.name),m=(r,e)=>r.filter(t=>!t.hide?.includes(e));function f(r){return m(r,"grid").map(e=>{let t={field:e.name,header:d(e),sortable:!0,width:e.width,group:e.group,summary:e.summary};return e.type==="number"?t.align="right":e.type==="duration"?Object.assign(t,{format:"duration",align:"right"}):e.type==="money"?Object.assign(t,{format:"money",align:"right"}):e.type==="date"||e.type==="datetime"?t.format="date":e.type==="bool"&&Object.assign(t,{format:"bool",align:"center"}),{...t,...e.column}})}function y(r){return m(r,"form").map(e=>{let t={required:e.required||void 0,readonly:e.readonly||void 0,...e.field},n=d(e);if(e.lookup)return o.lookup(e.name,n,e.lookup,t);switch(e.type){case"email":return o.email(e.name,n,t);case"area":return o.area(e.name,n,{colspan:"full",...t});case"number":return o.number(e.name,n,t);case"duration":return o.number(e.name,n,{min:0,...t});case"money":return o.number(e.name,n,{decimals:2,min:0,...t});case"date":return o.date(e.name,n,t);case"datetime":return o.datetime(e.name,n,t);case"select":return o.select(e.name,n,e.options??[],t);case"bool":return o.check(e.name,n,t);default:return o.text(e.name,n,t)}})}function h(r){return m(r,"filter").map(e=>{let t=e.type==="number"||e.type==="money"||e.type==="duration"?"number":e.type==="date"||e.type==="datetime"?"date":e.type==="select"||e.type==="bool"?"select":"text",n=e.type==="bool"?[{value:"true",label:"Yes"},{value:"false",label:"No"}]:e.type==="select"?e.options:void 0;return{name:e.name,label:d(e),type:t,group:e.group,options:n,...e.filter}})}var w=(r,e={})=>new p({columns:f(r),...e});function x(r,e={}){let t=e.columns??2,n=m(r,"form"),b=y(r),u=[],l=new Map;b.forEach((i,F)=>{let a=n[F].group;if(!a)return void u.push(i);l.has(a)||(l.set(a,[]),u.push(a)),l.get(a).push(i)});let g=u.map(i=>typeof i=="string"?new s({title:i,columns:t,items:l.get(i)}):i);return new c({...e,columns:l.size?void 0:t,items:g})}export{f as a,y as b,h as c,w as d,x as e};
|
|
2
|
+
//# sourceMappingURL=chunk-632LUU52.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/build/build.ts"],
|
|
4
|
+
"sourcesContent": ["// One list of field specs feeds the grid columns, the form fields and the filter fields, so a screen is described once.\nimport { ui } from '../ui/ui';\nimport { Grid, type GridConfig } from '../components/data/grid/grid';\nimport { Form, type FormConfig } from '../components/form/form/form';\nimport { FieldSet } from '../components/layout/fieldset/fieldset';\nimport type { FilterField } from '../components/data/filterbuilder/filterbuilder';\nimport type { Column } from '../data/column';\nimport type { Component } from '../core/component';\n\nexport type FieldKind = 'text' | 'email' | 'area' | 'number' | 'money' | 'duration' | 'date' | 'datetime' | 'select' | 'bool';\ntype Cfg = Record<string, any>;\n\nexport interface FieldSpec {\n /** The record's property. */\n name: string;\n /** Default: the name as words (`unitPrice` \u2192 \"Unit price\"). */\n label?: string;\n /** Default `text`. `duration` is a number of minutes, shown as `7h 30m`. */\n type?: FieldKind;\n /** For `select`. */\n options?: Array<string | number | { value: string | number; label: string }>;\n /** Picks the value in a lookup window: a LookupDef or the name given to `registerLookup`. */\n lookup?: Cfg | string;\n required?: boolean;\n readonly?: boolean;\n /** A band over the grid header and a section of the form. */\n group?: string;\n /** Total of the (filtered) rows in the grid: the starting total of the `columnTotals()` plugin. */\n summary?: Column['summary'];\n /** Grid column width in px. */\n width?: number;\n /** Leaves the field out of some of the builds. */\n hide?: Array<'grid' | 'form' | 'filter'>;\n /** Overrides for what each build makes. */\n column?: Partial<Column>;\n field?: Cfg;\n filter?: Partial<FilterField>;\n}\n\nconst words = (name: string) => {\n const s = name.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[_-]+/g, ' ').toLowerCase();\n return s.charAt(0).toUpperCase() + s.slice(1);\n};\nconst label = (s: FieldSpec) => s.label ?? words(s.name);\nconst shown = (specs: FieldSpec[], where: 'grid' | 'form' | 'filter') => specs.filter((s) => !s.hide?.includes(where));\n\n/** Grid columns: right-aligned numbers and money, formatted dates and booleans. */\nexport function buildColumns(specs: FieldSpec[]): Column[] {\n return shown(specs, 'grid').map((s) => {\n const col: Column = { field: s.name, header: label(s), sortable: true, width: s.width, group: s.group, summary: s.summary };\n if (s.type === 'number') col.align = 'right';\n else if (s.type === 'duration') Object.assign(col, { format: 'duration', align: 'right' });\n else if (s.type === 'money') Object.assign(col, { format: 'money', align: 'right' });\n else if (s.type === 'date' || s.type === 'datetime') col.format = 'date';\n else if (s.type === 'bool') Object.assign(col, { format: 'bool', align: 'center' });\n return { ...col, ...s.column };\n });\n}\n\n/** Form fields (instances), in order. */\nexport function buildFields(specs: FieldSpec[]): Component[] {\n return shown(specs, 'form').map((s) => {\n const c: Cfg = { required: s.required || undefined, readonly: s.readonly || undefined, ...s.field };\n const l = label(s);\n if (s.lookup) return ui.lookup(s.name, l, s.lookup, c);\n switch (s.type) {\n case 'email': return ui.email(s.name, l, c);\n case 'area': return ui.area(s.name, l, { colspan: 'full', ...c });\n case 'number': return ui.number(s.name, l, c);\n case 'duration': return ui.number(s.name, l, { min: 0, ...c });\n case 'money': return ui.number(s.name, l, { decimals: 2, min: 0, ...c });\n case 'date': return ui.date(s.name, l, c);\n case 'datetime': return ui.datetime(s.name, l, c);\n case 'select': return ui.select(s.name, l, (s.options ?? []) as any, c);\n case 'bool': return ui.check(s.name, l, c);\n default: return ui.text(s.name, l, c);\n }\n });\n}\n\n/** Fields for a `FilterBuilder`; `bool` filters as a Yes/No choice. */\nexport function buildFilterFields(specs: FieldSpec[]): FilterField[] {\n return shown(specs, 'filter').map((s) => {\n const type = s.type === 'number' || s.type === 'money' || s.type === 'duration' ? 'number' : s.type === 'date' || s.type === 'datetime' ? 'date' : s.type === 'select' || s.type === 'bool' ? 'select' : 'text';\n const options = s.type === 'bool' ? [{ value: 'true', label: 'Yes' }, { value: 'false', label: 'No' }] : s.type === 'select' ? s.options : undefined;\n return { name: s.name, label: label(s), type, group: s.group, options, ...s.filter };\n });\n}\n\n/** A `Grid` whose columns come from the specs. `cfg` adds or overrides anything (`store`, `selection`, ...). */\nexport const buildGrid = (specs: FieldSpec[], cfg: Partial<GridConfig> = {}) => new Grid({ columns: buildColumns(specs), ...cfg });\n\n/** A `Form` with the fields in `columns` columns (default 2); specs with a `group` go in a `FieldSet` of that title. */\nexport function buildForm(specs: FieldSpec[], cfg: FormConfig & { columns?: number } = {}) {\n const columns = cfg.columns ?? 2;\n const visible = shown(specs, 'form');\n const fields = buildFields(specs);\n const items: Array<Component | string> = [];\n const sets = new Map<string, Component[]>();\n fields.forEach((f, i) => {\n const g = visible[i].group;\n if (!g) return void items.push(f);\n if (!sets.has(g)) {\n sets.set(g, []);\n items.push(g);\n }\n sets.get(g)!.push(f);\n });\n const done = items.map((i) => (typeof i === 'string' ? new FieldSet({ title: i, columns, items: sets.get(i) as any }) : i));\n return new Form({ ...cfg, columns: sets.size ? undefined : columns, items: done as any });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["words", "name", "s", "label", "shown", "specs", "where", "buildColumns", "col", "buildFields", "c", "l", "ui", "buildFilterFields", "type", "options", "buildGrid", "cfg", "Grid", "buildForm", "columns", "visible", "fields", "items", "sets", "f", "i", "g", "done", "FieldSet", "Form"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as o}from"./chunk-DIOJGTUN.js";import{a as h}from"./chunk-TIPK3SCJ.js";import{f as d}from"./chunk-UDXO3KM3.js";import{b as e}from"./chunk-PZSHOSOS.js";import{e as n,f as r}from"./chunk-S4QD5NID.js";n("en",{stepOptional:"optional",stepDone:"completed",stepError:"has errors",stepSteps:"Steps"});n("pt-BR",{stepOptional:"opcional",stepDone:"conclu\xEDda",stepError:"com erros",stepSteps:"Etapas"});var a=class extends d{baseCls="op-stepper";tag="nav";list;active=0;states=[];onRender(){let t=this.config;this.active=t.active??0,this.el.setAttribute("aria-label",t.ariaLabel??r("stepSteps")),this.list=e("ol","op-stepper__list"),this.el.append(this.list),this.listen(this.list,"click",i=>{let s=i.target.closest(".op-stepper__btn");if(!s||s.disabled)return;let p=Number(s.dataset.i);this.emit("before-select",p)!==!1&&(this.setActive(p),this.emit("select",p))}),this.paint()}steps(){return this.config.steps??[]}paint(){this.list.replaceChildren(...this.steps().map((t,i)=>{let s=this.states[i]??"pending",p=i===this.active,m=e("span","op-stepper__marker",{"aria-hidden":"true"},s==="done"&&!p?o("check"):s==="error"?"!":t.icon?o(t.icon):String(i+1)),c=s==="done"&&!p?r("stepDone"):s==="error"?r("stepError"):"",l=e("button","op-stepper__btn",{type:"button","data-i":i,"aria-current":p?"step":null},m,e("span","op-stepper__text",{},e("span","op-stepper__title",{},t.title),t.description?e("span","op-stepper__desc",{},t.description):"",t.optional?e("span","op-stepper__opt",{},r("stepOptional")):"",c?e("span","op-sr-only",{},c):""));l.disabled=this.config.clickable===!1;let g=i===this.steps().length-1;return e("li",`op-stepper__step${p?" is-current":""}${s==="done"?" is-done":""}${s==="error"?" is-error":""}${t.optional?" is-optional":""}`,{},l,g?"":e("span","op-stepper__line",{"aria-hidden":"true"}))}))}setActive(t){this.active=Math.max(0,Math.min(t,this.steps().length-1)),this.config.active=this.active,this.rendered&&this.paint()}getActive(){return this.active}setStepState(t,i){this.states[t]=i,this.rendered&&this.paint()}getStepState(t){return this.states[t]??"pending"}setSteps(t){this.config.steps=t,this.states=[],this.rendered&&this.paint()}};h("stepper",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-6BOM5KZR.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m,b as u}from"./chunk-E4VNLYO2.js";import{b as f}from"./chunk-676AKAGF.js";import{a as g}from"./chunk-VV7CFMPZ.js";import{
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as m,b as u}from"./chunk-E4VNLYO2.js";import{b as f}from"./chunk-676AKAGF.js";import{a as g}from"./chunk-VV7CFMPZ.js";import{a as d,c as p}from"./chunk-TIPK3SCJ.js";import{f as n}from"./chunk-UDXO3KM3.js";import{b as h,c as l}from"./chunk-PZSHOSOS.js";import{b,c as v}from"./chunk-4AA4FQEM.js";var o=[],s=class extends n{baseCls="op-dropdown";content;open_=!1;release=[];leaving=0;build(){let e=h("div","op-dropdown",{role:this.config.role??"dialog"});e.hidden=!0;let t=this.config.content;return t&&(this.content=t instanceof HTMLElement||t instanceof n?t:p(t),e.append(this.content instanceof n?this.content.el:this.content)),e}getAnchor(){let e=this.config.anchor;return e instanceof n?e.el:e instanceof HTMLElement?e:void 0}isOpen(){return this.open_}open(){if(this.open_||this.destroyed||this.emit("before-open")===!1)return;let e=this.getAnchor();f(this.el,e),e&&this.el.getAttribute("role")==="dialog"&&!this.el.hasAttribute("aria-label")&&!this.el.hasAttribute("aria-labelledby")&&(e.id||=l(),this.el.setAttribute("aria-labelledby",e.id)),this.leaving++,this.el.getAnimations?.().forEach(i=>i.cancel()),this.el.hidden=!1,this.open_=!0,o.push(this),this.el.classList.add("is-open"),this.content instanceof n&&this.content.notifyMount(),this.reposition(),b(this.el,e??this.config.anchor,"dropdown"),e?.setAttribute("aria-expanded","true");let t=this.config,r=i=>{let a=i.target;t.closeOnOutside!==!1&&!this.el.contains(a)&&!e?.contains(a)&&this.close()},c=i=>{i.key==="Escape"&&t.closeOnEsc!==!1&&o[o.length-1]===this&&(i.stopPropagation(),this.close(),(e?.querySelector("input,button")??e)?.focus?.())};document.addEventListener("pointerdown",r,!0),document.addEventListener("keydown",c,!0),this.release=[()=>document.removeEventListener("pointerdown",r,!0),()=>document.removeEventListener("keydown",c,!0),u(()=>this.reposition())],t.autoFocus&&g(this.el)[0]?.focus(),this.emit("open")}close(){if(!this.open_||this.emit("before-close")===!1)return;this.open_=!1,o.splice(o.indexOf(this),1),this.el.classList.remove("is-open");let e=v(this.el,this.getAnchor()??this.config.anchor,"dropdown");if(e){let t=++this.leaving;e.then(()=>t===this.leaving&&!this.open_&&(this.el.hidden=!0))}else this.el.hidden=!0;this.getAnchor()?.setAttribute("aria-expanded","false"),this.release.splice(0).forEach(t=>t()),this.emit("close")}toggle(){this.open_?this.close():this.open()}reposition(){let e=this.getAnchor()??this.config.anchor;if(!this.open_||!e||e instanceof n)return;let t=this.config;m(this.el,e,{placement:t.placement??"bottom-start",offset:t.offset,flip:t.flip,matchWidth:t.matchWidth})}setAnchor(e){this.config.anchor=e,this.reposition()}setPlacement(e){this.config.placement=e,this.reposition()}setContent(e){this.content instanceof n&&this.content!==e&&this.content.destroy(),this.config.content=e,this.content=e,this.el.replaceChildren(e instanceof n?e.el:e),this.reposition()}onDestroy(){this.open_&&o.splice(o.indexOf(this),1),this.open_=!1,this.release.splice(0).forEach(e=>e()),this.getAnchor()?.setAttribute("aria-expanded","false"),this.content instanceof n&&this.content.destroy()}};d("dropdown",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-6NP4AEV4.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as h}from"./chunk-DIOJGTUN.js";import{a as f}from"./chunk-QVBDBGS4.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as c,f as m}from"./chunk-S4QD5NID.js";c("en",{imgDrop:"Drop an image here or click to choose",imgType:"{name} is not an accepted image type",imgSize:"{name} is larger than {max}",imgCount:"At most {n} images",imgRemove:"Remove {name}"});c("pt-BR",{imgDrop:"Solte uma imagem aqui ou clique para escolher",imgType:"{name} n\xE3o \xE9 um tipo de imagem aceito",imgSize:"{name} \xE9 maior que {max}",imgCount:"No m\xE1ximo {n} imagens",imgRemove:"Remover {name}"});var d=l=>typeof l=="string"?l.split(/[?#]/)[0].split("/").pop()??l:l.name,g=class extends f{baseCls="op-field op-imagefield";zone;picker;list;urls=[];emptyValue(){return this.config.multiple?[]:null}isEmpty(e){return!this.itemsOf(e).length}isEqual(e,i){let s=this.itemsOf(e),t=this.itemsOf(i);return s.length===t.length&&s.every((r,p)=>r===t[p])}itemsOf(e){return e==null?[]:Array.isArray(e)?e:[e]}items(){return this.itemsOf(this.value)}createControl(){return this.zone=o("button","op-imagefield__zone",{type:"button"},h("image"),o("span","op-imagefield__hint")),this.inputEl=this.zone,this.picker=o("input","op-imagefield__picker",{type:"file",tabindex:-1,"aria-hidden":"true"}),this.list=o("div","op-imagefield__list",{role:"list"}),this.listen(this.zone,"click",()=>this.open()),this.listen(this.picker,"change",()=>{this.add(Array.from(this.picker.files??[])),this.picker.value=""}),this.listen(this.zone,"dragover",e=>{e.preventDefault(),this.el.classList.add("is-dragover")}),this.listen(this.zone,"dragleave",()=>this.el.classList.remove("is-dragover")),this.listen(this.zone,"drop",e=>{e.preventDefault(),this.el.classList.remove("is-dragover"),this.add(Array.from(e.dataTransfer?.files??[]))}),this.listen(this.list,"click",e=>{let i=e.target.closest(".op-imagefield__remove");i&&this.remove(Number(i.dataset.i))}),this.own(()=>this.revoke()),o("div","op-imagefield__box",{},this.zone,this.picker,this.list)}onRender(){this.picker.accept=this.config.accept??"image/*",this.picker.multiple=!!this.config.multiple,this.zone.querySelector(".op-imagefield__hint").textContent=this.config.placeholder??m("imgDrop"),super.onRender()}applyValue(e){this.revoke(),this.list.replaceChildren(...this.itemsOf(e).map((i,s)=>{let t=typeof i=="string"?i:this.url(i);return o("div","op-imagefield__item",{role:"listitem"},o("img","op-imagefield__img",{src:t,alt:""}),o("span","op-imagefield__name",{},d(i)),o("button","op-imagefield__remove",{type:"button","data-i":s,"aria-label":m("imgRemove",{name:d(i)})},h("x")))})),this.sync()}url(e){let i=URL.createObjectURL(e);return this.urls.push(i),i}revoke(){for(let e of this.urls.splice(0))URL.revokeObjectURL(e)}sync(){let e=this.config,i=this.items().length,s=e.multiple?!!e.maxFiles&&i>=e.maxFiles:i>0;this.zone.hidden=s||!!e.readonly,this.zone.disabled=this.picker.disabled=!!e.disabled;for(let t of this.list.querySelectorAll(".op-imagefield__remove"))t.hidden=!!e.readonly,t.disabled=!!e.disabled}onDisabled(){this.sync()}onReadonly(){this.sync()}open(){!this.config.disabled&&!this.config.readonly&&this.picker.click()}accepts(e){let i=(this.config.accept??"image/*").split(",").map(t=>t.trim().toLowerCase()).filter(Boolean),s=e.name.toLowerCase();return i.some(t=>t.startsWith(".")?s.endsWith(t):t.endsWith("/*")?e.type.startsWith(t.slice(0,-1)):e.type===t)}add(e){let i=this.config;if(i.disabled||i.readonly)return;let s=this.holdsFocus(),t=[],r="",p=i.multiple?(i.maxFiles??1/0)-this.items().length:1;for(let n of e){let a="";if(this.accepts(n)?i.maxSize!=null&&n.size>i.maxSize?a="size":(t.length>=p||!i.multiple&&t.length)&&(a="count"):a="type",!a){t.push(n);continue}let v=i.maxSize!=null?i.maxSize>=1048576?`${+(i.maxSize/1048576).toFixed(1)} MB`:`${+(i.maxSize/1024).toFixed(1)} KB`:"";r=m(`img${a[0].toUpperCase()}${a.slice(1)}`,{name:n.name,max:v,n:i.maxFiles??1}),this.emit("reject",n,a)}t.length&&this.commit(i.multiple?[...this.items(),...t]:t[0]),r?this.setError(r):t.length&&this.clearError(),s&&this.refocus()}remove(e){if(this.config.disabled||this.config.readonly)return;let i=this.holdsFocus(),s=this.items().filter((t,r)=>r!==e);this.commit(this.config.multiple?s:null),i&&this.refocus()}commit(e){super.commit(e),this.applyValue(e)}holdsFocus(){return this.el.contains(document.activeElement)}refocus(){(this.zone.hidden?this.list.querySelector(".op-imagefield__remove"):this.zone)?.focus()}getDisplayText(){return this.items().map(d).join(", ")}};u("imagefield",g);export{g as a};
|
|
2
|
+
//# sourceMappingURL=chunk-6PPRYSLN.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/imagefield/imagefield.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 { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n imgDrop: 'Drop an image here or click to choose',\n imgType: '{name} is not an accepted image type',\n imgSize: '{name} is larger than {max}',\n imgCount: 'At most {n} images',\n imgRemove: 'Remove {name}',\n});\naddMessages('pt-BR', {\n imgDrop: 'Solte uma imagem aqui ou clique para escolher',\n imgType: '{name} n\u00E3o \u00E9 um tipo de imagem aceito',\n imgSize: '{name} \u00E9 maior que {max}',\n imgCount: 'No m\u00E1ximo {n} imagens',\n imgRemove: 'Remover {name}',\n});\n\n/** A new `File`, or the URL (string) of an image already saved. */\nexport type ImageItem = File | string;\nexport type ImageValue = ImageItem | ImageItem[] | null;\n\nexport interface ImageFieldConfig extends FieldConfig<ImageValue> {\n /** The input's `accept` (also checked on dropped files). Default `image/*`. */\n accept?: string;\n /** Bytes. */\n maxSize?: number;\n multiple?: boolean;\n /** With `multiple`. */\n maxFiles?: number;\n placeholder?: string;\n}\n\nconst nameOf = (i: ImageItem) => (typeof i === 'string' ? (i.split(/[?#]/)[0].split('/').pop() ?? i) : i.name);\n\n/** Picks images by click or drop, with a preview. Holds the files; sending them is up to the app. */\nexport class ImageField extends Field<ImageValue, ImageFieldConfig> {\n protected override baseCls = 'op-field op-imagefield';\n private zone!: HTMLButtonElement;\n private picker!: HTMLInputElement;\n private list!: HTMLElement;\n private urls: string[] = [];\n\n protected override emptyValue(): ImageValue {\n return this.config.multiple ? [] : null;\n }\n protected override isEmpty(v: ImageValue): boolean {\n return !this.itemsOf(v).length;\n }\n protected override isEqual(a: ImageValue, b: ImageValue): boolean {\n const x = this.itemsOf(a);\n const y = this.itemsOf(b);\n return x.length === y.length && x.every((i, k) => i === y[k]);\n }\n\n private itemsOf(v: ImageValue): ImageItem[] {\n return v == null ? [] : Array.isArray(v) ? v : [v];\n }\n private items(): ImageItem[] {\n return this.itemsOf(this.value);\n }\n\n protected createControl() {\n this.zone = h('button', 'op-imagefield__zone', { type: 'button' }, iconEl('image'), h('span', 'op-imagefield__hint'));\n this.inputEl = this.zone;\n this.picker = h('input', 'op-imagefield__picker', { type: 'file', tabindex: -1, 'aria-hidden': 'true' });\n this.list = h('div', 'op-imagefield__list', { role: 'list' });\n this.listen(this.zone, 'click', () => this.open());\n this.listen(this.picker, 'change', () => {\n this.add(Array.from(this.picker.files ?? []));\n this.picker.value = '';\n });\n this.listen(this.zone, 'dragover', (e: DragEvent) => {\n e.preventDefault();\n this.el.classList.add('is-dragover');\n });\n this.listen(this.zone, 'dragleave', () => this.el.classList.remove('is-dragover'));\n this.listen(this.zone, 'drop', (e: DragEvent) => {\n e.preventDefault();\n this.el.classList.remove('is-dragover');\n this.add(Array.from(e.dataTransfer?.files ?? []));\n });\n this.listen(this.list, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('.op-imagefield__remove');\n if (b) this.remove(Number(b.dataset.i));\n });\n this.own(() => this.revoke());\n return h('div', 'op-imagefield__box', {}, this.zone, this.picker, this.list);\n }\n\n protected override onRender() {\n this.picker.accept = this.config.accept ?? 'image/*';\n this.picker.multiple = !!this.config.multiple;\n (this.zone.querySelector('.op-imagefield__hint') as HTMLElement).textContent = this.config.placeholder ?? t('imgDrop');\n super.onRender();\n }\n\n protected applyValue(v: ImageValue) {\n this.revoke();\n this.list.replaceChildren(\n ...this.itemsOf(v).map((it, i) => {\n const src = typeof it === 'string' ? it : this.url(it);\n return h('div', 'op-imagefield__item', { role: 'listitem' },\n h('img', 'op-imagefield__img', { src, alt: '' }),\n h('span', 'op-imagefield__name', {}, nameOf(it)),\n h('button', 'op-imagefield__remove', { type: 'button', 'data-i': i, 'aria-label': t('imgRemove', { name: nameOf(it) }) }, iconEl('x')));\n }),\n );\n this.sync();\n }\n\n private url(f: File): string {\n const u = URL.createObjectURL(f);\n this.urls.push(u);\n return u;\n }\n private revoke() {\n for (const u of this.urls.splice(0)) URL.revokeObjectURL(u);\n }\n\n /** The zone is there only while there is room for another image and the user may edit. */\n private sync() {\n const c = this.config;\n const n = this.items().length;\n const full = c.multiple ? !!c.maxFiles && n >= c.maxFiles : n > 0;\n this.zone.hidden = full || !!c.readonly;\n this.zone.disabled = this.picker.disabled = !!c.disabled;\n for (const b of this.list.querySelectorAll<HTMLButtonElement>('.op-imagefield__remove')) {\n b.hidden = !!c.readonly;\n b.disabled = !!c.disabled;\n }\n }\n protected override onDisabled() {\n this.sync();\n }\n protected override onReadonly() {\n this.sync();\n }\n\n /** Opens the browser's file picker. */\n open(): void {\n if (!this.config.disabled && !this.config.readonly) this.picker.click();\n }\n\n private accepts(f: File): boolean {\n const rules = (this.config.accept ?? 'image/*').split(',').map((s) => s.trim().toLowerCase()).filter(Boolean);\n const name = f.name.toLowerCase();\n return rules.some((r) => (r.startsWith('.') ? name.endsWith(r) : r.endsWith('/*') ? f.type.startsWith(r.slice(0, -1)) : f.type === r));\n }\n\n /** Adds files with the same checks as a drop. Without `multiple` the first valid file replaces the image. */\n add(files: File[]): void {\n const c = this.config;\n if (c.disabled || c.readonly) return;\n const had = this.holdsFocus();\n const ok: File[] = [];\n let message = '';\n const room = c.multiple ? (c.maxFiles ?? Infinity) - this.items().length : 1;\n for (const f of files) {\n let reason: 'type' | 'size' | 'count' | '' = '';\n if (!this.accepts(f)) reason = 'type';\n else if (c.maxSize != null && f.size > c.maxSize) reason = 'size';\n else if (ok.length >= room || (!c.multiple && ok.length)) reason = 'count';\n if (!reason) {\n ok.push(f);\n continue;\n }\n const max = c.maxSize != null ? (c.maxSize >= 1048576 ? `${+(c.maxSize / 1048576).toFixed(1)} MB` : `${+(c.maxSize / 1024).toFixed(1)} KB`) : '';\n message = t(`img${reason[0].toUpperCase()}${reason.slice(1)}`, { name: f.name, max, n: c.maxFiles ?? 1 });\n this.emit('reject', f, reason);\n }\n if (ok.length) this.commit(c.multiple ? [...this.items(), ...ok] : ok[0]);\n if (message) this.setError(message);\n else if (ok.length) this.clearError();\n if (had) this.refocus();\n }\n\n /** Removes the image at `index`. */\n remove(index: number): void {\n if (this.config.disabled || this.config.readonly) return;\n const had = this.holdsFocus();\n const left = this.items().filter((_, i) => i !== index);\n this.commit(this.config.multiple ? left : null);\n if (had) this.refocus();\n }\n\n protected override commit(v: ImageValue) {\n super.commit(v);\n this.applyValue(v);\n }\n\n private holdsFocus(): boolean {\n return this.el.contains(document.activeElement);\n }\n\n /** The button the keyboard user was on may be gone: move to the one that is left. */\n private refocus() {\n (this.zone.hidden ? this.list.querySelector<HTMLElement>('.op-imagefield__remove') : this.zone)?.focus();\n }\n\n override getDisplayText(): string {\n return this.items().map(nameOf).join(', ');\n }\n}\nregister('imagefield', ImageField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "nameOf", "i", "ImageField", "Field", "v", "a", "b", "x", "y", "k", "h", "iconEl", "t", "it", "src", "f", "u", "c", "n", "full", "rules", "s", "name", "r", "files", "had", "ok", "message", "room", "reason", "max", "index", "left", "_", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as h}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as h}from"./chunk-JBOKM5YA.js";import{a as d}from"./chunk-LHWY6G6Q.js";import{c as n}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as o,f as s}from"./chunk-S4QD5NID.js";o("en",{secretShow:"Show value",secretHide:"Hide value",secretStored:"A value is saved. It cannot be shown again.",secretReplace:"Replace",secretKeep:"Keep current",secretWarnTitle:"Replace the saved value?",secretWarn:"The saved value cannot be displayed and will be discarded as soon as you replace it. Type the new value next; it takes effect when you save."});o("pt-BR",{secretShow:"Mostrar valor",secretHide:"Ocultar valor",secretStored:"H\xE1 um valor salvo. Ele n\xE3o pode ser exibido novamente.",secretReplace:"Substituir",secretKeep:"Manter o atual",secretWarnTitle:"Substituir o valor salvo?",secretWarn:"O valor salvo n\xE3o pode ser exibido e ser\xE1 descartado assim que voc\xEA o substituir. Digite o novo valor em seguida; ele s\xF3 vale quando voc\xEA salvar."});var p="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",a=class extends d{baseCls="op-field op-textfield op-secret";stored=!1;initialStored=!1;replacing=!1;revealed=!1;eyeBtn;replaceBtn;keepBtn;hint;constructor(e={}){super({autocomplete:"new-password",...e,inputType:"password"}),this.stored=this.initialStored=!!e.stored}emptyValue(){return null}isEmpty(e){return!this.stored&&(e==null||e==="")}createControl(){let e=super.createControl(),t=this.input;return t.spellcheck=!1,this.eyeBtn=i("button","op-secret__eye",{type:"button","aria-pressed":"false"}),this.replaceBtn=i("button","op-secret__replace",{type:"button"},s("secretReplace")),this.keepBtn=i("button","op-secret__keep",{type:"button"},s("secretKeep")),this.hint=i("div","op-secret__hint",{id:`${this.id}-hint`},i("span","op-secret__note",{},s("secretStored")),this.keepBtn),this.listen(this.eyeBtn,"mousedown",r=>r.preventDefault()),this.listen(this.eyeBtn,"click",()=>this.setRevealed(!this.revealed)),this.listen(this.replaceBtn,"click",()=>{this.replace()}),this.listen(this.keepBtn,"click",()=>this.keep()),this.listen(t,"click",()=>this.stored&&void this.replace()),this.listen(t,"keydown",r=>{this.stored&&(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),this.replace())}),this.on("blur",()=>this.config.autoHide!==!1&&this.setRevealed(!1)),e.append(this.eyeBtn,this.replaceBtn),i("div","op-secret__box",{},e,this.hint)}onRender(){super.onRender(),this.paint()}isStored(){return this.stored}isReplacing(){return this.replacing}isRevealed(){return this.revealed}setStored(e){this.stored=e,this.replacing=!1,this.revealed=!1,super.setValue(null,!0),this.paint(),this.emit("stored-change",e)}setValue(e,t=!1){if(e===!0)return this.setStored(!0);e===!1&&(e=null),this.stored&&e!=null&&(this.stored=!1,this.replacing=!0),super.setValue(e,t),this.paint()}markClean(){super.markClean(),this.initialStored=this.stored}reset(){this.setStored(this.initialStored),super.reset()}async replace(){return!this.stored||this.config.readonly||this.config.disabled||this.emit("before-replace")===!1||this.config.confirmReplace!==!1&&!await h.confirm(this.config.replaceText??s("secretWarn"),{danger:!0,title:this.config.replaceTitle??s("secretWarnTitle"),okText:s("secretReplace")})?!1:(this.stored=!1,this.replacing=!0,super.setValue("",!1),this.paint(),this.input.focus(),this.emit("replace"),!0)}keep(){this.replacing&&(this.stored=!0,this.replacing=!1,this.revealed=!1,super.setValue(null,!1),this.paint(),this.emit("keep"))}setRevealed(e){this.stored&&(e=!1),this.revealed=e,this.paint()}getDisplayText(){return this.stored||(this.value??"")!==""?p:""}paint(){if(!this.rendered)return;let e=this.input,t=this.revealed&&!this.stored;e.type=t?"text":"password",e.readOnly=this.stored||!!this.config.readonly,e.placeholder=this.stored?p:this.config.placeholder??"",this.stored&&(e.value=""),e.setAttribute("aria-describedby",this.stored||this.replacing?this.hint.id:""),!this.stored&&!this.replacing&&e.removeAttribute("aria-describedby"),this.eyeBtn.hidden=this.stored,this.eyeBtn.setAttribute("aria-pressed",String(t)),this.eyeBtn.setAttribute("aria-label",s(t?"secretHide":"secretShow")),this.eyeBtn.replaceChildren(n(t?"eye-off":"eye")),this.replaceBtn.hidden=!this.stored,this.hint.hidden=!this.stored&&!this.replacing,this.hint.querySelector(".op-secret__note").hidden=!this.stored,this.keepBtn.hidden=!this.replacing,this.el.classList.toggle("is-stored",this.stored),this.el.classList.toggle("is-replacing",this.replacing),this.el.classList.toggle("is-revealed",t),this.el.classList.toggle("has-value",this.stored||!!e.value)}};l("secretfield",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-6TZJO2G2.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as o}from"./chunk-S4QD5NID.js";import{a as i}from"./chunk-4C666HHU.js";var p={};i(p,{email:()=>y,max:()=>x,maxLength:()=>m,min:()=>g,minLength:()=>s,pattern:()=>l,range:()=>u});var n=t=>typeof t=="string"||Array.isArray(t)?t.length:0,s=(t,e)=>r=>n(r)<t?e??o("minLength",{n:t}):!0,m=(t,e)=>r=>n(r)>t?e??o("maxLength",{n:t}):!0,l=(t,e)=>r=>t.test(String(r))?!0:e??o("pattern"),y=t=>e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e))?!0:t??o("email"),g=(t,e)=>r=>Number(r)<t?e??o("min",{n:t}):!0,x=(t,e)=>r=>Number(r)>t?e??o("max",{n:t}):!0,u=(t,e,r)=>a=>Number(a)<t||Number(a)>e?r??o("range",{min:t,max:e}):!0;export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-7Y2GHQRB.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as w}from"./chunk-DIOJGTUN.js";import{c as y}from"./chunk-BQEFLPDA.js";import{a as m}from"./chunk-QVBDBGS4.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{f as p}from"./chunk-UDXO3KM3.js";import{b as n}from"./chunk-PZSHOSOS.js";import{e as c,f as l}from"./chunk-S4QD5NID.js";import{b as v}from"./chunk-V5G5JECN.js";c("en",{flAdd:"Add",flRemove:"Remove {row}",flUp:"Move {row} up",flDown:"Move {row} down",flEmpty:"Nothing added yet",flMin:"Add at least {n}",flMax:"At most {n}"});c("pt-BR",{flAdd:"Adicionar",flRemove:"Remover {row}",flUp:"Subir {row}",flDown:"Descer {row}",flEmpty:"Nada adicionado ainda",flMin:"Adicione pelo menos {n}",flMax:"No m\xE1ximo {n}"});var u=class extends m{baseCls="op-field op-fieldlist";rowsEl;addBtn;emptyEl;rows=[];syncing=!1;emptyValue(){return[]}isEmpty(t){return!t?.length}createControl(){return this.rowsEl=n("div","op-fieldlist__rows",{role:"group"}),this.emptyEl=n("div","op-fieldlist__empty",{},l("flEmpty")),this.addBtn=n("button","op-fieldlist__add",{type:"button"},w("plus"),n("span","",{},this.config.addText??l("flAdd"))),this.listen(this.addBtn,"click",()=>this.addRow()),this.inputEl=this.addBtn,n("div","op-fieldlist__box",{},this.rowsEl,this.emptyEl,this.addBtn)}onRender(){super.onRender(),this.rowsEl.setAttribute("aria-labelledby",this.el.querySelector(".op-field__label").id||=`${this.id}-label`)}label(t){return`${this.config.label??""} ${t+1}`.trim()}makeRow(t){let e=s=>{let i=s instanceof p?s.config:s,r={...i,...Array.isArray(i.items)?{items:i.items.map(e)}:{}};return s instanceof p?new s.constructor(r):r},o=new y({cls:"op-fieldlist__row",layout:this.config.rowLayout??{type:"hbox",align:"flex-start"},items:(this.config.items??[]).map(e)});for(let s of o.items)s.config.width!=null&&s.config.flex==null&&(s.config.flex="none");for(let s of this.rowFields(o))s.fillFrom(t),s.on("change",()=>this.syncing||this.commitRows());return o}rowFields(t){return t.query(e=>e instanceof m)}collect(){return this.rows.map(t=>{let e={};for(let o of this.rowFields(t))o.name&&v(e,o.name,o.getValue());return e})}commitRows(){this.commit(this.collect()),this.paintRows(),this.getError()&&this.validate()}paintRows(){if(!this.rendered)return;let{min:t=0,max:e=1/0,reorderable:o=!0}=this.config;this.rowsEl.replaceChildren(...this.rows.map((s,i)=>{let r=s.el;r.setAttribute("role","group"),r.setAttribute("aria-label",this.label(i)),r.classList.toggle("is-first",i===0),r.querySelector(":scope > .op-fieldlist__tools")?.remove();let a=(b,h,R,E)=>{let f=n("button","op-fieldlist__tool",{type:"button","data-act":h,"aria-label":l(h,{row:this.label(i)}),"data-op-tip":l(h,{row:this.label(i)})},w(b));return f.disabled=R||!!this.config.disabled||!!this.config.readonly,f.addEventListener("click",E),f},d=n("div","op-fieldlist__tools");return o&&d.append(a("chevron-up","flUp",i===0,()=>this.moveRow(i,i-1)),a("chevron-down","flDown",i===this.rows.length-1,()=>this.moveRow(i,i+1))),d.append(a("trash","flRemove",this.rows.length<=t,()=>this.removeRow(i))),r.append(d),r})),this.emptyEl.hidden=this.rows.length>0,this.el.classList.toggle("is-empty",!this.rows.length),this.addBtn.disabled=this.rows.length>=e||!!this.config.disabled||!!this.config.readonly}applyValue(t){this.syncing=!0,this.rows.forEach(o=>o.destroy()),this.rows=(t??[]).map(o=>this.makeRow(o)),this.syncing=!1;let e=this.isEqual(this.original,t);this.value=this.collect(),e&&(this.original=this.value),this.paintRows()}addRow(t){let e=this.config.max??1/0;if(this.rows.length>=e)return;let o=this.config.newRow;this.rows.push(this.makeRow(t??(typeof o=="function"?o():{...o}))),this.commitRows(),this.emit("add",this.rows.length-1),this.rowFields(this.rows[this.rows.length-1])[0]?.focus()}removeRow(t){if(!this.rows[t]||this.rows.length<=(this.config.min??0)||this.emit("before-remove",t)===!1)return;let[e]=this.rows.splice(t,1);e.destroy(),this.commitRows(),this.emit("remove",t);let o=this.rows[Math.min(t,this.rows.length-1)];o?this.rowFields(o)[0]?.focus():this.rendered&&this.addBtn.focus()}moveRow(t,e){if(!this.rows[t]||e<0||e>=this.rows.length||t===e)return;let[o]=this.rows.splice(t,1);this.rows.splice(e,0,o),this.commitRows(),this.emit("move",t,e);let s=["flUp","flDown"].map(i=>o.el.querySelector(`[data-act="${i}"]`));(e<t?s:s.reverse()).find(i=>i&&!i.disabled)?.focus()}getRows(){return this.rows}getRowFields(t){return this.rows[t]?this.rowFields(this.rows[t]):[]}fieldAt(t){let[e,...o]=t.split(".");return this.getRowFields(Number(e)).find(s=>s.name===o.join("."))}setAddText(t){this.config.addText=t,this.rendered&&(this.addBtn.lastElementChild.textContent=t)}setMin(t){this.config.min=t,this.paintRows()}setMax(t){this.config.max=t,this.paintRows()}check(){let t=this.value?.length??0,{min:e=0,max:o=1/0}=this.config;return t&&t<e?l("flMin",{n:e}):t>o?l("flMax",{n:o}):super.check()}validate(){let t=this.rows.flatMap(e=>this.rowFields(e)).map(e=>e.validate()).every(Boolean);return super.validate()&&t}isValid(){return super.isValid()&&this.rows.every(t=>this.rowFields(t).every(e=>e.isValid()))}focus(){let t=this.rows.flatMap(e=>this.rowFields(e)).find(e=>e.getError());t?t.focus():this.addBtn?.focus()}onDisabled(t){this.rows.forEach(e=>e.setDisabled(t)),this.paintRows()}onReadonly(t){this.rows.forEach(e=>this.rowFields(e).forEach(o=>o.setReadonly(t))),this.paintRows()}onDestroy(){this.rows.forEach(t=>t.destroy()),super.onDestroy()}};g("fieldlist",u);export{u as a};
|
|
2
|
+
//# sourceMappingURL=chunk-A36JFIA3.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/fieldlist/fieldlist.ts"],
|
|
4
|
+
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { Container } from '../../../core/container';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Component } from '../../../core/component';\nimport { iconEl } from '../../base/icon/icon';\nimport { setPath } from '../../../core/path';\n\naddMessages('en', { flAdd: 'Add', flRemove: 'Remove {row}', flUp: 'Move {row} up', flDown: 'Move {row} down', flEmpty: 'Nothing added yet', flMin: 'Add at least {n}', flMax: 'At most {n}' });\naddMessages('pt-BR', { flAdd: 'Adicionar', flRemove: 'Remover {row}', flUp: 'Subir {row}', flDown: 'Descer {row}', flEmpty: 'Nada adicionado ainda', flMin: 'Adicione pelo menos {n}', flMax: 'No m\u00E1ximo {n}' });\n\ntype Row = Record<string, any>;\n\nexport interface FieldListConfig extends FieldConfig<Row[]> {\n /** The fields of one row (configs or instances such as `ui.text(...)`). Names are relative to the row (nested allowed). */\n items?: Array<AnyConfig | Component>;\n min?: number;\n max?: number;\n addText?: string;\n reorderable?: boolean;\n /** Values for a new row, or a function that returns them. */\n newRow?: Row | (() => Row);\n /** Layout of a row. Default `hbox` (the fields share the row). */\n rowLayout?: LayoutSpec;\n}\n\n/** A repeating block of fields: add, remove and reorder rows; the value is an array of row objects. */\nexport class FieldList extends Field<Row[], FieldListConfig> {\n protected override baseCls = 'op-field op-fieldlist';\n private rowsEl!: HTMLElement;\n private addBtn!: HTMLButtonElement;\n private emptyEl!: HTMLElement;\n private rows: Container[] = [];\n private syncing = false;\n\n protected override emptyValue(): Row[] {\n return [];\n }\n protected override isEmpty(v: Row[]): boolean {\n return !v?.length;\n }\n\n protected createControl() {\n this.rowsEl = h('div', 'op-fieldlist__rows', { role: 'group' });\n this.emptyEl = h('div', 'op-fieldlist__empty', {}, t('flEmpty'));\n this.addBtn = h('button', 'op-fieldlist__add', { type: 'button' }, iconEl('plus'), h('span', '', {}, this.config.addText ?? t('flAdd')));\n this.listen(this.addBtn, 'click', () => this.addRow());\n this.inputEl = this.addBtn;\n return h('div', 'op-fieldlist__box', {}, this.rowsEl, this.emptyEl, this.addBtn);\n }\n\n protected override onRender() {\n super.onRender();\n this.rowsEl.setAttribute('aria-labelledby', (this.el.querySelector('.op-field__label') as HTMLElement).id ||= `${this.id}-label`);\n }\n\n // ---- rows ---------------------------------------------------------------------------------\n\n private label(i: number): string {\n return `${this.config.label ?? ''} ${i + 1}`.trim();\n }\n\n private makeRow(values: Row): Container {\n // every row gets fresh fields: a config is copied, an instance (`ui.text(...)`) is rebuilt from a copy of its config\n const fresh = (c: AnyConfig | Component): AnyConfig | Component => {\n const cfg = (c instanceof Component ? c.config : c) as AnyConfig;\n const copy = { ...cfg, ...(Array.isArray(cfg.items) ? { items: (cfg.items as Array<AnyConfig | Component>).map(fresh) } : {}) };\n return c instanceof Component ? new (c.constructor as new (cfg: object) => Component)(copy) : copy;\n };\n const row = new Container({ cls: 'op-fieldlist__row', layout: this.config.rowLayout ?? { type: 'hbox', align: 'flex-start' }, items: (this.config.items ?? []).map(fresh) });\n for (const c of row.items) if (c.config.width != null && c.config.flex == null) c.config.flex = 'none'; // a set width is kept\n for (const f of this.rowFields(row)) {\n f.fillFrom(values);\n f.on('change', () => this.syncing || this.commitRows());\n }\n return row;\n }\n\n private rowFields(row: Container): Field<any>[] {\n return row.query((c) => c instanceof Field) as Field<any>[];\n }\n\n private collect(): Row[] {\n return this.rows.map((row) => {\n const out: Row = {};\n for (const f of this.rowFields(row)) if (f.name) setPath(out, f.name, f.getValue());\n return out;\n });\n }\n\n private commitRows() {\n this.commit(this.collect());\n this.paintRows();\n if (this.getError()) this.validate();\n }\n\n /** Puts every row in place: its group name, tools, and which tools are allowed. */\n private paintRows() {\n if (!this.rendered) return;\n const { min = 0, max = Infinity, reorderable = true } = this.config;\n this.rowsEl.replaceChildren(\n ...this.rows.map((row, i) => {\n const el = row.el;\n el.setAttribute('role', 'group');\n el.setAttribute('aria-label', this.label(i));\n el.classList.toggle('is-first', i === 0);\n el.querySelector(':scope > .op-fieldlist__tools')?.remove();\n const tool = (icon: string, key: string, disabled: boolean, run: () => void) => {\n const b = h('button', 'op-fieldlist__tool', { type: 'button', 'data-act': key, 'aria-label': t(key, { row: this.label(i) }), 'data-op-tip': t(key, { row: this.label(i) }) }, iconEl(icon));\n b.disabled = disabled || !!this.config.disabled || !!this.config.readonly;\n b.addEventListener('click', run);\n return b;\n };\n const tools = h('div', 'op-fieldlist__tools');\n if (reorderable) tools.append(tool('chevron-up', 'flUp', i === 0, () => this.moveRow(i, i - 1)), tool('chevron-down', 'flDown', i === this.rows.length - 1, () => this.moveRow(i, i + 1)));\n tools.append(tool('trash', 'flRemove', this.rows.length <= min, () => this.removeRow(i)));\n el.append(tools);\n return el;\n }),\n );\n this.emptyEl.hidden = this.rows.length > 0;\n this.el.classList.toggle('is-empty', !this.rows.length);\n this.addBtn.disabled = this.rows.length >= max || !!this.config.disabled || !!this.config.readonly;\n }\n\n protected applyValue(value: Row[]): void {\n this.syncing = true;\n this.rows.forEach((r) => r.destroy());\n this.rows = (value ?? []).map((v) => this.makeRow(v));\n this.syncing = false;\n const was = this.isEqual(this.original, value);\n this.value = this.collect(); // what the rows actually hold (a missing key becomes the field's empty value)\n if (was) this.original = this.value; // normalizing the starting value does not make the form dirty\n this.paintRows();\n }\n\n /** Adds a row (at the end) and focuses its first field. */\n addRow(values?: Row): void {\n const max = this.config.max ?? Infinity;\n if (this.rows.length >= max) return;\n const n = this.config.newRow;\n this.rows.push(this.makeRow(values ?? (typeof n === 'function' ? n() : { ...n })));\n this.commitRows();\n this.emit('add', this.rows.length - 1);\n this.rowFields(this.rows[this.rows.length - 1])[0]?.focus();\n }\n\n removeRow(index: number): void {\n if (!this.rows[index] || this.rows.length <= (this.config.min ?? 0) || this.emit('before-remove', index) === false) return;\n const [row] = this.rows.splice(index, 1);\n row.destroy();\n this.commitRows();\n this.emit('remove', index);\n const next = this.rows[Math.min(index, this.rows.length - 1)];\n if (next) this.rowFields(next)[0]?.focus();\n else if (this.rendered) this.addBtn.focus();\n }\n\n moveRow(from: number, to: number): void {\n if (!this.rows[from] || to < 0 || to >= this.rows.length || from === to) return;\n const [row] = this.rows.splice(from, 1);\n this.rows.splice(to, 0, row);\n this.commitRows();\n this.emit('move', from, to);\n // the focus follows the row: the same tool if it can still move that way, the other one at the end of the list\n const tools = ['flUp', 'flDown'].map((k) => row.el.querySelector<HTMLButtonElement>(`[data-act=\"${k}\"]`));\n (to < from ? tools : tools.reverse()).find((b) => b && !b.disabled)?.focus();\n }\n\n getRows(): Container[] {\n return this.rows;\n }\n getRowFields(index: number): Field<any>[] {\n return this.rows[index] ? this.rowFields(this.rows[index]) : [];\n }\n\n /** The field of a row by path (`'0.name'` \u2192 field `name` of the first row): where a server error lands. */\n fieldAt(path: string): Field<any> | undefined {\n const [i, ...rest] = path.split('.');\n return this.getRowFields(Number(i)).find((f) => f.name === rest.join('.'));\n }\n\n setAddText(text: string): void {\n this.config.addText = text;\n if (this.rendered) this.addBtn.lastElementChild!.textContent = text;\n }\n\n setMin(min: number): void {\n this.config.min = min;\n this.paintRows();\n }\n setMax(max: number): void {\n this.config.max = max;\n this.paintRows();\n }\n\n // ---- validation ---------------------------------------------------------------------------\n\n protected override check(): string {\n const n = this.value?.length ?? 0;\n const { min = 0, max = Infinity } = this.config;\n if (n && n < min) return t('flMin', { n: min });\n if (n > max) return t('flMax', { n: max });\n return super.check();\n }\n\n /** Validates every row too; the list is valid when its own rules and every field inside pass. */\n override validate(): boolean {\n const inner = this.rows.flatMap((r) => this.rowFields(r)).map((f) => f.validate()).every(Boolean);\n return super.validate() && inner;\n }\n\n override isValid(): boolean {\n return super.isValid() && this.rows.every((r) => this.rowFields(r).every((f) => f.isValid()));\n }\n\n /** The first invalid field inside, or the add button. */\n override focus(): void {\n const bad = this.rows.flatMap((r) => this.rowFields(r)).find((f) => f.getError());\n if (bad) bad.focus();\n else this.addBtn?.focus();\n }\n\n protected override onDisabled(disabled: boolean) {\n this.rows.forEach((r) => r.setDisabled(disabled));\n this.paintRows();\n }\n protected override onReadonly(readonly: boolean) {\n this.rows.forEach((r) => this.rowFields(r).forEach((f) => f.setReadonly(readonly)));\n this.paintRows();\n }\n\n protected override onDestroy(): void {\n this.rows.forEach((r) => r.destroy());\n super.onDestroy();\n }\n}\nregister('fieldlist', FieldList);\n"],
|
|
5
|
+
"mappings": "uUAUAA,EAAY,KAAM,CAAE,MAAO,MAAO,SAAU,eAAgB,KAAM,gBAAiB,OAAQ,kBAAmB,QAAS,oBAAqB,MAAO,mBAAoB,MAAO,aAAc,CAAC,EAC7LA,EAAY,QAAS,CAAE,MAAO,YAAa,SAAU,gBAAiB,KAAM,cAAe,OAAQ,eAAgB,QAAS,wBAAyB,MAAO,0BAA2B,MAAO,kBAAgB,CAAC,EAkBxM,IAAMC,EAAN,cAAwBC,CAA8B,CACxC,QAAU,wBACrB,OACA,OACA,QACA,KAAoB,CAAC,EACrB,QAAU,GAEC,YAAoB,CACrC,MAAO,CAAC,CACV,CACmB,QAAQC,EAAmB,CAC5C,MAAO,CAACA,GAAG,MACb,CAEU,eAAgB,CACxB,YAAK,OAASC,EAAE,MAAO,qBAAsB,CAAE,KAAM,OAAQ,CAAC,EAC9D,KAAK,QAAUA,EAAE,MAAO,sBAAuB,CAAC,EAAGC,EAAE,SAAS,CAAC,EAC/D,KAAK,OAASD,EAAE,SAAU,oBAAqB,CAAE,KAAM,QAAS,EAAGE,EAAO,MAAM,EAAGF,EAAE,OAAQ,GAAI,CAAC,EAAG,KAAK,OAAO,SAAWC,EAAE,OAAO,CAAC,CAAC,EACvI,KAAK,OAAO,KAAK,OAAQ,QAAS,IAAM,KAAK,OAAO,CAAC,EACrD,KAAK,QAAU,KAAK,OACbD,EAAE,MAAO,oBAAqB,CAAC,EAAG,KAAK,OAAQ,KAAK,QAAS,KAAK,MAAM,CACjF,CAEmB,UAAW,CAC5B,MAAM,SAAS,EACf,KAAK,OAAO,aAAa,kBAAoB,KAAK,GAAG,cAAc,kBAAkB,EAAkB,KAAO,GAAG,KAAK,EAAE,QAAQ,CAClI,CAIQ,MAAMG,EAAmB,CAC/B,MAAO,GAAG,KAAK,OAAO,OAAS,EAAE,IAAIA,EAAI,CAAC,GAAG,KAAK,CACpD,CAEQ,QAAQC,EAAwB,CAEtC,IAAMC,EAASC,GAAoD,CACjE,IAAMC,EAAOD,aAAaE,EAAYF,EAAE,OAASA,EAC3CG,EAAO,CAAE,GAAGF,EAAK,GAAI,MAAM,QAAQA,EAAI,KAAK,EAAI,CAAE,MAAQA,EAAI,MAAuC,IAAIF,CAAK,CAAE,EAAI,CAAC,CAAG,EAC9H,OAAOC,aAAaE,EAAY,IAAKF,EAAE,YAA+CG,CAAI,EAAIA,CAChG,EACMC,EAAM,IAAIC,EAAU,CAAE,IAAK,oBAAqB,OAAQ,KAAK,OAAO,WAAa,CAAE,KAAM,OAAQ,MAAO,YAAa,EAAG,OAAQ,KAAK,OAAO,OAAS,CAAC,GAAG,IAAIN,CAAK,CAAE,CAAC,EAC3K,QAAWC,KAAKI,EAAI,MAAWJ,EAAE,OAAO,OAAS,MAAQA,EAAE,OAAO,MAAQ,OAAMA,EAAE,OAAO,KAAO,QAChG,QAAWM,KAAK,KAAK,UAAUF,CAAG,EAChCE,EAAE,SAASR,CAAM,EACjBQ,EAAE,GAAG,SAAU,IAAM,KAAK,SAAW,KAAK,WAAW,CAAC,EAExD,OAAOF,CACT,CAEQ,UAAUA,EAA8B,CAC9C,OAAOA,EAAI,MAAOJ,GAAMA,aAAaR,CAAK,CAC5C,CAEQ,SAAiB,CACvB,OAAO,KAAK,KAAK,IAAKY,GAAQ,CAC5B,IAAMG,EAAW,CAAC,EAClB,QAAWD,KAAK,KAAK,UAAUF,CAAG,EAAOE,EAAE,MAAME,EAAQD,EAAKD,EAAE,KAAMA,EAAE,SAAS,CAAC,EAClF,OAAOC,CACT,CAAC,CACH,CAEQ,YAAa,CACnB,KAAK,OAAO,KAAK,QAAQ,CAAC,EAC1B,KAAK,UAAU,EACX,KAAK,SAAS,GAAG,KAAK,SAAS,CACrC,CAGQ,WAAY,CAClB,GAAI,CAAC,KAAK,SAAU,OACpB,GAAM,CAAE,IAAAE,EAAM,EAAG,IAAAC,EAAM,IAAU,YAAAC,EAAc,EAAK,EAAI,KAAK,OAC7D,KAAK,OAAO,gBACV,GAAG,KAAK,KAAK,IAAI,CAACP,EAAK,IAAM,CAC3B,IAAMQ,EAAKR,EAAI,GACfQ,EAAG,aAAa,OAAQ,OAAO,EAC/BA,EAAG,aAAa,aAAc,KAAK,MAAM,CAAC,CAAC,EAC3CA,EAAG,UAAU,OAAO,WAAY,IAAM,CAAC,EACvCA,EAAG,cAAc,+BAA+B,GAAG,OAAO,EAC1D,IAAMC,EAAO,CAACC,EAAcC,EAAaC,EAAmBC,IAAoB,CAC9E,IAAMC,EAAIxB,EAAE,SAAU,qBAAsB,CAAE,KAAM,SAAU,WAAYqB,EAAK,aAAcpB,EAAEoB,EAAK,CAAE,IAAK,KAAK,MAAM,CAAC,CAAE,CAAC,EAAG,cAAepB,EAAEoB,EAAK,CAAE,IAAK,KAAK,MAAM,CAAC,CAAE,CAAC,CAAE,EAAGnB,EAAOkB,CAAI,CAAC,EAC1L,OAAAI,EAAE,SAAWF,GAAY,CAAC,CAAC,KAAK,OAAO,UAAY,CAAC,CAAC,KAAK,OAAO,SACjEE,EAAE,iBAAiB,QAASD,CAAG,EACxBC,CACT,EACMC,EAAQzB,EAAE,MAAO,qBAAqB,EAC5C,OAAIiB,GAAaQ,EAAM,OAAON,EAAK,aAAc,OAAQ,IAAM,EAAG,IAAM,KAAK,QAAQ,EAAG,EAAI,CAAC,CAAC,EAAGA,EAAK,eAAgB,SAAU,IAAM,KAAK,KAAK,OAAS,EAAG,IAAM,KAAK,QAAQ,EAAG,EAAI,CAAC,CAAC,CAAC,EACzLM,EAAM,OAAON,EAAK,QAAS,WAAY,KAAK,KAAK,QAAUJ,EAAK,IAAM,KAAK,UAAU,CAAC,CAAC,CAAC,EACxFG,EAAG,OAAOO,CAAK,EACRP,CACT,CAAC,CACH,EACA,KAAK,QAAQ,OAAS,KAAK,KAAK,OAAS,EACzC,KAAK,GAAG,UAAU,OAAO,WAAY,CAAC,KAAK,KAAK,MAAM,EACtD,KAAK,OAAO,SAAW,KAAK,KAAK,QAAUF,GAAO,CAAC,CAAC,KAAK,OAAO,UAAY,CAAC,CAAC,KAAK,OAAO,QAC5F,CAEU,WAAWU,EAAoB,CACvC,KAAK,QAAU,GACf,KAAK,KAAK,QAASC,GAAMA,EAAE,QAAQ,CAAC,EACpC,KAAK,MAAQD,GAAS,CAAC,GAAG,IAAK3B,GAAM,KAAK,QAAQA,CAAC,CAAC,EACpD,KAAK,QAAU,GACf,IAAM6B,EAAM,KAAK,QAAQ,KAAK,SAAUF,CAAK,EAC7C,KAAK,MAAQ,KAAK,QAAQ,EACtBE,IAAK,KAAK,SAAW,KAAK,OAC9B,KAAK,UAAU,CACjB,CAGA,OAAOxB,EAAoB,CACzB,IAAMY,EAAM,KAAK,OAAO,KAAO,IAC/B,GAAI,KAAK,KAAK,QAAUA,EAAK,OAC7B,IAAMa,EAAI,KAAK,OAAO,OACtB,KAAK,KAAK,KAAK,KAAK,QAAQzB,IAAW,OAAOyB,GAAM,WAAaA,EAAE,EAAI,CAAE,GAAGA,CAAE,EAAE,CAAC,EACjF,KAAK,WAAW,EAChB,KAAK,KAAK,MAAO,KAAK,KAAK,OAAS,CAAC,EACrC,KAAK,UAAU,KAAK,KAAK,KAAK,KAAK,OAAS,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAC5D,CAEA,UAAUC,EAAqB,CAC7B,GAAI,CAAC,KAAK,KAAKA,CAAK,GAAK,KAAK,KAAK,SAAW,KAAK,OAAO,KAAO,IAAM,KAAK,KAAK,gBAAiBA,CAAK,IAAM,GAAO,OACpH,GAAM,CAACpB,CAAG,EAAI,KAAK,KAAK,OAAOoB,EAAO,CAAC,EACvCpB,EAAI,QAAQ,EACZ,KAAK,WAAW,EAChB,KAAK,KAAK,SAAUoB,CAAK,EACzB,IAAMC,EAAO,KAAK,KAAK,KAAK,IAAID,EAAO,KAAK,KAAK,OAAS,CAAC,CAAC,EACxDC,EAAM,KAAK,UAAUA,CAAI,EAAE,CAAC,GAAG,MAAM,EAChC,KAAK,UAAU,KAAK,OAAO,MAAM,CAC5C,CAEA,QAAQC,EAAcC,EAAkB,CACtC,GAAI,CAAC,KAAK,KAAKD,CAAI,GAAKC,EAAK,GAAKA,GAAM,KAAK,KAAK,QAAUD,IAASC,EAAI,OACzE,GAAM,CAACvB,CAAG,EAAI,KAAK,KAAK,OAAOsB,EAAM,CAAC,EACtC,KAAK,KAAK,OAAOC,EAAI,EAAGvB,CAAG,EAC3B,KAAK,WAAW,EAChB,KAAK,KAAK,OAAQsB,EAAMC,CAAE,EAE1B,IAAMR,EAAQ,CAAC,OAAQ,QAAQ,EAAE,IAAKS,GAAMxB,EAAI,GAAG,cAAiC,cAAcwB,CAAC,IAAI,CAAC,GACvGD,EAAKD,EAAOP,EAAQA,EAAM,QAAQ,GAAG,KAAMD,GAAMA,GAAK,CAACA,EAAE,QAAQ,GAAG,MAAM,CAC7E,CAEA,SAAuB,CACrB,OAAO,KAAK,IACd,CACA,aAAaM,EAA6B,CACxC,OAAO,KAAK,KAAKA,CAAK,EAAI,KAAK,UAAU,KAAK,KAAKA,CAAK,CAAC,EAAI,CAAC,CAChE,CAGA,QAAQK,EAAsC,CAC5C,GAAM,CAAChC,EAAG,GAAGiC,CAAI,EAAID,EAAK,MAAM,GAAG,EACnC,OAAO,KAAK,aAAa,OAAOhC,CAAC,CAAC,EAAE,KAAMS,GAAMA,EAAE,OAASwB,EAAK,KAAK,GAAG,CAAC,CAC3E,CAEA,WAAWC,EAAoB,CAC7B,KAAK,OAAO,QAAUA,EAClB,KAAK,WAAU,KAAK,OAAO,iBAAkB,YAAcA,EACjE,CAEA,OAAOtB,EAAmB,CACxB,KAAK,OAAO,IAAMA,EAClB,KAAK,UAAU,CACjB,CACA,OAAOC,EAAmB,CACxB,KAAK,OAAO,IAAMA,EAClB,KAAK,UAAU,CACjB,CAImB,OAAgB,CACjC,IAAMa,EAAI,KAAK,OAAO,QAAU,EAC1B,CAAE,IAAAd,EAAM,EAAG,IAAAC,EAAM,GAAS,EAAI,KAAK,OACzC,OAAIa,GAAKA,EAAId,EAAYd,EAAE,QAAS,CAAE,EAAGc,CAAI,CAAC,EAC1Cc,EAAIb,EAAYf,EAAE,QAAS,CAAE,EAAGe,CAAI,CAAC,EAClC,MAAM,MAAM,CACrB,CAGS,UAAoB,CAC3B,IAAMsB,EAAQ,KAAK,KAAK,QAASX,GAAM,KAAK,UAAUA,CAAC,CAAC,EAAE,IAAKf,GAAMA,EAAE,SAAS,CAAC,EAAE,MAAM,OAAO,EAChG,OAAO,MAAM,SAAS,GAAK0B,CAC7B,CAES,SAAmB,CAC1B,OAAO,MAAM,QAAQ,GAAK,KAAK,KAAK,MAAOX,GAAM,KAAK,UAAUA,CAAC,EAAE,MAAOf,GAAMA,EAAE,QAAQ,CAAC,CAAC,CAC9F,CAGS,OAAc,CACrB,IAAM2B,EAAM,KAAK,KAAK,QAASZ,GAAM,KAAK,UAAUA,CAAC,CAAC,EAAE,KAAMf,GAAMA,EAAE,SAAS,CAAC,EAC5E2B,EAAKA,EAAI,MAAM,EACd,KAAK,QAAQ,MAAM,CAC1B,CAEmB,WAAWjB,EAAmB,CAC/C,KAAK,KAAK,QAASK,GAAMA,EAAE,YAAYL,CAAQ,CAAC,EAChD,KAAK,UAAU,CACjB,CACmB,WAAWkB,EAAmB,CAC/C,KAAK,KAAK,QAASb,GAAM,KAAK,UAAUA,CAAC,EAAE,QAASf,GAAMA,EAAE,YAAY4B,CAAQ,CAAC,CAAC,EAClF,KAAK,UAAU,CACjB,CAEmB,WAAkB,CACnC,KAAK,KAAK,QAASb,GAAMA,EAAE,QAAQ,CAAC,EACpC,MAAM,UAAU,CAClB,CACF,EACAc,EAAS,YAAa5C,CAAS",
|
|
6
|
+
"names": ["addMessages", "FieldList", "Field", "v", "h", "t", "iconEl", "i", "values", "fresh", "c", "cfg", "Component", "copy", "row", "Container", "f", "out", "setPath", "min", "max", "reorderable", "el", "tool", "icon", "key", "disabled", "run", "b", "tools", "value", "r", "was", "n", "index", "next", "from", "to", "k", "path", "rest", "text", "inner", "bad", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as o}from"./chunk-L6DOWGBO.js";import{a as t}from"./chunk-TIPK3SCJ.js";var e=class extends o{baseCls="op-field op-textfield op-picker op-select";editable(){return!1}emptyValue(){return null}isEmpty(r){return r==null||r===""}};t("select",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-ADHKL2GM.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as n}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as n}from"./chunk-L6DOWGBO.js";import{a as o}from"./chunk-TIPK3SCJ.js";var s=class extends n{baseCls="op-field op-textfield op-picker op-combobox";term="";emptyValue(){return null}isEmpty(t){return t==null||t===""}visibleItems(){let t=this.typed?this.term.trim().toLowerCase():"";if(!t)return this.items;let i=this.config.filter??"contains",p=typeof i=="function"?i:i==="startsWith"?(e,r)=>e.label.toLowerCase().startsWith(r):(e,r)=>e.label.toLowerCase().includes(r);return this.items.filter(e=>p(e,t))}onType(t){this.term=t,this.refreshList(),this.list.setHighlight(t),this.open()}pick(t){this.term="",super.pick(t),this.list.setHighlight("")}settle(){super.settle(),this.term="",this.list.setHighlight("")}};o("combobox",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-AJN66F32.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
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,2 +1,2 @@
|
|
|
1
|
-
import{c as g}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as g}from"./chunk-DIOJGTUN.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{f as b}from"./chunk-UDXO3KM3.js";import{b as h,f as m}from"./chunk-PZSHOSOS.js";import{e as c,f as o}from"./chunk-S4QD5NID.js";c("en",{pageFirst:"First page",pagePrev:"Previous page",pageNext:"Next page",pageLast:"Last page",pageLabel:"Pagination",pageGoto:"Page {n}",pageInfo:"{from}\u2013{to} of {total}"});c("pt-BR",{pageFirst:"Primeira p\xE1gina",pagePrev:"P\xE1gina anterior",pageNext:"Pr\xF3xima p\xE1gina",pageLast:"\xDAltima p\xE1gina",pageLabel:"Pagina\xE7\xE3o",pageGoto:"P\xE1gina {n}",pageInfo:"{from}\u2013{to} de {total}"});var f=class extends b{baseCls="op-pagination";tag="nav";unsub;onRender(){this.el.setAttribute("aria-label",o("pageLabel")),this.listen(this.el,"click",t=>{let a=t.target.closest("button[data-page]");a&&!a.disabled&&this.setPage(Number(a.dataset.page))}),this.bindStore(this.config.store),this.own(()=>this.unsub?.()),this.paint()}bindStore(t){this.unsub?.(),this.unsub=t?.subscribe(()=>this.paint())}getPage(){return this.config.store?.page??this.config.page??1}size(){return this.config.store?.pageSize||this.config.pageSize||20}total(){return this.config.store?.totalCount??this.config.total??0}pages(){return Math.max(1,Math.ceil(this.total()/this.size()))}setPage(t){t=m(t,1,this.pages()),!(t===this.getPage()||this.emit("before-page-change",t)===!1)&&(this.config.store?this.config.store.setPage(t):(this.config.page=t,this.paint()),this.emit("page-change",t))}setTotal(t){this.config.total=t,this.paint()}setPageSize(t){this.config.pageSize=t,this.paint()}setStore(t){this.config.store=t,this.bindStore(t),this.paint()}window(){let t=this.pages(),a=this.getPage(),n=this.config.siblings??1;if(t<=n*2+5)return Array.from({length:t},(i,s)=>s+1);let p=new Set([1,t,...Array.from({length:n*2+1},(i,s)=>a-n+s)].filter(i=>i>=1&&i<=t)),r=[],e=0;for(let i of[...p].sort((s,l)=>s-l))i-e>1&&r.push(i-e===2?i-1:null),r.push(i),e=i;return r}paint(){if(!this.rendered)return;let t=this.getPage(),a=this.pages(),n=(e,i,s,l=!1,u=!1)=>h("button",`op-button op-button--ghost op-pagination__btn${u?" is-current":""}`,{type:"button","data-page":e,"aria-label":s,"aria-current":u?"page":null,disabled:l},i),p=[n(1,g("chevrons-left"),o("pageFirst"),t===1),n(t-1,g("chevron-left"),o("pagePrev"),t===1),...this.window().map(e=>e==null?h("span","op-pagination__gap",{"aria-hidden":"true"},"\u2026"):n(e,String(e),o("pageGoto",{n:e}),!1,e===t)),n(t+1,g("chevron-right"),o("pageNext"),t===a),n(a,g("chevrons-right"),o("pageLast"),t===a)];if(this.config.showInfo!==!1){let e=this.total(),i=this.size();p.push(h("span","op-pagination__info",{},e?o("pageInfo",{from:(t-1)*i+1,to:Math.min(t*i,e),total:e}):""))}let r=this.el.contains(document.activeElement)?document.activeElement.dataset.page:void 0;this.el.replaceChildren(...p),r&&this.el.querySelector(`[data-page="${r}"]:not(:disabled)`)?.focus()}};d("pagination",f);export{f as a};
|
|
2
|
+
//# sourceMappingURL=chunk-BCVOUMJJ.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as r}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as r}from"./chunk-BQEFLPDA.js";import{a as o}from"./chunk-TIPK3SCJ.js";import{b as t,c as i}from"./chunk-PZSHOSOS.js";var s=class extends r{baseCls="op-formsection";tag="section";titleEl;descEl;bodyEl;getBody(){return this.bodyEl}build(){let e=super.build();return this.titleEl=t("h3","op-formsection__title",{id:i("op-fsec")}),this.descEl=t("p","op-formsection__desc",{id:i("op-fsec-desc")}),this.bodyEl=t("div","op-formsection__body"),e.append(t("div","op-formsection__aside",{},this.titleEl,this.descEl),this.bodyEl),e.setAttribute("aria-labelledby",this.titleEl.id),e}onRender(){let e=this.config;e.layout??=e.columns?{type:"grid",columns:e.columns}:{type:"vbox"},super.onRender(),this.el.classList.toggle("op-formsection--divided",e.divider!==!1),this.setTitle(e.title??""),this.setDescription(e.description??""),this.setAside(e.aside!==!1)}setTitle(e){this.config.title=e,this.rendered&&(this.titleEl.textContent=e,this.titleEl.hidden=!e)}setDescription(e){this.config.description=e,this.rendered&&(this.descEl.textContent=e,this.descEl.hidden=!e,e?this.el.setAttribute("aria-describedby",this.descEl.id):this.el.removeAttribute("aria-describedby"))}setAside(e){this.config.aside=e,this.rendered&&this.el.classList.toggle("op-formsection--stacked",!e)}};o("formsection",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-BIGL3ZVD.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as m}from"./chunk-TIPK3SCJ.js";import{f as y}from"./chunk-UDXO3KM3.js";import{e as u}from"./chunk-PZSHOSOS.js";var g=new Map;function p(i,t){g.set(i,t)}function h(i){if(typeof i=="object"&&"init"in i)return i;let t=typeof i=="string"?{type:i}:i,o=g.get(t.type);if(!o)throw new Error(`Optikos: unknown layout "${t.type}"`);return o(t)}function c(i,t,o){let e=i.getBody(),n=!1,r=d=>{d!==n&&(n=d,e.classList.toggle("is-narrow",d),o?.(d),i.emit("narrow-change",d))};if(typeof ResizeObserver<"u"){let d=new ResizeObserver(()=>e.clientWidth>0&&r(e.clientWidth<t));d.observe(e),i.own(()=>d.disconnect())}return{isNarrow:()=>n,setNarrow:r}}var f=(i,t=[])=>o=>({init(e){let n=e.getBody();n.classList.add("op-layout",`op-layout-${i}`);for(let r of t)o[r]!=null&&n.style.setProperty(`--op-layout-${r}`,u(o[r]))}});p("fit",f("fit"));var w=f("hbox",["gap","align","justify","wrap"]);p("hbox",i=>{let t=w(i),o;return{...t,init(e){t.init(e),i.stackBelow&&(e.getBody().classList.add("op-layout-stack"),o=c(e,Number(i.stackBelow)))},isNarrow:()=>!!o?.isNarrow(),setNarrow:e=>o?.setNarrow(e)}});p("vbox",f("vbox",["gap","align","justify","wrap"]));p("grid",i=>{let t;return{init(o){let e=o.getBody();e.classList.add("op-layout","op-layout-grid"),i.gap!=null&&e.style.setProperty("--op-layout-gap",u(i.gap));let n=i.columns??1;if(typeof n=="number"){e.style.setProperty("--op-layout-columns",String(n));let r=i.narrowBelow==null?480:Number(i.narrowBelow);r>0&&n>1&&(t=c(o,r))}else e.style.gridTemplateColumns=n},add(o,e){let n=e.config.colspan;n&&(e.el.style.gridColumn=n==="full"?"1 / -1":`span ${n}`)},isNarrow:()=>!!t?.isNarrow(),setNarrow:o=>t?.setNarrow(o)}});p("border",i=>{let t,o,e=()=>Array.from(o.getBody().children).filter(s=>s instanceof HTMLElement&&(s.dataset.region==="west"||s.dataset.region==="east")),n=s=>e().find(a=>a.dataset.region===s),r=()=>o.getBody().classList.toggle("has-open-region",e().some(s=>s.classList.contains("is-open"))),d=s=>{for(let a of e())(!s||a.dataset.region===s)&&a.classList.remove("is-open");r()};return{init(s){o=s;let a=s.getBody();a.classList.add("op-layout","op-layout-border"),i.gap!=null&&a.style.setProperty("--op-layout-gap",u(i.gap)),t=c(s,i.narrowBelow==null?768:Number(i.narrowBelow),l=>{l?i.open&&(n(String(i.open))?.classList.add("is-open"),r()):d()}),s.listen(a,"click",l=>l.target===a&&d()),s.listen(a,"keydown",l=>{l.key==="Escape"&&a.classList.contains("has-open-region")&&a.classList.contains("is-narrow")&&(l.stopPropagation(),d())})},add(s,a){let l=a.config.region??"center";a.el.style.gridArea=l,a.el.dataset.region=l},openRegion(s){let a=n(s);!a||!t?.isNarrow()||(d(),a.classList.add("is-open"),r(),(a.querySelector("input,button,[tabindex]")??a).focus?.())},closeRegion:d,toggleRegion(s){n(s)?.classList.contains("is-open")?d(s):this.openRegion(s)},isRegionOpen:s=>!!n(s)?.classList.contains("is-open"),isNarrow:()=>!!t?.isNarrow(),setNarrow:s=>t?.setNarrow(s)}});p("card",i=>{let t,o=(e,n)=>{t=n;for(let r of e.items)r.rendered?r.el.hidden=r!==n:r.config.hidden=r!==n;e.emit("activate",n)};return{init(e){e.getBody().classList.add("op-layout","op-layout-fit");let n=i.activeItem??e.config.activeItem??0;o(e,typeof n=="number"?e.items[n]:e.items.find(r=>r.id===n))},add(e,n){n.el.hidden=n!==t&&!!t,t||o(e,n)},remove(e,n,r){n===t&&o(e,e.items[Math.min(r,e.items.length-1)])},activate:o,getActive:()=>t}});var C=class i extends y{baseCls="op-container";defaultLayout;items=[];layout;constructor(t={}){super(t),this.items=(t.items??[]).map(o=>this.make(o))}getBody(){return this.el}shorthand(t){throw new Error(`Optikos: no shorthand for item "${t}" in ${this.baseCls}`)}make(t){typeof t=="string"&&(t=this.shorthand(t));let o=t instanceof y?t:m({type:this.config.defaultType,...this.config.defaults,...t});return o.parent=this,o}onRender(){let t=this.config.layout??this.defaultLayout;t&&(this.layout=h(t)).init(this),this.items.forEach((o,e)=>this.attach(o,e))}attach(t,o){let e=this.getBody(),n=this.items.slice(o+1).find(r=>r.rendered&&r.el.parentNode===e);e.insertBefore(t.el,n?.el??null),this.layout?.add?.(this,t,o),this.mounted&&t.notifyMount()}add(t){return this.insert(this.items.length,t)}insert(t,o){let e=this.make(o);return this.items.splice(t,0,e),this.rendered&&this.attach(e,t),this.emit("add",e),e}remove(t,o=!0){let e=typeof t=="number"?t:this.items.findIndex(r=>r===t||r.id===t),n=this.items[e];if(n)return this.items.splice(e,1),n.parent=void 0,this.layout?.remove?.(this,n,e),o?n.destroy():n.rendered&&n.el.remove(),this.emit("remove",n),n}removeAll(t=!0){for(let o of[...this.items])this.remove(o,t)}getItems(){return this.items}get(t){return this.items.find(o=>o.id===t)}query(t){let o=[];for(let e of this.items)t(e)&&o.push(e),e instanceof i&&o.push(...e.query(t));return o}getActiveItem(){return this.layout?.getActive?.(this)}setActiveItem(t){let o=typeof t=="number"?this.items[t]:this.items.find(e=>e===t||e.id===t);o&&this.layout?.activate?.(this,o)}notifyMount(){super.notifyMount();for(let t of this.items)t.notifyMount()}onDestroy(){for(let t of[...this.items])t.destroy()}setDisabled(t){super.setDisabled(t);for(let o of this.items)o.setDisabled(t)}};export{p as a,h as b,C as c};
|
|
2
|
+
//# sourceMappingURL=chunk-BQEFLPDA.js.map
|