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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/tree/tree.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', { treeLoading: 'Loading\u2026', treeEmpty: 'Nothing here' });\naddMessages('pt-BR', { treeLoading: 'Carregando\u2026', treeEmpty: 'Nada aqui' });\n\nexport interface TreeNode {\n id: string;\n text: string;\n icon?: string;\n children?: TreeNode[];\n /** No children and nothing to load: no expand arrow. Default: true when there are no `children` and no `load`. */\n leaf?: boolean;\n expanded?: boolean;\n disabled?: boolean;\n /** With `checkboxes`: the node's own state (a parent's state comes from its children). */\n checked?: boolean;\n data?: unknown;\n}\nexport type CheckState = boolean | 'mixed';\n\nexport interface TreeConfig extends ComponentConfig {\n items?: TreeNode[];\n /** `single` (default), `multi` (Ctrl/\u2318 + click or Space toggle) or `none`. */\n selection?: 'single' | 'multi' | 'none';\n /** A tri-state checkbox per node: checking a parent checks its whole branch; a parent shows \"mixed\" when partly checked. */\n checkboxes?: boolean;\n /** Children on demand: called the first time a node without `children` (and not `leaf`) is expanded. */\n load?: (node: TreeNode) => Promise<TreeNode[]> | TreeNode[];\n emptyText?: string;\n}\n\n/** A hierarchy: expand/collapse, single or multiple selection, tri-state checkboxes, children loaded on demand, filter, APG tree keyboard. */\nexport class Tree extends Component<TreeConfig> {\n protected override baseCls = 'op-tree';\n private items: TreeNode[] = [];\n private open = new Set<string>();\n private selected = new Set<string>();\n private loading = new Set<string>();\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n\n protected override onRender() {\n const c = this.config;\n this.items = c.items ?? [];\n const seed = (list: TreeNode[]) => list.forEach((n) => (n.expanded && this.open.add(n.id), n.children && seed(n.children)));\n seed(this.items);\n this.root = h('ul', 'op-tree__root', { role: 'tree', 'aria-label': c.ariaLabel ?? null, 'aria-multiselectable': c.selection === 'multi' ? 'true' : null });\n this.el.removeAttribute('aria-label');\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: MouseEvent) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-tree__item');\n if (!row) return;\n const id = row.dataset.id!;\n this.focusId = id;\n if ((e.target as HTMLElement).closest('.op-tree__toggle')) return this.toggle(id);\n if ((e.target as HTMLElement).closest('.op-tree__check')) return this.toggleChecked(id);\n this.pick(id, e.ctrlKey || e.metaKey);\n });\n this.listen(this.root, 'dblclick', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-tree__item');\n const n = row && this.getNode(row.dataset.id!);\n if (n && !n.disabled) this.emit('activate', n);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getNode(id: string, list = this.items): TreeNode | undefined {\n for (const n of list) {\n if (n.id === id) return n;\n const hit = n.children && this.getNode(id, n.children);\n if (hit) return hit;\n }\n }\n /** The ancestors of a node, from the root down. */\n getPath(id: string, list = this.items, trail: TreeNode[] = []): TreeNode[] | undefined {\n for (const n of list) {\n if (n.id === id) return trail;\n const hit = n.children && this.getPath(id, n.children, [...trail, n]);\n if (hit) return hit;\n }\n }\n private isLeaf(n: TreeNode) {\n return n.leaf ?? (!n.children && !this.config.load);\n }\n private matches(n: TreeNode, q: string): boolean {\n return n.text.toLowerCase().includes(q) || !!n.children?.some((c) => this.matches(c, q));\n }\n private walk(list: TreeNode[], fn: (n: TreeNode) => void) {\n for (const n of list) {\n fn(n);\n if (n.children) this.walk(n.children, fn);\n }\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n const shown = this.items.filter((n) => !this.query || this.matches(n, this.query));\n this.root.replaceChildren(...shown.map((n) => this.node(n, 1)));\n if (!shown.length) this.root.append(h('li', 'op-tree__empty', { role: 'none' }, this.config.emptyText ?? t('treeEmpty')));\n const rows = this.rows();\n const focus = rows.find((r) => r.dataset.id === this.focusId) ?? rows.find((r) => r.getAttribute('aria-selected') === 'true') ?? rows[0];\n rows.forEach((r) => (r.tabIndex = r === focus ? 0 : -1));\n }\n\n private node(n: TreeNode, level: number): HTMLElement {\n const leaf = this.isLeaf(n);\n const open = !leaf && (this.query ? true : this.open.has(n.id));\n const busy = this.loading.has(n.id);\n const sel = this.selected.has(n.id);\n const mode = this.config.selection ?? 'single';\n const state = this.checkState(n);\n const li = h('li', 'op-tree__node', { role: 'none' });\n const row = h('div', `op-tree__item${sel ? ' is-selected' : ''}${n.disabled ? ' is-disabled' : ''}${open ? ' is-expanded' : ''}${busy ? ' is-loading' : ''}`, {\n role: 'treeitem', 'data-id': n.id, 'aria-level': level, tabindex: -1,\n 'aria-expanded': leaf ? null : String(open), 'aria-selected': mode === 'none' ? null : String(sel),\n 'aria-checked': this.config.checkboxes ? String(state) : null, 'aria-disabled': n.disabled ? 'true' : null, 'aria-busy': busy ? 'true' : null,\n });\n row.style.setProperty('--_level', String(level - 1));\n row.append(h('span', 'op-tree__toggle', { 'aria-hidden': 'true' }, leaf ? '' : busy ? h('span', 'op-spinner op-tree__spinner') : iconEl('chevron-right')));\n if (this.config.checkboxes) row.append(h('span', `op-tree__check${state === true ? ' is-checked' : state === 'mixed' ? ' is-mixed' : ''}`, { 'aria-hidden': 'true' }, state === 'mixed' ? iconEl('minus') : state ? iconEl('check') : ''));\n if (n.icon) row.append(h('span', 'op-tree__icon', {}, iconEl(n.icon)));\n row.append(h('span', 'op-tree__text', {}, n.text));\n li.append(row);\n if (open && n.children?.length) {\n const kids = n.children.filter((c) => !this.query || this.matches(c, this.query));\n li.append(h('ul', 'op-tree__group', { role: 'group' }, ...kids.map((c) => this.node(c, level + 1))));\n }\n return li;\n }\n\n // ---- expand / load ---------------------------------------------------------------------------\n\n async expand(id: string): Promise<void> {\n const n = this.getNode(id);\n if (!n || this.isLeaf(n) || this.open.has(id) || this.loading.has(id)) return;\n if (!n.children && this.config.load) {\n this.loading.add(id);\n this.rendered && this.paint();\n try {\n n.children = await this.config.load(n);\n if (this.config.checkboxes && this.checkState(n) === true) n.children.forEach((c) => this.setBranch(c, true)); // a checked parent checks what it loads\n this.emit('load', n, n.children);\n } catch (err) {\n this.loading.delete(id);\n this.rendered && this.paint();\n this.emit('error', err, n);\n return;\n }\n this.loading.delete(id);\n }\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', n);\n }\n collapse(id: string) {\n const n = this.getNode(id);\n if (!n || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', n);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else void this.expand(id);\n }\n /** Opens every node that already has its children (it does not load). */\n expandAll() {\n this.walk(this.items, (n) => n.children?.length && this.open.add(n.id));\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n this.rendered && this.paint();\n }\n\n // ---- selection -------------------------------------------------------------------------------\n\n private pick(id: string, add: boolean) {\n const n = this.getNode(id);\n const mode = this.config.selection ?? 'single';\n if (!n || n.disabled || mode === 'none') return;\n if (mode === 'multi' && add) {\n if (!this.selected.delete(id)) this.selected.add(id);\n } else {\n this.selected.clear();\n this.selected.add(id);\n }\n this.rendered && this.paint();\n this.emit('select', this.getSelection());\n }\n /** Selects a node (opening its parents); `add` keeps the current selection in multi mode. */\n select(id: string, opts: { add?: boolean } = {}) {\n for (const p of this.getPath(id) ?? []) this.open.add(p.id);\n this.focusId = id;\n this.pick(id, !!opts.add);\n }\n getSelection(): TreeNode[] {\n return [...this.selected].map((id) => this.getNode(id)).filter((n): n is TreeNode => !!n);\n }\n deselectAll() {\n this.selected.clear();\n this.rendered && this.paint();\n this.emit('select', []);\n }\n\n // ---- checkboxes ------------------------------------------------------------------------------\n\n /** A node's state: its own `checked`, or for a parent with children, all / none / \"mixed\" of them. */\n checkState(n: TreeNode): CheckState {\n if (!n.children?.length) return !!n.checked;\n const states = n.children.map((c) => this.checkState(c));\n return states.every((s) => s === true) ? true : states.some((s) => s !== false) ? 'mixed' : false;\n }\n private setBranch(n: TreeNode, on: boolean) {\n n.checked = on;\n n.children?.forEach((c) => this.setBranch(c, on));\n }\n setChecked(id: string, on: boolean) {\n const n = this.getNode(id);\n if (!n || n.disabled) return;\n this.setBranch(n, on);\n this.rendered && this.paint();\n this.emit('check', this.getChecked(), n);\n }\n toggleChecked(id: string) {\n const n = this.getNode(id);\n if (n) this.setChecked(id, this.checkState(n) !== true);\n }\n /** Every checked node (a fully checked parent and its children all count). */\n getChecked(): TreeNode[] {\n const out: TreeNode[] = [];\n this.walk(this.items, (n) => this.checkState(n) === true && out.push(n));\n return out;\n }\n\n // ---- data ------------------------------------------------------------------------------------\n\n setItems(items: TreeNode[]) {\n this.items = items;\n this.config.items = items;\n this.selected.clear();\n this.rendered && this.paint();\n }\n /** Shows only what matches (and its ancestors, opened); empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n this.rendered && this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-tree__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n this.focusId = row.dataset.id;\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-tree__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const n = this.getNode(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n const closed = row.getAttribute('aria-expanded') === 'false';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (closed) void this.expand(n.id);\n else if (open) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (open) this.collapse(n.id);\n else {\n const parent = this.getPath(n.id)?.pop();\n if (parent) this.focusRow(rows.find((r) => r.dataset.id === parent.id));\n }\n break;\n case ' ':\n if (this.config.checkboxes) this.toggleChecked(n.id);\n else this.pick(n.id, this.config.selection === 'multi');\n break;\n case 'Enter':\n this.pick(n.id, false);\n if (!n.disabled) this.emit('activate', n);\n break;\n default: return;\n }\n e.preventDefault();\n // a repaint rebuilt the rows: put the focus back where the user is\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId ?? n.id)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('tree', Tree);\n"],
|
|
5
|
+
"mappings": "0MAMAA,EAAY,KAAM,CAAE,YAAa,gBAAY,UAAW,cAAe,CAAC,EACxEA,EAAY,QAAS,CAAE,YAAa,mBAAe,UAAW,WAAY,CAAC,EA6BpE,IAAMC,EAAN,cAAmBC,CAAsB,CAC3B,QAAU,UACrB,MAAoB,CAAC,EACrB,KAAO,IAAI,IACX,SAAW,IAAI,IACf,QAAU,IAAI,IACd,MAAQ,GACR,QACA,KAEW,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACf,KAAK,MAAQA,EAAE,OAAS,CAAC,EACzB,IAAMC,EAAQC,GAAqBA,EAAK,QAASC,IAAOA,EAAE,UAAY,KAAK,KAAK,IAAIA,EAAE,EAAE,EAAGA,EAAE,UAAYF,EAAKE,EAAE,QAAQ,EAAE,EAC1HF,EAAK,KAAK,KAAK,EACf,KAAK,KAAOG,EAAE,KAAM,gBAAiB,CAAE,KAAM,OAAQ,aAAcJ,EAAE,WAAa,KAAM,uBAAwBA,EAAE,YAAc,QAAU,OAAS,IAAK,CAAC,EACzJ,KAAK,GAAG,gBAAgB,YAAY,EACpC,KAAK,GAAG,OAAO,KAAK,IAAI,EACxB,KAAK,OAAO,KAAK,KAAM,QAAUK,GAAkB,CACjD,IAAMC,EAAOD,EAAE,OAAuB,QAAqB,gBAAgB,EAC3E,GAAI,CAACC,EAAK,OACV,IAAMC,EAAKD,EAAI,QAAQ,GAEvB,GADA,KAAK,QAAUC,EACVF,EAAE,OAAuB,QAAQ,kBAAkB,EAAG,OAAO,KAAK,OAAOE,CAAE,EAChF,GAAKF,EAAE,OAAuB,QAAQ,iBAAiB,EAAG,OAAO,KAAK,cAAcE,CAAE,EACtF,KAAK,KAAKA,EAAIF,EAAE,SAAWA,EAAE,OAAO,CACtC,CAAC,EACD,KAAK,OAAO,KAAK,KAAM,WAAaA,GAAa,CAC/C,IAAMC,EAAOD,EAAE,OAAuB,QAAqB,gBAAgB,EACrEF,EAAIG,GAAO,KAAK,QAAQA,EAAI,QAAQ,EAAG,EACzCH,GAAK,CAACA,EAAE,UAAU,KAAK,KAAK,WAAYA,CAAC,CAC/C,CAAC,EACD,KAAK,OAAO,KAAK,KAAM,UAAYE,GAAqB,KAAK,MAAMA,CAAC,CAAC,EACrE,KAAK,MAAM,CACb,CAIA,QAAQE,EAAYL,EAAO,KAAK,MAA6B,CAC3D,QAAWC,KAAKD,EAAM,CACpB,GAAIC,EAAE,KAAOI,EAAI,OAAOJ,EACxB,IAAMK,EAAML,EAAE,UAAY,KAAK,QAAQI,EAAIJ,EAAE,QAAQ,EACrD,GAAIK,EAAK,OAAOA,CAClB,CACF,CAEA,QAAQD,EAAYL,EAAO,KAAK,MAAOO,EAAoB,CAAC,EAA2B,CACrF,QAAWN,KAAKD,EAAM,CACpB,GAAIC,EAAE,KAAOI,EAAI,OAAOE,EACxB,IAAMD,EAAML,EAAE,UAAY,KAAK,QAAQI,EAAIJ,EAAE,SAAU,CAAC,GAAGM,EAAON,CAAC,CAAC,EACpE,GAAIK,EAAK,OAAOA,CAClB,CACF,CACQ,OAAOL,EAAa,CAC1B,OAAOA,EAAE,OAAS,CAACA,EAAE,UAAY,CAAC,KAAK,OAAO,KAChD,CACQ,QAAQA,EAAaO,EAAoB,CAC/C,OAAOP,EAAE,KAAK,YAAY,EAAE,SAASO,CAAC,GAAK,CAAC,CAACP,EAAE,UAAU,KAAMH,GAAM,KAAK,QAAQA,EAAGU,CAAC,CAAC,CACzF,CACQ,KAAKR,EAAkBS,EAA2B,CACxD,QAAWR,KAAKD,EACdS,EAAGR,CAAC,EACAA,EAAE,UAAU,KAAK,KAAKA,EAAE,SAAUQ,CAAE,CAE5C,CAIQ,OAAQ,CACd,IAAMC,EAAQ,KAAK,MAAM,OAAQT,GAAM,CAAC,KAAK,OAAS,KAAK,QAAQA,EAAG,KAAK,KAAK,CAAC,EACjF,KAAK,KAAK,gBAAgB,GAAGS,EAAM,IAAKT,GAAM,KAAK,KAAKA,EAAG,CAAC,CAAC,CAAC,EACzDS,EAAM,QAAQ,KAAK,KAAK,OAAOR,EAAE,KAAM,iBAAkB,CAAE,KAAM,MAAO,EAAG,KAAK,OAAO,WAAaS,EAAE,WAAW,CAAC,CAAC,EACxH,IAAMC,EAAO,KAAK,KAAK,EACjBC,EAAQD,EAAK,KAAME,GAAMA,EAAE,QAAQ,KAAO,KAAK,OAAO,GAAKF,EAAK,KAAME,GAAMA,EAAE,aAAa,eAAe,IAAM,MAAM,GAAKF,EAAK,CAAC,EACvIA,EAAK,QAASE,GAAOA,EAAE,SAAWA,IAAMD,EAAQ,EAAI,EAAG,CACzD,CAEQ,KAAKZ,EAAac,EAA4B,CACpD,IAAMC,EAAO,KAAK,OAAOf,CAAC,EACpBgB,EAAO,CAACD,IAAS,KAAK,MAAQ,GAAO,KAAK,KAAK,IAAIf,EAAE,EAAE,GACvDiB,EAAO,KAAK,QAAQ,IAAIjB,EAAE,EAAE,EAC5BkB,EAAM,KAAK,SAAS,IAAIlB,EAAE,EAAE,EAC5BmB,EAAO,KAAK,OAAO,WAAa,SAChCC,EAAQ,KAAK,WAAWpB,CAAC,EACzBqB,EAAKpB,EAAE,KAAM,gBAAiB,CAAE,KAAM,MAAO,CAAC,EAC9CE,EAAMF,EAAE,MAAO,gBAAgBiB,EAAM,eAAiB,EAAE,GAAGlB,EAAE,SAAW,eAAiB,EAAE,GAAGgB,EAAO,eAAiB,EAAE,GAAGC,EAAO,cAAgB,EAAE,GAAI,CAC5J,KAAM,WAAY,UAAWjB,EAAE,GAAI,aAAcc,EAAO,SAAU,GAClE,gBAAiBC,EAAO,KAAO,OAAOC,CAAI,EAAG,gBAAiBG,IAAS,OAAS,KAAO,OAAOD,CAAG,EACjG,eAAgB,KAAK,OAAO,WAAa,OAAOE,CAAK,EAAI,KAAM,gBAAiBpB,EAAE,SAAW,OAAS,KAAM,YAAaiB,EAAO,OAAS,IAC3I,CAAC,EAOD,GANAd,EAAI,MAAM,YAAY,WAAY,OAAOW,EAAQ,CAAC,CAAC,EACnDX,EAAI,OAAOF,EAAE,OAAQ,kBAAmB,CAAE,cAAe,MAAO,EAAGc,EAAO,GAAKE,EAAOhB,EAAE,OAAQ,6BAA6B,EAAIqB,EAAO,eAAe,CAAC,CAAC,EACrJ,KAAK,OAAO,YAAYnB,EAAI,OAAOF,EAAE,OAAQ,iBAAiBmB,IAAU,GAAO,cAAgBA,IAAU,QAAU,YAAc,EAAE,GAAI,CAAE,cAAe,MAAO,EAAGA,IAAU,QAAUE,EAAO,OAAO,EAAIF,EAAQE,EAAO,OAAO,EAAI,EAAE,CAAC,EACrOtB,EAAE,MAAMG,EAAI,OAAOF,EAAE,OAAQ,gBAAiB,CAAC,EAAGqB,EAAOtB,EAAE,IAAI,CAAC,CAAC,EACrEG,EAAI,OAAOF,EAAE,OAAQ,gBAAiB,CAAC,EAAGD,EAAE,IAAI,CAAC,EACjDqB,EAAG,OAAOlB,CAAG,EACTa,GAAQhB,EAAE,UAAU,OAAQ,CAC9B,IAAMuB,EAAOvB,EAAE,SAAS,OAAQH,GAAM,CAAC,KAAK,OAAS,KAAK,QAAQA,EAAG,KAAK,KAAK,CAAC,EAChFwB,EAAG,OAAOpB,EAAE,KAAM,iBAAkB,CAAE,KAAM,OAAQ,EAAG,GAAGsB,EAAK,IAAK1B,GAAM,KAAK,KAAKA,EAAGiB,EAAQ,CAAC,CAAC,CAAC,CAAC,CACrG,CACA,OAAOO,CACT,CAIA,MAAM,OAAOjB,EAA2B,CACtC,IAAMJ,EAAI,KAAK,QAAQI,CAAE,EACzB,GAAI,GAACJ,GAAK,KAAK,OAAOA,CAAC,GAAK,KAAK,KAAK,IAAII,CAAE,GAAK,KAAK,QAAQ,IAAIA,CAAE,GACpE,IAAI,CAACJ,EAAE,UAAY,KAAK,OAAO,KAAM,CACnC,KAAK,QAAQ,IAAII,CAAE,EACnB,KAAK,UAAY,KAAK,MAAM,EAC5B,GAAI,CACFJ,EAAE,SAAW,MAAM,KAAK,OAAO,KAAKA,CAAC,EACjC,KAAK,OAAO,YAAc,KAAK,WAAWA,CAAC,IAAM,IAAMA,EAAE,SAAS,QAASH,GAAM,KAAK,UAAUA,EAAG,EAAI,CAAC,EAC5G,KAAK,KAAK,OAAQG,EAAGA,EAAE,QAAQ,CACjC,OAASwB,EAAK,CACZ,KAAK,QAAQ,OAAOpB,CAAE,EACtB,KAAK,UAAY,KAAK,MAAM,EAC5B,KAAK,KAAK,QAASoB,EAAKxB,CAAC,EACzB,MACF,CACA,KAAK,QAAQ,OAAOI,CAAE,CACxB,CACA,KAAK,KAAK,IAAIA,CAAE,EAChB,KAAK,UAAY,KAAK,MAAM,EAC5B,KAAK,KAAK,SAAUJ,CAAC,EACvB,CACA,SAASI,EAAY,CACnB,IAAMJ,EAAI,KAAK,QAAQI,CAAE,EACrB,CAACJ,GAAK,CAAC,KAAK,KAAK,OAAOI,CAAE,IAC9B,KAAK,UAAY,KAAK,MAAM,EAC5B,KAAK,KAAK,WAAYJ,CAAC,EACzB,CACA,OAAOI,EAAY,CACb,KAAK,KAAK,IAAIA,CAAE,EAAG,KAAK,SAASA,CAAE,EAC7B,KAAK,OAAOA,CAAE,CAC1B,CAEA,WAAY,CACV,KAAK,KAAK,KAAK,MAAQJ,GAAMA,EAAE,UAAU,QAAU,KAAK,KAAK,IAAIA,EAAE,EAAE,CAAC,EACtE,KAAK,UAAY,KAAK,MAAM,CAC9B,CACA,aAAc,CACZ,KAAK,KAAK,MAAM,EAChB,KAAK,UAAY,KAAK,MAAM,CAC9B,CAIQ,KAAKI,EAAYqB,EAAc,CACrC,IAAMzB,EAAI,KAAK,QAAQI,CAAE,EACnBe,EAAO,KAAK,OAAO,WAAa,SAClC,CAACnB,GAAKA,EAAE,UAAYmB,IAAS,SAC7BA,IAAS,SAAWM,EACjB,KAAK,SAAS,OAAOrB,CAAE,GAAG,KAAK,SAAS,IAAIA,CAAE,GAEnD,KAAK,SAAS,MAAM,EACpB,KAAK,SAAS,IAAIA,CAAE,GAEtB,KAAK,UAAY,KAAK,MAAM,EAC5B,KAAK,KAAK,SAAU,KAAK,aAAa,CAAC,EACzC,CAEA,OAAOA,EAAYsB,EAA0B,CAAC,EAAG,CAC/C,QAAWC,KAAK,KAAK,QAAQvB,CAAE,GAAK,CAAC,EAAG,KAAK,KAAK,IAAIuB,EAAE,EAAE,EAC1D,KAAK,QAAUvB,EACf,KAAK,KAAKA,EAAI,CAAC,CAACsB,EAAK,GAAG,CAC1B,CACA,cAA2B,CACzB,MAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,IAAKtB,GAAO,KAAK,QAAQA,CAAE,CAAC,EAAE,OAAQJ,GAAqB,CAAC,CAACA,CAAC,CAC1F,CACA,aAAc,CACZ,KAAK,SAAS,MAAM,EACpB,KAAK,UAAY,KAAK,MAAM,EAC5B,KAAK,KAAK,SAAU,CAAC,CAAC,CACxB,CAKA,WAAWA,EAAyB,CAClC,GAAI,CAACA,EAAE,UAAU,OAAQ,MAAO,CAAC,CAACA,EAAE,QACpC,IAAM4B,EAAS5B,EAAE,SAAS,IAAKH,GAAM,KAAK,WAAWA,CAAC,CAAC,EACvD,OAAO+B,EAAO,MAAOC,GAAMA,IAAM,EAAI,EAAI,GAAOD,EAAO,KAAMC,GAAMA,IAAM,EAAK,EAAI,QAAU,EAC9F,CACQ,UAAU7B,EAAa8B,EAAa,CAC1C9B,EAAE,QAAU8B,EACZ9B,EAAE,UAAU,QAASH,GAAM,KAAK,UAAUA,EAAGiC,CAAE,CAAC,CAClD,CACA,WAAW1B,EAAY0B,EAAa,CAClC,IAAM9B,EAAI,KAAK,QAAQI,CAAE,EACrB,CAACJ,GAAKA,EAAE,WACZ,KAAK,UAAUA,EAAG8B,CAAE,EACpB,KAAK,UAAY,KAAK,MAAM,EAC5B,KAAK,KAAK,QAAS,KAAK,WAAW,EAAG9B,CAAC,EACzC,CACA,cAAcI,EAAY,CACxB,IAAMJ,EAAI,KAAK,QAAQI,CAAE,EACrBJ,GAAG,KAAK,WAAWI,EAAI,KAAK,WAAWJ,CAAC,IAAM,EAAI,CACxD,CAEA,YAAyB,CACvB,IAAM+B,EAAkB,CAAC,EACzB,YAAK,KAAK,KAAK,MAAQ/B,GAAM,KAAK,WAAWA,CAAC,IAAM,IAAQ+B,EAAI,KAAK/B,CAAC,CAAC,EAChE+B,CACT,CAIA,SAASC,EAAmB,CAC1B,KAAK,MAAQA,EACb,KAAK,OAAO,MAAQA,EACpB,KAAK,SAAS,MAAM,EACpB,KAAK,UAAY,KAAK,MAAM,CAC9B,CAEA,OAAOC,EAAc,CACnB,KAAK,MAAQA,EAAK,KAAK,EAAE,YAAY,EACrC,KAAK,UAAY,KAAK,MAAM,CAC9B,CAIQ,MAAsB,CAC5B,OAAO,MAAM,KAAK,KAAK,KAAK,iBAA8B,gBAAgB,CAAC,CAC7E,CACQ,SAAS9B,EAAmB,CAC7BA,IACL,KAAK,KAAK,EAAE,QAASU,GAAOA,EAAE,SAAWA,IAAMV,EAAM,EAAI,EAAG,EAC5D,KAAK,QAAUA,EAAI,QAAQ,GAC3BA,EAAI,MAAM,EACZ,CAEQ,MAAM,EAAkB,CAC9B,IAAMA,EAAO,EAAE,OAAuB,QAAqB,gBAAgB,EAC3E,GAAI,CAACA,EAAK,OACV,IAAMQ,EAAO,KAAK,KAAK,EACjBuB,EAAIvB,EAAK,QAAQR,CAAG,EACpBH,EAAI,KAAK,QAAQG,EAAI,QAAQ,EAAG,EAChCa,EAAOb,EAAI,aAAa,eAAe,IAAM,OAC7CgC,EAAShC,EAAI,aAAa,eAAe,IAAM,QACrD,OAAQ,EAAE,IAAK,CACb,IAAK,YAAa,KAAK,SAASQ,EAAKuB,EAAI,CAAC,CAAC,EAAG,MAC9C,IAAK,UAAW,KAAK,SAASvB,EAAKuB,EAAI,CAAC,CAAC,EAAG,MAC5C,IAAK,OAAQ,KAAK,SAASvB,EAAK,CAAC,CAAC,EAAG,MACrC,IAAK,MAAO,KAAK,SAASA,EAAKA,EAAK,OAAS,CAAC,CAAC,EAAG,MAClD,IAAK,aACCwB,EAAa,KAAK,OAAOnC,EAAE,EAAE,EACxBgB,GAAM,KAAK,SAASL,EAAKuB,EAAI,CAAC,CAAC,EACxC,MACF,IAAK,YACH,GAAIlB,EAAM,KAAK,SAAShB,EAAE,EAAE,MACvB,CACH,IAAMoC,EAAS,KAAK,QAAQpC,EAAE,EAAE,GAAG,IAAI,EACnCoC,GAAQ,KAAK,SAASzB,EAAK,KAAME,GAAMA,EAAE,QAAQ,KAAOuB,EAAO,EAAE,CAAC,CACxE,CACA,MACF,IAAK,IACC,KAAK,OAAO,WAAY,KAAK,cAAcpC,EAAE,EAAE,EAC9C,KAAK,KAAKA,EAAE,GAAI,KAAK,OAAO,YAAc,OAAO,EACtD,MACF,IAAK,QACH,KAAK,KAAKA,EAAE,GAAI,EAAK,EAChBA,EAAE,UAAU,KAAK,KAAK,WAAYA,CAAC,EACxC,MACF,QAAS,MACX,CACA,EAAE,eAAe,EAEjB,IAAMqC,EAAQ,KAAK,KAAK,cAA2B,aAAa,IAAI,OAAO,KAAK,SAAWrC,EAAE,EAAE,CAAC,IAAI,EAChGqC,GAAS,SAAS,gBAAkBA,GAAO,KAAK,SAASA,CAAK,CACpE,CACF,EACAC,EAAS,OAAQ3C,CAAI",
|
|
6
|
+
"names": ["addMessages", "Tree", "Component", "c", "seed", "list", "n", "h", "e", "row", "id", "hit", "trail", "q", "fn", "shown", "t", "rows", "focus", "r", "level", "leaf", "open", "busy", "sel", "mode", "state", "li", "iconEl", "kids", "err", "add", "opts", "p", "states", "s", "on", "out", "items", "text", "i", "closed", "parent", "again", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var w={top:"bottom",bottom:"top",left:"right",right:"left"};function y(e,i,s={}){let{offset:n=4,flip:b=!0,margin:r=8}=s,[x,c="center"]=(s.placement??"bottom-start").split("-"),t="getBoundingClientRect"in i?i.getBoundingClientRect():{left:i.x,right:i.x,top:i.y,bottom:i.y,width:0,height:0};s.matchWidth&&(e.style.minWidth=`${t.width}px`);let g=document.documentElement.clientWidth||window.innerWidth,f=document.documentElement.clientHeight||window.innerHeight,v=e.scrollTop;e.style.maxHeight=e.style.overflowY="";let m=e.offsetWidth,l=e.offsetHeight,h=d=>d==="bottom"?t.bottom+n+l<=f-r:d==="top"?t.top-n-l>=r:d==="right"?t.right+n+m<=g-r:t.left-n-m>=r,o=x;if(b&&!h(o)&&h(w[o])&&(o=w[o]),(o==="bottom"||o==="top")&&!h(o)){let d=f-r-t.bottom-n,u=t.top-n-r;b&&(o=d>=u?"bottom":"top"),l=Math.max(0,Math.floor(o==="bottom"?d:u)),e.style.maxHeight=`${l}px`,e.style.overflowY="auto",e.scrollTop=v}let a,p;o==="bottom"||o==="top"?(p=o==="bottom"?t.bottom+n:t.top-n-l,a=c==="start"?t.left:c==="end"?t.right-m:t.left+(t.width-m)/2):(a=o==="right"?t.right+n:t.left-n-m,p=c==="start"?t.top:c==="end"?t.bottom-l:t.top+(t.height-l)/2),a=Math.max(r,Math.min(a,g-m-r)),p=Math.max(r,Math.min(p,f-l-r)),e.style.left=`${a}px`,e.style.top=`${p}px`,e.dataset.side=o}function E(e){let i=!1,s=()=>{i||(i=!0,requestAnimationFrame(()=>{i=!1,e()}))};return window.addEventListener("scroll",s,!0),window.addEventListener("resize",s),()=>{window.removeEventListener("scroll",s,!0),window.removeEventListener("resize",s)}}export{y as a,E as b};
|
|
2
|
+
//# sourceMappingURL=chunk-E4VNLYO2.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/position.ts"],
|
|
4
|
+
"sourcesContent": ["export type Side = 'top' | 'bottom' | 'left' | 'right';\nexport type Placement = Side | `${Side}-start` | `${Side}-end`;\n\nexport interface PlaceOptions {\n placement?: Placement;\n offset?: number;\n flip?: boolean;\n matchWidth?: boolean;\n margin?: number;\n}\n\nconst opposite: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\n/**\n * Positions a floating element (`position: fixed`) next to an anchor element or a point, flipping and clamping to the viewport.\n * Taller than the room on either side (a long menu, a big theme): it goes where there is more room, capped to it, and scrolls.\n */\nexport function place(el: HTMLElement, anchor: Element | { x: number; y: number }, o: PlaceOptions = {}): void {\n const { offset = 4, flip = true, margin = 8 } = o;\n const [side0, align = 'center'] = (o.placement ?? 'bottom-start').split('-') as [Side, string?];\n const a = 'getBoundingClientRect' in anchor ? anchor.getBoundingClientRect() : { left: anchor.x, right: anchor.x, top: anchor.y, bottom: anchor.y, width: 0, height: 0 };\n if (o.matchWidth) el.style.minWidth = `${a.width}px`;\n const vw = document.documentElement.clientWidth || window.innerWidth;\n const vh = document.documentElement.clientHeight || window.innerHeight;\n const scrolled = el.scrollTop; // repositioning runs on every scroll, the element's own included: keep its place\n el.style.maxHeight = el.style.overflowY = ''; // measure the natural size again (the room may have grown)\n const w = el.offsetWidth;\n let hgt = el.offsetHeight;\n\n const fits = (s: Side) =>\n s === 'bottom' ? a.bottom + offset + hgt <= vh - margin : s === 'top' ? a.top - offset - hgt >= margin : s === 'right' ? a.right + offset + w <= vw - margin : a.left - offset - w >= margin;\n let side = side0;\n if (flip && !fits(side) && fits(opposite[side])) side = opposite[side];\n if ((side === 'bottom' || side === 'top') && !fits(side)) {\n const below = vh - margin - a.bottom - offset;\n const above = a.top - offset - margin;\n if (flip) side = below >= above ? 'bottom' : 'top';\n hgt = Math.max(0, Math.floor(side === 'bottom' ? below : above));\n el.style.maxHeight = `${hgt}px`;\n el.style.overflowY = 'auto';\n el.scrollTop = scrolled;\n }\n\n let left: number;\n let top: number;\n if (side === 'bottom' || side === 'top') {\n top = side === 'bottom' ? a.bottom + offset : a.top - offset - hgt;\n left = align === 'start' ? a.left : align === 'end' ? a.right - w : a.left + (a.width - w) / 2;\n } else {\n left = side === 'right' ? a.right + offset : a.left - offset - w;\n top = align === 'start' ? a.top : align === 'end' ? a.bottom - hgt : a.top + (a.height - hgt) / 2;\n }\n left = Math.max(margin, Math.min(left, vw - w - margin));\n top = Math.max(margin, Math.min(top, vh - hgt - margin));\n el.style.left = `${left}px`;\n el.style.top = `${top}px`;\n el.dataset.side = side;\n}\n\n/** Calls `fn` (throttled to a frame) on any scroll or resize. Returns the cleanup function. */\nexport function track(fn: () => void): () => void {\n let queued = false;\n const run = () => {\n if (queued) return;\n queued = true;\n requestAnimationFrame(() => {\n queued = false;\n fn();\n });\n };\n window.addEventListener('scroll', run, true);\n window.addEventListener('resize', run);\n return () => {\n window.removeEventListener('scroll', run, true);\n window.removeEventListener('resize', run);\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["opposite", "place", "el", "anchor", "o", "offset", "flip", "margin", "side0", "align", "a", "vw", "vh", "scrolled", "w", "hgt", "fits", "s", "side", "below", "above", "left", "top", "track", "fn", "queued", "run"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as f}from"./chunk-Z2JBUHKA.js";import{a as g}from"./chunk-W3H7GTJY.js";import{a as m}from"./chunk-G2DAD3MQ.js";import{f as a,g as o}from"./chunk-5JEXM5S7.js";import{c as h}from"./chunk-4EZJ5FKJ.js";import{b as c}from"./chunk-PZSHOSOS.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{f as n}from"./chunk-MW3RWBZ7.js";var b=/\s*(?:–|—|\s-\s|\sto\s|\sa\s)\s*/,d=p=>a(p,{day:"2-digit",month:"2-digit",year:"numeric"}),l=class extends g{baseCls="op-field op-textfield op-picker op-datefield op-daterange";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e?.start}parse(e){if(this.garbage=!1,!e.trim())return null;let[r,s]=e.trim().split(b),t=o(r),i=s?o(s):null;return!t||s&&!i?(this.garbage=!0,null):i&&i<t?{start:i,end:t}:{start:t,end:i??t}}display(e){return e?.start?e.end&&e.end!==e.start?`${d(e.start)} \u2013 ${d(e.end)}`:d(e.start):""}createControl(){let e=super.createControl(),r=this.input;r.setAttribute("role","combobox"),r.setAttribute("aria-haspopup","dialog"),r.setAttribute("aria-expanded","false");let s=c("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},h("calendar"));this.listen(s,"mousedown",i=>i.preventDefault()),this.listen(s,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(s);let t=this.config;return this.cal=new m({range:!0,value:t.value,min:t.min,max:t.max,firstDay:t.firstDay}),this.dd=new f({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",i=>{this.dd.close(),this.setValue(i),r.focus()}),this.dd.on("open",()=>{r.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{r.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let i=document.activeElement;!this.el.contains(i)&&!this.dd.el.contains(i)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),r=this.value;if(e||!r)return e;let{min:s,max:t}=this.config;return s&&r.start<s?n("dateMin",{n:a(s)}):t&&(r.end??r.start)>t?n("dateMax",{n:a(t)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};u("daterangefield",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-EDUMAMK4.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/daterangefield/daterangefield.ts"],
|
|
4
|
+
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { parseDate, formatDate } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Calendar, type DateRange } from '../../dates/calendar/calendar';\n\nexport interface DateRangeFieldConfig extends TextFieldConfig<DateRange | null> {\n min?: string;\n max?: string;\n firstDay?: number;\n}\n\nconst SEP = /\\s*(?:\u2013|\u2014|\\s-\\s|\\sto\\s|\\sa\\s)\\s*/;\nconst short = (iso: string) => formatDate(iso, { day: '2-digit', month: '2-digit', year: 'numeric' });\n\n/**\n * Value is `{ start, end }` (ISO dates) or null. The text reads `01/03/2025 \u2013 15/03/2025` (typed or picked); the calendar\n * takes two clicks, and the popup closes on the second.\n */\nexport class DateRangeField extends TextField<DateRange | null, DateRangeFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-picker op-datefield op-daterange';\n private cal!: Calendar;\n private dd!: Dropdown;\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: DateRange | null) {\n return !v?.start;\n }\n\n protected override parse(text: string): DateRange | null {\n this.garbage = false;\n if (!text.trim()) return null;\n const [a, b] = text.trim().split(SEP);\n const start = parseDate(a);\n const end = b ? parseDate(b) : null;\n if (!start || (b && !end)) {\n this.garbage = true;\n return null;\n }\n return end && end < start ? { start: end, end: start } : { start, end: end ?? start };\n }\n protected override display(v: DateRange | null) {\n return v?.start ? (v.end && v.end !== v.start ? `${short(v.start)} \u2013 ${short(v.end)}` : short(v.start)) : '';\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.setAttribute('role', 'combobox'); // APG date picker combobox\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n const trigger = h('button', 'op-picker__trigger', { type: 'button', tabindex: -1, 'aria-label': t('calOpen') }, iconEl('calendar'));\n this.listen(trigger, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(trigger, 'click', () => {\n if (!this.config.disabled && !this.config.readonly) this.toggle();\n });\n wrap.append(trigger);\n const c = this.config;\n this.cal = new Calendar({ range: true, value: c.value, min: c.min, max: c.max, firstDay: c.firstDay });\n this.dd = new Dropdown({ anchor: wrap, content: this.cal, role: 'presentation' });\n this.cal.on('select', (r: DateRange) => {\n this.dd.close();\n this.setValue(r);\n input.focus();\n });\n this.dd.on('open', () => {\n input.setAttribute('aria-expanded', 'true');\n this.el.classList.add('is-open');\n this.cal.setValue(this.value);\n this.cal.focusDay();\n this.emit('expand');\n });\n this.dd.on('close', () => {\n input.setAttribute('aria-expanded', 'false');\n this.el.classList.remove('is-open');\n this.emit('collapse');\n });\n this.own(() => this.dd.destroy());\n this.on('blur', () =>\n this.later(() => {\n const a = document.activeElement;\n if (!this.el.contains(a) && !this.dd.el.contains(a)) this.dd.close();\n }, 0),\n );\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowDown' && !this.dd.isOpen()) {\n e.preventDefault();\n this.open();\n } else super.onKey(e);\n }\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('date'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: DateRange | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-picker__trigger') as HTMLButtonElement).disabled = disabled;\n }\n\n protected override check(): string {\n if (this.garbage) return t('date');\n const base = super.check();\n const v = this.value;\n if (base || !v) return base;\n const { min, max } = this.config;\n if (min && v.start! < min) return t('dateMin', { n: formatDate(min) });\n if (max && (v.end ?? v.start!) > max) return t('dateMax', { n: formatDate(max) });\n return '';\n }\n\n open() {\n if (this.config.disabled || this.config.readonly || !this.rendered) return;\n this.dd.open();\n }\n close() {\n this.dd?.close();\n }\n toggle() {\n if (this.dd.isOpen()) this.close();\n else this.open();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n this.cal?.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.cal?.setMax(max);\n }\n}\nregister('daterangefield', DateRangeField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SEP", "short", "iso", "formatDate", "DateRangeField", "TextField", "v", "text", "a", "b", "start", "parseDate", "end", "wrap", "input", "trigger", "h", "t", "iconEl", "e", "c", "Calendar", "Dropdown", "r", "disabled", "base", "min", "max", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as h}from"./chunk-YF75HKL6.js";import{a}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as p,c}from"./chunk-TIPK3SCJ.js";import{f as n}from"./chunk-MW3RWBZ7.js";var m=new Map;function M(r,e){m.set(r,e)}function g(r){let e=typeof r=="string"?m.get(r):r;if(!e)throw new Error(`Optikos: unknown lookup "${r}". Did you call registerLookup?`);return e}var y=r=>typeof r.store=="function"?r.store():r.store,v=r=>!r||r==="textfield"||r==="textarea",k=r=>r==null||r===""||Array.isArray(r)&&!r.length,l=class extends f{baseCls="op-searchgrid";def;store;fields=[];grid;form;build(){this.def=g(this.config.lookup),this.store=y(this.def);let e=this.def;this.form=o("div","op-searchgrid__filters",{role:"search"});let i=[new a({text:n("search"),icon:"search",variant:"primary",handler:()=>{this.search()}}),new a({text:n("clear"),handler:()=>this.clear()})];return this.fields=(e.filters??[]).map(t=>{let{op:s,field:x,...u}=t,d=c({...u,renderTo:void 0});return d.on("enter",()=>{this.search()}),{cfg:t,cmp:d}}),this.form.append(...this.fields.map(t=>t.cmp.el),o("div","op-searchgrid__buttons",{},...i.map(t=>t.el))),this.grid=new h({store:this.store,columns:e.columns,selection:e.selection??"single",paging:e.paging!==!1,flex:1}),this.grid.on("select",t=>this.emit("select",t)),this.grid.on("row-activate",()=>this.confirm()),this.grid.on("row-dblclick",()=>this.confirm()),this.own(()=>[...i,this.grid,...this.fields.map(t=>t.cmp)].forEach(t=>t.destroy())),o("div",this.baseCls,{},this.form,this.grid.el)}onRender(){this.def.autoSearch!==!1&&this.search()}notifyMount(){super.notifyMount(),this.fields.forEach(e=>e.cmp.notifyMount()),this.grid.notifyMount()}confirm(){let e=this.grid.getSelection();e.length&&this.emit("confirm",e)}getFilters(){return this.fields.flatMap(({cfg:e,cmp:i})=>{let t=i.getValue?.();if(k(t))return[];let s=e.field??e.name;return typeof t=="object"&&!Array.isArray(t)&&"start"in t?t.start?[{field:s,op:"between",value:[t.start,t.end??t.start]}]:[]:[{field:s,op:e.op??(v(e.type)?"contains":"eq"),value:t}]})}async search(e){e!=null&&this.setQuery(e);let i=this.getFilters();this.emit("before-search",i)!==!1&&(await(i.length?this.store.filter(i):this.store.clearFilter()),this.emit("search",i))}clear(){this.fields.forEach(e=>e.cmp.clear?.()),this.search()}setQuery(e){let i=this.def.queryField??this.def.filters?.[0]?.name;this.fields.find(t=>t.cfg.name===i)?.cmp?.setValue?.(e)}getSelection(){return this.grid.getSelection()}getGrid(){return this.grid}getStore(){return this.store}focus(){(this.fields[0]?.cmp??this.grid).focus()}};p("searchgrid",l);export{M as a,g as b,y as c,l as d};
|
|
2
|
+
//# sourceMappingURL=chunk-EJGWCKE4.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/data/searchgrid/searchgrid.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { FilterOp, FilterSpec } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Grid } from '../grid/grid';\n\n/** A filter field of a lookup: any field config, plus how its value is matched. */\nexport type LookupFilter = AnyConfig & { name: string; op?: FilterOp; field?: string };\n\n/** Everything that describes \"search for a record\": shared by SearchGrid and LookupField. */\nexport interface LookupDef {\n /** A function gives every instance its own store (recommended when the definition is reused). */\n store: Store<any> | (() => Store<any>);\n columns: Column[];\n filters?: LookupFilter[];\n /** Name of the filter that receives the quick text (LookupField typing). Default: the first filter. */\n queryField?: string;\n valueField?: string;\n displayField?: string;\n selection?: 'single' | 'multi';\n paging?: boolean;\n /** Search when shown. Default true. */\n autoSearch?: boolean;\n title?: string;\n width?: number;\n height?: number;\n}\n\nconst defs = new Map<string, LookupDef>();\n/** Registers a lookup definition for declarative use by name (`lookup: 'people'`). */\nexport function registerLookup(name: string, def: LookupDef): void {\n defs.set(name, def);\n}\nexport function resolveLookup(lookup: LookupDef | string): LookupDef {\n const d = typeof lookup === 'string' ? defs.get(lookup) : lookup;\n if (!d) throw new Error(`Optikos: unknown lookup \"${lookup}\". Did you call registerLookup?`);\n return d;\n}\nexport const lookupStore = (def: LookupDef): Store<any> => (typeof def.store === 'function' ? def.store() : def.store);\n\nexport interface SearchGridConfig extends ComponentConfig {\n lookup: LookupDef | string;\n}\n\nconst textual = (type?: string) => !type || type === 'textfield' || type === 'textarea';\nconst blank = (v: unknown) => v == null || v === '' || (Array.isArray(v) && !v.length);\n\n/** Filters on top, results grid below. The Store does the searching; this component only turns the filter fields into specs. */\nexport class SearchGrid extends Component<SearchGridConfig> {\n protected override baseCls = 'op-searchgrid';\n private def!: LookupDef;\n private store!: Store<any>;\n private fields: Array<{ cfg: LookupFilter; cmp: Component }> = [];\n private grid!: Grid;\n private form!: HTMLElement;\n\n protected override build() {\n this.def = resolveLookup(this.config.lookup);\n this.store = lookupStore(this.def);\n const d = this.def;\n this.form = h('div', 'op-searchgrid__filters', { role: 'search' });\n const btns = [\n new Button({ text: t('search'), icon: 'search', variant: 'primary', handler: () => void this.search() }),\n new Button({ text: t('clear'), handler: () => this.clear() }),\n ];\n this.fields = (d.filters ?? []).map((cfg) => {\n const { op: _o, field: _f, ...fieldCfg } = cfg;\n const cmp = create({ ...fieldCfg, renderTo: undefined } as AnyConfig);\n cmp.on('enter', () => void this.search());\n return { cfg, cmp };\n });\n this.form.append(...this.fields.map((f) => f.cmp.el), h('div', 'op-searchgrid__buttons', {}, ...btns.map((b) => b.el)));\n this.grid = new Grid({ store: this.store, columns: d.columns, selection: d.selection ?? 'single', paging: d.paging !== false, flex: 1 });\n this.grid.on('select', (recs: Model[]) => this.emit('select', recs));\n this.grid.on('row-activate', () => this.confirm());\n this.grid.on('row-dblclick', () => this.confirm());\n this.own(() => [...btns, this.grid, ...this.fields.map((f) => f.cmp)].forEach((c) => c.destroy()));\n return h('div', this.baseCls, {}, this.form, this.grid.el);\n }\n\n protected override onRender() {\n if (this.def.autoSearch !== false) void this.search();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.fields.forEach((f) => f.cmp.notifyMount());\n this.grid.notifyMount();\n }\n\n private confirm() {\n const recs = this.grid.getSelection();\n if (recs.length) this.emit('confirm', recs);\n }\n\n /** The non-empty filter fields as filter specs. */\n getFilters(): FilterSpec[] {\n return this.fields.flatMap(({ cfg, cmp }) => {\n const v = (cmp as any).getValue?.();\n if (blank(v)) return [];\n const field = cfg.field ?? cfg.name;\n if (typeof v === 'object' && !Array.isArray(v) && 'start' in v) return v.start ? [{ field, op: 'between' as const, value: [v.start, v.end ?? v.start] }] : [];\n return [{ field, op: cfg.op ?? (textual(cfg.type) ? 'contains' : 'eq'), value: v }];\n });\n }\n\n /** Filters the store with the current fields (or loads it, when there are none). Resolves when the results are in. */\n async search(query?: string): Promise<void> {\n if (query != null) this.setQuery(query);\n const specs = this.getFilters();\n if (this.emit('before-search', specs) === false) return;\n await (specs.length ? this.store.filter(specs) : this.store.clearFilter());\n this.emit('search', specs);\n }\n\n /** Empties the filter fields and searches again. */\n clear(): void {\n this.fields.forEach((f) => (f.cmp as any).clear?.());\n void this.search();\n }\n\n /** Fills the quick-search field (`queryField`, default the first filter) without searching. */\n setQuery(text: string): void {\n const name = this.def.queryField ?? this.def.filters?.[0]?.name;\n (this.fields.find((f) => f.cfg.name === name)?.cmp as any)?.setValue?.(text);\n }\n\n getSelection(): Model[] {\n return this.grid.getSelection();\n }\n getGrid(): Grid {\n return this.grid;\n }\n getStore(): Store<any> {\n return this.store;\n }\n override focus(): void {\n (this.fields[0]?.cmp ?? this.grid).focus();\n }\n}\nregister('searchgrid', SearchGrid);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["defs", "registerLookup", "name", "def", "resolveLookup", "lookup", "d", "lookupStore", "textual", "type", "blank", "v", "SearchGrid", "Component", "h", "btns", "Button", "t", "cfg", "_o", "_f", "fieldCfg", "cmp", "create", "f", "b", "Grid", "recs", "c", "field", "query", "specs", "text", "register"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as d}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as d}from"./chunk-5Q76ACVI.js";import{a as h}from"./chunk-Z2JBUHKA.js";import{a as l}from"./chunk-W3H7GTJY.js";import{c as r}from"./chunk-4EZJ5FKJ.js";import{b as n}from"./chunk-PZSHOSOS.js";var a=class extends l{baseCls="op-field op-textfield op-picker";items=[];selection;typed=!1;list;dd;triggerEl;idEl;wrapEl;buffer="";bufferTimer;editable(){return!0}hasTrigger(){return!0}onType(t){}toItem(t){if(typeof t!="object")return{value:t,label:String(t)};let e=this.config.valueField??"value",i=this.config.displayField??"label";return{value:t[e],label:String(t[i]??t[e]??""),disabled:!!t.disabled,raw:t,hint:this.config.showValue?String(t[e]):void 0}}loadItems(){let t=this.config;this.items=t.store?t.store.getData().map(e=>this.toItem(e)):(t.options??[]).map(e=>this.toItem(e))}setOptions(t){this.config.options=t,this.loadItems(),this.refreshList(),this.rendered&&this.applyValue(this.value)}setStore(t){this.config.store=t,this.bindStore(),this.loadItems(),this.refreshList()}offStore;bindStore(){this.offStore?.(),this.offStore=this.config.store?.subscribe(()=>{this.loadItems(),this.refreshList(),this.rendered&&this.applyValue(this.value)})}findItem(t){return this.items.find(e=>e.value===t)??(this.selection?.value===t?this.selection:void 0)}getSelection(){return this.selection}setSelection(t,e=!1){this.selection=t,this.setValue(t?t.value:this.emptyValue(),e)}visibleItems(){return this.items}refreshList(){if(!this.list)return;let t=this.visibleItems();this.list.setItems(t),this.list.setSelected(this.value);let e=t.findIndex(i=>i.value===this.value&&!i.disabled);this.list.setActive(this.typed||e<0?t.findIndex(i=>!i.disabled):e),this.syncActive()}syncActive(){if(!this.rendered)return;let t=this.list.getActiveId();t&&this.dd.isOpen()?this.input.setAttribute("aria-activedescendant",t):this.input.removeAttribute("aria-activedescendant")}createControl(){let t=super.createControl(),e=this.input;return this.wrapEl=t,this.config.showValue&&(this.idEl=n("span","op-picker__id"),this.idEl.hidden=!0,t.prepend(this.idEl)),this.list=new d({emptyText:this.config.emptyText,maxHeight:this.config.maxHeight,highlight:""}),e.setAttribute("role","combobox"),e.setAttribute("aria-haspopup","listbox"),e.setAttribute("aria-expanded","false"),e.setAttribute("aria-autocomplete",this.editable()?"list":"none"),e.setAttribute("aria-controls",this.list.id),e.autocomplete="off",this.hasTrigger()&&(this.triggerEl=n("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-hidden":"true"},r("chevron-down")),this.listen(this.triggerEl,"mousedown",i=>i.preventDefault()),this.listen(this.triggerEl,"click",()=>{this.config.disabled||this.config.readonly||(e.focus(),this.toggle())}),t.append(this.triggerEl)),this.dd=new h({anchor:t,content:this.list,matchWidth:!0,role:"presentation"}),this.dd.on("open",()=>{e.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.list.refresh(),this.syncActive(),this.emit("expand")}),this.dd.on("close",()=>{e.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),e.removeAttribute("aria-activedescendant"),this.emit("collapse")}),this.list.on("select",i=>this.pick(i)),this.list.on("active-change",()=>this.syncActive()),this.own(()=>{this.offStore?.(),this.dd.destroy()}),t}onRender(){this.bindStore(),this.loadItems(),super.onRender(),this.editable()?this.config.openOnFocus&&this.listen(this.input,"focus",()=>this.open()):(this.input.readOnly=!0,this.listen(this.input,"click",()=>this.toggle())),this.on("blur",()=>this.settle()),this.refreshList()}onReadonly(t){this.input.readOnly=t||!this.editable(),t&&this.dd?.close()}onDisabled(t){super.onDisabled(t),this.triggerEl&&(this.triggerEl.disabled=t),t&&this.dd?.close()}applyValue(t){let e=this.findItem(t);e?this.selection=e:this.selection&&this.selection.value!==t&&(this.selection=void 0),this.typed=!1,this.input.value=e?e.label:this.display(t),this.el.classList.toggle("has-value",!!this.input.value),this.list?.setSelected(t),this.paintId()}paintId(){let t=this.idEl;if(!t)return;let e=this.selection;t.hidden=!e||this.typed||this.isEmpty(this.value),t.textContent=t.hidden?"":String(e.value),this.wrapEl.style.setProperty("--op-picker-id-width",t.hidden?"0px":`${t.offsetWidth}px`),this.wrapEl.classList.toggle("has-id",!t.hidden)}getDisplayText(){return this.rendered?this.input.value:this.findItem(this.value)?.label??this.display(this.value)}open(){this.config.disabled||this.config.readonly||!this.rendered||(this.typed||this.refreshList(),this.dd.open())}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}pick(t){t.disabled||(this.selection=t,this.typed=!1,this.input.value=t.label,this.el.classList.add("has-value"),this.commit(t.value),this.paintId(),this.close(),this.emit("select",t))}settle(){if(this.close(),!this.editable()||!this.typed)return;this.typed=!1;let t=this.input.value;!t&&this.config.forceSelection!==!1?(this.selection=void 0,this.commit(this.emptyValue())):this.config.forceSelection===!1?(this.selection=void 0,this.commit(t)):this.input.value=this.selection?.label??"",this.el.classList.toggle("has-value",!!this.input.value),this.paintId(),this.refreshList()}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.editable()&&(this.typed=!0,this.paintId(),this.config.forceSelection===!1&&this.commit(this.input.value),this.onType(this.input.value))}onKey(t){let e=this.dd.isOpen();switch(t.key){case"ArrowDown":case"ArrowUp":{if(t.preventDefault(),!e)return this.open();this.list.moveActive(t.key==="ArrowDown"?1:-1);return}case"Enter":e?(t.preventDefault(),this.list.getActive()?this.list.activate():this.close()):super.onKey(t);return;case"Home":case"End":e&&!this.editable()&&(t.preventDefault(),this.list.setActive(t.key==="Home"?this.items.findIndex(i=>!i.disabled):this.items.length-1-[...this.items].reverse().findIndex(i=>!i.disabled)));return;case"Tab":e&&this.typed&&this.config.forceSelection!==!1&&this.list.getActive()&&this.list.activate();return;case" ":this.editable()||(t.preventDefault(),e&&this.list.getActive()?this.list.activate():this.open());return;default:!this.editable()&&t.key.length===1&&!t.ctrlKey&&!t.metaKey&&!t.altKey?this.typeahead(t.key):super.onKey(t)}}typeahead(t){clearTimeout(this.bufferTimer),this.buffer+=t.toLowerCase(),this.bufferTimer=setTimeout(()=>this.buffer="",600),this.own(()=>clearTimeout(this.bufferTimer));let e=this.visibleItems(),i=this.dd.isOpen()?this.list.getActiveIndex():e.findIndex(s=>s.value===this.value),o=[...e.keys()].map((s,p)=>(i+(this.buffer.length>1?0:1)+p)%e.length).find(s=>!e[s].disabled&&e[s].label.toLowerCase().startsWith(this.buffer));o!=null&&(this.dd.isOpen()?this.list.setActive(o):this.pick(e[o]))}setEmptyText(t){this.config.emptyText=t,this.list?.setEmptyText(t)}};export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-EV73ADN2.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
`).forEach((e,s)=>{s&&t.push(document.createElement("br"));for(let i of e.split(_))i&&(i.startsWith("**")&&i.endsWith("**")&&i.length>4?t.push(n("strong","",{},i.slice(2,-2))):i.startsWith("`")&&i.endsWith("`")&&i.length>2?t.push(n("code","op-chat__code",{},i.slice(1,-1))):i.startsWith("*")&&i.endsWith("*")&&i.length>2?t.push(n("em","",{},i.slice(1,-1))):t.push(document.createTextNode(i)))}),t}var
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as b}from"./chunk-2ZUZ5HDL.js";import{c as m}from"./chunk-4EZJ5FKJ.js";import{a as v}from"./chunk-A2NKDOYN.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as E}from"./chunk-TIPK3SCJ.js";import{d as y,e as p,f as a}from"./chunk-MW3RWBZ7.js";p("en",{chatPlaceholder:"Type a message",chatSend:"Send",chatTyping:"{n} is typing\u2026",chatToday:"Today",chatYesterday:"Yesterday",chatEmpty:"No messages yet",chatLog:"Conversation",chatSuggestions:"Suggestions",chatReply:"Reply"});p("pt-BR",{chatPlaceholder:"Digite uma mensagem",chatSend:"Enviar",chatTyping:"{n} est\xE1 digitando\u2026",chatToday:"Hoje",chatYesterday:"Ontem",chatEmpty:"Nenhuma mensagem ainda",chatLog:"Conversa",chatSuggestions:"Sugest\xF5es",chatReply:"Responder"});var _=/(\*\*[^*\n]+\*\*|\*[^*\n]+\*|`[^`\n]+`)/;function L(d){let t=[];return d.split(`
|
|
2
|
+
`).forEach((e,s)=>{s&&t.push(document.createElement("br"));for(let i of e.split(_))i&&(i.startsWith("**")&&i.endsWith("**")&&i.length>4?t.push(n("strong","",{},i.slice(2,-2))):i.startsWith("`")&&i.endsWith("`")&&i.length>2?t.push(n("code","op-chat__code",{},i.slice(1,-1))):i.startsWith("*")&&i.endsWith("*")&&i.length>2?t.push(n("em","",{},i.slice(1,-1))):t.push(document.createTextNode(i)))}),t}var l=d=>new Date(d).toDateString(),M=()=>y()._lang,u=class extends v{baseCls="op-chat";msgs=[];seq=0;logEl;emptyEl;typingEl;chipsEl;input;sendBtn;busy=!1;build(){let t=this.config;return this.logEl=n("div","op-chat__log",{role:"log","aria-live":"polite","aria-relevant":"additions","aria-label":a("chatLog"),tabindex:0}),this.emptyEl=n("div","op-chat__empty",{},a("chatEmpty")),this.typingEl=n("div","op-chat__typing",{"aria-hidden":"true"},n("span","op-chat__dots",{},n("i"),n("i"),n("i")),n("span","op-chat__typing-text")),this.typingEl.hidden=!0,this.chipsEl=n("div","op-chat__suggestions",{role:"group","aria-label":a("chatSuggestions")}),this.input=n("textarea","op-chat__input",{rows:1,placeholder:t.placeholder??a("chatPlaceholder"),"aria-label":t.placeholder??a("chatPlaceholder"),maxlength:t.maxLength??null}),this.sendBtn=new b({icon:"send",variant:"primary",ariaLabel:a("chatSend"),handler:()=>this.submit()}),this.own(()=>this.sendBtn.destroy()),n("div",this.baseCls,{},this.logEl,this.chipsEl,n("div","op-chat__composer",{},this.input,this.sendBtn.el))}onRender(){let t=this.config;this.listen(this.input,"input",()=>this.grow()),this.listen(this.input,"keydown",e=>{e.key!=="Enter"||e.shiftKey||e.isComposing||t.sendOnEnter===!1||(e.preventDefault(),this.submit())}),this.listen(this.chipsEl,"click",e=>{let s=e.target.closest("[data-s]");s&&(this.emit("suggestion",s.dataset.s),this.send(s.dataset.s))}),this.listen(this.logEl,"click",e=>{let s=e.target.closest(".op-chat__msg"),i=s&&this.msgs.find(o=>String(o.id)===s.dataset.id);i&&this.emit("message-click",i)}),this.setReadonly(!!t.readonly),this.msgs=(t.messages??[]).map(e=>this.norm(e)),this.setSuggestions(t.suggestions??[]),this.renderAll()}notifyMount(){super.notifyMount(),this.rendered&&(this.sendBtn.notifyMount(),this.scrollToBottom())}norm(t){let e=t.time==null?Date.now():new Date(t.time).getTime();return{...t,id:t.id??`m${++this.seq}`,at:e}}getMessages(){return this.msgs}addMessage(t){let e=this.norm(t);if(this.msgs.push(e),!this.rendered)return this.config.messages=this.msgs,e;let s=this.nearBottom()||e.from===this.config.me;return this.mountMsg(e,this.msgs.length-1),this.syncEmpty(),s&&this.scrollToBottom(),e}setMessages(t){this.msgs=t.map(e=>this.norm(e)),this.config.messages=this.msgs,this.rendered&&(this.renderAll(),this.scrollToBottom())}updateMessage(t,e){let s=this.msgs.findIndex(g=>g.id===t);if(s<0)return;let i=this.nearBottom();if(this.msgs[s]={...this.msgs[s],...e,at:e.time!=null?new Date(e.time).getTime():this.msgs[s].at},!this.rendered)return;let o=this.msgEl(t),r=this.buildMsg(this.msgs[s],s);o?o.replaceWith(r):this.logEl.insertBefore(r,this.typingEl),this.decorate(s),i&&this.scrollToBottom()}appendToMessage(t,e){let s=this.msgs.find(r=>r.id===t);if(!s)return;s.text+=e;let i=this.msgEl(t)?.querySelector(".op-chat__text");if(!i)return;let o=this.nearBottom();this.fill(i,s),o&&this.scrollToBottom()}removeMessage(t){this.msgs=this.msgs.filter(e=>e.id!==t),this.rendered&&this.renderAll()}msgEl(t){return this.logEl.querySelector(`[data-id="${CSS.escape(String(t))}"]`)}renderAll(){this.logEl.replaceChildren(this.emptyEl,...this.msgs.flatMap((t,e)=>this.nodesFor(t,e)),this.typingEl),this.syncEmpty()}nodesFor(t,e){let s=this.msgs[e-1],i=[];return(!s||l(s.at)!==l(t.at))&&i.push(n("div","op-chat__day",{role:"separator"},n("span","",{},this.dayLabel(t.at)))),i.push(this.buildMsg(t,e)),i}mountMsg(t,e){for(let s of this.nodesFor(t,e))this.logEl.insertBefore(s,this.typingEl);this.decorate(e-1),this.decorate(e)}dayLabel(t){let e=l(t),s=Date.now();return e===l(s)?a("chatToday"):e===l(s-864e5)?a("chatYesterday"):new Intl.DateTimeFormat(M(),{dateStyle:"medium"}).format(t)}fill(t,e){let s=this.config.renderer?this.config.renderer(e):L(e.text);t.replaceChildren(...Array.isArray(s)?s:[s])}buildMsg(t,e){let s=this.config,i=t.from===s.me,o=s.users?.[t.from],r=n("article",`op-chat__msg ${i?"is-me":"is-them"}`,{"data-id":String(t.id)}),g=n("div","op-chat__bubble");if(!i&&s.showAuthors!==!1&&o){let c=n("div","op-chat__author",{},o.name);o.color&&(c.style.color=o.color),g.append(c)}let h=t.replyTo!=null?this.msgs.find(c=>c.id===t.replyTo):void 0;h&&g.append(n("div","op-chat__reply",{"aria-label":a("chatReply")},n("strong","",{},h.from===s.me?"":s.users?.[h.from]?.name??h.from),h.text.length>80?`${h.text.slice(0,80)}\u2026`:h.text));let f=n("div","op-chat__text");this.fill(f,t);let T=new Intl.DateTimeFormat(M(),{hour:"2-digit",minute:"2-digit"}).format(t.at);return g.append(f,n("span","op-chat__meta",{},n("time","",{datetime:new Date(t.at).toISOString()},T),i&&t.status?this.statusEl(t.status):"")),r.append(g),this.group(r,e),r}statusEl(t){let e=n("span",`op-chat__status is-${t}`,{role:"img","aria-label":t});return t==="error"?e.append(m("alert")):t!=="sending"&&e.append(m("check"),...t==="sent"?[]:[m("check")]),e}group(t,e){let s=this.msgs[e],i=(o,r)=>!!o&&!!r&&o.from===r.from&&l(o.at)===l(r.at);t.classList.toggle("is-first",!i(this.msgs[e-1],s)),t.classList.toggle("is-last",!i(s,this.msgs[e+1])),t.querySelector(".op-chat__author")?.toggleAttribute("hidden",i(this.msgs[e-1],s))}decorate(t){let e=this.msgs[t],s=e&&this.msgEl(e.id);s&&this.group(s,t)}syncEmpty(){this.emptyEl.hidden=this.msgs.length>0,this.el.classList.toggle("is-empty",!this.msgs.length)}nearBottom(){let t=this.logEl;return t.scrollHeight-t.scrollTop-t.clientHeight<48}scrollToBottom(){this.render(),this.logEl.scrollTop=this.logEl.scrollHeight}setTyping(t){let e=this.nearBottom();this.typingEl.hidden=!t,this.typingEl.querySelector(".op-chat__typing-text").textContent=typeof t=="string"?a("chatTyping",{n:t}):"",t&&e&&this.scrollToBottom()}setSuggestions(t){this.config.suggestions=t,this.rendered&&(this.chipsEl.hidden=!t.length,this.chipsEl.replaceChildren(...t.map(e=>n("button","op-chat__chip",{type:"button","data-s":e},e))))}setBusy(t){this.busy=t,this.el.classList.toggle("is-busy",t),this.logEl.setAttribute("aria-busy",String(t)),this.sendBtn.setDisabled(t||!!this.config.readonly);for(let e of Array.from(this.chipsEl.children))e.disabled=t||!!this.config.readonly}setReadonly(t){this.config.readonly=t,this.rendered&&(this.input.readOnly=t,this.el.classList.toggle("is-readonly",t),this.setBusy(this.busy))}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}focus(){this.render(),this.input.focus()}grow(){this.input.style.height="auto",this.input.style.height=`${this.input.scrollHeight}px`}submit(){let t=this.input.value;this.send(t)&&(this.input.value="",this.grow())}send(t){if(t=t.trim(),!t||this.busy||this.config.readonly||this.emit("before-send",t)===!1)return!1;let e=this.addMessage({from:this.config.me,text:t,time:Date.now(),status:"sending"});return this.emit("send",t,e),!0}};E("chat",u);export{u as a};
|
|
3
|
+
//# sourceMappingURL=chunk-FEHGU6EP.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/chat/chat/chat.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport { Button } from '../../base/button/button';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n chatPlaceholder: 'Type a message',\n chatSend: 'Send',\n chatTyping: '{n} is typing\u2026',\n chatToday: 'Today',\n chatYesterday: 'Yesterday',\n chatEmpty: 'No messages yet',\n chatLog: 'Conversation',\n chatSuggestions: 'Suggestions',\n chatReply: 'Reply',\n});\naddMessages('pt-BR', {\n chatPlaceholder: 'Digite uma mensagem',\n chatSend: 'Enviar',\n chatTyping: '{n} est\u00E1 digitando\u2026',\n chatToday: 'Hoje',\n chatYesterday: 'Ontem',\n chatEmpty: 'Nenhuma mensagem ainda',\n chatLog: 'Conversa',\n chatSuggestions: 'Sugest\u00F5es',\n chatReply: 'Responder',\n});\n\nexport interface ChatMessage {\n id?: string | number;\n /** The author's id (compare with the `me` of the config). */\n from: string;\n text: string;\n time?: number | Date | string;\n status?: 'sending' | 'sent' | 'delivered' | 'read' | 'error';\n /** The id of the message this one answers (shown as a quote). */\n replyTo?: string | number;\n /** Anything the app wants to keep with the message. */\n meta?: unknown;\n}\n\nexport interface ChatConfig extends ComponentConfig {\n messages?: ChatMessage[];\n /** The id of whoever is using the chat: their messages go on the right. */\n me: string;\n users?: Record<string, { name: string; color?: string }>;\n /** Show the author's name above the first bubble of a group of theirs. Default true. */\n showAuthors?: boolean;\n placeholder?: string;\n /** Prompt chips above the composer; clicking one sends it. */\n suggestions?: string[];\n readonly?: boolean;\n /** Enter sends and Shift+Enter breaks the line. Default true. */\n sendOnEnter?: boolean;\n maxLength?: number;\n /** Custom bubble content. The default is a minimal, safe formatting (`**bold**`, `*italic*`, `` `code` ``, line breaks). */\n renderer?: (msg: ChatMessage) => string | Node;\n}\n\ntype Msg = ChatMessage & { id: string | number; at: number };\n\nconst INLINE = /(\\*\\*[^*\\n]+\\*\\*|\\*[^*\\n]+\\*|`[^`\\n]+`)/;\n\n/** Text \u2192 nodes: bold, italic, code and line breaks only. Everything else stays text, so nothing can inject markup. */\nfunction format(text: string): Node[] {\n const out: Node[] = [];\n text.split('\\n').forEach((line, i) => {\n if (i) out.push(document.createElement('br'));\n for (const part of line.split(INLINE)) {\n if (!part) continue;\n if (part.startsWith('**') && part.endsWith('**') && part.length > 4) out.push(h('strong', '', {}, part.slice(2, -2)));\n else if (part.startsWith('`') && part.endsWith('`') && part.length > 2) out.push(h('code', 'op-chat__code', {}, part.slice(1, -1)));\n else if (part.startsWith('*') && part.endsWith('*') && part.length > 2) out.push(h('em', '', {}, part.slice(1, -1)));\n else out.push(document.createTextNode(part));\n }\n });\n return out;\n}\n\nconst dayKey = (at: number) => new Date(at).toDateString();\nconst lang = () => getLocale()._lang;\n\n/** Conversation view: bubbles grouped by author and day, delivery ticks, typing dots, streaming text, prompt chips and a composer. */\nexport class Chat extends Component<ChatConfig> {\n protected override baseCls = 'op-chat';\n private msgs: Msg[] = [];\n private seq = 0;\n private logEl!: HTMLElement;\n private emptyEl!: HTMLElement;\n private typingEl!: HTMLElement;\n private chipsEl!: HTMLElement;\n private input!: HTMLTextAreaElement;\n private sendBtn!: Button;\n private busy = false;\n\n protected override build() {\n const c = this.config;\n this.logEl = h('div', 'op-chat__log', { role: 'log', 'aria-live': 'polite', 'aria-relevant': 'additions', 'aria-label': t('chatLog'), tabindex: 0 });\n this.emptyEl = h('div', 'op-chat__empty', {}, t('chatEmpty'));\n this.typingEl = h('div', 'op-chat__typing', { 'aria-hidden': 'true' }, h('span', 'op-chat__dots', {}, h('i'), h('i'), h('i')), h('span', 'op-chat__typing-text'));\n this.typingEl.hidden = true;\n this.chipsEl = h('div', 'op-chat__suggestions', { role: 'group', 'aria-label': t('chatSuggestions') });\n this.input = h('textarea', 'op-chat__input', { rows: 1, placeholder: c.placeholder ?? t('chatPlaceholder'), 'aria-label': c.placeholder ?? t('chatPlaceholder'), maxlength: c.maxLength ?? null });\n this.sendBtn = new Button({ icon: 'send', variant: 'primary', ariaLabel: t('chatSend'), handler: () => this.submit() });\n this.own(() => this.sendBtn.destroy());\n return h('div', this.baseCls, {}, this.logEl, this.chipsEl, h('div', 'op-chat__composer', {}, this.input, this.sendBtn.el));\n }\n\n protected override onRender() {\n const c = this.config;\n this.listen(this.input, 'input', () => this.grow());\n this.listen(this.input, 'keydown', (e: KeyboardEvent) => {\n if (e.key !== 'Enter' || e.shiftKey || e.isComposing || c.sendOnEnter === false) return;\n e.preventDefault();\n this.submit();\n });\n this.listen(this.chipsEl, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-s]');\n if (!b) return;\n this.emit('suggestion', b.dataset.s);\n this.send(b.dataset.s!);\n });\n this.listen(this.logEl, 'click', (e: Event) => {\n const el = (e.target as HTMLElement).closest<HTMLElement>('.op-chat__msg');\n const m = el && this.msgs.find((x) => String(x.id) === el.dataset.id);\n if (m) this.emit('message-click', m);\n });\n this.setReadonly(!!c.readonly);\n this.msgs = (c.messages ?? []).map((m) => this.norm(m));\n this.setSuggestions(c.suggestions ?? []);\n this.renderAll();\n }\n\n override notifyMount() {\n super.notifyMount();\n if (!this.rendered) return; // a Chat in a lazy tab is told it is mounted before it has a DOM\n this.sendBtn.notifyMount();\n this.scrollToBottom();\n }\n\n // ---- messages ------------------------------------------------------------------------------\n\n private norm(m: ChatMessage): Msg {\n const at = m.time == null ? Date.now() : new Date(m.time).getTime();\n return { ...m, id: m.id ?? `m${++this.seq}`, at };\n }\n\n getMessages(): ChatMessage[] {\n return this.msgs;\n }\n\n addMessage(msg: ChatMessage): ChatMessage {\n const m = this.norm(msg);\n this.msgs.push(m);\n if (!this.rendered) return (this.config.messages = this.msgs, m);\n const stick = this.nearBottom() || m.from === this.config.me;\n this.mountMsg(m, this.msgs.length - 1);\n this.syncEmpty();\n if (stick) this.scrollToBottom();\n return m;\n }\n\n setMessages(list: ChatMessage[]): void {\n this.msgs = list.map((m) => this.norm(m));\n this.config.messages = this.msgs; // so a chat that is not rendered yet (a lazy tab) starts with them\n if (this.rendered) {\n this.renderAll();\n this.scrollToBottom();\n }\n }\n\n updateMessage(id: string | number, patch: Partial<ChatMessage>): void {\n const i = this.msgs.findIndex((m) => m.id === id);\n if (i < 0) return;\n const stick = this.nearBottom();\n this.msgs[i] = { ...this.msgs[i], ...patch, at: patch.time != null ? new Date(patch.time).getTime() : this.msgs[i].at };\n if (!this.rendered) return;\n const old = this.msgEl(id);\n const fresh = this.buildMsg(this.msgs[i], i);\n old ? old.replaceWith(fresh) : this.logEl.insertBefore(fresh, this.typingEl);\n this.decorate(i);\n if (stick) this.scrollToBottom();\n }\n\n /** Adds text to a message: for answers that arrive in pieces (AI streaming). Only that bubble's text is redrawn. */\n appendToMessage(id: string | number, text: string): void {\n const m = this.msgs.find((x) => x.id === id);\n if (!m) return;\n m.text += text;\n const el = this.msgEl(id)?.querySelector('.op-chat__text');\n if (!el) return;\n const stick = this.nearBottom();\n this.fill(el as HTMLElement, m);\n if (stick) this.scrollToBottom();\n }\n\n removeMessage(id: string | number): void {\n this.msgs = this.msgs.filter((m) => m.id !== id);\n if (this.rendered) this.renderAll();\n }\n\n private msgEl(id: string | number): HTMLElement | null {\n return this.logEl.querySelector(`[data-id=\"${CSS.escape(String(id))}\"]`);\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n private renderAll(): void {\n this.logEl.replaceChildren(this.emptyEl, ...this.msgs.flatMap((m, i) => this.nodesFor(m, i)), this.typingEl);\n this.syncEmpty();\n }\n\n /** The day separator (when the day changes) and the message itself. */\n private nodesFor(m: Msg, i: number): HTMLElement[] {\n const prev = this.msgs[i - 1];\n const nodes: HTMLElement[] = [];\n if (!prev || dayKey(prev.at) !== dayKey(m.at)) nodes.push(h('div', 'op-chat__day', { role: 'separator' }, h('span', '', {}, this.dayLabel(m.at))));\n nodes.push(this.buildMsg(m, i));\n return nodes;\n }\n\n private mountMsg(m: Msg, i: number): void {\n for (const n of this.nodesFor(m, i)) this.logEl.insertBefore(n, this.typingEl);\n this.decorate(i - 1);\n this.decorate(i);\n }\n\n private dayLabel(at: number): string {\n const d = dayKey(at);\n const now = Date.now();\n if (d === dayKey(now)) return t('chatToday');\n if (d === dayKey(now - 864e5)) return t('chatYesterday');\n return new Intl.DateTimeFormat(lang(), { dateStyle: 'medium' }).format(at);\n }\n\n private fill(el: HTMLElement, m: Msg): void {\n const out = this.config.renderer ? this.config.renderer(m) : format(m.text);\n el.replaceChildren(...(Array.isArray(out) ? out : [out]));\n }\n\n private buildMsg(m: Msg, i: number): HTMLElement {\n const c = this.config;\n const mine = m.from === c.me;\n const user = c.users?.[m.from];\n const el = h('article', `op-chat__msg ${mine ? 'is-me' : 'is-them'}`, { 'data-id': String(m.id) });\n const bubble = h('div', 'op-chat__bubble');\n if (!mine && c.showAuthors !== false && user) {\n const name = h('div', 'op-chat__author', {}, user.name);\n if (user.color) name.style.color = user.color;\n bubble.append(name);\n }\n const quoted = m.replyTo != null ? this.msgs.find((x) => x.id === m.replyTo) : undefined;\n if (quoted) bubble.append(h('div', 'op-chat__reply', { 'aria-label': t('chatReply') }, h('strong', '', {}, quoted.from === c.me ? '' : (c.users?.[quoted.from]?.name ?? quoted.from)), quoted.text.length > 80 ? `${quoted.text.slice(0, 80)}\u2026` : quoted.text));\n const text = h('div', 'op-chat__text');\n this.fill(text, m);\n const time = new Intl.DateTimeFormat(lang(), { hour: '2-digit', minute: '2-digit' }).format(m.at);\n bubble.append(text, h('span', 'op-chat__meta', {}, h('time', '', { datetime: new Date(m.at).toISOString() }, time), mine && m.status ? this.statusEl(m.status) : ''));\n el.append(bubble);\n this.group(el, i);\n return el;\n }\n\n private statusEl(s: NonNullable<ChatMessage['status']>): HTMLElement {\n const el = h('span', `op-chat__status is-${s}`, { role: 'img', 'aria-label': s });\n if (s === 'error') el.append(iconEl('alert'));\n else if (s !== 'sending') el.append(iconEl('check'), ...(s === 'sent' ? [] : [iconEl('check')]));\n return el;\n }\n\n /** Group classes: first/last bubble of a run by the same author on the same day. */\n private group(el: HTMLElement, i: number): void {\n const m = this.msgs[i];\n const same = (a?: Msg, b?: Msg) => !!a && !!b && a.from === b.from && dayKey(a.at) === dayKey(b.at);\n el.classList.toggle('is-first', !same(this.msgs[i - 1], m));\n el.classList.toggle('is-last', !same(m, this.msgs[i + 1]));\n el.querySelector('.op-chat__author')?.toggleAttribute('hidden', same(this.msgs[i - 1], m));\n }\n\n private decorate(i: number): void {\n const m = this.msgs[i];\n const el = m && this.msgEl(m.id);\n if (el) this.group(el, i);\n }\n\n private syncEmpty(): void {\n this.emptyEl.hidden = this.msgs.length > 0;\n this.el.classList.toggle('is-empty', !this.msgs.length);\n }\n\n private nearBottom(): boolean {\n const l = this.logEl;\n return l.scrollHeight - l.scrollTop - l.clientHeight < 48;\n }\n\n scrollToBottom(): void {\n this.render();\n this.logEl.scrollTop = this.logEl.scrollHeight;\n }\n\n // ---- typing, suggestions, state ------------------------------------------------------------\n\n /** `true` shows the dots, a name shows \"name is typing\u2026\", `false` hides them. */\n setTyping(who: boolean | string): void {\n const stick = this.nearBottom();\n this.typingEl.hidden = !who;\n this.typingEl.querySelector('.op-chat__typing-text')!.textContent = typeof who === 'string' ? t('chatTyping', { n: who }) : '';\n if (who && stick) this.scrollToBottom();\n }\n\n setSuggestions(list: string[]): void {\n this.config.suggestions = list;\n if (!this.rendered) return;\n this.chipsEl.hidden = !list.length;\n this.chipsEl.replaceChildren(...list.map((s) => h('button', 'op-chat__chip', { type: 'button', 'data-s': s }, s)));\n }\n\n /** While busy (an answer is on its way) sending is off and the log tells assistive tech to wait. */\n setBusy(busy: boolean): void {\n this.busy = busy;\n this.el.classList.toggle('is-busy', busy);\n this.logEl.setAttribute('aria-busy', String(busy));\n this.sendBtn.setDisabled(busy || !!this.config.readonly);\n for (const b of Array.from(this.chipsEl.children) as HTMLButtonElement[]) b.disabled = busy || !!this.config.readonly;\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n if (!this.rendered) return;\n this.input.readOnly = readonly;\n this.el.classList.toggle('is-readonly', readonly);\n this.setBusy(this.busy);\n }\n\n setPlaceholder(text: string): void {\n this.config.placeholder = text;\n if (this.rendered) this.input.placeholder = text;\n }\n\n override focus(): void {\n this.render();\n this.input.focus();\n }\n\n // ---- sending -------------------------------------------------------------------------------\n\n private grow(): void {\n this.input.style.height = 'auto';\n this.input.style.height = `${this.input.scrollHeight}px`;\n }\n\n private submit(): void {\n const text = this.input.value;\n if (this.send(text)) {\n this.input.value = '';\n this.grow();\n }\n }\n\n /** The same path as the send button. Returns false when nothing was sent (empty, busy, read-only or cancelled). */\n send(text: string): boolean {\n text = text.trim();\n if (!text || this.busy || this.config.readonly || this.emit('before-send', text) === false) return false;\n const msg = this.addMessage({ from: this.config.me, text, time: Date.now(), status: 'sending' });\n this.emit('send', text, msg);\n return true;\n }\n}\nregister('chat', Chat);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "INLINE", "format", "text", "out", "line", "i", "part", "h", "dayKey", "at", "lang", "getLocale", "Chat", "Component", "c", "t", "Button", "b", "el", "m", "x", "msg", "stick", "list", "id", "patch", "old", "fresh", "prev", "nodes", "n", "d", "now", "mine", "user", "bubble", "name", "quoted", "time", "s", "iconEl", "same", "a", "l", "who", "busy", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as E,b as o,c as M,d as c,e as g,h as S}from"./chunk-5JEXM5S7.js";import{c as w}from"./chunk-4EZJ5FKJ.js";import{a as k}from"./chunk-A2NKDOYN.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as C}from"./chunk-TIPK3SCJ.js";import{d as L,e as D,f as v}from"./chunk-MW3RWBZ7.js";D("en",{dateMin:"Date must be on or after {n}",dateMax:"Date must be on or before {n}",calPrev:"Previous",calNext:"Next",calOpen:"Open calendar",calMonth:"Choose month"});D("pt-BR",{dateMin:"A data deve ser {n} ou posterior",dateMax:"A data deve ser {n} ou anterior",calPrev:"Anterior",calNext:"Pr\xF3ximo",calOpen:"Abrir calend\xE1rio",calMonth:"Escolher m\xEAs"});var f=(_,t)=>new Intl.DateTimeFormat(L()._lang,_).format(t),x=class extends k{baseCls="op-calendar";cursor=M();mode="days";titleEl;bodyEl;prevEl;nextEl;build(){let t=n("div","op-calendar",{role:"dialog","aria-label":v("calMonth")});return this.prevEl=n("button","op-calendar__nav",{type:"button","aria-label":v("calPrev")},w("chevron-left")),this.nextEl=n("button","op-calendar__nav",{type:"button","aria-label":v("calNext")},w("chevron-right")),this.titleEl=n("button","op-calendar__title",{type:"button","aria-live":"polite"}),this.bodyEl=n("div","op-calendar__body"),t.append(n("div","op-calendar__header",{},this.prevEl,this.titleEl,this.nextEl),this.bodyEl),t}onRender(){let t=this.first();t&&o(t)&&(this.cursor=t),this.listen(this.prevEl,"click",()=>this.step(-1)),this.listen(this.nextEl,"click",()=>this.step(1)),this.listen(this.titleEl,"click",()=>{this.mode=this.mode==="days"?"months":"days",this.paint()}),this.listen(this.bodyEl,"click",e=>{let s=e.target.closest("[data-iso],[data-month]");if(s)if(s.dataset.month){let[i,r]=s.dataset.month.split("-").map(Number),p=o(this.cursor);this.cursor=g(this.cursor,(i-p.getFullYear())*12+(r-1-p.getMonth())),this.mode="days",this.paint(),this.emit("navigate",i,r-1),this.focusDay()}else this.choose(s.dataset.iso)}),this.listen(this.bodyEl,"keydown",e=>this.onKey(e)),this.paint()}blocked(t){let{min:e,max:s,isDisabled:i}=this.config;return!!e&&t<e||!!s&&t>s||!!i?.(t)}span(){let t=this.config.value;return t?typeof t=="string"?{start:t,end:t}:t:{start:null,end:null}}first(){return this.span().start}choose(t){if(this.blocked(t))return;if(!this.config.range)return this.setValue(t),void this.emit("select",t);let{start:e,end:s}=this.span();if(e&&!s){let i=t<e?{start:t,end:e}:{start:e,end:t};this.setValue(i),this.emit("select",i)}else this.setValue({start:t,end:null}),this.emit("start",t)}step(t){this.cursor=this.mode==="days"?g(this.cursor,t):g(this.cursor,t*12),this.paint();let e=o(this.cursor);this.emit("navigate",e.getFullYear(),e.getMonth())}move(t){let e=o(this.cursor);this.cursor=t;let s=o(t);this.paint(),(s.getMonth()!==e.getMonth()||s.getFullYear()!==e.getFullYear())&&this.emit("navigate",s.getFullYear(),s.getMonth()),this.focusDay()}onKey(t){if(this.mode!=="days")return;let e=this.cursor,s=(o(e).getDay()-this.weekStart()+7)%7,i={ArrowLeft:c(e,-1),ArrowRight:c(e,1),ArrowUp:c(e,-7),ArrowDown:c(e,7),Home:c(e,-s),End:c(e,6-s),PageUp:g(e,t.shiftKey?-12:-1),PageDown:g(e,t.shiftKey?12:1)};i[t.key]?(t.preventDefault(),this.move(i[t.key])):(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),this.choose(e))}weekStart(){return this.config.firstDay??S()}paint(){let t=o(this.cursor);this.el.classList.toggle("is-months",this.mode==="months"),this.titleEl.textContent=this.mode==="days"?f({month:"long",year:"numeric"},t):String(t.getFullYear()),this.mode==="days"?this.paintDays(t):this.paintMonths(t)}paintDays(t){let e=this.weekStart(),s=n("tr");for(let d=0;d<7;d++){let m=new Date(2023,0,1+(e+d)%7);s.append(n("th","op-calendar__dow",{scope:"col",abbr:f({weekday:"long"},m)},f({weekday:"short"},m)))}let i=[],r=new Date(t.getFullYear(),t.getMonth(),1);r.setDate(1-(r.getDay()-e+7)%7);let p=M(),{start:h,end:u}=this.config.range?this.span():{start:this.first(),end:this.first()};for(let d=0;d<6;d++){let m=n("tr");for(let b=0;b<7;b++){let y=new Date(r.getFullYear(),r.getMonth(),r.getDate()+d*7+b),a=E(y),l=n("td","op-calendar__day",{role:"gridcell","data-iso":a,tabindex:a===this.cursor?0:-1,"aria-selected":String(!!h&&a>=h&&a<=(u??h)),"aria-label":f({dateStyle:"full"},y),"aria-disabled":this.blocked(a)?"true":null,"aria-current":a===p?"date":null},String(y.getDate()));l.classList.toggle("is-outside",y.getMonth()!==t.getMonth()),l.classList.toggle("is-today",a===p),l.classList.toggle("is-selected",a===h||a===u),l.classList.toggle("is-in-range",!!h&&!!u&&a>h&&a<u),l.classList.toggle("is-range-start",!!this.config.range&&a===h),l.classList.toggle("is-range-end",!!this.config.range&&a===u),l.classList.toggle("is-disabled",this.blocked(a)),m.append(l)}i.push(m)}this.bodyEl.replaceChildren(n("table","op-calendar__grid",{role:"grid"},n("thead","",{},s),n("tbody","",{},...i)))}paintMonths(t){let e=Array.from({length:12},(s,i)=>{let r=n("button","op-calendar__month",{type:"button","data-month":`${t.getFullYear()}-${String(i+1).padStart(2,"0")}`},f({month:"short"},new Date(2e3,i,1)));return r.classList.toggle("is-selected",i===t.getMonth()),r});this.bodyEl.replaceChildren(n("div","op-calendar__months",{},...e))}setValue(t){this.config.value=t;let e=this.first();e&&o(e)&&(this.cursor=e),this.rendered&&(this.mode="days",this.paint())}setRange(t){this.config.range=t,this.config.value=null,this.rendered&&this.paint()}setMin(t){this.config.min=t,this.rendered&&this.paint()}setMax(t){this.config.max=t,this.rendered&&this.paint()}showMonth(t,e){this.cursor=E(new Date(t,e,1)),this.rendered&&this.paint()}focusDay(){this.render(),this.bodyEl.querySelector('[tabindex="0"]')?.focus()}};C("calendar",x);export{x as a};
|
|
2
|
+
//# sourceMappingURL=chunk-G2DAD3MQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/dates/calendar/calendar.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport { toISO, fromISO, today, addDays, addMonths, firstDay } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n dateMin: 'Date must be on or after {n}',\n dateMax: 'Date must be on or before {n}',\n calPrev: 'Previous',\n calNext: 'Next',\n calOpen: 'Open calendar',\n calMonth: 'Choose month',\n});\naddMessages('pt-BR', {\n dateMin: 'A data deve ser {n} ou posterior',\n dateMax: 'A data deve ser {n} ou anterior',\n calPrev: 'Anterior',\n calNext: 'Pr\u00F3ximo',\n calOpen: 'Abrir calend\u00E1rio',\n calMonth: 'Escolher m\u00EAs',\n});\n\n/** Both ends are `YYYY-MM-DD`; `end` is null while the user has only picked the first day. */\nexport interface DateRange {\n start: string | null;\n end: string | null;\n}\n\nexport interface CalendarConfig extends ComponentConfig {\n /** Selected day, `YYYY-MM-DD`; with `range: true`, a `DateRange`. */\n value?: string | DateRange | null;\n /** Pick a start and an end day (two clicks). */\n range?: boolean;\n min?: string;\n max?: string;\n /** 0 = Sunday. Default: the locale's. */\n firstDay?: number;\n isDisabled?: (iso: string) => boolean;\n}\n\nconst fmt = (opts: Intl.DateTimeFormatOptions, d: Date) => new Intl.DateTimeFormat(getLocale()._lang, opts).format(d);\n\n/** Month calendar. Click the title to pick a month; arrow keys, Page keys and Home/End move the focused day. */\nexport class Calendar extends Component<CalendarConfig> {\n protected override baseCls = 'op-calendar';\n private cursor = today(); // the focused day; its month is the visible month\n private mode: 'days' | 'months' = 'days';\n private titleEl!: HTMLElement;\n private bodyEl!: HTMLElement;\n private prevEl!: HTMLButtonElement;\n private nextEl!: HTMLButtonElement;\n\n protected override build() {\n const el = h('div', 'op-calendar', { role: 'dialog', 'aria-label': t('calMonth') });\n this.prevEl = h('button', 'op-calendar__nav', { type: 'button', 'aria-label': t('calPrev') }, iconEl('chevron-left'));\n this.nextEl = h('button', 'op-calendar__nav', { type: 'button', 'aria-label': t('calNext') }, iconEl('chevron-right'));\n this.titleEl = h('button', 'op-calendar__title', { type: 'button', 'aria-live': 'polite' });\n this.bodyEl = h('div', 'op-calendar__body');\n el.append(h('div', 'op-calendar__header', {}, this.prevEl, this.titleEl, this.nextEl), this.bodyEl);\n return el;\n }\n\n protected override onRender() {\n const v = this.first();\n if (v && fromISO(v)) this.cursor = v;\n this.listen(this.prevEl, 'click', () => this.step(-1));\n this.listen(this.nextEl, 'click', () => this.step(1));\n this.listen(this.titleEl, 'click', () => {\n this.mode = this.mode === 'days' ? 'months' : 'days';\n this.paint();\n });\n this.listen(this.bodyEl, 'click', (e: Event) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-iso],[data-month]');\n if (!cell) return;\n if (cell.dataset.month) {\n const [y, m] = cell.dataset.month.split('-').map(Number);\n const cur = fromISO(this.cursor)!;\n this.cursor = addMonths(this.cursor, (y - cur.getFullYear()) * 12 + (m - 1 - cur.getMonth()));\n this.mode = 'days';\n this.paint();\n this.emit('navigate', y, m - 1);\n this.focusDay();\n } else this.choose(cell.dataset.iso!);\n });\n this.listen(this.bodyEl, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.paint();\n }\n\n private blocked(iso: string) {\n const { min, max, isDisabled } = this.config;\n return (!!min && iso < min) || (!!max && iso > max) || !!isDisabled?.(iso);\n }\n\n /** The value as a range (a single day is a one-day range). */\n private span(): DateRange {\n const v = this.config.value;\n return !v ? { start: null, end: null } : typeof v === 'string' ? { start: v, end: v } : v;\n }\n private first(): string | null {\n return this.span().start;\n }\n\n private choose(iso: string) {\n if (this.blocked(iso)) return;\n if (!this.config.range) {\n this.setValue(iso);\n return void this.emit('select', iso);\n }\n const { start, end } = this.span();\n if (start && !end) {\n const r = iso < start ? { start: iso, end: start } : { start, end: iso };\n this.setValue(r);\n this.emit('select', r);\n } else {\n this.setValue({ start: iso, end: null });\n this.emit('start', iso);\n }\n }\n\n private step(dir: number) {\n this.cursor = this.mode === 'days' ? addMonths(this.cursor, dir) : addMonths(this.cursor, dir * 12);\n this.paint();\n const d = fromISO(this.cursor)!;\n this.emit('navigate', d.getFullYear(), d.getMonth());\n }\n\n private move(next: string) {\n const before = fromISO(this.cursor)!;\n this.cursor = next;\n const d = fromISO(next)!;\n this.paint();\n if (d.getMonth() !== before.getMonth() || d.getFullYear() !== before.getFullYear()) this.emit('navigate', d.getFullYear(), d.getMonth());\n this.focusDay();\n }\n\n private onKey(e: KeyboardEvent) {\n if (this.mode !== 'days') return;\n const c = this.cursor;\n const dow = (fromISO(c)!.getDay() - this.weekStart() + 7) % 7;\n const moves: Record<string, string> = {\n ArrowLeft: addDays(c, -1),\n ArrowRight: addDays(c, 1),\n ArrowUp: addDays(c, -7),\n ArrowDown: addDays(c, 7),\n Home: addDays(c, -dow),\n End: addDays(c, 6 - dow),\n PageUp: addMonths(c, e.shiftKey ? -12 : -1),\n PageDown: addMonths(c, e.shiftKey ? 12 : 1),\n };\n if (moves[e.key]) {\n e.preventDefault();\n this.move(moves[e.key]);\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.choose(c);\n }\n }\n\n private weekStart() {\n return this.config.firstDay ?? firstDay();\n }\n\n private paint() {\n const cur = fromISO(this.cursor)!;\n this.el.classList.toggle('is-months', this.mode === 'months');\n this.titleEl.textContent = this.mode === 'days' ? fmt({ month: 'long', year: 'numeric' }, cur) : String(cur.getFullYear());\n this.mode === 'days' ? this.paintDays(cur) : this.paintMonths(cur);\n }\n\n private paintDays(cur: Date) {\n const first = this.weekStart();\n const head = h('tr');\n for (let i = 0; i < 7; i++) {\n const d = new Date(2023, 0, 1 + ((first + i) % 7)); // 2023-01-01 is a Sunday\n head.append(h('th', 'op-calendar__dow', { scope: 'col', abbr: fmt({ weekday: 'long' }, d) }, fmt({ weekday: 'short' }, d)));\n }\n const rows: HTMLElement[] = [];\n const start = new Date(cur.getFullYear(), cur.getMonth(), 1);\n start.setDate(1 - ((start.getDay() - first + 7) % 7));\n const todayIso = today();\n const { start: from, end: to } = this.config.range ? this.span() : { start: this.first(), end: this.first() };\n for (let w = 0; w < 6; w++) {\n const tr = h('tr');\n for (let d = 0; d < 7; d++) {\n const day = new Date(start.getFullYear(), start.getMonth(), start.getDate() + w * 7 + d);\n const iso = toISO(day);\n const td = h('td', 'op-calendar__day', {\n role: 'gridcell',\n 'data-iso': iso,\n tabindex: iso === this.cursor ? 0 : -1,\n 'aria-selected': String(!!from && iso >= from && iso <= (to ?? from)),\n 'aria-label': fmt({ dateStyle: 'full' }, day),\n 'aria-disabled': this.blocked(iso) ? 'true' : null,\n 'aria-current': iso === todayIso ? 'date' : null,\n }, String(day.getDate()));\n td.classList.toggle('is-outside', day.getMonth() !== cur.getMonth());\n td.classList.toggle('is-today', iso === todayIso);\n td.classList.toggle('is-selected', iso === from || iso === to);\n td.classList.toggle('is-in-range', !!from && !!to && iso > from && iso < to);\n td.classList.toggle('is-range-start', !!this.config.range && iso === from);\n td.classList.toggle('is-range-end', !!this.config.range && iso === to);\n td.classList.toggle('is-disabled', this.blocked(iso));\n tr.append(td);\n }\n rows.push(tr);\n }\n this.bodyEl.replaceChildren(h('table', 'op-calendar__grid', { role: 'grid' }, h('thead', '', {}, head), h('tbody', '', {}, ...rows)));\n }\n\n private paintMonths(cur: Date) {\n const cells = Array.from({ length: 12 }, (_, m) => {\n const b = h('button', 'op-calendar__month', { type: 'button', 'data-month': `${cur.getFullYear()}-${String(m + 1).padStart(2, '0')}` }, fmt({ month: 'short' }, new Date(2000, m, 1)));\n b.classList.toggle('is-selected', m === cur.getMonth());\n return b;\n });\n this.bodyEl.replaceChildren(h('div', 'op-calendar__months', {}, ...cells));\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n setValue(value: string | DateRange | null) {\n this.config.value = value;\n const iso = this.first();\n if (iso && fromISO(iso)) this.cursor = iso;\n if (this.rendered) {\n this.mode = 'days';\n this.paint();\n }\n }\n /** Switches between single-day and range picking. */\n setRange(range: boolean) {\n this.config.range = range;\n this.config.value = null;\n if (this.rendered) this.paint();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n if (this.rendered) this.paint();\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n if (this.rendered) this.paint();\n }\n showMonth(year: number, month: number) {\n this.cursor = toISO(new Date(year, month, 1));\n if (this.rendered) this.paint();\n }\n focusDay() {\n this.render();\n this.bodyEl.querySelector<HTMLElement>('[tabindex=\"0\"]')?.focus();\n }\n}\nregister('calendar', Calendar);\n"],
|
|
5
|
+
"mappings": "iSAOAA,EAAY,KAAM,CAChB,QAAS,+BACT,QAAS,gCACT,QAAS,WACT,QAAS,OACT,QAAS,gBACT,SAAU,cACZ,CAAC,EACDA,EAAY,QAAS,CACnB,QAAS,mCACT,QAAS,kCACT,QAAS,WACT,QAAS,aACT,QAAS,sBACT,SAAU,iBACZ,CAAC,EAoBD,IAAMC,EAAM,CAACC,EAAkCC,IAAY,IAAI,KAAK,eAAeC,EAAU,EAAE,MAAOF,CAAI,EAAE,OAAOC,CAAC,EAGvGE,EAAN,cAAuBC,CAA0B,CACnC,QAAU,cACrB,OAASC,EAAM,EACf,KAA0B,OAC1B,QACA,OACA,OACA,OAEW,OAAQ,CACzB,IAAMC,EAAKC,EAAE,MAAO,cAAe,CAAE,KAAM,SAAU,aAAcC,EAAE,UAAU,CAAE,CAAC,EAClF,YAAK,OAASD,EAAE,SAAU,mBAAoB,CAAE,KAAM,SAAU,aAAcC,EAAE,SAAS,CAAE,EAAGC,EAAO,cAAc,CAAC,EACpH,KAAK,OAASF,EAAE,SAAU,mBAAoB,CAAE,KAAM,SAAU,aAAcC,EAAE,SAAS,CAAE,EAAGC,EAAO,eAAe,CAAC,EACrH,KAAK,QAAUF,EAAE,SAAU,qBAAsB,CAAE,KAAM,SAAU,YAAa,QAAS,CAAC,EAC1F,KAAK,OAASA,EAAE,MAAO,mBAAmB,EAC1CD,EAAG,OAAOC,EAAE,MAAO,sBAAuB,CAAC,EAAG,KAAK,OAAQ,KAAK,QAAS,KAAK,MAAM,EAAG,KAAK,MAAM,EAC3FD,CACT,CAEmB,UAAW,CAC5B,IAAMI,EAAI,KAAK,MAAM,EACjBA,GAAKC,EAAQD,CAAC,IAAG,KAAK,OAASA,GACnC,KAAK,OAAO,KAAK,OAAQ,QAAS,IAAM,KAAK,KAAK,EAAE,CAAC,EACrD,KAAK,OAAO,KAAK,OAAQ,QAAS,IAAM,KAAK,KAAK,CAAC,CAAC,EACpD,KAAK,OAAO,KAAK,QAAS,QAAS,IAAM,CACvC,KAAK,KAAO,KAAK,OAAS,OAAS,SAAW,OAC9C,KAAK,MAAM,CACb,CAAC,EACD,KAAK,OAAO,KAAK,OAAQ,QAAU,GAAa,CAC9C,IAAME,EAAQ,EAAE,OAAuB,QAAqB,yBAAyB,EACrF,GAAKA,EACL,GAAIA,EAAK,QAAQ,MAAO,CACtB,GAAM,CAACC,EAAGC,CAAC,EAAIF,EAAK,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,EACjDG,EAAMJ,EAAQ,KAAK,MAAM,EAC/B,KAAK,OAASK,EAAU,KAAK,QAASH,EAAIE,EAAI,YAAY,GAAK,IAAMD,EAAI,EAAIC,EAAI,SAAS,EAAE,EAC5F,KAAK,KAAO,OACZ,KAAK,MAAM,EACX,KAAK,KAAK,WAAYF,EAAGC,EAAI,CAAC,EAC9B,KAAK,SAAS,CAChB,MAAO,KAAK,OAAOF,EAAK,QAAQ,GAAI,CACtC,CAAC,EACD,KAAK,OAAO,KAAK,OAAQ,UAAY,GAAqB,KAAK,MAAM,CAAC,CAAC,EACvE,KAAK,MAAM,CACb,CAEQ,QAAQK,EAAa,CAC3B,GAAM,CAAE,IAAAC,EAAK,IAAAC,EAAK,WAAAC,CAAW,EAAI,KAAK,OACtC,MAAQ,CAAC,CAACF,GAAOD,EAAMC,GAAS,CAAC,CAACC,GAAOF,EAAME,GAAQ,CAAC,CAACC,IAAaH,CAAG,CAC3E,CAGQ,MAAkB,CACxB,IAAMP,EAAI,KAAK,OAAO,MACtB,OAAQA,EAAiC,OAAOA,GAAM,SAAW,CAAE,MAAOA,EAAG,IAAKA,CAAE,EAAIA,EAA5E,CAAE,MAAO,KAAM,IAAK,IAAK,CACvC,CACQ,OAAuB,CAC7B,OAAO,KAAK,KAAK,EAAE,KACrB,CAEQ,OAAOO,EAAa,CAC1B,GAAI,KAAK,QAAQA,CAAG,EAAG,OACvB,GAAI,CAAC,KAAK,OAAO,MACf,YAAK,SAASA,CAAG,EACV,KAAK,KAAK,KAAK,SAAUA,CAAG,EAErC,GAAM,CAAE,MAAAI,EAAO,IAAAC,CAAI,EAAI,KAAK,KAAK,EACjC,GAAID,GAAS,CAACC,EAAK,CACjB,IAAMC,EAAIN,EAAMI,EAAQ,CAAE,MAAOJ,EAAK,IAAKI,CAAM,EAAI,CAAE,MAAAA,EAAO,IAAKJ,CAAI,EACvE,KAAK,SAASM,CAAC,EACf,KAAK,KAAK,SAAUA,CAAC,CACvB,MACE,KAAK,SAAS,CAAE,MAAON,EAAK,IAAK,IAAK,CAAC,EACvC,KAAK,KAAK,QAASA,CAAG,CAE1B,CAEQ,KAAKO,EAAa,CACxB,KAAK,OAAS,KAAK,OAAS,OAASR,EAAU,KAAK,OAAQQ,CAAG,EAAIR,EAAU,KAAK,OAAQQ,EAAM,EAAE,EAClG,KAAK,MAAM,EACX,IAAMvB,EAAIU,EAAQ,KAAK,MAAM,EAC7B,KAAK,KAAK,WAAYV,EAAE,YAAY,EAAGA,EAAE,SAAS,CAAC,CACrD,CAEQ,KAAKwB,EAAc,CACzB,IAAMC,EAASf,EAAQ,KAAK,MAAM,EAClC,KAAK,OAASc,EACd,IAAMxB,EAAIU,EAAQc,CAAI,EACtB,KAAK,MAAM,GACPxB,EAAE,SAAS,IAAMyB,EAAO,SAAS,GAAKzB,EAAE,YAAY,IAAMyB,EAAO,YAAY,IAAG,KAAK,KAAK,WAAYzB,EAAE,YAAY,EAAGA,EAAE,SAAS,CAAC,EACvI,KAAK,SAAS,CAChB,CAEQ,MAAM0B,EAAkB,CAC9B,GAAI,KAAK,OAAS,OAAQ,OAC1B,IAAMC,EAAI,KAAK,OACTC,GAAOlB,EAAQiB,CAAC,EAAG,OAAO,EAAI,KAAK,UAAU,EAAI,GAAK,EACtDE,EAAgC,CACpC,UAAWC,EAAQH,EAAG,EAAE,EACxB,WAAYG,EAAQH,EAAG,CAAC,EACxB,QAASG,EAAQH,EAAG,EAAE,EACtB,UAAWG,EAAQH,EAAG,CAAC,EACvB,KAAMG,EAAQH,EAAG,CAACC,CAAG,EACrB,IAAKE,EAAQH,EAAG,EAAIC,CAAG,EACvB,OAAQb,EAAUY,EAAGD,EAAE,SAAW,IAAM,EAAE,EAC1C,SAAUX,EAAUY,EAAGD,EAAE,SAAW,GAAK,CAAC,CAC5C,EACIG,EAAMH,EAAE,GAAG,GACbA,EAAE,eAAe,EACjB,KAAK,KAAKG,EAAMH,EAAE,GAAG,CAAC,IACbA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OACxCA,EAAE,eAAe,EACjB,KAAK,OAAOC,CAAC,EAEjB,CAEQ,WAAY,CAClB,OAAO,KAAK,OAAO,UAAYI,EAAS,CAC1C,CAEQ,OAAQ,CACd,IAAMjB,EAAMJ,EAAQ,KAAK,MAAM,EAC/B,KAAK,GAAG,UAAU,OAAO,YAAa,KAAK,OAAS,QAAQ,EAC5D,KAAK,QAAQ,YAAc,KAAK,OAAS,OAASZ,EAAI,CAAE,MAAO,OAAQ,KAAM,SAAU,EAAGgB,CAAG,EAAI,OAAOA,EAAI,YAAY,CAAC,EACzH,KAAK,OAAS,OAAS,KAAK,UAAUA,CAAG,EAAI,KAAK,YAAYA,CAAG,CACnE,CAEQ,UAAUA,EAAW,CAC3B,IAAMkB,EAAQ,KAAK,UAAU,EACvBC,EAAO3B,EAAE,IAAI,EACnB,QAAS4B,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAMlC,EAAI,IAAI,KAAK,KAAM,EAAG,GAAMgC,EAAQE,GAAK,CAAE,EACjDD,EAAK,OAAO3B,EAAE,KAAM,mBAAoB,CAAE,MAAO,MAAO,KAAMR,EAAI,CAAE,QAAS,MAAO,EAAGE,CAAC,CAAE,EAAGF,EAAI,CAAE,QAAS,OAAQ,EAAGE,CAAC,CAAC,CAAC,CAC5H,CACA,IAAMmC,EAAsB,CAAC,EACvBf,EAAQ,IAAI,KAAKN,EAAI,YAAY,EAAGA,EAAI,SAAS,EAAG,CAAC,EAC3DM,EAAM,QAAQ,GAAMA,EAAM,OAAO,EAAIY,EAAQ,GAAK,CAAE,EACpD,IAAMI,EAAWhC,EAAM,EACjB,CAAE,MAAOiC,EAAM,IAAKC,CAAG,EAAI,KAAK,OAAO,MAAQ,KAAK,KAAK,EAAI,CAAE,MAAO,KAAK,MAAM,EAAG,IAAK,KAAK,MAAM,CAAE,EAC5G,QAASC,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAMC,EAAKlC,EAAE,IAAI,EACjB,QAASN,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAMyC,EAAM,IAAI,KAAKrB,EAAM,YAAY,EAAGA,EAAM,SAAS,EAAGA,EAAM,QAAQ,EAAImB,EAAI,EAAIvC,CAAC,EACjFgB,EAAM0B,EAAMD,CAAG,EACfE,EAAKrC,EAAE,KAAM,mBAAoB,CACrC,KAAM,WACN,WAAYU,EACZ,SAAUA,IAAQ,KAAK,OAAS,EAAI,GACpC,gBAAiB,OAAO,CAAC,CAACqB,GAAQrB,GAAOqB,GAAQrB,IAAQsB,GAAMD,EAAK,EACpE,aAAcvC,EAAI,CAAE,UAAW,MAAO,EAAG2C,CAAG,EAC5C,gBAAiB,KAAK,QAAQzB,CAAG,EAAI,OAAS,KAC9C,eAAgBA,IAAQoB,EAAW,OAAS,IAC9C,EAAG,OAAOK,EAAI,QAAQ,CAAC,CAAC,EACxBE,EAAG,UAAU,OAAO,aAAcF,EAAI,SAAS,IAAM3B,EAAI,SAAS,CAAC,EACnE6B,EAAG,UAAU,OAAO,WAAY3B,IAAQoB,CAAQ,EAChDO,EAAG,UAAU,OAAO,cAAe3B,IAAQqB,GAAQrB,IAAQsB,CAAE,EAC7DK,EAAG,UAAU,OAAO,cAAe,CAAC,CAACN,GAAQ,CAAC,CAACC,GAAMtB,EAAMqB,GAAQrB,EAAMsB,CAAE,EAC3EK,EAAG,UAAU,OAAO,iBAAkB,CAAC,CAAC,KAAK,OAAO,OAAS3B,IAAQqB,CAAI,EACzEM,EAAG,UAAU,OAAO,eAAgB,CAAC,CAAC,KAAK,OAAO,OAAS3B,IAAQsB,CAAE,EACrEK,EAAG,UAAU,OAAO,cAAe,KAAK,QAAQ3B,CAAG,CAAC,EACpDwB,EAAG,OAAOG,CAAE,CACd,CACAR,EAAK,KAAKK,CAAE,CACd,CACA,KAAK,OAAO,gBAAgBlC,EAAE,QAAS,oBAAqB,CAAE,KAAM,MAAO,EAAGA,EAAE,QAAS,GAAI,CAAC,EAAG2B,CAAI,EAAG3B,EAAE,QAAS,GAAI,CAAC,EAAG,GAAG6B,CAAI,CAAC,CAAC,CACtI,CAEQ,YAAYrB,EAAW,CAC7B,IAAM8B,EAAQ,MAAM,KAAK,CAAE,OAAQ,EAAG,EAAG,CAACC,EAAGhC,IAAM,CACjD,IAAMiC,EAAIxC,EAAE,SAAU,qBAAsB,CAAE,KAAM,SAAU,aAAc,GAAGQ,EAAI,YAAY,CAAC,IAAI,OAAOD,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,CAAC,EAAG,EAAGf,EAAI,CAAE,MAAO,OAAQ,EAAG,IAAI,KAAK,IAAMe,EAAG,CAAC,CAAC,CAAC,EACrL,OAAAiC,EAAE,UAAU,OAAO,cAAejC,IAAMC,EAAI,SAAS,CAAC,EAC/CgC,CACT,CAAC,EACD,KAAK,OAAO,gBAAgBxC,EAAE,MAAO,sBAAuB,CAAC,EAAG,GAAGsC,CAAK,CAAC,CAC3E,CAIA,SAASG,EAAkC,CACzC,KAAK,OAAO,MAAQA,EACpB,IAAM/B,EAAM,KAAK,MAAM,EACnBA,GAAON,EAAQM,CAAG,IAAG,KAAK,OAASA,GACnC,KAAK,WACP,KAAK,KAAO,OACZ,KAAK,MAAM,EAEf,CAEA,SAASgC,EAAgB,CACvB,KAAK,OAAO,MAAQA,EACpB,KAAK,OAAO,MAAQ,KAChB,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,OAAO/B,EAAyB,CAC9B,KAAK,OAAO,IAAMA,EACd,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,OAAOC,EAAyB,CAC9B,KAAK,OAAO,IAAMA,EACd,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,UAAU+B,EAAcC,EAAe,CACrC,KAAK,OAASR,EAAM,IAAI,KAAKO,EAAMC,EAAO,CAAC,CAAC,EACxC,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,UAAW,CACT,KAAK,OAAO,EACZ,KAAK,OAAO,cAA2B,gBAAgB,GAAG,MAAM,CAClE,CACF,EACAC,EAAS,WAAYjD,CAAQ",
|
|
6
|
+
"names": ["addMessages", "fmt", "opts", "d", "getLocale", "Calendar", "Component", "today", "el", "h", "t", "iconEl", "v", "fromISO", "cell", "y", "m", "cur", "addMonths", "iso", "min", "max", "isDisabled", "start", "end", "r", "dir", "next", "before", "e", "c", "dow", "moves", "addDays", "firstDay", "first", "head", "i", "rows", "todayIso", "from", "to", "w", "tr", "day", "toISO", "td", "cells", "_", "b", "value", "range", "year", "month", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-EV73ADN2.js";import{a as t}from"./chunk-TIPK3SCJ.js";var e=class extends o{baseCls="op-field op-textfield op-picker op-select";editable(){return!1}emptyValue(){return null}isEmpty(r){return r==null||r===""}};t("select",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-G2KUK6AT.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as u}from"./chunk-W2BAFOCN.js";import{c}from"./chunk-4EZJ5FKJ.js";import{a as m}from"./chunk-A2NKDOYN.js";import{b as a}from"./chunk-PZSHOSOS.js";import{a as f}from"./chunk-TIPK3SCJ.js";var p=class extends m{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;flyout;flyoutOf;hoverTimer;onRender(){let e=this.config;this.items=e.items??[],this.active=e.active;let i=t=>t.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&i(s.items)));i(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",t=>{let s=t.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",t=>this.onKey(t)),this.listen(this.root,"pointerover",t=>{let s=t.target.closest(".op-navmenu__item.is-group");this.hoverTimer?.(),!(!this.config.collapsed||!s||s.dataset.id===this.flyoutOf)&&(this.hoverTimer=this.later(()=>this.openFlyout(s.dataset.id,!1),200))}),this.listen(this.root,"pointerleave",()=>this.hoverTimer?.()),this.own(()=>this.flyout?.destroy()),this.listen(this.root,"focusin",t=>{let s=t.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,i=this.items){for(let t of i){if(t.id===e)return t;let s=t.items&&this.getItem(e,t.items);if(s)return s}}parentsOf(e,i=this.items,t=[]){for(let s of i){if(s.id===e)return t;let n=s.items&&this.parentsOf(e,s.items,[...t,s]);if(n)return n}}openParents(e){for(let i of this.parentsOf(e)??[])this.open.add(i.id)}matches(e,i){return e.text.toLowerCase().includes(i)||!!e.items?.some(t=>this.matches(t,i))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(i=>this.visible(i))}isOpen(e){return this.config.collapsed?!1:this.query?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(t=>this.visible(t)).map(t=>this.node(t,1)));let i=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(t=>t.tabIndex=t===i?0:-1)}node(e,i){let t=!!e.items,s=t&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),l=t&&!!this.active&&!!this.parentsOf(this.active)?.some(d=>d.id===e.id),o=n&&t,h=a("div",`op-navmenu__item${t?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${l&&n?" has-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":i,"aria-expanded":t?String(o?this.flyoutOf===e.id:s):null,"aria-current":e.id===this.active?"page":null,"aria-haspopup":o?"menu":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return h.style.setProperty("--_level",String(i-1)),h.append(a("span","op-navmenu__icon",{},e.icon?c(e.icon):o?e.text.charAt(0).toUpperCase():""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&h.append(a("span","op-navmenu__badge",{},String(e.badge))),t&&h.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},c("chevron-down"))),r.append(h),t&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(d=>this.visible(d)).map(d=>this.node(d,i+1)))),r}activate(e){let i=this.getItem(e);if(!(!i||i.disabled)){if(i.items&&this.config.collapsed)return this.openFlyout(e,!0);if(i.items)return this.toggle(e);this.select(e)}}select(e){let i=this.getItem(e);!i||i.disabled||this.emit("before-select",i)===!1||(this.setActive(e),this.emit("select",i))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let i=this.getItem(e);if(!(!i?.items||this.open.has(e))){if(this.config.accordion)for(let t of this.siblings(e))this.open.delete(t.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",i)}}collapse(e){let i=this.getItem(e);!i?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",i))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let i=this.parentsOf(e)??[];return(i.length?i[i.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=i=>i.forEach(t=>t.items&&(this.open.add(t.id),e(t.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=e,this.config.items=e,this.rendered&&this.paint()}updateItem(e,i){let t=this.getItem(e);t&&(Object.assign(t,i),this.rendered&&this.paint())}openFlyout(e,i){let t=this.getItem(e),s=this.root.querySelector(`[data-id="${CSS.escape(e)}"]`);if(!t?.items||!s)return;let n=(r,l)=>r.filter(o=>this.visible(o)).map(o=>({text:o.text,icon:o.icon,badge:o.badge,disabled:o.disabled,group:l?t.text:void 0,items:o.items?n(o.items,!1):void 0,handler:o.items?void 0:()=>this.select(o.id)}));this.flyout||(this.flyout=new u({cls:"op-navmenu__flyout"}),this.flyout.on("hide",()=>{let r=this.flyoutOf;this.flyoutOf=void 0,r&&this.root.querySelector(`[data-id="${CSS.escape(r)}"]`)?.setAttribute("aria-expanded","false")}),this.listen(this.flyout.el,"keydown",r=>r.key==="ArrowLeft"&&!r.target.closest('.op-menu__item[aria-expanded="true"]')&&this.flyout.hide())),this.flyout.hide(),this.flyoutOf=e,this.flyout.setItems(n(t.items,!0)),s.setAttribute("aria-expanded","true"),this.flyout.showBy(s,"right-start",i)}setCollapsed(e){this.config.collapsed=e,e||this.flyout?.hide(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(i=>i.tabIndex=i===e?0:-1),e.focus())}onKey(e){let i=e.target.closest(".op-navmenu__item");if(!i)return;let t=this.rows(),s=t.indexOf(i),n=this.getItem(i.dataset.id),r=i.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(t[s+1]);break;case"ArrowUp":this.focusRow(t[s-1]);break;case"Home":this.focusRow(t[0]);break;case"End":this.focusRow(t[t.length-1]);break;case"ArrowRight":n.items&&this.config.collapsed?this.openFlyout(n.id,!0):n.items&&!r?this.expand(n.id):n.items&&this.focusRow(t[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let o=this.parentsOf(n.id)?.pop();o&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(o.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}if(e.preventDefault(),this.flyout?.el.contains(document.activeElement))return;this.focusId=document.activeElement?.dataset?.id??n.id;let l=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);l&&document.activeElement!==l&&this.focusRow(l)}};f("navmenu",p);export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-GD5JGKM7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/navigation/navmenu/navmenu.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n /** Rail mode: the floating menu of a group, and the group it belongs to. */\n private flyout?: Menu;\n private flyoutOf?: string;\n private hoverTimer?: () => void;\n\n protected override onRender() {\n const c = this.config;\n this.items = c.items ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n // rail: hovering a group's icon opens its menu (after a short pause, so passing over the rail does not)\n this.listen(this.root, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item.is-group');\n this.hoverTimer?.();\n if (!this.config.collapsed || !row || row.dataset.id === this.flyoutOf) return;\n this.hoverTimer = this.later(() => this.openFlyout(row.dataset.id!, false), 200);\n });\n this.listen(this.root, 'pointerleave', () => this.hoverTimer?.());\n this.own(() => this.flyout?.destroy());\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n if (this.config.collapsed) return false; // rail: a group's children live in its floating menu\n return this.query ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const holdsActive = group && !!this.active && !!this.parentsOf(this.active)?.some((p) => p.id === i.id);\n const flying = rail && group;\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${holdsActive && rail ? ' has-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(flying ? this.flyoutOf === i.id : open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-haspopup': flying ? 'menu' : null, 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n // in the rail a group shows its icon (or its initial) and opens a floating menu\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : flying ? i.text.charAt(0).toUpperCase() : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items && this.config.collapsed) return this.openFlyout(id, true);\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = items;\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n /** Rail mode: a group's children in a Menu beside its icon (title as the header, badges kept). */\n private openFlyout(id: string, focus: boolean) {\n const group = this.getItem(id);\n const row = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(id)}\"]`);\n if (!group?.items || !row) return;\n const entries = (list: NavItem[], top: boolean): MenuEntry[] =>\n list.filter((c) => this.visible(c)).map((c) => ({\n text: c.text, icon: c.icon, badge: c.badge, disabled: c.disabled, group: top ? group.text : undefined,\n items: c.items ? entries(c.items, false) : undefined,\n handler: c.items ? undefined : () => this.select(c.id),\n }));\n if (!this.flyout) {\n this.flyout = new Menu({ cls: 'op-navmenu__flyout' });\n this.flyout.on('hide', () => {\n const was = this.flyoutOf;\n this.flyoutOf = undefined;\n if (was) this.root.querySelector(`[data-id=\"${CSS.escape(was)}\"]`)?.setAttribute('aria-expanded', 'false');\n });\n // \u2190 closes it (the Menu only does that for submenus) and gives the focus back to the icon\n this.listen(this.flyout.el, 'keydown', (e: KeyboardEvent) => e.key === 'ArrowLeft' && !(e.target as HTMLElement).closest('.op-menu__item[aria-expanded=\"true\"]') && this.flyout!.hide());\n }\n this.flyout.hide();\n this.flyoutOf = id;\n this.flyout.setItems(entries(group.items, true));\n row.setAttribute('aria-expanded', 'true');\n this.flyout.showBy(row, 'right-start', focus);\n }\n\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!collapsed) this.flyout?.hide();\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && this.config.collapsed) this.openFlyout(item.id, true);\n else if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n if (this.flyout?.el.contains(document.activeElement)) return; // the focus went to the rail's floating menu: leave it there\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["NavMenu", "Component", "c", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "holdsActive", "flying", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "focus", "entries", "top", "Menu", "was", "collapsed", "text", "rows", "item", "parent", "again", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as o}from"./chunk-ZWNQREWS.js";import{c as i}from"./chunk-VV7CFMPZ.js";import{a as r}from"./chunk-TIPK3SCJ.js";var n="button:not(:disabled)",e=class extends o{baseCls="op-toolbar";rover;shorthand(t){if(t==="->")return{type:"spacer"};if(t==="-")return{type:"spacer",line:!0};if(t===" ")return{type:"spacer",width:8};throw new Error(`Optikos: unknown toolbar shorthand "${t}"`)}build(){let t=super.build();return t.setAttribute("role","toolbar"),this.config.vertical&&t.setAttribute("aria-orientation","vertical"),t}onRender(){this.config.layout??=this.config.vertical?{type:"vbox",align:"stretch"}:{type:"hbox",align:"center"},super.onRender(),this.el.classList.toggle("op-toolbar--vertical",!!this.config.vertical),this.rover=i(this.el,{selector:n,orientation:this.config.vertical?"vertical":"horizontal"}),this.own(()=>this.rover?.destroy())}notifyMount(){super.notifyMount(),this.rover?.sync()}};r("toolbar",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-GNU4VOOE.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{f as o}from"./chunk-MW3RWBZ7.js";import{a as i}from"./chunk-4C666HHU.js";var p={};i(p,{email:()=>y,max:()=>x,maxLength:()=>s,min:()=>u,minLength:()=>m,pattern:()=>l,range:()=>g});var n=t=>typeof t=="string"||Array.isArray(t)?t.length:0,m=(t,e)=>r=>n(r)<t?e??o("minLength",{n:t}):!0,s=(t,e)=>r=>n(r)>t?e??o("maxLength",{n:t}):!0,l=(t,e)=>r=>t.test(String(r))?!0:e??o("pattern"),y=t=>e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e))?!0:t??o("email"),u=(t,e)=>r=>Number(r)<t?e??o("min",{n:t}):!0,x=(t,e)=>r=>Number(r)>t?e??o("max",{n:t}):!0,g=(t,e,r)=>a=>Number(a)<t||Number(a)>e?r??o("range",{min:t,max:e}):!0;export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-GZ7X34QP.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as r}from"./chunk-ZWNQREWS.js";import{b as t,c as i}from"./chunk-PZSHOSOS.js";import{a as o}from"./chunk-TIPK3SCJ.js";var s=class extends r{baseCls="op-formsection";tag="section";titleEl;descEl;bodyEl;getBody(){return this.bodyEl}build(){let e=super.build();return this.titleEl=t("h3","op-formsection__title",{id:i("op-fsec")}),this.descEl=t("p","op-formsection__desc",{id:i("op-fsec-desc")}),this.bodyEl=t("div","op-formsection__body"),e.append(t("div","op-formsection__aside",{},this.titleEl,this.descEl),this.bodyEl),e.setAttribute("aria-labelledby",this.titleEl.id),e}onRender(){let e=this.config;e.layout??=e.columns?{type:"grid",columns:e.columns}:{type:"vbox"},super.onRender(),this.el.classList.toggle("op-formsection--divided",e.divider!==!1),this.setTitle(e.title??""),this.setDescription(e.description??""),this.setAside(e.aside!==!1)}setTitle(e){this.config.title=e,this.rendered&&(this.titleEl.textContent=e,this.titleEl.hidden=!e)}setDescription(e){this.config.description=e,this.rendered&&(this.descEl.textContent=e,this.descEl.hidden=!e,e?this.el.setAttribute("aria-describedby",this.descEl.id):this.el.removeAttribute("aria-describedby"))}setAside(e){this.config.aside=e,this.rendered&&this.el.classList.toggle("op-formsection--stacked",!e)}};o("formsection",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-HOF4JGMQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/formsection/formsection.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { register } from '../../../core/registry';\nimport { h, uid } from '../../../core/dom';\n\nexport interface FormSectionConfig extends ContainerConfig {\n title?: string;\n description?: string;\n /** Title and description in a column beside the fields (default); `false` stacks them above. */\n aside?: boolean;\n /** Shortcut for a responsive grid layout of the fields; items take `colspan` (a number or `'full'`). */\n columns?: number;\n /** A rule between consecutive sections. Default true. */\n divider?: boolean;\n}\n\n/** A titled part of a long form, \"settings page\" style: title and description on the left, fields on the right. */\nexport class FormSection extends Container<FormSectionConfig> {\n protected override baseCls = 'op-formsection';\n protected override tag = 'section' as const;\n private titleEl!: HTMLElement;\n private descEl!: HTMLElement;\n private bodyEl!: HTMLElement;\n\n override getBody() {\n return this.bodyEl;\n }\n\n protected override build() {\n const el = super.build();\n this.titleEl = h('h3', 'op-formsection__title', { id: uid('op-fsec') });\n this.descEl = h('p', 'op-formsection__desc', { id: uid('op-fsec-desc') });\n this.bodyEl = h('div', 'op-formsection__body');\n el.append(h('div', 'op-formsection__aside', {}, this.titleEl, this.descEl), this.bodyEl);\n el.setAttribute('aria-labelledby', this.titleEl.id);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout ??= c.columns ? { type: 'grid', columns: c.columns } : { type: 'vbox' };\n super.onRender();\n this.el.classList.toggle('op-formsection--divided', c.divider !== false);\n this.setTitle(c.title ?? '');\n this.setDescription(c.description ?? '');\n this.setAside(c.aside !== false);\n }\n\n setTitle(title: string) {\n this.config.title = title;\n if (!this.rendered) return;\n this.titleEl.textContent = title;\n this.titleEl.hidden = !title;\n }\n\n setDescription(text: string) {\n this.config.description = text;\n if (!this.rendered) return;\n this.descEl.textContent = text;\n this.descEl.hidden = !text;\n if (text) this.el.setAttribute('aria-describedby', this.descEl.id);\n else this.el.removeAttribute('aria-describedby');\n }\n\n /** Title beside the fields (true) or always above them (false). */\n setAside(aside: boolean) {\n this.config.aside = aside;\n if (this.rendered) this.el.classList.toggle('op-formsection--stacked', !aside);\n }\n}\nregister('formsection', FormSection);\n"],
|
|
5
|
+
"mappings": "+HAgBO,IAAMA,EAAN,cAA0BC,CAA6B,CACzC,QAAU,iBACV,IAAM,UACjB,QACA,OACA,OAEC,SAAU,CACjB,OAAO,KAAK,MACd,CAEmB,OAAQ,CACzB,IAAMC,EAAK,MAAM,MAAM,EACvB,YAAK,QAAUC,EAAE,KAAM,wBAAyB,CAAE,GAAIC,EAAI,SAAS,CAAE,CAAC,EACtE,KAAK,OAASD,EAAE,IAAK,uBAAwB,CAAE,GAAIC,EAAI,cAAc,CAAE,CAAC,EACxE,KAAK,OAASD,EAAE,MAAO,sBAAsB,EAC7CD,EAAG,OAAOC,EAAE,MAAO,wBAAyB,CAAC,EAAG,KAAK,QAAS,KAAK,MAAM,EAAG,KAAK,MAAM,EACvFD,EAAG,aAAa,kBAAmB,KAAK,QAAQ,EAAE,EAC3CA,CACT,CAEmB,UAAW,CAC5B,IAAMG,EAAI,KAAK,OACfA,EAAE,SAAWA,EAAE,QAAU,CAAE,KAAM,OAAQ,QAASA,EAAE,OAAQ,EAAI,CAAE,KAAM,MAAO,EAC/E,MAAM,SAAS,EACf,KAAK,GAAG,UAAU,OAAO,0BAA2BA,EAAE,UAAY,EAAK,EACvE,KAAK,SAASA,EAAE,OAAS,EAAE,EAC3B,KAAK,eAAeA,EAAE,aAAe,EAAE,EACvC,KAAK,SAASA,EAAE,QAAU,EAAK,CACjC,CAEA,SAASC,EAAe,CACtB,KAAK,OAAO,MAAQA,EACf,KAAK,WACV,KAAK,QAAQ,YAAcA,EAC3B,KAAK,QAAQ,OAAS,CAACA,EACzB,CAEA,eAAeC,EAAc,CAC3B,KAAK,OAAO,YAAcA,EACrB,KAAK,WACV,KAAK,OAAO,YAAcA,EAC1B,KAAK,OAAO,OAAS,CAACA,EAClBA,EAAM,KAAK,GAAG,aAAa,mBAAoB,KAAK,OAAO,EAAE,EAC5D,KAAK,GAAG,gBAAgB,kBAAkB,EACjD,CAGA,SAASC,EAAgB,CACvB,KAAK,OAAO,MAAQA,EAChB,KAAK,UAAU,KAAK,GAAG,UAAU,OAAO,0BAA2B,CAACA,CAAK,CAC/E,CACF,EACAC,EAAS,cAAeT,CAAW",
|
|
6
|
+
"names": ["FormSection", "Container", "el", "h", "uid", "c", "title", "text", "aside", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-I4SP6JTU.js";import{a as t}from"./chunk-TIPK3SCJ.js";var e=class extends o{baseCls="op-field op-checkbox op-toggle";onRender(){super.onRender(),this.inputEl.setAttribute("role","switch")}setIndeterminate(){super.setIndeterminate(!1)}};t("toggle",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-HXDTGP2K.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/toggle/toggle.ts"],
|
|
4
|
+
"sourcesContent": ["import { register } from '../../../core/registry';\nimport { Checkbox, type CheckboxConfig } from '../checkbox/checkbox';\n\nexport type ToggleConfig = Omit<CheckboxConfig, 'indeterminate'>;\n\n/** An on/off switch: a Checkbox with `role=\"switch\"` and a track-and-knob look. Same value (`boolean`), events and API. */\nexport class Toggle extends Checkbox {\n protected override baseCls = 'op-field op-checkbox op-toggle';\n\n protected override onRender() {\n super.onRender();\n this.inputEl.setAttribute('role', 'switch');\n }\n\n /** A switch has no third state. */\n override setIndeterminate(): void {\n super.setIndeterminate(false);\n }\n}\nregister('toggle', Toggle);\n"],
|
|
5
|
+
"mappings": "gFAMO,IAAMA,EAAN,cAAqBC,CAAS,CAChB,QAAU,iCAEV,UAAW,CAC5B,MAAM,SAAS,EACf,KAAK,QAAQ,aAAa,OAAQ,QAAQ,CAC5C,CAGS,kBAAyB,CAChC,MAAM,iBAAiB,EAAK,CAC9B,CACF,EACAC,EAAS,SAAUF,CAAM",
|
|
6
|
+
"names": ["Toggle", "Checkbox", "register"]
|
|
7
|
+
}
|