optikos 0.2.0 → 0.4.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 +56 -1
- package/dist/bind.js +1 -1
- package/dist/bind.js.map +4 -4
- package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
- package/dist/chunk-2HNQ2XRY.js +2 -0
- package/dist/chunk-2HNQ2XRY.js.map +7 -0
- package/dist/chunk-2QMI2RRB.js +2 -0
- package/dist/chunk-2QMI2RRB.js.map +7 -0
- package/dist/{chunk-W3H7GTJY.js → chunk-2YRQULDC.js} +2 -2
- package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
- package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
- package/dist/chunk-3FCIZKIN.js +2 -0
- package/dist/chunk-3FCIZKIN.js.map +7 -0
- package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
- package/dist/chunk-3QRA3XOA.js +2 -0
- package/dist/chunk-3QRA3XOA.js.map +7 -0
- package/dist/chunk-3TCITFUU.js +2 -0
- package/dist/chunk-3TCITFUU.js.map +7 -0
- package/dist/chunk-3VDLX7ET.js +2 -0
- package/dist/chunk-3VDLX7ET.js.map +7 -0
- package/dist/{chunk-3TAW4AKH.js → chunk-4AZ44KV4.js} +2 -2
- package/dist/{chunk-TZOQWCVH.js → chunk-4CWYF4O7.js} +2 -2
- package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
- package/dist/{chunk-3DBEZGOY.js → chunk-4S3HRFQB.js} +2 -2
- package/dist/chunk-5BMG5ZBY.js +2 -0
- package/dist/{chunk-KLLAY2IM.js.map → chunk-5BMG5ZBY.js.map} +2 -2
- package/dist/chunk-5PWPAN62.js +2 -0
- package/dist/chunk-5PWPAN62.js.map +7 -0
- package/dist/chunk-5PYJ6FJK.js +2 -0
- package/dist/chunk-5PYJ6FJK.js.map +7 -0
- package/dist/{chunk-OGRFQTXA.js → chunk-643FOYQB.js} +2 -2
- package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
- package/dist/chunk-6LJK4QWF.js +2 -0
- package/dist/chunk-6LJK4QWF.js.map +7 -0
- package/dist/{chunk-JK74QK3M.js → chunk-6PZPBPAD.js} +2 -2
- package/dist/chunk-7Y2GHQRB.js +2 -0
- package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
- package/dist/{chunk-M242VYZA.js → chunk-AT7VFZRB.js} +2 -2
- package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
- package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
- package/dist/chunk-BJWREA76.js +2 -0
- package/dist/chunk-BJWREA76.js.map +7 -0
- package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
- package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
- package/dist/{chunk-FEHGU6EP.js → chunk-C3MWS7P2.js} +2 -2
- package/dist/{chunk-G2KUK6AT.js → chunk-CFGCB37K.js} +2 -2
- package/dist/{chunk-JI265XFO.js → chunk-CMV3F6HR.js} +2 -2
- package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
- package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
- package/dist/chunk-DJUSVBD5.js +2 -0
- package/dist/chunk-DJUSVBD5.js.map +7 -0
- package/dist/{chunk-HXDTGP2K.js → chunk-DWA45BWR.js} +2 -2
- package/dist/chunk-DWTDNKXX.js +2 -0
- package/dist/chunk-DWTDNKXX.js.map +7 -0
- package/dist/chunk-ESCLDVFS.js +2 -0
- package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
- package/dist/chunk-EXIADWI7.js +2 -0
- package/dist/chunk-EXIADWI7.js.map +7 -0
- package/dist/{chunk-5QUY72FX.js → chunk-F4HZUAKM.js} +2 -2
- package/dist/chunk-FCJI2JF7.js +3 -0
- package/dist/chunk-FCJI2JF7.js.map +7 -0
- package/dist/{chunk-II6ITOA6.js → chunk-FPU53CCV.js} +2 -2
- package/dist/{chunk-3S24ZRPK.js → chunk-GEBAYD6N.js} +2 -2
- package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
- package/dist/chunk-GFFZTFQH.js +2 -0
- package/dist/chunk-GFFZTFQH.js.map +7 -0
- package/dist/chunk-GFJRGBQR.js +2 -0
- package/dist/chunk-GFJRGBQR.js.map +7 -0
- package/dist/chunk-GZIDE5K2.js +2 -0
- package/dist/chunk-GZIDE5K2.js.map +7 -0
- package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
- package/dist/chunk-HG7OOHGD.js +2 -0
- package/dist/chunk-HG7OOHGD.js.map +7 -0
- package/dist/{chunk-2ZUZ5HDL.js → chunk-HLS5FI55.js} +2 -2
- package/dist/chunk-HRW25TMU.js +2 -0
- package/dist/chunk-HX6TWXTX.js +2 -0
- package/dist/chunk-HX6TWXTX.js.map +7 -0
- package/dist/chunk-I5A74NMJ.js +2 -0
- package/dist/chunk-I5A74NMJ.js.map +7 -0
- package/dist/chunk-IUOEPAWG.js +2 -0
- package/dist/chunk-IUOEPAWG.js.map +7 -0
- package/dist/{chunk-IHE2MQ3W.js → chunk-J5QPFJ7M.js} +2 -2
- package/dist/chunk-JE56CJX2.js +2 -0
- package/dist/chunk-JE56CJX2.js.map +7 -0
- package/dist/chunk-JJLOUMCJ.js +2 -0
- package/dist/chunk-JJLOUMCJ.js.map +7 -0
- package/dist/chunk-JLKIHXZP.js +3 -0
- package/dist/chunk-JLKIHXZP.js.map +7 -0
- package/dist/{chunk-5BC72727.js → chunk-JSEI44A7.js} +2 -2
- package/dist/chunk-L5SQQFO7.js +2 -0
- package/dist/chunk-L5SQQFO7.js.map +7 -0
- package/dist/chunk-M2ZRKHE4.js +2 -0
- package/dist/chunk-M2ZRKHE4.js.map +7 -0
- package/dist/chunk-M7FNPRV4.js +2 -0
- package/dist/chunk-M7FNPRV4.js.map +7 -0
- package/dist/chunk-MNSDGJKA.js +3 -0
- package/dist/chunk-MNSDGJKA.js.map +7 -0
- package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
- package/dist/chunk-N2LS4JD6.js +2 -0
- package/dist/chunk-N2LS4JD6.js.map +7 -0
- package/dist/chunk-NJ5IFOPR.js +4 -0
- package/dist/{chunk-XX2MVWFS.js.map → chunk-NJ5IFOPR.js.map} +1 -1
- package/dist/{chunk-NXSTUFS7.js → chunk-NNR2FNHG.js} +2 -2
- package/dist/chunk-NQV4THNE.js +2 -0
- package/dist/{chunk-BXYWVRKJ.js.map → chunk-NQV4THNE.js.map} +1 -1
- package/dist/{chunk-XHOBNSBO.js → chunk-P4O57S6N.js} +2 -2
- package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
- package/dist/chunk-PMOXLQ72.js +2 -0
- package/dist/chunk-PMOXLQ72.js.map +7 -0
- package/dist/chunk-Q6FY4L2F.js +2 -0
- package/dist/chunk-Q6FY4L2F.js.map +7 -0
- package/dist/chunk-R32HPK7R.js +2 -0
- package/dist/chunk-R32HPK7R.js.map +7 -0
- package/dist/{chunk-Z2JBUHKA.js → chunk-RG6SHPHF.js} +2 -2
- package/dist/{chunk-EDUMAMK4.js → chunk-S2CMWKVB.js} +2 -2
- package/dist/chunk-S4QD5NID.js +2 -0
- package/dist/chunk-S4QD5NID.js.map +7 -0
- package/dist/chunk-SB4ICXBV.js +2 -0
- package/dist/chunk-SB4ICXBV.js.map +7 -0
- package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
- package/dist/chunk-SWCB2GMN.js +2 -0
- package/dist/chunk-SWCB2GMN.js.map +7 -0
- package/dist/chunk-TQPQ4UEA.js +2 -0
- package/dist/chunk-TQPQ4UEA.js.map +7 -0
- package/dist/{chunk-Z2Z52GFT.js → chunk-U5L76VVB.js} +2 -2
- package/dist/chunk-UDXO3KM3.js +2 -0
- package/dist/chunk-UDXO3KM3.js.map +7 -0
- package/dist/{chunk-LQRFNQ2N.js → chunk-UQRQH2JW.js} +2 -2
- package/dist/chunk-V5G5JECN.js +2 -0
- package/dist/chunk-V5G5JECN.js.map +7 -0
- package/dist/{chunk-JBLRAM7Z.js → chunk-XFIREDWO.js} +2 -2
- package/dist/chunk-XQHATUKN.js +2 -0
- package/dist/{chunk-LW2WRUVL.js.map → chunk-XQHATUKN.js.map} +4 -4
- package/dist/chunk-XR677UYD.js +2 -0
- package/dist/chunk-XR677UYD.js.map +7 -0
- package/dist/{chunk-RNN55473.js → chunk-YDX2PCVL.js} +2 -2
- package/dist/{chunk-RNN55473.js.map → chunk-YDX2PCVL.js.map} +1 -1
- package/dist/chunk-YJTUFK4P.js +2 -0
- package/dist/chunk-YLFSCQL3.js +2 -0
- package/dist/chunk-YLFSCQL3.js.map +7 -0
- package/dist/chunk-YXOKWCYS.js +2 -0
- package/dist/chunk-YXOKWCYS.js.map +7 -0
- package/dist/{chunk-I4SP6JTU.js → chunk-Z6L55FTN.js} +2 -2
- package/dist/{chunk-6VBK2I5B.js → chunk-ZSPJZ3ZH.js} +2 -2
- package/dist/components/avatar.js +2 -0
- package/dist/components/avatar.js.map +7 -0
- package/dist/components/badge.js +1 -1
- package/dist/components/breadcrumb.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/calendar.js +1 -1
- package/dist/components/carousel.js +2 -0
- package/dist/components/carousel.js.map +7 -0
- package/dist/components/cellediting.js +1 -1
- package/dist/components/chart.js +2 -0
- package/dist/components/chart.js.map +7 -0
- package/dist/components/chat.js +1 -1
- package/dist/components/checkbox.js +1 -1
- package/dist/components/checkboxgroup.js +1 -1
- package/dist/components/chip.js +1 -1
- package/dist/components/codeviewer.js +1 -1
- package/dist/components/combobox.js +1 -1
- package/dist/components/commandpalette.js +1 -1
- package/dist/components/container.js +1 -1
- package/dist/components/dataview.js +1 -1
- package/dist/components/datefield.js +1 -1
- package/dist/components/daterangefield.js +1 -1
- package/dist/components/datetimefield.js +2 -0
- package/dist/components/datetimefield.js.map +7 -0
- package/dist/components/dial.js +1 -1
- package/dist/components/dropdown.js +1 -1
- package/dist/components/fieldgroup.js +1 -1
- package/dist/components/fieldlist.js +1 -1
- package/dist/components/fieldset.js +1 -1
- package/dist/components/filterbuilder.js +1 -1
- package/dist/components/form.js +1 -1
- package/dist/components/formactions.js +1 -1
- package/dist/components/formerrors.js +1 -1
- package/dist/components/formsection.js +1 -1
- package/dist/components/grid.js +1 -1
- package/dist/components/gridexport.js +2 -0
- package/dist/components/gridexport.js.map +7 -0
- package/dist/components/gridstate.js +2 -0
- package/dist/components/gridstate.js.map +7 -0
- package/dist/components/grouping.js +2 -0
- package/dist/components/grouping.js.map +7 -0
- package/dist/components/icon.js +1 -1
- package/dist/components/image.js +2 -0
- package/dist/components/image.js.map +7 -0
- package/dist/components/imagecanvas.js +2 -0
- package/dist/components/imagecanvas.js.map +7 -0
- package/dist/components/imagefield.js +2 -0
- package/dist/components/imagefield.js.map +7 -0
- package/dist/components/inputgroup.js +1 -1
- package/dist/components/label.js +1 -1
- package/dist/components/listbox.js +1 -1
- package/dist/components/lookupfield.js +1 -1
- package/dist/components/maskfield.js +2 -0
- package/dist/components/maskfield.js.map +7 -0
- package/dist/components/menu.js +1 -1
- package/dist/components/messagebox.js +1 -1
- package/dist/components/navmenu.js +1 -1
- package/dist/components/numberfield.js +1 -1
- package/dist/components/pagination.js +1 -1
- package/dist/components/panel.js +1 -1
- package/dist/components/pickerfield.js +1 -1
- package/dist/components/radiogroup.js +1 -1
- package/dist/components/rowediting.js +2 -0
- package/dist/components/rowediting.js.map +7 -0
- package/dist/components/searchgrid.js +1 -1
- package/dist/components/secretfield.js +1 -1
- package/dist/components/select.js +1 -1
- package/dist/components/shortcuts.js +2 -0
- package/dist/components/shortcuts.js.map +7 -0
- package/dist/components/slider.js +1 -1
- package/dist/components/spacer.js +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/stat.js +2 -0
- package/dist/components/stat.js.map +7 -0
- package/dist/components/stepform.js +1 -1
- package/dist/components/stepper.js +1 -1
- package/dist/components/suggestfield.js +1 -1
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/textarea.js +1 -1
- package/dist/components/textfield.js +1 -1
- package/dist/components/timefield.js +2 -0
- package/dist/components/timefield.js.map +7 -0
- package/dist/components/timeline.js +2 -0
- package/dist/components/timeline.js.map +7 -0
- package/dist/components/toast.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/toolbar.js +1 -1
- package/dist/components/tree.js +1 -1
- package/dist/components/treegrid.js +2 -0
- package/dist/components/treegrid.js.map +7 -0
- package/dist/components/viewmanager.js +1 -1
- package/dist/components/viewport.js +1 -1
- package/dist/components/widget.js +1 -1
- package/dist/components/window.js +1 -1
- package/dist/core.js +1 -1
- package/dist/css/avatar.css +68 -0
- package/dist/css/base.css +9 -0
- package/dist/css/carousel.css +119 -0
- package/dist/css/chart.css +168 -0
- package/dist/css/core.css +36 -0
- package/dist/css/datetimefield.css +15 -0
- package/dist/css/grid.css +40 -0
- package/dist/css/gridexport.css +35 -0
- package/dist/css/grouping.css +49 -0
- package/dist/css/image.css +46 -0
- package/dist/css/imagecanvas.css +75 -0
- package/dist/css/imagefield.css +103 -0
- package/dist/css/menu.css +9 -0
- package/dist/css/navmenu.css +9 -7
- package/dist/css/rowediting.css +39 -0
- package/dist/css/shortcuts.css +34 -0
- package/dist/css/stat.css +64 -0
- package/dist/css/stepform.css +10 -0
- package/dist/css/timeline.css +140 -0
- package/dist/css/treegrid.css +35 -0
- package/dist/css/window.css +2 -2
- package/dist/data.js +1 -1
- package/dist/dev.js +2 -0
- package/dist/dev.js.map +7 -0
- package/dist/index.js +16 -5
- package/dist/index.js.map +4 -4
- package/dist/optikos.css +1131 -21
- package/dist/testing.js +2 -0
- package/dist/testing.js.map +7 -0
- package/dist/themes/dark.css +7 -0
- package/dist/types/bind/index.d.ts +1 -1
- package/dist/types/bind/viewmodel.d.ts +33 -0
- package/dist/types/components/avatar.d.ts +1 -0
- package/dist/types/components/base/avatar/avatar.d.ts +22 -0
- package/dist/types/components/base/image/image.d.ts +25 -0
- package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
- package/dist/types/components/carousel.d.ts +1 -0
- package/dist/types/components/chart.d.ts +1 -0
- package/dist/types/components/charts/chart/chart.d.ts +64 -0
- package/dist/types/components/charts/stat/stat.d.ts +34 -0
- package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
- package/dist/types/components/data/grid/grid.d.ts +37 -0
- package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
- package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
- package/dist/types/components/data/grouping/grouping.d.ts +31 -0
- package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
- package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
- package/dist/types/components/data/timeline/timeline.d.ts +60 -0
- package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
- package/dist/types/components/datetimefield.d.ts +1 -0
- package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
- package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
- package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
- package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
- package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
- package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
- package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
- package/dist/types/components/form/form/form.d.ts +5 -0
- package/dist/types/components/form/stepform/stepform.d.ts +29 -5
- package/dist/types/components/gridexport.d.ts +1 -0
- package/dist/types/components/gridstate.d.ts +1 -0
- package/dist/types/components/grouping.d.ts +1 -0
- package/dist/types/components/image.d.ts +1 -0
- package/dist/types/components/imagecanvas.d.ts +1 -0
- package/dist/types/components/imagefield.d.ts +1 -0
- package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
- package/dist/types/components/maskfield.d.ts +1 -0
- package/dist/types/components/navigation/navmenu/navmenu.d.ts +8 -0
- package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
- package/dist/types/components/overlays/menu/menu.d.ts +6 -1
- package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
- package/dist/types/components/overlays/window/window.d.ts +14 -1
- package/dist/types/components/rowediting.d.ts +1 -0
- package/dist/types/components/shortcuts.d.ts +1 -0
- package/dist/types/components/stat.d.ts +1 -0
- package/dist/types/components/timefield.d.ts +1 -0
- package/dist/types/components/timeline.d.ts +1 -0
- package/dist/types/components/treegrid.d.ts +1 -0
- package/dist/types/core/component.d.ts +7 -0
- package/dist/types/core/container.d.ts +10 -1
- package/dist/types/core/dev.d.ts +2 -0
- package/dist/types/core/field.d.ts +4 -0
- package/dist/types/core/i18n.d.ts +2 -0
- package/dist/types/core/index.d.ts +4 -1
- package/dist/types/core/path.d.ts +2 -0
- package/dist/types/core/permission.d.ts +11 -0
- package/dist/types/core/state.d.ts +9 -0
- package/dist/types/data/column.d.ts +8 -0
- package/dist/types/data/index.d.ts +1 -1
- package/dist/types/data/model.d.ts +2 -0
- package/dist/types/data/store.d.ts +21 -0
- package/dist/types/dev/index.d.ts +2 -0
- package/dist/types/dev/keys.d.ts +1 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/testing/index.d.ts +25 -0
- package/dist/types/themes/color.d.ts +14 -0
- package/dist/types/themes/contrast.d.ts +15 -0
- package/dist/types/themes/define.d.ts +25 -3
- package/dist/types/themes/index.d.ts +3 -1
- package/dist/types/themes/seeds.d.ts +11 -0
- package/dist/types/ui/ui.d.ts +6 -0
- package/dist/ui.js +1 -1
- package/package.json +9 -1
- package/dist/chunk-27UZFEXD.js +0 -2
- package/dist/chunk-27UZFEXD.js.map +0 -7
- package/dist/chunk-2ZRNGG2N.js +0 -2
- package/dist/chunk-2ZRNGG2N.js.map +0 -7
- package/dist/chunk-4LZZ244E.js +0 -2
- package/dist/chunk-4LZZ244E.js.map +0 -7
- package/dist/chunk-4SYIIX5A.js +0 -2
- package/dist/chunk-4SYIIX5A.js.map +0 -7
- package/dist/chunk-5YS7OD5E.js +0 -2
- package/dist/chunk-5YS7OD5E.js.map +0 -7
- package/dist/chunk-7KMIFXHZ.js +0 -2
- package/dist/chunk-7KMIFXHZ.js.map +0 -7
- package/dist/chunk-A2NKDOYN.js +0 -2
- package/dist/chunk-A2NKDOYN.js.map +0 -7
- package/dist/chunk-ATFJ7PNA.js +0 -2
- package/dist/chunk-ATFJ7PNA.js.map +0 -7
- package/dist/chunk-BXYWVRKJ.js +0 -2
- package/dist/chunk-CKXS375P.js +0 -2
- package/dist/chunk-CKXS375P.js.map +0 -7
- package/dist/chunk-CUN5QO4T.js +0 -2
- package/dist/chunk-CUN5QO4T.js.map +0 -7
- package/dist/chunk-ELYARUCN.js +0 -2
- package/dist/chunk-EV73ADN2.js +0 -2
- package/dist/chunk-EV73ADN2.js.map +0 -7
- package/dist/chunk-FHM5NUS4.js +0 -3
- package/dist/chunk-FHM5NUS4.js.map +0 -7
- package/dist/chunk-GBPLNXMP.js +0 -2
- package/dist/chunk-GBPLNXMP.js.map +0 -7
- package/dist/chunk-GZ7X34QP.js +0 -2
- package/dist/chunk-KCEUD232.js +0 -2
- package/dist/chunk-KCEUD232.js.map +0 -7
- package/dist/chunk-KLLAY2IM.js +0 -2
- package/dist/chunk-LBJSMXLV.js +0 -2
- package/dist/chunk-LBJSMXLV.js.map +0 -7
- package/dist/chunk-LW2WRUVL.js +0 -2
- package/dist/chunk-MW3RWBZ7.js +0 -2
- package/dist/chunk-MW3RWBZ7.js.map +0 -7
- package/dist/chunk-OEAXCCVM.js +0 -2
- package/dist/chunk-OEAXCCVM.js.map +0 -7
- package/dist/chunk-VF7BGP6L.js +0 -2
- package/dist/chunk-VF7BGP6L.js.map +0 -7
- package/dist/chunk-VU3GIDZ3.js +0 -2
- package/dist/chunk-VU3GIDZ3.js.map +0 -7
- package/dist/chunk-XX2MVWFS.js +0 -4
- package/dist/chunk-XYZ6VZ5T.js +0 -2
- package/dist/chunk-YBAYEU25.js +0 -2
- /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
- /package/dist/{chunk-W3H7GTJY.js.map → chunk-2YRQULDC.js.map} +0 -0
- /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
- /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
- /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
- /package/dist/{chunk-3TAW4AKH.js.map → chunk-4AZ44KV4.js.map} +0 -0
- /package/dist/{chunk-TZOQWCVH.js.map → chunk-4CWYF4O7.js.map} +0 -0
- /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
- /package/dist/{chunk-3DBEZGOY.js.map → chunk-4S3HRFQB.js.map} +0 -0
- /package/dist/{chunk-OGRFQTXA.js.map → chunk-643FOYQB.js.map} +0 -0
- /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
- /package/dist/{chunk-JK74QK3M.js.map → chunk-6PZPBPAD.js.map} +0 -0
- /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
- /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
- /package/dist/{chunk-M242VYZA.js.map → chunk-AT7VFZRB.js.map} +0 -0
- /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
- /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
- /package/dist/{chunk-FEHGU6EP.js.map → chunk-C3MWS7P2.js.map} +0 -0
- /package/dist/{chunk-G2KUK6AT.js.map → chunk-CFGCB37K.js.map} +0 -0
- /package/dist/{chunk-JI265XFO.js.map → chunk-CMV3F6HR.js.map} +0 -0
- /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
- /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
- /package/dist/{chunk-HXDTGP2K.js.map → chunk-DWA45BWR.js.map} +0 -0
- /package/dist/{chunk-5QUY72FX.js.map → chunk-F4HZUAKM.js.map} +0 -0
- /package/dist/{chunk-II6ITOA6.js.map → chunk-FPU53CCV.js.map} +0 -0
- /package/dist/{chunk-3S24ZRPK.js.map → chunk-GEBAYD6N.js.map} +0 -0
- /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
- /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
- /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-HLS5FI55.js.map} +0 -0
- /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
- /package/dist/{chunk-IHE2MQ3W.js.map → chunk-J5QPFJ7M.js.map} +0 -0
- /package/dist/{chunk-5BC72727.js.map → chunk-JSEI44A7.js.map} +0 -0
- /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
- /package/dist/{chunk-NXSTUFS7.js.map → chunk-NNR2FNHG.js.map} +0 -0
- /package/dist/{chunk-XHOBNSBO.js.map → chunk-P4O57S6N.js.map} +0 -0
- /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
- /package/dist/{chunk-Z2JBUHKA.js.map → chunk-RG6SHPHF.js.map} +0 -0
- /package/dist/{chunk-EDUMAMK4.js.map → chunk-S2CMWKVB.js.map} +0 -0
- /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
- /package/dist/{chunk-Z2Z52GFT.js.map → chunk-U5L76VVB.js.map} +0 -0
- /package/dist/{chunk-LQRFNQ2N.js.map → chunk-UQRQH2JW.js.map} +0 -0
- /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XFIREDWO.js.map} +0 -0
- /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
- /package/dist/{chunk-I4SP6JTU.js.map → chunk-Z6L55FTN.js.map} +0 -0
- /package/dist/{chunk-6VBK2I5B.js.map → chunk-ZSPJZ3ZH.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,59 @@ and the project uses [Semantic Versioning](https://semver.org/). Until 1.0, mino
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.4.0] - 2026-11-10
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Window token `--op-window-max-height`. The default is now `85dvh` (was the full viewport height minus a small
|
|
13
|
+
margin), so a long dialog keeps breathing room and scrolls inside.
|
|
14
|
+
- TimeField (`timefield`, `ui.time`): a time of day as `'HH:mm'`, typed (`930`) or stepped with ↑/↓, with `min`/`max`/`step`.
|
|
15
|
+
- `defineTheme` accepts the key `base` beside variants (`radius: { base: '8px', sm: '4px' }`).
|
|
16
|
+
- A lookup filter may be a field instance, not only a config.
|
|
17
|
+
- ImageField (`imagefield`): picks one or more images by click or drop, with previews, `accept`, `maxSize`, `maxFiles`,
|
|
18
|
+
a `reject` event and URLs of images already saved.
|
|
19
|
+
- ImageCanvas (`imagecanvas`): shows an image with zoom and pan (buttons, keys, Ctrl+wheel, double click, pinch).
|
|
20
|
+
- Carousel (`carousel`): a scroll-snap row of any components with arrows, dots, `perView`, `loop` and an autoplay that
|
|
21
|
+
stops on use and respects `prefers-reduced-motion`.
|
|
22
|
+
- Back-office set: **Chart** (bar, line, area, pie, donut, sparkline, fed by a Store), **Stat** (KPI tile), **Timeline** (event log and schedule), **Avatar**, **Image**, **MaskField**, **DateTimeField**.
|
|
23
|
+
- `NumberField`: `format: 'currency' | 'percent'` through `Intl`, `currency`, `locale`, and `scale` (cents as an integer); `setCurrency()`.
|
|
24
|
+
- Permissions: `setPermissionResolver`, `setPermissionMode` and `permission` / `permissionMode` on components, menu and NavMenu items, command palette commands, grid columns and actions.
|
|
25
|
+
- `form.setErrors({ 'items.0.name': '…' })` for server errors by dotted path; `displayFrom` and `setValue({ value, label })` so a lookup shows its text from the loaded record.
|
|
26
|
+
- Live data: `store.applyPatches()` and `store.connect(source)`; `store.fetchAll()` reads every page of a remote store.
|
|
27
|
+
- `exportGrid` (CSV, xlsx) and `printGrid`; print styles in the core.
|
|
28
|
+
- `persistState(key)` (a Grid plugin) and `setStateStorage` / `loadState` / `saveState` for per-user state.
|
|
29
|
+
- `shortcuts`: global and per-screen shortcuts with a help panel on `?`.
|
|
30
|
+
- `Window.confirmDiscard`.
|
|
31
|
+
- `defineTheme`: `seeds` (a light and dark theme from two colors), `fonts` (`@font-face`), `loadFonts`; `checkContrast()`; chart colors `--op-chart-1…8`.
|
|
32
|
+
- `optikos/dev` (warns about ignored config options) and `optikos/testing` (test helpers for apps); `TabPanelConfig` types the tab options of any container.
|
|
33
|
+
- Docs: the back-office recipes guide and the `panel` demo.
|
|
34
|
+
- Grid, Ext parity: `grouping()` (group headers, counts, totals through `Column.summary`), `treeGrid()` (a tree column over flat records with `parentId`, lazy `load`, `flattenTree`), `rowEditing()` (a whole row under a Save / Cancel bar), locked columns (`Column.locked`, `setColumnLocked`, kept in `getColumnState`) and `Grid.setRowLayout()` for plugins that add rows of their own.
|
|
35
|
+
- `optikos/bind`: `viewModel` (data, formulas, a linked record), `bindVM` (`'{record.name}'` bindings) and `bindForm` (a form bound to a record, both ways). New guide and `docs/internal/paridade-ext.md`.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- Window stays on screen when its content grows after opening (a FieldList gaining rows, a step change): it re-centers,
|
|
40
|
+
or, once dragged, moves up just enough to fit. Before, it grew past the bottom of the viewport with no way to scroll.
|
|
41
|
+
- `new Component({ renderTo })` mounts like `create` does (it was ignored), and `config.type` is set on instances made with `new`.
|
|
42
|
+
- Menu items typed from a variable (`const items = [{ text: 'a' }, '-']`) no longer need a cast.
|
|
43
|
+
- StepForm review: a FieldList shows one line per row with what the user sees, instead of `[object Object]`.
|
|
44
|
+
|
|
45
|
+
## [0.3.0] - 2026-11-10
|
|
46
|
+
|
|
47
|
+
### Added
|
|
48
|
+
|
|
49
|
+
- NavMenu in rail mode (`collapsed`): a group shows its icon (or initial) and opens a floating Menu beside it with its
|
|
50
|
+
title and children (badges included), by click, hover, → or Enter; the icon lights up when the active page is inside.
|
|
51
|
+
`MenuItem.badge`.
|
|
52
|
+
- StepForm: a step check per step, `validate(values, form, signal)`, that may ask the server. It runs when leaving the
|
|
53
|
+
step forward and on Finish, with Next/Finish loading; it returns `true`, a message for the step (an alert line above
|
|
54
|
+
it) or `{ field: message }`. A second click does nothing and going back aborts it.
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- StepForm: `goTo`, `next` and `back` return `Promise<boolean>` (they wait for the step checks on the way; without any,
|
|
59
|
+
the step still changes at once).
|
|
60
|
+
|
|
8
61
|
## [0.2.0] - 2026-11-10
|
|
9
62
|
|
|
10
63
|
### Added
|
|
@@ -141,6 +194,8 @@ First public release.
|
|
|
141
194
|
`corporate`, `soft`, `brutal`, `terminal`, `editorial` and `brand`.
|
|
142
195
|
- Per-component entry points (`optikos/components/<name>`) and stylesheets (`optikos/css/<name>.css`).
|
|
143
196
|
|
|
144
|
-
[Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.
|
|
197
|
+
[Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.4.0...HEAD
|
|
198
|
+
[0.4.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...v0.4.0
|
|
199
|
+
[0.3.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.2.0...v0.3.0
|
|
145
200
|
[0.2.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.1.0...v0.2.0
|
|
146
201
|
[0.1.0]: https://github.com/Denis-Zickuhr/optikos/releases/tag/v0.1.0
|
package/dist/bind.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-4C666HHU.js";var
|
|
1
|
+
import{a as M,b as k}from"./chunk-V5G5JECN.js";import"./chunk-4C666HHU.js";var x=e=>!!e&&typeof e.set=="function"&&"data"in e;function S(e={}){let n=structuredClone(e.data??{}),t=new Map,r=new Map,s=new Map,i=new Map,c=o=>t.get(o)??(t.set(o,l(0)),t.get(o)),u={get(o){c(o)();let d=o.split(".")[0];if(e.formulas&&d in e.formulas){let f=i.get(d);return f||i.set(d,f=b(()=>e.formulas[d](u.get))),M({[d]:f()},o)}return M(n,o)},set(o,d){let[f,...g]=o.split(".");if(e.formulas&&f in e.formulas)throw new Error(`Optikos viewModel: "${f}" is a formula and cannot be set`);let p=r.get(f);p&&g.length===1?p.set(g[0],d):k(n,o,d);for(let[y,T]of t)(y===o||y.startsWith(`${o}.`)||o.startsWith(`${y}.`))&&T.update(m=>m+1)},link(o,d){x(d)?(r.set(o,d),n[o]=d.data):(r.delete(o),n[o]=d),(s.get(o)??(s.set(o,l(0)),s.get(o))).update(f=>f+1);for(let[f,g]of t)(f===o||f.startsWith(`${o}.`))&&g.update(p=>p+1)},linked:o=>(s.get(o)??(s.set(o,l(0)),s.get(o)))()};return u}function V(e,n){let t=/^\{(!?)([\w.]+)\}$/.exec(n);return t?()=>t[1]?!e.get(t[2]):e.get(t[2]):()=>n.replace(/\{([\w.]+)\}/g,(r,s)=>String(e.get(s)??""))}function $(e,n,t){let r={};for(let i in t)r[i]=V(n,t[i]);v(e,r);let s=/^\{([\w.]+)\}$/.exec(t.value??"");s&&e.own(e.on("change",i=>n.set(s[1],i)))}function C(e,n,t="record"){for(let r of e.getFields()){if(!r.name)continue;let s=-1,i=`${t}.${r.name}`;e.own(w(()=>{let c=n.linked(t),u=n.get(i);r.setValue(u===void 0?r.getValue():u,!0),c!==s&&(r.markClean(),s=c)})),e.own(r.on("change",c=>n.get(t)&&n.set(i,c)))}}var a;function l(e){let n=e,t=new Set,r=(()=>(a&&(t.add(a),a.deps.add(t)),n));return r.set=s=>{if(!Object.is(s,n)){n=s;for(let i of[...t])i.run()}},r.update=s=>r.set(s(n)),r}function w(e){let n,t={deps:new Set,run(){for(let s of t.deps)s.delete(t);t.deps.clear(),n?.();let r=a;a=t;try{n=e()}finally{a=r}}};return t.run(),()=>{for(let r of t.deps)r.delete(t);t.deps.clear(),n?.()}}function b(e){let n=l(void 0);return w(()=>n.set(e())),n}function F(e){let n=l(0);return e.subscribe(()=>n.update(t=>t+1)),()=>(n(),e)}function v(e,n){for(let t in n){let r=`set${t[0].toUpperCase()}${t.slice(1)}`,s=e[r];if(typeof s!="function")throw new Error(`Optikos bind: ${e.constructor.name} has no ${r}()`);let i=n[t];e.own(w(()=>{s.call(e,i())}));let c=i.set;t==="value"&&c&&e.own(e.on("change",u=>c(u)))}}export{v as bind,C as bindForm,$ as bindVM,b as computed,w as effect,F as fromStore,l as signal,S as viewModel};
|
|
2
2
|
//# sourceMappingURL=bind.js.map
|
package/dist/bind.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/bind/index.ts"],
|
|
4
|
-
"sourcesContent": ["// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
|
|
3
|
+
"sources": ["../src/bind/viewmodel.ts", "../src/bind/index.ts"],
|
|
4
|
+
"sourcesContent": ["// The Ext-style ViewModel on top of the signals: shared data, formulas, a linked record, and `{path}` bindings for components.\nimport type { Component } from '../core/component';\nimport type { Field } from '../core/field';\nimport type { Model } from '../data/model';\nimport { getPath, setPath } from '../core/path';\nimport { signal, computed, effect, bind } from './index';\n\nexport interface ViewModelConfig {\n /** The starting data, nested as you like (`{ qty: 2, record: { name: 'Ada' } }`). */\n data?: Record<string, any>;\n /** Values computed from the data and each other: `{ total: (get) => get('qty') * get('price') }`. They are read like data (`get('total')`) and rerun when what they read changes. */\n formulas?: Record<string, (get: <T = any>(path: string) => T) => unknown>;\n}\n\nexport interface ViewModel {\n /** Reads a dotted path. Inside an `effect`, `computed` or `bind` it makes the reader rerun when that path changes. */\n get<T = any>(path: string): T;\n /** Writes a dotted path and notifies whoever read it, or something under it, or above it. A formula cannot be written. */\n set(path: string, value: unknown): void;\n /** Makes `name` stand for a record (a Model, or a plain object): `link('record', grid.getSelection()[0])`. A write to `record.x` goes through `model.set`, so the record is marked modified. `null` clears it. */\n link(name: string, record: Model | Record<string, any> | null): void;\n /** Counts the `link` calls for `name` (reactive): a form uses it to know it was given a new record. */\n linked(name: string): number;\n}\n\nconst isModel = (v: unknown): v is Model => !!v && typeof (v as Model).set === 'function' && 'data' in (v as object);\n\n/** Shared state for a screen: the Ext `ViewModel` subset that matters (data, formulas, a linked record) without the rest. */\nexport function viewModel(config: ViewModelConfig = {}): ViewModel {\n const data: Record<string, any> = structuredClone(config.data ?? {});\n const versions = new Map<string, ReturnType<typeof signal<number>>>();\n const models = new Map<string, Model>();\n const links = new Map<string, ReturnType<typeof signal<number>>>();\n const formulas = new Map<string, () => unknown>();\n const sig = (path: string) => versions.get(path) ?? (versions.set(path, signal(0)), versions.get(path)!);\n\n const vm: ViewModel = {\n get(path) {\n sig(path)();\n const root = path.split('.')[0];\n if (config.formulas && root in config.formulas) {\n let f = formulas.get(root);\n if (!f) formulas.set(root, (f = computed(() => config.formulas)));\n return getPath({ [root]: f() }, path);\n }\n return getPath(data, path);\n },\n set(path, value) {\n const [root, ...rest] = path.split('.');\n if (config.formulas && root in config.formulas) throw new Error(`Optikos viewModel: \"${root}\" is a formula and cannot be set`);\n const model = models.get(root);\n if (model && rest.length === 1) model.set(rest[0], value);\n else setPath(data, path, value);\n for (const [p, s] of versions) if (p === path || p.startsWith(`${path}.`) || path.startsWith(`${p}.`)) s.update((n) => n + 1);\n },\n link(name, record) {\n if (isModel(record)) (models.set(name, record), (data[name] = record.data));\n else (models.delete(name), (data[name] = record));\n (links.get(name) ?? (links.set(name, signal(0)), links.get(name)!)).update((n) => n + 1);\n for (const [p, s] of versions) if (p === name || p.startsWith(`${name}.`)) s.update((n) => n + 1);\n },\n linked: (name) => (links.get(name) ?? (links.set(name, signal(0)), links.get(name)!))(),\n };\n return vm;\n}\n\n/**\n * What a binding string means: `'{record.name}'` is that value as it is (`'{!busy}'` its negation), anything else is a\n * template (`'Hello {record.name}'`).\n */\nfunction source(vm: ViewModel, spec: string): () => unknown {\n const whole = /^\\{(!?)([\\w.]+)\\}$/.exec(spec);\n if (whole) return () => (whole[1] ? !vm.get(whole[2]) : vm.get(whole[2]));\n return () => spec.replace(/\\{([\\w.]+)\\}/g, (_, p) => String(vm.get(p) ?? ''));\n}\n\n/**\n * Ext's `bind: { text: '{record.name}', disabled: '{!canSave}' }` for any component: each key calls its setter whenever\n * what the string reads changes. A field's `value: '{record.name}'` is two ways: the field's `change` writes back.\n */\nexport function bindVM(cmp: Component<any>, vm: ViewModel, map: Record<string, string>): void {\n const sources: Record<string, () => unknown> = {};\n for (const key in map) sources[key] = source(vm, map[key]);\n bind(cmp, sources);\n const two = /^\\{([\\w.]+)\\}$/.exec(map.value ?? '');\n if (two) cmp.own(cmp.on('change', (v) => vm.set(two[1], v)));\n}\n\n/**\n * Binds every named field of a form to `record.<name>` of the view model, both ways. When the record is replaced (`link`)\n * the form is loaded from it and becomes clean; a change in the form writes through to the record (a Model is marked modified).\n */\nexport function bindForm(form: Component<any> & { getFields(): Array<Field<any>> }, vm: ViewModel, name = 'record'): void {\n for (const f of form.getFields()) {\n if (!f.name) continue;\n let seen = -1;\n const path = `${name}.${f.name}`;\n form.own(\n effect(() => {\n const gen = vm.linked(name);\n const v = vm.get(path);\n f.setValue(v === undefined ? f.getValue() : v, true);\n if (gen !== seen) (f.markClean(), (seen = gen));\n }),\n );\n form.own(f.on('change', (v) => vm.get(name) && vm.set(path, v)));\n }\n}\n", "// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n\nexport { viewModel, bindVM, bindForm, type ViewModel, type ViewModelConfig } from './viewmodel';\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isModel", "v", "viewModel", "config", "data", "versions", "models", "links", "formulas", "sig", "path", "signal", "vm", "root", "computed", "getPath", "value", "rest", "model", "setPath", "p", "s", "n", "name", "record", "source", "spec", "whole", "_", "bindVM", "cmp", "map", "sources", "key", "bind", "two", "bindForm", "form", "f", "seen", "effect", "gen", "running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as l}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{d as l}from"./chunk-S4QD5NID.js";import{a as m}from"./chunk-4C666HHU.js";var w={};m(w,{addDays:()=>D,addMonths:()=>y,firstDay:()=>h,formatDate:()=>d,fromISO:()=>s,parseDate:()=>p,toISO:()=>o,today:()=>f});var u=(t,n=2)=>String(t).padStart(n,"0"),o=t=>`${u(t.getFullYear(),4)}-${u(t.getMonth()+1)}-${u(t.getDate())}`;function s(t){let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return null;let e=new Date(+n[1],+n[2]-1,+n[3]);return e.getMonth()===+n[2]-1&&e.getDate()===+n[3]?e:null}var f=()=>o(new Date);function D(t,n){let e=s(t);return e.setDate(e.getDate()+n),o(e)}function y(t,n){let e=s(t),g=e.getDate();return e.setDate(1),e.setMonth(e.getMonth()+n),e.setDate(Math.min(g,new Date(e.getFullYear(),e.getMonth()+1,0).getDate())),o(e)}var d=(t,n={dateStyle:"short"})=>{let e=s(t);return e?new Intl.DateTimeFormat(l()._lang,n).format(e):""};function p(t){if(t=t.trim(),!t)return null;let n=s(t);if(n)return o(n);let e=t.split(/[/.\-\s]+/).map(Number);if(e.length!==3||e.some(a=>!Number.isInteger(a)))return null;let g=new Intl.DateTimeFormat(l()._lang).formatToParts(new Date(2e3,10,25)).filter(a=>a.type==="day"||a.type==="month"||a.type==="year").map(a=>a.type),r={};g.forEach((a,c)=>r[a]=e[c]),r.year<100&&(r.year+=2e3);let i=new Date(r.year,r.month-1,r.day);return i.getFullYear()===r.year&&i.getMonth()===r.month-1&&i.getDate()===r.day?o(i):null}function h(){let t=l();if(t._firstDay&&t._firstDay!=="0")return Number(t._firstDay);try{let n=new Intl.Locale(t._lang).getWeekInfo?.()??new Intl.Locale(t._lang).weekInfo;if(n?.firstDay)return n.firstDay%7}catch{}return 0}export{o as a,s as b,f as c,D as d,y as e,d as f,p as g,h,w as i};
|
|
2
|
+
//# sourceMappingURL=chunk-2GKIF7A6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/data/column.ts"],
|
|
4
|
+
"sourcesContent": ["import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\n/** A grid/table column. `T` is the record shape: `field` then autocompletes its keys (any string still works). */\nexport interface Column<T extends Record<string, any> = any> {\n field: Extract<keyof T, string> | (string & {});\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Pinned to the start or the end while the body scrolls sideways (give it a `width`; default 140). The columns of one edge stay together. */\n locked?: 'start' | 'end';\n /** With the `grouping()` plugin: what the total row shows for this column. */\n summary?: 'sum' | 'avg' | 'min' | 'max' | 'count' | ((values: any[], recs: Model<T>[]) => unknown);\n /** Text for the total of this column (default: the column's `format`, else the plain value). */\n summaryRenderer?: (value: any, col: Column<T>) => string | Node;\n /** Left out while `setPermissionResolver` denies it. */\n permission?: string;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model<T>, col: Column<T>) => string | Node;\n cls?: string;\n /** With the `cellEditing()` grid plugin: `true` (an editor for the value's type), a field type (`'select'`) or a field config. */\n editor?: boolean | string | Record<string, any>;\n /** With `cellEditing()`: whether this record's cell can be edited (default: every record, when `editor` is set). */\n editable?: (rec: Model<T>) => boolean;\n}\n\n/** Cell content for a record: `renderer` first, then `format`, then the plain value. */\nexport function cellContent<T extends Record<string, any>>(col: Column<T>, rec: Model<T>): string | Node {\n const v = rec.data[col.field];\n if (col.renderer) return col.renderer(v, rec, col);\n if (col.format) return format(col.format, v);\n return v == null ? '' : String(v);\n}\n"],
|
|
5
|
+
"mappings": "wCAyCO,SAASA,EAA2CC,EAAgBC,EAA8B,CACvG,IAAMC,EAAID,EAAI,KAAKD,EAAI,KAAK,EAC5B,OAAIA,EAAI,SAAiBA,EAAI,SAASE,EAAGD,EAAKD,CAAG,EAC7CA,EAAI,OAAeG,EAAOH,EAAI,OAAQE,CAAC,EACpCA,GAAK,KAAO,GAAK,OAAOA,CAAC,CAClC",
|
|
6
|
+
"names": ["cellContent", "col", "rec", "v", "format"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/dev.ts"],
|
|
4
|
+
"sourcesContent": ["/** True while developing: on localhost, or when `globalThis.__OPTIKOS_DEV__` says so. Dev-only warnings follow it. */\nexport const isDev = (): boolean => {\n const flag = (globalThis as { __OPTIKOS_DEV__?: boolean }).__OPTIKOS_DEV__;\n if (flag !== undefined) return flag;\n return typeof location !== 'undefined' && /^(localhost|127\\.0\\.0\\.1|\\[::1\\]|.*\\.local)$/.test(location.hostname);\n};\n"],
|
|
5
|
+
"mappings": "AACO,IAAMA,EAAQ,IAAe,CAClC,IAAMC,EAAQ,WAA6C,gBAC3D,OAAIA,IAAS,OAAkBA,EACxB,OAAO,SAAa,KAAe,+CAA+C,KAAK,SAAS,QAAQ,CACjH",
|
|
6
|
+
"names": ["isDev", "flag"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as p}from"./chunk-DIOJGTUN.js";import{a as o}from"./chunk-XR677UYD.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{b as n}from"./chunk-PZSHOSOS.js";import{f as s}from"./chunk-S4QD5NID.js";var r=class extends o{baseCls="op-field op-textfield";clearBtn;createInput(){return n("input","op-textfield__input",{type:this.config.inputType??"text"})}get input(){return this.inputEl}createControl(){let t=this.config,e=this.inputEl=this.createInput(),i=n("div","op-textfield__wrap",{},e);return t.placeholder&&(e.placeholder=t.placeholder),t.maxLength!=null&&(e.maxLength=t.maxLength),t.autocomplete&&(e.autocomplete=t.autocomplete),this.listen(e,"input",()=>this.onInput()),this.listen(e,"keydown",a=>this.onKey(a)),t.selectOnFocus&&this.listen(e,"focus",()=>e.select()),t.clearable&&(this.clearBtn=n("button","op-textfield__clear",{type:"button",tabindex:-1,"aria-label":s("clear")},p("x")),this.listen(this.clearBtn,"click",()=>{this.setValue(this.parse("")),e.focus()}),i.append(this.clearBtn)),i}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.commit(this.parse(this.input.value))}parse(t){return t}display(t){return t==null?"":String(t)}onKey(t){t.key==="Enter"&&!t.defaultPrevented?(this.flushSettled(),this.emit("enter",this.getValue())):t.key==="Escape"&&this.config.clearable&&this.input.value&&(t.stopPropagation(),this.setValue(this.parse("")))}getDisplayText(){return this.rendered?this.input.value:this.display(this.value)}applyValue(t){this.input.value=this.display(t),this.el.classList.toggle("has-value",!!this.input.value)}onReadonly(t){this.input.readOnly=t}onDisabled(t){this.input.disabled=t,this.clearBtn&&(this.clearBtn.disabled=t)}check(){let t=super.check(),e=this.display(this.value),i=this.config;return t||!e?t:i.minLength!=null&&e.length<i.minLength?s("minLength",{n:i.minLength}):i.pattern&&!new RegExp(i.pattern).test(e)?s("pattern"):""}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}setMaxLength(t){this.config.maxLength=t,this.rendered&&(this.input.maxLength=t)}setInputType(t){this.config.inputType=t,this.rendered&&this.input instanceof HTMLInputElement&&(this.input.type=t)}select(){this.input.select()}getInput(){return this.render(),this.input}};l("textfield",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-2YRQULDC.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as o}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as s,f as r}from"./chunk-S4QD5NID.js";s("en",{chipRemove:"Remove {text}"});s("pt-BR",{chipRemove:"Remover {text}"});var n=class extends h{baseCls="op-chip";tag="span";main;textEl;removeBtn;onRender(){let e=this.config;this.textEl=i("span","op-chip__text"),this.main=i("button","op-chip__main",{type:"button"},e.icon?o(e.icon):"",this.textEl),this.el.append(this.main),this.listen(this.main,"click",()=>{this.config.disabled||(this.config.selectable&&this.setSelected(!this.config.selected,!0),this.config.handler?.(this),this.emit("click",this))}),e.removable&&(this.removeBtn=i("button","op-chip__remove",{type:"button"},o("x")),this.el.append(this.removeBtn),this.listen(this.removeBtn,"click",()=>!this.config.disabled&&this.emit("remove",this)),this.listen(this.main,"keydown",t=>{(t.key==="Delete"||t.key==="Backspace")&&!this.config.disabled&&this.emit("remove",this)})),this.setText(e.text??""),this.setSelected(!!e.selected),this.setDisabled(!!e.disabled)}setText(e){this.config.text=e,this.rendered&&(this.textEl.textContent=e,this.removeBtn?.setAttribute("aria-label",r("chipRemove",{text:e})))}setSelected(e,t=!1){this.config.selected=e,this.rendered&&(this.el.classList.toggle("is-selected",e),this.config.selectable&&this.main.setAttribute("aria-pressed",String(e)),t&&this.emit("change",e))}isSelected(){return!!this.config.selected}setDisabled(e){super.setDisabled(e),this.rendered&&(this.main.disabled=e,this.removeBtn&&(this.removeBtn.disabled=e))}focusEl(){return this.main}};l("chip",n);export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3BG75P7T.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as o}from"./chunk-BQEFLPDA.js";import{c as i}from"./chunk-VV7CFMPZ.js";import{a as r}from"./chunk-TIPK3SCJ.js";var n="button:not(:disabled)",e=class extends o{baseCls="op-toolbar";rover;shorthand(t){if(t==="->")return{type:"spacer"};if(t==="-")return{type:"spacer",line:!0};if(t===" ")return{type:"spacer",width:8};throw new Error(`Optikos: unknown toolbar shorthand "${t}"`)}build(){let t=super.build();return t.setAttribute("role","toolbar"),this.config.vertical&&t.setAttribute("aria-orientation","vertical"),t}onRender(){this.config.layout??=this.config.vertical?{type:"vbox",align:"stretch"}:{type:"hbox",align:"center"},super.onRender(),this.el.classList.toggle("op-toolbar--vertical",!!this.config.vertical),this.rover=i(this.el,{selector:n,orientation:this.config.vertical?"vertical":"horizontal"}),this.own(()=>this.rover?.destroy())}notifyMount(){super.notifyMount(),this.rover?.sync()}};r("toolbar",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3F4MN2BU.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as d}from"./chunk-BQEFLPDA.js";import{a as r}from"./chunk-XR677UYD.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{b as c}from"./chunk-V5G5JECN.js";import{e as u}from"./chunk-PZSHOSOS.js";var h=class extends d{baseCls="op-form";tag="form";ruledOut=new Set;dirty=!1;constructor(t={}){let e=[...t.items??[]];t.tabs&&e.push({type:"tabs",flex:1,items:t.tabs.map(i=>({type:"container",title:i.title,icon:i.icon,cls:"op-form__tab",layout:i.layout??{type:"grid",columns:2,gap:12},items:i.items}))}),super({...t,items:e})}build(){let t=super.build();return t.setAttribute("novalidate",""),t}onRender(){if(this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},this.config.labelWidth!=null&&this.setLabelWidth(this.config.labelWidth),this.config.labelPos)for(let t of this.getFields())t.config.labelPos??=this.config.labelPos;super.onRender(),this.config.readonly&&this.setReadonly(!0);for(let t of this.getFields())for(let e of["invalid","valid","dirty-change","change"])t.on(e,()=>this.syncTabs());for(let t of this.getFields())t.on("change",()=>this.changed());for(let t of this.getFields())t.on("dirty-change",()=>this.changed());this.applyRules(),this.listen(this.el,"submit",t=>{t.preventDefault(),this.submit()}),this.listen(this.el,"keydown",t=>{let e=t.target;t.key==="Enter"&&e instanceof HTMLInputElement&&!t.defaultPrevented&&e.type!=="button"&&(t.preventDefault(),this.submit())})}getFields(){return this.query(t=>t instanceof r)}getField(t){return this.getFields().find(e=>e.name===t)}getValues(t={}){let e={};for(let i of this.counted())i.name&&(!t.dirtyOnly||i.isDirty())&&c(e,i.name,i.getValue());return e}counted(){return this.getFields().filter(t=>{for(let e=t;e&&e!==this;e=e.parent)if(this.ruledOut.has(e))return!1;return!0})}changed(){this.applyRules();let t=this.isDirty();t!==this.dirty&&this.emit("dirty-change",this.dirty=t)}applyRules(){let t={};for(let e of this.getFields())e.name&&c(t,e.name,e.getValue());for(let e of this.query(i=>!!(i.config.showIf||i.config.enableIf))){let{showIf:i,enableIf:s}=e.config;if(i){let a=!!i(t);if(a===this.ruledOut.has(e))if(a)this.ruledOut.delete(e),e.show();else{this.ruledOut.add(e),e.hide();for(let l of e instanceof r?[e]:e instanceof d?e.query(o=>o instanceof r):[])l.clearError()}}s&&e.setDisabled(!s(t))}}focusField(t){this.reveal(t),t.focus()}setValues(t){for(let e of this.getFields())e.fillFrom(t)}load(t){this.setValues("data"in t&&"get"in t?t.data:t),this.markClean(),this.clearErrors(),this.emit("load",t)}reveal(t){let e=t;for(;e.parent;){let i=e.parent;i.items?.includes(e)&&(typeof i.setActive=="function"?i.setActive(e):i.layout?.activate&&i.layout.activate(i,e)),e=i}}syncTabs(){for(let t of this.query(e=>typeof e.setTabState=="function"))for(let e of t.items){let i=e instanceof d?e.query(s=>s instanceof r):[];t.setTabState(e,{errors:i.filter(s=>s.getError()).length,dirty:i.some(s=>s.isDirty())})}}updateRecord(t){let e=this.getValues(),i=new Set(this.getFields().filter(s=>s.name&&s.isDirty()).map(s=>s.name.split(".")[0]));for(let s of i)t.set(s,e[s])}markClean(){this.getFields().forEach(t=>t.markClean()),this.syncTabs()}reset(){this.getFields().forEach(t=>t.reset()),this.syncTabs()}isDirty(){return this.getFields().some(t=>t.isDirty())}isValid(){return this.counted().every(t=>t.config.disabled||t.isValid())}clearErrors(){this.getFields().forEach(t=>t.clearError()),this.syncTabs()}validate(){let t=this.counted().filter(i=>!i.config.disabled);for(let i of this.getFields())t.includes(i)||i.clearError();let e=t.filter(i=>!i.validate());return this.syncTabs(),e.length&&(this.reveal(e[0]),e[0].focus(),this.emit("invalid",e)),this.el.classList.toggle("is-invalid",!!e.length),!e.length}setErrors(t){this.clearErrors();let e=[],i;for(let[s,a]of Object.entries(t)){let l=this.getFields().filter(n=>n.name),o=l.find(n=>n.name===s)??l.filter(n=>s.startsWith(n.name+".")).sort((n,g)=>g.name.length-n.name.length)[0];o&&o.render();let f=o?.name===s?o:o?.fieldAt?.(s.slice(o.name.length+1));f?(f.setError(a),i??={host:o,target:f}):e.push(s)}return this.syncTabs(),i&&(this.el.classList.add("is-invalid"),this.emit("invalid",this.getFields().filter(s=>s.getError())),this.reveal(i.host),i.target.focus()),e}submit(){return this.emit("before-submit")===!1||!this.validate()?!1:(this.emit("submit",this.getValues()),!0)}setLabelWidth(t){this.config.labelWidth=t,this.rendered&&this.el.style.setProperty("--op-field-label-width",u(t))}setReadonly(t){this.config.readonly=t,this.getFields().forEach(e=>e.setReadonly(t))}};m("form",h);export{h as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3FCIZKIN.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/form/form.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport type { Model } from '../../../data/model';\nimport type { Component } from '../../../core/component';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { px } from '../../../core/dom';\nimport { setPath } from '../../../core/path';\n\nexport interface FormTab {\n title: string;\n icon?: string;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface FormConfig extends ContainerConfig {\n /** Shortcut: the fields in tabs, still one form (one `getValues`, one `validate`, one dirty). */\n tabs?: FormTab[];\n /** Default `labelPos` for fields that do not set their own. */\n labelPos?: 'top' | 'left';\n /** Width of the labels on the left (`labelPos: 'left'`), so they line up in a column. Number = px. */\n labelWidth?: number | string;\n /** Shortcut for a responsive grid layout (one column on narrow screens); items take `colspan` (a number or `'full'`). */\n columns?: number;\n readonly?: boolean;\n}\n\nexport class Form extends Container<FormConfig> {\n protected override baseCls = 'op-form';\n protected override tag = 'form' as const;\n /** Components hidden by their `showIf` rule: their fields do not count (no validation, not in `getValues`). */\n private ruledOut = new Set<Component>();\n private dirty = false;\n\n constructor(config: FormConfig = {}) {\n const items = [...(config.items ?? [])];\n if (config.tabs) {\n items.push({\n type: 'tabs',\n flex: 1,\n items: config.tabs.map((t) => ({ type: 'container', title: t.title, icon: t.icon, cls: 'op-form__tab', layout: t.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: t.items })),\n });\n }\n super({ ...config, items });\n }\n\n protected override build() {\n const el = super.build();\n el.setAttribute('novalidate', '');\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= this.config.columns ? { type: 'grid', columns: this.config.columns } : { type: 'vbox' };\n if (this.config.labelWidth != null) this.setLabelWidth(this.config.labelWidth);\n if (this.config.labelPos) for (const f of this.getFields()) f.config.labelPos ??= this.config.labelPos;\n super.onRender();\n if (this.config.readonly) this.setReadonly(true);\n for (const f of this.getFields()) for (const ev of ['invalid', 'valid', 'dirty-change', 'change']) f.on(ev, () => this.syncTabs());\n for (const f of this.getFields()) f.on('change', () => this.changed());\n for (const f of this.getFields()) f.on('dirty-change', () => this.changed());\n this.applyRules();\n // Native submit (a `type=submit` button) and Enter inside a single-line field both go through submit().\n this.listen(this.el, 'submit', (e: Event) => {\n e.preventDefault();\n this.submit();\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const t = e.target as HTMLElement;\n if (e.key === 'Enter' && t instanceof HTMLInputElement && !e.defaultPrevented && t.type !== 'button') {\n e.preventDefault();\n this.submit();\n }\n });\n }\n\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getField(name: string): Field<any> | undefined {\n return this.getFields().find((f) => f.name === name);\n }\n\n /** Nested object built from field names (`address.city` \u2192 `{ address: { city } }`). Fields hidden by `showIf` are left out. */\n getValues(opts: { dirtyOnly?: boolean } = {}): Record<string, any> {\n const out: Record<string, any> = {};\n for (const f of this.counted()) if (f.name && (!opts.dirtyOnly || f.isDirty())) setPath(out, f.name, f.getValue());\n return out;\n }\n\n /** The fields that count: not inside something its `showIf` rule hid. */\n private counted(): Field<any>[] {\n return this.getFields().filter((f) => {\n for (let c: Component | undefined = f; c && c !== this; c = c.parent as Component | undefined) if (this.ruledOut.has(c)) return false;\n return true;\n });\n }\n\n /** A field changed: rerun the `showIf`/`enableIf` rules and say when the form as a whole became (un)changed. */\n private changed(): void {\n this.applyRules();\n const d = this.isDirty();\n if (d !== this.dirty) this.emit('dirty-change', (this.dirty = d));\n }\n\n /** Shows/hides and enables/disables every item that has a rule, from the current values (hidden fields included). */\n applyRules(): void {\n const values: Record<string, any> = {};\n for (const f of this.getFields()) if (f.name) setPath(values, f.name, f.getValue());\n for (const c of this.query((x) => !!(x.config.showIf || x.config.enableIf))) {\n const { showIf, enableIf } = c.config;\n if (showIf) {\n const show = !!showIf(values);\n if (show === this.ruledOut.has(c)) {\n if (show) (this.ruledOut.delete(c), c.show());\n else {\n this.ruledOut.add(c);\n c.hide();\n // what nobody can see has nothing to fix: its errors go with it\n for (const f of c instanceof Field ? [c] : c instanceof Container ? (c.query((x) => x instanceof Field) as Field<any>[]) : []) f.clearError();\n }\n }\n }\n if (enableIf) c.setDisabled(!enableIf(values));\n }\n }\n\n /** Brings a field into view (opening its tab or step) and focuses it. */\n focusField(field: Field<any>): void {\n this.reveal(field);\n field.focus();\n }\n\n /** Sets the fields present in `values` (silently). */\n setValues(values: Record<string, any>): void {\n for (const f of this.getFields()) f.fillFrom(values);\n }\n\n /** Fills the form from a plain object or a Model, and makes it the \"clean\" state. */\n load(record: Record<string, any> | Model): void {\n this.setValues('data' in record && 'get' in record ? (record as Model).data : record);\n this.markClean();\n this.clearErrors();\n this.emit('load', record);\n }\n\n /** Brings a field into view: asks every ancestor that shows one child at a time (Tabs, a card layout) to show the branch. */\n protected reveal(field: Component): void {\n let node: Component = field;\n while (node.parent) {\n const p = node.parent as any;\n if (p.items?.includes(node)) {\n if (typeof p.setActive === 'function') p.setActive(node);\n else if (p.layout?.activate) p.layout.activate(p, node);\n }\n node = p;\n }\n }\n\n /** Error counts and \"changed\" dots on the headers of every Tabs inside the form. */\n protected syncTabs(): void {\n for (const tabs of this.query((c) => typeof (c as any).setTabState === 'function') as any[]) {\n for (const panel of tabs.items as Component[]) {\n const fields = panel instanceof Container ? (panel.query((c) => c instanceof Field) as Field<any>[]) : [];\n tabs.setTabState(panel, { errors: fields.filter((f) => f.getError()).length, dirty: fields.some((f) => f.isDirty()) });\n }\n }\n }\n\n /** Writes the changed fields back into a Model. */\n updateRecord(model: Model): void {\n const all = this.getValues();\n const keys = new Set(this.getFields().filter((f) => f.name && f.isDirty()).map((f) => f.name!.split('.')[0]));\n for (const k of keys) model.set(k, all[k]);\n }\n\n markClean(): void {\n this.getFields().forEach((f) => f.markClean());\n this.syncTabs();\n }\n reset(): void {\n this.getFields().forEach((f) => f.reset());\n this.syncTabs();\n }\n isDirty(): boolean {\n return this.getFields().some((f) => f.isDirty());\n }\n isValid(): boolean {\n return this.counted().every((f) => f.config.disabled || f.isValid());\n }\n clearErrors(): void {\n this.getFields().forEach((f) => f.clearError());\n this.syncTabs();\n }\n\n /** Validates every field that counts (marks errors) and focuses the first invalid one. */\n validate(): boolean {\n // a hidden or disabled field is not validated: the user could not fix it\n const counted = this.counted().filter((f) => !f.config.disabled);\n for (const f of this.getFields()) if (!counted.includes(f)) f.clearError();\n const bad = counted.filter((f) => !f.validate());\n this.syncTabs();\n if (bad.length) {\n this.reveal(bad[0]); // the tab / step that holds it comes forward first\n bad[0].focus();\n this.emit('invalid', bad);\n }\n this.el.classList.toggle('is-invalid', !!bad.length);\n return !bad.length;\n }\n\n /**\n * Marks server-side errors by dotted path (`slug`, `items.0.name` for a row of a FieldList), brings the first into\n * view (its tab or step) and focuses it. Returns the paths that matched no field, for the caller to show some other way.\n */\n setErrors(errors: Record<string, string>): string[] {\n this.clearErrors();\n const unmatched: string[] = [];\n let first: { host: Field<any>; target: Field<any> } | undefined;\n for (const [path, msg] of Object.entries(errors)) {\n const fields = this.getFields().filter((f) => f.name);\n const host = fields.find((f) => f.name === path) ?? fields.filter((f) => path.startsWith(f.name + '.')).sort((a, b) => b.name!.length - a.name!.length)[0];\n if (host) host.render();\n const target = host?.name === path ? host : (host as any)?.fieldAt?.(path.slice(host!.name!.length + 1));\n if (!target) unmatched.push(path);\n else {\n target.setError(msg);\n first ??= { host: host!, target };\n }\n }\n this.syncTabs();\n if (first) {\n this.el.classList.add('is-invalid');\n this.emit('invalid', this.getFields().filter((f) => f.getError()));\n this.reveal(first.host);\n first.target.focus();\n }\n return unmatched;\n }\n\n submit(): boolean {\n if (this.emit('before-submit') === false) return false;\n if (!this.validate()) return false;\n this.emit('submit', this.getValues());\n return true;\n }\n\n /** Width of the labels on the left (number = px); they line up in a column. */\n setLabelWidth(width: number | string): void {\n this.config.labelWidth = width;\n if (this.rendered) this.el.style.setProperty('--op-field-label-width', px(width));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n this.getFields().forEach((f) => f.setReadonly(readonly));\n }\n}\nregister('form', Form);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Form", "Container", "config", "items", "t", "el", "f", "ev", "e", "c", "Field", "name", "opts", "out", "setPath", "d", "values", "x", "showIf", "enableIf", "show", "field", "record", "node", "p", "tabs", "panel", "fields", "model", "all", "keys", "k", "counted", "bad", "errors", "unmatched", "first", "path", "msg", "host", "a", "b", "target", "width", "px", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as i}from"./chunk-TIPK3SCJ.js";import{f as o}from"./chunk-UDXO3KM3.js";import{f as r}from"./chunk-S4QD5NID.js";var e=class extends o{baseCls="op-spinner";tag="span";onRender(){this.el.setAttribute("role","progressbar"),this.setLabel(this.config.label??r("loading"))}setLabel(t){this.config.label=t,this.rendered&&this.el.setAttribute("aria-label",t)}};i("spinner",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3FK52VQX.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as V}from"./chunk-TIPK3SCJ.js";import{b as D}from"./chunk-XQHATUKN.js";import{f as O}from"./chunk-UDXO3KM3.js";import{b as c}from"./chunk-PZSHOSOS.js";import{e as R,f as A}from"./chunk-S4QD5NID.js";R("en",{chart:"Chart",chartPercent:"{n}%"});R("pt-BR",{chart:"Gr\xE1fico",chartPercent:"{n}%"});var Y="http://www.w3.org/2000/svg",W=y=>y%8?`var(--op-chart-${y%8+1})`:"var(--op-chart-1, var(--op-color-primary))";function m(y,t={},i=""){let e=document.createElementNS(Y,y);i&&e.setAttribute("class",i);for(let a in t)e.setAttribute(a,String(t[a]));return e}function Z(y,t,i=4){let a=(t-y||1)/i,s=10**Math.floor(Math.log10(a)),l=([1,2,2.5,5,10].find(r=>r*s>=a)??10)*s,o=[];for(let r=Math.floor(y/l)*l;r<t+l*.999;r+=l)o.push(Math.round(r/l)*l);return o}var F=class extends O{baseCls="op-chart";svg;plot;tip;legendEl;sr;hidden=new Set;rows=[];active=-1;geom;queued=!1;offStore;build(){return this.svg=m("svg",{role:"img",tabindex:0,preserveAspectRatio:"xMidYMid meet"},"op-chart__svg"),this.tip=c("div","op-chart__tip",{role:"status"}),this.tip.hidden=!0,this.plot=c("div","op-chart__plot",{},this.svg,this.tip),this.legendEl=c("div","op-chart__legend"),this.sr=c("table","op-sr-only"),c("div",this.baseCls,{},this.plot,this.legendEl,this.sr)}onRender(){let t=this.config;if(this.el.classList.add(`op-chart--${t.kind??"bar"}`),t.store&&this.bindStore(t.store),this.setData(t.data??[]),this.listen(this.svg,"keydown",i=>this.onKey(i)),this.listen(this.svg,"blur",()=>this.activate(-1)),this.listen(this.svg,"pointerleave",()=>this.activate(-1)),typeof ResizeObserver=="function"){let i=0,e=new ResizeObserver(()=>this.plot.clientWidth!==i&&(i=this.plot.clientWidth,this.paint()));e.observe(this.plot),this.own(()=>e.disconnect())}}bindStore(t){this.offStore?.(),this.config.store=t,this.offStore=t.subscribe(()=>{this.queued||(this.queued=!0,queueMicrotask(()=>(this.queued=!1,this.rendered&&!this.destroyed&&this.setData(t.getFiltered().map(i=>i.data)))))}),this.own(()=>this.offStore?.())}setStore(t){this.bindStore(t),this.rendered&&this.setData(t.getFiltered().map(i=>i.data))}setData(t){this.rows=t,this.rendered&&this.paint()}setKind(t){this.el.classList.remove(`op-chart--${this.config.kind??"bar"}`),this.config.kind=t,this.el.classList.add(`op-chart--${t}`),this.paint()}setSeries(t){this.config.series=t,this.hidden.clear(),this.paint()}series(){return this.config.series.map((t,i)=>{let e=typeof t=="string"?{field:t}:t;return{field:e.field,label:e.label??e.field,color:e.color??W(i),idx:i}})}fmt(t){return D(this.config.format??"number",t)}isPie(){return this.config.kind==="pie"||this.config.kind==="donut"}slices(){let t=this.series()[0].field;return this.rows.map((i,e)=>({label:String(i[this.config.x]??""),value:Math.max(0,Number(i[t])||0),color:W(e),idx:e}))}paint(){if(!this.rendered)return;let t=this.config,i=t.kind??"bar",e=i==="sparkline",a=Math.max(this.plot.clientWidth,0)||600,s=t.height??(e?36:240);this.svg.replaceChildren(),this.svg.setAttribute("viewBox",`0 0 ${a} ${s}`),this.svg.style.height=`${s}px`,this.svg.setAttribute("aria-label",t.title??A("chart")),this.geom=void 0,this.active=-1,this.tip.hidden=!0,!this.rows.length||!t.series.length?this.svg.append(Object.assign(m("text",{x:a/2,y:s/2,"text-anchor":"middle"},"op-chart__empty"),{textContent:A("empty")})):this.isPie()?this.paintPie(a,s):this.paintXY(a,s,i),this.paintLegend(),this.paintTable()}paintXY(t,i,e){let a=this.config,s=e==="sparkline",l=this.series().filter(n=>!this.hidden.has(n.idx)),o=this.rows.length,r=l.map(n=>this.rows.map(h=>Number(h[n.field])||0)),g=!!a.stacked&&(e==="bar"||e==="area"),p=r.map((n,h)=>n.map((f,v)=>g?r.slice(0,h).reduce((w,u)=>w+u[v],0):0)),d=r.map((n,h)=>n.map((f,v)=>f+p[h][v])),b=d.flat(),C=e==="line"||s?Math.min(0,...b):0,E=Math.max(...b,0),_=s?[C,E]:Z(C,E),N=_[0],I=_[_.length-1]||1,$=s?2:Math.max(..._.map(n=>this.fmt(n).length))*6.5+12,T=s?2:8,P=s?3:8,L=s?i-3:i-24,M=(t-$-T)/o,x=n=>L-(n-N)/(I-N||1)*(L-P),S=n=>$+M*(n+.5);if(this.geom={left:$,band:M,top:P,bottom:L,n:o},!s){let n=m("g",{},"op-chart__grid");for(let f of _)n.append(m("line",{x1:$,x2:t-T,y1:x(f),y2:x(f)},f===0?"op-chart__axis":"")),n.append(Object.assign(m("text",{x:$-6,y:x(f),"text-anchor":"end",dy:"0.32em"},"op-chart__tick"),{textContent:this.fmt(f)}));let h=Math.ceil(48/M);this.rows.forEach((f,v)=>v%h===0&&n.append(Object.assign(m("text",{x:S(v),y:i-7,"text-anchor":"middle"},"op-chart__tick"),{textContent:String(f[a.x]??"")}))),this.svg.append(n)}let q=m("g",{},"op-chart__marks");l.forEach((n,h)=>{let f=m("g",{style:`--op-chart-c:${n.color}`},"op-chart__series");if(e==="bar"){let v=M*.7/(g?1:l.length);r[h].forEach((w,u)=>{let k=S(u)-M*.7/2+(g?0:h*v),K=x(d[h][u]);f.append(m("rect",{x:k,y:Math.min(K,x(p[h][u])),width:Math.max(v-(g?0:1),1),height:Math.abs(x(p[h][u])-K),rx:2},"op-chart__bar"))})}else{let v=d[h].map((w,u)=>`${u?"L":"M"}${S(u).toFixed(1)} ${x(w).toFixed(1)}`).join("");if(e!=="line"){let w=g?p[h].map((u,k)=>`L${S(o-1-k).toFixed(1)} ${x(p[h][o-1-k]).toFixed(1)}`).join(""):`L${S(o-1)} ${x(0)}L${S(0)} ${x(0)}`;f.append(m("path",{d:`${v}${w}Z`},"op-chart__area"))}if(f.append(m("path",{d:v},"op-chart__line")),s||o<=40){let w=s?[o-1]:d[h].map((u,k)=>k);for(let u of w)f.append(m("circle",{cx:S(u),cy:x(d[h][u]),r:s?2.5:3},"op-chart__dot"))}}q.append(f)}),this.svg.append(q),this.svg.append(m("line",{y1:P,y2:L,x1:0,x2:0},"op-chart__guide"));let G=m("g");for(let n=0;n<o;n++){let h=m("rect",{x:$+M*n,y:0,width:M,height:i},"op-chart__hit");h.addEventListener("pointerenter",()=>this.activate(n)),h.addEventListener("pointerdown",()=>this.activate(n)),G.append(h)}this.svg.append(G)}paintPie(t,i){let e=this.slices().filter(d=>!this.hidden.has(d.idx)),a=e.reduce((d,b)=>d+b.value,0)||1,s=Math.min(t,i)/2-6,l=this.config.kind==="donut"?s*.6:0,[o,r]=[t/2,i/2],g=(d,b)=>`${(o+b*Math.sin(d)).toFixed(2)} ${(r-b*Math.cos(d)).toFixed(2)}`,p=0;for(let d of e){let b=p+Math.min(d.value/a*Math.PI*2,Math.PI*2-1e-4),C=b-p>Math.PI?1:0,E=`M${g(p,s)}A${s} ${s} 0 ${C} 1 ${g(b,s)}`+(l?`L${g(b,l)}A${l} ${l} 0 ${C} 0 ${g(p,l)}Z`:`L${o} ${r}Z`),_=m("path",{d:E,style:`--op-chart-c:${d.color}`},"op-chart__slice");_.addEventListener("pointerenter",()=>this.activate(d.idx)),this.svg.append(_),p=b}l&&this.svg.append(Object.assign(m("text",{x:o,y:r,"text-anchor":"middle",dy:"0.32em"},"op-chart__total"),{textContent:this.fmt(a)}))}paintLegend(){let t=this.config,i=this.isPie()?this.slices().map(e=>({label:e.label,color:e.color,idx:e.idx})):this.series();this.legendEl.hidden=!(t.legend??(this.isPie()||i.length>1))||t.kind==="sparkline"||!this.rows.length,this.legendEl.replaceChildren(...i.map(e=>{let a=c("button",`op-chart__key${this.hidden.has(e.idx)?" is-off":""}`,{type:"button","aria-pressed":String(!this.hidden.has(e.idx))},c("span","op-chart__swatch"),e.label);return a.style.setProperty("--op-chart-c",e.color),a.addEventListener("click",()=>(this.hidden.has(e.idx)?this.hidden.delete(e.idx):this.hidden.add(e.idx),this.paint())),a}))}paintTable(){let t=this.config,i=this.series();this.sr.replaceChildren(Object.assign(c("caption"),{textContent:t.title??""}),c("thead","",{},c("tr","",{},c("th","",{},t.x),...i.map(e=>c("th","",{},e.label)))),c("tbody","",{},...this.rows.map(e=>c("tr","",{},c("td","",{},String(e[t.x]??"")),...i.map(a=>c("td","",{},this.fmt(Number(e[a.field])||0)))))))}activate(t){this.active=t;let i=this.geom,e=this.svg.querySelector(".op-chart__guide");if(this.svg.querySelectorAll(".op-chart__slice").forEach((r,g)=>r.classList.toggle("is-active",this.slices().filter(p=>!this.hidden.has(p.idx))[g]?.idx===t)),t<0||!this.rows[t])return this.tip.hidden=!0,void e?.classList.remove("is-on");let a=this.config,s=[],l=String(this.rows[t][a.x]??""),o;if(this.isPie()){let r=this.slices()[t],g=this.slices().filter(p=>!this.hidden.has(p.idx)).reduce((p,d)=>p+d.value,0)||1;s.push([r.color,this.fmt(r.value),A("chartPercent",{n:Math.round(r.value/g*100)})]),o=this.plot.clientWidth/2}else{for(let r of this.series().filter(g=>!this.hidden.has(g.idx)))s.push([r.color,r.label,this.fmt(Number(this.rows[t][r.field])||0)]);o=i?i.left+i.band*(t+.5):0,e&&i&&(e.setAttribute("x1",String(o)),e.setAttribute("x2",String(o)),e.classList.add("is-on"))}this.tip.replaceChildren(c("div","op-chart__tip-head",{},l),...s.map(([r,g,p])=>{let d=c("div","op-chart__tip-row",{},c("span","op-chart__swatch"),c("span","",{},g),c("b","",{},p));return d.style.setProperty("--op-chart-c",r),d})),this.tip.hidden=!1,this.tip.classList.toggle("is-left",o>this.plot.clientWidth/2),this.tip.style.left=`${o}px`,this.emit("point",this.rows[t],t)}onKey(t){let i=this.rows.length,e=t.key==="ArrowRight"||t.key==="ArrowDown"?this.active+1:t.key==="ArrowLeft"||t.key==="ArrowUp"?this.active-1:t.key==="Home"?0:t.key==="End"?i-1:t.key==="Escape"?-1:void 0;e!==void 0&&(t.preventDefault(),this.activate(Math.max(-1,Math.min(i-1,e))))}};V("chart",F);export{F as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3QRA3XOA.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/charts/chart/chart.ts"],
|
|
4
|
+
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { format, type Formatter } from '../../../data/format';\nimport type { Store } from '../../../data/store';\n\naddMessages('en', { chart: 'Chart', chartPercent: '{n}%' });\naddMessages('pt-BR', { chart: 'Gr\u00E1fico', chartPercent: '{n}%' });\n\nexport interface ChartSeries {\n /** Record field with the value. */\n field: string;\n /** Name in the legend and tooltip. Default: the field. */\n label?: string;\n /** Any CSS color. Default: the theme's `--op-chart-N` in order. */\n color?: string;\n}\n\nexport interface ChartConfig extends ComponentConfig {\n kind?: 'bar' | 'line' | 'area' | 'pie' | 'donut' | 'sparkline';\n /** Records. Give `data` or a `store` (any change of the store repaints the chart). */\n data?: Array<Record<string, any>>;\n store?: Store<any>;\n /** Field with the category: the x axis, or the name of each slice. */\n x: string;\n /** Series to draw (a field name, or an object). A pie and a donut draw the first one. */\n series: Array<string | ChartSeries>;\n /** `bar` and `area` pile the series up instead of putting them side by side. */\n stacked?: boolean;\n /** Default: shown when there is more than one series, or for a pie. */\n legend?: boolean;\n /** Name of a registered format (`money`, `number`, `percent`...) or a function, for the axis and the tooltip. Default `number`. */\n format?: string | Formatter;\n /** Accessible name; also the caption of the data table read by screen readers. */\n title?: string;\n /** Height in px. Default 240 (sparkline 36). */\n height?: number;\n}\n\nconst NS = 'http://www.w3.org/2000/svg';\n// the first series follows the theme's primary color unless the theme sets `--op-chart-1` (a var() resolved at :root would ignore a scoped theme)\nconst tone = (i: number) => (i % 8 ? `var(--op-chart-${(i % 8) + 1})` : 'var(--op-chart-1, var(--op-color-primary))');\ntype Pt = { label: string; value: number; color: string; idx: number };\n\nfunction s<K extends keyof SVGElementTagNameMap>(tag: K, attrs: Record<string, string | number> = {}, cls = ''): SVGElementTagNameMap[K] {\n const el = document.createElementNS(NS, tag);\n if (cls) el.setAttribute('class', cls);\n for (const k in attrs) el.setAttribute(k, String(attrs[k]));\n return el;\n}\n\n/** Round tick values from `min` to above `max`, about `n` of them. */\nfunction ticks(min: number, max: number, n = 4): number[] {\n const span = max - min || 1;\n const raw = span / n;\n const mag = 10 ** Math.floor(Math.log10(raw));\n const step = ([1, 2, 2.5, 5, 10].find((m) => m * mag >= raw) ?? 10) * mag;\n const out: number[] = [];\n for (let v = Math.floor(min / step) * step; v < max + step * 0.999; v += step) out.push(Math.round(v / step) * step);\n return out;\n}\n\n/** Bar, line, area, pie, donut and sparkline charts in SVG. Colors come from the theme (`--op-chart-1`...), so dark mode and white-label just work. */\nexport class Chart extends Component<ChartConfig> {\n protected override baseCls = 'op-chart';\n private svg!: SVGSVGElement;\n private plot!: HTMLElement;\n private tip!: HTMLElement;\n private legendEl!: HTMLElement;\n private sr!: HTMLTableElement;\n private hidden = new Set<number>();\n private rows: Array<Record<string, any>> = [];\n private active = -1;\n private geom: { left: number; band: number; top: number; bottom: number; n: number } | undefined;\n private queued = false;\n private offStore?: () => void;\n\n protected override build() {\n this.svg = s('svg', { role: 'img', tabindex: 0, preserveAspectRatio: 'xMidYMid meet' }, 'op-chart__svg') as SVGSVGElement;\n this.tip = h('div', 'op-chart__tip', { role: 'status' });\n this.tip.hidden = true;\n this.plot = h('div', 'op-chart__plot', {}, this.svg, this.tip);\n this.legendEl = h('div', 'op-chart__legend');\n this.sr = h('table', 'op-sr-only');\n return h('div', this.baseCls, {}, this.plot, this.legendEl, this.sr);\n }\n\n protected override onRender() {\n const c = this.config;\n this.el.classList.add(`op-chart--${c.kind ?? 'bar'}`);\n if (c.store) this.bindStore(c.store);\n this.setData(c.data ?? []);\n this.listen(this.svg, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.svg, 'blur', () => this.activate(-1));\n this.listen(this.svg, 'pointerleave', () => this.activate(-1));\n if (typeof ResizeObserver === 'function') {\n let last = 0;\n const ro = new ResizeObserver(() => this.plot.clientWidth !== last && ((last = this.plot.clientWidth), this.paint()));\n ro.observe(this.plot);\n this.own(() => ro.disconnect());\n }\n }\n\n private bindStore(store: Store<any>) {\n this.offStore?.();\n this.config.store = store;\n // a burst of live patches paints once\n this.offStore = store.subscribe(() => {\n if (this.queued) return;\n this.queued = true;\n queueMicrotask(() => ((this.queued = false), this.rendered && !this.destroyed && this.setData(store.getFiltered().map((r) => r.data))));\n });\n this.own(() => this.offStore?.());\n }\n\n setStore(store: Store<any>) {\n this.bindStore(store);\n if (this.rendered) this.setData(store.getFiltered().map((r) => r.data));\n }\n\n setData(data: Array<Record<string, any>>) {\n this.rows = data;\n if (this.rendered) this.paint();\n }\n\n setKind(kind: NonNullable<ChartConfig['kind']>) {\n this.el.classList.remove(`op-chart--${this.config.kind ?? 'bar'}`);\n this.config.kind = kind;\n this.el.classList.add(`op-chart--${kind}`);\n this.paint();\n }\n\n setSeries(series: ChartConfig['series']) {\n this.config.series = series;\n this.hidden.clear();\n this.paint();\n }\n\n // ---- model ----------------------------------------------------------------------------------\n\n private series(): Array<Required<Pick<ChartSeries, 'field' | 'label'>> & { color: string; idx: number }> {\n return this.config.series.map((x, idx) => {\n const o = typeof x === 'string' ? { field: x } : x;\n return { field: o.field, label: o.label ?? o.field, color: o.color ?? tone(idx), idx };\n });\n }\n\n private fmt(v: number): string {\n return format(this.config.format ?? 'number', v);\n }\n\n private isPie() {\n return this.config.kind === 'pie' || this.config.kind === 'donut';\n }\n\n private slices(): Pt[] {\n const f = this.series()[0].field;\n return this.rows.map((r, idx) => ({ label: String(r[this.config.x] ?? ''), value: Math.max(0, Number(r[f]) || 0), color: tone(idx), idx }));\n }\n\n // ---- painting -------------------------------------------------------------------------------\n\n private paint() {\n if (!this.rendered) return;\n const c = this.config;\n const kind = c.kind ?? 'bar';\n const spark = kind === 'sparkline';\n const W = Math.max(this.plot.clientWidth, 0) || 600;\n const H = c.height ?? (spark ? 36 : 240);\n this.svg.replaceChildren();\n this.svg.setAttribute('viewBox', `0 0 ${W} ${H}`);\n this.svg.style.height = `${H}px`;\n this.svg.setAttribute('aria-label', c.title ?? t('chart'));\n this.geom = undefined;\n this.active = -1;\n this.tip.hidden = true;\n if (!this.rows.length || !c.series.length) {\n this.svg.append(Object.assign(s('text', { x: W / 2, y: H / 2, 'text-anchor': 'middle' }, 'op-chart__empty'), { textContent: t('empty') }));\n } else if (this.isPie()) this.paintPie(W, H);\n else this.paintXY(W, H, kind as 'bar' | 'line' | 'area' | 'sparkline');\n this.paintLegend();\n this.paintTable();\n }\n\n private paintXY(W: number, H: number, kind: 'bar' | 'line' | 'area' | 'sparkline') {\n const c = this.config;\n const spark = kind === 'sparkline';\n const ser = this.series().filter((x) => !this.hidden.has(x.idx));\n const n = this.rows.length;\n const vals = ser.map((x) => this.rows.map((r) => Number(r[x.field]) || 0));\n const stack = !!c.stacked && (kind === 'bar' || kind === 'area');\n const base = vals.map((v, i) => v.map((_, j) => (stack ? vals.slice(0, i).reduce((a, w) => a + w[j], 0) : 0)));\n const tops = vals.map((v, i) => v.map((x, j) => x + base[i][j]));\n const all = tops.flat();\n const lo = kind === 'line' || spark ? Math.min(0, ...all) : 0;\n const hi = Math.max(...all, 0);\n const ts = spark ? [lo, hi] : ticks(lo, hi);\n const yMin = ts[0];\n const yMax = ts[ts.length - 1] || 1;\n const left = spark ? 2 : Math.max(...ts.map((v) => this.fmt(v).length)) * 6.5 + 12;\n const right = spark ? 2 : 8;\n const top = spark ? 3 : 8;\n const bottom = spark ? H - 3 : H - 24;\n const band = (W - left - right) / n;\n const y = (v: number) => bottom - ((v - yMin) / (yMax - yMin || 1)) * (bottom - top);\n const xc = (j: number) => left + band * (j + 0.5);\n this.geom = { left, band, top, bottom, n };\n\n if (!spark) {\n const grid = s('g', {}, 'op-chart__grid');\n for (const v of ts) {\n grid.append(s('line', { x1: left, x2: W - right, y1: y(v), y2: y(v) }, v === 0 ? 'op-chart__axis' : ''));\n grid.append(Object.assign(s('text', { x: left - 6, y: y(v), 'text-anchor': 'end', dy: '0.32em' }, 'op-chart__tick'), { textContent: this.fmt(v) }));\n }\n const step = Math.ceil(48 / band);\n this.rows.forEach((r, j) => j % step === 0 && grid.append(Object.assign(s('text', { x: xc(j), y: H - 7, 'text-anchor': 'middle' }, 'op-chart__tick'), { textContent: String(r[c.x] ?? '') })));\n this.svg.append(grid);\n }\n\n const marks = s('g', {}, 'op-chart__marks');\n ser.forEach((x, k) => {\n const g = s('g', { style: `--op-chart-c:${x.color}` }, 'op-chart__series');\n if (kind === 'bar') {\n const slot = (band * 0.7) / (stack ? 1 : ser.length);\n vals[k].forEach((v, j) => {\n const x0 = xc(j) - (band * 0.7) / 2 + (stack ? 0 : k * slot);\n const y0 = y(tops[k][j]);\n g.append(s('rect', { x: x0, y: Math.min(y0, y(base[k][j])), width: Math.max(slot - (stack ? 0 : 1), 1), height: Math.abs(y(base[k][j]) - y0), rx: 2 }, 'op-chart__bar'));\n });\n } else {\n const line = tops[k].map((v, j) => `${j ? 'L' : 'M'}${xc(j).toFixed(1)} ${y(v).toFixed(1)}`).join('');\n if (kind !== 'line') {\n const back = stack ? base[k].map((v, j) => `L${xc(n - 1 - j).toFixed(1)} ${y(base[k][n - 1 - j]).toFixed(1)}`).join('') : `L${xc(n - 1)} ${y(0)}L${xc(0)} ${y(0)}`;\n g.append(s('path', { d: `${line}${back}Z` }, 'op-chart__area'));\n }\n g.append(s('path', { d: line }, 'op-chart__line'));\n if (spark || n <= 40) {\n const pts = spark ? [n - 1] : tops[k].map((_, j) => j);\n for (const j of pts) g.append(s('circle', { cx: xc(j), cy: y(tops[k][j]), r: spark ? 2.5 : 3 }, 'op-chart__dot'));\n }\n }\n marks.append(g);\n });\n this.svg.append(marks);\n this.svg.append(s('line', { y1: top, y2: bottom, x1: 0, x2: 0 }, 'op-chart__guide'));\n\n // one transparent band per category: hover, touch and the tooltip live here, not on tiny marks\n const hits = s('g');\n for (let j = 0; j < n; j++) {\n const r = s('rect', { x: left + band * j, y: 0, width: band, height: H }, 'op-chart__hit');\n r.addEventListener('pointerenter', () => this.activate(j));\n r.addEventListener('pointerdown', () => this.activate(j));\n hits.append(r);\n }\n this.svg.append(hits);\n }\n\n private paintPie(W: number, H: number) {\n const slices = this.slices().filter((p) => !this.hidden.has(p.idx));\n const total = slices.reduce((a, p) => a + p.value, 0) || 1;\n const R = Math.min(W, H) / 2 - 6;\n const r0 = this.config.kind === 'donut' ? R * 0.6 : 0;\n const [cx, cy] = [W / 2, H / 2];\n const pt = (a: number, r: number) => `${(cx + r * Math.sin(a)).toFixed(2)} ${(cy - r * Math.cos(a)).toFixed(2)}`;\n let a0 = 0;\n for (const p of slices) {\n const a1 = a0 + Math.min((p.value / total) * Math.PI * 2, Math.PI * 2 - 0.0001);\n const big = a1 - a0 > Math.PI ? 1 : 0;\n const d = `M${pt(a0, R)}A${R} ${R} 0 ${big} 1 ${pt(a1, R)}` + (r0 ? `L${pt(a1, r0)}A${r0} ${r0} 0 ${big} 0 ${pt(a0, r0)}Z` : `L${cx} ${cy}Z`);\n const path = s('path', { d, style: `--op-chart-c:${p.color}` }, 'op-chart__slice');\n path.addEventListener('pointerenter', () => this.activate(p.idx));\n this.svg.append(path);\n a0 = a1;\n }\n if (r0) this.svg.append(Object.assign(s('text', { x: cx, y: cy, 'text-anchor': 'middle', dy: '0.32em' }, 'op-chart__total'), { textContent: this.fmt(total) }));\n }\n\n private paintLegend() {\n const c = this.config;\n const items = this.isPie() ? this.slices().map((p) => ({ label: p.label, color: p.color, idx: p.idx })) : this.series();\n this.legendEl.hidden = !(c.legend ?? (this.isPie() || items.length > 1)) || c.kind === 'sparkline' || !this.rows.length;\n this.legendEl.replaceChildren(\n ...items.map((x) => {\n const b = h('button', `op-chart__key${this.hidden.has(x.idx) ? ' is-off' : ''}`, { type: 'button', 'aria-pressed': String(!this.hidden.has(x.idx)) }, h('span', 'op-chart__swatch'), x.label);\n b.style.setProperty('--op-chart-c', x.color);\n b.addEventListener('click', () => (this.hidden.has(x.idx) ? this.hidden.delete(x.idx) : this.hidden.add(x.idx), this.paint()));\n return b;\n }),\n );\n }\n\n private paintTable() {\n const c = this.config;\n const ser = this.series();\n this.sr.replaceChildren(\n Object.assign(h('caption'), { textContent: c.title ?? '' }),\n h('thead', '', {}, h('tr', '', {}, h('th', '', {}, c.x), ...ser.map((x) => h('th', '', {}, x.label)))),\n h('tbody', '', {}, ...this.rows.map((r) => h('tr', '', {}, h('td', '', {}, String(r[c.x] ?? '')), ...ser.map((x) => h('td', '', {}, this.fmt(Number(r[x.field]) || 0)))))),\n );\n }\n\n // ---- tooltip --------------------------------------------------------------------------------\n\n private activate(j: number) {\n this.active = j;\n const g = this.geom;\n const guide = this.svg.querySelector<SVGLineElement>('.op-chart__guide');\n this.svg.querySelectorAll('.op-chart__slice').forEach((el, k) => el.classList.toggle('is-active', this.slices().filter((p) => !this.hidden.has(p.idx))[k]?.idx === j));\n if (j < 0 || !this.rows[j]) return void (this.tip.hidden = true, guide?.classList.remove('is-on'));\n const c = this.config;\n const rows: Array<[string, string, string]> = [];\n let head = String(this.rows[j][c.x] ?? '');\n let x: number;\n if (this.isPie()) {\n const p = this.slices()[j];\n const total = this.slices().filter((q) => !this.hidden.has(q.idx)).reduce((a, q) => a + q.value, 0) || 1;\n rows.push([p.color, this.fmt(p.value), t('chartPercent', { n: Math.round((p.value / total) * 100) })]);\n x = this.plot.clientWidth / 2;\n } else {\n for (const sr of this.series().filter((q) => !this.hidden.has(q.idx))) rows.push([sr.color, sr.label, this.fmt(Number(this.rows[j][sr.field]) || 0)]);\n x = g ? g.left + g.band * (j + 0.5) : 0;\n if (guide && g) (guide.setAttribute('x1', String(x)), guide.setAttribute('x2', String(x)), guide.classList.add('is-on'));\n }\n this.tip.replaceChildren(h('div', 'op-chart__tip-head', {}, head), ...rows.map(([color, a, b]) => { const r = h('div', 'op-chart__tip-row', {}, h('span', 'op-chart__swatch'), h('span', '', {}, a), h('b', '', {}, b)); r.style.setProperty('--op-chart-c', color); return r; }));\n this.tip.hidden = false;\n this.tip.classList.toggle('is-left', x > this.plot.clientWidth / 2);\n this.tip.style.left = `${x}px`;\n this.emit('point', this.rows[j], j);\n }\n\n private onKey(e: KeyboardEvent) {\n const n = this.rows.length;\n const next = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? this.active + 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? this.active - 1 : e.key === 'Home' ? 0 : e.key === 'End' ? n - 1 : e.key === 'Escape' ? -1 : undefined;\n if (next === undefined) return;\n e.preventDefault();\n this.activate(Math.max(-1, Math.min(n - 1, next)));\n }\n}\nregister('chart', Chart);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "NS", "tone", "i", "s", "tag", "attrs", "cls", "el", "k", "ticks", "min", "max", "n", "raw", "mag", "step", "m", "out", "v", "Chart", "Component", "h", "c", "e", "last", "ro", "store", "r", "data", "kind", "series", "x", "idx", "o", "format", "f", "spark", "W", "H", "t", "ser", "vals", "stack", "base", "_", "j", "a", "w", "tops", "all", "lo", "hi", "ts", "yMin", "yMax", "left", "right", "top", "bottom", "band", "y", "xc", "grid", "marks", "g", "slot", "x0", "y0", "line", "back", "pts", "hits", "slices", "p", "total", "R", "r0", "cx", "cy", "pt", "a0", "a1", "big", "d", "path", "items", "b", "guide", "rows", "head", "q", "sr", "color", "next", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as d}from"./chunk-DIOJGTUN.js";import{c as g}from"./chunk-BQEFLPDA.js";import{c as u}from"./chunk-VV7CFMPZ.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{c as b,d as h}from"./chunk-UDXO3KM3.js";import{b as r}from"./chunk-PZSHOSOS.js";import{e as p,f as l}from"./chunk-S4QD5NID.js";p("en",{tabErrors:"errors"});p("pt-BR",{tabErrors:"erros"});var f=class extends g{baseCls="op-tabs";barEl;panelsEl;tabs=new Map;pending=new Set;rover;constructor(t={}){super({defaultType:"container",...t});for(let e of this.items.filter(i=>!b(i.config.permission)&&(i.config.permissionMode??h())==="hide"))this.remove(e)}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=u(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):i.closest(".op-tabs__reload")?(this.setActive(o),this.reloadTab(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):i&&(e.key==="r"||e.key==="R")&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&this.tabConfig(i).reloadable&&this.reloadTab(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"),t.el.tabIndex=0;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,reloadable:e.reloadable??this.config.reloadable??!1,disabled:!!e.disabled}}addHeader(t){let{title:e,icon:i,closable:s,reloadable:o,disabled:n}=this.tabConfig(t),a=r("div","op-tabs__tab",{role:"tab",id:`${t.id}-tab`,tabindex:-1,"aria-selected":"false","aria-disabled":n?"true":null});a.append(i?d(i):"",r("span","op-tabs__title",{},e)),o&&a.append(r("span","op-tabs__reload",{"aria-hidden":"true","data-op-tip":l("reload")},d("refresh"))),s&&a.append(r("span","op-tabs__close",{"aria-hidden":"true","data-op-tip":l("close")},d("x"))),this.tabs.set(t,a),this.barEl.append(...[...this.items].filter(c=>this.tabs.has(c)).map(c=>this.tabs.get(c)))}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}async reloadTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(o=>o.id===t):t,i=e&&this.tabs.get(e);if(!e||i?.classList.contains("is-reloading")||this.emit("before-reload",e)===!1)return!1;i?.classList.add("is-reloading");let s=e.config.onReload?.(e);return s instanceof Promise&&(e.setLoading(!0),await s.catch(()=>{}),e.setLoading(!1)),i?.classList.remove("is-reloading"),this.emit("reload",e),!0}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)}};m("tabs",f);export{f as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3TCITFUU.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 '../../layout/panel/reload';\nimport { Component } from '../../../core/component';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport { allowed, permissionMode } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n tabErrors: 'errors',\n});\naddMessages('pt-BR', {\n tabErrors: 'erros',\n});\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 /** Default `reloadable` for tabs: a \u21BB in the tab that calls the panel's `onReload`. */\n reloadable?: 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 // a panel the user may not see is not a tab at all (a hidden panel would leave its header behind)\n for (const p of this.items.filter((x) => !allowed(x.config.permission) && (x.config.permissionMode ?? permissionMode()) === 'hide')) this.remove(p);\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 if (target.closest('.op-tabs__reload')) (this.setActive(panel), void this.reloadTab(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 else if (panel && (e.key === 'r' || e.key === 'R') && !e.ctrlKey && !e.metaKey && !e.altKey && this.tabConfig(panel).reloadable) void this.reloadTab(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 p.el.tabIndex = 0; // APG: the panel is reachable by Tab even when its content has nothing focusable (or scrolls)\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, reloadable: (c.reloadable as boolean) ?? this.config.reloadable ?? false, disabled: !!c.disabled };\n }\n\n private addHeader(p: Component) {\n const { title, icon, closable, reloadable, 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 (reloadable) tab.append(h('span', 'op-tabs__reload', { 'aria-hidden': 'true', 'data-op-tip': t('reload') }, iconEl('refresh')));\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 /**\n * Reloads a tab: calls its panel's `onReload` (`before-reload` can cancel). While a returned Promise is pending the panel\n * shows its loading mask and the tab's \u21BB spins; `reload(panel)` fires when it is done.\n */\n async reloadTab(tab: Component | string | number): Promise<boolean> {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const head = p && this.tabs.get(p);\n if (!p || head?.classList.contains('is-reloading') || this.emit('before-reload', p) === false) return false;\n head?.classList.add('is-reloading');\n const busy = (p.config as AnyConfig).onReload?.(p) as unknown;\n if (busy instanceof Promise) {\n p.setLoading(true);\n await busy.catch(() => undefined);\n p.setLoading(false);\n }\n head?.classList.remove('is-reloading');\n this.emit('reload', p);\n return true;\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": ["addMessages", "Tabs", "Container", "config", "p", "x", "allowed", "permissionMode", "left", "el", "h", "c", "roving", "tab", "target", "panel", "index", "title", "icon", "closable", "reloadable", "disabled", "iconEl", "t", "active", "on", "prev", "item", "head", "busy", "child", "destroy", "hadFocus", "removed", "state", "badge", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n=class{handlers=new Map;on(e,t){let s=this.handlers.get(e);return s?s.push(t):this.handlers.set(e,[t]),()=>this.off(e,t)}once(e,t){let s=this.on(e,(...r)=>(s(),t(...r)));return s}off(e,t){if(!t)this.handlers.delete(e);else{let s=this.handlers.get(e);s&&this.handlers.set(e,s.filter(r=>r!==t))}}emit(e,...t){let s=!0;for(let r of this.handlers.get(e)??[])r(...t)===!1&&(s=!1);return s}clearListeners(){this.handlers.clear()}};export{n as a};
|
|
2
|
+
//# sourceMappingURL=chunk-3VDLX7ET.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/emitter.ts"],
|
|
4
|
+
"sourcesContent": ["export type Handler = (...args: any[]) => unknown;\n\n/** Minimal observer. A handler that returns `false` makes `emit` return `false` (used by `before-*` events). */\nexport class Emitter {\n private handlers = new Map<string, Handler[]>();\n\n /** Subscribes; returns the unsubscribe function. */\n on(name: string, fn: Handler): () => void {\n const list = this.handlers.get(name);\n if (list) list.push(fn);\n else this.handlers.set(name, [fn]);\n return () => this.off(name, fn);\n }\n\n once(name: string, fn: Handler): () => void {\n const off = this.on(name, (...a) => {\n off();\n return fn(...a);\n });\n return off;\n }\n\n off(name: string, fn?: Handler): void {\n if (!fn) this.handlers.delete(name);\n else {\n const list = this.handlers.get(name);\n if (list) this.handlers.set(name, list.filter((f) => f !== fn));\n }\n }\n\n /** Returns `false` if any handler returned `false` (the event was cancelled). */\n emit(name: string, ...args: unknown[]): boolean {\n let ok = true;\n for (const fn of this.handlers.get(name) ?? []) if (fn(...args) === false) ok = false;\n return ok;\n }\n\n clearListeners(): void {\n this.handlers.clear();\n }\n}\n"],
|
|
5
|
+
"mappings": "AAGO,IAAMA,EAAN,KAAc,CACX,SAAW,IAAI,IAGvB,GAAGC,EAAcC,EAAyB,CACxC,IAAMC,EAAO,KAAK,SAAS,IAAIF,CAAI,EACnC,OAAIE,EAAMA,EAAK,KAAKD,CAAE,EACjB,KAAK,SAAS,IAAID,EAAM,CAACC,CAAE,CAAC,EAC1B,IAAM,KAAK,IAAID,EAAMC,CAAE,CAChC,CAEA,KAAKD,EAAcC,EAAyB,CAC1C,IAAME,EAAM,KAAK,GAAGH,EAAM,IAAII,KAC5BD,EAAI,EACGF,EAAG,GAAGG,CAAC,EACf,EACD,OAAOD,CACT,CAEA,IAAIH,EAAcC,EAAoB,CACpC,GAAI,CAACA,EAAI,KAAK,SAAS,OAAOD,CAAI,MAC7B,CACH,IAAME,EAAO,KAAK,SAAS,IAAIF,CAAI,EAC/BE,GAAM,KAAK,SAAS,IAAIF,EAAME,EAAK,OAAQG,GAAMA,IAAMJ,CAAE,CAAC,CAChE,CACF,CAGA,KAAKD,KAAiBM,EAA0B,CAC9C,IAAIC,EAAK,GACT,QAAWN,KAAM,KAAK,SAAS,IAAID,CAAI,GAAK,CAAC,EAAOC,EAAG,GAAGK,CAAI,IAAM,KAAOC,EAAK,IAChF,OAAOA,CACT,CAEA,gBAAuB,CACrB,KAAK,SAAS,MAAM,CACtB,CACF",
|
|
6
|
+
"names": ["Emitter", "name", "fn", "list", "off", "a", "f", "args", "ok"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as f}from"./chunk-GEJKFE4X.js";import{a as u}from"./chunk-RG6SHPHF.js";import{a as h}from"./chunk-2YRQULDC.js";import{c}from"./chunk-DIOJGTUN.js";import{f as o,g as p}from"./chunk-2GKIF7A6.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{b as d}from"./chunk-PZSHOSOS.js";import{f as n}from"./chunk-S4QD5NID.js";var a=class extends h{baseCls="op-field op-textfield op-picker op-datefield";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e}parse(e){let t=p(e);return this.garbage=!!e.trim()&&!t,t}display(e){return e?o(e,{day:"2-digit",month:"2-digit",year:"numeric"}):""}createControl(){let e=super.createControl(),t=this.input;t.setAttribute("role","combobox"),t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","false");let r=d("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},c("calendar"));this.listen(r,"mousedown",s=>s.preventDefault()),this.listen(r,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(r);let i=this.config;return this.cal=new f({value:i.value,min:i.min,max:i.max,firstDay:i.firstDay}),this.dd=new u({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",s=>{this.dd.close(),this.setValue(s),t.focus()}),this.dd.on("open",()=>{t.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{t.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let s=document.activeElement;!this.el.contains(s)&&!this.dd.el.contains(s)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),t=this.value;if(e||!t)return e;let{min:r,max:i}=this.config;return r&&t<r?n("dateMin",{n:o(r)}):i&&t>i?n("dateMax",{n:o(i)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};l("datefield",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-4AZ44KV4.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as l}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as l}from"./chunk-N2LS4JD6.js";import{c as a}from"./chunk-DIOJGTUN.js";import{a as h}from"./chunk-TIPK3SCJ.js";import{b as s}from"./chunk-PZSHOSOS.js";import{f as o}from"./chunk-S4QD5NID.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-4CWYF4O7.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as d}from"./chunk-DIOJGTUN.js";import{c as r}from"./chunk-BQEFLPDA.js";import{a as n}from"./chunk-TIPK3SCJ.js";import{b as i,c as o}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-S4QD5NID.js";var s=class extends r{baseCls="op-fieldset";tag="fieldset";legend;bodyEl;toggleBtn;descEl;getBody(){return this.bodyEl}build(){let e=super.build();return this.legend=i("legend","op-fieldset__legend"),this.descEl=i("p","op-fieldset__desc",{id:o("op-fs-desc")}),this.bodyEl=i("div","op-fieldset__body"),e.append(this.legend,this.descEl,this.bodyEl),e}onRender(){this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},super.onRender(),this.setVariant(this.config.variant??"box"),this.setDescription(this.config.description??""),this.config.collapsible&&(this.toggleBtn=i("button","op-fieldset__toggle",{type:"button"},d("chevron-up")),this.listen(this.toggleBtn,"click",()=>this.toggle()),this.legend.prepend(this.toggleBtn)),this.setTitle(this.config.title??""),this.setCollapsed(!!this.config.collapsed)}setTitle(e){if(this.config.title=e,!this.rendered)return;let t=this.legend.querySelector(".op-fieldset__title");t||(this.legend.append(t=i("span","op-fieldset__title")),this.config.collapsible&&this.listen(t,"click",()=>this.toggle())),t.textContent=e,this.legend.hidden=!e&&!this.config.collapsible}setDescription(e){this.config.description=e,this.rendered&&(this.descEl.textContent=e,this.descEl.hidden=!e,e?this.el.setAttribute("aria-describedby",this.descEl.id):this.el.removeAttribute("aria-describedby"))}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let t of["box","line","plain"])this.el.classList.toggle(`op-fieldset--${t}`,t===e)}setCollapsed(e){this.config.collapsed=e,this.rendered&&(this.el.classList.toggle("is-collapsed",e),this.bodyEl.hidden=e,e?this.descEl.hidden=!0:this.descEl.hidden=!this.config.description,this.toggleBtn?.setAttribute("aria-expanded",String(!e)),this.toggleBtn?.setAttribute("aria-label",l(e?"expand":"collapse")))}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}};n("fieldset",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-4OB2IM5L.js.map
|