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
@@ -0,0 +1,13 @@
1
+ import type { GridPlugin } from '../grid/grid.js';
2
+ export interface RowEditingOptions {
3
+ /** What starts editing with the pointer: a double click (default) or a single click. F2 and Enter always do. */
4
+ trigger?: 'dblclick' | 'click';
5
+ }
6
+ /**
7
+ * Edits every `editor` column of a row at once, under a bar with Save and Cancel. Enter saves, Esc cancels, Tab walks the
8
+ * editors and the buttons and wraps; Save validates every field and keeps the row open while one is invalid.
9
+ * Events on the grid: `before-edit(record)` (cancelable), `edit(record, values, old)` after the new values were written
10
+ * (`record.set`, so it is marked modified; a remote store's app saves from here), `cancel-edit(record)`.
11
+ * Use it instead of `cellEditing()`, not beside it.
12
+ */
13
+ export declare function rowEditing(options?: RowEditingOptions): GridPlugin;
@@ -5,11 +5,18 @@ import type { Model } from '../../../data/model.js';
5
5
  import type { Column } from '../../../data/column.js';
6
6
  import type { FilterOp, FilterSpec } from '../../../data/proxy.js';
7
7
  import { Grid } from '../grid/grid.js';
8
- /** A filter field of a lookup: any field config, plus how its value is matched. */
9
- export type LookupFilter = AnyConfig & {
8
+ /** A filter field of a lookup: a field config or a field instance (`ui.text(...)`); `op` and `field` say how its value is matched. */
9
+ export type LookupFilter = (AnyConfig & {
10
10
  name: string;
11
11
  op?: FilterOp;
12
12
  field?: string;
13
+ }) | Component;
14
+ /** `name`, `op`, `field` and `type` of a filter, whether it was given as a config or an instance. */
15
+ export declare const filterInfo: (f: LookupFilter) => {
16
+ name: string;
17
+ op?: FilterOp;
18
+ field?: string;
19
+ type?: string;
13
20
  };
14
21
  /** Everything that describes "search for a record": shared by SearchGrid and LookupField. */
15
22
  export interface LookupDef {
@@ -0,0 +1,37 @@
1
+ import type { TimelineItem, TimelinePlugin } from '../timeline/timeline.js';
2
+ export interface TimeEntryOptions {
3
+ /** Minutes everything snaps to. Default 15. */
4
+ step?: number;
5
+ /** Shortest entry, in minutes. Default `step`. */
6
+ minDuration?: number;
7
+ /** Length of an entry created with the keyboard, in minutes. Default 60. */
8
+ duration?: number;
9
+ /** `false` keeps two entries of one lane from overlapping: a drag stops at the neighbour, a move is refused. Default `true`. */
10
+ overlap?: boolean;
11
+ /** Let an entry change lane (drag up/down, ↑/↓). Default `false`. */
12
+ moveAcrossLanes?: boolean;
13
+ /** Minutes a lane should add up to: its total is `is-under`, `is-met` or `is-over` that. */
14
+ target?: number;
15
+ /** Return `false` to lock an entry (approved, invoiced): it cannot be moved, resized, edited or removed. */
16
+ editable?: (item: TimelineItem) => boolean;
17
+ /** Fields of a new entry besides `lane`, `start` and `end`. */
18
+ defaults?: Partial<TimelineItem>;
19
+ /**
20
+ * Opens your own dialog to fill a new entry (`'create'`, after the drag or Enter) or to edit one (`'edit'`, double click
21
+ * or Enter on a block). Resolve with the fields to set (`title`, `text`, ...), or with `false` to cancel.
22
+ */
23
+ form?: (item: TimelineItem, mode: 'create' | 'edit') => Promise<Partial<TimelineItem> | false | void> | Partial<TimelineItem> | false | void;
24
+ }
25
+ /** A duration in minutes as people write it: `7h30`, `8h`, `45m`. */
26
+ export declare function formatDuration(minutes: number): string;
27
+ /**
28
+ * Creates, moves, resizes and removes entries on a `range` Timeline: drag an empty lane to create, drag a block to move,
29
+ * its ends to resize; the same with the keyboard (see the ficha). Snaps to `step`, keeps to `from`/`to`, can forbid
30
+ * overlap and lock entries. Shows each lane's total (and a grand total) against `target`.
31
+ *
32
+ * Events on the timeline: `before-create({ lane, start, end })` → `create(item)`, `before-change(item, next, old)` →
33
+ * `change(item, next, old)`, `before-remove(item)` → `remove(item)`, `edit(item)` (double click, Enter). With a `store`
34
+ * the records are updated here (the app saves); without, the `items` are.
35
+ * Touch: a block drags at once; an empty lane needs a long press (about half a second) so a swipe still scrolls.
36
+ */
37
+ export declare function timeEntry(options?: TimeEntryOptions): TimelinePlugin;
@@ -0,0 +1,63 @@
1
+ import { Component, type ComponentConfig } from '../../../core/component.js';
2
+ import type { Store } from '../../../data/store.js';
3
+ export interface TimelineItem {
4
+ id?: string | number;
5
+ title: string;
6
+ text?: string;
7
+ icon?: string;
8
+ tone?: 'default' | 'success' | 'warning' | 'danger' | 'info';
9
+ /** `list`: when it happened (an ISO date or time, or any text). */
10
+ time?: string;
11
+ /** `range`: ISO dates or date-times. */
12
+ start?: string;
13
+ end?: string;
14
+ /** `range`: the row (a person, a room, a phase). */
15
+ lane?: string;
16
+ }
17
+ export interface TimelineConfig extends ComponentConfig {
18
+ /** `list`: events one under the other, with a marker (default). `range`: a schedule: bars over a time axis, one row per `lane`. */
19
+ mode?: 'list' | 'range';
20
+ items?: TimelineItem[];
21
+ /** Items from a Store (its records are `TimelineItem`s). */
22
+ store?: Store<any>;
23
+ /** `range`: the order of the rows. Default: order of appearance. */
24
+ lanes?: string[];
25
+ /** `range`: the window shown. Default: from the first start to the last end. */
26
+ from?: string;
27
+ to?: string;
28
+ /** `range`: a marker at the current time. Default true. */
29
+ now?: boolean;
30
+ /** `range`: `horizontal` (time runs left to right, one row per lane, default) or `vertical` (time runs top to bottom, one column per lane). */
31
+ direction?: 'horizontal' | 'vertical';
32
+ /** Optional features (`timeEntry()`...). See `TimelinePlugin`. */
33
+ plugins?: TimelinePlugin[];
34
+ }
35
+ /** Extends a Timeline without growing its base: `init` runs once it is rendered and may return a cleanup. The timeline fires `paint` after every repaint. */
36
+ export interface TimelinePlugin {
37
+ init(timeline: Timeline): void | (() => void);
38
+ }
39
+ /** The time axis of a `range` timeline: its ends in ms, and how to read and write the item dates (`clock`: `'HH:mm'` of one day, else ISO). */
40
+ export interface TimelineScale {
41
+ lo: number;
42
+ hi: number;
43
+ clock: boolean;
44
+ vertical: boolean;
45
+ parse(v: string): number;
46
+ format(ms: number): string;
47
+ }
48
+ /** Events as a vertical list, or a schedule (phases, staff shifts) as bars on a time axis. Click or Enter on an item fires `select`. */
49
+ export declare class Timeline extends Component<TimelineConfig> {
50
+ protected baseCls: string;
51
+ private items;
52
+ private scale?;
53
+ protected build(): HTMLDivElement;
54
+ protected onRender(): void;
55
+ private pick;
56
+ getItems(): TimelineItem[];
57
+ /** The time axis of a `range` timeline (set by the last paint), for plugins. */
58
+ getScale(): TimelineScale | undefined;
59
+ setItems(items: TimelineItem[]): void;
60
+ private paint;
61
+ private list;
62
+ private range;
63
+ }
@@ -0,0 +1,32 @@
1
+ import type { Model } from '../../../data/model.js';
2
+ import type { GridPlugin } from '../grid/grid.js';
3
+ export interface TreeGridOptions {
4
+ /** Column that shows the indentation and the expander. Default: the first one. */
5
+ treeColumn?: string;
6
+ /** Field that holds the parent's id (`null` or missing: a root). Default `parentId`. */
7
+ parentField?: string;
8
+ /** Loads the children of a node the first time it opens: resolves with their rows (the plugin sets `parentField` and adds them to the store). Without it every node is already in the store. */
9
+ load?: (node: Model) => Promise<Array<Record<string, any>>> | Array<Record<string, any>>;
10
+ /** With `load`: the field that says a node has no children (default `leaf`), so it gets no expander. */
11
+ leafField?: string;
12
+ /** Start with every node open. */
13
+ expanded?: boolean;
14
+ }
15
+ export interface TreeGrid extends GridPlugin {
16
+ expand(id: string | number): void;
17
+ collapse(id: string | number): void;
18
+ expandAll(): void;
19
+ collapseAll(): void;
20
+ }
21
+ /** Nested data (`{ id, name, children: [...] }`) → the flat rows the plugin wants, each with its `parentId`. */
22
+ export declare function flattenTree<T extends Record<string, any>>(nodes: T[], o?: {
23
+ children?: string;
24
+ parentField?: string;
25
+ }, parent?: unknown): Array<Record<string, any>>;
26
+ /**
27
+ * Indents each record under its parent with an expander; ←/→ close/open and walk to the parent/first child (ARIA treegrid),
28
+ * click on the chevron toggles. The rest of the columns are ordinary: format, renderer, sort (siblings), resize, lock.
29
+ * A record whose parent is filtered out (or not on the page) shows as a root. Events on the grid: `expand-node(record)`,
30
+ * `collapse-node(record)`, `load-error(record, error)`.
31
+ */
32
+ export declare function treeGrid(options?: TreeGridOptions): TreeGrid;
@@ -0,0 +1 @@
1
+ export * from '../components/fields/datetimefield/datetimefield.js';
@@ -0,0 +1 @@
1
+ export * from '../components/data/exportbar/exportbar.js';
@@ -0,0 +1,28 @@
1
+ import { Field, type FieldConfig } from '../../../core/field.js';
2
+ export interface DateTimeFieldConfig extends FieldConfig<string | null> {
3
+ /** Earliest and latest date, `YYYY-MM-DD`. */
4
+ min?: string;
5
+ max?: string;
6
+ /** Minutes moved by ↑/↓ in the time part. */
7
+ step?: number;
8
+ /** The value is the ISO instant (`2026-11-10T17:30:00.000Z`) of what the user typed, in their time zone. Default: the local `YYYY-MM-DDTHH:mm`. */
9
+ utc?: boolean;
10
+ }
11
+ /** A date and a time of day side by side. The value is one ISO string (local, or UTC with `utc`) or null. */
12
+ export declare class DateTimeField extends Field<string | null, DateTimeFieldConfig> {
13
+ protected baseCls: string;
14
+ private date;
15
+ private time;
16
+ protected emptyValue(): null;
17
+ protected isEmpty(v: string | null): boolean;
18
+ protected createControl(): HTMLDivElement;
19
+ /** Both parts → the value. One part alone is not a value yet (`check` says so). */
20
+ private compose;
21
+ protected applyValue(v: string | null): void;
22
+ getDisplayText(): string;
23
+ protected check(): string;
24
+ protected onDisabled(disabled: boolean): void;
25
+ protected onReadonly(readonly: boolean): void;
26
+ setMin(min: string | undefined): void;
27
+ setMax(max: string | undefined): void;
28
+ }
@@ -0,0 +1,48 @@
1
+ import { Field, type FieldConfig } from '../../../core/field.js';
2
+ /** A new `File`, or the URL (string) of an image already saved. */
3
+ export type ImageItem = File | string;
4
+ export type ImageValue = ImageItem | ImageItem[] | null;
5
+ export interface ImageFieldConfig extends FieldConfig<ImageValue> {
6
+ /** The input's `accept` (also checked on dropped files). Default `image/*`. */
7
+ accept?: string;
8
+ /** Bytes. */
9
+ maxSize?: number;
10
+ multiple?: boolean;
11
+ /** With `multiple`. */
12
+ maxFiles?: number;
13
+ placeholder?: string;
14
+ }
15
+ /** Picks images by click or drop, with a preview. Holds the files; sending them is up to the app. */
16
+ export declare class ImageField extends Field<ImageValue, ImageFieldConfig> {
17
+ protected baseCls: string;
18
+ private zone;
19
+ private picker;
20
+ private list;
21
+ private urls;
22
+ protected emptyValue(): ImageValue;
23
+ protected isEmpty(v: ImageValue): boolean;
24
+ protected isEqual(a: ImageValue, b: ImageValue): boolean;
25
+ private itemsOf;
26
+ private items;
27
+ protected createControl(): HTMLDivElement;
28
+ protected onRender(): void;
29
+ protected applyValue(v: ImageValue): void;
30
+ private url;
31
+ private revoke;
32
+ /** The zone is there only while there is room for another image and the user may edit. */
33
+ private sync;
34
+ protected onDisabled(): void;
35
+ protected onReadonly(): void;
36
+ /** Opens the browser's file picker. */
37
+ open(): void;
38
+ private accepts;
39
+ /** Adds files with the same checks as a drop. Without `multiple` the first valid file replaces the image. */
40
+ add(files: File[]): void;
41
+ /** Removes the image at `index`. */
42
+ remove(index: number): void;
43
+ protected commit(v: ImageValue): void;
44
+ private holdsFocus;
45
+ /** The button the keyboard user was on may be gone: move to the one that is left. */
46
+ private refocus;
47
+ getDisplayText(): string;
48
+ }
@@ -0,0 +1,28 @@
1
+ import { TextField, type TextFieldConfig } from '../textfield/textfield.js';
2
+ export interface MaskFieldConfig extends TextFieldConfig {
3
+ /**
4
+ * The pattern: `0` a digit, `A` a letter, `*` any character, `\` makes the next character a literal. A list picks the
5
+ * pattern by length: `['000.000.000-00', '00.000.000/0000-00']` is a CPF until the 12th digit, then a CNPJ.
6
+ * The core knows no country: formats like these belong to the app.
7
+ */
8
+ mask: string | string[];
9
+ /** The value is only what was typed into the slots (`12345678900`), not the formatted text (`123.456.789-00`). Default false. */
10
+ raw?: boolean;
11
+ }
12
+ /** A text field that formats what is typed into a pattern (phone, tax id, postal code, plate...). */
13
+ export declare class MaskField extends TextField<string, MaskFieldConfig> {
14
+ protected baseCls: string;
15
+ private masks;
16
+ private compiled;
17
+ /** What was typed into the slots: the literals of the patterns are dropped (with a `*` slot, only where the text repeats one). */
18
+ private extract;
19
+ private pick;
20
+ private format;
21
+ private norm;
22
+ protected display(v: string): string;
23
+ setValue(v: string, silent?: boolean): void;
24
+ protected createControl(): HTMLDivElement;
25
+ protected onInput(): void;
26
+ protected check(): string;
27
+ setMask(mask: string | string[]): void;
28
+ }
@@ -5,6 +5,14 @@ export interface NumberFieldConfig extends TextFieldConfig<number | null> {
5
5
  step?: number;
6
6
  /** Fixed decimals shown (and applied when the user leaves the field). */
7
7
  decimals?: number;
8
+ /** `currency` and `percent` show through `Intl` (`R$ 1.234,56`, `$1,234.56`, `15%`). Default: plain number. */
9
+ format?: 'decimal' | 'currency' | 'percent';
10
+ /** ISO 4217 code for `format: 'currency'`. Default: the locale's (`setCurrency`). */
11
+ currency?: string;
12
+ /** BCP 47 tag for this field's separators. Default: the active locale. */
13
+ locale?: string;
14
+ /** The value is the shown number times `scale`: `scale: 100` with currency keeps cents as an integer (`123456` shows `1.234,56`). */
15
+ scale?: number;
8
16
  }
9
17
  export declare class NumberField extends TextField<number | null, NumberFieldConfig> {
10
18
  protected baseCls: string;
@@ -12,6 +20,7 @@ export declare class NumberField extends TextField<number | null, NumberFieldCon
12
20
  private garbage;
13
21
  protected emptyValue(): null;
14
22
  protected isEmpty(v: number | null): v is null;
23
+ private get lang();
15
24
  private get decimalSep();
16
25
  protected parse(text: string): number | null;
17
26
  protected display(v: number | null): string;
@@ -47,6 +47,9 @@ export declare abstract class PickerField<V = unknown, C extends PickerConfig<V>
47
47
  private bindStore;
48
48
  protected findItem(value: unknown): ListItem | undefined;
49
49
  getSelection(): ListItem | undefined;
50
+ /** Also takes `{ value, label }`: the value with the text to show, for a record that is not in the list. */
51
+ setValue(v: V, silent?: boolean): void;
52
+ fillFrom(record: Record<string, any>): void;
50
53
  /** Selects an item object directly (needed when the list does not contain it, e.g. a remote value). */
51
54
  setSelection(item: ListItem | undefined, silent?: boolean): void;
52
55
  /** The items to display for the current search state. Default: all. */
@@ -0,0 +1,24 @@
1
+ import { TextField, type TextFieldConfig } from '../textfield/textfield.js';
2
+ export interface TimeFieldConfig extends TextFieldConfig<string | null> {
3
+ /** Earliest and latest time, `'HH:mm'`. */
4
+ min?: string;
5
+ max?: string;
6
+ /** Minutes moved by ↑/↓ (PageUp/PageDown move an hour). Default 1. */
7
+ step?: number;
8
+ }
9
+ /** A time of day. The value is `'HH:mm'` (24 h) or `null`. Type `930`, `9:30` or `09:30`; ↑/↓ step it. */
10
+ export declare class TimeField extends TextField<string | null, TimeFieldConfig> {
11
+ protected baseCls: string;
12
+ private garbage;
13
+ protected emptyValue(): null;
14
+ protected isEmpty(v: string | null): v is null;
15
+ protected parse(text: string): string | null;
16
+ protected createControl(): HTMLDivElement;
17
+ protected onInput(): void;
18
+ protected applyValue(v: string | null): void;
19
+ protected check(): string;
20
+ protected onKey(e: KeyboardEvent): void;
21
+ private bump;
22
+ setMin(min: string | undefined): void;
23
+ setMax(max: string | undefined): void;
24
+ }
@@ -42,6 +42,8 @@ export declare class FieldList extends Field<Row[], FieldListConfig> {
42
42
  moveRow(from: number, to: number): void;
43
43
  getRows(): Container[];
44
44
  getRowFields(index: number): Field<any>[];
45
+ /** The field of a row by path (`'0.name'` → field `name` of the first row): where a server error lands. */
46
+ fieldAt(path: string): Field<any> | undefined;
45
47
  setAddText(text: string): void;
46
48
  setMin(min: number): void;
47
49
  setMax(max: number): void;
@@ -61,6 +61,11 @@ export declare class Form extends Container<FormConfig> {
61
61
  clearErrors(): void;
62
62
  /** Validates every field that counts (marks errors) and focuses the first invalid one. */
63
63
  validate(): boolean;
64
+ /**
65
+ * Marks server-side errors by dotted path (`slug`, `items.0.name` for a row of a FieldList), brings the first into
66
+ * view (its tab or step) and focuses it. Returns the paths that matched no field, for the caller to show some other way.
67
+ */
68
+ setErrors(errors: Record<string, string>): string[];
64
69
  submit(): boolean;
65
70
  /** Width of the labels on the left (number = px); they line up in a column. */
66
71
  setLabelWidth(width: number | string): void;
@@ -79,7 +79,7 @@ export declare class StepForm extends Form {
79
79
  /** The card layout changed the visible step (by `goTo`, or because `validate` brought an invalid field into view). */
80
80
  private onActivate;
81
81
  private refreshReview;
82
- /** What the user sees for a field (its display text; ticks for booleans, dots for passwords). */
82
+ /** What the user sees for a field (its display text; ticks for booleans, dots for passwords; one line per FieldList row). */
83
83
  private show_;
84
84
  /** Enter and the Finish button: Next on every step but the last; on the last, validate everything and `finish`. */
85
85
  submit(): boolean;
@@ -0,0 +1 @@
1
+ export * from '../components/data/gridexport/gridexport.js';
@@ -0,0 +1 @@
1
+ export * from '../components/data/gridstate/gridstate.js';
@@ -0,0 +1 @@
1
+ export * from '../components/data/grouping/grouping.js';
@@ -0,0 +1 @@
1
+ export * from '../components/base/image/image.js';
@@ -0,0 +1 @@
1
+ export * from '../components/base/imagecanvas/imagecanvas.js';
@@ -0,0 +1 @@
1
+ export * from '../components/fields/imagefield/imagefield.js';
@@ -0,0 +1,58 @@
1
+ import { Container, type ContainerConfig } from '../../../core/container.js';
2
+ export interface CarouselConfig extends ContainerConfig {
3
+ /** Items shown together. Default 1. */
4
+ perView?: number;
5
+ /** Space between items (px or CSS length). */
6
+ gap?: number | string;
7
+ /** Past the last item goes to the first (and the other way). */
8
+ loop?: boolean;
9
+ /** ms between items; 0 (default) is off. */
10
+ autoplay?: number;
11
+ /** Default `true`. */
12
+ dots?: boolean;
13
+ /** Default `true`. */
14
+ arrows?: boolean;
15
+ active?: number;
16
+ }
17
+ /** Pages through its items on a scroll-snap row: images, cards or any component. */
18
+ export declare class Carousel extends Container<CarouselConfig> {
19
+ protected baseCls: string;
20
+ private track;
21
+ private prevBtn;
22
+ private nextBtn;
23
+ private dotsEl;
24
+ private toggleBtn;
25
+ private index;
26
+ private stopped;
27
+ private scrollTimer?;
28
+ private playTimer?;
29
+ private get perView();
30
+ /** Positions the row can rest on: it moves one item at a time. */
31
+ private get last();
32
+ protected build(): HTMLElement;
33
+ getBody(): HTMLElement;
34
+ protected onRender(): void;
35
+ protected onMount(): void;
36
+ /** Reads the item at the left edge from the scroll position (after a swipe or a trackpad scroll). */
37
+ private settle;
38
+ private stride;
39
+ private align;
40
+ private set;
41
+ /** Slides, dots, arrows: everything that follows the item count or the active one. */
42
+ private refresh;
43
+ getActive(): number;
44
+ /** Goes to item `i` (kept between 0 and the last position). `before-change` can cancel. */
45
+ goTo(i: number): void;
46
+ setActive(i: number): void;
47
+ private step;
48
+ next(): void;
49
+ prev(): void;
50
+ isPlaying(): boolean;
51
+ private reduced;
52
+ play(): void;
53
+ pause(): void;
54
+ /** Any use of the controls ends autoplay for good (WCAG 2.2.2). */
55
+ private interact;
56
+ /** Runs the timer only while playing and nothing holds the pointer or the focus. */
57
+ private tick;
58
+ }
@@ -0,0 +1 @@
1
+ export * from '../components/fields/maskfield/maskfield.js';
@@ -7,6 +7,8 @@ export interface NavItem {
7
7
  items?: NavItem[];
8
8
  disabled?: boolean;
9
9
  hidden?: boolean;
10
+ /** Hidden (or disabled) while `setPermissionResolver` denies it. */
11
+ permission?: string;
10
12
  /** Groups: start open. */
11
13
  expanded?: boolean;
12
14
  data?: unknown;
@@ -1,6 +1,8 @@
1
1
  import { Component, type ComponentConfig } from '../../../core/component.js';
2
2
  export interface Command {
3
3
  id: string;
4
+ /** The command is left out while `setPermissionResolver` denies it. */
5
+ permission?: string;
4
6
  title: string;
5
7
  /** Groups the command and gives it a filter chip. */
6
8
  category?: string;
@@ -12,8 +12,11 @@ export interface MenuItem {
12
12
  group?: string;
13
13
  /** A count or short label at the end of the row. */
14
14
  badge?: string | number;
15
+ /** Hidden (or disabled) while `setPermissionResolver` denies it. */
16
+ permission?: string;
15
17
  }
16
- export type MenuEntry = MenuItem | '-';
18
+ /** An item, or `'-'` for a separator (typed `string` so an array built in a variable still fits). */
19
+ export type MenuEntry = MenuItem | string;
17
20
  export interface MenuConfig extends ComponentConfig {
18
21
  items?: MenuEntry[];
19
22
  /** A search field over the items: filters as you type; a search that names a group shows the whole group. */
@@ -0,0 +1,27 @@
1
+ export interface Shortcut {
2
+ /** `mod+s` (Ctrl, or ⌘ on a Mac), `shift+?`, `alt+n`, `g`. Several keys in a row are not supported. */
3
+ keys: string;
4
+ title: string;
5
+ handler: (e: KeyboardEvent) => void | false;
6
+ /** The screen it belongs to (`setScope`). Default `global`: active on every screen. */
7
+ scope?: string;
8
+ /** Heading in the help panel. Default: the scope. */
9
+ group?: string;
10
+ /** Checked on every press: the shortcut only runs while this returns true. */
11
+ when?: () => boolean;
12
+ /** A shortcut without Ctrl/⌘/Alt is ignored while typing in a field, unless this is true. */
13
+ inInputs?: boolean;
14
+ }
15
+ /** How a combination reads on this keyboard: `⌘S`, `Ctrl+S`. */
16
+ export declare function formatKeys(keys: string): string;
17
+ export declare const shortcuts: {
18
+ /** Adds shortcuts; returns the function that removes them. The same keys twice in one scope warn in dev, and the newest wins. */
19
+ register(list: Shortcut | Shortcut[]): () => void;
20
+ /** The screen whose shortcuts are active besides the global ones (`undefined`: only global). */
21
+ setScope(name: string | undefined): void;
22
+ getScope: () => string | undefined;
23
+ /** What is active now: the global shortcuts and the current scope's. */
24
+ list: () => Shortcut[];
25
+ /** Opens (or closes) the help panel, grouped. `?` does it from anywhere but a text field. */
26
+ help(): void;
27
+ };
@@ -11,6 +11,8 @@ export interface WindowConfig extends PanelConfig {
11
11
  * pop up. `true` focuses its first field instead. Default false.
12
12
  */
13
13
  autoFocus?: boolean;
14
+ /** Closing while a field inside is changed asks first. `true` uses a standard text; a string is the question. */
15
+ confirmDiscard?: boolean | string;
14
16
  }
15
17
  /** Floating dialog. Modal by default: the page behind becomes inert and Tab stays inside. */
16
18
  export declare class Window extends Panel<WindowConfig> {
@@ -27,10 +29,21 @@ export declare class Window extends Panel<WindowConfig> {
27
29
  /** Dims (true) or not (false) the page behind the modal window. */
28
30
  setMask(mask: boolean): void;
29
31
  isVisible(): boolean;
30
- /** Centers in the viewport (also done on show and on resize until the user drags it). */
32
+ /** Centers in the viewport (also done on show, on resize and when the content grows, until the user drags it). */
31
33
  center(): void;
34
+ /** Keeps the window on screen: centered, or (once dragged) pulled up just enough to fit. */
35
+ private keepInView;
32
36
  show(): void;
33
37
  private focusFirst;
38
+ /**
39
+ * How `confirmDiscard` asks. MessageBox sets it when it is loaded (it needs Window itself, so Window cannot import it);
40
+ * without MessageBox the browser's own `confirm` is used.
41
+ */
42
+ static ask?: (text: string, o: {
43
+ okText: string;
44
+ cancelText: string;
45
+ }) => Promise<boolean>;
46
+ close(): void;
34
47
  hide(): void;
35
48
  /** Cleans up at once (the page is usable again) and takes the window off the screen: shrinking toward its opener, 20 % faster than it came. */
36
49
  private release;
@@ -0,0 +1 @@
1
+ export * from '../components/data/rowediting/rowediting.js';
@@ -0,0 +1 @@
1
+ export * from '../components/overlays/shortcuts/shortcuts.js';
@@ -0,0 +1 @@
1
+ export * from '../components/charts/stat/stat.js';
@@ -0,0 +1 @@
1
+ export * from '../components/data/timeentry/timeentry.js';
@@ -0,0 +1 @@
1
+ export * from '../components/fields/timefield/timefield.js';
@@ -0,0 +1 @@
1
+ export * from '../components/data/timeline/timeline.js';
@@ -0,0 +1 @@
1
+ export * from '../components/data/treegrid/treegrid.js';
@@ -14,6 +14,9 @@ export interface ComponentConfig {
14
14
  showIf?: (values: Record<string, any>) => boolean;
15
15
  /** Inside a Form: enabled only while this returns true (given the form values). */
16
16
  enableIf?: (values: Record<string, any>) => boolean;
17
+ /** A permission name: without it (per `setPermissionResolver`) the component is hidden, or disabled with `permissionMode: 'disable'`. */
18
+ permission?: string;
19
+ permissionMode?: 'hide' | 'disable';
17
20
  /** Component-scoped tokens: `{ radius: '0' }` on a button sets `--op-button-radius`. Keys starting with `--` are used as is. */
18
21
  theme?: Record<string, string | number>;
19
22
  /**
@@ -40,6 +43,8 @@ export interface Parent {
40
43
  }
41
44
  export declare class Component<C extends ComponentConfig = ComponentConfig> extends Emitter {
42
45
  static type?: string;
46
+ /** Called with every new component, config in hand: `optikos/dev` uses it to warn about options nobody reads. */
47
+ static onCreate?: (c: Component<any>) => void;
43
48
  config: C;
44
49
  readonly id: string;
45
50
  parent?: Component & Parent;
@@ -74,6 +79,8 @@ export declare class Component<C extends ComponentConfig = ComponentConfig> exte
74
79
  later(fn: () => void, ms: number): () => void;
75
80
  protected onDisabled(_disabled: boolean): void;
76
81
  setDisabled(disabled: boolean): void;
82
+ /** The user lacks `config.permission` and the way to deal with it is `mode`. */
83
+ private denied;
77
84
  show(): void;
78
85
  hide(): void;
79
86
  isHidden(): boolean;
@@ -1,7 +1,16 @@
1
1
  import { Component, type ComponentConfig, type Parent } from './component.js';
2
2
  import { type AnyConfig } from './registry.js';
3
3
  import { type Layout, type LayoutSpec } from '../layout/layout.js';
4
- export interface ContainerConfig extends ComponentConfig {
4
+ /** What a Tabs header reads from its panel (any Container, not just Panel). */
5
+ export interface TabPanelConfig {
6
+ title?: string;
7
+ icon?: string;
8
+ closable?: boolean;
9
+ reloadable?: boolean;
10
+ /** Called by the tab's ↻; a returned Promise keeps the tab busy until it settles. */
11
+ onReload?: (panel: any) => void | Promise<unknown>;
12
+ }
13
+ export interface ContainerConfig extends ComponentConfig, TabPanelConfig {
5
14
  items?: Array<AnyConfig | Component | string>;
6
15
  layout?: LayoutSpec;
7
16
  /** Config merged into every item that does not set the key itself. */
@@ -0,0 +1,2 @@
1
+ /** True while developing: on localhost, or when `globalThis.__OPTIKOS_DEV__` says so. Dev-only warnings follow it. */
2
+ export declare const isDev: () => boolean;