optikos 0.3.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.
Files changed (432) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  5. package/dist/chunk-2HNQ2XRY.js +2 -0
  6. package/dist/chunk-2HNQ2XRY.js.map +7 -0
  7. package/dist/chunk-2QMI2RRB.js +2 -0
  8. package/dist/chunk-2QMI2RRB.js.map +7 -0
  9. package/dist/{chunk-W3H7GTJY.js → chunk-2YRQULDC.js} +2 -2
  10. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  11. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  12. package/dist/chunk-3FCIZKIN.js +2 -0
  13. package/dist/chunk-3FCIZKIN.js.map +7 -0
  14. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  15. package/dist/chunk-3QRA3XOA.js +2 -0
  16. package/dist/chunk-3QRA3XOA.js.map +7 -0
  17. package/dist/chunk-3TCITFUU.js +2 -0
  18. package/dist/chunk-3TCITFUU.js.map +7 -0
  19. package/dist/chunk-3VDLX7ET.js +2 -0
  20. package/dist/chunk-3VDLX7ET.js.map +7 -0
  21. package/dist/{chunk-3TAW4AKH.js → chunk-4AZ44KV4.js} +2 -2
  22. package/dist/{chunk-TZOQWCVH.js → chunk-4CWYF4O7.js} +2 -2
  23. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  24. package/dist/{chunk-2YZB6XQR.js → chunk-4S3HRFQB.js} +2 -2
  25. package/dist/chunk-5BMG5ZBY.js +2 -0
  26. package/dist/{chunk-KLLAY2IM.js.map → chunk-5BMG5ZBY.js.map} +2 -2
  27. package/dist/chunk-5PWPAN62.js +2 -0
  28. package/dist/chunk-5PWPAN62.js.map +7 -0
  29. package/dist/chunk-5PYJ6FJK.js +2 -0
  30. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  31. package/dist/{chunk-OGRFQTXA.js → chunk-643FOYQB.js} +2 -2
  32. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  33. package/dist/chunk-6LJK4QWF.js +2 -0
  34. package/dist/chunk-6LJK4QWF.js.map +7 -0
  35. package/dist/{chunk-JK74QK3M.js → chunk-6PZPBPAD.js} +2 -2
  36. package/dist/chunk-7Y2GHQRB.js +2 -0
  37. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  38. package/dist/{chunk-M242VYZA.js → chunk-AT7VFZRB.js} +2 -2
  39. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  40. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  41. package/dist/chunk-BJWREA76.js +2 -0
  42. package/dist/chunk-BJWREA76.js.map +7 -0
  43. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  44. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  45. package/dist/{chunk-FEHGU6EP.js → chunk-C3MWS7P2.js} +2 -2
  46. package/dist/{chunk-G2KUK6AT.js → chunk-CFGCB37K.js} +2 -2
  47. package/dist/{chunk-JI265XFO.js → chunk-CMV3F6HR.js} +2 -2
  48. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  49. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  50. package/dist/chunk-DJUSVBD5.js +2 -0
  51. package/dist/chunk-DJUSVBD5.js.map +7 -0
  52. package/dist/{chunk-HXDTGP2K.js → chunk-DWA45BWR.js} +2 -2
  53. package/dist/chunk-DWTDNKXX.js +2 -0
  54. package/dist/chunk-DWTDNKXX.js.map +7 -0
  55. package/dist/chunk-ESCLDVFS.js +2 -0
  56. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  57. package/dist/chunk-EXIADWI7.js +2 -0
  58. package/dist/chunk-EXIADWI7.js.map +7 -0
  59. package/dist/{chunk-5QUY72FX.js → chunk-F4HZUAKM.js} +2 -2
  60. package/dist/chunk-FCJI2JF7.js +3 -0
  61. package/dist/chunk-FCJI2JF7.js.map +7 -0
  62. package/dist/{chunk-Q26YZYTD.js → chunk-FPU53CCV.js} +2 -2
  63. package/dist/{chunk-3S24ZRPK.js → chunk-GEBAYD6N.js} +2 -2
  64. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  65. package/dist/chunk-GFFZTFQH.js +2 -0
  66. package/dist/chunk-GFFZTFQH.js.map +7 -0
  67. package/dist/chunk-GFJRGBQR.js +2 -0
  68. package/dist/chunk-GFJRGBQR.js.map +7 -0
  69. package/dist/chunk-GZIDE5K2.js +2 -0
  70. package/dist/chunk-GZIDE5K2.js.map +7 -0
  71. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  72. package/dist/chunk-HG7OOHGD.js +2 -0
  73. package/dist/chunk-HG7OOHGD.js.map +7 -0
  74. package/dist/{chunk-2ZUZ5HDL.js → chunk-HLS5FI55.js} +2 -2
  75. package/dist/chunk-HRW25TMU.js +2 -0
  76. package/dist/chunk-HX6TWXTX.js +2 -0
  77. package/dist/chunk-HX6TWXTX.js.map +7 -0
  78. package/dist/chunk-I5A74NMJ.js +2 -0
  79. package/dist/chunk-I5A74NMJ.js.map +7 -0
  80. package/dist/chunk-IUOEPAWG.js +2 -0
  81. package/dist/chunk-IUOEPAWG.js.map +7 -0
  82. package/dist/{chunk-IHE2MQ3W.js → chunk-J5QPFJ7M.js} +2 -2
  83. package/dist/chunk-JE56CJX2.js +2 -0
  84. package/dist/chunk-JE56CJX2.js.map +7 -0
  85. package/dist/chunk-JJLOUMCJ.js +2 -0
  86. package/dist/chunk-JJLOUMCJ.js.map +7 -0
  87. package/dist/chunk-JLKIHXZP.js +3 -0
  88. package/dist/chunk-JLKIHXZP.js.map +7 -0
  89. package/dist/{chunk-5BC72727.js → chunk-JSEI44A7.js} +2 -2
  90. package/dist/chunk-L5SQQFO7.js +2 -0
  91. package/dist/chunk-L5SQQFO7.js.map +7 -0
  92. package/dist/chunk-M2ZRKHE4.js +2 -0
  93. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  94. package/dist/chunk-M7FNPRV4.js +2 -0
  95. package/dist/chunk-M7FNPRV4.js.map +7 -0
  96. package/dist/chunk-MNSDGJKA.js +3 -0
  97. package/dist/chunk-MNSDGJKA.js.map +7 -0
  98. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  99. package/dist/chunk-N2LS4JD6.js +2 -0
  100. package/dist/chunk-N2LS4JD6.js.map +7 -0
  101. package/dist/chunk-NJ5IFOPR.js +4 -0
  102. package/dist/{chunk-XX2MVWFS.js.map → chunk-NJ5IFOPR.js.map} +1 -1
  103. package/dist/{chunk-NXSTUFS7.js → chunk-NNR2FNHG.js} +2 -2
  104. package/dist/chunk-NQV4THNE.js +2 -0
  105. package/dist/{chunk-UXXJOU5J.js.map → chunk-NQV4THNE.js.map} +1 -1
  106. package/dist/{chunk-XHOBNSBO.js → chunk-P4O57S6N.js} +2 -2
  107. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  108. package/dist/chunk-PMOXLQ72.js +2 -0
  109. package/dist/chunk-PMOXLQ72.js.map +7 -0
  110. package/dist/chunk-Q6FY4L2F.js +2 -0
  111. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  112. package/dist/chunk-R32HPK7R.js +2 -0
  113. package/dist/chunk-R32HPK7R.js.map +7 -0
  114. package/dist/{chunk-Z2JBUHKA.js → chunk-RG6SHPHF.js} +2 -2
  115. package/dist/{chunk-EDUMAMK4.js → chunk-S2CMWKVB.js} +2 -2
  116. package/dist/chunk-S4QD5NID.js +2 -0
  117. package/dist/chunk-S4QD5NID.js.map +7 -0
  118. package/dist/chunk-SB4ICXBV.js +2 -0
  119. package/dist/chunk-SB4ICXBV.js.map +7 -0
  120. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  121. package/dist/chunk-SWCB2GMN.js +2 -0
  122. package/dist/chunk-SWCB2GMN.js.map +7 -0
  123. package/dist/chunk-TQPQ4UEA.js +2 -0
  124. package/dist/chunk-TQPQ4UEA.js.map +7 -0
  125. package/dist/{chunk-Z2Z52GFT.js → chunk-U5L76VVB.js} +2 -2
  126. package/dist/chunk-UDXO3KM3.js +2 -0
  127. package/dist/chunk-UDXO3KM3.js.map +7 -0
  128. package/dist/{chunk-LQRFNQ2N.js → chunk-UQRQH2JW.js} +2 -2
  129. package/dist/chunk-V5G5JECN.js +2 -0
  130. package/dist/chunk-V5G5JECN.js.map +7 -0
  131. package/dist/{chunk-JBLRAM7Z.js → chunk-XFIREDWO.js} +2 -2
  132. package/dist/chunk-XQHATUKN.js +2 -0
  133. package/dist/{chunk-LW2WRUVL.js.map → chunk-XQHATUKN.js.map} +4 -4
  134. package/dist/chunk-XR677UYD.js +2 -0
  135. package/dist/chunk-XR677UYD.js.map +7 -0
  136. package/dist/{chunk-RNN55473.js → chunk-YDX2PCVL.js} +2 -2
  137. package/dist/{chunk-RNN55473.js.map → chunk-YDX2PCVL.js.map} +1 -1
  138. package/dist/chunk-YJTUFK4P.js +2 -0
  139. package/dist/chunk-YLFSCQL3.js +2 -0
  140. package/dist/chunk-YLFSCQL3.js.map +7 -0
  141. package/dist/chunk-YXOKWCYS.js +2 -0
  142. package/dist/chunk-YXOKWCYS.js.map +7 -0
  143. package/dist/{chunk-I4SP6JTU.js → chunk-Z6L55FTN.js} +2 -2
  144. package/dist/{chunk-6VBK2I5B.js → chunk-ZSPJZ3ZH.js} +2 -2
  145. package/dist/components/avatar.js +2 -0
  146. package/dist/components/avatar.js.map +7 -0
  147. package/dist/components/badge.js +1 -1
  148. package/dist/components/breadcrumb.js +1 -1
  149. package/dist/components/button.js +1 -1
  150. package/dist/components/calendar.js +1 -1
  151. package/dist/components/carousel.js +2 -0
  152. package/dist/components/carousel.js.map +7 -0
  153. package/dist/components/cellediting.js +1 -1
  154. package/dist/components/chart.js +2 -0
  155. package/dist/components/chart.js.map +7 -0
  156. package/dist/components/chat.js +1 -1
  157. package/dist/components/checkbox.js +1 -1
  158. package/dist/components/checkboxgroup.js +1 -1
  159. package/dist/components/chip.js +1 -1
  160. package/dist/components/codeviewer.js +1 -1
  161. package/dist/components/combobox.js +1 -1
  162. package/dist/components/commandpalette.js +1 -1
  163. package/dist/components/container.js +1 -1
  164. package/dist/components/dataview.js +1 -1
  165. package/dist/components/datefield.js +1 -1
  166. package/dist/components/daterangefield.js +1 -1
  167. package/dist/components/datetimefield.js +2 -0
  168. package/dist/components/datetimefield.js.map +7 -0
  169. package/dist/components/dial.js +1 -1
  170. package/dist/components/dropdown.js +1 -1
  171. package/dist/components/fieldgroup.js +1 -1
  172. package/dist/components/fieldlist.js +1 -1
  173. package/dist/components/fieldset.js +1 -1
  174. package/dist/components/filterbuilder.js +1 -1
  175. package/dist/components/form.js +1 -1
  176. package/dist/components/formactions.js +1 -1
  177. package/dist/components/formerrors.js +1 -1
  178. package/dist/components/formsection.js +1 -1
  179. package/dist/components/grid.js +1 -1
  180. package/dist/components/gridexport.js +2 -0
  181. package/dist/components/gridexport.js.map +7 -0
  182. package/dist/components/gridstate.js +2 -0
  183. package/dist/components/gridstate.js.map +7 -0
  184. package/dist/components/grouping.js +2 -0
  185. package/dist/components/grouping.js.map +7 -0
  186. package/dist/components/icon.js +1 -1
  187. package/dist/components/image.js +2 -0
  188. package/dist/components/image.js.map +7 -0
  189. package/dist/components/imagecanvas.js +2 -0
  190. package/dist/components/imagecanvas.js.map +7 -0
  191. package/dist/components/imagefield.js +2 -0
  192. package/dist/components/imagefield.js.map +7 -0
  193. package/dist/components/inputgroup.js +1 -1
  194. package/dist/components/label.js +1 -1
  195. package/dist/components/listbox.js +1 -1
  196. package/dist/components/lookupfield.js +1 -1
  197. package/dist/components/maskfield.js +2 -0
  198. package/dist/components/maskfield.js.map +7 -0
  199. package/dist/components/menu.js +1 -1
  200. package/dist/components/messagebox.js +1 -1
  201. package/dist/components/navmenu.js +1 -1
  202. package/dist/components/numberfield.js +1 -1
  203. package/dist/components/pagination.js +1 -1
  204. package/dist/components/panel.js +1 -1
  205. package/dist/components/pickerfield.js +1 -1
  206. package/dist/components/radiogroup.js +1 -1
  207. package/dist/components/rowediting.js +2 -0
  208. package/dist/components/rowediting.js.map +7 -0
  209. package/dist/components/searchgrid.js +1 -1
  210. package/dist/components/secretfield.js +1 -1
  211. package/dist/components/select.js +1 -1
  212. package/dist/components/shortcuts.js +2 -0
  213. package/dist/components/shortcuts.js.map +7 -0
  214. package/dist/components/slider.js +1 -1
  215. package/dist/components/spacer.js +1 -1
  216. package/dist/components/spinner.js +1 -1
  217. package/dist/components/stat.js +2 -0
  218. package/dist/components/stat.js.map +7 -0
  219. package/dist/components/stepform.js +1 -1
  220. package/dist/components/stepper.js +1 -1
  221. package/dist/components/suggestfield.js +1 -1
  222. package/dist/components/table.js +1 -1
  223. package/dist/components/tabs.js +1 -1
  224. package/dist/components/textarea.js +1 -1
  225. package/dist/components/textfield.js +1 -1
  226. package/dist/components/timefield.js +2 -0
  227. package/dist/components/timefield.js.map +7 -0
  228. package/dist/components/timeline.js +2 -0
  229. package/dist/components/timeline.js.map +7 -0
  230. package/dist/components/toast.js +1 -1
  231. package/dist/components/toggle.js +1 -1
  232. package/dist/components/toolbar.js +1 -1
  233. package/dist/components/tree.js +1 -1
  234. package/dist/components/treegrid.js +2 -0
  235. package/dist/components/treegrid.js.map +7 -0
  236. package/dist/components/viewmanager.js +1 -1
  237. package/dist/components/viewport.js +1 -1
  238. package/dist/components/widget.js +1 -1
  239. package/dist/components/window.js +1 -1
  240. package/dist/core.js +1 -1
  241. package/dist/css/avatar.css +68 -0
  242. package/dist/css/base.css +9 -0
  243. package/dist/css/carousel.css +119 -0
  244. package/dist/css/chart.css +168 -0
  245. package/dist/css/core.css +36 -0
  246. package/dist/css/datetimefield.css +15 -0
  247. package/dist/css/grid.css +40 -0
  248. package/dist/css/gridexport.css +35 -0
  249. package/dist/css/grouping.css +49 -0
  250. package/dist/css/image.css +46 -0
  251. package/dist/css/imagecanvas.css +75 -0
  252. package/dist/css/imagefield.css +103 -0
  253. package/dist/css/rowediting.css +39 -0
  254. package/dist/css/shortcuts.css +34 -0
  255. package/dist/css/stat.css +64 -0
  256. package/dist/css/stepform.css +1 -0
  257. package/dist/css/timeline.css +140 -0
  258. package/dist/css/treegrid.css +35 -0
  259. package/dist/css/window.css +2 -2
  260. package/dist/data.js +1 -1
  261. package/dist/dev.js +2 -0
  262. package/dist/dev.js.map +7 -0
  263. package/dist/index.js +16 -5
  264. package/dist/index.js.map +4 -4
  265. package/dist/optikos.css +1111 -21
  266. package/dist/testing.js +2 -0
  267. package/dist/testing.js.map +7 -0
  268. package/dist/themes/dark.css +7 -0
  269. package/dist/types/bind/index.d.ts +1 -1
  270. package/dist/types/bind/viewmodel.d.ts +33 -0
  271. package/dist/types/components/avatar.d.ts +1 -0
  272. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  273. package/dist/types/components/base/image/image.d.ts +25 -0
  274. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  275. package/dist/types/components/carousel.d.ts +1 -0
  276. package/dist/types/components/chart.d.ts +1 -0
  277. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  278. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  279. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  280. package/dist/types/components/data/grid/grid.d.ts +37 -0
  281. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  282. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  283. package/dist/types/components/data/grouping/grouping.d.ts +31 -0
  284. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  285. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  286. package/dist/types/components/data/timeline/timeline.d.ts +60 -0
  287. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  288. package/dist/types/components/datetimefield.d.ts +1 -0
  289. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  290. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  291. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  292. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  293. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  294. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  295. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  296. package/dist/types/components/form/form/form.d.ts +5 -0
  297. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  298. package/dist/types/components/gridexport.d.ts +1 -0
  299. package/dist/types/components/gridstate.d.ts +1 -0
  300. package/dist/types/components/grouping.d.ts +1 -0
  301. package/dist/types/components/image.d.ts +1 -0
  302. package/dist/types/components/imagecanvas.d.ts +1 -0
  303. package/dist/types/components/imagefield.d.ts +1 -0
  304. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  305. package/dist/types/components/maskfield.d.ts +1 -0
  306. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  307. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  308. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  309. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  310. package/dist/types/components/overlays/window/window.d.ts +14 -1
  311. package/dist/types/components/rowediting.d.ts +1 -0
  312. package/dist/types/components/shortcuts.d.ts +1 -0
  313. package/dist/types/components/stat.d.ts +1 -0
  314. package/dist/types/components/timefield.d.ts +1 -0
  315. package/dist/types/components/timeline.d.ts +1 -0
  316. package/dist/types/components/treegrid.d.ts +1 -0
  317. package/dist/types/core/component.d.ts +7 -0
  318. package/dist/types/core/container.d.ts +10 -1
  319. package/dist/types/core/dev.d.ts +2 -0
  320. package/dist/types/core/field.d.ts +4 -0
  321. package/dist/types/core/i18n.d.ts +2 -0
  322. package/dist/types/core/index.d.ts +4 -1
  323. package/dist/types/core/path.d.ts +2 -0
  324. package/dist/types/core/permission.d.ts +11 -0
  325. package/dist/types/core/state.d.ts +9 -0
  326. package/dist/types/data/column.d.ts +8 -0
  327. package/dist/types/data/index.d.ts +1 -1
  328. package/dist/types/data/model.d.ts +2 -0
  329. package/dist/types/data/store.d.ts +21 -0
  330. package/dist/types/dev/index.d.ts +2 -0
  331. package/dist/types/dev/keys.d.ts +1 -0
  332. package/dist/types/index.d.ts +17 -0
  333. package/dist/types/testing/index.d.ts +25 -0
  334. package/dist/types/themes/color.d.ts +14 -0
  335. package/dist/types/themes/contrast.d.ts +15 -0
  336. package/dist/types/themes/define.d.ts +25 -3
  337. package/dist/types/themes/index.d.ts +3 -1
  338. package/dist/types/themes/seeds.d.ts +11 -0
  339. package/dist/types/ui/ui.d.ts +6 -0
  340. package/dist/ui.js +1 -1
  341. package/package.json +9 -1
  342. package/dist/chunk-2ZRNGG2N.js +0 -2
  343. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  344. package/dist/chunk-4EQEHJB3.js +0 -2
  345. package/dist/chunk-4EQEHJB3.js.map +0 -7
  346. package/dist/chunk-4LZZ244E.js +0 -2
  347. package/dist/chunk-4LZZ244E.js.map +0 -7
  348. package/dist/chunk-4SYIIX5A.js +0 -2
  349. package/dist/chunk-4SYIIX5A.js.map +0 -7
  350. package/dist/chunk-7KMIFXHZ.js +0 -2
  351. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  352. package/dist/chunk-A2NKDOYN.js +0 -2
  353. package/dist/chunk-A2NKDOYN.js.map +0 -7
  354. package/dist/chunk-CKXS375P.js +0 -2
  355. package/dist/chunk-CKXS375P.js.map +0 -7
  356. package/dist/chunk-EJGWCKE4.js +0 -2
  357. package/dist/chunk-EJGWCKE4.js.map +0 -7
  358. package/dist/chunk-ELYARUCN.js +0 -2
  359. package/dist/chunk-EV73ADN2.js +0 -2
  360. package/dist/chunk-EV73ADN2.js.map +0 -7
  361. package/dist/chunk-GD5JGKM7.js +0 -2
  362. package/dist/chunk-GD5JGKM7.js.map +0 -7
  363. package/dist/chunk-GZ7X34QP.js +0 -2
  364. package/dist/chunk-KCEUD232.js +0 -2
  365. package/dist/chunk-KCEUD232.js.map +0 -7
  366. package/dist/chunk-KLLAY2IM.js +0 -2
  367. package/dist/chunk-LBJSMXLV.js +0 -2
  368. package/dist/chunk-LBJSMXLV.js.map +0 -7
  369. package/dist/chunk-LW2WRUVL.js +0 -2
  370. package/dist/chunk-MW3RWBZ7.js +0 -2
  371. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  372. package/dist/chunk-OEAXCCVM.js +0 -2
  373. package/dist/chunk-OEAXCCVM.js.map +0 -7
  374. package/dist/chunk-UB5RYS7T.js +0 -2
  375. package/dist/chunk-UB5RYS7T.js.map +0 -7
  376. package/dist/chunk-UXXJOU5J.js +0 -2
  377. package/dist/chunk-VU3GIDZ3.js +0 -2
  378. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  379. package/dist/chunk-W2BAFOCN.js +0 -3
  380. package/dist/chunk-W2BAFOCN.js.map +0 -7
  381. package/dist/chunk-WFGTQZIQ.js +0 -2
  382. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  383. package/dist/chunk-XX2MVWFS.js +0 -4
  384. package/dist/chunk-XYZ6VZ5T.js +0 -2
  385. package/dist/chunk-YBAYEU25.js +0 -2
  386. package/dist/chunk-YF75HKL6.js +0 -2
  387. package/dist/chunk-YF75HKL6.js.map +0 -7
  388. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  389. /package/dist/{chunk-W3H7GTJY.js.map → chunk-2YRQULDC.js.map} +0 -0
  390. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  391. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  392. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  393. /package/dist/{chunk-3TAW4AKH.js.map → chunk-4AZ44KV4.js.map} +0 -0
  394. /package/dist/{chunk-TZOQWCVH.js.map → chunk-4CWYF4O7.js.map} +0 -0
  395. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  396. /package/dist/{chunk-2YZB6XQR.js.map → chunk-4S3HRFQB.js.map} +0 -0
  397. /package/dist/{chunk-OGRFQTXA.js.map → chunk-643FOYQB.js.map} +0 -0
  398. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  399. /package/dist/{chunk-JK74QK3M.js.map → chunk-6PZPBPAD.js.map} +0 -0
  400. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  401. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  402. /package/dist/{chunk-M242VYZA.js.map → chunk-AT7VFZRB.js.map} +0 -0
  403. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  404. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  405. /package/dist/{chunk-FEHGU6EP.js.map → chunk-C3MWS7P2.js.map} +0 -0
  406. /package/dist/{chunk-G2KUK6AT.js.map → chunk-CFGCB37K.js.map} +0 -0
  407. /package/dist/{chunk-JI265XFO.js.map → chunk-CMV3F6HR.js.map} +0 -0
  408. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  409. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  410. /package/dist/{chunk-HXDTGP2K.js.map → chunk-DWA45BWR.js.map} +0 -0
  411. /package/dist/{chunk-5QUY72FX.js.map → chunk-F4HZUAKM.js.map} +0 -0
  412. /package/dist/{chunk-Q26YZYTD.js.map → chunk-FPU53CCV.js.map} +0 -0
  413. /package/dist/{chunk-3S24ZRPK.js.map → chunk-GEBAYD6N.js.map} +0 -0
  414. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  415. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  416. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-HLS5FI55.js.map} +0 -0
  417. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  418. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-J5QPFJ7M.js.map} +0 -0
  419. /package/dist/{chunk-5BC72727.js.map → chunk-JSEI44A7.js.map} +0 -0
  420. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  421. /package/dist/{chunk-NXSTUFS7.js.map → chunk-NNR2FNHG.js.map} +0 -0
  422. /package/dist/{chunk-XHOBNSBO.js.map → chunk-P4O57S6N.js.map} +0 -0
  423. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  424. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-RG6SHPHF.js.map} +0 -0
  425. /package/dist/{chunk-EDUMAMK4.js.map → chunk-S2CMWKVB.js.map} +0 -0
  426. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  427. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-U5L76VVB.js.map} +0 -0
  428. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-UQRQH2JW.js.map} +0 -0
  429. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XFIREDWO.js.map} +0 -0
  430. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  431. /package/dist/{chunk-I4SP6JTU.js.map → chunk-Z6L55FTN.js.map} +0 -0
  432. /package/dist/{chunk-6VBK2I5B.js.map → chunk-ZSPJZ3ZH.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,43 @@ and the project uses [Semantic Versioning](https://semver.org/). Until 1.0, mino
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.4.0] - 2026-11-10
9
+
10
+ ### Added
11
+
12
+ - Window token `--op-window-max-height`. The default is now `85dvh` (was the full viewport height minus a small
13
+ margin), so a long dialog keeps breathing room and scrolls inside.
14
+ - TimeField (`timefield`, `ui.time`): a time of day as `'HH:mm'`, typed (`930`) or stepped with ↑/↓, with `min`/`max`/`step`.
15
+ - `defineTheme` accepts the key `base` beside variants (`radius: { base: '8px', sm: '4px' }`).
16
+ - A lookup filter may be a field instance, not only a config.
17
+ - ImageField (`imagefield`): picks one or more images by click or drop, with previews, `accept`, `maxSize`, `maxFiles`,
18
+ a `reject` event and URLs of images already saved.
19
+ - ImageCanvas (`imagecanvas`): shows an image with zoom and pan (buttons, keys, Ctrl+wheel, double click, pinch).
20
+ - Carousel (`carousel`): a scroll-snap row of any components with arrows, dots, `perView`, `loop` and an autoplay that
21
+ stops on use and respects `prefers-reduced-motion`.
22
+ - Back-office set: **Chart** (bar, line, area, pie, donut, sparkline, fed by a Store), **Stat** (KPI tile), **Timeline** (event log and schedule), **Avatar**, **Image**, **MaskField**, **DateTimeField**.
23
+ - `NumberField`: `format: 'currency' | 'percent'` through `Intl`, `currency`, `locale`, and `scale` (cents as an integer); `setCurrency()`.
24
+ - Permissions: `setPermissionResolver`, `setPermissionMode` and `permission` / `permissionMode` on components, menu and NavMenu items, command palette commands, grid columns and actions.
25
+ - `form.setErrors({ 'items.0.name': '…' })` for server errors by dotted path; `displayFrom` and `setValue({ value, label })` so a lookup shows its text from the loaded record.
26
+ - Live data: `store.applyPatches()` and `store.connect(source)`; `store.fetchAll()` reads every page of a remote store.
27
+ - `exportGrid` (CSV, xlsx) and `printGrid`; print styles in the core.
28
+ - `persistState(key)` (a Grid plugin) and `setStateStorage` / `loadState` / `saveState` for per-user state.
29
+ - `shortcuts`: global and per-screen shortcuts with a help panel on `?`.
30
+ - `Window.confirmDiscard`.
31
+ - `defineTheme`: `seeds` (a light and dark theme from two colors), `fonts` (`@font-face`), `loadFonts`; `checkContrast()`; chart colors `--op-chart-1…8`.
32
+ - `optikos/dev` (warns about ignored config options) and `optikos/testing` (test helpers for apps); `TabPanelConfig` types the tab options of any container.
33
+ - Docs: the back-office recipes guide and the `panel` demo.
34
+ - Grid, Ext parity: `grouping()` (group headers, counts, totals through `Column.summary`), `treeGrid()` (a tree column over flat records with `parentId`, lazy `load`, `flattenTree`), `rowEditing()` (a whole row under a Save / Cancel bar), locked columns (`Column.locked`, `setColumnLocked`, kept in `getColumnState`) and `Grid.setRowLayout()` for plugins that add rows of their own.
35
+ - `optikos/bind`: `viewModel` (data, formulas, a linked record), `bindVM` (`'{record.name}'` bindings) and `bindForm` (a form bound to a record, both ways). New guide and `docs/internal/paridade-ext.md`.
36
+
37
+ ### Fixed
38
+
39
+ - Window stays on screen when its content grows after opening (a FieldList gaining rows, a step change): it re-centers,
40
+ or, once dragged, moves up just enough to fit. Before, it grew past the bottom of the viewport with no way to scroll.
41
+ - `new Component({ renderTo })` mounts like `create` does (it was ignored), and `config.type` is set on instances made with `new`.
42
+ - Menu items typed from a variable (`const items = [{ text: 'a' }, '-']`) no longer need a cast.
43
+ - StepForm review: a FieldList shows one line per row with what the user sees, instead of `[object Object]`.
44
+
8
45
  ## [0.3.0] - 2026-11-10
9
46
 
10
47
  ### Added
@@ -157,7 +194,8 @@ First public release.
157
194
  `corporate`, `soft`, `brutal`, `terminal`, `editorial` and `brand`.
158
195
  - Per-component entry points (`optikos/components/<name>`) and stylesheets (`optikos/css/<name>.css`).
159
196
 
160
- [Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...HEAD
197
+ [Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.4.0...HEAD
198
+ [0.4.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...v0.4.0
161
199
  [0.3.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.2.0...v0.3.0
162
200
  [0.2.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.1.0...v0.2.0
163
201
  [0.1.0]: https://github.com/Denis-Zickuhr/optikos/releases/tag/v0.1.0
package/dist/bind.js CHANGED
@@ -1,2 +1,2 @@
1
- import"./chunk-4C666HHU.js";var s;function d(t){let n=t,e=new Set,o=(()=>(s&&(e.add(s),s.deps.add(e)),n));return o.set=r=>{if(!Object.is(r,n)){n=r;for(let i of[...e])i.run()}},o.update=r=>o.set(r(n)),o}function f(t){let n,e={deps:new Set,run(){for(let r of e.deps)r.delete(e);e.deps.clear(),n?.();let o=s;s=e;try{n=t()}finally{s=o}}};return e.run(),()=>{for(let o of e.deps)o.delete(e);e.deps.clear(),n?.()}}function a(t){let n=d(void 0);return f(()=>n.set(t())),n}function p(t){let n=d(0);return t.subscribe(()=>n.update(e=>e+1)),()=>(n(),t)}function l(t,n){for(let e in n){let o=`set${e[0].toUpperCase()}${e.slice(1)}`,r=t[o];if(typeof r!="function")throw new Error(`Optikos bind: ${t.constructor.name} has no ${o}()`);let i=n[e];t.own(f(()=>{r.call(t,i())}));let c=i.set;e==="value"&&c&&t.own(t.on("change",u=>c(u)))}}export{l as bind,a as computed,f as effect,p as fromStore,d as signal};
1
+ import{a as M,b as k}from"./chunk-V5G5JECN.js";import"./chunk-4C666HHU.js";var x=e=>!!e&&typeof e.set=="function"&&"data"in e;function S(e={}){let n=structuredClone(e.data??{}),t=new Map,r=new Map,s=new Map,i=new Map,c=o=>t.get(o)??(t.set(o,l(0)),t.get(o)),u={get(o){c(o)();let d=o.split(".")[0];if(e.formulas&&d in e.formulas){let f=i.get(d);return f||i.set(d,f=b(()=>e.formulas[d](u.get))),M({[d]:f()},o)}return M(n,o)},set(o,d){let[f,...g]=o.split(".");if(e.formulas&&f in e.formulas)throw new Error(`Optikos viewModel: "${f}" is a formula and cannot be set`);let p=r.get(f);p&&g.length===1?p.set(g[0],d):k(n,o,d);for(let[y,T]of t)(y===o||y.startsWith(`${o}.`)||o.startsWith(`${y}.`))&&T.update(m=>m+1)},link(o,d){x(d)?(r.set(o,d),n[o]=d.data):(r.delete(o),n[o]=d),(s.get(o)??(s.set(o,l(0)),s.get(o))).update(f=>f+1);for(let[f,g]of t)(f===o||f.startsWith(`${o}.`))&&g.update(p=>p+1)},linked:o=>(s.get(o)??(s.set(o,l(0)),s.get(o)))()};return u}function V(e,n){let t=/^\{(!?)([\w.]+)\}$/.exec(n);return t?()=>t[1]?!e.get(t[2]):e.get(t[2]):()=>n.replace(/\{([\w.]+)\}/g,(r,s)=>String(e.get(s)??""))}function $(e,n,t){let r={};for(let i in t)r[i]=V(n,t[i]);v(e,r);let s=/^\{([\w.]+)\}$/.exec(t.value??"");s&&e.own(e.on("change",i=>n.set(s[1],i)))}function C(e,n,t="record"){for(let r of e.getFields()){if(!r.name)continue;let s=-1,i=`${t}.${r.name}`;e.own(w(()=>{let c=n.linked(t),u=n.get(i);r.setValue(u===void 0?r.getValue():u,!0),c!==s&&(r.markClean(),s=c)})),e.own(r.on("change",c=>n.get(t)&&n.set(i,c)))}}var a;function l(e){let n=e,t=new Set,r=(()=>(a&&(t.add(a),a.deps.add(t)),n));return r.set=s=>{if(!Object.is(s,n)){n=s;for(let i of[...t])i.run()}},r.update=s=>r.set(s(n)),r}function w(e){let n,t={deps:new Set,run(){for(let s of t.deps)s.delete(t);t.deps.clear(),n?.();let r=a;a=t;try{n=e()}finally{a=r}}};return t.run(),()=>{for(let r of t.deps)r.delete(t);t.deps.clear(),n?.()}}function b(e){let n=l(void 0);return w(()=>n.set(e())),n}function F(e){let n=l(0);return e.subscribe(()=>n.update(t=>t+1)),()=>(n(),e)}function v(e,n){for(let t in n){let r=`set${t[0].toUpperCase()}${t.slice(1)}`,s=e[r];if(typeof s!="function")throw new Error(`Optikos bind: ${e.constructor.name} has no ${r}()`);let i=n[t];e.own(w(()=>{s.call(e,i())}));let c=i.set;t==="value"&&c&&e.own(e.on("change",u=>c(u)))}}export{v as bind,C as bindForm,$ as bindVM,b as computed,w as effect,F as fromStore,l as signal,S as viewModel};
2
2
  //# sourceMappingURL=bind.js.map
package/dist/bind.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/bind/index.ts"],
4
- "sourcesContent": ["// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n"],
5
- "mappings": "4BAKA,IAAIA,EAaG,SAASC,EAAUC,EAAuB,CAC/C,IAAIC,EAAQD,EACNE,EAAO,IAAI,IACXC,GAAQ,KACRL,IACFI,EAAK,IAAIJ,CAAO,EAChBA,EAAQ,KAAK,IAAII,CAAI,GAEhBD,IAET,OAAAE,EAAK,IAAOC,GAAM,CAChB,GAAI,QAAO,GAAGA,EAAGH,CAAK,EACtB,CAAAA,EAAQG,EACR,QAAWC,IAAK,CAAC,GAAGH,CAAI,EAAGG,EAAE,IAAI,EACnC,EACAF,EAAK,OAAUG,GAAOH,EAAK,IAAIG,EAAGL,CAAK,CAAC,EACjCE,CACT,CAGO,SAASI,EAAOD,EAAkC,CACvD,IAAIE,EACE,EAAY,CAChB,KAAM,IAAI,IACV,KAAM,CACJ,QAAWC,KAAK,EAAE,KAAMA,EAAE,OAAO,CAAC,EAClC,EAAE,KAAK,MAAM,EACbD,IAAU,EACV,IAAME,EAAOZ,EACbA,EAAU,EACV,GAAI,CACFU,EAAUF,EAAG,CACf,QAAE,CACAR,EAAUY,CACZ,CACF,CACF,EACA,SAAE,IAAI,EACC,IAAM,CACX,QAAWD,KAAK,EAAE,KAAMA,EAAE,OAAO,CAAC,EAClC,EAAE,KAAK,MAAM,EACbD,IAAU,CACZ,CACF,CAGO,SAASG,EAAYL,EAAsB,CAChD,IAAMM,EAAIb,EAAU,MAAc,EAClC,OAAAQ,EAAO,IAAMK,EAAE,IAAIN,EAAG,CAAC,CAAC,EACjBM,CACT,CAGO,SAASC,EAA+DC,EAAmB,CAChG,IAAMC,EAAOhB,EAAO,CAAC,EACrB,OAAAe,EAAM,UAAU,IAAMC,EAAK,OAAQC,GAAMA,EAAI,CAAC,CAAC,EACxC,KAAOD,EAAK,EAAGD,EACxB,CAOO,SAASG,EAAKC,EAAqBC,EAA0C,CAClF,QAAWC,KAAOD,EAAK,CACrB,IAAME,EAAS,MAAMD,EAAI,CAAC,EAAE,YAAY,CAAC,GAAGA,EAAI,MAAM,CAAC,CAAC,GAClDd,EAAMY,EAA2CG,CAAM,EAC7D,GAAI,OAAOf,GAAO,WAAY,MAAM,IAAI,MAAM,iBAAiBY,EAAI,YAAY,IAAI,WAAWG,CAAM,IAAI,EACxG,IAAMC,EAAMH,EAAIC,CAAG,EACnBF,EAAI,IAAIX,EAAO,IAAG,CAAQD,EAAG,KAAKY,EAAKI,EAAI,CAAC,EAAC,CAAC,EAC9C,IAAMC,EAASD,EAAuC,IAClDF,IAAQ,SAAWG,GAAOL,EAAI,IAAIA,EAAI,GAAG,SAAWd,GAAMmB,EAAMnB,CAAC,CAAC,CAAC,CACzE,CACF",
6
- "names": ["running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
3
+ "sources": ["../src/bind/viewmodel.ts", "../src/bind/index.ts"],
4
+ "sourcesContent": ["// The Ext-style ViewModel on top of the signals: shared data, formulas, a linked record, and `{path}` bindings for components.\nimport type { Component } from '../core/component';\nimport type { Field } from '../core/field';\nimport type { Model } from '../data/model';\nimport { getPath, setPath } from '../core/path';\nimport { signal, computed, effect, bind } from './index';\n\nexport interface ViewModelConfig {\n /** The starting data, nested as you like (`{ qty: 2, record: { name: 'Ada' } }`). */\n data?: Record<string, any>;\n /** Values computed from the data and each other: `{ total: (get) => get('qty') * get('price') }`. They are read like data (`get('total')`) and rerun when what they read changes. */\n formulas?: Record<string, (get: <T = any>(path: string) => T) => unknown>;\n}\n\nexport interface ViewModel {\n /** Reads a dotted path. Inside an `effect`, `computed` or `bind` it makes the reader rerun when that path changes. */\n get<T = any>(path: string): T;\n /** Writes a dotted path and notifies whoever read it, or something under it, or above it. A formula cannot be written. */\n set(path: string, value: unknown): void;\n /** Makes `name` stand for a record (a Model, or a plain object): `link('record', grid.getSelection()[0])`. A write to `record.x` goes through `model.set`, so the record is marked modified. `null` clears it. */\n link(name: string, record: Model | Record<string, any> | null): void;\n /** Counts the `link` calls for `name` (reactive): a form uses it to know it was given a new record. */\n linked(name: string): number;\n}\n\nconst isModel = (v: unknown): v is Model => !!v && typeof (v as Model).set === 'function' && 'data' in (v as object);\n\n/** Shared state for a screen: the Ext `ViewModel` subset that matters (data, formulas, a linked record) without the rest. */\nexport function viewModel(config: ViewModelConfig = {}): ViewModel {\n const data: Record<string, any> = structuredClone(config.data ?? {});\n const versions = new Map<string, ReturnType<typeof signal<number>>>();\n const models = new Map<string, Model>();\n const links = new Map<string, ReturnType<typeof signal<number>>>();\n const formulas = new Map<string, () => unknown>();\n const sig = (path: string) => versions.get(path) ?? (versions.set(path, signal(0)), versions.get(path)!);\n\n const vm: ViewModel = {\n get(path) {\n sig(path)();\n const root = path.split('.')[0];\n if (config.formulas && root in config.formulas) {\n let f = formulas.get(root);\n if (!f) formulas.set(root, (f = computed(() => config.formulas![root](vm.get))));\n return getPath({ [root]: f() }, path);\n }\n return getPath(data, path);\n },\n set(path, value) {\n const [root, ...rest] = path.split('.');\n if (config.formulas && root in config.formulas) throw new Error(`Optikos viewModel: \"${root}\" is a formula and cannot be set`);\n const model = models.get(root);\n if (model && rest.length === 1) model.set(rest[0], value);\n else setPath(data, path, value);\n for (const [p, s] of versions) if (p === path || p.startsWith(`${path}.`) || path.startsWith(`${p}.`)) s.update((n) => n + 1);\n },\n link(name, record) {\n if (isModel(record)) (models.set(name, record), (data[name] = record.data));\n else (models.delete(name), (data[name] = record));\n (links.get(name) ?? (links.set(name, signal(0)), links.get(name)!)).update((n) => n + 1);\n for (const [p, s] of versions) if (p === name || p.startsWith(`${name}.`)) s.update((n) => n + 1);\n },\n linked: (name) => (links.get(name) ?? (links.set(name, signal(0)), links.get(name)!))(),\n };\n return vm;\n}\n\n/**\n * What a binding string means: `'{record.name}'` is that value as it is (`'{!busy}'` its negation), anything else is a\n * template (`'Hello {record.name}'`).\n */\nfunction source(vm: ViewModel, spec: string): () => unknown {\n const whole = /^\\{(!?)([\\w.]+)\\}$/.exec(spec);\n if (whole) return () => (whole[1] ? !vm.get(whole[2]) : vm.get(whole[2]));\n return () => spec.replace(/\\{([\\w.]+)\\}/g, (_, p) => String(vm.get(p) ?? ''));\n}\n\n/**\n * Ext's `bind: { text: '{record.name}', disabled: '{!canSave}' }` for any component: each key calls its setter whenever\n * what the string reads changes. A field's `value: '{record.name}'` is two ways: the field's `change` writes back.\n */\nexport function bindVM(cmp: Component<any>, vm: ViewModel, map: Record<string, string>): void {\n const sources: Record<string, () => unknown> = {};\n for (const key in map) sources[key] = source(vm, map[key]);\n bind(cmp, sources);\n const two = /^\\{([\\w.]+)\\}$/.exec(map.value ?? '');\n if (two) cmp.own(cmp.on('change', (v) => vm.set(two[1], v)));\n}\n\n/**\n * Binds every named field of a form to `record.<name>` of the view model, both ways. When the record is replaced (`link`)\n * the form is loaded from it and becomes clean; a change in the form writes through to the record (a Model is marked modified).\n */\nexport function bindForm(form: Component<any> & { getFields(): Array<Field<any>> }, vm: ViewModel, name = 'record'): void {\n for (const f of form.getFields()) {\n if (!f.name) continue;\n let seen = -1;\n const path = `${name}.${f.name}`;\n form.own(\n effect(() => {\n const gen = vm.linked(name);\n const v = vm.get(path);\n f.setValue(v === undefined ? f.getValue() : v, true);\n if (gen !== seen) (f.markClean(), (seen = gen));\n }),\n );\n form.own(f.on('change', (v) => vm.get(name) && vm.set(path, v)));\n }\n}\n", "// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n\nexport { viewModel, bindVM, bindForm, type ViewModel, type ViewModelConfig } from './viewmodel';\n"],
5
+ "mappings": "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",
6
+ "names": ["isModel", "v", "viewModel", "config", "data", "versions", "models", "links", "formulas", "sig", "path", "signal", "vm", "root", "computed", "getPath", "value", "rest", "model", "setPath", "p", "s", "n", "name", "record", "source", "spec", "whole", "_", "bindVM", "cmp", "map", "sources", "key", "bind", "two", "bindForm", "form", "f", "seen", "effect", "gen", "running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{d as l}from"./chunk-MW3RWBZ7.js";import{a as m}from"./chunk-4C666HHU.js";var w={};m(w,{addDays:()=>D,addMonths:()=>y,firstDay:()=>h,formatDate:()=>d,fromISO:()=>s,parseDate:()=>p,toISO:()=>o,today:()=>f});var u=(t,n=2)=>String(t).padStart(n,"0"),o=t=>`${u(t.getFullYear(),4)}-${u(t.getMonth()+1)}-${u(t.getDate())}`;function s(t){let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return null;let e=new Date(+n[1],+n[2]-1,+n[3]);return e.getMonth()===+n[2]-1&&e.getDate()===+n[3]?e:null}var f=()=>o(new Date);function D(t,n){let e=s(t);return e.setDate(e.getDate()+n),o(e)}function y(t,n){let e=s(t),g=e.getDate();return e.setDate(1),e.setMonth(e.getMonth()+n),e.setDate(Math.min(g,new Date(e.getFullYear(),e.getMonth()+1,0).getDate())),o(e)}var d=(t,n={dateStyle:"short"})=>{let e=s(t);return e?new Intl.DateTimeFormat(l()._lang,n).format(e):""};function p(t){if(t=t.trim(),!t)return null;let n=s(t);if(n)return o(n);let e=t.split(/[/.\-\s]+/).map(Number);if(e.length!==3||e.some(a=>!Number.isInteger(a)))return null;let g=new Intl.DateTimeFormat(l()._lang).formatToParts(new Date(2e3,10,25)).filter(a=>a.type==="day"||a.type==="month"||a.type==="year").map(a=>a.type),r={};g.forEach((a,c)=>r[a]=e[c]),r.year<100&&(r.year+=2e3);let i=new Date(r.year,r.month-1,r.day);return i.getFullYear()===r.year&&i.getMonth()===r.month-1&&i.getDate()===r.day?o(i):null}function h(){let t=l();if(t._firstDay&&t._firstDay!=="0")return Number(t._firstDay);try{let n=new Intl.Locale(t._lang).getWeekInfo?.()??new Intl.Locale(t._lang).weekInfo;if(n?.firstDay)return n.firstDay%7}catch{}return 0}export{o as a,s as b,f as c,D as d,y as e,d as f,p as g,h,w as i};
2
- //# sourceMappingURL=chunk-5JEXM5S7.js.map
1
+ import{d as l}from"./chunk-S4QD5NID.js";import{a as m}from"./chunk-4C666HHU.js";var w={};m(w,{addDays:()=>D,addMonths:()=>y,firstDay:()=>h,formatDate:()=>d,fromISO:()=>s,parseDate:()=>p,toISO:()=>o,today:()=>f});var u=(t,n=2)=>String(t).padStart(n,"0"),o=t=>`${u(t.getFullYear(),4)}-${u(t.getMonth()+1)}-${u(t.getDate())}`;function s(t){let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return null;let e=new Date(+n[1],+n[2]-1,+n[3]);return e.getMonth()===+n[2]-1&&e.getDate()===+n[3]?e:null}var f=()=>o(new Date);function D(t,n){let e=s(t);return e.setDate(e.getDate()+n),o(e)}function y(t,n){let e=s(t),g=e.getDate();return e.setDate(1),e.setMonth(e.getMonth()+n),e.setDate(Math.min(g,new Date(e.getFullYear(),e.getMonth()+1,0).getDate())),o(e)}var d=(t,n={dateStyle:"short"})=>{let e=s(t);return e?new Intl.DateTimeFormat(l()._lang,n).format(e):""};function p(t){if(t=t.trim(),!t)return null;let n=s(t);if(n)return o(n);let e=t.split(/[/.\-\s]+/).map(Number);if(e.length!==3||e.some(a=>!Number.isInteger(a)))return null;let g=new Intl.DateTimeFormat(l()._lang).formatToParts(new Date(2e3,10,25)).filter(a=>a.type==="day"||a.type==="month"||a.type==="year").map(a=>a.type),r={};g.forEach((a,c)=>r[a]=e[c]),r.year<100&&(r.year+=2e3);let i=new Date(r.year,r.month-1,r.day);return i.getFullYear()===r.year&&i.getMonth()===r.month-1&&i.getDate()===r.day?o(i):null}function h(){let t=l();if(t._firstDay&&t._firstDay!=="0")return Number(t._firstDay);try{let n=new Intl.Locale(t._lang).getWeekInfo?.()??new Intl.Locale(t._lang).weekInfo;if(n?.firstDay)return n.firstDay%7}catch{}return 0}export{o as a,s as b,f as c,D as d,y as e,d as f,p as g,h,w as i};
2
+ //# sourceMappingURL=chunk-2GKIF7A6.js.map
@@ -0,0 +1,2 @@
1
+ import{b as t}from"./chunk-XQHATUKN.js";function a(e,n){let r=n.data[e.field];return e.renderer?e.renderer(r,n,e):e.format?t(e.format,r):r==null?"":String(r)}export{a};
2
+ //# sourceMappingURL=chunk-2HNQ2XRY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/data/column.ts"],
4
+ "sourcesContent": ["import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\n/** A grid/table column. `T` is the record shape: `field` then autocompletes its keys (any string still works). */\nexport interface Column<T extends Record<string, any> = any> {\n field: Extract<keyof T, string> | (string & {});\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Pinned to the start or the end while the body scrolls sideways (give it a `width`; default 140). The columns of one edge stay together. */\n locked?: 'start' | 'end';\n /** With the `grouping()` plugin: what the total row shows for this column. */\n summary?: 'sum' | 'avg' | 'min' | 'max' | 'count' | ((values: any[], recs: Model<T>[]) => unknown);\n /** Text for the total of this column (default: the column's `format`, else the plain value). */\n summaryRenderer?: (value: any, col: Column<T>) => string | Node;\n /** Left out while `setPermissionResolver` denies it. */\n permission?: string;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model<T>, col: Column<T>) => string | Node;\n cls?: string;\n /** With the `cellEditing()` grid plugin: `true` (an editor for the value's type), a field type (`'select'`) or a field config. */\n editor?: boolean | string | Record<string, any>;\n /** With `cellEditing()`: whether this record's cell can be edited (default: every record, when `editor` is set). */\n editable?: (rec: Model<T>) => boolean;\n}\n\n/** Cell content for a record: `renderer` first, then `format`, then the plain value. */\nexport function cellContent<T extends Record<string, any>>(col: Column<T>, rec: Model<T>): string | Node {\n const v = rec.data[col.field];\n if (col.renderer) return col.renderer(v, rec, col);\n if (col.format) return format(col.format, v);\n return v == null ? '' : String(v);\n}\n"],
5
+ "mappings": "wCAyCO,SAASA,EAA2CC,EAAgBC,EAA8B,CACvG,IAAMC,EAAID,EAAI,KAAKD,EAAI,KAAK,EAC5B,OAAIA,EAAI,SAAiBA,EAAI,SAASE,EAAGD,EAAKD,CAAG,EAC7CA,EAAI,OAAeG,EAAOH,EAAI,OAAQE,CAAC,EACpCA,GAAK,KAAO,GAAK,OAAOA,CAAC,CAClC",
6
+ "names": ["cellContent", "col", "rec", "v", "format"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var e=()=>{let o=globalThis.__OPTIKOS_DEV__;return o!==void 0?o:typeof location<"u"&&/^(localhost|127\.0\.0\.1|\[::1\]|.*\.local)$/.test(location.hostname)};export{e as a};
2
+ //# sourceMappingURL=chunk-2QMI2RRB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/dev.ts"],
4
+ "sourcesContent": ["/** True while developing: on localhost, or when `globalThis.__OPTIKOS_DEV__` says so. Dev-only warnings follow it. */\nexport const isDev = (): boolean => {\n const flag = (globalThis as { __OPTIKOS_DEV__?: boolean }).__OPTIKOS_DEV__;\n if (flag !== undefined) return flag;\n return typeof location !== 'undefined' && /^(localhost|127\\.0\\.0\\.1|\\[::1\\]|.*\\.local)$/.test(location.hostname);\n};\n"],
5
+ "mappings": "AACO,IAAMA,EAAQ,IAAe,CAClC,IAAMC,EAAQ,WAA6C,gBAC3D,OAAIA,IAAS,OAAkBA,EACxB,OAAO,SAAa,KAAe,+CAA+C,KAAK,SAAS,QAAQ,CACjH",
6
+ "names": ["isDev", "flag"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as o}from"./chunk-2ZRNGG2N.js";import{c as p}from"./chunk-4EZJ5FKJ.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as s}from"./chunk-MW3RWBZ7.js";var r=class extends o{baseCls="op-field op-textfield";clearBtn;createInput(){return n("input","op-textfield__input",{type:this.config.inputType??"text"})}get input(){return this.inputEl}createControl(){let t=this.config,e=this.inputEl=this.createInput(),i=n("div","op-textfield__wrap",{},e);return t.placeholder&&(e.placeholder=t.placeholder),t.maxLength!=null&&(e.maxLength=t.maxLength),t.autocomplete&&(e.autocomplete=t.autocomplete),this.listen(e,"input",()=>this.onInput()),this.listen(e,"keydown",a=>this.onKey(a)),t.selectOnFocus&&this.listen(e,"focus",()=>e.select()),t.clearable&&(this.clearBtn=n("button","op-textfield__clear",{type:"button",tabindex:-1,"aria-label":s("clear")},p("x")),this.listen(this.clearBtn,"click",()=>{this.setValue(this.parse("")),e.focus()}),i.append(this.clearBtn)),i}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.commit(this.parse(this.input.value))}parse(t){return t}display(t){return t==null?"":String(t)}onKey(t){t.key==="Enter"&&!t.defaultPrevented?(this.flushSettled(),this.emit("enter",this.getValue())):t.key==="Escape"&&this.config.clearable&&this.input.value&&(t.stopPropagation(),this.setValue(this.parse("")))}getDisplayText(){return this.rendered?this.input.value:this.display(this.value)}applyValue(t){this.input.value=this.display(t),this.el.classList.toggle("has-value",!!this.input.value)}onReadonly(t){this.input.readOnly=t}onDisabled(t){this.input.disabled=t,this.clearBtn&&(this.clearBtn.disabled=t)}check(){let t=super.check(),e=this.display(this.value),i=this.config;return t||!e?t:i.minLength!=null&&e.length<i.minLength?s("minLength",{n:i.minLength}):i.pattern&&!new RegExp(i.pattern).test(e)?s("pattern"):""}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}setMaxLength(t){this.config.maxLength=t,this.rendered&&(this.input.maxLength=t)}setInputType(t){this.config.inputType=t,this.rendered&&this.input instanceof HTMLInputElement&&(this.input.type=t)}select(){this.input.select()}getInput(){return this.render(),this.input}};l("textfield",r);export{r as a};
2
- //# sourceMappingURL=chunk-W3H7GTJY.js.map
1
+ import{c as p}from"./chunk-DIOJGTUN.js";import{a as o}from"./chunk-XR677UYD.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{b as n}from"./chunk-PZSHOSOS.js";import{f as s}from"./chunk-S4QD5NID.js";var r=class extends o{baseCls="op-field op-textfield";clearBtn;createInput(){return n("input","op-textfield__input",{type:this.config.inputType??"text"})}get input(){return this.inputEl}createControl(){let t=this.config,e=this.inputEl=this.createInput(),i=n("div","op-textfield__wrap",{},e);return t.placeholder&&(e.placeholder=t.placeholder),t.maxLength!=null&&(e.maxLength=t.maxLength),t.autocomplete&&(e.autocomplete=t.autocomplete),this.listen(e,"input",()=>this.onInput()),this.listen(e,"keydown",a=>this.onKey(a)),t.selectOnFocus&&this.listen(e,"focus",()=>e.select()),t.clearable&&(this.clearBtn=n("button","op-textfield__clear",{type:"button",tabindex:-1,"aria-label":s("clear")},p("x")),this.listen(this.clearBtn,"click",()=>{this.setValue(this.parse("")),e.focus()}),i.append(this.clearBtn)),i}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.commit(this.parse(this.input.value))}parse(t){return t}display(t){return t==null?"":String(t)}onKey(t){t.key==="Enter"&&!t.defaultPrevented?(this.flushSettled(),this.emit("enter",this.getValue())):t.key==="Escape"&&this.config.clearable&&this.input.value&&(t.stopPropagation(),this.setValue(this.parse("")))}getDisplayText(){return this.rendered?this.input.value:this.display(this.value)}applyValue(t){this.input.value=this.display(t),this.el.classList.toggle("has-value",!!this.input.value)}onReadonly(t){this.input.readOnly=t}onDisabled(t){this.input.disabled=t,this.clearBtn&&(this.clearBtn.disabled=t)}check(){let t=super.check(),e=this.display(this.value),i=this.config;return t||!e?t:i.minLength!=null&&e.length<i.minLength?s("minLength",{n:i.minLength}):i.pattern&&!new RegExp(i.pattern).test(e)?s("pattern"):""}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}setMaxLength(t){this.config.maxLength=t,this.rendered&&(this.input.maxLength=t)}setInputType(t){this.config.inputType=t,this.rendered&&this.input instanceof HTMLInputElement&&(this.input.type=t)}select(){this.input.select()}getInput(){return this.render(),this.input}};l("textfield",r);export{r as a};
2
+ //# sourceMappingURL=chunk-2YRQULDC.js.map
@@ -1,2 +1,2 @@
1
- import{c as o}from"./chunk-4EZJ5FKJ.js";import{a as h}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{e as s,f as r}from"./chunk-MW3RWBZ7.js";s("en",{chipRemove:"Remove {text}"});s("pt-BR",{chipRemove:"Remover {text}"});var n=class extends h{baseCls="op-chip";tag="span";main;textEl;removeBtn;onRender(){let e=this.config;this.textEl=i("span","op-chip__text"),this.main=i("button","op-chip__main",{type:"button"},e.icon?o(e.icon):"",this.textEl),this.el.append(this.main),this.listen(this.main,"click",()=>{this.config.disabled||(this.config.selectable&&this.setSelected(!this.config.selected,!0),this.config.handler?.(this),this.emit("click",this))}),e.removable&&(this.removeBtn=i("button","op-chip__remove",{type:"button"},o("x")),this.el.append(this.removeBtn),this.listen(this.removeBtn,"click",()=>!this.config.disabled&&this.emit("remove",this)),this.listen(this.main,"keydown",t=>{(t.key==="Delete"||t.key==="Backspace")&&!this.config.disabled&&this.emit("remove",this)})),this.setText(e.text??""),this.setSelected(!!e.selected),this.setDisabled(!!e.disabled)}setText(e){this.config.text=e,this.rendered&&(this.textEl.textContent=e,this.removeBtn?.setAttribute("aria-label",r("chipRemove",{text:e})))}setSelected(e,t=!1){this.config.selected=e,this.rendered&&(this.el.classList.toggle("is-selected",e),this.config.selectable&&this.main.setAttribute("aria-pressed",String(e)),t&&this.emit("change",e))}isSelected(){return!!this.config.selected}setDisabled(e){super.setDisabled(e),this.rendered&&(this.main.disabled=e,this.removeBtn&&(this.removeBtn.disabled=e))}focusEl(){return this.main}};l("chip",n);export{n as a};
2
- //# sourceMappingURL=chunk-ZPPELYNJ.js.map
1
+ import{c as o}from"./chunk-DIOJGTUN.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as h}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as s,f as r}from"./chunk-S4QD5NID.js";s("en",{chipRemove:"Remove {text}"});s("pt-BR",{chipRemove:"Remover {text}"});var n=class extends h{baseCls="op-chip";tag="span";main;textEl;removeBtn;onRender(){let e=this.config;this.textEl=i("span","op-chip__text"),this.main=i("button","op-chip__main",{type:"button"},e.icon?o(e.icon):"",this.textEl),this.el.append(this.main),this.listen(this.main,"click",()=>{this.config.disabled||(this.config.selectable&&this.setSelected(!this.config.selected,!0),this.config.handler?.(this),this.emit("click",this))}),e.removable&&(this.removeBtn=i("button","op-chip__remove",{type:"button"},o("x")),this.el.append(this.removeBtn),this.listen(this.removeBtn,"click",()=>!this.config.disabled&&this.emit("remove",this)),this.listen(this.main,"keydown",t=>{(t.key==="Delete"||t.key==="Backspace")&&!this.config.disabled&&this.emit("remove",this)})),this.setText(e.text??""),this.setSelected(!!e.selected),this.setDisabled(!!e.disabled)}setText(e){this.config.text=e,this.rendered&&(this.textEl.textContent=e,this.removeBtn?.setAttribute("aria-label",r("chipRemove",{text:e})))}setSelected(e,t=!1){this.config.selected=e,this.rendered&&(this.el.classList.toggle("is-selected",e),this.config.selectable&&this.main.setAttribute("aria-pressed",String(e)),t&&this.emit("change",e))}isSelected(){return!!this.config.selected}setDisabled(e){super.setDisabled(e),this.rendered&&(this.main.disabled=e,this.removeBtn&&(this.removeBtn.disabled=e))}focusEl(){return this.main}};l("chip",n);export{n as a};
2
+ //# sourceMappingURL=chunk-3BG75P7T.js.map
@@ -1,2 +1,2 @@
1
- import{c as o}from"./chunk-ZWNQREWS.js";import{c as i}from"./chunk-VV7CFMPZ.js";import{a as r}from"./chunk-TIPK3SCJ.js";var n="button:not(:disabled)",e=class extends o{baseCls="op-toolbar";rover;shorthand(t){if(t==="->")return{type:"spacer"};if(t==="-")return{type:"spacer",line:!0};if(t===" ")return{type:"spacer",width:8};throw new Error(`Optikos: unknown toolbar shorthand "${t}"`)}build(){let t=super.build();return t.setAttribute("role","toolbar"),this.config.vertical&&t.setAttribute("aria-orientation","vertical"),t}onRender(){this.config.layout??=this.config.vertical?{type:"vbox",align:"stretch"}:{type:"hbox",align:"center"},super.onRender(),this.el.classList.toggle("op-toolbar--vertical",!!this.config.vertical),this.rover=i(this.el,{selector:n,orientation:this.config.vertical?"vertical":"horizontal"}),this.own(()=>this.rover?.destroy())}notifyMount(){super.notifyMount(),this.rover?.sync()}};r("toolbar",e);export{e as a};
2
- //# sourceMappingURL=chunk-GNU4VOOE.js.map
1
+ import{c as o}from"./chunk-BQEFLPDA.js";import{c as i}from"./chunk-VV7CFMPZ.js";import{a as r}from"./chunk-TIPK3SCJ.js";var n="button:not(:disabled)",e=class extends o{baseCls="op-toolbar";rover;shorthand(t){if(t==="->")return{type:"spacer"};if(t==="-")return{type:"spacer",line:!0};if(t===" ")return{type:"spacer",width:8};throw new Error(`Optikos: unknown toolbar shorthand "${t}"`)}build(){let t=super.build();return t.setAttribute("role","toolbar"),this.config.vertical&&t.setAttribute("aria-orientation","vertical"),t}onRender(){this.config.layout??=this.config.vertical?{type:"vbox",align:"stretch"}:{type:"hbox",align:"center"},super.onRender(),this.el.classList.toggle("op-toolbar--vertical",!!this.config.vertical),this.rover=i(this.el,{selector:n,orientation:this.config.vertical?"vertical":"horizontal"}),this.own(()=>this.rover?.destroy())}notifyMount(){super.notifyMount(),this.rover?.sync()}};r("toolbar",e);export{e as a};
2
+ //# sourceMappingURL=chunk-3F4MN2BU.js.map
@@ -0,0 +1,2 @@
1
+ import{c as d}from"./chunk-BQEFLPDA.js";import{a as r}from"./chunk-XR677UYD.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{b as c}from"./chunk-V5G5JECN.js";import{e as u}from"./chunk-PZSHOSOS.js";var h=class extends d{baseCls="op-form";tag="form";ruledOut=new Set;dirty=!1;constructor(t={}){let e=[...t.items??[]];t.tabs&&e.push({type:"tabs",flex:1,items:t.tabs.map(i=>({type:"container",title:i.title,icon:i.icon,cls:"op-form__tab",layout:i.layout??{type:"grid",columns:2,gap:12},items:i.items}))}),super({...t,items:e})}build(){let t=super.build();return t.setAttribute("novalidate",""),t}onRender(){if(this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},this.config.labelWidth!=null&&this.setLabelWidth(this.config.labelWidth),this.config.labelPos)for(let t of this.getFields())t.config.labelPos??=this.config.labelPos;super.onRender(),this.config.readonly&&this.setReadonly(!0);for(let t of this.getFields())for(let e of["invalid","valid","dirty-change","change"])t.on(e,()=>this.syncTabs());for(let t of this.getFields())t.on("change",()=>this.changed());for(let t of this.getFields())t.on("dirty-change",()=>this.changed());this.applyRules(),this.listen(this.el,"submit",t=>{t.preventDefault(),this.submit()}),this.listen(this.el,"keydown",t=>{let e=t.target;t.key==="Enter"&&e instanceof HTMLInputElement&&!t.defaultPrevented&&e.type!=="button"&&(t.preventDefault(),this.submit())})}getFields(){return this.query(t=>t instanceof r)}getField(t){return this.getFields().find(e=>e.name===t)}getValues(t={}){let e={};for(let i of this.counted())i.name&&(!t.dirtyOnly||i.isDirty())&&c(e,i.name,i.getValue());return e}counted(){return this.getFields().filter(t=>{for(let e=t;e&&e!==this;e=e.parent)if(this.ruledOut.has(e))return!1;return!0})}changed(){this.applyRules();let t=this.isDirty();t!==this.dirty&&this.emit("dirty-change",this.dirty=t)}applyRules(){let t={};for(let e of this.getFields())e.name&&c(t,e.name,e.getValue());for(let e of this.query(i=>!!(i.config.showIf||i.config.enableIf))){let{showIf:i,enableIf:s}=e.config;if(i){let a=!!i(t);if(a===this.ruledOut.has(e))if(a)this.ruledOut.delete(e),e.show();else{this.ruledOut.add(e),e.hide();for(let l of e instanceof r?[e]:e instanceof d?e.query(o=>o instanceof r):[])l.clearError()}}s&&e.setDisabled(!s(t))}}focusField(t){this.reveal(t),t.focus()}setValues(t){for(let e of this.getFields())e.fillFrom(t)}load(t){this.setValues("data"in t&&"get"in t?t.data:t),this.markClean(),this.clearErrors(),this.emit("load",t)}reveal(t){let e=t;for(;e.parent;){let i=e.parent;i.items?.includes(e)&&(typeof i.setActive=="function"?i.setActive(e):i.layout?.activate&&i.layout.activate(i,e)),e=i}}syncTabs(){for(let t of this.query(e=>typeof e.setTabState=="function"))for(let e of t.items){let i=e instanceof d?e.query(s=>s instanceof r):[];t.setTabState(e,{errors:i.filter(s=>s.getError()).length,dirty:i.some(s=>s.isDirty())})}}updateRecord(t){let e=this.getValues(),i=new Set(this.getFields().filter(s=>s.name&&s.isDirty()).map(s=>s.name.split(".")[0]));for(let s of i)t.set(s,e[s])}markClean(){this.getFields().forEach(t=>t.markClean()),this.syncTabs()}reset(){this.getFields().forEach(t=>t.reset()),this.syncTabs()}isDirty(){return this.getFields().some(t=>t.isDirty())}isValid(){return this.counted().every(t=>t.config.disabled||t.isValid())}clearErrors(){this.getFields().forEach(t=>t.clearError()),this.syncTabs()}validate(){let t=this.counted().filter(i=>!i.config.disabled);for(let i of this.getFields())t.includes(i)||i.clearError();let e=t.filter(i=>!i.validate());return this.syncTabs(),e.length&&(this.reveal(e[0]),e[0].focus(),this.emit("invalid",e)),this.el.classList.toggle("is-invalid",!!e.length),!e.length}setErrors(t){this.clearErrors();let e=[],i;for(let[s,a]of Object.entries(t)){let l=this.getFields().filter(n=>n.name),o=l.find(n=>n.name===s)??l.filter(n=>s.startsWith(n.name+".")).sort((n,g)=>g.name.length-n.name.length)[0];o&&o.render();let f=o?.name===s?o:o?.fieldAt?.(s.slice(o.name.length+1));f?(f.setError(a),i??={host:o,target:f}):e.push(s)}return this.syncTabs(),i&&(this.el.classList.add("is-invalid"),this.emit("invalid",this.getFields().filter(s=>s.getError())),this.reveal(i.host),i.target.focus()),e}submit(){return this.emit("before-submit")===!1||!this.validate()?!1:(this.emit("submit",this.getValues()),!0)}setLabelWidth(t){this.config.labelWidth=t,this.rendered&&this.el.style.setProperty("--op-field-label-width",u(t))}setReadonly(t){this.config.readonly=t,this.getFields().forEach(e=>e.setReadonly(t))}};m("form",h);export{h as a};
2
+ //# sourceMappingURL=chunk-3FCIZKIN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/form/form/form.ts"],
4
+ "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport type { Model } from '../../../data/model';\nimport type { Component } from '../../../core/component';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { px } from '../../../core/dom';\nimport { setPath } from '../../../core/path';\n\nexport interface FormTab {\n title: string;\n icon?: string;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface FormConfig extends ContainerConfig {\n /** Shortcut: the fields in tabs, still one form (one `getValues`, one `validate`, one dirty). */\n tabs?: FormTab[];\n /** Default `labelPos` for fields that do not set their own. */\n labelPos?: 'top' | 'left';\n /** Width of the labels on the left (`labelPos: 'left'`), so they line up in a column. Number = px. */\n labelWidth?: number | string;\n /** Shortcut for a responsive grid layout (one column on narrow screens); items take `colspan` (a number or `'full'`). */\n columns?: number;\n readonly?: boolean;\n}\n\nexport class Form extends Container<FormConfig> {\n protected override baseCls = 'op-form';\n protected override tag = 'form' as const;\n /** Components hidden by their `showIf` rule: their fields do not count (no validation, not in `getValues`). */\n private ruledOut = new Set<Component>();\n private dirty = false;\n\n constructor(config: FormConfig = {}) {\n const items = [...(config.items ?? [])];\n if (config.tabs) {\n items.push({\n type: 'tabs',\n flex: 1,\n items: config.tabs.map((t) => ({ type: 'container', title: t.title, icon: t.icon, cls: 'op-form__tab', layout: t.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: t.items })),\n });\n }\n super({ ...config, items });\n }\n\n protected override build() {\n const el = super.build();\n el.setAttribute('novalidate', '');\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= this.config.columns ? { type: 'grid', columns: this.config.columns } : { type: 'vbox' };\n if (this.config.labelWidth != null) this.setLabelWidth(this.config.labelWidth);\n if (this.config.labelPos) for (const f of this.getFields()) f.config.labelPos ??= this.config.labelPos;\n super.onRender();\n if (this.config.readonly) this.setReadonly(true);\n for (const f of this.getFields()) for (const ev of ['invalid', 'valid', 'dirty-change', 'change']) f.on(ev, () => this.syncTabs());\n for (const f of this.getFields()) f.on('change', () => this.changed());\n for (const f of this.getFields()) f.on('dirty-change', () => this.changed());\n this.applyRules();\n // Native submit (a `type=submit` button) and Enter inside a single-line field both go through submit().\n this.listen(this.el, 'submit', (e: Event) => {\n e.preventDefault();\n this.submit();\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const t = e.target as HTMLElement;\n if (e.key === 'Enter' && t instanceof HTMLInputElement && !e.defaultPrevented && t.type !== 'button') {\n e.preventDefault();\n this.submit();\n }\n });\n }\n\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getField(name: string): Field<any> | undefined {\n return this.getFields().find((f) => f.name === name);\n }\n\n /** Nested object built from field names (`address.city` \u2192 `{ address: { city } }`). Fields hidden by `showIf` are left out. */\n getValues(opts: { dirtyOnly?: boolean } = {}): Record<string, any> {\n const out: Record<string, any> = {};\n for (const f of this.counted()) if (f.name && (!opts.dirtyOnly || f.isDirty())) setPath(out, f.name, f.getValue());\n return out;\n }\n\n /** The fields that count: not inside something its `showIf` rule hid. */\n private counted(): Field<any>[] {\n return this.getFields().filter((f) => {\n for (let c: Component | undefined = f; c && c !== this; c = c.parent as Component | undefined) if (this.ruledOut.has(c)) return false;\n return true;\n });\n }\n\n /** A field changed: rerun the `showIf`/`enableIf` rules and say when the form as a whole became (un)changed. */\n private changed(): void {\n this.applyRules();\n const d = this.isDirty();\n if (d !== this.dirty) this.emit('dirty-change', (this.dirty = d));\n }\n\n /** Shows/hides and enables/disables every item that has a rule, from the current values (hidden fields included). */\n applyRules(): void {\n const values: Record<string, any> = {};\n for (const f of this.getFields()) if (f.name) setPath(values, f.name, f.getValue());\n for (const c of this.query((x) => !!(x.config.showIf || x.config.enableIf))) {\n const { showIf, enableIf } = c.config;\n if (showIf) {\n const show = !!showIf(values);\n if (show === this.ruledOut.has(c)) {\n if (show) (this.ruledOut.delete(c), c.show());\n else {\n this.ruledOut.add(c);\n c.hide();\n // what nobody can see has nothing to fix: its errors go with it\n for (const f of c instanceof Field ? [c] : c instanceof Container ? (c.query((x) => x instanceof Field) as Field<any>[]) : []) f.clearError();\n }\n }\n }\n if (enableIf) c.setDisabled(!enableIf(values));\n }\n }\n\n /** Brings a field into view (opening its tab or step) and focuses it. */\n focusField(field: Field<any>): void {\n this.reveal(field);\n field.focus();\n }\n\n /** Sets the fields present in `values` (silently). */\n setValues(values: Record<string, any>): void {\n for (const f of this.getFields()) f.fillFrom(values);\n }\n\n /** Fills the form from a plain object or a Model, and makes it the \"clean\" state. */\n load(record: Record<string, any> | Model): void {\n this.setValues('data' in record && 'get' in record ? (record as Model).data : record);\n this.markClean();\n this.clearErrors();\n this.emit('load', record);\n }\n\n /** Brings a field into view: asks every ancestor that shows one child at a time (Tabs, a card layout) to show the branch. */\n protected reveal(field: Component): void {\n let node: Component = field;\n while (node.parent) {\n const p = node.parent as any;\n if (p.items?.includes(node)) {\n if (typeof p.setActive === 'function') p.setActive(node);\n else if (p.layout?.activate) p.layout.activate(p, node);\n }\n node = p;\n }\n }\n\n /** Error counts and \"changed\" dots on the headers of every Tabs inside the form. */\n protected syncTabs(): void {\n for (const tabs of this.query((c) => typeof (c as any).setTabState === 'function') as any[]) {\n for (const panel of tabs.items as Component[]) {\n const fields = panel instanceof Container ? (panel.query((c) => c instanceof Field) as Field<any>[]) : [];\n tabs.setTabState(panel, { errors: fields.filter((f) => f.getError()).length, dirty: fields.some((f) => f.isDirty()) });\n }\n }\n }\n\n /** Writes the changed fields back into a Model. */\n updateRecord(model: Model): void {\n const all = this.getValues();\n const keys = new Set(this.getFields().filter((f) => f.name && f.isDirty()).map((f) => f.name!.split('.')[0]));\n for (const k of keys) model.set(k, all[k]);\n }\n\n markClean(): void {\n this.getFields().forEach((f) => f.markClean());\n this.syncTabs();\n }\n reset(): void {\n this.getFields().forEach((f) => f.reset());\n this.syncTabs();\n }\n isDirty(): boolean {\n return this.getFields().some((f) => f.isDirty());\n }\n isValid(): boolean {\n return this.counted().every((f) => f.config.disabled || f.isValid());\n }\n clearErrors(): void {\n this.getFields().forEach((f) => f.clearError());\n this.syncTabs();\n }\n\n /** Validates every field that counts (marks errors) and focuses the first invalid one. */\n validate(): boolean {\n // a hidden or disabled field is not validated: the user could not fix it\n const counted = this.counted().filter((f) => !f.config.disabled);\n for (const f of this.getFields()) if (!counted.includes(f)) f.clearError();\n const bad = counted.filter((f) => !f.validate());\n this.syncTabs();\n if (bad.length) {\n this.reveal(bad[0]); // the tab / step that holds it comes forward first\n bad[0].focus();\n this.emit('invalid', bad);\n }\n this.el.classList.toggle('is-invalid', !!bad.length);\n return !bad.length;\n }\n\n /**\n * Marks server-side errors by dotted path (`slug`, `items.0.name` for a row of a FieldList), brings the first into\n * view (its tab or step) and focuses it. Returns the paths that matched no field, for the caller to show some other way.\n */\n setErrors(errors: Record<string, string>): string[] {\n this.clearErrors();\n const unmatched: string[] = [];\n let first: { host: Field<any>; target: Field<any> } | undefined;\n for (const [path, msg] of Object.entries(errors)) {\n const fields = this.getFields().filter((f) => f.name);\n const host = fields.find((f) => f.name === path) ?? fields.filter((f) => path.startsWith(f.name + '.')).sort((a, b) => b.name!.length - a.name!.length)[0];\n if (host) host.render();\n const target = host?.name === path ? host : (host as any)?.fieldAt?.(path.slice(host!.name!.length + 1));\n if (!target) unmatched.push(path);\n else {\n target.setError(msg);\n first ??= { host: host!, target };\n }\n }\n this.syncTabs();\n if (first) {\n this.el.classList.add('is-invalid');\n this.emit('invalid', this.getFields().filter((f) => f.getError()));\n this.reveal(first.host);\n first.target.focus();\n }\n return unmatched;\n }\n\n submit(): boolean {\n if (this.emit('before-submit') === false) return false;\n if (!this.validate()) return false;\n this.emit('submit', this.getValues());\n return true;\n }\n\n /** Width of the labels on the left (number = px); they line up in a column. */\n setLabelWidth(width: number | string): void {\n this.config.labelWidth = width;\n if (this.rendered) this.el.style.setProperty('--op-field-label-width', px(width));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n this.getFields().forEach((f) => f.setReadonly(readonly));\n }\n}\nregister('form', Form);\n"],
5
+ "mappings": "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",
6
+ "names": ["Form", "Container", "config", "items", "t", "el", "f", "ev", "e", "c", "Field", "name", "opts", "out", "setPath", "d", "values", "x", "showIf", "enableIf", "show", "field", "record", "node", "p", "tabs", "panel", "fields", "model", "all", "keys", "k", "counted", "bad", "errors", "unmatched", "first", "path", "msg", "host", "a", "b", "target", "width", "px", "readonly", "register"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as o}from"./chunk-A2NKDOYN.js";import{a as i}from"./chunk-TIPK3SCJ.js";import{f as r}from"./chunk-MW3RWBZ7.js";var e=class extends o{baseCls="op-spinner";tag="span";onRender(){this.el.setAttribute("role","progressbar"),this.setLabel(this.config.label??r("loading"))}setLabel(t){this.config.label=t,this.rendered&&this.el.setAttribute("aria-label",t)}};i("spinner",e);export{e as a};
2
- //# sourceMappingURL=chunk-5DJTP53N.js.map
1
+ import{a as i}from"./chunk-TIPK3SCJ.js";import{f as o}from"./chunk-UDXO3KM3.js";import{f as r}from"./chunk-S4QD5NID.js";var e=class extends o{baseCls="op-spinner";tag="span";onRender(){this.el.setAttribute("role","progressbar"),this.setLabel(this.config.label??r("loading"))}setLabel(t){this.config.label=t,this.rendered&&this.el.setAttribute("aria-label",t)}};i("spinner",e);export{e as a};
2
+ //# sourceMappingURL=chunk-3FK52VQX.js.map
@@ -0,0 +1,2 @@
1
+ import{a as V}from"./chunk-TIPK3SCJ.js";import{b as D}from"./chunk-XQHATUKN.js";import{f as O}from"./chunk-UDXO3KM3.js";import{b as c}from"./chunk-PZSHOSOS.js";import{e as R,f as A}from"./chunk-S4QD5NID.js";R("en",{chart:"Chart",chartPercent:"{n}%"});R("pt-BR",{chart:"Gr\xE1fico",chartPercent:"{n}%"});var Y="http://www.w3.org/2000/svg",W=y=>y%8?`var(--op-chart-${y%8+1})`:"var(--op-chart-1, var(--op-color-primary))";function m(y,t={},i=""){let e=document.createElementNS(Y,y);i&&e.setAttribute("class",i);for(let a in t)e.setAttribute(a,String(t[a]));return e}function Z(y,t,i=4){let a=(t-y||1)/i,s=10**Math.floor(Math.log10(a)),l=([1,2,2.5,5,10].find(r=>r*s>=a)??10)*s,o=[];for(let r=Math.floor(y/l)*l;r<t+l*.999;r+=l)o.push(Math.round(r/l)*l);return o}var F=class extends O{baseCls="op-chart";svg;plot;tip;legendEl;sr;hidden=new Set;rows=[];active=-1;geom;queued=!1;offStore;build(){return this.svg=m("svg",{role:"img",tabindex:0,preserveAspectRatio:"xMidYMid meet"},"op-chart__svg"),this.tip=c("div","op-chart__tip",{role:"status"}),this.tip.hidden=!0,this.plot=c("div","op-chart__plot",{},this.svg,this.tip),this.legendEl=c("div","op-chart__legend"),this.sr=c("table","op-sr-only"),c("div",this.baseCls,{},this.plot,this.legendEl,this.sr)}onRender(){let t=this.config;if(this.el.classList.add(`op-chart--${t.kind??"bar"}`),t.store&&this.bindStore(t.store),this.setData(t.data??[]),this.listen(this.svg,"keydown",i=>this.onKey(i)),this.listen(this.svg,"blur",()=>this.activate(-1)),this.listen(this.svg,"pointerleave",()=>this.activate(-1)),typeof ResizeObserver=="function"){let i=0,e=new ResizeObserver(()=>this.plot.clientWidth!==i&&(i=this.plot.clientWidth,this.paint()));e.observe(this.plot),this.own(()=>e.disconnect())}}bindStore(t){this.offStore?.(),this.config.store=t,this.offStore=t.subscribe(()=>{this.queued||(this.queued=!0,queueMicrotask(()=>(this.queued=!1,this.rendered&&!this.destroyed&&this.setData(t.getFiltered().map(i=>i.data)))))}),this.own(()=>this.offStore?.())}setStore(t){this.bindStore(t),this.rendered&&this.setData(t.getFiltered().map(i=>i.data))}setData(t){this.rows=t,this.rendered&&this.paint()}setKind(t){this.el.classList.remove(`op-chart--${this.config.kind??"bar"}`),this.config.kind=t,this.el.classList.add(`op-chart--${t}`),this.paint()}setSeries(t){this.config.series=t,this.hidden.clear(),this.paint()}series(){return this.config.series.map((t,i)=>{let e=typeof t=="string"?{field:t}:t;return{field:e.field,label:e.label??e.field,color:e.color??W(i),idx:i}})}fmt(t){return D(this.config.format??"number",t)}isPie(){return this.config.kind==="pie"||this.config.kind==="donut"}slices(){let t=this.series()[0].field;return this.rows.map((i,e)=>({label:String(i[this.config.x]??""),value:Math.max(0,Number(i[t])||0),color:W(e),idx:e}))}paint(){if(!this.rendered)return;let t=this.config,i=t.kind??"bar",e=i==="sparkline",a=Math.max(this.plot.clientWidth,0)||600,s=t.height??(e?36:240);this.svg.replaceChildren(),this.svg.setAttribute("viewBox",`0 0 ${a} ${s}`),this.svg.style.height=`${s}px`,this.svg.setAttribute("aria-label",t.title??A("chart")),this.geom=void 0,this.active=-1,this.tip.hidden=!0,!this.rows.length||!t.series.length?this.svg.append(Object.assign(m("text",{x:a/2,y:s/2,"text-anchor":"middle"},"op-chart__empty"),{textContent:A("empty")})):this.isPie()?this.paintPie(a,s):this.paintXY(a,s,i),this.paintLegend(),this.paintTable()}paintXY(t,i,e){let a=this.config,s=e==="sparkline",l=this.series().filter(n=>!this.hidden.has(n.idx)),o=this.rows.length,r=l.map(n=>this.rows.map(h=>Number(h[n.field])||0)),g=!!a.stacked&&(e==="bar"||e==="area"),p=r.map((n,h)=>n.map((f,v)=>g?r.slice(0,h).reduce((w,u)=>w+u[v],0):0)),d=r.map((n,h)=>n.map((f,v)=>f+p[h][v])),b=d.flat(),C=e==="line"||s?Math.min(0,...b):0,E=Math.max(...b,0),_=s?[C,E]:Z(C,E),N=_[0],I=_[_.length-1]||1,$=s?2:Math.max(..._.map(n=>this.fmt(n).length))*6.5+12,T=s?2:8,P=s?3:8,L=s?i-3:i-24,M=(t-$-T)/o,x=n=>L-(n-N)/(I-N||1)*(L-P),S=n=>$+M*(n+.5);if(this.geom={left:$,band:M,top:P,bottom:L,n:o},!s){let n=m("g",{},"op-chart__grid");for(let f of _)n.append(m("line",{x1:$,x2:t-T,y1:x(f),y2:x(f)},f===0?"op-chart__axis":"")),n.append(Object.assign(m("text",{x:$-6,y:x(f),"text-anchor":"end",dy:"0.32em"},"op-chart__tick"),{textContent:this.fmt(f)}));let h=Math.ceil(48/M);this.rows.forEach((f,v)=>v%h===0&&n.append(Object.assign(m("text",{x:S(v),y:i-7,"text-anchor":"middle"},"op-chart__tick"),{textContent:String(f[a.x]??"")}))),this.svg.append(n)}let q=m("g",{},"op-chart__marks");l.forEach((n,h)=>{let f=m("g",{style:`--op-chart-c:${n.color}`},"op-chart__series");if(e==="bar"){let v=M*.7/(g?1:l.length);r[h].forEach((w,u)=>{let k=S(u)-M*.7/2+(g?0:h*v),K=x(d[h][u]);f.append(m("rect",{x:k,y:Math.min(K,x(p[h][u])),width:Math.max(v-(g?0:1),1),height:Math.abs(x(p[h][u])-K),rx:2},"op-chart__bar"))})}else{let v=d[h].map((w,u)=>`${u?"L":"M"}${S(u).toFixed(1)} ${x(w).toFixed(1)}`).join("");if(e!=="line"){let w=g?p[h].map((u,k)=>`L${S(o-1-k).toFixed(1)} ${x(p[h][o-1-k]).toFixed(1)}`).join(""):`L${S(o-1)} ${x(0)}L${S(0)} ${x(0)}`;f.append(m("path",{d:`${v}${w}Z`},"op-chart__area"))}if(f.append(m("path",{d:v},"op-chart__line")),s||o<=40){let w=s?[o-1]:d[h].map((u,k)=>k);for(let u of w)f.append(m("circle",{cx:S(u),cy:x(d[h][u]),r:s?2.5:3},"op-chart__dot"))}}q.append(f)}),this.svg.append(q),this.svg.append(m("line",{y1:P,y2:L,x1:0,x2:0},"op-chart__guide"));let G=m("g");for(let n=0;n<o;n++){let h=m("rect",{x:$+M*n,y:0,width:M,height:i},"op-chart__hit");h.addEventListener("pointerenter",()=>this.activate(n)),h.addEventListener("pointerdown",()=>this.activate(n)),G.append(h)}this.svg.append(G)}paintPie(t,i){let e=this.slices().filter(d=>!this.hidden.has(d.idx)),a=e.reduce((d,b)=>d+b.value,0)||1,s=Math.min(t,i)/2-6,l=this.config.kind==="donut"?s*.6:0,[o,r]=[t/2,i/2],g=(d,b)=>`${(o+b*Math.sin(d)).toFixed(2)} ${(r-b*Math.cos(d)).toFixed(2)}`,p=0;for(let d of e){let b=p+Math.min(d.value/a*Math.PI*2,Math.PI*2-1e-4),C=b-p>Math.PI?1:0,E=`M${g(p,s)}A${s} ${s} 0 ${C} 1 ${g(b,s)}`+(l?`L${g(b,l)}A${l} ${l} 0 ${C} 0 ${g(p,l)}Z`:`L${o} ${r}Z`),_=m("path",{d:E,style:`--op-chart-c:${d.color}`},"op-chart__slice");_.addEventListener("pointerenter",()=>this.activate(d.idx)),this.svg.append(_),p=b}l&&this.svg.append(Object.assign(m("text",{x:o,y:r,"text-anchor":"middle",dy:"0.32em"},"op-chart__total"),{textContent:this.fmt(a)}))}paintLegend(){let t=this.config,i=this.isPie()?this.slices().map(e=>({label:e.label,color:e.color,idx:e.idx})):this.series();this.legendEl.hidden=!(t.legend??(this.isPie()||i.length>1))||t.kind==="sparkline"||!this.rows.length,this.legendEl.replaceChildren(...i.map(e=>{let a=c("button",`op-chart__key${this.hidden.has(e.idx)?" is-off":""}`,{type:"button","aria-pressed":String(!this.hidden.has(e.idx))},c("span","op-chart__swatch"),e.label);return a.style.setProperty("--op-chart-c",e.color),a.addEventListener("click",()=>(this.hidden.has(e.idx)?this.hidden.delete(e.idx):this.hidden.add(e.idx),this.paint())),a}))}paintTable(){let t=this.config,i=this.series();this.sr.replaceChildren(Object.assign(c("caption"),{textContent:t.title??""}),c("thead","",{},c("tr","",{},c("th","",{},t.x),...i.map(e=>c("th","",{},e.label)))),c("tbody","",{},...this.rows.map(e=>c("tr","",{},c("td","",{},String(e[t.x]??"")),...i.map(a=>c("td","",{},this.fmt(Number(e[a.field])||0)))))))}activate(t){this.active=t;let i=this.geom,e=this.svg.querySelector(".op-chart__guide");if(this.svg.querySelectorAll(".op-chart__slice").forEach((r,g)=>r.classList.toggle("is-active",this.slices().filter(p=>!this.hidden.has(p.idx))[g]?.idx===t)),t<0||!this.rows[t])return this.tip.hidden=!0,void e?.classList.remove("is-on");let a=this.config,s=[],l=String(this.rows[t][a.x]??""),o;if(this.isPie()){let r=this.slices()[t],g=this.slices().filter(p=>!this.hidden.has(p.idx)).reduce((p,d)=>p+d.value,0)||1;s.push([r.color,this.fmt(r.value),A("chartPercent",{n:Math.round(r.value/g*100)})]),o=this.plot.clientWidth/2}else{for(let r of this.series().filter(g=>!this.hidden.has(g.idx)))s.push([r.color,r.label,this.fmt(Number(this.rows[t][r.field])||0)]);o=i?i.left+i.band*(t+.5):0,e&&i&&(e.setAttribute("x1",String(o)),e.setAttribute("x2",String(o)),e.classList.add("is-on"))}this.tip.replaceChildren(c("div","op-chart__tip-head",{},l),...s.map(([r,g,p])=>{let d=c("div","op-chart__tip-row",{},c("span","op-chart__swatch"),c("span","",{},g),c("b","",{},p));return d.style.setProperty("--op-chart-c",r),d})),this.tip.hidden=!1,this.tip.classList.toggle("is-left",o>this.plot.clientWidth/2),this.tip.style.left=`${o}px`,this.emit("point",this.rows[t],t)}onKey(t){let i=this.rows.length,e=t.key==="ArrowRight"||t.key==="ArrowDown"?this.active+1:t.key==="ArrowLeft"||t.key==="ArrowUp"?this.active-1:t.key==="Home"?0:t.key==="End"?i-1:t.key==="Escape"?-1:void 0;e!==void 0&&(t.preventDefault(),this.activate(Math.max(-1,Math.min(i-1,e))))}};V("chart",F);export{F as a};
2
+ //# sourceMappingURL=chunk-3QRA3XOA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/charts/chart/chart.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { format, type Formatter } from '../../../data/format';\nimport type { Store } from '../../../data/store';\n\naddMessages('en', { chart: 'Chart', chartPercent: '{n}%' });\naddMessages('pt-BR', { chart: 'Gr\u00E1fico', chartPercent: '{n}%' });\n\nexport interface ChartSeries {\n /** Record field with the value. */\n field: string;\n /** Name in the legend and tooltip. Default: the field. */\n label?: string;\n /** Any CSS color. Default: the theme's `--op-chart-N` in order. */\n color?: string;\n}\n\nexport interface ChartConfig extends ComponentConfig {\n kind?: 'bar' | 'line' | 'area' | 'pie' | 'donut' | 'sparkline';\n /** Records. Give `data` or a `store` (any change of the store repaints the chart). */\n data?: Array<Record<string, any>>;\n store?: Store<any>;\n /** Field with the category: the x axis, or the name of each slice. */\n x: string;\n /** Series to draw (a field name, or an object). A pie and a donut draw the first one. */\n series: Array<string | ChartSeries>;\n /** `bar` and `area` pile the series up instead of putting them side by side. */\n stacked?: boolean;\n /** Default: shown when there is more than one series, or for a pie. */\n legend?: boolean;\n /** Name of a registered format (`money`, `number`, `percent`...) or a function, for the axis and the tooltip. Default `number`. */\n format?: string | Formatter;\n /** Accessible name; also the caption of the data table read by screen readers. */\n title?: string;\n /** Height in px. Default 240 (sparkline 36). */\n height?: number;\n}\n\nconst NS = 'http://www.w3.org/2000/svg';\n// the first series follows the theme's primary color unless the theme sets `--op-chart-1` (a var() resolved at :root would ignore a scoped theme)\nconst tone = (i: number) => (i % 8 ? `var(--op-chart-${(i % 8) + 1})` : 'var(--op-chart-1, var(--op-color-primary))');\ntype Pt = { label: string; value: number; color: string; idx: number };\n\nfunction s<K extends keyof SVGElementTagNameMap>(tag: K, attrs: Record<string, string | number> = {}, cls = ''): SVGElementTagNameMap[K] {\n const el = document.createElementNS(NS, tag);\n if (cls) el.setAttribute('class', cls);\n for (const k in attrs) el.setAttribute(k, String(attrs[k]));\n return el;\n}\n\n/** Round tick values from `min` to above `max`, about `n` of them. */\nfunction ticks(min: number, max: number, n = 4): number[] {\n const span = max - min || 1;\n const raw = span / n;\n const mag = 10 ** Math.floor(Math.log10(raw));\n const step = ([1, 2, 2.5, 5, 10].find((m) => m * mag >= raw) ?? 10) * mag;\n const out: number[] = [];\n for (let v = Math.floor(min / step) * step; v < max + step * 0.999; v += step) out.push(Math.round(v / step) * step);\n return out;\n}\n\n/** Bar, line, area, pie, donut and sparkline charts in SVG. Colors come from the theme (`--op-chart-1`...), so dark mode and white-label just work. */\nexport class Chart extends Component<ChartConfig> {\n protected override baseCls = 'op-chart';\n private svg!: SVGSVGElement;\n private plot!: HTMLElement;\n private tip!: HTMLElement;\n private legendEl!: HTMLElement;\n private sr!: HTMLTableElement;\n private hidden = new Set<number>();\n private rows: Array<Record<string, any>> = [];\n private active = -1;\n private geom: { left: number; band: number; top: number; bottom: number; n: number } | undefined;\n private queued = false;\n private offStore?: () => void;\n\n protected override build() {\n this.svg = s('svg', { role: 'img', tabindex: 0, preserveAspectRatio: 'xMidYMid meet' }, 'op-chart__svg') as SVGSVGElement;\n this.tip = h('div', 'op-chart__tip', { role: 'status' });\n this.tip.hidden = true;\n this.plot = h('div', 'op-chart__plot', {}, this.svg, this.tip);\n this.legendEl = h('div', 'op-chart__legend');\n this.sr = h('table', 'op-sr-only');\n return h('div', this.baseCls, {}, this.plot, this.legendEl, this.sr);\n }\n\n protected override onRender() {\n const c = this.config;\n this.el.classList.add(`op-chart--${c.kind ?? 'bar'}`);\n if (c.store) this.bindStore(c.store);\n this.setData(c.data ?? []);\n this.listen(this.svg, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.svg, 'blur', () => this.activate(-1));\n this.listen(this.svg, 'pointerleave', () => this.activate(-1));\n if (typeof ResizeObserver === 'function') {\n let last = 0;\n const ro = new ResizeObserver(() => this.plot.clientWidth !== last && ((last = this.plot.clientWidth), this.paint()));\n ro.observe(this.plot);\n this.own(() => ro.disconnect());\n }\n }\n\n private bindStore(store: Store<any>) {\n this.offStore?.();\n this.config.store = store;\n // a burst of live patches paints once\n this.offStore = store.subscribe(() => {\n if (this.queued) return;\n this.queued = true;\n queueMicrotask(() => ((this.queued = false), this.rendered && !this.destroyed && this.setData(store.getFiltered().map((r) => r.data))));\n });\n this.own(() => this.offStore?.());\n }\n\n setStore(store: Store<any>) {\n this.bindStore(store);\n if (this.rendered) this.setData(store.getFiltered().map((r) => r.data));\n }\n\n setData(data: Array<Record<string, any>>) {\n this.rows = data;\n if (this.rendered) this.paint();\n }\n\n setKind(kind: NonNullable<ChartConfig['kind']>) {\n this.el.classList.remove(`op-chart--${this.config.kind ?? 'bar'}`);\n this.config.kind = kind;\n this.el.classList.add(`op-chart--${kind}`);\n this.paint();\n }\n\n setSeries(series: ChartConfig['series']) {\n this.config.series = series;\n this.hidden.clear();\n this.paint();\n }\n\n // ---- model ----------------------------------------------------------------------------------\n\n private series(): Array<Required<Pick<ChartSeries, 'field' | 'label'>> & { color: string; idx: number }> {\n return this.config.series.map((x, idx) => {\n const o = typeof x === 'string' ? { field: x } : x;\n return { field: o.field, label: o.label ?? o.field, color: o.color ?? tone(idx), idx };\n });\n }\n\n private fmt(v: number): string {\n return format(this.config.format ?? 'number', v);\n }\n\n private isPie() {\n return this.config.kind === 'pie' || this.config.kind === 'donut';\n }\n\n private slices(): Pt[] {\n const f = this.series()[0].field;\n return this.rows.map((r, idx) => ({ label: String(r[this.config.x] ?? ''), value: Math.max(0, Number(r[f]) || 0), color: tone(idx), idx }));\n }\n\n // ---- painting -------------------------------------------------------------------------------\n\n private paint() {\n if (!this.rendered) return;\n const c = this.config;\n const kind = c.kind ?? 'bar';\n const spark = kind === 'sparkline';\n const W = Math.max(this.plot.clientWidth, 0) || 600;\n const H = c.height ?? (spark ? 36 : 240);\n this.svg.replaceChildren();\n this.svg.setAttribute('viewBox', `0 0 ${W} ${H}`);\n this.svg.style.height = `${H}px`;\n this.svg.setAttribute('aria-label', c.title ?? t('chart'));\n this.geom = undefined;\n this.active = -1;\n this.tip.hidden = true;\n if (!this.rows.length || !c.series.length) {\n this.svg.append(Object.assign(s('text', { x: W / 2, y: H / 2, 'text-anchor': 'middle' }, 'op-chart__empty'), { textContent: t('empty') }));\n } else if (this.isPie()) this.paintPie(W, H);\n else this.paintXY(W, H, kind as 'bar' | 'line' | 'area' | 'sparkline');\n this.paintLegend();\n this.paintTable();\n }\n\n private paintXY(W: number, H: number, kind: 'bar' | 'line' | 'area' | 'sparkline') {\n const c = this.config;\n const spark = kind === 'sparkline';\n const ser = this.series().filter((x) => !this.hidden.has(x.idx));\n const n = this.rows.length;\n const vals = ser.map((x) => this.rows.map((r) => Number(r[x.field]) || 0));\n const stack = !!c.stacked && (kind === 'bar' || kind === 'area');\n const base = vals.map((v, i) => v.map((_, j) => (stack ? vals.slice(0, i).reduce((a, w) => a + w[j], 0) : 0)));\n const tops = vals.map((v, i) => v.map((x, j) => x + base[i][j]));\n const all = tops.flat();\n const lo = kind === 'line' || spark ? Math.min(0, ...all) : 0;\n const hi = Math.max(...all, 0);\n const ts = spark ? [lo, hi] : ticks(lo, hi);\n const yMin = ts[0];\n const yMax = ts[ts.length - 1] || 1;\n const left = spark ? 2 : Math.max(...ts.map((v) => this.fmt(v).length)) * 6.5 + 12;\n const right = spark ? 2 : 8;\n const top = spark ? 3 : 8;\n const bottom = spark ? H - 3 : H - 24;\n const band = (W - left - right) / n;\n const y = (v: number) => bottom - ((v - yMin) / (yMax - yMin || 1)) * (bottom - top);\n const xc = (j: number) => left + band * (j + 0.5);\n this.geom = { left, band, top, bottom, n };\n\n if (!spark) {\n const grid = s('g', {}, 'op-chart__grid');\n for (const v of ts) {\n grid.append(s('line', { x1: left, x2: W - right, y1: y(v), y2: y(v) }, v === 0 ? 'op-chart__axis' : ''));\n grid.append(Object.assign(s('text', { x: left - 6, y: y(v), 'text-anchor': 'end', dy: '0.32em' }, 'op-chart__tick'), { textContent: this.fmt(v) }));\n }\n const step = Math.ceil(48 / band);\n this.rows.forEach((r, j) => j % step === 0 && grid.append(Object.assign(s('text', { x: xc(j), y: H - 7, 'text-anchor': 'middle' }, 'op-chart__tick'), { textContent: String(r[c.x] ?? '') })));\n this.svg.append(grid);\n }\n\n const marks = s('g', {}, 'op-chart__marks');\n ser.forEach((x, k) => {\n const g = s('g', { style: `--op-chart-c:${x.color}` }, 'op-chart__series');\n if (kind === 'bar') {\n const slot = (band * 0.7) / (stack ? 1 : ser.length);\n vals[k].forEach((v, j) => {\n const x0 = xc(j) - (band * 0.7) / 2 + (stack ? 0 : k * slot);\n const y0 = y(tops[k][j]);\n g.append(s('rect', { x: x0, y: Math.min(y0, y(base[k][j])), width: Math.max(slot - (stack ? 0 : 1), 1), height: Math.abs(y(base[k][j]) - y0), rx: 2 }, 'op-chart__bar'));\n });\n } else {\n const line = tops[k].map((v, j) => `${j ? 'L' : 'M'}${xc(j).toFixed(1)} ${y(v).toFixed(1)}`).join('');\n if (kind !== 'line') {\n const back = stack ? base[k].map((v, j) => `L${xc(n - 1 - j).toFixed(1)} ${y(base[k][n - 1 - j]).toFixed(1)}`).join('') : `L${xc(n - 1)} ${y(0)}L${xc(0)} ${y(0)}`;\n g.append(s('path', { d: `${line}${back}Z` }, 'op-chart__area'));\n }\n g.append(s('path', { d: line }, 'op-chart__line'));\n if (spark || n <= 40) {\n const pts = spark ? [n - 1] : tops[k].map((_, j) => j);\n for (const j of pts) g.append(s('circle', { cx: xc(j), cy: y(tops[k][j]), r: spark ? 2.5 : 3 }, 'op-chart__dot'));\n }\n }\n marks.append(g);\n });\n this.svg.append(marks);\n this.svg.append(s('line', { y1: top, y2: bottom, x1: 0, x2: 0 }, 'op-chart__guide'));\n\n // one transparent band per category: hover, touch and the tooltip live here, not on tiny marks\n const hits = s('g');\n for (let j = 0; j < n; j++) {\n const r = s('rect', { x: left + band * j, y: 0, width: band, height: H }, 'op-chart__hit');\n r.addEventListener('pointerenter', () => this.activate(j));\n r.addEventListener('pointerdown', () => this.activate(j));\n hits.append(r);\n }\n this.svg.append(hits);\n }\n\n private paintPie(W: number, H: number) {\n const slices = this.slices().filter((p) => !this.hidden.has(p.idx));\n const total = slices.reduce((a, p) => a + p.value, 0) || 1;\n const R = Math.min(W, H) / 2 - 6;\n const r0 = this.config.kind === 'donut' ? R * 0.6 : 0;\n const [cx, cy] = [W / 2, H / 2];\n const pt = (a: number, r: number) => `${(cx + r * Math.sin(a)).toFixed(2)} ${(cy - r * Math.cos(a)).toFixed(2)}`;\n let a0 = 0;\n for (const p of slices) {\n const a1 = a0 + Math.min((p.value / total) * Math.PI * 2, Math.PI * 2 - 0.0001);\n const big = a1 - a0 > Math.PI ? 1 : 0;\n const d = `M${pt(a0, R)}A${R} ${R} 0 ${big} 1 ${pt(a1, R)}` + (r0 ? `L${pt(a1, r0)}A${r0} ${r0} 0 ${big} 0 ${pt(a0, r0)}Z` : `L${cx} ${cy}Z`);\n const path = s('path', { d, style: `--op-chart-c:${p.color}` }, 'op-chart__slice');\n path.addEventListener('pointerenter', () => this.activate(p.idx));\n this.svg.append(path);\n a0 = a1;\n }\n if (r0) this.svg.append(Object.assign(s('text', { x: cx, y: cy, 'text-anchor': 'middle', dy: '0.32em' }, 'op-chart__total'), { textContent: this.fmt(total) }));\n }\n\n private paintLegend() {\n const c = this.config;\n const items = this.isPie() ? this.slices().map((p) => ({ label: p.label, color: p.color, idx: p.idx })) : this.series();\n this.legendEl.hidden = !(c.legend ?? (this.isPie() || items.length > 1)) || c.kind === 'sparkline' || !this.rows.length;\n this.legendEl.replaceChildren(\n ...items.map((x) => {\n const b = h('button', `op-chart__key${this.hidden.has(x.idx) ? ' is-off' : ''}`, { type: 'button', 'aria-pressed': String(!this.hidden.has(x.idx)) }, h('span', 'op-chart__swatch'), x.label);\n b.style.setProperty('--op-chart-c', x.color);\n b.addEventListener('click', () => (this.hidden.has(x.idx) ? this.hidden.delete(x.idx) : this.hidden.add(x.idx), this.paint()));\n return b;\n }),\n );\n }\n\n private paintTable() {\n const c = this.config;\n const ser = this.series();\n this.sr.replaceChildren(\n Object.assign(h('caption'), { textContent: c.title ?? '' }),\n h('thead', '', {}, h('tr', '', {}, h('th', '', {}, c.x), ...ser.map((x) => h('th', '', {}, x.label)))),\n h('tbody', '', {}, ...this.rows.map((r) => h('tr', '', {}, h('td', '', {}, String(r[c.x] ?? '')), ...ser.map((x) => h('td', '', {}, this.fmt(Number(r[x.field]) || 0)))))),\n );\n }\n\n // ---- tooltip --------------------------------------------------------------------------------\n\n private activate(j: number) {\n this.active = j;\n const g = this.geom;\n const guide = this.svg.querySelector<SVGLineElement>('.op-chart__guide');\n this.svg.querySelectorAll('.op-chart__slice').forEach((el, k) => el.classList.toggle('is-active', this.slices().filter((p) => !this.hidden.has(p.idx))[k]?.idx === j));\n if (j < 0 || !this.rows[j]) return void (this.tip.hidden = true, guide?.classList.remove('is-on'));\n const c = this.config;\n const rows: Array<[string, string, string]> = [];\n let head = String(this.rows[j][c.x] ?? '');\n let x: number;\n if (this.isPie()) {\n const p = this.slices()[j];\n const total = this.slices().filter((q) => !this.hidden.has(q.idx)).reduce((a, q) => a + q.value, 0) || 1;\n rows.push([p.color, this.fmt(p.value), t('chartPercent', { n: Math.round((p.value / total) * 100) })]);\n x = this.plot.clientWidth / 2;\n } else {\n for (const sr of this.series().filter((q) => !this.hidden.has(q.idx))) rows.push([sr.color, sr.label, this.fmt(Number(this.rows[j][sr.field]) || 0)]);\n x = g ? g.left + g.band * (j + 0.5) : 0;\n if (guide && g) (guide.setAttribute('x1', String(x)), guide.setAttribute('x2', String(x)), guide.classList.add('is-on'));\n }\n this.tip.replaceChildren(h('div', 'op-chart__tip-head', {}, head), ...rows.map(([color, a, b]) => { const r = h('div', 'op-chart__tip-row', {}, h('span', 'op-chart__swatch'), h('span', '', {}, a), h('b', '', {}, b)); r.style.setProperty('--op-chart-c', color); return r; }));\n this.tip.hidden = false;\n this.tip.classList.toggle('is-left', x > this.plot.clientWidth / 2);\n this.tip.style.left = `${x}px`;\n this.emit('point', this.rows[j], j);\n }\n\n private onKey(e: KeyboardEvent) {\n const n = this.rows.length;\n const next = e.key === 'ArrowRight' || e.key === 'ArrowDown' ? this.active + 1 : e.key === 'ArrowLeft' || e.key === 'ArrowUp' ? this.active - 1 : e.key === 'Home' ? 0 : e.key === 'End' ? n - 1 : e.key === 'Escape' ? -1 : undefined;\n if (next === undefined) return;\n e.preventDefault();\n this.activate(Math.max(-1, Math.min(n - 1, next)));\n }\n}\nregister('chart', Chart);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "NS", "tone", "i", "s", "tag", "attrs", "cls", "el", "k", "ticks", "min", "max", "n", "raw", "mag", "step", "m", "out", "v", "Chart", "Component", "h", "c", "e", "last", "ro", "store", "r", "data", "kind", "series", "x", "idx", "o", "format", "f", "spark", "W", "H", "t", "ser", "vals", "stack", "base", "_", "j", "a", "w", "tops", "all", "lo", "hi", "ts", "yMin", "yMax", "left", "right", "top", "bottom", "band", "y", "xc", "grid", "marks", "g", "slot", "x0", "y0", "line", "back", "pts", "hits", "slices", "p", "total", "R", "r0", "cx", "cy", "pt", "a0", "a1", "big", "d", "path", "items", "b", "guide", "rows", "head", "q", "sr", "color", "next", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as d}from"./chunk-DIOJGTUN.js";import{c as g}from"./chunk-BQEFLPDA.js";import{c as u}from"./chunk-VV7CFMPZ.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{c as b,d as h}from"./chunk-UDXO3KM3.js";import{b as r}from"./chunk-PZSHOSOS.js";import{e as p,f as l}from"./chunk-S4QD5NID.js";p("en",{tabErrors:"errors"});p("pt-BR",{tabErrors:"erros"});var f=class extends g{baseCls="op-tabs";barEl;panelsEl;tabs=new Map;pending=new Set;rover;constructor(t={}){super({defaultType:"container",...t});for(let e of this.items.filter(i=>!b(i.config.permission)&&(i.config.permissionMode??h())==="hide"))this.remove(e)}getBody(){return this.panelsEl}build(){let t=this.config.position==="left",e=r("div",`op-tabs${t?" op-tabs--left":""}`);return this.barEl=r("div","op-tabs__bar",{role:"tablist","aria-orientation":t?"vertical":"horizontal"}),this.panelsEl=r("div","op-tabs__panels"),e.append(this.barEl,this.panelsEl),e}onRender(){let t=this.config;t.layout={type:"card",activeItem:t.active??0},this.items.forEach(e=>this.addHeader(e)),this.rover=u(this.barEl,{selector:"[role=tab]",orientation:t.position==="left"?"vertical":"horizontal",onMove:e=>this.setActive(this.items.find(i=>this.tabs.get(i)===e))}),this.own(()=>this.rover?.destroy()),this.on("activate",e=>this.syncHeaders(e)),this.listen(this.barEl,"click",e=>{let i=e.target,s=i.closest("[role=tab]"),o=this.items.find(n=>this.tabs.get(n)===s);o&&(i.closest(".op-tabs__close")?this.closeTab(o):i.closest(".op-tabs__reload")?(this.setActive(o),this.reloadTab(o)):this.setActive(o))}),this.listen(this.barEl,"keydown",e=>{let i=this.items.find(s=>this.tabs.get(s)===e.target.closest("[role=tab]"));e.key==="Delete"&&i?this.closeTab(i):i&&(e.key==="r"||e.key==="R")&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&this.tabConfig(i).reloadable&&this.reloadTab(i)}),super.onRender()}forcing;attach(t,e){if(this.config.lazy!==!1&&t!==this.getActiveItem()&&t!==this.forcing){this.pending.add(t);return}super.attach(t,e),t.el.setAttribute("role","tabpanel"),t.el.tabIndex=0;let i=this.tabs.get(t);i&&(t.el.setAttribute("aria-labelledby",i.id),i.setAttribute("aria-controls",t.el.id))}ensure(t){this.pending.delete(t)&&(this.forcing=t,this.attach(t,this.items.indexOf(t)),this.forcing=void 0)}tabConfig(t){let e=t.config;return{title:e.title??"",icon:e.icon,closable:e.closable??this.config.closable??!1,reloadable:e.reloadable??this.config.reloadable??!1,disabled:!!e.disabled}}addHeader(t){let{title:e,icon:i,closable:s,reloadable:o,disabled:n}=this.tabConfig(t),a=r("div","op-tabs__tab",{role:"tab",id:`${t.id}-tab`,tabindex:-1,"aria-selected":"false","aria-disabled":n?"true":null});a.append(i?d(i):"",r("span","op-tabs__title",{},e)),o&&a.append(r("span","op-tabs__reload",{"aria-hidden":"true","data-op-tip":l("reload")},d("refresh"))),s&&a.append(r("span","op-tabs__close",{"aria-hidden":"true","data-op-tip":l("close")},d("x"))),this.tabs.set(t,a),this.barEl.append(...[...this.items].filter(c=>this.tabs.has(c)).map(c=>this.tabs.get(c)))}syncHeaders(t){for(let[i,s]of this.tabs){let o=i===t;s.setAttribute("aria-selected",String(o)),s.classList.toggle("is-active",o)}let e=t&&this.tabs.get(t);this.rover?.sync(e||void 0)}getActive(){return this.getActiveItem()}setActive(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(s=>s.id===t):t,i=this.getActiveItem();!e||e===i||this.tabConfig(e).disabled||this.emit("before-change",e,i)!==!1&&(this.ensure(e),this.setActiveItem(e),this.emit("change",e,this.items.indexOf(e)))}insert(t,e){let i=super.insert(t,e);return this.rendered&&(this.addHeader(i),this.ensure(i),this.setActive(i)),i}async reloadTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(o=>o.id===t):t,i=e&&this.tabs.get(e);if(!e||i?.classList.contains("is-reloading")||this.emit("before-reload",e)===!1)return!1;i?.classList.add("is-reloading");let s=e.config.onReload?.(e);return s instanceof Promise&&(e.setLoading(!0),await s.catch(()=>{}),e.setLoading(!1)),i?.classList.remove("is-reloading"),this.emit("reload",e),!0}closeTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(i=>i.id===t):t;!e||this.emit("before-close",e)===!1||(this.remove(e),this.emit("close",e))}remove(t,e=!0){let i=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(n=>n.id===t):t,s=i&&this.tabs.get(i)?.contains(document.activeElement),o=super.remove(t,e);if(i){this.tabs.get(i)?.remove(),this.tabs.delete(i),this.pending.delete(i);let n=this.getActiveItem();n&&this.ensure(n),s&&n&&this.tabs.get(n)?.focus()}return o}setTabState(t,e){let i=this.tabs.get(t);if(!i)return;i.classList.toggle("has-error",!!e.errors),i.classList.toggle("is-dirty",!!e.dirty);let s=i.querySelector(".op-tabs__badge");if(!e.errors)return s?.remove();s||(s=r("span","op-tabs__badge"),i.insertBefore(s,i.querySelector(".op-tabs__close"))),s.replaceChildren(String(e.errors),r("span","op-sr-only",{},` ${l("tabErrors")}`))}setTitle(t,e){t.config.title=e;let i=this.tabs.get(t)?.querySelector(".op-tabs__title");i&&(i.textContent=e)}};m("tabs",f);export{f as a};
2
+ //# sourceMappingURL=chunk-3TCITFUU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/navigation/tabs/tabs.ts"],
4
+ "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport '../../layout/panel/reload';\nimport { Component } from '../../../core/component';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport { allowed, permissionMode } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', {\n tabErrors: 'errors',\n});\naddMessages('pt-BR', {\n tabErrors: 'erros',\n});\n\nexport interface TabsConfig extends ContainerConfig {\n /** Initially active tab (index or id). */\n active?: number | string;\n position?: 'top' | 'left';\n /** Build a panel's DOM only the first time its tab is activated. Default true. */\n lazy?: boolean;\n /** Default `closable` for tabs. */\n closable?: boolean;\n /** Default `reloadable` for tabs: a \u21BB in the tab that calls the panel's `onReload`. */\n reloadable?: boolean;\n}\n\n/**\n * Items are the panels. Each may carry `title`, `icon`, `closable` and `disabled` for its tab header.\n * Tabs reuse the `card` layout of Container for the panels.\n */\nexport class Tabs extends Container<TabsConfig> {\n protected override baseCls = 'op-tabs';\n private barEl!: HTMLElement;\n private panelsEl!: HTMLElement;\n private tabs = new Map<Component, HTMLElement>();\n private pending = new Set<Component>();\n private rover?: ReturnType<typeof roving>;\n\n constructor(config: TabsConfig = {}) {\n super({ defaultType: 'container', ...config });\n // a panel the user may not see is not a tab at all (a hidden panel would leave its header behind)\n for (const p of this.items.filter((x) => !allowed(x.config.permission) && (x.config.permissionMode ?? permissionMode()) === 'hide')) this.remove(p);\n }\n\n override getBody() {\n return this.panelsEl;\n }\n\n protected override build() {\n const left = this.config.position === 'left';\n const el = h('div', `op-tabs${left ? ' op-tabs--left' : ''}`);\n this.barEl = h('div', 'op-tabs__bar', { role: 'tablist', 'aria-orientation': left ? 'vertical' : 'horizontal' });\n this.panelsEl = h('div', 'op-tabs__panels');\n el.append(this.barEl, this.panelsEl);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout = { type: 'card', activeItem: c.active ?? 0 };\n this.items.forEach((p) => this.addHeader(p));\n this.rover = roving(this.barEl, {\n selector: '[role=tab]',\n orientation: c.position === 'left' ? 'vertical' : 'horizontal',\n onMove: (tab) => this.setActive(this.items.find((p) => this.tabs.get(p) === tab)!),\n });\n this.own(() => this.rover?.destroy());\n this.on('activate', (p?: Component) => this.syncHeaders(p));\n this.listen(this.barEl, 'click', (e: Event) => {\n const target = e.target as HTMLElement;\n const tab = target.closest<HTMLElement>('[role=tab]');\n const panel = this.items.find((p) => this.tabs.get(p) === tab);\n if (!panel) return;\n if (target.closest('.op-tabs__close')) this.closeTab(panel);\n else if (target.closest('.op-tabs__reload')) (this.setActive(panel), void this.reloadTab(panel));\n else this.setActive(panel);\n });\n this.listen(this.barEl, 'keydown', (e: KeyboardEvent) => {\n const panel = this.items.find((p) => this.tabs.get(p) === (e.target as HTMLElement).closest('[role=tab]'));\n if (e.key === 'Delete' && panel) this.closeTab(panel);\n else if (panel && (e.key === 'r' || e.key === 'R') && !e.ctrlKey && !e.metaKey && !e.altKey && this.tabConfig(panel).reloadable) void this.reloadTab(panel);\n });\n super.onRender();\n }\n\n private forcing?: Component;\n\n /** Lazy panels (everything but the active one) are attached the first time they are activated. */\n protected override attach(p: Component, index: number) {\n if (this.config.lazy !== false && p !== this.getActiveItem() && p !== this.forcing) {\n this.pending.add(p);\n return;\n }\n super.attach(p, index);\n p.el.setAttribute('role', 'tabpanel');\n p.el.tabIndex = 0; // APG: the panel is reachable by Tab even when its content has nothing focusable (or scrolls)\n const tab = this.tabs.get(p);\n if (tab) {\n p.el.setAttribute('aria-labelledby', tab.id);\n tab.setAttribute('aria-controls', p.el.id);\n }\n }\n\n /** Builds a pending panel's DOM now. */\n private ensure(p: Component) {\n if (!this.pending.delete(p)) return;\n this.forcing = p;\n this.attach(p, this.items.indexOf(p));\n this.forcing = undefined;\n }\n\n private tabConfig(p: Component) {\n const c = p.config as AnyConfig;\n return { title: (c.title as string) ?? '', icon: c.icon as string | undefined, closable: (c.closable as boolean) ?? this.config.closable ?? false, reloadable: (c.reloadable as boolean) ?? this.config.reloadable ?? false, disabled: !!c.disabled };\n }\n\n private addHeader(p: Component) {\n const { title, icon, closable, reloadable, disabled } = this.tabConfig(p);\n const tab = h('div', 'op-tabs__tab', { role: 'tab', id: `${p.id}-tab`, tabindex: -1, 'aria-selected': 'false', 'aria-disabled': disabled ? 'true' : null });\n tab.append(icon ? iconEl(icon) : '', h('span', 'op-tabs__title', {}, title));\n if (reloadable) tab.append(h('span', 'op-tabs__reload', { 'aria-hidden': 'true', 'data-op-tip': t('reload') }, iconEl('refresh')));\n if (closable) tab.append(h('span', 'op-tabs__close', { 'aria-hidden': 'true', 'data-op-tip': t('close') }, iconEl('x')));\n this.tabs.set(p, tab);\n this.barEl.append(...[...this.items].filter((x) => this.tabs.has(x)).map((x) => this.tabs.get(x)!));\n }\n\n private syncHeaders(active?: Component) {\n for (const [p, tab] of this.tabs) {\n const on = p === active;\n tab.setAttribute('aria-selected', String(on));\n tab.classList.toggle('is-active', on);\n }\n const tab = active && this.tabs.get(active);\n this.rover?.sync(tab || undefined);\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n getActive(): Component | undefined {\n return this.getActiveItem();\n }\n\n /** Activates a tab (instance, id or index). `before-change` can cancel. */\n setActive(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const prev = this.getActiveItem();\n if (!p || p === prev || this.tabConfig(p).disabled) return;\n if (this.emit('before-change', p, prev) === false) return;\n this.ensure(p);\n this.setActiveItem(p);\n this.emit('change', p, this.items.indexOf(p));\n }\n\n override insert(index: number, item: AnyConfig | Component | string): Component {\n const p = super.insert(index, item);\n if (this.rendered) {\n this.addHeader(p);\n this.ensure(p); // a tab added after render becomes the active one right away\n this.setActive(p);\n }\n return p;\n }\n\n /**\n * Reloads a tab: calls its panel's `onReload` (`before-reload` can cancel). While a returned Promise is pending the panel\n * shows its loading mask and the tab's \u21BB spins; `reload(panel)` fires when it is done.\n */\n async reloadTab(tab: Component | string | number): Promise<boolean> {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const head = p && this.tabs.get(p);\n if (!p || head?.classList.contains('is-reloading') || this.emit('before-reload', p) === false) return false;\n head?.classList.add('is-reloading');\n const busy = (p.config as AnyConfig).onReload?.(p) as unknown;\n if (busy instanceof Promise) {\n p.setLoading(true);\n await busy.catch(() => undefined);\n p.setLoading(false);\n }\n head?.classList.remove('is-reloading');\n this.emit('reload', p);\n return true;\n }\n\n /** Closes a tab (`before-close` can cancel). The neighbor becomes active. */\n closeTab(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n if (!p || this.emit('before-close', p) === false) return;\n this.remove(p);\n this.emit('close', p);\n }\n\n override remove(child: Component | string | number, destroy = true): Component | undefined {\n const p = typeof child === 'number' ? this.items[child] : typeof child === 'string' ? this.items.find((x) => x.id === child) : child;\n const hadFocus = p && this.tabs.get(p)?.contains(document.activeElement);\n const removed = super.remove(child, destroy);\n if (p) {\n this.tabs.get(p)?.remove();\n this.tabs.delete(p);\n this.pending.delete(p);\n const active = this.getActiveItem();\n if (active) this.ensure(active);\n if (hadFocus && active) this.tabs.get(active)?.focus();\n }\n return removed;\n }\n\n /** Marks a tab header: a badge with the number of errors in its panel and a dot while something in it changed. */\n setTabState(tab: Component, state: { errors?: number; dirty?: boolean }): void {\n const el = this.tabs.get(tab);\n if (!el) return;\n el.classList.toggle('has-error', !!state.errors);\n el.classList.toggle('is-dirty', !!state.dirty);\n let badge = el.querySelector<HTMLElement>('.op-tabs__badge');\n if (!state.errors) return badge?.remove();\n if (!badge) {\n badge = h('span', 'op-tabs__badge');\n el.insertBefore(badge, el.querySelector('.op-tabs__close'));\n }\n badge.replaceChildren(String(state.errors), h('span', 'op-sr-only', {}, ` ${t('tabErrors')}`));\n }\n\n setTitle(tab: Component, title: string) {\n (tab.config as AnyConfig).title = title;\n const el = this.tabs.get(tab)?.querySelector('.op-tabs__title');\n if (el) el.textContent = title;\n }\n}\nregister('tabs', Tabs);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "Tabs", "Container", "config", "p", "x", "allowed", "permissionMode", "left", "el", "h", "c", "roving", "tab", "target", "panel", "index", "title", "icon", "closable", "reloadable", "disabled", "iconEl", "t", "active", "on", "prev", "item", "head", "busy", "child", "destroy", "hadFocus", "removed", "state", "badge", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var n=class{handlers=new Map;on(e,t){let s=this.handlers.get(e);return s?s.push(t):this.handlers.set(e,[t]),()=>this.off(e,t)}once(e,t){let s=this.on(e,(...r)=>(s(),t(...r)));return s}off(e,t){if(!t)this.handlers.delete(e);else{let s=this.handlers.get(e);s&&this.handlers.set(e,s.filter(r=>r!==t))}}emit(e,...t){let s=!0;for(let r of this.handlers.get(e)??[])r(...t)===!1&&(s=!1);return s}clearListeners(){this.handlers.clear()}};export{n as a};
2
+ //# sourceMappingURL=chunk-3VDLX7ET.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/emitter.ts"],
4
+ "sourcesContent": ["export type Handler = (...args: any[]) => unknown;\n\n/** Minimal observer. A handler that returns `false` makes `emit` return `false` (used by `before-*` events). */\nexport class Emitter {\n private handlers = new Map<string, Handler[]>();\n\n /** Subscribes; returns the unsubscribe function. */\n on(name: string, fn: Handler): () => void {\n const list = this.handlers.get(name);\n if (list) list.push(fn);\n else this.handlers.set(name, [fn]);\n return () => this.off(name, fn);\n }\n\n once(name: string, fn: Handler): () => void {\n const off = this.on(name, (...a) => {\n off();\n return fn(...a);\n });\n return off;\n }\n\n off(name: string, fn?: Handler): void {\n if (!fn) this.handlers.delete(name);\n else {\n const list = this.handlers.get(name);\n if (list) this.handlers.set(name, list.filter((f) => f !== fn));\n }\n }\n\n /** Returns `false` if any handler returned `false` (the event was cancelled). */\n emit(name: string, ...args: unknown[]): boolean {\n let ok = true;\n for (const fn of this.handlers.get(name) ?? []) if (fn(...args) === false) ok = false;\n return ok;\n }\n\n clearListeners(): void {\n this.handlers.clear();\n }\n}\n"],
5
+ "mappings": "AAGO,IAAMA,EAAN,KAAc,CACX,SAAW,IAAI,IAGvB,GAAGC,EAAcC,EAAyB,CACxC,IAAMC,EAAO,KAAK,SAAS,IAAIF,CAAI,EACnC,OAAIE,EAAMA,EAAK,KAAKD,CAAE,EACjB,KAAK,SAAS,IAAID,EAAM,CAACC,CAAE,CAAC,EAC1B,IAAM,KAAK,IAAID,EAAMC,CAAE,CAChC,CAEA,KAAKD,EAAcC,EAAyB,CAC1C,IAAME,EAAM,KAAK,GAAGH,EAAM,IAAII,KAC5BD,EAAI,EACGF,EAAG,GAAGG,CAAC,EACf,EACD,OAAOD,CACT,CAEA,IAAIH,EAAcC,EAAoB,CACpC,GAAI,CAACA,EAAI,KAAK,SAAS,OAAOD,CAAI,MAC7B,CACH,IAAME,EAAO,KAAK,SAAS,IAAIF,CAAI,EAC/BE,GAAM,KAAK,SAAS,IAAIF,EAAME,EAAK,OAAQG,GAAMA,IAAMJ,CAAE,CAAC,CAChE,CACF,CAGA,KAAKD,KAAiBM,EAA0B,CAC9C,IAAIC,EAAK,GACT,QAAWN,KAAM,KAAK,SAAS,IAAID,CAAI,GAAK,CAAC,EAAOC,EAAG,GAAGK,CAAI,IAAM,KAAOC,EAAK,IAChF,OAAOA,CACT,CAEA,gBAAuB,CACrB,KAAK,SAAS,MAAM,CACtB,CACF",
6
+ "names": ["Emitter", "name", "fn", "list", "off", "a", "f", "args", "ok"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as u}from"./chunk-Z2JBUHKA.js";import{a as h}from"./chunk-W3H7GTJY.js";import{a as f}from"./chunk-G2DAD3MQ.js";import{f as o,g as p}from"./chunk-5JEXM5S7.js";import{c}from"./chunk-4EZJ5FKJ.js";import{b as d}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{f as n}from"./chunk-MW3RWBZ7.js";var a=class extends h{baseCls="op-field op-textfield op-picker op-datefield";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e}parse(e){let t=p(e);return this.garbage=!!e.trim()&&!t,t}display(e){return e?o(e,{day:"2-digit",month:"2-digit",year:"numeric"}):""}createControl(){let e=super.createControl(),t=this.input;t.setAttribute("role","combobox"),t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","false");let r=d("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},c("calendar"));this.listen(r,"mousedown",s=>s.preventDefault()),this.listen(r,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(r);let i=this.config;return this.cal=new f({value:i.value,min:i.min,max:i.max,firstDay:i.firstDay}),this.dd=new u({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",s=>{this.dd.close(),this.setValue(s),t.focus()}),this.dd.on("open",()=>{t.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{t.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let s=document.activeElement;!this.el.contains(s)&&!this.dd.el.contains(s)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),t=this.value;if(e||!t)return e;let{min:r,max:i}=this.config;return r&&t<r?n("dateMin",{n:o(r)}):i&&t>i?n("dateMax",{n:o(i)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};l("datefield",a);export{a};
2
- //# sourceMappingURL=chunk-3TAW4AKH.js.map
1
+ import{a as f}from"./chunk-GEJKFE4X.js";import{a as u}from"./chunk-RG6SHPHF.js";import{a as h}from"./chunk-2YRQULDC.js";import{c}from"./chunk-DIOJGTUN.js";import{f as o,g as p}from"./chunk-2GKIF7A6.js";import{a as l}from"./chunk-TIPK3SCJ.js";import{b as d}from"./chunk-PZSHOSOS.js";import{f as n}from"./chunk-S4QD5NID.js";var a=class extends h{baseCls="op-field op-textfield op-picker op-datefield";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e}parse(e){let t=p(e);return this.garbage=!!e.trim()&&!t,t}display(e){return e?o(e,{day:"2-digit",month:"2-digit",year:"numeric"}):""}createControl(){let e=super.createControl(),t=this.input;t.setAttribute("role","combobox"),t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","false");let r=d("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},c("calendar"));this.listen(r,"mousedown",s=>s.preventDefault()),this.listen(r,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(r);let i=this.config;return this.cal=new f({value:i.value,min:i.min,max:i.max,firstDay:i.firstDay}),this.dd=new u({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",s=>{this.dd.close(),this.setValue(s),t.focus()}),this.dd.on("open",()=>{t.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{t.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let s=document.activeElement;!this.el.contains(s)&&!this.dd.el.contains(s)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),t=this.value;if(e||!t)return e;let{min:r,max:i}=this.config;return r&&t<r?n("dateMin",{n:o(r)}):i&&t>i?n("dateMax",{n:o(i)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};l("datefield",a);export{a};
2
+ //# sourceMappingURL=chunk-4AZ44KV4.js.map
@@ -1,2 +1,2 @@
1
- import{a as l}from"./chunk-EV73ADN2.js";import{c as a}from"./chunk-4EZJ5FKJ.js";import{b as s}from"./chunk-PZSHOSOS.js";import{a as h}from"./chunk-TIPK3SCJ.js";import{f as o}from"./chunk-MW3RWBZ7.js";var n=class extends l{baseCls="op-field op-textfield op-picker op-suggest";seq=0;abort;cancelWait;live;hasTrigger(){return!1}emptyValue(){return null}isEmpty(e){return e==null||e===""}createControl(){let e=super.createControl();return this.config.icon!==!1&&(e.classList.add("has-icon"),e.prepend(s("span","op-suggest__icon",{"aria-hidden":"true"},a(this.config.icon??"search")))),e.append(s("span","op-spinner op-picker__spinner",{"aria-hidden":"true"})),this.live=s("div","op-sr-only",{"aria-live":"polite"}),e.append(this.live),this.own(()=>this.abort?.abort()),e}onRender(){super.onRender(),this.config.store?.on("load",()=>this.showResults(this.items))}onType(e){if(this.cancelWait?.(),this.abort?.abort(),e.trim().length<(this.config.minChars??1))return this.items=[],this.refreshList(),this.setSearching(!1),this.close();this.cancelWait=this.later(()=>{this.search(e)},this.config.delay??250)}async search(e){if(this.emit("before-query",e)===!1)return;let i=++this.seq,c=this.abort=new AbortController;this.setSearching(!0),this.emit("query",e);try{let t=this.config,r;if(t.store?(await t.store.load({query:e}),r=t.store.getData()):r=await t.query?.(e,{signal:c.signal})??[],i!==this.seq)return;this.items=r.map(p=>this.toItem(p)),this.showResults(this.items,e),this.emit("load",this.items)}catch(t){if(i!==this.seq)return;this.setSearching(!1),this.close(),this.emit("error",t)}}showResults(e,i=this.input.value){this.setSearching(!1),this.typed=!0,this.refreshList(),this.list.setHighlight(this.config.highlight===!1?"":i),this.live.textContent=e.length?o("results",{n:e.length}):o("noResults"),document.activeElement===this.input&&this.open()}setSearching(e){this.el.classList.toggle("is-searching",e),this.input.setAttribute("aria-busy",String(e))}setQuery(e){this.config.query=e}clearSuggestions(){this.items=[],this.refreshList(),this.close()}pick(e){super.pick(e),this.list.setHighlight("")}};h("suggestfield",n);export{n as a};
2
- //# sourceMappingURL=chunk-TZOQWCVH.js.map
1
+ import{a as l}from"./chunk-N2LS4JD6.js";import{c as a}from"./chunk-DIOJGTUN.js";import{a as h}from"./chunk-TIPK3SCJ.js";import{b as s}from"./chunk-PZSHOSOS.js";import{f as o}from"./chunk-S4QD5NID.js";var n=class extends l{baseCls="op-field op-textfield op-picker op-suggest";seq=0;abort;cancelWait;live;hasTrigger(){return!1}emptyValue(){return null}isEmpty(e){return e==null||e===""}createControl(){let e=super.createControl();return this.config.icon!==!1&&(e.classList.add("has-icon"),e.prepend(s("span","op-suggest__icon",{"aria-hidden":"true"},a(this.config.icon??"search")))),e.append(s("span","op-spinner op-picker__spinner",{"aria-hidden":"true"})),this.live=s("div","op-sr-only",{"aria-live":"polite"}),e.append(this.live),this.own(()=>this.abort?.abort()),e}onRender(){super.onRender(),this.config.store?.on("load",()=>this.showResults(this.items))}onType(e){if(this.cancelWait?.(),this.abort?.abort(),e.trim().length<(this.config.minChars??1))return this.items=[],this.refreshList(),this.setSearching(!1),this.close();this.cancelWait=this.later(()=>{this.search(e)},this.config.delay??250)}async search(e){if(this.emit("before-query",e)===!1)return;let i=++this.seq,c=this.abort=new AbortController;this.setSearching(!0),this.emit("query",e);try{let t=this.config,r;if(t.store?(await t.store.load({query:e}),r=t.store.getData()):r=await t.query?.(e,{signal:c.signal})??[],i!==this.seq)return;this.items=r.map(p=>this.toItem(p)),this.showResults(this.items,e),this.emit("load",this.items)}catch(t){if(i!==this.seq)return;this.setSearching(!1),this.close(),this.emit("error",t)}}showResults(e,i=this.input.value){this.setSearching(!1),this.typed=!0,this.refreshList(),this.list.setHighlight(this.config.highlight===!1?"":i),this.live.textContent=e.length?o("results",{n:e.length}):o("noResults"),document.activeElement===this.input&&this.open()}setSearching(e){this.el.classList.toggle("is-searching",e),this.input.setAttribute("aria-busy",String(e))}setQuery(e){this.config.query=e}clearSuggestions(){this.items=[],this.refreshList(),this.close()}pick(e){super.pick(e),this.list.setHighlight("")}};h("suggestfield",n);export{n as a};
2
+ //# sourceMappingURL=chunk-4CWYF4O7.js.map
@@ -1,2 +1,2 @@
1
- import{c as r}from"./chunk-ZWNQREWS.js";import{c as d}from"./chunk-4EZJ5FKJ.js";import{b as i,c as o}from"./chunk-PZSHOSOS.js";import{a as n}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-MW3RWBZ7.js";var s=class extends r{baseCls="op-fieldset";tag="fieldset";legend;bodyEl;toggleBtn;descEl;getBody(){return this.bodyEl}build(){let e=super.build();return this.legend=i("legend","op-fieldset__legend"),this.descEl=i("p","op-fieldset__desc",{id:o("op-fs-desc")}),this.bodyEl=i("div","op-fieldset__body"),e.append(this.legend,this.descEl,this.bodyEl),e}onRender(){this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},super.onRender(),this.setVariant(this.config.variant??"box"),this.setDescription(this.config.description??""),this.config.collapsible&&(this.toggleBtn=i("button","op-fieldset__toggle",{type:"button"},d("chevron-up")),this.listen(this.toggleBtn,"click",()=>this.toggle()),this.legend.prepend(this.toggleBtn)),this.setTitle(this.config.title??""),this.setCollapsed(!!this.config.collapsed)}setTitle(e){if(this.config.title=e,!this.rendered)return;let t=this.legend.querySelector(".op-fieldset__title");t||(this.legend.append(t=i("span","op-fieldset__title")),this.config.collapsible&&this.listen(t,"click",()=>this.toggle())),t.textContent=e,this.legend.hidden=!e&&!this.config.collapsible}setDescription(e){this.config.description=e,this.rendered&&(this.descEl.textContent=e,this.descEl.hidden=!e,e?this.el.setAttribute("aria-describedby",this.descEl.id):this.el.removeAttribute("aria-describedby"))}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let t of["box","line","plain"])this.el.classList.toggle(`op-fieldset--${t}`,t===e)}setCollapsed(e){this.config.collapsed=e,this.rendered&&(this.el.classList.toggle("is-collapsed",e),this.bodyEl.hidden=e,e?this.descEl.hidden=!0:this.descEl.hidden=!this.config.description,this.toggleBtn?.setAttribute("aria-expanded",String(!e)),this.toggleBtn?.setAttribute("aria-label",l(e?"expand":"collapse")))}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}};n("fieldset",s);export{s as a};
2
- //# sourceMappingURL=chunk-REW4LR46.js.map
1
+ import{c as d}from"./chunk-DIOJGTUN.js";import{c as r}from"./chunk-BQEFLPDA.js";import{a as n}from"./chunk-TIPK3SCJ.js";import{b as i,c as o}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-S4QD5NID.js";var s=class extends r{baseCls="op-fieldset";tag="fieldset";legend;bodyEl;toggleBtn;descEl;getBody(){return this.bodyEl}build(){let e=super.build();return this.legend=i("legend","op-fieldset__legend"),this.descEl=i("p","op-fieldset__desc",{id:o("op-fs-desc")}),this.bodyEl=i("div","op-fieldset__body"),e.append(this.legend,this.descEl,this.bodyEl),e}onRender(){this.config.layout??=this.config.columns?{type:"grid",columns:this.config.columns}:{type:"vbox"},super.onRender(),this.setVariant(this.config.variant??"box"),this.setDescription(this.config.description??""),this.config.collapsible&&(this.toggleBtn=i("button","op-fieldset__toggle",{type:"button"},d("chevron-up")),this.listen(this.toggleBtn,"click",()=>this.toggle()),this.legend.prepend(this.toggleBtn)),this.setTitle(this.config.title??""),this.setCollapsed(!!this.config.collapsed)}setTitle(e){if(this.config.title=e,!this.rendered)return;let t=this.legend.querySelector(".op-fieldset__title");t||(this.legend.append(t=i("span","op-fieldset__title")),this.config.collapsible&&this.listen(t,"click",()=>this.toggle())),t.textContent=e,this.legend.hidden=!e&&!this.config.collapsible}setDescription(e){this.config.description=e,this.rendered&&(this.descEl.textContent=e,this.descEl.hidden=!e,e?this.el.setAttribute("aria-describedby",this.descEl.id):this.el.removeAttribute("aria-describedby"))}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let t of["box","line","plain"])this.el.classList.toggle(`op-fieldset--${t}`,t===e)}setCollapsed(e){this.config.collapsed=e,this.rendered&&(this.el.classList.toggle("is-collapsed",e),this.bodyEl.hidden=e,e?this.descEl.hidden=!0:this.descEl.hidden=!this.config.description,this.toggleBtn?.setAttribute("aria-expanded",String(!e)),this.toggleBtn?.setAttribute("aria-label",l(e?"expand":"collapse")))}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}};n("fieldset",s);export{s as a};
2
+ //# sourceMappingURL=chunk-4OB2IM5L.js.map