optikos 0.1.0 → 0.3.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 +135 -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-2YZB6XQR.js +2 -0
- package/dist/chunk-2YZB6XQR.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-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-4EQEHJB3.js +2 -0
- package/dist/chunk-4EQEHJB3.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-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-CKXS375P.js +2 -0
- package/dist/chunk-CKXS375P.js.map +7 -0
- 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-EJGWCKE4.js +2 -0
- package/dist/{chunk-4DHQKECB.js.map → chunk-EJGWCKE4.js.map} +1 -1
- 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-G2DAD3MQ.js +2 -0
- package/dist/chunk-G2DAD3MQ.js.map +7 -0
- package/dist/chunk-G2KUK6AT.js +2 -0
- package/dist/chunk-GD5JGKM7.js +2 -0
- package/dist/chunk-GD5JGKM7.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-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-Q26YZYTD.js +2 -0
- package/dist/chunk-Q26YZYTD.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-UB5RYS7T.js +2 -0
- package/dist/chunk-UB5RYS7T.js.map +7 -0
- package/dist/chunk-UXXJOU5J.js +2 -0
- package/dist/chunk-UXXJOU5J.js.map +7 -0
- package/dist/chunk-VU3GIDZ3.js +2 -0
- package/dist/chunk-VU3GIDZ3.js.map +7 -0
- package/dist/chunk-W2BAFOCN.js +3 -0
- package/dist/chunk-W2BAFOCN.js.map +7 -0
- package/dist/{chunk-SNTHW4K2.js → chunk-W3H7GTJY.js} +2 -2
- package/dist/chunk-WFGTQZIQ.js +2 -0
- package/dist/chunk-WFGTQZIQ.js.map +7 -0
- 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-YF75HKL6.js +2 -0
- package/dist/chunk-YF75HKL6.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 +54 -0
- package/dist/css/navmenu.css +9 -7
- package/dist/css/panel.css +8 -1
- package/dist/css/stepform.css +9 -0
- 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 +1221 -106
- 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 +30 -4
- 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/navmenu/navmenu.d.ts +6 -0
- package/dist/types/components/navigation/tabs/tabs.d.ts +8 -0
- package/dist/types/components/overlays/menu/menu.d.ts +17 -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-GZNQPENR.js.map +0 -7
- 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
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,138 @@
|
|
|
3
3
|
All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
4
4
|
and the project uses [Semantic Versioning](https://semver.org/). Until 1.0, minor versions may contain breaking changes.
|
|
5
5
|
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [0.3.0] - 2026-11-10
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- NavMenu in rail mode (`collapsed`): a group shows its icon (or initial) and opens a floating Menu beside it with its
|
|
13
|
+
title and children (badges included), by click, hover, → or Enter; the icon lights up when the active page is inside.
|
|
14
|
+
`MenuItem.badge`.
|
|
15
|
+
- StepForm: a step check per step, `validate(values, form, signal)`, that may ask the server. It runs when leaving the
|
|
16
|
+
step forward and on Finish, with Next/Finish loading; it returns `true`, a message for the step (an alert line above
|
|
17
|
+
it) or `{ field: message }`. A second click does nothing and going back aborts it.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- StepForm: `goTo`, `next` and `back` return `Promise<boolean>` (they wait for the step checks on the way; without any,
|
|
22
|
+
the step still changes at once).
|
|
23
|
+
|
|
24
|
+
## [0.2.0] - 2026-11-10
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Form utils: `showIf`/`enableIf` on any item of a form (a field hidden by its rule does not validate and is left out
|
|
29
|
+
of `getValues`), `Form.focusField(field)`, the form-level `dirty-change` event, and two components: `FormErrors`
|
|
30
|
+
(`type: 'formerrors'`, an error summary whose links reveal and focus each field) and `FormActions`
|
|
31
|
+
(`type: 'formactions'`, Cancel / Save with an "Unsaved changes" status, `requireChanges`, `sticky`).
|
|
32
|
+
|
|
33
|
+
- `FieldList` component (`type: 'fieldlist'`): a repeating block of fields (add, remove, reorder rows, by mouse or
|
|
34
|
+
keyboard); it is one form field whose value is an array of row objects, with `min`/`max`, and validating the form
|
|
35
|
+
validates every row.
|
|
36
|
+
|
|
37
|
+
- Compound fields: `FieldGroup` (`type: 'fieldgroup'`): several inputs under one label, one help line and one error
|
|
38
|
+
line (`role=group`); and `InputGroup` (`type: 'inputgroup'`): text (`R$`, `.com`) or buttons joined to any field's box,
|
|
39
|
+
the text read as part of the input's description.
|
|
40
|
+
|
|
41
|
+
- Form layouts: `columns` on Form, FieldSet and FormSection (a responsive grid), `colspan: 'full'`, `labelWidth` (left
|
|
42
|
+
labels in a column), FieldSet `variant` (`box`, `line`, `plain`) and `description`, and the `FormSection` component
|
|
43
|
+
(`type: 'formsection'`): title and description beside the fields, stacked when the section is narrow.
|
|
44
|
+
|
|
45
|
+
- Reload buttons: `reloadable` on Panel (so Window and Widget too) and on Tabs adds a ↻ that calls `onReload(panel)`; a
|
|
46
|
+
returned Promise shows the loading mask until it settles. `Panel.reload()`, `Tabs.reloadTab()`, `before-reload`/`reload`
|
|
47
|
+
events; R reloads a focused reloadable tab. New `refresh` icon.
|
|
48
|
+
|
|
49
|
+
- Widget: `resizable` (the inner edge while docked, a corner grip once moved; a focusable splitter with arrow keys) and
|
|
50
|
+
the `resize({ width, height })` event.
|
|
51
|
+
|
|
52
|
+
- `CodeViewer` component (`type: 'codeviewer'`): read-only code with syntax colors (ts/js, json, css, html, sh), line
|
|
53
|
+
numbers that a selection never copies, marked lines, `startLine`, wrap or scroll, and a copy button. The docs site
|
|
54
|
+
uses it for every code block, which also fixes the code fences of the guides (they were styled as inline code).
|
|
55
|
+
|
|
56
|
+
- Menu: `group` on items (named `role=group` sections, ungrouped first) and `search: true` (a search field that filters
|
|
57
|
+
the items; a search that matches a group name shows the whole group). FilterBuilder fields take a `group` too, like
|
|
58
|
+
`Column.group`: the `pick` menu is grouped and searchable past 6 fields, and the field select uses `<optgroup>`s.
|
|
59
|
+
|
|
60
|
+
- `Dial` component (`type: 'dial'`, `ui.dial`): picks one value from a range (an age, a year) or a list (the months) on
|
|
61
|
+
a flat ruler that slides under a fixed needle, with a large readout whose digits roll like an odometer. Snap points
|
|
62
|
+
(decades by default) get the labels, Page Up/Down jump between them, and a flick glides on to the nearest one ahead.
|
|
63
|
+
`shape: 'circle'` turns it into a clock face.
|
|
64
|
+
|
|
65
|
+
- `addMessages(lang, messages)` (from `optikos` and `optikos/core`): adds translation keys to a locale without overwriting
|
|
66
|
+
keys the app already set.
|
|
67
|
+
|
|
68
|
+
- `Grid<T>`: the record type flows from a typed `Store<T>` to `getSelection()`, `getStore()`, bulk and row actions and
|
|
69
|
+
column renderers; `Column.field` autocompletes the record's keys. `new Grid({ store })` infers it. Untyped grids keep
|
|
70
|
+
working as before (the default is `any`).
|
|
71
|
+
|
|
72
|
+
- Documentation in English with a Portuguese translation (`docs/pt-BR/`); the docs site has a language picker
|
|
73
|
+
(English/Português) that also switches the components' own messages, and the MCP server takes a `lang` argument.
|
|
74
|
+
|
|
75
|
+
- `defineTheme`: a plain value sets the group's own token (`radius: '0.75rem'` → `--op-radius`).
|
|
76
|
+
- Docs site redesigned as a showcase: a landing page with a live form and measured sizes, recipes (complete small
|
|
77
|
+
screens whose shown code is the code that runs), a gallery of the demos (published with the site) and tabbed
|
|
78
|
+
component pages.
|
|
79
|
+
|
|
80
|
+
- Grid plugins (`plugins: [...]`) and the first one, `cellEditing()`: double click or F2 to edit a cell, Enter to save,
|
|
81
|
+
Tab to the next editable cell; editors come from `Column.editor`. New Grid helpers for plugins: `cellAt`, `getCell`,
|
|
82
|
+
`getColumns`, `getActive`.
|
|
83
|
+
|
|
84
|
+
- `Tree` component: expand/collapse, single or multiple selection, tri-state cascading checkboxes, children loaded on
|
|
85
|
+
demand, filter, and the WAI-ARIA tree keyboard.
|
|
86
|
+
|
|
87
|
+
- `Toggle` (an on/off switch, `role="switch"`) and the `ui.toggle()` shortcut.
|
|
88
|
+
|
|
89
|
+
- `CheckboxGroup` (several choices; the value is the list of checked values) and `ui.checkGroup()`.
|
|
90
|
+
|
|
91
|
+
- `Badge` (status label or count in six tones) and `Chip` (selectable filter or removable tag).
|
|
92
|
+
|
|
93
|
+
### Changed
|
|
94
|
+
|
|
95
|
+
- No automatic focus on fields: on a phone it pops up the keyboard over the page. Window, Widget, `MessageBox.prompt`
|
|
96
|
+
and StepForm (on a new step) now focus the dialog, widget or step panel itself; `autoFocus: true` focuses the first
|
|
97
|
+
field as before. A Menu with `search` and the Grid's column menu open on their first item (typing a letter goes to
|
|
98
|
+
the search field), and LookupField's search window opens on the dialog. Focus that answers an explicit action stays:
|
|
99
|
+
adding a row, editing a cell, a failed validation jumping to the field.
|
|
100
|
+
- MessageBox (`alert`, `confirm`, `prompt`) no longer dims the page: it is still modal, over a clear backdrop. Pass
|
|
101
|
+
`mask: true` to dim it. Window has the same `mask` option (default `true`) and `setMask`.
|
|
102
|
+
- **Themes (breaking):** the package now ships only `light` (default), `dark` and `compact`. The default look is the
|
|
103
|
+
former `corporate` theme (steel blue on cool gray, small radii, hairline borders, a navy sidebar, 2.375rem controls,
|
|
104
|
+
2.75rem rows, 15px text) and `dark` is its night version. `optikos/themes/{corporate,brutal,soft,terminal,editorial,brand}.css`
|
|
105
|
+
were removed, and `ThemeName` keeps only `Light` and `Dark`. Grid headers and panel title bars now use the strong
|
|
106
|
+
border, the selected Grid row shows a primary bar (`--op-grid-selected-bar`, `--op-grid-selected-bar-width`), the
|
|
107
|
+
primary button has a subtle inner shadow (`--op-button-primary-shadow`) and the tab bar sits on `surface-2`; new
|
|
108
|
+
tokens `--op-grid-header-border` and `--op-panel-header-border`.
|
|
109
|
+
- Grid: `role="grid"` (with focus, `aria-activedescendant`, row and column counts) moved from the root element to an inner
|
|
110
|
+
`.op-grid__table`, because the root also holds the bulk bar and the pager. Code that read those attributes from
|
|
111
|
+
`grid.el` should query `grid.el.querySelector('[role=grid]')`; `grid.focus()` keeps working.
|
|
112
|
+
- Accessibility fixes found by automated axe checks in every theme: Button keeps its name while loading (and is
|
|
113
|
+
`aria-disabled`), Stepper steps keep their names on phones, DateField/DateRangeField follow the date picker combobox
|
|
114
|
+
pattern, an unnamed Dropdown dialog is named by its anchor, and contrast fixes in the light (`fg-muted`), `dark`
|
|
115
|
+
(primary), `soft`, `brutal`, `brand` and `brand night` themes and in Chat bubbles.
|
|
116
|
+
- Each component now ships its own `en`/`pt-BR` messages, so the core is 2.2 kB (gzip) smaller and every standalone component about 0.5 kB smaller.
|
|
117
|
+
Custom locales passed to `setLocale({...})` keep working; missing keys still fall back to English.
|
|
118
|
+
|
|
119
|
+
### Fixed
|
|
120
|
+
|
|
121
|
+
- Floating elements (menus, dropdowns) taller than the room on both sides of their anchor are capped to the larger side
|
|
122
|
+
and scroll, instead of running off the window (long menus in big themes).
|
|
123
|
+
|
|
124
|
+
- Tabs: each panel has `tabindex="0"` (WAI-ARIA tabs pattern), so a panel with nothing focusable inside, or one that
|
|
125
|
+
scrolls, can be reached with the keyboard.
|
|
126
|
+
|
|
127
|
+
- `ariaLabel` on a field without a visible label now names its input (it used to land on the wrapper).
|
|
128
|
+
- Grid: the row-actions column header has a (visually hidden) name.
|
|
129
|
+
|
|
130
|
+
- `ui.grid(2, ...)` keeps the column count numeric, so the grid collapses to one column on narrow containers like
|
|
131
|
+
`layout: { type: 'grid', columns: 2 }` does.
|
|
132
|
+
- `ui.*` containers accept declarative configs among their items (`ui.form([{ type: 'fieldset', ... }, ui.text(...)])`)
|
|
133
|
+
without a type error.
|
|
134
|
+
|
|
135
|
+
- Store: sorting text is 13× faster (100k records: 5.4 s → 0.41 s). The comparison reuses one `Intl.Collator` instead of
|
|
136
|
+
building one per `localeCompare` call; the order is unchanged.
|
|
137
|
+
|
|
6
138
|
## [0.1.0] - 2026-11-08
|
|
7
139
|
|
|
8
140
|
First public release.
|
|
@@ -25,4 +157,7 @@ First public release.
|
|
|
25
157
|
`corporate`, `soft`, `brutal`, `terminal`, `editorial` and `brand`.
|
|
26
158
|
- Per-component entry points (`optikos/components/<name>`) and stylesheets (`optikos/css/<name>.css`).
|
|
27
159
|
|
|
160
|
+
[Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...HEAD
|
|
161
|
+
[0.3.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.2.0...v0.3.0
|
|
162
|
+
[0.2.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.1.0...v0.2.0
|
|
28
163
|
[0.1.0]: https://github.com/Denis-Zickuhr/optikos/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
<p align="center"><img src="https://raw.githubusercontent.com/Denis-Zickuhr/optikos/main/site/seal.svg" alt="Optikos" width="150" /></p>
|
|
2
|
+
|
|
1
3
|
# Optikos
|
|
2
4
|
|
|
3
5
|
[](https://www.npmjs.com/package/optikos)
|
|
@@ -133,11 +135,11 @@ create({ type: 'textfield', label: 'Search', renderTo: document.body });
|
|
|
133
135
|
|
|
134
136
|
| Category | Components (`type`) |
|
|
135
137
|
|---|---|
|
|
136
|
-
| Base | `button`, `icon`, `label` |
|
|
138
|
+
| Base | `button`, `icon`, `label`, `badge`, `chip` |
|
|
137
139
|
| Layout | `container`, `panel`, `viewport`, `fieldset`, `toolbar`, `spacer`, plus the layouts `fit`, `hbox`, `vbox`, `border`, `grid`, `card` |
|
|
138
|
-
| Fields | `textfield`, `textarea`, `numberfield`, `secretfield`, `checkbox`, `radiogroup`, `select`, `combobox`, `suggestfield`, `lookupfield`, `datefield`, `daterangefield`, `slider`, `listbox` |
|
|
140
|
+
| Fields | `textfield`, `textarea`, `numberfield`, `secretfield`, `checkbox`, `toggle`, `checkboxgroup`, `radiogroup`, `select`, `combobox`, `suggestfield`, `lookupfield`, `datefield`, `daterangefield`, `slider`, `listbox` |
|
|
139
141
|
| Forms | `form` (validation, `load`/`getValues`, tabs), `stepform` (multi-step wizard) |
|
|
140
|
-
| Data | `grid` (virtualized, sorting, selection, paging, column menu, bulk actions), `table`, `dataview`, `pagination`, `filterbuilder`, `searchgrid`, `viewmanager` (saved views) |
|
|
142
|
+
| Data | `grid` (virtualized, sorting, selection, paging, column menu, bulk actions, inline editing with the `cellEditing()` plugin), `table`, `dataview`, `pagination`, `filterbuilder`, `searchgrid`, `viewmanager` (saved views), `tree` |
|
|
141
143
|
| Dates | `calendar` (single date or range) |
|
|
142
144
|
| Overlays | `window`, `MessageBox` (alert/confirm/prompt), `toast()`, `menu`, `dropdown`, `tooltip`, `widget`, `commandpalette` |
|
|
143
145
|
| Navigation | `tabs`, `breadcrumb`, `navmenu`, `stepper` |
|
|
@@ -149,8 +151,8 @@ create({ type: 'textfield', label: 'Search', renderTo: document.body });
|
|
|
149
151
|
All styles are in `@layer optikos`, so any CSS you write outside a layer wins without `!important`.
|
|
150
152
|
A theme is a value of `data-op-theme`, on `<html>` or on any element to scope it. Themes can be combined: `data-op-theme="dark compact"`.
|
|
151
153
|
|
|
152
|
-
Ready-made themes: `light` (default, included in `optikos.css`), `dark
|
|
153
|
-
`
|
|
154
|
+
Ready-made themes: `light` (default, included in `optikos.css`), `dark` and `compact` (density). Each one is a file in
|
|
155
|
+
`optikos/themes/<theme>.css`.
|
|
154
156
|
|
|
155
157
|
Write a theme in CSS:
|
|
156
158
|
|
|
@@ -183,16 +185,16 @@ Current evergreen browsers. The JavaScript targets ES2022, and the CSS uses casc
|
|
|
183
185
|
|
|
184
186
|
## Documentation and demos
|
|
185
187
|
|
|
186
|
-
- [Docs site](https://denis-zickuhr.github.io/optikos/): every component with live, editable
|
|
187
|
-
the guides and the design tokens.
|
|
188
|
-
- [Docs sources
|
|
188
|
+
- [Docs site](https://denis-zickuhr.github.io/optikos/), in English and Portuguese: every component with live, editable
|
|
189
|
+
examples, its spec sheet, the guides and the design tokens.
|
|
190
|
+
- [Docs sources](https://github.com/Denis-Zickuhr/optikos/tree/main/docs) (Portuguese translation in `docs/pt-BR`): one spec sheet per component in
|
|
189
191
|
[`docs/components`](https://github.com/Denis-Zickuhr/optikos/tree/main/docs/components), plus guides on
|
|
190
192
|
[theming](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/theming.md),
|
|
191
193
|
[motion](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/motion.md),
|
|
192
194
|
[`ui` shortcuts](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/ui.md) and
|
|
193
|
-
[architecture](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/architecture.md).
|
|
194
|
-
- [
|
|
195
|
-
shop, event landing page, workbench, motion lab and customization.
|
|
195
|
+
[architecture decisions](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/architecture.md) (in Portuguese).
|
|
196
|
+
- [Recipes and live demos](https://denis-zickuhr.github.io/optikos/#/demos) on the docs site: CRM, admin dashboard, ERP,
|
|
197
|
+
chat, photo gallery, shop, event landing page, workbench, motion lab and customization ([source](https://github.com/Denis-Zickuhr/optikos/tree/main/demos)).
|
|
196
198
|
|
|
197
199
|
## Contributing / Development
|
|
198
200
|
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as i}from"./chunk-A2NKDOYN.js";import{a as o}from"./chunk-TIPK3SCJ.js";var t=class extends i{baseCls="op-spacer";tag="span";onRender(){let e=this.config;e.width==null&&e.flex==null&&!e.line&&(this.el.style.flex="1"),this.setLine(!!e.line)}setLine(e){this.config.line=e,this.rendered&&(this.el.classList.toggle("op-spacer--line",e),e?this.el.setAttribute("role","separator"):this.el.setAttribute("aria-hidden","true"),e&&this.el.removeAttribute("aria-hidden"))}};o("spacer",t);export{t as a};
|
|
2
|
+
//# sourceMappingURL=chunk-23XLG2EM.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/layout/spacer/spacer.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\n\nexport interface SpacerConfig extends ComponentConfig {\n /** Renders a vertical separator line. */\n line?: boolean;\n}\n\n/** Without `width`/`flex` it takes the free space (`flex: 1`), pushing the next items away. */\nexport class Spacer extends Component<SpacerConfig> {\n protected override baseCls = 'op-spacer';\n protected override tag = 'span' as const;\n protected override onRender() {\n const c = this.config;\n if (c.width == null && c.flex == null && !c.line) this.el.style.flex = '1';\n this.setLine(!!c.line);\n }\n setLine(line: boolean) {\n this.config.line = line;\n if (!this.rendered) return;\n this.el.classList.toggle('op-spacer--line', line);\n if (line) this.el.setAttribute('role', 'separator');\n else this.el.setAttribute('aria-hidden', 'true');\n if (line) this.el.removeAttribute('aria-hidden');\n }\n}\nregister('spacer', Spacer);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "gFASO,IAAMA,EAAN,cAAqBC,CAAwB,CAC/B,QAAU,YACV,IAAM,OACN,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACXA,EAAE,OAAS,MAAQA,EAAE,MAAQ,MAAQ,CAACA,EAAE,OAAM,KAAK,GAAG,MAAM,KAAO,KACvE,KAAK,QAAQ,CAAC,CAACA,EAAE,IAAI,CACvB,CACA,QAAQC,EAAe,CACrB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,kBAAmBA,CAAI,EAC5CA,EAAM,KAAK,GAAG,aAAa,OAAQ,WAAW,EAC7C,KAAK,GAAG,aAAa,cAAe,MAAM,EAC3CA,GAAM,KAAK,GAAG,gBAAgB,aAAa,EACjD,CACF,EACAC,EAAS,SAAUJ,CAAM",
|
|
6
6
|
"names": ["Spacer", "Component", "c", "line", "register"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as k}from"./chunk-7KMIFXHZ.js";import{a as S}from"./chunk-3TAW4AKH.js";import{a as _}from"./chunk-W2BAFOCN.js";import{a as F}from"./chunk-W3H7GTJY.js";import{a as x}from"./chunk-2ZUZ5HDL.js";import{c as M}from"./chunk-4EZJ5FKJ.js";import{a as N}from"./chunk-A2NKDOYN.js";import{b as p}from"./chunk-PZSHOSOS.js";import{a as L}from"./chunk-TIPK3SCJ.js";import{e as y,f as s}from"./chunk-MW3RWBZ7.js";y("en",{fbEq:"equals",fbNe:"does not equal",fbContains:"contains",fbNotContains:"does not contain",fbStarts:"starts with",fbEnds:"ends with",fbGt:"greater than",fbGe:"greater than or equal",fbLt:"less than",fbLe:"less than or equal",fbBetween:"is between",fbNotBetween:"is not between",fbIn:"is any of",fbNin:"is none of",fbEmpty:"is empty",fbNotEmpty:"is not empty",fbAnd:"Match all (AND)",fbOr:"Match any (OR)",fbAddFilter:"Add filter",fbAddGroup:"Add group",fbRemove:"Remove",fbClear:"Clear all",fbApply:"Apply",fbField:"Field",fbOperator:"Operator",fbValue:"Value",fbTo:"and",fbList:"a, b, c",fbNone:"No filters",fbLabel:"Filters"});y("pt-BR",{fbEq:"igual a",fbNe:"diferente de",fbContains:"cont\xE9m",fbNotContains:"n\xE3o cont\xE9m",fbStarts:"come\xE7a com",fbEnds:"termina com",fbGt:"maior que",fbGe:"maior ou igual a",fbLt:"menor que",fbLe:"menor ou igual a",fbBetween:"entre",fbNotBetween:"fora do intervalo",fbIn:"\xE9 um de",fbNin:"n\xE3o \xE9 nenhum de",fbEmpty:"est\xE1 vazio",fbNotEmpty:"n\xE3o est\xE1 vazio",fbAnd:"Todas (E)",fbOr:"Qualquer uma (OU)",fbAddFilter:"Adicionar filtro",fbAddGroup:"Adicionar grupo",fbRemove:"Remover",fbClear:"Limpar tudo",fbApply:"Aplicar",fbField:"Campo",fbOperator:"Operador",fbValue:"Valor",fbTo:"e",fbList:"a, b, c",fbNone:"Sem filtros",fbLabel:"Filtros"});var w={text:["contains","notContains","eq","ne","startsWith","endsWith","in","nin","empty","notEmpty"],number:["eq","ne","gt","ge","lt","le","between","notBetween","empty","notEmpty"],date:["eq","ne","gt","ge","lt","le","between","notBetween","empty","notEmpty"],select:["eq","ne","in","nin","empty","notEmpty"]},C={eq:"fbEq",ne:"fbNe",contains:"fbContains",notContains:"fbNotContains",startsWith:"fbStarts",endsWith:"fbEnds",gt:"fbGt",ge:"fbGe",lt:"fbLt",le:"fbLe",between:"fbBetween",notBetween:"fbNotBetween",in:"fbIn",nin:"fbNin",empty:"fbEmpty",notEmpty:"fbNotEmpty"},v=h=>h==="empty"||h==="notEmpty"?0:h==="between"||h==="notBetween"?2:1,m=h=>h==="in"||h==="nin",E=class extends N{baseCls="op-filterbuilder";root={kind:"group",op:"and",items:[]};parts=[];nextId=1;cancelApply;pickMenu;onRender(){this.el.setAttribute("role","group"),this.el.setAttribute("aria-label",s("fbLabel")),this.config.value&&(this.root=this.fromNode(this.config.value)),this.own(()=>(this.parts.forEach(e=>e.destroy()),this.pickMenu?.destroy())),this.paint(),this.config.value&&this.config.store&&this.apply()}fromNode(e){if("filters"in e)return{kind:"group",op:e.op,items:e.filters.map(n=>this.fromNode(n))};let[i,t]=Array.isArray(e.value)&&!m(e.op??"eq")?e.value:[e.value,void 0];return{kind:"rule",id:this.nextId++,field:e.field,op:e.op??"eq",value:m(e.op??"eq")?e.value:i,value2:t}}field(e){return this.config.fields.find(i=>i.name===e)??this.config.fields[0]}complete(e){let i=v(e.op),t=n=>n!=null&&n!==""&&!(Array.isArray(n)&&!n.length);return i===0||(i===1?t(e.value):t(e.value)&&t(e.value2))}toNode(e){let i=e.items.flatMap(t=>{if(t.kind==="group")return this.toNode(t)?[this.toNode(t)]:[];if(!this.complete(t))return[];let n=v(t.op);return[{field:t.field,op:t.op,...n===1?{value:t.value}:n===2?{value:[t.value,t.value2]}:{}}]});return i.length?{op:e.op,filters:i}:null}getFilter(){return this.toNode(this.root)}setFilter(e){this.root=e?this.fromNode(e):{kind:"group",op:"and",items:[]},this.rendered&&this.paint(),this.changed()}clear(){this.setFilter(null),this.apply()}apply(){this.cancelApply?.();let e=this.getFilter();if(this.emit("before-apply",e)===!1)return;let i=this.config.store;i&&(e?i.filter(e):i.clearFilter()),this.emit("apply",e)}addRule(e){this.root.items.push(this.newRule(e)),this.rendered&&this.paint()}setFields(e){this.config.fields=e,this.rendered&&this.paint()}setStore(e){this.config.store=e}newRule(e){let i=this.field(e??"");return{kind:"rule",id:this.nextId++,field:i.name,op:w[i.type??"text"][0]}}changed(){this.emit("change",this.getFilter()),this.config.live!==!1&&(this.cancelApply?.(),this.cancelApply=this.later(()=>this.apply(),250))}paint(){let e=document.activeElement?.closest("[data-fb]")?.dataset.fb;this.parts.splice(0).forEach(n=>n.destroy());let i=[this.group(this.root,0,null)];this.config.live===!1&&i.push(p("div","op-filterbuilder__foot",{},this.button(s("fbApply"),"primary",()=>this.apply()))),this.el.replaceChildren(...i),this.mounted&&this.parts.forEach(n=>n.notifyMount());let t=e&&this.el.querySelector(`[data-fb="${e}"]`);t&&(t.matches("select,button,input")?t:t.querySelector("input"))?.focus()}button(e,i,t,n){let f=new x({text:e,variant:i,icon:n,handler:t});return this.parts.push(f),f.el}select(e,i,t,n,f){let r=p("select","op-filterbuilder__select",{"aria-label":t,"data-fb":n}),d=new Map;for(let[u,l,o]of e){let a=p("option","",{value:u},l);o?(d.has(o)||d.set(o,p("optgroup","",{label:o})),d.get(o).append(a)):r.append(a)}return r.append(...d.values()),r.value=i,this.listen(r,"change",()=>f(r.value)),r}group(e,i,t){let n=p("div",`op-filterbuilder__group${i?" is-nested":""}`,{role:"group","aria-label":s("fbLabel")}),f=this.select([["and",s("fbAnd")],["or",s("fbOr")]],e.op,s("fbLabel"),`g${i}:logic`,l=>{e.op=l,this.changed()}),r=p("div","op-filterbuilder__head",{},f),d=l=>{let o=this.newRule(l);e.items.push(o),this.paint(),this.el.querySelector(`[data-fb="r${o.id}:v1"] input, select[data-fb="r${o.id}:v1"]`)?.focus()},u=this.button(s("fbAddFilter"),"ghost",()=>this.config.addMode==="pick"?this.pick(u,d):d(),"plus");r.append(u),i<(this.config.maxDepth??3)&&r.append(this.button(s("fbAddGroup"),"ghost",()=>{e.items.push({kind:"group",op:"or",items:[this.newRule()]}),this.paint()},"plus")),t?r.append(this.removeBtn(()=>(t.items.splice(t.items.indexOf(e),1),this.paint(),this.changed()))):e.items.length&&r.append(this.button(s("fbClear"),"ghost",()=>this.clear())),n.append(r),!e.items.length&&!t&&n.append(p("div","op-filterbuilder__none",{},s("fbNone")));for(let l of e.items)n.append(l.kind==="group"?this.group(l,i+1,e):this.rule(l,e));return n}pick(e,i){let t=this.config.fields;this.pickMenu??=new _({}),this.pickMenu.setSearch(t.length>6),this.pickMenu.setItems(t.map(n=>({text:n.label??n.name,group:n.group,handler:()=>i(n.name)}))),this.pickMenu.showBy(e)}removeBtn(e){let i=p("button","op-filterbuilder__remove",{type:"button","aria-label":s("fbRemove"),title:s("fbRemove")},M("x"));return this.listen(i,"click",e),i}rule(e,i){let t=this.field(e.field),n=t.type??"text",f=`r${e.id}`,r=this.select(this.config.fields.map(o=>[o.name,o.label??o.name,o.group]),e.field,s("fbField"),`${f}:field`,o=>{e.field=o;let a=w[this.field(o).type??"text"];(!a.includes(e.op)||(this.field(o).type??"text")!==n)&&(e.op=a[0]),e.value=e.value2=void 0,this.paint(),this.changed()}),d=this.select(w[n].map(o=>[o,s(C[o])]),e.op,s("fbOperator"),`${f}:op`,o=>{let a=e.op;e.op=o,(v(a)!==v(e.op)||m(a)!==m(e.op))&&(e.value=e.value2=void 0),this.paint(),this.changed()}),u=p("div","op-filterbuilder__row",{},r,d),l=v(e.op);return l>=1&&u.append(this.editor(e,t,"value",`${f}:v1`)),l===2&&u.append(p("span","op-filterbuilder__to",{},s("fbTo")),this.editor(e,t,"value2",`${f}:v2`)),u.append(this.removeBtn(()=>(i.items.splice(i.items.indexOf(e),1),this.paint(),this.changed()))),u}editor(e,i,t,n){let f=i.type??"text",r=s("fbValue"),d=l=>{e[t]=l,this.changed()};if(f==="select"){let l=(i.options??[]).map(b=>typeof b=="object"?[String(b.value),b.label]:[String(b),String(b)]),o=b=>(i.options??[]).map(c=>typeof c=="object"?c.value:c).find(c=>String(c)===b)??b;if(m(e.op)){let b=new Set((Array.isArray(e.value)?e.value:[]).map(String)),c=p("div","op-filterbuilder__chips",{role:"group","aria-label":r,"data-fb":n});for(let[g,G]of l){let A=p("input","op-filterbuilder__chipbox",{type:"checkbox",value:g});A.checked=b.has(g),c.append(p("label","op-filterbuilder__chip",{},A,p("span","",{},G)))}return this.listen(c,"change",()=>d(Array.from(c.querySelectorAll("input:checked")).map(g=>o(g.value)))),c}let a=p("select","op-filterbuilder__select",{"aria-label":r,"data-fb":n});a.append(p("option","",{value:""},""));for(let[b,c]of l)a.append(p("option","",{value:b},c));return a.value=e.value!=null?String(e.value):"",this.listen(a,"change",()=>d(a.value===""?void 0:o(a.value))),a}if(m(e.op)){let l=new F({stableSize:!1,placeholder:s("fbList"),value:(e.value??[]).join(", ")});return l.on("change",o=>d(o.split(",").map(a=>a.trim()).filter(Boolean))),this.own1(l,r,n)}let u=f==="number"?new k({value:e[t]??null,stableSize:!1}):f==="date"?new S({value:e[t]??null,stableSize:!1}):new F({value:e[t]??"",stableSize:!1});return u.on("change",l=>d(l===""?void 0:l)),this.own1(u,r,n)}own1(e,i,t){this.parts.push(e),e.on("enter",()=>this.apply());let n=e.el;return n.classList.add("op-filterbuilder__value"),n.dataset.fb=t,e.getInput().setAttribute("aria-label",i),n}};L("filterbuilder",E);export{E as a};
|
|
2
|
+
//# sourceMappingURL=chunk-2YZB6XQR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/filterbuilder/filterbuilder.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 type { FilterGroup, FilterNode, FilterOp } from '../../../data/proxy';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu } from '../../overlays/menu/menu';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { NumberField } from '../../fields/numberfield/numberfield';\nimport { DateField } from '../../fields/datefield/datefield';\n\naddMessages('en', {\n fbEq: 'equals',\n fbNe: 'does not equal',\n fbContains: 'contains',\n fbNotContains: 'does not contain',\n fbStarts: 'starts with',\n fbEnds: 'ends with',\n fbGt: 'greater than',\n fbGe: 'greater than or equal',\n fbLt: 'less than',\n fbLe: 'less than or equal',\n fbBetween: 'is between',\n fbNotBetween: 'is not between',\n fbIn: 'is any of',\n fbNin: 'is none of',\n fbEmpty: 'is empty',\n fbNotEmpty: 'is not empty',\n fbAnd: 'Match all (AND)',\n fbOr: 'Match any (OR)',\n fbAddFilter: 'Add filter',\n fbAddGroup: 'Add group',\n fbRemove: 'Remove',\n fbClear: 'Clear all',\n fbApply: 'Apply',\n fbField: 'Field',\n fbOperator: 'Operator',\n fbValue: 'Value',\n fbTo: 'and',\n fbList: 'a, b, c',\n fbNone: 'No filters',\n fbLabel: 'Filters',\n});\naddMessages('pt-BR', {\n fbEq: 'igual a',\n fbNe: 'diferente de',\n fbContains: 'cont\u00E9m',\n fbNotContains: 'n\u00E3o cont\u00E9m',\n fbStarts: 'come\u00E7a com',\n fbEnds: 'termina com',\n fbGt: 'maior que',\n fbGe: 'maior ou igual a',\n fbLt: 'menor que',\n fbLe: 'menor ou igual a',\n fbBetween: 'entre',\n fbNotBetween: 'fora do intervalo',\n fbIn: '\u00E9 um de',\n fbNin: 'n\u00E3o \u00E9 nenhum de',\n fbEmpty: 'est\u00E1 vazio',\n fbNotEmpty: 'n\u00E3o est\u00E1 vazio',\n fbAnd: 'Todas (E)',\n fbOr: 'Qualquer uma (OU)',\n fbAddFilter: 'Adicionar filtro',\n fbAddGroup: 'Adicionar grupo',\n fbRemove: 'Remover',\n fbClear: 'Limpar tudo',\n fbApply: 'Aplicar',\n fbField: 'Campo',\n fbOperator: 'Operador',\n fbValue: 'Valor',\n fbTo: 'e',\n fbList: 'a, b, c',\n fbNone: 'Sem filtros',\n fbLabel: 'Filtros',\n});\n\nexport interface FilterField {\n name: string;\n label?: string;\n type?: 'text' | 'number' | 'date' | 'select';\n /** Fields with the same group sit together in the field pickers (as columns do in the Grid's column menu). */\n group?: string;\n /** For `select`: the choices. */\n options?: Array<string | number | { value: string | number; label: string }>;\n}\n\nexport interface FilterBuilderConfig extends ComponentConfig {\n fields: FilterField[];\n /** Starting filters. */\n value?: FilterGroup | null;\n /** Filtered as the user edits (`live`) or when Apply is pressed. */\n store?: Store<any>;\n /** Apply on every edit (debounced). Default true. With `false` an Apply button appears. */\n live?: boolean;\n /**\n * What \"Add filter\" does: `'row'` (default) adds an empty row for the first field; `'pick'` first asks\n * which field to filter by (a menu of the fields, grouped by `group`, with a search field past 6 fields) and adds the row for it.\n */\n addMode?: 'row' | 'pick';\n /** Deepest group nesting allowed. Default 3. */\n maxDepth?: number;\n}\n\ntype Rule = { kind: 'rule'; id: number; field: string; op: FilterOp; value?: any; value2?: any };\ntype Group = { kind: 'group'; op: 'and' | 'or'; items: Array<Rule | Group> };\n\nconst OPS: Record<NonNullable<FilterField['type']>, FilterOp[]> = {\n text: ['contains', 'notContains', 'eq', 'ne', 'startsWith', 'endsWith', 'in', 'nin', 'empty', 'notEmpty'],\n number: ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'between', 'notBetween', 'empty', 'notEmpty'],\n date: ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'between', 'notBetween', 'empty', 'notEmpty'],\n select: ['eq', 'ne', 'in', 'nin', 'empty', 'notEmpty'],\n};\nconst KEY: Record<FilterOp, string> = {\n eq: 'fbEq', ne: 'fbNe', contains: 'fbContains', notContains: 'fbNotContains', startsWith: 'fbStarts', endsWith: 'fbEnds',\n gt: 'fbGt', ge: 'fbGe', lt: 'fbLt', le: 'fbLe', between: 'fbBetween', notBetween: 'fbNotBetween', in: 'fbIn', nin: 'fbNin',\n empty: 'fbEmpty', notEmpty: 'fbNotEmpty',\n};\nconst arity = (op: FilterOp) => (op === 'empty' || op === 'notEmpty' ? 0 : op === 'between' || op === 'notBetween' ? 2 : 1);\nconst isList = (op: FilterOp) => op === 'in' || op === 'nin';\n\n/**\n * A dynamic filter editor: rows of `field \u00B7 operator \u00B7 value` that accumulate below each other, joined by AND or OR,\n * with nestable groups. The result is a `FilterGroup` for `Store.filter`.\n */\nexport class FilterBuilder extends Component<FilterBuilderConfig> {\n protected override baseCls = 'op-filterbuilder';\n private root: Group = { kind: 'group', op: 'and', items: [] };\n private parts: Component[] = [];\n private nextId = 1;\n private cancelApply?: () => void;\n private pickMenu?: Menu;\n\n protected override onRender() {\n this.el.setAttribute('role', 'group');\n this.el.setAttribute('aria-label', t('fbLabel'));\n if (this.config.value) this.root = this.fromNode(this.config.value) as Group;\n this.own(() => (this.parts.forEach((p) => p.destroy()), this.pickMenu?.destroy()));\n this.paint();\n if (this.config.value && this.config.store) this.apply(); // the starting filter takes effect right away\n }\n\n // ---- model <-> filter ----------------------------------------------------------------------\n\n private fromNode(n: FilterNode): Rule | Group {\n if ('filters' in n) return { kind: 'group', op: n.op, items: n.filters.map((f) => this.fromNode(f)) };\n const [a, b] = Array.isArray(n.value) && !isList(n.op ?? 'eq') ? n.value : [n.value, undefined];\n return { kind: 'rule', id: this.nextId++, field: n.field, op: n.op ?? 'eq', value: isList(n.op ?? 'eq') ? n.value : a, value2: b };\n }\n\n private field(name: string): FilterField {\n return this.config.fields.find((f) => f.name === name) ?? this.config.fields[0];\n }\n\n private complete(r: Rule): boolean {\n const n = arity(r.op);\n const has = (v: unknown) => v != null && v !== '' && !(Array.isArray(v) && !v.length);\n return n === 0 || (n === 1 ? has(r.value) : has(r.value) && has(r.value2));\n }\n\n private toNode(g: Group): FilterGroup | null {\n const filters = g.items.flatMap((it): FilterNode[] => {\n if (it.kind === 'group') return this.toNode(it) ? [this.toNode(it)!] : [];\n if (!this.complete(it)) return [];\n const n = arity(it.op);\n return [{ field: it.field, op: it.op, ...(n === 1 ? { value: it.value } : n === 2 ? { value: [it.value, it.value2] } : {}) }];\n });\n return filters.length ? { op: g.op, filters } : null;\n }\n\n /** The complete rules as a filter tree (incomplete rows are left out); null when there is nothing to filter by. */\n getFilter(): FilterGroup | null {\n return this.toNode(this.root);\n }\n\n setFilter(filter: FilterGroup | null): void {\n this.root = filter ? (this.fromNode(filter) as Group) : { kind: 'group', op: 'and', items: [] };\n if (this.rendered) this.paint();\n this.changed();\n }\n\n /** Removes every row and applies the empty filter. */\n clear(): void {\n this.setFilter(null);\n this.apply();\n }\n\n /** Pushes the current filter to the store and fires `apply`. */\n apply(): void {\n this.cancelApply?.();\n const f = this.getFilter();\n if (this.emit('before-apply', f) === false) return;\n const store = this.config.store;\n if (store) void (f ? store.filter(f) : store.clearFilter());\n this.emit('apply', f);\n }\n\n /** Adds a row (optionally for a given field) to the root group. */\n addRule(field?: string): void {\n this.root.items.push(this.newRule(field));\n if (this.rendered) this.paint();\n }\n\n setFields(fields: FilterField[]): void {\n this.config.fields = fields;\n if (this.rendered) this.paint();\n }\n\n setStore(store: Store<any> | undefined): void {\n this.config.store = store;\n }\n\n private newRule(field?: string): Rule {\n const f = this.field(field ?? '');\n return { kind: 'rule', id: this.nextId++, field: f.name, op: OPS[f.type ?? 'text'][0] };\n }\n\n private changed(): void {\n this.emit('change', this.getFilter());\n if (this.config.live === false) return;\n this.cancelApply?.();\n this.cancelApply = this.later(() => this.apply(), 250);\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n /** Rebuilds the rows, keeping keyboard focus on the same control. */\n private paint(): void {\n const keep = (document.activeElement as HTMLElement | null)?.closest<HTMLElement>('[data-fb]')?.dataset.fb;\n this.parts.splice(0).forEach((p) => p.destroy());\n const kids: HTMLElement[] = [this.group(this.root, 0, null)];\n if (this.config.live === false) kids.push(h('div', 'op-filterbuilder__foot', {}, this.button(t('fbApply'), 'primary', () => this.apply())));\n this.el.replaceChildren(...kids);\n if (this.mounted) this.parts.forEach((p) => p.notifyMount());\n const back = keep && this.el.querySelector<HTMLElement>(`[data-fb=\"${keep}\"]`);\n if (back) (back.matches('select,button,input') ? back : back.querySelector('input'))?.focus();\n }\n\n private button(text: string, variant: 'default' | 'primary' | 'ghost', handler: () => void, icon?: string): HTMLElement {\n const b = new Button({ text, variant, icon, handler });\n this.parts.push(b);\n return b.el;\n }\n\n private select(options: Array<[string, string, string?]>, value: string, label: string, key: string, onChange: (v: string) => void): HTMLSelectElement {\n const s = h('select', 'op-filterbuilder__select', { 'aria-label': label, 'data-fb': key });\n const groups = new Map<string, HTMLElement>(); // a third value is the group: those options go in an <optgroup>\n for (const [v, text, g] of options) {\n const opt = h('option', '', { value: v }, text);\n if (!g) s.append(opt);\n else {\n if (!groups.has(g)) groups.set(g, h('optgroup', '', { label: g }));\n groups.get(g)!.append(opt);\n }\n }\n s.append(...groups.values());\n s.value = value;\n this.listen(s, 'change', () => onChange(s.value));\n return s;\n }\n\n private group(g: Group, depth: number, parent: Group | null): HTMLElement {\n const el = h('div', `op-filterbuilder__group${depth ? ' is-nested' : ''}`, { role: 'group', 'aria-label': t('fbLabel') });\n const logic = this.select([['and', t('fbAnd')], ['or', t('fbOr')]], g.op, t('fbLabel'), `g${depth}:logic`, (v) => {\n g.op = v as 'and' | 'or';\n this.changed();\n });\n const head = h('div', 'op-filterbuilder__head', {}, logic);\n const add = (field?: string) => {\n const r = this.newRule(field);\n g.items.push(r);\n this.paint();\n this.el.querySelector<HTMLElement>(`[data-fb=\"r${r.id}:v1\"] input, select[data-fb=\"r${r.id}:v1\"]`)?.focus();\n };\n const addBtn = this.button(t('fbAddFilter'), 'ghost', () => (this.config.addMode === 'pick' ? this.pick(addBtn, add) : add()), 'plus');\n head.append(addBtn);\n if (depth < (this.config.maxDepth ?? 3)) {\n head.append(\n this.button(t('fbAddGroup'), 'ghost', () => {\n g.items.push({ kind: 'group', op: 'or', items: [this.newRule()] });\n this.paint();\n }, 'plus'),\n );\n }\n if (parent) head.append(this.removeBtn(() => (parent.items.splice(parent.items.indexOf(g), 1), this.paint(), this.changed())));\n else if (g.items.length) head.append(this.button(t('fbClear'), 'ghost', () => this.clear()));\n el.append(head);\n if (!g.items.length && !parent) el.append(h('div', 'op-filterbuilder__none', {}, t('fbNone')));\n for (const it of g.items) el.append(it.kind === 'group' ? this.group(it, depth + 1, g) : this.rule(it, g));\n return el;\n }\n\n /** \"Add filter\" in `pick` mode: a menu of the fields; the chosen one gets the new row. */\n private pick(anchor: HTMLElement, add: (field: string) => void): void {\n const fields = this.config.fields;\n this.pickMenu ??= new Menu({});\n this.pickMenu.setSearch(fields.length > 6);\n this.pickMenu.setItems(fields.map((f) => ({ text: f.label ?? f.name, group: f.group, handler: () => add(f.name) })));\n this.pickMenu.showBy(anchor);\n }\n\n private removeBtn(onClick: () => void): HTMLElement {\n const b = h('button', 'op-filterbuilder__remove', { type: 'button', 'aria-label': t('fbRemove'), title: t('fbRemove') }, iconEl('x'));\n this.listen(b, 'click', onClick);\n return b;\n }\n\n private rule(r: Rule, parent: Group): HTMLElement {\n const f = this.field(r.field);\n const type = f.type ?? 'text';\n const k = `r${r.id}`;\n const fieldSel = this.select(this.config.fields.map((x) => [x.name, x.label ?? x.name, x.group]), r.field, t('fbField'), `${k}:field`, (v) => {\n r.field = v;\n const ops = OPS[this.field(v).type ?? 'text'];\n if (!ops.includes(r.op) || (this.field(v).type ?? 'text') !== type) r.op = ops[0];\n r.value = r.value2 = undefined;\n this.paint();\n this.changed();\n });\n const opSel = this.select(OPS[type].map((o) => [o, t(KEY[o])]), r.op, t('fbOperator'), `${k}:op`, (v) => {\n const prev = r.op;\n r.op = v as FilterOp;\n if (arity(prev) !== arity(r.op) || isList(prev) !== isList(r.op)) r.value = r.value2 = undefined;\n this.paint();\n this.changed();\n });\n const row = h('div', 'op-filterbuilder__row', {}, fieldSel, opSel);\n const n = arity(r.op);\n if (n >= 1) row.append(this.editor(r, f, 'value', `${k}:v1`));\n if (n === 2) row.append(h('span', 'op-filterbuilder__to', {}, t('fbTo')), this.editor(r, f, 'value2', `${k}:v2`));\n row.append(this.removeBtn(() => (parent.items.splice(parent.items.indexOf(r), 1), this.paint(), this.changed())));\n return row;\n }\n\n private editor(r: Rule, f: FilterField, slot: 'value' | 'value2', key: string): HTMLElement {\n const type = f.type ?? 'text';\n const label = t('fbValue');\n const set = (v: unknown) => {\n r[slot] = v;\n this.changed();\n };\n if (type === 'select') {\n const opts = (f.options ?? []).map((o): [string, string] => (typeof o === 'object' ? [String(o.value), o.label] : [String(o), String(o)]));\n const raw = (v: string) => (f.options ?? []).map((o) => (typeof o === 'object' ? o.value : o)).find((o) => String(o) === v) ?? v;\n if (isList(r.op)) {\n // \"is any of\": one toggle chip per option (a native multi-select is tall, scrolls and is easy to mis-click)\n const on = new Set((Array.isArray(r.value) ? r.value : []).map(String));\n const group = h('div', 'op-filterbuilder__chips', { role: 'group', 'aria-label': label, 'data-fb': key });\n for (const [v, text] of opts) {\n const box = h('input', 'op-filterbuilder__chipbox', { type: 'checkbox', value: v });\n box.checked = on.has(v);\n group.append(h('label', 'op-filterbuilder__chip', {}, box, h('span', '', {}, text)));\n }\n this.listen(group, 'change', () => set(Array.from(group.querySelectorAll<HTMLInputElement>('input:checked')).map((i) => raw(i.value))));\n return group;\n }\n const s = h('select', 'op-filterbuilder__select', { 'aria-label': label, 'data-fb': key });\n s.append(h('option', '', { value: '' }, ''));\n for (const [v, text] of opts) s.append(h('option', '', { value: v }, text));\n s.value = r.value != null ? String(r.value) : '';\n this.listen(s, 'change', () => set(s.value === '' ? undefined : raw(s.value)));\n return s;\n }\n if (isList(r.op)) {\n const c = new TextField({ stableSize: false, placeholder: t('fbList'), value: ((r.value as unknown[]) ?? []).join(', ') });\n c.on('change', (v: string) => set(v.split(',').map((x) => x.trim()).filter(Boolean)));\n return this.own1(c, label, key);\n }\n const c = type === 'number' ? new NumberField({ value: r[slot] ?? null, stableSize: false }) : type === 'date' ? new DateField({ value: r[slot] ?? null, stableSize: false }) : new TextField({ value: r[slot] ?? '', stableSize: false });\n c.on('change', (v: unknown) => set(v === '' ? undefined : v));\n return this.own1(c, label, key);\n }\n\n /** Registers an editor, labels its input, and makes Enter apply. */\n private own1(c: TextField<any, any>, label: string, key: string): HTMLElement {\n this.parts.push(c);\n c.on('enter', () => this.apply());\n const el = c.el;\n el.classList.add('op-filterbuilder__value');\n el.dataset.fb = key;\n c.getInput().setAttribute('aria-label', label);\n return el;\n }\n}\nregister('filterbuilder', FilterBuilder);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "OPS", "KEY", "arity", "op", "isList", "FilterBuilder", "Component", "t", "p", "n", "f", "a", "b", "name", "r", "has", "v", "g", "filters", "it", "filter", "store", "field", "fields", "keep", "kids", "h", "back", "text", "variant", "handler", "icon", "Button", "options", "value", "label", "key", "onChange", "s", "groups", "opt", "depth", "parent", "el", "logic", "head", "add", "addBtn", "anchor", "Menu", "onClick", "iconEl", "type", "k", "fieldSel", "x", "ops", "opSel", "prev", "row", "slot", "set", "opts", "o", "raw", "on", "group", "box", "i", "c", "TextField", "NumberField", "DateField", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-A2NKDOYN.js";import{b as r,c as s}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-MW3RWBZ7.js";var n=class extends o{baseCls="op-field";value;original;error="";inputEl;labelEl;helpEl;errorEl;dirty=!1;cancelSettle;constructor(e={}){super(e),this.value=this.original=e.value??this.emptyValue()}get name(){return this.config.name}emptyValue(){return""}isEmpty(e){return e==null||e===""||Array.isArray(e)&&!e.length}isEqual(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}build(){let e=this.config,t=r("div",`${this.baseCls}${e.labelPos==="left"?" op-field--label-left":""}`);this.labelEl=r("label","op-field__label");let i=r("div","op-field__control",{},this.createControl());return this.helpEl=r("div","op-field__help",{id:`${this.id}-help`}),this.errorEl=r("div","op-field__error",{id:`${this.id}-error`,role:"alert"}),t.append(this.labelEl,i,this.helpEl,this.errorEl),t}onRender(){let e=this.config,t=this.inputEl;t.id||=s("op-input"),this.labelEl.htmlFor=t.id,e.ariaLabel&&t!==this.el&&(t.setAttribute("aria-label",e.ariaLabel),this.el.removeAttribute("aria-label")),this.setLabel(e.label??""),this.setHelp(e.help??""),this.setRequired(!!e.required),this.setReadonly(!!e.readonly),this.applyValue(this.value),this.paintError(),this.listen(this.el,"focusin",()=>{this.el.classList.add("is-focused"),this.emit("focus")}),this.listen(this.el,"focusout",i=>{this.el.contains(i.relatedTarget)||(this.flushSettled(),this.el.classList.remove("is-focused"),(e.validateOn??"blur")==="blur"&&this.validate(),this.emit("blur"))})}focusEl(){return this.render(),this.inputEl}getValue(){return this.value}setValue(e,t=!1){let i=this.value;this.value=e,this.rendered&&this.applyValue(e),this.isEqual(i,e)||this.changed(i,t)}commit(e){let t=this.value;this.value=e,this.isEqual(t,e)||this.changed(t,!1)}changed(e,t){this.updateDirty(),!t&&((this.config.validateOn==="change"||this.error)&&this.validate(),this.emit("change",this.value,e),this.queueSettled())}queueSettled(){this.cancelSettle?.(),this.cancelSettle=void 0;let e=this.config.debounce;if(!e)return void this.emit("settled",this.value);this.cancelSettle=this.later(()=>{this.cancelSettle=void 0,this.emit("settled",this.value)},e)}flushSettled(){this.cancelSettle&&(this.cancelSettle(),this.cancelSettle=void 0,this.emit("settled",this.value))}updateDirty(){let e=this.isDirty();e!==this.dirty&&(this.dirty=e,this.rendered&&this.el.classList.toggle("is-dirty",e),this.emit("dirty-change",e))}getDisplayText(){let e=this.value;return this.isEmpty(e)?"":String(e)}clear(){this.setValue(this.emptyValue())}isDirty(){return!this.isEqual(this.value,this.original)}markClean(){this.original=this.value,this.updateDirty()}reset(){this.setValue(this.original,!0),this.clearError()}check(){let e=this.value;if(this.isEmpty(e))return this.config.required?l("required"):"";for(let t of this.config.validators??[]){let i=t(e,this);if(typeof i=="string")return i}return""}validate(){let e=this.check();return e?this.setError(e):this.clearError(),!e}isValid(){return!this.check()}getError(){return this.error}setError(e){let t=this.error;this.error=e,this.paintError(),e&&e!==t&&this.emit("invalid",e)}clearError(){this.error&&(this.error="",this.paintError(),this.emit("valid"))}paintError(){this.rendered&&(this.errorEl.textContent=this.error,this.el.classList.toggle("is-invalid",!!this.error),this.inputEl.setAttribute("aria-invalid",String(!!this.error)),this.describe())}describe(){let e=[this.error&&this.errorEl.id,this.config.help&&this.helpEl.id].filter(Boolean);e.length?this.inputEl.setAttribute("aria-describedby",e.join(" ")):this.inputEl.removeAttribute("aria-describedby")}setLabel(e){this.config.label=e,this.rendered&&(this.labelEl.textContent=e,this.labelEl.hidden=!e)}setHelp(e){this.config.help=e,this.rendered&&(this.helpEl.textContent=e,this.helpEl.hidden=!e,this.describe())}setRequired(e){this.config.required=e,this.rendered&&(this.el.classList.toggle("is-required",e),this.inputEl.setAttribute("aria-required",String(e)))}setReadonly(e){this.config.readonly=e,this.rendered&&(this.el.classList.toggle("is-readonly",e),this.onReadonly(e))}setValidators(e){this.config.validators=e}onReadonly(e){}};export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-2ZRNGG2N.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/field.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from './component';\nimport { h, uid } from './dom';\nimport { t } from './i18n';\nimport type { Validator } from './validators';\n\nexport interface FieldConfig<V = unknown> extends ComponentConfig {\n name?: string;\n label?: string;\n labelPos?: 'top' | 'left';\n value?: V;\n required?: boolean;\n readonly?: boolean;\n help?: string;\n validators?: Validator<V>[];\n /** When to validate on its own. After the first error it revalidates on every change. Default `blur`. */\n validateOn?: 'blur' | 'change' | 'submit';\n /** ms of quiet after the last change before `settled` fires (0 = right away). `change` itself is never delayed. */\n debounce?: number;\n}\n\n/**\n * Base of every field: value, validation, dirty tracking, label and messages.\n * Subclasses implement `createControl` (build the control, assign `inputEl`), `applyValue` (value \u2192 DOM)\n * and call `commit` when the user edits (DOM \u2192 value).\n */\nexport abstract class Field<V = unknown, C extends FieldConfig<V> = FieldConfig<V>> extends Component<C> {\n protected override baseCls = 'op-field';\n protected value: V;\n protected original: V;\n protected error = '';\n /** The focusable control; `label for`, `aria-invalid` and `aria-describedby` point at it. */\n protected inputEl!: HTMLElement;\n private labelEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private errorEl!: HTMLElement;\n private dirty = false;\n private cancelSettle?: () => void;\n\n constructor(config: C = {} as C) {\n super(config);\n this.value = this.original = config.value ?? this.emptyValue();\n }\n\n get name(): string | undefined {\n return this.config.name;\n }\n\n protected abstract createControl(): HTMLElement;\n protected abstract applyValue(value: V): void;\n protected emptyValue(): V {\n return '' as V;\n }\n protected isEmpty(v: V): boolean {\n return v == null || (v as unknown) === '' || (Array.isArray(v) && !v.length);\n }\n protected isEqual(a: V, b: V): boolean {\n return a === b || JSON.stringify(a) === JSON.stringify(b);\n }\n\n protected override build(): HTMLElement {\n const c = this.config;\n const el = h('div', `${this.baseCls}${c.labelPos === 'left' ? ' op-field--label-left' : ''}`);\n this.labelEl = h('label', 'op-field__label');\n const control = h('div', 'op-field__control', {}, this.createControl());\n this.helpEl = h('div', 'op-field__help', { id: `${this.id}-help` });\n this.errorEl = h('div', 'op-field__error', { id: `${this.id}-error`, role: 'alert' });\n el.append(this.labelEl, control, this.helpEl, this.errorEl);\n return el;\n }\n\n protected override onRender(): void {\n const c = this.config;\n const input = this.inputEl;\n input.id ||= uid('op-input');\n (this.labelEl as HTMLLabelElement).htmlFor = input.id;\n // a field without a visible label is named by `ariaLabel` on its control (the root is just a wrapper)\n if (c.ariaLabel && input !== this.el) {\n input.setAttribute('aria-label', c.ariaLabel);\n this.el.removeAttribute('aria-label');\n }\n this.setLabel(c.label ?? '');\n this.setHelp(c.help ?? '');\n this.setRequired(!!c.required);\n this.setReadonly(!!c.readonly);\n this.applyValue(this.value);\n this.paintError();\n this.listen(this.el, 'focusin', () => {\n this.el.classList.add('is-focused');\n this.emit('focus');\n });\n this.listen(this.el, 'focusout', (e: FocusEvent) => {\n if (this.el.contains(e.relatedTarget as Node)) return;\n this.flushSettled();\n this.el.classList.remove('is-focused');\n if ((c.validateOn ?? 'blur') === 'blur') this.validate();\n this.emit('blur');\n });\n }\n\n protected override focusEl(): HTMLElement {\n this.render();\n return this.inputEl;\n }\n\n // ---- value ---------------------------------------------------------------------------------\n\n getValue(): V {\n return this.value;\n }\n\n /** Sets the value programmatically. `silent` skips the `change` event and validation. */\n setValue(v: V, silent = false): void {\n const old = this.value;\n this.value = v;\n if (this.rendered) this.applyValue(v);\n if (!this.isEqual(old, v)) this.changed(old, silent);\n }\n\n /** For subclasses: the user edited the control and the DOM already shows `v`. */\n protected commit(v: V): void {\n const old = this.value;\n this.value = v;\n if (!this.isEqual(old, v)) this.changed(old, false);\n }\n\n private changed(old: V, silent: boolean): void {\n this.updateDirty();\n if (silent) return;\n if (this.config.validateOn === 'change' || this.error) this.validate();\n this.emit('change', this.value, old);\n this.queueSettled();\n }\n\n /** `settled(value)`: the value after the user stopped changing it for `debounce` ms (immediately without `debounce`). */\n private queueSettled(): void {\n this.cancelSettle?.();\n this.cancelSettle = undefined;\n const ms = this.config.debounce;\n if (!ms) return void this.emit('settled', this.value);\n this.cancelSettle = this.later(() => {\n this.cancelSettle = undefined;\n this.emit('settled', this.value);\n }, ms);\n }\n\n /** Fires a pending `settled` now (Enter, blur, end of a drag...). No-op when nothing is waiting. */\n protected flushSettled(): void {\n if (!this.cancelSettle) return;\n this.cancelSettle();\n this.cancelSettle = undefined;\n this.emit('settled', this.value);\n }\n\n private updateDirty(): void {\n const d = this.isDirty();\n if (d === this.dirty) return;\n this.dirty = d;\n if (this.rendered) this.el.classList.toggle('is-dirty', d);\n this.emit('dirty-change', d);\n }\n\n /** What the user sees as this field's value (a select's label, a formatted date); used by summaries such as the StepForm review. */\n getDisplayText(): string {\n const v = this.value;\n return this.isEmpty(v) ? '' : String(v);\n }\n\n /** Sets the empty value (`''`, `null`, `false`...) and emits `change`. */\n clear(): void {\n this.setValue(this.emptyValue());\n }\n\n isDirty(): boolean {\n return !this.isEqual(this.value, this.original);\n }\n\n /** The current value becomes the \"original\" (as after loading or saving). */\n markClean(): void {\n this.original = this.value;\n this.updateDirty();\n }\n\n reset(): void {\n this.setValue(this.original, true);\n this.clearError();\n }\n\n // ---- validation ----------------------------------------------------------------------------\n\n /** Returns the error message for the current value, or `''`. No UI side effects. */\n protected check(): string {\n const v = this.value;\n if (this.isEmpty(v)) return this.config.required ? t('required') : '';\n for (const fn of this.config.validators ?? []) {\n const r = fn(v, this as Field<any>);\n if (typeof r === 'string') return r;\n }\n return '';\n }\n\n validate(): boolean {\n const msg = this.check();\n if (msg) this.setError(msg);\n else this.clearError();\n return !msg;\n }\n\n isValid(): boolean {\n return !this.check();\n }\n\n getError(): string {\n return this.error;\n }\n\n setError(msg: string): void {\n const was = this.error;\n this.error = msg;\n this.paintError();\n if (msg && msg !== was) this.emit('invalid', msg);\n }\n\n clearError(): void {\n if (!this.error) return;\n this.error = '';\n this.paintError();\n this.emit('valid');\n }\n\n private paintError(): void {\n if (!this.rendered) return;\n this.errorEl.textContent = this.error;\n this.el.classList.toggle('is-invalid', !!this.error);\n this.inputEl.setAttribute('aria-invalid', String(!!this.error));\n this.describe();\n }\n\n private describe(): void {\n const ids = [this.error && this.errorEl.id, this.config.help && this.helpEl.id].filter(Boolean);\n if (ids.length) this.inputEl.setAttribute('aria-describedby', ids.join(' '));\n else this.inputEl.removeAttribute('aria-describedby');\n }\n\n // ---- setters -------------------------------------------------------------------------------\n\n setLabel(label: string): void {\n this.config.label = label;\n if (!this.rendered) return;\n this.labelEl.textContent = label;\n this.labelEl.hidden = !label;\n }\n\n setHelp(help: string): void {\n this.config.help = help;\n if (!this.rendered) return;\n this.helpEl.textContent = help;\n this.helpEl.hidden = !help;\n this.describe();\n }\n\n setRequired(required: boolean): void {\n this.config.required = required;\n if (!this.rendered) return;\n this.el.classList.toggle('is-required', required);\n this.inputEl.setAttribute('aria-required', String(required));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n if (!this.rendered) return;\n this.el.classList.toggle('is-readonly', readonly);\n this.onReadonly(readonly);\n }\n\n setValidators(validators: Validator<V>[]): void {\n this.config.validators = validators;\n }\n\n protected onReadonly(_readonly: boolean): void {}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Field", "Component", "config", "v", "a", "b", "c", "el", "h", "control", "input", "uid", "e", "silent", "old", "ms", "d", "t", "fn", "r", "msg", "was", "ids", "label", "help", "required", "readonly", "validators", "_readonly"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{g as r}from"./chunk-4AA4FQEM.js";import{c as l}from"./chunk-4EZJ5FKJ.js";import{a as o}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as n}from"./chunk-TIPK3SCJ.js";var s=class extends o{baseCls="op-button";tag="button";textEl;busyTextEl;iconHost;build(){let t=this.config,e=i("button","op-button",{type:t.htmlType??"button"});return this.iconHost=i("span","op-button__icon"),this.textEl=i("span","op-button__text"),this.busyTextEl=i("span","op-button__busy-text"),e.append(i("span","op-button__face",{},this.iconHost,this.textEl),i("span","op-button__busy",{},i("span","op-spinner op-button__spinner",{"aria-hidden":"true"}),this.busyTextEl)),e}onRender(){let t=this.config;this.setText(t.text??""),this.setIcon(t.icon??""),this.setVariant(t.variant??"default"),this.setPressed(!!t.pressed),!t.text&&!t.ariaLabel&&!t.tooltip&&console.warn("Optikos: icon-only Button needs ariaLabel"),this.listen(this.el,"click",e=>{if(t.disabled||t.loading||(t.toggle&&(this.setPressed(!t.pressed),this.emit("toggle",t.pressed)),this.emit("click",e)===!1))return e.preventDefault();t.handler?.(this,e)})}onDisabled(t){this.el.disabled=t}setText(t){this.config.text=t,this.rendered&&(this.textEl.textContent=t,this.textEl.hidden=!t,this.busyTextEl.textContent=this.config.loadingText??t)}setIcon(t){this.config.icon=t,this.rendered&&(this.iconHost.replaceChildren(...t?[l(t)]:[]),this.iconHost.hidden=!t,this.el.classList.toggle("op-button--icon-right",this.config.iconPos==="right"))}setVariant(t){if(this.config.variant=t,!!this.rendered)for(let e of["default","primary","danger","ghost"])this.el.classList.toggle(`op-button--${e}`,e===t)}setPressed(t){this.config.pressed=t,this.rendered&&(this.el.classList.toggle("is-pressed",t),this.config.toggle&&this.el.setAttribute("aria-pressed",String(t)))}setLoading(t){if(this.config.loading=t,typeof t=="string"&&this.setLoadingText(t),!!this.rendered){this.el.classList.toggle("is-loading",!!t);for(let e of["aria-busy","aria-disabled"])t?this.el.setAttribute(e,"true"):this.el.removeAttribute(e)}}setLoadingText(t){this.config.loadingText=t,this.rendered&&(this.busyTextEl.textContent=t)}pulse(){r(this.el)}click(){this.el.click()}};n("button",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-2ZUZ5HDL.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/base/button/button.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../icon/icon';\nimport { pulse } from '../../../motion/core';\n\nexport interface ButtonConfig extends ComponentConfig {\n text?: string;\n icon?: string;\n iconPos?: 'left' | 'right';\n variant?: 'default' | 'primary' | 'danger' | 'ghost';\n htmlType?: 'button' | 'submit' | 'reset';\n handler?: (button: Button, ev: MouseEvent) => unknown;\n /** Behaves as a toggle button (`aria-pressed`). */\n toggle?: boolean;\n pressed?: boolean;\n /** Text shown while loading. Default: `text`. Passing a string to `loading` sets it too. */\n loadingText?: string;\n}\n\nexport class Button extends Component<ButtonConfig> {\n protected override baseCls = 'op-button';\n protected override tag = 'button' as const;\n private textEl!: HTMLElement;\n private busyTextEl!: HTMLElement;\n private iconHost!: HTMLElement;\n\n protected override build() {\n const c = this.config;\n const el = h('button', 'op-button', { type: c.htmlType ?? 'button' });\n this.iconHost = h('span', 'op-button__icon');\n this.textEl = h('span', 'op-button__text');\n // Two layers share one grid cell: the normal face and the loading face. The inactive one is hidden by CSS,\n // so the button is as wide as the wider of the two and never jumps when loading starts.\n this.busyTextEl = h('span', 'op-button__busy-text');\n el.append(\n h('span', 'op-button__face', {}, this.iconHost, this.textEl),\n h('span', 'op-button__busy', {}, h('span', 'op-spinner op-button__spinner', { 'aria-hidden': 'true' }), this.busyTextEl),\n );\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.setText(c.text ?? '');\n this.setIcon(c.icon ?? '');\n this.setVariant(c.variant ?? 'default');\n this.setPressed(!!c.pressed);\n if (!c.text && !c.ariaLabel && !c.tooltip) console.warn('Optikos: icon-only Button needs ariaLabel');\n this.listen(this.el, 'click', (e: MouseEvent) => {\n if (c.disabled || c.loading) return e.preventDefault();\n if (c.toggle) {\n this.setPressed(!c.pressed);\n this.emit('toggle', c.pressed);\n }\n if (this.emit('click', e) === false) return e.preventDefault();\n c.handler?.(this, e);\n });\n }\n\n protected override onDisabled(disabled: boolean) {\n (this.el as HTMLButtonElement).disabled = disabled;\n }\n\n setText(text: string) {\n this.config.text = text;\n if (!this.rendered) return;\n this.textEl.textContent = text;\n this.textEl.hidden = !text;\n this.busyTextEl.textContent = this.config.loadingText ?? text;\n }\n\n setIcon(name: string) {\n this.config.icon = name;\n if (!this.rendered) return;\n this.iconHost.replaceChildren(...(name ? [iconEl(name)] : []));\n this.iconHost.hidden = !name;\n this.el.classList.toggle('op-button--icon-right', this.config.iconPos === 'right');\n }\n\n setVariant(variant: NonNullable<ButtonConfig['variant']>) {\n this.config.variant = variant;\n if (!this.rendered) return;\n for (const v of ['default', 'primary', 'danger', 'ghost']) this.el.classList.toggle(`op-button--${v}`, v === variant);\n }\n\n setPressed(pressed: boolean) {\n this.config.pressed = pressed;\n if (!this.rendered) return;\n this.el.classList.toggle('is-pressed', pressed);\n if (this.config.toggle) this.el.setAttribute('aria-pressed', String(pressed));\n }\n\n /** The button shows its own spinner (no mask) and ignores clicks while loading. A string is the loading text. */\n override setLoading(loading: boolean | string) {\n this.config.loading = loading;\n if (typeof loading === 'string') this.setLoadingText(loading);\n if (!this.rendered) return;\n this.el.classList.toggle('is-loading', !!loading);\n // the visible (loading) face names the button; it ignores clicks meanwhile, so it is announced as unavailable\n for (const a of ['aria-busy', 'aria-disabled']) (loading ? this.el.setAttribute(a, 'true') : this.el.removeAttribute(a));\n }\n\n setLoadingText(text: string) {\n this.config.loadingText = text;\n if (this.rendered) this.busyTextEl.textContent = text;\n }\n\n /** A subtle ring that confirms the action worked (motion rule 8). */\n pulse(): void {\n void pulse(this.el);\n }\n\n click() {\n (this.el as HTMLButtonElement).click();\n }\n}\nregister('button', Button);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Button", "Component", "c", "el", "h", "disabled", "text", "name", "iconEl", "variant", "v", "pressed", "loading", "a", "pulse", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-2ZUZ5HDL.js";import{a as l}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{e as a,f as n}from"./chunk-MW3RWBZ7.js";a("en",{faSave:"Save",faDirty:"Unsaved changes"});a("pt-BR",{faSave:"Salvar",faDirty:"Altera\xE7\xF5es n\xE3o salvas"});var r=class extends l{baseCls="op-formactions";statusEl;buttonsEl;form;save;cancel;extra=[];build(){return this.statusEl=i("span","op-formactions__status",{"aria-live":"polite"}),this.buttonsEl=i("div","op-formactions__buttons"),i("div","op-formactions",{},this.statusEl,this.buttonsEl)}onRender(){let t=this.config,e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;this.form=e,this.extra=(t.buttons??[]).map(s=>new o(s)),this.save=new o({text:t.submitText??n("faSave"),variant:"primary",htmlType:"submit"}),this.buttonsEl.append(...this.extra.map(s=>s.el),this.save.el),this.setCancelText(t.cancelText??n("cancel")),this.setSticky(!!t.sticky),this.form?.on("dirty-change",()=>this.paint()),this.own(()=>[...this.extra,this.save,this.cancel].forEach(s=>s?.destroy())),this.paint()}paint(){let t=!!this.form?.isDirty();this.el.classList.toggle("is-dirty",t),this.statusEl.textContent=t&&this.config.status!==!1?n("faDirty"):"",this.save.setDisabled(!!this.config.requireChanges&&!t)}getForm(){return this.form}setSubmitText(t){this.config.submitText=t,this.save?.setText(t)}setCancelText(t){if(this.config.cancelText=t,!!this.rendered){if(t===!1)return this.cancel?.destroy(),void(this.cancel=void 0);if(this.cancel)return this.cancel.setText(t);this.cancel=new o({text:t,handler:()=>this.emit("cancel")!==!1&&this.form?.reset()}),this.buttonsEl.insertBefore(this.cancel.el,this.save.el)}}setSticky(t){this.config.sticky=t,this.rendered&&this.el.classList.toggle("is-sticky",t)}};c("formactions",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3S24ZRPK.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/formactions/formactions.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, type ButtonConfig } from '../../base/button/button';\nimport type { Form } from '../form/form';\n\naddMessages('en', { faSave: 'Save', faDirty: 'Unsaved changes' });\naddMessages('pt-BR', { faSave: 'Salvar', faDirty: 'Altera\u00E7\u00F5es n\u00E3o salvas' });\n\nexport interface FormActionsConfig extends ComponentConfig {\n submitText?: string;\n /** `false` hides Cancel. */\n cancelText?: string | false;\n /** Extra buttons, before Cancel. */\n buttons?: ButtonConfig[];\n /** Sticks to the bottom of the scrolling area. */\n sticky?: boolean;\n /** Save is disabled until the form has changes. */\n requireChanges?: boolean;\n /** The \"Unsaved changes\" line. Default true. */\n status?: boolean;\n}\n\n/** The form's action bar: Cancel (resets), Save (submits) and an \"Unsaved changes\" status. */\nexport class FormActions extends Component<FormActionsConfig> {\n protected override baseCls = 'op-formactions';\n private statusEl!: HTMLElement;\n private buttonsEl!: HTMLElement;\n private form?: Form;\n private save!: Button;\n private cancel?: Button;\n private extra: Button[] = [];\n\n protected override build() {\n this.statusEl = h('span', 'op-formactions__status', { 'aria-live': 'polite' });\n this.buttonsEl = h('div', 'op-formactions__buttons');\n return h('div', 'op-formactions', {}, this.statusEl, this.buttonsEl);\n }\n\n protected override onRender() {\n const c = this.config;\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 this.form = p as Form | undefined;\n this.extra = (c.buttons ?? []).map((b) => new Button(b));\n this.save = new Button({ text: c.submitText ?? t('faSave'), variant: 'primary', htmlType: 'submit' });\n this.buttonsEl.append(...this.extra.map((b) => b.el), this.save.el);\n this.setCancelText(c.cancelText ?? t('cancel'));\n this.setSticky(!!c.sticky);\n this.form?.on('dirty-change', () => this.paint());\n this.own(() => [...this.extra, this.save, this.cancel].forEach((b) => b?.destroy()));\n this.paint();\n }\n\n private paint() {\n const dirty = !!this.form?.isDirty();\n this.el.classList.toggle('is-dirty', dirty);\n this.statusEl.textContent = dirty && this.config.status !== false ? t('faDirty') : '';\n this.save.setDisabled(!!this.config.requireChanges && !dirty);\n }\n\n getForm(): Form | undefined {\n return this.form;\n }\n\n setSubmitText(text: string) {\n this.config.submitText = text;\n this.save?.setText(text);\n }\n\n /** The Cancel button's text, or `false` to hide it. Cancel emits `cancel` (return false to keep the changes), then resets. */\n setCancelText(text: string | false) {\n this.config.cancelText = text;\n if (!this.rendered) return;\n if (text === false) return void (this.cancel?.destroy(), (this.cancel = undefined));\n if (this.cancel) return this.cancel.setText(text);\n this.cancel = new Button({ text, handler: () => this.emit('cancel') !== false && this.form?.reset() });\n this.buttonsEl.insertBefore(this.cancel.el, this.save.el);\n }\n\n setSticky(sticky: boolean) {\n this.config.sticky = sticky;\n if (this.rendered) this.el.classList.toggle('is-sticky', sticky);\n }\n}\nregister('formactions', FormActions);\n"],
|
|
5
|
+
"mappings": "+MAOAA,EAAY,KAAM,CAAE,OAAQ,OAAQ,QAAS,iBAAkB,CAAC,EAChEA,EAAY,QAAS,CAAE,OAAQ,SAAU,QAAS,gCAAwB,CAAC,EAiBpE,IAAMC,EAAN,cAA0BC,CAA6B,CACzC,QAAU,iBACrB,SACA,UACA,KACA,KACA,OACA,MAAkB,CAAC,EAER,OAAQ,CACzB,YAAK,SAAWC,EAAE,OAAQ,yBAA0B,CAAE,YAAa,QAAS,CAAC,EAC7E,KAAK,UAAYA,EAAE,MAAO,yBAAyB,EAC5CA,EAAE,MAAO,iBAAkB,CAAC,EAAG,KAAK,SAAU,KAAK,SAAS,CACrE,CAEmB,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACXC,EAAI,KAAK,OACb,KAAOA,GAAK,EAAE,eAAgBA,GAAK,cAAeA,IAAIA,EAAIA,EAAE,OAC5D,KAAK,KAAOA,EACZ,KAAK,OAASD,EAAE,SAAW,CAAC,GAAG,IAAKE,GAAM,IAAIC,EAAOD,CAAC,CAAC,EACvD,KAAK,KAAO,IAAIC,EAAO,CAAE,KAAMH,EAAE,YAAcI,EAAE,QAAQ,EAAG,QAAS,UAAW,SAAU,QAAS,CAAC,EACpG,KAAK,UAAU,OAAO,GAAG,KAAK,MAAM,IAAKF,GAAMA,EAAE,EAAE,EAAG,KAAK,KAAK,EAAE,EAClE,KAAK,cAAcF,EAAE,YAAcI,EAAE,QAAQ,CAAC,EAC9C,KAAK,UAAU,CAAC,CAACJ,EAAE,MAAM,EACzB,KAAK,MAAM,GAAG,eAAgB,IAAM,KAAK,MAAM,CAAC,EAChD,KAAK,IAAI,IAAM,CAAC,GAAG,KAAK,MAAO,KAAK,KAAM,KAAK,MAAM,EAAE,QAASE,GAAMA,GAAG,QAAQ,CAAC,CAAC,EACnF,KAAK,MAAM,CACb,CAEQ,OAAQ,CACd,IAAMG,EAAQ,CAAC,CAAC,KAAK,MAAM,QAAQ,EACnC,KAAK,GAAG,UAAU,OAAO,WAAYA,CAAK,EAC1C,KAAK,SAAS,YAAcA,GAAS,KAAK,OAAO,SAAW,GAAQD,EAAE,SAAS,EAAI,GACnF,KAAK,KAAK,YAAY,CAAC,CAAC,KAAK,OAAO,gBAAkB,CAACC,CAAK,CAC9D,CAEA,SAA4B,CAC1B,OAAO,KAAK,IACd,CAEA,cAAcC,EAAc,CAC1B,KAAK,OAAO,WAAaA,EACzB,KAAK,MAAM,QAAQA,CAAI,CACzB,CAGA,cAAcA,EAAsB,CAElC,GADA,KAAK,OAAO,WAAaA,EACrB,EAAC,KAAK,SACV,IAAIA,IAAS,GAAO,OAAa,KAAK,QAAQ,QAAQ,EAAI,UAAK,OAAS,QACxE,GAAI,KAAK,OAAQ,OAAO,KAAK,OAAO,QAAQA,CAAI,EAChD,KAAK,OAAS,IAAIH,EAAO,CAAE,KAAAG,EAAM,QAAS,IAAM,KAAK,KAAK,QAAQ,IAAM,IAAS,KAAK,MAAM,MAAM,CAAE,CAAC,EACrG,KAAK,UAAU,aAAa,KAAK,OAAO,GAAI,KAAK,KAAK,EAAE,EAC1D,CAEA,UAAUC,EAAiB,CACzB,KAAK,OAAO,OAASA,EACjB,KAAK,UAAU,KAAK,GAAG,UAAU,OAAO,YAAaA,CAAM,CACjE,CACF,EACAC,EAAS,cAAeX,CAAW",
|
|
6
|
+
"names": ["addMessages", "FormActions", "Component", "h", "c", "p", "b", "Button", "t", "dirty", "text", "sticky", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as u}from"./chunk-Z2JBUHKA.js";import{a as h}from"./chunk-W3H7GTJY.js";import{a as f}from"./chunk-G2DAD3MQ.js";import{f as o,g as p}from"./chunk-5JEXM5S7.js";import{c}from"./chunk-4EZJ5FKJ.js";import{b as d}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as n}from"./chunk-MW3RWBZ7.js";var a=class extends h{baseCls="op-field op-textfield op-picker op-datefield";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e}parse(e){let t=p(e);return this.garbage=!!e.trim()&&!t,t}display(e){return e?o(e,{day:"2-digit",month:"2-digit",year:"numeric"}):""}createControl(){let e=super.createControl(),t=this.input;t.setAttribute("role","combobox"),t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","false");let r=d("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},c("calendar"));this.listen(r,"mousedown",s=>s.preventDefault()),this.listen(r,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(r);let i=this.config;return this.cal=new f({value:i.value,min:i.min,max:i.max,firstDay:i.firstDay}),this.dd=new u({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",s=>{this.dd.close(),this.setValue(s),t.focus()}),this.dd.on("open",()=>{t.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{t.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let s=document.activeElement;!this.el.contains(s)&&!this.dd.el.contains(s)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),t=this.value;if(e||!t)return e;let{min:r,max:i}=this.config;return r&&t<r?n("dateMin",{n:o(r)}):i&&t>i?n("dateMax",{n:o(i)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};l("datefield",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-3TAW4AKH.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/datefield/datefield.ts"],
|
|
4
|
+
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { parseDate, formatDate } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Calendar } from '../../dates/calendar/calendar';\n\nexport interface DateFieldConfig extends TextFieldConfig<string | null> {\n min?: string;\n max?: string;\n firstDay?: number;\n}\n\n/** Value is an ISO date string (`YYYY-MM-DD`) or null; the text shown and accepted follows the locale. */\nexport class DateField extends TextField<string | null, DateFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-picker op-datefield';\n private cal!: Calendar;\n private dd!: Dropdown;\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: string | null) {\n return !v;\n }\n\n protected override parse(text: string): string | null {\n const iso = parseDate(text);\n this.garbage = !!text.trim() && !iso;\n return iso;\n }\n protected override display(v: string | null) {\n return v ? formatDate(v, { day: '2-digit', month: '2-digit', year: 'numeric' }) : '';\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.setAttribute('role', 'combobox'); // APG date picker combobox\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n const trigger = h('button', 'op-picker__trigger', { type: 'button', tabindex: -1, 'aria-label': t('calOpen') }, iconEl('calendar'));\n this.listen(trigger, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(trigger, 'click', () => {\n if (!this.config.disabled && !this.config.readonly) this.toggle();\n });\n wrap.append(trigger);\n const c = this.config;\n this.cal = new Calendar({ value: c.value, min: c.min, max: c.max, firstDay: c.firstDay });\n this.dd = new Dropdown({ anchor: wrap, content: this.cal, role: 'presentation' });\n this.cal.on('select', (iso: string) => {\n this.dd.close();\n this.setValue(iso);\n input.focus();\n });\n this.dd.on('open', () => {\n input.setAttribute('aria-expanded', 'true');\n this.el.classList.add('is-open');\n this.cal.setValue(this.value);\n this.cal.focusDay();\n this.emit('expand');\n });\n this.dd.on('close', () => {\n input.setAttribute('aria-expanded', 'false');\n this.el.classList.remove('is-open');\n this.emit('collapse');\n });\n this.own(() => this.dd.destroy());\n this.on('blur', () =>\n this.later(() => {\n const a = document.activeElement;\n if (!this.el.contains(a) && !this.dd.el.contains(a)) this.dd.close();\n }, 0),\n );\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowDown' && !this.dd.isOpen()) {\n e.preventDefault();\n this.open();\n } else super.onKey(e);\n }\n\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('date'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: string | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-picker__trigger') as HTMLButtonElement).disabled = disabled;\n }\n\n protected override check(): string {\n if (this.garbage) return t('date');\n const base = super.check();\n const v = this.value;\n if (base || !v) return base;\n const { min, max } = this.config;\n if (min && v < min) return t('dateMin', { n: formatDate(min) });\n if (max && v > max) return t('dateMax', { n: formatDate(max) });\n return '';\n }\n\n open() {\n if (this.config.disabled || this.config.readonly || !this.rendered) return;\n this.dd.open();\n }\n close() {\n this.dd?.close();\n }\n toggle() {\n if (this.dd.isOpen()) this.close();\n else this.open();\n }\n expand() {\n this.open();\n }\n collapse() {\n this.close();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n this.cal?.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.cal?.setMax(max);\n }\n}\nregister('datefield', DateField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DateField", "TextField", "v", "text", "iso", "parseDate", "formatDate", "wrap", "input", "trigger", "h", "t", "iconEl", "e", "c", "Calendar", "Dropdown", "a", "disabled", "base", "min", "max", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as c}from"./chunk-HXDTGP2K.js";import{a as R}from"./chunk-VU3GIDZ3.js";import{a as u}from"./chunk-6VBK2I5B.js";import{a as k}from"./chunk-NXSTUFS7.js";import{a as C}from"./chunk-G2KUK6AT.js";import{a as S}from"./chunk-Z2Z52GFT.js";import{a}from"./chunk-XHOBNSBO.js";import{a as l}from"./chunk-I4SP6JTU.js";import{a as d}from"./chunk-OGRFQTXA.js";import{a as x}from"./chunk-JI265XFO.js";import{a as y}from"./chunk-EDUMAMK4.js";import{a as L}from"./chunk-JK74QK3M.js";import{a as w}from"./chunk-UB5RYS7T.js";import{a as b}from"./chunk-TZOQWCVH.js";import{a as h}from"./chunk-LQRFNQ2N.js";import{a as T}from"./chunk-GNU4VOOE.js";import{a as f}from"./chunk-7KMIFXHZ.js";import{a as m}from"./chunk-3TAW4AKH.js";import{a as p}from"./chunk-W3H7GTJY.js";import{c as s}from"./chunk-ZWNQREWS.js";import{a as g}from"./chunk-2ZUZ5HDL.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),v={text:(t,e,o)=>n(p,t,e,o),email:(t,e,o)=>n(p,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(p,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(a,t,e,o),number:(t,e,o)=>n(f,t,e,o),date:(t,e,o)=>n(m,t,e,o),dateRange:(t,e,o)=>n(y,t,e,o),secret:(t,e,o)=>n(k,t,e,o),slider:(t,e,o)=>n(S,t,e,o),dial:(t,e,o)=>n(L,t,e,o),check:(t,e,o)=>n(l,t,void 0,{boxLabel:e,...o}),toggle:(t,e,o)=>n(c,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(u,t,e,{options:o,...r}),checkGroup:(t,e,o,r)=>n(d,t,e,{options:o,...r}),select:(t,e,o,r)=>n(C,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(x,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(b,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(w,t,e,{lookup:o,...r}),button:(t,e,o)=>new g({text:t,handler:e,...o}),primary:(t,e,o)=>new g({text:t,handler:e,variant:"primary",...o}),danger:(t,e,o)=>new g({text:t,handler:e,variant:"danger",...o}),row:(...t)=>new s({layout:"hbox",items:t}),col:(...t)=>new s({layout:"vbox",items:t}),grid:(t,...e)=>new s({layout:{type:"grid",columns:t},items:e}),panel:(t,e,o)=>new h({title:t,items:e,...o}),toolbar:(...t)=>new T({items:t}),form:(t,e)=>new R({items:t,...e})};var i=t=>t,Y=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),Z=i({Top:"top",Left:"left"}),_=i({Vertical:"vertical",Horizontal:"horizontal"}),$=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),tt=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),et=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),ot=i({None:"none",Single:"single",Multi:"multi"}),nt=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),rt=i({Eq:"eq",Ne:"ne",Contains:"contains",NotContains:"notContains",StartsWith:"startsWith",EndsWith:"endsWith",Gt:"gt",Ge:"ge",Lt:"lt",Le:"le",Between:"between",NotBetween:"notBetween",In:"in",Nin:"nin",Empty:"empty",NotEmpty:"notEmpty"}),it=i({Light:"light",Dark:"dark"});export{v as a,Y as b,Z as c,_ as d,$ as e,tt as f,et as g,ot as h,nt as i,rt as j,it as k};
|
|
2
|
+
//# sourceMappingURL=chunk-4EQEHJB3.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ui/ui.ts", "../src/ui/enums.ts"],
|
|
4
|
+
"sourcesContent": ["// Short constructors for the things you write most. They return real component instances (the classes), so they can be\n// used anywhere a config goes: `items: [ui.text('name', 'Name', { required: true }), ui.select('plan', 'Plan', ['Free', 'Pro'])]`.\n// The last argument is always a config object that overrides or adds anything (`{ required: true, help: '\u2026' }`).\nimport { TextField, type TextFieldConfig } from '../components/fields/textfield/textfield';\nimport { TextArea } from '../components/fields/textarea/textarea';\nimport { NumberField } from '../components/fields/numberfield/numberfield';\nimport { DateField } from '../components/fields/datefield/datefield';\nimport { DateRangeField } from '../components/fields/daterangefield/daterangefield';\nimport { Checkbox } from '../components/fields/checkbox/checkbox';\nimport { Toggle } from '../components/fields/toggle/toggle';\nimport { CheckboxGroup } from '../components/fields/checkboxgroup/checkboxgroup';\nimport { RadioGroup, type RadioOption } from '../components/fields/radiogroup/radiogroup';\nimport { Select } from '../components/fields/select/select';\nimport { ComboBox } from '../components/fields/combobox/combobox';\nimport { SuggestField } from '../components/fields/suggestfield/suggestfield';\nimport { LookupField } from '../components/fields/lookupfield/lookupfield';\nimport { SecretField } from '../components/fields/secretfield/secretfield';\nimport { Slider } from '../components/fields/slider/slider';\nimport { Dial } from '../components/fields/dial/dial';\nimport { Button } from '../components/base/button/button';\nimport { Panel } from '../components/layout/panel/panel';\nimport { Toolbar } from '../components/layout/toolbar/toolbar';\nimport { Container } from '../core/container';\nimport { Form } from '../components/form/form/form';\nimport type { Component } from '../core/component';\nimport type { AnyConfig } from '../core/registry';\nimport type { Variant } from './enums';\n\ntype Cfg = Record<string, any>;\n// anything a container takes: an instance, a declarative config ({ type: 'fieldset', ... }) or a toolbar string ('->', '-')\ntype Item = Component | AnyConfig | string;\ntype Options = (string | number | { value: unknown; label: string; disabled?: boolean })[];\n\nconst field = <T>(Cls: new (c: any) => T, name: string, label: string | undefined, c: Cfg = {}): T => new Cls({ name, label, ...c });\n\nexport const ui = {\n // ---- fields: (name, label, config?) ----\n text: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, c),\n email: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'email', ...c } satisfies TextFieldConfig),\n password: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'password', ...c }),\n area: (name: string, label?: string, c?: Cfg) => field(TextArea, name, label, c),\n number: (name: string, label?: string, c?: Cfg) => field(NumberField, name, label, c),\n date: (name: string, label?: string, c?: Cfg) => field(DateField, name, label, c),\n dateRange: (name: string, label?: string, c?: Cfg) => field(DateRangeField, name, label, c),\n secret: (name: string, label?: string, c?: Cfg) => field(SecretField, name, label, c),\n slider: (name: string, label?: string, c?: Cfg) => field(Slider, name, label, c),\n dial: (name: string, label?: string, c?: Cfg) => field(Dial, name, label, c),\n /** `boxLabel` is the text beside the box. */\n check: (name: string, boxLabel?: string, c?: Cfg) => field(Checkbox, name, undefined, { boxLabel, ...c }),\n /** An on/off switch; `boxLabel` is the text beside it. */\n toggle: (name: string, boxLabel?: string, c?: Cfg) => field(Toggle, name, undefined, { boxLabel, ...c }),\n radio: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(RadioGroup, name, label, { options, ...c }),\n /** Several choices; the value is the list of checked values. */\n checkGroup: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(CheckboxGroup, name, label, { options, ...c }),\n select: (name: string, label: string, options: Options, c?: Cfg) => field(Select, name, label, { options, ...c }),\n combo: (name: string, label: string, options: Options, c?: Cfg) => field(ComboBox, name, label, { options, ...c }),\n suggest: (name: string, label: string, query: (text: string, o: { signal: AbortSignal }) => unknown, c?: Cfg) => field(SuggestField, name, label, { query, ...c }),\n /** `lookup` is a LookupDef or the name given to `registerLookup`. */\n lookup: (name: string, label: string, lookup: Cfg | string, c?: Cfg) => field(LookupField, name, label, { lookup, ...c }),\n\n // ---- actions ----\n button: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, ...c }),\n primary: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'primary' satisfies Variant, ...c }),\n danger: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'danger' satisfies Variant, ...c }),\n\n // ---- structure ----\n row: (...items: Item[]) => new Container({ layout: 'hbox', items } as Cfg),\n col: (...items: Item[]) => new Container({ layout: 'vbox', items } as Cfg),\n /** `columns`: a number (equal columns, one column on narrow containers) or a CSS `grid-template-columns`. */\n grid: (columns: number | string, ...items: Item[]) => new Container({ layout: { type: 'grid', columns }, items } as Cfg),\n panel: (title: string, items: Item[], c?: Cfg) => new Panel({ title, items, ...c } as Cfg),\n toolbar: (...items: Item[]) => new Toolbar({ items } as Cfg),\n form: (items: Item[], c?: Cfg) => new Form({ items, ...c } as Cfg),\n};\n", "// Named values for the options that are plain strings in configs. Each is a const object plus a type of the same name,\n// so `Variant.Primary` and `'primary'` are interchangeable: use whichever you like, the editor completes both.\nconst e = <T extends Record<string, string>>(o: T) => o;\n\nexport const Variant = e({ Default: 'default', Primary: 'primary', Danger: 'danger', Ghost: 'ghost' } as const);\nexport type Variant = (typeof Variant)[keyof typeof Variant];\n\nexport const LabelPos = e({ Top: 'top', Left: 'left' } as const);\nexport type LabelPos = (typeof LabelPos)[keyof typeof LabelPos];\n\nexport const Direction = e({ Vertical: 'vertical', Horizontal: 'horizontal' } as const);\nexport type Direction = (typeof Direction)[keyof typeof Direction];\n\n/** Layout `border` regions. */\nexport const Region = e({ North: 'north', South: 'south', West: 'west', East: 'east', Center: 'center' } as const);\nexport type Region = (typeof Region)[keyof typeof Region];\n\n/** Widget sides. */\nexport const Side = e({ Right: 'right', Left: 'left', Top: 'top', Bottom: 'bottom' } as const);\nexport type Side = (typeof Side)[keyof typeof Side];\n\nexport const LayoutKind = e({ Fit: 'fit', HBox: 'hbox', VBox: 'vbox', Border: 'border', Grid: 'grid', Card: 'card' } as const);\nexport type LayoutKind = (typeof LayoutKind)[keyof typeof LayoutKind];\n\nexport const Selection = e({ None: 'none', Single: 'single', Multi: 'multi' } as const);\nexport type Selection = (typeof Selection)[keyof typeof Selection];\n\nexport const ToastType = e({ Info: 'info', Success: 'success', Warning: 'warning', Error: 'error' } as const);\nexport type ToastType = (typeof ToastType)[keyof typeof ToastType];\n\n/** Filter operators (Store.filter, FilterBuilder, lookup filters). */\nexport const Op = e({\n Eq: 'eq', Ne: 'ne', Contains: 'contains', NotContains: 'notContains', StartsWith: 'startsWith', EndsWith: 'endsWith',\n Gt: 'gt', Ge: 'ge', Lt: 'lt', Le: 'le', Between: 'between', NotBetween: 'notBetween', In: 'in', Nin: 'nin', Empty: 'empty', NotEmpty: 'notEmpty',\n} as const);\nexport type Op = (typeof Op)[keyof typeof Op];\n\n/** The shipped themes (`setTheme(ThemeName.Dark)`; add `' compact'` for the dense variant). */\nexport const ThemeName = e({ Light: 'light', Dark: 'dark' } as const);\nexport type ThemeName = (typeof ThemeName)[keyof typeof ThemeName];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["field", "Cls", "name", "label", "c", "ui", "TextField", "TextArea", "NumberField", "DateField", "DateRangeField", "SecretField", "Slider", "Dial", "boxLabel", "Checkbox", "Toggle", "options", "RadioGroup", "CheckboxGroup", "Select", "ComboBox", "query", "SuggestField", "lookup", "LookupField", "text", "handler", "Button", "items", "Container", "columns", "title", "Panel", "Toolbar", "Form", "e", "o", "Variant", "LabelPos", "Direction", "Region", "Side", "LayoutKind", "Selection", "ToastType", "Op", "ThemeName"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as l}from"./chunk-A2NKDOYN.js";import{b as M}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";var e=r=>`<path d="${r}"/>`,n={"chevron-down":e("m6 9 6 6 6-6"),"chevron-up":e("m18 15-6-6-6 6"),"chevron-left":e("m15 18-6-6 6-6"),"chevron-right":e("m9 18 6-6-6-6"),"chevrons-left":e("m11 17-5-5 5-5M18 17l-5-5 5-5"),"chevrons-right":e("m6 17 5-5-5-5M13 17l5-5-5-5"),x:e("M18 6 6 18M6 6l12 12"),check:e("M20 6 9 17l-5-5"),plus:e("M5 12h14M12 5v14"),minus:e("M5 12h14"),search:'<circle cx="11" cy="11" r="8"/>'+e("m21 21-4.3-4.3"),calendar:'<rect x="3" y="4" width="18" height="18" rx="2"/>'+e("M16 2v4M8 2v4M3 10h18"),info:'<circle cx="12" cy="12" r="10"/>'+e("M12 16v-4M12 8h.01"),alert:e("m21.7 18-8-14a2 2 0 0 0-3.5 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3ZM12 9v4M12 17h.01"),error:'<circle cx="12" cy="12" r="10"/>'+e("m15 9-6 6M9 9l6 6"),success:'<circle cx="12" cy="12" r="10"/>'+e("m9 12 2 2 4-4"),menu:e("M4 6h16M4 12h16M4 18h16"),"arrow-up":e("m5 12 7-7 7 7M12 19V5"),"arrow-down":e("M12 5v14M19 12l-7 7-7-7"),columns:'<rect x="3" y="3" width="18" height="18" rx="2"/>'+e("M9 3v18M15 3v18"),filter:e("M22 3H2l8 9.5V19l4 2v-8.5z"),send:e("m22 2-7 20-4-9-9-4zM22 2 11 13"),sparkles:e("M12 3l1.9 5.6L19.5 10.5l-5.6 1.9L12 18l-1.9-5.6L4.5 10.5l5.6-1.9zM19 3v4M21 5h-4M5 17v4M7 19H3"),file:e("M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 13h8M8 17h8"),box:e("M21 8 12 3 3 8v8l9 5 9-5zM3 8l9 5 9-5M12 13v8"),truck:e("M1 3h15v13H1zM16 8h4l3 3v5h-7")+'<circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/>',clock:'<circle cx="12" cy="12" r="10"/>'+e("M12 6v6l4 2"),shield:e("M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"),list:e("M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"),eye:e("M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12z")+'<circle cx="12" cy="12" r="3"/>',"eye-off":e("M17.9 17.9A10.1 10.1 0 0 1 12 19c-6.4 0-10-7-10-7a18.5 18.5 0 0 1 5.1-5.9M9.9 5.2A9.7 9.7 0 0 1 12 5c6.4 0 10 7 10 7a18.5 18.5 0 0 1-2.2 3.2M14.1 14.1a3 3 0 1 1-4.2-4.2M2 2l20 20"),heart:e("M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z"),image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/>'+e("m21 15-5-5L5 21"),cloud:e("M18 10h-1.3A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"),folder:e("M4 4h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"),share:e("M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M16 6l-4-4-4 4M12 2v14"),message:e("M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"),more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',user:e("M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2")+'<circle cx="12" cy="7" r="4"/>',home:e("m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM9 22V12h6v10"),trash:e("M3 6h18M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2"),edit:e("M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"),sun:'<circle cx="12" cy="12" r="4"/>'+e("M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"),moon:e("M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"),bell:e("M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.9 1.9 0 0 0 3.4 0"),chart:e("M3 3v18h18M19 9l-5 5-4-4-3 3"),settings:'<circle cx="12" cy="12" r="3"/>'+e("M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9 7 7M17 17l2.1 2.1M4.9 19.1 7 17M17 7l2.1-2.1"),users:e("M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M23 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8")+'<circle cx="9" cy="7" r="4"/>'};function m(r){Object.assign(n,r)}var d=r=>r in n;function x(r,c){let t=M("span","op-icon");return i(t,r,c),t}function i(r,c,t){c&&!(c in n)&&console.warn(`Optikos: unknown icon "${c}" (register it with registerIcons)`);let o=n[c]??"";r.innerHTML=o.startsWith("<svg")?o:`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${o}</svg>`,t?(r.setAttribute("role","img"),r.setAttribute("aria-label",t),r.removeAttribute("aria-hidden")):(r.setAttribute("aria-hidden","true"),r.removeAttribute("role"),r.removeAttribute("aria-label"))}var s=class extends l{baseCls="op-icon";tag="span";onRender(){i(this.el,this.config.name??"",this.config.label)}setName(c){this.config.name=c,this.rendered&&i(this.el,c,this.config.label)}setLabel(c){this.config.label=c,this.rendered&&i(this.el,this.config.name??"",c)}};h("icon",s);export{m as a,d as b,x as c,s as d};
|
|
2
|
+
//# sourceMappingURL=chunk-4EZJ5FKJ.js.map
|