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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/layout/layout.ts", "../src/core/container.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Component } from '../core/component';\nimport type { Container } from '../core/container';\nimport { px } from '../core/dom';\n\nexport interface Layout {\n init(c: Container): void;\n add?(c: Container, cmp: Component, index: number): void;\n remove?(c: Container, cmp: Component, index: number): void;\n /** Card only. */\n activate?(c: Container, cmp: Component): void;\n getActive?(c: Container): Component | undefined;\n /** Border only: below `narrowBelow` the west/east regions become drawers; these open and close them. */\n openRegion?(name: string): void;\n closeRegion?(name?: string): void;\n toggleRegion?(name: string): void;\n isRegionOpen?(name: string): boolean;\n /** Layouts that adapt to the width: whether the container is currently narrow, and a way to force it (tests, previews). */\n isNarrow?(): boolean;\n setNarrow?(narrow: boolean): void;\n}\n\nexport type LayoutConfig = { type: string; [option: string]: unknown };\nexport type LayoutSpec = string | LayoutConfig | Layout;\nexport type LayoutFactory = (config: Record<string, any>) => Layout;\n\nconst factories = new Map<string, LayoutFactory>();\n\n/** Registers a layout strategy under a name; users add their own the same way. */\nexport function registerLayout(name: string, factory: LayoutFactory): void {\n factories.set(name, factory);\n}\n\nexport function createLayout(spec: LayoutSpec): Layout {\n if (typeof spec === 'object' && 'init' in spec) return spec as Layout;\n const cfg = (typeof spec === 'string' ? { type: spec } : spec) as LayoutConfig;\n const f = factories.get(cfg.type);\n if (!f) throw new Error(`Optikos: unknown layout \"${cfg.type}\"`);\n return f(cfg);\n}\n\n/**\n * Keeps the class `is-narrow` on the container body while it is narrower than `below` px (a ResizeObserver on the\n * container itself, not the window, so a layout inside a small panel adapts too). Emits `narrow-change` on the container.\n */\nfunction watchNarrow(c: Container, below: number, on?: (narrow: boolean) => void) {\n const body = c.getBody();\n let narrow = false;\n const set = (n: boolean) => {\n if (n === narrow) return;\n narrow = n;\n body.classList.toggle('is-narrow', n);\n on?.(n);\n c.emit('narrow-change', n);\n };\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => body.clientWidth > 0 && set(body.clientWidth < below));\n ro.observe(body);\n c.own(() => ro.disconnect());\n }\n return { isNarrow: () => narrow, setNarrow: set };\n}\n\n/** Layouts that are only a class plus custom properties; the CSS does the work. */\nconst cssLayout =\n (name: string, vars: string[] = []): LayoutFactory =>\n (cfg) => ({\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', `op-layout-${name}`);\n for (const v of vars) if (cfg[v] != null) body.style.setProperty(`--op-layout-${v}`, px(cfg[v]));\n },\n });\n\nregisterLayout('fit', cssLayout('fit'));\nconst hbox = cssLayout('hbox', ['gap', 'align', 'justify', 'wrap']);\n/** `stackBelow: 600`: under that width the row becomes a column. */\nregisterLayout('hbox', (cfg) => {\n const base = hbox(cfg);\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n ...base,\n init(c) {\n base.init(c);\n if (cfg.stackBelow) {\n c.getBody().classList.add('op-layout-stack');\n w = watchNarrow(c, Number(cfg.stackBelow));\n }\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\nregisterLayout('vbox', cssLayout('vbox', ['gap', 'align', 'justify', 'wrap']));\n\n/** Numeric `columns` collapse to one column under `narrowBelow` px (default 480; `0` turns it off). */\nregisterLayout('grid', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-grid');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n const cols = cfg.columns ?? 1;\n if (typeof cols === 'number') {\n body.style.setProperty('--op-layout-columns', String(cols));\n const below = cfg.narrowBelow == null ? 480 : Number(cfg.narrowBelow);\n if (below > 0 && cols > 1) w = watchNarrow(c, below);\n } else body.style.gridTemplateColumns = cols;\n },\n add(_c, cmp) {\n const span = cmp.config.colspan;\n if (span) cmp.el.style.gridColumn = span === 'full' ? '1 / -1' : `span ${span}`;\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\n/**\n * Regions around a center. Under `narrowBelow` px (default 768) the west and east regions leave the grid and become\n * drawers over the center, closed until `openRegion('west')` (or `open: 'west'` in the layout config, to start open).\n * A scrim behind an open drawer closes it on click; Esc closes it too.\n */\nregisterLayout('border', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n let cont!: Container;\n const regions = () => Array.from(cont.getBody().children).filter((e): e is HTMLElement => e instanceof HTMLElement && (e.dataset.region === 'west' || e.dataset.region === 'east'));\n const find = (name: string) => regions().find((e) => e.dataset.region === name);\n const sync = () => cont.getBody().classList.toggle('has-open-region', regions().some((e) => e.classList.contains('is-open')));\n const close = (name?: string) => {\n for (const e of regions()) if (!name || e.dataset.region === name) e.classList.remove('is-open');\n sync();\n };\n return {\n init(c) {\n cont = c;\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-border');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n w = watchNarrow(c, cfg.narrowBelow == null ? 768 : Number(cfg.narrowBelow), (narrow) => {\n if (!narrow) close();\n else if (cfg.open) find(String(cfg.open))?.classList.add('is-open'), sync();\n });\n // the scrim is the body's own ::after: a click that lands on the body itself (not a child) closes the drawer\n c.listen(body, 'click', (e: Event) => e.target === body && close());\n c.listen(body, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && body.classList.contains('has-open-region') && body.classList.contains('is-narrow')) {\n e.stopPropagation();\n close();\n }\n });\n },\n add(_c, cmp) {\n const region = cmp.config.region ?? 'center';\n cmp.el.style.gridArea = region;\n cmp.el.dataset.region = region;\n },\n openRegion(name) {\n const e = find(name);\n if (!e || !w?.isNarrow()) return;\n close();\n e.classList.add('is-open');\n sync();\n (e.querySelector<HTMLElement>('input,button,[tabindex]') ?? e).focus?.();\n },\n closeRegion: close,\n toggleRegion(name) {\n if (find(name)?.classList.contains('is-open')) close(name);\n else this.openRegion!(name);\n },\n isRegionOpen: (name) => !!find(name)?.classList.contains('is-open'),\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\nregisterLayout('card', (cfg) => {\n let active: Component | undefined;\n // children that were never rendered (lazy tabs) only get the flag; their DOM is not built just to hide it\n const show = (c: Container, cmp: Component | undefined) => {\n active = cmp;\n for (const i of c.items) {\n if (i.rendered) i.el.hidden = i !== cmp;\n else i.config.hidden = i !== cmp;\n }\n c.emit('activate', cmp);\n };\n return {\n init(c) {\n c.getBody().classList.add('op-layout', 'op-layout-fit');\n const a = cfg.activeItem ?? c.config.activeItem ?? 0;\n show(c, typeof a === 'number' ? c.items[a] : c.items.find((i) => i.id === a));\n },\n add(c, cmp) {\n cmp.el.hidden = cmp !== active && !!active;\n if (!active) show(c, cmp);\n },\n remove(c, cmp, index) {\n if (cmp === active) show(c, c.items[Math.min(index, c.items.length - 1)]);\n },\n activate: show,\n getActive: () => active,\n };\n});\n", "import { Component, type ComponentConfig, type Parent } from './component';\nimport { create, type AnyConfig } from './registry';\nimport { createLayout, type Layout, type LayoutSpec } from '../layout/layout';\n\nexport interface ContainerConfig extends ComponentConfig {\n items?: Array<AnyConfig | Component | string>;\n layout?: LayoutSpec;\n /** Config merged into every item that does not set the key itself. */\n defaults?: Record<string, unknown>;\n /** `type` used by items that do not declare one. */\n defaultType?: string;\n /** Layout `card`: initial visible child (index or id). */\n activeItem?: number | string;\n}\n\nexport class Container<C extends ContainerConfig = ContainerConfig> extends Component<C> implements Parent {\n protected override baseCls = 'op-container';\n protected defaultLayout: LayoutSpec | undefined;\n items: Component[] = [];\n layout?: Layout;\n\n constructor(config: C = {} as C) {\n super(config);\n this.items = (config.items ?? []).map((i) => this.make(i));\n }\n\n /** Element that holds the children. Panels override it. */\n getBody(): HTMLElement {\n return this.el;\n }\n\n /** Turns shorthand strings (`'->'`) into configs. Subclasses override; the base has none. */\n protected shorthand(s: string): AnyConfig {\n throw new Error(`Optikos: no shorthand for item \"${s}\" in ${this.baseCls}`);\n }\n\n private make(item: AnyConfig | Component | string): Component {\n if (typeof item === 'string') item = this.shorthand(item);\n const c = item instanceof Component ? item : create({ type: this.config.defaultType, ...this.config.defaults, ...item });\n c.parent = this;\n return c;\n }\n\n protected override onRender(): void {\n const spec = this.config.layout ?? this.defaultLayout;\n if (spec) (this.layout = createLayout(spec)).init(this);\n this.items.forEach((c, i) => this.attach(c, i));\n }\n\n protected attach(c: Component, index: number): void {\n const body = this.getBody();\n const next = this.items.slice(index + 1).find((x) => x.rendered && x.el.parentNode === body);\n body.insertBefore(c.el, next?.el ?? null);\n this.layout?.add?.(this, c, index);\n if (this.mounted) c.notifyMount();\n }\n\n add(item: AnyConfig | Component | string): Component {\n return this.insert(this.items.length, item);\n }\n\n insert(index: number, item: AnyConfig | Component | string): Component {\n const c = this.make(item);\n this.items.splice(index, 0, c);\n if (this.rendered) this.attach(c, index);\n this.emit('add', c);\n return c;\n }\n\n /** Removes a child (by instance, id or index). Destroys it unless `destroy` is `false`. */\n remove(child: Component | string | number, destroy = true): Component | undefined {\n const i = typeof child === 'number' ? child : this.items.findIndex((c) => c === child || c.id === child);\n const c = this.items[i];\n if (!c) return;\n this.items.splice(i, 1);\n c.parent = undefined;\n this.layout?.remove?.(this, c, i);\n if (destroy) c.destroy();\n else if (c.rendered) c.el.remove();\n this.emit('remove', c);\n return c;\n }\n\n removeAll(destroy = true): void {\n for (const c of [...this.items]) this.remove(c, destroy);\n }\n\n getItems(): Component[] {\n return this.items;\n }\n\n /** Direct child by id. */\n get(id: string): Component | undefined {\n return this.items.find((c) => c.id === id);\n }\n\n /** All descendants (depth-first) matching `fn`. */\n query(fn: (c: Component) => boolean): Component[] {\n const out: Component[] = [];\n for (const c of this.items) {\n if (fn(c)) out.push(c);\n if (c instanceof Container) out.push(...c.query(fn));\n }\n return out;\n }\n\n /** Layout `card`: which child is visible. */\n getActiveItem(): Component | undefined {\n return this.layout?.getActive?.(this);\n }\n setActiveItem(item: Component | string | number): void {\n const c = typeof item === 'number' ? this.items[item] : this.items.find((x) => x === item || x.id === item);\n if (c) this.layout?.activate?.(this, c);\n }\n\n override notifyMount(): void {\n super.notifyMount();\n for (const c of this.items) c.notifyMount();\n }\n\n protected override onDestroy(): void {\n for (const c of [...this.items]) c.destroy();\n }\n\n override setDisabled(disabled: boolean): void {\n super.setDisabled(disabled);\n for (const c of this.items) c.setDisabled(disabled);\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { Component } from '../core/component';\nimport type { Container } from '../core/container';\nimport { px } from '../core/dom';\n\nexport interface Layout {\n init(c: Container): void;\n add?(c: Container, cmp: Component, index: number): void;\n remove?(c: Container, cmp: Component, index: number): void;\n /** Card only. */\n activate?(c: Container, cmp: Component): void;\n getActive?(c: Container): Component | undefined;\n /** Border only: below `narrowBelow` the west/east regions become drawers; these open and close them. */\n openRegion?(name: string): void;\n closeRegion?(name?: string): void;\n toggleRegion?(name: string): void;\n isRegionOpen?(name: string): boolean;\n /** Layouts that adapt to the width: whether the container is currently narrow, and a way to force it (tests, previews). */\n isNarrow?(): boolean;\n setNarrow?(narrow: boolean): void;\n}\n\nexport type LayoutConfig = { type: string; [option: string]: unknown };\nexport type LayoutSpec = string | LayoutConfig | Layout;\nexport type LayoutFactory = (config: Record<string, any>) => Layout;\n\nconst factories = new Map<string, LayoutFactory>();\n\n/** Registers a layout strategy under a name; users add their own the same way. */\nexport function registerLayout(name: string, factory: LayoutFactory): void {\n factories.set(name, factory);\n}\n\nexport function createLayout(spec: LayoutSpec): Layout {\n if (typeof spec === 'object' && 'init' in spec) return spec as Layout;\n const cfg = (typeof spec === 'string' ? { type: spec } : spec) as LayoutConfig;\n const f = factories.get(cfg.type);\n if (!f) throw new Error(`Optikos: unknown layout \"${cfg.type}\"`);\n return f(cfg);\n}\n\n/**\n * Keeps the class `is-narrow` on the container body while it is narrower than `below` px (a ResizeObserver on the\n * container itself, not the window, so a layout inside a small panel adapts too). Emits `narrow-change` on the container.\n */\nfunction watchNarrow(c: Container, below: number, on?: (narrow: boolean) => void) {\n const body = c.getBody();\n let narrow = false;\n const set = (n: boolean) => {\n if (n === narrow) return;\n narrow = n;\n body.classList.toggle('is-narrow', n);\n on?.(n);\n c.emit('narrow-change', n);\n };\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => body.clientWidth > 0 && set(body.clientWidth < below));\n ro.observe(body);\n c.own(() => ro.disconnect());\n }\n return { isNarrow: () => narrow, setNarrow: set };\n}\n\n/** Layouts that are only a class plus custom properties; the CSS does the work. */\nconst cssLayout =\n (name: string, vars: string[] = []): LayoutFactory =>\n (cfg) => ({\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', `op-layout-${name}`);\n for (const v of vars) if (cfg[v] != null) body.style.setProperty(`--op-layout-${v}`, px(cfg[v]));\n },\n });\n\nregisterLayout('fit', cssLayout('fit'));\nconst hbox = cssLayout('hbox', ['gap', 'align', 'justify', 'wrap']);\n/** `stackBelow: 600`: under that width the row becomes a column. */\nregisterLayout('hbox', (cfg) => {\n const base = hbox(cfg);\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n ...base,\n init(c) {\n base.init(c);\n if (cfg.stackBelow) {\n c.getBody().classList.add('op-layout-stack');\n w = watchNarrow(c, Number(cfg.stackBelow));\n }\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\nregisterLayout('vbox', cssLayout('vbox', ['gap', 'align', 'justify', 'wrap']));\n\n/** Numeric `columns` collapse to one column under `narrowBelow` px (default 480; `0` turns it off). */\nregisterLayout('grid', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n return {\n init(c) {\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-grid');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n const cols = cfg.columns ?? 1;\n if (typeof cols === 'number') {\n body.style.setProperty('--op-layout-columns', String(cols));\n const below = cfg.narrowBelow == null ? 480 : Number(cfg.narrowBelow);\n if (below > 0 && cols > 1) w = watchNarrow(c, below);\n } else body.style.gridTemplateColumns = cols;\n },\n add(_c, cmp) {\n const span = cmp.config.colspan;\n if (span) cmp.el.style.gridColumn = span === 'full' ? '1 / -1' : `span ${span}`;\n },\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\n/**\n * Regions around a center. Under `narrowBelow` px (default 768) the west and east regions leave the grid and become\n * drawers over the center, closed until `openRegion('west')` (or `open: 'west'` in the layout config, to start open).\n * A scrim behind an open drawer closes it on click; Esc closes it too.\n */\nregisterLayout('border', (cfg) => {\n let w: ReturnType<typeof watchNarrow> | undefined;\n let cont!: Container;\n const regions = () => Array.from(cont.getBody().children).filter((e): e is HTMLElement => e instanceof HTMLElement && (e.dataset.region === 'west' || e.dataset.region === 'east'));\n const find = (name: string) => regions().find((e) => e.dataset.region === name);\n const sync = () => cont.getBody().classList.toggle('has-open-region', regions().some((e) => e.classList.contains('is-open')));\n const close = (name?: string) => {\n for (const e of regions()) if (!name || e.dataset.region === name) e.classList.remove('is-open');\n sync();\n };\n return {\n init(c) {\n cont = c;\n const body = c.getBody();\n body.classList.add('op-layout', 'op-layout-border');\n if (cfg.gap != null) body.style.setProperty('--op-layout-gap', px(cfg.gap));\n w = watchNarrow(c, cfg.narrowBelow == null ? 768 : Number(cfg.narrowBelow), (narrow) => {\n if (!narrow) close();\n else if (cfg.open) find(String(cfg.open))?.classList.add('is-open'), sync();\n });\n // the scrim is the body's own ::after: a click that lands on the body itself (not a child) closes the drawer\n c.listen(body, 'click', (e: Event) => e.target === body && close());\n c.listen(body, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && body.classList.contains('has-open-region') && body.classList.contains('is-narrow')) {\n e.stopPropagation();\n close();\n }\n });\n },\n add(_c, cmp) {\n const region = cmp.config.region ?? 'center';\n cmp.el.style.gridArea = region;\n cmp.el.dataset.region = region;\n },\n openRegion(name) {\n const e = find(name);\n if (!e || !w?.isNarrow()) return;\n close();\n e.classList.add('is-open');\n sync();\n (e.querySelector<HTMLElement>('input,button,[tabindex]') ?? e).focus?.();\n },\n closeRegion: close,\n toggleRegion(name) {\n if (find(name)?.classList.contains('is-open')) close(name);\n else this.openRegion!(name);\n },\n isRegionOpen: (name) => !!find(name)?.classList.contains('is-open'),\n isNarrow: () => !!w?.isNarrow(),\n setNarrow: (n) => w?.setNarrow(n),\n };\n});\n\nregisterLayout('card', (cfg) => {\n let active: Component | undefined;\n // children that were never rendered (lazy tabs) only get the flag; their DOM is not built just to hide it\n const show = (c: Container, cmp: Component | undefined) => {\n active = cmp;\n for (const i of c.items) {\n if (i.rendered) i.el.hidden = i !== cmp;\n else i.config.hidden = i !== cmp;\n }\n c.emit('activate', cmp);\n };\n return {\n init(c) {\n c.getBody().classList.add('op-layout', 'op-layout-fit');\n const a = cfg.activeItem ?? c.config.activeItem ?? 0;\n show(c, typeof a === 'number' ? c.items[a] : c.items.find((i) => i.id === a));\n },\n add(c, cmp) {\n cmp.el.hidden = cmp !== active && !!active;\n if (!active) show(c, cmp);\n },\n remove(c, cmp, index) {\n if (cmp === active) show(c, c.items[Math.min(index, c.items.length - 1)]);\n },\n activate: show,\n getActive: () => active,\n };\n});\n", "import { Component, type ComponentConfig, type Parent } from './component';\nimport { create, type AnyConfig } from './registry';\nimport { createLayout, type Layout, type LayoutSpec } from '../layout/layout';\n\n/** What a Tabs header reads from its panel (any Container, not just Panel). */\nexport interface TabPanelConfig {\n title?: string;\n icon?: string;\n closable?: boolean;\n reloadable?: boolean;\n /** Called by the tab's \u21BB; a returned Promise keeps the tab busy until it settles. */\n onReload?: (panel: any) => void | Promise<unknown>;\n}\n\nexport interface ContainerConfig extends ComponentConfig, TabPanelConfig {\n items?: Array<AnyConfig | Component | string>;\n layout?: LayoutSpec;\n /** Config merged into every item that does not set the key itself. */\n defaults?: Record<string, unknown>;\n /** `type` used by items that do not declare one. */\n defaultType?: string;\n /** Layout `card`: initial visible child (index or id). */\n activeItem?: number | string;\n}\n\nexport class Container<C extends ContainerConfig = ContainerConfig> extends Component<C> implements Parent {\n protected override baseCls = 'op-container';\n protected defaultLayout: LayoutSpec | undefined;\n items: Component[] = [];\n layout?: Layout;\n\n constructor(config: C = {} as C) {\n super(config);\n this.items = (config.items ?? []).map((i) => this.make(i));\n }\n\n /** Element that holds the children. Panels override it. */\n getBody(): HTMLElement {\n return this.el;\n }\n\n /** Turns shorthand strings (`'->'`) into configs. Subclasses override; the base has none. */\n protected shorthand(s: string): AnyConfig {\n throw new Error(`Optikos: no shorthand for item \"${s}\" in ${this.baseCls}`);\n }\n\n private make(item: AnyConfig | Component | string): Component {\n if (typeof item === 'string') item = this.shorthand(item);\n const c = item instanceof Component ? item : create({ type: this.config.defaultType, ...this.config.defaults, ...item });\n c.parent = this;\n return c;\n }\n\n protected override onRender(): void {\n const spec = this.config.layout ?? this.defaultLayout;\n if (spec) (this.layout = createLayout(spec)).init(this);\n this.items.forEach((c, i) => this.attach(c, i));\n }\n\n protected attach(c: Component, index: number): void {\n const body = this.getBody();\n const next = this.items.slice(index + 1).find((x) => x.rendered && x.el.parentNode === body);\n body.insertBefore(c.el, next?.el ?? null);\n this.layout?.add?.(this, c, index);\n if (this.mounted) c.notifyMount();\n }\n\n add(item: AnyConfig | Component | string): Component {\n return this.insert(this.items.length, item);\n }\n\n insert(index: number, item: AnyConfig | Component | string): Component {\n const c = this.make(item);\n this.items.splice(index, 0, c);\n if (this.rendered) this.attach(c, index);\n this.emit('add', c);\n return c;\n }\n\n /** Removes a child (by instance, id or index). Destroys it unless `destroy` is `false`. */\n remove(child: Component | string | number, destroy = true): Component | undefined {\n const i = typeof child === 'number' ? child : this.items.findIndex((c) => c === child || c.id === child);\n const c = this.items[i];\n if (!c) return;\n this.items.splice(i, 1);\n c.parent = undefined;\n this.layout?.remove?.(this, c, i);\n if (destroy) c.destroy();\n else if (c.rendered) c.el.remove();\n this.emit('remove', c);\n return c;\n }\n\n removeAll(destroy = true): void {\n for (const c of [...this.items]) this.remove(c, destroy);\n }\n\n getItems(): Component[] {\n return this.items;\n }\n\n /** Direct child by id. */\n get(id: string): Component | undefined {\n return this.items.find((c) => c.id === id);\n }\n\n /** All descendants (depth-first) matching `fn`. */\n query(fn: (c: Component) => boolean): Component[] {\n const out: Component[] = [];\n for (const c of this.items) {\n if (fn(c)) out.push(c);\n if (c instanceof Container) out.push(...c.query(fn));\n }\n return out;\n }\n\n /** Layout `card`: which child is visible. */\n getActiveItem(): Component | undefined {\n return this.layout?.getActive?.(this);\n }\n setActiveItem(item: Component | string | number): void {\n const c = typeof item === 'number' ? this.items[item] : this.items.find((x) => x === item || x.id === item);\n if (c) this.layout?.activate?.(this, c);\n }\n\n override notifyMount(): void {\n super.notifyMount();\n for (const c of this.items) c.notifyMount();\n }\n\n protected override onDestroy(): void {\n for (const c of [...this.items]) c.destroy();\n }\n\n override setDisabled(disabled: boolean): void {\n super.setDisabled(disabled);\n for (const c of this.items) c.setDisabled(disabled);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["factories", "registerLayout", "name", "factory", "createLayout", "spec", "cfg", "f", "watchNarrow", "c", "below", "on", "body", "narrow", "set", "n", "ro", "cssLayout", "vars", "v", "px", "hbox", "base", "w", "cols", "_c", "cmp", "span", "cont", "regions", "e", "find", "sync", "close", "region", "active", "show", "i", "a", "index", "Container", "_Container", "Component", "config", "i", "s", "item", "c", "create", "spec", "createLayout", "index", "body", "next", "x", "child", "destroy", "id", "fn", "out", "disabled"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as b}from"./chunk-
|
|
1
|
+
import{a as b}from"./chunk-HLS5FI55.js";import{c as m}from"./chunk-DIOJGTUN.js";import{a as E}from"./chunk-TIPK3SCJ.js";import{f as v}from"./chunk-UDXO3KM3.js";import{b as n}from"./chunk-PZSHOSOS.js";import{d as y,e as p,f as a}from"./chunk-S4QD5NID.js";p("en",{chatPlaceholder:"Type a message",chatSend:"Send",chatTyping:"{n} is typing\u2026",chatToday:"Today",chatYesterday:"Yesterday",chatEmpty:"No messages yet",chatLog:"Conversation",chatSuggestions:"Suggestions",chatReply:"Reply"});p("pt-BR",{chatPlaceholder:"Digite uma mensagem",chatSend:"Enviar",chatTyping:"{n} est\xE1 digitando\u2026",chatToday:"Hoje",chatYesterday:"Ontem",chatEmpty:"Nenhuma mensagem ainda",chatLog:"Conversa",chatSuggestions:"Sugest\xF5es",chatReply:"Responder"});var _=/(\*\*[^*\n]+\*\*|\*[^*\n]+\*|`[^`\n]+`)/;function L(d){let t=[];return d.split(`
|
|
2
2
|
`).forEach((e,s)=>{s&&t.push(document.createElement("br"));for(let i of e.split(_))i&&(i.startsWith("**")&&i.endsWith("**")&&i.length>4?t.push(n("strong","",{},i.slice(2,-2))):i.startsWith("`")&&i.endsWith("`")&&i.length>2?t.push(n("code","op-chat__code",{},i.slice(1,-1))):i.startsWith("*")&&i.endsWith("*")&&i.length>2?t.push(n("em","",{},i.slice(1,-1))):t.push(document.createTextNode(i)))}),t}var l=d=>new Date(d).toDateString(),M=()=>y()._lang,u=class extends v{baseCls="op-chat";msgs=[];seq=0;logEl;emptyEl;typingEl;chipsEl;input;sendBtn;busy=!1;build(){let t=this.config;return this.logEl=n("div","op-chat__log",{role:"log","aria-live":"polite","aria-relevant":"additions","aria-label":a("chatLog"),tabindex:0}),this.emptyEl=n("div","op-chat__empty",{},a("chatEmpty")),this.typingEl=n("div","op-chat__typing",{"aria-hidden":"true"},n("span","op-chat__dots",{},n("i"),n("i"),n("i")),n("span","op-chat__typing-text")),this.typingEl.hidden=!0,this.chipsEl=n("div","op-chat__suggestions",{role:"group","aria-label":a("chatSuggestions")}),this.input=n("textarea","op-chat__input",{rows:1,placeholder:t.placeholder??a("chatPlaceholder"),"aria-label":t.placeholder??a("chatPlaceholder"),maxlength:t.maxLength??null}),this.sendBtn=new b({icon:"send",variant:"primary",ariaLabel:a("chatSend"),handler:()=>this.submit()}),this.own(()=>this.sendBtn.destroy()),n("div",this.baseCls,{},this.logEl,this.chipsEl,n("div","op-chat__composer",{},this.input,this.sendBtn.el))}onRender(){let t=this.config;this.listen(this.input,"input",()=>this.grow()),this.listen(this.input,"keydown",e=>{e.key!=="Enter"||e.shiftKey||e.isComposing||t.sendOnEnter===!1||(e.preventDefault(),this.submit())}),this.listen(this.chipsEl,"click",e=>{let s=e.target.closest("[data-s]");s&&(this.emit("suggestion",s.dataset.s),this.send(s.dataset.s))}),this.listen(this.logEl,"click",e=>{let s=e.target.closest(".op-chat__msg"),i=s&&this.msgs.find(o=>String(o.id)===s.dataset.id);i&&this.emit("message-click",i)}),this.setReadonly(!!t.readonly),this.msgs=(t.messages??[]).map(e=>this.norm(e)),this.setSuggestions(t.suggestions??[]),this.renderAll()}notifyMount(){super.notifyMount(),this.rendered&&(this.sendBtn.notifyMount(),this.scrollToBottom())}norm(t){let e=t.time==null?Date.now():new Date(t.time).getTime();return{...t,id:t.id??`m${++this.seq}`,at:e}}getMessages(){return this.msgs}addMessage(t){let e=this.norm(t);if(this.msgs.push(e),!this.rendered)return this.config.messages=this.msgs,e;let s=this.nearBottom()||e.from===this.config.me;return this.mountMsg(e,this.msgs.length-1),this.syncEmpty(),s&&this.scrollToBottom(),e}setMessages(t){this.msgs=t.map(e=>this.norm(e)),this.config.messages=this.msgs,this.rendered&&(this.renderAll(),this.scrollToBottom())}updateMessage(t,e){let s=this.msgs.findIndex(g=>g.id===t);if(s<0)return;let i=this.nearBottom();if(this.msgs[s]={...this.msgs[s],...e,at:e.time!=null?new Date(e.time).getTime():this.msgs[s].at},!this.rendered)return;let o=this.msgEl(t),r=this.buildMsg(this.msgs[s],s);o?o.replaceWith(r):this.logEl.insertBefore(r,this.typingEl),this.decorate(s),i&&this.scrollToBottom()}appendToMessage(t,e){let s=this.msgs.find(r=>r.id===t);if(!s)return;s.text+=e;let i=this.msgEl(t)?.querySelector(".op-chat__text");if(!i)return;let o=this.nearBottom();this.fill(i,s),o&&this.scrollToBottom()}removeMessage(t){this.msgs=this.msgs.filter(e=>e.id!==t),this.rendered&&this.renderAll()}msgEl(t){return this.logEl.querySelector(`[data-id="${CSS.escape(String(t))}"]`)}renderAll(){this.logEl.replaceChildren(this.emptyEl,...this.msgs.flatMap((t,e)=>this.nodesFor(t,e)),this.typingEl),this.syncEmpty()}nodesFor(t,e){let s=this.msgs[e-1],i=[];return(!s||l(s.at)!==l(t.at))&&i.push(n("div","op-chat__day",{role:"separator"},n("span","",{},this.dayLabel(t.at)))),i.push(this.buildMsg(t,e)),i}mountMsg(t,e){for(let s of this.nodesFor(t,e))this.logEl.insertBefore(s,this.typingEl);this.decorate(e-1),this.decorate(e)}dayLabel(t){let e=l(t),s=Date.now();return e===l(s)?a("chatToday"):e===l(s-864e5)?a("chatYesterday"):new Intl.DateTimeFormat(M(),{dateStyle:"medium"}).format(t)}fill(t,e){let s=this.config.renderer?this.config.renderer(e):L(e.text);t.replaceChildren(...Array.isArray(s)?s:[s])}buildMsg(t,e){let s=this.config,i=t.from===s.me,o=s.users?.[t.from],r=n("article",`op-chat__msg ${i?"is-me":"is-them"}`,{"data-id":String(t.id)}),g=n("div","op-chat__bubble");if(!i&&s.showAuthors!==!1&&o){let c=n("div","op-chat__author",{},o.name);o.color&&(c.style.color=o.color),g.append(c)}let h=t.replyTo!=null?this.msgs.find(c=>c.id===t.replyTo):void 0;h&&g.append(n("div","op-chat__reply",{"aria-label":a("chatReply")},n("strong","",{},h.from===s.me?"":s.users?.[h.from]?.name??h.from),h.text.length>80?`${h.text.slice(0,80)}\u2026`:h.text));let f=n("div","op-chat__text");this.fill(f,t);let T=new Intl.DateTimeFormat(M(),{hour:"2-digit",minute:"2-digit"}).format(t.at);return g.append(f,n("span","op-chat__meta",{},n("time","",{datetime:new Date(t.at).toISOString()},T),i&&t.status?this.statusEl(t.status):"")),r.append(g),this.group(r,e),r}statusEl(t){let e=n("span",`op-chat__status is-${t}`,{role:"img","aria-label":t});return t==="error"?e.append(m("alert")):t!=="sending"&&e.append(m("check"),...t==="sent"?[]:[m("check")]),e}group(t,e){let s=this.msgs[e],i=(o,r)=>!!o&&!!r&&o.from===r.from&&l(o.at)===l(r.at);t.classList.toggle("is-first",!i(this.msgs[e-1],s)),t.classList.toggle("is-last",!i(s,this.msgs[e+1])),t.querySelector(".op-chat__author")?.toggleAttribute("hidden",i(this.msgs[e-1],s))}decorate(t){let e=this.msgs[t],s=e&&this.msgEl(e.id);s&&this.group(s,t)}syncEmpty(){this.emptyEl.hidden=this.msgs.length>0,this.el.classList.toggle("is-empty",!this.msgs.length)}nearBottom(){let t=this.logEl;return t.scrollHeight-t.scrollTop-t.clientHeight<48}scrollToBottom(){this.render(),this.logEl.scrollTop=this.logEl.scrollHeight}setTyping(t){let e=this.nearBottom();this.typingEl.hidden=!t,this.typingEl.querySelector(".op-chat__typing-text").textContent=typeof t=="string"?a("chatTyping",{n:t}):"",t&&e&&this.scrollToBottom()}setSuggestions(t){this.config.suggestions=t,this.rendered&&(this.chipsEl.hidden=!t.length,this.chipsEl.replaceChildren(...t.map(e=>n("button","op-chat__chip",{type:"button","data-s":e},e))))}setBusy(t){this.busy=t,this.el.classList.toggle("is-busy",t),this.logEl.setAttribute("aria-busy",String(t)),this.sendBtn.setDisabled(t||!!this.config.readonly);for(let e of Array.from(this.chipsEl.children))e.disabled=t||!!this.config.readonly}setReadonly(t){this.config.readonly=t,this.rendered&&(this.input.readOnly=t,this.el.classList.toggle("is-readonly",t),this.setBusy(this.busy))}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}focus(){this.render(),this.input.focus()}grow(){this.input.style.height="auto",this.input.style.height=`${this.input.scrollHeight}px`}submit(){let t=this.input.value;this.send(t)&&(this.input.value="",this.grow())}send(t){if(t=t.trim(),!t||this.busy||this.config.readonly||this.emit("before-send",t)===!1)return!1;let e=this.addMessage({from:this.config.me,text:t,time:Date.now(),status:"sending"});return this.emit("send",t,e),!0}};E("chat",u);export{u as a};
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
3
|
+
//# sourceMappingURL=chunk-C3MWS7P2.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as o}from"./chunk-N2LS4JD6.js";import{a as t}from"./chunk-TIPK3SCJ.js";var e=class extends o{baseCls="op-field op-textfield op-picker op-select";editable(){return!1}emptyValue(){return null}isEmpty(r){return r==null||r===""}};t("select",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-CFGCB37K.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as n}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as n}from"./chunk-N2LS4JD6.js";import{a as o}from"./chunk-TIPK3SCJ.js";var s=class extends n{baseCls="op-field op-textfield op-picker op-combobox";term="";emptyValue(){return null}isEmpty(t){return t==null||t===""}visibleItems(){let t=this.typed?this.term.trim().toLowerCase():"";if(!t)return this.items;let i=this.config.filter??"contains",p=typeof i=="function"?i:i==="startsWith"?(e,r)=>e.label.toLowerCase().startsWith(r):(e,r)=>e.label.toLowerCase().includes(r);return this.items.filter(e=>p(e,t))}onType(t){this.term=t,this.refreshList(),this.list.setHighlight(t),this.open()}pick(t){this.term="",super.pick(t),this.list.setHighlight("")}settle(){super.settle(),this.term="",this.list.setHighlight("")}};o("combobox",s);export{s as a};
|
|
2
|
+
//# sourceMappingURL=chunk-CMV3F6HR.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as t}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as t}from"./chunk-BQEFLPDA.js";import{a as o}from"./chunk-TIPK3SCJ.js";var e,r=class extends t{baseCls="op-viewport";constructor(n={}){if(super(n),e&&!e.destroyed)throw new Error("Optikos: only one Viewport can exist at a time");e=this}onRender(){this.config.layout??="fit",super.onRender()}};o("viewport",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-CWIE74NX.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as h}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-UDXO3KM3.js";import{b as M}from"./chunk-PZSHOSOS.js";var e=r=>`<path d="${r}"/>`,n={"chevron-down":e("m6 9 6 6 6-6"),"chevron-up":e("m18 15-6-6-6 6"),"chevron-left":e("m15 18-6-6 6-6"),"chevron-right":e("m9 18 6-6-6-6"),"chevrons-left":e("m11 17-5-5 5-5M18 17l-5-5 5-5"),"chevrons-right":e("m6 17 5-5-5-5M13 17l5-5-5-5"),x:e("M18 6 6 18M6 6l12 12"),check:e("M20 6 9 17l-5-5"),plus:e("M5 12h14M12 5v14"),minus:e("M5 12h14"),search:'<circle cx="11" cy="11" r="8"/>'+e("m21 21-4.3-4.3"),calendar:'<rect x="3" y="4" width="18" height="18" rx="2"/>'+e("M16 2v4M8 2v4M3 10h18"),info:'<circle cx="12" cy="12" r="10"/>'+e("M12 16v-4M12 8h.01"),alert:e("m21.7 18-8-14a2 2 0 0 0-3.5 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3ZM12 9v4M12 17h.01"),error:'<circle cx="12" cy="12" r="10"/>'+e("m15 9-6 6M9 9l6 6"),success:'<circle cx="12" cy="12" r="10"/>'+e("m9 12 2 2 4-4"),menu:e("M4 6h16M4 12h16M4 18h16"),"arrow-up":e("m5 12 7-7 7 7M12 19V5"),"arrow-down":e("M12 5v14M19 12l-7 7-7-7"),columns:'<rect x="3" y="3" width="18" height="18" rx="2"/>'+e("M9 3v18M15 3v18"),filter:e("M22 3H2l8 9.5V19l4 2v-8.5z"),send:e("m22 2-7 20-4-9-9-4zM22 2 11 13"),sparkles:e("M12 3l1.9 5.6L19.5 10.5l-5.6 1.9L12 18l-1.9-5.6L4.5 10.5l5.6-1.9zM19 3v4M21 5h-4M5 17v4M7 19H3"),file:e("M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 13h8M8 17h8"),box:e("M21 8 12 3 3 8v8l9 5 9-5zM3 8l9 5 9-5M12 13v8"),truck:e("M1 3h15v13H1zM16 8h4l3 3v5h-7")+'<circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/>',clock:'<circle cx="12" cy="12" r="10"/>'+e("M12 6v6l4 2"),shield:e("M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"),list:e("M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"),eye:e("M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12z")+'<circle cx="12" cy="12" r="3"/>',"eye-off":e("M17.9 17.9A10.1 10.1 0 0 1 12 19c-6.4 0-10-7-10-7a18.5 18.5 0 0 1 5.1-5.9M9.9 5.2A9.7 9.7 0 0 1 12 5c6.4 0 10 7 10 7a18.5 18.5 0 0 1-2.2 3.2M14.1 14.1a3 3 0 1 1-4.2-4.2M2 2l20 20"),heart:e("M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z"),image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/>'+e("m21 15-5-5L5 21"),cloud:e("M18 10h-1.3A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"),folder:e("M4 4h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"),share:e("M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M16 6l-4-4-4 4M12 2v14"),message:e("M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"),more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',user:e("M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2")+'<circle cx="12" cy="7" r="4"/>',home:e("m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM9 22V12h6v10"),trash:e("M3 6h18M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2"),edit:e("M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"),sun:'<circle cx="12" cy="12" r="4"/>'+e("M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"),moon:e("M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"),bell:e("M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.9 1.9 0 0 0 3.4 0"),chart:e("M3 3v18h18M19 9l-5 5-4-4-3 3"),settings:'<circle cx="12" cy="12" r="3"/>'+e("M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9 7 7M17 17l2.1 2.1M4.9 19.1 7 17M17 7l2.1-2.1"),users:e("M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M23 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8")+'<circle cx="9" cy="7" r="4"/>'};function m(r){Object.assign(n,r)}var d=r=>r in n;function x(r,c){let t=M("span","op-icon");return i(t,r,c),t}function i(r,c,t){c&&!(c in n)&&console.warn(`Optikos: unknown icon "${c}" (register it with registerIcons)`);let o=n[c]??"";r.innerHTML=o.startsWith("<svg")?o:`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${o}</svg>`,t?(r.setAttribute("role","img"),r.setAttribute("aria-label",t),r.removeAttribute("aria-hidden")):(r.setAttribute("aria-hidden","true"),r.removeAttribute("role"),r.removeAttribute("aria-label"))}var s=class extends l{baseCls="op-icon";tag="span";onRender(){i(this.el,this.config.name??"",this.config.label)}setName(c){this.config.name=c,this.rendered&&i(this.el,c,this.config.label)}setLabel(c){this.config.label=c,this.rendered&&i(this.el,this.config.name??"",c)}};h("icon",s);export{m as a,d as b,x as c,s as d};
|
|
2
|
+
//# sourceMappingURL=chunk-DIOJGTUN.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as b,c as d}from"./chunk-DIOJGTUN.js";import{c as m}from"./chunk-BQEFLPDA.js";import{a as f}from"./chunk-TIPK3SCJ.js";import{b as r,e as v,f as h}from"./chunk-PZSHOSOS.js";import{e as p,f as l}from"./chunk-S4QD5NID.js";b({play:'<path d="m6 3 14 9-14 9z"/>',pause:'<rect x="14" y="4" width="4" height="16" rx="1"/><rect x="6" y="4" width="4" height="16" rx="1"/>'});p("en",{carousel:"Carousel",carouselSlide:"{n} of {total}",carouselGo:"Go to {n}",carouselPrev:"Previous",carouselNext:"Next",carouselPause:"Pause",carouselPlay:"Play"});p("pt-BR",{carousel:"Carrossel",carouselSlide:"{n} de {total}",carouselGo:"Ir para {n}",carouselPrev:"Anterior",carouselNext:"Pr\xF3ximo",carouselPlay:"Tocar",carouselPause:"Pausar"});var u=class extends m{baseCls="op-carousel";track;prevBtn;nextBtn;dotsEl;toggleBtn;index=0;stopped=!1;scrollTimer;playTimer;get perView(){return Math.max(1,this.config.perView??1)}get last(){return Math.max(0,this.items.length-this.perView)}build(){let t=(e,o,n,c)=>{let a=r("button",`op-carousel__${e}`,{type:"button","aria-label":l(n)},d(o));return this.listen(a,"click",()=>{this.interact(),c()}),a};return this.prevBtn=t("prev","chevron-left","carouselPrev",()=>this.prev()),this.nextBtn=t("next","chevron-right","carouselNext",()=>this.next()),this.toggleBtn=t("toggle","pause","carouselPause",()=>this.isPlaying()?this.pause():this.play()),this.track=r("div","op-carousel__track",{tabindex:0}),this.dotsEl=r("div","op-carousel__dots"),r("div",this.baseCls,{role:"region","aria-roledescription":"carousel"},r("div","op-carousel__viewport",{},this.track,this.prevBtn,this.nextBtn),r("div","op-carousel__bar",{},this.dotsEl,this.toggleBtn))}getBody(){return this.track}onRender(){let t=this.config;this.el.setAttribute("aria-label",t.ariaLabel??l("carousel")),this.track.setAttribute("aria-label",t.ariaLabel??l("carousel")),this.el.style.setProperty("--op-carousel-per-view",String(this.perView)),t.gap!=null&&this.el.style.setProperty("--op-carousel-gap",v(t.gap)),super.onRender(),this.index=h(t.active??0,0,this.last),this.on("add",()=>this.refresh()),this.on("remove",()=>this.refresh()),this.listen(this.track,"scroll",()=>{clearTimeout(this.scrollTimer),this.scrollTimer=setTimeout(()=>this.settle(),90)}),this.listen(this.el,"keydown",e=>{let o=e.target;if(o!==this.track&&!o.closest(".op-carousel__prev, .op-carousel__next, .op-carousel__dots, .op-carousel__toggle"))return;let n={ArrowLeft:()=>this.step(-1),ArrowRight:()=>this.step(1),Home:()=>this.goTo(0),End:()=>this.goTo(this.last)};n[e.key]&&(e.preventDefault(),this.interact(),n[e.key]())}),this.listen(this.track,"pointerdown",()=>this.interact());for(let e of["pointerenter","pointerleave","focusin","focusout"])this.listen(this.el,e,()=>this.tick());this.own(()=>{clearTimeout(this.scrollTimer),clearInterval(this.playTimer)}),this.refresh(),this.tick()}onMount(){this.align(!1)}settle(){let t=this.stride();if(!t||this.destroyed)return;let e=h(Math.round(Math.abs(this.track.scrollLeft)/t),0,this.last);e!==this.index&&this.set(e)}stride(){let[t,e]=this.items;return e?Math.abs(e.el.offsetLeft-t.el.offsetLeft):0}align(t){let e=getComputedStyle(this.track).direction==="rtl"?-1:1;this.track.style.scrollBehavior=t?"":"auto",this.track.scrollLeft=e*this.index*this.stride()}set(t){let e=this.index;this.index=t,this.config.active=t,this.refresh(),this.emit("change",t,e)}refresh(){if(this.destroyed)return;let t=this.items.length;this.index=h(this.index,0,this.last),this.items.forEach((i,s)=>{i.el.setAttribute("role","group"),i.el.setAttribute("aria-roledescription","slide"),i.el.setAttribute("aria-label",l("carouselSlide",{n:s+1,total:t})),i.el.toggleAttribute("inert",s<this.index||s>=this.index+this.perView)});let e=t>this.perView,o=this.config.dots!==!1&&e;this.dotsEl.hidden=!o,o&&this.dotsEl.children.length!==this.last+1&&this.dotsEl.replaceChildren(...Array.from({length:this.last+1},(i,s)=>{let g=r("button","op-carousel__dot",{type:"button","aria-label":l("carouselGo",{n:s+1})});return this.listen(g,"click",()=>{this.interact(),this.goTo(s)}),g})),[...this.dotsEl.children].forEach((i,s)=>s===this.index?i.setAttribute("aria-current","true"):i.removeAttribute("aria-current"));let n=this.config.arrows!==!1&&e;this.prevBtn.hidden=this.nextBtn.hidden=!n;let c=!!this.config.loop;this.prevBtn.disabled=!c&&this.index===0,this.nextBtn.disabled=!c&&this.index===this.last,this.el.classList.toggle("is-first",this.index===0),this.el.classList.toggle("is-last",this.index===this.last),this.toggleBtn.hidden=!this.config.autoplay||!e;let a=this.isPlaying();this.el.classList.toggle("is-playing",a),this.toggleBtn.replaceChildren(d(a?"pause":"play")),this.toggleBtn.setAttribute("aria-label",l(a?"carouselPause":"carouselPlay")),this.track.setAttribute("aria-live",a?"off":"polite")}getActive(){return this.index}goTo(t){t=h(t,0,this.last),!(t===this.index||this.emit("before-change",t)===!1)&&(this.set(t),this.rendered&&this.align(!0))}setActive(t){this.goTo(t)}step(t){let e=this.index+t;this.goTo(this.config.loop?e<0?this.last:e>this.last?0:e:e)}next(){this.step(1)}prev(){this.step(-1)}isPlaying(){return!!this.config.autoplay&&!this.stopped&&!this.reduced()}reduced(){return!!window.matchMedia?.("(prefers-reduced-motion: reduce)").matches}play(){this.stopped=!1,this.refresh(),this.tick()}pause(){this.stopped=!0,this.refresh(),this.tick()}interact(){this.stopped||this.pause()}tick(){clearInterval(this.playTimer),this.playTimer=void 0,!(!this.isPlaying()||this.el.matches(":hover, :focus-within")||this.items.length<=this.perView)&&(this.playTimer=setInterval(()=>this.goTo(this.index>=this.last?0:this.index+1),this.config.autoplay))}};f("carousel",u);export{u as a};
|
|
2
|
+
//# sourceMappingURL=chunk-DJUSVBD5.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/layout/carousel/carousel.ts"],
|
|
4
|
+
"sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { register } from '../../../core/registry';\nimport { h, clamp, px } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { iconEl, registerIcons } from '../../base/icon/icon';\n\nregisterIcons({ play: '<path d=\"m6 3 14 9-14 9z\"/>', pause: '<rect x=\"14\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\" rx=\"1\"/>' });\n\naddMessages('en', { carousel: 'Carousel', carouselSlide: '{n} of {total}', carouselGo: 'Go to {n}', carouselPrev: 'Previous', carouselNext: 'Next', carouselPause: 'Pause', carouselPlay: 'Play' });\naddMessages('pt-BR', { carousel: 'Carrossel', carouselSlide: '{n} de {total}', carouselGo: 'Ir para {n}', carouselPrev: 'Anterior', carouselNext: 'Pr\u00F3ximo', carouselPlay: 'Tocar', carouselPause: 'Pausar' });\n\nexport interface CarouselConfig extends ContainerConfig {\n /** Items shown together. Default 1. */\n perView?: number;\n /** Space between items (px or CSS length). */\n gap?: number | string;\n /** Past the last item goes to the first (and the other way). */\n loop?: boolean;\n /** ms between items; 0 (default) is off. */\n autoplay?: number;\n /** Default `true`. */\n dots?: boolean;\n /** Default `true`. */\n arrows?: boolean;\n active?: number;\n}\n\n/** Pages through its items on a scroll-snap row: images, cards or any component. */\nexport class Carousel extends Container<CarouselConfig> {\n protected override baseCls = 'op-carousel';\n private track!: HTMLElement;\n private prevBtn!: HTMLButtonElement;\n private nextBtn!: HTMLButtonElement;\n private dotsEl!: HTMLElement;\n private toggleBtn!: HTMLButtonElement;\n private index = 0;\n private stopped = false;\n private scrollTimer?: ReturnType<typeof setTimeout>;\n private playTimer?: ReturnType<typeof setInterval>;\n\n private get perView() {\n return Math.max(1, this.config.perView ?? 1);\n }\n /** Positions the row can rest on: it moves one item at a time. */\n private get last() {\n return Math.max(0, this.items.length - this.perView);\n }\n\n protected override build(): HTMLElement {\n const btn = (cls: string, icon: string, key: string, fn: () => void) => {\n const b = h('button', `op-carousel__${cls}`, { type: 'button', 'aria-label': t(key) }, iconEl(icon));\n this.listen(b, 'click', () => {\n this.interact();\n fn();\n });\n return b;\n };\n this.prevBtn = btn('prev', 'chevron-left', 'carouselPrev', () => this.prev());\n this.nextBtn = btn('next', 'chevron-right', 'carouselNext', () => this.next());\n this.toggleBtn = btn('toggle', 'pause', 'carouselPause', () => (this.isPlaying() ? this.pause() : this.play()));\n this.track = h('div', 'op-carousel__track', { tabindex: 0 });\n this.dotsEl = h('div', 'op-carousel__dots');\n return h('div', this.baseCls, { role: 'region', 'aria-roledescription': 'carousel' },\n h('div', 'op-carousel__viewport', {}, this.track, this.prevBtn, this.nextBtn),\n h('div', 'op-carousel__bar', {}, this.dotsEl, this.toggleBtn));\n }\n\n override getBody(): HTMLElement {\n return this.track;\n }\n\n protected override onRender() {\n const c = this.config;\n this.el.setAttribute('aria-label', c.ariaLabel ?? t('carousel'));\n this.track.setAttribute('aria-label', c.ariaLabel ?? t('carousel'));\n this.el.style.setProperty('--op-carousel-per-view', String(this.perView));\n if (c.gap != null) this.el.style.setProperty('--op-carousel-gap', px(c.gap));\n super.onRender();\n this.index = clamp(c.active ?? 0, 0, this.last);\n this.on('add', () => this.refresh());\n this.on('remove', () => this.refresh());\n this.listen(this.track, 'scroll', () => {\n clearTimeout(this.scrollTimer);\n this.scrollTimer = setTimeout(() => this.settle(), 90);\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const el = e.target as HTMLElement;\n if (el !== this.track && !el.closest('.op-carousel__prev, .op-carousel__next, .op-carousel__dots, .op-carousel__toggle')) return;\n const keys: Record<string, () => void> = { ArrowLeft: () => this.step(-1), ArrowRight: () => this.step(1), Home: () => this.goTo(0), End: () => this.goTo(this.last) };\n if (!keys[e.key]) return;\n e.preventDefault();\n this.interact();\n keys[e.key]();\n });\n this.listen(this.track, 'pointerdown', () => this.interact());\n for (const ev of ['pointerenter', 'pointerleave', 'focusin', 'focusout']) this.listen(this.el, ev, () => this.tick());\n this.own(() => {\n clearTimeout(this.scrollTimer);\n clearInterval(this.playTimer);\n });\n this.refresh();\n this.tick();\n }\n\n protected override onMount() {\n this.align(false);\n }\n\n /** Reads the item at the left edge from the scroll position (after a swipe or a trackpad scroll). */\n private settle() {\n const stride = this.stride();\n if (!stride || this.destroyed) return;\n const i = clamp(Math.round(Math.abs(this.track.scrollLeft) / stride), 0, this.last);\n if (i !== this.index) this.set(i);\n }\n\n private stride(): number {\n const [a, b] = this.items;\n return b ? Math.abs(b.el.offsetLeft - a.el.offsetLeft) : 0;\n }\n\n private align(smooth: boolean) {\n const sign = getComputedStyle(this.track).direction === 'rtl' ? -1 : 1;\n this.track.style.scrollBehavior = smooth ? '' : 'auto';\n this.track.scrollLeft = sign * this.index * this.stride();\n }\n\n private set(i: number) {\n const old = this.index;\n this.index = i;\n this.config.active = i;\n this.refresh();\n this.emit('change', i, old);\n }\n\n /** Slides, dots, arrows: everything that follows the item count or the active one. */\n private refresh() {\n if (this.destroyed) return;\n const n = this.items.length;\n this.index = clamp(this.index, 0, this.last);\n this.items.forEach((c, i) => {\n c.el.setAttribute('role', 'group');\n c.el.setAttribute('aria-roledescription', 'slide');\n c.el.setAttribute('aria-label', t('carouselSlide', { n: i + 1, total: n }));\n c.el.toggleAttribute('inert', i < this.index || i >= this.index + this.perView);\n });\n const paged = n > this.perView;\n const dots = this.config.dots !== false && paged;\n this.dotsEl.hidden = !dots;\n if (dots && this.dotsEl.children.length !== this.last + 1) {\n this.dotsEl.replaceChildren(...Array.from({ length: this.last + 1 }, (_, i) => {\n const d = h('button', 'op-carousel__dot', { type: 'button', 'aria-label': t('carouselGo', { n: i + 1 }) });\n this.listen(d, 'click', () => {\n this.interact();\n this.goTo(i);\n });\n return d;\n }));\n }\n [...this.dotsEl.children].forEach((d, i) => (i === this.index ? d.setAttribute('aria-current', 'true') : d.removeAttribute('aria-current')));\n const arrows = this.config.arrows !== false && paged;\n this.prevBtn.hidden = this.nextBtn.hidden = !arrows;\n const loop = !!this.config.loop;\n this.prevBtn.disabled = !loop && this.index === 0;\n this.nextBtn.disabled = !loop && this.index === this.last;\n this.el.classList.toggle('is-first', this.index === 0);\n this.el.classList.toggle('is-last', this.index === this.last);\n this.toggleBtn.hidden = !this.config.autoplay || !paged;\n const playing = this.isPlaying();\n this.el.classList.toggle('is-playing', playing);\n this.toggleBtn.replaceChildren(iconEl(playing ? 'pause' : 'play'));\n this.toggleBtn.setAttribute('aria-label', t(playing ? 'carouselPause' : 'carouselPlay'));\n this.track.setAttribute('aria-live', playing ? 'off' : 'polite');\n }\n\n getActive(): number {\n return this.index;\n }\n\n /** Goes to item `i` (kept between 0 and the last position). `before-change` can cancel. */\n goTo(i: number): void {\n i = clamp(i, 0, this.last);\n if (i === this.index || this.emit('before-change', i) === false) return;\n this.set(i);\n if (this.rendered) this.align(true);\n }\n setActive(i: number): void {\n this.goTo(i);\n }\n private step(d: 1 | -1) {\n const to = this.index + d;\n this.goTo(this.config.loop ? (to < 0 ? this.last : to > this.last ? 0 : to) : to);\n }\n next(): void {\n this.step(1);\n }\n prev(): void {\n this.step(-1);\n }\n\n // ---- autoplay -----------------------------------------------------------------------------\n\n isPlaying(): boolean {\n return !!this.config.autoplay && !this.stopped && !this.reduced();\n }\n private reduced(): boolean {\n return !!window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n }\n play(): void {\n this.stopped = false;\n this.refresh();\n this.tick();\n }\n pause(): void {\n this.stopped = true;\n this.refresh();\n this.tick();\n }\n /** Any use of the controls ends autoplay for good (WCAG 2.2.2). */\n private interact() {\n if (!this.stopped) this.pause();\n }\n /** Runs the timer only while playing and nothing holds the pointer or the focus. */\n private tick() {\n clearInterval(this.playTimer);\n this.playTimer = undefined;\n if (!this.isPlaying() || this.el.matches(':hover, :focus-within') || this.items.length <= this.perView) return;\n this.playTimer = setInterval(() => this.goTo(this.index >= this.last ? 0 : this.index + 1), this.config.autoplay);\n }\n}\nregister('carousel', Carousel);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["registerIcons", "addMessages", "Carousel", "Container", "btn", "cls", "icon", "key", "fn", "b", "h", "t", "iconEl", "c", "px", "clamp", "el", "keys", "ev", "stride", "i", "a", "smooth", "sign", "old", "n", "paged", "dots", "_", "d", "arrows", "loop", "playing", "to", "register"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as o}from"./chunk-Z6L55FTN.js";import{a as t}from"./chunk-TIPK3SCJ.js";var e=class extends o{baseCls="op-field op-checkbox op-toggle";onRender(){super.onRender(),this.inputEl.setAttribute("role","switch")}setIndeterminate(){super.setIndeterminate(!1)}};t("toggle",e);export{e as a};
|
|
2
|
+
//# sourceMappingURL=chunk-DWA45BWR.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{c as w}from"./chunk-DIOJGTUN.js";import{c as y}from"./chunk-BQEFLPDA.js";import{a as m}from"./chunk-XR677UYD.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{b as v}from"./chunk-V5G5JECN.js";import{f as p}from"./chunk-UDXO3KM3.js";import{b as n}from"./chunk-PZSHOSOS.js";import{e as c,f as l}from"./chunk-S4QD5NID.js";c("en",{flAdd:"Add",flRemove:"Remove {row}",flUp:"Move {row} up",flDown:"Move {row} down",flEmpty:"Nothing added yet",flMin:"Add at least {n}",flMax:"At most {n}"});c("pt-BR",{flAdd:"Adicionar",flRemove:"Remover {row}",flUp:"Subir {row}",flDown:"Descer {row}",flEmpty:"Nada adicionado ainda",flMin:"Adicione pelo menos {n}",flMax:"No m\xE1ximo {n}"});var u=class extends m{baseCls="op-field op-fieldlist";rowsEl;addBtn;emptyEl;rows=[];syncing=!1;emptyValue(){return[]}isEmpty(t){return!t?.length}createControl(){return this.rowsEl=n("div","op-fieldlist__rows",{role:"group"}),this.emptyEl=n("div","op-fieldlist__empty",{},l("flEmpty")),this.addBtn=n("button","op-fieldlist__add",{type:"button"},w("plus"),n("span","",{},this.config.addText??l("flAdd"))),this.listen(this.addBtn,"click",()=>this.addRow()),this.inputEl=this.addBtn,n("div","op-fieldlist__box",{},this.rowsEl,this.emptyEl,this.addBtn)}onRender(){super.onRender(),this.rowsEl.setAttribute("aria-labelledby",this.el.querySelector(".op-field__label").id||=`${this.id}-label`)}label(t){return`${this.config.label??""} ${t+1}`.trim()}makeRow(t){let e=s=>{let i=s instanceof p?s.config:s,r={...i,...Array.isArray(i.items)?{items:i.items.map(e)}:{}};return s instanceof p?new s.constructor(r):r},o=new y({cls:"op-fieldlist__row",layout:this.config.rowLayout??{type:"hbox",align:"flex-start"},items:(this.config.items??[]).map(e)});for(let s of o.items)s.config.width!=null&&s.config.flex==null&&(s.config.flex="none");for(let s of this.rowFields(o))s.fillFrom(t),s.on("change",()=>this.syncing||this.commitRows());return o}rowFields(t){return t.query(e=>e instanceof m)}collect(){return this.rows.map(t=>{let e={};for(let o of this.rowFields(t))o.name&&v(e,o.name,o.getValue());return e})}commitRows(){this.commit(this.collect()),this.paintRows(),this.getError()&&this.validate()}paintRows(){if(!this.rendered)return;let{min:t=0,max:e=1/0,reorderable:o=!0}=this.config;this.rowsEl.replaceChildren(...this.rows.map((s,i)=>{let r=s.el;r.setAttribute("role","group"),r.setAttribute("aria-label",this.label(i)),r.classList.toggle("is-first",i===0),r.querySelector(":scope > .op-fieldlist__tools")?.remove();let a=(b,h,R,E)=>{let f=n("button","op-fieldlist__tool",{type:"button","data-act":h,"aria-label":l(h,{row:this.label(i)}),"data-op-tip":l(h,{row:this.label(i)})},w(b));return f.disabled=R||!!this.config.disabled||!!this.config.readonly,f.addEventListener("click",E),f},d=n("div","op-fieldlist__tools");return o&&d.append(a("chevron-up","flUp",i===0,()=>this.moveRow(i,i-1)),a("chevron-down","flDown",i===this.rows.length-1,()=>this.moveRow(i,i+1))),d.append(a("trash","flRemove",this.rows.length<=t,()=>this.removeRow(i))),r.append(d),r})),this.emptyEl.hidden=this.rows.length>0,this.el.classList.toggle("is-empty",!this.rows.length),this.addBtn.disabled=this.rows.length>=e||!!this.config.disabled||!!this.config.readonly}applyValue(t){this.syncing=!0,this.rows.forEach(o=>o.destroy()),this.rows=(t??[]).map(o=>this.makeRow(o)),this.syncing=!1;let e=this.isEqual(this.original,t);this.value=this.collect(),e&&(this.original=this.value),this.paintRows()}addRow(t){let e=this.config.max??1/0;if(this.rows.length>=e)return;let o=this.config.newRow;this.rows.push(this.makeRow(t??(typeof o=="function"?o():{...o}))),this.commitRows(),this.emit("add",this.rows.length-1),this.rowFields(this.rows[this.rows.length-1])[0]?.focus()}removeRow(t){if(!this.rows[t]||this.rows.length<=(this.config.min??0)||this.emit("before-remove",t)===!1)return;let[e]=this.rows.splice(t,1);e.destroy(),this.commitRows(),this.emit("remove",t);let o=this.rows[Math.min(t,this.rows.length-1)];o?this.rowFields(o)[0]?.focus():this.rendered&&this.addBtn.focus()}moveRow(t,e){if(!this.rows[t]||e<0||e>=this.rows.length||t===e)return;let[o]=this.rows.splice(t,1);this.rows.splice(e,0,o),this.commitRows(),this.emit("move",t,e);let s=["flUp","flDown"].map(i=>o.el.querySelector(`[data-act="${i}"]`));(e<t?s:s.reverse()).find(i=>i&&!i.disabled)?.focus()}getRows(){return this.rows}getRowFields(t){return this.rows[t]?this.rowFields(this.rows[t]):[]}fieldAt(t){let[e,...o]=t.split(".");return this.getRowFields(Number(e)).find(s=>s.name===o.join("."))}setAddText(t){this.config.addText=t,this.rendered&&(this.addBtn.lastElementChild.textContent=t)}setMin(t){this.config.min=t,this.paintRows()}setMax(t){this.config.max=t,this.paintRows()}check(){let t=this.value?.length??0,{min:e=0,max:o=1/0}=this.config;return t&&t<e?l("flMin",{n:e}):t>o?l("flMax",{n:o}):super.check()}validate(){let t=this.rows.flatMap(e=>this.rowFields(e)).map(e=>e.validate()).every(Boolean);return super.validate()&&t}isValid(){return super.isValid()&&this.rows.every(t=>this.rowFields(t).every(e=>e.isValid()))}focus(){let t=this.rows.flatMap(e=>this.rowFields(e)).find(e=>e.getError());t?t.focus():this.addBtn?.focus()}onDisabled(t){this.rows.forEach(e=>e.setDisabled(t)),this.paintRows()}onReadonly(t){this.rows.forEach(e=>this.rowFields(e).forEach(o=>o.setReadonly(t))),this.paintRows()}onDestroy(){this.rows.forEach(t=>t.destroy()),super.onDestroy()}};g("fieldlist",u);export{u as a};
|
|
2
|
+
//# sourceMappingURL=chunk-DWTDNKXX.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/form/fieldlist/fieldlist.ts"],
|
|
4
|
+
"sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { Container } from '../../../core/container';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Component } from '../../../core/component';\nimport { iconEl } from '../../base/icon/icon';\nimport { setPath } from '../../../core/path';\n\naddMessages('en', { flAdd: 'Add', flRemove: 'Remove {row}', flUp: 'Move {row} up', flDown: 'Move {row} down', flEmpty: 'Nothing added yet', flMin: 'Add at least {n}', flMax: 'At most {n}' });\naddMessages('pt-BR', { flAdd: 'Adicionar', flRemove: 'Remover {row}', flUp: 'Subir {row}', flDown: 'Descer {row}', flEmpty: 'Nada adicionado ainda', flMin: 'Adicione pelo menos {n}', flMax: 'No m\u00E1ximo {n}' });\n\ntype Row = Record<string, any>;\n\nexport interface FieldListConfig extends FieldConfig<Row[]> {\n /** The fields of one row (configs or instances such as `ui.text(...)`). Names are relative to the row (nested allowed). */\n items?: Array<AnyConfig | Component>;\n min?: number;\n max?: number;\n addText?: string;\n reorderable?: boolean;\n /** Values for a new row, or a function that returns them. */\n newRow?: Row | (() => Row);\n /** Layout of a row. Default `hbox` (the fields share the row). */\n rowLayout?: LayoutSpec;\n}\n\n/** A repeating block of fields: add, remove and reorder rows; the value is an array of row objects. */\nexport class FieldList extends Field<Row[], FieldListConfig> {\n protected override baseCls = 'op-field op-fieldlist';\n private rowsEl!: HTMLElement;\n private addBtn!: HTMLButtonElement;\n private emptyEl!: HTMLElement;\n private rows: Container[] = [];\n private syncing = false;\n\n protected override emptyValue(): Row[] {\n return [];\n }\n protected override isEmpty(v: Row[]): boolean {\n return !v?.length;\n }\n\n protected createControl() {\n this.rowsEl = h('div', 'op-fieldlist__rows', { role: 'group' });\n this.emptyEl = h('div', 'op-fieldlist__empty', {}, t('flEmpty'));\n this.addBtn = h('button', 'op-fieldlist__add', { type: 'button' }, iconEl('plus'), h('span', '', {}, this.config.addText ?? t('flAdd')));\n this.listen(this.addBtn, 'click', () => this.addRow());\n this.inputEl = this.addBtn;\n return h('div', 'op-fieldlist__box', {}, this.rowsEl, this.emptyEl, this.addBtn);\n }\n\n protected override onRender() {\n super.onRender();\n this.rowsEl.setAttribute('aria-labelledby', (this.el.querySelector('.op-field__label') as HTMLElement).id ||= `${this.id}-label`);\n }\n\n // ---- rows ---------------------------------------------------------------------------------\n\n private label(i: number): string {\n return `${this.config.label ?? ''} ${i + 1}`.trim();\n }\n\n private makeRow(values: Row): Container {\n // every row gets fresh fields: a config is copied, an instance (`ui.text(...)`) is rebuilt from a copy of its config\n const fresh = (c: AnyConfig | Component): AnyConfig | Component => {\n const cfg = (c instanceof Component ? c.config : c) as AnyConfig;\n const copy = { ...cfg, ...(Array.isArray(cfg.items) ? { items: (cfg.items as Array<AnyConfig | Component>).map(fresh) } : {}) };\n return c instanceof Component ? new (c.constructor as new (cfg: object) => Component)(copy) : copy;\n };\n const row = new Container({ cls: 'op-fieldlist__row', layout: this.config.rowLayout ?? { type: 'hbox', align: 'flex-start' }, items: (this.config.items ?? []).map(fresh) });\n for (const c of row.items) if (c.config.width != null && c.config.flex == null) c.config.flex = 'none'; // a set width is kept\n for (const f of this.rowFields(row)) {\n f.fillFrom(values);\n f.on('change', () => this.syncing || this.commitRows());\n }\n return row;\n }\n\n private rowFields(row: Container): Field<any>[] {\n return row.query((c) => c instanceof Field) as Field<any>[];\n }\n\n private collect(): Row[] {\n return this.rows.map((row) => {\n const out: Row = {};\n for (const f of this.rowFields(row)) if (f.name) setPath(out, f.name, f.getValue());\n return out;\n });\n }\n\n private commitRows() {\n this.commit(this.collect());\n this.paintRows();\n if (this.getError()) this.validate();\n }\n\n /** Puts every row in place: its group name, tools, and which tools are allowed. */\n private paintRows() {\n if (!this.rendered) return;\n const { min = 0, max = Infinity, reorderable = true } = this.config;\n this.rowsEl.replaceChildren(\n ...this.rows.map((row, i) => {\n const el = row.el;\n el.setAttribute('role', 'group');\n el.setAttribute('aria-label', this.label(i));\n el.classList.toggle('is-first', i === 0);\n el.querySelector(':scope > .op-fieldlist__tools')?.remove();\n const tool = (icon: string, key: string, disabled: boolean, run: () => void) => {\n const b = h('button', 'op-fieldlist__tool', { type: 'button', 'data-act': key, 'aria-label': t(key, { row: this.label(i) }), 'data-op-tip': t(key, { row: this.label(i) }) }, iconEl(icon));\n b.disabled = disabled || !!this.config.disabled || !!this.config.readonly;\n b.addEventListener('click', run);\n return b;\n };\n const tools = h('div', 'op-fieldlist__tools');\n if (reorderable) tools.append(tool('chevron-up', 'flUp', i === 0, () => this.moveRow(i, i - 1)), tool('chevron-down', 'flDown', i === this.rows.length - 1, () => this.moveRow(i, i + 1)));\n tools.append(tool('trash', 'flRemove', this.rows.length <= min, () => this.removeRow(i)));\n el.append(tools);\n return el;\n }),\n );\n this.emptyEl.hidden = this.rows.length > 0;\n this.el.classList.toggle('is-empty', !this.rows.length);\n this.addBtn.disabled = this.rows.length >= max || !!this.config.disabled || !!this.config.readonly;\n }\n\n protected applyValue(value: Row[]): void {\n this.syncing = true;\n this.rows.forEach((r) => r.destroy());\n this.rows = (value ?? []).map((v) => this.makeRow(v));\n this.syncing = false;\n const was = this.isEqual(this.original, value);\n this.value = this.collect(); // what the rows actually hold (a missing key becomes the field's empty value)\n if (was) this.original = this.value; // normalizing the starting value does not make the form dirty\n this.paintRows();\n }\n\n /** Adds a row (at the end) and focuses its first field. */\n addRow(values?: Row): void {\n const max = this.config.max ?? Infinity;\n if (this.rows.length >= max) return;\n const n = this.config.newRow;\n this.rows.push(this.makeRow(values ?? (typeof n === 'function' ? n() : { ...n })));\n this.commitRows();\n this.emit('add', this.rows.length - 1);\n this.rowFields(this.rows[this.rows.length - 1])[0]?.focus();\n }\n\n removeRow(index: number): void {\n if (!this.rows[index] || this.rows.length <= (this.config.min ?? 0) || this.emit('before-remove', index) === false) return;\n const [row] = this.rows.splice(index, 1);\n row.destroy();\n this.commitRows();\n this.emit('remove', index);\n const next = this.rows[Math.min(index, this.rows.length - 1)];\n if (next) this.rowFields(next)[0]?.focus();\n else if (this.rendered) this.addBtn.focus();\n }\n\n moveRow(from: number, to: number): void {\n if (!this.rows[from] || to < 0 || to >= this.rows.length || from === to) return;\n const [row] = this.rows.splice(from, 1);\n this.rows.splice(to, 0, row);\n this.commitRows();\n this.emit('move', from, to);\n // the focus follows the row: the same tool if it can still move that way, the other one at the end of the list\n const tools = ['flUp', 'flDown'].map((k) => row.el.querySelector<HTMLButtonElement>(`[data-act=\"${k}\"]`));\n (to < from ? tools : tools.reverse()).find((b) => b && !b.disabled)?.focus();\n }\n\n getRows(): Container[] {\n return this.rows;\n }\n getRowFields(index: number): Field<any>[] {\n return this.rows[index] ? this.rowFields(this.rows[index]) : [];\n }\n\n /** The field of a row by path (`'0.name'` \u2192 field `name` of the first row): where a server error lands. */\n fieldAt(path: string): Field<any> | undefined {\n const [i, ...rest] = path.split('.');\n return this.getRowFields(Number(i)).find((f) => f.name === rest.join('.'));\n }\n\n setAddText(text: string): void {\n this.config.addText = text;\n if (this.rendered) this.addBtn.lastElementChild!.textContent = text;\n }\n\n setMin(min: number): void {\n this.config.min = min;\n this.paintRows();\n }\n setMax(max: number): void {\n this.config.max = max;\n this.paintRows();\n }\n\n // ---- validation ---------------------------------------------------------------------------\n\n protected override check(): string {\n const n = this.value?.length ?? 0;\n const { min = 0, max = Infinity } = this.config;\n if (n && n < min) return t('flMin', { n: min });\n if (n > max) return t('flMax', { n: max });\n return super.check();\n }\n\n /** Validates every row too; the list is valid when its own rules and every field inside pass. */\n override validate(): boolean {\n const inner = this.rows.flatMap((r) => this.rowFields(r)).map((f) => f.validate()).every(Boolean);\n return super.validate() && inner;\n }\n\n override isValid(): boolean {\n return super.isValid() && this.rows.every((r) => this.rowFields(r).every((f) => f.isValid()));\n }\n\n /** The first invalid field inside, or the add button. */\n override focus(): void {\n const bad = this.rows.flatMap((r) => this.rowFields(r)).find((f) => f.getError());\n if (bad) bad.focus();\n else this.addBtn?.focus();\n }\n\n protected override onDisabled(disabled: boolean) {\n this.rows.forEach((r) => r.setDisabled(disabled));\n this.paintRows();\n }\n protected override onReadonly(readonly: boolean) {\n this.rows.forEach((r) => this.rowFields(r).forEach((f) => f.setReadonly(readonly)));\n this.paintRows();\n }\n\n protected override onDestroy(): void {\n this.rows.forEach((r) => r.destroy());\n super.onDestroy();\n }\n}\nregister('fieldlist', FieldList);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "FieldList", "Field", "v", "h", "t", "iconEl", "i", "values", "fresh", "c", "cfg", "Component", "copy", "row", "Container", "f", "out", "setPath", "min", "max", "reorderable", "el", "tool", "icon", "key", "disabled", "run", "b", "tools", "value", "r", "was", "n", "index", "next", "from", "to", "k", "path", "rest", "text", "inner", "bad", "readonly", "register"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as m}from"./chunk-TIPK3SCJ.js";import{f as a}from"./chunk-UDXO3KM3.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as n,f}from"./chunk-S4QD5NID.js";n("en",{feOne:"Fix 1 problem before saving",feMany:"Fix {n} problems before saving"});n("pt-BR",{feOne:"Corrija 1 problema antes de salvar",feMany:"Corrija {n} problemas antes de salvar"});var l=class extends a{baseCls="op-formerrors";titleEl;listEl;form;active=!1;build(){return this.titleEl=o("div","op-formerrors__title"),this.listEl=o("ul","op-formerrors__list"),o("div","op-formerrors",{role:"alert",tabindex:-1},this.titleEl,this.listEl)}onRender(){this.el.hidden=!0;let e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;let t=this.form=e;if(t){t.on("invalid",()=>{this.active=!0,this.refresh(),this.config.focus&&this.el.focus()});for(let r of t.getFields())for(let i of["invalid","valid"])r.on(i,()=>this.active&&this.refresh());this.listen(this.listEl,"click",r=>{let i=Number(r.target.closest("[data-i]")?.dataset.i),s=this.getErrors()[i];s&&(t.focusField(s),this.emit("go",s))})}}getErrors(){return this.form?.getFields().filter(e=>e.getError())??[]}refresh(){let e=this.getErrors(),t=e.length,r=this.config.title;this.titleEl.textContent=typeof r=="function"?r(t):r??f(t===1?"feOne":"feMany",{n:t}),this.listEl.replaceChildren(...e.map((i,s)=>o("li","",{},o("button","op-formerrors__link",{type:"button","data-i":s},`${i.config.label??i.name??""}: ${i.getError()}`)))),this.el.hidden=!t}};m("formerrors",l);export{l as a};
|
|
2
|
+
//# sourceMappingURL=chunk-ESCLDVFS.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/components/form/formerrors/formerrors.ts"],
|
|
4
4
|
"sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { addMessages, t } from '../../../core/i18n';\nimport { Field } from '../../../core/field';\nimport type { Form } from '../form/form';\n\naddMessages('en', { feOne: 'Fix 1 problem before saving', feMany: 'Fix {n} problems before saving' });\naddMessages('pt-BR', { feOne: 'Corrija 1 problema antes de salvar', feMany: 'Corrija {n} problemas antes de salvar' });\n\nexport interface FormErrorsConfig extends ComponentConfig {\n /** The heading: a function of the number of problems, or a fixed text. */\n title?: string | ((n: number) => string);\n /** Take the focus after a failed submit (instead of the first invalid field). */\n focus?: boolean;\n}\n\n/** An error summary: after a failed validation, every problem as a button that takes you to its field. */\nexport class FormErrors extends Component<FormErrorsConfig> {\n protected override baseCls = 'op-formerrors';\n private titleEl!: HTMLElement;\n private listEl!: HTMLElement;\n private form?: Form;\n /** Shown only once the form was validated with errors (not while the user is still filling it in). */\n private active = false;\n\n protected override build() {\n this.titleEl = h('div', 'op-formerrors__title');\n this.listEl = h('ul', 'op-formerrors__list');\n return h('div', 'op-formerrors', { role: 'alert', tabindex: -1 }, this.titleEl, this.listEl);\n }\n\n protected override onRender() {\n this.el.hidden = true;\n let p = this.parent as Component | undefined;\n while (p && !('focusField' in p && 'getFields' in p)) p = p.parent as Component | undefined; // the Form, by its methods (no import)\n const form = (this.form = p as Form | undefined);\n if (!form) return;\n form.on('invalid', () => {\n this.active = true;\n this.refresh();\n if (this.config.focus) this.el.focus();\n });\n for (const f of form.getFields()) for (const ev of ['invalid', 'valid']) f.on(ev, () => this.active && this.refresh());\n this.listen(this.listEl, 'click', (e: Event) => {\n const i = Number((e.target as HTMLElement).closest<HTMLElement>('[data-i]')?.dataset.i);\n const field = this.getErrors()[i];\n if (!field) return;\n form.focusField(field);\n this.emit('go', field);\n });\n }\n\n /** The form fields that have an error, in order. */\n getErrors(): Field<any>[] {\n return this.form?.getFields().filter((f) => f.getError()) ?? [];\n }\n\n /** Redraws the list from the current errors (hides when there are none). */\n refresh(): void {\n const errs = this.getErrors();\n const n = errs.length;\n const title = this.config.title;\n this.titleEl.textContent = typeof title === 'function' ? title(n) : (title ?? t(n === 1 ? 'feOne' : 'feMany', { n }));\n this.listEl.replaceChildren(...errs.map((f, i) => h('li', '', {}, h('button', 'op-formerrors__link', { type: 'button', 'data-i': i }, `${f.config.label ?? f.name ?? ''}: ${f.getError()}`))));\n this.el.hidden = !n;\n }\n}\nregister('formerrors', FormErrors);\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "kKAOAA,EAAY,KAAM,CAAE,MAAO,8BAA+B,OAAQ,gCAAiC,CAAC,EACpGA,EAAY,QAAS,CAAE,MAAO,qCAAsC,OAAQ,uCAAwC,CAAC,EAU9G,IAAMC,EAAN,cAAyBC,CAA4B,CACvC,QAAU,gBACrB,QACA,OACA,KAEA,OAAS,GAEE,OAAQ,CACzB,YAAK,QAAUC,EAAE,MAAO,sBAAsB,EAC9C,KAAK,OAASA,EAAE,KAAM,qBAAqB,EACpCA,EAAE,MAAO,gBAAiB,CAAE,KAAM,QAAS,SAAU,EAAG,EAAG,KAAK,QAAS,KAAK,MAAM,CAC7F,CAEmB,UAAW,CAC5B,KAAK,GAAG,OAAS,GACjB,IAAIC,EAAI,KAAK,OACb,KAAOA,GAAK,EAAE,eAAgBA,GAAK,cAAeA,IAAIA,EAAIA,EAAE,OAC5D,IAAMC,EAAQ,KAAK,KAAOD,EAC1B,GAAKC,EACL,CAAAA,EAAK,GAAG,UAAW,IAAM,CACvB,KAAK,OAAS,GACd,KAAK,QAAQ,EACT,KAAK,OAAO,OAAO,KAAK,GAAG,MAAM,CACvC,CAAC,EACD,QAAWC,KAAKD,EAAK,UAAU,EAAG,QAAWE,IAAM,CAAC,UAAW,OAAO,EAAGD,EAAE,GAAGC,EAAI,IAAM,KAAK,QAAU,KAAK,QAAQ,CAAC,EACrH,KAAK,OAAO,KAAK,OAAQ,QAAUC,GAAa,CAC9C,IAAM,EAAI,OAAQA,EAAE,OAAuB,QAAqB,UAAU,GAAG,QAAQ,CAAC,EAChFC,EAAQ,KAAK,UAAU,EAAE,CAAC,EAC3BA,IACLJ,EAAK,WAAWI,CAAK,EACrB,KAAK,KAAK,KAAMA,CAAK,EACvB,CAAC,EACH,CAGA,WAA0B,CACxB,OAAO,KAAK,MAAM,UAAU,EAAE,OAAQH,GAAMA,EAAE,SAAS,CAAC,GAAK,CAAC,CAChE,CAGA,SAAgB,CACd,IAAMI,EAAO,KAAK,UAAU,EACtBC,EAAID,EAAK,OACTE,EAAQ,KAAK,OAAO,MAC1B,KAAK,QAAQ,YAAc,OAAOA,GAAU,WAAaA,EAAMD,CAAC,EAAKC,GAASC,EAAEF,IAAM,EAAI,QAAU,SAAU,CAAE,EAAAA,CAAE,CAAC,EACnH,KAAK,OAAO,gBAAgB,GAAGD,EAAK,IAAI,CAACJ,EAAGQ,IAAMX,EAAE,KAAM,GAAI,CAAC,EAAGA,EAAE,SAAU,sBAAuB,CAAE,KAAM,SAAU,SAAUW,CAAE,EAAG,GAAGR,EAAE,OAAO,OAASA,EAAE,MAAQ,EAAE,KAAKA,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAC7L,KAAK,GAAG,OAAS,CAACK,CACpB,CACF,EACAI,EAAS,aAAcd,CAAU",
|
|
6
6
|
"names": ["addMessages", "FormErrors", "Component", "h", "p", "form", "f", "ev", "e", "field", "errs", "n", "title", "t", "i", "register"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as g}from"./chunk-JE56CJX2.js";import{a as h}from"./chunk-2QMI2RRB.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as d,f as l}from"./chunk-S4QD5NID.js";d("en",{shortcuts:"Keyboard shortcuts",shortcutsGlobal:"Everywhere",shortcutsEmpty:"No shortcuts registered"});d("pt-BR",{shortcuts:"Atalhos de teclado",shortcutsGlobal:"Em qualquer tela",shortcutsEmpty:"Nenhum atalho registrado"});var y=()=>/mac|iphone|ipad/i.test(navigator.platform||navigator.userAgent),f=t=>{let s=t.toLowerCase().split("+").map(e=>e.trim()),o=s.pop();return[...s.sort(),o].join("+")};function w(t,s){let o=s.toLowerCase().split("+"),e=o.pop(),r=v=>o.includes(v),c=y(),b=e.length===1&&!/[a-z0-9]/.test(e);return t.key.toLowerCase()===e&&t.ctrlKey===(r("ctrl")||r("mod")&&!c)&&t.metaKey===(r("meta")||r("mod")&&c)&&t.altKey===r("alt")&&(b||t.shiftKey===r("shift"))}function E(t){let s=y(),o=s?{mod:"\u2318",ctrl:"\u2303",alt:"\u2325",shift:"\u21E7",meta:"\u2318"}:{mod:"Ctrl",ctrl:"Ctrl",alt:"Alt",shift:"Shift",meta:"Meta"};return t.split("+").map(e=>o[e.toLowerCase()]??(e.length===1?e.toUpperCase():e[0].toUpperCase()+e.slice(1))).join(s?"":"+")}var n=[],a,m=!1,p,k=t=>t instanceof HTMLElement&&(t.isContentEditable||/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName));function K(t){if(t.defaultPrevented||t.isComposing)return;let s=t.ctrlKey||t.metaKey||t.altKey,o=[...n].sort((e,r)=>+((r.scope??"global")===a)-+((e.scope??"global")===a)).find(e=>((e.scope??"global")==="global"||e.scope===a)&&w(t,e.keys)&&(s||e.inInputs||!k(t.target))&&(e.when?.()??!0));o&&o.handler(t)!==!1&&t.preventDefault()}var u={register(t){let s=Array.isArray(t)?t:[t];!m&&typeof document<"u"&&(m=!0,document.addEventListener("keydown",K),u.register({keys:"shift+?",title:l("shortcuts"),handler:()=>u.help()}));for(let o of s){let e=n.findIndex(r=>(r.scope??"global")===(o.scope??"global")&&f(r.keys)===f(o.keys));e>=0&&(h()&&console.warn(`Optikos: shortcut ${o.keys} is already taken in scope "${o.scope??"global"}" by "${n[e].title}"; "${o.title}" replaces it`),n.splice(e,1)),n.push(o)}return()=>{for(let o of s){let e=n.indexOf(o);e>=0&&n.splice(e,1)}}},setScope(t){a=t},getScope:()=>a,list:()=>n.filter(t=>(t.scope??"global")==="global"||t.scope===a),help(){if(p)return void p.close();let t=new Map;for(let e of u.list()){let r=e.group??((e.scope??"global")==="global"?l("shortcutsGlobal"):e.scope);t.set(r,[...t.get(r)??[],e])}let s=i("div","op-shortcuts");for(let[e,r]of t)s.append(i("h3","op-shortcuts__group",{},e),...r.map(c=>i("div","op-shortcuts__row",{},i("span","",{},c.title),i("kbd","op-shortcuts__kbd",{},E(c.keys)))));t.size||s.append(l("shortcutsEmpty"));let o=p=new g({title:l("shortcuts"),closable:!0,width:420});o.on("destroy",()=>p=void 0),o.show(),o.getBody().replaceChildren(s)}};export{E as a,u as b};
|
|
2
|
+
//# sourceMappingURL=chunk-EXIADWI7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/overlays/shortcuts/shortcuts.ts"],
|
|
4
|
+
"sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { isDev } from '../../../core/dev';\nimport { Window } from '../window/window';\n\naddMessages('en', { shortcuts: 'Keyboard shortcuts', shortcutsGlobal: 'Everywhere', shortcutsEmpty: 'No shortcuts registered' });\naddMessages('pt-BR', { shortcuts: 'Atalhos de teclado', shortcutsGlobal: 'Em qualquer tela', shortcutsEmpty: 'Nenhum atalho registrado' });\n\nexport interface Shortcut {\n /** `mod+s` (Ctrl, or \u2318 on a Mac), `shift+?`, `alt+n`, `g`. Several keys in a row are not supported. */\n keys: string;\n title: string;\n handler: (e: KeyboardEvent) => void | false;\n /** The screen it belongs to (`setScope`). Default `global`: active on every screen. */\n scope?: string;\n /** Heading in the help panel. Default: the scope. */\n group?: string;\n /** Checked on every press: the shortcut only runs while this returns true. */\n when?: () => boolean;\n /** A shortcut without Ctrl/\u2318/Alt is ignored while typing in a field, unless this is true. */\n inInputs?: boolean;\n}\n\nconst isMac = () => /mac|iphone|ipad/i.test(navigator.platform || navigator.userAgent);\nconst normalize = (keys: string) => {\n const p = keys.toLowerCase().split('+').map((x) => x.trim());\n const key = p.pop();\n return [...p.sort(), key].join('+');\n};\n\nfunction matches(e: KeyboardEvent, keys: string): boolean {\n const parts = keys.toLowerCase().split('+');\n const key = parts.pop()!;\n const has = (m: string) => parts.includes(m);\n const mac = isMac();\n // a symbol such as `?` already carries its Shift\n const symbol = key.length === 1 && !/[a-z0-9]/.test(key);\n return e.key.toLowerCase() === key && e.ctrlKey === (has('ctrl') || (has('mod') && !mac)) && e.metaKey === (has('meta') || (has('mod') && mac)) && e.altKey === has('alt') && (symbol || e.shiftKey === has('shift'));\n}\n\n/** How a combination reads on this keyboard: `\u2318S`, `Ctrl+S`. */\nexport function formatKeys(keys: string): string {\n const mac = isMac();\n const names: Record<string, string> = mac ? { mod: '\u2318', ctrl: '\u2303', alt: '\u2325', shift: '\u21E7', meta: '\u2318' } : { mod: 'Ctrl', ctrl: 'Ctrl', alt: 'Alt', shift: 'Shift', meta: 'Meta' };\n return keys.split('+').map((p) => names[p.toLowerCase()] ?? (p.length === 1 ? p.toUpperCase() : p[0].toUpperCase() + p.slice(1))).join(mac ? '' : '+');\n}\n\nconst entries: Shortcut[] = [];\nlet scope: string | undefined;\nlet listening = false;\nlet helpWin: Window | undefined;\n\nconst typing = (el: EventTarget | null) => el instanceof HTMLElement && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName));\n\nfunction onKey(e: KeyboardEvent) {\n if (e.defaultPrevented || e.isComposing) return;\n const modified = e.ctrlKey || e.metaKey || e.altKey;\n // the active screen's shortcuts come before the global ones with the same keys\n const hit = [...entries].sort((a, b) => Number((b.scope ?? 'global') === scope) - Number((a.scope ?? 'global') === scope)).find((s) => ((s.scope ?? 'global') === 'global' || s.scope === scope) && matches(e, s.keys) && (modified || s.inInputs || !typing(e.target)) && (s.when?.() ?? true));\n if (hit && hit.handler(e) !== false) e.preventDefault();\n}\n\nexport const shortcuts = {\n /** Adds shortcuts; returns the function that removes them. The same keys twice in one scope warn in dev, and the newest wins. */\n register(list: Shortcut | Shortcut[]): () => void {\n const add = Array.isArray(list) ? list : [list];\n if (!listening && typeof document !== 'undefined') {\n listening = true;\n document.addEventListener('keydown', onKey);\n shortcuts.register({ keys: 'shift+?', title: t('shortcuts'), handler: () => shortcuts.help() });\n }\n for (const s of add) {\n const same = entries.findIndex((x) => (x.scope ?? 'global') === (s.scope ?? 'global') && normalize(x.keys) === normalize(s.keys));\n if (same >= 0) {\n if (isDev()) console.warn(`Optikos: shortcut ${s.keys} is already taken in scope \"${s.scope ?? 'global'}\" by \"${entries[same].title}\"; \"${s.title}\" replaces it`);\n entries.splice(same, 1);\n }\n entries.push(s);\n }\n return () => {\n for (const s of add) {\n const i = entries.indexOf(s);\n if (i >= 0) entries.splice(i, 1);\n }\n };\n },\n\n /** The screen whose shortcuts are active besides the global ones (`undefined`: only global). */\n setScope(name: string | undefined): void {\n scope = name;\n },\n getScope: (): string | undefined => scope,\n\n /** What is active now: the global shortcuts and the current scope's. */\n list: (): Shortcut[] => entries.filter((s) => (s.scope ?? 'global') === 'global' || s.scope === scope),\n\n /** Opens (or closes) the help panel, grouped. `?` does it from anywhere but a text field. */\n help(): void {\n if (helpWin) return void helpWin.close();\n const groups = new Map<string, Shortcut[]>();\n for (const s of shortcuts.list()) {\n const g = s.group ?? ((s.scope ?? 'global') === 'global' ? t('shortcutsGlobal') : s.scope!);\n groups.set(g, [...(groups.get(g) ?? []), s]);\n }\n const body = h('div', 'op-shortcuts');\n for (const [g, list] of groups) body.append(h('h3', 'op-shortcuts__group', {}, g), ...list.map((s) => h('div', 'op-shortcuts__row', {}, h('span', '', {}, s.title), h('kbd', 'op-shortcuts__kbd', {}, formatKeys(s.keys)))));\n if (!groups.size) body.append(t('shortcutsEmpty'));\n const win = (helpWin = new Window({ title: t('shortcuts'), closable: true, width: 420 }));\n win.on('destroy', () => (helpWin = undefined));\n win.show();\n win.getBody().replaceChildren(body);\n },\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["addMessages", "isMac", "normalize", "keys", "p", "x", "key", "matches", "e", "parts", "has", "m", "mac", "symbol", "formatKeys", "names", "entries", "scope", "listening", "helpWin", "typing", "el", "onKey", "modified", "hit", "a", "b", "s", "shortcuts", "list", "add", "t", "same", "isDev", "i", "name", "groups", "g", "body", "h", "win", "Window"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{c as
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{c as x}from"./chunk-DIOJGTUN.js";import{c as d}from"./chunk-BQEFLPDA.js";import{a as c}from"./chunk-XR677UYD.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{b as n}from"./chunk-PZSHOSOS.js";var a=class extends d{baseCls="op-inputgroup";affixes=[];getField(){return this.query(i=>i instanceof c)[0]}onRender(){super.onRender(),this.paint();for(let i of["invalid","valid"])this.getField()?.on(i,()=>this.describe())}describe(){let i=this.getField()?.el.querySelector("[aria-invalid]");if(!i)return;let t=[...(i.getAttribute("aria-describedby")??"").split(" ").filter(r=>r&&!r.startsWith(`${this.id}-`)),...this.affixes.filter(r=>r.tagName==="SPAN").map(r=>r.id)];t.length?i.setAttribute("aria-describedby",t.join(" ")):i.removeAttribute("aria-describedby")}paint(){let i=this.getField();if(!i)return;this.affixes.forEach(e=>e.remove()),this.affixes=[];let o=i.el.querySelector(".op-field__control"),t=o.querySelector(":scope > .op-inputgroup__row");t||(t=n("div","op-inputgroup__row"),t.append(...Array.from(o.childNodes)),o.append(t));let r=(e,p)=>{if(typeof e=="string")return n("span",`op-inputgroup__affix op-inputgroup__affix--${p}`,{id:`${this.id}-${p}`},e);let u=n("button",`op-inputgroup__affix op-inputgroup__btn op-inputgroup__affix--${p}`,{type:"button","aria-label":e.ariaLabel??null},e.icon?x(e.icon):"",e.text?n("span","",{},e.text):"");return this.listen(u,"click",()=>e.handler?.(i)),u},{prefix:f,suffix:s}=this.config;f!=null&&t.prepend(this.track(r(f,"prefix"))),s!=null&&t.append(this.track(r(s,"suffix"))),i.el.classList.toggle("has-prefix",f!=null),i.el.classList.toggle("has-suffix",s!=null),this.describe()}track(i){return this.affixes.push(i),i}setPrefix(i){this.config.prefix=i,this.rendered&&this.paint()}setSuffix(i){this.config.suffix=i,this.rendered&&this.paint()}};l("inputgroup",a);export{a};
|
|
2
|
+
//# sourceMappingURL=chunk-F4HZUAKM.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{a as b}from"./chunk-2HNQ2XRY.js";var U={csv:"text/csv;charset=utf-8",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},y=new TextEncoder,T=t=>typeof t=="string"?t:t.textContent??"",E=t=>/[",\n\r;]/.test(t)?`"${t.replace(/"/g,'""')}"`:t,A=t=>/^[=+@]/.test(t)||/^-[^\d.,]/.test(t)?`'${t}`:t;function k(t,r){let e=t.getColumns();return{head:e.map(n=>n.header??n.field),rows:r.map(n=>e.map(o=>{let c=n.data[o.field];return typeof c=="number"&&!o.format&&!o.renderer?c:A(T(b(o,n)))}))}}var w=(()=>{let t=Array.from({length:256},(r,e)=>{for(let n=0;n<8;n++)e=e&1?3988292384^e>>>1:e>>>1;return e>>>0});return r=>{let e=-1;for(let n of r)e=t[(e^n)&255]^e>>>8;return~e>>>0}})();function C(t){let r=[],e=[],n=0,o=(p,l,a)=>p.setUint32(l,a,!0);for(let[p,l]of Object.entries(t)){let a=y.encode(p),i=y.encode(l),u=new Uint8Array(30+a.length),f=new DataView(u.buffer);o(f,0,67324752),f.setUint16(4,20,!0),f.setUint16(6,2048,!0),o(f,14,w(i)),o(f,18,i.length),o(f,22,i.length),f.setUint16(26,a.length,!0),u.set(a,30);let g=new Uint8Array(46+a.length),h=new DataView(g.buffer);o(h,0,33639248),h.setUint16(4,20,!0),h.setUint16(6,20,!0),h.setUint16(8,2048,!0),o(h,16,w(i)),o(h,20,i.length),o(h,24,i.length),h.setUint16(28,a.length,!0),o(h,42,n),g.set(a,46),e.push(g),r.push(u,i),n+=u.length+i.length}let c=e.reduce((p,l)=>p+l.length,0),s=new Uint8Array(22),m=new DataView(s.buffer);o(m,0,101010256),m.setUint16(8,e.length,!0),m.setUint16(10,e.length,!0),o(m,12,c),o(m,16,n);let d=new Uint8Array(n+c+22),x=0;for(let p of[...r,...e,s])d.set(p,x),x+=p.length;return d}var S=t=>t.replace(/[&<>"]/g,r=>`&#${r.charCodeAt(0)};`).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g,""),v=(t,r)=>{let e="";for(let n=t+1;n>0;n=Math.floor((n-1)/26))e=String.fromCharCode(65+(n-1)%26)+e;return e+(r+1)};function R(t,r){let e=(c,s,m,d=!1)=>typeof c=="number"?`<c r="${v(s,m)}"><v>${c}</v></c>`:`<c r="${v(s,m)}" t="inlineStr"${d?' s="1"':""}><is><t xml:space="preserve">${S(c)}</t></is></c>`,o={"[Content_Types].xml":'<?xml version="1.0" encoding="UTF-8"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/></Types>',"_rels/.rels":'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>',"xl/workbook.xml":'<?xml version="1.0" encoding="UTF-8"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets></workbook>',"xl/_rels/workbook.xml.rels":'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/></Relationships>',"xl/styles.xml":'<?xml version="1.0" encoding="UTF-8"?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="2"><font><sz val="11"/><name val="Calibri"/></font><font><b/><sz val="11"/><name val="Calibri"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border/></borders><cellStyleXfs count="1"><xf/></cellStyleXfs><cellXfs count="2"><xf/><xf fontId="1" applyFont="1"/></cellXfs></styleSheet>',"xl/worksheets/sheet1.xml":`<?xml version="1.0" encoding="UTF-8"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData>${[t,...r].map((c,s)=>`<row r="${s+1}">${c.map((m,d)=>e(m,d,s,s===0)).join("")}</row>`).join("")}</sheetData></worksheet>`};return new Blob([C(o)],{type:U.xlsx})}async function O(t,r={}){let{format:e="csv",filename:n="export",scope:o="all",download:c=!0}=r,s=t.getStore(),m=o==="page"?s.getRange():await s.fetchAll(r.pageSize),{head:d,rows:x}=k(t,m),p=e==="xlsx"?R(d,x):new Blob(["\uFEFF"+[d,...x].map(l=>l.map(a=>E(String(a))).join(",")).join(`\r
|
|
2
|
+
`)],{type:U.csv});if(c){let l=document.createElement("a");l.href=URL.createObjectURL(p),l.download=`${n}.${e}`,document.body.append(l),l.click(),l.remove(),setTimeout(()=>URL.revokeObjectURL(l.href),1e3)}return p}async function $(t,r={}){let e=t.getStore(),n=r.scope==="page"?e.getRange():await e.fetchAll(r.pageSize),{head:o,rows:c}=k(t,n),s=document.createElement("div");s.className="op-print-sheet";let m=(a,i)=>Object.assign(document.createElement(a),{textContent:String(i)}),d=(a,i)=>{let u=document.createElement("tr");return u.append(...i.map(f=>m(a,f))),u},x=document.createElement("table"),p=document.createElement("thead");p.append(d("th",o));let l=document.createElement("tbody");l.append(...c.map(a=>d("td",a))),x.append(p,l),r.title&&s.append(Object.assign(document.createElement("h1"),{textContent:r.title})),s.append(x),document.body.append(s),document.documentElement.classList.add("op-printing"),await new Promise(a=>{let i=()=>{window.removeEventListener("afterprint",i),s.remove(),document.documentElement.classList.remove("op-printing"),a()};window.addEventListener("afterprint",i),window.print(),typeof matchMedia!="function"&&setTimeout(i,0)})}export{O as a,$ as b};
|
|
3
|
+
//# sourceMappingURL=chunk-FCJI2JF7.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/components/data/gridexport/gridexport.ts"],
|
|
4
|
+
"sourcesContent": ["// Grid export as CSV or Excel (.xlsx), without a library: the columns the user sees, in their order, as shown (formats applied).\nimport { cellContent } from '../../../data/column';\nimport type { Model } from '../../../data/model';\nimport type { Grid } from '../grid/grid';\n\nexport interface ExportOptions {\n format?: 'csv' | 'xlsx';\n /** File name without extension. Default `export`. */\n filename?: string;\n /** `all` (default): every record that matches the sort and filters, across pages (a remote store is read through its proxy). `page`: what the grid shows now. */\n scope?: 'all' | 'page';\n /** Page size for reading a remote store. Default 500. */\n pageSize?: number;\n /** `false` only builds the file and returns it. Default true: the browser downloads it. */\n download?: boolean;\n}\n\nconst MIME = { csv: 'text/csv;charset=utf-8', xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' };\nconst enc = new TextEncoder();\n\nconst textOf = (v: string | Node) => (typeof v === 'string' ? v : (v.textContent ?? ''));\nconst csvCell = (s: string) => (/[\",\\n\\r;]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s);\n// a cell starting with = + - @ would run as a formula in a spreadsheet\nconst safe = (s: string) => (/^[=+@]/.test(s) || /^-[^\\d.,]/.test(s) ? `'${s}` : s);\n\nfunction table(grid: Grid, recs: Model[]): { head: string[]; rows: Array<Array<string | number>> } {\n const cols = grid.getColumns();\n return {\n head: cols.map((c) => c.header ?? c.field),\n rows: recs.map((r) =>\n cols.map((c) => {\n const raw = r.data[c.field];\n // a number nobody formatted stays a number in Excel\n return typeof raw === 'number' && !c.format && !c.renderer ? raw : safe(textOf(cellContent(c, r)));\n }),\n ),\n };\n}\n\nconst crc = (() => {\n const t = Array.from({ length: 256 }, (_, n) => {\n for (let k = 0; k < 8; k++) n = n & 1 ? 0xedb88320 ^ (n >>> 1) : n >>> 1;\n return n >>> 0;\n });\n return (b: Uint8Array) => {\n let c = ~0;\n for (const x of b) c = t[(c ^ x) & 255] ^ (c >>> 8);\n return ~c >>> 0;\n };\n})();\n\n/** A zip with the files stored uncompressed: all an .xlsx needs. */\nfunction zip(files: Record<string, string>): Uint8Array {\n const parts: Uint8Array[] = [];\n const central: Uint8Array[] = [];\n let offset = 0;\n const u32 = (v: DataView, o: number, n: number) => v.setUint32(o, n, true);\n for (const [name, text] of Object.entries(files)) {\n const nameB = enc.encode(name);\n const data = enc.encode(text);\n const head = new Uint8Array(30 + nameB.length);\n const v = new DataView(head.buffer);\n u32(v, 0, 0x04034b50);\n v.setUint16(4, 20, true);\n v.setUint16(6, 0x800, true); // UTF-8 names\n u32(v, 14, crc(data));\n u32(v, 18, data.length);\n u32(v, 22, data.length);\n v.setUint16(26, nameB.length, true);\n head.set(nameB, 30);\n const entry = new Uint8Array(46 + nameB.length);\n const e = new DataView(entry.buffer);\n u32(e, 0, 0x02014b50);\n e.setUint16(4, 20, true);\n e.setUint16(6, 20, true);\n e.setUint16(8, 0x800, true);\n u32(e, 16, crc(data));\n u32(e, 20, data.length);\n u32(e, 24, data.length);\n e.setUint16(28, nameB.length, true);\n u32(e, 42, offset);\n entry.set(nameB, 46);\n central.push(entry);\n parts.push(head, data);\n offset += head.length + data.length;\n }\n const size = central.reduce((n, c) => n + c.length, 0);\n const end = new Uint8Array(22);\n const v = new DataView(end.buffer);\n u32(v, 0, 0x06054b50);\n v.setUint16(8, central.length, true);\n v.setUint16(10, central.length, true);\n u32(v, 12, size);\n u32(v, 16, offset);\n const all = new Uint8Array(offset + size + 22);\n let at = 0;\n for (const p of [...parts, ...central, end]) (all.set(p, at), (at += p.length));\n return all;\n}\n\nconst xml = (s: string) => s.replace(/[&<>\"]/g, (c) => `&#${c.charCodeAt(0)};`).replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]/g, '');\nconst ref = (col: number, row: number) => {\n let s = '';\n for (let n = col + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s;\n return s + (row + 1);\n};\n\nfunction xlsx(head: string[], rows: Array<Array<string | number>>): Blob {\n const cell = (v: string | number, c: number, r: number, bold = false) =>\n typeof v === 'number' ? `<c r=\"${ref(c, r)}\"><v>${v}</v></c>` : `<c r=\"${ref(c, r)}\" t=\"inlineStr\"${bold ? ' s=\"1\"' : ''}><is><t xml:space=\"preserve\">${xml(v)}</t></is></c>`;\n const lines = [head, ...rows].map((row, r) => `<row r=\"${r + 1}\">${row.map((v, c) => cell(v, c, r, r === 0)).join('')}</row>`);\n const files = {\n '[Content_Types].xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/><Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/><Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/></Types>',\n '_rels/.rels': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/></Relationships>',\n 'xl/workbook.xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><sheets><sheet name=\"Sheet1\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>',\n 'xl/_rels/workbook.xml.rels': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/></Relationships>',\n 'xl/styles.xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><fonts count=\"2\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font><font><b/><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts><fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills><borders count=\"1\"><border/></borders><cellStyleXfs count=\"1\"><xf/></cellStyleXfs><cellXfs count=\"2\"><xf/><xf fontId=\"1\" applyFont=\"1\"/></cellXfs></styleSheet>',\n 'xl/worksheets/sheet1.xml': `<?xml version=\"1.0\" encoding=\"UTF-8\"?><worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><sheetData>${lines.join('')}</sheetData></worksheet>`,\n };\n return new Blob([zip(files) as BlobPart], { type: MIME.xlsx });\n}\n\n/**\n * Exports a grid: the visible columns in their current order, values as shown (money, dates...), the current sort and filters.\n * Resolves with the file; downloads it unless `download: false`.\n */\nexport async function exportGrid(grid: Grid, o: ExportOptions = {}): Promise<Blob> {\n const { format = 'csv', filename = 'export', scope = 'all', download = true } = o;\n const store = grid.getStore();\n const recs = scope === 'page' ? store.getRange() : await store.fetchAll(o.pageSize);\n const { head, rows } = table(grid, recs);\n const blob =\n format === 'xlsx'\n ? xlsx(head, rows)\n : // the BOM makes Excel read UTF-8\n new Blob(['\uFEFF' + [head, ...rows].map((r) => r.map((v) => csvCell(String(v))).join(',')).join('\\r\\n')], { type: MIME.csv });\n if (download) {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${filename}.${format}`;\n document.body.append(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n }\n return blob;\n}\n\nexport interface PrintOptions {\n /** A heading above the table. */\n title?: string;\n /** `all` (default) prints every record that matches the filters, which the virtual list on screen does not render. */\n scope?: 'all' | 'page';\n pageSize?: number;\n}\n\n/**\n * Prints a grid as a plain table: every row, the visible columns, the header repeated on each page, and none of the\n * application around it. Resolves after the print dialog closed.\n */\nexport async function printGrid(grid: Grid, o: PrintOptions = {}): Promise<void> {\n const store = grid.getStore();\n const recs = o.scope === 'page' ? store.getRange() : await store.fetchAll(o.pageSize);\n const { head, rows } = table(grid, recs);\n const sheet = document.createElement('div');\n sheet.className = 'op-print-sheet';\n const cell = (tag: 'th' | 'td', v: string | number) => Object.assign(document.createElement(tag), { textContent: String(v) });\n const tr = (tag: 'th' | 'td', cells: Array<string | number>) => {\n const row = document.createElement('tr');\n row.append(...cells.map((v) => cell(tag, v)));\n return row;\n };\n const el = document.createElement('table');\n const thead = document.createElement('thead');\n thead.append(tr('th', head));\n const tbody = document.createElement('tbody');\n tbody.append(...rows.map((r) => tr('td', r)));\n el.append(thead, tbody);\n if (o.title) sheet.append(Object.assign(document.createElement('h1'), { textContent: o.title }));\n sheet.append(el);\n document.body.append(sheet);\n document.documentElement.classList.add('op-printing');\n await new Promise<void>((done) => {\n const finish = () => {\n window.removeEventListener('afterprint', finish);\n sheet.remove();\n document.documentElement.classList.remove('op-printing');\n done();\n };\n window.addEventListener('afterprint', finish);\n window.print();\n // some browsers return from print() without the event\n if (typeof matchMedia !== 'function') setTimeout(finish, 0);\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["MIME", "enc", "textOf", "v", "csvCell", "s", "safe", "table", "grid", "recs", "cols", "c", "r", "raw", "cellContent", "crc", "_", "n", "k", "b", "x", "zip", "files", "parts", "central", "offset", "u32", "o", "name", "text", "nameB", "data", "head", "entry", "e", "size", "end", "all", "at", "xml", "ref", "col", "row", "xlsx", "rows", "cell", "bold", "exportGrid", "format", "filename", "scope", "download", "store", "blob", "a", "printGrid", "sheet", "tag", "tr", "cells", "el", "thead", "tbody", "done", "finish"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as u}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as u}from"./chunk-MNSDGJKA.js";import{c as p}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as d}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as m,f as h}from"./chunk-S4QD5NID.js";m("en",{breadcrumb:"Breadcrumb",breadcrumbMore:"Show more"});m("pt-BR",{breadcrumb:"Trilha de navega\xE7\xE3o",breadcrumbMore:"Mostrar mais"});var c=class extends d{baseCls="op-breadcrumb";tag="nav";list;menu;onRender(){this.list=i("ol","op-breadcrumb__list"),this.el.append(this.list),this.config.ariaLabel||this.el.setAttribute("aria-label",h("breadcrumb")),this.config.separator!=null&&this.setSeparator(this.config.separator),this.listen(this.list,"click",e=>{let r=e.target;if(r.closest(".op-breadcrumb__more"))return this.showHidden(r.closest("button"));let t=r.closest("[data-i]");t&&this.go(Number(t.dataset.i),e)}),this.own(()=>this.menu?.destroy()),this.paint()}items(){return this.config.items??[]}collapsed(){let e=this.items().length,r=Math.max(3,this.config.maxItems??4);return e<=r?[]:Array.from({length:e-(r-1)},(t,s)=>s+1)}paint(){let e=this.items(),r=this.collapsed(),t=e.length-1,s=[];e.forEach((a,n)=>{if(r.includes(n)){n===r[0]&&s.push(i("li","",{},i("button","op-breadcrumb__more",{type:"button","aria-label":h("breadcrumbMore"),"aria-haspopup":"menu","aria-expanded":"false"},"\u2026")));return}let o=[a.icon?p(a.icon):null,a.text],b=n===t?i("span","op-breadcrumb__current",{"aria-current":"page"},...o):a.href?i("a","op-breadcrumb__item",{href:a.href,"data-i":n},...o):i("button","op-breadcrumb__item",{type:"button","data-i":n},...o);s.push(i("li","",{},b))}),this.list.replaceChildren(...s)}go(e,r){let t=this.items()[e];return!t||e===this.items().length-1?!1:this.emit("before-navigate",t,e)===!1?(r?.preventDefault(),!1):(t.handler?.(t),this.emit("navigate",t,e),!0)}showHidden(e){let r=this.items();this.menu??=new u({}),this.menu.setItems(this.collapsed().map(t=>({text:r[t].text,icon:r[t].icon,handler:()=>{this.go(t)&&r[t].href&&(location.href=r[t].href)}}))),this.menu.on("show",()=>e.setAttribute("aria-expanded","true")),this.menu.on("hide",()=>e.setAttribute("aria-expanded","false")),this.menu.showBy(e)}setItems(e){this.config.items=e,this.rendered&&this.paint()}setMaxItems(e){this.config.maxItems=e,this.rendered&&this.paint()}setSeparator(e){this.config.separator=e,this.rendered&&this.el.style.setProperty("--op-breadcrumb-separator",JSON.stringify(e))}};l("breadcrumb",c);export{c as a};
|
|
2
|
+
//# sourceMappingURL=chunk-FPU53CCV.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as o}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as o}from"./chunk-HLS5FI55.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as a,f as n}from"./chunk-S4QD5NID.js";a("en",{faSave:"Save",faDirty:"Unsaved changes"});a("pt-BR",{faSave:"Salvar",faDirty:"Altera\xE7\xF5es n\xE3o salvas"});var r=class extends l{baseCls="op-formactions";statusEl;buttonsEl;form;save;cancel;extra=[];build(){return this.statusEl=i("span","op-formactions__status",{"aria-live":"polite"}),this.buttonsEl=i("div","op-formactions__buttons"),i("div","op-formactions",{},this.statusEl,this.buttonsEl)}onRender(){let t=this.config,e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;this.form=e,this.extra=(t.buttons??[]).map(s=>new o(s)),this.save=new o({text:t.submitText??n("faSave"),variant:"primary",htmlType:"submit"}),this.buttonsEl.append(...this.extra.map(s=>s.el),this.save.el),this.setCancelText(t.cancelText??n("cancel")),this.setSticky(!!t.sticky),this.form?.on("dirty-change",()=>this.paint()),this.own(()=>[...this.extra,this.save,this.cancel].forEach(s=>s?.destroy())),this.paint()}paint(){let t=!!this.form?.isDirty();this.el.classList.toggle("is-dirty",t),this.statusEl.textContent=t&&this.config.status!==!1?n("faDirty"):"",this.save.setDisabled(!!this.config.requireChanges&&!t)}getForm(){return this.form}setSubmitText(t){this.config.submitText=t,this.save?.setText(t)}setCancelText(t){if(this.config.cancelText=t,!!this.rendered){if(t===!1)return this.cancel?.destroy(),void(this.cancel=void 0);if(this.cancel)return this.cancel.setText(t);this.cancel=new o({text:t,handler:()=>this.emit("cancel")!==!1&&this.form?.reset()}),this.buttonsEl.insertBefore(this.cancel.el,this.save.el)}}setSticky(t){this.config.sticky=t,this.rendered&&this.el.classList.toggle("is-sticky",t)}};c("formactions",r);export{r as a};
|
|
2
|
+
//# sourceMappingURL=chunk-GEBAYD6N.js.map
|