optikos 0.1.0 → 0.2.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 +118 -0
- package/README.md +13 -11
- package/dist/chunk-23XLG2EM.js +2 -0
- package/dist/{chunk-666O2GKD.js.map → chunk-23XLG2EM.js.map} +1 -1
- package/dist/chunk-27UZFEXD.js +2 -0
- package/dist/chunk-27UZFEXD.js.map +7 -0
- package/dist/chunk-2ZRNGG2N.js +2 -0
- package/dist/chunk-2ZRNGG2N.js.map +7 -0
- package/dist/chunk-2ZUZ5HDL.js +2 -0
- package/dist/chunk-2ZUZ5HDL.js.map +7 -0
- package/dist/chunk-3DBEZGOY.js +2 -0
- package/dist/chunk-3DBEZGOY.js.map +7 -0
- package/dist/chunk-3S24ZRPK.js +2 -0
- package/dist/chunk-3S24ZRPK.js.map +7 -0
- package/dist/chunk-3TAW4AKH.js +2 -0
- package/dist/chunk-3TAW4AKH.js.map +7 -0
- package/dist/chunk-4EZJ5FKJ.js +2 -0
- package/dist/{chunk-IHAYOSBR.js.map → chunk-4EZJ5FKJ.js.map} +1 -1
- package/dist/chunk-4LZZ244E.js +2 -0
- package/dist/chunk-4LZZ244E.js.map +7 -0
- package/dist/chunk-4SYIIX5A.js +2 -0
- package/dist/chunk-4SYIIX5A.js.map +7 -0
- package/dist/chunk-5BC72727.js +2 -0
- package/dist/chunk-5BC72727.js.map +7 -0
- package/dist/chunk-5DJTP53N.js +2 -0
- package/dist/{chunk-ODWPBBVL.js.map → chunk-5DJTP53N.js.map} +1 -1
- package/dist/{chunk-NWTTHDIM.js → chunk-5JEXM5S7.js} +2 -2
- package/dist/chunk-5Q76ACVI.js +2 -0
- package/dist/{chunk-O4DCHALR.js.map → chunk-5Q76ACVI.js.map} +1 -1
- package/dist/chunk-5QUY72FX.js +2 -0
- package/dist/chunk-5QUY72FX.js.map +7 -0
- package/dist/chunk-5YS7OD5E.js +2 -0
- package/dist/{chunk-GZNQPENR.js.map → chunk-5YS7OD5E.js.map} +1 -1
- package/dist/{chunk-NV5AIBQP.js → chunk-6VBK2I5B.js} +2 -2
- package/dist/{chunk-ZYUXCZX7.js → chunk-7KMIFXHZ.js} +2 -2
- package/dist/{chunk-IYPKPLCU.js → chunk-A2NKDOYN.js} +2 -2
- package/dist/chunk-A2NKDOYN.js.map +7 -0
- package/dist/chunk-ATFJ7PNA.js +2 -0
- package/dist/chunk-ATFJ7PNA.js.map +7 -0
- package/dist/chunk-BXYWVRKJ.js +2 -0
- package/dist/chunk-BXYWVRKJ.js.map +7 -0
- package/dist/chunk-CKXS375P.js +2 -0
- package/dist/chunk-CKXS375P.js.map +7 -0
- package/dist/chunk-CUN5QO4T.js +2 -0
- package/dist/{chunk-4DHQKECB.js.map → chunk-CUN5QO4T.js.map} +1 -1
- package/dist/chunk-DBMWS3O5.js +2 -0
- package/dist/chunk-DBMWS3O5.js.map +7 -0
- package/dist/chunk-E4VNLYO2.js +2 -0
- package/dist/chunk-E4VNLYO2.js.map +7 -0
- package/dist/chunk-EDUMAMK4.js +2 -0
- package/dist/chunk-EDUMAMK4.js.map +7 -0
- package/dist/chunk-ELYARUCN.js +2 -0
- package/dist/{chunk-Z25NC4CS.js → chunk-EV73ADN2.js} +2 -2
- package/dist/{chunk-LV6HXFHU.js → chunk-FEHGU6EP.js} +3 -3
- package/dist/chunk-FEHGU6EP.js.map +7 -0
- package/dist/chunk-FHM5NUS4.js +3 -0
- package/dist/chunk-FHM5NUS4.js.map +7 -0
- package/dist/chunk-G2DAD3MQ.js +2 -0
- package/dist/chunk-G2DAD3MQ.js.map +7 -0
- package/dist/chunk-G2KUK6AT.js +2 -0
- package/dist/chunk-GBPLNXMP.js +2 -0
- package/dist/chunk-GBPLNXMP.js.map +7 -0
- package/dist/{chunk-LBCWEWPN.js → chunk-GNU4VOOE.js} +2 -2
- package/dist/{chunk-IW7PK4VS.js → chunk-GZ7X34QP.js} +2 -2
- package/dist/chunk-HOF4JGMQ.js +2 -0
- package/dist/chunk-HOF4JGMQ.js.map +7 -0
- package/dist/chunk-HXDTGP2K.js +2 -0
- package/dist/chunk-HXDTGP2K.js.map +7 -0
- package/dist/{chunk-QEQIJAAB.js → chunk-I4SP6JTU.js} +2 -2
- package/dist/chunk-IHE2MQ3W.js +2 -0
- package/dist/{chunk-OW2ZSMGS.js.map → chunk-IHE2MQ3W.js.map} +1 -1
- package/dist/chunk-II6ITOA6.js +2 -0
- package/dist/chunk-II6ITOA6.js.map +7 -0
- package/dist/chunk-JBLRAM7Z.js +2 -0
- package/dist/{chunk-JZNEB7A7.js.map → chunk-JBLRAM7Z.js.map} +1 -1
- package/dist/{chunk-4SUKNSCY.js → chunk-JI265XFO.js} +2 -2
- package/dist/chunk-JK74QK3M.js +2 -0
- package/dist/chunk-JK74QK3M.js.map +7 -0
- package/dist/chunk-JOFQJGZK.js +2 -0
- package/dist/chunk-JOFQJGZK.js.map +7 -0
- package/dist/chunk-KCEUD232.js +2 -0
- package/dist/chunk-KCEUD232.js.map +7 -0
- package/dist/chunk-KLLAY2IM.js +2 -0
- package/dist/chunk-KLLAY2IM.js.map +7 -0
- package/dist/chunk-LBJSMXLV.js +2 -0
- package/dist/chunk-LBJSMXLV.js.map +7 -0
- package/dist/chunk-LQRFNQ2N.js +2 -0
- package/dist/chunk-LQRFNQ2N.js.map +7 -0
- package/dist/{chunk-NDBFYIL6.js → chunk-LW2WRUVL.js} +2 -2
- package/dist/{chunk-NDBFYIL6.js.map → chunk-LW2WRUVL.js.map} +2 -2
- package/dist/chunk-M242VYZA.js +2 -0
- package/dist/{chunk-XVIC24AW.js.map → chunk-M242VYZA.js.map} +1 -1
- package/dist/chunk-MB3MU6HR.js +2 -0
- package/dist/chunk-MB3MU6HR.js.map +7 -0
- package/dist/chunk-MW3RWBZ7.js +2 -0
- package/dist/chunk-MW3RWBZ7.js.map +7 -0
- package/dist/chunk-NXSTUFS7.js +2 -0
- package/dist/chunk-NXSTUFS7.js.map +7 -0
- package/dist/chunk-OEAXCCVM.js +2 -0
- package/dist/chunk-OEAXCCVM.js.map +7 -0
- package/dist/chunk-OGRFQTXA.js +2 -0
- package/dist/chunk-OGRFQTXA.js.map +7 -0
- package/dist/chunk-REW4LR46.js +2 -0
- package/dist/chunk-REW4LR46.js.map +7 -0
- package/dist/chunk-RNN55473.js +2 -0
- package/dist/chunk-RNN55473.js.map +7 -0
- package/dist/{chunk-6NJW7QFD.js → chunk-SA53QUBF.js} +2 -2
- package/dist/chunk-TIPK3SCJ.js +2 -0
- package/dist/chunk-TIPK3SCJ.js.map +7 -0
- package/dist/{chunk-TBLICXWW.js → chunk-TOLTUOZS.js} +2 -2
- package/dist/{chunk-DXO3UJKL.js → chunk-TZOQWCVH.js} +2 -2
- package/dist/chunk-VF7BGP6L.js +2 -0
- package/dist/chunk-VF7BGP6L.js.map +7 -0
- package/dist/chunk-VU3GIDZ3.js +2 -0
- package/dist/chunk-VU3GIDZ3.js.map +7 -0
- package/dist/{chunk-SNTHW4K2.js → chunk-W3H7GTJY.js} +2 -2
- package/dist/{chunk-ZHVSHDLH.js → chunk-XHOBNSBO.js} +2 -2
- package/dist/chunk-XX2MVWFS.js +4 -0
- package/dist/chunk-XX2MVWFS.js.map +7 -0
- package/dist/chunk-XYZ6VZ5T.js +2 -0
- package/dist/chunk-XYZ6VZ5T.js.map +7 -0
- package/dist/chunk-YBAYEU25.js +2 -0
- package/dist/chunk-YBAYEU25.js.map +7 -0
- package/dist/chunk-YHEMA56R.js +2 -0
- package/dist/{chunk-5GNEFX6F.js.map → chunk-YHEMA56R.js.map} +1 -1
- package/dist/chunk-Z2JBUHKA.js +2 -0
- package/dist/chunk-Z2JBUHKA.js.map +7 -0
- package/dist/{chunk-6O2BXCRN.js → chunk-Z2Z52GFT.js} +2 -2
- package/dist/chunk-ZPPELYNJ.js +2 -0
- package/dist/chunk-ZPPELYNJ.js.map +7 -0
- package/dist/chunk-ZVK4L5GK.js +2 -0
- package/dist/chunk-ZVK4L5GK.js.map +7 -0
- package/dist/chunk-ZWNQREWS.js +2 -0
- package/dist/chunk-ZWNQREWS.js.map +7 -0
- package/dist/components/badge.js +2 -0
- package/dist/components/badge.js.map +7 -0
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/cellediting.js +2 -0
- package/dist/components/cellediting.js.map +7 -0
- package/dist/components/chat.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkboxgroup.js +2 -0
- package/dist/components/checkboxgroup.js.map +7 -0
- package/dist/components/chip.js +2 -0
- package/dist/components/chip.js.map +7 -0
- package/dist/components/codeviewer.js +2 -0
- package/dist/components/codeviewer.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/dial.js +2 -0
- package/dist/components/dial.js.map +7 -0
- package/dist/components/dropdown.js +1 -1
- package/dist/components/fieldgroup.js +2 -0
- package/dist/components/fieldgroup.js.map +7 -0
- package/dist/components/fieldlist.js +2 -0
- package/dist/components/fieldlist.js.map +7 -0
- 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 +2 -0
- package/dist/components/formactions.js.map +7 -0
- package/dist/components/formerrors.js +2 -0
- package/dist/components/formerrors.js.map +7 -0
- package/dist/components/formsection.js +2 -0
- package/dist/components/formsection.js.map +7 -0
- package/dist/components/grid.js +1 -1
- package/dist/components/icon.js +1 -1
- package/dist/components/inputgroup.js +2 -0
- package/dist/components/inputgroup.js.map +7 -0
- package/dist/components/label.js +1 -1
- package/dist/components/listbox.js +1 -1
- package/dist/components/lookupfield.js +1 -1
- package/dist/components/menu.js +1 -1
- package/dist/components/messagebox.js +1 -1
- package/dist/components/navmenu.js +1 -1
- package/dist/components/numberfield.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/panel.js +1 -1
- package/dist/components/pickerfield.js +1 -1
- package/dist/components/radiogroup.js +1 -1
- package/dist/components/searchgrid.js +1 -1
- package/dist/components/secretfield.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/slider.js +1 -1
- package/dist/components/spacer.js +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/stepform.js +1 -1
- package/dist/components/stepper.js +1 -1
- package/dist/components/suggestfield.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/textfield.js +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/toggle.js +2 -0
- package/dist/components/toggle.js.map +7 -0
- package/dist/components/toolbar.js +1 -1
- package/dist/components/tooltip.js +1 -1
- package/dist/components/tree.js +2 -0
- package/dist/components/tree.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/badge.css +39 -0
- package/dist/css/base.css +71 -51
- package/dist/css/button.css +2 -0
- package/dist/css/cellediting.css +33 -0
- package/dist/css/chat.css +0 -1
- package/dist/css/checkboxgroup.css +12 -0
- package/dist/css/chip.css +64 -0
- package/dist/css/codeviewer.css +109 -0
- package/dist/css/dial.css +203 -0
- package/dist/css/fieldgroup.css +26 -0
- package/dist/css/fieldlist.css +84 -0
- package/dist/css/fieldset.css +36 -0
- package/dist/css/formactions.css +40 -0
- package/dist/css/formerrors.css +39 -0
- package/dist/css/formsection.css +45 -0
- package/dist/css/grid.css +14 -3
- package/dist/css/inputgroup.css +58 -0
- package/dist/css/menu.css +45 -0
- package/dist/css/panel.css +8 -1
- package/dist/css/stepper.css +7 -2
- package/dist/css/tabs.css +12 -3
- package/dist/css/toggle.css +39 -0
- package/dist/css/tree.css +94 -0
- package/dist/css/widget.css +58 -0
- package/dist/css/window.css +4 -0
- package/dist/data.js +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +3 -3
- package/dist/optikos.css +1194 -99
- package/dist/themes/dark.css +47 -32
- package/dist/types/components/badge.d.ts +1 -0
- package/dist/types/components/base/badge/badge.d.ts +18 -0
- package/dist/types/components/base/chip/chip.d.ts +27 -0
- package/dist/types/components/base/codeviewer/codeviewer.d.ts +48 -0
- package/dist/types/components/cellediting.d.ts +1 -0
- package/dist/types/components/checkboxgroup.d.ts +1 -0
- package/dist/types/components/chip.d.ts +1 -0
- package/dist/types/components/codeviewer.d.ts +1 -0
- package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
- package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +3 -1
- package/dist/types/components/data/grid/grid.d.ts +42 -16
- package/dist/types/components/data/tree/tree.d.ts +71 -0
- package/dist/types/components/dial.d.ts +1 -0
- package/dist/types/components/fieldgroup.d.ts +1 -0
- package/dist/types/components/fieldlist.d.ts +1 -0
- package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
- package/dist/types/components/fields/dial/dial.d.ts +84 -0
- package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
- package/dist/types/components/form/fieldgroup/fieldgroup.d.ts +33 -0
- package/dist/types/components/form/fieldlist/fieldlist.d.ts +58 -0
- package/dist/types/components/form/form/form.d.ts +19 -2
- package/dist/types/components/form/formactions/formactions.d.ts +34 -0
- package/dist/types/components/form/formerrors/formerrors.d.ts +23 -0
- package/dist/types/components/form/formsection/formsection.d.ts +26 -0
- package/dist/types/components/form/inputgroup/inputgroup.d.ts +28 -0
- package/dist/types/components/form/stepform/stepform.d.ts +2 -0
- package/dist/types/components/formactions.d.ts +1 -0
- package/dist/types/components/formerrors.d.ts +1 -0
- package/dist/types/components/formsection.d.ts +1 -0
- package/dist/types/components/inputgroup.d.ts +1 -0
- package/dist/types/components/layout/fieldset/fieldset.d.ts +9 -0
- package/dist/types/components/layout/panel/panel.d.ts +6 -0
- package/dist/types/components/layout/panel/reload.d.ts +1 -0
- package/dist/types/components/navigation/tabs/tabs.d.ts +8 -0
- package/dist/types/components/overlays/menu/menu.d.ts +15 -0
- package/dist/types/components/overlays/messagebox/messagebox.d.ts +8 -0
- package/dist/types/components/overlays/widget/widget.d.ts +13 -0
- package/dist/types/components/overlays/window/window.d.ts +8 -1
- package/dist/types/components/toggle.d.ts +1 -0
- package/dist/types/components/tree.d.ts +1 -0
- package/dist/types/core/component.d.ts +6 -2
- package/dist/types/core/i18n.d.ts +5 -0
- package/dist/types/core/index.d.ts +1 -1
- package/dist/types/core/position.d.ts +4 -1
- package/dist/types/data/column.d.ts +9 -4
- package/dist/types/index.d.ts +14 -0
- package/dist/types/themes/define.d.ts +4 -3
- package/dist/types/ui/enums.d.ts +0 -6
- package/dist/types/ui/ui.d.ts +12 -3
- package/dist/ui.js +1 -1
- package/package.json +6 -1
- package/dist/chunk-4COBH4QJ.js +0 -2
- package/dist/chunk-4COBH4QJ.js.map +0 -7
- package/dist/chunk-4DHQKECB.js +0 -2
- package/dist/chunk-4Q67QI7J.js +0 -2
- package/dist/chunk-4Q67QI7J.js.map +0 -7
- package/dist/chunk-5AXLYDKU.js +0 -2
- package/dist/chunk-5AXLYDKU.js.map +0 -7
- package/dist/chunk-5GNEFX6F.js +0 -2
- package/dist/chunk-5Q6Y6CM4.js +0 -2
- package/dist/chunk-5Q6Y6CM4.js.map +0 -7
- package/dist/chunk-666O2GKD.js +0 -2
- package/dist/chunk-A66MDXHL.js +0 -2
- package/dist/chunk-A66MDXHL.js.map +0 -7
- package/dist/chunk-ARCW54L2.js +0 -2
- package/dist/chunk-ARCW54L2.js.map +0 -7
- package/dist/chunk-BIYNHKSA.js +0 -2
- package/dist/chunk-BIYNHKSA.js.map +0 -7
- package/dist/chunk-BNPVRIFT.js +0 -2
- package/dist/chunk-BNPVRIFT.js.map +0 -7
- package/dist/chunk-C3N7QTQB.js +0 -2
- package/dist/chunk-C3N7QTQB.js.map +0 -7
- package/dist/chunk-CEXY5A4T.js +0 -2
- package/dist/chunk-CN7USUJR.js +0 -2
- package/dist/chunk-CN7USUJR.js.map +0 -7
- package/dist/chunk-CQRHNTEX.js +0 -2
- package/dist/chunk-CUPAPOKC.js +0 -2
- package/dist/chunk-CUPAPOKC.js.map +0 -7
- package/dist/chunk-GZNQPENR.js +0 -2
- package/dist/chunk-HFFK6K4K.js +0 -2
- package/dist/chunk-HFFK6K4K.js.map +0 -7
- package/dist/chunk-IHAYOSBR.js +0 -2
- package/dist/chunk-IO66A6G5.js +0 -2
- package/dist/chunk-IO66A6G5.js.map +0 -7
- package/dist/chunk-IYPKPLCU.js.map +0 -7
- package/dist/chunk-JTYWZMSZ.js +0 -2
- package/dist/chunk-JTYWZMSZ.js.map +0 -7
- package/dist/chunk-JVEPKW5X.js +0 -2
- package/dist/chunk-JVEPKW5X.js.map +0 -7
- package/dist/chunk-JZNEB7A7.js +0 -2
- package/dist/chunk-K2DGY6MP.js +0 -2
- package/dist/chunk-K2DGY6MP.js.map +0 -7
- package/dist/chunk-LEE2FEEL.js +0 -2
- package/dist/chunk-LEE2FEEL.js.map +0 -7
- package/dist/chunk-LMGCV35W.js +0 -2
- package/dist/chunk-LMGCV35W.js.map +0 -7
- package/dist/chunk-LV6HXFHU.js.map +0 -7
- package/dist/chunk-MA5BJL3S.js +0 -2
- package/dist/chunk-MA5BJL3S.js.map +0 -7
- package/dist/chunk-NHVEP72K.js +0 -2
- package/dist/chunk-NHVEP72K.js.map +0 -7
- package/dist/chunk-O4DCHALR.js +0 -2
- package/dist/chunk-ODWPBBVL.js +0 -2
- package/dist/chunk-OW2ZSMGS.js +0 -2
- package/dist/chunk-PSPQH35P.js +0 -2
- package/dist/chunk-PSPQH35P.js.map +0 -7
- package/dist/chunk-T4OYVG2X.js +0 -2
- package/dist/chunk-T4OYVG2X.js.map +0 -7
- package/dist/chunk-TK2RC3T5.js +0 -2
- package/dist/chunk-TK2RC3T5.js.map +0 -7
- package/dist/chunk-U3X2FW6U.js +0 -2
- package/dist/chunk-U3X2FW6U.js.map +0 -7
- package/dist/chunk-UPOBGNJ5.js +0 -2
- package/dist/chunk-UPOBGNJ5.js.map +0 -7
- package/dist/chunk-XVIC24AW.js +0 -2
- package/dist/chunk-XZ5CUZZP.js +0 -2
- package/dist/chunk-XZ5CUZZP.js.map +0 -7
- package/dist/chunk-XZEOSW3Q.js +0 -2
- package/dist/chunk-XZEOSW3Q.js.map +0 -7
- package/dist/chunk-YET5PM6F.js +0 -2
- package/dist/chunk-YET5PM6F.js.map +0 -7
- package/dist/chunk-ZCAAM4NH.js +0 -2
- package/dist/chunk-ZCAAM4NH.js.map +0 -7
- package/dist/themes/brand.css +0 -240
- package/dist/themes/brutal.css +0 -100
- package/dist/themes/corporate.css +0 -112
- package/dist/themes/editorial.css +0 -110
- package/dist/themes/soft.css +0 -101
- package/dist/themes/terminal.css +0 -91
- /package/dist/{chunk-NWTTHDIM.js.map → chunk-5JEXM5S7.js.map} +0 -0
- /package/dist/{chunk-NV5AIBQP.js.map → chunk-6VBK2I5B.js.map} +0 -0
- /package/dist/{chunk-ZYUXCZX7.js.map → chunk-7KMIFXHZ.js.map} +0 -0
- /package/dist/{chunk-CEXY5A4T.js.map → chunk-ELYARUCN.js.map} +0 -0
- /package/dist/{chunk-Z25NC4CS.js.map → chunk-EV73ADN2.js.map} +0 -0
- /package/dist/{chunk-CQRHNTEX.js.map → chunk-G2KUK6AT.js.map} +0 -0
- /package/dist/{chunk-LBCWEWPN.js.map → chunk-GNU4VOOE.js.map} +0 -0
- /package/dist/{chunk-IW7PK4VS.js.map → chunk-GZ7X34QP.js.map} +0 -0
- /package/dist/{chunk-QEQIJAAB.js.map → chunk-I4SP6JTU.js.map} +0 -0
- /package/dist/{chunk-4SUKNSCY.js.map → chunk-JI265XFO.js.map} +0 -0
- /package/dist/{chunk-6NJW7QFD.js.map → chunk-SA53QUBF.js.map} +0 -0
- /package/dist/{chunk-TBLICXWW.js.map → chunk-TOLTUOZS.js.map} +0 -0
- /package/dist/{chunk-DXO3UJKL.js.map → chunk-TZOQWCVH.js.map} +0 -0
- /package/dist/{chunk-SNTHW4K2.js.map → chunk-W3H7GTJY.js.map} +0 -0
- /package/dist/{chunk-ZHVSHDLH.js.map → chunk-XHOBNSBO.js.map} +0 -0
- /package/dist/{chunk-6O2BXCRN.js.map → chunk-Z2Z52GFT.js.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as R}from"./chunk-ZVK4L5GK.js";import{a as z}from"./chunk-FHM5NUS4.js";import{a as H}from"./chunk-Z2JBUHKA.js";import{a as k}from"./chunk-W3H7GTJY.js";import{a as T,b as E}from"./chunk-OWEQT2HN.js";import{c as A}from"./chunk-LW2WRUVL.js";import{c as x}from"./chunk-OEAXCCVM.js";import{a as v}from"./chunk-2ZUZ5HDL.js";import{c as C}from"./chunk-4EZJ5FKJ.js";import{a as M}from"./chunk-A2NKDOYN.js";import{b as d}from"./chunk-PZSHOSOS.js";import{a as S}from"./chunk-TIPK3SCJ.js";import{e as y,f as u}from"./chunk-MW3RWBZ7.js";y("en",{gridSelected:"{n} selected",gridSelectAll:"Select all {n}",gridClearSel:"Clear selection",gridSelectRow:"Select row",gridSelectPage:"Select all rows",gridRowActions:"Row actions",gridColumns:"Columns",gridResize:"Resize column",gridGroupAll:"All",gridOtherCols:"Other",gridGroups:"Column groups",gridColumnSearch:"Search columns",gridNoColumns:"No matching columns"});y("pt-BR",{gridSelected:"{n} selecionado(s)",gridSelectAll:"Selecionar todos os {n}",gridClearSel:"Limpar sele\xE7\xE3o",gridSelectRow:"Selecionar linha",gridSelectPage:"Selecionar todas as linhas",gridRowActions:"A\xE7\xF5es da linha",gridColumns:"Colunas",gridResize:"Redimensionar coluna",gridGroupAll:"Todas",gridOtherCols:"Outras",gridGroups:"Grupos de colunas",gridColumnSearch:"Buscar colunas",gridNoColumns:"Nenhuma coluna encontrada"});var f="__select",p="__actions",D={field:f,width:44,align:"center",cls:"op-grid__selcell"},K={field:p,width:44,align:"center",cls:"op-grid__actcell"},$="var(--op-grid-row-height, var(--op-row-height))",L=class extends M{baseCls="op-grid";store;offStore;headEl;headRow;viewport;emptyEl;table;pager;v;selected=new Set;active=-1;anchor=-1;justDragged=!1;cv=0;selAll;barEl;bulkEl;bulkCount;bulkBtns=[];selectAllBtn;rowMenu;colDd;colList;colSearch;colChips;colGroup="";cols(){let e=this.config;return[...e.checkboxSelection?[D]:[],...this.userCols(),...e.rowActions?.length?[K]:[]]}userCols(){return(this.config.columns??[]).filter(e=>!e.hidden)}visibleActions(){return this.config.rowActionsMode==="visible"&&!!this.config.rowActions?.length}mode(){return this.config.checkboxSelection?"multi":this.config.selection??"single"}build(){let e=this.config,i=d("div",this.baseCls);return this.headRow=d("div","op-grid__row op-grid__header-row",{role:"row"}),this.headEl=d("div","op-grid__header",{},this.headRow),this.viewport=d("div","op-grid__viewport"),this.emptyEl=d("div","op-grid__empty"),(e.columnMenu||e.bulkActions?.length)&&(this.bulkEl=d("div","op-grid__bulk"),this.bulkEl.hidden=!0,this.barEl=d("div","op-grid__bar",{},this.bulkEl),i.append(this.barEl)),this.table=d("div","op-grid__table",{role:"grid",tabindex:0,"aria-multiselectable":e.selection==="multi"||e.checkboxSelection?"true":null},this.headEl,this.viewport,this.emptyEl),i.append(this.table),i.classList.toggle("op-grid--striped",!!e.striped),e.paging&&(this.pager=new R({cls:"op-grid__pager"}),i.append(this.pager.el)),i}onRender(){let e=this.config;if(this.bindStore(e.store??new x({data:e.data??[]})),this.buildHeader(),this.buildBar(),this.v=T({scroller:this.viewport,count:this.store.count,rowHeight:e.rowHeight??(E(this.el,$)||36),render:(i,t)=>this.renderRow(i,t),rowCls:"op-grid__row op-grid__body-row"}),this.own(()=>this.v.destroy()),this.sync(),this.listen(this.viewport,"scroll",()=>this.headEl.scrollLeft=this.viewport.scrollLeft,{passive:!0}),this.listen(this.viewport,"click",i=>this.onRowEvent(i,"row-click")),this.listen(this.viewport,"dblclick",i=>this.onRowEvent(i,"row-dblclick")),this.listen(this.el,"keydown",i=>this.onKey(i)),this.listen(this.headRow,"change",i=>{i.target===this.selAll&&(this.selAll.checked?this.store.each(t=>this.selected.add(t)):this.config.keepSelection?this.store.each(t=>this.selected.delete(t)):this.selected.clear(),this.changed())}),e.reorderableColumns&&this.initColumnDrag(),e.resizableColumns&&this.initColumnResize(),this.listen(this.headRow,"click",i=>{if(this.justDragged||i.target.closest(".op-grid__resizer"))return;let t=i.target.closest("[data-field]"),s=t&&this.userCols().find(n=>n.field===t.dataset.field);s&&(this.emit("column-click",s),s.sortable&&this.sortBy(s))}),typeof ResizeObserver<"u"){let i=new ResizeObserver(()=>this.layout());i.observe(this.viewport),this.own(()=>i.disconnect())}this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(e.pageSize??20)),this.own(()=>this.pager?.destroy());for(let i of e.plugins??[]){let t=i.init(this);t&&this.own(t),i.destroy&&this.own(()=>i.destroy())}}cellAt(e){let i=e?.closest?.(".op-grid__body-row .op-grid__cell"),t=Number(i?.parentElement?.dataset.i),s=i&&this.cols()[Number(i.getAttribute("aria-colindex"))-1],n=i&&this.store.getAt(t);return s&&n&&![f,p].includes(s.field)?{index:t,record:n,column:s,el:i}:void 0}getCell(e,i){let t=this.cols().findIndex(s=>s.field===i);return document.getElementById(`${this.id}-r${e}`)?.querySelector(`[aria-colindex="${t+1}"]`)??void 0}getColumns(){return this.userCols()}getActive(){return this.active}notifyMount(){super.notifyMount(),this.layout(),this.pager?.notifyMount()}layout(){if(this.rendered){if(!this.config.rowHeight){let e=E(this.el,$);e&&this.v.setRowHeight(e)}this.headEl.style.paddingInlineEnd=`${this.viewport.offsetWidth-this.viewport.clientWidth}px`,this.v.refresh()}}bindStore(e){this.offStore?.(),this.store=e;let i=e.subscribe(s=>{this.rendered&&(this.sync(),s.type==="sort"&&this.paintSort())}),t=e.on("loading",s=>this.setLoading(s));this.offStore=()=>(i(),t()),this.own(()=>this.offStore?.())}sync(){let e=this.selected.size;if(!this.config.keepSelection)for(let i of this.selected)this.store.indexOf(i)<0&&this.selected.delete(i);this.active=Math.min(this.active,this.store.count-1),this.v.setCount(this.store.count),this.table.setAttribute("aria-rowcount",String(this.store.totalCount+1)),this.emptyEl.textContent=this.config.emptyText??u("empty"),this.emptyEl.hidden=this.store.count>0||!!this.config.loading,this.el.classList.toggle("is-empty",this.store.count===0),this.updateActiveDescendant(),this.paintSelection(),this.selected.size!==e&&this.emit("select",this.getSelection())}setStore(e){this.config.store=e,this.selected.clear(),this.active=this.anchor=-1,this.rendered&&(this.bindStore(e),this.pager?.setStore(e),this.paintSort(),this.sync())}getStore(){return this.render(),this.store}layoutColumns(){let e=this.cols(),i=this.visibleActions()?this.config.rowActions.length:1,t=n=>n.field===p?`calc(${i} * var(--op-grid-action-size) + ${i+1} * var(--op-grid-action-gap))`:`${n.width}px`,s=e.map(n=>n.field===p?t(n):n.width?`${n.width}px`:`minmax(${n.minWidth??96}px, ${n.flex??1}fr)`).join(" ");this.el.style.setProperty("--op-grid-cols",s),this.el.style.setProperty("--op-grid-min-width",`${e.reduce((n,o)=>n+(o.field===p?i*36:o.width??o.minWidth??96),0)}px`)}buildHeader(){let e=this.cols();this.layoutColumns(),this.el.classList.toggle("op-grid--actions-visible",this.visibleActions()),this.el.classList.toggle("op-grid--reorderable",!!this.config.reorderableColumns),this.el.classList.toggle("op-grid--resizable",!!this.config.resizableColumns),this.table.setAttribute("aria-colcount",String(e.length)),this.selAll=void 0,this.headRow.replaceChildren(...e.map((t,s)=>{let n=t.header??t.field,o=d("div",`op-grid__cell op-grid__hcell${t.align?` op-grid__cell--${t.align}`:""}${t.sortable?" is-sortable":""}`,{role:"columnheader","aria-colindex":s+1,"data-field":t.field});t.field===f?o.append(this.selAll=d("input","op-grid__check",{type:"checkbox","aria-label":u("gridSelectPage")})):t.field===p?o.append(d("span","op-sr-only",{},u("gridRowActions"))):t.sortable?o.append(d("button","op-grid__sort",{type:"button"},d("span","op-grid__label",{},n),d("span","op-grid__arrow",{"aria-hidden":"true"},C("arrow-up")))):o.append(d("span","op-grid__label",{},n));let r=t.field!==f&&t.field!==p;return this.config.reorderableColumns&&r&&o.classList.add("is-reorderable"),this.canResize(t)&&o.append(d("span","op-grid__resizer",{role:"separator","aria-orientation":"vertical","aria-label":`${u("gridResize")} ${n}`})),r&&!t.sortable&&(this.config.reorderableColumns||this.canResize(t))&&(o.tabIndex=0),o}));let i=this.groupBand(e);this.headEl.replaceChildren(...i?[i]:[],this.headRow),this.paintSort()}groupBand(e){if(this.config.groupHeaders===!1||!e.some(s=>s.group))return null;let i=[],t=0;for(;t<e.length;){let s=e[t].group??"",n=1;for(;t+n<e.length&&(e[t+n].group??"")===s;)n++;let o=d("div",`op-grid__gcell${s?"":" is-empty"}`,{role:"columnheader","aria-colindex":t+1,"aria-colspan":n},s);o.style.gridColumn=`span ${n}`,i.push(o),t+=n}return d("div","op-grid__row op-grid__group-row",{role:"row"},...i)}getColumnGroups(){return[...new Set(this.config.columns.map(e=>e.group).filter(e=>!!e))]}setColumnGroupVisible(e,i){let t=this.config.columns.filter(s=>(s.group??"")===e);if(t.length){for(let s of t)s.hidden=!i;this.config.columns.some(s=>!s.hidden)||(t[0].hidden=!1),this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}}setColumns(e){this.config.columns=e,this.rendered&&(this.cv++,this.buildHeader(),this.paintSelection(),this.v.refresh())}getColumnState(){return this.config.columns.map(e=>({field:e.field,hidden:!!e.hidden,width:e.width}))}setColumnState(e){let i=new Map(this.config.columns.map(s=>[s.field,s])),t=e.flatMap(s=>{let n=i.get(s.field);return i.delete(s.field),n?[{...n,hidden:s.hidden,width:s.width??n.width}]:[]});this.setColumns([...t,...i.values()]),this.emit("columns-change",this.getColumnState())}canResize(e){return!!this.config.resizableColumns&&e.field!==f&&e.field!==p&&e.resizable!==!1}setColumnWidth(e,i){let t=this.config.columns.find(s=>s.field===e);t&&(t.width=i==null?void 0:Math.round(Math.max(t.minWidth??48,Math.min(i,t.maxWidth??1/0))),this.layoutColumns(),this.emit("column-resize",e,t.width),this.emit("columns-change",this.getColumnState()))}initColumnResize(){let e=this.headRow;this.listen(e,"pointerdown",i=>{let t=i.target.closest(".op-grid__resizer");if(!t||i.button)return;i.preventDefault();let s=t.parentElement,n=s.dataset.field,o=this.config.columns.find(g=>g.field===n),r=i.clientX,l=s.getBoundingClientRect().width||o.width||96;this.el.classList.add("is-resizing");let h=o.width,c=g=>{let m=Math.round(Math.max(o.minWidth??48,Math.min(l+(g.clientX-r)*(this.dir()==="rtl"?-1:1),o.maxWidth??1/0)));o.width=h=m,this.layoutColumns()},a=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a),this.el.classList.remove("is-resizing"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),h!==void 0&&(this.emit("column-resize",n,h),this.emit("columns-change",this.getColumnState()))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",a),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a)))}),this.listen(e,"dblclick",i=>{let t=i.target.closest(".op-grid__resizer");t&&this.setColumnWidth(t.parentElement.dataset.field,void 0)}),this.listen(e,"keydown",i=>{if(!(i.altKey&&i.shiftKey)||i.key!=="ArrowLeft"&&i.key!=="ArrowRight")return;let t=i.target.closest(".op-grid__hcell"),s=t&&this.config.columns.find(o=>o.field===t.dataset.field);if(!t||!s||!this.canResize(s))return;i.preventDefault();let n=t.getBoundingClientRect().width||s.width||96;this.setColumnWidth(s.field,n+(i.key==="ArrowRight"?16:-16))})}dir(){return getComputedStyle(this.el).direction}moveColumn(e,i){let t=this.config.columns,s=t.find(a=>a.field===e);if(!s||e===i)return;let n=this.userCols(),o=n.indexOf(s),r=[...t.filter(a=>a!==s)],l=i==null?void 0:r.find(a=>a.field===i),h=n.filter(a=>a!==s).pop(),c=l?r.indexOf(l):h?r.indexOf(h)+1:r.length;r.splice(c,0,s),!r.every((a,g)=>a===t[g])&&(this.setColumns(r),this.emit("column-move",e,o,this.userCols().indexOf(s)),this.emit("columns-change",this.getColumnState()))}initColumnDrag(){let e=this.headRow,i=()=>Array.from(e.querySelectorAll(".is-reorderable"));this.listen(e,"pointerdown",t=>{let s=t.target.closest(".is-reorderable");if(!s||t.button||t.target.closest(".op-grid__resizer"))return;let n=s.dataset.field,o=t.clientX,r,l,h=null,c=g=>{if(!r){if(Math.abs(g.clientX-o)<6)return;r=d("div","op-grid__ghost",{},s.textContent??""),l=d("div","op-grid__drop"),this.el.append(r),this.headEl.append(l),s.classList.add("is-dragging-col")}r.style.left=`${g.clientX}px`,r.style.top=`${g.clientY}px`;let m=i(),b=m.find(B=>{let _=B.getBoundingClientRect();return g.clientX<_.left+_.width/2});h=b?b.dataset.field:null;let w=(b??m[m.length-1])?.getBoundingClientRect(),G=this.headEl.getBoundingClientRect();w&&l&&(l.style.left=`${(b?w.left:w.right)-G.left+this.headEl.scrollLeft}px`)},a=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a),r&&(r.remove(),l?.remove(),s.classList.remove("is-dragging-col"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),this.moveColumn(n,h))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",a),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a)))}),this.listen(e,"keydown",t=>{if(!t.altKey||t.shiftKey||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;let s=t.target.closest(".is-reorderable");if(!s)return;t.preventDefault();let n=this.userCols(),o=n.findIndex(h=>h.field===s.dataset.field),r=t.key==="ArrowLeft"?o-1:o+1;if(r<0||r>=n.length)return;this.moveColumn(n[o].field,t.key==="ArrowLeft"?n[r].field:n[r+1]?.field??null);let l=e.querySelector(`[data-field="${CSS.escape(n[o].field)}"]`);(l?.querySelector("button")??l)?.focus()})}paintSort(){let e=this.store.getSorters()[0];for(let i of Array.from(this.headRow.children)){let t=!!e&&i.dataset.field===e.field;i.classList.toggle("is-sorted-asc",t&&e.dir==="asc"),i.classList.toggle("is-sorted-desc",t&&e.dir==="desc"),i.classList.contains("is-sortable")&&i.setAttribute("aria-sort",t?e.dir==="asc"?"ascending":"descending":"none")}}sortBy(e){let i=this.store.getSorters()[0],t=i?.field===e.field?i.dir==="asc"?"desc":null:"asc";this.emit("before-sort",e.field,t)!==!1&&(this.store.sort(t?e.field:null,t??void 0),this.emit("sort",e.field,t))}rowIndexOffset(){return this.store.pageSize?(this.store.page-1)*this.store.pageSize:0}renderRow(e,i){let t=this.store.getAt(i);if(!t)return;let s=this.cols();e.id=`${this.id}-r${i}`,e.dataset.i=String(i),e.setAttribute("role","row"),e.setAttribute("aria-rowindex",String(this.rowIndexOffset()+i+2));let n=this.selected.has(t);e.setAttribute("aria-selected",this.mode()==="none"?"false":String(n)),e.classList.toggle("is-selected",n),e.classList.toggle("is-active",i===this.active),e.classList.toggle("is-odd",i%2===1),(e.dataset.cv!==String(this.cv)||e.children.length!==s.length)&&(e.dataset.cv=String(this.cv),e.replaceChildren(...s.map((o,r)=>d("div",`op-grid__cell${o.align?` op-grid__cell--${o.align}`:""}${o.cls?` ${o.cls}`:""}`,{role:"gridcell","aria-colindex":r+1})))),s.forEach((o,r)=>{let l=e.children[r];if(o.field===f){let c=l.firstElementChild??l.appendChild(d("input","op-grid__check",{type:"checkbox",tabindex:-1,"aria-label":u("gridSelectRow")}));c.checked=n;return}if(o.field===p){let c=this.config.rowActions??[];if(!this.visibleActions()){l.firstChild||l.append(d("button","op-grid__actbtn",{type:"button",tabindex:-1,"aria-label":u("gridRowActions"),"aria-haspopup":"menu"},C("more")));return}(l.children.length!==c.length||l.firstElementChild?.dataset.a==null)&&l.replaceChildren(...c.map((a,g)=>d("button",`op-grid__actbtn${a.variant==="danger"?" is-danger":""}`,{type:"button",tabindex:-1,"data-a":g,"aria-label":a.text,title:a.text},a.icon?C(a.icon):a.text))),c.forEach((a,g)=>l.children[g].disabled=!!a.disabled?.(t));return}let h=A(o,t);typeof h=="string"?l.textContent=h:l.replaceChildren(h)})}indexOfEvent(e){let i=e.target.closest(".op-grid__body-row");return i?Number(i.dataset.i):-1}onRowEvent(e,i){let t=this.indexOfEvent(e),s=this.store.getAt(t);if(s){if(i==="row-click"){let n=e.target.closest(".op-grid__actbtn");if(n){if(n.dataset.a==null)return this.openRowMenu(s,n);n.disabled||this.config.rowActions[Number(n.dataset.a)].handler(s,this);return}this.setActive(t,!1),this.pick(t,e)}this.emit(i,s,t,e)}}getSelection(){return[...this.selected]}select(e,i={}){let t=typeof e=="number"?this.store.getAt(e):e,s=this.mode();!t||s==="none"||((s==="single"||!i.add)&&this.selected.clear(),this.selected.add(t),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.v?.refresh(),this.paintSelection(),this.emit("select",this.getSelection())}selectAllFiltered(){if(this.mode()==="multi"){for(let e of this.store.getFiltered())this.selected.add(e);this.changed()}}pick(e,i){let t=this.mode(),s=this.store.getAt(e);if(!(!s||t==="none")){if(t==="multi"&&i.shiftKey&&this.anchor>=0){this.config.checkboxSelection||this.selected.clear();for(let n of this.store.getRange(Math.min(this.anchor,e),Math.max(this.anchor,e)+1))this.selected.add(n)}else t==="multi"&&(i.ctrlKey||i.metaKey||this.config.checkboxSelection)?(this.selected.delete(s)||this.selected.add(s),this.anchor=e):(this.selected.clear(),this.selected.add(s),this.anchor=e);this.changed()}}setActive(e,i=!0){this.active=e,i&&e>=0&&this.v.scrollTo(e),this.v.refresh(),this.updateActiveDescendant()}updateActiveDescendant(){this.active>=0&&this.active<this.store.count?this.table.setAttribute("aria-activedescendant",`${this.id}-r${this.active}`):this.table.removeAttribute("aria-activedescendant")}focusRow(e){this.render(),this.setActive(Math.max(0,Math.min(e,this.store.count-1))),this.table.focus()}focusEl(){return this.table}scrollToRow(e){this.v?.scrollTo(e)}onKey(e){let i=e.target;if(i.closest(".op-grid__header")||i!==this.table&&i.matches("input:not([type=checkbox]),textarea,select,[contenteditable]"))return;let t=this.store.count;if(!t)return;if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&this.active>=0&&this.config.rowActions?.length)return e.preventDefault(),this.openRowMenu(this.store.getAt(this.active),document.getElementById(`${this.id}-r${this.active}`)??this.el);let s=Math.max(1,Math.floor((this.viewport.clientHeight||400)/this.config.rowHeight||10)),n=this.active<0?0:this.active,o=this.mode(),r={ArrowDown:Math.min(t-1,this.active<0?0:n+1),ArrowUp:Math.max(0,n-1),Home:0,End:t-1,PageDown:Math.min(t-1,n+s),PageUp:Math.max(0,n-s)};if(e.key in r){e.preventDefault();let l=r[e.key];this.setActive(l),(o==="single"||o==="multi"&&!e.ctrlKey&&!e.metaKey&&!this.config.checkboxSelection)&&this.pick(l,e)}else e.key===" "&&this.active>=0?(e.preventDefault(),o==="multi"?this.pick(this.active,{ctrlKey:!0}):this.pick(this.active,e)):e.key==="Enter"&&this.active>=0?this.emit("row-activate",this.store.getAt(this.active),this.active):(e.key==="a"||e.key==="A")&&(e.ctrlKey||e.metaKey)&&o==="multi"&&(e.preventDefault(),this.store.each(l=>this.selected.add(l)),this.changed())}refresh(){this.v?.refresh()}buildBar(){let e=this.config;if(!this.barEl)return;this.bulkCount=d("span","op-grid__count",{"aria-live":"polite"}),this.selectAllBtn=new v({text:"",variant:"ghost",handler:()=>this.selectAllFiltered()}),this.bulkBtns=(e.bulkActions??[]).map(t=>new v({text:t.text,icon:t.icon,variant:t.variant==="danger"?"danger":"default",handler:()=>t.handler(this.getSelection(),this)}));let i=new v({text:u("gridClearSel"),variant:"ghost",handler:()=>this.deselectAll()});this.bulkEl.append(this.bulkCount,this.selectAllBtn.el,...this.bulkBtns.map(t=>t.el),i.el),this.own(()=>[this.selectAllBtn,...this.bulkBtns,i].forEach(t=>t?.destroy())),e.columnMenu&&this.buildColumnMenu(),this.paintSelection()}paintSelection(){if(!this.rendered)return;let e=this.store.count,i=0;if(this.store.each(n=>this.selected.has(n)&&i++),this.selAll&&(this.selAll.checked=e>0&&i===e,this.selAll.indeterminate=i>0&&i<e),!this.bulkEl)return;let t=this.selected.size;if(this.bulkEl.hidden=!t||!this.config.bulkActions?.length,this.bulkEl.hidden)return;this.bulkCount.textContent=u("gridSelected",{n:t});let s=this.store.getFiltered().length;this.selectAllBtn.el.hidden=!(this.mode()==="multi"&&i===e&&s>e&&t<s),this.selectAllBtn.setText(u("gridSelectAll",{n:s}))}openRowMenu(e,i){this.rowMenu??=new z({}),this.rowMenu.setItems((this.config.rowActions??[]).map(t=>({text:t.text,icon:t.icon,disabled:!!t.disabled?.(e),handler:()=>t.handler(e,this)}))),this.rowMenu.showBy(i)}buildColumnMenu(){let e=new v({text:u("gridColumns"),icon:"columns",variant:"ghost"});this.colSearch=new k({placeholder:u("gridColumnSearch"),clearable:!0}),this.colChips=d("div","op-grid__colchips",{role:"group","aria-label":u("gridGroups")}),this.colList=d("div","op-grid__collist",{role:"group","aria-label":u("gridColumns")});let i=d("div","op-grid__colempty",{},u("gridNoColumns"));i.hidden=!0;let t=d("div","op-grid__colmenu",{},this.colSearch.el,this.colChips,this.colList,i);this.colDd=new H({anchor:e.el,content:t,placement:"bottom-end",role:"dialog",autoFocus:!1}),this.barEl.append(e.el),this.own(()=>e.destroy());let s=()=>{let n=(this.colSearch.getValue()??"").toLowerCase(),o=0,r,l=0,h=()=>r&&(r.hidden=l===0);for(let c of Array.from(this.colList.children)){if(c.classList.contains("op-grid__colgroup")){h(),r=c,l=0;continue}let a=c.dataset.group??"",g=!this.colGroup||a===this.colGroup,m=!n||a.toLowerCase().includes(n)||c.textContent.toLowerCase().includes(n);c.hidden=!(g&&m),c.hidden||(o++,l++)}h(),i.hidden=o>0};this.colSearch.on("change",s),this.listen(this.colChips,"click",n=>{let o=n.target.closest("[data-g]");o&&(this.colGroup=o.dataset.g,this.paintColumnList(),s())}),e.on("click",()=>{if(this.colDd.isOpen())return this.colDd.close();this.colSearch.setValue(""),this.colGroup="",this.paintColumnList(),this.colDd.open(),this.colList.querySelector("input")?.focus()}),this.listen(this.colList,"change",n=>{let o=n.target;if(o.dataset.groupToggle!=null)this.setColumnGroupVisible(o.dataset.groupToggle,o.checked);else{let r=this.config.columns.find(l=>l.field===o.value);if(!r)return;r.hidden=!o.checked,this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}this.paintColumnList(),s()})}paintColumnList(){let e=this.config.columns,i=this.getColumnGroups(),t=this.userCols().length===1?this.userCols()[0]:null,s=o=>{let r=d("input","op-grid__check",{type:"checkbox",value:o.field});return r.checked=!o.hidden,r.disabled=o===t,d("label","op-grid__colitem",{"data-group":o.group??""},r,d("span","",{},o.header??o.field))};if(this.colChips.hidden=i.length<2,this.colChips.replaceChildren(...[["",u("gridGroupAll")],...i.map(o=>[o,o])].map(([o,r])=>d("button",`op-grid__colchip${this.colGroup===o?" is-on":""}`,{type:"button","data-g":o,"aria-pressed":String(this.colGroup===o)},r))),!i.length)return this.colList.replaceChildren(...e.map(s));let n=[];for(let o of[...i,""]){let r=e.filter(c=>(c.group??"")===o);if(!r.length)continue;let l=r.filter(c=>!c.hidden).length,h=d("input","op-grid__check",{type:"checkbox","data-group-toggle":o,"aria-label":o||u("gridOtherCols")});h.checked=l===r.length,h.indeterminate=l>0&&l<r.length,n.push(d("div","op-grid__colgroup",{"data-group":o},d("label","",{},h,d("span","",{},o||u("gridOtherCols"))),d("span","op-grid__colcount",{},`${l}/${r.length}`)),...r.map(s))}this.colList.replaceChildren(...n)}onDestroy(){this.pager?.destroy(),this.rowMenu?.destroy(),this.colDd?.destroy(),this.colSearch?.destroy()}};S("grid",L);export{L as a};
|
|
2
|
+
//# sourceMappingURL=chunk-VF7BGP6L.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/grid/grid.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { virtualize, measure } from '../../../core/virtual';\nimport { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport { cellContent, type Column } from '../../../data/column';\nimport { iconEl } from '../../base/icon/icon';\nimport { Pagination } from '../pagination/pagination';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Menu } from '../../overlays/menu/menu';\n\naddMessages('en', {\n gridSelected: '{n} selected',\n gridSelectAll: 'Select all {n}',\n gridClearSel: 'Clear selection',\n gridSelectRow: 'Select row',\n gridSelectPage: 'Select all rows',\n gridRowActions: 'Row actions',\n gridColumns: 'Columns',\n gridResize: 'Resize column',\n gridGroupAll: 'All',\n gridOtherCols: 'Other',\n gridGroups: 'Column groups',\n gridColumnSearch: 'Search columns',\n gridNoColumns: 'No matching columns',\n});\naddMessages('pt-BR', {\n gridSelected: '{n} selecionado(s)',\n gridSelectAll: 'Selecionar todos os {n}',\n gridClearSel: 'Limpar sele\u00E7\u00E3o',\n gridSelectRow: 'Selecionar linha',\n gridSelectPage: 'Selecionar todas as linhas',\n gridRowActions: 'A\u00E7\u00F5es da linha',\n gridColumns: 'Colunas',\n gridResize: 'Redimensionar coluna',\n gridGroupAll: 'Todas',\n gridOtherCols: 'Outras',\n gridGroups: 'Grupos de colunas',\n gridColumnSearch: 'Buscar colunas',\n gridNoColumns: 'Nenhuma coluna encontrada',\n});\n\nexport interface GridConfig<T extends Record<string, any> = any> extends ComponentConfig {\n store?: Store<T>;\n /** Used when no `store` is given. */\n data?: Partial<T>[];\n columns: Column<T>[];\n selection?: 'none' | 'single' | 'multi';\n /** Row height in px. Default: measured from the `--op-grid-row-height` / `--op-row-height` tokens. */\n rowHeight?: number;\n /** Adds a Pagination bar bound to the store (give the store a `pageSize`, or set it here). */\n paging?: boolean;\n pageSize?: number;\n emptyText?: string;\n striped?: boolean;\n /** Adds a leading checkbox column with a select-all in the header. Implies multi selection; a row click toggles. */\n checkboxSelection?: boolean;\n /** Keep selected records when the page or the filters change. Default false. */\n keepSelection?: boolean;\n /** Buttons shown in a bar above the header while records are selected. */\n bulkActions?: GridAction<T>[];\n /** Actions at the end of every row (see `rowActionsMode`). */\n rowActions?: GridRowAction<T>[];\n /** Optional features (`cellEditing()`...). See `GridPlugin`. */\n plugins?: GridPlugin<T>[];\n /** `'menu'` (default): one \"\u22EF\" button opens a menu. `'visible'`: every action is an icon button, always shown (dimmed until the row is hovered, active or selected). */\n rowActionsMode?: 'menu' | 'visible';\n /** A \"Columns\" button in the bar: toggle columns on and off, with search. */\n columnMenu?: boolean;\n /** Drag a header to a new place (or Alt+\u2190/\u2192 on a focused header). `column-move` and `columns-change` fire; ViewManager saves the order. */\n reorderableColumns?: boolean;\n /** A handle on each header's edge: drag to resize (double-click resets), Alt+Shift+\u2190/\u2192 on a focused header. Widths are part of `getColumnState`. */\n resizableColumns?: boolean;\n /** Show the group labels (`Column.group`) as a band over the header. Default true when any column has a group. */\n groupHeaders?: boolean;\n}\n\n/** Extends a Grid without growing its base: `init` runs once the grid is rendered and may return a cleanup. */\nexport interface GridPlugin<T extends Record<string, any> = any> {\n init(grid: Grid<T>): void | (() => void);\n destroy?(): void;\n}\n\n/** What `cellAt` finds under a DOM node: the row index, its record, the column and the cell element. */\nexport interface GridCell<T extends Record<string, any> = any> {\n index: number;\n record: Model<T>;\n column: Column<T>;\n el: HTMLElement;\n}\n\nexport interface GridAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n handler: (records: Model<T>[], grid: Grid<T>) => void;\n}\nexport interface GridRowAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Disabled for the records where this returns true. */\n disabled?: (record: Model<T>) => boolean;\n handler: (record: Model<T>, grid: Grid<T>) => void;\n}\nexport interface ColumnState {\n field: string;\n hidden: boolean;\n width?: number;\n}\n\nconst SEL = '__select';\nconst ACT = '__actions';\nconst SEL_COL: Column = { field: SEL, width: 44, align: 'center', cls: 'op-grid__selcell' };\nconst ACT_COL: Column = { field: ACT, width: 44, align: 'center', cls: 'op-grid__actcell' };\n\nconst ROW = 'var(--op-grid-row-height, var(--op-row-height))';\n\n/** Data grid with a virtualized body: only the visible rows (plus a small overscan) exist in the DOM. */\n/** `T` is the record shape; `new Grid({ store })` infers it from a typed `Store<T>`. */\nexport class Grid<T extends Record<string, any> = any> extends Component<GridConfig<T>> {\n protected override baseCls = 'op-grid';\n private store!: Store<T>;\n private offStore?: () => void;\n private headEl!: HTMLElement;\n private headRow!: HTMLElement;\n private viewport!: HTMLElement;\n private emptyEl!: HTMLElement;\n /** The focusable `role=grid` part (header + rows); the root also holds the bulk bar and the pager, which a grid may not contain. */\n private table!: HTMLElement;\n private pager?: Pagination;\n private v!: ReturnType<typeof virtualize>;\n private selected = new Set<Model<T>>();\n private active = -1;\n private anchor = -1;\n private justDragged = false;\n private cv = 0; // bumps when the columns change, so pooled rows rebuild their cells\n private selAll?: HTMLInputElement;\n private barEl?: HTMLElement;\n private bulkEl?: HTMLElement;\n private bulkCount?: HTMLElement;\n private bulkBtns: Button[] = [];\n private selectAllBtn?: Button;\n private rowMenu?: Menu;\n private colDd?: Dropdown;\n private colList?: HTMLElement;\n private colSearch?: TextField;\n private colChips?: HTMLElement;\n private colGroup = '';\n\n private cols(): Column[] {\n const c = this.config;\n return [...(c.checkboxSelection ? [SEL_COL] : []), ...this.userCols(), ...(c.rowActions?.length ? [ACT_COL] : [])];\n }\n private userCols(): Column[] {\n return (this.config.columns ?? []).filter((c) => !c.hidden);\n }\n private visibleActions(): boolean {\n return this.config.rowActionsMode === 'visible' && !!this.config.rowActions?.length;\n }\n private mode(): 'none' | 'single' | 'multi' {\n return this.config.checkboxSelection ? 'multi' : (this.config.selection ?? 'single');\n }\n\n protected override build() {\n const c = this.config;\n const el = h('div', this.baseCls);\n this.headRow = h('div', 'op-grid__row op-grid__header-row', { role: 'row' });\n this.headEl = h('div', 'op-grid__header', {}, this.headRow);\n this.viewport = h('div', 'op-grid__viewport');\n this.emptyEl = h('div', 'op-grid__empty');\n if (c.columnMenu || c.bulkActions?.length) {\n this.bulkEl = h('div', 'op-grid__bulk');\n this.bulkEl.hidden = true;\n this.barEl = h('div', 'op-grid__bar', {}, this.bulkEl);\n el.append(this.barEl);\n }\n this.table = h('div', 'op-grid__table', { role: 'grid', tabindex: 0, 'aria-multiselectable': c.selection === 'multi' || c.checkboxSelection ? 'true' : null }, this.headEl, this.viewport, this.emptyEl);\n el.append(this.table);\n el.classList.toggle('op-grid--striped', !!c.striped);\n if (c.paging) {\n this.pager = new Pagination({ cls: 'op-grid__pager' });\n el.append(this.pager.el);\n }\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.bindStore(c.store ?? new Store<T>({ data: c.data ?? [] }));\n this.buildHeader();\n this.buildBar();\n this.v = virtualize({\n scroller: this.viewport,\n count: this.store.count,\n rowHeight: c.rowHeight ?? (measure(this.el, ROW) || 36),\n render: (row, i) => this.renderRow(row, i),\n rowCls: 'op-grid__row op-grid__body-row',\n });\n this.own(() => this.v.destroy());\n this.sync();\n\n this.listen(this.viewport, 'scroll', () => (this.headEl.scrollLeft = this.viewport.scrollLeft), { passive: true });\n this.listen(this.viewport, 'click', (e: MouseEvent) => this.onRowEvent(e, 'row-click'));\n this.listen(this.viewport, 'dblclick', (e: MouseEvent) => this.onRowEvent(e, 'row-dblclick'));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.headRow, 'change', (e: Event) => {\n if (e.target !== this.selAll) return;\n if (this.selAll!.checked) this.store.each((r) => this.selected.add(r));\n else if (this.config.keepSelection) this.store.each((r) => this.selected.delete(r));\n else this.selected.clear();\n this.changed();\n });\n if (c.reorderableColumns) this.initColumnDrag();\n if (c.resizableColumns) this.initColumnResize();\n this.listen(this.headRow, 'click', (e: Event) => {\n if (this.justDragged || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-field]');\n const col = cell && this.userCols().find((x) => x.field === cell.dataset.field);\n if (!col) return;\n this.emit('column-click', col);\n if (col.sortable) this.sortBy(col);\n });\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => this.layout());\n ro.observe(this.viewport);\n this.own(() => ro.disconnect());\n }\n if (this.pager) {\n this.pager.setStore(this.store);\n if (!this.store.pageSize) this.store.setPageSize(c.pageSize ?? 20);\n }\n this.own(() => this.pager?.destroy());\n for (const p of c.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n if (p.destroy) this.own(() => p.destroy!());\n }\n }\n\n /** The row, record, column and cell element under a node (e.g. an event target), if it is a body cell. */\n cellAt(node: EventTarget | null): GridCell<T> | undefined {\n const cell = (node as HTMLElement | null)?.closest?.<HTMLElement>('.op-grid__body-row .op-grid__cell');\n const index = Number(cell?.parentElement?.dataset.i);\n const column = cell && this.cols()[Number(cell.getAttribute('aria-colindex')) - 1];\n const record = cell && this.store.getAt(index);\n return column && record && ![SEL, ACT].includes(column.field) ? { index, record, column, el: cell } : undefined;\n }\n\n /** The body cell of row `index` and column `field`, when that row is in the DOM (rows are virtualized). */\n getCell(index: number, field: string): HTMLElement | undefined {\n const n = this.cols().findIndex((c) => c.field === field);\n return document.getElementById(`${this.id}-r${index}`)?.querySelector<HTMLElement>(`[aria-colindex=\"${n + 1}\"]`) ?? undefined;\n }\n\n /** The visible data columns, in order (no checkbox/action columns). */\n getColumns(): Column<T>[] {\n return this.userCols();\n }\n\n /** The active row index (keyboard cursor), or -1. */\n getActive(): number {\n return this.active;\n }\n\n override notifyMount() {\n super.notifyMount();\n this.layout();\n this.pager?.notifyMount();\n }\n\n /** Re-measures row height and scrollbar (needed after the grid becomes visible or resizes). */\n private layout() {\n if (!this.rendered) return;\n if (!this.config.rowHeight) {\n const hgt = measure(this.el, ROW);\n if (hgt) this.v.setRowHeight(hgt);\n }\n this.headEl.style.paddingInlineEnd = `${this.viewport.offsetWidth - this.viewport.clientWidth}px`;\n this.v.refresh();\n }\n\n // ---- store ---------------------------------------------------------------------------------\n\n private bindStore(store: Store<T>) {\n this.offStore?.();\n this.store = store;\n const offChange = store.subscribe((c) => {\n if (!this.rendered) return;\n this.sync();\n if (c.type === 'sort') this.paintSort();\n });\n const offLoading = store.on('loading', (on: boolean) => this.setLoading(on));\n this.offStore = () => (offChange(), offLoading());\n this.own(() => this.offStore?.());\n }\n\n /** Brings count, selection and the empty state in line with the store. */\n private sync() {\n const before = this.selected.size;\n if (!this.config.keepSelection) for (const r of this.selected) if (this.store.indexOf(r) < 0) this.selected.delete(r);\n this.active = Math.min(this.active, this.store.count - 1);\n this.v.setCount(this.store.count);\n this.table.setAttribute('aria-rowcount', String(this.store.totalCount + 1));\n this.emptyEl.textContent = this.config.emptyText ?? t('empty');\n this.emptyEl.hidden = this.store.count > 0 || !!this.config.loading;\n this.el.classList.toggle('is-empty', this.store.count === 0);\n this.updateActiveDescendant();\n this.paintSelection();\n if (this.selected.size !== before) this.emit('select', this.getSelection());\n }\n\n setStore(store: Store<T>) {\n this.config.store = store;\n this.selected.clear();\n this.active = this.anchor = -1;\n if (!this.rendered) return;\n this.bindStore(store);\n this.pager?.setStore(store);\n this.paintSort();\n this.sync();\n }\n getStore(): Store<T> {\n this.render();\n return this.store;\n }\n\n // ---- header / columns ----------------------------------------------------------------------\n\n /** Column widths \u2192 the CSS grid template shared by the header and every row. */\n private layoutColumns() {\n const cols = this.cols();\n const n = this.visibleActions() ? this.config.rowActions!.length : 1;\n const wide = (c: Column) => (c.field === ACT ? `calc(${n} * var(--op-grid-action-size) + ${n + 1} * var(--op-grid-action-gap))` : `${c.width}px`);\n const tpl = cols.map((c) => (c.field === ACT ? wide(c) : c.width ? `${c.width}px` : `minmax(${c.minWidth ?? 96}px, ${c.flex ?? 1}fr)`)).join(' ');\n this.el.style.setProperty('--op-grid-cols', tpl);\n this.el.style.setProperty('--op-grid-min-width', `${cols.reduce((sum, c) => sum + (c.field === ACT ? n * 36 : (c.width ?? c.minWidth ?? 96)), 0)}px`);\n }\n\n private buildHeader() {\n const cols = this.cols();\n this.layoutColumns();\n this.el.classList.toggle('op-grid--actions-visible', this.visibleActions());\n this.el.classList.toggle('op-grid--reorderable', !!this.config.reorderableColumns);\n this.el.classList.toggle('op-grid--resizable', !!this.config.resizableColumns);\n this.table.setAttribute('aria-colcount', String(cols.length));\n this.selAll = undefined;\n this.headRow.replaceChildren(\n ...cols.map((c, i) => {\n const label = c.header ?? c.field;\n const cell = h('div', `op-grid__cell op-grid__hcell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.sortable ? ' is-sortable' : ''}`, { role: 'columnheader', 'aria-colindex': i + 1, 'data-field': c.field });\n if (c.field === SEL) cell.append((this.selAll = h('input', 'op-grid__check', { type: 'checkbox', 'aria-label': t('gridSelectPage') })));\n else if (c.field === ACT) cell.append(h('span', 'op-sr-only', {}, t('gridRowActions')));\n else if (c.sortable) cell.append(h('button', 'op-grid__sort', { type: 'button' }, h('span', 'op-grid__label', {}, label), h('span', 'op-grid__arrow', { 'aria-hidden': 'true' }, iconEl('arrow-up'))));\n else cell.append(h('span', 'op-grid__label', {}, label));\n const user = c.field !== SEL && c.field !== ACT;\n if (this.config.reorderableColumns && user) cell.classList.add('is-reorderable');\n if (this.canResize(c)) {\n cell.append(h('span', 'op-grid__resizer', { role: 'separator', 'aria-orientation': 'vertical', 'aria-label': `${t('gridResize')} ${label}` }));\n }\n // a sortable header already has its button to focus; the others need a tab stop to be moved/resized by keyboard\n if (user && !c.sortable && (this.config.reorderableColumns || this.canResize(c))) cell.tabIndex = 0;\n return cell;\n }),\n );\n const band = this.groupBand(cols);\n this.headEl.replaceChildren(...(band ? [band] : []), this.headRow);\n this.paintSort();\n }\n\n /** Labels over runs of neighbouring columns that share a group (a dragged column can split a group: it shows twice). */\n private groupBand(cols: Column[]): HTMLElement | null {\n if (this.config.groupHeaders === false || !cols.some((c) => c.group)) return null;\n const cells: HTMLElement[] = [];\n let i = 0;\n while (i < cols.length) {\n const g = cols[i].group ?? '';\n let n = 1;\n while (i + n < cols.length && (cols[i + n].group ?? '') === g) n++;\n const cell = h('div', `op-grid__gcell${g ? '' : ' is-empty'}`, { role: 'columnheader', 'aria-colindex': i + 1, 'aria-colspan': n }, g);\n cell.style.gridColumn = `span ${n}`;\n cells.push(cell);\n i += n;\n }\n return h('div', 'op-grid__row op-grid__group-row', { role: 'row' }, ...cells);\n }\n\n /** The group labels in the order they first appear. */\n getColumnGroups(): string[] {\n return [...new Set(this.config.columns.map((c) => c.group).filter((g): g is string => !!g))];\n }\n\n /** Shows or hides every column of a group at once (at least one column always stays visible). */\n setColumnGroupVisible(group: string, visible: boolean): void {\n const cols = this.config.columns.filter((c) => (c.group ?? '') === group);\n if (!cols.length) return;\n for (const c of cols) c.hidden = !visible;\n if (!this.config.columns.some((c) => !c.hidden)) cols[0].hidden = false;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n\n setColumns(columns: Column[]) {\n this.config.columns = columns;\n if (!this.rendered) return;\n this.cv++;\n this.buildHeader();\n this.paintSelection();\n this.v.refresh();\n }\n\n /** Order, visibility and width of every column; save it and give it back to `setColumnState`. */\n getColumnState(): ColumnState[] {\n return this.config.columns.map((c) => ({ field: c.field, hidden: !!c.hidden, width: c.width }));\n }\n /** Restores a saved state: columns follow its order (unknown ones keep their place at the end). */\n setColumnState(state: ColumnState[]): void {\n const by = new Map(this.config.columns.map((c) => [c.field, c]));\n const ordered = state.flatMap((s) => {\n const c = by.get(s.field);\n by.delete(s.field);\n return c ? [{ ...c, hidden: s.hidden, width: s.width ?? c.width }] : [];\n });\n this.setColumns([...ordered, ...by.values()]);\n this.emit('columns-change', this.getColumnState());\n }\n\n // ---- column drag ---------------------------------------------------------------------------\n\n // ---- column resize -------------------------------------------------------------------------\n\n private canResize(c: Column): boolean {\n return !!this.config.resizableColumns && c.field !== SEL && c.field !== ACT && c.resizable !== false;\n }\n\n /** Sets a column's width in px (clamped to `minWidth`/`maxWidth`); `undefined` gives it back its flexible width. */\n setColumnWidth(field: string, width: number | undefined): void {\n const col = this.config.columns.find((x) => x.field === field);\n if (!col) return;\n col.width = width == null ? undefined : Math.round(Math.max(col.minWidth ?? 48, Math.min(width, col.maxWidth ?? Infinity)));\n this.layoutColumns();\n this.emit('column-resize', field, col.width);\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnResize(): void {\n const head = this.headRow;\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (!grip || e.button) return;\n e.preventDefault();\n const cell = grip.parentElement!;\n const field = cell.dataset.field!;\n const col = this.config.columns.find((x) => x.field === field)!;\n const x0 = e.clientX;\n const w0 = cell.getBoundingClientRect().width || col.width || 96; // a flexible column starts from what it shows now\n this.el.classList.add('is-resizing');\n let last = col.width;\n const move = (m: PointerEvent) => {\n // set without events while dragging; one event when it ends\n const w = Math.round(Math.max(col.minWidth ?? 48, Math.min(w0 + (m.clientX - x0) * (this.dir() === 'rtl' ? -1 : 1), col.maxWidth ?? Infinity)));\n col.width = last = w;\n this.layoutColumns();\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n this.el.classList.remove('is-resizing');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n if (last !== undefined) {\n this.emit('column-resize', field, last);\n this.emit('columns-change', this.getColumnState());\n }\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // double-click on the handle: back to the flexible width\n this.listen(head, 'dblclick', (e: Event) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (grip) this.setColumnWidth(grip.parentElement!.dataset.field!, undefined);\n });\n // keyboard: Alt+Shift+\u2190/\u2192 on a focused header\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!(e.altKey && e.shiftKey) || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__hcell');\n const col = cell && this.config.columns.find((x) => x.field === cell.dataset.field);\n if (!cell || !col || !this.canResize(col)) return;\n e.preventDefault();\n const w = cell.getBoundingClientRect().width || col.width || 96;\n this.setColumnWidth(col.field, w + (e.key === 'ArrowRight' ? 16 : -16));\n });\n }\n\n private dir(): string {\n return getComputedStyle(this.el).direction;\n }\n\n /** Moves a (user) column in front of `before` (or to the end when null). Hidden columns keep their places. */\n moveColumn(field: string, before: string | null): void {\n const cols = this.config.columns;\n const col = cols.find((x) => x.field === field);\n if (!col || field === before) return;\n const vis = this.userCols();\n const from = vis.indexOf(col);\n const next = [...cols.filter((x) => x !== col)];\n const target = before == null ? undefined : next.find((x) => x.field === before);\n const lastVis = vis.filter((x) => x !== col).pop();\n const at = target ? next.indexOf(target) : lastVis ? next.indexOf(lastVis) + 1 : next.length;\n next.splice(at, 0, col);\n if (next.every((x, i) => x === cols[i])) return;\n this.setColumns(next);\n this.emit('column-move', field, from, this.userCols().indexOf(col));\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnDrag(): void {\n const head = this.headRow;\n const cellsOf = () => Array.from(head.querySelectorAll<HTMLElement>('.is-reorderable'));\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell || e.button || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const field = cell.dataset.field!;\n const x0 = e.clientX;\n let ghost: HTMLElement | undefined;\n let mark: HTMLElement | undefined;\n let before: string | null = null;\n const move = (m: PointerEvent) => {\n if (!ghost) {\n if (Math.abs(m.clientX - x0) < 6) return; // a click, not a drag\n ghost = h('div', 'op-grid__ghost', {}, cell.textContent ?? '');\n mark = h('div', 'op-grid__drop');\n this.el.append(ghost);\n this.headEl.append(mark);\n cell.classList.add('is-dragging-col');\n }\n ghost.style.left = `${m.clientX}px`;\n ghost.style.top = `${m.clientY}px`;\n // the drop boundary is the nearest cell edge: before the first cell whose middle is right of the pointer\n const cells = cellsOf();\n const hit = cells.find((c) => {\n const r = c.getBoundingClientRect();\n return m.clientX < r.left + r.width / 2;\n });\n before = hit ? hit.dataset.field! : null;\n const edge = hit ?? cells[cells.length - 1];\n const r = edge?.getBoundingClientRect();\n const hr = this.headEl.getBoundingClientRect();\n if (r && mark) mark.style.left = `${(hit ? r.left : r.right) - hr.left + this.headEl.scrollLeft}px`;\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n if (!ghost) return;\n ghost.remove();\n mark?.remove();\n cell.classList.remove('is-dragging-col');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.moveColumn(field, before);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // keyboard: Alt+\u2190 / Alt+\u2192 on a focused header moves its column one step\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey || e.shiftKey || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell) return;\n e.preventDefault();\n const vis = this.userCols();\n const i = vis.findIndex((x) => x.field === cell.dataset.field);\n const j = e.key === 'ArrowLeft' ? i - 1 : i + 1;\n if (j < 0 || j >= vis.length) return;\n this.moveColumn(vis[i].field, e.key === 'ArrowLeft' ? vis[j].field : (vis[j + 1]?.field ?? null));\n const again = head.querySelector<HTMLElement>(`[data-field=\"${CSS.escape(vis[i].field)}\"]`);\n (again?.querySelector<HTMLElement>('button') ?? again)?.focus();\n });\n }\n\n private paintSort() {\n const s = this.store.getSorters()[0];\n for (const cell of Array.from(this.headRow.children) as HTMLElement[]) {\n const on = !!s && cell.dataset.field === s.field;\n cell.classList.toggle('is-sorted-asc', on && s.dir === 'asc');\n cell.classList.toggle('is-sorted-desc', on && s.dir === 'desc');\n if (cell.classList.contains('is-sortable')) cell.setAttribute('aria-sort', on ? (s.dir === 'asc' ? 'ascending' : 'descending') : 'none');\n }\n }\n\n /** asc \u2192 desc \u2192 unsorted. */\n private sortBy(col: Column) {\n const s = this.store.getSorters()[0];\n const dir = s?.field === col.field ? (s.dir === 'asc' ? 'desc' : null) : 'asc';\n if (this.emit('before-sort', col.field, dir) === false) return;\n this.store.sort(dir ? col.field : null, dir ?? undefined);\n this.emit('sort', col.field, dir);\n }\n\n // ---- rows ----------------------------------------------------------------------------------\n\n private rowIndexOffset(): number {\n return this.store.pageSize ? (this.store.page - 1) * this.store.pageSize : 0;\n }\n\n private renderRow(row: HTMLElement, i: number) {\n const rec = this.store.getAt(i);\n if (!rec) return;\n const cols = this.cols();\n row.id = `${this.id}-r${i}`;\n row.dataset.i = String(i);\n row.setAttribute('role', 'row');\n row.setAttribute('aria-rowindex', String(this.rowIndexOffset() + i + 2));\n const sel = this.selected.has(rec);\n row.setAttribute('aria-selected', this.mode() === 'none' ? 'false' : String(sel));\n row.classList.toggle('is-selected', sel);\n row.classList.toggle('is-active', i === this.active);\n row.classList.toggle('is-odd', i % 2 === 1);\n if (row.dataset.cv !== String(this.cv) || row.children.length !== cols.length) {\n row.dataset.cv = String(this.cv);\n row.replaceChildren(...cols.map((c, n) => h('div', `op-grid__cell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.cls ? ` ${c.cls}` : ''}`, { role: 'gridcell', 'aria-colindex': n + 1 })));\n }\n cols.forEach((c, n) => {\n const cell = row.children[n] as HTMLElement;\n if (c.field === SEL) {\n const box = (cell.firstElementChild as HTMLInputElement | null) ?? cell.appendChild(h('input', 'op-grid__check', { type: 'checkbox', tabindex: -1, 'aria-label': t('gridSelectRow') }));\n box.checked = sel;\n return;\n }\n if (c.field === ACT) {\n const acts = this.config.rowActions ?? [];\n if (!this.visibleActions()) {\n if (!cell.firstChild) cell.append(h('button', 'op-grid__actbtn', { type: 'button', tabindex: -1, 'aria-label': t('gridRowActions'), 'aria-haspopup': 'menu' }, iconEl('more')));\n return;\n }\n if (cell.children.length !== acts.length || (cell.firstElementChild as HTMLElement | null)?.dataset.a == null) {\n cell.replaceChildren(...acts.map((a, k) => h('button', `op-grid__actbtn${a.variant === 'danger' ? ' is-danger' : ''}`, { type: 'button', tabindex: -1, 'data-a': k, 'aria-label': a.text, title: a.text }, a.icon ? iconEl(a.icon) : a.text)));\n }\n acts.forEach((a, k) => ((cell.children[k] as HTMLButtonElement).disabled = !!a.disabled?.(rec)));\n return;\n }\n const content = cellContent(c, rec);\n if (typeof content === 'string') cell.textContent = content;\n else cell.replaceChildren(content);\n });\n }\n\n private indexOfEvent(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__body-row');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private onRowEvent(e: MouseEvent, name: string) {\n const i = this.indexOfEvent(e);\n const rec = this.store.getAt(i);\n if (!rec) return;\n if (name === 'row-click') {\n const btn = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-grid__actbtn');\n if (btn) {\n if (btn.dataset.a == null) return this.openRowMenu(rec, btn);\n if (!btn.disabled) this.config.rowActions![Number(btn.dataset.a)].handler(rec, this);\n return;\n }\n this.setActive(i, false);\n this.pick(i, e);\n }\n this.emit(name, rec, i, e);\n }\n\n // ---- selection / keyboard ------------------------------------------------------------------\n\n getSelection(): Model<T>[] {\n return [...this.selected];\n }\n\n /** Selects a record or row index. `add` keeps the current selection (multi mode). */\n select(target: Model<T> | number, opts: { add?: boolean } = {}): void {\n const rec = typeof target === 'number' ? this.store.getAt(target) : target;\n const mode = this.mode();\n if (!rec || mode === 'none') return;\n if (mode === 'single' || !opts.add) this.selected.clear();\n this.selected.add(rec);\n this.changed();\n }\n\n deselectAll(): void {\n if (!this.selected.size) return;\n this.selected.clear();\n this.changed();\n }\n\n private changed() {\n this.v?.refresh();\n this.paintSelection();\n this.emit('select', this.getSelection());\n }\n\n /** Selects every record that matches the filters, across pages (a remote store: the loaded page). */\n selectAllFiltered(): void {\n if (this.mode() !== 'multi') return;\n for (const r of this.store.getFiltered()) this.selected.add(r);\n this.changed();\n }\n\n /** Click semantics: plain = replace, ctrl/meta = toggle, shift = range from the anchor (multi only). */\n private pick(i: number, e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean }) {\n const mode = this.mode();\n const rec = this.store.getAt(i);\n if (!rec || mode === 'none') return;\n if (mode === 'multi' && e.shiftKey && this.anchor >= 0) {\n if (!this.config.checkboxSelection) this.selected.clear();\n for (const r of this.store.getRange(Math.min(this.anchor, i), Math.max(this.anchor, i) + 1)) this.selected.add(r);\n } else if (mode === 'multi' && (e.ctrlKey || e.metaKey || this.config.checkboxSelection)) {\n if (!this.selected.delete(rec)) this.selected.add(rec);\n this.anchor = i;\n } else {\n this.selected.clear();\n this.selected.add(rec);\n this.anchor = i;\n }\n this.changed();\n }\n\n private setActive(i: number, scroll = true) {\n this.active = i;\n if (scroll && i >= 0) this.v.scrollTo(i);\n this.v.refresh();\n this.updateActiveDescendant();\n }\n\n private updateActiveDescendant() {\n if (this.active >= 0 && this.active < this.store.count) this.table.setAttribute('aria-activedescendant', `${this.id}-r${this.active}`);\n else this.table.removeAttribute('aria-activedescendant');\n }\n\n focusRow(i: number) {\n this.render();\n this.setActive(Math.max(0, Math.min(i, this.store.count - 1)));\n this.table.focus();\n }\n\n protected override focusEl(): HTMLElement {\n return this.table;\n }\n\n scrollToRow(i: number) {\n this.v?.scrollTo(i);\n }\n\n private onKey(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (target.closest('.op-grid__header')) return; // header buttons keep their own keys\n if (target !== this.table && target.matches('input:not([type=checkbox]),textarea,select,[contenteditable]')) return; // an editor in a cell keeps its keys\n const n = this.store.count;\n if (!n) return;\n if ((e.key === 'ContextMenu' || (e.shiftKey && e.key === 'F10')) && this.active >= 0 && this.config.rowActions?.length) {\n e.preventDefault();\n return this.openRowMenu(this.store.getAt(this.active)!, document.getElementById(`${this.id}-r${this.active}`) ?? this.el);\n }\n const page = Math.max(1, Math.floor((this.viewport.clientHeight || 400) / this.config.rowHeight! || 10));\n const cur = this.active < 0 ? 0 : this.active;\n const mode = this.mode();\n const targets: Record<string, number> = {\n ArrowDown: Math.min(n - 1, this.active < 0 ? 0 : cur + 1),\n ArrowUp: Math.max(0, cur - 1),\n Home: 0,\n End: n - 1,\n PageDown: Math.min(n - 1, cur + page),\n PageUp: Math.max(0, cur - page),\n };\n if (e.key in targets) {\n e.preventDefault();\n const to = targets[e.key];\n this.setActive(to);\n if (mode === 'single' || (mode === 'multi' && !e.ctrlKey && !e.metaKey && !this.config.checkboxSelection)) this.pick(to, e);\n } else if (e.key === ' ' && this.active >= 0) {\n e.preventDefault();\n if (mode === 'multi') this.pick(this.active, { ctrlKey: true });\n else this.pick(this.active, e);\n } else if (e.key === 'Enter' && this.active >= 0) {\n this.emit('row-activate', this.store.getAt(this.active), this.active);\n } else if ((e.key === 'a' || e.key === 'A') && (e.ctrlKey || e.metaKey) && mode === 'multi') {\n e.preventDefault();\n this.store.each((r) => this.selected.add(r));\n this.changed();\n }\n }\n\n refresh() {\n this.v?.refresh();\n }\n\n // ---- bar: bulk actions and the column menu ------------------------------------------------\n\n private buildBar() {\n const c = this.config;\n if (!this.barEl) return;\n this.bulkCount = h('span', 'op-grid__count', { 'aria-live': 'polite' });\n this.selectAllBtn = new Button({ text: '', variant: 'ghost', handler: () => this.selectAllFiltered() });\n this.bulkBtns = (c.bulkActions ?? []).map((a) => new Button({ text: a.text, icon: a.icon, variant: a.variant === 'danger' ? 'danger' : 'default', handler: () => a.handler(this.getSelection(), this) }));\n const clear = new Button({ text: t('gridClearSel'), variant: 'ghost', handler: () => this.deselectAll() });\n this.bulkEl!.append(this.bulkCount, this.selectAllBtn.el, ...this.bulkBtns.map((b) => b.el), clear.el);\n this.own(() => [this.selectAllBtn, ...this.bulkBtns, clear].forEach((b) => b?.destroy()));\n if (c.columnMenu) this.buildColumnMenu();\n this.paintSelection();\n }\n\n /** Header checkbox state and the bulk bar, from the current selection. */\n private paintSelection() {\n if (!this.rendered) return;\n const n = this.store.count;\n let k = 0;\n this.store.each((r) => this.selected.has(r) && k++);\n if (this.selAll) {\n this.selAll.checked = n > 0 && k === n;\n this.selAll.indeterminate = k > 0 && k < n;\n }\n if (!this.bulkEl) return;\n const size = this.selected.size;\n this.bulkEl.hidden = !size || !this.config.bulkActions?.length;\n if (this.bulkEl.hidden) return;\n this.bulkCount!.textContent = t('gridSelected', { n: size });\n const more = this.store.getFiltered().length;\n this.selectAllBtn!.el.hidden = !(this.mode() === 'multi' && k === n && more > n && size < more);\n this.selectAllBtn!.setText(t('gridSelectAll', { n: more }));\n }\n\n private openRowMenu(rec: Model<T>, btn: HTMLElement) {\n this.rowMenu ??= new Menu({});\n this.rowMenu.setItems((this.config.rowActions ?? []).map((a) => ({ text: a.text, icon: a.icon, disabled: !!a.disabled?.(rec), handler: () => a.handler(rec, this) })));\n this.rowMenu.showBy(btn);\n }\n private buildColumnMenu() {\n const btn = new Button({ text: t('gridColumns'), icon: 'columns', variant: 'ghost' });\n this.colSearch = new TextField({ placeholder: t('gridColumnSearch'), clearable: true });\n this.colChips = h('div', 'op-grid__colchips', { role: 'group', 'aria-label': t('gridGroups') });\n this.colList = h('div', 'op-grid__collist', { role: 'group', 'aria-label': t('gridColumns') });\n const none = h('div', 'op-grid__colempty', {}, t('gridNoColumns'));\n none.hidden = true;\n const panel = h('div', 'op-grid__colmenu', {}, this.colSearch.el, this.colChips, this.colList, none);\n this.colDd = new Dropdown({ anchor: btn.el, content: panel, placement: 'bottom-end', role: 'dialog', autoFocus: false });\n this.barEl!.append(btn.el);\n this.own(() => btn.destroy());\n /** Search text and the group chip decide what is listed; a search that names a group shows the whole group. */\n const filter = () => {\n const q = (this.colSearch!.getValue() ?? '').toLowerCase();\n let shown = 0;\n let head: HTMLElement | undefined;\n let rowsInGroup = 0;\n const closeGroup = () => head && (head.hidden = rowsInGroup === 0);\n for (const el of Array.from(this.colList!.children) as HTMLElement[]) {\n if (el.classList.contains('op-grid__colgroup')) {\n closeGroup();\n head = el;\n rowsInGroup = 0;\n continue;\n }\n const g = el.dataset.group ?? '';\n const byChip = !this.colGroup || g === this.colGroup;\n const byText = !q || g.toLowerCase().includes(q) || el.textContent!.toLowerCase().includes(q);\n el.hidden = !(byChip && byText);\n if (!el.hidden) (shown++, rowsInGroup++);\n }\n closeGroup();\n none.hidden = shown > 0;\n };\n this.colSearch.on('change', filter);\n this.listen(this.colChips, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-g]');\n if (!b) return;\n this.colGroup = b.dataset.g!;\n this.paintColumnList();\n filter();\n });\n btn.on('click', () => {\n if (this.colDd!.isOpen()) return this.colDd!.close();\n this.colSearch!.setValue('');\n this.colGroup = '';\n this.paintColumnList();\n this.colDd!.open();\n this.colList!.querySelector<HTMLElement>('input')?.focus(); // not the search field: a phone keyboard would cover the list\n });\n this.listen(this.colList, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.dataset.groupToggle != null) this.setColumnGroupVisible(input.dataset.groupToggle, input.checked);\n else {\n const col = this.config.columns.find((x) => x.field === input.value);\n if (!col) return;\n col.hidden = !input.checked;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n this.paintColumnList();\n filter();\n });\n }\n\n private paintColumnList() {\n const cols = this.config.columns;\n const groups = this.getColumnGroups();\n const last = this.userCols().length === 1 ? this.userCols()[0] : null; // at least one column stays visible\n const row = (c: Column) => {\n const box = h('input', 'op-grid__check', { type: 'checkbox', value: c.field });\n box.checked = !c.hidden;\n box.disabled = c === last;\n return h('label', 'op-grid__colitem', { 'data-group': c.group ?? '' }, box, h('span', '', {}, c.header ?? c.field));\n };\n this.colChips!.hidden = groups.length < 2;\n this.colChips!.replaceChildren(...[['', t('gridGroupAll')], ...groups.map((g) => [g, g])].map(([g, label]) => h('button', `op-grid__colchip${this.colGroup === g ? ' is-on' : ''}`, { type: 'button', 'data-g': g, 'aria-pressed': String(this.colGroup === g) }, label)));\n if (!groups.length) return this.colList!.replaceChildren(...cols.map(row));\n const out: HTMLElement[] = [];\n for (const g of [...groups, '']) {\n const items = cols.filter((c) => (c.group ?? '') === g);\n if (!items.length) continue;\n const on = items.filter((c) => !c.hidden).length;\n const toggle = h('input', 'op-grid__check', { type: 'checkbox', 'data-group-toggle': g, 'aria-label': g || t('gridOtherCols') });\n toggle.checked = on === items.length;\n toggle.indeterminate = on > 0 && on < items.length;\n out.push(h('div', 'op-grid__colgroup', { 'data-group': g }, h('label', '', {}, toggle, h('span', '', {}, g || t('gridOtherCols'))), h('span', 'op-grid__colcount', {}, `${on}/${items.length}`)), ...items.map(row));\n }\n this.colList!.replaceChildren(...out);\n }\n\n protected override onDestroy() {\n this.pager?.destroy();\n this.rowMenu?.destroy();\n this.colDd?.destroy();\n this.colSearch?.destroy();\n }\n}\nregister('grid', Grid);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "SEL", "ACT", "SEL_COL", "ACT_COL", "ROW", "Grid", "Component", "c", "el", "h", "Pagination", "Store", "virtualize", "measure", "row", "i", "e", "r", "cell", "col", "x", "ro", "p", "off", "node", "index", "column", "record", "field", "n", "hgt", "store", "offChange", "offLoading", "on", "before", "t", "cols", "wide", "tpl", "sum", "label", "iconEl", "user", "band", "cells", "g", "group", "visible", "columns", "state", "by", "ordered", "width", "head", "grip", "x0", "w0", "last", "move", "m", "w", "up", "vis", "from", "next", "target", "lastVis", "at", "cellsOf", "ghost", "mark", "hit", "hr", "j", "again", "s", "dir", "rec", "sel", "box", "acts", "k", "content", "cellContent", "name", "btn", "opts", "mode", "scroll", "page", "cur", "targets", "to", "Button", "a", "clear", "b", "size", "more", "Menu", "TextField", "none", "panel", "Dropdown", "filter", "q", "shown", "rowsInGroup", "closeGroup", "byChip", "byText", "input", "groups", "out", "items", "toggle", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as a}from"./chunk-ZWNQREWS.js";import{a as o}from"./chunk-2ZRNGG2N.js";import{e as c}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";var y=(n,e)=>e.split(".").reduce((t,i)=>t?.[i],n);function u(n,e,t){let i=e.split("."),s=i.pop(),r=i.reduce((l,d)=>l[d]??={},n);r[s]=t}var f=class extends a{baseCls="op-form";tag="form";ruledOut=new Set;dirty=!1;constructor(e={}){let t=[...e.items??[]];e.tabs&&t.push({type:"tabs",flex:1,items:e.tabs.map(i=>({type:"container",title:i.title,icon:i.icon,cls:"op-form__tab",layout:i.layout??{type:"grid",columns:2,gap:12},items:i.items}))}),super({...e,items:t})}build(){let e=super.build();return e.setAttribute("novalidate",""),e}onRender(){if(this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},this.config.labelWidth!=null&&this.setLabelWidth(this.config.labelWidth),this.config.labelPos)for(let e of this.getFields())e.config.labelPos??=this.config.labelPos;super.onRender(),this.config.readonly&&this.setReadonly(!0);for(let e of this.getFields())for(let t of["invalid","valid","dirty-change","change"])e.on(t,()=>this.syncTabs());for(let e of this.getFields())e.on("change",()=>this.changed());for(let e of this.getFields())e.on("dirty-change",()=>this.changed());this.applyRules(),this.listen(this.el,"submit",e=>{e.preventDefault(),this.submit()}),this.listen(this.el,"keydown",e=>{let t=e.target;e.key==="Enter"&&t instanceof HTMLInputElement&&!e.defaultPrevented&&t.type!=="button"&&(e.preventDefault(),this.submit())})}getFields(){return this.query(e=>e instanceof o)}getField(e){return this.getFields().find(t=>t.name===e)}getValues(e={}){let t={};for(let i of this.counted())i.name&&(!e.dirtyOnly||i.isDirty())&&u(t,i.name,i.getValue());return t}counted(){return this.getFields().filter(e=>{for(let t=e;t&&t!==this;t=t.parent)if(this.ruledOut.has(t))return!1;return!0})}changed(){this.applyRules();let e=this.isDirty();e!==this.dirty&&this.emit("dirty-change",this.dirty=e)}applyRules(){let e={};for(let t of this.getFields())t.name&&u(e,t.name,t.getValue());for(let t of this.query(i=>!!(i.config.showIf||i.config.enableIf))){let{showIf:i,enableIf:s}=t.config;if(i){let r=!!i(e);if(r===this.ruledOut.has(t))if(r)this.ruledOut.delete(t),t.show();else{this.ruledOut.add(t),t.hide();for(let l of t instanceof o?[t]:t instanceof a?t.query(d=>d instanceof o):[])l.clearError()}}s&&t.setDisabled(!s(e))}}focusField(e){this.reveal(e),e.focus()}setValues(e){for(let t of this.getFields()){let i=t.name?y(e,t.name):void 0;i!==void 0&&t.setValue(i,!0)}}load(e){this.setValues("data"in e&&"get"in e?e.data:e),this.markClean(),this.clearErrors(),this.emit("load",e)}reveal(e){let t=e;for(;t.parent;){let i=t.parent;i.items?.includes(t)&&(typeof i.setActive=="function"?i.setActive(t):i.layout?.activate&&i.layout.activate(i,t)),t=i}}syncTabs(){for(let e of this.query(t=>typeof t.setTabState=="function"))for(let t of e.items){let i=t instanceof a?t.query(s=>s instanceof o):[];e.setTabState(t,{errors:i.filter(s=>s.getError()).length,dirty:i.some(s=>s.isDirty())})}}updateRecord(e){let t=this.getValues(),i=new Set(this.getFields().filter(s=>s.name&&s.isDirty()).map(s=>s.name.split(".")[0]));for(let s of i)e.set(s,t[s])}markClean(){this.getFields().forEach(e=>e.markClean()),this.syncTabs()}reset(){this.getFields().forEach(e=>e.reset()),this.syncTabs()}isDirty(){return this.getFields().some(e=>e.isDirty())}isValid(){return this.counted().every(e=>e.config.disabled||e.isValid())}clearErrors(){this.getFields().forEach(e=>e.clearError()),this.syncTabs()}validate(){let e=this.counted().filter(i=>!i.config.disabled);for(let i of this.getFields())e.includes(i)||i.clearError();let t=e.filter(i=>!i.validate());return this.syncTabs(),t.length&&(this.reveal(t[0]),t[0].focus(),this.emit("invalid",t)),this.el.classList.toggle("is-invalid",!!t.length),!t.length}submit(){return this.emit("before-submit")===!1||!this.validate()?!1:(this.emit("submit",this.getValues()),!0)}setLabelWidth(e){this.config.labelWidth=e,this.rendered&&this.el.style.setProperty("--op-field-label-width",c(e))}setReadonly(e){this.config.readonly=e,this.getFields().forEach(t=>t.setReadonly(e))}};h("form",f);export{f as a};
|
|
2
|
+
//# sourceMappingURL=chunk-VU3GIDZ3.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/form/form.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport type { Model } from '../../../data/model';\nimport type { Component } from '../../../core/component';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { px } from '../../../core/dom';\n\nexport interface FormTab {\n title: string;\n icon?: string;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface FormConfig extends ContainerConfig {\n /** Shortcut: the fields in tabs, still one form (one `getValues`, one `validate`, one dirty). */\n tabs?: FormTab[];\n /** Default `labelPos` for fields that do not set their own. */\n labelPos?: 'top' | 'left';\n /** Width of the labels on the left (`labelPos: 'left'`), so they line up in a column. Number = px. */\n labelWidth?: number | string;\n /** Shortcut for a responsive grid layout (one column on narrow screens); items take `colspan` (a number or `'full'`). */\n columns?: number;\n readonly?: boolean;\n}\n\nconst getPath = (o: any, path: string) => path.split('.').reduce((v, k) => v?.[k], o);\nfunction setPath(o: any, path: string, value: unknown) {\n const keys = path.split('.');\n const last = keys.pop()!;\n const target = keys.reduce((v, k) => (v[k] ??= {}), o);\n target[last] = value;\n}\n\nexport class Form extends Container<FormConfig> {\n protected override baseCls = 'op-form';\n protected override tag = 'form' as const;\n /** Components hidden by their `showIf` rule: their fields do not count (no validation, not in `getValues`). */\n private ruledOut = new Set<Component>();\n private dirty = false;\n\n constructor(config: FormConfig = {}) {\n const items = [...(config.items ?? [])];\n if (config.tabs) {\n items.push({\n type: 'tabs',\n flex: 1,\n items: config.tabs.map((t) => ({ type: 'container', title: t.title, icon: t.icon, cls: 'op-form__tab', layout: t.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: t.items })),\n } as never);\n }\n super({ ...config, items });\n }\n\n protected override build() {\n const el = super.build();\n el.setAttribute('novalidate', '');\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= this.config.columns ? { type: 'grid', columns: this.config.columns } : { type: 'vbox' };\n if (this.config.labelWidth != null) this.setLabelWidth(this.config.labelWidth);\n if (this.config.labelPos) for (const f of this.getFields()) f.config.labelPos ??= this.config.labelPos;\n super.onRender();\n if (this.config.readonly) this.setReadonly(true);\n for (const f of this.getFields()) for (const ev of ['invalid', 'valid', 'dirty-change', 'change']) f.on(ev, () => this.syncTabs());\n for (const f of this.getFields()) f.on('change', () => this.changed());\n for (const f of this.getFields()) f.on('dirty-change', () => this.changed());\n this.applyRules();\n // Native submit (a `type=submit` button) and Enter inside a single-line field both go through submit().\n this.listen(this.el, 'submit', (e: Event) => {\n e.preventDefault();\n this.submit();\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const t = e.target as HTMLElement;\n if (e.key === 'Enter' && t instanceof HTMLInputElement && !e.defaultPrevented && t.type !== 'button') {\n e.preventDefault();\n this.submit();\n }\n });\n }\n\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getField(name: string): Field<any> | undefined {\n return this.getFields().find((f) => f.name === name);\n }\n\n /** Nested object built from field names (`address.city` \u2192 `{ address: { city } }`). Fields hidden by `showIf` are left out. */\n getValues(opts: { dirtyOnly?: boolean } = {}): Record<string, any> {\n const out: Record<string, any> = {};\n for (const f of this.counted()) if (f.name && (!opts.dirtyOnly || f.isDirty())) setPath(out, f.name, f.getValue());\n return out;\n }\n\n /** The fields that count: not inside something its `showIf` rule hid. */\n private counted(): Field<any>[] {\n return this.getFields().filter((f) => {\n for (let c: Component | undefined = f; c && c !== this; c = c.parent as Component | undefined) if (this.ruledOut.has(c)) return false;\n return true;\n });\n }\n\n /** A field changed: rerun the `showIf`/`enableIf` rules and say when the form as a whole became (un)changed. */\n private changed(): void {\n this.applyRules();\n const d = this.isDirty();\n if (d !== this.dirty) this.emit('dirty-change', (this.dirty = d));\n }\n\n /** Shows/hides and enables/disables every item that has a rule, from the current values (hidden fields included). */\n applyRules(): void {\n const values: Record<string, any> = {};\n for (const f of this.getFields()) if (f.name) setPath(values, f.name, f.getValue());\n for (const c of this.query((x) => !!(x.config.showIf || x.config.enableIf))) {\n const { showIf, enableIf } = c.config;\n if (showIf) {\n const show = !!showIf(values);\n if (show === this.ruledOut.has(c)) {\n if (show) (this.ruledOut.delete(c), c.show());\n else {\n this.ruledOut.add(c);\n c.hide();\n // what nobody can see has nothing to fix: its errors go with it\n for (const f of c instanceof Field ? [c] : c instanceof Container ? (c.query((x) => x instanceof Field) as Field<any>[]) : []) f.clearError();\n }\n }\n }\n if (enableIf) c.setDisabled(!enableIf(values));\n }\n }\n\n /** Brings a field into view (opening its tab or step) and focuses it. */\n focusField(field: Field<any>): void {\n this.reveal(field);\n field.focus();\n }\n\n /** Sets the fields present in `values` (silently). */\n setValues(values: Record<string, any>): void {\n for (const f of this.getFields()) {\n const v = f.name ? getPath(values, f.name) : undefined;\n if (v !== undefined) f.setValue(v, true);\n }\n }\n\n /** Fills the form from a plain object or a Model, and makes it the \"clean\" state. */\n load(record: Record<string, any> | Model): void {\n this.setValues('data' in record && 'get' in record ? (record as Model).data : record);\n this.markClean();\n this.clearErrors();\n this.emit('load', record);\n }\n\n /** Brings a field into view: asks every ancestor that shows one child at a time (Tabs, a card layout) to show the branch. */\n protected reveal(field: Component): void {\n let node: Component = field;\n while (node.parent) {\n const p = node.parent as any;\n if (p.items?.includes(node)) {\n if (typeof p.setActive === 'function') p.setActive(node);\n else if (p.layout?.activate) p.layout.activate(p, node);\n }\n node = p;\n }\n }\n\n /** Error counts and \"changed\" dots on the headers of every Tabs inside the form. */\n protected syncTabs(): void {\n for (const tabs of this.query((c) => typeof (c as any).setTabState === 'function') as any[]) {\n for (const panel of tabs.items as Component[]) {\n const fields = panel instanceof Container ? (panel.query((c) => c instanceof Field) as Field<any>[]) : [];\n tabs.setTabState(panel, { errors: fields.filter((f) => f.getError()).length, dirty: fields.some((f) => f.isDirty()) });\n }\n }\n }\n\n /** Writes the changed fields back into a Model. */\n updateRecord(model: Model): void {\n const all = this.getValues();\n const keys = new Set(this.getFields().filter((f) => f.name && f.isDirty()).map((f) => f.name!.split('.')[0]));\n for (const k of keys) model.set(k, all[k]);\n }\n\n markClean(): void {\n this.getFields().forEach((f) => f.markClean());\n this.syncTabs();\n }\n reset(): void {\n this.getFields().forEach((f) => f.reset());\n this.syncTabs();\n }\n isDirty(): boolean {\n return this.getFields().some((f) => f.isDirty());\n }\n isValid(): boolean {\n return this.counted().every((f) => f.config.disabled || f.isValid());\n }\n clearErrors(): void {\n this.getFields().forEach((f) => f.clearError());\n this.syncTabs();\n }\n\n /** Validates every field that counts (marks errors) and focuses the first invalid one. */\n validate(): boolean {\n // a hidden or disabled field is not validated: the user could not fix it\n const counted = this.counted().filter((f) => !f.config.disabled);\n for (const f of this.getFields()) if (!counted.includes(f)) f.clearError();\n const bad = counted.filter((f) => !f.validate());\n this.syncTabs();\n if (bad.length) {\n this.reveal(bad[0]); // the tab / step that holds it comes forward first\n bad[0].focus();\n this.emit('invalid', bad);\n }\n this.el.classList.toggle('is-invalid', !!bad.length);\n return !bad.length;\n }\n\n submit(): boolean {\n if (this.emit('before-submit') === false) return false;\n if (!this.validate()) return false;\n this.emit('submit', this.getValues());\n return true;\n }\n\n /** Width of the labels on the left (number = px); they line up in a column. */\n setLabelWidth(width: number | string): void {\n this.config.labelWidth = width;\n if (this.rendered) this.el.style.setProperty('--op-field-label-width', px(width));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n this.getFields().forEach((f) => f.setReadonly(readonly));\n }\n}\nregister('form', Form);\n"],
|
|
5
|
+
"mappings": "gKA4BA,IAAMA,EAAU,CAACC,EAAQC,IAAiBA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,EAAGC,IAAMD,IAAIC,CAAC,EAAGH,CAAC,EACpF,SAASI,EAAQJ,EAAQC,EAAcI,EAAgB,CACrD,IAAMC,EAAOL,EAAK,MAAM,GAAG,EACrBM,EAAOD,EAAK,IAAI,EAChBE,EAASF,EAAK,OAAO,CAACJ,EAAGC,IAAOD,EAAEC,CAAC,IAAM,CAAC,EAAIH,CAAC,EACrDQ,EAAOD,CAAI,EAAIF,CACjB,CAEO,IAAMI,EAAN,cAAmBC,CAAsB,CAC3B,QAAU,UACV,IAAM,OAEjB,SAAW,IAAI,IACf,MAAQ,GAEhB,YAAYC,EAAqB,CAAC,EAAG,CACnC,IAAMC,EAAQ,CAAC,GAAID,EAAO,OAAS,CAAC,CAAE,EAClCA,EAAO,MACTC,EAAM,KAAK,CACT,KAAM,OACN,KAAM,EACN,MAAOD,EAAO,KAAK,IAAKE,IAAO,CAAE,KAAM,YAAa,MAAOA,EAAE,MAAO,KAAMA,EAAE,KAAM,IAAK,eAAgB,OAAQA,EAAE,QAAU,CAAE,KAAM,OAAQ,QAAS,EAAG,IAAK,EAAG,EAAG,MAAOA,EAAE,KAAM,EAAE,CACrL,CAAU,EAEZ,MAAM,CAAE,GAAGF,EAAQ,MAAAC,CAAM,CAAC,CAC5B,CAEmB,OAAQ,CACzB,IAAME,EAAK,MAAM,MAAM,EACvB,OAAAA,EAAG,aAAa,aAAc,EAAE,EACzBA,CACT,CAEmB,UAAW,CAG5B,GAFA,KAAK,OAAO,SAAW,KAAK,OAAO,QAAU,CAAE,KAAM,OAAQ,QAAS,KAAK,OAAO,OAAQ,EAAI,CAAE,KAAM,MAAO,EACzG,KAAK,OAAO,YAAc,MAAM,KAAK,cAAc,KAAK,OAAO,UAAU,EACzE,KAAK,OAAO,SAAU,QAAWC,KAAK,KAAK,UAAU,EAAGA,EAAE,OAAO,WAAa,KAAK,OAAO,SAC9F,MAAM,SAAS,EACX,KAAK,OAAO,UAAU,KAAK,YAAY,EAAI,EAC/C,QAAWA,KAAK,KAAK,UAAU,EAAG,QAAWC,IAAM,CAAC,UAAW,QAAS,eAAgB,QAAQ,EAAGD,EAAE,GAAGC,EAAI,IAAM,KAAK,SAAS,CAAC,EACjI,QAAWD,KAAK,KAAK,UAAU,EAAGA,EAAE,GAAG,SAAU,IAAM,KAAK,QAAQ,CAAC,EACrE,QAAWA,KAAK,KAAK,UAAU,EAAGA,EAAE,GAAG,eAAgB,IAAM,KAAK,QAAQ,CAAC,EAC3E,KAAK,WAAW,EAEhB,KAAK,OAAO,KAAK,GAAI,SAAW,GAAa,CAC3C,EAAE,eAAe,EACjB,KAAK,OAAO,CACd,CAAC,EACD,KAAK,OAAO,KAAK,GAAI,UAAY,GAAqB,CACpD,IAAM,EAAI,EAAE,OACR,EAAE,MAAQ,SAAW,aAAa,kBAAoB,CAAC,EAAE,kBAAoB,EAAE,OAAS,WAC1F,EAAE,eAAe,EACjB,KAAK,OAAO,EAEhB,CAAC,CACH,CAEA,WAA0B,CACxB,OAAO,KAAK,MAAOE,GAAMA,aAAaC,CAAK,CAC7C,CAEA,SAASC,EAAsC,CAC7C,OAAO,KAAK,UAAU,EAAE,KAAMJ,GAAMA,EAAE,OAASI,CAAI,CACrD,CAGA,UAAUC,EAAgC,CAAC,EAAwB,CACjE,IAAMC,EAA2B,CAAC,EAClC,QAAWN,KAAK,KAAK,QAAQ,EAAOA,EAAE,OAAS,CAACK,EAAK,WAAaL,EAAE,QAAQ,IAAIX,EAAQiB,EAAKN,EAAE,KAAMA,EAAE,SAAS,CAAC,EACjH,OAAOM,CACT,CAGQ,SAAwB,CAC9B,OAAO,KAAK,UAAU,EAAE,OAAQN,GAAM,CACpC,QAASE,EAA2BF,EAAGE,GAAKA,IAAM,KAAMA,EAAIA,EAAE,OAAiC,GAAI,KAAK,SAAS,IAAIA,CAAC,EAAG,MAAO,GAChI,MAAO,EACT,CAAC,CACH,CAGQ,SAAgB,CACtB,KAAK,WAAW,EAChB,IAAMK,EAAI,KAAK,QAAQ,EACnBA,IAAM,KAAK,OAAO,KAAK,KAAK,eAAiB,KAAK,MAAQA,CAAE,CAClE,CAGA,YAAmB,CACjB,IAAMC,EAA8B,CAAC,EACrC,QAAWR,KAAK,KAAK,UAAU,EAAOA,EAAE,MAAMX,EAAQmB,EAAQR,EAAE,KAAMA,EAAE,SAAS,CAAC,EAClF,QAAWE,KAAK,KAAK,MAAOO,GAAM,CAAC,EAAEA,EAAE,OAAO,QAAUA,EAAE,OAAO,SAAS,EAAG,CAC3E,GAAM,CAAE,OAAAC,EAAQ,SAAAC,CAAS,EAAIT,EAAE,OAC/B,GAAIQ,EAAQ,CACV,IAAME,EAAO,CAAC,CAACF,EAAOF,CAAM,EAC5B,GAAII,IAAS,KAAK,SAAS,IAAIV,CAAC,EAC9B,GAAIU,EAAO,KAAK,SAAS,OAAOV,CAAC,EAAGA,EAAE,KAAK,MACtC,CACH,KAAK,SAAS,IAAIA,CAAC,EACnBA,EAAE,KAAK,EAEP,QAAWF,KAAKE,aAAaC,EAAQ,CAACD,CAAC,EAAIA,aAAaP,EAAaO,EAAE,MAAOO,GAAMA,aAAaN,CAAK,EAAqB,CAAC,EAAGH,EAAE,WAAW,CAC9I,CAEJ,CACIW,GAAUT,EAAE,YAAY,CAACS,EAASH,CAAM,CAAC,CAC/C,CACF,CAGA,WAAWK,EAAyB,CAClC,KAAK,OAAOA,CAAK,EACjBA,EAAM,MAAM,CACd,CAGA,UAAUL,EAAmC,CAC3C,QAAWR,KAAK,KAAK,UAAU,EAAG,CAChC,IAAMb,EAAIa,EAAE,KAAOhB,EAAQwB,EAAQR,EAAE,IAAI,EAAI,OACzCb,IAAM,QAAWa,EAAE,SAASb,EAAG,EAAI,CACzC,CACF,CAGA,KAAK2B,EAA2C,CAC9C,KAAK,UAAU,SAAUA,GAAU,QAASA,EAAUA,EAAiB,KAAOA,CAAM,EACpF,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,KAAK,OAAQA,CAAM,CAC1B,CAGU,OAAOD,EAAwB,CACvC,IAAIE,EAAkBF,EACtB,KAAOE,EAAK,QAAQ,CAClB,IAAMC,EAAID,EAAK,OACXC,EAAE,OAAO,SAASD,CAAI,IACpB,OAAOC,EAAE,WAAc,WAAYA,EAAE,UAAUD,CAAI,EAC9CC,EAAE,QAAQ,UAAUA,EAAE,OAAO,SAASA,EAAGD,CAAI,GAExDA,EAAOC,CACT,CACF,CAGU,UAAiB,CACzB,QAAWC,KAAQ,KAAK,MAAOf,GAAM,OAAQA,EAAU,aAAgB,UAAU,EAC/E,QAAWgB,KAASD,EAAK,MAAsB,CAC7C,IAAME,EAASD,aAAiBvB,EAAauB,EAAM,MAAOhB,GAAMA,aAAaC,CAAK,EAAqB,CAAC,EACxGc,EAAK,YAAYC,EAAO,CAAE,OAAQC,EAAO,OAAQnB,GAAMA,EAAE,SAAS,CAAC,EAAE,OAAQ,MAAOmB,EAAO,KAAMnB,GAAMA,EAAE,QAAQ,CAAC,CAAE,CAAC,CACvH,CAEJ,CAGA,aAAaoB,EAAoB,CAC/B,IAAMC,EAAM,KAAK,UAAU,EACrB9B,EAAO,IAAI,IAAI,KAAK,UAAU,EAAE,OAAQS,GAAMA,EAAE,MAAQA,EAAE,QAAQ,CAAC,EAAE,IAAKA,GAAMA,EAAE,KAAM,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,EAC5G,QAAWZ,KAAKG,EAAM6B,EAAM,IAAIhC,EAAGiC,EAAIjC,CAAC,CAAC,CAC3C,CAEA,WAAkB,CAChB,KAAK,UAAU,EAAE,QAASY,GAAMA,EAAE,UAAU,CAAC,EAC7C,KAAK,SAAS,CAChB,CACA,OAAc,CACZ,KAAK,UAAU,EAAE,QAASA,GAAMA,EAAE,MAAM,CAAC,EACzC,KAAK,SAAS,CAChB,CACA,SAAmB,CACjB,OAAO,KAAK,UAAU,EAAE,KAAMA,GAAMA,EAAE,QAAQ,CAAC,CACjD,CACA,SAAmB,CACjB,OAAO,KAAK,QAAQ,EAAE,MAAOA,GAAMA,EAAE,OAAO,UAAYA,EAAE,QAAQ,CAAC,CACrE,CACA,aAAoB,CAClB,KAAK,UAAU,EAAE,QAASA,GAAMA,EAAE,WAAW,CAAC,EAC9C,KAAK,SAAS,CAChB,CAGA,UAAoB,CAElB,IAAMsB,EAAU,KAAK,QAAQ,EAAE,OAAQtB,GAAM,CAACA,EAAE,OAAO,QAAQ,EAC/D,QAAWA,KAAK,KAAK,UAAU,EAAQsB,EAAQ,SAAStB,CAAC,GAAGA,EAAE,WAAW,EACzE,IAAMuB,EAAMD,EAAQ,OAAQtB,GAAM,CAACA,EAAE,SAAS,CAAC,EAC/C,YAAK,SAAS,EACVuB,EAAI,SACN,KAAK,OAAOA,EAAI,CAAC,CAAC,EAClBA,EAAI,CAAC,EAAE,MAAM,EACb,KAAK,KAAK,UAAWA,CAAG,GAE1B,KAAK,GAAG,UAAU,OAAO,aAAc,CAAC,CAACA,EAAI,MAAM,EAC5C,CAACA,EAAI,MACd,CAEA,QAAkB,CAEhB,OADI,KAAK,KAAK,eAAe,IAAM,IAC/B,CAAC,KAAK,SAAS,EAAU,IAC7B,KAAK,KAAK,SAAU,KAAK,UAAU,CAAC,EAC7B,GACT,CAGA,cAAcC,EAA8B,CAC1C,KAAK,OAAO,WAAaA,EACrB,KAAK,UAAU,KAAK,GAAG,MAAM,YAAY,yBAA0BC,EAAGD,CAAK,CAAC,CAClF,CAEA,YAAYE,EAAyB,CACnC,KAAK,OAAO,SAAWA,EACvB,KAAK,UAAU,EAAE,QAAS1B,GAAMA,EAAE,YAAY0B,CAAQ,CAAC,CACzD,CACF,EACAC,EAAS,OAAQjC,CAAI",
|
|
6
|
+
"names": ["getPath", "o", "path", "v", "k", "setPath", "value", "keys", "last", "target", "Form", "Container", "config", "items", "t", "el", "f", "ev", "c", "Field", "name", "opts", "out", "d", "values", "x", "showIf", "enableIf", "show", "field", "record", "node", "p", "tabs", "panel", "fields", "model", "all", "counted", "bad", "width", "px", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as o}from"./chunk-2ZRNGG2N.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as s}from"./chunk-MW3RWBZ7.js";var r=class extends o{baseCls="op-field op-textfield";clearBtn;createInput(){return n("input","op-textfield__input",{type:this.config.inputType??"text"})}get input(){return this.inputEl}createControl(){let t=this.config,e=this.inputEl=this.createInput(),i=n("div","op-textfield__wrap",{},e);return t.placeholder&&(e.placeholder=t.placeholder),t.maxLength!=null&&(e.maxLength=t.maxLength),t.autocomplete&&(e.autocomplete=t.autocomplete),this.listen(e,"input",()=>this.onInput()),this.listen(e,"keydown",a=>this.onKey(a)),t.selectOnFocus&&this.listen(e,"focus",()=>e.select()),t.clearable&&(this.clearBtn=n("button","op-textfield__clear",{type:"button",tabindex:-1,"aria-label":s("clear")},p("x")),this.listen(this.clearBtn,"click",()=>{this.setValue(this.parse("")),e.focus()}),i.append(this.clearBtn)),i}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.commit(this.parse(this.input.value))}parse(t){return t}display(t){return t==null?"":String(t)}onKey(t){t.key==="Enter"&&!t.defaultPrevented?(this.flushSettled(),this.emit("enter",this.getValue())):t.key==="Escape"&&this.config.clearable&&this.input.value&&(t.stopPropagation(),this.setValue(this.parse("")))}getDisplayText(){return this.rendered?this.input.value:this.display(this.value)}applyValue(t){this.input.value=this.display(t),this.el.classList.toggle("has-value",!!this.input.value)}onReadonly(t){this.input.readOnly=t}onDisabled(t){this.input.disabled=t,this.clearBtn&&(this.clearBtn.disabled=t)}check(){let t=super.check(),e=this.display(this.value),i=this.config;return t||!e?t:i.minLength!=null&&e.length<i.minLength?s("minLength",{n:i.minLength}):i.pattern&&!new RegExp(i.pattern).test(e)?s("pattern"):""}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}setMaxLength(t){this.config.maxLength=t,this.rendered&&(this.input.maxLength=t)}setInputType(t){this.config.inputType=t,this.rendered&&this.input instanceof HTMLInputElement&&(this.input.type=t)}select(){this.input.select()}getInput(){return this.render(),this.input}};l("textfield",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-W3H7GTJY.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as p}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as p}from"./chunk-W3H7GTJY.js";import{b as a}from"./chunk-OWEQT2HN.js";import{b as i,f as n}from"./chunk-PZSHOSOS.js";import{a as s}from"./chunk-TIPK3SCJ.js";var o=class extends p{baseCls="op-field op-textfield op-textarea";createInput(){return i("textarea","op-textfield__input op-textarea__input",{rows:this.config.rows??3})}onKey(e){if(e.key==="Enter"){(e.ctrlKey||e.metaKey)&&this.emit("enter",this.getValue());return}super.onKey(e)}onInput(){super.onInput(),this.grow()}applyValue(e){super.applyValue(e),this.grow()}notifyMount(){super.notifyMount(),this.grow()}grow(){let e=this.config;if(!e.autoGrow||!this.rendered)return;let t=this.input;t.style.height="auto";let r=t.scrollHeight;if(e.maxRows){let l=a(t,"1lh")||t.scrollHeight/(t.rows||1);r=Math.min(r,l*e.maxRows)}r&&(t.style.height=`${n(r,0,1/0)}px`)}setRows(e){this.config.rows=e,this.rendered&&(this.input.rows=e)}};s("textarea",o);export{o as a};
|
|
2
|
+
//# sourceMappingURL=chunk-XHOBNSBO.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{a as b}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as r}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{e as g,f as p}from"./chunk-MW3RWBZ7.js";g("en",{codeCopy:"Copy",codeCopied:"Copied"});g("pt-BR",{codeCopy:"Copiar",codeCopied:"Copiado"});var w={ts:"TypeScript",js:"JavaScript",json:"JSON",css:"CSS",html:"HTML",sh:"Shell",text:"Text"},y="import|from|export|default|function|return|const|let|var|new|await|async|if|else|for|of|in|while|do|switch|case|break|continue|throw|try|catch|finally|class|extends|implements|interface|type|enum|as|typeof|instanceof|keyof|readonly|public|private|protected|static|this|void|true|false|null|undefined",c=`'(?:[^'\\\\\\n]|\\\\.)*'|"(?:[^"\\\\\\n]|\\\\.)*"`,l={ts:[new RegExp(`(\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\/)|(${c}|\`(?:[^\`\\\\]|\\\\.)*\`)|\\b(${y})\\b|\\b(\\d+(?:\\.\\d+)?)\\b`,"g"),["comment","string","keyword","number"]],js:[/./g,[]],json:[new RegExp(`("(?:[^"\\\\\\n]|\\\\.)*")(?=\\s*:)|(${c})|\\b(true|false|null)\\b|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)`,"g"),["property","string","keyword","number"]],css:[new RegExp(`(\\/\\*[\\s\\S]*?\\*\\/)|(${c})|(@[\\w-]+)|([\\w-]+)(?=\\s*:[^:{;]*[;}\\n])|(#[0-9a-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:%|[a-z]+)?)`,"g"),["comment","string","keyword","property","number"]],html:[new RegExp(`(<!--[\\s\\S]*?-->)|(<\\/?[\\w-]+|\\/?>)|([\\w:-]+)(?==)|(${c})`,"g"),["comment","tag","attr","string"]],sh:[new RegExp(`(#[^\\n]*)|(${c})|\\b(if|then|else|fi|for|in|do|done|case|esac|while|function|export|return|sudo)\\b|(\\$\\{?[\\w]+\\}?|--?[\\w-]+)`,"g"),["comment","string","keyword","attr"]]};l.js=l.ts;function x(s,e="ts"){if(e==="text"||!l[e])return[["",s]];let[t,a]=l[e],i=[],n=0;for(let o of s.matchAll(t))o.index>n&&i.push(["",s.slice(n,o.index)]),i.push([a[o.slice(1).findIndex(d=>d!==void 0)]??"",o[0]]),n=o.index+o[0].length;return n<s.length&&i.push(["",s.slice(n)]),i}var v=s=>{if(Array.isArray(s))return new Set(s);let e=new Set;for(let t of(s??"").split(",")){let[a,i]=t.split("-").map(n=>Number(n.trim()));if(Number.isFinite(a))for(let n=a;n<=(Number.isFinite(i)?i:a);n++)e.add(n)}return e},u=class extends f{baseCls="op-codeviewer";titleEl;bar;pre;codeEl;status;copyBtn;build(){return this.titleEl=r("span","op-codeviewer__title"),this.copyBtn=new b({text:p("codeCopy"),icon:"file",variant:"ghost",handler:()=>{this.copy()}}),this.status=r("span","op-sr-only op-codeviewer__status",{"aria-live":"polite"}),this.bar=r("div","op-codeviewer__bar",{},this.titleEl,this.copyBtn.el,this.status),this.codeEl=r("code","op-codeviewer__code"),this.pre=r("pre","op-codeviewer__pre",{tabindex:0},this.codeEl),r("div","op-codeviewer",{},this.bar,this.pre)}onRender(){this.own(()=>this.copyBtn.destroy()),this.paintBar(),this.paintCode(),this.setWrap(!!this.config.wrap),this.setMaxHeight(this.config.maxHeight)}get language(){return this.config.language??"ts"}paintBar(){let e=this.config,t=e.title??w[this.language]??this.language;this.titleEl.textContent=t,this.pre.setAttribute("aria-label",t),this.bar.hidden=e.bar===!1,this.copyBtn.el.hidden=e.copyable===!1}paintCode(){let e=this.config,t=e.startLine??1,a=v(e.highlight),i=[r("span","op-codeviewer__line")];for(let[o,d]of x(e.code??"",this.language))d.split(`
|
|
2
|
+
`).forEach((h,C)=>{C&&i.push(r("span","op-codeviewer__line")),h&&i[i.length-1].append(o?r("span",`op-codeviewer__tok--${o}`,{},h):h)});i.forEach((o,d)=>{a.has(t+d)&&o.classList.add("is-marked"),d<i.length-1&&o.append(`
|
|
3
|
+
`)}),this.codeEl.replaceChildren(...i);let n=e.lineNumbers!==!1;this.el.classList.toggle("has-numbers",n),this.codeEl.style.counterReset=`op-codeline ${t-1}`,this.codeEl.style.setProperty("--op-codeviewer-gutter",`${String(t+i.length-1).length}ch`)}getCode(){return this.config.code??""}async copy(){let e=this.getCode();try{await navigator.clipboard.writeText(e)}catch{let t=document.createRange();return t.selectNodeContents(this.codeEl),getSelection()?.removeAllRanges(),getSelection()?.addRange(t),!1}return this.copyBtn.setText(p("codeCopied")),this.copyBtn.setIcon("check"),this.status.textContent=p("codeCopied"),this.later(()=>{this.copyBtn.setText(p("codeCopy")),this.copyBtn.setIcon("file"),this.status.textContent=""},1600),this.emit("copy",e),!0}update(e,t=!1){Object.assign(this.config,e),this.rendered&&(t&&this.paintBar(),this.paintCode())}setCode(e){this.update({code:e})}setLanguage(e){this.update({language:e},!0)}setTitle(e){this.update({title:e},!0)}setLineNumbers(e){this.update({lineNumbers:e})}setStartLine(e){this.update({startLine:e})}setHighlight(e){this.update({highlight:e})}setWrap(e){this.config.wrap=e,this.rendered&&this.el.classList.toggle("is-wrapped",e)}setMaxHeight(e){this.config.maxHeight=e,this.rendered&&(this.pre.style.maxBlockSize=e==null?"":typeof e=="number"?`${e}px`:e)}};m("codeviewer",u);export{x as a,u as b};
|
|
4
|
+
//# sourceMappingURL=chunk-XX2MVWFS.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/base/codeviewer/codeviewer.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport { Button } from '../button/button';\n\nexport type CodeLanguage = 'ts' | 'js' | 'json' | 'css' | 'html' | 'sh' | 'text';\n\nexport interface CodeViewerConfig extends ComponentConfig {\n code?: string;\n language?: CodeLanguage;\n /** The bar text. Default: the language name. */\n title?: string;\n lineNumbers?: boolean;\n startLine?: number;\n /** Lines to mark: `[3, 4]` or `'3-5,8'` (numbers as shown, so they follow `startLine`). */\n highlight?: number[] | string;\n wrap?: boolean;\n copyable?: boolean;\n bar?: boolean;\n maxHeight?: number | string;\n}\n\naddMessages('en', { codeCopy: 'Copy', codeCopied: 'Copied' });\naddMessages('pt-BR', { codeCopy: 'Copiar', codeCopied: 'Copiado' });\n\nconst NAMES: Record<CodeLanguage, string> = { ts: 'TypeScript', js: 'JavaScript', json: 'JSON', css: 'CSS', html: 'HTML', sh: 'Shell', text: 'Text' };\n\n// One regex per language: each capture group is a token kind, in the order of KINDS[lang]. Anything else is plain text.\nconst JS_WORDS = 'import|from|export|default|function|return|const|let|var|new|await|async|if|else|for|of|in|while|do|switch|case|break|continue|throw|try|catch|finally|class|extends|implements|interface|type|enum|as|typeof|instanceof|keyof|readonly|public|private|protected|static|this|void|true|false|null|undefined';\nconst STR = `'(?:[^'\\\\\\\\\\\\n]|\\\\\\\\.)*'|\"(?:[^\"\\\\\\\\\\\\n]|\\\\\\\\.)*\"`;\nconst RULES: Record<Exclude<CodeLanguage, 'text'>, [RegExp, string[]]> = {\n ts: [new RegExp(`(\\\\/\\\\/[^\\\\n]*|\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)|(${STR}|\\`(?:[^\\`\\\\\\\\]|\\\\\\\\.)*\\`)|\\\\b(${JS_WORDS})\\\\b|\\\\b(\\\\d+(?:\\\\.\\\\d+)?)\\\\b`, 'g'), ['comment', 'string', 'keyword', 'number']],\n js: [/./g, []], // same as ts (filled below)\n json: [new RegExp(`(\"(?:[^\"\\\\\\\\\\\\n]|\\\\\\\\.)*\")(?=\\\\s*:)|(${STR})|\\\\b(true|false|null)\\\\b|(-?\\\\d+(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?)`, 'g'), ['property', 'string', 'keyword', 'number']],\n css: [new RegExp(`(\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)|(${STR})|(@[\\\\w-]+)|([\\\\w-]+)(?=\\\\s*:[^:{;]*[;}\\\\n])|(#[0-9a-fA-F]{3,8}\\\\b|-?\\\\d*\\\\.?\\\\d+(?:%|[a-z]+)?)`, 'g'), ['comment', 'string', 'keyword', 'property', 'number']],\n html: [new RegExp(`(<!--[\\\\s\\\\S]*?-->)|(<\\\\/?[\\\\w-]+|\\\\/?>)|([\\\\w:-]+)(?==)|(${STR})`, 'g'), ['comment', 'tag', 'attr', 'string']],\n sh: [new RegExp(`(#[^\\\\n]*)|(${STR})|\\\\b(if|then|else|fi|for|in|do|done|case|esac|while|function|export|return|sudo)\\\\b|(\\\\$\\\\{?[\\\\w]+\\\\}?|--?[\\\\w-]+)`, 'g'), ['comment', 'string', 'keyword', 'attr']],\n};\nRULES.js = RULES.ts;\n\ntype Tok = [kind: string, text: string];\n\n/** Splits code into tokens (kind '' = plain). Pure: no DOM. */\nexport function tokenize(code: string, language: CodeLanguage = 'ts'): Tok[] {\n if (language === 'text' || !RULES[language]) return [['', code]];\n const [re, kinds] = RULES[language];\n const out: Tok[] = [];\n let last = 0;\n for (const m of code.matchAll(re)) {\n if (m.index! > last) out.push(['', code.slice(last, m.index)]);\n out.push([kinds[m.slice(1).findIndex((g) => g !== undefined)] ?? '', m[0]]);\n last = m.index! + m[0].length;\n }\n if (last < code.length) out.push(['', code.slice(last)]);\n return out;\n}\n\n/** `'3-5,8'` or `[3, 4]` \u2192 a set of line numbers. */\nconst lineSet = (v: CodeViewerConfig['highlight']): Set<number> => {\n if (Array.isArray(v)) return new Set(v);\n const out = new Set<number>();\n for (const part of (v ?? '').split(',')) {\n const [a, b] = part.split('-').map((x) => Number(x.trim()));\n if (Number.isFinite(a)) for (let n = a; n <= (Number.isFinite(b) ? b : a); n++) out.add(n);\n }\n return out;\n};\n\n/** Read-only code: syntax colors, line numbers (CSS counters, never copied), marked lines and a copy button. */\nexport class CodeViewer extends Component<CodeViewerConfig> {\n protected override baseCls = 'op-codeviewer';\n private titleEl!: HTMLElement;\n private bar!: HTMLElement;\n private pre!: HTMLElement;\n private codeEl!: HTMLElement;\n private status!: HTMLElement;\n private copyBtn!: Button;\n\n protected override build() {\n this.titleEl = h('span', 'op-codeviewer__title');\n this.copyBtn = new Button({ text: t('codeCopy'), icon: 'file', variant: 'ghost', handler: () => void this.copy() });\n this.status = h('span', 'op-sr-only op-codeviewer__status', { 'aria-live': 'polite' });\n this.bar = h('div', 'op-codeviewer__bar', {}, this.titleEl, this.copyBtn.el, this.status);\n this.codeEl = h('code', 'op-codeviewer__code');\n this.pre = h('pre', 'op-codeviewer__pre', { tabindex: 0 }, this.codeEl);\n return h('div', 'op-codeviewer', {}, this.bar, this.pre);\n }\n\n protected override onRender() {\n this.own(() => this.copyBtn.destroy());\n this.paintBar();\n this.paintCode();\n this.setWrap(!!this.config.wrap);\n this.setMaxHeight(this.config.maxHeight);\n }\n\n private get language(): CodeLanguage {\n return this.config.language ?? 'ts';\n }\n\n private paintBar() {\n const c = this.config;\n const title = c.title ?? NAMES[this.language] ?? this.language;\n this.titleEl.textContent = title;\n this.pre.setAttribute('aria-label', title);\n this.bar.hidden = c.bar === false;\n this.copyBtn.el.hidden = c.copyable === false;\n }\n\n /** One line element per line, tokens split at line breaks so a comment or string can span lines. */\n private paintCode() {\n const c = this.config;\n const start = c.startLine ?? 1;\n const marks = lineSet(c.highlight);\n const lines: HTMLElement[] = [h('span', 'op-codeviewer__line')];\n for (const [kind, text] of tokenize(c.code ?? '', this.language)) {\n text.split('\\n').forEach((piece, i) => {\n if (i) lines.push(h('span', 'op-codeviewer__line'));\n if (piece) lines[lines.length - 1].append(kind ? h('span', `op-codeviewer__tok--${kind}`, {}, piece) : piece);\n });\n }\n lines.forEach((l, i) => {\n if (marks.has(start + i)) l.classList.add('is-marked');\n if (i < lines.length - 1) l.append('\\n');\n });\n this.codeEl.replaceChildren(...lines);\n const numbers = c.lineNumbers !== false;\n this.el.classList.toggle('has-numbers', numbers);\n this.codeEl.style.counterReset = `op-codeline ${start - 1}`;\n this.codeEl.style.setProperty('--op-codeviewer-gutter', `${String(start + lines.length - 1).length}ch`);\n }\n\n getCode(): string {\n return this.config.code ?? '';\n }\n\n /** Copies the code. Without a clipboard (an insecure page) it selects the code instead and resolves false. */\n async copy(): Promise<boolean> {\n const code = this.getCode();\n try {\n await navigator.clipboard.writeText(code);\n } catch {\n const range = document.createRange();\n range.selectNodeContents(this.codeEl);\n getSelection()?.removeAllRanges();\n getSelection()?.addRange(range);\n return false;\n }\n this.copyBtn.setText(t('codeCopied'));\n this.copyBtn.setIcon('check');\n this.status.textContent = t('codeCopied');\n this.later(() => {\n this.copyBtn.setText(t('codeCopy'));\n this.copyBtn.setIcon('file');\n this.status.textContent = '';\n }, 1600);\n this.emit('copy', code);\n return true;\n }\n\n private update(patch: Partial<CodeViewerConfig>, bar = false) {\n Object.assign(this.config, patch);\n if (!this.rendered) return;\n if (bar) this.paintBar();\n this.paintCode();\n }\n setCode(code: string) {\n this.update({ code });\n }\n setLanguage(language: CodeLanguage) {\n this.update({ language }, true);\n }\n setTitle(title: string) {\n this.update({ title }, true);\n }\n setLineNumbers(lineNumbers: boolean) {\n this.update({ lineNumbers });\n }\n setStartLine(startLine: number) {\n this.update({ startLine });\n }\n setHighlight(highlight: CodeViewerConfig['highlight']) {\n this.update({ highlight });\n }\n setWrap(wrap: boolean) {\n this.config.wrap = wrap;\n if (this.rendered) this.el.classList.toggle('is-wrapped', wrap);\n }\n setMaxHeight(maxHeight: CodeViewerConfig['maxHeight']) {\n this.config.maxHeight = maxHeight;\n if (this.rendered) this.pre.style.maxBlockSize = maxHeight == null ? '' : typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n}\nregister('codeviewer', CodeViewer);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "NAMES", "JS_WORDS", "STR", "RULES", "tokenize", "code", "language", "re", "kinds", "out", "last", "m", "g", "lineSet", "v", "part", "b", "x", "CodeViewer", "Component", "h", "Button", "t", "c", "title", "start", "marks", "lines", "kind", "text", "piece", "i", "l", "numbers", "range", "patch", "bar", "lineNumbers", "startLine", "highlight", "wrap", "maxHeight", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/layout/panel/reload.ts"],
|
|
4
|
+
"sourcesContent": ["// The \u21BB icon and its label, shared by Panel and Tabs: only components that can reload pay for them.\nimport { registerIcons } from '../../base/icon/icon';\nimport { addMessages } from '../../../core/i18n';\n\nregisterIcons({ refresh: '<path d=\"M21 12a9 9 0 1 1-2.64-6.36M21 3v6h-6\"/>' });\naddMessages('en', { reload: 'Reload' });\naddMessages('pt-BR', { reload: 'Recarregar' });\n"],
|
|
5
|
+
"mappings": "gFAIAA,EAAc,CAAE,QAAS,kDAAmD,CAAC,EAC7EC,EAAY,KAAM,CAAE,OAAQ,QAAS,CAAC,EACtCA,EAAY,QAAS,CAAE,OAAQ,YAAa,CAAC",
|
|
6
|
+
"names": ["registerIcons", "addMessages"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{e as n,f}from"./chunk-MW3RWBZ7.js";n("en",{feOne:"Fix 1 problem before saving",feMany:"Fix {n} problems before saving"});n("pt-BR",{feOne:"Corrija 1 problema antes de salvar",feMany:"Corrija {n} problemas antes de salvar"});var l=class extends a{baseCls="op-formerrors";titleEl;listEl;form;active=!1;build(){return this.titleEl=o("div","op-formerrors__title"),this.listEl=o("ul","op-formerrors__list"),o("div","op-formerrors",{role:"alert",tabindex:-1},this.titleEl,this.listEl)}onRender(){this.el.hidden=!0;let e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;let t=this.form=e;if(t){t.on("invalid",()=>{this.active=!0,this.refresh(),this.config.focus&&this.el.focus()});for(let r of t.getFields())for(let i of["invalid","valid"])r.on(i,()=>this.active&&this.refresh());this.listen(this.listEl,"click",r=>{let i=Number(r.target.closest("[data-i]")?.dataset.i),s=this.getErrors()[i];s&&(t.focusField(s),this.emit("go",s))})}}getErrors(){return this.form?.getFields().filter(e=>e.getError())??[]}refresh(){let e=this.getErrors(),t=e.length,r=this.config.title;this.titleEl.textContent=typeof r=="function"?r(t):r??f(t===1?"feOne":"feMany",{n:t}),this.listEl.replaceChildren(...e.map((i,s)=>o("li","",{},o("button","op-formerrors__link",{type:"button","data-i":s},`${i.config.label??i.name??""}: ${i.getError()}`)))),this.el.hidden=!t}};m("formerrors",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-YBAYEU25.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/formerrors/formerrors.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport { Field } from '../../../core/field';\nimport type { Form } from '../form/form';\n\naddMessages('en', { feOne: 'Fix 1 problem before saving', feMany: 'Fix {n} problems before saving' });\naddMessages('pt-BR', { feOne: 'Corrija 1 problema antes de salvar', feMany: 'Corrija {n} problemas antes de salvar' });\n\nexport interface FormErrorsConfig extends ComponentConfig {\n /** The heading: a function of the number of problems, or a fixed text. */\n title?: string | ((n: number) => string);\n /** Take the focus after a failed submit (instead of the first invalid field). */\n focus?: boolean;\n}\n\n/** An error summary: after a failed validation, every problem as a button that takes you to its field. */\nexport class FormErrors extends Component<FormErrorsConfig> {\n protected override baseCls = 'op-formerrors';\n private titleEl!: HTMLElement;\n private listEl!: HTMLElement;\n private form?: Form;\n /** Shown only once the form was validated with errors (not while the user is still filling it in). */\n private active = false;\n\n protected override build() {\n this.titleEl = h('div', 'op-formerrors__title');\n this.listEl = h('ul', 'op-formerrors__list');\n return h('div', 'op-formerrors', { role: 'alert', tabindex: -1 }, this.titleEl, this.listEl);\n }\n\n protected override onRender() {\n this.el.hidden = true;\n let p = this.parent as Component | undefined;\n while (p && !('focusField' in p && 'getFields' in p)) p = p.parent as Component | undefined; // the Form, by its methods (no import)\n const form = (this.form = p as Form | undefined);\n if (!form) return;\n form.on('invalid', () => {\n this.active = true;\n this.refresh();\n if (this.config.focus) this.el.focus();\n });\n for (const f of form.getFields()) for (const ev of ['invalid', 'valid']) f.on(ev, () => this.active && this.refresh());\n this.listen(this.listEl, 'click', (e: Event) => {\n const i = Number((e.target as HTMLElement).closest<HTMLElement>('[data-i]')?.dataset.i);\n const field = this.getErrors()[i];\n if (!field) return;\n form.focusField(field);\n this.emit('go', field);\n });\n }\n\n /** The form fields that have an error, in order. */\n getErrors(): Field<any>[] {\n return this.form?.getFields().filter((f) => f.getError()) ?? [];\n }\n\n /** Redraws the list from the current errors (hides when there are none). */\n refresh(): void {\n const errs = this.getErrors();\n const n = errs.length;\n const title = this.config.title;\n this.titleEl.textContent = typeof title === 'function' ? title(n) : (title ?? t(n === 1 ? 'feOne' : 'feMany', { n }));\n this.listEl.replaceChildren(...errs.map((f, i) => h('li', '', {}, h('button', 'op-formerrors__link', { type: 'button', 'data-i': i }, `${f.config.label ?? f.name ?? ''}: ${f.getError()}`))));\n this.el.hidden = !n;\n }\n}\nregister('formerrors', FormErrors);\n"],
|
|
5
|
+
"mappings": "6JAOAA,EAAY,KAAM,CAAE,MAAO,8BAA+B,OAAQ,gCAAiC,CAAC,EACpGA,EAAY,QAAS,CAAE,MAAO,qCAAsC,OAAQ,uCAAwC,CAAC,EAU9G,IAAMC,EAAN,cAAyBC,CAA4B,CACvC,QAAU,gBACrB,QACA,OACA,KAEA,OAAS,GAEE,OAAQ,CACzB,YAAK,QAAUC,EAAE,MAAO,sBAAsB,EAC9C,KAAK,OAASA,EAAE,KAAM,qBAAqB,EACpCA,EAAE,MAAO,gBAAiB,CAAE,KAAM,QAAS,SAAU,EAAG,EAAG,KAAK,QAAS,KAAK,MAAM,CAC7F,CAEmB,UAAW,CAC5B,KAAK,GAAG,OAAS,GACjB,IAAIC,EAAI,KAAK,OACb,KAAOA,GAAK,EAAE,eAAgBA,GAAK,cAAeA,IAAIA,EAAIA,EAAE,OAC5D,IAAMC,EAAQ,KAAK,KAAOD,EAC1B,GAAKC,EACL,CAAAA,EAAK,GAAG,UAAW,IAAM,CACvB,KAAK,OAAS,GACd,KAAK,QAAQ,EACT,KAAK,OAAO,OAAO,KAAK,GAAG,MAAM,CACvC,CAAC,EACD,QAAWC,KAAKD,EAAK,UAAU,EAAG,QAAWE,IAAM,CAAC,UAAW,OAAO,EAAGD,EAAE,GAAGC,EAAI,IAAM,KAAK,QAAU,KAAK,QAAQ,CAAC,EACrH,KAAK,OAAO,KAAK,OAAQ,QAAUC,GAAa,CAC9C,IAAM,EAAI,OAAQA,EAAE,OAAuB,QAAqB,UAAU,GAAG,QAAQ,CAAC,EAChFC,EAAQ,KAAK,UAAU,EAAE,CAAC,EAC3BA,IACLJ,EAAK,WAAWI,CAAK,EACrB,KAAK,KAAK,KAAMA,CAAK,EACvB,CAAC,EACH,CAGA,WAA0B,CACxB,OAAO,KAAK,MAAM,UAAU,EAAE,OAAQH,GAAMA,EAAE,SAAS,CAAC,GAAK,CAAC,CAChE,CAGA,SAAgB,CACd,IAAMI,EAAO,KAAK,UAAU,EACtBC,EAAID,EAAK,OACTE,EAAQ,KAAK,OAAO,MAC1B,KAAK,QAAQ,YAAc,OAAOA,GAAU,WAAaA,EAAMD,CAAC,EAAKC,GAASC,EAAEF,IAAM,EAAI,QAAU,SAAU,CAAE,EAAAA,CAAE,CAAC,EACnH,KAAK,OAAO,gBAAgB,GAAGD,EAAK,IAAI,CAACJ,EAAGQ,IAAMX,EAAE,KAAM,GAAI,CAAC,EAAGA,EAAE,SAAU,sBAAuB,CAAE,KAAM,SAAU,SAAUW,CAAE,EAAG,GAAGR,EAAE,OAAO,OAASA,EAAE,MAAQ,EAAE,KAAKA,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAC7L,KAAK,GAAG,OAAS,CAACK,CACpB,CACF,EACAI,EAAS,aAAcd,CAAU",
|
|
6
|
+
"names": ["addMessages", "FormErrors", "Component", "h", "p", "form", "f", "ev", "e", "field", "errs", "n", "title", "t", "i", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-A2NKDOYN.js";import{a as n}from"./chunk-TIPK3SCJ.js";var t=class extends o{baseCls="op-label";build(){let e=document.createElement(this.config.for?"label":"span");return e.className="op-label",this.config.for&&(e.htmlFor=this.config.for),e}onRender(){this.setText(this.config.text??""),this.setVariant(this.config.variant??"default")}setText(e){this.config.text=e,this.rendered&&(this.el.textContent=e)}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let i of["default","muted","title"])this.el.classList.toggle(`op-label--${i}`,i===e)}};n("label",t);export{t as a};
|
|
2
|
+
//# sourceMappingURL=chunk-YHEMA56R.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/base/label/label.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\n\nexport interface LabelConfig extends ComponentConfig {\n text?: string;\n /** Id of the field this label names (renders a `<label for>`). */\n for?: string;\n variant?: 'default' | 'muted' | 'title';\n}\n\nexport class Label extends Component<LabelConfig> {\n protected override baseCls = 'op-label';\n protected override build() {\n const el = document.createElement(this.config.for ? 'label' : 'span');\n el.className = 'op-label';\n if (this.config.for) (el as HTMLLabelElement).htmlFor = this.config.for;\n return el;\n }\n protected override onRender() {\n this.setText(this.config.text ?? '');\n this.setVariant(this.config.variant ?? 'default');\n }\n setText(text: string) {\n this.config.text = text;\n if (this.rendered) this.el.textContent = text;\n }\n setVariant(variant: NonNullable<LabelConfig['variant']>) {\n this.config.variant = variant;\n if (!this.rendered) return;\n for (const v of ['default', 'muted', 'title']) this.el.classList.toggle(`op-label--${v}`, v === variant);\n }\n}\nregister('label', Label);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "gFAUO,IAAMA,EAAN,cAAoBC,CAAuB,CAC7B,QAAU,WACV,OAAQ,CACzB,IAAMC,EAAK,SAAS,cAAc,KAAK,OAAO,IAAM,QAAU,MAAM,EACpE,OAAAA,EAAG,UAAY,WACX,KAAK,OAAO,MAAMA,EAAwB,QAAU,KAAK,OAAO,KAC7DA,CACT,CACmB,UAAW,CAC5B,KAAK,QAAQ,KAAK,OAAO,MAAQ,EAAE,EACnC,KAAK,WAAW,KAAK,OAAO,SAAW,SAAS,CAClD,CACA,QAAQC,EAAc,CACpB,KAAK,OAAO,KAAOA,EACf,KAAK,WAAU,KAAK,GAAG,YAAcA,EAC3C,CACA,WAAWC,EAA8C,CAEvD,GADA,KAAK,OAAO,QAAUA,EAClB,EAAC,KAAK,SACV,QAAWC,IAAK,CAAC,UAAW,QAAS,OAAO,EAAG,KAAK,GAAG,UAAU,OAAO,aAAaA,CAAC,GAAIA,IAAMD,CAAO,CACzG,CACF,EACAE,EAAS,QAASN,CAAK",
|
|
6
6
|
"names": ["Label", "Component", "el", "text", "variant", "v", "register"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m,b as u}from"./chunk-E4VNLYO2.js";import{b as f}from"./chunk-676AKAGF.js";import{a as g}from"./chunk-VV7CFMPZ.js";import{b,c as v}from"./chunk-4AA4FQEM.js";import{a as n}from"./chunk-A2NKDOYN.js";import{b as h,c as l}from"./chunk-PZSHOSOS.js";import{a as d,c as p}from"./chunk-TIPK3SCJ.js";var o=[],s=class extends n{baseCls="op-dropdown";content;open_=!1;release=[];leaving=0;build(){let e=h("div","op-dropdown",{role:this.config.role??"dialog"});e.hidden=!0;let t=this.config.content;return t&&(this.content=t instanceof HTMLElement||t instanceof n?t:p(t),e.append(this.content instanceof n?this.content.el:this.content)),e}getAnchor(){let e=this.config.anchor;return e instanceof n?e.el:e instanceof HTMLElement?e:void 0}isOpen(){return this.open_}open(){if(this.open_||this.destroyed||this.emit("before-open")===!1)return;let e=this.getAnchor();f(this.el,e),e&&this.el.getAttribute("role")==="dialog"&&!this.el.hasAttribute("aria-label")&&!this.el.hasAttribute("aria-labelledby")&&(e.id||=l(),this.el.setAttribute("aria-labelledby",e.id)),this.leaving++,this.el.getAnimations?.().forEach(i=>i.cancel()),this.el.hidden=!1,this.open_=!0,o.push(this),this.el.classList.add("is-open"),this.content instanceof n&&this.content.notifyMount(),this.reposition(),b(this.el,e??this.config.anchor,"dropdown"),e?.setAttribute("aria-expanded","true");let t=this.config,r=i=>{let a=i.target;t.closeOnOutside!==!1&&!this.el.contains(a)&&!e?.contains(a)&&this.close()},c=i=>{i.key==="Escape"&&t.closeOnEsc!==!1&&o[o.length-1]===this&&(i.stopPropagation(),this.close(),(e?.querySelector("input,button")??e)?.focus?.())};document.addEventListener("pointerdown",r,!0),document.addEventListener("keydown",c,!0),this.release=[()=>document.removeEventListener("pointerdown",r,!0),()=>document.removeEventListener("keydown",c,!0),u(()=>this.reposition())],t.autoFocus&&g(this.el)[0]?.focus(),this.emit("open")}close(){if(!this.open_||this.emit("before-close")===!1)return;this.open_=!1,o.splice(o.indexOf(this),1),this.el.classList.remove("is-open");let e=v(this.el,this.getAnchor()??this.config.anchor,"dropdown");if(e){let t=++this.leaving;e.then(()=>t===this.leaving&&!this.open_&&(this.el.hidden=!0))}else this.el.hidden=!0;this.getAnchor()?.setAttribute("aria-expanded","false"),this.release.splice(0).forEach(t=>t()),this.emit("close")}toggle(){this.open_?this.close():this.open()}reposition(){let e=this.getAnchor()??this.config.anchor;if(!this.open_||!e||e instanceof n)return;let t=this.config;m(this.el,e,{placement:t.placement??"bottom-start",offset:t.offset,flip:t.flip,matchWidth:t.matchWidth})}setAnchor(e){this.config.anchor=e,this.reposition()}setPlacement(e){this.config.placement=e,this.reposition()}setContent(e){this.content instanceof n&&this.content!==e&&this.content.destroy(),this.config.content=e,this.content=e,this.el.replaceChildren(e instanceof n?e.el:e),this.reposition()}onDestroy(){this.open_&&o.splice(o.indexOf(this),1),this.open_=!1,this.release.splice(0).forEach(e=>e()),this.getAnchor()?.setAttribute("aria-expanded","false"),this.content instanceof n&&this.content.destroy()}};d("dropdown",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-Z2JBUHKA.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/dropdown/dropdown.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h, uid } from '../../../core/dom';\nimport { toLayer } from '../../../core/layer';\nimport { place, track, type Placement } from '../../../core/position';\nimport { focusables } from '../../../core/focus';\nimport { popIn, popOut } from '../../../motion/core';\n\nexport interface DropdownConfig extends ComponentConfig {\n anchor?: HTMLElement | Component | { x: number; y: number };\n content?: HTMLElement | Component | AnyConfig;\n placement?: Placement;\n offset?: number;\n flip?: boolean;\n matchWidth?: boolean;\n closeOnOutside?: boolean;\n closeOnEsc?: boolean;\n role?: string;\n /** Move focus to the first focusable element of the content on open. */\n autoFocus?: boolean;\n}\n\nconst openStack: Dropdown[] = [];\n\n/** Floating panel anchored to an element. Lives in the global layer; closes on outside click and Esc. */\nexport class Dropdown extends Component<DropdownConfig> {\n protected override baseCls = 'op-dropdown';\n private content?: HTMLElement | Component;\n private open_ = false;\n private release: Array<() => void> = [];\n private leaving = 0;\n\n protected override build() {\n const el = h('div', 'op-dropdown', { role: this.config.role ?? 'dialog' });\n el.hidden = true;\n const c = this.config.content;\n if (c) {\n this.content = c instanceof HTMLElement || c instanceof Component ? c : create(c);\n el.append(this.content instanceof Component ? this.content.el : this.content);\n }\n return el;\n }\n\n getAnchor(): HTMLElement | undefined {\n const a = this.config.anchor;\n return a instanceof Component ? a.el : a instanceof HTMLElement ? a : undefined;\n }\n\n isOpen(): boolean {\n return this.open_;\n }\n\n open(): void {\n if (this.open_ || this.destroyed || this.emit('before-open') === false) return;\n const anchor = this.getAnchor();\n toLayer(this.el, anchor);\n if (anchor && this.el.getAttribute('role') === 'dialog' && !this.el.hasAttribute('aria-label') && !this.el.hasAttribute('aria-labelledby')) {\n anchor.id ||= uid();\n this.el.setAttribute('aria-labelledby', anchor.id);\n }\n this.leaving++; // a pending hide from a close animation must not hide us again\n this.el.getAnimations?.().forEach((a) => a.cancel());\n this.el.hidden = false;\n this.open_ = true;\n openStack.push(this);\n this.el.classList.add('is-open');\n if (this.content instanceof Component) this.content.notifyMount();\n this.reposition();\n void popIn(this.el, anchor ?? (this.config.anchor as { x: number; y: number } | undefined), 'dropdown');\n anchor?.setAttribute('aria-expanded', 'true');\n const c = this.config;\n const outside = (e: Event) => {\n const t = e.target as Node;\n if (c.closeOnOutside !== false && !this.el.contains(t) && !anchor?.contains(t)) this.close();\n };\n const key = (e: KeyboardEvent) => {\n // only the most recently opened dropdown reacts, so Esc closes one level at a time\n if (e.key === 'Escape' && c.closeOnEsc !== false && openStack[openStack.length - 1] === this) {\n e.stopPropagation();\n this.close();\n (anchor?.querySelector<HTMLElement>('input,button') ?? anchor)?.focus?.();\n }\n };\n document.addEventListener('pointerdown', outside, true);\n document.addEventListener('keydown', key, true);\n this.release = [() => document.removeEventListener('pointerdown', outside, true), () => document.removeEventListener('keydown', key, true), track(() => this.reposition())];\n if (c.autoFocus) focusables(this.el)[0]?.focus();\n this.emit('open');\n }\n\n close(): void {\n if (!this.open_ || this.emit('before-close') === false) return;\n this.open_ = false;\n openStack.splice(openStack.indexOf(this), 1);\n this.el.classList.remove('is-open');\n // shrinks back toward the trigger, then hides (at once when there is no animation)\n const out = popOut(this.el, this.getAnchor() ?? (this.config.anchor as { x: number; y: number } | undefined), 'dropdown');\n if (out) {\n const id = ++this.leaving;\n void out.then(() => id === this.leaving && !this.open_ && (this.el.hidden = true));\n } else this.el.hidden = true;\n this.getAnchor()?.setAttribute('aria-expanded', 'false');\n this.release.splice(0).forEach((r) => r());\n this.emit('close');\n }\n\n toggle(): void {\n if (this.open_) this.close();\n else this.open();\n }\n\n reposition(): void {\n const anchor = this.getAnchor() ?? (this.config.anchor as { x: number; y: number } | undefined);\n if (!this.open_ || !anchor || anchor instanceof Component) return;\n const c = this.config;\n place(this.el, anchor, { placement: c.placement ?? 'bottom-start', offset: c.offset, flip: c.flip, matchWidth: c.matchWidth });\n }\n\n setAnchor(anchor: HTMLElement | Component | { x: number; y: number }): void {\n this.config.anchor = anchor;\n this.reposition();\n }\n setPlacement(placement: Placement): void {\n this.config.placement = placement;\n this.reposition();\n }\n setContent(content: HTMLElement | Component): void {\n if (this.content instanceof Component && this.content !== content) this.content.destroy();\n this.config.content = content;\n this.content = content;\n this.el.replaceChildren(content instanceof Component ? content.el : content);\n this.reposition();\n }\n\n protected override onDestroy() {\n if (this.open_) openStack.splice(openStack.indexOf(this), 1);\n this.open_ = false;\n this.release.splice(0).forEach((r) => r());\n this.getAnchor()?.setAttribute('aria-expanded', 'false');\n if (this.content instanceof Component) this.content.destroy();\n }\n}\nregister('dropdown', Dropdown);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["openStack", "Dropdown", "Component", "el", "c", "create", "a", "anchor", "toLayer", "uid", "popIn", "outside", "e", "t", "key", "track", "focusables", "out", "popOut", "id", "r", "place", "placement", "content", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as m}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as m}from"./chunk-2ZRNGG2N.js";import{e as p}from"./chunk-6NCXO5ZP.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as u}from"./chunk-TIPK3SCJ.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-Z2Z52GFT.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as o}from"./chunk-4EZJ5FKJ.js";import{a as h}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{e as s,f as r}from"./chunk-MW3RWBZ7.js";s("en",{chipRemove:"Remove {text}"});s("pt-BR",{chipRemove:"Remover {text}"});var n=class extends h{baseCls="op-chip";tag="span";main;textEl;removeBtn;onRender(){let e=this.config;this.textEl=i("span","op-chip__text"),this.main=i("button","op-chip__main",{type:"button"},e.icon?o(e.icon):"",this.textEl),this.el.append(this.main),this.listen(this.main,"click",()=>{this.config.disabled||(this.config.selectable&&this.setSelected(!this.config.selected,!0),this.config.handler?.(this),this.emit("click",this))}),e.removable&&(this.removeBtn=i("button","op-chip__remove",{type:"button"},o("x")),this.el.append(this.removeBtn),this.listen(this.removeBtn,"click",()=>!this.config.disabled&&this.emit("remove",this)),this.listen(this.main,"keydown",t=>{(t.key==="Delete"||t.key==="Backspace")&&!this.config.disabled&&this.emit("remove",this)})),this.setText(e.text??""),this.setSelected(!!e.selected),this.setDisabled(!!e.disabled)}setText(e){this.config.text=e,this.rendered&&(this.textEl.textContent=e,this.removeBtn?.setAttribute("aria-label",r("chipRemove",{text:e})))}setSelected(e,t=!1){this.config.selected=e,this.rendered&&(this.el.classList.toggle("is-selected",e),this.config.selectable&&this.main.setAttribute("aria-pressed",String(e)),t&&this.emit("change",e))}isSelected(){return!!this.config.selected}setDisabled(e){super.setDisabled(e),this.rendered&&(this.main.disabled=e,this.removeBtn&&(this.removeBtn.disabled=e))}focusEl(){return this.main}};l("chip",n);export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-ZPPELYNJ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/base/chip/chip.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 { iconEl } from '../icon/icon';\n\naddMessages('en', { chipRemove: 'Remove {text}' });\naddMessages('pt-BR', { chipRemove: 'Remover {text}' });\n\nexport interface ChipConfig extends ComponentConfig {\n text?: string;\n icon?: string;\n /** Click toggles it on and off (a filter, a tag being picked): a toggle button with `aria-pressed`. */\n selectable?: boolean;\n selected?: boolean;\n /** Shows a \u00D7 button that fires `remove` (the app removes the chip). */\n removable?: boolean;\n disabled?: boolean;\n handler?: (chip: Chip) => void;\n}\n\n/** A compact token: a filter to toggle, a tag to remove, a choice to click. */\nexport class Chip extends Component<ChipConfig> {\n protected override baseCls = 'op-chip';\n protected override tag = 'span' as const;\n private main!: HTMLButtonElement;\n private textEl!: HTMLElement;\n private removeBtn?: HTMLButtonElement;\n\n protected override onRender() {\n const c = this.config;\n this.textEl = h('span', 'op-chip__text');\n this.main = h('button', 'op-chip__main', { type: 'button' }, c.icon ? iconEl(c.icon) : '', this.textEl);\n this.el.append(this.main);\n this.listen(this.main, 'click', () => {\n if (this.config.disabled) return;\n if (this.config.selectable) this.setSelected(!this.config.selected, true);\n this.config.handler?.(this);\n this.emit('click', this);\n });\n if (c.removable) {\n this.removeBtn = h('button', 'op-chip__remove', { type: 'button' }, iconEl('x'));\n this.el.append(this.removeBtn);\n this.listen(this.removeBtn, 'click', () => !this.config.disabled && this.emit('remove', this));\n this.listen(this.main, 'keydown', (e: KeyboardEvent) => {\n if ((e.key === 'Delete' || e.key === 'Backspace') && !this.config.disabled) this.emit('remove', this);\n });\n }\n this.setText(c.text ?? '');\n this.setSelected(!!c.selected);\n this.setDisabled(!!c.disabled);\n }\n\n setText(text: string) {\n this.config.text = text;\n if (!this.rendered) return;\n this.textEl.textContent = text;\n this.removeBtn?.setAttribute('aria-label', t('chipRemove', { text }));\n }\n /** Selected state (only meaningful with `selectable`); `notify` fires `change`. */\n setSelected(on: boolean, notify = false) {\n this.config.selected = on;\n if (!this.rendered) return;\n this.el.classList.toggle('is-selected', on);\n if (this.config.selectable) this.main.setAttribute('aria-pressed', String(on));\n if (notify) this.emit('change', on);\n }\n isSelected(): boolean {\n return !!this.config.selected;\n }\n override setDisabled(disabled: boolean) {\n super.setDisabled(disabled);\n if (!this.rendered) return;\n this.main.disabled = disabled;\n if (this.removeBtn) this.removeBtn.disabled = disabled;\n }\n protected override focusEl(): HTMLElement {\n return this.main;\n }\n}\nregister('chip', Chip);\n"],
|
|
5
|
+
"mappings": "+MAMAA,EAAY,KAAM,CAAE,WAAY,eAAgB,CAAC,EACjDA,EAAY,QAAS,CAAE,WAAY,gBAAiB,CAAC,EAe9C,IAAMC,EAAN,cAAmBC,CAAsB,CAC3B,QAAU,UACV,IAAM,OACjB,KACA,OACA,UAEW,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACf,KAAK,OAASC,EAAE,OAAQ,eAAe,EACvC,KAAK,KAAOA,EAAE,SAAU,gBAAiB,CAAE,KAAM,QAAS,EAAGD,EAAE,KAAOE,EAAOF,EAAE,IAAI,EAAI,GAAI,KAAK,MAAM,EACtG,KAAK,GAAG,OAAO,KAAK,IAAI,EACxB,KAAK,OAAO,KAAK,KAAM,QAAS,IAAM,CAChC,KAAK,OAAO,WACZ,KAAK,OAAO,YAAY,KAAK,YAAY,CAAC,KAAK,OAAO,SAAU,EAAI,EACxE,KAAK,OAAO,UAAU,IAAI,EAC1B,KAAK,KAAK,QAAS,IAAI,EACzB,CAAC,EACGA,EAAE,YACJ,KAAK,UAAYC,EAAE,SAAU,kBAAmB,CAAE,KAAM,QAAS,EAAGC,EAAO,GAAG,CAAC,EAC/E,KAAK,GAAG,OAAO,KAAK,SAAS,EAC7B,KAAK,OAAO,KAAK,UAAW,QAAS,IAAM,CAAC,KAAK,OAAO,UAAY,KAAK,KAAK,SAAU,IAAI,CAAC,EAC7F,KAAK,OAAO,KAAK,KAAM,UAAYC,GAAqB,EACjDA,EAAE,MAAQ,UAAYA,EAAE,MAAQ,cAAgB,CAAC,KAAK,OAAO,UAAU,KAAK,KAAK,SAAU,IAAI,CACtG,CAAC,GAEH,KAAK,QAAQH,EAAE,MAAQ,EAAE,EACzB,KAAK,YAAY,CAAC,CAACA,EAAE,QAAQ,EAC7B,KAAK,YAAY,CAAC,CAACA,EAAE,QAAQ,CAC/B,CAEA,QAAQI,EAAc,CACpB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,OAAO,YAAcA,EAC1B,KAAK,WAAW,aAAa,aAAcC,EAAE,aAAc,CAAE,KAAAD,CAAK,CAAC,CAAC,EACtE,CAEA,YAAYE,EAAaC,EAAS,GAAO,CACvC,KAAK,OAAO,SAAWD,EAClB,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,cAAeA,CAAE,EACtC,KAAK,OAAO,YAAY,KAAK,KAAK,aAAa,eAAgB,OAAOA,CAAE,CAAC,EACzEC,GAAQ,KAAK,KAAK,SAAUD,CAAE,EACpC,CACA,YAAsB,CACpB,MAAO,CAAC,CAAC,KAAK,OAAO,QACvB,CACS,YAAYE,EAAmB,CACtC,MAAM,YAAYA,CAAQ,EACrB,KAAK,WACV,KAAK,KAAK,SAAWA,EACjB,KAAK,YAAW,KAAK,UAAU,SAAWA,GAChD,CACmB,SAAuB,CACxC,OAAO,KAAK,IACd,CACF,EACAC,EAAS,OAAQX,CAAI",
|
|
6
|
+
"names": ["addMessages", "Chip", "Component", "c", "h", "iconEl", "e", "text", "t", "on", "notify", "disabled", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as g}from"./chunk-4EZJ5FKJ.js";import{a as b}from"./chunk-A2NKDOYN.js";import{b as h,f as m}from"./chunk-PZSHOSOS.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{e as c,f as o}from"./chunk-MW3RWBZ7.js";c("en",{pageFirst:"First page",pagePrev:"Previous page",pageNext:"Next page",pageLast:"Last page",pageLabel:"Pagination",pageGoto:"Page {n}",pageInfo:"{from}\u2013{to} of {total}"});c("pt-BR",{pageFirst:"Primeira p\xE1gina",pagePrev:"P\xE1gina anterior",pageNext:"Pr\xF3xima p\xE1gina",pageLast:"\xDAltima p\xE1gina",pageLabel:"Pagina\xE7\xE3o",pageGoto:"P\xE1gina {n}",pageInfo:"{from}\u2013{to} de {total}"});var f=class extends b{baseCls="op-pagination";tag="nav";unsub;onRender(){this.el.setAttribute("aria-label",o("pageLabel")),this.listen(this.el,"click",t=>{let a=t.target.closest("button[data-page]");a&&!a.disabled&&this.setPage(Number(a.dataset.page))}),this.bindStore(this.config.store),this.own(()=>this.unsub?.()),this.paint()}bindStore(t){this.unsub?.(),this.unsub=t?.subscribe(()=>this.paint())}getPage(){return this.config.store?.page??this.config.page??1}size(){return this.config.store?.pageSize||this.config.pageSize||20}total(){return this.config.store?.totalCount??this.config.total??0}pages(){return Math.max(1,Math.ceil(this.total()/this.size()))}setPage(t){t=m(t,1,this.pages()),!(t===this.getPage()||this.emit("before-page-change",t)===!1)&&(this.config.store?this.config.store.setPage(t):(this.config.page=t,this.paint()),this.emit("page-change",t))}setTotal(t){this.config.total=t,this.paint()}setPageSize(t){this.config.pageSize=t,this.paint()}setStore(t){this.config.store=t,this.bindStore(t),this.paint()}window(){let t=this.pages(),a=this.getPage(),n=this.config.siblings??1;if(t<=n*2+5)return Array.from({length:t},(i,s)=>s+1);let p=new Set([1,t,...Array.from({length:n*2+1},(i,s)=>a-n+s)].filter(i=>i>=1&&i<=t)),r=[],e=0;for(let i of[...p].sort((s,l)=>s-l))i-e>1&&r.push(i-e===2?i-1:null),r.push(i),e=i;return r}paint(){if(!this.rendered)return;let t=this.getPage(),a=this.pages(),n=(e,i,s,l=!1,u=!1)=>h("button",`op-button op-button--ghost op-pagination__btn${u?" is-current":""}`,{type:"button","data-page":e,"aria-label":s,"aria-current":u?"page":null,disabled:l},i),p=[n(1,g("chevrons-left"),o("pageFirst"),t===1),n(t-1,g("chevron-left"),o("pagePrev"),t===1),...this.window().map(e=>e==null?h("span","op-pagination__gap",{"aria-hidden":"true"},"\u2026"):n(e,String(e),o("pageGoto",{n:e}),!1,e===t)),n(t+1,g("chevron-right"),o("pageNext"),t===a),n(a,g("chevrons-right"),o("pageLast"),t===a)];if(this.config.showInfo!==!1){let e=this.total(),i=this.size();p.push(h("span","op-pagination__info",{},e?o("pageInfo",{from:(t-1)*i+1,to:Math.min(t*i,e),total:e}):""))}let r=this.el.contains(document.activeElement)?document.activeElement.dataset.page:void 0;this.el.replaceChildren(...p),r&&this.el.querySelector(`[data-page="${r}"]:not(:disabled)`)?.focus()}};d("pagination",f);export{f as a};
|
|
2
|
+
//# sourceMappingURL=chunk-ZVK4L5GK.js.map
|