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
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as s}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as s}from"./chunk-2ZRNGG2N.js";import{c as r}from"./chunk-4EZJ5FKJ.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as o}from"./chunk-TIPK3SCJ.js";var n=class extends s{baseCls="op-field op-checkbox";textEl;emptyValue(){return!1}isEmpty(e){return!e}createControl(){let e=this.inputEl=i("input","op-checkbox__input",{type:"checkbox"});this.textEl=i("span","op-checkbox__text");let t=i("span","op-checkbox__box",{},r("check"),i("span","op-checkbox__dash")),c=i("label","op-checkbox__label",{},e,t,this.textEl);return this.listen(e,"change",()=>{if(this.config.readonly)return void(e.checked=this.value);this.config.indeterminate=!1,this.paint(),this.commit(e.checked)}),c}onRender(){super.onRender(),this.setBoxLabel(this.config.boxLabel??""),this.setIndeterminate(!!this.config.indeterminate)}applyValue(e){this.inputEl.checked=!!e,this.paint()}paint(){let e=this.inputEl,t=!!this.config.indeterminate;e.indeterminate=t,e.setAttribute("aria-checked",t?"mixed":String(e.checked)),this.el.classList.toggle("is-checked",e.checked&&!t),this.el.classList.toggle("is-indeterminate",t)}onDisabled(e){this.inputEl.disabled=e}setBoxLabel(e){this.config.boxLabel=e,this.rendered&&(this.textEl.textContent=e,this.textEl.hidden=!e)}setIndeterminate(e){this.config.indeterminate=e,this.rendered&&this.paint()}toggle(){this.setIndeterminate(!1),this.setValue(!this.value)}};o("checkbox",n);export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-I4SP6JTU.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as l}from"./chunk-676AKAGF.js";import{g as f,h as u}from"./chunk-4AA4FQEM.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{a as d}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-MW3RWBZ7.js";var n={duration:4e3,position:"top-right",max:5},g={info:"info",success:"success",warning:"alert",error:"error"};function v(e){let t=l().querySelector(`.op-toast-region[data-pos="${e}"]`);return t||(t=i("div","op-toast-region",{"data-pos":e}),l().appendChild(t)),t}var r=class extends d{baseCls="op-toast";cancelTimer;remaining=0;started=0;build(){let t=this.config,s=t.type??"info",o=i("div",`op-toast op-toast--${s}`,{role:s==="error"?"alert":"status"}),a=i("div","op-toast__body",{},t.title?i("div","op-toast__title",{},t.title):null,i("div","op-toast__text",{},t.text??""));if(o.append(i("span","op-toast__icon",{},p(g[s])),a),t.closable!==!1){let c=i("button","op-toast__close",{type:"button","aria-label":h("close")},p("x"));this.listen(c,"click",()=>this.close()),o.append(c)}return this.listen(o,"pointerenter",()=>this.pause()),this.listen(o,"pointerleave",()=>this.resume()),this.listen(o,"focusin",()=>this.pause()),this.listen(o,"focusout",()=>this.resume()),o}show(){let t=this.config.position??n.position,s=v(t);t.startsWith("bottom")?s.append(this.el):s.prepend(this.el);for(let o of Array.from(s.children).filter(a=>a!==this.el).slice(n.max-1))o.dispatchEvent(new Event("op-dismiss"));this.listen(this.el,"op-dismiss",()=>this.close()),this.remaining=this.config.duration??n.duration,this.resume(),u(this.el,{dy:10}),this.config.type==="success"&&f(this.el.querySelector(".op-toast__icon")??this.el),this.emit("show")}pause(){this.cancelTimer&&(this.cancelTimer(),this.cancelTimer=void 0,this.remaining-=Date.now()-this.started)}resume(){this.cancelTimer||this.remaining<=0||this.destroyed||(this.started=Date.now(),this.cancelTimer=this.later(()=>this.close(),this.remaining))}close(){this.destroyed||(this.emit("close"),this.destroy())}};m("toast",r);function y(e){let t=new r(typeof e=="string"?{text:e}:e);return t.show(),{close:()=>t.close()}}y.configure=e=>Object.assign(n,e);export{r as a,y as b};
|
|
2
|
+
//# sourceMappingURL=chunk-IHE2MQ3W.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/overlays/toast/toast.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { layer } from '../../../core/layer';\nimport { iconEl } from '../../base/icon/icon';\nimport { pulse, enter } from '../../../motion/core';\n\nexport type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top' | 'bottom';\n\nexport interface ToastConfig extends ComponentConfig {\n text?: string;\n title?: string;\n type?: 'info' | 'success' | 'warning' | 'error';\n /** ms before it closes by itself; 0 keeps it until closed. Default 4000. */\n duration?: number;\n closable?: boolean;\n position?: ToastPosition;\n}\n\nconst defaults: { duration: number; position: ToastPosition; max: number } = { duration: 4000, position: 'top-right', max: 5 };\nconst icons = { info: 'info', success: 'success', warning: 'alert', error: 'error' };\n\nfunction region(pos: ToastPosition): HTMLElement {\n let r = layer().querySelector<HTMLElement>(`.op-toast-region[data-pos=\"${pos}\"]`);\n if (!r) {\n r = h('div', 'op-toast-region', { 'data-pos': pos });\n layer().appendChild(r);\n }\n return r;\n}\n\nexport class Toast extends Component<ToastConfig> {\n protected override baseCls = 'op-toast';\n private cancelTimer?: () => void;\n private remaining = 0;\n private started = 0;\n\n protected override build() {\n const c = this.config;\n const type = c.type ?? 'info';\n const el = h('div', `op-toast op-toast--${type}`, { role: type === 'error' ? 'alert' : 'status' });\n const body = h('div', 'op-toast__body', {}, c.title ? h('div', 'op-toast__title', {}, c.title) : null, h('div', 'op-toast__text', {}, c.text ?? ''));\n el.append(h('span', 'op-toast__icon', {}, iconEl(icons[type])), body);\n if (c.closable !== false) {\n const x = h('button', 'op-toast__close', { type: 'button', 'aria-label': t('close') }, iconEl('x'));\n this.listen(x, 'click', () => this.close());\n el.append(x);\n }\n this.listen(el, 'pointerenter', () => this.pause());\n this.listen(el, 'pointerleave', () => this.resume());\n this.listen(el, 'focusin', () => this.pause());\n this.listen(el, 'focusout', () => this.resume());\n return el;\n }\n\n /** Puts the toast on screen and starts the timer. */\n override show() {\n const pos = this.config.position ?? defaults.position;\n const r = region(pos);\n if (pos.startsWith('bottom')) r.append(this.el);\n else r.prepend(this.el);\n for (const old of Array.from(r.children).filter((e) => e !== this.el).slice(defaults.max - 1)) (old as HTMLElement).dispatchEvent(new Event('op-dismiss'));\n this.listen(this.el, 'op-dismiss', () => this.close());\n this.remaining = this.config.duration ?? defaults.duration;\n this.resume();\n void enter(this.el, { dy: 10 });\n if (this.config.type === 'success') void pulse(this.el.querySelector<HTMLElement>('.op-toast__icon') ?? this.el); // a small ring confirms it worked\n this.emit('show');\n }\n\n private pause() {\n if (!this.cancelTimer) return;\n this.cancelTimer();\n this.cancelTimer = undefined;\n this.remaining -= Date.now() - this.started;\n }\n private resume() {\n if (this.cancelTimer || this.remaining <= 0 || this.destroyed) return;\n this.started = Date.now();\n this.cancelTimer = this.later(() => this.close(), this.remaining);\n }\n\n close() {\n if (this.destroyed) return;\n this.emit('close');\n this.destroy();\n }\n}\nregister('toast', Toast);\n\nexport interface ToastHandle {\n close(): void;\n}\n\n/** `toast('Saved')` or `toast({ text, title, type, duration, closable, position })`. */\nexport function toast(opts: string | ToastConfig): ToastHandle {\n const t = new Toast(typeof opts === 'string' ? { text: opts } : opts);\n t.show();\n return { close: () => t.close() };\n}\ntoast.configure = (o: Partial<typeof defaults>) => Object.assign(defaults, o);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["defaults", "icons", "region", "pos", "r", "layer", "h", "Toast", "Component", "c", "type", "el", "body", "iconEl", "x", "t", "old", "e", "enter", "pulse", "register", "toast", "opts", "o"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as h}from"./chunk-LW2WRUVL.js";import{c as d}from"./chunk-OEAXCCVM.js";import{a as l}from"./chunk-A2NKDOYN.js";import{b as e}from"./chunk-PZSHOSOS.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{f as p}from"./chunk-MW3RWBZ7.js";var r=class extends l{baseCls="op-table";tag="table";store;unsub;onRender(){let t=this.config;this.el.classList.toggle("op-table--striped",!!t.striped),this.bind(t.store??new d({data:t.data??[]})),this.own(()=>this.unsub?.())}bind(t){this.unsub?.(),this.store=t,this.unsub=t.subscribe(()=>this.paint()),this.paint()}cols(){return(this.config.columns??Object.keys(this.store.getAt(0)?.data??{}).map(o=>({field:o}))).filter(o=>!o.hidden)}paint(){let t=this.config,n=this.cols(),o=e("tr","",{},...n.map(i=>e("th",i.align?`op-table__cell--${i.align}`:"",{scope:"col"},i.header??i.field))),a=this.store.getRange().map(i=>e("tr","",{},...n.map(s=>e("td",`${s.align?`op-table__cell--${s.align}`:""} ${s.cls??""}`.trim(),{},h(s,i))))),m=a.length?a:[e("tr","op-table__empty",{},e("td","",{colspan:n.length||1},t.emptyText??p("empty")))];this.el.replaceChildren(...t.caption?[e("caption","",{},t.caption)]:[],e("thead","",{},o),e("tbody","",{},...m))}setData(t){this.config.data=t,this.rendered&&this.store.loadData(t)}setStore(t){this.config.store=t,this.rendered&&this.bind(t)}setColumns(t){this.config.columns=t,this.rendered&&this.paint()}setCaption(t){this.config.caption=t,this.rendered&&this.paint()}};c("table",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-JBLRAM7Z.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/data/table/table.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { Store } from '../../../data/store';\nimport { t } from '../../../core/i18n';\nimport { cellContent, type Column } from '../../../data/column';\n\nexport interface TableConfig extends ComponentConfig {\n data?: Record<string, any>[];\n store?: Store<any>;\n columns?: Column[];\n caption?: string;\n striped?: boolean;\n emptyText?: string;\n}\n\n/** Plain semantic `<table>` for small datasets. No selection, sorting or virtualization: use Grid for those. */\nexport class Table extends Component<TableConfig> {\n protected override baseCls = 'op-table';\n protected override tag = 'table' as const;\n private store!: Store<any>;\n private unsub?: () => void;\n\n protected override onRender() {\n const c = this.config;\n this.el.classList.toggle('op-table--striped', !!c.striped);\n this.bind(c.store ?? new Store({ data: c.data ?? [] }));\n this.own(() => this.unsub?.());\n }\n\n private bind(store: Store<any>) {\n this.unsub?.();\n this.store = store;\n this.unsub = store.subscribe(() => this.paint());\n this.paint();\n }\n\n private cols(): Column[] {\n const c = this.config;\n const all: Column[] = c.columns ?? Object.keys(this.store.getAt(0)?.data ?? {}).map((field) => ({ field }));\n return all.filter((x) => !x.hidden);\n }\n\n private paint() {\n const c = this.config;\n const cols = this.cols();\n const head = h('tr', '', {}, ...cols.map((col) => h('th', col.align ? `op-table__cell--${col.align}` : '', { scope: 'col' }, col.header ?? col.field)));\n const rows = this.store.getRange().map((rec) =>\n h('tr', '', {}, ...cols.map((col) => h('td', `${col.align ? `op-table__cell--${col.align}` : ''} ${col.cls ?? ''}`.trim(), {}, cellContent(col, rec)))),\n );\n const body = rows.length ? rows : [h('tr', 'op-table__empty', {}, h('td', '', { colspan: cols.length || 1 }, c.emptyText ?? t('empty')))];\n this.el.replaceChildren(...(c.caption ? [h('caption', '', {}, c.caption)] : []), h('thead', '', {}, head), h('tbody', '', {}, ...body));\n }\n\n setData(data: Record<string, any>[]) {\n this.config.data = data;\n if (this.rendered) this.store.loadData(data);\n }\n setStore(store: Store<any>) {\n this.config.store = store;\n if (this.rendered) this.bind(store);\n }\n setColumns(columns: Column[]) {\n this.config.columns = columns;\n if (this.rendered) this.paint();\n }\n setCaption(caption: string) {\n this.config.caption = caption;\n if (this.rendered) this.paint();\n }\n}\nregister('table', Table);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "gPAiBO,IAAMA,EAAN,cAAoBC,CAAuB,CAC7B,QAAU,WACV,IAAM,QACjB,MACA,MAEW,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACf,KAAK,GAAG,UAAU,OAAO,oBAAqB,CAAC,CAACA,EAAE,OAAO,EACzD,KAAK,KAAKA,EAAE,OAAS,IAAIC,EAAM,CAAE,KAAMD,EAAE,MAAQ,CAAC,CAAE,CAAC,CAAC,EACtD,KAAK,IAAI,IAAM,KAAK,QAAQ,CAAC,CAC/B,CAEQ,KAAKE,EAAmB,CAC9B,KAAK,QAAQ,EACb,KAAK,MAAQA,EACb,KAAK,MAAQA,EAAM,UAAU,IAAM,KAAK,MAAM,CAAC,EAC/C,KAAK,MAAM,CACb,CAEQ,MAAiB,CAGvB,OAFU,KAAK,OACS,SAAW,OAAO,KAAK,KAAK,MAAM,MAAM,CAAC,GAAG,MAAQ,CAAC,CAAC,EAAE,IAAKC,IAAW,CAAE,MAAAA,CAAM,EAAE,GAC/F,OAAQC,GAAM,CAACA,EAAE,MAAM,CACpC,CAEQ,OAAQ,CACd,IAAMJ,EAAI,KAAK,OACTK,EAAO,KAAK,KAAK,EACjBC,EAAOC,EAAE,KAAM,GAAI,CAAC,EAAG,GAAGF,EAAK,IAAKG,GAAQD,EAAE,KAAMC,EAAI,MAAQ,mBAAmBA,EAAI,KAAK,GAAK,GAAI,CAAE,MAAO,KAAM,EAAGA,EAAI,QAAUA,EAAI,KAAK,CAAC,CAAC,EAChJC,EAAO,KAAK,MAAM,SAAS,EAAE,IAAKC,GACtCH,EAAE,KAAM,GAAI,CAAC,EAAG,GAAGF,EAAK,IAAKG,GAAQD,EAAE,KAAM,GAAGC,EAAI,MAAQ,mBAAmBA,EAAI,KAAK,GAAK,EAAE,IAAIA,EAAI,KAAO,EAAE,GAAG,KAAK,EAAG,CAAC,EAAGG,EAAYH,EAAKE,CAAG,CAAC,CAAC,CAAC,CACxJ,EACME,EAAOH,EAAK,OAASA,EAAO,CAACF,EAAE,KAAM,kBAAmB,CAAC,EAAGA,EAAE,KAAM,GAAI,CAAE,QAASF,EAAK,QAAU,CAAE,EAAGL,EAAE,WAAaa,EAAE,OAAO,CAAC,CAAC,CAAC,EACxI,KAAK,GAAG,gBAAgB,GAAIb,EAAE,QAAU,CAACO,EAAE,UAAW,GAAI,CAAC,EAAGP,EAAE,OAAO,CAAC,EAAI,CAAC,EAAIO,EAAE,QAAS,GAAI,CAAC,EAAGD,CAAI,EAAGC,EAAE,QAAS,GAAI,CAAC,EAAG,GAAGK,CAAI,CAAC,CACxI,CAEA,QAAQE,EAA6B,CACnC,KAAK,OAAO,KAAOA,EACf,KAAK,UAAU,KAAK,MAAM,SAASA,CAAI,CAC7C,CACA,SAASZ,EAAmB,CAC1B,KAAK,OAAO,MAAQA,EAChB,KAAK,UAAU,KAAK,KAAKA,CAAK,CACpC,CACA,WAAWa,EAAmB,CAC5B,KAAK,OAAO,QAAUA,EAClB,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,WAAWC,EAAiB,CAC1B,KAAK,OAAO,QAAUA,EAClB,KAAK,UAAU,KAAK,MAAM,CAChC,CACF,EACAC,EAAS,QAASnB,CAAK",
|
|
6
6
|
"names": ["Table", "Component", "c", "Store", "store", "field", "x", "cols", "head", "h", "col", "rows", "rec", "cellContent", "body", "t", "data", "columns", "caption", "register"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as n}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as n}from"./chunk-EV73ADN2.js";import{a as o}from"./chunk-TIPK3SCJ.js";var s=class extends n{baseCls="op-field op-textfield op-picker op-combobox";term="";emptyValue(){return null}isEmpty(t){return t==null||t===""}visibleItems(){let t=this.typed?this.term.trim().toLowerCase():"";if(!t)return this.items;let i=this.config.filter??"contains",p=typeof i=="function"?i:i==="startsWith"?(e,r)=>e.label.toLowerCase().startsWith(r):(e,r)=>e.label.toLowerCase().includes(r);return this.items.filter(e=>p(e,t))}onType(t){this.term=t,this.refreshList(),this.list.setHighlight(t),this.open()}pick(t){this.term="",super.pick(t),this.list.setHighlight("")}settle(){super.settle(),this.term="",this.list.setHighlight("")}};o("combobox",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-JI265XFO.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as C}from"./chunk-2ZRNGG2N.js";import{c as S}from"./chunk-6NCXO5ZP.js";import{c as m}from"./chunk-2UPUC4RK.js";import{b as l}from"./chunk-PZSHOSOS.js";import{a as E}from"./chunk-TIPK3SCJ.js";var _=.35,w=y=>(String(y).split(".")[1]??"").length,x=class extends C{baseCls="op-field op-dial";face;tape;needle;readout;cache;pos=0;angle=0;shown="";stopGlide;constructor(t={}){super(t),this.value=this.original=this.normalize(this.value)}get isCircle(){return this.config.shape==="circle"}get items(){return this.cache??=this.buildItems()}fmt(t){return this.config.format?this.config.format(t):String(t)}buildItems(){let t=this.config,e;if(t.options)e=t.options.map(a=>typeof a=="object"?a:{value:a});else{let a=t.min??0,h=t.step||1,p=Math.max(1,Math.floor(((t.max??100)-a)/h+1e-9)+1),c=Math.max(w(h),w(a));e=Array.from({length:p},(D,f)=>({value:Number((a+f*h).toFixed(c))}))}let s=t.snap??(t.options?1:10),i=(a,h)=>s===!1?!1:Array.isArray(s)?s.includes(a):t.options?h%s===0:Math.abs(a/s-Math.round(a/s))<1e-9;return e.map((a,h)=>({value:a.value,label:a.label??this.fmt(a.value),major:i(a.value,h)}))}emptyValue(){let t=this.config.options?.[0];return t===void 0?this.config.min??0:typeof t=="object"?t.value:t}isEmpty(){return!1}indexOf(t){let e=this.items;if(this.config.options)return Math.max(0,e.findIndex(i=>i.value===t));let s=Math.round((t-(this.config.min??0))/(this.config.step||1));return Math.max(0,Math.min(e.length-1,Number.isFinite(s)?s:0))}normalize(t){return this.items[this.indexOf(t)].value}get index(){return this.indexOf(this.value)}createControl(){return this.readout=l("div","op-dial__readout",{"aria-hidden":"true"}),this.tape=l("div","op-dial__tape"),this.needle=l("div","op-dial__needle"),this.face=l("div","op-dial__face",{role:"slider",tabindex:0,"aria-orientation":"horizontal"},l("div","op-dial__window",{},this.tape),this.needle),this.listen(this.face,"pointerdown",t=>this.onDown(t)),this.listen(this.face,"keydown",t=>this.onKey(t)),this.paintTicks(),this.inputEl=this.face,l("div","op-dial__box",{},this.readout,this.face)}onRender(){super.onRender();let t=this.el.querySelector(".op-field__label");t.id=`${this.id}-label`,this.config.ariaLabel||this.face.setAttribute("aria-labelledby",t.id)}paintTicks(){let t=this.items,e=this.config.labels??"snap";this.rendered&&(this.el.classList.toggle("op-dial--circle",this.isCircle),this.el.classList.toggle("op-dial--list",!!this.config.options)),this.tape.replaceChildren(...t.map((s,i)=>{let a=l("span",`op-dial__tick${s.major?" is-major":""}`,{"data-i":i});return a.style.setProperty("--i",String(i)),a.style.setProperty("--a",`${i*360/t.length}deg`),(e==="all"||e==="snap"&&s.major)&&a.append(l("span","op-dial__tick-label",{},s.label)),a}))}build(){let t=super.build();return t.classList.toggle("op-dial--circle",this.isCircle),t.classList.toggle("op-dial--list",!!this.config.options),t}spacing(){let[t,e]=this.tape.children;return e&&t&&e.offsetLeft-t.offsetLeft||12}place(){this.needle.style.transform=this.isCircle?`translateX(-50%) rotate(${this.angle}deg)`:"",this.tape.style.setProperty("--pos",String(this.isCircle?0:this.pos))}aim(t){let e=t*360/this.items.length;this.angle+=((e-this.angle)%360+540)%360-180}applyValue(t){let e=this.indexOf(t);this.pos=e,this.aim(e),this.place(),this.paintState(e)}paintState(t){let e=this.items,s=e[t],i=this.face,a=!!this.config.options;i.setAttribute("aria-valuemin",String(a?0:e[0].value)),i.setAttribute("aria-valuemax",String(a?e.length-1:e[e.length-1].value)),i.setAttribute("aria-valuenow",String(a?t:s.value)),i.setAttribute("aria-valuetext",s.label),this.tape.querySelector(".is-current")?.classList.remove("is-current"),this.tape.children[t]?.classList.add("is-current"),this.paintReadout(s.label)}paintReadout(t){let e=this.shown;if(t===e)return;this.shown=t;let s=i=>i.replace(/\d/g,"0");if(e&&s(e)===s(t)){[...t].forEach((i,a)=>/\d/.test(i)&&this.readout.children[a].firstElementChild.setAttribute("style",`--d:${i}`));return}if(this.readout.replaceChildren(...[...t].map(i=>/\d/.test(i)?l("span","op-dial__digit",{},l("span","op-dial__reel",{style:`--d:${i}`},..."0123456789".split("").map(a=>l("span","",{},a)))):l("span","",{},i))),e&&m.isOn()&&typeof this.readout.animate=="function"){let i=this.items.findIndex(a=>a.label===t)>=this.items.findIndex(a=>a.label===e);this.readout.animate([{translate:`0 ${i?35:-35}%`,opacity:0},{translate:"0 0",opacity:1}],{duration:m.ms("swap"),easing:m.easing("enter")})}}choose(t){let e=this.items;t=Math.max(0,Math.min(e.length-1,t)),this.pos=t,this.aim(t),this.place(),this.paintState(t),this.commit(e[t].value)}get locked(){return!!(this.config.disabled||this.config.readonly)}onKey(t){if(this.locked)return;let e=this.index,s=this.items.length,i={ArrowRight:e+1,ArrowUp:e+1,ArrowLeft:e-1,ArrowDown:e-1,PageUp:this.snapFrom(e,1),PageDown:this.snapFrom(e,-1),Home:0,End:s-1};t.key in i&&(t.preventDefault(),this.choose(i[t.key]),this.flushSettled(),this.emit("slide-end",this.value))}snapFrom(t,e){let s=this.items;for(let i=t+e;i>=0&&i<s.length;i+=e)if(s[i].major)return i;return e>0?s.length-1:0}angleAt(t){let e=this.face.getBoundingClientRect();return(Math.atan2(t.clientX-(e.left+e.width/2),e.top+e.height/2-t.clientY)*180/Math.PI+360)%360}onDown(t){if(this.locked||t.button)return;t.preventDefault(),this.stopGlide?.();let e=this.face;e.focus(),e.setPointerCapture?.(t.pointerId);let s=this.items.length,i=this.spacing(),a=t.clientX,h=this.pos,p=!1,c=[{x:t.clientX,t:t.timeStamp}];this.el.classList.add("is-dragging"),this.emit("slide-start");let D=n=>{if(this.isCircle){let d=this.angleAt(n);return this.angle+=((d-this.angle)%360+540)%360-180,this.place(),Math.round(d/360*s)%s}let r=h-(n.clientX-a)/i,o=r<0?r:r>s-1?r-(s-1):0;return this.pos=o?r-o+Math.sign(o)*S(Math.abs(o)*i,i*2)/i:r,this.place(),Math.round(Math.max(0,Math.min(s-1,r)))},f=n=>{(Math.abs(n.clientX-a)>3||this.isCircle)&&(p=!0),c=[...c.filter(o=>n.timeStamp-o.t<100),{x:n.clientX,t:n.timeStamp}];let r=D(n);r!==this.index&&(this.paintState(r),this.commit(this.items[r].value))},L=()=>{e.removeEventListener("pointermove",f),e.removeEventListener("pointerup",g),e.removeEventListener("pointercancel",g)},g=n=>{if(L(),this.el.classList.remove("is-dragging"),n.type==="pointercancel")return this.rest(this.index);if(this.isCircle)return this.rest(p?this.index:Math.round(this.angleAt(n)/360*s)%s);if(!p){let v=e.getBoundingClientRect();return this.rest(Math.round(this.pos+(n.clientX-(v.left+v.width/2))/i))}let r=c[0],o=(n.clientX-r.x)/Math.max(1,n.timeStamp-r.t);if(Math.abs(o)<_)return this.rest(Math.round(Math.max(0,Math.min(s-1,this.pos))));let d=o<0?1:-1,M=this.pos+d*Math.abs(o)*260/i,u=-1;this.items.forEach((v,b)=>v.major&&(d>0?b>this.pos:b<this.pos)&&(u<0||Math.abs(b-M)<Math.abs(u-M))&&(u=b)),this.rest(u>=0?u:Math.round(Math.max(0,Math.min(s-1,M))),!0)};e.addEventListener("pointermove",f),e.addEventListener("pointerup",g),e.addEventListener("pointercancel",g),this.own(L)}rest(t,e=!1){let s=this.pos;this.choose(t);let i=()=>{this.stopGlide=void 0,this.el.classList.remove("is-gliding"),this.tape.style.transitionDuration="",this.flushSettled(),this.emit("slide-end",this.value)};if(!e||!m.isOn())return i();let a=Math.min(900,280+Math.abs(this.pos-s)*this.spacing()*.9);this.el.classList.add("is-gliding"),this.tape.style.transitionDuration=`${a}ms`,this.stopGlide=this.later(i,a)}next(t=1){this.setValue(this.items[Math.max(0,Math.min(this.items.length-1,this.index+t))].value)}prev(t=1){this.next(-t)}nextSnap(){this.setValue(this.items[this.snapFrom(this.index,1)].value)}prevSnap(){this.setValue(this.items[this.snapFrom(this.index,-1)].value)}getDisplayText(){return this.items[this.index].label}rebuild(t){Object.assign(this.config,t),this.cache=void 0,this.value=this.normalize(this.value),this.rendered&&(this.paintTicks(),this.shown="",this.readout.replaceChildren(),this.applyValue(this.value))}setMin(t){this.rebuild({min:t})}setMax(t){this.rebuild({max:t})}setStep(t){this.rebuild({step:t})}setOptions(t){this.rebuild({options:t})}setSnap(t){this.rebuild({snap:t})}setShape(t){this.rebuild({shape:t})}setFormat(t){this.rebuild({format:t})}onDisabled(t){this.face.tabIndex=t?-1:0,this.face.setAttribute("aria-disabled",String(t))}onReadonly(t){this.face.setAttribute("aria-readonly",String(t))}};E("dial",x);export{x as a};
|
|
2
|
+
//# sourceMappingURL=chunk-JK74QK3M.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/dial/dial.ts"],
|
|
4
|
+
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { motion } from '../../../motion/config';\nimport { rubberBand } from '../../../motion/extras';\n\nexport type DialValue = number | string;\nexport interface DialOption {\n value: DialValue;\n label?: string;\n}\n\nexport interface DialConfig extends FieldConfig<DialValue> {\n min?: number;\n max?: number;\n step?: number;\n /** A list instead of a range: the value is the item's value. */\n options?: (DialValue | DialOption)[];\n /** Snap points: every multiple of N (a range, default 10), every N items (a list, default 1), explicit values, or none. */\n snap?: number | DialValue[] | false;\n shape?: 'linear' | 'circle';\n format?: (v: DialValue) => string;\n /** Which ticks get a label. Default `snap`. */\n labels?: 'snap' | 'all' | 'none';\n}\n\ninterface Item {\n value: DialValue;\n label: string;\n major: boolean;\n}\n\nconst FLICK = 0.35; // px/ms: faster than this on release is a flick, which glides to a snap point\nconst decimals = (n: number) => (String(n).split('.')[1] ?? '').length;\n\n/** A flat ruler (or a clock face) to pick one value from a range or a list, with a rolling readout. */\nexport class Dial extends Field<DialValue, DialConfig> {\n protected override baseCls = 'op-field op-dial';\n private face!: HTMLElement;\n private tape!: HTMLElement;\n private needle!: HTMLElement;\n private readout!: HTMLElement;\n private cache?: Item[];\n /** Where the ruler sits, as an item index (fractional while dragging). */\n private pos = 0;\n /** The hand's angle in circle mode, kept continuous so it always turns the short way. */\n private angle = 0;\n private shown = '';\n private stopGlide?: () => void;\n\n constructor(config: DialConfig = {}) {\n super(config);\n this.value = this.original = this.normalize(this.value);\n }\n\n private get isCircle() {\n return this.config.shape === 'circle';\n }\n private get items(): Item[] {\n return (this.cache ??= this.buildItems());\n }\n\n private fmt(v: DialValue): string {\n return this.config.format ? this.config.format(v) : String(v);\n }\n\n private buildItems(): Item[] {\n const c = this.config;\n let base: { value: DialValue; label?: string }[];\n if (c.options) base = c.options.map((o) => (typeof o === 'object' ? o : { value: o }));\n else {\n const min = c.min ?? 0;\n const step = c.step || 1;\n const n = Math.max(1, Math.floor(((c.max ?? 100) - min) / step + 1e-9) + 1);\n const dec = Math.max(decimals(step), decimals(min));\n base = Array.from({ length: n }, (_, i) => ({ value: Number((min + i * step).toFixed(dec)) }));\n }\n const snap = c.snap ?? (c.options ? 1 : 10);\n const major = (v: DialValue, i: number) =>\n snap === false ? false : Array.isArray(snap) ? snap.includes(v) : c.options ? i % snap === 0 : Math.abs((v as number) / snap - Math.round((v as number) / snap)) < 1e-9;\n return base.map((o, i) => ({ value: o.value, label: o.label ?? this.fmt(o.value), major: major(o.value, i) }));\n }\n\n protected override emptyValue(): DialValue {\n const first = this.config.options?.[0];\n return first === undefined ? (this.config.min ?? 0) : typeof first === 'object' ? first.value : first;\n }\n protected override isEmpty(): boolean {\n return false;\n }\n\n private indexOf(v: DialValue): number {\n const list = this.items;\n if (this.config.options) return Math.max(0, list.findIndex((it) => it.value === v));\n const i = Math.round(((v as number) - (this.config.min ?? 0)) / (this.config.step || 1));\n return Math.max(0, Math.min(list.length - 1, Number.isFinite(i) ? i : 0));\n }\n private normalize(v: DialValue): DialValue {\n return this.items[this.indexOf(v)].value;\n }\n private get index(): number {\n return this.indexOf(this.value);\n }\n\n // ---- DOM ----------------------------------------------------------------------------------\n\n protected createControl() {\n this.readout = h('div', 'op-dial__readout', { 'aria-hidden': 'true' });\n this.tape = h('div', 'op-dial__tape');\n this.needle = h('div', 'op-dial__needle');\n this.face = h('div', 'op-dial__face', { role: 'slider', tabindex: 0, 'aria-orientation': 'horizontal' }, h('div', 'op-dial__window', {}, this.tape), this.needle);\n this.listen(this.face, 'pointerdown', (e: PointerEvent) => this.onDown(e));\n this.listen(this.face, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.paintTicks();\n this.inputEl = this.face;\n return h('div', 'op-dial__box', {}, this.readout, this.face);\n }\n\n protected override onRender() {\n super.onRender();\n const label = this.el.querySelector('.op-field__label') as HTMLElement;\n label.id = `${this.id}-label`;\n if (!this.config.ariaLabel) this.face.setAttribute('aria-labelledby', label.id);\n }\n\n private paintTicks() {\n const list = this.items;\n const show = this.config.labels ?? 'snap';\n if (this.rendered) {\n this.el.classList.toggle('op-dial--circle', this.isCircle);\n this.el.classList.toggle('op-dial--list', !!this.config.options);\n }\n this.tape.replaceChildren(\n ...list.map((it, i) => {\n const tick = h('span', `op-dial__tick${it.major ? ' is-major' : ''}`, { 'data-i': i });\n tick.style.setProperty('--i', String(i));\n tick.style.setProperty('--a', `${(i * 360) / list.length}deg`);\n if (show === 'all' || (show === 'snap' && it.major)) tick.append(h('span', 'op-dial__tick-label', {}, it.label));\n return tick;\n }),\n );\n }\n\n protected override build(): HTMLElement {\n const el = super.build();\n el.classList.toggle('op-dial--circle', this.isCircle);\n el.classList.toggle('op-dial--list', !!this.config.options);\n return el;\n }\n\n /** Distance in px between two ticks on the ruler, for drags (12 when there is no layout, as in tests). */\n private spacing(): number {\n const [a, b] = this.tape.children as unknown as HTMLElement[];\n return (b && a && b.offsetLeft - a.offsetLeft) || 12;\n }\n\n private place() {\n this.needle.style.transform = this.isCircle ? `translateX(-50%) rotate(${this.angle}deg)` : '';\n this.tape.style.setProperty('--pos', String(this.isCircle ? 0 : this.pos));\n }\n\n /** Turns the hand to item `i` the short way round. */\n private aim(i: number) {\n const target = (i * 360) / this.items.length;\n this.angle += ((((target - this.angle) % 360) + 540) % 360) - 180;\n }\n\n protected applyValue(v: DialValue): void {\n const i = this.indexOf(v);\n this.pos = i;\n this.aim(i);\n this.place();\n this.paintState(i);\n }\n\n /** ARIA, the current tick and the readout for item `i`. */\n private paintState(i: number) {\n const list = this.items;\n const it = list[i];\n const f = this.face;\n const isList = !!this.config.options;\n f.setAttribute('aria-valuemin', String(isList ? 0 : list[0].value));\n f.setAttribute('aria-valuemax', String(isList ? list.length - 1 : list[list.length - 1].value));\n f.setAttribute('aria-valuenow', String(isList ? i : it.value));\n f.setAttribute('aria-valuetext', it.label);\n this.tape.querySelector('.is-current')?.classList.remove('is-current');\n this.tape.children[i]?.classList.add('is-current');\n this.paintReadout(it.label);\n }\n\n /** Digits roll like an odometer when the text keeps its shape; any other change slides the new text in. */\n private paintReadout(text: string) {\n const old = this.shown;\n if (text === old) return;\n this.shown = text;\n const shape = (s: string) => s.replace(/\\d/g, '0');\n if (old && shape(old) === shape(text)) {\n [...text].forEach((ch, k) => /\\d/.test(ch) && (this.readout.children[k] as HTMLElement).firstElementChild!.setAttribute('style', `--d:${ch}`));\n return;\n }\n this.readout.replaceChildren(\n ...[...text].map((ch) =>\n /\\d/.test(ch)\n ? h('span', 'op-dial__digit', {}, h('span', 'op-dial__reel', { style: `--d:${ch}` }, ...'0123456789'.split('').map((d) => h('span', '', {}, d))))\n : h('span', '', {}, ch),\n ),\n );\n if (old && motion.isOn() && typeof this.readout.animate === 'function') {\n const up = this.items.findIndex((it) => it.label === text) >= this.items.findIndex((it) => it.label === old);\n // `translate`, not `transform`: the circle centers the readout with a transform\n this.readout.animate([{ translate: `0 ${up ? 35 : -35}%`, opacity: 0 }, { translate: '0 0', opacity: 1 }], { duration: motion.ms('swap'), easing: motion.easing('enter') });\n }\n }\n\n // ---- user input ---------------------------------------------------------------------------\n\n /** The user picked item `i`: animate there and tell everyone. */\n private choose(i: number) {\n const list = this.items;\n i = Math.max(0, Math.min(list.length - 1, i));\n this.pos = i;\n this.aim(i);\n this.place();\n this.paintState(i);\n this.commit(list[i].value);\n }\n\n private get locked() {\n return !!(this.config.disabled || this.config.readonly);\n }\n\n private onKey(e: KeyboardEvent) {\n if (this.locked) return;\n const i = this.index;\n const n = this.items.length;\n const to: Record<string, number> = { ArrowRight: i + 1, ArrowUp: i + 1, ArrowLeft: i - 1, ArrowDown: i - 1, PageUp: this.snapFrom(i, 1), PageDown: this.snapFrom(i, -1), Home: 0, End: n - 1 };\n if (!(e.key in to)) return;\n e.preventDefault();\n this.choose(to[e.key]);\n (this.flushSettled(), this.emit('slide-end', this.value));\n }\n\n /** The next snap point after item `i` in direction `dir` (or the limit when there is none). */\n private snapFrom(i: number, dir: 1 | -1): number {\n const list = this.items;\n for (let k = i + dir; k >= 0 && k < list.length; k += dir) if (list[k].major) return k;\n return dir > 0 ? list.length - 1 : 0;\n }\n\n private angleAt(e: PointerEvent): number {\n const r = this.face.getBoundingClientRect();\n const a = (Math.atan2(e.clientX - (r.left + r.width / 2), (r.top + r.height / 2) - e.clientY) * 180) / Math.PI;\n return (a + 360) % 360;\n }\n\n private onDown(e: PointerEvent) {\n if (this.locked || e.button) return;\n e.preventDefault();\n this.stopGlide?.();\n const f = this.face;\n f.focus();\n f.setPointerCapture?.(e.pointerId);\n const n = this.items.length;\n const sp = this.spacing();\n const x0 = e.clientX;\n const p0 = this.pos;\n let moved = false;\n let samples = [{ x: e.clientX, t: e.timeStamp }];\n this.el.classList.add('is-dragging');\n this.emit('slide-start');\n const follow = (m: PointerEvent) => {\n if (this.isCircle) {\n const a = this.angleAt(m);\n this.angle += ((((a - this.angle) % 360) + 540) % 360) - 180;\n this.place();\n return Math.round((a / 360) * n) % n;\n }\n const raw = p0 - (m.clientX - x0) / sp;\n const over = raw < 0 ? raw : raw > n - 1 ? raw - (n - 1) : 0;\n this.pos = over ? raw - over + (Math.sign(over) * rubberBand(Math.abs(over) * sp, sp * 2)) / sp : raw;\n this.place();\n return Math.round(Math.max(0, Math.min(n - 1, raw)));\n };\n const track = (m: PointerEvent) => {\n if (Math.abs(m.clientX - x0) > 3 || this.isCircle) moved = true;\n samples = [...samples.filter((s) => m.timeStamp - s.t < 100), { x: m.clientX, t: m.timeStamp }];\n const i = follow(m);\n if (i !== this.index) (this.paintState(i), this.commit(this.items[i].value));\n };\n const detach = () => {\n f.removeEventListener('pointermove', track);\n f.removeEventListener('pointerup', up);\n f.removeEventListener('pointercancel', up);\n };\n const up = (u: PointerEvent) => {\n detach();\n this.el.classList.remove('is-dragging');\n if (u.type === 'pointercancel') return this.rest(this.index);\n if (this.isCircle) return this.rest(moved ? this.index : Math.round((this.angleAt(u) / 360) * n) % n);\n if (!moved) {\n // a click: go to the tick under the pointer\n const r = f.getBoundingClientRect();\n return this.rest(Math.round(this.pos + (u.clientX - (r.left + r.width / 2)) / sp));\n }\n const first = samples[0];\n const v = (u.clientX - first.x) / Math.max(1, u.timeStamp - first.t); // px/ms, > 0 = towards the start\n if (Math.abs(v) < FLICK) return this.rest(Math.round(Math.max(0, Math.min(n - 1, this.pos))));\n const dir = v < 0 ? 1 : -1;\n const ahead = this.pos + (dir * Math.abs(v) * 260) / sp; // where the inertia would carry it\n // rest on the snap point nearest to that, among those ahead of the ruler (or on the nearest step when there are none)\n let to = -1;\n this.items.forEach((it, k) => it.major && (dir > 0 ? k > this.pos : k < this.pos) && (to < 0 || Math.abs(k - ahead) < Math.abs(to - ahead)) && (to = k));\n this.rest(to >= 0 ? to : Math.round(Math.max(0, Math.min(n - 1, ahead))), true);\n };\n f.addEventListener('pointermove', track);\n f.addEventListener('pointerup', up);\n f.addEventListener('pointercancel', up);\n this.own(detach);\n }\n\n /** Comes to rest on item `i`; a glide (after a flick) takes longer the further it goes. */\n private rest(i: number, glide = false) {\n const from = this.pos;\n this.choose(i);\n const end = () => {\n this.stopGlide = undefined;\n this.el.classList.remove('is-gliding');\n this.tape.style.transitionDuration = '';\n (this.flushSettled(), this.emit('slide-end', this.value));\n };\n if (!glide || !motion.isOn()) return end();\n const ms = Math.min(900, 280 + Math.abs(this.pos - from) * this.spacing() * 0.9);\n this.el.classList.add('is-gliding');\n this.tape.style.transitionDuration = `${ms}ms`;\n this.stopGlide = this.later(end, ms);\n }\n\n // ---- API ----------------------------------------------------------------------------------\n\n /** Moves `n` steps (negative goes back). */\n next(n = 1) {\n this.setValue(this.items[Math.max(0, Math.min(this.items.length - 1, this.index + n))].value);\n }\n prev(n = 1) {\n this.next(-n);\n }\n nextSnap() {\n this.setValue(this.items[this.snapFrom(this.index, 1)].value);\n }\n prevSnap() {\n this.setValue(this.items[this.snapFrom(this.index, -1)].value);\n }\n\n override getDisplayText(): string {\n return this.items[this.index].label;\n }\n\n private rebuild(patch: Partial<DialConfig>) {\n Object.assign(this.config, patch);\n this.cache = undefined;\n this.value = this.normalize(this.value);\n if (!this.rendered) return;\n this.paintTicks();\n this.shown = '';\n this.readout.replaceChildren();\n this.applyValue(this.value);\n }\n setMin(min: number) {\n this.rebuild({ min });\n }\n setMax(max: number) {\n this.rebuild({ max });\n }\n setStep(step: number) {\n this.rebuild({ step });\n }\n setOptions(options: DialConfig['options']) {\n this.rebuild({ options });\n }\n setSnap(snap: DialConfig['snap']) {\n this.rebuild({ snap });\n }\n setShape(shape: 'linear' | 'circle') {\n this.rebuild({ shape });\n }\n setFormat(format: DialConfig['format']) {\n this.rebuild({ format });\n }\n\n protected override onDisabled(disabled: boolean) {\n this.face.tabIndex = disabled ? -1 : 0;\n this.face.setAttribute('aria-disabled', String(disabled));\n }\n protected override onReadonly(readonly: boolean) {\n this.face.setAttribute('aria-readonly', String(readonly));\n }\n}\nregister('dial', Dial);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["FLICK", "decimals", "n", "Dial", "Field", "config", "v", "c", "base", "o", "min", "step", "dec", "_", "i", "snap", "major", "first", "list", "it", "h", "e", "label", "show", "tick", "el", "a", "b", "target", "f", "isList", "text", "old", "shape", "s", "ch", "k", "d", "motion", "up", "to", "dir", "r", "sp", "x0", "p0", "moved", "samples", "follow", "m", "raw", "over", "rubberBand", "track", "detach", "u", "ahead", "glide", "from", "end", "ms", "patch", "max", "options", "format", "disabled", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as o}from"./chunk-4EZJ5FKJ.js";import{a as d}from"./chunk-A2NKDOYN.js";import{b as e}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";import{e as n,f as r}from"./chunk-MW3RWBZ7.js";n("en",{stepOptional:"optional",stepDone:"completed",stepError:"has errors",stepSteps:"Steps"});n("pt-BR",{stepOptional:"opcional",stepDone:"conclu\xEDda",stepError:"com erros",stepSteps:"Etapas"});var a=class extends d{baseCls="op-stepper";tag="nav";list;active=0;states=[];onRender(){let t=this.config;this.active=t.active??0,this.el.setAttribute("aria-label",t.ariaLabel??r("stepSteps")),this.list=e("ol","op-stepper__list"),this.el.append(this.list),this.listen(this.list,"click",i=>{let s=i.target.closest(".op-stepper__btn");if(!s||s.disabled)return;let p=Number(s.dataset.i);this.emit("before-select",p)!==!1&&(this.setActive(p),this.emit("select",p))}),this.paint()}steps(){return this.config.steps??[]}paint(){this.list.replaceChildren(...this.steps().map((t,i)=>{let s=this.states[i]??"pending",p=i===this.active,m=e("span","op-stepper__marker",{"aria-hidden":"true"},s==="done"&&!p?o("check"):s==="error"?"!":t.icon?o(t.icon):String(i+1)),c=s==="done"&&!p?r("stepDone"):s==="error"?r("stepError"):"",l=e("button","op-stepper__btn",{type:"button","data-i":i,"aria-current":p?"step":null},m,e("span","op-stepper__text",{},e("span","op-stepper__title",{},t.title),t.description?e("span","op-stepper__desc",{},t.description):"",t.optional?e("span","op-stepper__opt",{},r("stepOptional")):"",c?e("span","op-sr-only",{},c):""));l.disabled=this.config.clickable===!1;let g=i===this.steps().length-1;return e("li",`op-stepper__step${p?" is-current":""}${s==="done"?" is-done":""}${s==="error"?" is-error":""}${t.optional?" is-optional":""}`,{},l,g?"":e("span","op-stepper__line",{"aria-hidden":"true"}))}))}setActive(t){this.active=Math.max(0,Math.min(t,this.steps().length-1)),this.config.active=this.active,this.rendered&&this.paint()}getActive(){return this.active}setStepState(t,i){this.states[t]=i,this.rendered&&this.paint()}getStepState(t){return this.states[t]??"pending"}setSteps(t){this.config.steps=t,this.states=[],this.rendered&&this.paint()}};h("stepper",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-JOFQJGZK.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/navigation/stepper/stepper.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n stepOptional: 'optional',\n stepDone: 'completed',\n stepError: 'has errors',\n stepSteps: 'Steps',\n});\naddMessages('pt-BR', {\n stepOptional: 'opcional',\n stepDone: 'conclu\u00EDda',\n stepError: 'com erros',\n stepSteps: 'Etapas',\n});\n\nexport interface Step {\n id?: string;\n title: string;\n description?: string;\n icon?: string;\n optional?: boolean;\n}\nexport type StepState = 'pending' | 'done' | 'error';\n\nexport interface StepperConfig extends ComponentConfig {\n steps?: Step[];\n active?: number;\n /** Steps can be clicked. Default true. */\n clickable?: boolean;\n}\n\n/** Where you are in a multi-step process: numbered steps with done / current / error states. */\nexport class Stepper extends Component<StepperConfig> {\n protected override baseCls = 'op-stepper';\n protected override tag = 'nav' as const;\n private list!: HTMLElement;\n private active = 0;\n private states: StepState[] = [];\n\n protected override onRender() {\n const c = this.config;\n this.active = c.active ?? 0;\n this.el.setAttribute('aria-label', c.ariaLabel ?? t('stepSteps'));\n this.list = h('ol', 'op-stepper__list');\n this.el.append(this.list);\n this.listen(this.list, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-stepper__btn');\n if (!b || b.disabled) return;\n const i = Number(b.dataset.i);\n if (this.emit('before-select', i) === false) return;\n this.setActive(i);\n this.emit('select', i);\n });\n this.paint();\n }\n\n private steps(): Step[] {\n return this.config.steps ?? [];\n }\n\n private paint() {\n this.list.replaceChildren(\n ...this.steps().map((s, i) => {\n const state = this.states[i] ?? 'pending';\n const current = i === this.active;\n const marker = h('span', 'op-stepper__marker', { 'aria-hidden': 'true' }, state === 'done' && !current ? iconEl('check') : state === 'error' ? '!' : s.icon ? iconEl(s.icon) : String(i + 1));\n const status = state === 'done' && !current ? t('stepDone') : state === 'error' ? t('stepError') : '';\n const btn = h('button', 'op-stepper__btn', { type: 'button', 'data-i': i, 'aria-current': current ? 'step' : null }, marker,\n h('span', 'op-stepper__text', {},\n h('span', 'op-stepper__title', {}, s.title),\n s.description ? h('span', 'op-stepper__desc', {}, s.description) : '',\n s.optional ? h('span', 'op-stepper__opt', {}, t('stepOptional')) : '',\n status ? h('span', 'op-sr-only', {}, status) : ''));\n btn.disabled = this.config.clickable === false;\n const last = i === this.steps().length - 1;\n return h('li', `op-stepper__step${current ? ' is-current' : ''}${state === 'done' ? ' is-done' : ''}${state === 'error' ? ' is-error' : ''}${s.optional ? ' is-optional' : ''}`, {}, btn, last ? '' : h('span', 'op-stepper__line', { 'aria-hidden': 'true' }));\n }),\n );\n }\n\n setActive(i: number) {\n this.active = Math.max(0, Math.min(i, this.steps().length - 1));\n this.config.active = this.active;\n if (this.rendered) this.paint();\n }\n getActive(): number {\n return this.active;\n }\n\n setStepState(i: number, state: StepState) {\n this.states[i] = state;\n if (this.rendered) this.paint();\n }\n getStepState(i: number): StepState {\n return this.states[i] ?? 'pending';\n }\n\n setSteps(steps: Step[]) {\n this.config.steps = steps;\n this.states = [];\n if (this.rendered) this.paint();\n }\n}\nregister('stepper', Stepper);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "Stepper", "Component", "c", "t", "h", "e", "b", "i", "s", "state", "current", "marker", "iconEl", "status", "btn", "last", "steps", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as k}from"./chunk-TIPK3SCJ.js";function v(g,o){let n=g.editor;return n&&typeof n=="object"?{...n}:typeof n=="string"?{type:n}:{type:typeof o=="number"?"numberfield":typeof o=="boolean"?"checkbox":"textfield"}}function x(g={}){let o,n,E=(e,t)=>!!e.editor&&(e.editable?.(t)??!0),m=e=>o.getColumns().filter(t=>E(t,e));function p(e){if(!E(e.column,e.record)||o.emit("before-edit",e.record,e.column.field)===!1)return!1;s(!0);let t=e.record.get(e.column.field),r=k({...v(e.column,t),value:t,stableSize:!1,ariaLabel:e.column.header??e.column.field,cls:"op-grid__editor"});return e.el.classList.add("is-editing"),e.el.replaceChildren(r.el),r.notifyMount(),n={cell:e,field:r,old:t},r.focus(),r.el.querySelector("input")?.select(),!0}function s(e){let t=n;if(!t)return!0;if(e&&!t.field.validate())return!1;n=void 0;let r=t.field.getValue();t.field.destroy(),t.cell.el.classList.remove("is-editing");let{record:d,column:c}=t.cell;return e&&!Object.is(r,t.old)?(d.set(c.field,r),o.emit("edit",d,c.field,r,t.old)):(o.refresh(),e||o.emit("edit-cancel",d,c.field)),!0}function C(e){if(!n)return;let t=o.getStore(),r=n.cell.index,d=m(n.cell.record),c=d.indexOf(n.cell.column)+e;for(let f=0;f<500;f++){if(c>=0&&c<d.length){o.scrollToRow(r);let a=o.getCell(r,d[c].field),l=t.getAt(r);return a?{index:r,record:l,column:d[c],el:a}:void 0}r+=e;let u=t.getAt(r);if(!u)return;d=m(u),c=e>0?0:d.length-1}}return{init(e){o=e;let t=e.el,r=t.querySelector("[role=grid]"),d=l=>{let i=e.cellAt(l.target);i&&!(n&&i.el===n.cell.el)&&p(i)},c=l=>{if(n&&n.cell.el.contains(l.target)){if(l.key==="Escape")s(!1);else if(l.key==="Enter"&&!l.shiftKey)s(!0)&&r.focus();else if(l.key==="Tab"){let i=C(l.shiftKey?-1:1);if(!s(!0))return void l.preventDefault();i?p({...i,el:o.getCell(i.index,i.column.field)??i.el}):r.focus()}else return;l.preventDefault(),l.stopPropagation()}else if(l.target===r&&(l.key==="F2"||l.key==="Enter")&&e.getActive()>=0){let i=e.getStore().getAt(e.getActive()),y=m(i)[0],b=y&&e.getCell(e.getActive(),y.field);b&&p({index:e.getActive(),record:i,column:y,el:b})&&(l.preventDefault(),l.stopPropagation())}},f=l=>{if(!n||!n.cell.el.contains(l.target))return;let i=l.relatedTarget;i&&(n.cell.el.contains(i)||i.closest(".op-layer"))||s(!0)},u=t.querySelector(".op-grid__viewport"),a=()=>n&&s(!0);return t.addEventListener(g.trigger==="click"?"click":"dblclick",d),t.addEventListener("keydown",c,!0),t.addEventListener("focusout",f),u.addEventListener("scroll",a,{passive:!0}),()=>{n?.field.destroy(),n=void 0,t.removeEventListener(g.trigger==="click"?"click":"dblclick",d),t.removeEventListener("keydown",c,!0),t.removeEventListener("focusout",f),u.removeEventListener("scroll",a)}}}}export{x as a};
|
|
2
|
+
//# sourceMappingURL=chunk-KCEUD232.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/cellediting/cellediting.ts"],
|
|
4
|
+
"sourcesContent": ["// Inline cell editing for the Grid, as a plugin: `plugins: [cellEditing()]` and `editor` on the columns to edit.\n// Editors are regular fields created by type (`create({ type })`), so this module imports none of them: with\n// per-component imports, import the field types your columns use (`optikos/components/select`...).\nimport { create } from '../../../core/registry';\nimport type { Field } from '../../../core/field';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { Grid, GridPlugin, GridCell } from '../grid/grid';\n\nexport interface CellEditingOptions {\n /** What starts editing with the pointer: a double click (default) or a single click. F2 and Enter always do. */\n trigger?: 'dblclick' | 'click';\n}\n\ninterface Editing { cell: GridCell; field: Field<any>; old: unknown }\n\n/** The field config for a column's editor: from `editor`, else from the type of the current value. */\nfunction editorConfig(col: Column, value: unknown): Record<string, any> {\n const e = col.editor;\n if (e && typeof e === 'object') return { ...e };\n if (typeof e === 'string') return { type: e };\n return { type: typeof value === 'number' ? 'numberfield' : typeof value === 'boolean' ? 'checkbox' : 'textfield' };\n}\n\n/**\n * Inline editing plugin. Events on the grid: `before-edit(record, field)` (cancelable), `edit(record, field, value, old)`\n * after a valid value was written to the record (`record.set`, so it is marked modified), `edit-cancel(record, field)`.\n */\nexport function cellEditing(options: CellEditingOptions = {}): GridPlugin {\n let grid!: Grid;\n let editing: Editing | undefined;\n\n const editable = (c: Column, rec: Model) => !!c.editor && (c.editable?.(rec) ?? true);\n const editableCols = (rec: Model) => grid.getColumns().filter((c) => editable(c, rec));\n\n function start(cell: GridCell): boolean {\n if (!editable(cell.column, cell.record) || grid.emit('before-edit', cell.record, cell.column.field) === false) return false;\n finish(true);\n const old = cell.record.get(cell.column.field);\n const field = create<Field<any>>({ ...editorConfig(cell.column, old), value: old, stableSize: false, ariaLabel: cell.column.header ?? cell.column.field, cls: 'op-grid__editor' });\n cell.el.classList.add('is-editing');\n cell.el.replaceChildren(field.el);\n field.notifyMount();\n editing = { cell, field, old };\n field.focus();\n field.el.querySelector('input')?.select();\n return true;\n }\n\n /** Commits (or cancels) the current edit. A commit that fails validation keeps the editor open. */\n function finish(commit: boolean): boolean {\n const e = editing;\n if (!e) return true;\n if (commit && !e.field.validate()) return false;\n editing = undefined;\n const value = e.field.getValue();\n e.field.destroy();\n e.cell.el.classList.remove('is-editing');\n const { record, column } = e.cell;\n if (commit && !Object.is(value, e.old)) {\n record.set(column.field, value); // the store re-renders the row\n grid.emit('edit', record, column.field, value, e.old);\n } else {\n grid.refresh(); // puts the cell content back\n if (!commit) grid.emit('edit-cancel', record, column.field);\n }\n return true;\n }\n\n /** The next (or previous) editable cell after the current one, row by row. */\n function step(dir: 1 | -1): GridCell | undefined {\n if (!editing) return;\n const store = grid.getStore();\n let i = editing.cell.index;\n let cols = editableCols(editing.cell.record);\n let c = cols.indexOf(editing.cell.column) + dir;\n for (let guard = 0; guard < 500; guard++) {\n if (c >= 0 && c < cols.length) {\n grid.scrollToRow(i);\n const el = grid.getCell(i, cols[c].field);\n const rec = store.getAt(i)!;\n return el ? { index: i, record: rec, column: cols[c], el } : undefined;\n }\n i += dir;\n const rec = store.getAt(i);\n if (!rec) return;\n cols = editableCols(rec);\n c = dir > 0 ? 0 : cols.length - 1;\n }\n }\n\n return {\n init(g: Grid) {\n grid = g;\n const el = g.el;\n const table = el.querySelector<HTMLElement>('[role=grid]')!;\n const onPointer = (ev: Event) => {\n const cell = g.cellAt(ev.target);\n if (cell && !(editing && cell.el === editing.cell.el)) start(cell);\n };\n // capture: these run before the grid's own key handling (Enter would otherwise activate the row)\n const onKey = (ev: KeyboardEvent) => {\n if (editing && editing.cell.el.contains(ev.target as Node)) {\n if (ev.key === 'Escape') finish(false);\n else if (ev.key === 'Enter' && !ev.shiftKey) finish(true) && table.focus();\n else if (ev.key === 'Tab') {\n const next = step(ev.shiftKey ? -1 : 1);\n if (!finish(true)) return void ev.preventDefault();\n if (next) start({ ...next, el: grid.getCell(next.index, next.column.field) ?? next.el });\n else table.focus();\n } else return;\n ev.preventDefault();\n ev.stopPropagation();\n } else if (ev.target === table && (ev.key === 'F2' || ev.key === 'Enter') && g.getActive() >= 0) {\n const rec = g.getStore().getAt(g.getActive())!;\n const col = editableCols(rec)[0];\n const cellEl = col && g.getCell(g.getActive(), col.field);\n if (cellEl && start({ index: g.getActive(), record: rec, column: col, el: cellEl })) {\n ev.preventDefault();\n ev.stopPropagation();\n }\n }\n };\n // leaving the cell commits, unless the focus went into the editor's own popup (a select list, a calendar)\n const onFocusOut = (ev: FocusEvent) => {\n if (!editing || !editing.cell.el.contains(ev.target as Node)) return;\n const to = ev.relatedTarget as HTMLElement | null;\n if (to && (editing.cell.el.contains(to) || to.closest('.op-layer'))) return;\n finish(true);\n };\n const viewport = el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const onScroll = () => editing && finish(true);\n el.addEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.addEventListener('keydown', onKey, true);\n el.addEventListener('focusout', onFocusOut);\n viewport.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n editing?.field.destroy();\n editing = undefined;\n el.removeEventListener(options.trigger === 'click' ? 'click' : 'dblclick', onPointer);\n el.removeEventListener('keydown', onKey, true);\n el.removeEventListener('focusout', onFocusOut);\n viewport.removeEventListener('scroll', onScroll);\n };\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["editorConfig", "col", "value", "e", "cellEditing", "options", "grid", "editing", "editable", "c", "rec", "editableCols", "start", "cell", "finish", "old", "field", "create", "commit", "record", "column", "step", "dir", "store", "i", "cols", "guard", "el", "g", "table", "onPointer", "ev", "onKey", "next", "cellEl", "onFocusOut", "to", "viewport", "onScroll"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m}from"./chunk-4LZZ244E.js";import{a as x}from"./chunk-YHEMA56R.js";import{a as p}from"./chunk-W3H7GTJY.js";import{c}from"./chunk-ZWNQREWS.js";import{d}from"./chunk-4EZJ5FKJ.js";import{f as r}from"./chunk-MW3RWBZ7.js";function s(t){return new Promise(e=>{let a=!1,l=o=>{a||(a=!0,e(o))},i=t.input?new p({value:t.input.value??"",placeholder:t.input.placeholder,validators:t.input.validators,ariaLabel:t.text}):void 0,u=new x({text:t.text,flex:1}),n=new m({title:t.title,cls:"op-messagebox",closeAction:"destroy",mask:t.mask??!1,autoFocus:!!t.input?.autoFocus,items:[new c({layout:{type:"hbox",gap:12,align:"flex-start"},items:[...t.icon?[new d({name:t.icon,cls:"op-messagebox__icon"})]:[],new c({layout:{type:"vbox"},flex:1,items:[u,...i?[i]:[]]})]})],buttons:t.buttons.map(o=>({text:o.text,variant:o.variant??"default",handler:()=>{t.beforeClose?.(o.id,n,i)!==!1&&(l(o.id),n.close())}}))});n.el.setAttribute("role",t.input?"dialog":"alertdialog"),n.el.setAttribute("aria-describedby",u.id),n.on("close",()=>l(t.cancelId??t.buttons[t.buttons.length-1].id));let g=t.buttons.find(o=>o.variant==="primary"||o.variant==="danger");i?.on("enter",()=>n.el.querySelectorAll(".op-panel__footer button")[t.buttons.indexOf(g??t.buttons[0])].click()),n.show(),i||n.el.querySelector(".op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger")?.focus()})}var T={show:s,async alert(t,e={}){await s({text:t,title:e.title,mask:e.mask,icon:e.icon??"info",buttons:[{id:"ok",text:e.okText??r("ok"),variant:"primary"}],cancelId:"ok"})},async confirm(t,e={}){return await s({text:t,title:e.title,mask:e.mask,icon:e.icon??(e.danger?"alert":"info"),buttons:[{id:"cancel",text:e.cancelText??r("cancel")},{id:"ok",text:e.okText??r("ok"),variant:e.danger?"danger":"primary"}],cancelId:"cancel"})==="ok"},async prompt(t,e={}){let a=null;return await s({text:t,title:e.title,mask:e.mask,input:{value:e.value,placeholder:e.placeholder,validators:e.validators,autoFocus:e.autoFocus},buttons:[{id:"cancel",text:e.cancelText??r("cancel")},{id:"ok",text:e.okText??r("ok"),variant:"primary"}],cancelId:"cancel",beforeClose:(i,u,n)=>{if(i==="ok"){if(!n.validate())return!1;a=n.getValue()}}})==="ok"?a:null}};export{T as a};
|
|
2
|
+
//# sourceMappingURL=chunk-KLLAY2IM.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/messagebox/messagebox.ts"],
|
|
4
|
+
"sourcesContent": ["import { Window } from '../window/window';\nimport { Label } from '../../base/label/label';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Container } from '../../../core/container';\nimport { Icon } from '../../base/icon/icon';\nimport { t } from '../../../core/i18n';\nimport type { Validator } from '../../../core/validators';\n\nexport interface MessageBoxButton {\n id: string;\n text: string;\n variant?: 'default' | 'primary' | 'danger';\n}\n\nexport interface MessageBoxConfig {\n text: string;\n title?: string;\n icon?: string;\n buttons: MessageBoxButton[];\n /** Resolved when closed with Esc or the close button. */\n cancelId?: string;\n /** Adds a text input; `show` then resolves with the button id and the input is read by `prompt`. */\n input?: { value?: string; placeholder?: string; validators?: Validator<string>[]; autoFocus?: boolean };\n /** Called with the pressed button id before closing; return `false` to keep the dialog open. */\n beforeClose?: (id: string, win: Window, input?: TextField) => boolean | void;\n /** Dim the page behind. Default false: a message is still modal, but it does not darken the screen. */\n mask?: boolean;\n}\n\nfunction open(cfg: MessageBoxConfig): Promise<string> {\n return new Promise((resolve) => {\n let done = false;\n const finish = (id: string) => {\n if (done) return;\n done = true;\n resolve(id);\n };\n const field = cfg.input ? new TextField({ value: cfg.input.value ?? '', placeholder: cfg.input.placeholder, validators: cfg.input.validators, ariaLabel: cfg.text }) : undefined;\n const message = new Label({ text: cfg.text, flex: 1 });\n const win: Window = new Window({\n title: cfg.title,\n cls: 'op-messagebox',\n closeAction: 'destroy',\n mask: cfg.mask ?? false,\n autoFocus: !!cfg.input?.autoFocus,\n items: [\n new Container({\n layout: { type: 'hbox', gap: 12, align: 'flex-start' },\n items: [...(cfg.icon ? [new Icon({ name: cfg.icon, cls: 'op-messagebox__icon' })] : []), new Container({ layout: { type: 'vbox' }, flex: 1, items: [message, ...(field ? [field] : [])] })],\n }),\n ],\n buttons: cfg.buttons.map((b) => ({\n text: b.text,\n variant: b.variant ?? 'default',\n handler: () => {\n if (cfg.beforeClose?.(b.id, win, field) === false) return;\n finish(b.id);\n win.close();\n },\n })),\n });\n win.el.setAttribute('role', cfg.input ? 'dialog' : 'alertdialog');\n win.el.setAttribute('aria-describedby', message.id);\n win.on('close', () => finish(cfg.cancelId ?? cfg.buttons[cfg.buttons.length - 1].id));\n const primary = cfg.buttons.find((b) => b.variant === 'primary' || b.variant === 'danger');\n field?.on('enter', () => (win.el.querySelectorAll('.op-panel__footer button')[cfg.buttons.indexOf(primary ?? cfg.buttons[0])] as HTMLElement).click());\n win.show();\n // the primary action takes the initial focus unless there is an input\n if (!field) win.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger')?.focus();\n });\n}\n\nexport interface AlertOptions {\n title?: string;\n mask?: boolean;\n okText?: string;\n icon?: string;\n}\nexport interface ConfirmOptions {\n title?: string;\n mask?: boolean;\n okText?: string;\n cancelText?: string;\n danger?: boolean;\n icon?: string;\n}\nexport interface PromptOptions {\n title?: string;\n mask?: boolean;\n value?: string;\n placeholder?: string;\n okText?: string;\n cancelText?: string;\n validators?: Validator<string>[];\n /** Focus the text field on open (a phone keyboard pops up). Default false: the dialog gets the focus. */\n autoFocus?: boolean;\n}\n\nexport const MessageBox = {\n show: open,\n\n async alert(text: string, o: AlertOptions = {}): Promise<void> {\n await open({ text, title: o.title, mask: o.mask, icon: o.icon ?? 'info', buttons: [{ id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' }], cancelId: 'ok' });\n },\n\n async confirm(text: string, o: ConfirmOptions = {}): Promise<boolean> {\n const id = await open({\n text,\n title: o.title,\n mask: o.mask,\n icon: o.icon ?? (o.danger ? 'alert' : 'info'),\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: o.danger ? 'danger' : 'primary' },\n ],\n cancelId: 'cancel',\n });\n return id === 'ok';\n },\n\n /** Resolves with the text, or `null` when cancelled. The dialog stays open while the validators fail. */\n async prompt(text: string, o: PromptOptions = {}): Promise<string | null> {\n let value: string | null = null;\n const id = await open({\n text,\n title: o.title,\n mask: o.mask,\n input: { value: o.value, placeholder: o.placeholder, validators: o.validators, autoFocus: o.autoFocus },\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' },\n ],\n cancelId: 'cancel',\n beforeClose: (btn, _win, field) => {\n if (btn !== 'ok') return;\n if (!field!.validate()) return false;\n value = field!.getValue();\n },\n });\n return id === 'ok' ? value : null;\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["open", "cfg", "resolve", "done", "finish", "id", "field", "TextField", "message", "Label", "win", "Window", "Container", "Icon", "b", "primary", "MessageBox", "text", "o", "t", "value", "btn", "_win"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as v}from"./chunk-ZWNQREWS.js";import{a as m}from"./chunk-2ZRNGG2N.js";import{c as u}from"./chunk-4EZJ5FKJ.js";import{a as w}from"./chunk-A2NKDOYN.js";import{b as r}from"./chunk-PZSHOSOS.js";import{a as y}from"./chunk-TIPK3SCJ.js";import{e as p,f as l}from"./chunk-MW3RWBZ7.js";p("en",{flAdd:"Add",flRemove:"Remove {row}",flUp:"Move {row} up",flDown:"Move {row} down",flEmpty:"Nothing added yet",flMin:"Add at least {n}",flMax:"At most {n}"});p("pt-BR",{flAdd:"Adicionar",flRemove:"Remover {row}",flUp:"Subir {row}",flDown:"Descer {row}",flEmpty:"Nada adicionado ainda",flMin:"Adicione pelo menos {n}",flMax:"No m\xE1ximo {n}"});var C=(a,t)=>t.split(".").reduce((e,o)=>e?.[o],a);function A(a,t,e){let o=t.split("."),s=o.pop();o.reduce((i,n)=>i[n]??={},a)[s]=e}var g=class extends m{baseCls="op-field op-fieldlist";rowsEl;addBtn;emptyEl;rows=[];syncing=!1;emptyValue(){return[]}isEmpty(t){return!t?.length}createControl(){return this.rowsEl=r("div","op-fieldlist__rows",{role:"group"}),this.emptyEl=r("div","op-fieldlist__empty",{},l("flEmpty")),this.addBtn=r("button","op-fieldlist__add",{type:"button"},u("plus"),r("span","",{},this.config.addText??l("flAdd"))),this.listen(this.addBtn,"click",()=>this.addRow()),this.inputEl=this.addBtn,r("div","op-fieldlist__box",{},this.rowsEl,this.emptyEl,this.addBtn)}onRender(){super.onRender(),this.rowsEl.setAttribute("aria-labelledby",this.el.querySelector(".op-field__label").id||=`${this.id}-label`)}label(t){return`${this.config.label??""} ${t+1}`.trim()}makeRow(t){let e=s=>{let i=s instanceof w?s.config:s,n={...i,...Array.isArray(i.items)?{items:i.items.map(e)}:{}};return s instanceof w?new s.constructor(n):n},o=new v({cls:"op-fieldlist__row",layout:this.config.rowLayout??{type:"hbox",align:"flex-start"},items:(this.config.items??[]).map(e)});for(let s of o.items)s.config.width!=null&&s.config.flex==null&&(s.config.flex="none");for(let s of this.rowFields(o)){let i=s.name?C(t,s.name):void 0;i!==void 0&&s.setValue(i,!0),s.on("change",()=>this.syncing||this.commitRows())}return o}rowFields(t){return t.query(e=>e instanceof m)}collect(){return this.rows.map(t=>{let e={};for(let o of this.rowFields(t))o.name&&A(e,o.name,o.getValue());return e})}commitRows(){this.commit(this.collect()),this.paintRows(),this.getError()&&this.validate()}paintRows(){if(!this.rendered)return;let{min:t=0,max:e=1/0,reorderable:o=!0}=this.config;this.rowsEl.replaceChildren(...this.rows.map((s,i)=>{let n=s.el;n.setAttribute("role","group"),n.setAttribute("aria-label",this.label(i)),n.classList.toggle("is-first",i===0),n.querySelector(":scope > .op-fieldlist__tools")?.remove();let d=(b,f,R,E)=>{let c=r("button","op-fieldlist__tool",{type:"button","data-act":f,"aria-label":l(f,{row:this.label(i)}),"data-op-tip":l(f,{row:this.label(i)})},u(b));return c.disabled=R||!!this.config.disabled||!!this.config.readonly,c.addEventListener("click",E),c},h=r("div","op-fieldlist__tools");return o&&h.append(d("chevron-up","flUp",i===0,()=>this.moveRow(i,i-1)),d("chevron-down","flDown",i===this.rows.length-1,()=>this.moveRow(i,i+1))),h.append(d("trash","flRemove",this.rows.length<=t,()=>this.removeRow(i))),n.append(h),n})),this.emptyEl.hidden=this.rows.length>0,this.el.classList.toggle("is-empty",!this.rows.length),this.addBtn.disabled=this.rows.length>=e||!!this.config.disabled||!!this.config.readonly}applyValue(t){this.syncing=!0,this.rows.forEach(o=>o.destroy()),this.rows=(t??[]).map(o=>this.makeRow(o)),this.syncing=!1;let e=this.isEqual(this.original,t);this.value=this.collect(),e&&(this.original=this.value),this.paintRows()}addRow(t){let e=this.config.max??1/0;if(this.rows.length>=e)return;let o=this.config.newRow;this.rows.push(this.makeRow(t??(typeof o=="function"?o():{...o}))),this.commitRows(),this.emit("add",this.rows.length-1),this.rowFields(this.rows[this.rows.length-1])[0]?.focus()}removeRow(t){if(!this.rows[t]||this.rows.length<=(this.config.min??0)||this.emit("before-remove",t)===!1)return;let[e]=this.rows.splice(t,1);e.destroy(),this.commitRows(),this.emit("remove",t);let o=this.rows[Math.min(t,this.rows.length-1)];o?this.rowFields(o)[0]?.focus():this.rendered&&this.addBtn.focus()}moveRow(t,e){if(!this.rows[t]||e<0||e>=this.rows.length||t===e)return;let[o]=this.rows.splice(t,1);this.rows.splice(e,0,o),this.commitRows(),this.emit("move",t,e);let s=["flUp","flDown"].map(i=>o.el.querySelector(`[data-act="${i}"]`));(e<t?s:s.reverse()).find(i=>i&&!i.disabled)?.focus()}getRows(){return this.rows}getRowFields(t){return this.rows[t]?this.rowFields(this.rows[t]):[]}setAddText(t){this.config.addText=t,this.rendered&&(this.addBtn.lastElementChild.textContent=t)}setMin(t){this.config.min=t,this.paintRows()}setMax(t){this.config.max=t,this.paintRows()}check(){let t=this.value?.length??0,{min:e=0,max:o=1/0}=this.config;return t&&t<e?l("flMin",{n:e}):t>o?l("flMax",{n:o}):super.check()}validate(){let t=this.rows.flatMap(e=>this.rowFields(e)).map(e=>e.validate()).every(Boolean);return super.validate()&&t}isValid(){return super.isValid()&&this.rows.every(t=>this.rowFields(t).every(e=>e.isValid()))}focus(){let t=this.rows.flatMap(e=>this.rowFields(e)).find(e=>e.getError());t?t.focus():this.addBtn?.focus()}onDisabled(t){this.rows.forEach(e=>e.setDisabled(t)),this.paintRows()}onReadonly(t){this.rows.forEach(e=>this.rowFields(e).forEach(o=>o.setReadonly(t))),this.paintRows()}onDestroy(){this.rows.forEach(t=>t.destroy()),super.onDestroy()}};y("fieldlist",g);export{g as a};
|
|
2
|
+
//# sourceMappingURL=chunk-LBJSMXLV.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/fieldlist/fieldlist.ts"],
|
|
4
|
+
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { Container } from '../../../core/container';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Component } from '../../../core/component';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', { flAdd: 'Add', flRemove: 'Remove {row}', flUp: 'Move {row} up', flDown: 'Move {row} down', flEmpty: 'Nothing added yet', flMin: 'Add at least {n}', flMax: 'At most {n}' });\naddMessages('pt-BR', { flAdd: 'Adicionar', flRemove: 'Remover {row}', flUp: 'Subir {row}', flDown: 'Descer {row}', flEmpty: 'Nada adicionado ainda', flMin: 'Adicione pelo menos {n}', flMax: 'No m\u00E1ximo {n}' });\n\ntype Row = Record<string, any>;\n\nexport interface FieldListConfig extends FieldConfig<Row[]> {\n /** The fields of one row (configs or instances such as `ui.text(...)`). Names are relative to the row (nested allowed). */\n items?: Array<AnyConfig | Component>;\n min?: number;\n max?: number;\n addText?: string;\n reorderable?: boolean;\n /** Values for a new row, or a function that returns them. */\n newRow?: Row | (() => Row);\n /** Layout of a row. Default `hbox` (the fields share the row). */\n rowLayout?: LayoutSpec;\n}\n\nconst getPath = (o: any, path: string) => path.split('.').reduce((v, k) => v?.[k], o);\nfunction setPath(o: any, path: string, value: unknown) {\n const keys = path.split('.');\n const last = keys.pop()!;\n keys.reduce((v, k) => (v[k] ??= {}), o)[last] = value;\n}\n\n/** A repeating block of fields: add, remove and reorder rows; the value is an array of row objects. */\nexport class FieldList extends Field<Row[], FieldListConfig> {\n protected override baseCls = 'op-field op-fieldlist';\n private rowsEl!: HTMLElement;\n private addBtn!: HTMLButtonElement;\n private emptyEl!: HTMLElement;\n private rows: Container[] = [];\n private syncing = false;\n\n protected override emptyValue(): Row[] {\n return [];\n }\n protected override isEmpty(v: Row[]): boolean {\n return !v?.length;\n }\n\n protected createControl() {\n this.rowsEl = h('div', 'op-fieldlist__rows', { role: 'group' });\n this.emptyEl = h('div', 'op-fieldlist__empty', {}, t('flEmpty'));\n this.addBtn = h('button', 'op-fieldlist__add', { type: 'button' }, iconEl('plus'), h('span', '', {}, this.config.addText ?? t('flAdd')));\n this.listen(this.addBtn, 'click', () => this.addRow());\n this.inputEl = this.addBtn;\n return h('div', 'op-fieldlist__box', {}, this.rowsEl, this.emptyEl, this.addBtn);\n }\n\n protected override onRender() {\n super.onRender();\n this.rowsEl.setAttribute('aria-labelledby', (this.el.querySelector('.op-field__label') as HTMLElement).id ||= `${this.id}-label`);\n }\n\n // ---- rows ---------------------------------------------------------------------------------\n\n private label(i: number): string {\n return `${this.config.label ?? ''} ${i + 1}`.trim();\n }\n\n private makeRow(values: Row): Container {\n // every row gets fresh fields: a config is copied, an instance (`ui.text(...)`) is rebuilt from a copy of its config\n const fresh = (c: AnyConfig | Component): AnyConfig | Component => {\n const cfg = (c instanceof Component ? c.config : c) as AnyConfig;\n const copy = { ...cfg, ...(Array.isArray(cfg.items) ? { items: (cfg.items as Array<AnyConfig | Component>).map(fresh) } : {}) };\n return c instanceof Component ? new (c.constructor as new (cfg: object) => Component)(copy) : copy;\n };\n const row = new Container({ cls: 'op-fieldlist__row', layout: this.config.rowLayout ?? { type: 'hbox', align: 'flex-start' }, items: (this.config.items ?? []).map(fresh) });\n for (const c of row.items) if (c.config.width != null && c.config.flex == null) c.config.flex = 'none'; // a set width is kept\n for (const f of this.rowFields(row)) {\n const v = f.name ? getPath(values, f.name) : undefined;\n if (v !== undefined) f.setValue(v, true);\n f.on('change', () => this.syncing || this.commitRows());\n }\n return row;\n }\n\n private rowFields(row: Container): Field<any>[] {\n return row.query((c) => c instanceof Field) as Field<any>[];\n }\n\n private collect(): Row[] {\n return this.rows.map((row) => {\n const out: Row = {};\n for (const f of this.rowFields(row)) if (f.name) setPath(out, f.name, f.getValue());\n return out;\n });\n }\n\n private commitRows() {\n this.commit(this.collect());\n this.paintRows();\n if (this.getError()) this.validate();\n }\n\n /** Puts every row in place: its group name, tools, and which tools are allowed. */\n private paintRows() {\n if (!this.rendered) return;\n const { min = 0, max = Infinity, reorderable = true } = this.config;\n this.rowsEl.replaceChildren(\n ...this.rows.map((row, i) => {\n const el = row.el;\n el.setAttribute('role', 'group');\n el.setAttribute('aria-label', this.label(i));\n el.classList.toggle('is-first', i === 0);\n el.querySelector(':scope > .op-fieldlist__tools')?.remove();\n const tool = (icon: string, key: string, disabled: boolean, run: () => void) => {\n const b = h('button', 'op-fieldlist__tool', { type: 'button', 'data-act': key, 'aria-label': t(key, { row: this.label(i) }), 'data-op-tip': t(key, { row: this.label(i) }) }, iconEl(icon));\n b.disabled = disabled || !!this.config.disabled || !!this.config.readonly;\n b.addEventListener('click', run);\n return b;\n };\n const tools = h('div', 'op-fieldlist__tools');\n if (reorderable) tools.append(tool('chevron-up', 'flUp', i === 0, () => this.moveRow(i, i - 1)), tool('chevron-down', 'flDown', i === this.rows.length - 1, () => this.moveRow(i, i + 1)));\n tools.append(tool('trash', 'flRemove', this.rows.length <= min, () => this.removeRow(i)));\n el.append(tools);\n return el;\n }),\n );\n this.emptyEl.hidden = this.rows.length > 0;\n this.el.classList.toggle('is-empty', !this.rows.length);\n this.addBtn.disabled = this.rows.length >= max || !!this.config.disabled || !!this.config.readonly;\n }\n\n protected applyValue(value: Row[]): void {\n this.syncing = true;\n this.rows.forEach((r) => r.destroy());\n this.rows = (value ?? []).map((v) => this.makeRow(v));\n this.syncing = false;\n const was = this.isEqual(this.original, value);\n this.value = this.collect(); // what the rows actually hold (a missing key becomes the field's empty value)\n if (was) this.original = this.value; // normalizing the starting value does not make the form dirty\n this.paintRows();\n }\n\n /** Adds a row (at the end) and focuses its first field. */\n addRow(values?: Row): void {\n const max = this.config.max ?? Infinity;\n if (this.rows.length >= max) return;\n const n = this.config.newRow;\n this.rows.push(this.makeRow(values ?? (typeof n === 'function' ? n() : { ...n })));\n this.commitRows();\n this.emit('add', this.rows.length - 1);\n this.rowFields(this.rows[this.rows.length - 1])[0]?.focus();\n }\n\n removeRow(index: number): void {\n if (!this.rows[index] || this.rows.length <= (this.config.min ?? 0) || this.emit('before-remove', index) === false) return;\n const [row] = this.rows.splice(index, 1);\n row.destroy();\n this.commitRows();\n this.emit('remove', index);\n const next = this.rows[Math.min(index, this.rows.length - 1)];\n if (next) this.rowFields(next)[0]?.focus();\n else if (this.rendered) this.addBtn.focus();\n }\n\n moveRow(from: number, to: number): void {\n if (!this.rows[from] || to < 0 || to >= this.rows.length || from === to) return;\n const [row] = this.rows.splice(from, 1);\n this.rows.splice(to, 0, row);\n this.commitRows();\n this.emit('move', from, to);\n // the focus follows the row: the same tool if it can still move that way, the other one at the end of the list\n const tools = ['flUp', 'flDown'].map((k) => row.el.querySelector<HTMLButtonElement>(`[data-act=\"${k}\"]`));\n (to < from ? tools : tools.reverse()).find((b) => b && !b.disabled)?.focus();\n }\n\n getRows(): Container[] {\n return this.rows;\n }\n getRowFields(index: number): Field<any>[] {\n return this.rows[index] ? this.rowFields(this.rows[index]) : [];\n }\n\n setAddText(text: string): void {\n this.config.addText = text;\n if (this.rendered) this.addBtn.lastElementChild!.textContent = text;\n }\n\n setMin(min: number): void {\n this.config.min = min;\n this.paintRows();\n }\n setMax(max: number): void {\n this.config.max = max;\n this.paintRows();\n }\n\n // ---- validation ---------------------------------------------------------------------------\n\n protected override check(): string {\n const n = this.value?.length ?? 0;\n const { min = 0, max = Infinity } = this.config;\n if (n && n < min) return t('flMin', { n: min });\n if (n > max) return t('flMax', { n: max });\n return super.check();\n }\n\n /** Validates every row too; the list is valid when its own rules and every field inside pass. */\n override validate(): boolean {\n const inner = this.rows.flatMap((r) => this.rowFields(r)).map((f) => f.validate()).every(Boolean);\n return super.validate() && inner;\n }\n\n override isValid(): boolean {\n return super.isValid() && this.rows.every((r) => this.rowFields(r).every((f) => f.isValid()));\n }\n\n /** The first invalid field inside, or the add button. */\n override focus(): void {\n const bad = this.rows.flatMap((r) => this.rowFields(r)).find((f) => f.getError());\n if (bad) bad.focus();\n else this.addBtn?.focus();\n }\n\n protected override onDisabled(disabled: boolean) {\n this.rows.forEach((r) => r.setDisabled(disabled));\n this.paintRows();\n }\n protected override onReadonly(readonly: boolean) {\n this.rows.forEach((r) => this.rowFields(r).forEach((f) => f.setReadonly(readonly)));\n this.paintRows();\n }\n\n protected override onDestroy(): void {\n this.rows.forEach((r) => r.destroy());\n super.onDestroy();\n }\n}\nregister('fieldlist', FieldList);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "getPath", "o", "path", "v", "k", "setPath", "value", "keys", "last", "FieldList", "Field", "h", "t", "iconEl", "i", "values", "fresh", "c", "cfg", "Component", "copy", "row", "Container", "f", "out", "min", "max", "reorderable", "el", "tool", "icon", "key", "disabled", "run", "b", "tools", "r", "was", "n", "index", "next", "from", "to", "text", "inner", "bad", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as c}from"./chunk-GNU4VOOE.js";import{c as h}from"./chunk-ZWNQREWS.js";import{a as b}from"./chunk-2ZUZ5HDL.js";import{c as a}from"./chunk-4EZJ5FKJ.js";import{b as i,c as r}from"./chunk-PZSHOSOS.js";import{a as p}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-MW3RWBZ7.js";var d=class extends h{baseCls="op-panel";headerEl;titleEl;bodyEl;toolsEl;iconHost;toggleBtn;bars=[];bodyId=r("op-body");titleId=r("op-title");getBody(){return this.bodyEl}build(){let e=this.config,t=i("div",this.baseCls,{role:"region","aria-labelledby":this.titleId});this.iconHost=i("span","op-panel__icon"),this.titleEl=i("span","op-panel__title",{id:this.titleId}),this.toolsEl=i("div","op-panel__tools"),this.headerEl=i("div","op-panel__header",{},this.iconHost,this.titleEl,this.toolsEl),this.bodyEl=i("div",`op-panel__body ${e.bodyCls??""}`,{id:this.bodyId}),t.append(this.headerEl);let o=(s,f)=>{let n=new c({items:s,cls:f});return n.parent=this,this.bars.push(n),n.el};return e.tbar&&t.append(o(e.tbar,"op-panel__tbar")),t.append(this.bodyEl),e.bbar&&t.append(o(e.bbar,"op-panel__bbar")),e.buttons&&t.append(o(["->",...e.buttons.map(s=>new b(s))],"op-panel__footer")),t}onRender(){super.onRender();let e=this.config;this.setTitle(e.title??""),this.setIcon(e.icon??"");for(let t of e.tools??[])this.addTool(t.icon,t.label,o=>t.handler?.(this,o));e.reloadable&&this.addTool("refresh",l("reload"),()=>{this.reload()}),e.collapsible&&(this.toggleBtn=this.addTool("chevron-up",l("collapse"),()=>this.toggle()),this.toggleBtn.setAttribute("aria-controls",this.bodyId),this.el.classList.add("op-panel--collapsible"),this.listen(this.titleEl,"click",()=>this.toggle())),e.closable&&this.addTool("x",l("close"),()=>this.close()),this.setCollapsed(!!e.collapsed),this.updateHeader()}addTool(e,t,o){let s=i("button","op-panel__tool",{type:"button","aria-label":t,"data-op-tip":t},a(e));return this.listen(s,"click",o),this.toolsEl.append(s),s}updateHeader(){let e=this.config;this.headerEl.hidden=!e.title&&!e.icon&&!e.collapsible&&!e.closable&&!e.reloadable&&!e.tools?.length}async reload(){let e=this.el;return e.classList.contains("is-reloading")||this.emit("before-reload")===!1?!1:(e.classList.add("is-reloading"),this.setLoading(!0),await Promise.resolve(this.config.onReload?.(this)).catch(()=>0),this.setLoading(!1),e.classList.remove("is-reloading"),this.emit("reload"),!0)}setTitle(e){this.config.title=e,this.rendered&&(this.titleEl.textContent=e,this.updateHeader())}setIcon(e){this.config.icon=e,this.rendered&&(this.iconHost.replaceChildren(...e?[a(e)]:[]),this.iconHost.hidden=!e,this.updateHeader())}setCollapsed(e){if(this.config.collapsed=e,!!this.rendered){this.el.classList.toggle("is-collapsed",e);for(let t of[this.bodyEl,...this.bars.map(o=>o.el)])t.hidden=e;this.toggleBtn&&(this.toggleBtn.setAttribute("aria-expanded",String(!e)),this.toggleBtn.setAttribute("aria-label",l(e?"expand":"collapse")))}}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}close(){this.emit("before-close")!==!1&&(this.emit("close"),this.config.closeAction==="hide"?this.hide():this.destroy())}onDestroy(){super.onDestroy(),this.bars.forEach(e=>e.destroy())}};p("panel",d);export{d as a};
|
|
2
|
+
//# sourceMappingURL=chunk-LQRFNQ2N.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/layout/panel/panel.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport './reload';\nimport { register } from '../../../core/registry';\nimport { h, uid } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\nimport { Toolbar, type ToolbarConfig } from '../toolbar/toolbar';\nimport { Button } from '../../base/button/button';\nimport type { ButtonConfig } from '../../base/button/button';\n\nexport interface PanelTool {\n icon: string;\n label: string;\n handler?: (panel: Panel, ev: MouseEvent) => void;\n}\n\nexport interface PanelConfig extends ContainerConfig {\n title?: string;\n icon?: string;\n collapsible?: boolean;\n collapsed?: boolean;\n closable?: boolean;\n closeAction?: 'destroy' | 'hide';\n /** A \u21BB button in the header that calls `onReload` (a Promise shows the loading mask until it settles). */\n reloadable?: boolean;\n onReload?: (panel: Panel) => void | Promise<unknown>;\n tools?: PanelTool[];\n tbar?: ToolbarConfig['items'];\n bbar?: ToolbarConfig['items'];\n buttons?: ButtonConfig[];\n bodyCls?: string;\n}\n\nexport class Panel<C extends PanelConfig = PanelConfig> extends Container<C> {\n protected override baseCls = 'op-panel';\n protected headerEl!: HTMLElement;\n protected titleEl!: HTMLElement;\n protected bodyEl!: HTMLElement;\n private toolsEl!: HTMLElement;\n private iconHost!: HTMLElement;\n private toggleBtn?: HTMLButtonElement;\n private bars: Toolbar[] = [];\n private bodyId = uid('op-body');\n private titleId = uid('op-title');\n\n override getBody() {\n return this.bodyEl;\n }\n\n protected override build() {\n const c = this.config;\n const el = h('div', this.baseCls, { role: 'region', 'aria-labelledby': this.titleId });\n this.iconHost = h('span', 'op-panel__icon');\n this.titleEl = h('span', 'op-panel__title', { id: this.titleId });\n this.toolsEl = h('div', 'op-panel__tools');\n this.headerEl = h('div', 'op-panel__header', {}, this.iconHost, this.titleEl, this.toolsEl);\n this.bodyEl = h('div', `op-panel__body ${c.bodyCls ?? ''}`, { id: this.bodyId });\n el.append(this.headerEl);\n const bar = (cfg: ToolbarConfig['items'], cls: string) => {\n const tb = new Toolbar({ items: cfg, cls });\n tb.parent = this;\n this.bars.push(tb);\n return tb.el;\n };\n if (c.tbar) el.append(bar(c.tbar, 'op-panel__tbar'));\n el.append(this.bodyEl);\n if (c.bbar) el.append(bar(c.bbar, 'op-panel__bbar'));\n if (c.buttons) el.append(bar(['->', ...c.buttons.map((b) => new Button(b))], 'op-panel__footer'));\n return el;\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.setTitle(c.title ?? '');\n this.setIcon(c.icon ?? '');\n for (const tool of c.tools ?? []) this.addTool(tool.icon, tool.label, (e) => tool.handler?.(this, e));\n if (c.reloadable) this.addTool('refresh', t('reload'), () => void this.reload());\n if (c.collapsible) {\n this.toggleBtn = this.addTool('chevron-up', t('collapse'), () => this.toggle());\n this.toggleBtn.setAttribute('aria-controls', this.bodyId);\n this.el.classList.add('op-panel--collapsible');\n this.listen(this.titleEl, 'click', () => this.toggle());\n }\n if (c.closable) this.addTool('x', t('close'), () => this.close());\n this.setCollapsed(!!c.collapsed);\n this.updateHeader();\n }\n\n private addTool(icon: string, label: string, onClick: (e: MouseEvent) => void) {\n const b = h('button', 'op-panel__tool', { type: 'button', 'aria-label': label, 'data-op-tip': label }, iconEl(icon));\n this.listen(b, 'click', onClick);\n this.toolsEl.append(b);\n return b;\n }\n\n private updateHeader() {\n const c = this.config;\n this.headerEl.hidden = !c.title && !c.icon && !c.collapsible && !c.closable && !c.reloadable && !c.tools?.length;\n }\n\n /** Runs `onReload` (`before-reload` can cancel); a returned Promise keeps the loading mask (and a turning \u21BB) until it settles. */\n async reload(): Promise<boolean> {\n const el = this.el;\n if (el.classList.contains('is-reloading') || this.emit('before-reload') === false) return false;\n el.classList.add('is-reloading');\n this.setLoading(true);\n await Promise.resolve(this.config.onReload?.(this)).catch(() => 0);\n this.setLoading(false);\n el.classList.remove('is-reloading');\n this.emit('reload');\n return true;\n }\n\n setTitle(title: string) {\n this.config.title = title;\n if (!this.rendered) return;\n this.titleEl.textContent = title;\n this.updateHeader();\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.updateHeader();\n }\n\n /** Collapses/expands without events. Use `collapse()`/`expand()` for the full behavior. */\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!this.rendered) return;\n this.el.classList.toggle('is-collapsed', collapsed);\n for (const e of [this.bodyEl, ...this.bars.map((b) => b.el)]) e.hidden = collapsed;\n if (this.toggleBtn) {\n this.toggleBtn.setAttribute('aria-expanded', String(!collapsed));\n this.toggleBtn.setAttribute('aria-label', t(collapsed ? 'expand' : 'collapse'));\n }\n }\n\n collapse() {\n if (this.config.collapsed || this.emit('before-collapse') === false) return;\n this.setCollapsed(true);\n this.emit('collapse');\n }\n expand() {\n if (!this.config.collapsed || this.emit('before-expand') === false) return;\n this.setCollapsed(false);\n this.emit('expand');\n }\n toggle() {\n if (this.config.collapsed) this.expand();\n else this.collapse();\n }\n\n close() {\n if (this.emit('before-close') === false) return;\n this.emit('close');\n if (this.config.closeAction === 'hide') this.hide();\n else this.destroy();\n }\n\n protected override onDestroy() {\n super.onDestroy();\n this.bars.forEach((b) => b.destroy());\n }\n}\nregister('panel', Panel);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Panel", "Container", "uid", "c", "el", "h", "bar", "cfg", "cls", "tb", "Toolbar", "b", "Button", "tool", "e", "t", "icon", "label", "onClick", "iconEl", "title", "name", "collapsed", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{d as o}from"./chunk-MW3RWBZ7.js";var n=()=>o()._lang,a=(t,e)=>{if(t==null||t==="")return"";let r=t instanceof Date?t:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?new Date(+t.slice(0,4),+t.slice(5,7)-1,+t.slice(8,10)):new Date(t);return isNaN(+r)?String(t):new Intl.DateTimeFormat(n(),e).format(r)},i={number:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(n(),e).format(t),money:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(n(),{style:"currency",currency:o()._currency,...e}).format(t),percent:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(n(),{style:"percent",maximumFractionDigits:1,...e}).format(t),date:(t,e)=>a(t,{dateStyle:"medium",...e}),datetime:(t,e)=>a(t,{dateStyle:"medium",timeStyle:"short",...e}),bool:t=>t?"\u2713":""};function s(t,e){i[t]=e}function m(t,e){let r=typeof t=="function"?t:i[t];if(!r)throw new Error(`Optikos: unknown format "${t}"`);return r(e)}function c(t,e){let r=e.data[t.field];return t.renderer?t.renderer(r,e,t):t.format?m(t.format,r):r==null?"":String(r)}export{s as a,m as b,c};
|
|
2
|
+
//# sourceMappingURL=chunk-LW2WRUVL.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/data/format.ts", "../src/data/column.ts"],
|
|
4
|
-
"sourcesContent": ["import { getLocale } from '../core/i18n';\n\nexport type Formatter = (value: any, options?: Record<string, any>) => string;\n\nconst lang = () => getLocale()._lang;\nconst date = (v: any, opts: Intl.DateTimeFormatOptions) => {\n if (v == null || v === '') return '';\n // ISO dates without time are local dates, not UTC.\n const d = v instanceof Date ? v : typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? new Date(+v.slice(0, 4), +v.slice(5, 7) - 1, +v.slice(8, 10)) : new Date(v);\n return isNaN(+d) ? String(v) : new Intl.DateTimeFormat(lang(), opts).format(d);\n};\n\nconst formats: Record<string, Formatter> = {\n number: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), o).format(v)),\n money: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'currency', currency: getLocale()._currency, ...o }).format(v)),\n percent: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'percent', maximumFractionDigits: 1, ...o }).format(v)),\n date: (v, o) => date(v, { dateStyle: 'medium', ...o }),\n datetime: (v, o) => date(v, { dateStyle: 'medium', timeStyle: 'short', ...o }),\n bool: (v) => (v ? '\u2713' : ''),\n};\n\n/** Registers a named formatter, usable as `format: 'name'` in columns. */\nexport function registerFormat(name: string, fn: Formatter): void {\n formats[name] = fn;\n}\n\nexport function format(fmt: string | Formatter, value: unknown): string {\n const fn = typeof fmt === 'function' ? fmt : formats[fmt];\n if (!fn) throw new Error(`Optikos: unknown format \"${fmt}\"`);\n return fn(value);\n}\n", "import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\nexport interface Column {\n field: string;\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model
|
|
5
|
-
"mappings": "wCAIA,IAAMA,EAAO,IAAMC,EAAU,EAAE,MACzBC,EAAO,CAACC,EAAQC,IAAqC,CACzD,GAAID,GAAK,MAAQA,IAAM,GAAI,MAAO,GAElC,IAAME,EAAIF,aAAa,KAAOA,EAAI,OAAOA,GAAM,UAAY,sBAAsB,KAAKA,CAAC,EAAI,IAAI,KAAK,CAACA,EAAE,MAAM,EAAG,CAAC,EAAG,CAACA,EAAE,MAAM,EAAG,CAAC,EAAI,EAAG,CAACA,EAAE,MAAM,EAAG,EAAE,CAAC,EAAI,IAAI,KAAKA,CAAC,EACrK,OAAO,MAAM,CAACE,CAAC,EAAI,OAAOF,CAAC,EAAI,IAAI,KAAK,eAAeH,EAAK,EAAGI,CAAI,EAAE,OAAOC,CAAC,CAC/E,EAEMC,EAAqC,CACzC,OAAQ,CAACH,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAGO,CAAC,EAAE,OAAOJ,CAAC,EACzF,MAAO,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,WAAY,SAAUC,EAAU,EAAE,UAAW,GAAGM,CAAE,CAAC,EAAE,OAAOJ,CAAC,EACnJ,QAAS,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,UAAW,sBAAuB,EAAG,GAAGO,CAAE,CAAC,EAAE,OAAOJ,CAAC,EAC7I,KAAM,CAACA,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,GAAGI,CAAE,CAAC,EACrD,SAAU,CAACJ,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,UAAW,QAAS,GAAGI,CAAE,CAAC,EAC7E,KAAOJ,GAAOA,EAAI,SAAM,EAC1B,EAGO,SAASK,EAAeC,EAAcC,EAAqB,CAChEJ,EAAQG,CAAI,EAAIC,CAClB,CAEO,SAASC,EAAOC,EAAyBC,EAAwB,CACtE,IAAMH,EAAK,OAAOE,GAAQ,WAAaA,EAAMN,EAAQM,CAAG,EACxD,GAAI,CAACF,EAAI,MAAM,IAAI,MAAM,4BAA4BE,CAAG,GAAG,EAC3D,OAAOF,EAAGG,CAAK,CACjB,
|
|
4
|
+
"sourcesContent": ["import { getLocale } from '../core/i18n';\n\nexport type Formatter = (value: any, options?: Record<string, any>) => string;\n\nconst lang = () => getLocale()._lang;\nconst date = (v: any, opts: Intl.DateTimeFormatOptions) => {\n if (v == null || v === '') return '';\n // ISO dates without time are local dates, not UTC.\n const d = v instanceof Date ? v : typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? new Date(+v.slice(0, 4), +v.slice(5, 7) - 1, +v.slice(8, 10)) : new Date(v);\n return isNaN(+d) ? String(v) : new Intl.DateTimeFormat(lang(), opts).format(d);\n};\n\nconst formats: Record<string, Formatter> = {\n number: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), o).format(v)),\n money: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'currency', currency: getLocale()._currency, ...o }).format(v)),\n percent: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'percent', maximumFractionDigits: 1, ...o }).format(v)),\n date: (v, o) => date(v, { dateStyle: 'medium', ...o }),\n datetime: (v, o) => date(v, { dateStyle: 'medium', timeStyle: 'short', ...o }),\n bool: (v) => (v ? '\u2713' : ''),\n};\n\n/** Registers a named formatter, usable as `format: 'name'` in columns. */\nexport function registerFormat(name: string, fn: Formatter): void {\n formats[name] = fn;\n}\n\nexport function format(fmt: string | Formatter, value: unknown): string {\n const fn = typeof fmt === 'function' ? fmt : formats[fmt];\n if (!fn) throw new Error(`Optikos: unknown format \"${fmt}\"`);\n return fn(value);\n}\n", "import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\n/** A grid/table column. `T` is the record shape: `field` then autocompletes its keys (any string still works). */\nexport interface Column<T extends Record<string, any> = any> {\n field: Extract<keyof T, string> | (string & {});\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model<T>, col: Column<T>) => string | Node;\n cls?: string;\n /** With the `cellEditing()` grid plugin: `true` (an editor for the value's type), a field type (`'select'`) or a field config. */\n editor?: boolean | string | Record<string, any>;\n /** With `cellEditing()`: whether this record's cell can be edited (default: every record, when `editor` is set). */\n editable?: (rec: Model<T>) => boolean;\n}\n\n/** Cell content for a record: `renderer` first, then `format`, then the plain value. */\nexport function cellContent<T extends Record<string, any>>(col: Column<T>, rec: Model<T>): string | Node {\n const v = rec.data[col.field];\n if (col.renderer) return col.renderer(v, rec, col);\n if (col.format) return format(col.format, v);\n return v == null ? '' : String(v);\n}\n"],
|
|
5
|
+
"mappings": "wCAIA,IAAMA,EAAO,IAAMC,EAAU,EAAE,MACzBC,EAAO,CAACC,EAAQC,IAAqC,CACzD,GAAID,GAAK,MAAQA,IAAM,GAAI,MAAO,GAElC,IAAME,EAAIF,aAAa,KAAOA,EAAI,OAAOA,GAAM,UAAY,sBAAsB,KAAKA,CAAC,EAAI,IAAI,KAAK,CAACA,EAAE,MAAM,EAAG,CAAC,EAAG,CAACA,EAAE,MAAM,EAAG,CAAC,EAAI,EAAG,CAACA,EAAE,MAAM,EAAG,EAAE,CAAC,EAAI,IAAI,KAAKA,CAAC,EACrK,OAAO,MAAM,CAACE,CAAC,EAAI,OAAOF,CAAC,EAAI,IAAI,KAAK,eAAeH,EAAK,EAAGI,CAAI,EAAE,OAAOC,CAAC,CAC/E,EAEMC,EAAqC,CACzC,OAAQ,CAACH,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAGO,CAAC,EAAE,OAAOJ,CAAC,EACzF,MAAO,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,WAAY,SAAUC,EAAU,EAAE,UAAW,GAAGM,CAAE,CAAC,EAAE,OAAOJ,CAAC,EACnJ,QAAS,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,UAAW,sBAAuB,EAAG,GAAGO,CAAE,CAAC,EAAE,OAAOJ,CAAC,EAC7I,KAAM,CAACA,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,GAAGI,CAAE,CAAC,EACrD,SAAU,CAACJ,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,UAAW,QAAS,GAAGI,CAAE,CAAC,EAC7E,KAAOJ,GAAOA,EAAI,SAAM,EAC1B,EAGO,SAASK,EAAeC,EAAcC,EAAqB,CAChEJ,EAAQG,CAAI,EAAIC,CAClB,CAEO,SAASC,EAAOC,EAAyBC,EAAwB,CACtE,IAAMH,EAAK,OAAOE,GAAQ,WAAaA,EAAMN,EAAQM,CAAG,EACxD,GAAI,CAACF,EAAI,MAAM,IAAI,MAAM,4BAA4BE,CAAG,GAAG,EAC3D,OAAOF,EAAGG,CAAK,CACjB,CCGO,SAASC,EAA2CC,EAAgBC,EAA8B,CACvG,IAAMC,EAAID,EAAI,KAAKD,EAAI,KAAK,EAC5B,OAAIA,EAAI,SAAiBA,EAAI,SAASE,EAAGD,EAAKD,CAAG,EAC7CA,EAAI,OAAeG,EAAOH,EAAI,OAAQE,CAAC,EACpCA,GAAK,KAAO,GAAK,OAAOA,CAAC,CAClC",
|
|
6
6
|
"names": ["lang", "getLocale", "date", "v", "opts", "d", "formats", "o", "registerFormat", "name", "fn", "format", "fmt", "value", "cellContent", "col", "rec", "v", "format"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as f}from"./chunk-ZVK4L5GK.js";import{c as m}from"./chunk-OEAXCCVM.js";import{e as p}from"./chunk-4AA4FQEM.js";import{a as c}from"./chunk-A2NKDOYN.js";import{b as a}from"./chunk-PZSHOSOS.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-MW3RWBZ7.js";var h=class extends c{baseCls="op-dataview";store;itemsEl;emptyEl;pager;selected=new Set;active=0;anchor=-1;offStore;build(){let t=this.config,e=a("div",this.baseCls,{role:"listbox","aria-multiselectable":t.selection==="multi"?"true":null});return this.itemsEl=a("div","op-dataview__items"),this.emptyEl=a("div","op-dataview__empty"),e.append(this.itemsEl,this.emptyEl),t.itemWidth&&e.style.setProperty("--op-dataview-item-width",t.itemWidth),t.gap&&e.style.setProperty("--op-dataview-gap",t.gap),t.paging&&(this.pager=new f({cls:"op-dataview__pager"}),e.append(this.pager.el)),e}onRender(){let t=this.config;this.bindStore(t.store??new m({data:t.data??[]})),this.listen(this.itemsEl,"click",e=>this.onClick(e,"item-click")),this.listen(this.itemsEl,"dblclick",e=>this.onClick(e,"item-dblclick")),this.listen(this.itemsEl,"keydown",e=>this.onKey(e)),this.listen(this.itemsEl,"focusin",e=>{let i=this.indexOf(e);i>=0&&this.setActive(i,!1)}),this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(t.pageSize??24)),this.own(()=>this.pager?.destroy()),this.paint(!0)}notifyMount(){super.notifyMount(),this.pager?.notifyMount()}bindStore(t){this.offStore?.(),this.store=t;let e=t.subscribe(s=>this.rendered&&this.paint(["load","page","filter","sort"].includes(s.type))),i=t.on("loading",s=>this.setLoading(s));this.offStore=()=>(e(),i()),this.own(()=>this.offStore?.())}setStore(t){this.config.store=t,this.selected.clear(),this.active=0,this.rendered&&(this.bindStore(t),this.pager?.setStore(t),this.paint())}getStore(){return this.render(),this.store}paint(t=!1){let e=this.config;for(let s of this.selected)this.store.indexOf(s)<0&&this.selected.delete(s);this.active=Math.min(this.active,Math.max(0,this.store.count-1));let i=e.selection??"single";this.itemsEl.replaceChildren(...this.store.getRange().map((s,o)=>{let n=a("div",`op-dataview__item${this.selected.has(s)?" is-selected":""}${o===this.active?" is-active":""}${e.itemCls?` ${e.itemCls(s)}`:""}`,{role:"option",id:`${this.id}-i${o}`,"data-i":o,tabindex:o===this.active?0:-1,"aria-selected":i==="none"?null:String(this.selected.has(s))});return n.append(e.renderer(s,o)),n})),t&&e.stagger!==!1&&p(this.items(),{dy:8}),this.emptyEl.textContent=e.emptyText??l("empty"),this.emptyEl.hidden=this.store.count>0,this.el.classList.toggle("is-empty",this.store.count===0)}refresh(){this.rendered&&this.paint()}items(){return Array.from(this.itemsEl.children)}indexOf(t){let e=t.target.closest(".op-dataview__item");return e?Number(e.dataset.i):-1}columns(){let t=this.items();return t.length?Math.max(1,t.filter(e=>e.offsetTop===t[0].offsetTop).length):1}getSelection(){return[...this.selected]}select(t,e={}){let i=typeof t=="number"?this.store.getAt(t):t,s=this.config.selection??"single";!i||s==="none"||((s==="single"||!e.add)&&this.selected.clear(),this.selected.add(i),this.changed())}selectAll(){this.config.selection==="multi"&&(this.store.each(t=>this.selected.add(t)),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.paintSelection(),this.emit("select",this.getSelection())}paintSelection(){this.items().forEach((t,e)=>{let i=this.selected.has(this.store.getAt(e));t.classList.toggle("is-selected",i),(this.config.selection??"single")!=="none"&&t.setAttribute("aria-selected",String(i))})}pick(t,e){let i=this.config.selection??"single",s=this.store.getAt(t);if(!(!s||i==="none")){if(i==="multi"&&e.shiftKey&&this.anchor>=0){this.selected.clear();for(let o of this.store.getRange(Math.min(this.anchor,t),Math.max(this.anchor,t)+1))this.selected.add(o)}else i==="multi"&&(e.ctrlKey||e.metaKey)?(this.selected.delete(s)||this.selected.add(s),this.anchor=t):(this.selected.clear(),this.selected.add(s),this.anchor=t);this.changed()}}onClick(t,e){let i=this.indexOf(t),s=this.store.getAt(i);if(!s)return;let o=t.target.closest("[data-op-action]");if(o){e==="item-click"&&this.emit("item-action",o.dataset.opAction,s,t);return}e==="item-click"&&(this.setActive(i,!1),this.pick(i,t)),this.emit(e,s,i,t)}setActive(t,e=!0){this.active=t,this.items().forEach((i,s)=>{i.tabIndex=s===t?0:-1,i.classList.toggle("is-active",s===t)}),e&&this.items()[t]?.focus(),this.emit("active-change",t)}focusItem(t){this.render(),this.setActive(Math.max(0,Math.min(t,this.store.count-1)))}onKey(t){let e=this.store.count;if(!e)return;let i=this.columns(),s=Math.max(1,Math.floor(this.el.clientHeight/Math.max(1,this.items()[0]?.offsetHeight??1))||3),o=this.active,n={ArrowRight:Math.min(e-1,o+1),ArrowLeft:Math.max(0,o-1),ArrowDown:Math.min(e-1,o+i),ArrowUp:Math.max(0,o-i),Home:0,End:e-1,PageDown:Math.min(e-1,o+i*s),PageUp:Math.max(0,o-i*s)},r=this.config.selection??"single";t.key in n?(t.preventDefault(),this.setActive(n[t.key]),r==="multi"&&t.shiftKey?this.pick(n[t.key],{shiftKey:!0}):r==="single"&&!t.ctrlKey&&this.pick(n[t.key],{}),r==="multi"&&t.shiftKey&&this.anchor<0&&(this.anchor=o)):t.key===" "?(t.preventDefault(),this.pick(o,r==="multi"?{ctrlKey:!0}:{})):t.key==="Enter"?this.emit("item-activate",this.store.getAt(o),o):(t.key==="a"||t.key==="A")&&(t.ctrlKey||t.metaKey)&&r==="multi"&&(t.preventDefault(),this.selectAll())}onDestroy(){this.pager?.destroy()}};d("dataview",h);export{h as a};
|
|
2
|
+
//# sourceMappingURL=chunk-M242VYZA.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/data/dataview/dataview.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport { Pagination } from '../pagination/pagination';\nimport { stagger } from '../../../motion/core';\n\nexport interface DataViewConfig extends ComponentConfig {\n store?: Store<any>;\n /** Used when no `store` is given. */\n data?: Record<string, any>[];\n /** What one item shows. Text is escaped; return a Node for markup. */\n renderer: (rec: Model, index: number) => string | Node;\n selection?: 'none' | 'single' | 'multi';\n /** Minimum item width (CSS length): the columns adapt to the room there is. Default `10rem`. */\n itemWidth?: string;\n gap?: string;\n itemCls?: (rec: Model) => string;\n emptyText?: string;\n /** Items enter one after the other (30 ms apart, motion rule 3) when the data loads, the page or filter changes. Default true. */\n stagger?: boolean;\n /** A Pagination bar bound to the store. */\n paging?: boolean;\n pageSize?: number;\n}\n\n/** A Store as a responsive grid of cards: selection, 2-D keyboard navigation, per-item actions and optional paging. */\nexport class DataView extends Component<DataViewConfig> {\n protected override baseCls = 'op-dataview';\n private store!: Store<any>;\n private itemsEl!: HTMLElement;\n private emptyEl!: HTMLElement;\n private pager?: Pagination;\n private selected = new Set<Model>();\n private active = 0;\n private anchor = -1;\n private offStore?: () => void;\n\n protected override build() {\n const c = this.config;\n const el = h('div', this.baseCls, { role: 'listbox', 'aria-multiselectable': c.selection === 'multi' ? 'true' : null });\n this.itemsEl = h('div', 'op-dataview__items');\n this.emptyEl = h('div', 'op-dataview__empty');\n el.append(this.itemsEl, this.emptyEl);\n if (c.itemWidth) el.style.setProperty('--op-dataview-item-width', c.itemWidth);\n if (c.gap) el.style.setProperty('--op-dataview-gap', c.gap);\n if (c.paging) {\n this.pager = new Pagination({ cls: 'op-dataview__pager' });\n el.append(this.pager.el);\n }\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.bindStore(c.store ?? new Store({ data: c.data ?? [] }));\n this.listen(this.itemsEl, 'click', (e: MouseEvent) => this.onClick(e, 'item-click'));\n this.listen(this.itemsEl, 'dblclick', (e: MouseEvent) => this.onClick(e, 'item-dblclick'));\n this.listen(this.itemsEl, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.itemsEl, 'focusin', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0) this.setActive(i, false);\n });\n if (this.pager) {\n this.pager.setStore(this.store);\n if (!this.store.pageSize) this.store.setPageSize(c.pageSize ?? 24);\n }\n this.own(() => this.pager?.destroy());\n this.paint(true);\n }\n\n override notifyMount() {\n super.notifyMount();\n this.pager?.notifyMount();\n }\n\n // ---- store -----------------------------------------------------------------------------------\n\n private bindStore(store: Store<any>) {\n this.offStore?.();\n this.store = store;\n const a = store.subscribe((c) => this.rendered && this.paint(['load', 'page', 'filter', 'sort'].includes(c.type)));\n const b = store.on('loading', (on: boolean) => this.setLoading(on));\n this.offStore = () => (a(), b());\n this.own(() => this.offStore?.());\n }\n\n setStore(store: Store<any>) {\n this.config.store = store;\n this.selected.clear();\n this.active = 0;\n if (!this.rendered) return;\n this.bindStore(store);\n this.pager?.setStore(store);\n this.paint();\n }\n getStore(): Store<any> {\n this.render();\n return this.store;\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint(animate = false) {\n const c = this.config;\n for (const r of this.selected) if (this.store.indexOf(r) < 0) this.selected.delete(r);\n this.active = Math.min(this.active, Math.max(0, this.store.count - 1));\n const mode = c.selection ?? 'single';\n this.itemsEl.replaceChildren(\n ...this.store.getRange().map((rec, i) => {\n const item = h('div', `op-dataview__item${this.selected.has(rec) ? ' is-selected' : ''}${i === this.active ? ' is-active' : ''}${c.itemCls ? ` ${c.itemCls(rec)}` : ''}`, {\n role: 'option', id: `${this.id}-i${i}`, 'data-i': i, tabindex: i === this.active ? 0 : -1, 'aria-selected': mode === 'none' ? null : String(this.selected.has(rec)),\n });\n item.append(c.renderer(rec, i));\n return item;\n }),\n );\n if (animate && c.stagger !== false) void stagger(this.items(), { dy: 8 });\n this.emptyEl.textContent = c.emptyText ?? t('empty');\n this.emptyEl.hidden = this.store.count > 0;\n this.el.classList.toggle('is-empty', this.store.count === 0);\n }\n\n /** Redraws the items (after a field of a record changed). */\n refresh() {\n if (this.rendered) this.paint();\n }\n\n private items(): HTMLElement[] {\n return Array.from(this.itemsEl.children) as HTMLElement[];\n }\n private indexOf(e: Event): number {\n const el = (e.target as HTMLElement).closest<HTMLElement>('.op-dataview__item');\n return el ? Number(el.dataset.i) : -1;\n }\n\n /** How many items fit in a row now (items that share the first one's top edge). */\n columns(): number {\n const els = this.items();\n if (!els.length) return 1;\n return Math.max(1, els.filter((el) => el.offsetTop === els[0].offsetTop).length);\n }\n\n // ---- selection -------------------------------------------------------------------------------\n\n getSelection(): Model[] {\n return [...this.selected];\n }\n\n select(target: Model | number, opts: { add?: boolean } = {}) {\n const rec = typeof target === 'number' ? this.store.getAt(target) : target;\n const mode = this.config.selection ?? 'single';\n if (!rec || mode === 'none') return;\n if (mode === 'single' || !opts.add) this.selected.clear();\n this.selected.add(rec);\n this.changed();\n }\n selectAll() {\n if (this.config.selection !== 'multi') return;\n this.store.each((r) => this.selected.add(r));\n this.changed();\n }\n deselectAll() {\n if (!this.selected.size) return;\n this.selected.clear();\n this.changed();\n }\n\n private changed() {\n this.paintSelection();\n this.emit('select', this.getSelection());\n }\n private paintSelection() {\n this.items().forEach((el, i) => {\n const on = this.selected.has(this.store.getAt(i)!);\n el.classList.toggle('is-selected', on);\n if ((this.config.selection ?? 'single') !== 'none') el.setAttribute('aria-selected', String(on));\n });\n }\n\n /** Click semantics: plain = replace, Ctrl/\u2318 = toggle, Shift = range from the anchor (multi only). */\n private pick(i: number, e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean }) {\n const mode = this.config.selection ?? 'single';\n const rec = this.store.getAt(i);\n if (!rec || mode === 'none') return;\n if (mode === 'multi' && e.shiftKey && this.anchor >= 0) {\n this.selected.clear();\n for (const r of this.store.getRange(Math.min(this.anchor, i), Math.max(this.anchor, i) + 1)) this.selected.add(r);\n } else if (mode === 'multi' && (e.ctrlKey || e.metaKey)) {\n if (!this.selected.delete(rec)) this.selected.add(rec);\n this.anchor = i;\n } else {\n this.selected.clear();\n this.selected.add(rec);\n this.anchor = i;\n }\n this.changed();\n }\n\n private onClick(e: MouseEvent, name: string) {\n const i = this.indexOf(e);\n const rec = this.store.getAt(i);\n if (!rec) return;\n const action = (e.target as HTMLElement).closest<HTMLElement>('[data-op-action]');\n if (action) {\n if (name === 'item-click') this.emit('item-action', action.dataset.opAction, rec, e);\n return; // a button inside the card is not a selection\n }\n if (name === 'item-click') {\n this.setActive(i, false);\n this.pick(i, e);\n }\n this.emit(name, rec, i, e);\n }\n\n // ---- focus and keyboard ----------------------------------------------------------------------\n\n private setActive(i: number, focus = true) {\n this.active = i;\n this.items().forEach((el, n) => {\n el.tabIndex = n === i ? 0 : -1;\n el.classList.toggle('is-active', n === i);\n });\n if (focus) this.items()[i]?.focus();\n this.emit('active-change', i);\n }\n focusItem(i: number) {\n this.render();\n this.setActive(Math.max(0, Math.min(i, this.store.count - 1)));\n }\n\n private onKey(e: KeyboardEvent) {\n const n = this.store.count;\n if (!n) return;\n const cols = this.columns();\n const rows = Math.max(1, Math.floor(this.el.clientHeight / Math.max(1, this.items()[0]?.offsetHeight ?? 1)) || 3);\n const cur = this.active;\n const to: Record<string, number> = {\n ArrowRight: Math.min(n - 1, cur + 1), ArrowLeft: Math.max(0, cur - 1),\n ArrowDown: Math.min(n - 1, cur + cols), ArrowUp: Math.max(0, cur - cols),\n Home: 0, End: n - 1, PageDown: Math.min(n - 1, cur + cols * rows), PageUp: Math.max(0, cur - cols * rows),\n };\n const mode = this.config.selection ?? 'single';\n if (e.key in to) {\n e.preventDefault();\n this.setActive(to[e.key]);\n if (mode === 'multi' && e.shiftKey) this.pick(to[e.key], { shiftKey: true });\n else if (mode === 'single' && !e.ctrlKey) this.pick(to[e.key], {});\n if (mode === 'multi' && e.shiftKey && this.anchor < 0) this.anchor = cur;\n } else if (e.key === ' ') {\n e.preventDefault();\n this.pick(cur, mode === 'multi' ? { ctrlKey: true } : {});\n } else if (e.key === 'Enter') {\n this.emit('item-activate', this.store.getAt(cur), cur);\n } else if ((e.key === 'a' || e.key === 'A') && (e.ctrlKey || e.metaKey) && mode === 'multi') {\n e.preventDefault();\n this.selectAll();\n }\n }\n\n protected override onDestroy() {\n this.pager?.destroy();\n }\n}\nregister('dataview', DataView);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DataView", "Component", "c", "el", "h", "Pagination", "Store", "store", "a", "b", "on", "animate", "r", "mode", "rec", "i", "item", "stagger", "t", "e", "els", "target", "opts", "name", "action", "focus", "n", "cols", "rows", "cur", "to", "register"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as r}from"./chunk-4EZJ5FKJ.js";import{a as o}from"./chunk-A2NKDOYN.js";import{b as t}from"./chunk-PZSHOSOS.js";import{a as i}from"./chunk-TIPK3SCJ.js";var n=class extends o{baseCls="op-badge";tag="span";textEl;onRender(){let e=this.config;e.dot&&this.el.append(t("span","op-badge__dot",{"aria-hidden":"true"})),e.icon&&this.el.append(r(e.icon)),this.textEl=this.el.appendChild(t("span","op-badge__text")),this.setText(e.text??""),this.setTone(e.tone??"neutral")}setText(e){this.config.text=e,this.rendered&&(this.textEl.textContent=String(e))}setTone(e){this.config.tone=e,this.rendered&&(this.el.className=this.el.className.replace(/\bop-badge--\w+/g,"").trim(),this.el.classList.add(`op-badge--${e}`))}};i("badge",n);export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-MB3MU6HR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/base/badge/badge.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';\n\nexport type Tone = 'neutral' | 'primary' | 'success' | 'warning' | 'danger' | 'info';\nexport interface BadgeConfig extends ComponentConfig {\n text?: string | number;\n tone?: Tone;\n icon?: string;\n /** A small colored dot before the text (a status light). */\n dot?: boolean;\n}\n\n/** A small status label or count: \"Paid\", \"3 new\", \"Beta\". Not interactive (see Chip for that). */\nexport class Badge extends Component<BadgeConfig> {\n protected override baseCls = 'op-badge';\n protected override tag = 'span' as const;\n private textEl!: HTMLElement;\n\n protected override onRender() {\n const c = this.config;\n if (c.dot) this.el.append(h('span', 'op-badge__dot', { 'aria-hidden': 'true' }));\n if (c.icon) this.el.append(iconEl(c.icon));\n this.textEl = this.el.appendChild(h('span', 'op-badge__text'));\n this.setText(c.text ?? '');\n this.setTone(c.tone ?? 'neutral');\n }\n\n setText(text: string | number) {\n this.config.text = text;\n if (this.rendered) this.textEl.textContent = String(text);\n }\n setTone(tone: Tone) {\n this.config.tone = tone;\n if (!this.rendered) return;\n this.el.className = this.el.className.replace(/\\bop-badge--\\w+/g, '').trim();\n this.el.classList.add(`op-badge--${tone}`);\n }\n}\nregister('badge', Badge);\n"],
|
|
5
|
+
"mappings": "gKAeO,IAAMA,EAAN,cAAoBC,CAAuB,CAC7B,QAAU,WACV,IAAM,OACjB,OAEW,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACXA,EAAE,KAAK,KAAK,GAAG,OAAOC,EAAE,OAAQ,gBAAiB,CAAE,cAAe,MAAO,CAAC,CAAC,EAC3ED,EAAE,MAAM,KAAK,GAAG,OAAOE,EAAOF,EAAE,IAAI,CAAC,EACzC,KAAK,OAAS,KAAK,GAAG,YAAYC,EAAE,OAAQ,gBAAgB,CAAC,EAC7D,KAAK,QAAQD,EAAE,MAAQ,EAAE,EACzB,KAAK,QAAQA,EAAE,MAAQ,SAAS,CAClC,CAEA,QAAQG,EAAuB,CAC7B,KAAK,OAAO,KAAOA,EACf,KAAK,WAAU,KAAK,OAAO,YAAc,OAAOA,CAAI,EAC1D,CACA,QAAQC,EAAY,CAClB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,GAAG,UAAY,KAAK,GAAG,UAAU,QAAQ,mBAAoB,EAAE,EAAE,KAAK,EAC3E,KAAK,GAAG,UAAU,IAAI,aAAaA,CAAI,EAAE,EAC3C,CACF,EACAC,EAAS,QAASP,CAAK",
|
|
6
|
+
"names": ["Badge", "Component", "c", "h", "iconEl", "text", "tone", "register"]
|
|
7
|
+
}
|