optikos 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +146 -0
- package/LICENSE +21 -0
- package/README.md +213 -2
- package/THIRD_PARTY_NOTICES.md +83 -0
- package/dist/bind.js +2 -0
- package/dist/bind.js.map +7 -0
- package/dist/chunk-23XLG2EM.js +2 -0
- package/dist/chunk-23XLG2EM.js.map +7 -0
- package/dist/chunk-27UZFEXD.js +2 -0
- package/dist/chunk-27UZFEXD.js.map +7 -0
- package/dist/chunk-2UPUC4RK.js +2 -0
- package/dist/chunk-2UPUC4RK.js.map +7 -0
- package/dist/chunk-2ZRNGG2N.js +2 -0
- package/dist/chunk-2ZRNGG2N.js.map +7 -0
- package/dist/chunk-2ZUZ5HDL.js +2 -0
- package/dist/chunk-2ZUZ5HDL.js.map +7 -0
- package/dist/chunk-3DBEZGOY.js +2 -0
- package/dist/chunk-3DBEZGOY.js.map +7 -0
- package/dist/chunk-3S24ZRPK.js +2 -0
- package/dist/chunk-3S24ZRPK.js.map +7 -0
- package/dist/chunk-3TAW4AKH.js +2 -0
- package/dist/chunk-3TAW4AKH.js.map +7 -0
- package/dist/chunk-4AA4FQEM.js +2 -0
- package/dist/chunk-4AA4FQEM.js.map +7 -0
- package/dist/chunk-4C666HHU.js +2 -0
- package/dist/chunk-4C666HHU.js.map +7 -0
- package/dist/chunk-4EZJ5FKJ.js +2 -0
- package/dist/chunk-4EZJ5FKJ.js.map +7 -0
- 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-5DJTP53N.js.map +7 -0
- package/dist/chunk-5JEXM5S7.js +2 -0
- package/dist/chunk-5JEXM5S7.js.map +7 -0
- package/dist/chunk-5Q76ACVI.js +2 -0
- package/dist/chunk-5Q76ACVI.js.map +7 -0
- package/dist/chunk-5QUY72FX.js +2 -0
- package/dist/chunk-5QUY72FX.js.map +7 -0
- package/dist/chunk-5YS7OD5E.js +2 -0
- package/dist/chunk-5YS7OD5E.js.map +7 -0
- package/dist/chunk-676AKAGF.js +2 -0
- package/dist/chunk-676AKAGF.js.map +7 -0
- package/dist/chunk-6NCXO5ZP.js +2 -0
- package/dist/chunk-6NCXO5ZP.js.map +7 -0
- package/dist/chunk-6VBK2I5B.js +2 -0
- package/dist/chunk-6VBK2I5B.js.map +7 -0
- package/dist/chunk-7KMIFXHZ.js +2 -0
- package/dist/chunk-7KMIFXHZ.js.map +7 -0
- package/dist/chunk-A2NKDOYN.js +2 -0
- package/dist/chunk-A2NKDOYN.js.map +7 -0
- package/dist/chunk-ATFJ7PNA.js +2 -0
- package/dist/chunk-ATFJ7PNA.js.map +7 -0
- package/dist/chunk-BXYWVRKJ.js +2 -0
- package/dist/chunk-BXYWVRKJ.js.map +7 -0
- package/dist/chunk-CKXS375P.js +2 -0
- package/dist/chunk-CKXS375P.js.map +7 -0
- package/dist/chunk-CUN5QO4T.js +2 -0
- package/dist/chunk-CUN5QO4T.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-ELYARUCN.js +2 -0
- package/dist/chunk-ELYARUCN.js.map +7 -0
- package/dist/chunk-EV73ADN2.js +2 -0
- package/dist/chunk-EV73ADN2.js.map +7 -0
- package/dist/chunk-FEHGU6EP.js +3 -0
- package/dist/chunk-FEHGU6EP.js.map +7 -0
- package/dist/chunk-FHM5NUS4.js +3 -0
- package/dist/chunk-FHM5NUS4.js.map +7 -0
- package/dist/chunk-G2DAD3MQ.js +2 -0
- package/dist/chunk-G2DAD3MQ.js.map +7 -0
- package/dist/chunk-G2KUK6AT.js +2 -0
- package/dist/chunk-G2KUK6AT.js.map +7 -0
- package/dist/chunk-GBPLNXMP.js +2 -0
- package/dist/chunk-GBPLNXMP.js.map +7 -0
- package/dist/chunk-GNU4VOOE.js +2 -0
- package/dist/chunk-GNU4VOOE.js.map +7 -0
- package/dist/chunk-GZ7X34QP.js +2 -0
- package/dist/chunk-GZ7X34QP.js.map +7 -0
- 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-I4SP6JTU.js +2 -0
- package/dist/chunk-I4SP6JTU.js.map +7 -0
- package/dist/chunk-IHE2MQ3W.js +2 -0
- package/dist/chunk-IHE2MQ3W.js.map +7 -0
- package/dist/chunk-II6ITOA6.js +2 -0
- package/dist/chunk-II6ITOA6.js.map +7 -0
- package/dist/chunk-JBLRAM7Z.js +2 -0
- package/dist/chunk-JBLRAM7Z.js.map +7 -0
- package/dist/chunk-JI265XFO.js +2 -0
- package/dist/chunk-JI265XFO.js.map +7 -0
- 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-LW2WRUVL.js +2 -0
- package/dist/chunk-LW2WRUVL.js.map +7 -0
- package/dist/chunk-M242VYZA.js +2 -0
- package/dist/chunk-M242VYZA.js.map +7 -0
- 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-OWEQT2HN.js +2 -0
- package/dist/chunk-OWEQT2HN.js.map +7 -0
- package/dist/chunk-PZSHOSOS.js +2 -0
- package/dist/chunk-PZSHOSOS.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-SA53QUBF.js +2 -0
- package/dist/chunk-SA53QUBF.js.map +7 -0
- package/dist/chunk-TIPK3SCJ.js +2 -0
- package/dist/chunk-TIPK3SCJ.js.map +7 -0
- package/dist/chunk-TOLTUOZS.js +2 -0
- package/dist/chunk-TOLTUOZS.js.map +7 -0
- package/dist/chunk-TZOQWCVH.js +2 -0
- package/dist/chunk-TZOQWCVH.js.map +7 -0
- package/dist/chunk-VF7BGP6L.js +2 -0
- package/dist/chunk-VF7BGP6L.js.map +7 -0
- package/dist/chunk-VU3GIDZ3.js +2 -0
- package/dist/chunk-VU3GIDZ3.js.map +7 -0
- package/dist/chunk-VV7CFMPZ.js +2 -0
- package/dist/chunk-VV7CFMPZ.js.map +7 -0
- package/dist/chunk-W3H7GTJY.js +2 -0
- package/dist/chunk-W3H7GTJY.js.map +7 -0
- package/dist/chunk-X2ASKUFD.js +2 -0
- package/dist/chunk-X2ASKUFD.js.map +7 -0
- package/dist/chunk-X6AULZI4.js +1 -0
- package/dist/chunk-X6AULZI4.js.map +7 -0
- package/dist/chunk-XHOBNSBO.js +2 -0
- package/dist/chunk-XHOBNSBO.js.map +7 -0
- package/dist/chunk-XX2MVWFS.js +4 -0
- package/dist/chunk-XX2MVWFS.js.map +7 -0
- package/dist/chunk-XYZ6VZ5T.js +2 -0
- package/dist/chunk-XYZ6VZ5T.js.map +7 -0
- package/dist/chunk-YBAYEU25.js +2 -0
- package/dist/chunk-YBAYEU25.js.map +7 -0
- package/dist/chunk-YHEMA56R.js +2 -0
- package/dist/chunk-YHEMA56R.js.map +7 -0
- package/dist/chunk-Z2JBUHKA.js +2 -0
- package/dist/chunk-Z2JBUHKA.js.map +7 -0
- package/dist/chunk-Z2Z52GFT.js +2 -0
- package/dist/chunk-Z2Z52GFT.js.map +7 -0
- 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 +2 -0
- package/dist/components/breadcrumb.js.map +7 -0
- package/dist/components/button.js +2 -0
- package/dist/components/button.js.map +7 -0
- package/dist/components/calendar.js +2 -0
- package/dist/components/calendar.js.map +7 -0
- package/dist/components/cellediting.js +2 -0
- package/dist/components/cellediting.js.map +7 -0
- package/dist/components/chat.js +2 -0
- package/dist/components/chat.js.map +7 -0
- package/dist/components/checkbox.js +2 -0
- package/dist/components/checkbox.js.map +7 -0
- 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 +2 -0
- package/dist/components/combobox.js.map +7 -0
- package/dist/components/commandpalette.js +2 -0
- package/dist/components/commandpalette.js.map +7 -0
- package/dist/components/container.js +2 -0
- package/dist/components/container.js.map +7 -0
- package/dist/components/dataview.js +2 -0
- package/dist/components/dataview.js.map +7 -0
- package/dist/components/datefield.js +2 -0
- package/dist/components/datefield.js.map +7 -0
- package/dist/components/daterangefield.js +2 -0
- package/dist/components/daterangefield.js.map +7 -0
- package/dist/components/dial.js +2 -0
- package/dist/components/dial.js.map +7 -0
- package/dist/components/dropdown.js +2 -0
- package/dist/components/dropdown.js.map +7 -0
- 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 +2 -0
- package/dist/components/fieldset.js.map +7 -0
- package/dist/components/filterbuilder.js +2 -0
- package/dist/components/filterbuilder.js.map +7 -0
- package/dist/components/form.js +2 -0
- package/dist/components/form.js.map +7 -0
- 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 +2 -0
- package/dist/components/grid.js.map +7 -0
- package/dist/components/icon.js +2 -0
- package/dist/components/icon.js.map +7 -0
- package/dist/components/inputgroup.js +2 -0
- package/dist/components/inputgroup.js.map +7 -0
- package/dist/components/label.js +2 -0
- package/dist/components/label.js.map +7 -0
- package/dist/components/listbox.js +2 -0
- package/dist/components/listbox.js.map +7 -0
- package/dist/components/lookupfield.js +2 -0
- package/dist/components/lookupfield.js.map +7 -0
- package/dist/components/menu.js +2 -0
- package/dist/components/menu.js.map +7 -0
- package/dist/components/messagebox.js +2 -0
- package/dist/components/messagebox.js.map +7 -0
- package/dist/components/navmenu.js +2 -0
- package/dist/components/navmenu.js.map +7 -0
- package/dist/components/numberfield.js +2 -0
- package/dist/components/numberfield.js.map +7 -0
- package/dist/components/pagination.js +2 -0
- package/dist/components/pagination.js.map +7 -0
- package/dist/components/panel.js +2 -0
- package/dist/components/panel.js.map +7 -0
- package/dist/components/pickerfield.js +2 -0
- package/dist/components/pickerfield.js.map +7 -0
- package/dist/components/radiogroup.js +2 -0
- package/dist/components/radiogroup.js.map +7 -0
- package/dist/components/searchgrid.js +2 -0
- package/dist/components/searchgrid.js.map +7 -0
- package/dist/components/secretfield.js +2 -0
- package/dist/components/secretfield.js.map +7 -0
- package/dist/components/select.js +2 -0
- package/dist/components/select.js.map +7 -0
- package/dist/components/slider.js +2 -0
- package/dist/components/slider.js.map +7 -0
- package/dist/components/spacer.js +2 -0
- package/dist/components/spacer.js.map +7 -0
- package/dist/components/spinner.js +2 -0
- package/dist/components/spinner.js.map +7 -0
- package/dist/components/stepform.js +2 -0
- package/dist/components/stepform.js.map +7 -0
- package/dist/components/stepper.js +2 -0
- package/dist/components/stepper.js.map +7 -0
- package/dist/components/suggestfield.js +2 -0
- package/dist/components/suggestfield.js.map +7 -0
- package/dist/components/table.js +2 -0
- package/dist/components/table.js.map +7 -0
- package/dist/components/tabs.js +2 -0
- package/dist/components/tabs.js.map +7 -0
- package/dist/components/textarea.js +2 -0
- package/dist/components/textarea.js.map +7 -0
- package/dist/components/textfield.js +2 -0
- package/dist/components/textfield.js.map +7 -0
- package/dist/components/toast.js +2 -0
- package/dist/components/toast.js.map +7 -0
- package/dist/components/toggle.js +2 -0
- package/dist/components/toggle.js.map +7 -0
- package/dist/components/toolbar.js +2 -0
- package/dist/components/toolbar.js.map +7 -0
- package/dist/components/tooltip.js +2 -0
- package/dist/components/tooltip.js.map +7 -0
- package/dist/components/tree.js +2 -0
- package/dist/components/tree.js.map +7 -0
- package/dist/components/viewmanager.js +2 -0
- package/dist/components/viewmanager.js.map +7 -0
- package/dist/components/viewport.js +2 -0
- package/dist/components/viewport.js.map +7 -0
- package/dist/components/widget.js +2 -0
- package/dist/components/widget.js.map +7 -0
- package/dist/components/window.js +2 -0
- package/dist/components/window.js.map +7 -0
- package/dist/core.js +2 -0
- package/dist/core.js.map +7 -0
- package/dist/css/badge.css +39 -0
- package/dist/css/base.css +180 -0
- package/dist/css/breadcrumb.css +53 -0
- package/dist/css/button.css +103 -0
- package/dist/css/calendar.css +108 -0
- package/dist/css/cellediting.css +33 -0
- package/dist/css/chat.css +232 -0
- package/dist/css/checkbox.css +64 -0
- package/dist/css/checkboxgroup.css +12 -0
- package/dist/css/chip.css +64 -0
- package/dist/css/codeviewer.css +109 -0
- package/dist/css/commandpalette.css +167 -0
- package/dist/css/container.css +5 -0
- package/dist/css/core.css +88 -0
- package/dist/css/dataview.css +56 -0
- package/dist/css/dial.css +203 -0
- package/dist/css/dropdown.css +13 -0
- package/dist/css/field.css +62 -0
- package/dist/css/fieldgroup.css +26 -0
- package/dist/css/fieldlist.css +84 -0
- package/dist/css/fieldset.css +68 -0
- package/dist/css/filterbuilder.css +125 -0
- package/dist/css/form.css +8 -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 +378 -0
- package/dist/css/icon.css +16 -0
- package/dist/css/inputgroup.css +58 -0
- package/dist/css/label.css +12 -0
- package/dist/css/layout.css +116 -0
- package/dist/css/listbox.css +50 -0
- package/dist/css/menu.css +92 -0
- package/dist/css/messagebox.css +6 -0
- package/dist/css/motion.css +29 -0
- package/dist/css/navmenu.css +115 -0
- package/dist/css/pagination.css +23 -0
- package/dist/css/panel.css +84 -0
- package/dist/css/pickerfield.css +85 -0
- package/dist/css/radiogroup.css +53 -0
- package/dist/css/searchgrid.css +37 -0
- package/dist/css/secretfield.css +73 -0
- package/dist/css/slider.css +107 -0
- package/dist/css/spacer.css +7 -0
- package/dist/css/stepform.css +46 -0
- package/dist/css/stepper.css +122 -0
- package/dist/css/table.css +36 -0
- package/dist/css/tabs.css +108 -0
- package/dist/css/textarea.css +11 -0
- package/dist/css/textfield.css +59 -0
- package/dist/css/toast.css +91 -0
- package/dist/css/toggle.css +39 -0
- package/dist/css/toolbar.css +14 -0
- package/dist/css/tooltip.css +17 -0
- package/dist/css/tree.css +94 -0
- package/dist/css/viewport.css +9 -0
- package/dist/css/widget.css +135 -0
- package/dist/css/window.css +35 -0
- package/dist/data.js +2 -0
- package/dist/data.js.map +7 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +7 -0
- package/dist/motion.js +2 -0
- package/dist/motion.js.map +7 -0
- package/dist/optikos.css +4240 -0
- package/dist/themes/compact.css +17 -0
- package/dist/themes/dark.css +53 -0
- package/dist/types/bind/index.d.ts +23 -0
- 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/button/button.d.ts +34 -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/base/icon/icon.d.ts +17 -0
- package/dist/types/components/base/label/label.d.ts +14 -0
- package/dist/types/components/breadcrumb.d.ts +1 -0
- package/dist/types/components/button.d.ts +1 -0
- package/dist/types/components/calendar.d.ts +1 -0
- package/dist/types/components/cellediting.d.ts +1 -0
- package/dist/types/components/chat/chat/chat.d.ts +84 -0
- package/dist/types/components/chat.d.ts +1 -0
- package/dist/types/components/checkbox.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/combobox.d.ts +1 -0
- package/dist/types/components/commandpalette.d.ts +1 -0
- package/dist/types/components/container.d.ts +1 -0
- package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
- package/dist/types/components/data/dataview/dataview.d.ts +61 -0
- package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +73 -0
- package/dist/types/components/data/grid/grid.d.ts +177 -0
- package/dist/types/components/data/pagination/pagination.d.ts +31 -0
- package/dist/types/components/data/searchgrid/searchgrid.d.ts +63 -0
- package/dist/types/components/data/table/table.d.ts +26 -0
- package/dist/types/components/data/tree/tree.d.ts +71 -0
- package/dist/types/components/data/viewmanager/viewmanager.d.ts +86 -0
- package/dist/types/components/dataview.d.ts +1 -0
- package/dist/types/components/datefield.d.ts +1 -0
- package/dist/types/components/daterangefield.d.ts +1 -0
- package/dist/types/components/dates/calendar/calendar.d.ts +48 -0
- package/dist/types/components/dial.d.ts +1 -0
- package/dist/types/components/dropdown.d.ts +1 -0
- package/dist/types/components/feedback/spinner/spinner.d.ts +11 -0
- package/dist/types/components/fieldgroup.d.ts +1 -0
- package/dist/types/components/fieldlist.d.ts +1 -0
- package/dist/types/components/fields/checkbox/checkbox.d.ts +20 -0
- package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
- package/dist/types/components/fields/combobox/combobox.d.ts +15 -0
- package/dist/types/components/fields/datefield/datefield.d.ts +30 -0
- package/dist/types/components/fields/daterangefield/daterangefield.d.ts +32 -0
- package/dist/types/components/fields/dial/dial.d.ts +84 -0
- package/dist/types/components/fields/listbox/listbox.d.ts +54 -0
- package/dist/types/components/fields/lookupfield/lookupfield.d.ts +25 -0
- package/dist/types/components/fields/numberfield/numberfield.d.ts +31 -0
- package/dist/types/components/fields/pickerfield/pickerfield.d.ts +77 -0
- package/dist/types/components/fields/radiogroup/radiogroup.d.ts +26 -0
- package/dist/types/components/fields/secretfield/secretfield.d.ts +52 -0
- package/dist/types/components/fields/select/select.d.ts +10 -0
- package/dist/types/components/fields/slider/slider.d.ts +62 -0
- package/dist/types/components/fields/suggestfield/suggestfield.d.ts +34 -0
- package/dist/types/components/fields/textarea/textarea.d.ts +16 -0
- package/dist/types/components/fields/textfield/textfield.d.ts +38 -0
- package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
- package/dist/types/components/fieldset.d.ts +1 -0
- package/dist/types/components/filterbuilder.d.ts +1 -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 +68 -0
- 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 +64 -0
- package/dist/types/components/form.d.ts +1 -0
- package/dist/types/components/formactions.d.ts +1 -0
- package/dist/types/components/formerrors.d.ts +1 -0
- package/dist/types/components/formsection.d.ts +1 -0
- package/dist/types/components/grid.d.ts +1 -0
- package/dist/types/components/icon.d.ts +1 -0
- package/dist/types/components/inputgroup.d.ts +1 -0
- package/dist/types/components/label.d.ts +1 -0
- package/dist/types/components/layout/container/container.d.ts +1 -0
- package/dist/types/components/layout/fieldset/fieldset.d.ts +30 -0
- package/dist/types/components/layout/panel/panel.d.ts +53 -0
- package/dist/types/components/layout/panel/reload.d.ts +1 -0
- package/dist/types/components/layout/spacer/spacer.d.ts +12 -0
- package/dist/types/components/layout/toolbar/toolbar.d.ts +15 -0
- package/dist/types/components/layout/viewport/viewport.d.ts +7 -0
- package/dist/types/components/listbox.d.ts +1 -0
- package/dist/types/components/lookupfield.d.ts +1 -0
- package/dist/types/components/menu.d.ts +1 -0
- package/dist/types/components/messagebox.d.ts +1 -0
- package/dist/types/components/navigation/breadcrumb/breadcrumb.d.ts +32 -0
- package/dist/types/components/navigation/navmenu/navmenu.d.ts +63 -0
- package/dist/types/components/navigation/stepper/stepper.d.ts +31 -0
- package/dist/types/components/navigation/tabs/tabs.d.ts +57 -0
- package/dist/types/components/navmenu.d.ts +1 -0
- package/dist/types/components/numberfield.d.ts +1 -0
- package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +80 -0
- package/dist/types/components/overlays/dropdown/dropdown.d.ts +41 -0
- package/dist/types/components/overlays/menu/menu.d.ts +56 -0
- package/dist/types/components/overlays/messagebox/messagebox.d.ts +61 -0
- package/dist/types/components/overlays/toast/toast.d.ts +45 -0
- package/dist/types/components/overlays/tooltip/tooltip.d.ts +13 -0
- package/dist/types/components/overlays/widget/widget.d.ts +61 -0
- package/dist/types/components/overlays/window/window.d.ts +38 -0
- package/dist/types/components/pagination.d.ts +1 -0
- package/dist/types/components/panel.d.ts +1 -0
- package/dist/types/components/pickerfield.d.ts +1 -0
- package/dist/types/components/radiogroup.d.ts +1 -0
- package/dist/types/components/searchgrid.d.ts +1 -0
- package/dist/types/components/secretfield.d.ts +1 -0
- package/dist/types/components/select.d.ts +1 -0
- package/dist/types/components/slider.d.ts +1 -0
- package/dist/types/components/spacer.d.ts +1 -0
- package/dist/types/components/spinner.d.ts +1 -0
- package/dist/types/components/stepform.d.ts +1 -0
- package/dist/types/components/stepper.d.ts +1 -0
- package/dist/types/components/suggestfield.d.ts +1 -0
- package/dist/types/components/table.d.ts +1 -0
- package/dist/types/components/tabs.d.ts +1 -0
- package/dist/types/components/textarea.d.ts +1 -0
- package/dist/types/components/textfield.d.ts +1 -0
- package/dist/types/components/toast.d.ts +1 -0
- package/dist/types/components/toggle.d.ts +1 -0
- package/dist/types/components/toolbar.d.ts +1 -0
- package/dist/types/components/tooltip.d.ts +1 -0
- package/dist/types/components/tree.d.ts +1 -0
- package/dist/types/components/viewmanager.d.ts +1 -0
- package/dist/types/components/viewport.d.ts +1 -0
- package/dist/types/components/widget.d.ts +1 -0
- package/dist/types/components/window.d.ts +1 -0
- package/dist/types/core/component.d.ts +94 -0
- package/dist/types/core/container.d.ts +43 -0
- package/dist/types/core/date.d.ts +14 -0
- package/dist/types/core/dom.d.ts +11 -0
- package/dist/types/core/emitter.d.ts +12 -0
- package/dist/types/core/field.d.ts +78 -0
- package/dist/types/core/focus.d.ts +18 -0
- package/dist/types/core/i18n.d.ts +12 -0
- package/dist/types/core/index.d.ts +15 -0
- package/dist/types/core/layer.d.ts +6 -0
- package/dist/types/core/position.d.ts +19 -0
- package/dist/types/core/registry.d.ts +12 -0
- package/dist/types/core/validators.d.ts +10 -0
- package/dist/types/core/virtual.d.ts +24 -0
- package/dist/types/data/column.d.ts +32 -0
- package/dist/types/data/format.d.ts +4 -0
- package/dist/types/data/index.d.ts +5 -0
- package/dist/types/data/model.d.ts +28 -0
- package/dist/types/data/proxy.d.ts +61 -0
- package/dist/types/data/store.d.ts +94 -0
- package/dist/types/index.d.ts +67 -0
- package/dist/types/layout/layout.d.ts +27 -0
- package/dist/types/motion/config.d.ts +83 -0
- package/dist/types/motion/core.d.ts +40 -0
- package/dist/types/motion/extras.d.ts +66 -0
- package/dist/types/motion/index.d.ts +3 -0
- package/dist/types/themes/define.d.ts +31 -0
- package/dist/types/themes/index.d.ts +1 -0
- package/dist/types/ui/enums.d.ts +82 -0
- package/dist/types/ui/index.d.ts +2 -0
- package/dist/types/ui/ui.d.ts +67 -0
- package/dist/ui.js +2 -0
- package/dist/ui.js.map +7 -0
- package/package.json +104 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/tooltip/tooltip.ts"],
|
|
4
|
+
"sourcesContent": ["import { h } from '../../../core/dom';\nimport { toLayer } from '../../../core/layer';\nimport { place } from '../../../core/position';\n\n// Tooltips are plain attributes: any element (or Component with `tooltip`) carries `data-op-tip`,\n// and one delegated set of listeners shows a single shared tooltip element.\nlet delay = 400;\nlet el: HTMLElement | undefined;\nlet target: HTMLElement | undefined;\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet installed = false;\n\nconst tipOf = (n: EventTarget | null) => (n instanceof Element ? n.closest<HTMLElement>('[data-op-tip]') : null);\n\nfunction show(t: HTMLElement) {\n const text = t.dataset.opTip;\n if (!text) return;\n el ??= h('div', 'op-tooltip', { role: 'tooltip', id: 'op-tooltip' });\n el.textContent = text;\n toLayer(el, t);\n target = t;\n t.setAttribute('aria-describedby', 'op-tooltip');\n place(el, t, { placement: 'top', offset: 6 });\n}\n\nfunction hide() {\n clearTimeout(timer);\n if (target) target.removeAttribute('aria-describedby');\n target = undefined;\n el?.remove();\n}\n\nfunction schedule(t: HTMLElement, ms: number) {\n clearTimeout(timer);\n if (target === t) return;\n hide();\n timer = setTimeout(() => show(t), ms);\n}\n\nfunction install() {\n if (installed || typeof document === 'undefined') return;\n installed = true;\n document.addEventListener('pointerover', (e: Event) => {\n if ((e as PointerEvent).pointerType === 'touch') return;\n const t = tipOf(e.target);\n if (t) schedule(t, delay);\n });\n document.addEventListener('pointerout', (e: Event) => {\n const t = tipOf(e.target);\n if (t && !t.contains((e as PointerEvent).relatedTarget as Node)) hide();\n });\n document.addEventListener('focusin', (e: Event) => {\n const t = tipOf(e.target);\n let visible = true;\n try {\n visible = !!t?.matches(':focus-visible');\n } catch { /* engine without :focus-visible */ }\n if (t && visible) schedule(t, 0);\n });\n document.addEventListener('focusout', hide);\n document.addEventListener('pointerdown', hide, true);\n document.addEventListener('keydown', (e: KeyboardEvent) => e.key === 'Escape' && hide(), true);\n document.addEventListener('scroll', hide, true);\n}\ninstall();\n\nexport const Tooltip = {\n /** Default delay (ms) before a hover tooltip shows. */\n configure(o: { delay?: number }) {\n if (o.delay != null) delay = o.delay;\n },\n show,\n hide,\n};\n\n/** Gives any element a tooltip (same as the `tooltip` config on components). */\nexport function attachTooltip(target: HTMLElement, text: string): void {\n target.dataset.opTip = text;\n}\n"],
|
|
5
|
+
"mappings": "wHAMA,IAAIA,EAAQ,IACRC,EACAC,EACAC,EACAC,EAAY,GAEVC,EAASC,GAA2BA,aAAa,QAAUA,EAAE,QAAqB,eAAe,EAAI,KAE3G,SAASC,EAAKC,EAAgB,CAC5B,IAAMC,EAAOD,EAAE,QAAQ,MAClBC,IACLR,IAAOS,EAAE,MAAO,aAAc,CAAE,KAAM,UAAW,GAAI,YAAa,CAAC,EACnET,EAAG,YAAcQ,EACjBE,EAAQV,EAAIO,CAAC,EACbN,EAASM,EACTA,EAAE,aAAa,mBAAoB,YAAY,EAC/CI,EAAMX,EAAIO,EAAG,CAAE,UAAW,MAAO,OAAQ,CAAE,CAAC,EAC9C,CAEA,SAASK,GAAO,CACd,aAAaV,CAAK,EACdD,GAAQA,EAAO,gBAAgB,kBAAkB,EACrDA,EAAS,OACTD,GAAI,OAAO,CACb,CAEA,SAASa,EAASN,EAAgBO,EAAY,CAC5C,aAAaZ,CAAK,EACdD,IAAWM,IACfK,EAAK,EACLV,EAAQ,WAAW,IAAMI,EAAKC,CAAC,EAAGO,CAAE,EACtC,CAEA,SAASC,GAAU,CACbZ,GAAa,OAAO,SAAa,MACrCA,EAAY,GACZ,SAAS,iBAAiB,cAAgB,GAAa,CACrD,GAAK,EAAmB,cAAgB,QAAS,OACjD,IAAM,EAAIC,EAAM,EAAE,MAAM,EACpB,GAAGS,EAAS,EAAGd,CAAK,CAC1B,CAAC,EACD,SAAS,iBAAiB,aAAe,GAAa,CACpD,IAAM,EAAIK,EAAM,EAAE,MAAM,EACpB,GAAK,CAAC,EAAE,SAAU,EAAmB,aAAqB,GAAGQ,EAAK,CACxE,CAAC,EACD,SAAS,iBAAiB,UAAY,GAAa,CACjD,IAAM,EAAIR,EAAM,EAAE,MAAM,EACpBY,EAAU,GACd,GAAI,CACFA,EAAU,CAAC,CAAC,GAAG,QAAQ,gBAAgB,CACzC,MAAQ,CAAsC,CAC1C,GAAKA,GAASH,EAAS,EAAG,CAAC,CACjC,CAAC,EACD,SAAS,iBAAiB,WAAYD,CAAI,EAC1C,SAAS,iBAAiB,cAAeA,EAAM,EAAI,EACnD,SAAS,iBAAiB,UAAY,GAAqB,EAAE,MAAQ,UAAYA,EAAK,EAAG,EAAI,EAC7F,SAAS,iBAAiB,SAAUA,EAAM,EAAI,EAChD,CACAG,EAAQ,EAED,IAAME,EAAU,CAErB,UAAUC,EAAuB,CAC3BA,EAAE,OAAS,OAAMnB,EAAQmB,EAAE,MACjC,EACA,KAAAZ,EACA,KAAAM,CACF,EAGO,SAASO,EAAclB,EAAqBO,EAAoB,CACrEP,EAAO,QAAQ,MAAQO,CACzB",
|
|
6
|
+
"names": ["delay", "el", "target", "timer", "installed", "tipOf", "n", "show", "t", "text", "h", "toLayer", "place", "hide", "schedule", "ms", "install", "visible", "Tooltip", "o", "attachTooltip"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=new Map;function r(o,n){n.type=o,e.set(o,n)}var s=o=>e.get(o);function i(o){if(typeof o.render=="function")return o;let n=o,t=n.type?e.get(n.type):void 0;if(!t)throw new Error(`Optikos: unknown component type "${n.type}". Did you import or register it?`);let p=new t(n);return n.renderTo&&p.mount(n.renderTo),p}export{r as a,s as b,i as c};
|
|
2
|
+
//# sourceMappingURL=chunk-TIPK3SCJ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/registry.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Component, ComponentConfig } from './component';\n\nexport type ComponentClass = { new (config: any): Component<any>; type?: string };\n/** Config accepted by `create` and `items`: the base keys plus whatever the chosen `type` understands. */\nexport type AnyConfig = ComponentConfig & Record<string, any>;\n\nconst types = new Map<string, ComponentClass>();\n\n/** Registers a component class under a `type`. Users register their own the same way. */\nexport function register(type: string, cls: ComponentClass): void {\n cls.type = type;\n types.set(type, cls);\n}\n\nexport const getType = (type: string): ComponentClass | undefined => types.get(type);\n\n/** Builds a component from a config (or passes an instance through). `renderTo` mounts it. */\nexport function create<T extends Component = Component>(config: AnyConfig | Component): T {\n if (typeof (config as Component).render === 'function') return config as T;\n const cfg = config as AnyConfig;\n const Cls = cfg.type ? types.get(cfg.type) : undefined;\n if (!Cls) throw new Error(`Optikos: unknown component type \"${cfg.type}\". Did you import or register it?`);\n const cmp = new Cls(cfg) as T;\n if (cfg.renderTo) cmp.mount(cfg.renderTo);\n return cmp;\n}\n"],
|
|
5
|
+
"mappings": "AAMA,IAAMA,EAAQ,IAAI,IAGX,SAASC,EAASC,EAAcC,EAA2B,CAChEA,EAAI,KAAOD,EACXF,EAAM,IAAIE,EAAMC,CAAG,CACrB,CAEO,IAAMC,EAAWF,GAA6CF,EAAM,IAAIE,CAAI,EAG5E,SAASG,EAAwCC,EAAkC,CACxF,GAAI,OAAQA,EAAqB,QAAW,WAAY,OAAOA,EAC/D,IAAMC,EAAMD,EACNE,EAAMD,EAAI,KAAOP,EAAM,IAAIO,EAAI,IAAI,EAAI,OAC7C,GAAI,CAACC,EAAK,MAAM,IAAI,MAAM,oCAAoCD,EAAI,IAAI,mCAAmC,EACzG,IAAME,EAAM,IAAID,EAAID,CAAG,EACvB,OAAIA,EAAI,UAAUE,EAAI,MAAMF,EAAI,QAAQ,EACjCE,CACT",
|
|
6
|
+
"names": ["types", "register", "type", "cls", "getType", "create", "config", "cfg", "Cls", "cmp"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as t}from"./chunk-ZWNQREWS.js";import{a as o}from"./chunk-TIPK3SCJ.js";var e,r=class extends t{baseCls="op-viewport";constructor(n={}){if(super(n),e&&!e.destroyed)throw new Error("Optikos: only one Viewport can exist at a time");e=this}onRender(){this.config.layout??="fit",super.onRender()}};o("viewport",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-TOLTUOZS.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/layout/viewport/viewport.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { register } from '../../../core/registry';\n\nlet current: Viewport | undefined;\n\n/** Root container that fills the window. Only one can exist at a time. */\nexport class Viewport extends Container<ContainerConfig> {\n protected override baseCls = 'op-viewport';\n\n constructor(config: ContainerConfig = {}) {\n super(config);\n if (current && !current.destroyed) throw new Error('Optikos: only one Viewport can exist at a time');\n current = this;\n }\n\n protected override onRender() {\n this.config.layout ??= 'fit';\n super.onRender();\n }\n}\nregister('viewport', Viewport);\n"],
|
|
5
|
+
"mappings": "gFAGA,IAAIA,EAGSC,EAAN,cAAuBC,CAA2B,CACpC,QAAU,cAE7B,YAAYC,EAA0B,CAAC,EAAG,CAExC,GADA,MAAMA,CAAM,EACRH,GAAW,CAACA,EAAQ,UAAW,MAAM,IAAI,MAAM,gDAAgD,EACnGA,EAAU,IACZ,CAEmB,UAAW,CAC5B,KAAK,OAAO,SAAW,MACvB,MAAM,SAAS,CACjB,CACF,EACAI,EAAS,WAAYH,CAAQ",
|
|
6
|
+
"names": ["current", "Viewport", "Container", "config", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as l}from"./chunk-EV73ADN2.js";import{c as a}from"./chunk-4EZJ5FKJ.js";import{b as s}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";import{f as o}from"./chunk-MW3RWBZ7.js";var n=class extends l{baseCls="op-field op-textfield op-picker op-suggest";seq=0;abort;cancelWait;live;hasTrigger(){return!1}emptyValue(){return null}isEmpty(e){return e==null||e===""}createControl(){let e=super.createControl();return this.config.icon!==!1&&(e.classList.add("has-icon"),e.prepend(s("span","op-suggest__icon",{"aria-hidden":"true"},a(this.config.icon??"search")))),e.append(s("span","op-spinner op-picker__spinner",{"aria-hidden":"true"})),this.live=s("div","op-sr-only",{"aria-live":"polite"}),e.append(this.live),this.own(()=>this.abort?.abort()),e}onRender(){super.onRender(),this.config.store?.on("load",()=>this.showResults(this.items))}onType(e){if(this.cancelWait?.(),this.abort?.abort(),e.trim().length<(this.config.minChars??1))return this.items=[],this.refreshList(),this.setSearching(!1),this.close();this.cancelWait=this.later(()=>{this.search(e)},this.config.delay??250)}async search(e){if(this.emit("before-query",e)===!1)return;let i=++this.seq,c=this.abort=new AbortController;this.setSearching(!0),this.emit("query",e);try{let t=this.config,r;if(t.store?(await t.store.load({query:e}),r=t.store.getData()):r=await t.query?.(e,{signal:c.signal})??[],i!==this.seq)return;this.items=r.map(p=>this.toItem(p)),this.showResults(this.items,e),this.emit("load",this.items)}catch(t){if(i!==this.seq)return;this.setSearching(!1),this.close(),this.emit("error",t)}}showResults(e,i=this.input.value){this.setSearching(!1),this.typed=!0,this.refreshList(),this.list.setHighlight(this.config.highlight===!1?"":i),this.live.textContent=e.length?o("results",{n:e.length}):o("noResults"),document.activeElement===this.input&&this.open()}setSearching(e){this.el.classList.toggle("is-searching",e),this.input.setAttribute("aria-busy",String(e))}setQuery(e){this.config.query=e}clearSuggestions(){this.items=[],this.refreshList(),this.close()}pick(e){super.pick(e),this.list.setHighlight("")}};h("suggestfield",n);export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-TZOQWCVH.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/suggestfield/suggestfield.ts"],
|
|
4
|
+
"sourcesContent": ["import { PickerField, type PickerConfig, type ListItem, type Option } from '../pickerfield/pickerfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface SuggestConfig<V = unknown> extends PickerConfig<V> {\n /** Async search. Receives the text and an AbortSignal that fires when a newer search starts. */\n query?: (text: string, ctx: { signal: AbortSignal }) => Promise<Option[]> | Option[];\n minChars?: number;\n /** Debounce in ms. */\n delay?: number;\n highlight?: boolean;\n /** Leading icon name; `false` hides it. Default: the magnifier (`search`). */\n icon?: string | false;\n}\n\n/** Search-as-you-type field: results come from `query` (or a Store with a proxy), not from a fixed list. */\nexport class SuggestField<V = unknown> extends PickerField<V, SuggestConfig<V>> {\n protected override baseCls = 'op-field op-textfield op-picker op-suggest';\n private seq = 0;\n private abort?: AbortController;\n private cancelWait?: () => void;\n private live!: HTMLElement;\n\n protected override hasTrigger() {\n return false;\n }\n protected override emptyValue(): V {\n return null as V;\n }\n protected override isEmpty(v: V) {\n return v == null || (v as unknown) === '';\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n if (this.config.icon !== false) {\n wrap.classList.add('has-icon');\n wrap.prepend(h('span', 'op-suggest__icon', { 'aria-hidden': 'true' }, iconEl(this.config.icon ?? 'search')));\n }\n wrap.append(h('span', 'op-spinner op-picker__spinner', { 'aria-hidden': 'true' }));\n this.live = h('div', 'op-sr-only', { 'aria-live': 'polite' });\n wrap.append(this.live);\n this.own(() => this.abort?.abort());\n return wrap;\n }\n\n protected override onRender() {\n super.onRender();\n // with a Store the results arrive through its change events\n this.config.store?.on('load', () => this.showResults(this.items));\n }\n\n protected override onType(text: string) {\n this.cancelWait?.();\n this.abort?.abort();\n if (text.trim().length < (this.config.minChars ?? 1)) {\n this.items = [];\n this.refreshList();\n this.setSearching(false);\n return this.close();\n }\n this.cancelWait = this.later(() => void this.search(text), this.config.delay ?? 250);\n }\n\n /** Runs a search now (skips the debounce). */\n async search(text: string): Promise<void> {\n if (this.emit('before-query', text) === false) return;\n const seq = ++this.seq;\n const ctl = (this.abort = new AbortController());\n this.setSearching(true);\n this.emit('query', text);\n try {\n const c = this.config;\n let options: Option[];\n if (c.store) {\n await c.store.load({ query: text });\n options = c.store.getData();\n } else {\n options = (await c.query?.(text, { signal: ctl.signal })) ?? [];\n }\n if (seq !== this.seq) return;\n this.items = options.map((o) => this.toItem(o));\n this.showResults(this.items, text);\n this.emit('load', this.items);\n } catch (err) {\n if (seq !== this.seq) return;\n this.setSearching(false);\n this.close();\n this.emit('error', err);\n }\n }\n\n private showResults(items: ListItem[], text = this.input.value) {\n this.setSearching(false);\n this.typed = true;\n this.refreshList();\n this.list.setHighlight(this.config.highlight === false ? '' : text);\n this.live.textContent = items.length ? t('results', { n: items.length }) : t('noResults');\n if (document.activeElement === this.input) this.open();\n }\n\n private setSearching(on: boolean) {\n this.el.classList.toggle('is-searching', on);\n this.input.setAttribute('aria-busy', String(on));\n }\n\n setQuery(query: NonNullable<SuggestConfig['query']>) {\n this.config.query = query;\n }\n\n clearSuggestions() {\n this.items = [];\n this.refreshList();\n this.close();\n }\n\n protected override pick(item: ListItem) {\n super.pick(item);\n this.list.setHighlight('');\n }\n}\nregister('suggestfield', SuggestField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SuggestField", "PickerField", "v", "wrap", "h", "iconEl", "text", "seq", "ctl", "c", "options", "o", "err", "items", "t", "on", "query", "item", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as R}from"./chunk-ZVK4L5GK.js";import{a as z}from"./chunk-FHM5NUS4.js";import{a as H}from"./chunk-Z2JBUHKA.js";import{a as k}from"./chunk-W3H7GTJY.js";import{a as T,b as E}from"./chunk-OWEQT2HN.js";import{c as A}from"./chunk-LW2WRUVL.js";import{c as x}from"./chunk-OEAXCCVM.js";import{a as v}from"./chunk-2ZUZ5HDL.js";import{c as C}from"./chunk-4EZJ5FKJ.js";import{a as M}from"./chunk-A2NKDOYN.js";import{b as d}from"./chunk-PZSHOSOS.js";import{a as S}from"./chunk-TIPK3SCJ.js";import{e as y,f as u}from"./chunk-MW3RWBZ7.js";y("en",{gridSelected:"{n} selected",gridSelectAll:"Select all {n}",gridClearSel:"Clear selection",gridSelectRow:"Select row",gridSelectPage:"Select all rows",gridRowActions:"Row actions",gridColumns:"Columns",gridResize:"Resize column",gridGroupAll:"All",gridOtherCols:"Other",gridGroups:"Column groups",gridColumnSearch:"Search columns",gridNoColumns:"No matching columns"});y("pt-BR",{gridSelected:"{n} selecionado(s)",gridSelectAll:"Selecionar todos os {n}",gridClearSel:"Limpar sele\xE7\xE3o",gridSelectRow:"Selecionar linha",gridSelectPage:"Selecionar todas as linhas",gridRowActions:"A\xE7\xF5es da linha",gridColumns:"Colunas",gridResize:"Redimensionar coluna",gridGroupAll:"Todas",gridOtherCols:"Outras",gridGroups:"Grupos de colunas",gridColumnSearch:"Buscar colunas",gridNoColumns:"Nenhuma coluna encontrada"});var f="__select",p="__actions",D={field:f,width:44,align:"center",cls:"op-grid__selcell"},K={field:p,width:44,align:"center",cls:"op-grid__actcell"},$="var(--op-grid-row-height, var(--op-row-height))",L=class extends M{baseCls="op-grid";store;offStore;headEl;headRow;viewport;emptyEl;table;pager;v;selected=new Set;active=-1;anchor=-1;justDragged=!1;cv=0;selAll;barEl;bulkEl;bulkCount;bulkBtns=[];selectAllBtn;rowMenu;colDd;colList;colSearch;colChips;colGroup="";cols(){let e=this.config;return[...e.checkboxSelection?[D]:[],...this.userCols(),...e.rowActions?.length?[K]:[]]}userCols(){return(this.config.columns??[]).filter(e=>!e.hidden)}visibleActions(){return this.config.rowActionsMode==="visible"&&!!this.config.rowActions?.length}mode(){return this.config.checkboxSelection?"multi":this.config.selection??"single"}build(){let e=this.config,i=d("div",this.baseCls);return this.headRow=d("div","op-grid__row op-grid__header-row",{role:"row"}),this.headEl=d("div","op-grid__header",{},this.headRow),this.viewport=d("div","op-grid__viewport"),this.emptyEl=d("div","op-grid__empty"),(e.columnMenu||e.bulkActions?.length)&&(this.bulkEl=d("div","op-grid__bulk"),this.bulkEl.hidden=!0,this.barEl=d("div","op-grid__bar",{},this.bulkEl),i.append(this.barEl)),this.table=d("div","op-grid__table",{role:"grid",tabindex:0,"aria-multiselectable":e.selection==="multi"||e.checkboxSelection?"true":null},this.headEl,this.viewport,this.emptyEl),i.append(this.table),i.classList.toggle("op-grid--striped",!!e.striped),e.paging&&(this.pager=new R({cls:"op-grid__pager"}),i.append(this.pager.el)),i}onRender(){let e=this.config;if(this.bindStore(e.store??new x({data:e.data??[]})),this.buildHeader(),this.buildBar(),this.v=T({scroller:this.viewport,count:this.store.count,rowHeight:e.rowHeight??(E(this.el,$)||36),render:(i,t)=>this.renderRow(i,t),rowCls:"op-grid__row op-grid__body-row"}),this.own(()=>this.v.destroy()),this.sync(),this.listen(this.viewport,"scroll",()=>this.headEl.scrollLeft=this.viewport.scrollLeft,{passive:!0}),this.listen(this.viewport,"click",i=>this.onRowEvent(i,"row-click")),this.listen(this.viewport,"dblclick",i=>this.onRowEvent(i,"row-dblclick")),this.listen(this.el,"keydown",i=>this.onKey(i)),this.listen(this.headRow,"change",i=>{i.target===this.selAll&&(this.selAll.checked?this.store.each(t=>this.selected.add(t)):this.config.keepSelection?this.store.each(t=>this.selected.delete(t)):this.selected.clear(),this.changed())}),e.reorderableColumns&&this.initColumnDrag(),e.resizableColumns&&this.initColumnResize(),this.listen(this.headRow,"click",i=>{if(this.justDragged||i.target.closest(".op-grid__resizer"))return;let t=i.target.closest("[data-field]"),s=t&&this.userCols().find(n=>n.field===t.dataset.field);s&&(this.emit("column-click",s),s.sortable&&this.sortBy(s))}),typeof ResizeObserver<"u"){let i=new ResizeObserver(()=>this.layout());i.observe(this.viewport),this.own(()=>i.disconnect())}this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(e.pageSize??20)),this.own(()=>this.pager?.destroy());for(let i of e.plugins??[]){let t=i.init(this);t&&this.own(t),i.destroy&&this.own(()=>i.destroy())}}cellAt(e){let i=e?.closest?.(".op-grid__body-row .op-grid__cell"),t=Number(i?.parentElement?.dataset.i),s=i&&this.cols()[Number(i.getAttribute("aria-colindex"))-1],n=i&&this.store.getAt(t);return s&&n&&![f,p].includes(s.field)?{index:t,record:n,column:s,el:i}:void 0}getCell(e,i){let t=this.cols().findIndex(s=>s.field===i);return document.getElementById(`${this.id}-r${e}`)?.querySelector(`[aria-colindex="${t+1}"]`)??void 0}getColumns(){return this.userCols()}getActive(){return this.active}notifyMount(){super.notifyMount(),this.layout(),this.pager?.notifyMount()}layout(){if(this.rendered){if(!this.config.rowHeight){let e=E(this.el,$);e&&this.v.setRowHeight(e)}this.headEl.style.paddingInlineEnd=`${this.viewport.offsetWidth-this.viewport.clientWidth}px`,this.v.refresh()}}bindStore(e){this.offStore?.(),this.store=e;let i=e.subscribe(s=>{this.rendered&&(this.sync(),s.type==="sort"&&this.paintSort())}),t=e.on("loading",s=>this.setLoading(s));this.offStore=()=>(i(),t()),this.own(()=>this.offStore?.())}sync(){let e=this.selected.size;if(!this.config.keepSelection)for(let i of this.selected)this.store.indexOf(i)<0&&this.selected.delete(i);this.active=Math.min(this.active,this.store.count-1),this.v.setCount(this.store.count),this.table.setAttribute("aria-rowcount",String(this.store.totalCount+1)),this.emptyEl.textContent=this.config.emptyText??u("empty"),this.emptyEl.hidden=this.store.count>0||!!this.config.loading,this.el.classList.toggle("is-empty",this.store.count===0),this.updateActiveDescendant(),this.paintSelection(),this.selected.size!==e&&this.emit("select",this.getSelection())}setStore(e){this.config.store=e,this.selected.clear(),this.active=this.anchor=-1,this.rendered&&(this.bindStore(e),this.pager?.setStore(e),this.paintSort(),this.sync())}getStore(){return this.render(),this.store}layoutColumns(){let e=this.cols(),i=this.visibleActions()?this.config.rowActions.length:1,t=n=>n.field===p?`calc(${i} * var(--op-grid-action-size) + ${i+1} * var(--op-grid-action-gap))`:`${n.width}px`,s=e.map(n=>n.field===p?t(n):n.width?`${n.width}px`:`minmax(${n.minWidth??96}px, ${n.flex??1}fr)`).join(" ");this.el.style.setProperty("--op-grid-cols",s),this.el.style.setProperty("--op-grid-min-width",`${e.reduce((n,o)=>n+(o.field===p?i*36:o.width??o.minWidth??96),0)}px`)}buildHeader(){let e=this.cols();this.layoutColumns(),this.el.classList.toggle("op-grid--actions-visible",this.visibleActions()),this.el.classList.toggle("op-grid--reorderable",!!this.config.reorderableColumns),this.el.classList.toggle("op-grid--resizable",!!this.config.resizableColumns),this.table.setAttribute("aria-colcount",String(e.length)),this.selAll=void 0,this.headRow.replaceChildren(...e.map((t,s)=>{let n=t.header??t.field,o=d("div",`op-grid__cell op-grid__hcell${t.align?` op-grid__cell--${t.align}`:""}${t.sortable?" is-sortable":""}`,{role:"columnheader","aria-colindex":s+1,"data-field":t.field});t.field===f?o.append(this.selAll=d("input","op-grid__check",{type:"checkbox","aria-label":u("gridSelectPage")})):t.field===p?o.append(d("span","op-sr-only",{},u("gridRowActions"))):t.sortable?o.append(d("button","op-grid__sort",{type:"button"},d("span","op-grid__label",{},n),d("span","op-grid__arrow",{"aria-hidden":"true"},C("arrow-up")))):o.append(d("span","op-grid__label",{},n));let r=t.field!==f&&t.field!==p;return this.config.reorderableColumns&&r&&o.classList.add("is-reorderable"),this.canResize(t)&&o.append(d("span","op-grid__resizer",{role:"separator","aria-orientation":"vertical","aria-label":`${u("gridResize")} ${n}`})),r&&!t.sortable&&(this.config.reorderableColumns||this.canResize(t))&&(o.tabIndex=0),o}));let i=this.groupBand(e);this.headEl.replaceChildren(...i?[i]:[],this.headRow),this.paintSort()}groupBand(e){if(this.config.groupHeaders===!1||!e.some(s=>s.group))return null;let i=[],t=0;for(;t<e.length;){let s=e[t].group??"",n=1;for(;t+n<e.length&&(e[t+n].group??"")===s;)n++;let o=d("div",`op-grid__gcell${s?"":" is-empty"}`,{role:"columnheader","aria-colindex":t+1,"aria-colspan":n},s);o.style.gridColumn=`span ${n}`,i.push(o),t+=n}return d("div","op-grid__row op-grid__group-row",{role:"row"},...i)}getColumnGroups(){return[...new Set(this.config.columns.map(e=>e.group).filter(e=>!!e))]}setColumnGroupVisible(e,i){let t=this.config.columns.filter(s=>(s.group??"")===e);if(t.length){for(let s of t)s.hidden=!i;this.config.columns.some(s=>!s.hidden)||(t[0].hidden=!1),this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}}setColumns(e){this.config.columns=e,this.rendered&&(this.cv++,this.buildHeader(),this.paintSelection(),this.v.refresh())}getColumnState(){return this.config.columns.map(e=>({field:e.field,hidden:!!e.hidden,width:e.width}))}setColumnState(e){let i=new Map(this.config.columns.map(s=>[s.field,s])),t=e.flatMap(s=>{let n=i.get(s.field);return i.delete(s.field),n?[{...n,hidden:s.hidden,width:s.width??n.width}]:[]});this.setColumns([...t,...i.values()]),this.emit("columns-change",this.getColumnState())}canResize(e){return!!this.config.resizableColumns&&e.field!==f&&e.field!==p&&e.resizable!==!1}setColumnWidth(e,i){let t=this.config.columns.find(s=>s.field===e);t&&(t.width=i==null?void 0:Math.round(Math.max(t.minWidth??48,Math.min(i,t.maxWidth??1/0))),this.layoutColumns(),this.emit("column-resize",e,t.width),this.emit("columns-change",this.getColumnState()))}initColumnResize(){let e=this.headRow;this.listen(e,"pointerdown",i=>{let t=i.target.closest(".op-grid__resizer");if(!t||i.button)return;i.preventDefault();let s=t.parentElement,n=s.dataset.field,o=this.config.columns.find(g=>g.field===n),r=i.clientX,l=s.getBoundingClientRect().width||o.width||96;this.el.classList.add("is-resizing");let h=o.width,c=g=>{let m=Math.round(Math.max(o.minWidth??48,Math.min(l+(g.clientX-r)*(this.dir()==="rtl"?-1:1),o.maxWidth??1/0)));o.width=h=m,this.layoutColumns()},a=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a),this.el.classList.remove("is-resizing"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),h!==void 0&&(this.emit("column-resize",n,h),this.emit("columns-change",this.getColumnState()))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",a),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a)))}),this.listen(e,"dblclick",i=>{let t=i.target.closest(".op-grid__resizer");t&&this.setColumnWidth(t.parentElement.dataset.field,void 0)}),this.listen(e,"keydown",i=>{if(!(i.altKey&&i.shiftKey)||i.key!=="ArrowLeft"&&i.key!=="ArrowRight")return;let t=i.target.closest(".op-grid__hcell"),s=t&&this.config.columns.find(o=>o.field===t.dataset.field);if(!t||!s||!this.canResize(s))return;i.preventDefault();let n=t.getBoundingClientRect().width||s.width||96;this.setColumnWidth(s.field,n+(i.key==="ArrowRight"?16:-16))})}dir(){return getComputedStyle(this.el).direction}moveColumn(e,i){let t=this.config.columns,s=t.find(a=>a.field===e);if(!s||e===i)return;let n=this.userCols(),o=n.indexOf(s),r=[...t.filter(a=>a!==s)],l=i==null?void 0:r.find(a=>a.field===i),h=n.filter(a=>a!==s).pop(),c=l?r.indexOf(l):h?r.indexOf(h)+1:r.length;r.splice(c,0,s),!r.every((a,g)=>a===t[g])&&(this.setColumns(r),this.emit("column-move",e,o,this.userCols().indexOf(s)),this.emit("columns-change",this.getColumnState()))}initColumnDrag(){let e=this.headRow,i=()=>Array.from(e.querySelectorAll(".is-reorderable"));this.listen(e,"pointerdown",t=>{let s=t.target.closest(".is-reorderable");if(!s||t.button||t.target.closest(".op-grid__resizer"))return;let n=s.dataset.field,o=t.clientX,r,l,h=null,c=g=>{if(!r){if(Math.abs(g.clientX-o)<6)return;r=d("div","op-grid__ghost",{},s.textContent??""),l=d("div","op-grid__drop"),this.el.append(r),this.headEl.append(l),s.classList.add("is-dragging-col")}r.style.left=`${g.clientX}px`,r.style.top=`${g.clientY}px`;let m=i(),b=m.find(B=>{let _=B.getBoundingClientRect();return g.clientX<_.left+_.width/2});h=b?b.dataset.field:null;let w=(b??m[m.length-1])?.getBoundingClientRect(),G=this.headEl.getBoundingClientRect();w&&l&&(l.style.left=`${(b?w.left:w.right)-G.left+this.headEl.scrollLeft}px`)},a=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a),r&&(r.remove(),l?.remove(),s.classList.remove("is-dragging-col"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),this.moveColumn(n,h))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",a),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",a)))}),this.listen(e,"keydown",t=>{if(!t.altKey||t.shiftKey||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;let s=t.target.closest(".is-reorderable");if(!s)return;t.preventDefault();let n=this.userCols(),o=n.findIndex(h=>h.field===s.dataset.field),r=t.key==="ArrowLeft"?o-1:o+1;if(r<0||r>=n.length)return;this.moveColumn(n[o].field,t.key==="ArrowLeft"?n[r].field:n[r+1]?.field??null);let l=e.querySelector(`[data-field="${CSS.escape(n[o].field)}"]`);(l?.querySelector("button")??l)?.focus()})}paintSort(){let e=this.store.getSorters()[0];for(let i of Array.from(this.headRow.children)){let t=!!e&&i.dataset.field===e.field;i.classList.toggle("is-sorted-asc",t&&e.dir==="asc"),i.classList.toggle("is-sorted-desc",t&&e.dir==="desc"),i.classList.contains("is-sortable")&&i.setAttribute("aria-sort",t?e.dir==="asc"?"ascending":"descending":"none")}}sortBy(e){let i=this.store.getSorters()[0],t=i?.field===e.field?i.dir==="asc"?"desc":null:"asc";this.emit("before-sort",e.field,t)!==!1&&(this.store.sort(t?e.field:null,t??void 0),this.emit("sort",e.field,t))}rowIndexOffset(){return this.store.pageSize?(this.store.page-1)*this.store.pageSize:0}renderRow(e,i){let t=this.store.getAt(i);if(!t)return;let s=this.cols();e.id=`${this.id}-r${i}`,e.dataset.i=String(i),e.setAttribute("role","row"),e.setAttribute("aria-rowindex",String(this.rowIndexOffset()+i+2));let n=this.selected.has(t);e.setAttribute("aria-selected",this.mode()==="none"?"false":String(n)),e.classList.toggle("is-selected",n),e.classList.toggle("is-active",i===this.active),e.classList.toggle("is-odd",i%2===1),(e.dataset.cv!==String(this.cv)||e.children.length!==s.length)&&(e.dataset.cv=String(this.cv),e.replaceChildren(...s.map((o,r)=>d("div",`op-grid__cell${o.align?` op-grid__cell--${o.align}`:""}${o.cls?` ${o.cls}`:""}`,{role:"gridcell","aria-colindex":r+1})))),s.forEach((o,r)=>{let l=e.children[r];if(o.field===f){let c=l.firstElementChild??l.appendChild(d("input","op-grid__check",{type:"checkbox",tabindex:-1,"aria-label":u("gridSelectRow")}));c.checked=n;return}if(o.field===p){let c=this.config.rowActions??[];if(!this.visibleActions()){l.firstChild||l.append(d("button","op-grid__actbtn",{type:"button",tabindex:-1,"aria-label":u("gridRowActions"),"aria-haspopup":"menu"},C("more")));return}(l.children.length!==c.length||l.firstElementChild?.dataset.a==null)&&l.replaceChildren(...c.map((a,g)=>d("button",`op-grid__actbtn${a.variant==="danger"?" is-danger":""}`,{type:"button",tabindex:-1,"data-a":g,"aria-label":a.text,title:a.text},a.icon?C(a.icon):a.text))),c.forEach((a,g)=>l.children[g].disabled=!!a.disabled?.(t));return}let h=A(o,t);typeof h=="string"?l.textContent=h:l.replaceChildren(h)})}indexOfEvent(e){let i=e.target.closest(".op-grid__body-row");return i?Number(i.dataset.i):-1}onRowEvent(e,i){let t=this.indexOfEvent(e),s=this.store.getAt(t);if(s){if(i==="row-click"){let n=e.target.closest(".op-grid__actbtn");if(n){if(n.dataset.a==null)return this.openRowMenu(s,n);n.disabled||this.config.rowActions[Number(n.dataset.a)].handler(s,this);return}this.setActive(t,!1),this.pick(t,e)}this.emit(i,s,t,e)}}getSelection(){return[...this.selected]}select(e,i={}){let t=typeof e=="number"?this.store.getAt(e):e,s=this.mode();!t||s==="none"||((s==="single"||!i.add)&&this.selected.clear(),this.selected.add(t),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.v?.refresh(),this.paintSelection(),this.emit("select",this.getSelection())}selectAllFiltered(){if(this.mode()==="multi"){for(let e of this.store.getFiltered())this.selected.add(e);this.changed()}}pick(e,i){let t=this.mode(),s=this.store.getAt(e);if(!(!s||t==="none")){if(t==="multi"&&i.shiftKey&&this.anchor>=0){this.config.checkboxSelection||this.selected.clear();for(let n of this.store.getRange(Math.min(this.anchor,e),Math.max(this.anchor,e)+1))this.selected.add(n)}else t==="multi"&&(i.ctrlKey||i.metaKey||this.config.checkboxSelection)?(this.selected.delete(s)||this.selected.add(s),this.anchor=e):(this.selected.clear(),this.selected.add(s),this.anchor=e);this.changed()}}setActive(e,i=!0){this.active=e,i&&e>=0&&this.v.scrollTo(e),this.v.refresh(),this.updateActiveDescendant()}updateActiveDescendant(){this.active>=0&&this.active<this.store.count?this.table.setAttribute("aria-activedescendant",`${this.id}-r${this.active}`):this.table.removeAttribute("aria-activedescendant")}focusRow(e){this.render(),this.setActive(Math.max(0,Math.min(e,this.store.count-1))),this.table.focus()}focusEl(){return this.table}scrollToRow(e){this.v?.scrollTo(e)}onKey(e){let i=e.target;if(i.closest(".op-grid__header")||i!==this.table&&i.matches("input:not([type=checkbox]),textarea,select,[contenteditable]"))return;let t=this.store.count;if(!t)return;if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&this.active>=0&&this.config.rowActions?.length)return e.preventDefault(),this.openRowMenu(this.store.getAt(this.active),document.getElementById(`${this.id}-r${this.active}`)??this.el);let s=Math.max(1,Math.floor((this.viewport.clientHeight||400)/this.config.rowHeight||10)),n=this.active<0?0:this.active,o=this.mode(),r={ArrowDown:Math.min(t-1,this.active<0?0:n+1),ArrowUp:Math.max(0,n-1),Home:0,End:t-1,PageDown:Math.min(t-1,n+s),PageUp:Math.max(0,n-s)};if(e.key in r){e.preventDefault();let l=r[e.key];this.setActive(l),(o==="single"||o==="multi"&&!e.ctrlKey&&!e.metaKey&&!this.config.checkboxSelection)&&this.pick(l,e)}else e.key===" "&&this.active>=0?(e.preventDefault(),o==="multi"?this.pick(this.active,{ctrlKey:!0}):this.pick(this.active,e)):e.key==="Enter"&&this.active>=0?this.emit("row-activate",this.store.getAt(this.active),this.active):(e.key==="a"||e.key==="A")&&(e.ctrlKey||e.metaKey)&&o==="multi"&&(e.preventDefault(),this.store.each(l=>this.selected.add(l)),this.changed())}refresh(){this.v?.refresh()}buildBar(){let e=this.config;if(!this.barEl)return;this.bulkCount=d("span","op-grid__count",{"aria-live":"polite"}),this.selectAllBtn=new v({text:"",variant:"ghost",handler:()=>this.selectAllFiltered()}),this.bulkBtns=(e.bulkActions??[]).map(t=>new v({text:t.text,icon:t.icon,variant:t.variant==="danger"?"danger":"default",handler:()=>t.handler(this.getSelection(),this)}));let i=new v({text:u("gridClearSel"),variant:"ghost",handler:()=>this.deselectAll()});this.bulkEl.append(this.bulkCount,this.selectAllBtn.el,...this.bulkBtns.map(t=>t.el),i.el),this.own(()=>[this.selectAllBtn,...this.bulkBtns,i].forEach(t=>t?.destroy())),e.columnMenu&&this.buildColumnMenu(),this.paintSelection()}paintSelection(){if(!this.rendered)return;let e=this.store.count,i=0;if(this.store.each(n=>this.selected.has(n)&&i++),this.selAll&&(this.selAll.checked=e>0&&i===e,this.selAll.indeterminate=i>0&&i<e),!this.bulkEl)return;let t=this.selected.size;if(this.bulkEl.hidden=!t||!this.config.bulkActions?.length,this.bulkEl.hidden)return;this.bulkCount.textContent=u("gridSelected",{n:t});let s=this.store.getFiltered().length;this.selectAllBtn.el.hidden=!(this.mode()==="multi"&&i===e&&s>e&&t<s),this.selectAllBtn.setText(u("gridSelectAll",{n:s}))}openRowMenu(e,i){this.rowMenu??=new z({}),this.rowMenu.setItems((this.config.rowActions??[]).map(t=>({text:t.text,icon:t.icon,disabled:!!t.disabled?.(e),handler:()=>t.handler(e,this)}))),this.rowMenu.showBy(i)}buildColumnMenu(){let e=new v({text:u("gridColumns"),icon:"columns",variant:"ghost"});this.colSearch=new k({placeholder:u("gridColumnSearch"),clearable:!0}),this.colChips=d("div","op-grid__colchips",{role:"group","aria-label":u("gridGroups")}),this.colList=d("div","op-grid__collist",{role:"group","aria-label":u("gridColumns")});let i=d("div","op-grid__colempty",{},u("gridNoColumns"));i.hidden=!0;let t=d("div","op-grid__colmenu",{},this.colSearch.el,this.colChips,this.colList,i);this.colDd=new H({anchor:e.el,content:t,placement:"bottom-end",role:"dialog",autoFocus:!1}),this.barEl.append(e.el),this.own(()=>e.destroy());let s=()=>{let n=(this.colSearch.getValue()??"").toLowerCase(),o=0,r,l=0,h=()=>r&&(r.hidden=l===0);for(let c of Array.from(this.colList.children)){if(c.classList.contains("op-grid__colgroup")){h(),r=c,l=0;continue}let a=c.dataset.group??"",g=!this.colGroup||a===this.colGroup,m=!n||a.toLowerCase().includes(n)||c.textContent.toLowerCase().includes(n);c.hidden=!(g&&m),c.hidden||(o++,l++)}h(),i.hidden=o>0};this.colSearch.on("change",s),this.listen(this.colChips,"click",n=>{let o=n.target.closest("[data-g]");o&&(this.colGroup=o.dataset.g,this.paintColumnList(),s())}),e.on("click",()=>{if(this.colDd.isOpen())return this.colDd.close();this.colSearch.setValue(""),this.colGroup="",this.paintColumnList(),this.colDd.open(),this.colList.querySelector("input")?.focus()}),this.listen(this.colList,"change",n=>{let o=n.target;if(o.dataset.groupToggle!=null)this.setColumnGroupVisible(o.dataset.groupToggle,o.checked);else{let r=this.config.columns.find(l=>l.field===o.value);if(!r)return;r.hidden=!o.checked,this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}this.paintColumnList(),s()})}paintColumnList(){let e=this.config.columns,i=this.getColumnGroups(),t=this.userCols().length===1?this.userCols()[0]:null,s=o=>{let r=d("input","op-grid__check",{type:"checkbox",value:o.field});return r.checked=!o.hidden,r.disabled=o===t,d("label","op-grid__colitem",{"data-group":o.group??""},r,d("span","",{},o.header??o.field))};if(this.colChips.hidden=i.length<2,this.colChips.replaceChildren(...[["",u("gridGroupAll")],...i.map(o=>[o,o])].map(([o,r])=>d("button",`op-grid__colchip${this.colGroup===o?" is-on":""}`,{type:"button","data-g":o,"aria-pressed":String(this.colGroup===o)},r))),!i.length)return this.colList.replaceChildren(...e.map(s));let n=[];for(let o of[...i,""]){let r=e.filter(c=>(c.group??"")===o);if(!r.length)continue;let l=r.filter(c=>!c.hidden).length,h=d("input","op-grid__check",{type:"checkbox","data-group-toggle":o,"aria-label":o||u("gridOtherCols")});h.checked=l===r.length,h.indeterminate=l>0&&l<r.length,n.push(d("div","op-grid__colgroup",{"data-group":o},d("label","",{},h,d("span","",{},o||u("gridOtherCols"))),d("span","op-grid__colcount",{},`${l}/${r.length}`)),...r.map(s))}this.colList.replaceChildren(...n)}onDestroy(){this.pager?.destroy(),this.rowMenu?.destroy(),this.colDd?.destroy(),this.colSearch?.destroy()}};S("grid",L);export{L as a};
|
|
2
|
+
//# sourceMappingURL=chunk-VF7BGP6L.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/grid/grid.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { virtualize, measure } from '../../../core/virtual';\nimport { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport { cellContent, type Column } from '../../../data/column';\nimport { iconEl } from '../../base/icon/icon';\nimport { Pagination } from '../pagination/pagination';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Menu } from '../../overlays/menu/menu';\n\naddMessages('en', {\n gridSelected: '{n} selected',\n gridSelectAll: 'Select all {n}',\n gridClearSel: 'Clear selection',\n gridSelectRow: 'Select row',\n gridSelectPage: 'Select all rows',\n gridRowActions: 'Row actions',\n gridColumns: 'Columns',\n gridResize: 'Resize column',\n gridGroupAll: 'All',\n gridOtherCols: 'Other',\n gridGroups: 'Column groups',\n gridColumnSearch: 'Search columns',\n gridNoColumns: 'No matching columns',\n});\naddMessages('pt-BR', {\n gridSelected: '{n} selecionado(s)',\n gridSelectAll: 'Selecionar todos os {n}',\n gridClearSel: 'Limpar sele\u00E7\u00E3o',\n gridSelectRow: 'Selecionar linha',\n gridSelectPage: 'Selecionar todas as linhas',\n gridRowActions: 'A\u00E7\u00F5es da linha',\n gridColumns: 'Colunas',\n gridResize: 'Redimensionar coluna',\n gridGroupAll: 'Todas',\n gridOtherCols: 'Outras',\n gridGroups: 'Grupos de colunas',\n gridColumnSearch: 'Buscar colunas',\n gridNoColumns: 'Nenhuma coluna encontrada',\n});\n\nexport interface GridConfig<T extends Record<string, any> = any> extends ComponentConfig {\n store?: Store<T>;\n /** Used when no `store` is given. */\n data?: Partial<T>[];\n columns: Column<T>[];\n selection?: 'none' | 'single' | 'multi';\n /** Row height in px. Default: measured from the `--op-grid-row-height` / `--op-row-height` tokens. */\n rowHeight?: number;\n /** Adds a Pagination bar bound to the store (give the store a `pageSize`, or set it here). */\n paging?: boolean;\n pageSize?: number;\n emptyText?: string;\n striped?: boolean;\n /** Adds a leading checkbox column with a select-all in the header. Implies multi selection; a row click toggles. */\n checkboxSelection?: boolean;\n /** Keep selected records when the page or the filters change. Default false. */\n keepSelection?: boolean;\n /** Buttons shown in a bar above the header while records are selected. */\n bulkActions?: GridAction<T>[];\n /** Actions at the end of every row (see `rowActionsMode`). */\n rowActions?: GridRowAction<T>[];\n /** Optional features (`cellEditing()`...). See `GridPlugin`. */\n plugins?: GridPlugin<T>[];\n /** `'menu'` (default): one \"\u22EF\" button opens a menu. `'visible'`: every action is an icon button, always shown (dimmed until the row is hovered, active or selected). */\n rowActionsMode?: 'menu' | 'visible';\n /** A \"Columns\" button in the bar: toggle columns on and off, with search. */\n columnMenu?: boolean;\n /** Drag a header to a new place (or Alt+\u2190/\u2192 on a focused header). `column-move` and `columns-change` fire; ViewManager saves the order. */\n reorderableColumns?: boolean;\n /** A handle on each header's edge: drag to resize (double-click resets), Alt+Shift+\u2190/\u2192 on a focused header. Widths are part of `getColumnState`. */\n resizableColumns?: boolean;\n /** Show the group labels (`Column.group`) as a band over the header. Default true when any column has a group. */\n groupHeaders?: boolean;\n}\n\n/** Extends a Grid without growing its base: `init` runs once the grid is rendered and may return a cleanup. */\nexport interface GridPlugin<T extends Record<string, any> = any> {\n init(grid: Grid<T>): void | (() => void);\n destroy?(): void;\n}\n\n/** What `cellAt` finds under a DOM node: the row index, its record, the column and the cell element. */\nexport interface GridCell<T extends Record<string, any> = any> {\n index: number;\n record: Model<T>;\n column: Column<T>;\n el: HTMLElement;\n}\n\nexport interface GridAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n handler: (records: Model<T>[], grid: Grid<T>) => void;\n}\nexport interface GridRowAction<T extends Record<string, any> = any> {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Disabled for the records where this returns true. */\n disabled?: (record: Model<T>) => boolean;\n handler: (record: Model<T>, grid: Grid<T>) => void;\n}\nexport interface ColumnState {\n field: string;\n hidden: boolean;\n width?: number;\n}\n\nconst SEL = '__select';\nconst ACT = '__actions';\nconst SEL_COL: Column = { field: SEL, width: 44, align: 'center', cls: 'op-grid__selcell' };\nconst ACT_COL: Column = { field: ACT, width: 44, align: 'center', cls: 'op-grid__actcell' };\n\nconst ROW = 'var(--op-grid-row-height, var(--op-row-height))';\n\n/** Data grid with a virtualized body: only the visible rows (plus a small overscan) exist in the DOM. */\n/** `T` is the record shape; `new Grid({ store })` infers it from a typed `Store<T>`. */\nexport class Grid<T extends Record<string, any> = any> extends Component<GridConfig<T>> {\n protected override baseCls = 'op-grid';\n private store!: Store<T>;\n private offStore?: () => void;\n private headEl!: HTMLElement;\n private headRow!: HTMLElement;\n private viewport!: HTMLElement;\n private emptyEl!: HTMLElement;\n /** The focusable `role=grid` part (header + rows); the root also holds the bulk bar and the pager, which a grid may not contain. */\n private table!: HTMLElement;\n private pager?: Pagination;\n private v!: ReturnType<typeof virtualize>;\n private selected = new Set<Model<T>>();\n private active = -1;\n private anchor = -1;\n private justDragged = false;\n private cv = 0; // bumps when the columns change, so pooled rows rebuild their cells\n private selAll?: HTMLInputElement;\n private barEl?: HTMLElement;\n private bulkEl?: HTMLElement;\n private bulkCount?: HTMLElement;\n private bulkBtns: Button[] = [];\n private selectAllBtn?: Button;\n private rowMenu?: Menu;\n private colDd?: Dropdown;\n private colList?: HTMLElement;\n private colSearch?: TextField;\n private colChips?: HTMLElement;\n private colGroup = '';\n\n private cols(): Column[] {\n const c = this.config;\n return [...(c.checkboxSelection ? [SEL_COL] : []), ...this.userCols(), ...(c.rowActions?.length ? [ACT_COL] : [])];\n }\n private userCols(): Column[] {\n return (this.config.columns ?? []).filter((c) => !c.hidden);\n }\n private visibleActions(): boolean {\n return this.config.rowActionsMode === 'visible' && !!this.config.rowActions?.length;\n }\n private mode(): 'none' | 'single' | 'multi' {\n return this.config.checkboxSelection ? 'multi' : (this.config.selection ?? 'single');\n }\n\n protected override build() {\n const c = this.config;\n const el = h('div', this.baseCls);\n this.headRow = h('div', 'op-grid__row op-grid__header-row', { role: 'row' });\n this.headEl = h('div', 'op-grid__header', {}, this.headRow);\n this.viewport = h('div', 'op-grid__viewport');\n this.emptyEl = h('div', 'op-grid__empty');\n if (c.columnMenu || c.bulkActions?.length) {\n this.bulkEl = h('div', 'op-grid__bulk');\n this.bulkEl.hidden = true;\n this.barEl = h('div', 'op-grid__bar', {}, this.bulkEl);\n el.append(this.barEl);\n }\n this.table = h('div', 'op-grid__table', { role: 'grid', tabindex: 0, 'aria-multiselectable': c.selection === 'multi' || c.checkboxSelection ? 'true' : null }, this.headEl, this.viewport, this.emptyEl);\n el.append(this.table);\n el.classList.toggle('op-grid--striped', !!c.striped);\n if (c.paging) {\n this.pager = new Pagination({ cls: 'op-grid__pager' });\n el.append(this.pager.el);\n }\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.bindStore(c.store ?? new Store<T>({ data: c.data ?? [] }));\n this.buildHeader();\n this.buildBar();\n this.v = virtualize({\n scroller: this.viewport,\n count: this.store.count,\n rowHeight: c.rowHeight ?? (measure(this.el, ROW) || 36),\n render: (row, i) => this.renderRow(row, i),\n rowCls: 'op-grid__row op-grid__body-row',\n });\n this.own(() => this.v.destroy());\n this.sync();\n\n this.listen(this.viewport, 'scroll', () => (this.headEl.scrollLeft = this.viewport.scrollLeft), { passive: true });\n this.listen(this.viewport, 'click', (e: MouseEvent) => this.onRowEvent(e, 'row-click'));\n this.listen(this.viewport, 'dblclick', (e: MouseEvent) => this.onRowEvent(e, 'row-dblclick'));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.headRow, 'change', (e: Event) => {\n if (e.target !== this.selAll) return;\n if (this.selAll!.checked) this.store.each((r) => this.selected.add(r));\n else if (this.config.keepSelection) this.store.each((r) => this.selected.delete(r));\n else this.selected.clear();\n this.changed();\n });\n if (c.reorderableColumns) this.initColumnDrag();\n if (c.resizableColumns) this.initColumnResize();\n this.listen(this.headRow, 'click', (e: Event) => {\n if (this.justDragged || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-field]');\n const col = cell && this.userCols().find((x) => x.field === cell.dataset.field);\n if (!col) return;\n this.emit('column-click', col);\n if (col.sortable) this.sortBy(col);\n });\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => this.layout());\n ro.observe(this.viewport);\n this.own(() => ro.disconnect());\n }\n if (this.pager) {\n this.pager.setStore(this.store);\n if (!this.store.pageSize) this.store.setPageSize(c.pageSize ?? 20);\n }\n this.own(() => this.pager?.destroy());\n for (const p of c.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n if (p.destroy) this.own(() => p.destroy!());\n }\n }\n\n /** The row, record, column and cell element under a node (e.g. an event target), if it is a body cell. */\n cellAt(node: EventTarget | null): GridCell<T> | undefined {\n const cell = (node as HTMLElement | null)?.closest?.<HTMLElement>('.op-grid__body-row .op-grid__cell');\n const index = Number(cell?.parentElement?.dataset.i);\n const column = cell && this.cols()[Number(cell.getAttribute('aria-colindex')) - 1];\n const record = cell && this.store.getAt(index);\n return column && record && ![SEL, ACT].includes(column.field) ? { index, record, column, el: cell } : undefined;\n }\n\n /** The body cell of row `index` and column `field`, when that row is in the DOM (rows are virtualized). */\n getCell(index: number, field: string): HTMLElement | undefined {\n const n = this.cols().findIndex((c) => c.field === field);\n return document.getElementById(`${this.id}-r${index}`)?.querySelector<HTMLElement>(`[aria-colindex=\"${n + 1}\"]`) ?? undefined;\n }\n\n /** The visible data columns, in order (no checkbox/action columns). */\n getColumns(): Column<T>[] {\n return this.userCols();\n }\n\n /** The active row index (keyboard cursor), or -1. */\n getActive(): number {\n return this.active;\n }\n\n override notifyMount() {\n super.notifyMount();\n this.layout();\n this.pager?.notifyMount();\n }\n\n /** Re-measures row height and scrollbar (needed after the grid becomes visible or resizes). */\n private layout() {\n if (!this.rendered) return;\n if (!this.config.rowHeight) {\n const hgt = measure(this.el, ROW);\n if (hgt) this.v.setRowHeight(hgt);\n }\n this.headEl.style.paddingInlineEnd = `${this.viewport.offsetWidth - this.viewport.clientWidth}px`;\n this.v.refresh();\n }\n\n // ---- store ---------------------------------------------------------------------------------\n\n private bindStore(store: Store<T>) {\n this.offStore?.();\n this.store = store;\n const offChange = store.subscribe((c) => {\n if (!this.rendered) return;\n this.sync();\n if (c.type === 'sort') this.paintSort();\n });\n const offLoading = store.on('loading', (on: boolean) => this.setLoading(on));\n this.offStore = () => (offChange(), offLoading());\n this.own(() => this.offStore?.());\n }\n\n /** Brings count, selection and the empty state in line with the store. */\n private sync() {\n const before = this.selected.size;\n if (!this.config.keepSelection) for (const r of this.selected) if (this.store.indexOf(r) < 0) this.selected.delete(r);\n this.active = Math.min(this.active, this.store.count - 1);\n this.v.setCount(this.store.count);\n this.table.setAttribute('aria-rowcount', String(this.store.totalCount + 1));\n this.emptyEl.textContent = this.config.emptyText ?? t('empty');\n this.emptyEl.hidden = this.store.count > 0 || !!this.config.loading;\n this.el.classList.toggle('is-empty', this.store.count === 0);\n this.updateActiveDescendant();\n this.paintSelection();\n if (this.selected.size !== before) this.emit('select', this.getSelection());\n }\n\n setStore(store: Store<T>) {\n this.config.store = store;\n this.selected.clear();\n this.active = this.anchor = -1;\n if (!this.rendered) return;\n this.bindStore(store);\n this.pager?.setStore(store);\n this.paintSort();\n this.sync();\n }\n getStore(): Store<T> {\n this.render();\n return this.store;\n }\n\n // ---- header / columns ----------------------------------------------------------------------\n\n /** Column widths \u2192 the CSS grid template shared by the header and every row. */\n private layoutColumns() {\n const cols = this.cols();\n const n = this.visibleActions() ? this.config.rowActions!.length : 1;\n const wide = (c: Column) => (c.field === ACT ? `calc(${n} * var(--op-grid-action-size) + ${n + 1} * var(--op-grid-action-gap))` : `${c.width}px`);\n const tpl = cols.map((c) => (c.field === ACT ? wide(c) : c.width ? `${c.width}px` : `minmax(${c.minWidth ?? 96}px, ${c.flex ?? 1}fr)`)).join(' ');\n this.el.style.setProperty('--op-grid-cols', tpl);\n this.el.style.setProperty('--op-grid-min-width', `${cols.reduce((sum, c) => sum + (c.field === ACT ? n * 36 : (c.width ?? c.minWidth ?? 96)), 0)}px`);\n }\n\n private buildHeader() {\n const cols = this.cols();\n this.layoutColumns();\n this.el.classList.toggle('op-grid--actions-visible', this.visibleActions());\n this.el.classList.toggle('op-grid--reorderable', !!this.config.reorderableColumns);\n this.el.classList.toggle('op-grid--resizable', !!this.config.resizableColumns);\n this.table.setAttribute('aria-colcount', String(cols.length));\n this.selAll = undefined;\n this.headRow.replaceChildren(\n ...cols.map((c, i) => {\n const label = c.header ?? c.field;\n const cell = h('div', `op-grid__cell op-grid__hcell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.sortable ? ' is-sortable' : ''}`, { role: 'columnheader', 'aria-colindex': i + 1, 'data-field': c.field });\n if (c.field === SEL) cell.append((this.selAll = h('input', 'op-grid__check', { type: 'checkbox', 'aria-label': t('gridSelectPage') })));\n else if (c.field === ACT) cell.append(h('span', 'op-sr-only', {}, t('gridRowActions')));\n else if (c.sortable) cell.append(h('button', 'op-grid__sort', { type: 'button' }, h('span', 'op-grid__label', {}, label), h('span', 'op-grid__arrow', { 'aria-hidden': 'true' }, iconEl('arrow-up'))));\n else cell.append(h('span', 'op-grid__label', {}, label));\n const user = c.field !== SEL && c.field !== ACT;\n if (this.config.reorderableColumns && user) cell.classList.add('is-reorderable');\n if (this.canResize(c)) {\n cell.append(h('span', 'op-grid__resizer', { role: 'separator', 'aria-orientation': 'vertical', 'aria-label': `${t('gridResize')} ${label}` }));\n }\n // a sortable header already has its button to focus; the others need a tab stop to be moved/resized by keyboard\n if (user && !c.sortable && (this.config.reorderableColumns || this.canResize(c))) cell.tabIndex = 0;\n return cell;\n }),\n );\n const band = this.groupBand(cols);\n this.headEl.replaceChildren(...(band ? [band] : []), this.headRow);\n this.paintSort();\n }\n\n /** Labels over runs of neighbouring columns that share a group (a dragged column can split a group: it shows twice). */\n private groupBand(cols: Column[]): HTMLElement | null {\n if (this.config.groupHeaders === false || !cols.some((c) => c.group)) return null;\n const cells: HTMLElement[] = [];\n let i = 0;\n while (i < cols.length) {\n const g = cols[i].group ?? '';\n let n = 1;\n while (i + n < cols.length && (cols[i + n].group ?? '') === g) n++;\n const cell = h('div', `op-grid__gcell${g ? '' : ' is-empty'}`, { role: 'columnheader', 'aria-colindex': i + 1, 'aria-colspan': n }, g);\n cell.style.gridColumn = `span ${n}`;\n cells.push(cell);\n i += n;\n }\n return h('div', 'op-grid__row op-grid__group-row', { role: 'row' }, ...cells);\n }\n\n /** The group labels in the order they first appear. */\n getColumnGroups(): string[] {\n return [...new Set(this.config.columns.map((c) => c.group).filter((g): g is string => !!g))];\n }\n\n /** Shows or hides every column of a group at once (at least one column always stays visible). */\n setColumnGroupVisible(group: string, visible: boolean): void {\n const cols = this.config.columns.filter((c) => (c.group ?? '') === group);\n if (!cols.length) return;\n for (const c of cols) c.hidden = !visible;\n if (!this.config.columns.some((c) => !c.hidden)) cols[0].hidden = false;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n\n setColumns(columns: Column[]) {\n this.config.columns = columns;\n if (!this.rendered) return;\n this.cv++;\n this.buildHeader();\n this.paintSelection();\n this.v.refresh();\n }\n\n /** Order, visibility and width of every column; save it and give it back to `setColumnState`. */\n getColumnState(): ColumnState[] {\n return this.config.columns.map((c) => ({ field: c.field, hidden: !!c.hidden, width: c.width }));\n }\n /** Restores a saved state: columns follow its order (unknown ones keep their place at the end). */\n setColumnState(state: ColumnState[]): void {\n const by = new Map(this.config.columns.map((c) => [c.field, c]));\n const ordered = state.flatMap((s) => {\n const c = by.get(s.field);\n by.delete(s.field);\n return c ? [{ ...c, hidden: s.hidden, width: s.width ?? c.width }] : [];\n });\n this.setColumns([...ordered, ...by.values()]);\n this.emit('columns-change', this.getColumnState());\n }\n\n // ---- column drag ---------------------------------------------------------------------------\n\n // ---- column resize -------------------------------------------------------------------------\n\n private canResize(c: Column): boolean {\n return !!this.config.resizableColumns && c.field !== SEL && c.field !== ACT && c.resizable !== false;\n }\n\n /** Sets a column's width in px (clamped to `minWidth`/`maxWidth`); `undefined` gives it back its flexible width. */\n setColumnWidth(field: string, width: number | undefined): void {\n const col = this.config.columns.find((x) => x.field === field);\n if (!col) return;\n col.width = width == null ? undefined : Math.round(Math.max(col.minWidth ?? 48, Math.min(width, col.maxWidth ?? Infinity)));\n this.layoutColumns();\n this.emit('column-resize', field, col.width);\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnResize(): void {\n const head = this.headRow;\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (!grip || e.button) return;\n e.preventDefault();\n const cell = grip.parentElement!;\n const field = cell.dataset.field!;\n const col = this.config.columns.find((x) => x.field === field)!;\n const x0 = e.clientX;\n const w0 = cell.getBoundingClientRect().width || col.width || 96; // a flexible column starts from what it shows now\n this.el.classList.add('is-resizing');\n let last = col.width;\n const move = (m: PointerEvent) => {\n // set without events while dragging; one event when it ends\n const w = Math.round(Math.max(col.minWidth ?? 48, Math.min(w0 + (m.clientX - x0) * (this.dir() === 'rtl' ? -1 : 1), col.maxWidth ?? Infinity)));\n col.width = last = w;\n this.layoutColumns();\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n this.el.classList.remove('is-resizing');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n if (last !== undefined) {\n this.emit('column-resize', field, last);\n this.emit('columns-change', this.getColumnState());\n }\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // double-click on the handle: back to the flexible width\n this.listen(head, 'dblclick', (e: Event) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (grip) this.setColumnWidth(grip.parentElement!.dataset.field!, undefined);\n });\n // keyboard: Alt+Shift+\u2190/\u2192 on a focused header\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!(e.altKey && e.shiftKey) || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__hcell');\n const col = cell && this.config.columns.find((x) => x.field === cell.dataset.field);\n if (!cell || !col || !this.canResize(col)) return;\n e.preventDefault();\n const w = cell.getBoundingClientRect().width || col.width || 96;\n this.setColumnWidth(col.field, w + (e.key === 'ArrowRight' ? 16 : -16));\n });\n }\n\n private dir(): string {\n return getComputedStyle(this.el).direction;\n }\n\n /** Moves a (user) column in front of `before` (or to the end when null). Hidden columns keep their places. */\n moveColumn(field: string, before: string | null): void {\n const cols = this.config.columns;\n const col = cols.find((x) => x.field === field);\n if (!col || field === before) return;\n const vis = this.userCols();\n const from = vis.indexOf(col);\n const next = [...cols.filter((x) => x !== col)];\n const target = before == null ? undefined : next.find((x) => x.field === before);\n const lastVis = vis.filter((x) => x !== col).pop();\n const at = target ? next.indexOf(target) : lastVis ? next.indexOf(lastVis) + 1 : next.length;\n next.splice(at, 0, col);\n if (next.every((x, i) => x === cols[i])) return;\n this.setColumns(next);\n this.emit('column-move', field, from, this.userCols().indexOf(col));\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnDrag(): void {\n const head = this.headRow;\n const cellsOf = () => Array.from(head.querySelectorAll<HTMLElement>('.is-reorderable'));\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell || e.button || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const field = cell.dataset.field!;\n const x0 = e.clientX;\n let ghost: HTMLElement | undefined;\n let mark: HTMLElement | undefined;\n let before: string | null = null;\n const move = (m: PointerEvent) => {\n if (!ghost) {\n if (Math.abs(m.clientX - x0) < 6) return; // a click, not a drag\n ghost = h('div', 'op-grid__ghost', {}, cell.textContent ?? '');\n mark = h('div', 'op-grid__drop');\n this.el.append(ghost);\n this.headEl.append(mark);\n cell.classList.add('is-dragging-col');\n }\n ghost.style.left = `${m.clientX}px`;\n ghost.style.top = `${m.clientY}px`;\n // the drop boundary is the nearest cell edge: before the first cell whose middle is right of the pointer\n const cells = cellsOf();\n const hit = cells.find((c) => {\n const r = c.getBoundingClientRect();\n return m.clientX < r.left + r.width / 2;\n });\n before = hit ? hit.dataset.field! : null;\n const edge = hit ?? cells[cells.length - 1];\n const r = edge?.getBoundingClientRect();\n const hr = this.headEl.getBoundingClientRect();\n if (r && mark) mark.style.left = `${(hit ? r.left : r.right) - hr.left + this.headEl.scrollLeft}px`;\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n if (!ghost) return;\n ghost.remove();\n mark?.remove();\n cell.classList.remove('is-dragging-col');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.moveColumn(field, before);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // keyboard: Alt+\u2190 / Alt+\u2192 on a focused header moves its column one step\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey || e.shiftKey || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell) return;\n e.preventDefault();\n const vis = this.userCols();\n const i = vis.findIndex((x) => x.field === cell.dataset.field);\n const j = e.key === 'ArrowLeft' ? i - 1 : i + 1;\n if (j < 0 || j >= vis.length) return;\n this.moveColumn(vis[i].field, e.key === 'ArrowLeft' ? vis[j].field : (vis[j + 1]?.field ?? null));\n const again = head.querySelector<HTMLElement>(`[data-field=\"${CSS.escape(vis[i].field)}\"]`);\n (again?.querySelector<HTMLElement>('button') ?? again)?.focus();\n });\n }\n\n private paintSort() {\n const s = this.store.getSorters()[0];\n for (const cell of Array.from(this.headRow.children) as HTMLElement[]) {\n const on = !!s && cell.dataset.field === s.field;\n cell.classList.toggle('is-sorted-asc', on && s.dir === 'asc');\n cell.classList.toggle('is-sorted-desc', on && s.dir === 'desc');\n if (cell.classList.contains('is-sortable')) cell.setAttribute('aria-sort', on ? (s.dir === 'asc' ? 'ascending' : 'descending') : 'none');\n }\n }\n\n /** asc \u2192 desc \u2192 unsorted. */\n private sortBy(col: Column) {\n const s = this.store.getSorters()[0];\n const dir = s?.field === col.field ? (s.dir === 'asc' ? 'desc' : null) : 'asc';\n if (this.emit('before-sort', col.field, dir) === false) return;\n this.store.sort(dir ? col.field : null, dir ?? undefined);\n this.emit('sort', col.field, dir);\n }\n\n // ---- rows ----------------------------------------------------------------------------------\n\n private rowIndexOffset(): number {\n return this.store.pageSize ? (this.store.page - 1) * this.store.pageSize : 0;\n }\n\n private renderRow(row: HTMLElement, i: number) {\n const rec = this.store.getAt(i);\n if (!rec) return;\n const cols = this.cols();\n row.id = `${this.id}-r${i}`;\n row.dataset.i = String(i);\n row.setAttribute('role', 'row');\n row.setAttribute('aria-rowindex', String(this.rowIndexOffset() + i + 2));\n const sel = this.selected.has(rec);\n row.setAttribute('aria-selected', this.mode() === 'none' ? 'false' : String(sel));\n row.classList.toggle('is-selected', sel);\n row.classList.toggle('is-active', i === this.active);\n row.classList.toggle('is-odd', i % 2 === 1);\n if (row.dataset.cv !== String(this.cv) || row.children.length !== cols.length) {\n row.dataset.cv = String(this.cv);\n row.replaceChildren(...cols.map((c, n) => h('div', `op-grid__cell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.cls ? ` ${c.cls}` : ''}`, { role: 'gridcell', 'aria-colindex': n + 1 })));\n }\n cols.forEach((c, n) => {\n const cell = row.children[n] as HTMLElement;\n if (c.field === SEL) {\n const box = (cell.firstElementChild as HTMLInputElement | null) ?? cell.appendChild(h('input', 'op-grid__check', { type: 'checkbox', tabindex: -1, 'aria-label': t('gridSelectRow') }));\n box.checked = sel;\n return;\n }\n if (c.field === ACT) {\n const acts = this.config.rowActions ?? [];\n if (!this.visibleActions()) {\n if (!cell.firstChild) cell.append(h('button', 'op-grid__actbtn', { type: 'button', tabindex: -1, 'aria-label': t('gridRowActions'), 'aria-haspopup': 'menu' }, iconEl('more')));\n return;\n }\n if (cell.children.length !== acts.length || (cell.firstElementChild as HTMLElement | null)?.dataset.a == null) {\n cell.replaceChildren(...acts.map((a, k) => h('button', `op-grid__actbtn${a.variant === 'danger' ? ' is-danger' : ''}`, { type: 'button', tabindex: -1, 'data-a': k, 'aria-label': a.text, title: a.text }, a.icon ? iconEl(a.icon) : a.text)));\n }\n acts.forEach((a, k) => ((cell.children[k] as HTMLButtonElement).disabled = !!a.disabled?.(rec)));\n return;\n }\n const content = cellContent(c, rec);\n if (typeof content === 'string') cell.textContent = content;\n else cell.replaceChildren(content);\n });\n }\n\n private indexOfEvent(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__body-row');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private onRowEvent(e: MouseEvent, name: string) {\n const i = this.indexOfEvent(e);\n const rec = this.store.getAt(i);\n if (!rec) return;\n if (name === 'row-click') {\n const btn = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-grid__actbtn');\n if (btn) {\n if (btn.dataset.a == null) return this.openRowMenu(rec, btn);\n if (!btn.disabled) this.config.rowActions![Number(btn.dataset.a)].handler(rec, this);\n return;\n }\n this.setActive(i, false);\n this.pick(i, e);\n }\n this.emit(name, rec, i, e);\n }\n\n // ---- selection / keyboard ------------------------------------------------------------------\n\n getSelection(): Model<T>[] {\n return [...this.selected];\n }\n\n /** Selects a record or row index. `add` keeps the current selection (multi mode). */\n select(target: Model<T> | number, opts: { add?: boolean } = {}): void {\n const rec = typeof target === 'number' ? this.store.getAt(target) : target;\n const mode = this.mode();\n if (!rec || mode === 'none') return;\n if (mode === 'single' || !opts.add) this.selected.clear();\n this.selected.add(rec);\n this.changed();\n }\n\n deselectAll(): void {\n if (!this.selected.size) return;\n this.selected.clear();\n this.changed();\n }\n\n private changed() {\n this.v?.refresh();\n this.paintSelection();\n this.emit('select', this.getSelection());\n }\n\n /** Selects every record that matches the filters, across pages (a remote store: the loaded page). */\n selectAllFiltered(): void {\n if (this.mode() !== 'multi') return;\n for (const r of this.store.getFiltered()) this.selected.add(r);\n this.changed();\n }\n\n /** Click semantics: plain = replace, ctrl/meta = toggle, shift = range from the anchor (multi only). */\n private pick(i: number, e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean }) {\n const mode = this.mode();\n const rec = this.store.getAt(i);\n if (!rec || mode === 'none') return;\n if (mode === 'multi' && e.shiftKey && this.anchor >= 0) {\n if (!this.config.checkboxSelection) this.selected.clear();\n for (const r of this.store.getRange(Math.min(this.anchor, i), Math.max(this.anchor, i) + 1)) this.selected.add(r);\n } else if (mode === 'multi' && (e.ctrlKey || e.metaKey || this.config.checkboxSelection)) {\n if (!this.selected.delete(rec)) this.selected.add(rec);\n this.anchor = i;\n } else {\n this.selected.clear();\n this.selected.add(rec);\n this.anchor = i;\n }\n this.changed();\n }\n\n private setActive(i: number, scroll = true) {\n this.active = i;\n if (scroll && i >= 0) this.v.scrollTo(i);\n this.v.refresh();\n this.updateActiveDescendant();\n }\n\n private updateActiveDescendant() {\n if (this.active >= 0 && this.active < this.store.count) this.table.setAttribute('aria-activedescendant', `${this.id}-r${this.active}`);\n else this.table.removeAttribute('aria-activedescendant');\n }\n\n focusRow(i: number) {\n this.render();\n this.setActive(Math.max(0, Math.min(i, this.store.count - 1)));\n this.table.focus();\n }\n\n protected override focusEl(): HTMLElement {\n return this.table;\n }\n\n scrollToRow(i: number) {\n this.v?.scrollTo(i);\n }\n\n private onKey(e: KeyboardEvent) {\n const target = e.target as HTMLElement;\n if (target.closest('.op-grid__header')) return; // header buttons keep their own keys\n if (target !== this.table && target.matches('input:not([type=checkbox]),textarea,select,[contenteditable]')) return; // an editor in a cell keeps its keys\n const n = this.store.count;\n if (!n) return;\n if ((e.key === 'ContextMenu' || (e.shiftKey && e.key === 'F10')) && this.active >= 0 && this.config.rowActions?.length) {\n e.preventDefault();\n return this.openRowMenu(this.store.getAt(this.active)!, document.getElementById(`${this.id}-r${this.active}`) ?? this.el);\n }\n const page = Math.max(1, Math.floor((this.viewport.clientHeight || 400) / this.config.rowHeight! || 10));\n const cur = this.active < 0 ? 0 : this.active;\n const mode = this.mode();\n const targets: Record<string, number> = {\n ArrowDown: Math.min(n - 1, this.active < 0 ? 0 : cur + 1),\n ArrowUp: Math.max(0, cur - 1),\n Home: 0,\n End: n - 1,\n PageDown: Math.min(n - 1, cur + page),\n PageUp: Math.max(0, cur - page),\n };\n if (e.key in targets) {\n e.preventDefault();\n const to = targets[e.key];\n this.setActive(to);\n if (mode === 'single' || (mode === 'multi' && !e.ctrlKey && !e.metaKey && !this.config.checkboxSelection)) this.pick(to, e);\n } else if (e.key === ' ' && this.active >= 0) {\n e.preventDefault();\n if (mode === 'multi') this.pick(this.active, { ctrlKey: true });\n else this.pick(this.active, e);\n } else if (e.key === 'Enter' && this.active >= 0) {\n this.emit('row-activate', this.store.getAt(this.active), this.active);\n } else if ((e.key === 'a' || e.key === 'A') && (e.ctrlKey || e.metaKey) && mode === 'multi') {\n e.preventDefault();\n this.store.each((r) => this.selected.add(r));\n this.changed();\n }\n }\n\n refresh() {\n this.v?.refresh();\n }\n\n // ---- bar: bulk actions and the column menu ------------------------------------------------\n\n private buildBar() {\n const c = this.config;\n if (!this.barEl) return;\n this.bulkCount = h('span', 'op-grid__count', { 'aria-live': 'polite' });\n this.selectAllBtn = new Button({ text: '', variant: 'ghost', handler: () => this.selectAllFiltered() });\n this.bulkBtns = (c.bulkActions ?? []).map((a) => new Button({ text: a.text, icon: a.icon, variant: a.variant === 'danger' ? 'danger' : 'default', handler: () => a.handler(this.getSelection(), this) }));\n const clear = new Button({ text: t('gridClearSel'), variant: 'ghost', handler: () => this.deselectAll() });\n this.bulkEl!.append(this.bulkCount, this.selectAllBtn.el, ...this.bulkBtns.map((b) => b.el), clear.el);\n this.own(() => [this.selectAllBtn, ...this.bulkBtns, clear].forEach((b) => b?.destroy()));\n if (c.columnMenu) this.buildColumnMenu();\n this.paintSelection();\n }\n\n /** Header checkbox state and the bulk bar, from the current selection. */\n private paintSelection() {\n if (!this.rendered) return;\n const n = this.store.count;\n let k = 0;\n this.store.each((r) => this.selected.has(r) && k++);\n if (this.selAll) {\n this.selAll.checked = n > 0 && k === n;\n this.selAll.indeterminate = k > 0 && k < n;\n }\n if (!this.bulkEl) return;\n const size = this.selected.size;\n this.bulkEl.hidden = !size || !this.config.bulkActions?.length;\n if (this.bulkEl.hidden) return;\n this.bulkCount!.textContent = t('gridSelected', { n: size });\n const more = this.store.getFiltered().length;\n this.selectAllBtn!.el.hidden = !(this.mode() === 'multi' && k === n && more > n && size < more);\n this.selectAllBtn!.setText(t('gridSelectAll', { n: more }));\n }\n\n private openRowMenu(rec: Model<T>, btn: HTMLElement) {\n this.rowMenu ??= new Menu({});\n this.rowMenu.setItems((this.config.rowActions ?? []).map((a) => ({ text: a.text, icon: a.icon, disabled: !!a.disabled?.(rec), handler: () => a.handler(rec, this) })));\n this.rowMenu.showBy(btn);\n }\n private buildColumnMenu() {\n const btn = new Button({ text: t('gridColumns'), icon: 'columns', variant: 'ghost' });\n this.colSearch = new TextField({ placeholder: t('gridColumnSearch'), clearable: true });\n this.colChips = h('div', 'op-grid__colchips', { role: 'group', 'aria-label': t('gridGroups') });\n this.colList = h('div', 'op-grid__collist', { role: 'group', 'aria-label': t('gridColumns') });\n const none = h('div', 'op-grid__colempty', {}, t('gridNoColumns'));\n none.hidden = true;\n const panel = h('div', 'op-grid__colmenu', {}, this.colSearch.el, this.colChips, this.colList, none);\n this.colDd = new Dropdown({ anchor: btn.el, content: panel, placement: 'bottom-end', role: 'dialog', autoFocus: false });\n this.barEl!.append(btn.el);\n this.own(() => btn.destroy());\n /** Search text and the group chip decide what is listed; a search that names a group shows the whole group. */\n const filter = () => {\n const q = (this.colSearch!.getValue() ?? '').toLowerCase();\n let shown = 0;\n let head: HTMLElement | undefined;\n let rowsInGroup = 0;\n const closeGroup = () => head && (head.hidden = rowsInGroup === 0);\n for (const el of Array.from(this.colList!.children) as HTMLElement[]) {\n if (el.classList.contains('op-grid__colgroup')) {\n closeGroup();\n head = el;\n rowsInGroup = 0;\n continue;\n }\n const g = el.dataset.group ?? '';\n const byChip = !this.colGroup || g === this.colGroup;\n const byText = !q || g.toLowerCase().includes(q) || el.textContent!.toLowerCase().includes(q);\n el.hidden = !(byChip && byText);\n if (!el.hidden) (shown++, rowsInGroup++);\n }\n closeGroup();\n none.hidden = shown > 0;\n };\n this.colSearch.on('change', filter);\n this.listen(this.colChips, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-g]');\n if (!b) return;\n this.colGroup = b.dataset.g!;\n this.paintColumnList();\n filter();\n });\n btn.on('click', () => {\n if (this.colDd!.isOpen()) return this.colDd!.close();\n this.colSearch!.setValue('');\n this.colGroup = '';\n this.paintColumnList();\n this.colDd!.open();\n this.colList!.querySelector<HTMLElement>('input')?.focus(); // not the search field: a phone keyboard would cover the list\n });\n this.listen(this.colList, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.dataset.groupToggle != null) this.setColumnGroupVisible(input.dataset.groupToggle, input.checked);\n else {\n const col = this.config.columns.find((x) => x.field === input.value);\n if (!col) return;\n col.hidden = !input.checked;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n this.paintColumnList();\n filter();\n });\n }\n\n private paintColumnList() {\n const cols = this.config.columns;\n const groups = this.getColumnGroups();\n const last = this.userCols().length === 1 ? this.userCols()[0] : null; // at least one column stays visible\n const row = (c: Column) => {\n const box = h('input', 'op-grid__check', { type: 'checkbox', value: c.field });\n box.checked = !c.hidden;\n box.disabled = c === last;\n return h('label', 'op-grid__colitem', { 'data-group': c.group ?? '' }, box, h('span', '', {}, c.header ?? c.field));\n };\n this.colChips!.hidden = groups.length < 2;\n this.colChips!.replaceChildren(...[['', t('gridGroupAll')], ...groups.map((g) => [g, g])].map(([g, label]) => h('button', `op-grid__colchip${this.colGroup === g ? ' is-on' : ''}`, { type: 'button', 'data-g': g, 'aria-pressed': String(this.colGroup === g) }, label)));\n if (!groups.length) return this.colList!.replaceChildren(...cols.map(row));\n const out: HTMLElement[] = [];\n for (const g of [...groups, '']) {\n const items = cols.filter((c) => (c.group ?? '') === g);\n if (!items.length) continue;\n const on = items.filter((c) => !c.hidden).length;\n const toggle = h('input', 'op-grid__check', { type: 'checkbox', 'data-group-toggle': g, 'aria-label': g || t('gridOtherCols') });\n toggle.checked = on === items.length;\n toggle.indeterminate = on > 0 && on < items.length;\n out.push(h('div', 'op-grid__colgroup', { 'data-group': g }, h('label', '', {}, toggle, h('span', '', {}, g || t('gridOtherCols'))), h('span', 'op-grid__colcount', {}, `${on}/${items.length}`)), ...items.map(row));\n }\n this.colList!.replaceChildren(...out);\n }\n\n protected override onDestroy() {\n this.pager?.destroy();\n this.rowMenu?.destroy();\n this.colDd?.destroy();\n this.colSearch?.destroy();\n }\n}\nregister('grid', Grid);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "SEL", "ACT", "SEL_COL", "ACT_COL", "ROW", "Grid", "Component", "c", "el", "h", "Pagination", "Store", "virtualize", "measure", "row", "i", "e", "r", "cell", "col", "x", "ro", "p", "off", "node", "index", "column", "record", "field", "n", "hgt", "store", "offChange", "offLoading", "on", "before", "t", "cols", "wide", "tpl", "sum", "label", "iconEl", "user", "band", "cells", "g", "group", "visible", "columns", "state", "by", "ordered", "width", "head", "grip", "x0", "w0", "last", "move", "m", "w", "up", "vis", "from", "next", "target", "lastVis", "at", "cellsOf", "ghost", "mark", "hit", "hr", "j", "again", "s", "dir", "rec", "sel", "box", "acts", "k", "content", "cellContent", "name", "btn", "opts", "mode", "scroll", "page", "cur", "targets", "to", "Button", "a", "clear", "b", "size", "more", "Menu", "TextField", "none", "panel", "Dropdown", "filter", "q", "shown", "rowsInGroup", "closeGroup", "byChip", "byText", "input", "groups", "out", "items", "toggle", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as a}from"./chunk-ZWNQREWS.js";import{a as o}from"./chunk-2ZRNGG2N.js";import{e as c}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";var y=(n,e)=>e.split(".").reduce((t,i)=>t?.[i],n);function u(n,e,t){let i=e.split("."),s=i.pop(),r=i.reduce((l,d)=>l[d]??={},n);r[s]=t}var f=class extends a{baseCls="op-form";tag="form";ruledOut=new Set;dirty=!1;constructor(e={}){let t=[...e.items??[]];e.tabs&&t.push({type:"tabs",flex:1,items:e.tabs.map(i=>({type:"container",title:i.title,icon:i.icon,cls:"op-form__tab",layout:i.layout??{type:"grid",columns:2,gap:12},items:i.items}))}),super({...e,items:t})}build(){let e=super.build();return e.setAttribute("novalidate",""),e}onRender(){if(this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},this.config.labelWidth!=null&&this.setLabelWidth(this.config.labelWidth),this.config.labelPos)for(let e of this.getFields())e.config.labelPos??=this.config.labelPos;super.onRender(),this.config.readonly&&this.setReadonly(!0);for(let e of this.getFields())for(let t of["invalid","valid","dirty-change","change"])e.on(t,()=>this.syncTabs());for(let e of this.getFields())e.on("change",()=>this.changed());for(let e of this.getFields())e.on("dirty-change",()=>this.changed());this.applyRules(),this.listen(this.el,"submit",e=>{e.preventDefault(),this.submit()}),this.listen(this.el,"keydown",e=>{let t=e.target;e.key==="Enter"&&t instanceof HTMLInputElement&&!e.defaultPrevented&&t.type!=="button"&&(e.preventDefault(),this.submit())})}getFields(){return this.query(e=>e instanceof o)}getField(e){return this.getFields().find(t=>t.name===e)}getValues(e={}){let t={};for(let i of this.counted())i.name&&(!e.dirtyOnly||i.isDirty())&&u(t,i.name,i.getValue());return t}counted(){return this.getFields().filter(e=>{for(let t=e;t&&t!==this;t=t.parent)if(this.ruledOut.has(t))return!1;return!0})}changed(){this.applyRules();let e=this.isDirty();e!==this.dirty&&this.emit("dirty-change",this.dirty=e)}applyRules(){let e={};for(let t of this.getFields())t.name&&u(e,t.name,t.getValue());for(let t of this.query(i=>!!(i.config.showIf||i.config.enableIf))){let{showIf:i,enableIf:s}=t.config;if(i){let r=!!i(e);if(r===this.ruledOut.has(t))if(r)this.ruledOut.delete(t),t.show();else{this.ruledOut.add(t),t.hide();for(let l of t instanceof o?[t]:t instanceof a?t.query(d=>d instanceof o):[])l.clearError()}}s&&t.setDisabled(!s(e))}}focusField(e){this.reveal(e),e.focus()}setValues(e){for(let t of this.getFields()){let i=t.name?y(e,t.name):void 0;i!==void 0&&t.setValue(i,!0)}}load(e){this.setValues("data"in e&&"get"in e?e.data:e),this.markClean(),this.clearErrors(),this.emit("load",e)}reveal(e){let t=e;for(;t.parent;){let i=t.parent;i.items?.includes(t)&&(typeof i.setActive=="function"?i.setActive(t):i.layout?.activate&&i.layout.activate(i,t)),t=i}}syncTabs(){for(let e of this.query(t=>typeof t.setTabState=="function"))for(let t of e.items){let i=t instanceof a?t.query(s=>s instanceof o):[];e.setTabState(t,{errors:i.filter(s=>s.getError()).length,dirty:i.some(s=>s.isDirty())})}}updateRecord(e){let t=this.getValues(),i=new Set(this.getFields().filter(s=>s.name&&s.isDirty()).map(s=>s.name.split(".")[0]));for(let s of i)e.set(s,t[s])}markClean(){this.getFields().forEach(e=>e.markClean()),this.syncTabs()}reset(){this.getFields().forEach(e=>e.reset()),this.syncTabs()}isDirty(){return this.getFields().some(e=>e.isDirty())}isValid(){return this.counted().every(e=>e.config.disabled||e.isValid())}clearErrors(){this.getFields().forEach(e=>e.clearError()),this.syncTabs()}validate(){let e=this.counted().filter(i=>!i.config.disabled);for(let i of this.getFields())e.includes(i)||i.clearError();let t=e.filter(i=>!i.validate());return this.syncTabs(),t.length&&(this.reveal(t[0]),t[0].focus(),this.emit("invalid",t)),this.el.classList.toggle("is-invalid",!!t.length),!t.length}submit(){return this.emit("before-submit")===!1||!this.validate()?!1:(this.emit("submit",this.getValues()),!0)}setLabelWidth(e){this.config.labelWidth=e,this.rendered&&this.el.style.setProperty("--op-field-label-width",c(e))}setReadonly(e){this.config.readonly=e,this.getFields().forEach(t=>t.setReadonly(e))}};h("form",f);export{f as a};
|
|
2
|
+
//# sourceMappingURL=chunk-VU3GIDZ3.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/form/form.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport type { Model } from '../../../data/model';\nimport type { Component } from '../../../core/component';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { px } from '../../../core/dom';\n\nexport interface FormTab {\n title: string;\n icon?: string;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface FormConfig extends ContainerConfig {\n /** Shortcut: the fields in tabs, still one form (one `getValues`, one `validate`, one dirty). */\n tabs?: FormTab[];\n /** Default `labelPos` for fields that do not set their own. */\n labelPos?: 'top' | 'left';\n /** Width of the labels on the left (`labelPos: 'left'`), so they line up in a column. Number = px. */\n labelWidth?: number | string;\n /** Shortcut for a responsive grid layout (one column on narrow screens); items take `colspan` (a number or `'full'`). */\n columns?: number;\n readonly?: boolean;\n}\n\nconst getPath = (o: any, path: string) => path.split('.').reduce((v, k) => v?.[k], o);\nfunction setPath(o: any, path: string, value: unknown) {\n const keys = path.split('.');\n const last = keys.pop()!;\n const target = keys.reduce((v, k) => (v[k] ??= {}), o);\n target[last] = value;\n}\n\nexport class Form extends Container<FormConfig> {\n protected override baseCls = 'op-form';\n protected override tag = 'form' as const;\n /** Components hidden by their `showIf` rule: their fields do not count (no validation, not in `getValues`). */\n private ruledOut = new Set<Component>();\n private dirty = false;\n\n constructor(config: FormConfig = {}) {\n const items = [...(config.items ?? [])];\n if (config.tabs) {\n items.push({\n type: 'tabs',\n flex: 1,\n items: config.tabs.map((t) => ({ type: 'container', title: t.title, icon: t.icon, cls: 'op-form__tab', layout: t.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: t.items })),\n } as never);\n }\n super({ ...config, items });\n }\n\n protected override build() {\n const el = super.build();\n el.setAttribute('novalidate', '');\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= this.config.columns ? { type: 'grid', columns: this.config.columns } : { type: 'vbox' };\n if (this.config.labelWidth != null) this.setLabelWidth(this.config.labelWidth);\n if (this.config.labelPos) for (const f of this.getFields()) f.config.labelPos ??= this.config.labelPos;\n super.onRender();\n if (this.config.readonly) this.setReadonly(true);\n for (const f of this.getFields()) for (const ev of ['invalid', 'valid', 'dirty-change', 'change']) f.on(ev, () => this.syncTabs());\n for (const f of this.getFields()) f.on('change', () => this.changed());\n for (const f of this.getFields()) f.on('dirty-change', () => this.changed());\n this.applyRules();\n // Native submit (a `type=submit` button) and Enter inside a single-line field both go through submit().\n this.listen(this.el, 'submit', (e: Event) => {\n e.preventDefault();\n this.submit();\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const t = e.target as HTMLElement;\n if (e.key === 'Enter' && t instanceof HTMLInputElement && !e.defaultPrevented && t.type !== 'button') {\n e.preventDefault();\n this.submit();\n }\n });\n }\n\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getField(name: string): Field<any> | undefined {\n return this.getFields().find((f) => f.name === name);\n }\n\n /** Nested object built from field names (`address.city` \u2192 `{ address: { city } }`). Fields hidden by `showIf` are left out. */\n getValues(opts: { dirtyOnly?: boolean } = {}): Record<string, any> {\n const out: Record<string, any> = {};\n for (const f of this.counted()) if (f.name && (!opts.dirtyOnly || f.isDirty())) setPath(out, f.name, f.getValue());\n return out;\n }\n\n /** The fields that count: not inside something its `showIf` rule hid. */\n private counted(): Field<any>[] {\n return this.getFields().filter((f) => {\n for (let c: Component | undefined = f; c && c !== this; c = c.parent as Component | undefined) if (this.ruledOut.has(c)) return false;\n return true;\n });\n }\n\n /** A field changed: rerun the `showIf`/`enableIf` rules and say when the form as a whole became (un)changed. */\n private changed(): void {\n this.applyRules();\n const d = this.isDirty();\n if (d !== this.dirty) this.emit('dirty-change', (this.dirty = d));\n }\n\n /** Shows/hides and enables/disables every item that has a rule, from the current values (hidden fields included). */\n applyRules(): void {\n const values: Record<string, any> = {};\n for (const f of this.getFields()) if (f.name) setPath(values, f.name, f.getValue());\n for (const c of this.query((x) => !!(x.config.showIf || x.config.enableIf))) {\n const { showIf, enableIf } = c.config;\n if (showIf) {\n const show = !!showIf(values);\n if (show === this.ruledOut.has(c)) {\n if (show) (this.ruledOut.delete(c), c.show());\n else {\n this.ruledOut.add(c);\n c.hide();\n // what nobody can see has nothing to fix: its errors go with it\n for (const f of c instanceof Field ? [c] : c instanceof Container ? (c.query((x) => x instanceof Field) as Field<any>[]) : []) f.clearError();\n }\n }\n }\n if (enableIf) c.setDisabled(!enableIf(values));\n }\n }\n\n /** Brings a field into view (opening its tab or step) and focuses it. */\n focusField(field: Field<any>): void {\n this.reveal(field);\n field.focus();\n }\n\n /** Sets the fields present in `values` (silently). */\n setValues(values: Record<string, any>): void {\n for (const f of this.getFields()) {\n const v = f.name ? getPath(values, f.name) : undefined;\n if (v !== undefined) f.setValue(v, true);\n }\n }\n\n /** Fills the form from a plain object or a Model, and makes it the \"clean\" state. */\n load(record: Record<string, any> | Model): void {\n this.setValues('data' in record && 'get' in record ? (record as Model).data : record);\n this.markClean();\n this.clearErrors();\n this.emit('load', record);\n }\n\n /** Brings a field into view: asks every ancestor that shows one child at a time (Tabs, a card layout) to show the branch. */\n protected reveal(field: Component): void {\n let node: Component = field;\n while (node.parent) {\n const p = node.parent as any;\n if (p.items?.includes(node)) {\n if (typeof p.setActive === 'function') p.setActive(node);\n else if (p.layout?.activate) p.layout.activate(p, node);\n }\n node = p;\n }\n }\n\n /** Error counts and \"changed\" dots on the headers of every Tabs inside the form. */\n protected syncTabs(): void {\n for (const tabs of this.query((c) => typeof (c as any).setTabState === 'function') as any[]) {\n for (const panel of tabs.items as Component[]) {\n const fields = panel instanceof Container ? (panel.query((c) => c instanceof Field) as Field<any>[]) : [];\n tabs.setTabState(panel, { errors: fields.filter((f) => f.getError()).length, dirty: fields.some((f) => f.isDirty()) });\n }\n }\n }\n\n /** Writes the changed fields back into a Model. */\n updateRecord(model: Model): void {\n const all = this.getValues();\n const keys = new Set(this.getFields().filter((f) => f.name && f.isDirty()).map((f) => f.name!.split('.')[0]));\n for (const k of keys) model.set(k, all[k]);\n }\n\n markClean(): void {\n this.getFields().forEach((f) => f.markClean());\n this.syncTabs();\n }\n reset(): void {\n this.getFields().forEach((f) => f.reset());\n this.syncTabs();\n }\n isDirty(): boolean {\n return this.getFields().some((f) => f.isDirty());\n }\n isValid(): boolean {\n return this.counted().every((f) => f.config.disabled || f.isValid());\n }\n clearErrors(): void {\n this.getFields().forEach((f) => f.clearError());\n this.syncTabs();\n }\n\n /** Validates every field that counts (marks errors) and focuses the first invalid one. */\n validate(): boolean {\n // a hidden or disabled field is not validated: the user could not fix it\n const counted = this.counted().filter((f) => !f.config.disabled);\n for (const f of this.getFields()) if (!counted.includes(f)) f.clearError();\n const bad = counted.filter((f) => !f.validate());\n this.syncTabs();\n if (bad.length) {\n this.reveal(bad[0]); // the tab / step that holds it comes forward first\n bad[0].focus();\n this.emit('invalid', bad);\n }\n this.el.classList.toggle('is-invalid', !!bad.length);\n return !bad.length;\n }\n\n submit(): boolean {\n if (this.emit('before-submit') === false) return false;\n if (!this.validate()) return false;\n this.emit('submit', this.getValues());\n return true;\n }\n\n /** Width of the labels on the left (number = px); they line up in a column. */\n setLabelWidth(width: number | string): void {\n this.config.labelWidth = width;\n if (this.rendered) this.el.style.setProperty('--op-field-label-width', px(width));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n this.getFields().forEach((f) => f.setReadonly(readonly));\n }\n}\nregister('form', Form);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["getPath", "o", "path", "v", "k", "setPath", "value", "keys", "last", "target", "Form", "Container", "config", "items", "t", "el", "f", "ev", "c", "Field", "name", "opts", "out", "d", "values", "x", "showIf", "enableIf", "show", "field", "record", "node", "p", "tabs", "panel", "fields", "model", "all", "counted", "bad", "width", "px", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var E='a[href],button:not([disabled]),input:not([disabled]):not([type=hidden]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';function L(t){return Array.from(t.querySelectorAll(E)).filter(r=>!r.hidden&&!r.closest("[hidden],[inert]"))}function h(t){let r=o=>{if(o.key!=="Tab")return;let l=L(t);if(!l.length)return o.preventDefault();let f=l[0],c=l[l.length-1],a=document.activeElement;o.shiftKey&&(a===f||!t.contains(a))?(o.preventDefault(),c.focus()):!o.shiftKey&&(a===c||!t.contains(a))&&(o.preventDefault(),f.focus())};return t.addEventListener("keydown",r),()=>t.removeEventListener("keydown",r)}function b(t,r){let{orientation:o="horizontal",loop:l=!0}=r,f=()=>Array.from(t.querySelectorAll(r.selector)).filter(e=>e.getAttribute("aria-disabled")!=="true"&&!e.hidden),c=e=>{let n=f(),s=e&&n.includes(e)?e:n.find(d=>d.tabIndex===0)??n[0];for(let d of Array.from(t.querySelectorAll(r.selector)))d.tabIndex=d===s?0:-1},a=e=>{let n=f(),s=n.indexOf(e.target.closest(r.selector));if(s<0)return;let d=o==="vertical"?"ArrowUp":o==="horizontal"?"ArrowLeft":null,v=o==="vertical"?"ArrowDown":o==="horizontal"?"ArrowRight":null,y=e.key===d||o==="both"&&(e.key==="ArrowUp"||e.key==="ArrowLeft"),m=e.key===v||o==="both"&&(e.key==="ArrowDown"||e.key==="ArrowRight"),i=-1;y?i=s>0?s-1:l?n.length-1:0:m?i=s<n.length-1?s+1:l?0:s:e.key==="Home"?i=0:e.key==="End"&&(i=n.length-1),!(i<0)&&(e.preventDefault(),c(n[i]),n[i].focus(),r.onMove?.(n[i]))},u=e=>{let n=e.target.closest(r.selector);n&&c(n)};return t.addEventListener("keydown",a),t.addEventListener("focusin",u),c(),{sync:c,destroy(){t.removeEventListener("keydown",a),t.removeEventListener("focusin",u)}}}export{L as a,h as b,b as c};
|
|
2
|
+
//# sourceMappingURL=chunk-VV7CFMPZ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/focus.ts"],
|
|
4
|
+
"sourcesContent": ["const FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]):not([type=hidden]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\nexport function focusables(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE)).filter((e) => !e.hidden && !e.closest('[hidden],[inert]'));\n}\n\n/** Keeps Tab inside `root`. Returns the release function. */\nexport function trapFocus(root: HTMLElement): () => void {\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const list = focusables(root);\n if (!list.length) return e.preventDefault();\n const first = list[0];\n const last = list[list.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || !root.contains(active))) (e.preventDefault(), last.focus());\n else if (!e.shiftKey && (active === last || !root.contains(active))) (e.preventDefault(), first.focus());\n };\n root.addEventListener('keydown', onKey);\n return () => root.removeEventListener('keydown', onKey);\n}\n\nexport interface RovingOptions {\n /** Selector of the items inside the container. */\n selector: string;\n orientation?: 'horizontal' | 'vertical' | 'both';\n /** Wrap around at the ends. Default true. */\n loop?: boolean;\n /** Called when an arrow/Home/End key moves focus to an item. */\n onMove?: (item: HTMLElement) => void;\n}\n\n/** Roving tabindex: one item is the Tab stop, arrows/Home/End move focus. Returns `{ sync, destroy }`. */\nexport function roving(container: HTMLElement, o: RovingOptions) {\n const { orientation = 'horizontal', loop = true } = o;\n const items = () => Array.from(container.querySelectorAll<HTMLElement>(o.selector)).filter((e) => e.getAttribute('aria-disabled') !== 'true' && !e.hidden);\n const stop = (target?: HTMLElement) => {\n const list = items();\n const t = target && list.includes(target) ? target : (list.find((e) => e.tabIndex === 0) ?? list[0]);\n for (const e of Array.from(container.querySelectorAll<HTMLElement>(o.selector))) e.tabIndex = e === t ? 0 : -1;\n };\n const onKey = (e: KeyboardEvent) => {\n const list = items();\n const i = list.indexOf((e.target as HTMLElement).closest<HTMLElement>(o.selector)!);\n if (i < 0) return;\n const prev = orientation === 'vertical' ? 'ArrowUp' : orientation === 'horizontal' ? 'ArrowLeft' : null;\n const next = orientation === 'vertical' ? 'ArrowDown' : orientation === 'horizontal' ? 'ArrowRight' : null;\n const isPrev = e.key === prev || (orientation === 'both' && (e.key === 'ArrowUp' || e.key === 'ArrowLeft'));\n const isNext = e.key === next || (orientation === 'both' && (e.key === 'ArrowDown' || e.key === 'ArrowRight'));\n let j = -1;\n if (isPrev) j = i > 0 ? i - 1 : loop ? list.length - 1 : 0;\n else if (isNext) j = i < list.length - 1 ? i + 1 : loop ? 0 : i;\n else if (e.key === 'Home') j = 0;\n else if (e.key === 'End') j = list.length - 1;\n if (j < 0) return;\n e.preventDefault();\n stop(list[j]);\n list[j].focus();\n o.onMove?.(list[j]);\n };\n const onFocus = (e: FocusEvent) => {\n const item = (e.target as HTMLElement).closest<HTMLElement>(o.selector);\n if (item) stop(item);\n };\n container.addEventListener('keydown', onKey);\n container.addEventListener('focusin', onFocus);\n stop();\n return {\n /** Re-evaluates the tab stop (after items change). Pass the item that should be the stop. */\n sync: stop,\n destroy() {\n container.removeEventListener('keydown', onKey);\n container.removeEventListener('focusin', onFocus);\n },\n };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,IAAMA,EAAY,0JAEX,SAASC,EAAWC,EAAkC,CAC3D,OAAO,MAAM,KAAKA,EAAK,iBAA8BF,CAAS,CAAC,EAAE,OAAQG,GAAM,CAACA,EAAE,QAAU,CAACA,EAAE,QAAQ,kBAAkB,CAAC,CAC5H,CAGO,SAASC,EAAUF,EAA+B,CACvD,IAAMG,EAASF,GAAqB,CAClC,GAAIA,EAAE,MAAQ,MAAO,OACrB,IAAMG,EAAOL,EAAWC,CAAI,EAC5B,GAAI,CAACI,EAAK,OAAQ,OAAOH,EAAE,eAAe,EAC1C,IAAMI,EAAQD,EAAK,CAAC,EACdE,EAAOF,EAAKA,EAAK,OAAS,CAAC,EAC3BG,EAAS,SAAS,cACpBN,EAAE,WAAaM,IAAWF,GAAS,CAACL,EAAK,SAASO,CAAM,IAAKN,EAAE,eAAe,EAAGK,EAAK,MAAM,GACvF,CAACL,EAAE,WAAaM,IAAWD,GAAQ,CAACN,EAAK,SAASO,CAAM,KAAKN,EAAE,eAAe,EAAGI,EAAM,MAAM,EACxG,EACA,OAAAL,EAAK,iBAAiB,UAAWG,CAAK,EAC/B,IAAMH,EAAK,oBAAoB,UAAWG,CAAK,CACxD,CAaO,SAASK,EAAOC,EAAwBC,EAAkB,CAC/D,GAAM,CAAE,YAAAC,EAAc,aAAc,KAAAC,EAAO,EAAK,EAAIF,EAC9CG,EAAQ,IAAM,MAAM,KAAKJ,EAAU,iBAA8BC,EAAE,QAAQ,CAAC,EAAE,OAAQ,GAAM,EAAE,aAAa,eAAe,IAAM,QAAU,CAAC,EAAE,MAAM,EACnJI,EAAQC,GAAyB,CACrC,IAAMX,EAAOS,EAAM,EACbG,EAAID,GAAUX,EAAK,SAASW,CAAM,EAAIA,EAAUX,EAAK,KAAMH,GAAMA,EAAE,WAAa,CAAC,GAAKG,EAAK,CAAC,EAClG,QAAWH,KAAK,MAAM,KAAKQ,EAAU,iBAA8BC,EAAE,QAAQ,CAAC,EAAGT,EAAE,SAAWA,IAAMe,EAAI,EAAI,EAC9G,EACMb,EAAS,GAAqB,CAClC,IAAMC,EAAOS,EAAM,EACbI,EAAIb,EAAK,QAAS,EAAE,OAAuB,QAAqBM,EAAE,QAAQ,CAAE,EAClF,GAAIO,EAAI,EAAG,OACX,IAAMC,EAAOP,IAAgB,WAAa,UAAYA,IAAgB,aAAe,YAAc,KAC7FQ,EAAOR,IAAgB,WAAa,YAAcA,IAAgB,aAAe,aAAe,KAChGS,EAAS,EAAE,MAAQF,GAASP,IAAgB,SAAW,EAAE,MAAQ,WAAa,EAAE,MAAQ,aACxFU,EAAS,EAAE,MAAQF,GAASR,IAAgB,SAAW,EAAE,MAAQ,aAAe,EAAE,MAAQ,cAC5FW,EAAI,GACJF,EAAQE,EAAIL,EAAI,EAAIA,EAAI,EAAIL,EAAOR,EAAK,OAAS,EAAI,EAChDiB,EAAQC,EAAIL,EAAIb,EAAK,OAAS,EAAIa,EAAI,EAAIL,EAAO,EAAIK,EACrD,EAAE,MAAQ,OAAQK,EAAI,EACtB,EAAE,MAAQ,QAAOA,EAAIlB,EAAK,OAAS,GACxC,EAAAkB,EAAI,KACR,EAAE,eAAe,EACjBR,EAAKV,EAAKkB,CAAC,CAAC,EACZlB,EAAKkB,CAAC,EAAE,MAAM,EACdZ,EAAE,SAASN,EAAKkB,CAAC,CAAC,EACpB,EACMC,EAAW,GAAkB,CACjC,IAAMC,EAAQ,EAAE,OAAuB,QAAqBd,EAAE,QAAQ,EAClEc,GAAMV,EAAKU,CAAI,CACrB,EACA,OAAAf,EAAU,iBAAiB,UAAWN,CAAK,EAC3CM,EAAU,iBAAiB,UAAWc,CAAO,EAC7CT,EAAK,EACE,CAEL,KAAMA,EACN,SAAU,CACRL,EAAU,oBAAoB,UAAWN,CAAK,EAC9CM,EAAU,oBAAoB,UAAWc,CAAO,CAClD,CACF,CACF",
|
|
6
|
+
"names": ["FOCUSABLE", "focusables", "root", "e", "trapFocus", "onKey", "list", "first", "last", "active", "roving", "container", "o", "orientation", "loop", "items", "stop", "target", "t", "i", "prev", "next", "isPrev", "isNext", "j", "onFocus", "item"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-2ZRNGG2N.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as s}from"./chunk-MW3RWBZ7.js";var r=class extends o{baseCls="op-field op-textfield";clearBtn;createInput(){return n("input","op-textfield__input",{type:this.config.inputType??"text"})}get input(){return this.inputEl}createControl(){let t=this.config,e=this.inputEl=this.createInput(),i=n("div","op-textfield__wrap",{},e);return t.placeholder&&(e.placeholder=t.placeholder),t.maxLength!=null&&(e.maxLength=t.maxLength),t.autocomplete&&(e.autocomplete=t.autocomplete),this.listen(e,"input",()=>this.onInput()),this.listen(e,"keydown",a=>this.onKey(a)),t.selectOnFocus&&this.listen(e,"focus",()=>e.select()),t.clearable&&(this.clearBtn=n("button","op-textfield__clear",{type:"button",tabindex:-1,"aria-label":s("clear")},p("x")),this.listen(this.clearBtn,"click",()=>{this.setValue(this.parse("")),e.focus()}),i.append(this.clearBtn)),i}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.commit(this.parse(this.input.value))}parse(t){return t}display(t){return t==null?"":String(t)}onKey(t){t.key==="Enter"&&!t.defaultPrevented?(this.flushSettled(),this.emit("enter",this.getValue())):t.key==="Escape"&&this.config.clearable&&this.input.value&&(t.stopPropagation(),this.setValue(this.parse("")))}getDisplayText(){return this.rendered?this.input.value:this.display(this.value)}applyValue(t){this.input.value=this.display(t),this.el.classList.toggle("has-value",!!this.input.value)}onReadonly(t){this.input.readOnly=t}onDisabled(t){this.input.disabled=t,this.clearBtn&&(this.clearBtn.disabled=t)}check(){let t=super.check(),e=this.display(this.value),i=this.config;return t||!e?t:i.minLength!=null&&e.length<i.minLength?s("minLength",{n:i.minLength}):i.pattern&&!new RegExp(i.pattern).test(e)?s("pattern"):""}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}setMaxLength(t){this.config.maxLength=t,this.rendered&&(this.input.maxLength=t)}setInputType(t){this.config.inputType=t,this.rendered&&this.input instanceof HTMLInputElement&&(this.input.type=t)}select(){this.input.select()}getInput(){return this.render(),this.input}};l("textfield",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-W3H7GTJY.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/textfield/textfield.ts"],
|
|
4
|
+
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface TextFieldConfig<V = string> extends FieldConfig<V> {\n inputType?: 'text' | 'email' | 'tel' | 'url' | 'search' | 'password';\n placeholder?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n autocomplete?: string;\n selectOnFocus?: boolean;\n clearable?: boolean;\n}\n\ntype Input = HTMLInputElement | HTMLTextAreaElement;\n\nexport class TextField<V = string, C extends TextFieldConfig<V> = TextFieldConfig<V>> extends Field<V, C> {\n protected override baseCls = 'op-field op-textfield';\n protected clearBtn?: HTMLButtonElement;\n\n /** Subclasses (TextArea, ...) replace the native control. */\n protected createInput(): Input {\n return h('input', 'op-textfield__input', { type: this.config.inputType ?? 'text' });\n }\n\n protected get input(): Input {\n return this.inputEl as Input;\n }\n\n protected createControl() {\n const c = this.config;\n const input = (this.inputEl = this.createInput());\n const wrap = h('div', 'op-textfield__wrap', {}, input);\n if (c.placeholder) input.placeholder = c.placeholder;\n if (c.maxLength != null) input.maxLength = c.maxLength;\n if (c.autocomplete) input.autocomplete = c.autocomplete as AutoFill;\n this.listen(input, 'input', () => this.onInput());\n this.listen(input, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n if (c.selectOnFocus) this.listen(input, 'focus', () => input.select());\n if (c.clearable) {\n this.clearBtn = h('button', 'op-textfield__clear', { type: 'button', tabindex: -1, 'aria-label': t('clear') }, iconEl('x'));\n this.listen(this.clearBtn, 'click', () => {\n this.setValue(this.parse(''));\n input.focus();\n });\n wrap.append(this.clearBtn);\n }\n return wrap;\n }\n\n /** The text the user typed becomes the value on every edit. */\n protected onInput(): void {\n this.el.classList.toggle('has-value', !!this.input.value);\n this.commit(this.parse(this.input.value));\n }\n\n /** Text \u2192 value. Subclasses with non-string values (NumberField) override. */\n protected parse(text: string): V {\n return text as V;\n }\n /** Value \u2192 text shown in the input. */\n protected display(v: V): string {\n return v == null ? '' : String(v);\n }\n\n protected onKey(e: KeyboardEvent): void {\n if (e.key === 'Enter' && !e.defaultPrevented) (this.flushSettled(), this.emit('enter', this.getValue()));\n else if (e.key === 'Escape' && this.config.clearable && this.input.value) {\n e.stopPropagation();\n this.setValue(this.parse(''));\n }\n }\n\n override getDisplayText(): string {\n return this.rendered ? this.input.value : this.display(this.value);\n }\n\n protected applyValue(v: V): void {\n this.input.value = this.display(v);\n this.el.classList.toggle('has-value', !!this.input.value);\n }\n\n protected override onReadonly(readonly: boolean) {\n this.input.readOnly = readonly;\n }\n protected override onDisabled(disabled: boolean) {\n this.input.disabled = disabled;\n if (this.clearBtn) this.clearBtn.disabled = disabled;\n }\n\n protected override check(): string {\n const base = super.check();\n const v = this.display(this.value);\n const c = this.config;\n if (base || !v) return base;\n if (c.minLength != null && v.length < c.minLength) return t('minLength', { n: c.minLength });\n if (c.pattern && !new RegExp(c.pattern).test(v)) return t('pattern');\n return '';\n }\n\n setPlaceholder(text: string) {\n this.config.placeholder = text;\n if (this.rendered) this.input.placeholder = text;\n }\n setMaxLength(n: number) {\n this.config.maxLength = n;\n if (this.rendered) this.input.maxLength = n;\n }\n setInputType(type: NonNullable<TextFieldConfig['inputType']>) {\n this.config.inputType = type;\n if (this.rendered && this.input instanceof HTMLInputElement) this.input.type = type;\n }\n select() {\n this.input.select();\n }\n getInput(): Input {\n this.render();\n return this.input;\n }\n}\nregister('textfield', TextField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TextField", "Field", "h", "c", "input", "wrap", "e", "t", "iconEl", "text", "v", "readonly", "disabled", "base", "n", "type", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var l=class{constructor(t=[]){this.rows=t}rows;read(){return{data:[...this.rows],total:this.rows.length}}},u=(s,t)=>t.split(".").reduce((a,r)=>a?.[r],s),p=class{constructor(t){this.cfg=t}cfg;async call(t,a){let r=await(this.cfg.fetch??fetch)(t,{...a,headers:{"Content-Type":"application/json",...this.cfg.headers}});if(!r.ok)throw new Error(`Optikos RestProxy: ${a.method??"GET"} ${t} \u2192 ${r.status}`);return r}itemUrl(t){return`${this.cfg.url.replace(/\/$/,"")}/${encodeURIComponent(t[this.cfg.idField??"id"])}`}async read(t,a){let{page:r,pageSize:c,sorters:d,filters:h,...n}=t,i=new URLSearchParams;r&&i.set("page",String(r)),c&&i.set("pageSize",String(c)),d?.length&&i.set("sort",d.map(e=>`${e.field}:${e.dir}`).join(","));for(let e of h??[])"filters"in e||Array.isArray(e.value)?i.append("filter",JSON.stringify(e)):i.set(!e.op||e.op==="eq"?e.field:`${e.field}__${e.op}`,String(e.value??""));for(let e in n)n[e]!=null&&i.set(e,String(n[e]));let f=i.toString(),y=await this.call(this.cfg.url+(f?(this.cfg.url.includes("?")?"&":"?")+f:""),{signal:a}),o=await y.json(),g=this.cfg.root?u(o,this.cfg.root):Array.isArray(o)?o:o.data??[],m=Number(y.headers.get("X-Total-Count")),T=this.cfg.totalKey?Number(u(o,this.cfg.totalKey)):m||g.length;return{data:g,total:T}}async create(t){return await(await this.call(this.cfg.url,{method:"POST",body:JSON.stringify(t)})).json()}async update(t){return await(await this.call(this.itemUrl(t),{method:"PUT",body:JSON.stringify(t)})).json().catch(()=>{})}async destroy(t){await this.call(this.itemUrl(t),{method:"DELETE"})}};export{l as a,p as b};
|
|
2
|
+
//# sourceMappingURL=chunk-X2ASKUFD.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/data/proxy.ts"],
|
|
4
|
+
"sourcesContent": ["export interface Sorter {\n field: string;\n dir: 'asc' | 'desc';\n}\nexport type FilterOp =\n | 'eq' | 'ne' | 'contains' | 'notContains' | 'startsWith' | 'endsWith'\n | 'gt' | 'ge' | 'lt' | 'le' | 'between' | 'notBetween' | 'in' | 'nin' | 'empty' | 'notEmpty';\nexport interface FilterSpec {\n field: string;\n op?: FilterOp;\n /** `between`/`notBetween`: `[from, to]`; `in`/`nin`: an array; `empty`/`notEmpty`: ignored. */\n value?: unknown;\n}\n/** A group of filters joined by AND or OR; groups nest. */\nexport interface FilterGroup {\n op: 'and' | 'or';\n filters: FilterNode[];\n}\nexport type FilterNode = FilterSpec | FilterGroup;\nexport interface ReadParams {\n page?: number;\n pageSize?: number;\n sorters?: Sorter[];\n filters?: FilterNode[];\n [extra: string]: unknown;\n}\nexport interface ReadResult<T = any> {\n data: T[];\n total?: number;\n}\n\n/** Where a Store gets (and writes) its data. Memory, function and REST implementations share this shape. */\nexport interface Proxy<T = any> {\n read(params: ReadParams, signal?: AbortSignal): Promise<ReadResult<T> | T[]> | ReadResult<T> | T[];\n create?(data: T): Promise<Partial<T> | void>;\n update?(data: T): Promise<Partial<T> | void>;\n destroy?(data: T): Promise<void>;\n}\n\nexport class MemoryProxy<T = any> implements Proxy<T> {\n constructor(public rows: T[] = []) {}\n read(): ReadResult<T> {\n return { data: [...this.rows], total: this.rows.length };\n }\n}\n\nexport interface RestProxyConfig {\n url: string;\n idField?: string;\n headers?: Record<string, string>;\n /** Dotted path of the rows in the JSON when it is an object (`'items'`, `'data.rows'`). */\n root?: string;\n /** Dotted path of the total count in the JSON. Falls back to the `X-Total-Count` header, then to the row count. */\n totalKey?: string;\n fetch?: typeof fetch;\n}\n\nconst path = (o: any, p: string) => p.split('.').reduce((v, k) => v?.[k], o);\n\n/** REST over `fetch`: `GET url?page&pageSize&sort=a:asc,b:desc&field=value`, `POST url`, `PUT url/:id`, `DELETE url/:id`. */\nexport class RestProxy<T extends Record<string, any> = any> implements Proxy<T> {\n constructor(private cfg: RestProxyConfig) {}\n\n private async call(url: string, init: RequestInit): Promise<Response> {\n const res = await (this.cfg.fetch ?? fetch)(url, { ...init, headers: { 'Content-Type': 'application/json', ...this.cfg.headers } });\n if (!res.ok) throw new Error(`Optikos RestProxy: ${init.method ?? 'GET'} ${url} \u2192 ${res.status}`);\n return res;\n }\n\n private itemUrl(d: T) {\n return `${this.cfg.url.replace(/\\/$/, '')}/${encodeURIComponent(d[this.cfg.idField ?? 'id'])}`;\n }\n\n async read(params: ReadParams, signal?: AbortSignal): Promise<ReadResult<T>> {\n const { page, pageSize, sorters, filters, ...extra } = params;\n const q = new URLSearchParams();\n if (page) q.set('page', String(page));\n if (pageSize) q.set('pageSize', String(pageSize));\n if (sorters?.length) q.set('sort', sorters.map((s) => `${s.field}:${s.dir}`).join(','));\n for (const f of filters ?? []) {\n // simple specs map to `field__op=value`; groups and list/range values travel as JSON in `filter`\n if ('filters' in f || Array.isArray(f.value)) q.append('filter', JSON.stringify(f));\n else q.set(!f.op || f.op === 'eq' ? f.field : `${f.field}__${f.op}`, String(f.value ?? ''));\n }\n for (const k in extra) if (extra[k] != null) q.set(k, String(extra[k]));\n const qs = q.toString();\n const res = await this.call(this.cfg.url + (qs ? (this.cfg.url.includes('?') ? '&' : '?') + qs : ''), { signal });\n const json = await res.json();\n const data: T[] = this.cfg.root ? path(json, this.cfg.root) : Array.isArray(json) ? json : (json.data ?? []);\n const header = Number(res.headers.get('X-Total-Count'));\n const total = this.cfg.totalKey ? Number(path(json, this.cfg.totalKey)) : header || data.length;\n return { data, total };\n }\n\n async create(d: T) {\n return (await (await this.call(this.cfg.url, { method: 'POST', body: JSON.stringify(d) })).json()) as Partial<T>;\n }\n async update(d: T) {\n return (await (await this.call(this.itemUrl(d), { method: 'PUT', body: JSON.stringify(d) })).json().catch(() => undefined)) as Partial<T> | undefined;\n }\n async destroy(d: T) {\n await this.call(this.itemUrl(d), { method: 'DELETE' });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["MemoryProxy", "rows", "path", "o", "p", "v", "k", "RestProxy", "cfg", "url", "init", "res", "d", "params", "signal", "page", "pageSize", "sorters", "filters", "extra", "q", "s", "f", "qs", "json", "data", "header", "total"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-X6AULZI4.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as p}from"./chunk-W3H7GTJY.js";import{b as a}from"./chunk-OWEQT2HN.js";import{b as i,f as n}from"./chunk-PZSHOSOS.js";import{a as s}from"./chunk-TIPK3SCJ.js";var o=class extends p{baseCls="op-field op-textfield op-textarea";createInput(){return i("textarea","op-textfield__input op-textarea__input",{rows:this.config.rows??3})}onKey(e){if(e.key==="Enter"){(e.ctrlKey||e.metaKey)&&this.emit("enter",this.getValue());return}super.onKey(e)}onInput(){super.onInput(),this.grow()}applyValue(e){super.applyValue(e),this.grow()}notifyMount(){super.notifyMount(),this.grow()}grow(){let e=this.config;if(!e.autoGrow||!this.rendered)return;let t=this.input;t.style.height="auto";let r=t.scrollHeight;if(e.maxRows){let l=a(t,"1lh")||t.scrollHeight/(t.rows||1);r=Math.min(r,l*e.maxRows)}r&&(t.style.height=`${n(r,0,1/0)}px`)}setRows(e){this.config.rows=e,this.rendered&&(this.input.rows=e)}};s("textarea",o);export{o as a};
|
|
2
|
+
//# sourceMappingURL=chunk-XHOBNSBO.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/textarea/textarea.ts"],
|
|
4
|
+
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h, clamp } from '../../../core/dom';\nimport { measure } from '../../../core/virtual';\n\nexport interface TextAreaConfig extends TextFieldConfig {\n rows?: number;\n autoGrow?: boolean;\n maxRows?: number;\n}\n\nexport class TextArea extends TextField<string, TextAreaConfig> {\n protected override baseCls = 'op-field op-textfield op-textarea';\n\n protected override createInput() {\n return h('textarea', 'op-textfield__input op-textarea__input', { rows: this.config.rows ?? 3 });\n }\n\n protected override onKey(e: KeyboardEvent) {\n // Enter is a line break here; only Ctrl/Cmd+Enter counts as \"enter\".\n if (e.key === 'Enter') {\n if (e.ctrlKey || e.metaKey) this.emit('enter', this.getValue());\n return;\n }\n super.onKey(e);\n }\n\n protected override onInput() {\n super.onInput();\n this.grow();\n }\n protected override applyValue(v: string) {\n super.applyValue(v);\n this.grow();\n }\n override notifyMount() {\n super.notifyMount();\n this.grow();\n }\n\n private grow() {\n const c = this.config;\n if (!c.autoGrow || !this.rendered) return;\n const ta = this.input as HTMLTextAreaElement;\n ta.style.height = 'auto';\n let height = ta.scrollHeight;\n if (c.maxRows) {\n const line = measure(ta, '1lh') || (ta.scrollHeight / (ta.rows || 1));\n height = Math.min(height, line * c.maxRows);\n }\n if (height) ta.style.height = `${clamp(height, 0, Infinity)}px`;\n }\n\n setRows(rows: number) {\n this.config.rows = rows;\n if (this.rendered) (this.input as HTMLTextAreaElement).rows = rows;\n }\n}\nregister('textarea', TextArea);\n"],
|
|
5
|
+
"mappings": "uKAWO,IAAMA,EAAN,cAAuBC,CAAkC,CAC3C,QAAU,oCAEV,aAAc,CAC/B,OAAOC,EAAE,WAAY,yCAA0C,CAAE,KAAM,KAAK,OAAO,MAAQ,CAAE,CAAC,CAChG,CAEmB,MAAM,EAAkB,CAEzC,GAAI,EAAE,MAAQ,QAAS,EACjB,EAAE,SAAW,EAAE,UAAS,KAAK,KAAK,QAAS,KAAK,SAAS,CAAC,EAC9D,MACF,CACA,MAAM,MAAM,CAAC,CACf,CAEmB,SAAU,CAC3B,MAAM,QAAQ,EACd,KAAK,KAAK,CACZ,CACmB,WAAWC,EAAW,CACvC,MAAM,WAAWA,CAAC,EAClB,KAAK,KAAK,CACZ,CACS,aAAc,CACrB,MAAM,YAAY,EAClB,KAAK,KAAK,CACZ,CAEQ,MAAO,CACb,IAAMC,EAAI,KAAK,OACf,GAAI,CAACA,EAAE,UAAY,CAAC,KAAK,SAAU,OACnC,IAAMC,EAAK,KAAK,MAChBA,EAAG,MAAM,OAAS,OAClB,IAAIC,EAASD,EAAG,aAChB,GAAID,EAAE,QAAS,CACb,IAAMG,EAAOC,EAAQH,EAAI,KAAK,GAAMA,EAAG,cAAgBA,EAAG,MAAQ,GAClEC,EAAS,KAAK,IAAIA,EAAQC,EAAOH,EAAE,OAAO,CAC5C,CACIE,IAAQD,EAAG,MAAM,OAAS,GAAGI,EAAMH,EAAQ,EAAG,GAAQ,CAAC,KAC7D,CAEA,QAAQI,EAAc,CACpB,KAAK,OAAO,KAAOA,EACf,KAAK,WAAW,KAAK,MAA8B,KAAOA,EAChE,CACF,EACAC,EAAS,WAAYX,CAAQ",
|
|
6
|
+
"names": ["TextArea", "TextField", "h", "v", "c", "ta", "height", "line", "measure", "clamp", "rows", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{a as b}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as r}from"./chunk-PZSHOSOS.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{e as g,f as p}from"./chunk-MW3RWBZ7.js";g("en",{codeCopy:"Copy",codeCopied:"Copied"});g("pt-BR",{codeCopy:"Copiar",codeCopied:"Copiado"});var w={ts:"TypeScript",js:"JavaScript",json:"JSON",css:"CSS",html:"HTML",sh:"Shell",text:"Text"},y="import|from|export|default|function|return|const|let|var|new|await|async|if|else|for|of|in|while|do|switch|case|break|continue|throw|try|catch|finally|class|extends|implements|interface|type|enum|as|typeof|instanceof|keyof|readonly|public|private|protected|static|this|void|true|false|null|undefined",c=`'(?:[^'\\\\\\n]|\\\\.)*'|"(?:[^"\\\\\\n]|\\\\.)*"`,l={ts:[new RegExp(`(\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\/)|(${c}|\`(?:[^\`\\\\]|\\\\.)*\`)|\\b(${y})\\b|\\b(\\d+(?:\\.\\d+)?)\\b`,"g"),["comment","string","keyword","number"]],js:[/./g,[]],json:[new RegExp(`("(?:[^"\\\\\\n]|\\\\.)*")(?=\\s*:)|(${c})|\\b(true|false|null)\\b|(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)`,"g"),["property","string","keyword","number"]],css:[new RegExp(`(\\/\\*[\\s\\S]*?\\*\\/)|(${c})|(@[\\w-]+)|([\\w-]+)(?=\\s*:[^:{;]*[;}\\n])|(#[0-9a-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:%|[a-z]+)?)`,"g"),["comment","string","keyword","property","number"]],html:[new RegExp(`(<!--[\\s\\S]*?-->)|(<\\/?[\\w-]+|\\/?>)|([\\w:-]+)(?==)|(${c})`,"g"),["comment","tag","attr","string"]],sh:[new RegExp(`(#[^\\n]*)|(${c})|\\b(if|then|else|fi|for|in|do|done|case|esac|while|function|export|return|sudo)\\b|(\\$\\{?[\\w]+\\}?|--?[\\w-]+)`,"g"),["comment","string","keyword","attr"]]};l.js=l.ts;function x(s,e="ts"){if(e==="text"||!l[e])return[["",s]];let[t,a]=l[e],i=[],n=0;for(let o of s.matchAll(t))o.index>n&&i.push(["",s.slice(n,o.index)]),i.push([a[o.slice(1).findIndex(d=>d!==void 0)]??"",o[0]]),n=o.index+o[0].length;return n<s.length&&i.push(["",s.slice(n)]),i}var v=s=>{if(Array.isArray(s))return new Set(s);let e=new Set;for(let t of(s??"").split(",")){let[a,i]=t.split("-").map(n=>Number(n.trim()));if(Number.isFinite(a))for(let n=a;n<=(Number.isFinite(i)?i:a);n++)e.add(n)}return e},u=class extends f{baseCls="op-codeviewer";titleEl;bar;pre;codeEl;status;copyBtn;build(){return this.titleEl=r("span","op-codeviewer__title"),this.copyBtn=new b({text:p("codeCopy"),icon:"file",variant:"ghost",handler:()=>{this.copy()}}),this.status=r("span","op-sr-only op-codeviewer__status",{"aria-live":"polite"}),this.bar=r("div","op-codeviewer__bar",{},this.titleEl,this.copyBtn.el,this.status),this.codeEl=r("code","op-codeviewer__code"),this.pre=r("pre","op-codeviewer__pre",{tabindex:0},this.codeEl),r("div","op-codeviewer",{},this.bar,this.pre)}onRender(){this.own(()=>this.copyBtn.destroy()),this.paintBar(),this.paintCode(),this.setWrap(!!this.config.wrap),this.setMaxHeight(this.config.maxHeight)}get language(){return this.config.language??"ts"}paintBar(){let e=this.config,t=e.title??w[this.language]??this.language;this.titleEl.textContent=t,this.pre.setAttribute("aria-label",t),this.bar.hidden=e.bar===!1,this.copyBtn.el.hidden=e.copyable===!1}paintCode(){let e=this.config,t=e.startLine??1,a=v(e.highlight),i=[r("span","op-codeviewer__line")];for(let[o,d]of x(e.code??"",this.language))d.split(`
|
|
2
|
+
`).forEach((h,C)=>{C&&i.push(r("span","op-codeviewer__line")),h&&i[i.length-1].append(o?r("span",`op-codeviewer__tok--${o}`,{},h):h)});i.forEach((o,d)=>{a.has(t+d)&&o.classList.add("is-marked"),d<i.length-1&&o.append(`
|
|
3
|
+
`)}),this.codeEl.replaceChildren(...i);let n=e.lineNumbers!==!1;this.el.classList.toggle("has-numbers",n),this.codeEl.style.counterReset=`op-codeline ${t-1}`,this.codeEl.style.setProperty("--op-codeviewer-gutter",`${String(t+i.length-1).length}ch`)}getCode(){return this.config.code??""}async copy(){let e=this.getCode();try{await navigator.clipboard.writeText(e)}catch{let t=document.createRange();return t.selectNodeContents(this.codeEl),getSelection()?.removeAllRanges(),getSelection()?.addRange(t),!1}return this.copyBtn.setText(p("codeCopied")),this.copyBtn.setIcon("check"),this.status.textContent=p("codeCopied"),this.later(()=>{this.copyBtn.setText(p("codeCopy")),this.copyBtn.setIcon("file"),this.status.textContent=""},1600),this.emit("copy",e),!0}update(e,t=!1){Object.assign(this.config,e),this.rendered&&(t&&this.paintBar(),this.paintCode())}setCode(e){this.update({code:e})}setLanguage(e){this.update({language:e},!0)}setTitle(e){this.update({title:e},!0)}setLineNumbers(e){this.update({lineNumbers:e})}setStartLine(e){this.update({startLine:e})}setHighlight(e){this.update({highlight:e})}setWrap(e){this.config.wrap=e,this.rendered&&this.el.classList.toggle("is-wrapped",e)}setMaxHeight(e){this.config.maxHeight=e,this.rendered&&(this.pre.style.maxBlockSize=e==null?"":typeof e=="number"?`${e}px`:e)}};m("codeviewer",u);export{x as a,u as b};
|
|
4
|
+
//# sourceMappingURL=chunk-XX2MVWFS.js.map
|