optikos 0.0.0-stage → 0.1.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 +28 -0
- package/LICENSE +21 -0
- package/README.md +211 -2
- package/THIRD_PARTY_NOTICES.md +83 -0
- package/dist/bind.js +2 -0
- package/dist/bind.js.map +7 -0
- package/dist/chunk-2UPUC4RK.js +2 -0
- package/dist/chunk-2UPUC4RK.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-4COBH4QJ.js +2 -0
- package/dist/chunk-4COBH4QJ.js.map +7 -0
- package/dist/chunk-4DHQKECB.js +2 -0
- package/dist/chunk-4DHQKECB.js.map +7 -0
- package/dist/chunk-4Q67QI7J.js +2 -0
- package/dist/chunk-4Q67QI7J.js.map +7 -0
- package/dist/chunk-4SUKNSCY.js +2 -0
- package/dist/chunk-4SUKNSCY.js.map +7 -0
- package/dist/chunk-5AXLYDKU.js +2 -0
- package/dist/chunk-5AXLYDKU.js.map +7 -0
- package/dist/chunk-5GNEFX6F.js +2 -0
- package/dist/chunk-5GNEFX6F.js.map +7 -0
- package/dist/chunk-5Q6Y6CM4.js +2 -0
- package/dist/chunk-5Q6Y6CM4.js.map +7 -0
- package/dist/chunk-666O2GKD.js +2 -0
- package/dist/chunk-666O2GKD.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-6NJW7QFD.js +2 -0
- package/dist/chunk-6NJW7QFD.js.map +7 -0
- package/dist/chunk-6O2BXCRN.js +2 -0
- package/dist/chunk-6O2BXCRN.js.map +7 -0
- package/dist/chunk-A66MDXHL.js +2 -0
- package/dist/chunk-A66MDXHL.js.map +7 -0
- package/dist/chunk-ARCW54L2.js +2 -0
- package/dist/chunk-ARCW54L2.js.map +7 -0
- package/dist/chunk-BIYNHKSA.js +2 -0
- package/dist/chunk-BIYNHKSA.js.map +7 -0
- package/dist/chunk-BNPVRIFT.js +2 -0
- package/dist/chunk-BNPVRIFT.js.map +7 -0
- package/dist/chunk-C3N7QTQB.js +2 -0
- package/dist/chunk-C3N7QTQB.js.map +7 -0
- package/dist/chunk-CEXY5A4T.js +2 -0
- package/dist/chunk-CEXY5A4T.js.map +7 -0
- package/dist/chunk-CN7USUJR.js +2 -0
- package/dist/chunk-CN7USUJR.js.map +7 -0
- package/dist/chunk-CQRHNTEX.js +2 -0
- package/dist/chunk-CQRHNTEX.js.map +7 -0
- package/dist/chunk-CUPAPOKC.js +2 -0
- package/dist/chunk-CUPAPOKC.js.map +7 -0
- package/dist/chunk-DXO3UJKL.js +2 -0
- package/dist/chunk-DXO3UJKL.js.map +7 -0
- package/dist/chunk-GZNQPENR.js +2 -0
- package/dist/chunk-GZNQPENR.js.map +7 -0
- package/dist/chunk-HFFK6K4K.js +2 -0
- package/dist/chunk-HFFK6K4K.js.map +7 -0
- package/dist/chunk-IHAYOSBR.js +2 -0
- package/dist/chunk-IHAYOSBR.js.map +7 -0
- package/dist/chunk-IO66A6G5.js +2 -0
- package/dist/chunk-IO66A6G5.js.map +7 -0
- package/dist/chunk-IW7PK4VS.js +2 -0
- package/dist/chunk-IW7PK4VS.js.map +7 -0
- package/dist/chunk-IYPKPLCU.js +2 -0
- package/dist/chunk-IYPKPLCU.js.map +7 -0
- package/dist/chunk-JTYWZMSZ.js +2 -0
- package/dist/chunk-JTYWZMSZ.js.map +7 -0
- package/dist/chunk-JVEPKW5X.js +2 -0
- package/dist/chunk-JVEPKW5X.js.map +7 -0
- package/dist/chunk-JZNEB7A7.js +2 -0
- package/dist/chunk-JZNEB7A7.js.map +7 -0
- package/dist/chunk-K2DGY6MP.js +2 -0
- package/dist/chunk-K2DGY6MP.js.map +7 -0
- package/dist/chunk-LBCWEWPN.js +2 -0
- package/dist/chunk-LBCWEWPN.js.map +7 -0
- package/dist/chunk-LEE2FEEL.js +2 -0
- package/dist/chunk-LEE2FEEL.js.map +7 -0
- package/dist/chunk-LMGCV35W.js +2 -0
- package/dist/chunk-LMGCV35W.js.map +7 -0
- package/dist/chunk-LV6HXFHU.js +3 -0
- package/dist/chunk-LV6HXFHU.js.map +7 -0
- package/dist/chunk-MA5BJL3S.js +2 -0
- package/dist/chunk-MA5BJL3S.js.map +7 -0
- package/dist/chunk-NDBFYIL6.js +2 -0
- package/dist/chunk-NDBFYIL6.js.map +7 -0
- package/dist/chunk-NHVEP72K.js +2 -0
- package/dist/chunk-NHVEP72K.js.map +7 -0
- package/dist/chunk-NV5AIBQP.js +2 -0
- package/dist/chunk-NV5AIBQP.js.map +7 -0
- package/dist/chunk-NWTTHDIM.js +2 -0
- package/dist/chunk-NWTTHDIM.js.map +7 -0
- package/dist/chunk-O4DCHALR.js +2 -0
- package/dist/chunk-O4DCHALR.js.map +7 -0
- package/dist/chunk-ODWPBBVL.js +2 -0
- package/dist/chunk-ODWPBBVL.js.map +7 -0
- package/dist/chunk-OW2ZSMGS.js +2 -0
- package/dist/chunk-OW2ZSMGS.js.map +7 -0
- package/dist/chunk-OWEQT2HN.js +2 -0
- package/dist/chunk-OWEQT2HN.js.map +7 -0
- package/dist/chunk-PSPQH35P.js +2 -0
- package/dist/chunk-PSPQH35P.js.map +7 -0
- package/dist/chunk-PZSHOSOS.js +2 -0
- package/dist/chunk-PZSHOSOS.js.map +7 -0
- package/dist/chunk-QEQIJAAB.js +2 -0
- package/dist/chunk-QEQIJAAB.js.map +7 -0
- package/dist/chunk-SNTHW4K2.js +2 -0
- package/dist/chunk-SNTHW4K2.js.map +7 -0
- package/dist/chunk-T4OYVG2X.js +2 -0
- package/dist/chunk-T4OYVG2X.js.map +7 -0
- package/dist/chunk-TBLICXWW.js +2 -0
- package/dist/chunk-TBLICXWW.js.map +7 -0
- package/dist/chunk-TK2RC3T5.js +2 -0
- package/dist/chunk-TK2RC3T5.js.map +7 -0
- package/dist/chunk-U3X2FW6U.js +2 -0
- package/dist/chunk-U3X2FW6U.js.map +7 -0
- package/dist/chunk-UPOBGNJ5.js +2 -0
- package/dist/chunk-UPOBGNJ5.js.map +7 -0
- package/dist/chunk-VV7CFMPZ.js +2 -0
- package/dist/chunk-VV7CFMPZ.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-XVIC24AW.js +2 -0
- package/dist/chunk-XVIC24AW.js.map +7 -0
- package/dist/chunk-XZ5CUZZP.js +2 -0
- package/dist/chunk-XZ5CUZZP.js.map +7 -0
- package/dist/chunk-XZEOSW3Q.js +2 -0
- package/dist/chunk-XZEOSW3Q.js.map +7 -0
- package/dist/chunk-YET5PM6F.js +2 -0
- package/dist/chunk-YET5PM6F.js.map +7 -0
- package/dist/chunk-Z25NC4CS.js +2 -0
- package/dist/chunk-Z25NC4CS.js.map +7 -0
- package/dist/chunk-ZCAAM4NH.js +2 -0
- package/dist/chunk-ZCAAM4NH.js.map +7 -0
- package/dist/chunk-ZHVSHDLH.js +2 -0
- package/dist/chunk-ZHVSHDLH.js.map +7 -0
- package/dist/chunk-ZYUXCZX7.js +2 -0
- package/dist/chunk-ZYUXCZX7.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/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/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/dropdown.js +2 -0
- package/dist/components/dropdown.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/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/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/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/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/base.css +160 -0
- package/dist/css/breadcrumb.css +53 -0
- package/dist/css/button.css +101 -0
- package/dist/css/calendar.css +108 -0
- package/dist/css/chat.css +233 -0
- package/dist/css/checkbox.css +64 -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/dropdown.css +13 -0
- package/dist/css/field.css +62 -0
- package/dist/css/fieldset.css +32 -0
- package/dist/css/filterbuilder.css +125 -0
- package/dist/css/form.css +8 -0
- package/dist/css/grid.css +367 -0
- package/dist/css/icon.css +16 -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 +47 -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 +77 -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 +117 -0
- package/dist/css/table.css +36 -0
- package/dist/css/tabs.css +99 -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/toolbar.css +14 -0
- package/dist/css/tooltip.css +17 -0
- package/dist/css/viewport.css +9 -0
- package/dist/css/widget.css +77 -0
- package/dist/css/window.css +31 -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 +3145 -0
- package/dist/themes/brand.css +240 -0
- package/dist/themes/brutal.css +100 -0
- package/dist/themes/compact.css +17 -0
- package/dist/themes/corporate.css +112 -0
- package/dist/themes/dark.css +38 -0
- package/dist/themes/editorial.css +110 -0
- package/dist/themes/soft.css +101 -0
- package/dist/themes/terminal.css +91 -0
- package/dist/types/bind/index.d.ts +23 -0
- package/dist/types/components/base/button/button.d.ts +34 -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/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/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/dataview/dataview.d.ts +61 -0
- package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +71 -0
- package/dist/types/components/data/grid/grid.d.ts +151 -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/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/dropdown.d.ts +1 -0
- package/dist/types/components/feedback/spinner/spinner.d.ts +11 -0
- package/dist/types/components/fields/checkbox/checkbox.d.ts +20 -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/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/fieldset.d.ts +1 -0
- package/dist/types/components/filterbuilder.d.ts +1 -0
- package/dist/types/components/form/form/form.d.ts +51 -0
- package/dist/types/components/form/stepform/stepform.d.ts +62 -0
- package/dist/types/components/form.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/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 +21 -0
- package/dist/types/components/layout/panel/panel.d.ts +47 -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 +49 -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 +41 -0
- package/dist/types/components/overlays/messagebox/messagebox.d.ts +53 -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 +48 -0
- package/dist/types/components/overlays/window/window.d.ts +31 -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/toolbar.d.ts +1 -0
- package/dist/types/components/tooltip.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 +90 -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 +7 -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 +16 -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 +27 -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 +53 -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 +30 -0
- package/dist/types/themes/index.d.ts +1 -0
- package/dist/types/ui/enums.d.ts +88 -0
- package/dist/types/ui/index.d.ts +2 -0
- package/dist/types/ui/ui.d.ts +58 -0
- package/dist/ui.js +2 -0
- package/dist/ui.js.map +7 -0
- package/package.json +99 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/commandpalette/commandpalette.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus } from '../../../core/focus';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface Command {\n id: string;\n title: string;\n /** Groups the command and gives it a filter chip. */\n category?: string;\n icon?: string;\n description?: string;\n /** Extra words that find the command. */\n keywords?: string[];\n /** Only displayed (the app binds the key itself). */\n shortcut?: string;\n disabled?: boolean;\n hidden?: () => boolean;\n /** Runs after the palette closed. Errors become the palette's `error` event. */\n handler?: (ctx: { palette: CommandPalette; command: Command }) => unknown;\n /** A second level: choosing this command shows these (Backspace on an empty field goes back). */\n children?: Command[] | (() => Command[] | Promise<Command[]>);\n}\n\nexport interface CommandPaletteConfig extends ComponentConfig {\n commands?: Command[];\n /** `mod` is Ctrl on Windows/Linux and \u2318 on macOS. `false` turns the global key off. Default `'mod+k'`. */\n hotkey?: string | false;\n placeholder?: string;\n emptyText?: string;\n maxResults?: number;\n /** Order of the category groups; the others follow. */\n categories?: string[];\n /** Category chips under the field. Default true. */\n filters?: boolean;\n}\n\ntype Level = { title: string; commands: Command[] };\n\nconst isMac = () => /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\n\nfunction matchesKey(e: KeyboardEvent, spec: string): boolean {\n const parts = spec.toLowerCase().split('+');\n const key = parts.pop()!;\n const has = (m: string) => parts.includes(m);\n const mac = isMac();\n return (\n e.key.toLowerCase() === key &&\n e.ctrlKey === (has('ctrl') || (has('mod') && !mac)) &&\n e.metaKey === (has('meta') || (has('mod') && mac)) &&\n e.shiftKey === has('shift') &&\n e.altKey === has('alt')\n );\n}\n\nconst subsequence = (text: string, q: string) => {\n let i = 0;\n for (const ch of text) if (ch === q[i] && ++i === q.length) return true;\n return !q.length;\n};\n\n/** How well a command answers the query (0 = not at all). Every word of the query must match somewhere. */\nfunction score(c: Command, query: string): number {\n const title = c.title.toLowerCase();\n const rest = [c.category, c.description, ...(c.keywords ?? [])].join(' ').toLowerCase();\n let total = 0;\n for (const w of query.toLowerCase().split(/\\s+/).filter(Boolean)) {\n const at = title.indexOf(w);\n const s = at === 0 ? 100 : at > 0 ? (/[\\s\\-_/]/.test(title[at - 1]) ? 80 : 60) : w.length > 2 && subsequence(title, w) ? 30 : rest.includes(w) ? 20 : 0;\n if (!s) return 0;\n total += s;\n }\n return total;\n}\n\n/** Title with the matched words marked. */\nfunction marked(title: string, query: string): Array<string | Node> {\n const words = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const lower = title.toLowerCase();\n const spans: Array<[number, number]> = [];\n for (const w of words) {\n const at = lower.indexOf(w);\n if (at >= 0) spans.push([at, at + w.length]);\n }\n spans.sort((a, b) => a[0] - b[0]);\n const out: Array<string | Node> = [];\n let pos = 0;\n for (const [a, b] of spans) {\n if (a < pos) continue;\n out.push(title.slice(pos, a), h('mark', 'op-palette__mark', {}, title.slice(a, b)));\n pos = b;\n }\n out.push(title.slice(pos));\n return out.filter((x) => x !== '');\n}\n\n/**\n * Command palette: Ctrl/\u2318+K opens a searchable, categorized list of the actions the app registered. Choosing one closes\n * the palette and runs it; a command with `children` opens a second level instead.\n */\nexport class CommandPalette extends Component<CommandPaletteConfig> {\n protected override baseCls = 'op-palette-backdrop';\n private commands: Command[];\n private levels: Level[] = [];\n private query = '';\n private cat: string | null = null;\n private shown: Command[] = [];\n private active = 0;\n private opened = false;\n private opener: Element | null = null;\n private release: Array<() => void> = [];\n private panel!: HTMLElement;\n private input!: HTMLInputElement;\n private filtersEl!: HTMLElement;\n private listEl!: HTMLElement;\n private live!: HTMLElement;\n private crumb!: HTMLElement;\n\n constructor(config: CommandPaletteConfig = {}) {\n super(config);\n this.commands = [...(config.commands ?? [])];\n const key = config.hotkey === undefined ? 'mod+k' : config.hotkey;\n if (key) {\n this.listen(document, 'keydown', (e: KeyboardEvent) => {\n if (!matchesKey(e, key) || this.destroyed) return;\n e.preventDefault();\n this.toggle();\n }, true);\n }\n }\n\n protected override build() {\n const c = this.config;\n this.input = h('input', 'op-palette__input', { type: 'text', role: 'combobox', 'aria-expanded': 'true', 'aria-autocomplete': 'list', autocomplete: 'off', spellcheck: 'false', placeholder: c.placeholder ?? t('cpPlaceholder') });\n this.crumb = h('span', 'op-palette__crumb');\n this.crumb.hidden = true;\n this.filtersEl = h('div', 'op-palette__filters', { role: 'group', 'aria-label': t('cpFilters') });\n this.listEl = h('div', 'op-palette__list', { role: 'listbox', id: `${this.id}-list` });\n this.input.setAttribute('aria-controls', this.listEl.id);\n this.live = h('div', 'op-sr-only', { 'aria-live': 'polite' });\n this.panel = h('div', 'op-palette', { role: 'dialog', 'aria-modal': 'true', 'aria-label': t('cpLabel') },\n h('div', 'op-palette__search', {}, iconEl('search'), this.crumb, this.input),\n this.filtersEl, this.listEl, this.live,\n h('div', 'op-palette__hint', {}, t('cpHint')));\n const el = h('div', 'op-palette-backdrop', {}, this.panel);\n this.listen(this.input, 'input', () => {\n this.query = this.input.value;\n this.active = 0;\n this.paint();\n });\n this.listen(this.panel, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(el, 'pointerdown', (e: Event) => e.target === el && this.close());\n this.listen(this.listEl, 'pointermove', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0 && i !== this.active) this.setActive(i);\n });\n this.listen(this.listEl, 'click', (e: Event) => {\n const i = this.indexOf(e);\n if (i >= 0) void this.choose(this.shown[i]);\n });\n this.listen(this.filtersEl, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-cat]');\n if (!b) return;\n this.cat = b.dataset.cat || null;\n this.active = 0;\n this.paint();\n this.input.focus();\n });\n return el;\n }\n\n // ---- commands ------------------------------------------------------------------------------\n\n getCommands(): Command[] {\n return this.commands;\n }\n setCommands(list: Command[]): void {\n this.commands = [...list];\n if (this.levels[0]) this.levels[0].commands = this.commands;\n if (this.opened) this.paint();\n }\n /** Adds commands; returns the function that removes them again. */\n register(cmd: Command | Command[]): () => void {\n const list = Array.isArray(cmd) ? cmd : [cmd];\n this.commands.push(...list);\n if (this.opened) this.paint();\n return () => this.setCommands(this.commands.filter((c) => !list.includes(c)));\n }\n /** Runs a command by id (searching every level that is not a submenu), without opening the palette. */\n run(id: string): Promise<void> {\n const c = this.commands.find((x) => x.id === id);\n return c ? this.exec(c) : Promise.resolve();\n }\n\n // ---- open / close --------------------------------------------------------------------------\n\n isOpen(): boolean {\n return this.opened;\n }\n toggle(): void {\n if (this.opened) this.close();\n else this.open();\n }\n\n open(): void {\n if (this.opened || this.destroyed || this.emit('before-open') === false) return;\n this.opener = document.activeElement;\n const el = this.el;\n this.levels = [{ title: '', commands: this.commands }];\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n toLayer(el, this.opener);\n this.release.push(lockModal(el), trapFocus(this.panel));\n this.opened = true;\n el.classList.add('is-open');\n this.notifyMount();\n this.paint();\n this.input.focus();\n this.emit('open');\n }\n\n close(): void {\n if (!this.opened) return;\n this.opened = false;\n this.release.splice(0).reverse().forEach((f) => f());\n this.el.classList.remove('is-open');\n this.el.remove();\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n this.emit('close');\n }\n\n protected override onDestroy(): void {\n this.opened = false;\n this.release.splice(0).forEach((f) => f());\n if (this.panel) this.el.remove();\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n private level(): Level {\n return this.levels[this.levels.length - 1];\n }\n\n /** Commands for the current query/filter, in display order. */\n private results(): Command[] {\n const pool = this.level().commands.filter((c) => !c.hidden?.() && (!this.cat || c.category === this.cat));\n const q = this.query.trim();\n if (q) {\n return pool\n .map((c) => ({ c, s: score(c, q) }))\n .filter((x) => x.s > 0)\n .sort((a, b) => b.s - a.s)\n .map((x) => x.c)\n .slice(0, this.config.maxResults ?? 50);\n }\n const order = this.config.categories ?? [];\n const rank = (c: Command) => (c.category === undefined ? 1e6 : order.includes(c.category) ? order.indexOf(c.category) : order.length);\n return pool.map((c, i) => ({ c, i })).sort((a, b) => rank(a.c) - rank(b.c) || a.i - b.i).map((x) => x.c).slice(0, this.config.maxResults ?? 50);\n }\n\n private paint(): void {\n const lvl = this.level();\n this.crumb.hidden = this.levels.length < 2;\n this.crumb.textContent = lvl.title;\n this.paintFilters();\n this.shown = this.results();\n this.active = Math.min(this.active, Math.max(0, this.shown.length - 1));\n const searching = !!this.query.trim();\n const rows: HTMLElement[] = [];\n let group: string | undefined;\n this.shown.forEach((c, i) => {\n if (!searching && c.category !== group) {\n group = c.category;\n if (group) rows.push(h('div', 'op-palette__group', { role: 'presentation' }, group));\n }\n const item = h('div', `op-palette__item${c.disabled ? ' is-disabled' : ''}`, { role: 'option', id: `${this.id}-o${i}`, 'aria-disabled': c.disabled ? 'true' : null, 'data-i': i },\n c.icon ? h('span', 'op-palette__icon', {}, iconEl(c.icon)) : h('span', 'op-palette__icon'),\n h('span', 'op-palette__text', {}, h('span', 'op-palette__title', {}, ...marked(c.title, this.query)), c.description ? h('span', 'op-palette__desc', {}, c.description) : ''),\n searching && c.category ? h('span', 'op-palette__cat', {}, c.category) : '',\n c.children ? h('span', 'op-palette__more', { 'aria-hidden': 'true' }, iconEl('chevron-right')) : '',\n c.shortcut ? h('kbd', 'op-palette__kbd', {}, c.shortcut) : '');\n rows.push(item);\n });\n if (!this.shown.length) rows.push(h('div', 'op-palette__empty', {}, this.config.emptyText ?? t('cpEmpty')));\n this.listEl.replaceChildren(...rows);\n this.live.textContent = this.shown.length ? t('results', { n: this.shown.length }) : t('noResults');\n this.setActive(this.active, false);\n }\n\n private paintFilters(): void {\n const cats = [...new Set(this.level().commands.filter((c) => !c.hidden?.() && c.category).map((c) => c.category!))];\n this.filtersEl.hidden = this.config.filters === false || cats.length < 2;\n if (this.cat && !cats.includes(this.cat)) this.cat = null;\n const chip = (label: string, cat: string) => h('button', `op-palette__chip${(this.cat ?? '') === cat ? ' is-on' : ''}`, { type: 'button', 'data-cat': cat, 'aria-pressed': String((this.cat ?? '') === cat) }, label);\n this.filtersEl.replaceChildren(chip(t('cpAll'), ''), ...cats.map((c) => chip(c, c)));\n }\n\n private indexOf(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-palette__item');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private setActive(i: number, scroll = true): void {\n this.active = i;\n for (const row of Array.from(this.listEl.querySelectorAll<HTMLElement>('.op-palette__item'))) {\n const on = Number(row.dataset.i) === i;\n row.classList.toggle('is-active', on);\n row.setAttribute('aria-selected', String(on));\n if (on) {\n this.input.setAttribute('aria-activedescendant', row.id);\n if (scroll) row.scrollIntoView?.({ block: 'nearest' });\n }\n }\n if (!this.shown.length) this.input.removeAttribute('aria-activedescendant');\n }\n\n // ---- behavior ------------------------------------------------------------------------------\n\n private onKey(e: KeyboardEvent): void {\n const n = this.shown.length;\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n e.preventDefault();\n if (n) this.setActive((this.active + (e.key === 'ArrowDown' ? 1 : n - 1)) % n);\n break;\n case 'Home':\n case 'End':\n if (e.target === this.input && !this.input.value) {\n e.preventDefault();\n if (n) this.setActive(e.key === 'Home' ? 0 : n - 1);\n }\n break;\n case 'Enter':\n if ((e.target as HTMLElement).closest('.op-palette__chip')) return;\n e.preventDefault();\n if (this.shown[this.active]) void this.choose(this.shown[this.active]);\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n if (this.levels.length > 1) this.back();\n else this.close();\n break;\n case 'Backspace':\n if (!this.input.value && this.levels.length > 1) {\n e.preventDefault();\n this.back();\n }\n break;\n }\n }\n\n private back(): void {\n this.levels.pop();\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n this.paint();\n this.input.focus();\n }\n\n private async choose(c: Command | undefined): Promise<void> {\n if (!c || c.disabled) return;\n if (c.children) {\n try {\n const kids = typeof c.children === 'function' ? await c.children() : c.children;\n this.levels.push({ title: c.title, commands: kids });\n this.query = this.input.value = '';\n this.cat = null;\n this.active = 0;\n this.paint();\n this.input.focus();\n } catch (err) {\n this.emit('error', err);\n }\n return;\n }\n this.close();\n await this.exec(c);\n }\n\n private async exec(c: Command): Promise<void> {\n try {\n this.emit('run', c);\n await c.handler?.({ palette: this, command: c });\n } catch (err) {\n this.emit('error', err);\n }\n }\n}\nregister('commandpalette', CommandPalette);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isMac", "matchesKey", "e", "spec", "parts", "key", "has", "m", "mac", "subsequence", "text", "q", "i", "ch", "score", "c", "query", "title", "rest", "total", "w", "at", "s", "marked", "words", "lower", "spans", "a", "b", "out", "pos", "h", "x", "CommandPalette", "Component", "config", "t", "iconEl", "el", "list", "cmd", "id", "toLayer", "lockModal", "trapFocus", "f", "pool", "order", "rank", "lvl", "searching", "rows", "group", "item", "cats", "chip", "label", "cat", "row", "scroll", "on", "n", "kids", "err", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m}from"./chunk-4COBH4QJ.js";import{a as f}from"./chunk-ARCW54L2.js";import{a as g}from"./chunk-SNTHW4K2.js";import{f as a,g as o}from"./chunk-NWTTHDIM.js";import{c as h}from"./chunk-IHAYOSBR.js";import{b as u}from"./chunk-IYPKPLCU.js";import{b as c}from"./chunk-PZSHOSOS.js";import{e as n}from"./chunk-MA5BJL3S.js";var b=/\s*(?:–|—|\s-\s|\sto\s|\sa\s)\s*/,d=p=>a(p,{day:"2-digit",month:"2-digit",year:"numeric"}),l=class extends g{baseCls="op-field op-textfield op-picker op-datefield op-daterange";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e?.start}parse(e){if(this.garbage=!1,!e.trim())return null;let[r,s]=e.trim().split(b),t=o(r),i=s?o(s):null;return!t||s&&!i?(this.garbage=!0,null):i&&i<t?{start:i,end:t}:{start:t,end:i??t}}display(e){return e?.start?e.end&&e.end!==e.start?`${d(e.start)} \u2013 ${d(e.end)}`:d(e.start):""}createControl(){let e=super.createControl(),r=this.input;r.setAttribute("aria-haspopup","dialog"),r.setAttribute("aria-expanded","false");let s=c("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},h("calendar"));this.listen(s,"mousedown",i=>i.preventDefault()),this.listen(s,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(s);let t=this.config;return this.cal=new m({range:!0,value:t.value,min:t.min,max:t.max,firstDay:t.firstDay}),this.dd=new f({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",i=>{this.dd.close(),this.setValue(i),r.focus()}),this.dd.on("open",()=>{r.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{r.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let i=document.activeElement;!this.el.contains(i)&&!this.dd.el.contains(i)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),r=this.value;if(e||!r)return e;let{min:s,max:t}=this.config;return s&&r.start<s?n("dateMin",{n:a(s)}):t&&(r.end??r.start)>t?n("dateMax",{n:a(t)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};u("daterangefield",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-BNPVRIFT.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/daterangefield/daterangefield.ts"],
|
|
4
|
+
"sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { parseDate, formatDate } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Calendar, type DateRange } from '../../dates/calendar/calendar';\n\nexport interface DateRangeFieldConfig extends TextFieldConfig<DateRange | null> {\n min?: string;\n max?: string;\n firstDay?: number;\n}\n\nconst SEP = /\\s*(?:\u2013|\u2014|\\s-\\s|\\sto\\s|\\sa\\s)\\s*/;\nconst short = (iso: string) => formatDate(iso, { day: '2-digit', month: '2-digit', year: 'numeric' });\n\n/**\n * Value is `{ start, end }` (ISO dates) or null. The text reads `01/03/2025 \u2013 15/03/2025` (typed or picked); the calendar\n * takes two clicks, and the popup closes on the second.\n */\nexport class DateRangeField extends TextField<DateRange | null, DateRangeFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-picker op-datefield op-daterange';\n private cal!: Calendar;\n private dd!: Dropdown;\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: DateRange | null) {\n return !v?.start;\n }\n\n protected override parse(text: string): DateRange | null {\n this.garbage = false;\n if (!text.trim()) return null;\n const [a, b] = text.trim().split(SEP);\n const start = parseDate(a);\n const end = b ? parseDate(b) : null;\n if (!start || (b && !end)) {\n this.garbage = true;\n return null;\n }\n return end && end < start ? { start: end, end: start } : { start, end: end ?? start };\n }\n protected override display(v: DateRange | null) {\n return v?.start ? (v.end && v.end !== v.start ? `${short(v.start)} \u2013 ${short(v.end)}` : short(v.start)) : '';\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n const trigger = h('button', 'op-picker__trigger', { type: 'button', tabindex: -1, 'aria-label': t('calOpen') }, iconEl('calendar'));\n this.listen(trigger, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(trigger, 'click', () => {\n if (!this.config.disabled && !this.config.readonly) this.toggle();\n });\n wrap.append(trigger);\n const c = this.config;\n this.cal = new Calendar({ range: true, value: c.value, min: c.min, max: c.max, firstDay: c.firstDay });\n this.dd = new Dropdown({ anchor: wrap, content: this.cal, role: 'presentation' });\n this.cal.on('select', (r: DateRange) => {\n this.dd.close();\n this.setValue(r);\n input.focus();\n });\n this.dd.on('open', () => {\n input.setAttribute('aria-expanded', 'true');\n this.el.classList.add('is-open');\n this.cal.setValue(this.value);\n this.cal.focusDay();\n this.emit('expand');\n });\n this.dd.on('close', () => {\n input.setAttribute('aria-expanded', 'false');\n this.el.classList.remove('is-open');\n this.emit('collapse');\n });\n this.own(() => this.dd.destroy());\n this.on('blur', () =>\n this.later(() => {\n const a = document.activeElement;\n if (!this.el.contains(a) && !this.dd.el.contains(a)) this.dd.close();\n }, 0),\n );\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowDown' && !this.dd.isOpen()) {\n e.preventDefault();\n this.open();\n } else super.onKey(e);\n }\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('date'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: DateRange | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-picker__trigger') as HTMLButtonElement).disabled = disabled;\n }\n\n protected override check(): string {\n if (this.garbage) return t('date');\n const base = super.check();\n const v = this.value;\n if (base || !v) return base;\n const { min, max } = this.config;\n if (min && v.start! < min) return t('dateMin', { n: formatDate(min) });\n if (max && (v.end ?? v.start!) > max) return t('dateMax', { n: formatDate(max) });\n return '';\n }\n\n open() {\n if (this.config.disabled || this.config.readonly || !this.rendered) return;\n this.dd.open();\n }\n close() {\n this.dd?.close();\n }\n toggle() {\n if (this.dd.isOpen()) this.close();\n else this.open();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n this.cal?.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.cal?.setMax(max);\n }\n}\nregister('daterangefield', DateRangeField);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SEP", "short", "iso", "formatDate", "DateRangeField", "TextField", "v", "text", "a", "b", "start", "parseDate", "end", "wrap", "input", "trigger", "h", "t", "iconEl", "e", "c", "Calendar", "Dropdown", "r", "disabled", "base", "min", "max", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as g}from"./chunk-ZHVSHDLH.js";import{a as k}from"./chunk-JVEPKW5X.js";import{a as T}from"./chunk-LEE2FEEL.js";import{a as d}from"./chunk-NV5AIBQP.js";import{a as w}from"./chunk-T4OYVG2X.js";import{a as c}from"./chunk-CQRHNTEX.js";import{a as h}from"./chunk-6O2BXCRN.js";import{a as C}from"./chunk-DXO3UJKL.js";import{a as b}from"./chunk-XZ5CUZZP.js";import{a as x}from"./chunk-LBCWEWPN.js";import{a as l}from"./chunk-QEQIJAAB.js";import{a as u}from"./chunk-4SUKNSCY.js";import{a as y}from"./chunk-BNPVRIFT.js";import{a as f}from"./chunk-ZYUXCZX7.js";import{a as m}from"./chunk-U3X2FW6U.js";import{a}from"./chunk-SNTHW4K2.js";import{c as s}from"./chunk-UPOBGNJ5.js";import{a as p}from"./chunk-XZEOSW3Q.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),S={text:(t,e,o)=>n(a,t,e,o),email:(t,e,o)=>n(a,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(a,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(g,t,e,o),number:(t,e,o)=>n(f,t,e,o),date:(t,e,o)=>n(m,t,e,o),dateRange:(t,e,o)=>n(y,t,e,o),secret:(t,e,o)=>n(w,t,e,o),slider:(t,e,o)=>n(h,t,e,o),check:(t,e,o)=>n(l,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(d,t,e,{options:o,...r}),select:(t,e,o,r)=>n(c,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(u,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(C,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(T,t,e,{lookup:o,...r}),button:(t,e,o)=>new p({text:t,handler:e,...o}),primary:(t,e,o)=>new p({text:t,handler:e,variant:"primary",...o}),danger:(t,e,o)=>new p({text:t,handler:e,variant:"danger",...o}),row:(...t)=>new s({layout:"hbox",items:t}),col:(...t)=>new s({layout:"vbox",items:t}),grid:(t,...e)=>new s({layout:{type:"grid",columns:typeof t=="number"?`repeat(${t}, 1fr)`:t},items:e}),panel:(t,e,o)=>new b({title:t,items:e,...o}),toolbar:(...t)=>new x({items:t}),form:(t,e)=>new k({items:t,...e})};var i=t=>t,H=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),$=i({Top:"top",Left:"left"}),j=i({Vertical:"vertical",Horizontal:"horizontal"}),J=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),Q=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),U=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),X=i({None:"none",Single:"single",Multi:"multi"}),Y=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),Z=i({Eq:"eq",Ne:"ne",Contains:"contains",NotContains:"notContains",StartsWith:"startsWith",EndsWith:"endsWith",Gt:"gt",Ge:"ge",Lt:"lt",Le:"le",Between:"between",NotBetween:"notBetween",In:"in",Nin:"nin",Empty:"empty",NotEmpty:"notEmpty"}),_=i({Light:"light",Dark:"dark",Corporate:"corporate",Brutal:"brutal",Soft:"soft",Terminal:"terminal",Editorial:"editorial",Brand:"brand"});export{S as a,H as b,$ as c,j as d,J as e,Q as f,U as g,X as h,Y as i,Z as j,_ as k};
|
|
2
|
+
//# sourceMappingURL=chunk-C3N7QTQB.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ui/ui.ts", "../src/ui/enums.ts"],
|
|
4
|
+
"sourcesContent": ["// Short constructors for the things you write most. They return real component instances (the classes), so they can be\n// used anywhere a config goes: `items: [ui.text('name', 'Name', { required: true }), ui.select('plan', 'Plan', ['Free', 'Pro'])]`.\n// The last argument is always a config object that overrides or adds anything (`{ required: true, help: '\u2026' }`).\nimport { TextField, type TextFieldConfig } from '../components/fields/textfield/textfield';\nimport { TextArea } from '../components/fields/textarea/textarea';\nimport { NumberField } from '../components/fields/numberfield/numberfield';\nimport { DateField } from '../components/fields/datefield/datefield';\nimport { DateRangeField } from '../components/fields/daterangefield/daterangefield';\nimport { Checkbox } from '../components/fields/checkbox/checkbox';\nimport { RadioGroup, type RadioOption } from '../components/fields/radiogroup/radiogroup';\nimport { Select } from '../components/fields/select/select';\nimport { ComboBox } from '../components/fields/combobox/combobox';\nimport { SuggestField } from '../components/fields/suggestfield/suggestfield';\nimport { LookupField } from '../components/fields/lookupfield/lookupfield';\nimport { SecretField } from '../components/fields/secretfield/secretfield';\nimport { Slider } from '../components/fields/slider/slider';\nimport { Button } from '../components/base/button/button';\nimport { Panel } from '../components/layout/panel/panel';\nimport { Toolbar } from '../components/layout/toolbar/toolbar';\nimport { Container } from '../core/container';\nimport { Form } from '../components/form/form/form';\nimport type { Component, ComponentConfig } from '../core/component';\nimport type { Variant } from './enums';\n\ntype Cfg = Record<string, any>;\ntype Item = Component | ComponentConfig | string;\ntype Options = (string | number | { value: unknown; label: string; disabled?: boolean })[];\n\nconst field = <T>(Cls: new (c: any) => T, name: string, label: string | undefined, c: Cfg = {}): T => new Cls({ name, label, ...c });\n\nexport const ui = {\n // ---- fields: (name, label, config?) ----\n text: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, c),\n email: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'email', ...c } satisfies TextFieldConfig),\n password: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'password', ...c }),\n area: (name: string, label?: string, c?: Cfg) => field(TextArea, name, label, c),\n number: (name: string, label?: string, c?: Cfg) => field(NumberField, name, label, c),\n date: (name: string, label?: string, c?: Cfg) => field(DateField, name, label, c),\n dateRange: (name: string, label?: string, c?: Cfg) => field(DateRangeField, name, label, c),\n secret: (name: string, label?: string, c?: Cfg) => field(SecretField, name, label, c),\n slider: (name: string, label?: string, c?: Cfg) => field(Slider, name, label, c),\n /** `boxLabel` is the text beside the box. */\n check: (name: string, boxLabel?: string, c?: Cfg) => field(Checkbox, name, undefined, { boxLabel, ...c }),\n radio: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(RadioGroup, name, label, { options, ...c }),\n select: (name: string, label: string, options: Options, c?: Cfg) => field(Select, name, label, { options, ...c }),\n combo: (name: string, label: string, options: Options, c?: Cfg) => field(ComboBox, name, label, { options, ...c }),\n suggest: (name: string, label: string, query: (text: string, o: { signal: AbortSignal }) => unknown, c?: Cfg) => field(SuggestField, name, label, { query, ...c }),\n /** `lookup` is a LookupDef or the name given to `registerLookup`. */\n lookup: (name: string, label: string, lookup: Cfg | string, c?: Cfg) => field(LookupField, name, label, { lookup, ...c }),\n\n // ---- actions ----\n button: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, ...c }),\n primary: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'primary' satisfies Variant, ...c }),\n danger: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'danger' satisfies Variant, ...c }),\n\n // ---- structure ----\n row: (...items: Item[]) => new Container({ layout: 'hbox', items } as Cfg),\n col: (...items: Item[]) => new Container({ layout: 'vbox', items } as Cfg),\n /** `columns`: a number (equal columns) or a CSS `grid-template-columns`. */\n grid: (columns: number | string, ...items: Item[]) => new Container({ layout: { type: 'grid', columns: typeof columns === 'number' ? `repeat(${columns}, 1fr)` : columns }, items } as Cfg),\n panel: (title: string, items: Item[], c?: Cfg) => new Panel({ title, items, ...c } as Cfg),\n toolbar: (...items: Item[]) => new Toolbar({ items } as Cfg),\n form: (items: Item[], c?: Cfg) => new Form({ items, ...c } as Cfg),\n};\n", "// Named values for the options that are plain strings in configs. Each is a const object plus a type of the same name,\n// so `Variant.Primary` and `'primary'` are interchangeable: use whichever you like, the editor completes both.\nconst e = <T extends Record<string, string>>(o: T) => o;\n\nexport const Variant = e({ Default: 'default', Primary: 'primary', Danger: 'danger', Ghost: 'ghost' } as const);\nexport type Variant = (typeof Variant)[keyof typeof Variant];\n\nexport const LabelPos = e({ Top: 'top', Left: 'left' } as const);\nexport type LabelPos = (typeof LabelPos)[keyof typeof LabelPos];\n\nexport const Direction = e({ Vertical: 'vertical', Horizontal: 'horizontal' } as const);\nexport type Direction = (typeof Direction)[keyof typeof Direction];\n\n/** Layout `border` regions. */\nexport const Region = e({ North: 'north', South: 'south', West: 'west', East: 'east', Center: 'center' } as const);\nexport type Region = (typeof Region)[keyof typeof Region];\n\n/** Widget sides. */\nexport const Side = e({ Right: 'right', Left: 'left', Top: 'top', Bottom: 'bottom' } as const);\nexport type Side = (typeof Side)[keyof typeof Side];\n\nexport const LayoutKind = e({ Fit: 'fit', HBox: 'hbox', VBox: 'vbox', Border: 'border', Grid: 'grid', Card: 'card' } as const);\nexport type LayoutKind = (typeof LayoutKind)[keyof typeof LayoutKind];\n\nexport const Selection = e({ None: 'none', Single: 'single', Multi: 'multi' } as const);\nexport type Selection = (typeof Selection)[keyof typeof Selection];\n\nexport const ToastType = e({ Info: 'info', Success: 'success', Warning: 'warning', Error: 'error' } as const);\nexport type ToastType = (typeof ToastType)[keyof typeof ToastType];\n\n/** Filter operators (Store.filter, FilterBuilder, lookup filters). */\nexport const Op = e({\n Eq: 'eq', Ne: 'ne', Contains: 'contains', NotContains: 'notContains', StartsWith: 'startsWith', EndsWith: 'endsWith',\n Gt: 'gt', Ge: 'ge', Lt: 'lt', Le: 'le', Between: 'between', NotBetween: 'notBetween', In: 'in', Nin: 'nin', Empty: 'empty', NotEmpty: 'notEmpty',\n} as const);\nexport type Op = (typeof Op)[keyof typeof Op];\n\n/** The shipped themes (`setTheme(ThemeName.Dark)`; add `' compact'` for the dense variant). */\nexport const ThemeName = e({ Light: 'light', Dark: 'dark', Corporate: 'corporate', Brutal: 'brutal', Soft: 'soft', Terminal: 'terminal', Editorial: 'editorial', Brand: 'brand' } as const);\nexport type ThemeName = (typeof ThemeName)[keyof typeof ThemeName];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["field", "Cls", "name", "label", "c", "ui", "TextField", "TextArea", "NumberField", "DateField", "DateRangeField", "SecretField", "Slider", "boxLabel", "Checkbox", "options", "RadioGroup", "Select", "ComboBox", "query", "SuggestField", "lookup", "LookupField", "text", "handler", "Button", "items", "Container", "columns", "title", "Panel", "Toolbar", "Form", "e", "o", "Variant", "LabelPos", "Direction", "Region", "Side", "LayoutKind", "Selection", "ToastType", "Op", "ThemeName"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/layout/container/container.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container } from '../../../core/container';\nimport { register } from '../../../core/registry';\n\nexport { Container, type ContainerConfig } from '../../../core/container';\nregister('container', Container);\n"],
|
|
5
|
+
"mappings": "gFAIAA,EAAS,YAAaC,CAAS",
|
|
6
|
+
"names": ["register", "Container"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as p}from"./chunk-XZ5CUZZP.js";import{b as c}from"./chunk-676AKAGF.js";import{a as f}from"./chunk-VV7CFMPZ.js";import{b as a}from"./chunk-IYPKPLCU.js";import{e as h}from"./chunk-MA5BJL3S.js";var u={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},m={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},g=["right","left","top","bottom"],d=class extends p{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:u[o],label:h(m[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!g.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of g)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e))}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=l=>this.moveTo(l.clientX-o,l.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,c(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),this.config.autoFocus!==!1&&(f(this.getBody())[0]??e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};a("widget",d);export{d as a};
|
|
2
|
+
//# sourceMappingURL=chunk-CN7USUJR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/widget/widget.ts"],
|
|
4
|
+
"sourcesContent": ["import { Panel, type PanelConfig, type PanelTool } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { t } from '../../../core/i18n';\nimport { toLayer } from '../../../core/layer';\nimport { focusables } from '../../../core/focus';\n\nexport type WidgetSide = 'right' | 'left' | 'top' | 'bottom';\n\nexport interface WidgetConfig extends PanelConfig {\n side?: WidgetSide;\n /** Float above the page (default). `false`: an ordinary panel where the layout puts it. */\n floating?: boolean;\n /** Width on the sides, height on top/bottom (CSS length or px). */\n size?: number | string;\n /** Header buttons that let the user pick the side. */\n sideSwitcher?: boolean;\n /** Which sides the switcher offers. Default left, right, bottom. */\n sides?: WidgetSide[];\n closeOnEsc?: boolean;\n autoFocus?: boolean;\n /** The user can move it by its header (pointer drag, or Alt+arrow keys). A move frees it from the side; `setSide` docks it again. */\n draggable?: boolean;\n}\n\nconst ICON: Record<WidgetSide, string> = { left: 'chevron-left', right: 'chevron-right', top: 'chevron-up', bottom: 'chevron-down' };\nconst LABEL: Record<WidgetSide, string> = { left: 'wDockLeft', right: 'wDockRight', top: 'wDockTop', bottom: 'wDockBottom' };\nconst SIDES: WidgetSide[] = ['right', 'left', 'top', 'bottom'];\n\n/** A panel that floats over the page, attached to one edge. Not modal: the page behind stays usable. */\nexport class Widget extends Panel<WidgetConfig> {\n protected override baseCls = 'op-panel op-widget';\n private opened = false;\n private opener: Element | null = null;\n private cancelHide?: () => void;\n private userTools: number;\n private pos?: { x: number; y: number };\n\n constructor(config: WidgetConfig = {}) {\n const tools: PanelTool[] = [...(config.tools ?? [])];\n const sides = config.sides ?? (['left', 'right', 'bottom'] as WidgetSide[]);\n // `this` does not exist yet: the handlers look the widget up through the panel they receive\n if (config.sideSwitcher) for (const s of sides) tools.push({ icon: ICON[s], label: t(LABEL[s]), handler: (p) => (p as Widget).setSide(s) });\n super({ closable: true, closeAction: 'hide', floating: true, side: 'right', layout: 'fit', hidden: true, ...config, tools });\n this.userTools = config.tools?.length ?? 0;\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'complementary');\n this.el.classList.toggle('is-floating', c.floating !== false);\n if (c.sideSwitcher) {\n (c.sides ?? ['left', 'right', 'bottom']).forEach((s, i) => {\n const b = this.el.querySelectorAll<HTMLElement>('.op-panel__tool')[this.userTools + i];\n if (b) b.dataset.side = s;\n });\n }\n this.paintSide();\n if (c.size != null) this.setSize(c.size);\n if (c.draggable && c.floating !== false) this.initDrag();\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented && c.floating !== false) {\n e.stopPropagation();\n this.close();\n }\n });\n }\n\n // ---- side / size ---------------------------------------------------------------------------\n\n getSide(): WidgetSide {\n return this.config.side ?? 'right';\n }\n\n setSide(side: WidgetSide): void {\n if (side === this.getSide() || !SIDES.includes(side)) return;\n this.config.side = side;\n this.resetPosition();\n this.paintSide();\n this.emit('side-change', side);\n }\n\n private paintSide(): void {\n if (!this.rendered) return;\n const side = this.getSide();\n for (const s of SIDES) this.el.classList.toggle(`op-widget--${s}`, s === side);\n for (const b of Array.from(this.el.querySelectorAll<HTMLElement>('[data-side]'))) b.setAttribute('aria-pressed', String(b.dataset.side === side));\n }\n\n /** Where the user left it (viewport px), or undefined while it sits on its side. */\n getPosition(): { x: number; y: number } | undefined {\n return this.pos;\n }\n\n /** Puts a dragged widget back on its side. */\n resetPosition(): void {\n if (!this.pos) return;\n this.pos = undefined;\n const st = this.el.style;\n for (const k of ['inset', 'inset-inline', 'inset-block', 'left', 'top', 'width', 'height']) st.removeProperty(k);\n this.el.classList.remove('is-moved');\n this.emit('move', undefined);\n }\n\n private moveTo(x: number, y: number): void {\n const el = this.el;\n if (!this.pos) {\n // first move: pin the current size, because the side rules (insets) stop applying\n const r = el.getBoundingClientRect();\n if (r.width) {\n el.style.width = `${r.width}px`;\n el.style.height = `${r.height}px`;\n }\n el.classList.add('is-moved');\n }\n const w = el.offsetWidth || el.getBoundingClientRect().width;\n const h = el.offsetHeight || el.getBoundingClientRect().height;\n this.pos = { x: Math.max(0, Math.min(x, innerWidth - Math.min(w, innerWidth) )), y: Math.max(0, Math.min(y, innerHeight - Math.min(h, innerHeight))) };\n el.style.inset = 'auto';\n el.style.left = `${this.pos.x}px`;\n el.style.top = `${this.pos.y}px`;\n this.emit('move', this.pos);\n }\n\n private initDrag(): void {\n const head = this.headerEl;\n head.classList.add('op-widget__handle');\n head.tabIndex = 0;\n head.setAttribute('aria-roledescription', 'draggable');\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).closest('.op-panel__tool') || e.button) return;\n const r = this.el.getBoundingClientRect();\n const dx = e.clientX - r.left;\n const dy = e.clientY - r.top;\n this.el.classList.add('is-dragging');\n const move = (m: PointerEvent) => this.moveTo(m.clientX - dx, m.clientY - dy);\n const up = () => {\n this.el.classList.remove('is-dragging');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(up);\n });\n // keyboard: Alt+arrows nudge it, Alt+Home puts it back on its side\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey) return;\n const step = e.shiftKey ? 64 : 16;\n const r = this.el.getBoundingClientRect();\n const to: Record<string, [number, number]> = { ArrowLeft: [r.left - step, r.top], ArrowRight: [r.left + step, r.top], ArrowUp: [r.left, r.top - step], ArrowDown: [r.left, r.top + step] };\n if (e.key === 'Home') {\n e.preventDefault();\n this.resetPosition();\n } else if (to[e.key]) {\n e.preventDefault();\n this.moveTo(...to[e.key]);\n }\n });\n }\n\n setSize(size: number | string): void {\n this.config.size = size;\n if (this.rendered) this.el.style.setProperty('--op-widget-size', typeof size === 'number' ? `${size}px` : size);\n }\n\n // ---- open / close --------------------------------------------------------------------------\n\n isOpen(): boolean {\n return this.config.floating === false ? !this.isHidden() : this.opened;\n }\n open(): void {\n this.show();\n }\n /** Opens or closes (with no argument: the other one). `toggle()` stays the Panel's collapse. */\n setOpen(open = !this.isOpen()): void {\n if (open) this.show();\n else this.hide();\n }\n\n override show(): void {\n if (this.config.floating === false) return super.show();\n if (this.opened || this.destroyed || this.emit('before-show') === false) return;\n this.cancelHide?.();\n this.opener = document.activeElement;\n const el = this.el;\n this.opened = true;\n this.config.hidden = false;\n toLayer(el, this.opener);\n el.hidden = false;\n this.notifyMount();\n // next frame, so the slide-in transition has a starting point\n requestAnimationFrame(() => this.opened && el.classList.add('is-open'));\n if (this.config.autoFocus !== false) (focusables(this.getBody())[0] ?? el).focus();\n this.emit('show');\n }\n\n override hide(): void {\n if (this.config.floating === false) return super.hide();\n if (!this.opened || this.emit('before-hide') === false) return;\n this.opened = false;\n this.config.hidden = true;\n this.el.classList.remove('is-open');\n this.cancelHide = this.later(() => (this.el.hidden = true), 250);\n const back = this.opener;\n if (back instanceof HTMLElement && back.isConnected && this.el.contains(document.activeElement)) back.focus();\n this.emit('hide');\n }\n\n protected override onDestroy(): void {\n super.onDestroy();\n this.el.remove();\n }\n}\nregister('widget', Widget);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ICON", "LABEL", "SIDES", "Widget", "Panel", "config", "tools", "sides", "s", "t", "p", "c", "b", "e", "side", "st", "k", "x", "y", "el", "r", "w", "h", "head", "dx", "dy", "move", "m", "up", "step", "to", "size", "open", "toLayer", "focusables", "back", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as o}from"./chunk-Z25NC4CS.js";import{b as t}from"./chunk-IYPKPLCU.js";var e=class extends o{baseCls="op-field op-textfield op-picker op-select";editable(){return!1}emptyValue(){return null}isEmpty(r){return r==null||r===""}};t("select",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-CQRHNTEX.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/fields/select/select.ts"],
|
|
4
|
+
"sourcesContent": ["import { PickerField, type PickerConfig } from '../pickerfield/pickerfield';\nimport { register } from '../../../core/registry';\n\nexport interface SelectConfig<V = unknown> extends PickerConfig<V> {}\n\n/** Pick one option from a closed list. The input is read-only; letters jump to matching labels. */\nexport class Select<V = unknown> extends PickerField<V, SelectConfig<V>> {\n protected override baseCls = 'op-field op-textfield op-picker op-select';\n protected override editable() {\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}\nregister('select', Select);\n"],
|
|
5
|
+
"mappings": "gFAMO,IAAMA,EAAN,cAAkCC,CAAgC,CACpD,QAAU,4CACV,UAAW,CAC5B,MAAO,EACT,CACmB,YAAgB,CACjC,OAAO,IACT,CACmB,QAAQC,EAAM,CAC/B,OAAOA,GAAK,MAASA,IAAkB,EACzC,CACF,EACAC,EAAS,SAAUH,CAAM",
|
|
6
|
+
"names": ["Select", "PickerField", "v", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var g={top:"bottom",bottom:"top",left:"right",right:"left"};function x(o,e,n={}){let{offset:r=4,flip:b=!0,margin:d=8}=n,[w,a="center"]=(n.placement??"bottom-start").split("-"),t="getBoundingClientRect"in e?e.getBoundingClientRect():{left:e.x,right:e.x,top:e.y,bottom:e.y,width:0,height:0};n.matchWidth&&(o.style.minWidth=`${t.width}px`);let f=document.documentElement.clientWidth||window.innerWidth,h=document.documentElement.clientHeight||window.innerHeight,m=o.offsetWidth,s=o.offsetHeight,u=c=>c==="bottom"?t.bottom+r+s<=h-d:c==="top"?t.top-r-s>=d:c==="right"?t.right+r+m<=f-d:t.left-r-m>=d,i=w;b&&!u(i)&&u(g[i])&&(i=g[i]);let l,p;i==="bottom"||i==="top"?(p=i==="bottom"?t.bottom+r:t.top-r-s,l=a==="start"?t.left:a==="end"?t.right-m:t.left+(t.width-m)/2):(l=i==="right"?t.right+r:t.left-r-m,p=a==="start"?t.top:a==="end"?t.bottom-s:t.top+(t.height-s)/2),l=Math.max(d,Math.min(l,f-m-d)),p=Math.max(d,Math.min(p,h-s-d)),o.style.left=`${l}px`,o.style.top=`${p}px`,o.dataset.side=i}function v(o){let e=!1,n=()=>{e||(e=!0,requestAnimationFrame(()=>{e=!1,o()}))};return window.addEventListener("scroll",n,!0),window.addEventListener("resize",n),()=>{window.removeEventListener("scroll",n,!0),window.removeEventListener("resize",n)}}export{x as a,v as b};
|
|
2
|
+
//# sourceMappingURL=chunk-CUPAPOKC.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/position.ts"],
|
|
4
|
+
"sourcesContent": ["export type Side = 'top' | 'bottom' | 'left' | 'right';\nexport type Placement = Side | `${Side}-start` | `${Side}-end`;\n\nexport interface PlaceOptions {\n placement?: Placement;\n offset?: number;\n flip?: boolean;\n matchWidth?: boolean;\n margin?: number;\n}\n\nconst opposite: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\n/** Positions a floating element (`position: fixed`) next to an anchor element or a point, flipping and clamping to the viewport. */\nexport function place(el: HTMLElement, anchor: Element | { x: number; y: number }, o: PlaceOptions = {}): void {\n const { offset = 4, flip = true, margin = 8 } = o;\n const [side0, align = 'center'] = (o.placement ?? 'bottom-start').split('-') as [Side, string?];\n const a = 'getBoundingClientRect' in anchor ? anchor.getBoundingClientRect() : { left: anchor.x, right: anchor.x, top: anchor.y, bottom: anchor.y, width: 0, height: 0 };\n if (o.matchWidth) el.style.minWidth = `${a.width}px`;\n const vw = document.documentElement.clientWidth || window.innerWidth;\n const vh = document.documentElement.clientHeight || window.innerHeight;\n const w = el.offsetWidth;\n const hgt = el.offsetHeight;\n\n const fits = (s: Side) =>\n s === 'bottom' ? a.bottom + offset + hgt <= vh - margin : s === 'top' ? a.top - offset - hgt >= margin : s === 'right' ? a.right + offset + w <= vw - margin : a.left - offset - w >= margin;\n let side = side0;\n if (flip && !fits(side) && fits(opposite[side])) side = opposite[side];\n\n let left: number;\n let top: number;\n if (side === 'bottom' || side === 'top') {\n top = side === 'bottom' ? a.bottom + offset : a.top - offset - hgt;\n left = align === 'start' ? a.left : align === 'end' ? a.right - w : a.left + (a.width - w) / 2;\n } else {\n left = side === 'right' ? a.right + offset : a.left - offset - w;\n top = align === 'start' ? a.top : align === 'end' ? a.bottom - hgt : a.top + (a.height - hgt) / 2;\n }\n left = Math.max(margin, Math.min(left, vw - w - margin));\n top = Math.max(margin, Math.min(top, vh - hgt - margin));\n el.style.left = `${left}px`;\n el.style.top = `${top}px`;\n el.dataset.side = side;\n}\n\n/** Calls `fn` (throttled to a frame) on any scroll or resize. Returns the cleanup function. */\nexport function track(fn: () => void): () => void {\n let queued = false;\n const run = () => {\n if (queued) return;\n queued = true;\n requestAnimationFrame(() => {\n queued = false;\n fn();\n });\n };\n window.addEventListener('scroll', run, true);\n window.addEventListener('resize', run);\n return () => {\n window.removeEventListener('scroll', run, true);\n window.removeEventListener('resize', run);\n };\n}\n"],
|
|
5
|
+
"mappings": "AAWA,IAAMA,EAA+B,CAAE,IAAK,SAAU,OAAQ,MAAO,KAAM,QAAS,MAAO,MAAO,EAG3F,SAASC,EAAMC,EAAiBC,EAA4CC,EAAkB,CAAC,EAAS,CAC7G,GAAM,CAAE,OAAAC,EAAS,EAAG,KAAAC,EAAO,GAAM,OAAAC,EAAS,CAAE,EAAIH,EAC1C,CAACI,EAAOC,EAAQ,QAAQ,GAAKL,EAAE,WAAa,gBAAgB,MAAM,GAAG,EACrEM,EAAI,0BAA2BP,EAASA,EAAO,sBAAsB,EAAI,CAAE,KAAMA,EAAO,EAAG,MAAOA,EAAO,EAAG,IAAKA,EAAO,EAAG,OAAQA,EAAO,EAAG,MAAO,EAAG,OAAQ,CAAE,EACnKC,EAAE,aAAYF,EAAG,MAAM,SAAW,GAAGQ,EAAE,KAAK,MAChD,IAAMC,EAAK,SAAS,gBAAgB,aAAe,OAAO,WACpDC,EAAK,SAAS,gBAAgB,cAAgB,OAAO,YACrDC,EAAIX,EAAG,YACPY,EAAMZ,EAAG,aAETa,EAAQC,GACZA,IAAM,SAAWN,EAAE,OAASL,EAASS,GAAOF,EAAKL,EAASS,IAAM,MAAQN,EAAE,IAAML,EAASS,GAAOP,EAASS,IAAM,QAAUN,EAAE,MAAQL,EAASQ,GAAKF,EAAKJ,EAASG,EAAE,KAAOL,EAASQ,GAAKN,EACpLU,EAAOT,EACPF,GAAQ,CAACS,EAAKE,CAAI,GAAKF,EAAKf,EAASiB,CAAI,CAAC,IAAGA,EAAOjB,EAASiB,CAAI,GAErE,IAAIC,EACAC,EACAF,IAAS,UAAYA,IAAS,OAChCE,EAAMF,IAAS,SAAWP,EAAE,OAASL,EAASK,EAAE,IAAML,EAASS,EAC/DI,EAAOT,IAAU,QAAUC,EAAE,KAAOD,IAAU,MAAQC,EAAE,MAAQG,EAAIH,EAAE,MAAQA,EAAE,MAAQG,GAAK,IAE7FK,EAAOD,IAAS,QAAUP,EAAE,MAAQL,EAASK,EAAE,KAAOL,EAASQ,EAC/DM,EAAMV,IAAU,QAAUC,EAAE,IAAMD,IAAU,MAAQC,EAAE,OAASI,EAAMJ,EAAE,KAAOA,EAAE,OAASI,GAAO,GAElGI,EAAO,KAAK,IAAIX,EAAQ,KAAK,IAAIW,EAAMP,EAAKE,EAAIN,CAAM,CAAC,EACvDY,EAAM,KAAK,IAAIZ,EAAQ,KAAK,IAAIY,EAAKP,EAAKE,EAAMP,CAAM,CAAC,EACvDL,EAAG,MAAM,KAAO,GAAGgB,CAAI,KACvBhB,EAAG,MAAM,IAAM,GAAGiB,CAAG,KACrBjB,EAAG,QAAQ,KAAOe,CACpB,CAGO,SAASG,EAAMC,EAA4B,CAChD,IAAIC,EAAS,GACPC,EAAM,IAAM,CACZD,IACJA,EAAS,GACT,sBAAsB,IAAM,CAC1BA,EAAS,GACTD,EAAG,CACL,CAAC,EACH,EACA,cAAO,iBAAiB,SAAUE,EAAK,EAAI,EAC3C,OAAO,iBAAiB,SAAUA,CAAG,EAC9B,IAAM,CACX,OAAO,oBAAoB,SAAUA,EAAK,EAAI,EAC9C,OAAO,oBAAoB,SAAUA,CAAG,CAC1C,CACF",
|
|
6
|
+
"names": ["opposite", "place", "el", "anchor", "o", "offset", "flip", "margin", "side0", "align", "a", "vw", "vh", "w", "hgt", "fits", "s", "side", "left", "top", "track", "fn", "queued", "run"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as l}from"./chunk-Z25NC4CS.js";import{c as a}from"./chunk-IHAYOSBR.js";import{b as h}from"./chunk-IYPKPLCU.js";import{b as s}from"./chunk-PZSHOSOS.js";import{e as o}from"./chunk-MA5BJL3S.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-DXO3UJKL.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{c}from"./chunk-IHAYOSBR.js";import{a as d,b as p}from"./chunk-IYPKPLCU.js";import{b as a}from"./chunk-PZSHOSOS.js";var l=class extends d{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;onRender(){let e=this.config;this.items=e.items??[],this.active=e.active;let t=i=>i.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&t(s.items)));t(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",i=>{let s=i.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",i=>this.onKey(i)),this.listen(this.root,"focusin",i=>{let s=i.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,t=this.items){for(let i of t){if(i.id===e)return i;let s=i.items&&this.getItem(e,i.items);if(s)return s}}parentsOf(e,t=this.items,i=[]){for(let s of t){if(s.id===e)return i;let n=s.items&&this.parentsOf(e,s.items,[...i,s]);if(n)return n}}openParents(e){for(let t of this.parentsOf(e)??[])this.open.add(t.id)}matches(e,t){return e.text.toLowerCase().includes(t)||!!e.items?.some(i=>this.matches(i,t))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(t=>this.visible(t))}isOpen(e){return this.query||this.config.collapsed?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(i=>this.visible(i)).map(i=>this.node(i,1)));let t=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(i=>i.tabIndex=i===t?0:-1)}node(e,t){let i=!!e.items,s=i&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),o=a("div",`op-navmenu__item${i?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":t,"aria-expanded":i?String(s):null,"aria-current":e.id===this.active?"page":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return o.style.setProperty("--_level",String(t-1)),o.append(a("span","op-navmenu__icon",{},e.icon?c(e.icon):""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&o.append(a("span","op-navmenu__badge",{},String(e.badge))),i&&o.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},c("chevron-down"))),r.append(o),i&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(h=>this.visible(h)).map(h=>this.node(h,t+1)))),r}activate(e){let t=this.getItem(e);if(!(!t||t.disabled)){if(t.items)return this.toggle(e);this.select(e)}}select(e){let t=this.getItem(e);!t||t.disabled||this.emit("before-select",t)===!1||(this.setActive(e),this.emit("select",t))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let t=this.getItem(e);if(!(!t?.items||this.open.has(e))){if(this.config.accordion)for(let i of this.siblings(e))this.open.delete(i.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",t)}}collapse(e){let t=this.getItem(e);!t?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",t))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let t=this.parentsOf(e)??[];return(t.length?t[t.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=t=>t.forEach(i=>i.items&&(this.open.add(i.id),e(i.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=e,this.config.items=e,this.rendered&&this.paint()}updateItem(e,t){let i=this.getItem(e);i&&(Object.assign(i,t),this.rendered&&this.paint())}setCollapsed(e){this.config.collapsed=e,this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(t=>t.tabIndex=t===e?0:-1),e.focus())}onKey(e){let t=e.target.closest(".op-navmenu__item");if(!t)return;let i=this.rows(),s=i.indexOf(t),n=this.getItem(t.dataset.id),r=t.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(i[s+1]);break;case"ArrowUp":this.focusRow(i[s-1]);break;case"Home":this.focusRow(i[0]);break;case"End":this.focusRow(i[i.length-1]);break;case"ArrowRight":n.items&&!r?this.expand(n.id):n.items&&this.focusRow(i[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let h=this.parentsOf(n.id)?.pop();h&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(h.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}e.preventDefault(),this.focusId=document.activeElement?.dataset?.id??n.id;let o=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);o&&document.activeElement!==o&&this.focusRow(o)}};p("navmenu",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-GZNQPENR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/navigation/navmenu/navmenu.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n\n protected override onRender() {\n const c = this.config;\n this.items = c.items ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n return this.query || this.config.collapsed ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = items;\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["NavMenu", "Component", "c", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "collapsed", "text", "rows", "item", "parent", "again", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as b}from"./chunk-UPOBGNJ5.js";import{c as h}from"./chunk-VV7CFMPZ.js";import{c}from"./chunk-IHAYOSBR.js";import{b as p}from"./chunk-IYPKPLCU.js";import{b as r}from"./chunk-PZSHOSOS.js";import{e as l}from"./chunk-MA5BJL3S.js";var d=class extends b{baseCls="op-tabs";barEl;panelsEl;tabs=new Map;pending=new Set;rover;constructor(t={}){super({defaultType:"container",...t})}getBody(){return this.panelsEl}build(){let t=this.config.position==="left",e=r("div",`op-tabs${t?" op-tabs--left":""}`);return this.barEl=r("div","op-tabs__bar",{role:"tablist","aria-orientation":t?"vertical":"horizontal"}),this.panelsEl=r("div","op-tabs__panels"),e.append(this.barEl,this.panelsEl),e}onRender(){let t=this.config;t.layout={type:"card",activeItem:t.active??0},this.items.forEach(e=>this.addHeader(e)),this.rover=h(this.barEl,{selector:"[role=tab]",orientation:t.position==="left"?"vertical":"horizontal",onMove:e=>this.setActive(this.items.find(i=>this.tabs.get(i)===e))}),this.own(()=>this.rover?.destroy()),this.on("activate",e=>this.syncHeaders(e)),this.listen(this.barEl,"click",e=>{let i=e.target,s=i.closest("[role=tab]"),o=this.items.find(n=>this.tabs.get(n)===s);o&&(i.closest(".op-tabs__close")?this.closeTab(o):this.setActive(o))}),this.listen(this.barEl,"keydown",e=>{let i=this.items.find(s=>this.tabs.get(s)===e.target.closest("[role=tab]"));e.key==="Delete"&&i&&this.closeTab(i)}),super.onRender()}forcing;attach(t,e){if(this.config.lazy!==!1&&t!==this.getActiveItem()&&t!==this.forcing){this.pending.add(t);return}super.attach(t,e),t.el.setAttribute("role","tabpanel");let i=this.tabs.get(t);i&&(t.el.setAttribute("aria-labelledby",i.id),i.setAttribute("aria-controls",t.el.id))}ensure(t){this.pending.delete(t)&&(this.forcing=t,this.attach(t,this.items.indexOf(t)),this.forcing=void 0)}tabConfig(t){let e=t.config;return{title:e.title??"",icon:e.icon,closable:e.closable??this.config.closable??!1,disabled:!!e.disabled}}addHeader(t){let{title:e,icon:i,closable:s,disabled:o}=this.tabConfig(t),n=r("div","op-tabs__tab",{role:"tab",id:`${t.id}-tab`,tabindex:-1,"aria-selected":"false","aria-disabled":o?"true":null});n.append(i?c(i):"",r("span","op-tabs__title",{},e)),s&&n.append(r("span","op-tabs__close",{"aria-hidden":"true","data-op-tip":l("close")},c("x"))),this.tabs.set(t,n),this.barEl.append(...[...this.items].filter(a=>this.tabs.has(a)).map(a=>this.tabs.get(a)))}syncHeaders(t){for(let[i,s]of this.tabs){let o=i===t;s.setAttribute("aria-selected",String(o)),s.classList.toggle("is-active",o)}let e=t&&this.tabs.get(t);this.rover?.sync(e||void 0)}getActive(){return this.getActiveItem()}setActive(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(s=>s.id===t):t,i=this.getActiveItem();!e||e===i||this.tabConfig(e).disabled||this.emit("before-change",e,i)!==!1&&(this.ensure(e),this.setActiveItem(e),this.emit("change",e,this.items.indexOf(e)))}insert(t,e){let i=super.insert(t,e);return this.rendered&&(this.addHeader(i),this.ensure(i),this.setActive(i)),i}closeTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(i=>i.id===t):t;!e||this.emit("before-close",e)===!1||(this.remove(e),this.emit("close",e))}remove(t,e=!0){let i=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(n=>n.id===t):t,s=i&&this.tabs.get(i)?.contains(document.activeElement),o=super.remove(t,e);if(i){this.tabs.get(i)?.remove(),this.tabs.delete(i),this.pending.delete(i);let n=this.getActiveItem();n&&this.ensure(n),s&&n&&this.tabs.get(n)?.focus()}return o}setTabState(t,e){let i=this.tabs.get(t);if(!i)return;i.classList.toggle("has-error",!!e.errors),i.classList.toggle("is-dirty",!!e.dirty);let s=i.querySelector(".op-tabs__badge");if(!e.errors)return s?.remove();s||(s=r("span","op-tabs__badge"),i.insertBefore(s,i.querySelector(".op-tabs__close"))),s.replaceChildren(String(e.errors),r("span","op-sr-only",{},` ${l("tabErrors")}`))}setTitle(t,e){t.config.title=e;let i=this.tabs.get(t)?.querySelector(".op-tabs__title");i&&(i.textContent=e)}};p("tabs",d);export{d as a};
|
|
2
|
+
//# sourceMappingURL=chunk-HFFK6K4K.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/navigation/tabs/tabs.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Component } from '../../../core/component';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface TabsConfig extends ContainerConfig {\n /** Initially active tab (index or id). */\n active?: number | string;\n position?: 'top' | 'left';\n /** Build a panel's DOM only the first time its tab is activated. Default true. */\n lazy?: boolean;\n /** Default `closable` for tabs. */\n closable?: boolean;\n}\n\n/**\n * Items are the panels. Each may carry `title`, `icon`, `closable` and `disabled` for its tab header.\n * Tabs reuse the `card` layout of Container for the panels.\n */\nexport class Tabs extends Container<TabsConfig> {\n protected override baseCls = 'op-tabs';\n private barEl!: HTMLElement;\n private panelsEl!: HTMLElement;\n private tabs = new Map<Component, HTMLElement>();\n private pending = new Set<Component>();\n private rover?: ReturnType<typeof roving>;\n\n constructor(config: TabsConfig = {}) {\n super({ defaultType: 'container', ...config });\n }\n\n override getBody() {\n return this.panelsEl;\n }\n\n protected override build() {\n const left = this.config.position === 'left';\n const el = h('div', `op-tabs${left ? ' op-tabs--left' : ''}`);\n this.barEl = h('div', 'op-tabs__bar', { role: 'tablist', 'aria-orientation': left ? 'vertical' : 'horizontal' });\n this.panelsEl = h('div', 'op-tabs__panels');\n el.append(this.barEl, this.panelsEl);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout = { type: 'card', activeItem: c.active ?? 0 };\n this.items.forEach((p) => this.addHeader(p));\n this.rover = roving(this.barEl, {\n selector: '[role=tab]',\n orientation: c.position === 'left' ? 'vertical' : 'horizontal',\n onMove: (tab) => this.setActive(this.items.find((p) => this.tabs.get(p) === tab)!),\n });\n this.own(() => this.rover?.destroy());\n this.on('activate', (p?: Component) => this.syncHeaders(p));\n this.listen(this.barEl, 'click', (e: Event) => {\n const target = e.target as HTMLElement;\n const tab = target.closest<HTMLElement>('[role=tab]');\n const panel = this.items.find((p) => this.tabs.get(p) === tab);\n if (!panel) return;\n if (target.closest('.op-tabs__close')) this.closeTab(panel);\n else this.setActive(panel);\n });\n this.listen(this.barEl, 'keydown', (e: KeyboardEvent) => {\n const panel = this.items.find((p) => this.tabs.get(p) === (e.target as HTMLElement).closest('[role=tab]'));\n if (e.key === 'Delete' && panel) this.closeTab(panel);\n });\n super.onRender();\n }\n\n private forcing?: Component;\n\n /** Lazy panels (everything but the active one) are attached the first time they are activated. */\n protected override attach(p: Component, index: number) {\n if (this.config.lazy !== false && p !== this.getActiveItem() && p !== this.forcing) {\n this.pending.add(p);\n return;\n }\n super.attach(p, index);\n p.el.setAttribute('role', 'tabpanel');\n const tab = this.tabs.get(p);\n if (tab) {\n p.el.setAttribute('aria-labelledby', tab.id);\n tab.setAttribute('aria-controls', p.el.id);\n }\n }\n\n /** Builds a pending panel's DOM now. */\n private ensure(p: Component) {\n if (!this.pending.delete(p)) return;\n this.forcing = p;\n this.attach(p, this.items.indexOf(p));\n this.forcing = undefined;\n }\n\n private tabConfig(p: Component) {\n const c = p.config as AnyConfig;\n return { title: (c.title as string) ?? '', icon: c.icon as string | undefined, closable: (c.closable as boolean) ?? this.config.closable ?? false, disabled: !!c.disabled };\n }\n\n private addHeader(p: Component) {\n const { title, icon, closable, disabled } = this.tabConfig(p);\n const tab = h('div', 'op-tabs__tab', { role: 'tab', id: `${p.id}-tab`, tabindex: -1, 'aria-selected': 'false', 'aria-disabled': disabled ? 'true' : null });\n tab.append(icon ? iconEl(icon) : '', h('span', 'op-tabs__title', {}, title));\n if (closable) tab.append(h('span', 'op-tabs__close', { 'aria-hidden': 'true', 'data-op-tip': t('close') }, iconEl('x')));\n this.tabs.set(p, tab);\n this.barEl.append(...[...this.items].filter((x) => this.tabs.has(x)).map((x) => this.tabs.get(x)!));\n }\n\n private syncHeaders(active?: Component) {\n for (const [p, tab] of this.tabs) {\n const on = p === active;\n tab.setAttribute('aria-selected', String(on));\n tab.classList.toggle('is-active', on);\n }\n const tab = active && this.tabs.get(active);\n this.rover?.sync(tab || undefined);\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n getActive(): Component | undefined {\n return this.getActiveItem();\n }\n\n /** Activates a tab (instance, id or index). `before-change` can cancel. */\n setActive(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const prev = this.getActiveItem();\n if (!p || p === prev || this.tabConfig(p).disabled) return;\n if (this.emit('before-change', p, prev) === false) return;\n this.ensure(p);\n this.setActiveItem(p);\n this.emit('change', p, this.items.indexOf(p));\n }\n\n override insert(index: number, item: AnyConfig | Component | string): Component {\n const p = super.insert(index, item);\n if (this.rendered) {\n this.addHeader(p);\n this.ensure(p); // a tab added after render becomes the active one right away\n this.setActive(p);\n }\n return p;\n }\n\n /** Closes a tab (`before-close` can cancel). The neighbor becomes active. */\n closeTab(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n if (!p || this.emit('before-close', p) === false) return;\n this.remove(p);\n this.emit('close', p);\n }\n\n override remove(child: Component | string | number, destroy = true): Component | undefined {\n const p = typeof child === 'number' ? this.items[child] : typeof child === 'string' ? this.items.find((x) => x.id === child) : child;\n const hadFocus = p && this.tabs.get(p)?.contains(document.activeElement);\n const removed = super.remove(child, destroy);\n if (p) {\n this.tabs.get(p)?.remove();\n this.tabs.delete(p);\n this.pending.delete(p);\n const active = this.getActiveItem();\n if (active) this.ensure(active);\n if (hadFocus && active) this.tabs.get(active)?.focus();\n }\n return removed;\n }\n\n /** Marks a tab header: a badge with the number of errors in its panel and a dot while something in it changed. */\n setTabState(tab: Component, state: { errors?: number; dirty?: boolean }): void {\n const el = this.tabs.get(tab);\n if (!el) return;\n el.classList.toggle('has-error', !!state.errors);\n el.classList.toggle('is-dirty', !!state.dirty);\n let badge = el.querySelector<HTMLElement>('.op-tabs__badge');\n if (!state.errors) return badge?.remove();\n if (!badge) {\n badge = h('span', 'op-tabs__badge');\n el.insertBefore(badge, el.querySelector('.op-tabs__close'));\n }\n badge.replaceChildren(String(state.errors), h('span', 'op-sr-only', {}, ` ${t('tabErrors')}`));\n }\n\n setTitle(tab: Component, title: string) {\n (tab.config as AnyConfig).title = title;\n const el = this.tabs.get(tab)?.querySelector('.op-tabs__title');\n if (el) el.textContent = title;\n }\n}\nregister('tabs', Tabs);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Tabs", "Container", "config", "left", "el", "h", "c", "p", "roving", "tab", "target", "panel", "index", "title", "icon", "closable", "disabled", "iconEl", "t", "x", "active", "on", "prev", "item", "child", "destroy", "hadFocus", "removed", "state", "badge", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as l,b as h}from"./chunk-IYPKPLCU.js";import{b as M}from"./chunk-PZSHOSOS.js";var e=r=>`<path d="${r}"/>`,n={"chevron-down":e("m6 9 6 6 6-6"),"chevron-up":e("m18 15-6-6-6 6"),"chevron-left":e("m15 18-6-6 6-6"),"chevron-right":e("m9 18 6-6-6-6"),"chevrons-left":e("m11 17-5-5 5-5M18 17l-5-5 5-5"),"chevrons-right":e("m6 17 5-5-5-5M13 17l5-5-5-5"),x:e("M18 6 6 18M6 6l12 12"),check:e("M20 6 9 17l-5-5"),plus:e("M5 12h14M12 5v14"),minus:e("M5 12h14"),search:'<circle cx="11" cy="11" r="8"/>'+e("m21 21-4.3-4.3"),calendar:'<rect x="3" y="4" width="18" height="18" rx="2"/>'+e("M16 2v4M8 2v4M3 10h18"),info:'<circle cx="12" cy="12" r="10"/>'+e("M12 16v-4M12 8h.01"),alert:e("m21.7 18-8-14a2 2 0 0 0-3.5 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3ZM12 9v4M12 17h.01"),error:'<circle cx="12" cy="12" r="10"/>'+e("m15 9-6 6M9 9l6 6"),success:'<circle cx="12" cy="12" r="10"/>'+e("m9 12 2 2 4-4"),menu:e("M4 6h16M4 12h16M4 18h16"),"arrow-up":e("m5 12 7-7 7 7M12 19V5"),"arrow-down":e("M12 5v14M19 12l-7 7-7-7"),columns:'<rect x="3" y="3" width="18" height="18" rx="2"/>'+e("M9 3v18M15 3v18"),filter:e("M22 3H2l8 9.5V19l4 2v-8.5z"),send:e("m22 2-7 20-4-9-9-4zM22 2 11 13"),sparkles:e("M12 3l1.9 5.6L19.5 10.5l-5.6 1.9L12 18l-1.9-5.6L4.5 10.5l5.6-1.9zM19 3v4M21 5h-4M5 17v4M7 19H3"),file:e("M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 13h8M8 17h8"),box:e("M21 8 12 3 3 8v8l9 5 9-5zM3 8l9 5 9-5M12 13v8"),truck:e("M1 3h15v13H1zM16 8h4l3 3v5h-7")+'<circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/>',clock:'<circle cx="12" cy="12" r="10"/>'+e("M12 6v6l4 2"),shield:e("M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"),list:e("M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"),eye:e("M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12z")+'<circle cx="12" cy="12" r="3"/>',"eye-off":e("M17.9 17.9A10.1 10.1 0 0 1 12 19c-6.4 0-10-7-10-7a18.5 18.5 0 0 1 5.1-5.9M9.9 5.2A9.7 9.7 0 0 1 12 5c6.4 0 10 7 10 7a18.5 18.5 0 0 1-2.2 3.2M14.1 14.1a3 3 0 1 1-4.2-4.2M2 2l20 20"),heart:e("M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z"),image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/>'+e("m21 15-5-5L5 21"),cloud:e("M18 10h-1.3A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"),folder:e("M4 4h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"),share:e("M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M16 6l-4-4-4 4M12 2v14"),message:e("M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"),more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',user:e("M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2")+'<circle cx="12" cy="7" r="4"/>',home:e("m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM9 22V12h6v10"),trash:e("M3 6h18M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2"),edit:e("M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"),sun:'<circle cx="12" cy="12" r="4"/>'+e("M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"),moon:e("M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"),bell:e("M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.9 1.9 0 0 0 3.4 0"),chart:e("M3 3v18h18M19 9l-5 5-4-4-3 3"),settings:'<circle cx="12" cy="12" r="3"/>'+e("M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9 7 7M17 17l2.1 2.1M4.9 19.1 7 17M17 7l2.1-2.1"),users:e("M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M23 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8")+'<circle cx="9" cy="7" r="4"/>'};function m(r){Object.assign(n,r)}var d=r=>r in n;function x(r,c){let t=M("span","op-icon");return i(t,r,c),t}function i(r,c,t){c&&!(c in n)&&console.warn(`Optikos: unknown icon "${c}" (register it with registerIcons)`);let o=n[c]??"";r.innerHTML=o.startsWith("<svg")?o:`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${o}</svg>`,t?(r.setAttribute("role","img"),r.setAttribute("aria-label",t),r.removeAttribute("aria-hidden")):(r.setAttribute("aria-hidden","true"),r.removeAttribute("role"),r.removeAttribute("aria-label"))}var s=class extends l{baseCls="op-icon";tag="span";onRender(){i(this.el,this.config.name??"",this.config.label)}setName(c){this.config.name=c,this.rendered&&i(this.el,c,this.config.label)}setLabel(c){this.config.label=c,this.rendered&&i(this.el,this.config.name??"",c)}};h("icon",s);export{m as a,d as b,x as c,s as d};
|
|
2
|
+
//# sourceMappingURL=chunk-IHAYOSBR.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/base/icon/icon.ts"],
|
|
4
|
+
"sourcesContent": ["// Built-in icon paths come from Lucide (ISC) and Feather (MIT); see THIRD_PARTY_NOTICES.md.\nimport { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\n\nconst s = (d: string) => `<path d=\"${d}\"/>`;\nconst icons: Record<string, string> = {\n 'chevron-down': s('m6 9 6 6 6-6'),\n 'chevron-up': s('m18 15-6-6-6 6'),\n 'chevron-left': s('m15 18-6-6 6-6'),\n 'chevron-right': s('m9 18 6-6-6-6'),\n 'chevrons-left': s('m11 17-5-5 5-5M18 17l-5-5 5-5'),\n 'chevrons-right': s('m6 17 5-5-5-5M13 17l5-5-5-5'),\n x: s('M18 6 6 18M6 6l12 12'),\n check: s('M20 6 9 17l-5-5'),\n plus: s('M5 12h14M12 5v14'),\n minus: s('M5 12h14'),\n search: '<circle cx=\"11\" cy=\"11\" r=\"8\"/>' + s('m21 21-4.3-4.3'),\n calendar: '<rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"/>' + s('M16 2v4M8 2v4M3 10h18'),\n info: '<circle cx=\"12\" cy=\"12\" r=\"10\"/>' + s('M12 16v-4M12 8h.01'),\n alert: s('m21.7 18-8-14a2 2 0 0 0-3.5 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3ZM12 9v4M12 17h.01'),\n error: '<circle cx=\"12\" cy=\"12\" r=\"10\"/>' + s('m15 9-6 6M9 9l6 6'),\n success: '<circle cx=\"12\" cy=\"12\" r=\"10\"/>' + s('m9 12 2 2 4-4'),\n menu: s('M4 6h16M4 12h16M4 18h16'),\n 'arrow-up': s('m5 12 7-7 7 7M12 19V5'),\n 'arrow-down': s('M12 5v14M19 12l-7 7-7-7'),\n columns: '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/>' + s('M9 3v18M15 3v18'),\n filter: s('M22 3H2l8 9.5V19l4 2v-8.5z'),\n send: s('m22 2-7 20-4-9-9-4zM22 2 11 13'),\n sparkles: s('M12 3l1.9 5.6L19.5 10.5l-5.6 1.9L12 18l-1.9-5.6L4.5 10.5l5.6-1.9zM19 3v4M21 5h-4M5 17v4M7 19H3'),\n file: s('M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 13h8M8 17h8'),\n box: s('M21 8 12 3 3 8v8l9 5 9-5zM3 8l9 5 9-5M12 13v8'),\n truck: s('M1 3h15v13H1zM16 8h4l3 3v5h-7') + '<circle cx=\"5.5\" cy=\"18.5\" r=\"2.5\"/><circle cx=\"18.5\" cy=\"18.5\" r=\"2.5\"/>',\n clock: '<circle cx=\"12\" cy=\"12\" r=\"10\"/>' + s('M12 6v6l4 2'),\n shield: s('M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'),\n list: s('M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01'),\n eye: s('M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12z') + '<circle cx=\"12\" cy=\"12\" r=\"3\"/>',\n 'eye-off': s('M17.9 17.9A10.1 10.1 0 0 1 12 19c-6.4 0-10-7-10-7a18.5 18.5 0 0 1 5.1-5.9M9.9 5.2A9.7 9.7 0 0 1 12 5c6.4 0 10 7 10 7a18.5 18.5 0 0 1-2.2 3.2M14.1 14.1a3 3 0 1 1-4.2-4.2M2 2l20 20'),\n heart: s('M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z'),\n image: '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"9\" cy=\"9\" r=\"2\"/>' + s('m21 15-5-5L5 21'),\n cloud: s('M18 10h-1.3A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z'),\n folder: s('M4 4h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z'),\n share: s('M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M16 6l-4-4-4 4M12 2v14'),\n message: s('M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'),\n more: '<circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/>',\n user: s('M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2') + '<circle cx=\"12\" cy=\"7\" r=\"4\"/>',\n home: s('m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM9 22V12h6v10'),\n trash: s('M3 6h18M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2'),\n edit: s('M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z'),\n sun: '<circle cx=\"12\" cy=\"12\" r=\"4\"/>' + s('M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4'),\n moon: s('M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'),\n bell: s('M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.9 1.9 0 0 0 3.4 0'),\n chart: s('M3 3v18h18M19 9l-5 5-4-4-3 3'),\n settings: '<circle cx=\"12\" cy=\"12\" r=\"3\"/>' + s('M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9 7 7M17 17l2.1 2.1M4.9 19.1 7 17M17 7l2.1-2.1'),\n users: s('M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M23 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8') + '<circle cx=\"9\" cy=\"7\" r=\"4\"/>',\n};\n\n/** Registers icons by name. A value is either SVG inner markup (24\u00D724 viewBox, stroke style) or a full `<svg>` string. Trusted: comes from your code. */\nexport function registerIcons(map: Record<string, string>): void {\n Object.assign(icons, map);\n}\n\nexport const hasIcon = (name: string): boolean => name in icons;\n\n/** A `<span class=\"op-icon\">` holding the SVG. Decorative unless `label` is given. */\nexport function iconEl(name: string, label?: string): HTMLElement {\n const el = h('span', 'op-icon');\n setIcon(el, name, label);\n return el;\n}\n\nfunction setIcon(el: HTMLElement, name: string, label?: string) {\n if (name && !(name in icons)) console.warn(`Optikos: unknown icon \"${name}\" (register it with registerIcons)`);\n const svg = icons[name] ?? '';\n el.innerHTML = svg.startsWith('<svg') ? svg : `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">${svg}</svg>`;\n if (label) {\n el.setAttribute('role', 'img');\n el.setAttribute('aria-label', label);\n el.removeAttribute('aria-hidden');\n } else {\n el.setAttribute('aria-hidden', 'true');\n el.removeAttribute('role');\n el.removeAttribute('aria-label');\n }\n}\n\nexport interface IconConfig extends ComponentConfig {\n name?: string;\n label?: string;\n}\n\nexport class Icon extends Component<IconConfig> {\n protected override baseCls = 'op-icon';\n protected override tag = 'span' as const;\n protected override onRender() {\n setIcon(this.el, this.config.name ?? '', this.config.label);\n }\n setName(name: string) {\n this.config.name = name;\n if (this.rendered) setIcon(this.el, name, this.config.label);\n }\n setLabel(label: string) {\n this.config.label = label;\n if (this.rendered) setIcon(this.el, this.config.name ?? '', label);\n }\n}\nregister('icon', Icon);\n"],
|
|
5
|
+
"mappings": "uFAKA,IAAMA,EAAKC,GAAc,YAAYA,CAAC,MAChCC,EAAgC,CACpC,eAAgBF,EAAE,cAAc,EAChC,aAAcA,EAAE,gBAAgB,EAChC,eAAgBA,EAAE,gBAAgB,EAClC,gBAAiBA,EAAE,eAAe,EAClC,gBAAiBA,EAAE,+BAA+B,EAClD,iBAAkBA,EAAE,6BAA6B,EACjD,EAAGA,EAAE,sBAAsB,EAC3B,MAAOA,EAAE,iBAAiB,EAC1B,KAAMA,EAAE,kBAAkB,EAC1B,MAAOA,EAAE,UAAU,EACnB,OAAQ,kCAAoCA,EAAE,gBAAgB,EAC9D,SAAU,oDAAsDA,EAAE,uBAAuB,EACzF,KAAM,mCAAqCA,EAAE,oBAAoB,EACjE,MAAOA,EAAE,yFAAyF,EAClG,MAAO,mCAAqCA,EAAE,mBAAmB,EACjE,QAAS,mCAAqCA,EAAE,eAAe,EAC/D,KAAMA,EAAE,yBAAyB,EACjC,WAAYA,EAAE,uBAAuB,EACrC,aAAcA,EAAE,yBAAyB,EACzC,QAAS,oDAAsDA,EAAE,iBAAiB,EAClF,OAAQA,EAAE,4BAA4B,EACtC,KAAMA,EAAE,gCAAgC,EACxC,SAAUA,EAAE,gGAAgG,EAC5G,KAAMA,EAAE,mFAAmF,EAC3F,IAAKA,EAAE,+CAA+C,EACtD,MAAOA,EAAE,+BAA+B,EAAI,4EAC5C,MAAO,mCAAqCA,EAAE,aAAa,EAC3D,OAAQA,EAAE,6CAA6C,EACvD,KAAMA,EAAE,mDAAmD,EAC3D,IAAKA,EAAE,kDAAkD,EAAI,kCAC7D,UAAWA,EAAE,oLAAoL,EACjM,MAAOA,EAAE,kHAAkH,EAC3H,MAAO,iFAAmFA,EAAE,iBAAiB,EAC7G,MAAOA,EAAE,8CAA8C,EACvD,OAAQA,EAAE,8EAA8E,EACxF,MAAOA,EAAE,iEAAiE,EAC1E,QAASA,EAAE,+DAA+D,EAC1E,KAAM,+FACN,KAAMA,EAAE,2CAA2C,EAAI,iCACvD,KAAMA,EAAE,6DAA6D,EACrE,MAAOA,EAAE,4GAA4G,EACrH,KAAMA,EAAE,oDAAoD,EAC5D,IAAK,kCAAoCA,EAAE,oGAAoG,EAC/I,KAAMA,EAAE,oCAAoC,EAC5C,KAAMA,EAAE,uEAAuE,EAC/E,MAAOA,EAAE,8BAA8B,EACvC,SAAU,kCAAoCA,EAAE,qFAAqF,EACrI,MAAOA,EAAE,2FAA2F,EAAI,+BAC1G,EAGO,SAASG,EAAcC,EAAmC,CAC/D,OAAO,OAAOF,EAAOE,CAAG,CAC1B,CAEO,IAAMC,EAAWC,GAA0BA,KAAQJ,EAGnD,SAASK,EAAOD,EAAcE,EAA6B,CAChE,IAAMC,EAAKC,EAAE,OAAQ,SAAS,EAC9B,OAAAC,EAAQF,EAAIH,EAAME,CAAK,EAChBC,CACT,CAEA,SAASE,EAAQF,EAAiBH,EAAcE,EAAgB,CAC1DF,GAAQ,EAAEA,KAAQJ,IAAQ,QAAQ,KAAK,0BAA0BI,CAAI,oCAAoC,EAC7G,IAAMM,EAAMV,EAAMI,CAAI,GAAK,GAC3BG,EAAG,UAAYG,EAAI,WAAW,MAAM,EAAIA,EAAM,gIAAgIA,CAAG,SAC7KJ,GACFC,EAAG,aAAa,OAAQ,KAAK,EAC7BA,EAAG,aAAa,aAAcD,CAAK,EACnCC,EAAG,gBAAgB,aAAa,IAEhCA,EAAG,aAAa,cAAe,MAAM,EACrCA,EAAG,gBAAgB,MAAM,EACzBA,EAAG,gBAAgB,YAAY,EAEnC,CAOO,IAAMI,EAAN,cAAmBC,CAAsB,CAC3B,QAAU,UACV,IAAM,OACN,UAAW,CAC5BH,EAAQ,KAAK,GAAI,KAAK,OAAO,MAAQ,GAAI,KAAK,OAAO,KAAK,CAC5D,CACA,QAAQL,EAAc,CACpB,KAAK,OAAO,KAAOA,EACf,KAAK,UAAUK,EAAQ,KAAK,GAAIL,EAAM,KAAK,OAAO,KAAK,CAC7D,CACA,SAASE,EAAe,CACtB,KAAK,OAAO,MAAQA,EAChB,KAAK,UAAUG,EAAQ,KAAK,GAAI,KAAK,OAAO,MAAQ,GAAIH,CAAK,CACnE,CACF,EACAO,EAAS,OAAQF,CAAI",
|
|
6
|
+
"names": ["s", "d", "icons", "registerIcons", "map", "hasIcon", "name", "iconEl", "label", "el", "h", "setIcon", "svg", "Icon", "Component", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as n}from"./chunk-IHAYOSBR.js";import{a as l,b as h}from"./chunk-IYPKPLCU.js";import{b as e}from"./chunk-PZSHOSOS.js";import{e as p}from"./chunk-MA5BJL3S.js";var o=class extends l{baseCls="op-stepper";tag="nav";list;active=0;states=[];onRender(){let t=this.config;this.active=t.active??0,this.el.setAttribute("aria-label",t.ariaLabel??p("stepSteps")),this.list=e("ol","op-stepper__list"),this.el.append(this.list),this.listen(this.list,"click",s=>{let i=s.target.closest(".op-stepper__btn");if(!i||i.disabled)return;let r=Number(i.dataset.i);this.emit("before-select",r)!==!1&&(this.setActive(r),this.emit("select",r))}),this.paint()}steps(){return this.config.steps??[]}paint(){this.list.replaceChildren(...this.steps().map((t,s)=>{let i=this.states[s]??"pending",r=s===this.active,d=e("span","op-stepper__marker",{"aria-hidden":"true"},i==="done"&&!r?n("check"):i==="error"?"!":t.icon?n(t.icon):String(s+1)),a=i==="done"&&!r?p("stepDone"):i==="error"?p("stepError"):"",c=e("button","op-stepper__btn",{type:"button","data-i":s,"aria-current":r?"step":null},d,e("span","op-stepper__text",{},e("span","op-stepper__title",{},t.title),t.description?e("span","op-stepper__desc",{},t.description):"",t.optional?e("span","op-stepper__opt",{},p("stepOptional")):"",a?e("span","op-sr-only",{},a):""));c.disabled=this.config.clickable===!1;let m=s===this.steps().length-1;return e("li",`op-stepper__step${r?" is-current":""}${i==="done"?" is-done":""}${i==="error"?" is-error":""}${t.optional?" is-optional":""}`,{},c,m?"":e("span","op-stepper__line",{"aria-hidden":"true"}))}))}setActive(t){this.active=Math.max(0,Math.min(t,this.steps().length-1)),this.config.active=this.active,this.rendered&&this.paint()}getActive(){return this.active}setStepState(t,s){this.states[t]=s,this.rendered&&this.paint()}getStepState(t){return this.states[t]??"pending"}setSteps(t){this.config.steps=t,this.states=[],this.rendered&&this.paint()}};h("stepper",o);export{o as a};
|
|
2
|
+
//# sourceMappingURL=chunk-IO66A6G5.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/navigation/stepper/stepper.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface Step {\n id?: string;\n title: string;\n description?: string;\n icon?: string;\n optional?: boolean;\n}\nexport type StepState = 'pending' | 'done' | 'error';\n\nexport interface StepperConfig extends ComponentConfig {\n steps?: Step[];\n active?: number;\n /** Steps can be clicked. Default true. */\n clickable?: boolean;\n}\n\n/** Where you are in a multi-step process: numbered steps with done / current / error states. */\nexport class Stepper extends Component<StepperConfig> {\n protected override baseCls = 'op-stepper';\n protected override tag = 'nav' as const;\n private list!: HTMLElement;\n private active = 0;\n private states: StepState[] = [];\n\n protected override onRender() {\n const c = this.config;\n this.active = c.active ?? 0;\n this.el.setAttribute('aria-label', c.ariaLabel ?? t('stepSteps'));\n this.list = h('ol', 'op-stepper__list');\n this.el.append(this.list);\n this.listen(this.list, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-stepper__btn');\n if (!b || b.disabled) return;\n const i = Number(b.dataset.i);\n if (this.emit('before-select', i) === false) return;\n this.setActive(i);\n this.emit('select', i);\n });\n this.paint();\n }\n\n private steps(): Step[] {\n return this.config.steps ?? [];\n }\n\n private paint() {\n this.list.replaceChildren(\n ...this.steps().map((s, i) => {\n const state = this.states[i] ?? 'pending';\n const current = i === this.active;\n const marker = h('span', 'op-stepper__marker', { 'aria-hidden': 'true' }, state === 'done' && !current ? iconEl('check') : state === 'error' ? '!' : s.icon ? iconEl(s.icon) : String(i + 1));\n const status = state === 'done' && !current ? t('stepDone') : state === 'error' ? t('stepError') : '';\n const btn = h('button', 'op-stepper__btn', { type: 'button', 'data-i': i, 'aria-current': current ? 'step' : null }, marker,\n h('span', 'op-stepper__text', {},\n h('span', 'op-stepper__title', {}, s.title),\n s.description ? h('span', 'op-stepper__desc', {}, s.description) : '',\n s.optional ? h('span', 'op-stepper__opt', {}, t('stepOptional')) : '',\n status ? h('span', 'op-sr-only', {}, status) : ''));\n btn.disabled = this.config.clickable === false;\n const last = i === this.steps().length - 1;\n return h('li', `op-stepper__step${current ? ' is-current' : ''}${state === 'done' ? ' is-done' : ''}${state === 'error' ? ' is-error' : ''}${s.optional ? ' is-optional' : ''}`, {}, btn, last ? '' : h('span', 'op-stepper__line', { 'aria-hidden': 'true' }));\n }),\n );\n }\n\n setActive(i: number) {\n this.active = Math.max(0, Math.min(i, this.steps().length - 1));\n this.config.active = this.active;\n if (this.rendered) this.paint();\n }\n getActive(): number {\n return this.active;\n }\n\n setStepState(i: number, state: StepState) {\n this.states[i] = state;\n if (this.rendered) this.paint();\n }\n getStepState(i: number): StepState {\n return this.states[i] ?? 'pending';\n }\n\n setSteps(steps: Step[]) {\n this.config.steps = steps;\n this.states = [];\n if (this.rendered) this.paint();\n }\n}\nregister('stepper', Stepper);\n"],
|
|
5
|
+
"mappings": "uKAuBO,IAAMA,EAAN,cAAsBC,CAAyB,CACjC,QAAU,aACV,IAAM,MACjB,KACA,OAAS,EACT,OAAsB,CAAC,EAEZ,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACf,KAAK,OAASA,EAAE,QAAU,EAC1B,KAAK,GAAG,aAAa,aAAcA,EAAE,WAAaC,EAAE,WAAW,CAAC,EAChE,KAAK,KAAOC,EAAE,KAAM,kBAAkB,EACtC,KAAK,GAAG,OAAO,KAAK,IAAI,EACxB,KAAK,OAAO,KAAK,KAAM,QAAUC,GAAa,CAC5C,IAAMC,EAAKD,EAAE,OAAuB,QAA2B,kBAAkB,EACjF,GAAI,CAACC,GAAKA,EAAE,SAAU,OACtB,IAAMC,EAAI,OAAOD,EAAE,QAAQ,CAAC,EACxB,KAAK,KAAK,gBAAiBC,CAAC,IAAM,KACtC,KAAK,UAAUA,CAAC,EAChB,KAAK,KAAK,SAAUA,CAAC,EACvB,CAAC,EACD,KAAK,MAAM,CACb,CAEQ,OAAgB,CACtB,OAAO,KAAK,OAAO,OAAS,CAAC,CAC/B,CAEQ,OAAQ,CACd,KAAK,KAAK,gBACR,GAAG,KAAK,MAAM,EAAE,IAAI,CAACC,EAAGD,IAAM,CAC5B,IAAME,EAAQ,KAAK,OAAOF,CAAC,GAAK,UAC1BG,EAAUH,IAAM,KAAK,OACrBI,EAASP,EAAE,OAAQ,qBAAsB,CAAE,cAAe,MAAO,EAAGK,IAAU,QAAU,CAACC,EAAUE,EAAO,OAAO,EAAIH,IAAU,QAAU,IAAMD,EAAE,KAAOI,EAAOJ,EAAE,IAAI,EAAI,OAAOD,EAAI,CAAC,CAAC,EACtLM,EAASJ,IAAU,QAAU,CAACC,EAAUP,EAAE,UAAU,EAAIM,IAAU,QAAUN,EAAE,WAAW,EAAI,GAC7FW,EAAMV,EAAE,SAAU,kBAAmB,CAAE,KAAM,SAAU,SAAUG,EAAG,eAAgBG,EAAU,OAAS,IAAK,EAAGC,EACnHP,EAAE,OAAQ,mBAAoB,CAAC,EAC7BA,EAAE,OAAQ,oBAAqB,CAAC,EAAGI,EAAE,KAAK,EAC1CA,EAAE,YAAcJ,EAAE,OAAQ,mBAAoB,CAAC,EAAGI,EAAE,WAAW,EAAI,GACnEA,EAAE,SAAWJ,EAAE,OAAQ,kBAAmB,CAAC,EAAGD,EAAE,cAAc,CAAC,EAAI,GACnEU,EAAST,EAAE,OAAQ,aAAc,CAAC,EAAGS,CAAM,EAAI,EAAE,CAAC,EACtDC,EAAI,SAAW,KAAK,OAAO,YAAc,GACzC,IAAMC,EAAOR,IAAM,KAAK,MAAM,EAAE,OAAS,EACzC,OAAOH,EAAE,KAAM,mBAAmBM,EAAU,cAAgB,EAAE,GAAGD,IAAU,OAAS,WAAa,EAAE,GAAGA,IAAU,QAAU,YAAc,EAAE,GAAGD,EAAE,SAAW,eAAiB,EAAE,GAAI,CAAC,EAAGM,EAAKC,EAAO,GAAKX,EAAE,OAAQ,mBAAoB,CAAE,cAAe,MAAO,CAAC,CAAC,CAChQ,CAAC,CACH,CACF,CAEA,UAAUG,EAAW,CACnB,KAAK,OAAS,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAG,KAAK,MAAM,EAAE,OAAS,CAAC,CAAC,EAC9D,KAAK,OAAO,OAAS,KAAK,OACtB,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,WAAoB,CAClB,OAAO,KAAK,MACd,CAEA,aAAaA,EAAWE,EAAkB,CACxC,KAAK,OAAOF,CAAC,EAAIE,EACb,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,aAAaF,EAAsB,CACjC,OAAO,KAAK,OAAOA,CAAC,GAAK,SAC3B,CAEA,SAASS,EAAe,CACtB,KAAK,OAAO,MAAQA,EACpB,KAAK,OAAS,CAAC,EACX,KAAK,UAAU,KAAK,MAAM,CAChC,CACF,EACAC,EAAS,UAAWjB,CAAO",
|
|
6
|
+
"names": ["Stepper", "Component", "c", "t", "h", "e", "b", "i", "s", "state", "current", "marker", "iconEl", "status", "btn", "last", "steps", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{e as o}from"./chunk-MA5BJL3S.js";import{a as i}from"./chunk-4C666HHU.js";var p={};i(p,{email:()=>y,max:()=>x,maxLength:()=>l,min:()=>u,minLength:()=>m,pattern:()=>s,range:()=>g});var n=t=>typeof t=="string"||Array.isArray(t)?t.length:0,m=(t,e)=>r=>n(r)<t?e??o("minLength",{n:t}):!0,l=(t,e)=>r=>n(r)>t?e??o("maxLength",{n:t}):!0,s=(t,e)=>r=>t.test(String(r))?!0:e??o("pattern"),y=t=>e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(String(e))?!0:t??o("email"),u=(t,e)=>r=>Number(r)<t?e??o("min",{n:t}):!0,x=(t,e)=>r=>Number(r)>t?e??o("max",{n:t}):!0,g=(t,e,r)=>a=>Number(a)<t||Number(a)>e?r??o("range",{min:t,max:e}):!0;export{p as a};
|
|
2
|
+
//# sourceMappingURL=chunk-IW7PK4VS.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/validators.ts"],
|
|
4
|
+
"sourcesContent": ["import { t } from './i18n';\nimport type { Field } from './field';\n\n/** Returns an error message, or `true`/`undefined` when valid. Empty values are skipped (use `required`). */\nexport type Validator<V = any> = (value: V, field: Field<V>) => string | true | undefined | void;\n\nconst len = (v: unknown) => (typeof v === 'string' || Array.isArray(v) ? v.length : 0);\n\nexport const minLength = (n: number, msg?: string): Validator => (v) => (len(v) < n ? (msg ?? t('minLength', { n })) : true);\nexport const maxLength = (n: number, msg?: string): Validator => (v) => (len(v) > n ? (msg ?? t('maxLength', { n })) : true);\nexport const pattern = (re: RegExp, msg?: string): Validator => (v) => (re.test(String(v)) ? true : (msg ?? t('pattern')));\nexport const email = (msg?: string): Validator => (v) => (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v)) ? true : (msg ?? t('email')));\nexport const min = (n: number, msg?: string): Validator => (v) => (Number(v) < n ? (msg ?? t('min', { n })) : true);\nexport const max = (n: number, msg?: string): Validator => (v) => (Number(v) > n ? (msg ?? t('max', { n })) : true);\nexport const range = (a: number, b: number, msg?: string): Validator => (v) =>\n Number(v) < a || Number(v) > b ? (msg ?? t('range', { min: a, max: b })) : true;\n"],
|
|
5
|
+
"mappings": "gFAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,WAAAE,EAAA,QAAAC,EAAA,cAAAC,EAAA,QAAAC,EAAA,cAAAC,EAAA,YAAAC,EAAA,UAAAC,IAMA,IAAMC,EAAOC,GAAgB,OAAOA,GAAM,UAAY,MAAM,QAAQA,CAAC,EAAIA,EAAE,OAAS,EAEvEC,EAAY,CAACC,EAAWC,IAA6BH,GAAOD,EAAIC,CAAC,EAAIE,EAAKC,GAAOC,EAAE,YAAa,CAAE,EAAAF,CAAE,CAAC,EAAK,GAC1GG,EAAY,CAACH,EAAWC,IAA6BH,GAAOD,EAAIC,CAAC,EAAIE,EAAKC,GAAOC,EAAE,YAAa,CAAE,EAAAF,CAAE,CAAC,EAAK,GAC1GI,EAAU,CAACC,EAAYJ,IAA6BH,GAAOO,EAAG,KAAK,OAAOP,CAAC,CAAC,EAAI,GAAQG,GAAOC,EAAE,SAAS,EAC1GI,EAASL,GAA6BH,GAAO,6BAA6B,KAAK,OAAOA,CAAC,CAAC,EAAI,GAAQG,GAAOC,EAAE,OAAO,EACpHK,EAAM,CAACP,EAAWC,IAA6BH,GAAO,OAAOA,CAAC,EAAIE,EAAKC,GAAOC,EAAE,MAAO,CAAE,EAAAF,CAAE,CAAC,EAAK,GACjGQ,EAAM,CAACR,EAAWC,IAA6BH,GAAO,OAAOA,CAAC,EAAIE,EAAKC,GAAOC,EAAE,MAAO,CAAE,EAAAF,CAAE,CAAC,EAAK,GACjGS,EAAQ,CAACC,EAAWC,EAAWV,IAA6BH,GACvE,OAAOA,CAAC,EAAIY,GAAK,OAAOZ,CAAC,EAAIa,EAAKV,GAAOC,EAAE,QAAS,CAAE,IAAKQ,EAAG,IAAKC,CAAE,CAAC,EAAK",
|
|
6
|
+
"names": ["validators_exports", "__export", "email", "max", "maxLength", "min", "minLength", "pattern", "range", "len", "v", "minLength", "n", "msg", "t", "maxLength", "pattern", "re", "email", "min", "max", "range", "a", "b"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{b as n,c as a,d as r,e as o}from"./chunk-PZSHOSOS.js";import{a as h,e as p}from"./chunk-MA5BJL3S.js";var f=class extends h{static type;config;id;parent;rendered=!1;mounted=!1;destroyed=!1;baseCls="op-component";tag="div";_el;disposers=[];mask;constructor(e={}){super(),this.config={...e},this.id=e.id??a("op");for(let t in e.listeners)this.on(t,e.listeners[t])}get el(){return this._el??this.render()}build(){return n(this.tag,this.baseCls)}onRender(){}onMount(){}onDestroy(){}render(){if(this._el)return this._el;let e=this._el=this.build();this.rendered=!0;let t=this.config;if(e.id=this.id,t.cls&&e.classList.add(...t.cls.split(/\s+/).filter(Boolean)),typeof t.style=="string")e.style.cssText+=t.style;else if(t.style)for(let i in t.style)e.style.setProperty(r(i),String(t.style[i]));return t.width!=null&&(e.style.width=o(t.width)),t.height!=null&&(e.style.height=o(t.height)),t.flex!=null&&(e.style.flex=String(t.flex)),t.ariaLabel&&e.setAttribute("aria-label",t.ariaLabel),this.setStableSize(t.stableSize!==!1),t.hidden&&(e.hidden=!0),t.tooltip&&(e.dataset.opTip=t.tooltip),t.theme&&this.setTheme(t.theme),this.onRender(),t.disabled&&this.setDisabled(!0),t.loading&&this.setLoading(t.loading),e}mount(e=document.body){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Optikos: mount target not found: ${String(e)}`);return t.appendChild(this.el),this.notifyMount(),this}notifyMount(){this.mounted||this.destroyed||(this.mounted=!0,this.onMount(),this.emit("mount"))}destroy(){if(!this.destroyed){this.destroyed=!0,this.onDestroy();for(let e of this.disposers.splice(0).reverse())e();this.parent?.remove(this,!1),this.parent=void 0,this._el?.remove(),this.emit("destroy"),this.clearListeners()}}own(e){return this.disposers.push(e),e}listen(e,t,i,l){return e.addEventListener(t,i,l),this.own(()=>e.removeEventListener(t,i,l))}later(e,t){let i=setTimeout(e,t);return this.own(()=>clearTimeout(i))}onDisabled(e){}setDisabled(e){this.config.disabled=e,this.rendered&&(this.el.classList.toggle("is-disabled",e),this.onDisabled(e))}show(){this.config.hidden=!1,this.rendered&&(this.el.hidden=!1),this.emit("show")}hide(){this.config.hidden=!0,this.rendered&&(this.el.hidden=!0),this.emit("hide")}isHidden(){return!!this.config.hidden}addCls(e){this.el.classList.add(e)}removeCls(e){this.el.classList.remove(e)}toggleCls(e,t){this.el.classList.toggle(e,t)}setWidth(e){this.config.width=e,this.rendered&&(this.el.style.width=o(e))}setHeight(e){this.config.height=e,this.rendered&&(this.el.style.height=o(e))}setFlex(e){this.config.flex=e,this.rendered&&(this.el.style.flex=String(e))}setStableSize(e){this.config.stableSize=e,this.rendered&&this.el.classList.toggle("op-stable",e)}setTooltip(e){this.config.tooltip=e,this.rendered&&(e?this.el.dataset.opTip=e:delete this.el.dataset.opTip)}setTheme(e){let t="--"+this.baseCls+"-";for(let i in e)this.el.style.setProperty(i.startsWith("--")?i:t+r(i),String(e[i]))}setLoading(e){if(this.config.loading=e,!this.rendered)return;let t=this.el;this.mask?.remove(),this.mask=void 0,t.classList.toggle("is-loading",!!e),e?t.setAttribute("aria-busy","true"):t.removeAttribute("aria-busy"),e&&(this.mask=n("div","op-mask",{},n("span","op-spinner",{role:"progressbar","aria-label":p("loading")}),typeof e=="string"?n("div","op-mask__text",{},e):null),t.append(this.mask));for(let i of Array.from(t.children))i!==this.mask&&i.toggleAttribute("inert",!!e)}focusEl(){return this.el}focus(){this.focusEl().focus()}};var d=new Map;function y(s,e){e.type=s,d.set(s,e)}var b=s=>d.get(s);function v(s){if(typeof s.render=="function")return s;let e=s,t=e.type?d.get(e.type):void 0;if(!t)throw new Error(`Optikos: unknown component type "${e.type}". Did you import or register it?`);let i=new t(e);return e.renderTo&&i.mount(e.renderTo),i}export{f as a,y as b,b as c,v as d};
|
|
2
|
+
//# sourceMappingURL=chunk-IYPKPLCU.js.map
|