optikos 0.3.0 → 0.5.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 (466) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/build.js +2 -0
  5. package/dist/build.js.map +7 -0
  6. package/dist/chunk-2CVMT3IW.js +3 -0
  7. package/dist/chunk-2CVMT3IW.js.map +7 -0
  8. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  9. package/dist/{chunk-5BC72727.js → chunk-2I4Y7I7C.js} +2 -2
  10. package/dist/{chunk-Z2Z52GFT.js → chunk-2I7HDIOU.js} +2 -2
  11. package/dist/chunk-2QMI2RRB.js +2 -0
  12. package/dist/chunk-2QMI2RRB.js.map +7 -0
  13. package/dist/chunk-34KVSA2V.js +3 -0
  14. package/dist/chunk-34KVSA2V.js.map +7 -0
  15. package/dist/chunk-37PYJAA2.js +2 -0
  16. package/dist/{chunk-UXXJOU5J.js.map → chunk-37PYJAA2.js.map} +1 -1
  17. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  18. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  19. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  20. package/dist/chunk-3OA3P37P.js +2 -0
  21. package/dist/chunk-3OA3P37P.js.map +7 -0
  22. package/dist/chunk-3TCITFUU.js +2 -0
  23. package/dist/chunk-3TCITFUU.js.map +7 -0
  24. package/dist/chunk-3VDLX7ET.js +2 -0
  25. package/dist/chunk-3VDLX7ET.js.map +7 -0
  26. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  27. package/dist/chunk-5G5PHOZJ.js +2 -0
  28. package/dist/chunk-5G5PHOZJ.js.map +7 -0
  29. package/dist/{chunk-EDUMAMK4.js → chunk-5GCTM37D.js} +2 -2
  30. package/dist/chunk-5PYJ6FJK.js +2 -0
  31. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  32. package/dist/chunk-632LUU52.js +2 -0
  33. package/dist/chunk-632LUU52.js.map +7 -0
  34. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  35. package/dist/{chunk-Z2JBUHKA.js → chunk-6NP4AEV4.js} +2 -2
  36. package/dist/chunk-6PPRYSLN.js +2 -0
  37. package/dist/chunk-6PPRYSLN.js.map +7 -0
  38. package/dist/{chunk-NXSTUFS7.js → chunk-6TZJO2G2.js} +2 -2
  39. package/dist/chunk-7Y2GHQRB.js +2 -0
  40. package/dist/chunk-A36JFIA3.js +2 -0
  41. package/dist/chunk-A36JFIA3.js.map +7 -0
  42. package/dist/{chunk-G2KUK6AT.js → chunk-ADHKL2GM.js} +2 -2
  43. package/dist/{chunk-JI265XFO.js → chunk-AJN66F32.js} +2 -2
  44. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  45. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  46. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  47. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  48. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  49. package/dist/{chunk-HXDTGP2K.js → chunk-BRGT4O6Q.js} +2 -2
  50. package/dist/{chunk-OGRFQTXA.js → chunk-BTGJ3MP4.js} +2 -2
  51. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  52. package/dist/{chunk-M242VYZA.js → chunk-CXZKCBQE.js} +2 -2
  53. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  54. package/dist/chunk-DJUSVBD5.js +2 -0
  55. package/dist/chunk-DJUSVBD5.js.map +7 -0
  56. package/dist/chunk-DLRGB5NY.js +2 -0
  57. package/dist/chunk-DLRGB5NY.js.map +7 -0
  58. package/dist/chunk-DY3ZYMXD.js +2 -0
  59. package/dist/chunk-DY3ZYMXD.js.map +7 -0
  60. package/dist/chunk-EO777UIN.js +2 -0
  61. package/dist/chunk-EO777UIN.js.map +7 -0
  62. package/dist/chunk-ESCLDVFS.js +2 -0
  63. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  64. package/dist/{chunk-2ZUZ5HDL.js → chunk-ESRS5ZQV.js} +2 -2
  65. package/dist/{chunk-RNN55473.js → chunk-FNZI6MFG.js} +2 -2
  66. package/dist/{chunk-RNN55473.js.map → chunk-FNZI6MFG.js.map} +1 -1
  67. package/dist/{chunk-JK74QK3M.js → chunk-FSR6BDVO.js} +2 -2
  68. package/dist/{chunk-6VBK2I5B.js → chunk-G26R2F3W.js} +2 -2
  69. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  70. package/dist/chunk-GFJRGBQR.js +2 -0
  71. package/dist/chunk-GFJRGBQR.js.map +7 -0
  72. package/dist/chunk-GLAY4RJF.js +2 -0
  73. package/dist/chunk-GLAY4RJF.js.map +7 -0
  74. package/dist/chunk-GNKVLJ5H.js +2 -0
  75. package/dist/chunk-GNKVLJ5H.js.map +7 -0
  76. package/dist/chunk-GZIDE5K2.js +2 -0
  77. package/dist/chunk-GZIDE5K2.js.map +7 -0
  78. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  79. package/dist/chunk-HG7OOHGD.js +2 -0
  80. package/dist/chunk-HG7OOHGD.js.map +7 -0
  81. package/dist/chunk-HRW25TMU.js +2 -0
  82. package/dist/chunk-HX6TWXTX.js +2 -0
  83. package/dist/chunk-HX6TWXTX.js.map +7 -0
  84. package/dist/chunk-I5A74NMJ.js +2 -0
  85. package/dist/chunk-I5A74NMJ.js.map +7 -0
  86. package/dist/chunk-IODSL7KU.js +2 -0
  87. package/dist/chunk-IODSL7KU.js.map +7 -0
  88. package/dist/chunk-J2TCHWYD.js +2 -0
  89. package/dist/chunk-J2TCHWYD.js.map +7 -0
  90. package/dist/chunk-J5BZAKC6.js +2 -0
  91. package/dist/chunk-J5BZAKC6.js.map +7 -0
  92. package/dist/chunk-JBOKM5YA.js +2 -0
  93. package/dist/{chunk-KLLAY2IM.js.map → chunk-JBOKM5YA.js.map} +2 -2
  94. package/dist/chunk-L5SQQFO7.js +2 -0
  95. package/dist/chunk-L5SQQFO7.js.map +7 -0
  96. package/dist/chunk-L6DOWGBO.js +2 -0
  97. package/dist/chunk-L6DOWGBO.js.map +7 -0
  98. package/dist/{chunk-W3H7GTJY.js → chunk-LHWY6G6Q.js} +2 -2
  99. package/dist/chunk-LLHDEUIA.js +2 -0
  100. package/dist/chunk-LLHDEUIA.js.map +7 -0
  101. package/dist/chunk-LXWCTCZV.js +2 -0
  102. package/dist/chunk-LXWCTCZV.js.map +7 -0
  103. package/dist/chunk-M2ZRKHE4.js +2 -0
  104. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  105. package/dist/{chunk-Q26YZYTD.js → chunk-M7HLHGQV.js} +2 -2
  106. package/dist/{chunk-IHE2MQ3W.js → chunk-MGSCSS7X.js} +2 -2
  107. package/dist/chunk-MM2OC66E.js +4 -0
  108. package/dist/{chunk-XX2MVWFS.js.map → chunk-MM2OC66E.js.map} +1 -1
  109. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  110. package/dist/chunk-MQEALOU3.js +3 -0
  111. package/dist/chunk-MQEALOU3.js.map +7 -0
  112. package/dist/chunk-NAUSRVB6.js +2 -0
  113. package/dist/chunk-NAUSRVB6.js.map +7 -0
  114. package/dist/chunk-NEVDHDJ4.js +3 -0
  115. package/dist/chunk-NEVDHDJ4.js.map +7 -0
  116. package/dist/{chunk-5QUY72FX.js → chunk-NWHH3CYH.js} +2 -2
  117. package/dist/chunk-OADWLPSF.js +2 -0
  118. package/dist/chunk-OADWLPSF.js.map +7 -0
  119. package/dist/{chunk-3TAW4AKH.js → chunk-OB3VIRQR.js} +2 -2
  120. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  121. package/dist/chunk-Q6FY4L2F.js +2 -0
  122. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  123. package/dist/{chunk-TZOQWCVH.js → chunk-QOSTS5I3.js} +2 -2
  124. package/dist/chunk-QVBDBGS4.js +2 -0
  125. package/dist/chunk-QVBDBGS4.js.map +7 -0
  126. package/dist/{chunk-3S24ZRPK.js → chunk-RMATRKXV.js} +2 -2
  127. package/dist/{chunk-I4SP6JTU.js → chunk-S3ILIWSW.js} +2 -2
  128. package/dist/chunk-S4QD5NID.js +2 -0
  129. package/dist/chunk-S4QD5NID.js.map +7 -0
  130. package/dist/{chunk-XHOBNSBO.js → chunk-SEUIIPHS.js} +2 -2
  131. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  132. package/dist/chunk-T5OGUCY2.js +2 -0
  133. package/dist/chunk-T5OGUCY2.js.map +7 -0
  134. package/dist/chunk-TMBGEZSD.js +2 -0
  135. package/dist/chunk-TMBGEZSD.js.map +7 -0
  136. package/dist/chunk-TVO3Z2BM.js +2 -0
  137. package/dist/chunk-TVO3Z2BM.js.map +7 -0
  138. package/dist/{chunk-LQRFNQ2N.js → chunk-U25QSLAH.js} +2 -2
  139. package/dist/chunk-UCWICDYG.js +2 -0
  140. package/dist/chunk-UCWICDYG.js.map +7 -0
  141. package/dist/chunk-UDXO3KM3.js +2 -0
  142. package/dist/chunk-UDXO3KM3.js.map +7 -0
  143. package/dist/{chunk-FEHGU6EP.js → chunk-UL364TLO.js} +2 -2
  144. package/dist/chunk-UUAGMZD2.js +2 -0
  145. package/dist/chunk-UUAGMZD2.js.map +7 -0
  146. package/dist/chunk-V5G5JECN.js +2 -0
  147. package/dist/chunk-V5G5JECN.js.map +7 -0
  148. package/dist/chunk-XFDNXSU5.js +2 -0
  149. package/dist/chunk-XFDNXSU5.js.map +7 -0
  150. package/dist/{chunk-JBLRAM7Z.js → chunk-XNRZJP4E.js} +2 -2
  151. package/dist/chunk-YJTUFK4P.js +2 -0
  152. package/dist/chunk-YLFSCQL3.js +2 -0
  153. package/dist/chunk-YLFSCQL3.js.map +7 -0
  154. package/dist/chunk-Z6HZY2YG.js +2 -0
  155. package/dist/chunk-Z6HZY2YG.js.map +7 -0
  156. package/dist/chunk-ZEIE2OCQ.js +2 -0
  157. package/dist/chunk-ZEIE2OCQ.js.map +7 -0
  158. package/dist/{chunk-2YZB6XQR.js → chunk-ZLYZFHEN.js} +2 -2
  159. package/dist/components/avatar.js +2 -0
  160. package/dist/components/avatar.js.map +7 -0
  161. package/dist/components/badge.js +1 -1
  162. package/dist/components/breadcrumb.js +1 -1
  163. package/dist/components/button.js +1 -1
  164. package/dist/components/calendar.js +1 -1
  165. package/dist/components/carousel.js +2 -0
  166. package/dist/components/carousel.js.map +7 -0
  167. package/dist/components/cellediting.js +1 -1
  168. package/dist/components/chart.js +2 -0
  169. package/dist/components/chart.js.map +7 -0
  170. package/dist/components/chat.js +1 -1
  171. package/dist/components/checkbox.js +1 -1
  172. package/dist/components/checkboxgroup.js +1 -1
  173. package/dist/components/chip.js +1 -1
  174. package/dist/components/codeviewer.js +1 -1
  175. package/dist/components/columntotals.js +2 -0
  176. package/dist/components/columntotals.js.map +7 -0
  177. package/dist/components/combobox.js +1 -1
  178. package/dist/components/commandpalette.js +1 -1
  179. package/dist/components/container.js +1 -1
  180. package/dist/components/dataview.js +1 -1
  181. package/dist/components/datefield.js +1 -1
  182. package/dist/components/daterangefield.js +1 -1
  183. package/dist/components/datetimefield.js +2 -0
  184. package/dist/components/datetimefield.js.map +7 -0
  185. package/dist/components/dial.js +1 -1
  186. package/dist/components/dropdown.js +1 -1
  187. package/dist/components/exportbar.js +2 -0
  188. package/dist/components/exportbar.js.map +7 -0
  189. package/dist/components/fieldgroup.js +1 -1
  190. package/dist/components/fieldlist.js +1 -1
  191. package/dist/components/fieldset.js +1 -1
  192. package/dist/components/filterbuilder.js +1 -1
  193. package/dist/components/form.js +1 -1
  194. package/dist/components/formactions.js +1 -1
  195. package/dist/components/formerrors.js +1 -1
  196. package/dist/components/formsection.js +1 -1
  197. package/dist/components/grid.js +1 -1
  198. package/dist/components/gridexport.js +2 -0
  199. package/dist/components/gridexport.js.map +7 -0
  200. package/dist/components/gridstate.js +2 -0
  201. package/dist/components/gridstate.js.map +7 -0
  202. package/dist/components/grouping.js +2 -0
  203. package/dist/components/grouping.js.map +7 -0
  204. package/dist/components/icon.js +1 -1
  205. package/dist/components/image.js +2 -0
  206. package/dist/components/image.js.map +7 -0
  207. package/dist/components/imagecanvas.js +2 -0
  208. package/dist/components/imagecanvas.js.map +7 -0
  209. package/dist/components/imagefield.js +2 -0
  210. package/dist/components/imagefield.js.map +7 -0
  211. package/dist/components/inputgroup.js +1 -1
  212. package/dist/components/label.js +1 -1
  213. package/dist/components/listbox.js +1 -1
  214. package/dist/components/lookupfield.js +1 -1
  215. package/dist/components/maskfield.js +2 -0
  216. package/dist/components/maskfield.js.map +7 -0
  217. package/dist/components/menu.js +1 -1
  218. package/dist/components/messagebox.js +1 -1
  219. package/dist/components/navmenu.js +1 -1
  220. package/dist/components/numberfield.js +1 -1
  221. package/dist/components/pagination.js +1 -1
  222. package/dist/components/panel.js +1 -1
  223. package/dist/components/pickerfield.js +1 -1
  224. package/dist/components/radiogroup.js +1 -1
  225. package/dist/components/rowediting.js +2 -0
  226. package/dist/components/rowediting.js.map +7 -0
  227. package/dist/components/searchgrid.js +1 -1
  228. package/dist/components/secretfield.js +1 -1
  229. package/dist/components/select.js +1 -1
  230. package/dist/components/shortcuts.js +2 -0
  231. package/dist/components/shortcuts.js.map +7 -0
  232. package/dist/components/slider.js +1 -1
  233. package/dist/components/spacer.js +1 -1
  234. package/dist/components/spinner.js +1 -1
  235. package/dist/components/stat.js +2 -0
  236. package/dist/components/stat.js.map +7 -0
  237. package/dist/components/stepform.js +1 -1
  238. package/dist/components/stepper.js +1 -1
  239. package/dist/components/suggestfield.js +1 -1
  240. package/dist/components/table.js +1 -1
  241. package/dist/components/tabs.js +1 -1
  242. package/dist/components/textarea.js +1 -1
  243. package/dist/components/textfield.js +1 -1
  244. package/dist/components/timeentry.js +2 -0
  245. package/dist/components/timeentry.js.map +7 -0
  246. package/dist/components/timefield.js +2 -0
  247. package/dist/components/timefield.js.map +7 -0
  248. package/dist/components/timeline.js +2 -0
  249. package/dist/components/timeline.js.map +7 -0
  250. package/dist/components/toast.js +1 -1
  251. package/dist/components/toggle.js +1 -1
  252. package/dist/components/toolbar.js +1 -1
  253. package/dist/components/tree.js +1 -1
  254. package/dist/components/treegrid.js +2 -0
  255. package/dist/components/treegrid.js.map +7 -0
  256. package/dist/components/viewmanager.js +1 -1
  257. package/dist/components/viewport.js +1 -1
  258. package/dist/components/widget.js +1 -1
  259. package/dist/components/window.js +1 -1
  260. package/dist/core.js +1 -1
  261. package/dist/css/avatar.css +68 -0
  262. package/dist/css/base.css +9 -0
  263. package/dist/css/carousel.css +119 -0
  264. package/dist/css/chart.css +168 -0
  265. package/dist/css/columntotals.css +56 -0
  266. package/dist/css/core.css +36 -0
  267. package/dist/css/datetimefield.css +15 -0
  268. package/dist/css/exportbar.css +9 -0
  269. package/dist/css/grid.css +52 -0
  270. package/dist/css/gridexport.css +35 -0
  271. package/dist/css/grouping.css +56 -0
  272. package/dist/css/image.css +46 -0
  273. package/dist/css/imagecanvas.css +75 -0
  274. package/dist/css/imagefield.css +103 -0
  275. package/dist/css/rowediting.css +39 -0
  276. package/dist/css/shortcuts.css +34 -0
  277. package/dist/css/stat.css +64 -0
  278. package/dist/css/stepform.css +1 -0
  279. package/dist/css/timeentry.css +116 -0
  280. package/dist/css/timeline.css +185 -0
  281. package/dist/css/treegrid.css +35 -0
  282. package/dist/css/window.css +2 -2
  283. package/dist/data.js +1 -1
  284. package/dist/dev.js +2 -0
  285. package/dist/dev.js.map +7 -0
  286. package/dist/index.js +16 -5
  287. package/dist/index.js.map +4 -4
  288. package/dist/optikos.css +1480 -142
  289. package/dist/testing.js +2 -0
  290. package/dist/testing.js.map +7 -0
  291. package/dist/themes/dark.css +7 -0
  292. package/dist/types/bind/index.d.ts +1 -1
  293. package/dist/types/bind/viewmodel.d.ts +33 -0
  294. package/dist/types/build/build.d.ts +49 -0
  295. package/dist/types/build/index.d.ts +1 -0
  296. package/dist/types/components/avatar.d.ts +1 -0
  297. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  298. package/dist/types/components/base/image/image.d.ts +25 -0
  299. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  300. package/dist/types/components/carousel.d.ts +1 -0
  301. package/dist/types/components/chart.d.ts +1 -0
  302. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  303. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  304. package/dist/types/components/columntotals.d.ts +1 -0
  305. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  306. package/dist/types/components/data/columntotals/columntotals.d.ts +24 -0
  307. package/dist/types/components/data/exportbar/exportbar.d.ts +24 -0
  308. package/dist/types/components/data/grid/footer.d.ts +6 -0
  309. package/dist/types/components/data/grid/grid.d.ts +37 -0
  310. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  311. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  312. package/dist/types/components/data/grouping/controls.d.ts +27 -0
  313. package/dist/types/components/data/grouping/grouping.d.ts +43 -0
  314. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  315. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  316. package/dist/types/components/data/timeentry/timeentry.d.ts +37 -0
  317. package/dist/types/components/data/timeline/timeline.d.ts +63 -0
  318. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  319. package/dist/types/components/datetimefield.d.ts +1 -0
  320. package/dist/types/components/exportbar.d.ts +1 -0
  321. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  322. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  323. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  324. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  325. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  326. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  327. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  328. package/dist/types/components/form/form/form.d.ts +5 -0
  329. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  330. package/dist/types/components/gridexport.d.ts +1 -0
  331. package/dist/types/components/gridstate.d.ts +1 -0
  332. package/dist/types/components/grouping.d.ts +1 -0
  333. package/dist/types/components/image.d.ts +1 -0
  334. package/dist/types/components/imagecanvas.d.ts +1 -0
  335. package/dist/types/components/imagefield.d.ts +1 -0
  336. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  337. package/dist/types/components/maskfield.d.ts +1 -0
  338. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  339. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  340. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  341. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  342. package/dist/types/components/overlays/window/window.d.ts +14 -1
  343. package/dist/types/components/rowediting.d.ts +1 -0
  344. package/dist/types/components/shortcuts.d.ts +1 -0
  345. package/dist/types/components/stat.d.ts +1 -0
  346. package/dist/types/components/timeentry.d.ts +1 -0
  347. package/dist/types/components/timefield.d.ts +1 -0
  348. package/dist/types/components/timeline.d.ts +1 -0
  349. package/dist/types/components/treegrid.d.ts +1 -0
  350. package/dist/types/core/component.d.ts +7 -0
  351. package/dist/types/core/container.d.ts +10 -1
  352. package/dist/types/core/dev.d.ts +2 -0
  353. package/dist/types/core/field.d.ts +4 -0
  354. package/dist/types/core/i18n.d.ts +2 -0
  355. package/dist/types/core/index.d.ts +4 -1
  356. package/dist/types/core/path.d.ts +2 -0
  357. package/dist/types/core/permission.d.ts +11 -0
  358. package/dist/types/core/state.d.ts +9 -0
  359. package/dist/types/data/column.d.ts +11 -1
  360. package/dist/types/data/index.d.ts +1 -1
  361. package/dist/types/data/model.d.ts +2 -0
  362. package/dist/types/data/store.d.ts +21 -0
  363. package/dist/types/dev/index.d.ts +2 -0
  364. package/dist/types/dev/keys.d.ts +1 -0
  365. package/dist/types/index.d.ts +21 -0
  366. package/dist/types/testing/index.d.ts +25 -0
  367. package/dist/types/themes/color.d.ts +14 -0
  368. package/dist/types/themes/contrast.d.ts +15 -0
  369. package/dist/types/themes/define.d.ts +25 -3
  370. package/dist/types/themes/index.d.ts +3 -1
  371. package/dist/types/themes/seeds.d.ts +11 -0
  372. package/dist/types/ui/ui.d.ts +6 -0
  373. package/dist/ui.js +1 -1
  374. package/package.json +13 -1
  375. package/dist/chunk-2ZRNGG2N.js +0 -2
  376. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  377. package/dist/chunk-4EQEHJB3.js +0 -2
  378. package/dist/chunk-4EQEHJB3.js.map +0 -7
  379. package/dist/chunk-4LZZ244E.js +0 -2
  380. package/dist/chunk-4LZZ244E.js.map +0 -7
  381. package/dist/chunk-4SYIIX5A.js +0 -2
  382. package/dist/chunk-4SYIIX5A.js.map +0 -7
  383. package/dist/chunk-7KMIFXHZ.js +0 -2
  384. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  385. package/dist/chunk-A2NKDOYN.js +0 -2
  386. package/dist/chunk-A2NKDOYN.js.map +0 -7
  387. package/dist/chunk-CKXS375P.js +0 -2
  388. package/dist/chunk-CKXS375P.js.map +0 -7
  389. package/dist/chunk-EJGWCKE4.js +0 -2
  390. package/dist/chunk-EJGWCKE4.js.map +0 -7
  391. package/dist/chunk-ELYARUCN.js +0 -2
  392. package/dist/chunk-EV73ADN2.js +0 -2
  393. package/dist/chunk-EV73ADN2.js.map +0 -7
  394. package/dist/chunk-GD5JGKM7.js +0 -2
  395. package/dist/chunk-GD5JGKM7.js.map +0 -7
  396. package/dist/chunk-GZ7X34QP.js +0 -2
  397. package/dist/chunk-KCEUD232.js +0 -2
  398. package/dist/chunk-KCEUD232.js.map +0 -7
  399. package/dist/chunk-KLLAY2IM.js +0 -2
  400. package/dist/chunk-LBJSMXLV.js +0 -2
  401. package/dist/chunk-LBJSMXLV.js.map +0 -7
  402. package/dist/chunk-LW2WRUVL.js +0 -2
  403. package/dist/chunk-LW2WRUVL.js.map +0 -7
  404. package/dist/chunk-MW3RWBZ7.js +0 -2
  405. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  406. package/dist/chunk-OEAXCCVM.js +0 -2
  407. package/dist/chunk-OEAXCCVM.js.map +0 -7
  408. package/dist/chunk-UB5RYS7T.js +0 -2
  409. package/dist/chunk-UB5RYS7T.js.map +0 -7
  410. package/dist/chunk-UXXJOU5J.js +0 -2
  411. package/dist/chunk-VU3GIDZ3.js +0 -2
  412. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  413. package/dist/chunk-W2BAFOCN.js +0 -3
  414. package/dist/chunk-W2BAFOCN.js.map +0 -7
  415. package/dist/chunk-WFGTQZIQ.js +0 -2
  416. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  417. package/dist/chunk-XX2MVWFS.js +0 -4
  418. package/dist/chunk-XYZ6VZ5T.js +0 -2
  419. package/dist/chunk-YBAYEU25.js +0 -2
  420. package/dist/chunk-YF75HKL6.js +0 -2
  421. package/dist/chunk-YF75HKL6.js.map +0 -7
  422. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  423. /package/dist/{chunk-5BC72727.js.map → chunk-2I4Y7I7C.js.map} +0 -0
  424. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-2I7HDIOU.js.map} +0 -0
  425. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  426. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  427. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  428. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  429. /package/dist/{chunk-EDUMAMK4.js.map → chunk-5GCTM37D.js.map} +0 -0
  430. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  431. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-6NP4AEV4.js.map} +0 -0
  432. /package/dist/{chunk-NXSTUFS7.js.map → chunk-6TZJO2G2.js.map} +0 -0
  433. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  434. /package/dist/{chunk-G2KUK6AT.js.map → chunk-ADHKL2GM.js.map} +0 -0
  435. /package/dist/{chunk-JI265XFO.js.map → chunk-AJN66F32.js.map} +0 -0
  436. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  437. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  438. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  439. /package/dist/{chunk-HXDTGP2K.js.map → chunk-BRGT4O6Q.js.map} +0 -0
  440. /package/dist/{chunk-OGRFQTXA.js.map → chunk-BTGJ3MP4.js.map} +0 -0
  441. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  442. /package/dist/{chunk-M242VYZA.js.map → chunk-CXZKCBQE.js.map} +0 -0
  443. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  444. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-ESRS5ZQV.js.map} +0 -0
  445. /package/dist/{chunk-JK74QK3M.js.map → chunk-FSR6BDVO.js.map} +0 -0
  446. /package/dist/{chunk-6VBK2I5B.js.map → chunk-G26R2F3W.js.map} +0 -0
  447. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  448. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  449. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  450. /package/dist/{chunk-W3H7GTJY.js.map → chunk-LHWY6G6Q.js.map} +0 -0
  451. /package/dist/{chunk-Q26YZYTD.js.map → chunk-M7HLHGQV.js.map} +0 -0
  452. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-MGSCSS7X.js.map} +0 -0
  453. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  454. /package/dist/{chunk-5QUY72FX.js.map → chunk-NWHH3CYH.js.map} +0 -0
  455. /package/dist/{chunk-3TAW4AKH.js.map → chunk-OB3VIRQR.js.map} +0 -0
  456. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  457. /package/dist/{chunk-TZOQWCVH.js.map → chunk-QOSTS5I3.js.map} +0 -0
  458. /package/dist/{chunk-3S24ZRPK.js.map → chunk-RMATRKXV.js.map} +0 -0
  459. /package/dist/{chunk-I4SP6JTU.js.map → chunk-S3ILIWSW.js.map} +0 -0
  460. /package/dist/{chunk-XHOBNSBO.js.map → chunk-SEUIIPHS.js.map} +0 -0
  461. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  462. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-U25QSLAH.js.map} +0 -0
  463. /package/dist/{chunk-FEHGU6EP.js.map → chunk-UL364TLO.js.map} +0 -0
  464. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XNRZJP4E.js.map} +0 -0
  465. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  466. /package/dist/{chunk-2YZB6XQR.js.map → chunk-ZLYZFHEN.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,62 @@ and the project uses [Semantic Versioning](https://semver.org/). Until 1.0, mino
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.5.0] - 2026-11-11
9
+
10
+ ### Added
11
+
12
+ - `optikos/build`: one `FieldSpec[]` list gives the grid columns (`buildColumns`, `buildGrid`), the form (`buildFields`,
13
+ `buildForm`, groups become fieldsets) and the filter fields (`buildFilterFields`).
14
+ - `timeEntry()` (a Timeline plugin): create, move, resize and remove entries by pointer or keyboard, with snapping,
15
+ overlap control, locked entries, a total per lane against a `target`, and `before-*` / `create` / `change` / `remove` / `edit` events.
16
+ - `grouping({ controls, choices })`: expand all, collapse all and a "Group by" menu as icon buttons inside the grid, beside the
17
+ pager (and the `exportBar()` buttons, which share the row); each one switchable. Icons `expand`, `collapse`.
18
+ - `exportBar()` (a Grid plugin): CSV, Excel, this-page and Print buttons inside the grid, in one row with the pager, each
19
+ one switchable; `exportGrid` / `printGrid` still work from your own buttons. New icons `download`, `printer`, `table`.
20
+ - Column `format: 'duration'` (minutes as `7h 30m`) and `FieldSpec` type `duration`, so totals of time spent read "Sum 72h".
21
+ - Timeline `direction: 'vertical'` (range mode: time runs top to bottom, one column per lane); `timeEntry()` works on it too.
22
+ - `timeEntry({ form })`: your own dialog fills a new entry and edits one.
23
+ - `columnTotals()` (a Grid plugin): a button on each column header opens a menu of totals (sum, average, minimum, maximum,
24
+ count, your own); the choice shows in a bar under the grid, over every filtered row, or (`show: 'modal' | 'toast'`) as a one-off answer; `position: 'top'` puts the bar under the header. The grid fires `header-paint`.
25
+ - Column `summary` on dates: `min` (earliest), `max` (latest) and `count`.
26
+
27
+ ## [0.4.0] - 2026-11-10
28
+
29
+ ### Added
30
+
31
+ - Window token `--op-window-max-height`. The default is now `85dvh` (was the full viewport height minus a small
32
+ margin), so a long dialog keeps breathing room and scrolls inside.
33
+ - TimeField (`timefield`, `ui.time`): a time of day as `'HH:mm'`, typed (`930`) or stepped with ↑/↓, with `min`/`max`/`step`.
34
+ - `defineTheme` accepts the key `base` beside variants (`radius: { base: '8px', sm: '4px' }`).
35
+ - A lookup filter may be a field instance, not only a config.
36
+ - ImageField (`imagefield`): picks one or more images by click or drop, with previews, `accept`, `maxSize`, `maxFiles`,
37
+ a `reject` event and URLs of images already saved.
38
+ - ImageCanvas (`imagecanvas`): shows an image with zoom and pan (buttons, keys, Ctrl+wheel, double click, pinch).
39
+ - Carousel (`carousel`): a scroll-snap row of any components with arrows, dots, `perView`, `loop` and an autoplay that
40
+ stops on use and respects `prefers-reduced-motion`.
41
+ - 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**.
42
+ - `NumberField`: `format: 'currency' | 'percent'` through `Intl`, `currency`, `locale`, and `scale` (cents as an integer); `setCurrency()`.
43
+ - Permissions: `setPermissionResolver`, `setPermissionMode` and `permission` / `permissionMode` on components, menu and NavMenu items, command palette commands, grid columns and actions.
44
+ - `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.
45
+ - Live data: `store.applyPatches()` and `store.connect(source)`; `store.fetchAll()` reads every page of a remote store.
46
+ - `exportGrid` (CSV, xlsx) and `printGrid`; print styles in the core.
47
+ - `persistState(key)` (a Grid plugin) and `setStateStorage` / `loadState` / `saveState` for per-user state.
48
+ - `shortcuts`: global and per-screen shortcuts with a help panel on `?`.
49
+ - `Window.confirmDiscard`.
50
+ - `defineTheme`: `seeds` (a light and dark theme from two colors), `fonts` (`@font-face`), `loadFonts`; `checkContrast()`; chart colors `--op-chart-1…8`.
51
+ - `optikos/dev` (warns about ignored config options) and `optikos/testing` (test helpers for apps); `TabPanelConfig` types the tab options of any container.
52
+ - Docs: the back-office recipes guide and the `panel` demo.
53
+ - 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.
54
+ - `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`.
55
+
56
+ ### Fixed
57
+
58
+ - Window stays on screen when its content grows after opening (a FieldList gaining rows, a step change): it re-centers,
59
+ or, once dragged, moves up just enough to fit. Before, it grew past the bottom of the viewport with no way to scroll.
60
+ - `new Component({ renderTo })` mounts like `create` does (it was ignored), and `config.type` is set on instances made with `new`.
61
+ - Menu items typed from a variable (`const items = [{ text: 'a' }, '-']`) no longer need a cast.
62
+ - StepForm review: a FieldList shows one line per row with what the user sees, instead of `[object Object]`.
63
+
8
64
  ## [0.3.0] - 2026-11-10
9
65
 
10
66
  ### Added
@@ -157,7 +213,8 @@ First public release.
157
213
  `corporate`, `soft`, `brutal`, `terminal`, `editorial` and `brand`.
158
214
  - Per-component entry points (`optikos/components/<name>`) and stylesheets (`optikos/css/<name>.css`).
159
215
 
160
- [Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...HEAD
216
+ [Unreleased]: https://github.com/Denis-Zickuhr/optikos/compare/v0.4.0...HEAD
217
+ [0.4.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.3.0...v0.4.0
161
218
  [0.3.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.2.0...v0.3.0
162
219
  [0.2.0]: https://github.com/Denis-Zickuhr/optikos/compare/v0.1.0...v0.2.0
163
220
  [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": "2EAyBA,IAAMA,EAAWC,GAA2B,CAAC,CAACA,GAAK,OAAQA,EAAY,KAAQ,YAAc,SAAWA,EAGjG,SAASC,EAAUC,EAA0B,CAAC,EAAc,CACjE,IAAMC,EAA4B,gBAAgBD,EAAO,MAAQ,CAAC,CAAC,EAC7DE,EAAW,IAAI,IACfC,EAAS,IAAI,IACbC,EAAQ,IAAI,IACZC,EAAW,IAAI,IACfC,EAAOC,GAAiBL,EAAS,IAAIK,CAAI,IAAML,EAAS,IAAIK,EAAMC,EAAO,CAAC,CAAC,EAAGN,EAAS,IAAIK,CAAI,GAE/FE,EAAgB,CACpB,IAAIF,EAAM,CACRD,EAAIC,CAAI,EAAE,EACV,IAAMG,EAAOH,EAAK,MAAM,GAAG,EAAE,CAAC,EAC9B,GAAIP,EAAO,UAAYU,KAAQV,EAAO,SAAU,CAC9C,IAAI,EAAIK,EAAS,IAAIK,CAAI,EACzB,OAAK,GAAGL,EAAS,IAAIK,EAAO,EAAIC,EAAS,IAAMX,EAAO,SAAUU,CAAI,EAAED,EAAG,GAAG,CAAC,CAAE,EACxEG,EAAQ,CAAE,CAACF,CAAI,EAAG,EAAE,CAAE,EAAGH,CAAI,CACtC,CACA,OAAOK,EAAQX,EAAMM,CAAI,CAC3B,EACA,IAAIA,EAAMM,EAAO,CACf,GAAM,CAACH,EAAM,GAAGI,CAAI,EAAIP,EAAK,MAAM,GAAG,EACtC,GAAIP,EAAO,UAAYU,KAAQV,EAAO,SAAU,MAAM,IAAI,MAAM,uBAAuBU,CAAI,kCAAkC,EAC7H,IAAMK,EAAQZ,EAAO,IAAIO,CAAI,EACzBK,GAASD,EAAK,SAAW,EAAGC,EAAM,IAAID,EAAK,CAAC,EAAGD,CAAK,EACnDG,EAAQf,EAAMM,EAAMM,CAAK,EAC9B,OAAW,CAACI,EAAGC,CAAC,IAAKhB,GAAce,IAAMV,GAAQU,EAAE,WAAW,GAAGV,CAAI,GAAG,GAAKA,EAAK,WAAW,GAAGU,CAAC,GAAG,IAAGC,EAAE,OAAQC,GAAMA,EAAI,CAAC,CAC9H,EACA,KAAKC,EAAMC,EAAQ,CACbxB,EAAQwB,CAAM,GAAIlB,EAAO,IAAIiB,EAAMC,CAAM,EAAIpB,EAAKmB,CAAI,EAAIC,EAAO,OAC/DlB,EAAO,OAAOiB,CAAI,EAAInB,EAAKmB,CAAI,EAAIC,IACxCjB,EAAM,IAAIgB,CAAI,IAAMhB,EAAM,IAAIgB,EAAMZ,EAAO,CAAC,CAAC,EAAGJ,EAAM,IAAIgB,CAAI,IAAK,OAAQD,GAAMA,EAAI,CAAC,EACvF,OAAW,CAACF,EAAGC,CAAC,IAAKhB,GAAce,IAAMG,GAAQH,EAAE,WAAW,GAAGG,CAAI,GAAG,IAAGF,EAAE,OAAQC,GAAMA,EAAI,CAAC,CAClG,EACA,OAASC,IAAUhB,EAAM,IAAIgB,CAAI,IAAMhB,EAAM,IAAIgB,EAAMZ,EAAO,CAAC,CAAC,EAAGJ,EAAM,IAAIgB,CAAI,IAAK,CACxF,EACA,OAAOX,CACT,CAMA,SAASa,EAAOb,EAAec,EAA6B,CAC1D,IAAMC,EAAQ,qBAAqB,KAAKD,CAAI,EAC5C,OAAIC,EAAc,IAAOA,EAAM,CAAC,EAAI,CAACf,EAAG,IAAIe,EAAM,CAAC,CAAC,EAAIf,EAAG,IAAIe,EAAM,CAAC,CAAC,EAChE,IAAMD,EAAK,QAAQ,gBAAiB,CAACE,EAAGR,IAAM,OAAOR,EAAG,IAAIQ,CAAC,GAAK,EAAE,CAAC,CAC9E,CAMO,SAASS,EAAOC,EAAqBlB,EAAemB,EAAmC,CAC5F,IAAMC,EAAyC,CAAC,EAChD,QAAWC,KAAOF,EAAKC,EAAQC,CAAG,EAAIR,EAAOb,EAAImB,EAAIE,CAAG,CAAC,EACzDC,EAAKJ,EAAKE,CAAO,EACjB,IAAMG,EAAM,iBAAiB,KAAKJ,EAAI,OAAS,EAAE,EAC7CI,GAAKL,EAAI,IAAIA,EAAI,GAAG,SAAW7B,GAAMW,EAAG,IAAIuB,EAAI,CAAC,EAAGlC,CAAC,CAAC,CAAC,CAC7D,CAMO,SAASmC,EAASC,EAA2DzB,EAAeW,EAAO,SAAgB,CACxH,QAAWe,KAAKD,EAAK,UAAU,EAAG,CAChC,GAAI,CAACC,EAAE,KAAM,SACb,IAAIC,EAAO,GACL7B,EAAO,GAAGa,CAAI,IAAIe,EAAE,IAAI,GAC9BD,EAAK,IACHG,EAAO,IAAM,CACX,IAAMC,EAAM7B,EAAG,OAAOW,CAAI,EACpBtB,EAAIW,EAAG,IAAIF,CAAI,EACrB4B,EAAE,SAASrC,IAAM,OAAYqC,EAAE,SAAS,EAAIrC,EAAG,EAAI,EAC/CwC,IAAQF,IAAOD,EAAE,UAAU,EAAIC,EAAOE,EAC5C,CAAC,CACH,EACAJ,EAAK,IAAIC,EAAE,GAAG,SAAWrC,GAAMW,EAAG,IAAIW,CAAI,GAAKX,EAAG,IAAIF,EAAMT,CAAC,CAAC,CAAC,CACjE,CACF,CCtGA,IAAIyC,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,EACEH,EAAY,CAChB,KAAM,IAAI,IACV,KAAM,CACJ,QAAWI,KAAKJ,EAAE,KAAMI,EAAE,OAAOJ,CAAC,EAClCA,EAAE,KAAK,MAAM,EACbG,IAAU,EACV,IAAME,EAAOZ,EACbA,EAAUO,EACV,GAAI,CACFG,EAAUF,EAAG,CACf,QAAE,CACAR,EAAUY,CACZ,CACF,CACF,EACA,OAAAL,EAAE,IAAI,EACC,IAAM,CACX,QAAWI,KAAKJ,EAAE,KAAMI,EAAE,OAAOJ,CAAC,EAClCA,EAAE,KAAK,MAAM,EACbG,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": ["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
  }
package/dist/build.js ADDED
@@ -0,0 +1,2 @@
1
+ import{a,b,c,d,e}from"./chunk-632LUU52.js";import"./chunk-4OB2IM5L.js";import"./chunk-UCWICDYG.js";import"./chunk-OADWLPSF.js";import"./chunk-ADHKL2GM.js";import"./chunk-2I7HDIOU.js";import"./chunk-SEUIIPHS.js";import"./chunk-BRGT4O6Q.js";import"./chunk-3OA3P37P.js";import"./chunk-QOSTS5I3.js";import"./chunk-TVO3Z2BM.js";import"./chunk-G26R2F3W.js";import"./chunk-6TZJO2G2.js";import"./chunk-S3ILIWSW.js";import"./chunk-BTGJ3MP4.js";import"./chunk-AJN66F32.js";import"./chunk-L6DOWGBO.js";import"./chunk-H25XXQVH.js";import"./chunk-5GCTM37D.js";import"./chunk-NAUSRVB6.js";import"./chunk-EO777UIN.js";import"./chunk-FSR6BDVO.js";import"./chunk-J5BZAKC6.js";import"./chunk-T5OGUCY2.js";import"./chunk-OB3VIRQR.js";import"./chunk-GEJKFE4X.js";import"./chunk-LXWCTCZV.js";import"./chunk-JBOKM5YA.js";import"./chunk-Z6HZY2YG.js";import"./chunk-U25QSLAH.js";import"./chunk-HRW25TMU.js";import"./chunk-3F4MN2BU.js";import"./chunk-SEW5OCQF.js";import"./chunk-LHWY6G6Q.js";import"./chunk-MQEALOU3.js";import"./chunk-6NP4AEV4.js";import"./chunk-AQ3RTHG5.js";import"./chunk-BCVOUMJJ.js";import"./chunk-ESRS5ZQV.js";import"./chunk-DIOJGTUN.js";import"./chunk-2GKIF7A6.js";import"./chunk-OWEQT2HN.js";import"./chunk-BQEFLPDA.js";import"./chunk-QVBDBGS4.js";import"./chunk-E4VNLYO2.js";import"./chunk-676AKAGF.js";import"./chunk-VV7CFMPZ.js";import"./chunk-TIPK3SCJ.js";import"./chunk-UDXO3KM3.js";import"./chunk-PZSHOSOS.js";import"./chunk-IODSL7KU.js";import"./chunk-XFDNXSU5.js";import"./chunk-L5SQQFO7.js";import"./chunk-3VDLX7ET.js";import"./chunk-S4QD5NID.js";import"./chunk-6NCXO5ZP.js";import"./chunk-4AA4FQEM.js";import"./chunk-2UPUC4RK.js";import"./chunk-V5G5JECN.js";import"./chunk-4C666HHU.js";export{a as buildColumns,b as buildFields,c as buildFilterFields,e as buildForm,d as buildGrid};
2
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,3 @@
1
+ import{b as S}from"./chunk-MGSCSS7X.js";import{a as A}from"./chunk-JBOKM5YA.js";import{a as E}from"./chunk-MQEALOU3.js";import{c as T}from"./chunk-DIOJGTUN.js";import{b as d}from"./chunk-PZSHOSOS.js";import{b as _}from"./chunk-IODSL7KU.js";import{b as L}from"./chunk-XFDNXSU5.js";import{e as h,f as c}from"./chunk-S4QD5NID.js";h("en",{ctActions:"Column actions: {col}",ctNone:"No total",ctSum:"Sum",ctAvg:"Average",ctMin:"Minimum",ctMax:"Maximum",ctCount:"Count",ctEarliest:"Earliest",ctLatest:"Latest",ctTotals:"Totals",ctResult:"{op} of {col}: {value}",ctRows:"{n} rows"});h("pt-BR",{ctActions:"A\xE7\xF5es da coluna: {col}",ctNone:"Sem total",ctSum:"Soma",ctAvg:"M\xE9dia",ctMin:"M\xEDnimo",ctMax:"M\xE1ximo",ctCount:"Contagem",ctEarliest:"Mais antiga",ctLatest:"Mais recente",ctTotals:"Totais",ctResult:"{op} de {col}: {value}",ctRows:"{n} linhas"});var O=["sum","avg","min","max","count"],k={sum:"ctSum",avg:"ctAvg",min:"ctMin",max:"ctMax",count:"ctCount"},I={number:O,date:["min","max","count"],text:["count"]},q=(i,s)=>{let n=s.map(m=>m.data[i.field]).find(m=>m!=null&&m!=="");return n instanceof Date||typeof n=="string"&&/^\d{4}-\d{2}-\d{2}/.test(n)?"date":typeof n=="number"||typeof n=="string"&&n.trim()!==""&&!isNaN(Number(n))?"number":"text"};function D(i={}){return{init(s){let n=d("div","op-columntotals",{role:"group","aria-label":c("ctTotals")});n.hidden=!0;let m=new E({}),g=s.getStore(),f=()=>g.getFiltered(),v=i.operations??[],b=t=>typeof t.summary=="function"?v.find(l=>l.run===t.summary)?.text:t.summary&&c(k[t.summary]),x=(t,l)=>{let e=_(t,l);return t.summaryRenderer?t.summaryRenderer(e,t):e==null?"":t.format&&typeof t.summary!="function"&&t.summary!=="count"?L(t.format,e):String(e)};function R(t,l){let e=f(),o={...t,summary:l},a=x(o,e),u=c("ctResult",{op:b(o)??"",col:t.header??t.field,value:typeof a=="string"?a:a.textContent??""}),r=c("ctRows",{n:e.length});i.show==="toast"?S({type:"info",title:u,text:r}):A.alert(`${u}
2
+ ${r}`,{title:c("ctTotals"),icon:"info"})}function p(){let t=s.getColumns();if(n.hidden=(i.show??"bar")!=="bar"||!t.some(o=>o.summary),n.hidden)return;let l=f(),e=o=>{let a=d("div","op-columntotals__cell"+(o?.align?` op-columntotals__cell--${o.align}`:""),C?{role:"gridcell"}:{});return o?.summary&&a.append(d("span","op-columntotals__op",{},b(o)??""),x(o,l)),a};n.replaceChildren(...s.config.checkboxSelection?[e()]:[],...t.map(e),...s.config.rowActions?.length?[e()]:[])}function N(t,l){let e=q(t,f()),o=i.show===void 0||i.show==="bar",a=r=>{if(!o)return R(t,r);t.summary=t.summary===r?void 0:r,p()},u=r=>o?t.summary===r:void 0;m.setItems([...I[e].map(r=>({text:e==="date"&&r!=="count"?c(r==="min"?"ctEarliest":"ctLatest"):c(k[r]),checked:u(r),handler:()=>a(r)})),...v.map(r=>({text:r.text,checked:u(r.run),handler:()=>a(r.run)})),...o?["-",{text:c("ctNone"),disabled:!t.summary,handler:()=>a(t.summary)}]:[]]),m.showBy(l)}function M(){let t=s.getColumns();for(let l of Array.from(s.el.querySelectorAll(".op-grid__hcell[data-field]"))){let e=t.find(a=>a.field===l.dataset.field);if(!e)continue;let o=d("button","op-columntotals__btn",{type:"button","aria-haspopup":"menu","aria-label":c("ctActions",{col:e.header??e.field})},T("more"));for(let a of["click","pointerdown","keydown"])o.addEventListener(a,u=>u.stopPropagation());o.addEventListener("click",()=>N(e,o)),l.append(o)}p()}let C=i.position==="top";C?(n.classList.add("op-columntotals--top"),n.setAttribute("role","row"),s.el.querySelector(".op-grid__header").after(n)):s.el.querySelector(".op-grid__table").after(n);let y=s.el.querySelector(".op-grid__viewport"),w=()=>n.scrollLeft=y.scrollLeft;y.addEventListener("scroll",w);let B=[s.on("header-paint",M),g.subscribe(p)];return M(),()=>{B.forEach(t=>t()),y.removeEventListener("scroll",w),m.destroy(),n.remove()}}}}export{D as a};
3
+ //# sourceMappingURL=chunk-2CVMT3IW.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/columntotals/columntotals.ts"],
4
+ "sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { format } from '../../../data/format';\nimport { summarize, type Column } from '../../../data/column';\nimport type { Model } from '../../../data/model';\nimport { Menu } from '../../overlays/menu/menu';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\nimport { toast } from '../../overlays/toast/toast';\nimport { iconEl } from '../../base/icon/icon';\nimport type { Grid, GridPlugin } from '../grid/grid';\n\naddMessages('en', { ctActions: 'Column actions: {col}', ctNone: 'No total', ctSum: 'Sum', ctAvg: 'Average', ctMin: 'Minimum', ctMax: 'Maximum', ctCount: 'Count', ctEarliest: 'Earliest', ctLatest: 'Latest', ctTotals: 'Totals', ctResult: '{op} of {col}: {value}', ctRows: '{n} rows' });\naddMessages('pt-BR', { ctActions: 'A\u00E7\u00F5es da coluna: {col}', ctNone: 'Sem total', ctSum: 'Soma', ctAvg: 'M\u00E9dia', ctMin: 'M\u00EDnimo', ctMax: 'M\u00E1ximo', ctCount: 'Contagem', ctEarliest: 'Mais antiga', ctLatest: 'Mais recente', ctTotals: 'Totais', ctResult: '{op} de {col}: {value}', ctRows: '{n} linhas' });\n\n/** An operation offered in the column menu besides the built-in ones. */\nexport interface TotalOperation {\n text: string;\n /** The column's values and the records of every filtered row. */\n run: (values: any[], recs: Model[]) => unknown;\n}\n\nexport interface ColumnTotalsOptions {\n /** Your own operations (a median, a weighted mean...). Offered on every column. */\n operations?: TotalOperation[];\n /**\n * Where the answer goes: `'bar'` (default) keeps it in a bar under the grid; `'modal'` answers in a dialog and `'toast'` in a\n * notice, once, and nothing stays on the grid.\n */\n show?: 'bar' | 'modal' | 'toast';\n /** `bar` only: under the grid (default) or `'top'`, right under the header, above the rows (a row of the grid itself). */\n position?: 'bottom' | 'top';\n}\n\ntype Kind = 'number' | 'date' | 'text';\nconst BUILT_IN = ['sum', 'avg', 'min', 'max', 'count'] as const;\nconst LABEL = { sum: 'ctSum', avg: 'ctAvg', min: 'ctMin', max: 'ctMax', count: 'ctCount' } as const;\nconst FOR: Record<Kind, readonly (typeof BUILT_IN)[number][]> = { number: BUILT_IN, date: ['min', 'max', 'count'], text: ['count'] };\n\nconst kindOf = (col: Column, recs: Model[]): Kind => {\n const v = recs.map((r) => r.data[col.field]).find((x) => x != null && x !== '');\n if (v instanceof Date || (typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(v))) return 'date';\n return typeof v === 'number' || (typeof v === 'string' && v.trim() !== '' && !isNaN(Number(v))) ? 'number' : 'text';\n};\n\n/**\n * A button on every column header opens a menu of totals (sum, average, minimum, maximum, count, your own); the choice\n * shows in a bar under the grid, over every filtered row. A column's `summary` is where it starts and where it is kept.\n */\nexport function columnTotals(options: ColumnTotalsOptions = {}): GridPlugin {\n return {\n init(grid: Grid) {\n const bar = h('div', 'op-columntotals', { role: 'group', 'aria-label': t('ctTotals') });\n bar.hidden = true;\n const menu = new Menu({});\n const store = grid.getStore();\n const rows = () => store.getFiltered();\n const custom = options.operations ?? [];\n const active = (col: Column) => (typeof col.summary === 'function' ? custom.find((o) => o.run === col.summary)?.text : col.summary && t(LABEL[col.summary as keyof typeof LABEL]));\n\n const valueOf = (c: Column, recs: Model[]) => {\n const v = summarize(c, recs);\n return c.summaryRenderer ? c.summaryRenderer(v, c) : v == null ? '' : c.format && typeof c.summary !== 'function' && c.summary !== 'count' ? format(c.format, v) : String(v);\n };\n\n /** `modal` and `toast`: the answer for one choice, without touching the column. */\n function announce(col: Column, summary: Column['summary']) {\n const recs = rows();\n const once = { ...col, summary };\n const value = valueOf(once, recs);\n const text = t('ctResult', { op: active(once) ?? '', col: col.header ?? col.field, value: typeof value === 'string' ? value : value.textContent ?? '' });\n const detail = t('ctRows', { n: recs.length });\n if (options.show === 'toast') toast({ type: 'info', title: text, text: detail });\n else void MessageBox.alert(`${text}\\n${detail}`, { title: t('ctTotals'), icon: 'info' });\n }\n\n function paintBar() {\n const cols = grid.getColumns();\n bar.hidden = (options.show ?? 'bar') !== 'bar' || !cols.some((c) => c.summary);\n if (bar.hidden) return;\n const recs = rows();\n const cell = (c?: Column) => {\n const el = h('div', 'op-columntotals__cell' + (c?.align ? ` op-columntotals__cell--${c.align}` : ''), top ? { role: 'gridcell' } : {});\n if (c?.summary) el.append(h('span', 'op-columntotals__op', {}, active(c) ?? ''), valueOf(c, recs));\n return el;\n };\n bar.replaceChildren(...(grid.config.checkboxSelection ? [cell()] : []), ...cols.map(cell), ...(grid.config.rowActions?.length ? [cell()] : []));\n }\n\n function open(col: Column, btn: HTMLElement) {\n const kind = kindOf(col, rows());\n const bar_ = options.show === undefined || options.show === 'bar';\n const pick = (summary: Column['summary']) => {\n if (!bar_) return announce(col, summary);\n col.summary = col.summary === summary ? undefined : summary;\n paintBar();\n };\n const checked = (summary: Column['summary']) => (bar_ ? col.summary === summary : undefined);\n menu.setItems([\n ...FOR[kind].map((op) => ({ text: kind === 'date' && op !== 'count' ? t(op === 'min' ? 'ctEarliest' : 'ctLatest') : t(LABEL[op]), checked: checked(op), handler: () => pick(op) })),\n ...custom.map((o) => ({ text: o.text, checked: checked(o.run), handler: () => pick(o.run) })),\n ...(bar_ ? ['-', { text: t('ctNone'), disabled: !col.summary, handler: () => pick(col.summary) }] : []),\n ]);\n menu.showBy(btn);\n }\n\n function paintHeader() {\n const cols = grid.getColumns();\n for (const cell of Array.from(grid.el.querySelectorAll<HTMLElement>('.op-grid__hcell[data-field]'))) {\n const col = cols.find((c) => c.field === cell.dataset.field);\n if (!col) continue;\n const btn = h('button', 'op-columntotals__btn', { type: 'button', 'aria-haspopup': 'menu', 'aria-label': t('ctActions', { col: col.header ?? col.field }) }, iconEl('more'));\n // the header cell sorts and drags: the button must not start either\n for (const ev of ['click', 'pointerdown', 'keydown']) btn.addEventListener(ev, (e) => e.stopPropagation());\n btn.addEventListener('click', () => open(col, btn));\n cell.append(btn);\n }\n paintBar();\n }\n\n const top = options.position === 'top';\n if (top) {\n bar.classList.add('op-columntotals--top');\n bar.setAttribute('role', 'row');\n grid.el.querySelector('.op-grid__header')!.after(bar);\n } else grid.el.querySelector('.op-grid__table')!.after(bar);\n const viewport = grid.el.querySelector<HTMLElement>('.op-grid__viewport')!;\n const follow = () => (bar.scrollLeft = viewport.scrollLeft);\n viewport.addEventListener('scroll', follow);\n const offs = [grid.on('header-paint', paintHeader), store.subscribe(paintBar)];\n paintHeader();\n return () => {\n offs.forEach((off) => off());\n viewport.removeEventListener('scroll', follow);\n menu.destroy();\n bar.remove();\n };\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "BUILT_IN", "LABEL", "FOR", "kindOf", "col", "recs", "v", "r", "x", "columnTotals", "options", "grid", "bar", "h", "t", "menu", "Menu", "store", "rows", "custom", "active", "o", "valueOf", "c", "summarize", "format", "announce", "summary", "once", "value", "text", "detail", "toast", "MessageBox", "paintBar", "cols", "cell", "el", "top", "open", "btn", "kind", "bar_", "pick", "checked", "op", "paintHeader", "iconEl", "ev", "e", "viewport", "follow", "offs", "off"]
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
@@ -1,2 +1,2 @@
1
- import{a as m}from"./chunk-LQRFNQ2N.js";import{b as f}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{b as p}from"./chunk-PZSHOSOS.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{e as d,f as l}from"./chunk-MW3RWBZ7.js";d("en",{wDockLeft:"Dock to the left",wDockRight:"Dock to the right",wDockTop:"Dock to the top",wDockBottom:"Dock to the bottom",wResize:"Resize"});d("pt-BR",{wDockLeft:"Fixar \xE0 esquerda",wDockRight:"Fixar \xE0 direita",wDockTop:"Fixar em cima",wDockBottom:"Fixar embaixo",wResize:"Redimensionar"});var v=160,w={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},y={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},b=["right","left","top","bottom"],a=class extends m{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;grip;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:w[o],label:l(y[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.setResizable(!!e.resizable),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!b.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of b)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e));this.paintGrip()}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.paintGrip(),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.paintGrip(),this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=h=>this.moveTo(h.clientX-o,h.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}setResizable(e){if(this.config.resizable=e,!this.rendered||(this.grip?.remove(),this.grip=void 0,!e||this.config.floating===!1))return;let t=this.grip=p("div","op-widget__resize",{role:"separator",tabindex:0,"aria-label":l("wResize")});this.el.append(t),this.listen(t,"pointerdown",i=>{if(i.button)return;i.preventDefault();let o=this.el.getBoundingClientRect(),s=i.clientX,n=i.clientY;this.el.classList.add("is-resizing");let r=c=>this.resizeBy(o,c.clientX-s,c.clientY-n),h=()=>{this.el.classList.remove("is-resizing"),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",h)};document.addEventListener("pointermove",r),document.addEventListener("pointerup",h),this.own(h)}),this.listen(t,"keydown",i=>{let o=i.shiftKey?64:16,s={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]};!s[i.key]||i.altKey||(i.preventDefault(),this.resizeBy(this.el.getBoundingClientRect(),...s[i.key]))}),this.paintGrip()}resizeBy(e,t,i){let o=(n,r)=>Math.round(Math.max(v,Math.min(n,r)));if(this.pos)t&&(this.el.style.width=`${o(e.width+t,innerWidth-this.pos.x)}px`),i&&(this.el.style.height=`${o(e.height+i,innerHeight-this.pos.y)}px`);else{let n=this.getSide(),r=n==="left"||n==="right",h=n==="right"?-t:n==="left"?t:n==="bottom"?-i:i;this.setSize(o((r?e.width:e.height)+h,(r?innerWidth:innerHeight)-32))}this.paintGrip();let s=this.el.getBoundingClientRect();this.emit("resize",{width:Math.round(s.width),height:Math.round(s.height)})}paintGrip(){let e=this.grip;if(!e)return;let t=this.getSide(),i=!!this.pos||t==="left"||t==="right",o=this.el.getBoundingClientRect();e.setAttribute("aria-orientation",i?"vertical":"horizontal"),e.setAttribute("aria-valuemin",String(v)),e.setAttribute("aria-valuenow",String(Math.round(i?o.width:o.height)))}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,f(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),e.tabIndex<0&&!e.hasAttribute("tabindex")&&(e.tabIndex=-1),(this.config.autoFocus&&u(this.getBody())[0]||e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};g("widget",a);export{a};
2
- //# sourceMappingURL=chunk-5BC72727.js.map
1
+ import{a as m}from"./chunk-U25QSLAH.js";import{b as f}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{a as g}from"./chunk-TIPK3SCJ.js";import{b as p}from"./chunk-PZSHOSOS.js";import{e as d,f as l}from"./chunk-S4QD5NID.js";d("en",{wDockLeft:"Dock to the left",wDockRight:"Dock to the right",wDockTop:"Dock to the top",wDockBottom:"Dock to the bottom",wResize:"Resize"});d("pt-BR",{wDockLeft:"Fixar \xE0 esquerda",wDockRight:"Fixar \xE0 direita",wDockTop:"Fixar em cima",wDockBottom:"Fixar embaixo",wResize:"Redimensionar"});var v=160,w={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},y={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},b=["right","left","top","bottom"],a=class extends m{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;grip;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:w[o],label:l(y[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.setResizable(!!e.resizable),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!b.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of b)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e));this.paintGrip()}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.paintGrip(),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.paintGrip(),this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=h=>this.moveTo(h.clientX-o,h.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}setResizable(e){if(this.config.resizable=e,!this.rendered||(this.grip?.remove(),this.grip=void 0,!e||this.config.floating===!1))return;let t=this.grip=p("div","op-widget__resize",{role:"separator",tabindex:0,"aria-label":l("wResize")});this.el.append(t),this.listen(t,"pointerdown",i=>{if(i.button)return;i.preventDefault();let o=this.el.getBoundingClientRect(),s=i.clientX,n=i.clientY;this.el.classList.add("is-resizing");let r=c=>this.resizeBy(o,c.clientX-s,c.clientY-n),h=()=>{this.el.classList.remove("is-resizing"),document.removeEventListener("pointermove",r),document.removeEventListener("pointerup",h)};document.addEventListener("pointermove",r),document.addEventListener("pointerup",h),this.own(h)}),this.listen(t,"keydown",i=>{let o=i.shiftKey?64:16,s={ArrowLeft:[-o,0],ArrowRight:[o,0],ArrowUp:[0,-o],ArrowDown:[0,o]};!s[i.key]||i.altKey||(i.preventDefault(),this.resizeBy(this.el.getBoundingClientRect(),...s[i.key]))}),this.paintGrip()}resizeBy(e,t,i){let o=(n,r)=>Math.round(Math.max(v,Math.min(n,r)));if(this.pos)t&&(this.el.style.width=`${o(e.width+t,innerWidth-this.pos.x)}px`),i&&(this.el.style.height=`${o(e.height+i,innerHeight-this.pos.y)}px`);else{let n=this.getSide(),r=n==="left"||n==="right",h=n==="right"?-t:n==="left"?t:n==="bottom"?-i:i;this.setSize(o((r?e.width:e.height)+h,(r?innerWidth:innerHeight)-32))}this.paintGrip();let s=this.el.getBoundingClientRect();this.emit("resize",{width:Math.round(s.width),height:Math.round(s.height)})}paintGrip(){let e=this.grip;if(!e)return;let t=this.getSide(),i=!!this.pos||t==="left"||t==="right",o=this.el.getBoundingClientRect();e.setAttribute("aria-orientation",i?"vertical":"horizontal"),e.setAttribute("aria-valuemin",String(v)),e.setAttribute("aria-valuenow",String(Math.round(i?o.width:o.height)))}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,f(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),e.tabIndex<0&&!e.hasAttribute("tabindex")&&(e.tabIndex=-1),(this.config.autoFocus&&u(this.getBody())[0]||e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};g("widget",a);export{a};
2
+ //# sourceMappingURL=chunk-2I4Y7I7C.js.map
@@ -1,2 +1,2 @@
1
- import{a as m}from"./chunk-2ZRNGG2N.js";import{e as p}from"./chunk-6NCXO5ZP.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as u}from"./chunk-TIPK3SCJ.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
2
- //# sourceMappingURL=chunk-Z2Z52GFT.js.map
1
+ import{a as m}from"./chunk-QVBDBGS4.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as p}from"./chunk-6NCXO5ZP.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
2
+ //# sourceMappingURL=chunk-2I7HDIOU.js.map
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ import{a as b}from"./chunk-IODSL7KU.js";var U={csv:"text/csv;charset=utf-8",xlsx:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},y=new TextEncoder,T=t=>typeof t=="string"?t:t.textContent??"",E=t=>/[",\n\r;]/.test(t)?`"${t.replace(/"/g,'""')}"`:t,A=t=>/^[=+@]/.test(t)||/^-[^\d.,]/.test(t)?`'${t}`:t;function k(t,r){let e=t.getColumns();return{head:e.map(n=>n.header??n.field),rows:r.map(n=>e.map(o=>{let c=n.data[o.field];return typeof c=="number"&&!o.format&&!o.renderer?c:A(T(b(o,n)))}))}}var w=(()=>{let t=Array.from({length:256},(r,e)=>{for(let n=0;n<8;n++)e=e&1?3988292384^e>>>1:e>>>1;return e>>>0});return r=>{let e=-1;for(let n of r)e=t[(e^n)&255]^e>>>8;return~e>>>0}})();function C(t){let r=[],e=[],n=0,o=(p,l,a)=>p.setUint32(l,a,!0);for(let[p,l]of Object.entries(t)){let a=y.encode(p),i=y.encode(l),u=new Uint8Array(30+a.length),f=new DataView(u.buffer);o(f,0,67324752),f.setUint16(4,20,!0),f.setUint16(6,2048,!0),o(f,14,w(i)),o(f,18,i.length),o(f,22,i.length),f.setUint16(26,a.length,!0),u.set(a,30);let g=new Uint8Array(46+a.length),h=new DataView(g.buffer);o(h,0,33639248),h.setUint16(4,20,!0),h.setUint16(6,20,!0),h.setUint16(8,2048,!0),o(h,16,w(i)),o(h,20,i.length),o(h,24,i.length),h.setUint16(28,a.length,!0),o(h,42,n),g.set(a,46),e.push(g),r.push(u,i),n+=u.length+i.length}let c=e.reduce((p,l)=>p+l.length,0),s=new Uint8Array(22),m=new DataView(s.buffer);o(m,0,101010256),m.setUint16(8,e.length,!0),m.setUint16(10,e.length,!0),o(m,12,c),o(m,16,n);let d=new Uint8Array(n+c+22),x=0;for(let p of[...r,...e,s])d.set(p,x),x+=p.length;return d}var S=t=>t.replace(/[&<>"]/g,r=>`&#${r.charCodeAt(0)};`).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g,""),v=(t,r)=>{let e="";for(let n=t+1;n>0;n=Math.floor((n-1)/26))e=String.fromCharCode(65+(n-1)%26)+e;return e+(r+1)};function R(t,r){let e=(c,s,m,d=!1)=>typeof c=="number"?`<c r="${v(s,m)}"><v>${c}</v></c>`:`<c r="${v(s,m)}" t="inlineStr"${d?' s="1"':""}><is><t xml:space="preserve">${S(c)}</t></is></c>`,o={"[Content_Types].xml":'<?xml version="1.0" encoding="UTF-8"?><Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/><Default Extension="xml" ContentType="application/xml"/><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"/><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml"/></Types>',"_rels/.rels":'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/></Relationships>',"xl/workbook.xml":'<?xml version="1.0" encoding="UTF-8"?><workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><sheets><sheet name="Sheet1" sheetId="1" r:id="rId1"/></sheets></workbook>',"xl/_rels/workbook.xml.rels":'<?xml version="1.0" encoding="UTF-8"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Target="worksheets/sheet1.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/></Relationships>',"xl/styles.xml":'<?xml version="1.0" encoding="UTF-8"?><styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><fonts count="2"><font><sz val="11"/><name val="Calibri"/></font><font><b/><sz val="11"/><name val="Calibri"/></font></fonts><fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills><borders count="1"><border/></borders><cellStyleXfs count="1"><xf/></cellStyleXfs><cellXfs count="2"><xf/><xf fontId="1" applyFont="1"/></cellXfs></styleSheet>',"xl/worksheets/sheet1.xml":`<?xml version="1.0" encoding="UTF-8"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><sheetData>${[t,...r].map((c,s)=>`<row r="${s+1}">${c.map((m,d)=>e(m,d,s,s===0)).join("")}</row>`).join("")}</sheetData></worksheet>`};return new Blob([C(o)],{type:U.xlsx})}async function O(t,r={}){let{format:e="csv",filename:n="export",scope:o="all",download:c=!0}=r,s=t.getStore(),m=o==="page"?s.getRange():await s.fetchAll(r.pageSize),{head:d,rows:x}=k(t,m),p=e==="xlsx"?R(d,x):new Blob(["\uFEFF"+[d,...x].map(l=>l.map(a=>E(String(a))).join(",")).join(`\r
2
+ `)],{type:U.csv});if(c){let l=document.createElement("a");l.href=URL.createObjectURL(p),l.download=`${n}.${e}`,document.body.append(l),l.click(),l.remove(),setTimeout(()=>URL.revokeObjectURL(l.href),1e3)}return p}async function $(t,r={}){let e=t.getStore(),n=r.scope==="page"?e.getRange():await e.fetchAll(r.pageSize),{head:o,rows:c}=k(t,n),s=document.createElement("div");s.className="op-print-sheet";let m=(a,i)=>Object.assign(document.createElement(a),{textContent:String(i)}),d=(a,i)=>{let u=document.createElement("tr");return u.append(...i.map(f=>m(a,f))),u},x=document.createElement("table"),p=document.createElement("thead");p.append(d("th",o));let l=document.createElement("tbody");l.append(...c.map(a=>d("td",a))),x.append(p,l),r.title&&s.append(Object.assign(document.createElement("h1"),{textContent:r.title})),s.append(x),document.body.append(s),document.documentElement.classList.add("op-printing"),await new Promise(a=>{let i=()=>{window.removeEventListener("afterprint",i),s.remove(),document.documentElement.classList.remove("op-printing"),a()};window.addEventListener("afterprint",i),window.print(),typeof matchMedia!="function"&&setTimeout(i,0)})}export{O as a,$ as b};
3
+ //# sourceMappingURL=chunk-34KVSA2V.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/gridexport/gridexport.ts"],
4
+ "sourcesContent": ["// Grid export as CSV or Excel (.xlsx), without a library: the columns the user sees, in their order, as shown (formats applied).\nimport { cellContent } from '../../../data/column';\nimport type { Model } from '../../../data/model';\nimport type { Grid } from '../grid/grid';\n\nexport interface ExportOptions {\n format?: 'csv' | 'xlsx';\n /** File name without extension. Default `export`. */\n filename?: string;\n /** `all` (default): every record that matches the sort and filters, across pages (a remote store is read through its proxy). `page`: what the grid shows now. */\n scope?: 'all' | 'page';\n /** Page size for reading a remote store. Default 500. */\n pageSize?: number;\n /** `false` only builds the file and returns it. Default true: the browser downloads it. */\n download?: boolean;\n}\n\nconst MIME = { csv: 'text/csv;charset=utf-8', xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' };\nconst enc = new TextEncoder();\n\nconst textOf = (v: string | Node) => (typeof v === 'string' ? v : (v.textContent ?? ''));\nconst csvCell = (s: string) => (/[\",\\n\\r;]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s);\n// a cell starting with = + - @ would run as a formula in a spreadsheet\nconst safe = (s: string) => (/^[=+@]/.test(s) || /^-[^\\d.,]/.test(s) ? `'${s}` : s);\n\nfunction table(grid: Grid, recs: Model[]): { head: string[]; rows: Array<Array<string | number>> } {\n const cols = grid.getColumns();\n return {\n head: cols.map((c) => c.header ?? c.field),\n rows: recs.map((r) =>\n cols.map((c) => {\n const raw = r.data[c.field];\n // a number nobody formatted stays a number in Excel\n return typeof raw === 'number' && !c.format && !c.renderer ? raw : safe(textOf(cellContent(c, r)));\n }),\n ),\n };\n}\n\nconst crc = (() => {\n const t = Array.from({ length: 256 }, (_, n) => {\n for (let k = 0; k < 8; k++) n = n & 1 ? 0xedb88320 ^ (n >>> 1) : n >>> 1;\n return n >>> 0;\n });\n return (b: Uint8Array) => {\n let c = ~0;\n for (const x of b) c = t[(c ^ x) & 255] ^ (c >>> 8);\n return ~c >>> 0;\n };\n})();\n\n/** A zip with the files stored uncompressed: all an .xlsx needs. */\nfunction zip(files: Record<string, string>): Uint8Array {\n const parts: Uint8Array[] = [];\n const central: Uint8Array[] = [];\n let offset = 0;\n const u32 = (v: DataView, o: number, n: number) => v.setUint32(o, n, true);\n for (const [name, text] of Object.entries(files)) {\n const nameB = enc.encode(name);\n const data = enc.encode(text);\n const head = new Uint8Array(30 + nameB.length);\n const v = new DataView(head.buffer);\n u32(v, 0, 0x04034b50);\n v.setUint16(4, 20, true);\n v.setUint16(6, 0x800, true); // UTF-8 names\n u32(v, 14, crc(data));\n u32(v, 18, data.length);\n u32(v, 22, data.length);\n v.setUint16(26, nameB.length, true);\n head.set(nameB, 30);\n const entry = new Uint8Array(46 + nameB.length);\n const e = new DataView(entry.buffer);\n u32(e, 0, 0x02014b50);\n e.setUint16(4, 20, true);\n e.setUint16(6, 20, true);\n e.setUint16(8, 0x800, true);\n u32(e, 16, crc(data));\n u32(e, 20, data.length);\n u32(e, 24, data.length);\n e.setUint16(28, nameB.length, true);\n u32(e, 42, offset);\n entry.set(nameB, 46);\n central.push(entry);\n parts.push(head, data);\n offset += head.length + data.length;\n }\n const size = central.reduce((n, c) => n + c.length, 0);\n const end = new Uint8Array(22);\n const v = new DataView(end.buffer);\n u32(v, 0, 0x06054b50);\n v.setUint16(8, central.length, true);\n v.setUint16(10, central.length, true);\n u32(v, 12, size);\n u32(v, 16, offset);\n const all = new Uint8Array(offset + size + 22);\n let at = 0;\n for (const p of [...parts, ...central, end]) (all.set(p, at), (at += p.length));\n return all;\n}\n\nconst xml = (s: string) => s.replace(/[&<>\"]/g, (c) => `&#${c.charCodeAt(0)};`).replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]/g, '');\nconst ref = (col: number, row: number) => {\n let s = '';\n for (let n = col + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s;\n return s + (row + 1);\n};\n\nfunction xlsx(head: string[], rows: Array<Array<string | number>>): Blob {\n const cell = (v: string | number, c: number, r: number, bold = false) =>\n typeof v === 'number' ? `<c r=\"${ref(c, r)}\"><v>${v}</v></c>` : `<c r=\"${ref(c, r)}\" t=\"inlineStr\"${bold ? ' s=\"1\"' : ''}><is><t xml:space=\"preserve\">${xml(v)}</t></is></c>`;\n const lines = [head, ...rows].map((row, r) => `<row r=\"${r + 1}\">${row.map((v, c) => cell(v, c, r, r === 0)).join('')}</row>`);\n const files = {\n '[Content_Types].xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/><Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/><Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/></Types>',\n '_rels/.rels': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/></Relationships>',\n 'xl/workbook.xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><sheets><sheet name=\"Sheet1\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>',\n 'xl/_rels/workbook.xml.rels': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/></Relationships>',\n 'xl/styles.xml': '<?xml version=\"1.0\" encoding=\"UTF-8\"?><styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><fonts count=\"2\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font><font><b/><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts><fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills><borders count=\"1\"><border/></borders><cellStyleXfs count=\"1\"><xf/></cellStyleXfs><cellXfs count=\"2\"><xf/><xf fontId=\"1\" applyFont=\"1\"/></cellXfs></styleSheet>',\n 'xl/worksheets/sheet1.xml': `<?xml version=\"1.0\" encoding=\"UTF-8\"?><worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><sheetData>${lines.join('')}</sheetData></worksheet>`,\n };\n return new Blob([zip(files) as BlobPart], { type: MIME.xlsx });\n}\n\n/**\n * Exports a grid: the visible columns in their current order, values as shown (money, dates...), the current sort and filters.\n * Resolves with the file; downloads it unless `download: false`.\n */\nexport async function exportGrid(grid: Grid, o: ExportOptions = {}): Promise<Blob> {\n const { format = 'csv', filename = 'export', scope = 'all', download = true } = o;\n const store = grid.getStore();\n const recs = scope === 'page' ? store.getRange() : await store.fetchAll(o.pageSize);\n const { head, rows } = table(grid, recs);\n const blob =\n format === 'xlsx'\n ? xlsx(head, rows)\n : // the BOM makes Excel read UTF-8\n new Blob(['\uFEFF' + [head, ...rows].map((r) => r.map((v) => csvCell(String(v))).join(',')).join('\\r\\n')], { type: MIME.csv });\n if (download) {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = `${filename}.${format}`;\n document.body.append(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(a.href), 1000);\n }\n return blob;\n}\n\nexport interface PrintOptions {\n /** A heading above the table. */\n title?: string;\n /** `all` (default) prints every record that matches the filters, which the virtual list on screen does not render. */\n scope?: 'all' | 'page';\n pageSize?: number;\n}\n\n/**\n * Prints a grid as a plain table: every row, the visible columns, the header repeated on each page, and none of the\n * application around it. Resolves after the print dialog closed.\n */\nexport async function printGrid(grid: Grid, o: PrintOptions = {}): Promise<void> {\n const store = grid.getStore();\n const recs = o.scope === 'page' ? store.getRange() : await store.fetchAll(o.pageSize);\n const { head, rows } = table(grid, recs);\n const sheet = document.createElement('div');\n sheet.className = 'op-print-sheet';\n const cell = (tag: 'th' | 'td', v: string | number) => Object.assign(document.createElement(tag), { textContent: String(v) });\n const tr = (tag: 'th' | 'td', cells: Array<string | number>) => {\n const row = document.createElement('tr');\n row.append(...cells.map((v) => cell(tag, v)));\n return row;\n };\n const el = document.createElement('table');\n const thead = document.createElement('thead');\n thead.append(tr('th', head));\n const tbody = document.createElement('tbody');\n tbody.append(...rows.map((r) => tr('td', r)));\n el.append(thead, tbody);\n if (o.title) sheet.append(Object.assign(document.createElement('h1'), { textContent: o.title }));\n sheet.append(el);\n document.body.append(sheet);\n document.documentElement.classList.add('op-printing');\n await new Promise<void>((done) => {\n const finish = () => {\n window.removeEventListener('afterprint', finish);\n sheet.remove();\n document.documentElement.classList.remove('op-printing');\n done();\n };\n window.addEventListener('afterprint', finish);\n window.print();\n // some browsers return from print() without the event\n if (typeof matchMedia !== 'function') setTimeout(finish, 0);\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["MIME", "enc", "textOf", "v", "csvCell", "s", "safe", "table", "grid", "recs", "cols", "c", "r", "raw", "cellContent", "crc", "_", "n", "k", "b", "x", "zip", "files", "parts", "central", "offset", "u32", "o", "name", "text", "nameB", "data", "head", "entry", "e", "size", "end", "all", "at", "xml", "ref", "col", "row", "xlsx", "rows", "cell", "bold", "exportGrid", "format", "filename", "scope", "download", "store", "blob", "a", "printGrid", "sheet", "tag", "tr", "cells", "el", "thead", "tbody", "done", "finish"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as v}from"./chunk-JBOKM5YA.js";import{a as m}from"./chunk-MQEALOU3.js";import{a as w}from"./chunk-ESRS5ZQV.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{f}from"./chunk-UDXO3KM3.js";import{b as u}from"./chunk-PZSHOSOS.js";import{e as d,f as n}from"./chunk-S4QD5NID.js";d("en",{views:"Views",viewsName:"Name for this view",viewsSave:"Save view",viewsSaveAs:"Save as new view\u2026",viewsDefault:"Open with this view",viewsDelete:"Delete view",viewsConfirmDelete:'Delete the view "{n}"?',viewsReset:"Reset to initial"});d("pt-BR",{views:"Vis\xF5es",viewsName:"Nome desta vis\xE3o",viewsSave:"Salvar vis\xE3o",viewsSaveAs:"Salvar como nova vis\xE3o\u2026",viewsDefault:"Abrir com esta vis\xE3o",viewsDelete:"Excluir vis\xE3o",viewsConfirmDelete:'Excluir a vis\xE3o "{n}"?',viewsReset:"Voltar ao inicial"});var g=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function M(a,e=localStorage){let t=()=>{try{let s=JSON.parse(e.getItem(a)??"[]");return Array.isArray(s)?s:[]}catch{return[]}},i=s=>e.setItem(a,JSON.stringify(s));return{list:t,save(s){let r={...s,id:s.id??g()},o=t(),h=o.findIndex(p=>p.id===r.id);return h<0?o.push(r):o[h]=r,i(o),r},remove(s){i(t().filter(r=>r.id!==s.id))}}}function P(a){let e=async(t,i="",s)=>{let r=await(a.fetch??fetch)(a.url+i,{method:t,headers:{"Content-Type":"application/json",...a.headers},body:s===void 0?void 0:JSON.stringify(s)});if(!r.ok)throw new Error(`Optikos views: ${t} ${a.url+i} \u2192 ${r.status}`);return r.status===204?void 0:r.json().catch(()=>{})};return{list:()=>e("GET"),save:t=>t.id?e("PUT",`/${encodeURIComponent(t.id)}`,t):e("POST","",t),remove:t=>e("DELETE",`/${encodeURIComponent(t.id)}`).then(()=>{})}}var l=class extends f{baseCls="op-viewmanager";btn;menu;views=[];current;initial={};build(){return this.btn=new w({text:n("views"),icon:"menu",variant:"ghost",handler:()=>this.openMenu()}),this.btn.el.setAttribute("aria-haspopup","menu"),this.own(()=>(this.btn.destroy(),this.menu?.destroy())),u("span",this.baseCls,{},this.btn.el)}onRender(){this.config.grid.render(),this.config.filters?.render(),this.initial=this.getState(),this.config.autoLoad!==!1&&this.reload()}notifyMount(){super.notifyMount(),this.btn.notifyMount()}getState(){let{grid:e,filters:t,extra:i}=this.config,s={columns:e.getColumnState(),filter:t?.getFilter()??null,sorters:[...e.getStore().getSorters()]};return i&&(s.extra=Object.fromEntries(Object.entries(i).map(([r,o])=>[r,o.get()]))),s}setState(e){let{grid:t,filters:i,extra:s}=this.config;e.columns&&t.setColumnState(e.columns);let r=e.sorters?.[0];t.getStore().sort(r?.field??null,r?.dir),i&&(i.setFilter(e.filter??null),i.apply());for(let o in e.extra)s?.[o]?.set(e.extra[o])}getViews(){return this.views}getCurrent(){return this.current}async reload(){await this.run(async()=>{this.views=await this.config.storage.list()??[],this.current=this.current&&this.views.find(t=>t.id===this.current.id);let e=this.views.find(t=>t.default);!this.current&&e&&this.config.autoLoad!==!1&&this.apply(e),this.paint()}),this.emit("load",this.views)}apply(e){let t=typeof e=="string"?this.views.find(i=>i.id===e):e;!t||this.emit("before-apply",t)===!1||(this.current=t,this.setState(t.state),this.paint(),this.emit("apply",t))}async save(){if(!this.current)return this.saveAs();await this.store({...this.current,state:this.getState()})}async saveAs(e){if(e??=await v.prompt(n("viewsName"),{title:n("viewsSaveAs")})??"",e=e.trim(),!e)return;let t=this.views.find(i=>i.name.toLowerCase()===e.toLowerCase());await this.store({...t,name:e,state:this.getState()})}async setDefault(e=!0){if(this.current){for(let t of this.views)t!==this.current&&t.default&&await this.store({...t,default:!1},!1);await this.store({...this.current,default:e})}}async remove(e=this.current){!e||!await v.confirm(n("viewsConfirmDelete",{n:e.name}),{danger:!0,okText:n("viewsDelete")})||await this.run(async()=>{await this.config.storage.remove(e),this.views=this.views.filter(t=>t!==e&&t.id!==e.id),this.current?.id===e.id&&(this.current=void 0),this.paint(),this.emit("remove",e)})}reset(){this.current=void 0,this.setState(this.initial),this.paint(),this.emit("reset")}async store(e,t=!0){await this.run(async()=>{let i=await this.config.storage.save(e)||e,s=this.views.findIndex(r=>i.id&&r.id===i.id||r===e);s<0?this.views.push(i):this.views[s]=i,t&&(this.current=i),this.paint(),this.emit("save",i)})}async run(e){try{await e()}catch(t){this.emit("error",t)}}paint(){this.btn.setText(this.current?.name??n("views"))}openMenu(){let e=this.current,t=[...this.views.map(i=>({text:i.default?`${i.name} \u2605`:i.name,checked:i===e||!!e?.id&&i.id===e.id,handler:()=>this.apply(i)})),...this.views.length?["-"]:[],{text:n("viewsSave"),handler:()=>{this.save()}},{text:n("viewsSaveAs"),handler:()=>{this.saveAs()}},...e?[{text:n("viewsDefault"),checked:!!e.default,handler:()=>{this.setDefault(!e.default)}},{text:n("viewsDelete"),handler:()=>{this.remove()}}]:[],"-",{text:n("viewsReset"),handler:()=>this.reset()}];this.menu??=new m({}),this.menu.setItems(t),this.menu.showBy(this.btn.el)}};c("viewmanager",l);export{M as a,P as b,l as c};
2
+ //# sourceMappingURL=chunk-37PYJAA2.js.map
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/components/data/viewmanager/viewmanager.ts"],
4
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 type { FilterGroup, Sorter } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\nimport type { Grid, ColumnState } from '../grid/grid';\nimport type { FilterBuilder } from '../filterbuilder/filterbuilder';\n\naddMessages('en', {\n views: 'Views',\n viewsName: 'Name for this view',\n viewsSave: 'Save view',\n viewsSaveAs: 'Save as new view\u2026',\n viewsDefault: 'Open with this view',\n viewsDelete: 'Delete view',\n viewsConfirmDelete: 'Delete the view \"{n}\"?',\n viewsReset: 'Reset to initial',\n});\naddMessages('pt-BR', {\n views: 'Vis\u00F5es',\n viewsName: 'Nome desta vis\u00E3o',\n viewsSave: 'Salvar vis\u00E3o',\n viewsSaveAs: 'Salvar como nova vis\u00E3o\u2026',\n viewsDefault: 'Abrir com esta vis\u00E3o',\n viewsDelete: 'Excluir vis\u00E3o',\n viewsConfirmDelete: 'Excluir a vis\u00E3o \"{n}\"?',\n viewsReset: 'Voltar ao inicial',\n});\n\n/** Everything a view remembers: plain JSON, so it can travel to any backend. */\nexport interface ViewState {\n columns?: ColumnState[];\n filter?: FilterGroup | null;\n sorters?: Sorter[];\n /** Whatever the app registered in `extra` (panel collapsed, density...). */\n extra?: Record<string, unknown>;\n}\nexport interface SavedView {\n id?: string;\n name: string;\n default?: boolean;\n state: ViewState;\n}\n\n/** Where views live. Implement it for your endpoint; `localViewStorage` and `restViewStorage` are ready-made. */\nexport interface ViewStorage {\n list(): Promise<SavedView[]> | SavedView[];\n /** Create (no `id`) or update. May return the stored view (with the id the server gave it). */\n save(view: SavedView): Promise<SavedView | void> | SavedView | void;\n remove(view: SavedView): Promise<void> | void;\n}\n\nconst newId = () => globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n/** Views in the browser (`localStorage` by default) under one key. */\nexport function localViewStorage(key: string, storage: Storage = localStorage): ViewStorage {\n const read = (): SavedView[] => {\n try {\n const v = JSON.parse(storage.getItem(key) ?? '[]');\n return Array.isArray(v) ? v : [];\n } catch {\n return [];\n }\n };\n const write = (v: SavedView[]) => storage.setItem(key, JSON.stringify(v));\n return {\n list: read,\n save(view) {\n const saved = { ...view, id: view.id ?? newId() };\n const all = read();\n const i = all.findIndex((x) => x.id === saved.id);\n if (i < 0) all.push(saved);\n else all[i] = saved;\n write(all);\n return saved;\n },\n remove(view) {\n write(read().filter((x) => x.id !== view.id));\n },\n };\n}\n\nexport interface RestViewStorageConfig {\n /** `GET url` lists, `POST url` creates, `PUT url/:id` updates, `DELETE url/:id` removes. JSON in and out. */\n url: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\n/** Views on your server. Responses must be JSON (the list as an array, create/update returning the stored view). */\nexport function restViewStorage(cfg: RestViewStorageConfig): ViewStorage {\n const call = async (method: string, path = '', body?: unknown) => {\n const res = await (cfg.fetch ?? fetch)(cfg.url + path, { method, headers: { 'Content-Type': 'application/json', ...cfg.headers }, body: body === undefined ? undefined : JSON.stringify(body) });\n if (!res.ok) throw new Error(`Optikos views: ${method} ${cfg.url + path} \u2192 ${res.status}`);\n return res.status === 204 ? undefined : res.json().catch(() => undefined);\n };\n return {\n list: () => call('GET'),\n save: (v) => (v.id ? call('PUT', `/${encodeURIComponent(v.id)}`, v) : call('POST', '', v)),\n remove: (v) => call('DELETE', `/${encodeURIComponent(v.id!)}`).then(() => undefined),\n };\n}\n\nexport interface ViewManagerConfig extends ComponentConfig {\n grid: Grid;\n /** Its filter tree is part of the view. */\n filters?: FilterBuilder;\n storage: ViewStorage;\n /** Extra things to remember: `{ density: { get: () => ..., set: (v) => ... } }`. Stored in `state.extra`. */\n extra?: Record<string, { get(): unknown; set(value: unknown): void }>;\n /** Apply the default view when it opens. Default true. */\n autoLoad?: boolean;\n}\n\n/**\n * \"Views\" button for a Grid (and its FilterBuilder): saves and restores the visible columns and their order, the filters\n * (including nested AND/OR groups) and the sort, under a name, in the storage you give it.\n */\nexport class ViewManager extends Component<ViewManagerConfig> {\n protected override baseCls = 'op-viewmanager';\n private btn!: Button;\n private menu?: Menu;\n private views: SavedView[] = [];\n private current?: SavedView;\n private initial: ViewState = {};\n\n protected override build() {\n this.btn = new Button({ text: t('views'), icon: 'menu', variant: 'ghost', handler: () => this.openMenu() });\n this.btn.el.setAttribute('aria-haspopup', 'menu');\n this.own(() => (this.btn.destroy(), this.menu?.destroy()));\n return h('span', this.baseCls, {}, this.btn.el);\n }\n\n protected override onRender() {\n this.config.grid.render();\n this.config.filters?.render();\n this.initial = this.getState();\n if (this.config.autoLoad !== false) void this.reload();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.btn.notifyMount();\n }\n\n // ---- state ---------------------------------------------------------------------------------\n\n /** The grid's and filter's current setup. */\n getState(): ViewState {\n const { grid, filters, extra } = this.config;\n const state: ViewState = { columns: grid.getColumnState(), filter: filters?.getFilter() ?? null, sorters: [...grid.getStore().getSorters()] };\n if (extra) state.extra = Object.fromEntries(Object.entries(extra).map(([k, e]) => [k, e.get()]));\n return state;\n }\n\n /** Puts a setup on the grid and the filter. */\n setState(s: ViewState): void {\n const { grid, filters, extra } = this.config;\n if (s.columns) grid.setColumnState(s.columns);\n const sort = s.sorters?.[0];\n grid.getStore().sort(sort?.field ?? null, sort?.dir);\n if (filters) {\n filters.setFilter(s.filter ?? null);\n filters.apply();\n }\n for (const k in s.extra) extra?.[k]?.set(s.extra[k]);\n }\n\n // ---- views ---------------------------------------------------------------------------------\n\n getViews(): SavedView[] {\n return this.views;\n }\n getCurrent(): SavedView | undefined {\n return this.current;\n }\n\n /** Reads the views from the storage and applies the default one (unless a view is already active). */\n async reload(): Promise<void> {\n await this.run(async () => {\n this.views = (await this.config.storage.list()) ?? [];\n this.current = this.current && this.views.find((v) => v.id === this.current!.id);\n const def = this.views.find((v) => v.default);\n if (!this.current && def && this.config.autoLoad !== false) this.apply(def);\n this.paint();\n });\n this.emit('load', this.views);\n }\n\n /** Applies a saved view (object or id). */\n apply(view: SavedView | string): void {\n const v = typeof view === 'string' ? this.views.find((x) => x.id === view) : view;\n if (!v || this.emit('before-apply', v) === false) return;\n this.current = v;\n this.setState(v.state);\n this.paint();\n this.emit('apply', v);\n }\n\n /** Saves the current setup into the active view; with none active, asks for a name first. */\n async save(): Promise<void> {\n if (!this.current) return this.saveAs();\n await this.store({ ...this.current, state: this.getState() });\n }\n\n /** Saves the current setup as a view with that name (asked for when omitted); an existing name is overwritten. */\n async saveAs(name?: string): Promise<void> {\n name ??= (await MessageBox.prompt(t('viewsName'), { title: t('viewsSaveAs') })) ?? '';\n name = name.trim();\n if (!name) return;\n const same = this.views.find((v) => v.name.toLowerCase() === name!.toLowerCase());\n await this.store({ ...same, name, state: this.getState() });\n }\n\n /** Marks the active view as the one applied on open (and unmarks the others). */\n async setDefault(on = true): Promise<void> {\n if (!this.current) return;\n for (const v of this.views) if (v !== this.current && v.default) await this.store({ ...v, default: false }, false);\n await this.store({ ...this.current, default: on });\n }\n\n async remove(view = this.current): Promise<void> {\n if (!view || !(await MessageBox.confirm(t('viewsConfirmDelete', { n: view.name }), { danger: true, okText: t('viewsDelete') }))) return;\n await this.run(async () => {\n await this.config.storage.remove(view);\n this.views = this.views.filter((v) => v !== view && v.id !== view.id);\n if (this.current?.id === view.id) this.current = undefined;\n this.paint();\n this.emit('remove', view);\n });\n }\n\n /** Back to the setup the grid had when the manager opened. */\n reset(): void {\n this.current = undefined;\n this.setState(this.initial);\n this.paint();\n this.emit('reset');\n }\n\n private async store(view: SavedView, makeCurrent = true): Promise<void> {\n await this.run(async () => {\n const saved = (await this.config.storage.save(view)) || view;\n const i = this.views.findIndex((v) => (saved.id && v.id === saved.id) || v === view);\n if (i < 0) this.views.push(saved);\n else this.views[i] = saved;\n if (makeCurrent) this.current = saved;\n this.paint();\n this.emit('save', saved);\n });\n }\n\n private async run(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n // ---- UI ------------------------------------------------------------------------------------\n\n private paint(): void {\n this.btn.setText(this.current?.name ?? t('views'));\n }\n\n private openMenu(): void {\n const cur = this.current;\n const items: MenuEntry[] = [\n ...this.views.map((v) => ({ text: v.default ? `${v.name} \u2605` : v.name, checked: v === cur || (!!cur?.id && v.id === cur.id), handler: () => this.apply(v) })),\n ...(this.views.length ? (['-'] as const) : []),\n { text: t('viewsSave'), handler: () => void this.save() },\n { text: t('viewsSaveAs'), handler: () => void this.saveAs() },\n ...(cur ? [{ text: t('viewsDefault'), checked: !!cur.default, handler: () => void this.setDefault(!cur.default) }, { text: t('viewsDelete'), handler: () => void this.remove() }] : []),\n '-',\n { text: t('viewsReset'), handler: () => this.reset() },\n ];\n this.menu ??= new Menu({});\n this.menu.setItems(items);\n this.menu.showBy(this.btn.el);\n }\n}\nregister('viewmanager', ViewManager);\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": ["addMessages", "newId", "localViewStorage", "key", "storage", "read", "v", "write", "view", "saved", "all", "i", "x", "restViewStorage", "cfg", "call", "method", "path", "body", "res", "ViewManager", "Component", "Button", "t", "h", "grid", "filters", "extra", "state", "k", "e", "s", "sort", "def", "name", "MessageBox", "same", "on", "makeCurrent", "fn", "err", "cur", "items", "Menu", "register"]
7
7
  }
@@ -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
@@ -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 f}from"./chunk-QOSTS5I3.js";import{a as p,c as g,d as m,e as k}from"./chunk-J5BZAKC6.js";import{a as h}from"./chunk-Z6HZY2YG.js";import{c}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as a}from"./chunk-PZSHOSOS.js";import{e as l,f as n}from"./chunk-S4QD5NID.js";l("en",{lookupOpen:"Open search",lookupSelect:"Select"});l("pt-BR",{lookupOpen:"Abrir pesquisa",lookupSelect:"Selecionar"});var d=class extends f{baseCls="op-field op-textfield op-picker op-suggest op-lookup";def;suggestStore;win;constructor(e){let t=g(e.lookup);super({...e,icon:!1,valueField:t.valueField??"id",displayField:t.displayField??"name",query:o=>this.suggest(o)}),this.def=t}async suggest(e){let t=this.suggestStore??=m(this.def),o=this.def.queryField??(this.def.filters?.[0]&&p(this.def.filters[0]).name)??this.config.displayField,i=this.def.filters?.map(p).find(s=>s.name===o)?.field??o;return await t.filter({field:i,op:"contains",value:e}),t.getData()}createControl(){let e=super.createControl(),t=a("button","op-picker__trigger op-lookup__btn",{type:"button",tabindex:-1,"aria-label":n("lookupOpen"),"aria-haspopup":"dialog"},c("search"));return this.listen(t,"mousedown",o=>o.preventDefault()),this.listen(t,"click",()=>this.openDialog()),e.append(t),this.own(()=>this.win?.destroy()),e}onKey(e){e.key==="F4"||e.altKey&&e.key==="ArrowDown"?(e.preventDefault(),this.openDialog()):super.onKey(e)}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-lookup__btn").disabled=e}openDialog(){if(this.win||this.config.disabled||this.config.readonly||!this.rendered)return;this.close();let e=this.def,t=new k({lookup:e,flex:1}),o=this.typed?this.input.value:"";t.on("confirm",r=>i(r));let i=r=>{r[0]&&this.pickRecord(r[0]),s.close()},s=this.win=new h({title:e.title??n("search"),width:e.width??720,height:e.height??520,layout:"fit",items:[t],buttons:[{text:n("cancel"),handler:()=>s.close()},{text:n("lookupSelect"),variant:"primary",handler:()=>i(t.getSelection())}]});s.on("destroy",()=>{this.win=void 0,this.rendered&&this.input.focus()}),s.show(),o&&t.search(o)}pickRecord(e){let{valueField:t,displayField:o}=this.config,i={value:e.get(t),label:String(e.get(o)??e.get(t)??""),raw:e.data};this.pick(i)}};u("lookupfield",d);export{d as a};
2
+ //# sourceMappingURL=chunk-3OA3P37P.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/lookupfield/lookupfield.ts"],
4
+ "sourcesContent": ["import { SuggestField, type SuggestConfig } from '../suggestfield/suggestfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Model } from '../../../data/model';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\nimport { Window } from '../../overlays/window/window';\nimport { SearchGrid, resolveLookup, lookupStore, filterInfo, type LookupDef } from '../../data/searchgrid/searchgrid';\n\naddMessages('en', {\n lookupOpen: 'Open search',\n lookupSelect: 'Select',\n});\naddMessages('pt-BR', {\n lookupOpen: 'Abrir pesquisa',\n lookupSelect: 'Selecionar',\n});\n\nexport interface LookupFieldConfig<V = unknown> extends SuggestConfig<V> {\n /** A definition or the name given to `registerLookup`. */\n lookup: LookupDef | string;\n}\n\n/**\n * Pick a record from a big set: type to get suggestions, or press the magnifier (or F4) to open a search window\n * with filters and a grid. The value is the record's `valueField`; the text is its `displayField`.\n */\nexport class LookupField<V = unknown> extends SuggestField<V> {\n protected override baseCls = 'op-field op-textfield op-picker op-suggest op-lookup';\n private def: LookupDef;\n private suggestStore?: Store<any>;\n private win?: Window;\n\n constructor(config: LookupFieldConfig<V>) {\n const def = resolveLookup(config.lookup);\n super({\n ...config,\n icon: false,\n valueField: def.valueField ?? 'id',\n displayField: def.displayField ?? 'name',\n query: (text) => this.suggest(text),\n });\n this.def = def;\n }\n\n /** Typing: filter a private store by the quick-search field and offer its page of records. */\n private async suggest(text: string) {\n const s = (this.suggestStore ??= lookupStore(this.def));\n const name = this.def.queryField ?? (this.def.filters?.[0] && filterInfo(this.def.filters[0]).name) ?? this.config.displayField!;\n const field = this.def.filters?.map(filterInfo).find((f) => f.name === name)?.field ?? name;\n await s.filter({ field, op: 'contains', value: text });\n return s.getData();\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const btn = h('button', 'op-picker__trigger op-lookup__btn', { type: 'button', tabindex: -1, 'aria-label': t('lookupOpen'), 'aria-haspopup': 'dialog' }, iconEl('search'));\n this.listen(btn, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(btn, 'click', () => this.openDialog());\n wrap.append(btn);\n this.own(() => this.win?.destroy());\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'F4' || (e.altKey && e.key === 'ArrowDown')) {\n e.preventDefault();\n this.openDialog();\n } else super.onKey(e);\n }\n\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-lookup__btn') as HTMLButtonElement).disabled = disabled;\n }\n\n /** Opens the search window; the text typed so far pre-fills the quick-search field. */\n openDialog(): void {\n if (this.win || this.config.disabled || this.config.readonly || !this.rendered) return;\n this.close();\n const d = this.def;\n const sg = new SearchGrid({ lookup: d, flex: 1 });\n const text = this.typed ? this.input.value : '';\n sg.on('confirm', (recs: Model[]) => done(recs));\n const done = (recs: Model[]) => {\n if (recs[0]) this.pickRecord(recs[0]);\n win.close();\n };\n const win: Window = (this.win = new Window({\n title: d.title ?? t('search'),\n width: d.width ?? 720,\n height: d.height ?? 520,\n layout: 'fit',\n items: [sg],\n buttons: [{ text: t('cancel'), handler: () => win.close() }, { text: t('lookupSelect'), variant: 'primary', handler: () => done(sg.getSelection()) }],\n }));\n win.on('destroy', () => {\n this.win = undefined;\n if (this.rendered) this.input.focus();\n });\n win.show();\n if (text) void sg.search(text);\n }\n\n private pickRecord(rec: Model): void {\n const { valueField, displayField } = this.config;\n const item = { value: rec.get(valueField!), label: String(rec.get(displayField!) ?? rec.get(valueField!) ?? ''), raw: rec.data };\n this.pick(item as any);\n }\n}\nregister('lookupfield', LookupField);\n"],
5
+ "mappings": "+SAUAA,EAAY,KAAM,CAChB,WAAY,cACZ,aAAc,QAChB,CAAC,EACDA,EAAY,QAAS,CACnB,WAAY,iBACZ,aAAc,YAChB,CAAC,EAWM,IAAMC,EAAN,cAAuCC,CAAgB,CACzC,QAAU,uDACrB,IACA,aACA,IAER,YAAYC,EAA8B,CACxC,IAAMC,EAAMC,EAAcF,EAAO,MAAM,EACvC,MAAM,CACJ,GAAGA,EACH,KAAM,GACN,WAAYC,EAAI,YAAc,KAC9B,aAAcA,EAAI,cAAgB,OAClC,MAAQE,GAAS,KAAK,QAAQA,CAAI,CACpC,CAAC,EACD,KAAK,IAAMF,CACb,CAGA,MAAc,QAAQE,EAAc,CAClC,IAAMC,EAAK,KAAK,eAAiBC,EAAY,KAAK,GAAG,EAC/CC,EAAO,KAAK,IAAI,aAAe,KAAK,IAAI,UAAU,CAAC,GAAKC,EAAW,KAAK,IAAI,QAAQ,CAAC,CAAC,EAAE,OAAS,KAAK,OAAO,aAC7GC,EAAQ,KAAK,IAAI,SAAS,IAAID,CAAU,EAAE,KAAME,GAAMA,EAAE,OAASH,CAAI,GAAG,OAASA,EACvF,aAAMF,EAAE,OAAO,CAAE,MAAAI,EAAO,GAAI,WAAY,MAAOL,CAAK,CAAC,EAC9CC,EAAE,QAAQ,CACnB,CAEmB,eAAgB,CACjC,IAAMM,EAAO,MAAM,cAAc,EAC3BC,EAAMC,EAAE,SAAU,oCAAqC,CAAE,KAAM,SAAU,SAAU,GAAI,aAAcC,EAAE,YAAY,EAAG,gBAAiB,QAAS,EAAGC,EAAO,QAAQ,CAAC,EACzK,YAAK,OAAOH,EAAK,YAAcI,GAAaA,EAAE,eAAe,CAAC,EAC9D,KAAK,OAAOJ,EAAK,QAAS,IAAM,KAAK,WAAW,CAAC,EACjDD,EAAK,OAAOC,CAAG,EACf,KAAK,IAAI,IAAM,KAAK,KAAK,QAAQ,CAAC,EAC3BD,CACT,CAEmB,MAAM,EAAkB,CACrC,EAAE,MAAQ,MAAS,EAAE,QAAU,EAAE,MAAQ,aAC3C,EAAE,eAAe,EACjB,KAAK,WAAW,GACX,MAAM,MAAM,CAAC,CACtB,CAEmB,WAAWM,EAAmB,CAC/C,MAAM,WAAWA,CAAQ,EACxB,KAAK,GAAG,cAAc,iBAAiB,EAAwB,SAAWA,CAC7E,CAGA,YAAmB,CACjB,GAAI,KAAK,KAAO,KAAK,OAAO,UAAY,KAAK,OAAO,UAAY,CAAC,KAAK,SAAU,OAChF,KAAK,MAAM,EACX,IAAMC,EAAI,KAAK,IACTC,EAAK,IAAIC,EAAW,CAAE,OAAQF,EAAG,KAAM,CAAE,CAAC,EAC1Cd,EAAO,KAAK,MAAQ,KAAK,MAAM,MAAQ,GAC7Ce,EAAG,GAAG,UAAYE,GAAkBC,EAAKD,CAAI,CAAC,EAC9C,IAAMC,EAAQD,GAAkB,CAC1BA,EAAK,CAAC,GAAG,KAAK,WAAWA,EAAK,CAAC,CAAC,EACpCE,EAAI,MAAM,CACZ,EACMA,EAAe,KAAK,IAAM,IAAIC,EAAO,CACzC,MAAON,EAAE,OAASJ,EAAE,QAAQ,EAC5B,MAAOI,EAAE,OAAS,IAClB,OAAQA,EAAE,QAAU,IACpB,OAAQ,MACR,MAAO,CAACC,CAAE,EACV,QAAS,CAAC,CAAE,KAAML,EAAE,QAAQ,EAAG,QAAS,IAAMS,EAAI,MAAM,CAAE,EAAG,CAAE,KAAMT,EAAE,cAAc,EAAG,QAAS,UAAW,QAAS,IAAMQ,EAAKH,EAAG,aAAa,CAAC,CAAE,CAAC,CACtJ,CAAC,EACDI,EAAI,GAAG,UAAW,IAAM,CACtB,KAAK,IAAM,OACP,KAAK,UAAU,KAAK,MAAM,MAAM,CACtC,CAAC,EACDA,EAAI,KAAK,EACLnB,GAAWe,EAAG,OAAOf,CAAI,CAC/B,CAEQ,WAAWqB,EAAkB,CACnC,GAAM,CAAE,WAAAC,EAAY,aAAAC,CAAa,EAAI,KAAK,OACpCC,EAAO,CAAE,MAAOH,EAAI,IAAIC,CAAW,EAAG,MAAO,OAAOD,EAAI,IAAIE,CAAa,GAAKF,EAAI,IAAIC,CAAW,GAAK,EAAE,EAAG,IAAKD,EAAI,IAAK,EAC/H,KAAK,KAAKG,CAAW,CACvB,CACF,EACAC,EAAS,cAAe9B,CAAW",
6
+ "names": ["addMessages", "LookupField", "SuggestField", "config", "def", "resolveLookup", "text", "s", "lookupStore", "name", "filterInfo", "field", "f", "wrap", "btn", "h", "t", "iconEl", "e", "disabled", "d", "sg", "SearchGrid", "recs", "done", "win", "Window", "rec", "valueField", "displayField", "item", "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