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
package/dist/chunk-4SYIIX5A.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as f,c as g}from"./chunk-676AKAGF.js";import{b as y}from"./chunk-VV7CFMPZ.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{a as u}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as v}from"./chunk-TIPK3SCJ.js";import{e as d,f as h}from"./chunk-MW3RWBZ7.js";d("en",{cpPlaceholder:"Type a command or search\u2026",cpLabel:"Command palette",cpFilters:"Categories",cpAll:"All",cpEmpty:"No matching commands",cpHint:"\u2191\u2193 navigate \xB7 Enter run \xB7 Esc close"});d("pt-BR",{cpPlaceholder:"Digite um comando ou pesquise\u2026",cpLabel:"Paleta de comandos",cpFilters:"Categorias",cpAll:"Todas",cpEmpty:"Nenhum comando encontrado",cpHint:"\u2191\u2193 navegar \xB7 Enter executar \xB7 Esc fechar"});var b=()=>/mac|iphone|ipad/i.test(navigator.platform||navigator.userAgent);function E(a,t){let e=t.toLowerCase().split("+"),i=e.pop(),n=r=>e.includes(r),s=b();return a.key.toLowerCase()===i&&a.ctrlKey===(n("ctrl")||n("mod")&&!s)&&a.metaKey===(n("meta")||n("mod")&&s)&&a.shiftKey===n("shift")&&a.altKey===n("alt")}var C=(a,t)=>{let e=0;for(let i of a)if(i===t[e]&&++e===t.length)return!0;return!t.length};function _(a,t){let e=a.title.toLowerCase(),i=[a.category,a.description,...a.keywords??[]].join(" ").toLowerCase(),n=0;for(let s of t.toLowerCase().split(/\s+/).filter(Boolean)){let r=e.indexOf(s),l=r===0?100:r>0?/[\s\-_/]/.test(e[r-1])?80:60:s.length>2&&C(e,s)?30:i.includes(s)?20:0;if(!l)return 0;n+=l}return n}function w(a,t){let e=t.toLowerCase().split(/\s+/).filter(Boolean),i=a.toLowerCase(),n=[];for(let l of e){let c=i.indexOf(l);c>=0&&n.push([c,c+l.length])}n.sort((l,c)=>l[0]-c[0]);let s=[],r=0;for(let[l,c]of n)l<r||(s.push(a.slice(r,l),o("mark","op-palette__mark",{},a.slice(l,c))),r=c);return s.push(a.slice(r)),s.filter(l=>l!=="")}var m=class extends u{baseCls="op-palette-backdrop";commands;levels=[];query="";cat=null;shown=[];active=0;opened=!1;opener=null;release=[];panel;input;filtersEl;listEl;live;crumb;constructor(t={}){super(t),this.commands=[...t.commands??[]];let e=t.hotkey===void 0?"mod+k":t.hotkey;e&&this.listen(document,"keydown",i=>{!E(i,e)||this.destroyed||(i.preventDefault(),this.toggle())},!0)}build(){let t=this.config;this.input=o("input","op-palette__input",{type:"text",role:"combobox","aria-expanded":"true","aria-autocomplete":"list",autocomplete:"off",spellcheck:"false",placeholder:t.placeholder??h("cpPlaceholder")}),this.crumb=o("span","op-palette__crumb"),this.crumb.hidden=!0,this.filtersEl=o("div","op-palette__filters",{role:"group","aria-label":h("cpFilters")}),this.listEl=o("div","op-palette__list",{role:"listbox",id:`${this.id}-list`}),this.input.setAttribute("aria-controls",this.listEl.id),this.live=o("div","op-sr-only",{"aria-live":"polite"}),this.panel=o("div","op-palette",{role:"dialog","aria-modal":"true","aria-label":h("cpLabel")},o("div","op-palette__search",{},p("search"),this.crumb,this.input),this.filtersEl,this.listEl,this.live,o("div","op-palette__hint",{},h("cpHint")));let e=o("div","op-palette-backdrop",{},this.panel);return this.listen(this.input,"input",()=>{this.query=this.input.value,this.active=0,this.paint()}),this.listen(this.panel,"keydown",i=>this.onKey(i)),this.listen(e,"pointerdown",i=>i.target===e&&this.close()),this.listen(this.listEl,"pointermove",i=>{let n=this.indexOf(i);n>=0&&n!==this.active&&this.setActive(n)}),this.listen(this.listEl,"click",i=>{let n=this.indexOf(i);n>=0&&this.choose(this.shown[n])}),this.listen(this.filtersEl,"click",i=>{let n=i.target.closest("[data-cat]");n&&(this.cat=n.dataset.cat||null,this.active=0,this.paint(),this.input.focus())}),e}getCommands(){return this.commands}setCommands(t){this.commands=[...t],this.levels[0]&&(this.levels[0].commands=this.commands),this.opened&&this.paint()}register(t){let e=Array.isArray(t)?t:[t];return this.commands.push(...e),this.opened&&this.paint(),()=>this.setCommands(this.commands.filter(i=>!e.includes(i)))}run(t){let e=this.commands.find(i=>i.id===t);return e?this.exec(e):Promise.resolve()}isOpen(){return this.opened}toggle(){this.opened?this.close():this.open()}open(){if(this.opened||this.destroyed||this.emit("before-open")===!1)return;this.opener=document.activeElement;let t=this.el;this.levels=[{title:"",commands:this.commands}],this.query=this.input.value="",this.cat=null,this.active=0,f(t,this.opener),this.release.push(g(t),y(this.panel)),this.opened=!0,t.classList.add("is-open"),this.notifyMount(),this.paint(),this.input.focus(),this.emit("open")}close(){this.opened&&(this.opened=!1,this.release.splice(0).reverse().forEach(t=>t()),this.el.classList.remove("is-open"),this.el.remove(),this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus(),this.emit("close"))}onDestroy(){this.opened=!1,this.release.splice(0).forEach(t=>t()),this.panel&&this.el.remove()}level(){return this.levels[this.levels.length-1]}results(){let t=this.level().commands.filter(s=>!s.hidden?.()&&(!this.cat||s.category===this.cat)),e=this.query.trim();if(e)return t.map(s=>({c:s,s:_(s,e)})).filter(s=>s.s>0).sort((s,r)=>r.s-s.s).map(s=>s.c).slice(0,this.config.maxResults??50);let i=this.config.categories??[],n=s=>s.category===void 0?1e6:i.includes(s.category)?i.indexOf(s.category):i.length;return t.map((s,r)=>({c:s,i:r})).sort((s,r)=>n(s.c)-n(r.c)||s.i-r.i).map(s=>s.c).slice(0,this.config.maxResults??50)}paint(){let t=this.level();this.crumb.hidden=this.levels.length<2,this.crumb.textContent=t.title,this.paintFilters(),this.shown=this.results(),this.active=Math.min(this.active,Math.max(0,this.shown.length-1));let e=!!this.query.trim(),i=[],n;this.shown.forEach((s,r)=>{!e&&s.category!==n&&(n=s.category,n&&i.push(o("div","op-palette__group",{role:"presentation"},n)));let l=o("div",`op-palette__item${s.disabled?" is-disabled":""}`,{role:"option",id:`${this.id}-o${r}`,"aria-disabled":s.disabled?"true":null,"data-i":r},s.icon?o("span","op-palette__icon",{},p(s.icon)):o("span","op-palette__icon"),o("span","op-palette__text",{},o("span","op-palette__title",{},...w(s.title,this.query)),s.description?o("span","op-palette__desc",{},s.description):""),e&&s.category?o("span","op-palette__cat",{},s.category):"",s.children?o("span","op-palette__more",{"aria-hidden":"true"},p("chevron-right")):"",s.shortcut?o("kbd","op-palette__kbd",{},s.shortcut):"");i.push(l)}),this.shown.length||i.push(o("div","op-palette__empty",{},this.config.emptyText??h("cpEmpty"))),this.listEl.replaceChildren(...i),this.live.textContent=this.shown.length?h("results",{n:this.shown.length}):h("noResults"),this.setActive(this.active,!1)}paintFilters(){let t=[...new Set(this.level().commands.filter(i=>!i.hidden?.()&&i.category).map(i=>i.category))];this.filtersEl.hidden=this.config.filters===!1||t.length<2,this.cat&&!t.includes(this.cat)&&(this.cat=null);let e=(i,n)=>o("button",`op-palette__chip${(this.cat??"")===n?" is-on":""}`,{type:"button","data-cat":n,"aria-pressed":String((this.cat??"")===n)},i);this.filtersEl.replaceChildren(e(h("cpAll"),""),...t.map(i=>e(i,i)))}indexOf(t){let e=t.target.closest(".op-palette__item");return e?Number(e.dataset.i):-1}setActive(t,e=!0){this.active=t;for(let i of Array.from(this.listEl.querySelectorAll(".op-palette__item"))){let n=Number(i.dataset.i)===t;i.classList.toggle("is-active",n),i.setAttribute("aria-selected",String(n)),n&&(this.input.setAttribute("aria-activedescendant",i.id),e&&i.scrollIntoView?.({block:"nearest"}))}this.shown.length||this.input.removeAttribute("aria-activedescendant")}onKey(t){let e=this.shown.length;switch(t.key){case"ArrowDown":case"ArrowUp":t.preventDefault(),e&&this.setActive((this.active+(t.key==="ArrowDown"?1:e-1))%e);break;case"Home":case"End":t.target===this.input&&!this.input.value&&(t.preventDefault(),e&&this.setActive(t.key==="Home"?0:e-1));break;case"Enter":if(t.target.closest(".op-palette__chip"))return;t.preventDefault(),this.shown[this.active]&&this.choose(this.shown[this.active]);break;case"Escape":t.preventDefault(),t.stopPropagation(),this.levels.length>1?this.back():this.close();break;case"Backspace":!this.input.value&&this.levels.length>1&&(t.preventDefault(),this.back());break}}back(){this.levels.pop(),this.query=this.input.value="",this.cat=null,this.active=0,this.paint(),this.input.focus()}async choose(t){if(!(!t||t.disabled)){if(t.children){try{let e=typeof t.children=="function"?await t.children():t.children;this.levels.push({title:t.title,commands:e}),this.query=this.input.value="",this.cat=null,this.active=0,this.paint(),this.input.focus()}catch(e){this.emit("error",e)}return}this.close(),await this.exec(t)}}async exec(t){try{this.emit("run",t),await t.handler?.({palette:this,command:t})}catch(e){this.emit("error",e)}}};v("commandpalette",m);export{m as a};
|
|
2
|
-
//# sourceMappingURL=chunk-4SYIIX5A.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/overlays/commandpalette/commandpalette.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus } from '../../../core/focus';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n cpPlaceholder: 'Type a command or search\u2026',\n cpLabel: 'Command palette',\n cpFilters: 'Categories',\n cpAll: 'All',\n cpEmpty: 'No matching commands',\n cpHint: '\u2191\u2193 navigate \u00B7 Enter run \u00B7 Esc close',\n});\naddMessages('pt-BR', {\n cpPlaceholder: 'Digite um comando ou pesquise\u2026',\n cpLabel: 'Paleta de comandos',\n cpFilters: 'Categorias',\n cpAll: 'Todas',\n cpEmpty: 'Nenhum comando encontrado',\n cpHint: '\u2191\u2193 navegar \u00B7 Enter executar \u00B7 Esc fechar',\n});\n\nexport interface Command {\n id: string;\n title: string;\n /** Groups the command and gives it a filter chip. */\n category?: string;\n icon?: string;\n description?: string;\n /** Extra words that find the command. */\n keywords?: string[];\n /** Only displayed (the app binds the key itself). */\n shortcut?: string;\n disabled?: boolean;\n hidden?: () => boolean;\n /** Runs after the palette closed. Errors become the palette's `error` event. */\n handler?: (ctx: { palette: CommandPalette; command: Command }) => unknown;\n /** A second level: choosing this command shows these (Backspace on an empty field goes back). */\n children?: Command[] | (() => Command[] | Promise<Command[]>);\n}\n\nexport interface CommandPaletteConfig extends ComponentConfig {\n commands?: Command[];\n /** `mod` is Ctrl on Windows/Linux and \u2318 on macOS. `false` turns the global key off. Default `'mod+k'`. */\n hotkey?: string | false;\n placeholder?: string;\n emptyText?: string;\n maxResults?: number;\n /** Order of the category groups; the others follow. */\n categories?: string[];\n /** Category chips under the field. Default true. */\n filters?: boolean;\n}\n\ntype Level = { title: string; commands: Command[] };\n\nconst isMac = () => /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\n\nfunction matchesKey(e: KeyboardEvent, spec: string): boolean {\n const parts = spec.toLowerCase().split('+');\n const key = parts.pop()!;\n const has = (m: string) => parts.includes(m);\n const mac = isMac();\n return (\n e.key.toLowerCase() === key &&\n e.ctrlKey === (has('ctrl') || (has('mod') && !mac)) &&\n e.metaKey === (has('meta') || (has('mod') && mac)) &&\n e.shiftKey === has('shift') &&\n e.altKey === has('alt')\n );\n}\n\nconst subsequence = (text: string, q: string) => {\n let i = 0;\n for (const ch of text) if (ch === q[i] && ++i === q.length) return true;\n return !q.length;\n};\n\n/** How well a command answers the query (0 = not at all). Every word of the query must match somewhere. */\nfunction score(c: Command, query: string): number {\n const title = c.title.toLowerCase();\n const rest = [c.category, c.description, ...(c.keywords ?? [])].join(' ').toLowerCase();\n let total = 0;\n for (const w of query.toLowerCase().split(/\\s+/).filter(Boolean)) {\n const at = title.indexOf(w);\n const s = at === 0 ? 100 : at > 0 ? (/[\\s\\-_/]/.test(title[at - 1]) ? 80 : 60) : w.length > 2 && subsequence(title, w) ? 30 : rest.includes(w) ? 20 : 0;\n if (!s) return 0;\n total += s;\n }\n return total;\n}\n\n/** Title with the matched words marked. */\nfunction marked(title: string, query: string): Array<string | Node> {\n const words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const lower = title.toLowerCase();\n const spans: Array<[number, number]> = [];\n for (const w of words) {\n const at = lower.indexOf(w);\n if (at >= 0) spans.push([at, at + w.length]);\n }\n spans.sort((a, b) => a[0] - b[0]);\n const out: Array<string | Node> = [];\n let pos = 0;\n for (const [a, b] of spans) {\n if (a < pos) continue;\n out.push(title.slice(pos, a), h('mark', 'op-palette__mark', {}, title.slice(a, b)));\n pos = b;\n }\n out.push(title.slice(pos));\n return out.filter((x) => x !== '');\n}\n\n/**\n * Command palette: Ctrl/\u2318+K opens a searchable, categorized list of the actions the app registered. Choosing one closes\n * the palette and runs it; a command with `children` opens a second level instead.\n */\nexport class CommandPalette extends Component<CommandPaletteConfig> {\n protected override baseCls = 'op-palette-backdrop';\n private commands: Command[];\n private levels: Level[] = [];\n private query = '';\n private cat: string | null = null;\n private shown: Command[] = [];\n private active = 0;\n private opened = false;\n private opener: Element | null = null;\n private release: Array<() => void> = [];\n private panel!: HTMLElement;\n private input!: HTMLInputElement;\n private filtersEl!: HTMLElement;\n private listEl!: HTMLElement;\n private live!: HTMLElement;\n private crumb!: HTMLElement;\n\n constructor(config: CommandPaletteConfig = {}) {\n super(config);\n this.commands = [...(config.commands ?? [])];\n const key = config.hotkey === undefined ? 'mod+k' : config.hotkey;\n if (key) {\n this.listen(document, 'keydown', (e: KeyboardEvent) => {\n if (!matchesKey(e, key) || this.destroyed) return;\n e.preventDefault();\n this.toggle();\n }, true);\n }\n }\n\n protected override build() {\n const c = this.config;\n this.input = h('input', 'op-palette__input', { type: 'text', role: 'combobox', 'aria-expanded': 'true', 'aria-autocomplete': 'list', autocomplete: 'off', spellcheck: 'false', placeholder: c.placeholder ?? t('cpPlaceholder') });\n this.crumb = h('span', 'op-palette__crumb');\n this.crumb.hidden = true;\n this.filtersEl = h('div', 'op-palette__filters', { role: 'group', 'aria-label': t('cpFilters') });\n this.listEl = h('div', 'op-palette__list', { role: 'listbox', id: `${this.id}-list` });\n this.input.setAttribute('aria-controls', this.listEl.id);\n this.live = h('div', 'op-sr-only', { 'aria-live': 'polite' });\n this.panel = h('div', 'op-palette', { role: 'dialog', 'aria-modal': 'true', 'aria-label': t('cpLabel') },\n h('div', 'op-palette__search', {}, iconEl('search'), this.crumb, this.input),\n this.filtersEl, this.listEl, this.live,\n h('div', 'op-palette__hint', {}, t('cpHint')));\n const el = h('div', 'op-palette-backdrop', {}, this.panel);\n this.listen(this.input, 'input', () => {\n this.query = this.input.value;\n this.active = 0;\n this.paint();\n });\n this.listen(this.panel, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(el, 'pointerdown', (e: Event) => e.target === el && this.close());\n this.listen(this.listEl, 'pointermove', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0 && i !== this.active) this.setActive(i);\n });\n this.listen(this.listEl, 'click', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0) void this.choose(this.shown[i]);\n });\n this.listen(this.filtersEl, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-cat]');\n if (!b) return;\n this.cat = b.dataset.cat || null;\n this.active = 0;\n this.paint();\n this.input.focus();\n });\n return el;\n }\n\n // ---- commands ------------------------------------------------------------------------------\n\n getCommands(): Command[] {\n return this.commands;\n }\n setCommands(list: Command[]): void {\n this.commands = [...list];\n if (this.levels[0]) this.levels[0].commands = this.commands;\n if (this.opened) this.paint();\n }\n /** Adds commands; returns the function that removes them again. */\n register(cmd: Command | Command[]): () => void {\n const list = Array.isArray(cmd) ? cmd : [cmd];\n this.commands.push(...list);\n if (this.opened) this.paint();\n return () => this.setCommands(this.commands.filter((c) => !list.includes(c)));\n }\n /** Runs a command by id (searching every level that is not a submenu), without opening the palette. */\n run(id: string): Promise<void> {\n const c = this.commands.find((x) => x.id === id);\n return c ? this.exec(c) : Promise.resolve();\n }\n\n // ---- open / close --------------------------------------------------------------------------\n\n isOpen(): boolean {\n return this.opened;\n }\n toggle(): void {\n if (this.opened) this.close();\n else this.open();\n }\n\n open(): void {\n if (this.opened || this.destroyed || this.emit('before-open') === false) return;\n this.opener = document.activeElement;\n const el = this.el;\n this.levels = [{ title: '', commands: this.commands }];\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n toLayer(el, this.opener);\n this.release.push(lockModal(el), trapFocus(this.panel));\n this.opened = true;\n el.classList.add('is-open');\n this.notifyMount();\n this.paint();\n this.input.focus();\n this.emit('open');\n }\n\n close(): void {\n if (!this.opened) return;\n this.opened = false;\n this.release.splice(0).reverse().forEach((f) => f());\n this.el.classList.remove('is-open');\n this.el.remove();\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n this.emit('close');\n }\n\n protected override onDestroy(): void {\n this.opened = false;\n this.release.splice(0).forEach((f) => f());\n if (this.panel) this.el.remove();\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n private level(): Level {\n return this.levels[this.levels.length - 1];\n }\n\n /** Commands for the current query/filter, in display order. */\n private results(): Command[] {\n const pool = this.level().commands.filter((c) => !c.hidden?.() && (!this.cat || c.category === this.cat));\n const q = this.query.trim();\n if (q) {\n return pool\n .map((c) => ({ c, s: score(c, q) }))\n .filter((x) => x.s > 0)\n .sort((a, b) => b.s - a.s)\n .map((x) => x.c)\n .slice(0, this.config.maxResults ?? 50);\n }\n const order = this.config.categories ?? [];\n const rank = (c: Command) => (c.category === undefined ? 1e6 : order.includes(c.category) ? order.indexOf(c.category) : order.length);\n return pool.map((c, i) => ({ c, i })).sort((a, b) => rank(a.c) - rank(b.c) || a.i - b.i).map((x) => x.c).slice(0, this.config.maxResults ?? 50);\n }\n\n private paint(): void {\n const lvl = this.level();\n this.crumb.hidden = this.levels.length < 2;\n this.crumb.textContent = lvl.title;\n this.paintFilters();\n this.shown = this.results();\n this.active = Math.min(this.active, Math.max(0, this.shown.length - 1));\n const searching = !!this.query.trim();\n const rows: HTMLElement[] = [];\n let group: string | undefined;\n this.shown.forEach((c, i) => {\n if (!searching && c.category !== group) {\n group = c.category;\n if (group) rows.push(h('div', 'op-palette__group', { role: 'presentation' }, group));\n }\n const item = h('div', `op-palette__item${c.disabled ? ' is-disabled' : ''}`, { role: 'option', id: `${this.id}-o${i}`, 'aria-disabled': c.disabled ? 'true' : null, 'data-i': i },\n c.icon ? h('span', 'op-palette__icon', {}, iconEl(c.icon)) : h('span', 'op-palette__icon'),\n h('span', 'op-palette__text', {}, h('span', 'op-palette__title', {}, ...marked(c.title, this.query)), c.description ? h('span', 'op-palette__desc', {}, c.description) : ''),\n searching && c.category ? h('span', 'op-palette__cat', {}, c.category) : '',\n c.children ? h('span', 'op-palette__more', { 'aria-hidden': 'true' }, iconEl('chevron-right')) : '',\n c.shortcut ? h('kbd', 'op-palette__kbd', {}, c.shortcut) : '');\n rows.push(item);\n });\n if (!this.shown.length) rows.push(h('div', 'op-palette__empty', {}, this.config.emptyText ?? t('cpEmpty')));\n this.listEl.replaceChildren(...rows);\n this.live.textContent = this.shown.length ? t('results', { n: this.shown.length }) : t('noResults');\n this.setActive(this.active, false);\n }\n\n private paintFilters(): void {\n const cats = [...new Set(this.level().commands.filter((c) => !c.hidden?.() && c.category).map((c) => c.category!))];\n this.filtersEl.hidden = this.config.filters === false || cats.length < 2;\n if (this.cat && !cats.includes(this.cat)) this.cat = null;\n const chip = (label: string, cat: string) => h('button', `op-palette__chip${(this.cat ?? '') === cat ? ' is-on' : ''}`, { type: 'button', 'data-cat': cat, 'aria-pressed': String((this.cat ?? '') === cat) }, label);\n this.filtersEl.replaceChildren(chip(t('cpAll'), ''), ...cats.map((c) => chip(c, c)));\n }\n\n private indexOf(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-palette__item');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private setActive(i: number, scroll = true): void {\n this.active = i;\n for (const row of Array.from(this.listEl.querySelectorAll<HTMLElement>('.op-palette__item'))) {\n const on = Number(row.dataset.i) === i;\n row.classList.toggle('is-active', on);\n row.setAttribute('aria-selected', String(on));\n if (on) {\n this.input.setAttribute('aria-activedescendant', row.id);\n if (scroll) row.scrollIntoView?.({ block: 'nearest' });\n }\n }\n if (!this.shown.length) this.input.removeAttribute('aria-activedescendant');\n }\n\n // ---- behavior ------------------------------------------------------------------------------\n\n private onKey(e: KeyboardEvent): void {\n const n = this.shown.length;\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n e.preventDefault();\n if (n) this.setActive((this.active + (e.key === 'ArrowDown' ? 1 : n - 1)) % n);\n break;\n case 'Home':\n case 'End':\n if (e.target === this.input && !this.input.value) {\n e.preventDefault();\n if (n) this.setActive(e.key === 'Home' ? 0 : n - 1);\n }\n break;\n case 'Enter':\n if ((e.target as HTMLElement).closest('.op-palette__chip')) return;\n e.preventDefault();\n if (this.shown[this.active]) void this.choose(this.shown[this.active]);\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n if (this.levels.length > 1) this.back();\n else this.close();\n break;\n case 'Backspace':\n if (!this.input.value && this.levels.length > 1) {\n e.preventDefault();\n this.back();\n }\n break;\n }\n }\n\n private back(): void {\n this.levels.pop();\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n this.paint();\n this.input.focus();\n }\n\n private async choose(c: Command | undefined): Promise<void> {\n if (!c || c.disabled) return;\n if (c.children) {\n try {\n const kids = typeof c.children === 'function' ? await c.children() : c.children;\n this.levels.push({ title: c.title, commands: kids });\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n this.paint();\n this.input.focus();\n } catch (err) {\n this.emit('error', err);\n }\n return;\n }\n this.close();\n await this.exec(c);\n }\n\n private async exec(c: Command): Promise<void> {\n try {\n this.emit('run', c);\n await c.handler?.({ palette: this, command: c });\n } catch (err) {\n this.emit('error', err);\n }\n }\n}\nregister('commandpalette', CommandPalette);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["addMessages", "isMac", "matchesKey", "e", "spec", "parts", "key", "has", "m", "mac", "subsequence", "text", "q", "i", "ch", "score", "c", "query", "title", "rest", "total", "w", "at", "s", "marked", "words", "lower", "spans", "a", "b", "out", "pos", "h", "x", "CommandPalette", "Component", "config", "t", "iconEl", "el", "list", "cmd", "id", "toLayer", "lockModal", "trapFocus", "f", "pool", "order", "rank", "lvl", "searching", "rows", "group", "item", "cats", "chip", "label", "cat", "row", "scroll", "on", "n", "kids", "err", "register"]
|
|
7
|
-
}
|
package/dist/chunk-7KMIFXHZ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as m}from"./chunk-W3H7GTJY.js";import{f as u}from"./chunk-PZSHOSOS.js";import{a as o}from"./chunk-TIPK3SCJ.js";import{d as a,f as n}from"./chunk-MW3RWBZ7.js";var l=class extends m{baseCls="op-field op-textfield op-numberfield";garbage=!1;emptyValue(){return null}isEmpty(e){return e==null}get decimalSep(){return a()._lang.startsWith("pt")?",":"."}parse(e){this.garbage=!1;let t=e.trim();if(!t)return null;let r=Number(this.decimalSep===","?t.replace(/\./g,"").replace(",","."):t.replace(/,/g,""));return Number.isNaN(r)?(this.garbage=!0,null):r}display(e){if(e==null)return"";let t=this.config.decimals;return(t==null?String(e):e.toFixed(t)).replace(".",this.decimalSep)}createControl(){let e=super.createControl(),t=this.input;return t.setAttribute("inputmode","decimal"),t.setAttribute("role","spinbutton"),this.syncAria(),this.listen(t,"blur",()=>{this.garbage||(this.input.value=this.display(this.value))}),e}syncAria(){let{min:e,max:t}=this.config,r=this.inputEl;e!=null?r.setAttribute("aria-valuemin",String(e)):r.removeAttribute("aria-valuemin"),t!=null?r.setAttribute("aria-valuemax",String(t)):r.removeAttribute("aria-valuemax"),this.value!=null?r.setAttribute("aria-valuenow",String(this.value)):r.removeAttribute("aria-valuenow")}onInput(){super.onInput(),this.syncAria(),this.garbage?this.setError(n("number")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1,this.syncAria()}check(){if(this.garbage)return n("number");let e=super.check(),t=this.value,{min:r,max:i}=this.config;return e||t==null?e:r!=null&&i!=null&&(t<r||t>i)?n("range",{min:r,max:i}):r!=null&&t<r?n("min",{n:r}):i!=null&&t>i?n("max",{n:i}):""}onKey(e){let t=e.key==="PageUp"||e.key==="PageDown";e.key==="ArrowUp"||e.key==="ArrowDown"||t?(e.preventDefault(),this.bump((e.key.endsWith("Up")?1:-1)*(t?10:1))):super.onKey(e)}bump(e){let{step:t=1,min:r,max:i,decimals:p}=this.config,s=(this.value??0)+t*e;(r!=null||i!=null)&&(s=u(s,r??-1/0,i??1/0)),s=Number(s.toFixed(p??10)),this.setValue(s)}increment(){this.bump(1)}decrement(){this.bump(-1)}setMin(e){this.config.min=e,this.rendered&&this.syncAria()}setMax(e){this.config.max=e,this.rendered&&this.syncAria()}setStep(e){this.config.step=e}setDecimals(e){this.config.decimals=e,this.rendered&&(this.input.value=this.display(this.value))}};o("numberfield",l);export{l as a};
|
|
2
|
-
//# sourceMappingURL=chunk-7KMIFXHZ.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/fields/numberfield/numberfield.ts"],
|
|
4
|
-
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, getLocale } from '../../../core/i18n';\nimport { clamp } from '../../../core/dom';\n\nexport interface NumberFieldConfig extends TextFieldConfig<number | null> {\n min?: number;\n max?: number;\n step?: number;\n /** Fixed decimals shown (and applied when the user leaves the field). */\n decimals?: number;\n}\n\nexport class NumberField extends TextField<number | null, NumberFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-numberfield';\n /** Text that is not a number: reported as an error instead of silently dropped. */\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: number | null) {\n return v == null;\n }\n\n private get decimalSep() {\n return getLocale()._lang.startsWith('pt') ? ',' : '.';\n }\n\n protected override parse(text: string): number | null {\n this.garbage = false;\n const s = text.trim();\n if (!s) return null;\n const n = Number(this.decimalSep === ',' ? s.replace(/\\./g, '').replace(',', '.') : s.replace(/,/g, ''));\n if (Number.isNaN(n)) {\n this.garbage = true;\n return null;\n }\n return n;\n }\n\n protected override display(v: number | null): string {\n if (v == null) return '';\n const d = this.config.decimals;\n return (d == null ? String(v) : v.toFixed(d)).replace('.', this.decimalSep);\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const i = this.input;\n i.setAttribute('inputmode', 'decimal');\n i.setAttribute('role', 'spinbutton');\n this.syncAria();\n // on blur the text is normalized to the configured decimals\n this.listen(i, 'blur', () => {\n if (!this.garbage) this.input.value = this.display(this.value);\n });\n return wrap;\n }\n\n private syncAria() {\n const { min, max } = this.config;\n const i = this.inputEl;\n if (min != null) i.setAttribute('aria-valuemin', String(min)); else i.removeAttribute('aria-valuemin');\n if (max != null) i.setAttribute('aria-valuemax', String(max)); else i.removeAttribute('aria-valuemax');\n if (this.value != null) i.setAttribute('aria-valuenow', String(this.value)); else i.removeAttribute('aria-valuenow');\n }\n\n protected override onInput() {\n super.onInput();\n this.syncAria();\n if (this.garbage) this.setError(t('number'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: number | null) {\n super.applyValue(v);\n this.garbage = false;\n this.syncAria();\n }\n\n protected override check(): string {\n if (this.garbage) return t('number');\n const base = super.check();\n const v = this.value;\n const { min, max } = this.config;\n if (base || v == null) return base;\n if (min != null && max != null && (v < min || v > max)) return t('range', { min, max });\n if (min != null && v < min) return t('min', { n: min });\n if (max != null && v > max) return t('max', { n: max });\n return '';\n }\n\n protected override onKey(e: KeyboardEvent) {\n const big = e.key === 'PageUp' || e.key === 'PageDown';\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || big) {\n e.preventDefault();\n this.bump((e.key.endsWith('Up') ? 1 : -1) * (big ? 10 : 1));\n } else super.onKey(e);\n }\n\n private bump(times: number) {\n const { step = 1, min, max, decimals } = this.config;\n let n = (this.value ?? 0) + step * times;\n if (min != null || max != null) n = clamp(n, min ?? -Infinity, max ?? Infinity);\n n = Number(n.toFixed(decimals ?? 10));\n this.setValue(n);\n }\n increment() {\n this.bump(1);\n }\n decrement() {\n this.bump(-1);\n }\n\n setMin(min: number | undefined) {\n this.config.min = min;\n if (this.rendered) this.syncAria();\n }\n setMax(max: number | undefined) {\n this.config.max = max;\n if (this.rendered) this.syncAria();\n }\n setStep(step: number) {\n this.config.step = step;\n }\n setDecimals(decimals: number | undefined) {\n this.config.decimals = decimals;\n if (this.rendered) this.input.value = this.display(this.value);\n }\n}\nregister('numberfield', NumberField);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["NumberField", "TextField", "v", "getLocale", "text", "s", "n", "d", "wrap", "i", "min", "max", "t", "base", "big", "times", "step", "decimals", "clamp", "register"]
|
|
7
|
-
}
|
package/dist/chunk-A2NKDOYN.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as s,c as l,d as r,e as n}from"./chunk-PZSHOSOS.js";import{a as d,f as h}from"./chunk-MW3RWBZ7.js";var a=class extends d{static type;config;id;parent;rendered=!1;mounted=!1;destroyed=!1;baseCls="op-component";tag="div";_el;disposers=[];mask;constructor(e={}){super(),this.config={...e},this.id=e.id??l("op");for(let t in e.listeners)this.on(t,e.listeners[t])}get el(){return this._el??this.render()}build(){return s(this.tag,this.baseCls)}onRender(){}onMount(){}onDestroy(){}render(){if(this._el)return this._el;let e=this._el=this.build();this.rendered=!0;let t=this.config;if(e.id=this.id,t.cls&&e.classList.add(...t.cls.split(/\s+/).filter(Boolean)),typeof t.style=="string")e.style.cssText+=t.style;else if(t.style)for(let i in t.style)e.style.setProperty(r(i),String(t.style[i]));return t.width!=null&&(e.style.width=n(t.width)),t.height!=null&&(e.style.height=n(t.height)),t.flex!=null&&(e.style.flex=String(t.flex)),t.ariaLabel&&e.setAttribute("aria-label",t.ariaLabel),this.setStableSize(t.stableSize!==!1),t.hidden&&(e.hidden=!0),t.tooltip&&(e.dataset.opTip=t.tooltip),t.theme&&this.setTheme(t.theme),this.onRender(),t.disabled&&this.setDisabled(!0),t.loading&&this.setLoading(t.loading),e}mount(e=document.body){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Optikos: mount target not found: ${String(e)}`);return t.appendChild(this.el),this.notifyMount(),this}notifyMount(){this.mounted||this.destroyed||(this.mounted=!0,this.onMount(),this.emit("mount"))}destroy(){if(!this.destroyed){this.destroyed=!0,this.onDestroy();for(let e of this.disposers.splice(0).reverse())e();this.parent?.remove(this,!1),this.parent=void 0,this._el?.remove(),this.emit("destroy"),this.clearListeners()}}own(e){return this.disposers.push(e),e}listen(e,t,i,o){return e.addEventListener(t,i,o),this.own(()=>e.removeEventListener(t,i,o))}later(e,t){let i=setTimeout(e,t);return this.own(()=>clearTimeout(i))}onDisabled(e){}setDisabled(e){this.config.disabled=e,this.rendered&&(this.el.classList.toggle("is-disabled",e),this.onDisabled(e))}show(){this.config.hidden=!1,this.rendered&&(this.el.hidden=!1),this.emit("show")}hide(){this.config.hidden=!0,this.rendered&&(this.el.hidden=!0),this.emit("hide")}isHidden(){return!!this.config.hidden}addCls(e){this.el.classList.add(e)}removeCls(e){this.el.classList.remove(e)}toggleCls(e,t){this.el.classList.toggle(e,t)}setWidth(e){this.config.width=e,this.rendered&&(this.el.style.width=n(e))}setHeight(e){this.config.height=e,this.rendered&&(this.el.style.height=n(e))}setFlex(e){this.config.flex=e,this.rendered&&(this.el.style.flex=String(e))}setStableSize(e){this.config.stableSize=e,this.rendered&&this.el.classList.toggle("op-stable",e)}setTooltip(e){this.config.tooltip=e,this.rendered&&(e?this.el.dataset.opTip=e:delete this.el.dataset.opTip)}setTheme(e){let t="--"+this.baseCls+"-";for(let i in e)this.el.style.setProperty(i.startsWith("--")?i:t+r(i),String(e[i]))}setLoading(e){if(this.config.loading=e,!this.rendered)return;let t=this.el;this.mask?.remove(),this.mask=void 0,t.classList.toggle("is-loading",!!e),e?t.setAttribute("aria-busy","true"):t.removeAttribute("aria-busy"),e&&(this.mask=s("div","op-mask",{},s("span","op-spinner",{role:"progressbar","aria-label":h("loading")}),typeof e=="string"?s("div","op-mask__text",{},e):null),t.append(this.mask));for(let i of Array.from(t.children))i!==this.mask&&i.toggleAttribute("inert",!!e)}focusEl(){return this.el}focus(){this.focusEl().focus()}};export{a};
|
|
2
|
-
//# sourceMappingURL=chunk-A2NKDOYN.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/core/component.ts"],
|
|
4
|
-
"sourcesContent": ["import { Emitter, type Handler } from './emitter';\nimport { h, uid, kebab, px } from './dom';\nimport { t } from './i18n';\n\nexport interface ComponentConfig {\n type?: string;\n id?: string;\n cls?: string;\n style?: string | Record<string, string | number>;\n hidden?: boolean;\n disabled?: boolean;\n width?: number | string;\n height?: number | string;\n flex?: number | string;\n tooltip?: string;\n /** Inside a Form: shown only while this returns true (given the form values). A field hidden this way neither validates nor goes into `getValues`. */\n showIf?: (values: Record<string, any>) => boolean;\n /** Inside a Form: enabled only while this returns true (given the form values). */\n enableIf?: (values: Record<string, any>) => boolean;\n /** Component-scoped tokens: `{ radius: '0' }` on a button sets `--op-button-radius`. Keys starting with `--` are used as is. */\n theme?: Record<string, string | number>;\n /**\n * Default `true`: the component keeps its size when only its *state* changes (loading, searching, invalid).\n * The CSS reserves room for the state's extra content instead of growing. `false` lets it fit the content.\n * Does not apply to new *content* (`setText` with a longer text).\n */\n stableSize?: boolean;\n /** `true` or a text: shows a mask with a spinner over the component. */\n loading?: boolean | string;\n ariaLabel?: string;\n /** Layout `border`: where the item goes. */\n region?: 'north' | 'south' | 'west' | 'east' | 'center';\n /** Layout `grid`: columns spanned; `'full'` takes the whole row. */\n colspan?: number | 'full';\n listeners?: Record<string, Handler>;\n renderTo?: string | HTMLElement;\n /** Free slot for application data. */\n data?: unknown;\n}\n\n/** Anything that owns children (Container) and accepts being asked to drop one. */\nexport interface Parent {\n remove(child: Component, destroy?: boolean): unknown;\n}\n\nexport class Component<C extends ComponentConfig = ComponentConfig> extends Emitter {\n static type?: string;\n config: C;\n readonly id: string;\n parent?: Component & Parent;\n rendered = false;\n mounted = false;\n destroyed = false;\n protected baseCls = 'op-component';\n protected tag: keyof HTMLElementTagNameMap = 'div';\n private _el?: HTMLElement;\n private disposers: Array<() => void> = [];\n private mask?: HTMLElement;\n\n constructor(config: C = {} as C) {\n super();\n this.config = { ...config };\n this.id = config.id ?? uid('op');\n for (const k in config.listeners) this.on(k, config.listeners[k]);\n }\n\n /** The root element. Built on first access. */\n get el(): HTMLElement {\n return this._el ?? this.render();\n }\n\n // ---- lifecycle (template method) ----------------------------------------------------------\n\n /** Builds the root element. Subclasses override to create their own DOM. */\n protected build(): HTMLElement {\n return h(this.tag, this.baseCls);\n }\n protected onRender(): void {}\n protected onMount(): void {}\n protected onDestroy(): void {}\n\n /** Builds the DOM once. Safe to call repeatedly. */\n render(): HTMLElement {\n if (this._el) return this._el;\n const el = (this._el = this.build());\n this.rendered = true;\n const c = this.config;\n el.id = this.id;\n if (c.cls) el.classList.add(...c.cls.split(/\\s+/).filter(Boolean));\n if (typeof c.style === 'string') el.style.cssText += c.style;\n else if (c.style) for (const k in c.style) el.style.setProperty(kebab(k), String(c.style[k]));\n if (c.width != null) el.style.width = px(c.width);\n if (c.height != null) el.style.height = px(c.height);\n if (c.flex != null) el.style.flex = String(c.flex);\n if (c.ariaLabel) el.setAttribute('aria-label', c.ariaLabel);\n this.setStableSize(c.stableSize !== false);\n if (c.hidden) el.hidden = true;\n if (c.tooltip) el.dataset.opTip = c.tooltip;\n if (c.theme) this.setTheme(c.theme);\n this.onRender();\n if (c.disabled) this.setDisabled(true);\n if (c.loading) this.setLoading(c.loading);\n return el;\n }\n\n /** Appends to a target (default `document.body`) and fires `onMount` for the whole subtree. */\n mount(target: string | HTMLElement = document.body): this {\n const parent = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (!parent) throw new Error(`Optikos: mount target not found: ${String(target)}`);\n parent.appendChild(this.el);\n this.notifyMount();\n return this;\n }\n\n /** Called when the element becomes part of a mounted tree. Containers override to reach children. */\n notifyMount(): void {\n if (this.mounted || this.destroyed) return;\n this.mounted = true;\n this.onMount();\n this.emit('mount');\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.onDestroy();\n for (const d of this.disposers.splice(0).reverse()) d();\n this.parent?.remove(this, false);\n this.parent = undefined;\n this._el?.remove();\n this.emit('destroy');\n this.clearListeners();\n }\n\n // ---- resources released on destroy --------------------------------------------------------\n\n /** Registers a function to run on `destroy` (listeners, timers, effects). Returns it. */\n own<F extends () => void>(fn: F): F {\n this.disposers.push(fn);\n return fn;\n }\n\n /** Adds a DOM listener released on `destroy`. */\n listen(target: EventTarget, type: string, fn: (e: any) => void, opts?: AddEventListenerOptions | boolean): () => void {\n target.addEventListener(type, fn, opts);\n return this.own(() => target.removeEventListener(type, fn, opts));\n }\n\n /** `setTimeout` released on `destroy`; returns the cancel function. */\n later(fn: () => void, ms: number): () => void {\n const id = setTimeout(fn, ms);\n return this.own(() => clearTimeout(id));\n }\n\n // ---- common state / setters ---------------------------------------------------------------\n\n protected onDisabled(_disabled: boolean): void {}\n\n setDisabled(disabled: boolean): void {\n this.config.disabled = disabled;\n if (!this.rendered) return;\n this.el.classList.toggle('is-disabled', disabled);\n this.onDisabled(disabled);\n }\n\n show(): void {\n this.config.hidden = false;\n if (this.rendered) this.el.hidden = false;\n this.emit('show');\n }\n hide(): void {\n this.config.hidden = true;\n if (this.rendered) this.el.hidden = true;\n this.emit('hide');\n }\n isHidden(): boolean {\n return !!this.config.hidden;\n }\n\n addCls(name: string): void {\n this.el.classList.add(name);\n }\n removeCls(name: string): void {\n this.el.classList.remove(name);\n }\n toggleCls(name: string, on?: boolean): void {\n this.el.classList.toggle(name, on);\n }\n\n setWidth(v: number | string): void {\n this.config.width = v;\n if (this.rendered) this.el.style.width = px(v);\n }\n setHeight(v: number | string): void {\n this.config.height = v;\n if (this.rendered) this.el.style.height = px(v);\n }\n setFlex(v: number | string): void {\n this.config.flex = v;\n if (this.rendered) this.el.style.flex = String(v);\n }\n\n setStableSize(stable: boolean): void {\n this.config.stableSize = stable;\n if (this.rendered) this.el.classList.toggle('op-stable', stable);\n }\n\n setTooltip(text: string): void {\n this.config.tooltip = text;\n if (!this.rendered) return;\n if (text) this.el.dataset.opTip = text;\n else delete this.el.dataset.opTip;\n }\n\n setTheme(theme: Record<string, string | number>): void {\n const prefix = '--' + this.baseCls + '-';\n for (const k in theme) this.el.style.setProperty(k.startsWith('--') ? k : prefix + kebab(k), String(theme[k]));\n }\n\n /** Shows (or removes) a loading mask. A string is shown as text under the spinner. */\n setLoading(loading: boolean | string): void {\n this.config.loading = loading;\n if (!this.rendered) return;\n const el = this.el;\n this.mask?.remove();\n this.mask = undefined;\n el.classList.toggle('is-loading', !!loading);\n if (loading) el.setAttribute('aria-busy', 'true');\n else el.removeAttribute('aria-busy');\n if (loading) {\n this.mask = h('div', 'op-mask', {}, h('span', 'op-spinner', { role: 'progressbar', 'aria-label': t('loading') }), typeof loading === 'string' ? h('div', 'op-mask__text', {}, loading) : null);\n el.append(this.mask);\n }\n for (const child of Array.from(el.children)) if (child !== this.mask) child.toggleAttribute('inert', !!loading);\n }\n\n /** The element that receives focus on `focus()`. */\n protected focusEl(): HTMLElement {\n return this.el;\n }\n focus(): void {\n this.focusEl().focus();\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Component", "Emitter", "config", "uid", "k", "h", "el", "c", "kebab", "px", "target", "parent", "d", "fn", "type", "opts", "ms", "id", "_disabled", "disabled", "name", "on", "v", "stable", "text", "theme", "prefix", "loading", "t", "child"]
|
|
7
|
-
}
|
package/dist/chunk-CKXS375P.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as h}from"./chunk-ZWNQREWS.js";import{c as m}from"./chunk-VV7CFMPZ.js";import{c as d}from"./chunk-4EZJ5FKJ.js";import{b as r}from"./chunk-PZSHOSOS.js";import{a as f}from"./chunk-TIPK3SCJ.js";import{e as p,f as l}from"./chunk-MW3RWBZ7.js";p("en",{tabErrors:"errors"});p("pt-BR",{tabErrors:"erros"});var b=class extends h{baseCls="op-tabs";barEl;panelsEl;tabs=new Map;pending=new Set;rover;constructor(t={}){super({defaultType:"container",...t})}getBody(){return this.panelsEl}build(){let t=this.config.position==="left",e=r("div",`op-tabs${t?" op-tabs--left":""}`);return this.barEl=r("div","op-tabs__bar",{role:"tablist","aria-orientation":t?"vertical":"horizontal"}),this.panelsEl=r("div","op-tabs__panels"),e.append(this.barEl,this.panelsEl),e}onRender(){let t=this.config;t.layout={type:"card",activeItem:t.active??0},this.items.forEach(e=>this.addHeader(e)),this.rover=m(this.barEl,{selector:"[role=tab]",orientation:t.position==="left"?"vertical":"horizontal",onMove:e=>this.setActive(this.items.find(i=>this.tabs.get(i)===e))}),this.own(()=>this.rover?.destroy()),this.on("activate",e=>this.syncHeaders(e)),this.listen(this.barEl,"click",e=>{let i=e.target,s=i.closest("[role=tab]"),o=this.items.find(n=>this.tabs.get(n)===s);o&&(i.closest(".op-tabs__close")?this.closeTab(o):i.closest(".op-tabs__reload")?(this.setActive(o),this.reloadTab(o)):this.setActive(o))}),this.listen(this.barEl,"keydown",e=>{let i=this.items.find(s=>this.tabs.get(s)===e.target.closest("[role=tab]"));e.key==="Delete"&&i?this.closeTab(i):i&&(e.key==="r"||e.key==="R")&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&this.tabConfig(i).reloadable&&this.reloadTab(i)}),super.onRender()}forcing;attach(t,e){if(this.config.lazy!==!1&&t!==this.getActiveItem()&&t!==this.forcing){this.pending.add(t);return}super.attach(t,e),t.el.setAttribute("role","tabpanel"),t.el.tabIndex=0;let i=this.tabs.get(t);i&&(t.el.setAttribute("aria-labelledby",i.id),i.setAttribute("aria-controls",t.el.id))}ensure(t){this.pending.delete(t)&&(this.forcing=t,this.attach(t,this.items.indexOf(t)),this.forcing=void 0)}tabConfig(t){let e=t.config;return{title:e.title??"",icon:e.icon,closable:e.closable??this.config.closable??!1,reloadable:e.reloadable??this.config.reloadable??!1,disabled:!!e.disabled}}addHeader(t){let{title:e,icon:i,closable:s,reloadable:o,disabled:n}=this.tabConfig(t),a=r("div","op-tabs__tab",{role:"tab",id:`${t.id}-tab`,tabindex:-1,"aria-selected":"false","aria-disabled":n?"true":null});a.append(i?d(i):"",r("span","op-tabs__title",{},e)),o&&a.append(r("span","op-tabs__reload",{"aria-hidden":"true","data-op-tip":l("reload")},d("refresh"))),s&&a.append(r("span","op-tabs__close",{"aria-hidden":"true","data-op-tip":l("close")},d("x"))),this.tabs.set(t,a),this.barEl.append(...[...this.items].filter(c=>this.tabs.has(c)).map(c=>this.tabs.get(c)))}syncHeaders(t){for(let[i,s]of this.tabs){let o=i===t;s.setAttribute("aria-selected",String(o)),s.classList.toggle("is-active",o)}let e=t&&this.tabs.get(t);this.rover?.sync(e||void 0)}getActive(){return this.getActiveItem()}setActive(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(s=>s.id===t):t,i=this.getActiveItem();!e||e===i||this.tabConfig(e).disabled||this.emit("before-change",e,i)!==!1&&(this.ensure(e),this.setActiveItem(e),this.emit("change",e,this.items.indexOf(e)))}insert(t,e){let i=super.insert(t,e);return this.rendered&&(this.addHeader(i),this.ensure(i),this.setActive(i)),i}async reloadTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(o=>o.id===t):t,i=e&&this.tabs.get(e);if(!e||i?.classList.contains("is-reloading")||this.emit("before-reload",e)===!1)return!1;i?.classList.add("is-reloading");let s=e.config.onReload?.(e);return s instanceof Promise&&(e.setLoading(!0),await s.catch(()=>{}),e.setLoading(!1)),i?.classList.remove("is-reloading"),this.emit("reload",e),!0}closeTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(i=>i.id===t):t;!e||this.emit("before-close",e)===!1||(this.remove(e),this.emit("close",e))}remove(t,e=!0){let i=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(n=>n.id===t):t,s=i&&this.tabs.get(i)?.contains(document.activeElement),o=super.remove(t,e);if(i){this.tabs.get(i)?.remove(),this.tabs.delete(i),this.pending.delete(i);let n=this.getActiveItem();n&&this.ensure(n),s&&n&&this.tabs.get(n)?.focus()}return o}setTabState(t,e){let i=this.tabs.get(t);if(!i)return;i.classList.toggle("has-error",!!e.errors),i.classList.toggle("is-dirty",!!e.dirty);let s=i.querySelector(".op-tabs__badge");if(!e.errors)return s?.remove();s||(s=r("span","op-tabs__badge"),i.insertBefore(s,i.querySelector(".op-tabs__close"))),s.replaceChildren(String(e.errors),r("span","op-sr-only",{},` ${l("tabErrors")}`))}setTitle(t,e){t.config.title=e;let i=this.tabs.get(t)?.querySelector(".op-tabs__title");i&&(i.textContent=e)}};f("tabs",b);export{b as a};
|
|
2
|
-
//# sourceMappingURL=chunk-CKXS375P.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
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 { 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 }\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": "uPASAA,EAAY,KAAM,CAChB,UAAW,QACb,CAAC,EACDA,EAAY,QAAS,CACnB,UAAW,OACb,CAAC,EAkBM,IAAMC,EAAN,cAAmBC,CAAsB,CAC3B,QAAU,UACrB,MACA,SACA,KAAO,IAAI,IACX,QAAU,IAAI,IACd,MAER,YAAYC,EAAqB,CAAC,EAAG,CACnC,MAAM,CAAE,YAAa,YAAa,GAAGA,CAAO,CAAC,CAC/C,CAES,SAAU,CACjB,OAAO,KAAK,QACd,CAEmB,OAAQ,CACzB,IAAMC,EAAO,KAAK,OAAO,WAAa,OAChCC,EAAKC,EAAE,MAAO,UAAUF,EAAO,iBAAmB,EAAE,EAAE,EAC5D,YAAK,MAAQE,EAAE,MAAO,eAAgB,CAAE,KAAM,UAAW,mBAAoBF,EAAO,WAAa,YAAa,CAAC,EAC/G,KAAK,SAAWE,EAAE,MAAO,iBAAiB,EAC1CD,EAAG,OAAO,KAAK,MAAO,KAAK,QAAQ,EAC5BA,CACT,CAEmB,UAAW,CAC5B,IAAME,EAAI,KAAK,OACfA,EAAE,OAAS,CAAE,KAAM,OAAQ,WAAYA,EAAE,QAAU,CAAE,EACrD,KAAK,MAAM,QAASC,GAAM,KAAK,UAAUA,CAAC,CAAC,EAC3C,KAAK,MAAQC,EAAO,KAAK,MAAO,CAC9B,SAAU,aACV,YAAaF,EAAE,WAAa,OAAS,WAAa,aAClD,OAASG,GAAQ,KAAK,UAAU,KAAK,MAAM,KAAMF,GAAM,KAAK,KAAK,IAAIA,CAAC,IAAME,CAAG,CAAE,CACnF,CAAC,EACD,KAAK,IAAI,IAAM,KAAK,OAAO,QAAQ,CAAC,EACpC,KAAK,GAAG,WAAaF,GAAkB,KAAK,YAAYA,CAAC,CAAC,EAC1D,KAAK,OAAO,KAAK,MAAO,QAAU,GAAa,CAC7C,IAAMG,EAAS,EAAE,OACXD,EAAMC,EAAO,QAAqB,YAAY,EAC9CC,EAAQ,KAAK,MAAM,KAAMJ,GAAM,KAAK,KAAK,IAAIA,CAAC,IAAME,CAAG,EACxDE,IACDD,EAAO,QAAQ,iBAAiB,EAAG,KAAK,SAASC,CAAK,EACjDD,EAAO,QAAQ,kBAAkB,GAAI,KAAK,UAAUC,CAAK,EAAQ,KAAK,UAAUA,CAAK,GACzF,KAAK,UAAUA,CAAK,EAC3B,CAAC,EACD,KAAK,OAAO,KAAK,MAAO,UAAY,GAAqB,CACvD,IAAMA,EAAQ,KAAK,MAAM,KAAMJ,GAAM,KAAK,KAAK,IAAIA,CAAC,IAAO,EAAE,OAAuB,QAAQ,YAAY,CAAC,EACrG,EAAE,MAAQ,UAAYI,EAAO,KAAK,SAASA,CAAK,EAC3CA,IAAU,EAAE,MAAQ,KAAO,EAAE,MAAQ,MAAQ,CAAC,EAAE,SAAW,CAAC,EAAE,SAAW,CAAC,EAAE,QAAU,KAAK,UAAUA,CAAK,EAAE,YAAiB,KAAK,UAAUA,CAAK,CAC5J,CAAC,EACD,MAAM,SAAS,CACjB,CAEQ,QAGW,OAAOJ,EAAcK,EAAe,CACrD,GAAI,KAAK,OAAO,OAAS,IAASL,IAAM,KAAK,cAAc,GAAKA,IAAM,KAAK,QAAS,CAClF,KAAK,QAAQ,IAAIA,CAAC,EAClB,MACF,CACA,MAAM,OAAOA,EAAGK,CAAK,EACrBL,EAAE,GAAG,aAAa,OAAQ,UAAU,EACpCA,EAAE,GAAG,SAAW,EAChB,IAAME,EAAM,KAAK,KAAK,IAAIF,CAAC,EACvBE,IACFF,EAAE,GAAG,aAAa,kBAAmBE,EAAI,EAAE,EAC3CA,EAAI,aAAa,gBAAiBF,EAAE,GAAG,EAAE,EAE7C,CAGQ,OAAOA,EAAc,CACtB,KAAK,QAAQ,OAAOA,CAAC,IAC1B,KAAK,QAAUA,EACf,KAAK,OAAOA,EAAG,KAAK,MAAM,QAAQA,CAAC,CAAC,EACpC,KAAK,QAAU,OACjB,CAEQ,UAAUA,EAAc,CAC9B,IAAMD,EAAIC,EAAE,OACZ,MAAO,CAAE,MAAQD,EAAE,OAAoB,GAAI,KAAMA,EAAE,KAA4B,SAAWA,EAAE,UAAwB,KAAK,OAAO,UAAY,GAAO,WAAaA,EAAE,YAA0B,KAAK,OAAO,YAAc,GAAO,SAAU,CAAC,CAACA,EAAE,QAAS,CACtP,CAEQ,UAAUC,EAAc,CAC9B,GAAM,CAAE,MAAAM,EAAO,KAAAC,EAAM,SAAAC,EAAU,WAAAC,EAAY,SAAAC,CAAS,EAAI,KAAK,UAAUV,CAAC,EAClEE,EAAMJ,EAAE,MAAO,eAAgB,CAAE,KAAM,MAAO,GAAI,GAAGE,EAAE,EAAE,OAAQ,SAAU,GAAI,gBAAiB,QAAS,gBAAiBU,EAAW,OAAS,IAAK,CAAC,EAC1JR,EAAI,OAAOK,EAAOI,EAAOJ,CAAI,EAAI,GAAIT,EAAE,OAAQ,iBAAkB,CAAC,EAAGQ,CAAK,CAAC,EACvEG,GAAYP,EAAI,OAAOJ,EAAE,OAAQ,kBAAmB,CAAE,cAAe,OAAQ,cAAec,EAAE,QAAQ,CAAE,EAAGD,EAAO,SAAS,CAAC,CAAC,EAC7HH,GAAUN,EAAI,OAAOJ,EAAE,OAAQ,iBAAkB,CAAE,cAAe,OAAQ,cAAec,EAAE,OAAO,CAAE,EAAGD,EAAO,GAAG,CAAC,CAAC,EACvH,KAAK,KAAK,IAAIX,EAAGE,CAAG,EACpB,KAAK,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,OAAQW,GAAM,KAAK,KAAK,IAAIA,CAAC,CAAC,EAAE,IAAKA,GAAM,KAAK,KAAK,IAAIA,CAAC,CAAE,CAAC,CACpG,CAEQ,YAAYC,EAAoB,CACtC,OAAW,CAACd,EAAGE,CAAG,IAAK,KAAK,KAAM,CAChC,IAAMa,EAAKf,IAAMc,EACjBZ,EAAI,aAAa,gBAAiB,OAAOa,CAAE,CAAC,EAC5Cb,EAAI,UAAU,OAAO,YAAaa,CAAE,CACtC,CACA,IAAMb,EAAMY,GAAU,KAAK,KAAK,IAAIA,CAAM,EAC1C,KAAK,OAAO,KAAKZ,GAAO,MAAS,CACnC,CAIA,WAAmC,CACjC,OAAO,KAAK,cAAc,CAC5B,CAGA,UAAUA,EAAwC,CAChD,IAAMF,EAAI,OAAOE,GAAQ,SAAW,KAAK,MAAMA,CAAG,EAAI,OAAOA,GAAQ,SAAW,KAAK,MAAM,KAAMW,GAAMA,EAAE,KAAOX,CAAG,EAAIA,EACjHc,EAAO,KAAK,cAAc,EAC5B,CAAChB,GAAKA,IAAMgB,GAAQ,KAAK,UAAUhB,CAAC,EAAE,UACtC,KAAK,KAAK,gBAAiBA,EAAGgB,CAAI,IAAM,KAC5C,KAAK,OAAOhB,CAAC,EACb,KAAK,cAAcA,CAAC,EACpB,KAAK,KAAK,SAAUA,EAAG,KAAK,MAAM,QAAQA,CAAC,CAAC,EAC9C,CAES,OAAOK,EAAeY,EAAiD,CAC9E,IAAMjB,EAAI,MAAM,OAAOK,EAAOY,CAAI,EAClC,OAAI,KAAK,WACP,KAAK,UAAUjB,CAAC,EAChB,KAAK,OAAOA,CAAC,EACb,KAAK,UAAUA,CAAC,GAEXA,CACT,CAMA,MAAM,UAAUE,EAAoD,CAClE,IAAMF,EAAI,OAAOE,GAAQ,SAAW,KAAK,MAAMA,CAAG,EAAI,OAAOA,GAAQ,SAAW,KAAK,MAAM,KAAMW,GAAMA,EAAE,KAAOX,CAAG,EAAIA,EACjHgB,EAAOlB,GAAK,KAAK,KAAK,IAAIA,CAAC,EACjC,GAAI,CAACA,GAAKkB,GAAM,UAAU,SAAS,cAAc,GAAK,KAAK,KAAK,gBAAiBlB,CAAC,IAAM,GAAO,MAAO,GACtGkB,GAAM,UAAU,IAAI,cAAc,EAClC,IAAMC,EAAQnB,EAAE,OAAqB,WAAWA,CAAC,EACjD,OAAImB,aAAgB,UAClBnB,EAAE,WAAW,EAAI,EACjB,MAAMmB,EAAK,MAAM,IAAG,EAAY,EAChCnB,EAAE,WAAW,EAAK,GAEpBkB,GAAM,UAAU,OAAO,cAAc,EACrC,KAAK,KAAK,SAAUlB,CAAC,EACd,EACT,CAGA,SAASE,EAAwC,CAC/C,IAAMF,EAAI,OAAOE,GAAQ,SAAW,KAAK,MAAMA,CAAG,EAAI,OAAOA,GAAQ,SAAW,KAAK,MAAM,KAAMW,GAAMA,EAAE,KAAOX,CAAG,EAAIA,EACnH,CAACF,GAAK,KAAK,KAAK,eAAgBA,CAAC,IAAM,KAC3C,KAAK,OAAOA,CAAC,EACb,KAAK,KAAK,QAASA,CAAC,EACtB,CAES,OAAOoB,EAAoCC,EAAU,GAA6B,CACzF,IAAMrB,EAAI,OAAOoB,GAAU,SAAW,KAAK,MAAMA,CAAK,EAAI,OAAOA,GAAU,SAAW,KAAK,MAAM,KAAMP,GAAMA,EAAE,KAAOO,CAAK,EAAIA,EACzHE,EAAWtB,GAAK,KAAK,KAAK,IAAIA,CAAC,GAAG,SAAS,SAAS,aAAa,EACjEuB,EAAU,MAAM,OAAOH,EAAOC,CAAO,EAC3C,GAAIrB,EAAG,CACL,KAAK,KAAK,IAAIA,CAAC,GAAG,OAAO,EACzB,KAAK,KAAK,OAAOA,CAAC,EAClB,KAAK,QAAQ,OAAOA,CAAC,EACrB,IAAMc,EAAS,KAAK,cAAc,EAC9BA,GAAQ,KAAK,OAAOA,CAAM,EAC1BQ,GAAYR,GAAQ,KAAK,KAAK,IAAIA,CAAM,GAAG,MAAM,CACvD,CACA,OAAOS,CACT,CAGA,YAAYrB,EAAgBsB,EAAmD,CAC7E,IAAM3B,EAAK,KAAK,KAAK,IAAIK,CAAG,EAC5B,GAAI,CAACL,EAAI,OACTA,EAAG,UAAU,OAAO,YAAa,CAAC,CAAC2B,EAAM,MAAM,EAC/C3B,EAAG,UAAU,OAAO,WAAY,CAAC,CAAC2B,EAAM,KAAK,EAC7C,IAAIC,EAAQ5B,EAAG,cAA2B,iBAAiB,EAC3D,GAAI,CAAC2B,EAAM,OAAQ,OAAOC,GAAO,OAAO,EACnCA,IACHA,EAAQ3B,EAAE,OAAQ,gBAAgB,EAClCD,EAAG,aAAa4B,EAAO5B,EAAG,cAAc,iBAAiB,CAAC,GAE5D4B,EAAM,gBAAgB,OAAOD,EAAM,MAAM,EAAG1B,EAAE,OAAQ,aAAc,CAAC,EAAG,IAAIc,EAAE,WAAW,CAAC,EAAE,CAAC,CAC/F,CAEA,SAASV,EAAgBI,EAAe,CACrCJ,EAAI,OAAqB,MAAQI,EAClC,IAAMT,EAAK,KAAK,KAAK,IAAIK,CAAG,GAAG,cAAc,iBAAiB,EAC1DL,IAAIA,EAAG,YAAcS,EAC3B,CACF,EACAoB,EAAS,OAAQjC,CAAI",
|
|
6
|
-
"names": ["addMessages", "Tabs", "Container", "config", "left", "el", "h", "c", "p", "roving", "tab", "target", "panel", "index", "title", "icon", "closable", "reloadable", "disabled", "iconEl", "t", "x", "active", "on", "prev", "item", "head", "busy", "child", "destroy", "hadFocus", "removed", "state", "badge", "register"]
|
|
7
|
-
}
|
package/dist/chunk-EJGWCKE4.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as h}from"./chunk-YF75HKL6.js";import{a}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as p,c}from"./chunk-TIPK3SCJ.js";import{f as n}from"./chunk-MW3RWBZ7.js";var m=new Map;function M(r,e){m.set(r,e)}function g(r){let e=typeof r=="string"?m.get(r):r;if(!e)throw new Error(`Optikos: unknown lookup "${r}". Did you call registerLookup?`);return e}var y=r=>typeof r.store=="function"?r.store():r.store,v=r=>!r||r==="textfield"||r==="textarea",k=r=>r==null||r===""||Array.isArray(r)&&!r.length,l=class extends f{baseCls="op-searchgrid";def;store;fields=[];grid;form;build(){this.def=g(this.config.lookup),this.store=y(this.def);let e=this.def;this.form=o("div","op-searchgrid__filters",{role:"search"});let i=[new a({text:n("search"),icon:"search",variant:"primary",handler:()=>{this.search()}}),new a({text:n("clear"),handler:()=>this.clear()})];return this.fields=(e.filters??[]).map(t=>{let{op:s,field:x,...u}=t,d=c({...u,renderTo:void 0});return d.on("enter",()=>{this.search()}),{cfg:t,cmp:d}}),this.form.append(...this.fields.map(t=>t.cmp.el),o("div","op-searchgrid__buttons",{},...i.map(t=>t.el))),this.grid=new h({store:this.store,columns:e.columns,selection:e.selection??"single",paging:e.paging!==!1,flex:1}),this.grid.on("select",t=>this.emit("select",t)),this.grid.on("row-activate",()=>this.confirm()),this.grid.on("row-dblclick",()=>this.confirm()),this.own(()=>[...i,this.grid,...this.fields.map(t=>t.cmp)].forEach(t=>t.destroy())),o("div",this.baseCls,{},this.form,this.grid.el)}onRender(){this.def.autoSearch!==!1&&this.search()}notifyMount(){super.notifyMount(),this.fields.forEach(e=>e.cmp.notifyMount()),this.grid.notifyMount()}confirm(){let e=this.grid.getSelection();e.length&&this.emit("confirm",e)}getFilters(){return this.fields.flatMap(({cfg:e,cmp:i})=>{let t=i.getValue?.();if(k(t))return[];let s=e.field??e.name;return typeof t=="object"&&!Array.isArray(t)&&"start"in t?t.start?[{field:s,op:"between",value:[t.start,t.end??t.start]}]:[]:[{field:s,op:e.op??(v(e.type)?"contains":"eq"),value:t}]})}async search(e){e!=null&&this.setQuery(e);let i=this.getFilters();this.emit("before-search",i)!==!1&&(await(i.length?this.store.filter(i):this.store.clearFilter()),this.emit("search",i))}clear(){this.fields.forEach(e=>e.cmp.clear?.()),this.search()}setQuery(e){let i=this.def.queryField??this.def.filters?.[0]?.name;this.fields.find(t=>t.cfg.name===i)?.cmp?.setValue?.(e)}getSelection(){return this.grid.getSelection()}getGrid(){return this.grid}getStore(){return this.store}focus(){(this.fields[0]?.cmp??this.grid).focus()}};p("searchgrid",l);export{M as a,g as b,y as c,l as d};
|
|
2
|
-
//# sourceMappingURL=chunk-EJGWCKE4.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/data/searchgrid/searchgrid.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { FilterOp, FilterSpec } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Grid } from '../grid/grid';\n\n/** A filter field of a lookup: any field config, plus how its value is matched. */\nexport type LookupFilter = AnyConfig & { name: string; op?: FilterOp; field?: string };\n\n/** Everything that describes \"search for a record\": shared by SearchGrid and LookupField. */\nexport interface LookupDef {\n /** A function gives every instance its own store (recommended when the definition is reused). */\n store: Store<any> | (() => Store<any>);\n columns: Column[];\n filters?: LookupFilter[];\n /** Name of the filter that receives the quick text (LookupField typing). Default: the first filter. */\n queryField?: string;\n valueField?: string;\n displayField?: string;\n selection?: 'single' | 'multi';\n paging?: boolean;\n /** Search when shown. Default true. */\n autoSearch?: boolean;\n title?: string;\n width?: number;\n height?: number;\n}\n\nconst defs = new Map<string, LookupDef>();\n/** Registers a lookup definition for declarative use by name (`lookup: 'people'`). */\nexport function registerLookup(name: string, def: LookupDef): void {\n defs.set(name, def);\n}\nexport function resolveLookup(lookup: LookupDef | string): LookupDef {\n const d = typeof lookup === 'string' ? defs.get(lookup) : lookup;\n if (!d) throw new Error(`Optikos: unknown lookup \"${lookup}\". Did you call registerLookup?`);\n return d;\n}\nexport const lookupStore = (def: LookupDef): Store<any> => (typeof def.store === 'function' ? def.store() : def.store);\n\nexport interface SearchGridConfig extends ComponentConfig {\n lookup: LookupDef | string;\n}\n\nconst textual = (type?: string) => !type || type === 'textfield' || type === 'textarea';\nconst blank = (v: unknown) => v == null || v === '' || (Array.isArray(v) && !v.length);\n\n/** Filters on top, results grid below. The Store does the searching; this component only turns the filter fields into specs. */\nexport class SearchGrid extends Component<SearchGridConfig> {\n protected override baseCls = 'op-searchgrid';\n private def!: LookupDef;\n private store!: Store<any>;\n private fields: Array<{ cfg: LookupFilter; cmp: Component }> = [];\n private grid!: Grid;\n private form!: HTMLElement;\n\n protected override build() {\n this.def = resolveLookup(this.config.lookup);\n this.store = lookupStore(this.def);\n const d = this.def;\n this.form = h('div', 'op-searchgrid__filters', { role: 'search' });\n const btns = [\n new Button({ text: t('search'), icon: 'search', variant: 'primary', handler: () => void this.search() }),\n new Button({ text: t('clear'), handler: () => this.clear() }),\n ];\n this.fields = (d.filters ?? []).map((cfg) => {\n const { op: _o, field: _f, ...fieldCfg } = cfg;\n const cmp = create({ ...fieldCfg, renderTo: undefined } as AnyConfig);\n cmp.on('enter', () => void this.search());\n return { cfg, cmp };\n });\n this.form.append(...this.fields.map((f) => f.cmp.el), h('div', 'op-searchgrid__buttons', {}, ...btns.map((b) => b.el)));\n this.grid = new Grid({ store: this.store, columns: d.columns, selection: d.selection ?? 'single', paging: d.paging !== false, flex: 1 });\n this.grid.on('select', (recs: Model[]) => this.emit('select', recs));\n this.grid.on('row-activate', () => this.confirm());\n this.grid.on('row-dblclick', () => this.confirm());\n this.own(() => [...btns, this.grid, ...this.fields.map((f) => f.cmp)].forEach((c) => c.destroy()));\n return h('div', this.baseCls, {}, this.form, this.grid.el);\n }\n\n protected override onRender() {\n if (this.def.autoSearch !== false) void this.search();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.fields.forEach((f) => f.cmp.notifyMount());\n this.grid.notifyMount();\n }\n\n private confirm() {\n const recs = this.grid.getSelection();\n if (recs.length) this.emit('confirm', recs);\n }\n\n /** The non-empty filter fields as filter specs. */\n getFilters(): FilterSpec[] {\n return this.fields.flatMap(({ cfg, cmp }) => {\n const v = (cmp as any).getValue?.();\n if (blank(v)) return [];\n const field = cfg.field ?? cfg.name;\n if (typeof v === 'object' && !Array.isArray(v) && 'start' in v) return v.start ? [{ field, op: 'between' as const, value: [v.start, v.end ?? v.start] }] : [];\n return [{ field, op: cfg.op ?? (textual(cfg.type) ? 'contains' : 'eq'), value: v }];\n });\n }\n\n /** Filters the store with the current fields (or loads it, when there are none). Resolves when the results are in. */\n async search(query?: string): Promise<void> {\n if (query != null) this.setQuery(query);\n const specs = this.getFilters();\n if (this.emit('before-search', specs) === false) return;\n await (specs.length ? this.store.filter(specs) : this.store.clearFilter());\n this.emit('search', specs);\n }\n\n /** Empties the filter fields and searches again. */\n clear(): void {\n this.fields.forEach((f) => (f.cmp as any).clear?.());\n void this.search();\n }\n\n /** Fills the quick-search field (`queryField`, default the first filter) without searching. */\n setQuery(text: string): void {\n const name = this.def.queryField ?? this.def.filters?.[0]?.name;\n (this.fields.find((f) => f.cfg.name === name)?.cmp as any)?.setValue?.(text);\n }\n\n getSelection(): Model[] {\n return this.grid.getSelection();\n }\n getGrid(): Grid {\n return this.grid;\n }\n getStore(): Store<any> {\n return this.store;\n }\n override focus(): void {\n (this.fields[0]?.cmp ?? this.grid).focus();\n }\n}\nregister('searchgrid', SearchGrid);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["defs", "registerLookup", "name", "def", "resolveLookup", "lookup", "d", "lookupStore", "textual", "type", "blank", "v", "SearchGrid", "Component", "h", "btns", "Button", "t", "cfg", "_o", "_f", "fieldCfg", "cmp", "create", "f", "b", "Grid", "recs", "c", "field", "query", "specs", "text", "register"]
|
|
7
|
-
}
|
package/dist/chunk-ELYARUCN.js
DELETED
package/dist/chunk-EV73ADN2.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as d}from"./chunk-5Q76ACVI.js";import{a as h}from"./chunk-Z2JBUHKA.js";import{a as l}from"./chunk-W3H7GTJY.js";import{c as r}from"./chunk-4EZJ5FKJ.js";import{b as n}from"./chunk-PZSHOSOS.js";var a=class extends l{baseCls="op-field op-textfield op-picker";items=[];selection;typed=!1;list;dd;triggerEl;idEl;wrapEl;buffer="";bufferTimer;editable(){return!0}hasTrigger(){return!0}onType(t){}toItem(t){if(typeof t!="object")return{value:t,label:String(t)};let e=this.config.valueField??"value",i=this.config.displayField??"label";return{value:t[e],label:String(t[i]??t[e]??""),disabled:!!t.disabled,raw:t,hint:this.config.showValue?String(t[e]):void 0}}loadItems(){let t=this.config;this.items=t.store?t.store.getData().map(e=>this.toItem(e)):(t.options??[]).map(e=>this.toItem(e))}setOptions(t){this.config.options=t,this.loadItems(),this.refreshList(),this.rendered&&this.applyValue(this.value)}setStore(t){this.config.store=t,this.bindStore(),this.loadItems(),this.refreshList()}offStore;bindStore(){this.offStore?.(),this.offStore=this.config.store?.subscribe(()=>{this.loadItems(),this.refreshList(),this.rendered&&this.applyValue(this.value)})}findItem(t){return this.items.find(e=>e.value===t)??(this.selection?.value===t?this.selection:void 0)}getSelection(){return this.selection}setSelection(t,e=!1){this.selection=t,this.setValue(t?t.value:this.emptyValue(),e)}visibleItems(){return this.items}refreshList(){if(!this.list)return;let t=this.visibleItems();this.list.setItems(t),this.list.setSelected(this.value);let e=t.findIndex(i=>i.value===this.value&&!i.disabled);this.list.setActive(this.typed||e<0?t.findIndex(i=>!i.disabled):e),this.syncActive()}syncActive(){if(!this.rendered)return;let t=this.list.getActiveId();t&&this.dd.isOpen()?this.input.setAttribute("aria-activedescendant",t):this.input.removeAttribute("aria-activedescendant")}createControl(){let t=super.createControl(),e=this.input;return this.wrapEl=t,this.config.showValue&&(this.idEl=n("span","op-picker__id"),this.idEl.hidden=!0,t.prepend(this.idEl)),this.list=new d({emptyText:this.config.emptyText,maxHeight:this.config.maxHeight,highlight:""}),e.setAttribute("role","combobox"),e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","false"),e.setAttribute("aria-autocomplete",this.editable()?"list":"none"),e.setAttribute("aria-controls",this.list.id),e.autocomplete="off",this.hasTrigger()&&(this.triggerEl=n("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-hidden":"true"},r("chevron-down")),this.listen(this.triggerEl,"mousedown",i=>i.preventDefault()),this.listen(this.triggerEl,"click",()=>{this.config.disabled||this.config.readonly||(e.focus(),this.toggle())}),t.append(this.triggerEl)),this.dd=new h({anchor:t,content:this.list,matchWidth:!0,role:"presentation"}),this.dd.on("open",()=>{e.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.list.refresh(),this.syncActive(),this.emit("expand")}),this.dd.on("close",()=>{e.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),e.removeAttribute("aria-activedescendant"),this.emit("collapse")}),this.list.on("select",i=>this.pick(i)),this.list.on("active-change",()=>this.syncActive()),this.own(()=>{this.offStore?.(),this.dd.destroy()}),t}onRender(){this.bindStore(),this.loadItems(),super.onRender(),this.editable()?this.config.openOnFocus&&this.listen(this.input,"focus",()=>this.open()):(this.input.readOnly=!0,this.listen(this.input,"click",()=>this.toggle())),this.on("blur",()=>this.settle()),this.refreshList()}onReadonly(t){this.input.readOnly=t||!this.editable(),t&&this.dd?.close()}onDisabled(t){super.onDisabled(t),this.triggerEl&&(this.triggerEl.disabled=t),t&&this.dd?.close()}applyValue(t){let e=this.findItem(t);e?this.selection=e:this.selection&&this.selection.value!==t&&(this.selection=void 0),this.typed=!1,this.input.value=e?e.label:this.display(t),this.el.classList.toggle("has-value",!!this.input.value),this.list?.setSelected(t),this.paintId()}paintId(){let t=this.idEl;if(!t)return;let e=this.selection;t.hidden=!e||this.typed||this.isEmpty(this.value),t.textContent=t.hidden?"":String(e.value),this.wrapEl.style.setProperty("--op-picker-id-width",t.hidden?"0px":`${t.offsetWidth}px`),this.wrapEl.classList.toggle("has-id",!t.hidden)}getDisplayText(){return this.rendered?this.input.value:this.findItem(this.value)?.label??this.display(this.value)}open(){this.config.disabled||this.config.readonly||!this.rendered||(this.typed||this.refreshList(),this.dd.open())}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}pick(t){t.disabled||(this.selection=t,this.typed=!1,this.input.value=t.label,this.el.classList.add("has-value"),this.commit(t.value),this.paintId(),this.close(),this.emit("select",t))}settle(){if(this.close(),!this.editable()||!this.typed)return;this.typed=!1;let t=this.input.value;!t&&this.config.forceSelection!==!1?(this.selection=void 0,this.commit(this.emptyValue())):this.config.forceSelection===!1?(this.selection=void 0,this.commit(t)):this.input.value=this.selection?.label??"",this.el.classList.toggle("has-value",!!this.input.value),this.paintId(),this.refreshList()}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.editable()&&(this.typed=!0,this.paintId(),this.config.forceSelection===!1&&this.commit(this.input.value),this.onType(this.input.value))}onKey(t){let e=this.dd.isOpen();switch(t.key){case"ArrowDown":case"ArrowUp":{if(t.preventDefault(),!e)return this.open();this.list.moveActive(t.key==="ArrowDown"?1:-1);return}case"Enter":e?(t.preventDefault(),this.list.getActive()?this.list.activate():this.close()):super.onKey(t);return;case"Home":case"End":e&&!this.editable()&&(t.preventDefault(),this.list.setActive(t.key==="Home"?this.items.findIndex(i=>!i.disabled):this.items.length-1-[...this.items].reverse().findIndex(i=>!i.disabled)));return;case"Tab":e&&this.typed&&this.config.forceSelection!==!1&&this.list.getActive()&&this.list.activate();return;case" ":this.editable()||(t.preventDefault(),e&&this.list.getActive()?this.list.activate():this.open());return;default:!this.editable()&&t.key.length===1&&!t.ctrlKey&&!t.metaKey&&!t.altKey?this.typeahead(t.key):super.onKey(t)}}typeahead(t){clearTimeout(this.bufferTimer),this.buffer+=t.toLowerCase(),this.bufferTimer=setTimeout(()=>this.buffer="",600),this.own(()=>clearTimeout(this.bufferTimer));let e=this.visibleItems(),i=this.dd.isOpen()?this.list.getActiveIndex():e.findIndex(s=>s.value===this.value),o=[...e.keys()].map((s,p)=>(i+(this.buffer.length>1?0:1)+p)%e.length).find(s=>!e[s].disabled&&e[s].label.toLowerCase().startsWith(this.buffer));o!=null&&(this.dd.isOpen()?this.list.setActive(o):this.pick(e[o]))}setEmptyText(t){this.config.emptyText=t,this.list?.setEmptyText(t)}};export{a};
|
|
2
|
-
//# sourceMappingURL=chunk-EV73ADN2.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/fields/pickerfield/pickerfield.ts"],
|
|
4
|
-
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { ListBox, type ListItem } from '../listbox/listbox';\nimport type { Store } from '../../../data/store';\n\nexport type { ListItem };\nexport type Option = string | number | Record<string, any>;\n\nexport interface PickerConfig<V = unknown> extends TextFieldConfig<V> {\n options?: Option[];\n store?: Store<any>;\n valueField?: string;\n displayField?: string;\n /** Text that does not match an item is discarded on blur. Default true. */\n forceSelection?: boolean;\n emptyText?: string;\n openOnFocus?: boolean;\n maxHeight?: number | string;\n /** Show the record's value (its id) as a badge inside the field and as a hint in every list row. Default false. */\n showValue?: boolean;\n}\n\n/**\n * Shared base of Select, ComboBox and SuggestField: an input that owns a Dropdown with a ListBox,\n * the ARIA combobox wiring and the keyboard model. Subclasses decide what typing does (`onType`)\n * and whether the input is editable.\n */\nexport abstract class PickerField<V = unknown, C extends PickerConfig<V> = PickerConfig<V>> extends TextField<V, C> {\n protected override baseCls = 'op-field op-textfield op-picker';\n protected items: ListItem[] = [];\n protected selection?: ListItem;\n /** The user typed since the last selection/blur; the input text is a search term, not the value's label. */\n protected typed = false;\n protected list!: ListBox;\n protected dd!: Dropdown;\n private triggerEl?: HTMLButtonElement;\n private idEl?: HTMLElement;\n private wrapEl?: HTMLElement;\n private buffer = '';\n private bufferTimer?: ReturnType<typeof setTimeout>;\n\n protected editable(): boolean {\n return true;\n }\n protected hasTrigger(): boolean {\n return true;\n }\n /** Called when the user types in an editable picker. */\n protected onType(_text: string): void {}\n\n // ---- items ---------------------------------------------------------------------------------\n\n protected toItem(o: Option): ListItem {\n if (typeof o !== 'object') return { value: o, label: String(o) };\n const vf = this.config.valueField ?? 'value';\n const df = this.config.displayField ?? 'label';\n return { value: o[vf], label: String(o[df] ?? o[vf] ?? ''), disabled: !!o.disabled, raw: o, hint: this.config.showValue ? String(o[vf]) : undefined };\n }\n\n protected loadItems(): void {\n const c = this.config;\n this.items = c.store ? c.store.getData().map((r) => this.toItem(r)) : (c.options ?? []).map((o) => this.toItem(o));\n }\n\n setOptions(options: Option[]): void {\n this.config.options = options;\n this.loadItems();\n this.refreshList();\n if (this.rendered) this.applyValue(this.value);\n }\n\n setStore(store: Store<any>): void {\n this.config.store = store;\n this.bindStore();\n this.loadItems();\n this.refreshList();\n }\n\n private offStore?: () => void;\n private bindStore(): void {\n this.offStore?.();\n this.offStore = this.config.store?.subscribe(() => {\n this.loadItems();\n this.refreshList();\n if (this.rendered) this.applyValue(this.value);\n });\n }\n\n protected findItem(value: unknown): ListItem | undefined {\n return this.items.find((i) => i.value === value) ?? (this.selection?.value === value ? this.selection : undefined);\n }\n\n getSelection(): ListItem | undefined {\n return this.selection;\n }\n\n /** Selects an item object directly (needed when the list does not contain it, e.g. a remote value). */\n setSelection(item: ListItem | undefined, silent = false): void {\n this.selection = item;\n this.setValue((item ? item.value : this.emptyValue()) as V, silent);\n }\n\n /** The items to display for the current search state. Default: all. */\n protected visibleItems(): ListItem[] {\n return this.items;\n }\n\n protected refreshList(): void {\n if (!this.list) return;\n const shown = this.visibleItems();\n this.list.setItems(shown);\n this.list.setSelected(this.value);\n const sel = shown.findIndex((i) => i.value === this.value && !i.disabled);\n this.list.setActive(this.typed || sel < 0 ? shown.findIndex((i) => !i.disabled) : sel);\n this.syncActive();\n }\n\n private syncActive(): void {\n if (!this.rendered) return;\n const id = this.list.getActiveId();\n if (id && this.dd.isOpen()) this.input.setAttribute('aria-activedescendant', id);\n else this.input.removeAttribute('aria-activedescendant');\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n this.wrapEl = wrap;\n if (this.config.showValue) {\n this.idEl = h('span', 'op-picker__id');\n this.idEl.hidden = true;\n wrap.prepend(this.idEl);\n }\n this.list = new ListBox({ emptyText: this.config.emptyText, maxHeight: this.config.maxHeight, highlight: '' });\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-haspopup', 'listbox');\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-autocomplete', this.editable() ? 'list' : 'none');\n input.setAttribute('aria-controls', this.list.id);\n input.autocomplete = 'off';\n if (this.hasTrigger()) {\n this.triggerEl = h('button', 'op-picker__trigger', { type: 'button', tabindex: -1, 'aria-hidden': 'true' }, iconEl('chevron-down'));\n this.listen(this.triggerEl, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(this.triggerEl, 'click', () => {\n if (this.config.disabled || this.config.readonly) return;\n input.focus();\n this.toggle();\n });\n wrap.append(this.triggerEl);\n }\n this.dd = new Dropdown({ anchor: wrap, content: this.list, matchWidth: true, role: 'presentation' });\n this.dd.on('open', () => {\n input.setAttribute('aria-expanded', 'true');\n this.el.classList.add('is-open');\n this.list.refresh();\n this.syncActive();\n this.emit('expand');\n });\n this.dd.on('close', () => {\n input.setAttribute('aria-expanded', 'false');\n this.el.classList.remove('is-open');\n input.removeAttribute('aria-activedescendant');\n this.emit('collapse');\n });\n this.list.on('select', (item: ListItem) => this.pick(item));\n this.list.on('active-change', () => this.syncActive());\n this.own(() => {\n this.offStore?.();\n this.dd.destroy();\n });\n return wrap;\n }\n\n protected override onRender(): void {\n this.bindStore();\n this.loadItems();\n super.onRender();\n if (!this.editable()) {\n this.input.readOnly = true;\n this.listen(this.input, 'click', () => this.toggle());\n } else if (this.config.openOnFocus) {\n this.listen(this.input, 'focus', () => this.open());\n }\n this.on('blur', () => this.settle());\n this.refreshList();\n }\n\n protected override onReadonly(readonly: boolean): void {\n this.input.readOnly = readonly || !this.editable();\n if (readonly) this.dd?.close();\n }\n protected override onDisabled(disabled: boolean): void {\n super.onDisabled(disabled);\n if (this.triggerEl) this.triggerEl.disabled = disabled;\n if (disabled) this.dd?.close();\n }\n\n protected override applyValue(v: V): void {\n const it = this.findItem(v);\n if (it) this.selection = it;\n else if (this.selection && this.selection.value !== v) this.selection = undefined;\n this.typed = false;\n this.input.value = it ? it.label : this.display(v);\n this.el.classList.toggle('has-value', !!this.input.value);\n this.list?.setSelected(v);\n this.paintId();\n }\n\n /** The id badge (`showValue`): visible while a record is selected, and the input makes room for it. */\n protected paintId(): void {\n const el = this.idEl;\n if (!el) return;\n const sel = this.selection;\n el.hidden = !sel || this.typed || this.isEmpty(this.value);\n el.textContent = el.hidden ? '' : String(sel!.value);\n this.wrapEl!.style.setProperty('--op-picker-id-width', el.hidden ? '0px' : `${el.offsetWidth}px`);\n this.wrapEl!.classList.toggle('has-id', !el.hidden);\n }\n\n override getDisplayText(): string {\n return this.rendered ? this.input.value : (this.findItem(this.value)?.label ?? this.display(this.value));\n }\n\n // ---- behavior ------------------------------------------------------------------------------\n\n open(): void {\n if (this.config.disabled || this.config.readonly || !this.rendered) return;\n if (!this.typed) this.refreshList();\n this.dd.open();\n }\n close(): void {\n this.dd?.close();\n }\n toggle(): void {\n if (this.dd.isOpen()) this.close();\n else this.open();\n }\n expand(): void {\n this.open();\n }\n collapse(): void {\n this.close();\n }\n\n protected pick(item: ListItem): void {\n if (item.disabled) return;\n this.selection = item;\n this.typed = false;\n this.input.value = item.label;\n this.el.classList.add('has-value');\n this.commit(item.value as V);\n this.paintId();\n this.close();\n this.emit('select', item);\n }\n\n /** Called on blur: commits free text or reverts to the selected label. */\n protected settle(): void {\n this.close();\n if (!this.editable() || !this.typed) return;\n this.typed = false;\n const text = this.input.value;\n if (!text && this.config.forceSelection !== false) {\n this.selection = undefined;\n this.commit(this.emptyValue());\n } else if (this.config.forceSelection === false) {\n this.selection = undefined;\n this.commit(text as V);\n } else {\n this.input.value = this.selection?.label ?? '';\n }\n this.el.classList.toggle('has-value', !!this.input.value);\n this.paintId();\n this.refreshList();\n }\n\n protected override onInput(): void {\n this.el.classList.toggle('has-value', !!this.input.value);\n if (!this.editable()) return;\n this.typed = true;\n this.paintId();\n if (this.config.forceSelection === false) this.commit(this.input.value as V);\n this.onType(this.input.value);\n }\n\n protected override onKey(e: KeyboardEvent): void {\n const open = this.dd.isOpen();\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp': {\n e.preventDefault();\n if (!open) return this.open();\n this.list.moveActive(e.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n case 'Enter':\n if (open) {\n e.preventDefault();\n if (this.list.getActive()) this.list.activate();\n else this.close();\n } else super.onKey(e);\n return;\n case 'Home':\n case 'End':\n if (open && !this.editable()) {\n e.preventDefault();\n this.list.setActive(e.key === 'Home' ? this.items.findIndex((i) => !i.disabled) : this.items.length - 1 - [...this.items].reverse().findIndex((i) => !i.disabled));\n }\n return;\n case 'Tab':\n if (open && this.typed && this.config.forceSelection !== false && this.list.getActive()) this.list.activate();\n return;\n case ' ':\n if (!this.editable()) {\n e.preventDefault();\n if (open && this.list.getActive()) this.list.activate();\n else this.open();\n }\n return;\n default:\n if (!this.editable() && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) this.typeahead(e.key);\n else super.onKey(e);\n }\n }\n\n /** Select-style type-ahead: letters jump to the next label that starts with them. */\n private typeahead(ch: string): void {\n clearTimeout(this.bufferTimer);\n this.buffer += ch.toLowerCase();\n this.bufferTimer = setTimeout(() => (this.buffer = ''), 600);\n this.own(() => clearTimeout(this.bufferTimer));\n const list = this.visibleItems();\n const from = this.dd.isOpen() ? this.list.getActiveIndex() : list.findIndex((i) => i.value === this.value);\n const order = [...list.keys()].map((_, k) => (from + (this.buffer.length > 1 ? 0 : 1) + k) % list.length);\n const hit = order.find((i) => !list[i].disabled && list[i].label.toLowerCase().startsWith(this.buffer));\n if (hit == null) return;\n if (this.dd.isOpen()) this.list.setActive(hit);\n else this.pick(list[hit]);\n }\n\n setEmptyText(text: string): void {\n this.config.emptyText = text;\n this.list?.setEmptyText(text);\n }\n}\n"],
|
|
5
|
-
"mappings": "wMA6BO,IAAeA,EAAf,cAA6FC,CAAgB,CAC/F,QAAU,kCACnB,MAAoB,CAAC,EACrB,UAEA,MAAQ,GACR,KACA,GACF,UACA,KACA,OACA,OAAS,GACT,YAEE,UAAoB,CAC5B,MAAO,EACT,CACU,YAAsB,CAC9B,MAAO,EACT,CAEU,OAAOC,EAAqB,CAAC,CAI7B,OAAOC,EAAqB,CACpC,GAAI,OAAOA,GAAM,SAAU,MAAO,CAAE,MAAOA,EAAG,MAAO,OAAOA,CAAC,CAAE,EAC/D,IAAMC,EAAK,KAAK,OAAO,YAAc,QAC/BC,EAAK,KAAK,OAAO,cAAgB,QACvC,MAAO,CAAE,MAAOF,EAAEC,CAAE,EAAG,MAAO,OAAOD,EAAEE,CAAE,GAAKF,EAAEC,CAAE,GAAK,EAAE,EAAG,SAAU,CAAC,CAACD,EAAE,SAAU,IAAKA,EAAG,KAAM,KAAK,OAAO,UAAY,OAAOA,EAAEC,CAAE,CAAC,EAAI,MAAU,CACtJ,CAEU,WAAkB,CAC1B,IAAME,EAAI,KAAK,OACf,KAAK,MAAQA,EAAE,MAAQA,EAAE,MAAM,QAAQ,EAAE,IAAKC,GAAM,KAAK,OAAOA,CAAC,CAAC,GAAKD,EAAE,SAAW,CAAC,GAAG,IAAKH,GAAM,KAAK,OAAOA,CAAC,CAAC,CACnH,CAEA,WAAWK,EAAyB,CAClC,KAAK,OAAO,QAAUA,EACtB,KAAK,UAAU,EACf,KAAK,YAAY,EACb,KAAK,UAAU,KAAK,WAAW,KAAK,KAAK,CAC/C,CAEA,SAASC,EAAyB,CAChC,KAAK,OAAO,MAAQA,EACpB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,CACnB,CAEQ,SACA,WAAkB,CACxB,KAAK,WAAW,EAChB,KAAK,SAAW,KAAK,OAAO,OAAO,UAAU,IAAM,CACjD,KAAK,UAAU,EACf,KAAK,YAAY,EACb,KAAK,UAAU,KAAK,WAAW,KAAK,KAAK,CAC/C,CAAC,CACH,CAEU,SAASC,EAAsC,CACvD,OAAO,KAAK,MAAM,KAAMC,GAAMA,EAAE,QAAUD,CAAK,IAAM,KAAK,WAAW,QAAUA,EAAQ,KAAK,UAAY,OAC1G,CAEA,cAAqC,CACnC,OAAO,KAAK,SACd,CAGA,aAAaE,EAA4BC,EAAS,GAAa,CAC7D,KAAK,UAAYD,EACjB,KAAK,SAAUA,EAAOA,EAAK,MAAQ,KAAK,WAAW,EAASC,CAAM,CACpE,CAGU,cAA2B,CACnC,OAAO,KAAK,KACd,CAEU,aAAoB,CAC5B,GAAI,CAAC,KAAK,KAAM,OAChB,IAAMC,EAAQ,KAAK,aAAa,EAChC,KAAK,KAAK,SAASA,CAAK,EACxB,KAAK,KAAK,YAAY,KAAK,KAAK,EAChC,IAAMC,EAAMD,EAAM,UAAW,GAAM,EAAE,QAAU,KAAK,OAAS,CAAC,EAAE,QAAQ,EACxE,KAAK,KAAK,UAAU,KAAK,OAASC,EAAM,EAAID,EAAM,UAAW,GAAM,CAAC,EAAE,QAAQ,EAAIC,CAAG,EACrF,KAAK,WAAW,CAClB,CAEQ,YAAmB,CACzB,GAAI,CAAC,KAAK,SAAU,OACpB,IAAMC,EAAK,KAAK,KAAK,YAAY,EAC7BA,GAAM,KAAK,GAAG,OAAO,EAAG,KAAK,MAAM,aAAa,wBAAyBA,CAAE,EAC1E,KAAK,MAAM,gBAAgB,uBAAuB,CACzD,CAImB,eAAgB,CACjC,IAAMC,EAAO,MAAM,cAAc,EAC3BC,EAAQ,KAAK,MACnB,YAAK,OAASD,EACV,KAAK,OAAO,YACd,KAAK,KAAOE,EAAE,OAAQ,eAAe,EACrC,KAAK,KAAK,OAAS,GACnBF,EAAK,QAAQ,KAAK,IAAI,GAExB,KAAK,KAAO,IAAIG,EAAQ,CAAE,UAAW,KAAK,OAAO,UAAW,UAAW,KAAK,OAAO,UAAW,UAAW,EAAG,CAAC,EAC7GF,EAAM,aAAa,OAAQ,UAAU,EACrCA,EAAM,aAAa,gBAAiB,SAAS,EAC7CA,EAAM,aAAa,gBAAiB,OAAO,EAC3CA,EAAM,aAAa,oBAAqB,KAAK,SAAS,EAAI,OAAS,MAAM,EACzEA,EAAM,aAAa,gBAAiB,KAAK,KAAK,EAAE,EAChDA,EAAM,aAAe,MACjB,KAAK,WAAW,IAClB,KAAK,UAAYC,EAAE,SAAU,qBAAsB,CAAE,KAAM,SAAU,SAAU,GAAI,cAAe,MAAO,EAAGE,EAAO,cAAc,CAAC,EAClI,KAAK,OAAO,KAAK,UAAW,YAAcC,GAAaA,EAAE,eAAe,CAAC,EACzE,KAAK,OAAO,KAAK,UAAW,QAAS,IAAM,CACrC,KAAK,OAAO,UAAY,KAAK,OAAO,WACxCJ,EAAM,MAAM,EACZ,KAAK,OAAO,EACd,CAAC,EACDD,EAAK,OAAO,KAAK,SAAS,GAE5B,KAAK,GAAK,IAAIM,EAAS,CAAE,OAAQN,EAAM,QAAS,KAAK,KAAM,WAAY,GAAM,KAAM,cAAe,CAAC,EACnG,KAAK,GAAG,GAAG,OAAQ,IAAM,CACvBC,EAAM,aAAa,gBAAiB,MAAM,EAC1C,KAAK,GAAG,UAAU,IAAI,SAAS,EAC/B,KAAK,KAAK,QAAQ,EAClB,KAAK,WAAW,EAChB,KAAK,KAAK,QAAQ,CACpB,CAAC,EACD,KAAK,GAAG,GAAG,QAAS,IAAM,CACxBA,EAAM,aAAa,gBAAiB,OAAO,EAC3C,KAAK,GAAG,UAAU,OAAO,SAAS,EAClCA,EAAM,gBAAgB,uBAAuB,EAC7C,KAAK,KAAK,UAAU,CACtB,CAAC,EACD,KAAK,KAAK,GAAG,SAAWN,GAAmB,KAAK,KAAKA,CAAI,CAAC,EAC1D,KAAK,KAAK,GAAG,gBAAiB,IAAM,KAAK,WAAW,CAAC,EACrD,KAAK,IAAI,IAAM,CACb,KAAK,WAAW,EAChB,KAAK,GAAG,QAAQ,CAClB,CAAC,EACMK,CACT,CAEmB,UAAiB,CAClC,KAAK,UAAU,EACf,KAAK,UAAU,EACf,MAAM,SAAS,EACV,KAAK,SAAS,EAGR,KAAK,OAAO,aACrB,KAAK,OAAO,KAAK,MAAO,QAAS,IAAM,KAAK,KAAK,CAAC,GAHlD,KAAK,MAAM,SAAW,GACtB,KAAK,OAAO,KAAK,MAAO,QAAS,IAAM,KAAK,OAAO,CAAC,GAItD,KAAK,GAAG,OAAQ,IAAM,KAAK,OAAO,CAAC,EACnC,KAAK,YAAY,CACnB,CAEmB,WAAWO,EAAyB,CACrD,KAAK,MAAM,SAAWA,GAAY,CAAC,KAAK,SAAS,EAC7CA,GAAU,KAAK,IAAI,MAAM,CAC/B,CACmB,WAAWC,EAAyB,CACrD,MAAM,WAAWA,CAAQ,EACrB,KAAK,YAAW,KAAK,UAAU,SAAWA,GAC1CA,GAAU,KAAK,IAAI,MAAM,CAC/B,CAEmB,WAAWC,EAAY,CACxC,IAAMC,EAAK,KAAK,SAASD,CAAC,EACtBC,EAAI,KAAK,UAAYA,EAChB,KAAK,WAAa,KAAK,UAAU,QAAUD,IAAG,KAAK,UAAY,QACxE,KAAK,MAAQ,GACb,KAAK,MAAM,MAAQC,EAAKA,EAAG,MAAQ,KAAK,QAAQD,CAAC,EACjD,KAAK,GAAG,UAAU,OAAO,YAAa,CAAC,CAAC,KAAK,MAAM,KAAK,EACxD,KAAK,MAAM,YAAYA,CAAC,EACxB,KAAK,QAAQ,CACf,CAGU,SAAgB,CACxB,IAAME,EAAK,KAAK,KAChB,GAAI,CAACA,EAAI,OACT,IAAMb,EAAM,KAAK,UACjBa,EAAG,OAAS,CAACb,GAAO,KAAK,OAAS,KAAK,QAAQ,KAAK,KAAK,EACzDa,EAAG,YAAcA,EAAG,OAAS,GAAK,OAAOb,EAAK,KAAK,EACnD,KAAK,OAAQ,MAAM,YAAY,uBAAwBa,EAAG,OAAS,MAAQ,GAAGA,EAAG,WAAW,IAAI,EAChG,KAAK,OAAQ,UAAU,OAAO,SAAU,CAACA,EAAG,MAAM,CACpD,CAES,gBAAyB,CAChC,OAAO,KAAK,SAAW,KAAK,MAAM,MAAS,KAAK,SAAS,KAAK,KAAK,GAAG,OAAS,KAAK,QAAQ,KAAK,KAAK,CACxG,CAIA,MAAa,CACP,KAAK,OAAO,UAAY,KAAK,OAAO,UAAY,CAAC,KAAK,WACrD,KAAK,OAAO,KAAK,YAAY,EAClC,KAAK,GAAG,KAAK,EACf,CACA,OAAc,CACZ,KAAK,IAAI,MAAM,CACjB,CACA,QAAe,CACT,KAAK,GAAG,OAAO,EAAG,KAAK,MAAM,EAC5B,KAAK,KAAK,CACjB,CACA,QAAe,CACb,KAAK,KAAK,CACZ,CACA,UAAiB,CACf,KAAK,MAAM,CACb,CAEU,KAAKhB,EAAsB,CAC/BA,EAAK,WACT,KAAK,UAAYA,EACjB,KAAK,MAAQ,GACb,KAAK,MAAM,MAAQA,EAAK,MACxB,KAAK,GAAG,UAAU,IAAI,WAAW,EACjC,KAAK,OAAOA,EAAK,KAAU,EAC3B,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,KAAK,SAAUA,CAAI,EAC1B,CAGU,QAAe,CAEvB,GADA,KAAK,MAAM,EACP,CAAC,KAAK,SAAS,GAAK,CAAC,KAAK,MAAO,OACrC,KAAK,MAAQ,GACb,IAAMiB,EAAO,KAAK,MAAM,MACpB,CAACA,GAAQ,KAAK,OAAO,iBAAmB,IAC1C,KAAK,UAAY,OACjB,KAAK,OAAO,KAAK,WAAW,CAAC,GACpB,KAAK,OAAO,iBAAmB,IACxC,KAAK,UAAY,OACjB,KAAK,OAAOA,CAAS,GAErB,KAAK,MAAM,MAAQ,KAAK,WAAW,OAAS,GAE9C,KAAK,GAAG,UAAU,OAAO,YAAa,CAAC,CAAC,KAAK,MAAM,KAAK,EACxD,KAAK,QAAQ,EACb,KAAK,YAAY,CACnB,CAEmB,SAAgB,CACjC,KAAK,GAAG,UAAU,OAAO,YAAa,CAAC,CAAC,KAAK,MAAM,KAAK,EACnD,KAAK,SAAS,IACnB,KAAK,MAAQ,GACb,KAAK,QAAQ,EACT,KAAK,OAAO,iBAAmB,IAAO,KAAK,OAAO,KAAK,MAAM,KAAU,EAC3E,KAAK,OAAO,KAAK,MAAM,KAAK,EAC9B,CAEmB,MAAMP,EAAwB,CAC/C,IAAMQ,EAAO,KAAK,GAAG,OAAO,EAC5B,OAAQR,EAAE,IAAK,CACb,IAAK,YACL,IAAK,UAAW,CAEd,GADAA,EAAE,eAAe,EACb,CAACQ,EAAM,OAAO,KAAK,KAAK,EAC5B,KAAK,KAAK,WAAWR,EAAE,MAAQ,YAAc,EAAI,EAAE,EACnD,MACF,CACA,IAAK,QACCQ,GACFR,EAAE,eAAe,EACb,KAAK,KAAK,UAAU,EAAG,KAAK,KAAK,SAAS,EACzC,KAAK,MAAM,GACX,MAAM,MAAMA,CAAC,EACpB,OACF,IAAK,OACL,IAAK,MACCQ,GAAQ,CAAC,KAAK,SAAS,IACzBR,EAAE,eAAe,EACjB,KAAK,KAAK,UAAUA,EAAE,MAAQ,OAAS,KAAK,MAAM,UAAW,GAAM,CAAC,EAAE,QAAQ,EAAI,KAAK,MAAM,OAAS,EAAI,CAAC,GAAG,KAAK,KAAK,EAAE,QAAQ,EAAE,UAAW,GAAM,CAAC,EAAE,QAAQ,CAAC,GAEnK,OACF,IAAK,MACCQ,GAAQ,KAAK,OAAS,KAAK,OAAO,iBAAmB,IAAS,KAAK,KAAK,UAAU,GAAG,KAAK,KAAK,SAAS,EAC5G,OACF,IAAK,IACE,KAAK,SAAS,IACjBR,EAAE,eAAe,EACbQ,GAAQ,KAAK,KAAK,UAAU,EAAG,KAAK,KAAK,SAAS,EACjD,KAAK,KAAK,GAEjB,OACF,QACM,CAAC,KAAK,SAAS,GAAKR,EAAE,IAAI,SAAW,GAAK,CAACA,EAAE,SAAW,CAACA,EAAE,SAAW,CAACA,EAAE,OAAQ,KAAK,UAAUA,EAAE,GAAG,EACpG,MAAM,MAAMA,CAAC,CACtB,CACF,CAGQ,UAAUS,EAAkB,CAClC,aAAa,KAAK,WAAW,EAC7B,KAAK,QAAUA,EAAG,YAAY,EAC9B,KAAK,YAAc,WAAW,IAAO,KAAK,OAAS,GAAK,GAAG,EAC3D,KAAK,IAAI,IAAM,aAAa,KAAK,WAAW,CAAC,EAC7C,IAAMC,EAAO,KAAK,aAAa,EACzBC,EAAO,KAAK,GAAG,OAAO,EAAI,KAAK,KAAK,eAAe,EAAID,EAAK,UAAWrB,GAAMA,EAAE,QAAU,KAAK,KAAK,EAEnGuB,EADQ,CAAC,GAAGF,EAAK,KAAK,CAAC,EAAE,IAAI,CAACG,EAAGC,KAAOH,GAAQ,KAAK,OAAO,OAAS,EAAI,EAAI,GAAKG,GAAKJ,EAAK,MAAM,EACtF,KAAMrB,GAAM,CAACqB,EAAKrB,CAAC,EAAE,UAAYqB,EAAKrB,CAAC,EAAE,MAAM,YAAY,EAAE,WAAW,KAAK,MAAM,CAAC,EAClGuB,GAAO,OACP,KAAK,GAAG,OAAO,EAAG,KAAK,KAAK,UAAUA,CAAG,EACxC,KAAK,KAAKF,EAAKE,CAAG,CAAC,EAC1B,CAEA,aAAaL,EAAoB,CAC/B,KAAK,OAAO,UAAYA,EACxB,KAAK,MAAM,aAAaA,CAAI,CAC9B,CACF",
|
|
6
|
-
"names": ["PickerField", "TextField", "_text", "o", "vf", "df", "c", "r", "options", "store", "value", "i", "item", "silent", "shown", "sel", "id", "wrap", "input", "h", "ListBox", "iconEl", "e", "Dropdown", "readonly", "disabled", "v", "it", "el", "text", "open", "ch", "list", "from", "hit", "_", "k"]
|
|
7
|
-
}
|
package/dist/chunk-GD5JGKM7.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as u}from"./chunk-W2BAFOCN.js";import{c}from"./chunk-4EZJ5FKJ.js";import{a as m}from"./chunk-A2NKDOYN.js";import{b as a}from"./chunk-PZSHOSOS.js";import{a as f}from"./chunk-TIPK3SCJ.js";var p=class extends m{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;flyout;flyoutOf;hoverTimer;onRender(){let e=this.config;this.items=e.items??[],this.active=e.active;let i=t=>t.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&i(s.items)));i(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",t=>{let s=t.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",t=>this.onKey(t)),this.listen(this.root,"pointerover",t=>{let s=t.target.closest(".op-navmenu__item.is-group");this.hoverTimer?.(),!(!this.config.collapsed||!s||s.dataset.id===this.flyoutOf)&&(this.hoverTimer=this.later(()=>this.openFlyout(s.dataset.id,!1),200))}),this.listen(this.root,"pointerleave",()=>this.hoverTimer?.()),this.own(()=>this.flyout?.destroy()),this.listen(this.root,"focusin",t=>{let s=t.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,i=this.items){for(let t of i){if(t.id===e)return t;let s=t.items&&this.getItem(e,t.items);if(s)return s}}parentsOf(e,i=this.items,t=[]){for(let s of i){if(s.id===e)return t;let n=s.items&&this.parentsOf(e,s.items,[...t,s]);if(n)return n}}openParents(e){for(let i of this.parentsOf(e)??[])this.open.add(i.id)}matches(e,i){return e.text.toLowerCase().includes(i)||!!e.items?.some(t=>this.matches(t,i))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(i=>this.visible(i))}isOpen(e){return this.config.collapsed?!1:this.query?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(t=>this.visible(t)).map(t=>this.node(t,1)));let i=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(t=>t.tabIndex=t===i?0:-1)}node(e,i){let t=!!e.items,s=t&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),l=t&&!!this.active&&!!this.parentsOf(this.active)?.some(d=>d.id===e.id),o=n&&t,h=a("div",`op-navmenu__item${t?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${l&&n?" has-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":i,"aria-expanded":t?String(o?this.flyoutOf===e.id:s):null,"aria-current":e.id===this.active?"page":null,"aria-haspopup":o?"menu":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return h.style.setProperty("--_level",String(i-1)),h.append(a("span","op-navmenu__icon",{},e.icon?c(e.icon):o?e.text.charAt(0).toUpperCase():""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&h.append(a("span","op-navmenu__badge",{},String(e.badge))),t&&h.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},c("chevron-down"))),r.append(h),t&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(d=>this.visible(d)).map(d=>this.node(d,i+1)))),r}activate(e){let i=this.getItem(e);if(!(!i||i.disabled)){if(i.items&&this.config.collapsed)return this.openFlyout(e,!0);if(i.items)return this.toggle(e);this.select(e)}}select(e){let i=this.getItem(e);!i||i.disabled||this.emit("before-select",i)===!1||(this.setActive(e),this.emit("select",i))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let i=this.getItem(e);if(!(!i?.items||this.open.has(e))){if(this.config.accordion)for(let t of this.siblings(e))this.open.delete(t.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",i)}}collapse(e){let i=this.getItem(e);!i?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",i))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let i=this.parentsOf(e)??[];return(i.length?i[i.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=i=>i.forEach(t=>t.items&&(this.open.add(t.id),e(t.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=e,this.config.items=e,this.rendered&&this.paint()}updateItem(e,i){let t=this.getItem(e);t&&(Object.assign(t,i),this.rendered&&this.paint())}openFlyout(e,i){let t=this.getItem(e),s=this.root.querySelector(`[data-id="${CSS.escape(e)}"]`);if(!t?.items||!s)return;let n=(r,l)=>r.filter(o=>this.visible(o)).map(o=>({text:o.text,icon:o.icon,badge:o.badge,disabled:o.disabled,group:l?t.text:void 0,items:o.items?n(o.items,!1):void 0,handler:o.items?void 0:()=>this.select(o.id)}));this.flyout||(this.flyout=new u({cls:"op-navmenu__flyout"}),this.flyout.on("hide",()=>{let r=this.flyoutOf;this.flyoutOf=void 0,r&&this.root.querySelector(`[data-id="${CSS.escape(r)}"]`)?.setAttribute("aria-expanded","false")}),this.listen(this.flyout.el,"keydown",r=>r.key==="ArrowLeft"&&!r.target.closest('.op-menu__item[aria-expanded="true"]')&&this.flyout.hide())),this.flyout.hide(),this.flyoutOf=e,this.flyout.setItems(n(t.items,!0)),s.setAttribute("aria-expanded","true"),this.flyout.showBy(s,"right-start",i)}setCollapsed(e){this.config.collapsed=e,e||this.flyout?.hide(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(i=>i.tabIndex=i===e?0:-1),e.focus())}onKey(e){let i=e.target.closest(".op-navmenu__item");if(!i)return;let t=this.rows(),s=t.indexOf(i),n=this.getItem(i.dataset.id),r=i.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(t[s+1]);break;case"ArrowUp":this.focusRow(t[s-1]);break;case"Home":this.focusRow(t[0]);break;case"End":this.focusRow(t[t.length-1]);break;case"ArrowRight":n.items&&this.config.collapsed?this.openFlyout(n.id,!0):n.items&&!r?this.expand(n.id):n.items&&this.focusRow(t[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let o=this.parentsOf(n.id)?.pop();o&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(o.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}if(e.preventDefault(),this.flyout?.el.contains(document.activeElement))return;this.focusId=document.activeElement?.dataset?.id??n.id;let l=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);l&&document.activeElement!==l&&this.focusRow(l)}};f("navmenu",p);export{p as a};
|
|
2
|
-
//# sourceMappingURL=chunk-GD5JGKM7.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/navigation/navmenu/navmenu.ts"],
|
|
4
|
-
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n /** Rail mode: the floating menu of a group, and the group it belongs to. */\n private flyout?: Menu;\n private flyoutOf?: string;\n private hoverTimer?: () => void;\n\n protected override onRender() {\n const c = this.config;\n this.items = c.items ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n // rail: hovering a group's icon opens its menu (after a short pause, so passing over the rail does not)\n this.listen(this.root, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item.is-group');\n this.hoverTimer?.();\n if (!this.config.collapsed || !row || row.dataset.id === this.flyoutOf) return;\n this.hoverTimer = this.later(() => this.openFlyout(row.dataset.id!, false), 200);\n });\n this.listen(this.root, 'pointerleave', () => this.hoverTimer?.());\n this.own(() => this.flyout?.destroy());\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n if (this.config.collapsed) return false; // rail: a group's children live in its floating menu\n return this.query ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const holdsActive = group && !!this.active && !!this.parentsOf(this.active)?.some((p) => p.id === i.id);\n const flying = rail && group;\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${holdsActive && rail ? ' has-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(flying ? this.flyoutOf === i.id : open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-haspopup': flying ? 'menu' : null, 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n // in the rail a group shows its icon (or its initial) and opens a floating menu\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : flying ? i.text.charAt(0).toUpperCase() : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items && this.config.collapsed) return this.openFlyout(id, true);\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = items;\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n /** Rail mode: a group's children in a Menu beside its icon (title as the header, badges kept). */\n private openFlyout(id: string, focus: boolean) {\n const group = this.getItem(id);\n const row = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(id)}\"]`);\n if (!group?.items || !row) return;\n const entries = (list: NavItem[], top: boolean): MenuEntry[] =>\n list.filter((c) => this.visible(c)).map((c) => ({\n text: c.text, icon: c.icon, badge: c.badge, disabled: c.disabled, group: top ? group.text : undefined,\n items: c.items ? entries(c.items, false) : undefined,\n handler: c.items ? undefined : () => this.select(c.id),\n }));\n if (!this.flyout) {\n this.flyout = new Menu({ cls: 'op-navmenu__flyout' });\n this.flyout.on('hide', () => {\n const was = this.flyoutOf;\n this.flyoutOf = undefined;\n if (was) this.root.querySelector(`[data-id=\"${CSS.escape(was)}\"]`)?.setAttribute('aria-expanded', 'false');\n });\n // \u2190 closes it (the Menu only does that for submenus) and gives the focus back to the icon\n this.listen(this.flyout.el, 'keydown', (e: KeyboardEvent) => e.key === 'ArrowLeft' && !(e.target as HTMLElement).closest('.op-menu__item[aria-expanded=\"true\"]') && this.flyout!.hide());\n }\n this.flyout.hide();\n this.flyoutOf = id;\n this.flyout.setItems(entries(group.items, true));\n row.setAttribute('aria-expanded', 'true');\n this.flyout.showBy(row, 'right-start', focus);\n }\n\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!collapsed) this.flyout?.hide();\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && this.config.collapsed) this.openFlyout(item.id, true);\n else if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n if (this.flyout?.el.contains(document.activeElement)) return; // the focus went to the rail's floating menu: leave it there\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["NavMenu", "Component", "c", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "holdsActive", "flying", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "focus", "entries", "top", "Menu", "was", "collapsed", "text", "rows", "item", "parent", "again", "register"]
|
|
7
|
-
}
|
package/dist/chunk-GZ7X34QP.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{f as o}from"./chunk-MW3RWBZ7.js";import{a as i}from"./chunk-4C666HHU.js";var p={};i(p,{email:()=>y,max:()=>x,maxLength:()=>s,min:()=>u,minLength:()=>m,pattern:()=>l,range:()=>g});var n=t=>typeof t=="string"||Array.isArray(t)?t.length:0,m=(t,e)=>r=>n(r)<t?e??o("minLength",{n:t}):!0,s=(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"),u=(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,g=(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-GZ7X34QP.js.map
|
package/dist/chunk-KCEUD232.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as k}from"./chunk-TIPK3SCJ.js";function v(g,o){let n=g.editor;return n&&typeof n=="object"?{...n}:typeof n=="string"?{type:n}:{type:typeof o=="number"?"numberfield":typeof o=="boolean"?"checkbox":"textfield"}}function x(g={}){let o,n,E=(e,t)=>!!e.editor&&(e.editable?.(t)??!0),m=e=>o.getColumns().filter(t=>E(t,e));function p(e){if(!E(e.column,e.record)||o.emit("before-edit",e.record,e.column.field)===!1)return!1;s(!0);let t=e.record.get(e.column.field),r=k({...v(e.column,t),value:t,stableSize:!1,ariaLabel:e.column.header??e.column.field,cls:"op-grid__editor"});return e.el.classList.add("is-editing"),e.el.replaceChildren(r.el),r.notifyMount(),n={cell:e,field:r,old:t},r.focus(),r.el.querySelector("input")?.select(),!0}function s(e){let t=n;if(!t)return!0;if(e&&!t.field.validate())return!1;n=void 0;let r=t.field.getValue();t.field.destroy(),t.cell.el.classList.remove("is-editing");let{record:d,column:c}=t.cell;return e&&!Object.is(r,t.old)?(d.set(c.field,r),o.emit("edit",d,c.field,r,t.old)):(o.refresh(),e||o.emit("edit-cancel",d,c.field)),!0}function C(e){if(!n)return;let t=o.getStore(),r=n.cell.index,d=m(n.cell.record),c=d.indexOf(n.cell.column)+e;for(let f=0;f<500;f++){if(c>=0&&c<d.length){o.scrollToRow(r);let a=o.getCell(r,d[c].field),l=t.getAt(r);return a?{index:r,record:l,column:d[c],el:a}:void 0}r+=e;let u=t.getAt(r);if(!u)return;d=m(u),c=e>0?0:d.length-1}}return{init(e){o=e;let t=e.el,r=t.querySelector("[role=grid]"),d=l=>{let i=e.cellAt(l.target);i&&!(n&&i.el===n.cell.el)&&p(i)},c=l=>{if(n&&n.cell.el.contains(l.target)){if(l.key==="Escape")s(!1);else if(l.key==="Enter"&&!l.shiftKey)s(!0)&&r.focus();else if(l.key==="Tab"){let i=C(l.shiftKey?-1:1);if(!s(!0))return void l.preventDefault();i?p({...i,el:o.getCell(i.index,i.column.field)??i.el}):r.focus()}else return;l.preventDefault(),l.stopPropagation()}else if(l.target===r&&(l.key==="F2"||l.key==="Enter")&&e.getActive()>=0){let i=e.getStore().getAt(e.getActive()),y=m(i)[0],b=y&&e.getCell(e.getActive(),y.field);b&&p({index:e.getActive(),record:i,column:y,el:b})&&(l.preventDefault(),l.stopPropagation())}},f=l=>{if(!n||!n.cell.el.contains(l.target))return;let i=l.relatedTarget;i&&(n.cell.el.contains(i)||i.closest(".op-layer"))||s(!0)},u=t.querySelector(".op-grid__viewport"),a=()=>n&&s(!0);return t.addEventListener(g.trigger==="click"?"click":"dblclick",d),t.addEventListener("keydown",c,!0),t.addEventListener("focusout",f),u.addEventListener("scroll",a,{passive:!0}),()=>{n?.field.destroy(),n=void 0,t.removeEventListener(g.trigger==="click"?"click":"dblclick",d),t.removeEventListener("keydown",c,!0),t.removeEventListener("focusout",f),u.removeEventListener("scroll",a)}}}}export{x as a};
|
|
2
|
-
//# sourceMappingURL=chunk-KCEUD232.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/components/data/cellediting/cellediting.ts"],
|
|
4
|
-
"sourcesContent": ["// Inline cell editing for the Grid, as a plugin: `plugins: [cellEditing()]` and `editor` on the columns to edit.\n// Editors are regular fields created by type (`create({ type })`), so this module imports none of them: with\n// per-component imports, import the field types your columns use (`optikos/components/select`...).\nimport { create } from '../../../core/registry';\nimport type { Field } from '../../../core/field';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { Grid, GridPlugin, GridCell } from '../grid/grid';\n\nexport interface CellEditingOptions {\n /** What starts editing with the pointer: a double click (default) or a single click. F2 and Enter always do. */\n trigger?: 'dblclick' | 'click';\n}\n\ninterface Editing { cell: GridCell; field: Field<any>; old: unknown }\n\n/** The field config for a column's editor: from `editor`, else from the type of the current value. */\nfunction editorConfig(col: Column, value: unknown): Record<string, any> {\n const e = col.editor;\n if (e && typeof e === 'object') return { ...e };\n if (typeof e === 'string') return { type: e };\n return { type: typeof value === 'number' ? 'numberfield' : typeof value === 'boolean' ? 'checkbox' : 'textfield' };\n}\n\n/**\n * Inline editing plugin. Events on the grid: `before-edit(record, field)` (cancelable), `edit(record, field, value, old)`\n * after a valid value was written to the record (`record.set`, so it is marked modified), `edit-cancel(record, field)`.\n */\nexport function cellEditing(options: CellEditingOptions = {}): GridPlugin {\n let grid!: Grid;\n let editing: Editing | undefined;\n\n const editable = (c: Column, rec: Model) => !!c.editor && (c.editable?.(rec) ?? true);\n const editableCols = (rec: Model) => grid.getColumns().filter((c) => editable(c, rec));\n\n function start(cell: GridCell): boolean {\n if (!editable(cell.column, cell.record) || grid.emit('before-edit', cell.record, cell.column.field) === false) return false;\n finish(true);\n const old = cell.record.get(cell.column.field);\n const field = create<Field<any>>({ ...editorConfig(cell.column, old), value: old, stableSize: false, ariaLabel: cell.column.header ?? cell.column.field, cls: 'op-grid__editor' });\n cell.el.classList.add('is-editing');\n cell.el.replaceChildren(field.el);\n field.notifyMount();\n editing = { cell, field, old };\n field.focus();\n field.el.querySelector('input')?.select();\n return true;\n }\n\n /** Commits (or cancels) the current edit. A commit that fails validation keeps the editor open. */\n function finish(commit: boolean): boolean {\n const e = editing;\n if (!e) return true;\n if (commit && !e.field.validate()) return false;\n editing = undefined;\n const value = e.field.getValue();\n e.field.destroy();\n e.cell.el.classList.remove('is-editing');\n const { record, column } = e.cell;\n if (commit && !Object.is(value, e.old)) {\n record.set(column.field, value); // the store re-renders the row\n grid.emit('edit', record, column.field, value, e.old);\n } else {\n grid.refresh(); // puts the cell content back\n if (!commit) grid.emit('edit-cancel', record, column.field);\n }\n return true;\n }\n\n /** The next (or previous) editable cell after the current one, row by row. */\n function step(dir: 1 | -1): GridCell | undefined {\n if (!editing) return;\n const store = grid.getStore();\n let i = editing.cell.index;\n let cols = editableCols(editing.cell.record);\n let c = cols.indexOf(editing.cell.column) + dir;\n for (let guard = 0; guard < 500; guard++) {\n if (c >= 0 && c < cols.length) {\n grid.scrollToRow(i);\n const el = grid.getCell(i, cols[c].field);\n const rec = store.getAt(i)!;\n return el ? { index: i, record: rec, column: cols[c], el } : undefined;\n }\n i += dir;\n const rec = store.getAt(i);\n if (!rec) return;\n cols = editableCols(rec);\n c = dir > 0 ? 0 : cols.length - 1;\n }\n }\n\n return {\n init(g: Grid) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n const onPointer = (ev: Event) => {\n const cell = g.cellAt(ev.target);\n if (cell && !(editing && cell.el === editing.cell.el)) start(cell);\n };\n // capture: these run before the grid's own key handling (Enter would otherwise activate the row)\n const onKey = (ev: KeyboardEvent) => {\n if (editing && editing.cell.el.contains(ev.target as Node)) {\n if (ev.key === 'Escape') finish(false);\n else if (ev.key === 'Enter' && !ev.shiftKey) finish(true) && table.focus();\n else if (ev.key === 'Tab') {\n const next = step(ev.shiftKey ? -1 : 1);\n if (!finish(true)) return void ev.preventDefault();\n if (next) start({ ...next, el: grid.getCell(next.index, next.column.field) ?? next.el });\n else table.focus();\n } else return;\n ev.preventDefault();\n ev.stopPropagation();\n } else if (ev.target === table && (ev.key === 'F2' || ev.key === 'Enter') && g.getActive() >= 0) {\n const rec = g.getStore().getAt(g.getActive())!;\n const col = editableCols(rec)[0];\n const cellEl = col && g.getCell(g.getActive(), col.field);\n if (cellEl && start({ index: g.getActive(), record: rec, column: col, el: cellEl })) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n }\n };\n // leaving the cell commits, unless the focus went into the editor's own popup (a select list, a calendar)\n const onFocusOut = (ev: FocusEvent) => {\n if (!editing || !editing.cell.el.contains(ev.target as Node)) return;\n const to = ev.relatedTarget as HTMLElement | null;\n if (to && (editing.cell.el.contains(to) || to.closest('.op-layer'))) return;\n finish(true);\n };\n const viewport = el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const onScroll = () => editing && finish(true);\n el.addEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.addEventListener('keydown', onKey, true);\n el.addEventListener('focusout', onFocusOut);\n viewport.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n editing?.field.destroy();\n editing = undefined;\n el.removeEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.removeEventListener('keydown', onKey, true);\n el.removeEventListener('focusout', onFocusOut);\n viewport.removeEventListener('scroll', onScroll);\n };\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["editorConfig", "col", "value", "e", "cellEditing", "options", "grid", "editing", "editable", "c", "rec", "editableCols", "start", "cell", "finish", "old", "field", "create", "commit", "record", "column", "step", "dir", "store", "i", "cols", "guard", "el", "g", "table", "onPointer", "ev", "onKey", "next", "cellEl", "onFocusOut", "to", "viewport", "onScroll"]
|
|
7
|
-
}
|
package/dist/chunk-KLLAY2IM.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as m}from"./chunk-4LZZ244E.js";import{a as x}from"./chunk-YHEMA56R.js";import{a as p}from"./chunk-W3H7GTJY.js";import{c}from"./chunk-ZWNQREWS.js";import{d}from"./chunk-4EZJ5FKJ.js";import{f as r}from"./chunk-MW3RWBZ7.js";function s(t){return new Promise(e=>{let a=!1,l=o=>{a||(a=!0,e(o))},i=t.input?new p({value:t.input.value??"",placeholder:t.input.placeholder,validators:t.input.validators,ariaLabel:t.text}):void 0,u=new x({text:t.text,flex:1}),n=new m({title:t.title,cls:"op-messagebox",closeAction:"destroy",mask:t.mask??!1,autoFocus:!!t.input?.autoFocus,items:[new c({layout:{type:"hbox",gap:12,align:"flex-start"},items:[...t.icon?[new d({name:t.icon,cls:"op-messagebox__icon"})]:[],new c({layout:{type:"vbox"},flex:1,items:[u,...i?[i]:[]]})]})],buttons:t.buttons.map(o=>({text:o.text,variant:o.variant??"default",handler:()=>{t.beforeClose?.(o.id,n,i)!==!1&&(l(o.id),n.close())}}))});n.el.setAttribute("role",t.input?"dialog":"alertdialog"),n.el.setAttribute("aria-describedby",u.id),n.on("close",()=>l(t.cancelId??t.buttons[t.buttons.length-1].id));let g=t.buttons.find(o=>o.variant==="primary"||o.variant==="danger");i?.on("enter",()=>n.el.querySelectorAll(".op-panel__footer button")[t.buttons.indexOf(g??t.buttons[0])].click()),n.show(),i||n.el.querySelector(".op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger")?.focus()})}var T={show:s,async alert(t,e={}){await s({text:t,title:e.title,mask:e.mask,icon:e.icon??"info",buttons:[{id:"ok",text:e.okText??r("ok"),variant:"primary"}],cancelId:"ok"})},async confirm(t,e={}){return await s({text:t,title:e.title,mask:e.mask,icon:e.icon??(e.danger?"alert":"info"),buttons:[{id:"cancel",text:e.cancelText??r("cancel")},{id:"ok",text:e.okText??r("ok"),variant:e.danger?"danger":"primary"}],cancelId:"cancel"})==="ok"},async prompt(t,e={}){let a=null;return await s({text:t,title:e.title,mask:e.mask,input:{value:e.value,placeholder:e.placeholder,validators:e.validators,autoFocus:e.autoFocus},buttons:[{id:"cancel",text:e.cancelText??r("cancel")},{id:"ok",text:e.okText??r("ok"),variant:"primary"}],cancelId:"cancel",beforeClose:(i,u,n)=>{if(i==="ok"){if(!n.validate())return!1;a=n.getValue()}}})==="ok"?a:null}};export{T as a};
|
|
2
|
-
//# sourceMappingURL=chunk-KLLAY2IM.js.map
|
package/dist/chunk-LBJSMXLV.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as v}from"./chunk-ZWNQREWS.js";import{a as m}from"./chunk-2ZRNGG2N.js";import{c as u}from"./chunk-4EZJ5FKJ.js";import{a as w}from"./chunk-A2NKDOYN.js";import{b as r}from"./chunk-PZSHOSOS.js";import{a as y}from"./chunk-TIPK3SCJ.js";import{e as p,f as l}from"./chunk-MW3RWBZ7.js";p("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}"});p("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 C=(a,t)=>t.split(".").reduce((e,o)=>e?.[o],a);function A(a,t,e){let o=t.split("."),s=o.pop();o.reduce((i,n)=>i[n]??={},a)[s]=e}var g=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=r("div","op-fieldlist__rows",{role:"group"}),this.emptyEl=r("div","op-fieldlist__empty",{},l("flEmpty")),this.addBtn=r("button","op-fieldlist__add",{type:"button"},u("plus"),r("span","",{},this.config.addText??l("flAdd"))),this.listen(this.addBtn,"click",()=>this.addRow()),this.inputEl=this.addBtn,r("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 w?s.config:s,n={...i,...Array.isArray(i.items)?{items:i.items.map(e)}:{}};return s instanceof w?new s.constructor(n):n},o=new v({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)){let i=s.name?C(t,s.name):void 0;i!==void 0&&s.setValue(i,!0),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&&A(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 n=s.el;n.setAttribute("role","group"),n.setAttribute("aria-label",this.label(i)),n.classList.toggle("is-first",i===0),n.querySelector(":scope > .op-fieldlist__tools")?.remove();let d=(b,f,R,E)=>{let c=r("button","op-fieldlist__tool",{type:"button","data-act":f,"aria-label":l(f,{row:this.label(i)}),"data-op-tip":l(f,{row:this.label(i)})},u(b));return c.disabled=R||!!this.config.disabled||!!this.config.readonly,c.addEventListener("click",E),c},h=r("div","op-fieldlist__tools");return o&&h.append(d("chevron-up","flUp",i===0,()=>this.moveRow(i,i-1)),d("chevron-down","flDown",i===this.rows.length-1,()=>this.moveRow(i,i+1))),h.append(d("trash","flRemove",this.rows.length<=t,()=>this.removeRow(i))),n.append(h),n})),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]):[]}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()}};y("fieldlist",g);export{g as a};
|
|
2
|
-
//# sourceMappingURL=chunk-LBJSMXLV.js.map
|