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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/field.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from './component';\nimport { h, uid } from './dom';\nimport { t } from './i18n';\nimport type { Validator } from './validators';\nimport { getPath } from './path';\n\nexport interface FieldConfig<V = unknown> extends ComponentConfig {\n name?: string;\n label?: string;\n labelPos?: 'top' | 'left';\n value?: V;\n required?: boolean;\n readonly?: boolean;\n help?: string;\n validators?: Validator<V>[];\n /** When to validate on its own. After the first error it revalidates on every change. Default `blur`. */\n validateOn?: 'blur' | 'change' | 'submit';\n /** Lookups and pickers: the key of the loaded record that holds the text to show for the value (`evento` + `displayFrom: 'eventoNome'`). */\n displayFrom?: string;\n /** ms of quiet after the last change before `settled` fires (0 = right away). `change` itself is never delayed. */\n debounce?: number;\n}\n\n/**\n * Base of every field: value, validation, dirty tracking, label and messages.\n * Subclasses implement `createControl` (build the control, assign `inputEl`), `applyValue` (value \u2192 DOM)\n * and call `commit` when the user edits (DOM \u2192 value).\n */\nexport abstract class Field<V = unknown, C extends FieldConfig<V> = FieldConfig<V>> extends Component<C> {\n protected override baseCls = 'op-field';\n protected value: V;\n protected original: V;\n protected error = '';\n /** The focusable control; `label for`, `aria-invalid` and `aria-describedby` point at it. */\n protected inputEl!: HTMLElement;\n private labelEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private errorEl!: HTMLElement;\n private dirty = false;\n private cancelSettle?: () => void;\n\n constructor(config: C = {} as C) {\n super(config);\n this.value = this.original = config.value ?? this.emptyValue();\n }\n\n get name(): string | undefined {\n return this.config.name;\n }\n\n protected abstract createControl(): HTMLElement;\n protected abstract applyValue(value: V): void;\n protected emptyValue(): V {\n return '' as V;\n }\n protected isEmpty(v: V): boolean {\n return v == null || (v as unknown) === '' || (Array.isArray(v) && !v.length);\n }\n protected isEqual(a: V, b: V): boolean {\n return a === b || JSON.stringify(a) === JSON.stringify(b);\n }\n\n protected override build(): HTMLElement {\n const c = this.config;\n const el = h('div', `${this.baseCls}${c.labelPos === 'left' ? ' op-field--label-left' : ''}`);\n this.labelEl = h('label', 'op-field__label');\n const control = h('div', 'op-field__control', {}, this.createControl());\n this.helpEl = h('div', 'op-field__help', { id: `${this.id}-help` });\n this.errorEl = h('div', 'op-field__error', { id: `${this.id}-error`, role: 'alert' });\n el.append(this.labelEl, control, this.helpEl, this.errorEl);\n return el;\n }\n\n protected override onRender(): void {\n const c = this.config;\n const input = this.inputEl;\n input.id ||= uid('op-input');\n (this.labelEl as HTMLLabelElement).htmlFor = input.id;\n // a field without a visible label is named by `ariaLabel` on its control (the root is just a wrapper)\n if (c.ariaLabel && input !== this.el) {\n input.setAttribute('aria-label', c.ariaLabel);\n this.el.removeAttribute('aria-label');\n }\n this.setLabel(c.label ?? '');\n this.setHelp(c.help ?? '');\n this.setRequired(!!c.required);\n this.setReadonly(!!c.readonly);\n this.applyValue(this.value);\n this.paintError();\n this.listen(this.el, 'focusin', () => {\n this.el.classList.add('is-focused');\n this.emit('focus');\n });\n this.listen(this.el, 'focusout', (e: FocusEvent) => {\n if (this.el.contains(e.relatedTarget as Node)) return;\n this.flushSettled();\n this.el.classList.remove('is-focused');\n if ((c.validateOn ?? 'blur') === 'blur') this.validate();\n this.emit('blur');\n });\n }\n\n protected override focusEl(): HTMLElement {\n this.render();\n return this.inputEl;\n }\n\n // ---- value ---------------------------------------------------------------------------------\n\n getValue(): V {\n return this.value;\n }\n\n /** Sets the value programmatically. `silent` skips the `change` event and validation. */\n setValue(v: V, silent = false): void {\n const old = this.value;\n this.value = v;\n if (this.rendered) this.applyValue(v);\n if (!this.isEqual(old, v)) this.changed(old, silent);\n }\n\n /** Silently takes this field's value from a record (by `name`); does nothing when the record lacks the key. */\n fillFrom(record: Record<string, any>): void {\n const v = this.name ? getPath(record, this.name) : undefined;\n if (v !== undefined) this.setValue(v, true);\n }\n\n /** For subclasses: the user edited the control and the DOM already shows `v`. */\n protected commit(v: V): void {\n const old = this.value;\n this.value = v;\n if (!this.isEqual(old, v)) this.changed(old, false);\n }\n\n private changed(old: V, silent: boolean): void {\n this.updateDirty();\n if (silent) return;\n if (this.config.validateOn === 'change' || this.error) this.validate();\n this.emit('change', this.value, old);\n this.queueSettled();\n }\n\n /** `settled(value)`: the value after the user stopped changing it for `debounce` ms (immediately without `debounce`). */\n private queueSettled(): void {\n this.cancelSettle?.();\n this.cancelSettle = undefined;\n const ms = this.config.debounce;\n if (!ms) return void this.emit('settled', this.value);\n this.cancelSettle = this.later(() => {\n this.cancelSettle = undefined;\n this.emit('settled', this.value);\n }, ms);\n }\n\n /** Fires a pending `settled` now (Enter, blur, end of a drag...). No-op when nothing is waiting. */\n protected flushSettled(): void {\n if (!this.cancelSettle) return;\n this.cancelSettle();\n this.cancelSettle = undefined;\n this.emit('settled', this.value);\n }\n\n private updateDirty(): void {\n const d = this.isDirty();\n if (d === this.dirty) return;\n this.dirty = d;\n if (this.rendered) this.el.classList.toggle('is-dirty', d);\n this.emit('dirty-change', d);\n }\n\n /** What the user sees as this field's value (a select's label, a formatted date); used by summaries such as the StepForm review. */\n getDisplayText(): string {\n const v = this.value;\n return this.isEmpty(v) ? '' : String(v);\n }\n\n /** Sets the empty value (`''`, `null`, `false`...) and emits `change`. */\n clear(): void {\n this.setValue(this.emptyValue());\n }\n\n isDirty(): boolean {\n return !this.isEqual(this.value, this.original);\n }\n\n /** The current value becomes the \"original\" (as after loading or saving). */\n markClean(): void {\n this.original = this.value;\n this.updateDirty();\n }\n\n reset(): void {\n this.setValue(this.original, true);\n this.clearError();\n }\n\n // ---- validation ----------------------------------------------------------------------------\n\n /** Returns the error message for the current value, or `''`. No UI side effects. */\n protected check(): string {\n const v = this.value;\n if (this.isEmpty(v)) return this.config.required ? t('required') : '';\n for (const fn of this.config.validators ?? []) {\n const r = fn(v, this as Field<any>);\n if (typeof r === 'string') return r;\n }\n return '';\n }\n\n validate(): boolean {\n const msg = this.check();\n if (msg) this.setError(msg);\n else this.clearError();\n return !msg;\n }\n\n isValid(): boolean {\n return !this.check();\n }\n\n getError(): string {\n return this.error;\n }\n\n setError(msg: string): void {\n const was = this.error;\n this.error = msg;\n this.paintError();\n if (msg && msg !== was) this.emit('invalid', msg);\n }\n\n clearError(): void {\n if (!this.error) return;\n this.error = '';\n this.paintError();\n this.emit('valid');\n }\n\n private paintError(): void {\n if (!this.rendered) return;\n this.errorEl.textContent = this.error;\n this.el.classList.toggle('is-invalid', !!this.error);\n this.inputEl.setAttribute('aria-invalid', String(!!this.error));\n this.describe();\n }\n\n private describe(): void {\n const ids = [this.error && this.errorEl.id, this.config.help && this.helpEl.id].filter(Boolean);\n if (ids.length) this.inputEl.setAttribute('aria-describedby', ids.join(' '));\n else this.inputEl.removeAttribute('aria-describedby');\n }\n\n // ---- setters -------------------------------------------------------------------------------\n\n setLabel(label: string): void {\n this.config.label = label;\n if (!this.rendered) return;\n this.labelEl.textContent = label;\n this.labelEl.hidden = !label;\n }\n\n setHelp(help: string): void {\n this.config.help = help;\n if (!this.rendered) return;\n this.helpEl.textContent = help;\n this.helpEl.hidden = !help;\n this.describe();\n }\n\n setRequired(required: boolean): void {\n this.config.required = required;\n if (!this.rendered) return;\n this.el.classList.toggle('is-required', required);\n this.inputEl.setAttribute('aria-required', String(required));\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n if (!this.rendered) return;\n this.el.classList.toggle('is-readonly', readonly);\n this.onReadonly(readonly);\n }\n\n setValidators(validators: Validator<V>[]): void {\n this.config.validators = validators;\n }\n\n protected onReadonly(_readonly: boolean): void {}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Field", "Component", "config", "v", "a", "b", "c", "el", "h", "control", "input", "uid", "e", "silent", "old", "record", "getPath", "ms", "d", "t", "fn", "r", "msg", "was", "ids", "label", "help", "required", "readonly", "validators", "_readonly"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as o}from"./chunk-2ZUZ5HDL.js";import{a as l}from"./chunk-A2NKDOYN.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{e as a,f as n}from"./chunk-MW3RWBZ7.js";a("en",{faSave:"Save",faDirty:"Unsaved changes"});a("pt-BR",{faSave:"Salvar",faDirty:"Altera\xE7\xF5es n\xE3o salvas"});var r=class extends l{baseCls="op-formactions";statusEl;buttonsEl;form;save;cancel;extra=[];build(){return this.statusEl=i("span","op-formactions__status",{"aria-live":"polite"}),this.buttonsEl=i("div","op-formactions__buttons"),i("div","op-formactions",{},this.statusEl,this.buttonsEl)}onRender(){let t=this.config,e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;this.form=e,this.extra=(t.buttons??[]).map(s=>new o(s)),this.save=new o({text:t.submitText??n("faSave"),variant:"primary",htmlType:"submit"}),this.buttonsEl.append(...this.extra.map(s=>s.el),this.save.el),this.setCancelText(t.cancelText??n("cancel")),this.setSticky(!!t.sticky),this.form?.on("dirty-change",()=>this.paint()),this.own(()=>[...this.extra,this.save,this.cancel].forEach(s=>s?.destroy())),this.paint()}paint(){let t=!!this.form?.isDirty();this.el.classList.toggle("is-dirty",t),this.statusEl.textContent=t&&this.config.status!==!1?n("faDirty"):"",this.save.setDisabled(!!this.config.requireChanges&&!t)}getForm(){return this.form}setSubmitText(t){this.config.submitText=t,this.save?.setText(t)}setCancelText(t){if(this.config.cancelText=t,!!this.rendered){if(t===!1)return this.cancel?.destroy(),void(this.cancel=void 0);if(this.cancel)return this.cancel.setText(t);this.cancel=new o({text:t,handler:()=>this.emit("cancel")!==!1&&this.form?.reset()}),this.buttonsEl.insertBefore(this.cancel.el,this.save.el)}}setSticky(t){this.config.sticky=t,this.rendered&&this.el.classList.toggle("is-sticky",t)}};c("formactions",r);export{r as a};
2
- //# sourceMappingURL=chunk-3S24ZRPK.js.map
1
+ import{a as o}from"./chunk-ESRS5ZQV.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-UDXO3KM3.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as a,f as n}from"./chunk-S4QD5NID.js";a("en",{faSave:"Save",faDirty:"Unsaved changes"});a("pt-BR",{faSave:"Salvar",faDirty:"Altera\xE7\xF5es n\xE3o salvas"});var r=class extends l{baseCls="op-formactions";statusEl;buttonsEl;form;save;cancel;extra=[];build(){return this.statusEl=i("span","op-formactions__status",{"aria-live":"polite"}),this.buttonsEl=i("div","op-formactions__buttons"),i("div","op-formactions",{},this.statusEl,this.buttonsEl)}onRender(){let t=this.config,e=this.parent;for(;e&&!("focusField"in e&&"getFields"in e);)e=e.parent;this.form=e,this.extra=(t.buttons??[]).map(s=>new o(s)),this.save=new o({text:t.submitText??n("faSave"),variant:"primary",htmlType:"submit"}),this.buttonsEl.append(...this.extra.map(s=>s.el),this.save.el),this.setCancelText(t.cancelText??n("cancel")),this.setSticky(!!t.sticky),this.form?.on("dirty-change",()=>this.paint()),this.own(()=>[...this.extra,this.save,this.cancel].forEach(s=>s?.destroy())),this.paint()}paint(){let t=!!this.form?.isDirty();this.el.classList.toggle("is-dirty",t),this.statusEl.textContent=t&&this.config.status!==!1?n("faDirty"):"",this.save.setDisabled(!!this.config.requireChanges&&!t)}getForm(){return this.form}setSubmitText(t){this.config.submitText=t,this.save?.setText(t)}setCancelText(t){if(this.config.cancelText=t,!!this.rendered){if(t===!1)return this.cancel?.destroy(),void(this.cancel=void 0);if(this.cancel)return this.cancel.setText(t);this.cancel=new o({text:t,handler:()=>this.emit("cancel")!==!1&&this.form?.reset()}),this.buttonsEl.insertBefore(this.cancel.el,this.save.el)}}setSticky(t){this.config.sticky=t,this.rendered&&this.el.classList.toggle("is-sticky",t)}};c("formactions",r);export{r as a};
2
+ //# sourceMappingURL=chunk-RMATRKXV.js.map
@@ -1,2 +1,2 @@
1
- import{a as s}from"./chunk-2ZRNGG2N.js";import{c as r}from"./chunk-4EZJ5FKJ.js";import{b as i}from"./chunk-PZSHOSOS.js";import{a as o}from"./chunk-TIPK3SCJ.js";var n=class extends s{baseCls="op-field op-checkbox";textEl;emptyValue(){return!1}isEmpty(e){return!e}createControl(){let e=this.inputEl=i("input","op-checkbox__input",{type:"checkbox"});this.textEl=i("span","op-checkbox__text");let t=i("span","op-checkbox__box",{},r("check"),i("span","op-checkbox__dash")),c=i("label","op-checkbox__label",{},e,t,this.textEl);return this.listen(e,"change",()=>{if(this.config.readonly)return void(e.checked=this.value);this.config.indeterminate=!1,this.paint(),this.commit(e.checked)}),c}onRender(){super.onRender(),this.setBoxLabel(this.config.boxLabel??""),this.setIndeterminate(!!this.config.indeterminate)}applyValue(e){this.inputEl.checked=!!e,this.paint()}paint(){let e=this.inputEl,t=!!this.config.indeterminate;e.indeterminate=t,e.setAttribute("aria-checked",t?"mixed":String(e.checked)),this.el.classList.toggle("is-checked",e.checked&&!t),this.el.classList.toggle("is-indeterminate",t)}onDisabled(e){this.inputEl.disabled=e}setBoxLabel(e){this.config.boxLabel=e,this.rendered&&(this.textEl.textContent=e,this.textEl.hidden=!e)}setIndeterminate(e){this.config.indeterminate=e,this.rendered&&this.paint()}toggle(){this.setIndeterminate(!1),this.setValue(!this.value)}};o("checkbox",n);export{n as a};
2
- //# sourceMappingURL=chunk-I4SP6JTU.js.map
1
+ import{c as r}from"./chunk-DIOJGTUN.js";import{a as s}from"./chunk-QVBDBGS4.js";import{a as o}from"./chunk-TIPK3SCJ.js";import{b as i}from"./chunk-PZSHOSOS.js";var n=class extends s{baseCls="op-field op-checkbox";textEl;emptyValue(){return!1}isEmpty(e){return!e}createControl(){let e=this.inputEl=i("input","op-checkbox__input",{type:"checkbox"});this.textEl=i("span","op-checkbox__text");let t=i("span","op-checkbox__box",{},r("check"),i("span","op-checkbox__dash")),c=i("label","op-checkbox__label",{},e,t,this.textEl);return this.listen(e,"change",()=>{if(this.config.readonly)return void(e.checked=this.value);this.config.indeterminate=!1,this.paint(),this.commit(e.checked)}),c}onRender(){super.onRender(),this.setBoxLabel(this.config.boxLabel??""),this.setIndeterminate(!!this.config.indeterminate)}applyValue(e){this.inputEl.checked=!!e,this.paint()}paint(){let e=this.inputEl,t=!!this.config.indeterminate;e.indeterminate=t,e.setAttribute("aria-checked",t?"mixed":String(e.checked)),this.el.classList.toggle("is-checked",e.checked&&!t),this.el.classList.toggle("is-indeterminate",t)}onDisabled(e){this.inputEl.disabled=e}setBoxLabel(e){this.config.boxLabel=e,this.rendered&&(this.textEl.textContent=e,this.textEl.hidden=!e)}setIndeterminate(e){this.config.indeterminate=e,this.rendered&&this.paint()}toggle(){this.setIndeterminate(!1),this.setValue(!this.value)}};o("checkbox",n);export{n as a};
2
+ //# sourceMappingURL=chunk-S3ILIWSW.js.map
@@ -0,0 +1,2 @@
1
+ var s={_lang:"en",_currency:"USD",_firstDay:"0",required:"This field is required",minLength:"Enter at least {n} characters",maxLength:"Enter at most {n} characters",pattern:"Invalid format",email:"Enter a valid email address",min:"Must be at least {n}",max:"Must be at most {n}",range:"Must be between {min} and {max}",number:"Enter a valid number",date:"Enter a valid date",loading:"Loading",close:"Close",ok:"OK",cancel:"Cancel",clear:"Clear",collapse:"Collapse",expand:"Expand",empty:"No data",search:"Search",noResults:"No results",results:"{n} results"},c={_lang:"pt-BR",_currency:"BRL",_firstDay:"0",required:"Campo obrigat\xF3rio",minLength:"Informe ao menos {n} caracteres",maxLength:"Informe no m\xE1ximo {n} caracteres",pattern:"Formato inv\xE1lido",email:"Informe um e-mail v\xE1lido",min:"Deve ser no m\xEDnimo {n}",max:"Deve ser no m\xE1ximo {n}",range:"Deve estar entre {min} e {max}",number:"Informe um n\xFAmero v\xE1lido",date:"Informe uma data v\xE1lida",loading:"Carregando",close:"Fechar",ok:"OK",cancel:"Cancelar",clear:"Limpar",collapse:"Recolher",expand:"Expandir",empty:"Sem dados",search:"Pesquisar",noResults:"Nenhum resultado",results:"{n} resultados"},t={en:s,"pt-BR":c},a=s;function l(e){typeof e=="string"?a=t[e]??t[Object.keys(t).find(n=>n.startsWith(e.split("-")[0]))??"en"]:(a={...s,...e},e._lang&&(t[e._lang]=a))}function m(e){a._currency=e}var d=()=>a;function u(e,n){let r=t[e]??={_lang:e};for(let o in n)o in r||(r[o]=n[o])}function g(e,n){let r=a[e]??s[e]??e;return n?r.replace(/\{(\w+)\}/g,(o,i)=>String(n[i]??"")):r}export{t as a,l as b,m as c,d,u as e,g as f};
2
+ //# sourceMappingURL=chunk-S4QD5NID.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/i18n.ts"],
4
+ "sourcesContent": ["export type Locale = Record<string, string>;\n\n// Messages shared by the core and several components. Component-only keys live with the component (addMessages).\nconst en: Locale = {\n _lang: 'en',\n _currency: 'USD',\n _firstDay: '0',\n required: 'This field is required',\n minLength: 'Enter at least {n} characters',\n maxLength: 'Enter at most {n} characters',\n pattern: 'Invalid format',\n email: 'Enter a valid email address',\n min: 'Must be at least {n}',\n max: 'Must be at most {n}',\n range: 'Must be between {min} and {max}',\n number: 'Enter a valid number',\n date: 'Enter a valid date',\n loading: 'Loading',\n close: 'Close',\n ok: 'OK',\n cancel: 'Cancel',\n clear: 'Clear',\n collapse: 'Collapse',\n expand: 'Expand',\n empty: 'No data',\n search: 'Search',\n noResults: 'No results',\n results: '{n} results',\n};\n\nconst ptBR: Locale = {\n _lang: 'pt-BR',\n _currency: 'BRL',\n _firstDay: '0',\n required: 'Campo obrigat\u00F3rio',\n minLength: 'Informe ao menos {n} caracteres',\n maxLength: 'Informe no m\u00E1ximo {n} caracteres',\n pattern: 'Formato inv\u00E1lido',\n email: 'Informe um e-mail v\u00E1lido',\n min: 'Deve ser no m\u00EDnimo {n}',\n max: 'Deve ser no m\u00E1ximo {n}',\n range: 'Deve estar entre {min} e {max}',\n number: 'Informe um n\u00FAmero v\u00E1lido',\n date: 'Informe uma data v\u00E1lida',\n loading: 'Carregando',\n close: 'Fechar',\n ok: 'OK',\n cancel: 'Cancelar',\n clear: 'Limpar',\n collapse: 'Recolher',\n expand: 'Expandir',\n empty: 'Sem dados',\n search: 'Pesquisar',\n noResults: 'Nenhum resultado',\n results: '{n} resultados',\n};\n\nexport const locales: Record<string, Locale> = { en, 'pt-BR': ptBR };\nlet current: Locale = en;\n\n/** Picks a registered locale by name (`'pt-BR'`, or `'pt'` as a prefix) or merges a custom object over English. */\nexport function setLocale(l: string | Locale): void {\n if (typeof l === 'string') {\n current = locales[l] ?? locales[Object.keys(locales).find((k) => k.startsWith(l.split('-')[0])) ?? 'en'];\n } else {\n current = { ...en, ...l };\n if (l._lang) locales[l._lang] = current;\n }\n}\n\n/** The ISO 4217 code that `money` columns and currency fields use (each locale brings its own default). */\nexport function setCurrency(code: string): void {\n current._currency = code;\n}\n\nexport const getLocale = (): Locale => current;\n\n/**\n * Adds messages to a locale (created if missing). Keys already there are kept, so an app's own overrides win.\n * Each component registers its own keys this way, so its messages only ship with it.\n */\nexport function addMessages(lang: string, messages: Locale): void {\n const target = (locales[lang] ??= { _lang: lang });\n for (const k in messages) if (!(k in target)) target[k] = messages[k];\n}\n\n/** Translates a key, replacing `{name}` placeholders. */\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const s = current[key] ?? en[key] ?? key;\n return vars ? s.replace(/\\{(\\w+)\\}/g, (_, k) => String(vars[k] ?? '')) : s;\n}\n"],
5
+ "mappings": "AAGA,IAAMA,EAAa,CACjB,MAAO,KACP,UAAW,MACX,UAAW,IACX,SAAU,yBACV,UAAW,gCACX,UAAW,+BACX,QAAS,iBACT,MAAO,8BACP,IAAK,uBACL,IAAK,sBACL,MAAO,kCACP,OAAQ,uBACR,KAAM,qBACN,QAAS,UACT,MAAO,QACP,GAAI,KACJ,OAAQ,SACR,MAAO,QACP,SAAU,WACV,OAAQ,SACR,MAAO,UACP,OAAQ,SACR,UAAW,aACX,QAAS,aACX,EAEMC,EAAe,CACnB,MAAO,QACP,UAAW,MACX,UAAW,IACX,SAAU,uBACV,UAAW,kCACX,UAAW,sCACX,QAAS,sBACT,MAAO,8BACP,IAAK,4BACL,IAAK,4BACL,MAAO,iCACP,OAAQ,iCACR,KAAM,6BACN,QAAS,aACT,MAAO,SACP,GAAI,KACJ,OAAQ,WACR,MAAO,SACP,SAAU,WACV,OAAQ,WACR,MAAO,YACP,OAAQ,YACR,UAAW,mBACX,QAAS,gBACX,EAEaC,EAAkC,CAAE,GAAAF,EAAI,QAASC,CAAK,EAC/DE,EAAkBH,EAGf,SAASI,EAAUC,EAA0B,CAC9C,OAAOA,GAAM,SACfF,EAAUD,EAAQG,CAAC,GAAKH,EAAQ,OAAO,KAAKA,CAAO,EAAE,KAAMI,GAAMA,EAAE,WAAWD,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAK,IAAI,GAEvGF,EAAU,CAAE,GAAGH,EAAI,GAAGK,CAAE,EACpBA,EAAE,QAAOH,EAAQG,EAAE,KAAK,EAAIF,GAEpC,CAGO,SAASI,EAAYC,EAAoB,CAC9CL,EAAQ,UAAYK,CACtB,CAEO,IAAMC,EAAY,IAAcN,EAMhC,SAASO,EAAYC,EAAcC,EAAwB,CAChE,IAAMC,EAAUX,EAAQS,CAAI,IAAM,CAAE,MAAOA,CAAK,EAChD,QAAWL,KAAKM,EAAgBN,KAAKO,IAASA,EAAOP,CAAC,EAAIM,EAASN,CAAC,EACtE,CAGO,SAASQ,EAAEC,EAAaC,EAAgD,CAC7E,IAAMC,EAAId,EAAQY,CAAG,GAAKf,EAAGe,CAAG,GAAKA,EACrC,OAAOC,EAAOC,EAAE,QAAQ,aAAc,CAACC,EAAGZ,IAAM,OAAOU,EAAKV,CAAC,GAAK,EAAE,CAAC,EAAIW,CAC3E",
6
+ "names": ["en", "ptBR", "locales", "current", "setLocale", "l", "k", "setCurrency", "code", "getLocale", "addMessages", "lang", "messages", "target", "t", "key", "vars", "s", "_"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as p}from"./chunk-W3H7GTJY.js";import{b as a}from"./chunk-OWEQT2HN.js";import{b as i,f as n}from"./chunk-PZSHOSOS.js";import{a as s}from"./chunk-TIPK3SCJ.js";var o=class extends p{baseCls="op-field op-textfield op-textarea";createInput(){return i("textarea","op-textfield__input op-textarea__input",{rows:this.config.rows??3})}onKey(e){if(e.key==="Enter"){(e.ctrlKey||e.metaKey)&&this.emit("enter",this.getValue());return}super.onKey(e)}onInput(){super.onInput(),this.grow()}applyValue(e){super.applyValue(e),this.grow()}notifyMount(){super.notifyMount(),this.grow()}grow(){let e=this.config;if(!e.autoGrow||!this.rendered)return;let t=this.input;t.style.height="auto";let r=t.scrollHeight;if(e.maxRows){let l=a(t,"1lh")||t.scrollHeight/(t.rows||1);r=Math.min(r,l*e.maxRows)}r&&(t.style.height=`${n(r,0,1/0)}px`)}setRows(e){this.config.rows=e,this.rendered&&(this.input.rows=e)}};s("textarea",o);export{o as a};
2
- //# sourceMappingURL=chunk-XHOBNSBO.js.map
1
+ import{a as p}from"./chunk-LHWY6G6Q.js";import{b as a}from"./chunk-OWEQT2HN.js";import{a as s}from"./chunk-TIPK3SCJ.js";import{b as i,f as n}from"./chunk-PZSHOSOS.js";var o=class extends p{baseCls="op-field op-textfield op-textarea";createInput(){return i("textarea","op-textfield__input op-textarea__input",{rows:this.config.rows??3})}onKey(e){if(e.key==="Enter"){(e.ctrlKey||e.metaKey)&&this.emit("enter",this.getValue());return}super.onKey(e)}onInput(){super.onInput(),this.grow()}applyValue(e){super.applyValue(e),this.grow()}notifyMount(){super.notifyMount(),this.grow()}grow(){let e=this.config;if(!e.autoGrow||!this.rendered)return;let t=this.input;t.style.height="auto";let r=t.scrollHeight;if(e.maxRows){let l=a(t,"1lh")||t.scrollHeight/(t.rows||1);r=Math.min(r,l*e.maxRows)}r&&(t.style.height=`${n(r,0,1/0)}px`)}setRows(e){this.config.rows=e,this.rendered&&(this.input.rows=e)}};s("textarea",o);export{o as a};
2
+ //# sourceMappingURL=chunk-SEUIIPHS.js.map
@@ -1,2 +1,2 @@
1
- import{a as i}from"./chunk-A2NKDOYN.js";import{a as o}from"./chunk-TIPK3SCJ.js";var t=class extends i{baseCls="op-spacer";tag="span";onRender(){let e=this.config;e.width==null&&e.flex==null&&!e.line&&(this.el.style.flex="1"),this.setLine(!!e.line)}setLine(e){this.config.line=e,this.rendered&&(this.el.classList.toggle("op-spacer--line",e),e?this.el.setAttribute("role","separator"):this.el.setAttribute("aria-hidden","true"),e&&this.el.removeAttribute("aria-hidden"))}};o("spacer",t);export{t as a};
2
- //# sourceMappingURL=chunk-23XLG2EM.js.map
1
+ import{a as o}from"./chunk-TIPK3SCJ.js";import{f as i}from"./chunk-UDXO3KM3.js";var t=class extends i{baseCls="op-spacer";tag="span";onRender(){let e=this.config;e.width==null&&e.flex==null&&!e.line&&(this.el.style.flex="1"),this.setLine(!!e.line)}setLine(e){this.config.line=e,this.rendered&&(this.el.classList.toggle("op-spacer--line",e),e?this.el.setAttribute("role","separator"):this.el.setAttribute("aria-hidden","true"),e&&this.el.removeAttribute("aria-hidden"))}};o("spacer",t);export{t as a};
2
+ //# sourceMappingURL=chunk-SEW5OCQF.js.map
@@ -0,0 +1,2 @@
1
+ import{a as p}from"./chunk-LHWY6G6Q.js";import{a as m}from"./chunk-TIPK3SCJ.js";import{f as c}from"./chunk-PZSHOSOS.js";import{d as u,f as s}from"./chunk-S4QD5NID.js";var o=class extends p{baseCls="op-field op-textfield op-numberfield";garbage=!1;emptyValue(){return null}isEmpty(e){return e==null}get lang(){return this.config.locale??u()._lang}get decimalSep(){return new Intl.NumberFormat(this.lang).formatToParts(1.5).find(e=>e.type==="decimal").value}parse(e){this.garbage=!1;let t=e.trim();if(!t)return null;let{format:r,scale:i=1}=this.config,n=this.decimalSep,l=Number(t.replace(new RegExp(`[^\\d\\-${n==="."?".":","}]`,"g"),"").replace(n,"."))*(r==="percent"?.01:1);return Number.isNaN(l)||!/\d/.test(t)?(this.garbage=!0,null):Math.round(l*i*1e9)/1e9}display(e){if(e==null)return"";let{format:t="decimal",decimals:r,scale:i=1}=this.config,n=e/i;return t==="decimal"&&r==null?String(n).replace(".",this.decimalSep):new Intl.NumberFormat(this.lang,{style:t,currency:t==="currency"?this.config.currency??u()._currency:void 0,...r!=null&&{minimumFractionDigits:r,maximumFractionDigits:r},useGrouping:t!=="decimal"}).format(n)}createControl(){let e=super.createControl(),t=this.input;return t.setAttribute("inputmode","decimal"),t.setAttribute("role","spinbutton"),this.syncAria(),this.listen(t,"blur",()=>{this.garbage||(this.input.value=this.display(this.value))}),e}syncAria(){let{min:e,max:t}=this.config,r=this.inputEl;e!=null?r.setAttribute("aria-valuemin",String(e)):r.removeAttribute("aria-valuemin"),t!=null?r.setAttribute("aria-valuemax",String(t)):r.removeAttribute("aria-valuemax"),this.value!=null?r.setAttribute("aria-valuenow",String(this.value)):r.removeAttribute("aria-valuenow")}onInput(){super.onInput(),this.syncAria(),this.garbage?this.setError(s("number")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1,this.syncAria()}check(){if(this.garbage)return s("number");let e=super.check(),t=this.value,{min:r,max:i}=this.config;return e||t==null?e:r!=null&&i!=null&&(t<r||t>i)?s("range",{min:r,max:i}):r!=null&&t<r?s("min",{n:r}):i!=null&&t>i?s("max",{n:i}):""}onKey(e){let t=e.key==="PageUp"||e.key==="PageDown";e.key==="ArrowUp"||e.key==="ArrowDown"||t?(e.preventDefault(),this.bump((e.key.endsWith("Up")?1:-1)*(t?10:1))):super.onKey(e)}bump(e){let{step:t=1,min:r,max:i,decimals:n,scale:l=1}=this.config,a=(this.value??0)+t*l*e;(r!=null||i!=null)&&(a=c(a,r??-1/0,i??1/0)),a=Number(a.toFixed(n==null?10:Math.max(0,n+Math.log10(l)))),this.setValue(a)}increment(){this.bump(1)}decrement(){this.bump(-1)}setMin(e){this.config.min=e,this.rendered&&this.syncAria()}setMax(e){this.config.max=e,this.rendered&&this.syncAria()}setStep(e){this.config.step=e}setDecimals(e){this.config.decimals=e,this.rendered&&(this.input.value=this.display(this.value))}};m("numberfield",o);export{o as a};
2
+ //# sourceMappingURL=chunk-T5OGUCY2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/numberfield/numberfield.ts"],
4
+ "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, getLocale } from '../../../core/i18n';\nimport { clamp } from '../../../core/dom';\n\nexport interface NumberFieldConfig extends TextFieldConfig<number | null> {\n min?: number;\n max?: number;\n step?: number;\n /** Fixed decimals shown (and applied when the user leaves the field). */\n decimals?: number;\n /** `currency` and `percent` show through `Intl` (`R$ 1.234,56`, `$1,234.56`, `15%`). Default: plain number. */\n format?: 'decimal' | 'currency' | 'percent';\n /** ISO 4217 code for `format: 'currency'`. Default: the locale's (`setCurrency`). */\n currency?: string;\n /** BCP 47 tag for this field's separators. Default: the active locale. */\n locale?: string;\n /** The value is the shown number times `scale`: `scale: 100` with currency keeps cents as an integer (`123456` shows `1.234,56`). */\n scale?: number;\n}\n\nexport class NumberField extends TextField<number | null, NumberFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-numberfield';\n /** Text that is not a number: reported as an error instead of silently dropped. */\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: number | null) {\n return v == null;\n }\n\n private get lang() {\n return this.config.locale ?? getLocale()._lang;\n }\n private get decimalSep() {\n return new Intl.NumberFormat(this.lang).formatToParts(1.5).find((p) => p.type === 'decimal')!.value;\n }\n\n protected override parse(text: string): number | null {\n this.garbage = false;\n const s = text.trim();\n if (!s) return null;\n const { format, scale = 1 } = this.config;\n const dec = this.decimalSep;\n // what is neither a digit, a sign nor the decimal mark (currency sign, group separator, %) is dropped\n const n = Number(s.replace(new RegExp(`[^\\\\d\\\\-${dec === '.' ? '.' : ','}]`, 'g'), '').replace(dec, '.')) * (format === 'percent' ? 0.01 : 1);\n if (Number.isNaN(n) || !/\\d/.test(s)) {\n this.garbage = true;\n return null;\n }\n return Math.round(n * scale * 1e9) / 1e9;\n }\n\n protected override display(v: number | null): string {\n if (v == null) return '';\n const { format = 'decimal', decimals: d, scale = 1 } = this.config;\n const n = v / scale;\n if (format === 'decimal' && d == null) return String(n).replace('.', this.decimalSep);\n return new Intl.NumberFormat(this.lang, { style: format, currency: format === 'currency' ? (this.config.currency ?? getLocale()._currency) : undefined, ...(d != null && { minimumFractionDigits: d, maximumFractionDigits: d }), useGrouping: format !== 'decimal' }).format(n);\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const i = this.input;\n i.setAttribute('inputmode', 'decimal');\n i.setAttribute('role', 'spinbutton');\n this.syncAria();\n // on blur the text is normalized to the configured decimals\n this.listen(i, 'blur', () => {\n if (!this.garbage) this.input.value = this.display(this.value);\n });\n return wrap;\n }\n\n private syncAria() {\n const { min, max } = this.config;\n const i = this.inputEl;\n if (min != null) i.setAttribute('aria-valuemin', String(min)); else i.removeAttribute('aria-valuemin');\n if (max != null) i.setAttribute('aria-valuemax', String(max)); else i.removeAttribute('aria-valuemax');\n if (this.value != null) i.setAttribute('aria-valuenow', String(this.value)); else i.removeAttribute('aria-valuenow');\n }\n\n protected override onInput() {\n super.onInput();\n this.syncAria();\n if (this.garbage) this.setError(t('number'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: number | null) {\n super.applyValue(v);\n this.garbage = false;\n this.syncAria();\n }\n\n protected override check(): string {\n if (this.garbage) return t('number');\n const base = super.check();\n const v = this.value;\n const { min, max } = this.config;\n if (base || v == null) return base;\n if (min != null && max != null && (v < min || v > max)) return t('range', { min, max });\n if (min != null && v < min) return t('min', { n: min });\n if (max != null && v > max) return t('max', { n: max });\n return '';\n }\n\n protected override onKey(e: KeyboardEvent) {\n const big = e.key === 'PageUp' || e.key === 'PageDown';\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || big) {\n e.preventDefault();\n this.bump((e.key.endsWith('Up') ? 1 : -1) * (big ? 10 : 1));\n } else super.onKey(e);\n }\n\n private bump(times: number) {\n const { step = 1, min, max, decimals, scale = 1 } = this.config;\n let n = (this.value ?? 0) + step * scale * times;\n if (min != null || max != null) n = clamp(n, min ?? -Infinity, max ?? Infinity);\n n = Number(n.toFixed(decimals == null ? 10 : Math.max(0, decimals + Math.log10(scale))));\n this.setValue(n);\n }\n increment() {\n this.bump(1);\n }\n decrement() {\n this.bump(-1);\n }\n\n setMin(min: number | undefined) {\n this.config.min = min;\n if (this.rendered) this.syncAria();\n }\n setMax(max: number | undefined) {\n this.config.max = max;\n if (this.rendered) this.syncAria();\n }\n setStep(step: number) {\n this.config.step = step;\n }\n setDecimals(decimals: number | undefined) {\n this.config.decimals = decimals;\n if (this.rendered) this.input.value = this.display(this.value);\n }\n}\nregister('numberfield', NumberField);\n"],
5
+ "mappings": "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",
6
+ "names": ["NumberField", "TextField", "v", "getLocale", "p", "text", "s", "format", "scale", "dec", "n", "d", "wrap", "i", "min", "max", "t", "base", "big", "times", "step", "decimals", "clamp", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{b as y}from"./chunk-PZSHOSOS.js";import{e as F,f as p}from"./chunk-S4QD5NID.js";F("en",{teNew:"New entry",teHours:"{h}h{m}",teHoursOnly:"{h}h",teMinutes:"{m}m",teTotal:"Total",teAt:"at {time}",teCreated:"{title} created, {range}, {lane}",teMoved:"{title} moved to {range}, {lane}",teResized:"{title} now {range}, {lane}",teRemoved:"{title} removed",teRefused:"That overlaps another entry",teCursor:"{lane}: Enter adds an entry at {time}"});F("pt-BR",{teNew:"Novo apontamento",teHours:"{h}h{m}",teHoursOnly:"{h}h",teMinutes:"{m}min",teTotal:"Total",teAt:"\xE0s {time}",teCreated:"{title} criado, {range}, {lane}",teMoved:"{title} movido para {range}, {lane}",teResized:"{title} agora {range}, {lane}",teRemoved:"{title} removido",teRefused:"Isso se sobrep\xF5e a outro apontamento",teCursor:"{lane}: Enter cria um apontamento \xE0s {time}"});var C=6e4,fe=450;function ee(f){let _=Math.round(f),[E,u]=[Math.floor(_/60),_%60];return E?u?p("teHours",{h:E,m:String(u).padStart(2,"0")}):p("teHoursOnly",{h:E}):p("teMinutes",{m:u})}function ge(f={}){let _=f.step??15,E=f.minDuration??_,u=_*C,g=E*C,G=f.overlap!==!1;return{init(l){let h=l.el,d,b,L,x=new Map,S=y("div","op-sr-only",{"aria-live":"polite"}),D=[],o=()=>l.getScale(),N=()=>o().vertical?{earlier:"ArrowUp",later:"ArrowDown",prev:"ArrowLeft",next:"ArrowRight"}:{earlier:"ArrowLeft",later:"ArrowRight",prev:"ArrowUp",next:"ArrowDown"},H=e=>f.editable?.(e)===!1,R=()=>Array.from(h.querySelectorAll(".op-timeline__lane")),M=e=>e.getAttribute("aria-label")??"",$=(e,t)=>l.getItems().filter(r=>r!==t&&r.start&&(r.lane??"")===e),v=e=>({lane:e.lane??"",start:o().parse(e.start),end:o().parse(e.end??e.start)}),z=e=>o().lo+Math.round((e-o().lo)/u)*u,q=e=>`${((e-o().lo)/(o().hi-o().lo)*100).toFixed(3)}%`,J=(e,t)=>{e.style[o().vertical?"insetBlockStart":"insetInlineStart"]=q(t.start),e.style[o().vertical?"insetBlockEnd":"insetInlineEnd"]=`calc(100% - ${q(t.end)})`},Q=e=>`${o().format(e.start)}\u2013${o().format(e.end)}`.replace(/\d{4}-\d{2}-\d{2}T/g,""),B=(e,t,r)=>S.textContent=p(e,{title:t.title??p("teNew"),range:Q(r),lane:r.lane}),w=()=>l.config.store,K=e=>w()?.getFiltered().find(t=>t.data===e),j=(e,t,r)=>{let n=e.getBoundingClientRect(),[a,s,i]=o().vertical?[r,n.top,n.height]:[t,n.left,n.width],m=i?Math.min(1,Math.max(0,(a-s)/i)):0;return o().lo+m*(o().hi-o().lo)},te=(e,t,r)=>R().find(n=>{let a=n.getBoundingClientRect();return o().vertical?e>=a.left&&e<a.right:t>=a.top&&t<a.bottom})??r,k=e=>e.querySelector(".op-timeline__track"),O=(e,t)=>G||!$(e.lane,t).some(r=>{let n=v(r);return e.start<n.end&&n.start<e.end}),A=(e,t,r)=>{if(G)return e;let n=$(e.lane,r).map(v),a=Math.max(o().lo,...n.filter(i=>i.end<=t.start).map(i=>i.end)),s=Math.min(o().hi,...n.filter(i=>i.start>=t.end).map(i=>i.start));return{...e,start:Math.max(e.start,a),end:Math.min(e.end,s)}};function ne(e,t,r){let n=e.holder.closest(".op-timeline__lane"),a=k(te(t,r,n)),s=z(j(k(n),t,r)),{from:i}=e;if(e.kind==="create")return A({lane:i.lane,start:Math.min(e.anchor,s),end:Math.max(e.anchor+g,s)},{...i,start:e.anchor,end:e.anchor});if(e.kind==="start")return A({...i,start:Math.max(o().lo,Math.min(s,i.end-g))},i,e.item);if(e.kind==="end")return A({...i,end:Math.min(o().hi,Math.max(s,i.start+g))},i,e.item);let m=i.end-i.start,c=Math.min(o().hi-m,Math.max(o().lo,i.start+s-e.anchor));return{lane:f.moveAcrossLanes?M(a.closest(".op-timeline__lane")):i.lane,start:c,end:c+m}}function re(e,t){let r=O(t,e.item)&&t.end-t.start>=g;if(e.invalid=!r,e.bar&&e.bar.classList.toggle("is-invalid",!r),e.ghost?.classList.toggle("is-invalid",!r),!r)return;e.last=t;let n=e.bar??e.ghost,a=R().find(s=>M(s)===t.lane);a&&n.parentElement!==k(a)&&k(a).append(n),J(n,t)}function U(e,t){d=void 0,e.holder.releasePointerCapture?.(e.id),e.holder.classList.remove("is-dragging","is-resizing"),h.classList.remove("is-time-dragging"),e.ghost?.remove(),e.bar?.classList.remove("is-dragging","is-resizing","is-invalid");let r=e.last,n=e.kind!=="create"&&r.lane===e.from.lane&&r.start===e.from.start&&r.end===e.from.end;if(!t||n||e.kind==="create"&&r.end-r.start<u||r.end-r.start<g)return void l.setItems(l.getItems());P(e.kind,e.item,r,e.from)}async function P(e,t,r,n){let a={lane:r.lane,start:o().format(r.start),end:o().format(r.end)};if(!t){if(l.emit("before-create",a)===!1)return void l.setItems(l.getItems());let m={title:p("teNew"),...f.defaults,...a};if(f.form){let I=await f.form(m,"create");if(!I)return void l.setItems(l.getItems());Object.assign(m,I)}let c=w()?w().add(m)[0].data:m;return L=c,l.setItems(w()?l.getItems():[...l.getItems(),c]),B("teCreated",c,r),void l.emit("create",c)}let s={lane:n.lane,start:o().format(n.start),end:o().format(n.end)};if(l.emit("before-change",t,a,s)===!1)return void l.setItems(l.getItems());L=t;let i=K(t);if(i)for(let m of["lane","start","end"])i.set(m,a[m]);else Object.assign(t,a),l.setItems([...l.getItems()]);B(e==="move"||e==="key"?"teMoved":"teResized",t,r),l.emit("change",t,a,s)}async function V(e){if(l.emit("edit",e),!f.form)return;let t=await f.form({...e},"edit");if(!t)return;let r={...e};if(l.emit("before-change",e,t,r)===!1)return;L=e;let n=K(e);if(n)for(let[a,s]of Object.entries(t))n.set(a,s);else Object.assign(e,t),l.setItems([...l.getItems()]);l.emit("change",e,t,r)}function ae(e){if(H(e)||l.emit("before-remove",e)===!1)return;let t=K(e);t?w().remove(t):l.setItems(l.getItems().filter(r=>r!==e)),B("teRemoved",e,v(e)),l.emit("remove",e)}let X=e=>e?l.getItems()[Number(e.dataset.i)]:void 0;function W(e,t){d={...t,last:t.from,id:e.pointerId,invalid:!1},t.holder.setPointerCapture?.(e.pointerId),h.classList.add("is-time-dragging"),t.holder.classList.add(t.kind==="move"||t.kind==="create"?"is-dragging":"is-resizing"),t.bar?.classList.add(t.kind==="move"?"is-dragging":"is-resizing"),t.kind==="create"&&(d.ghost=y("div","op-timeentry__ghost",{"aria-hidden":"true"}),t.holder.append(d.ghost),J(d.ghost,{...t.from,start:t.anchor,end:t.anchor+g}))}let ie=e=>{if(e.button||d)return;let t=e.target,r=t.closest(".op-timeline__bar"),n=t.closest(".op-timeline__lane");if(!n)return;let a=k(n);if(r){let i=X(r);if(!i||H(i))return;let m=t.closest(".op-timeentry__handle--start")?"start":t.closest(".op-timeentry__handle--end")?"end":"move";return e.preventDefault(),W(e,{kind:m,item:i,bar:r,holder:a,from:v(i),anchor:z(j(a,e.clientX,e.clientY))})}if(!t.closest(".op-timeline__track"))return;let s=()=>W(e,{kind:"create",holder:a,from:{lane:M(n),start:0,end:0},anchor:z(j(a,e.clientX,e.clientY))});if(e.pointerType==="touch"){b=setTimeout(()=>(b=void 0,s()),fe);return}e.preventDefault(),s()},oe=e=>{b&&e.pointerType==="touch"&&(clearTimeout(b),b=void 0),!(!d||e.pointerId!==d.id)&&re(d,ne(d,e.clientX,e.clientY))},Z=e=>{clearTimeout(b),b=void 0,d&&e.pointerId===d.id&&U(d,e.type==="pointerup")},se=e=>d&&e.cancelable&&e.preventDefault(),le=e=>{let t=X(e.target.closest(".op-timeline__bar"));t&&!H(t)&&V(t)},me=(e,t,r)=>{let n=v(e),a=t===N().later?1:-1,s=n.end-n.start,i;if(r.altKey&&r.shiftKey)i={...n,start:Math.min(n.end-g,Math.max(o().lo,n.start+a*u))};else if(r.shiftKey)i={...n,end:Math.max(n.start+g,Math.min(o().hi,n.end+a*u))};else{let c=Math.min(o().hi-s,Math.max(o().lo,n.start+a*u));i={...n,start:c,end:c+s}}let m=r.shiftKey?A(i,n,e):i;if(m.end-m.start<g||!O(m,e))return void(S.textContent=p("teRefused"));(m.start!==n.start||m.end!==n.end)&&P("key",e,m,n)},ce=(e,t)=>{let r=R().map(M),n=r[r.indexOf(e.lane??"")+t],a=v(e);n===void 0||!O({...a,lane:n},e)||P("key",e,{...a,lane:n},a)},de=e=>{let t=e.target;if(e.key==="Escape"&&d)return e.stopPropagation(),U(d,!1);let r=t.closest(".op-timeline__bar"),n=X(r);if(n&&r===t){if(H(n))return;let a=N();if(e.key===a.earlier||e.key===a.later)me(n,e.key,e);else if((e.key===a.prev||e.key===a.next)&&f.moveAcrossLanes)ce(n,e.key===a.prev?-1:1);else if(e.key==="Enter")V(n);else if(e.key==="Delete"||e.key==="Backspace")ae(n);else return}else if(t.classList.contains("op-timeline__lane")){let a=M(t),s=x.get(a)??o().lo,i=N();if(e.key===i.earlier||e.key===i.later)x.set(a,Math.min(o().hi-u,Math.max(o().lo,s+(e.key===i.later?u:-u))));else if(e.key==="Enter"){let m=Math.min(o().hi,s+(f.duration??60)*C),c=A({lane:a,start:s,end:m},{lane:a,start:s,end:s});if(c.end-c.start>=g&&O(c))P("create",void 0,c);else return void(S.textContent=p("teRefused"))}else return}else return;e.preventDefault(),e.stopPropagation(),Y()};function Y(){if(!l.getScale())return;let e=l.getItems(),t=0;for(let n of R()){let a=M(n);n.tabIndex=0,n.classList.add("op-timeentry__lane"),n.setAttribute("aria-description",p("teCursor",{lane:a,time:o().format(x.get(a)??o().lo).replace(/^\d{4}-\d{2}-\d{2}T/,"")}));let s=$(a).reduce((c,I)=>c+(v(I).end-v(I).start)/C,0);t+=s;let i=n.querySelector(".op-timeline__lane-name");i.textContent=`${a||"\u2014"} \xB7 ${ee(s)}`;for(let c of["under","met","over"])n.classList.remove(`is-${c}`);f.target&&n.classList.add(s<f.target?"is-under":s===f.target?"is-met":"is-over");let m=x.get(a);if(n.querySelector(".op-timeentry__cursor")?.remove(),m!==void 0){let c=y("div","op-timeentry__cursor",{"aria-hidden":"true"});c.style[o().vertical?"insetBlockStart":"insetInlineStart"]=q(m),k(n).append(c)}}for(let n of Array.from(h.querySelectorAll(".op-timeline__bar"))){let a=e[Number(n.dataset.i)];if(!a)continue;let s=v(a),i=H(a);n.classList.toggle("is-locked",i),n.setAttribute("aria-label",`${a.title}, ${Q(s)}, ${s.lane}`),i?n.setAttribute("aria-disabled","true"):n.querySelector(".op-timeentry__handle")||n.append(y("span","op-timeentry__handle op-timeentry__handle--start",{"aria-hidden":"true"}),y("span","op-timeentry__handle op-timeentry__handle--end",{"aria-hidden":"true"})),a===L&&n.focus()}L=void 0,h.querySelector(".op-timeentry__grand")?.remove();let r=y("div","op-timeentry__grand",{},y("span","",{},p("teTotal")),y("strong","",{},ee(t)));h.append(r,S)}let T=(e,t,r)=>{h.addEventListener(e,t,r),D.push(()=>h.removeEventListener(e,t,r))};return T("pointerdown",ie),T("pointermove",oe),T("pointerup",Z),T("pointercancel",Z),T("dblclick",le),T("keydown",de,!0),T("touchmove",se,{passive:!1}),D.push(l.on("paint",Y)),h.classList.add("op-timeline--entry"),Y(),()=>{clearTimeout(b),D.forEach(e=>e()),D=[],h.classList.remove("op-timeline--entry"),S.remove(),d&&U(d,!1)}}}}export{ee as a,ge as b};
2
+ //# sourceMappingURL=chunk-TMBGEZSD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/timeentry/timeentry.ts"],
4
+ "sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport type { Model } from '../../../data/model';\nimport type { Timeline, TimelineItem, TimelinePlugin } from '../timeline/timeline';\n\naddMessages('en', {\n teNew: 'New entry', teHours: '{h}h{m}', teHoursOnly: '{h}h', teMinutes: '{m}m', teTotal: 'Total', teAt: 'at {time}',\n teCreated: '{title} created, {range}, {lane}', teMoved: '{title} moved to {range}, {lane}', teResized: '{title} now {range}, {lane}', teRemoved: '{title} removed',\n teRefused: 'That overlaps another entry', teCursor: '{lane}: Enter adds an entry at {time}',\n});\naddMessages('pt-BR', {\n teNew: 'Novo apontamento', teHours: '{h}h{m}', teHoursOnly: '{h}h', teMinutes: '{m}min', teTotal: 'Total', teAt: '\u00E0s {time}',\n teCreated: '{title} criado, {range}, {lane}', teMoved: '{title} movido para {range}, {lane}', teResized: '{title} agora {range}, {lane}', teRemoved: '{title} removido',\n teRefused: 'Isso se sobrep\u00F5e a outro apontamento', teCursor: '{lane}: Enter cria um apontamento \u00E0s {time}',\n});\n\nexport interface TimeEntryOptions {\n /** Minutes everything snaps to. Default 15. */\n step?: number;\n /** Shortest entry, in minutes. Default `step`. */\n minDuration?: number;\n /** Length of an entry created with the keyboard, in minutes. Default 60. */\n duration?: number;\n /** `false` keeps two entries of one lane from overlapping: a drag stops at the neighbour, a move is refused. Default `true`. */\n overlap?: boolean;\n /** Let an entry change lane (drag up/down, \u2191/\u2193). Default `false`. */\n moveAcrossLanes?: boolean;\n /** Minutes a lane should add up to: its total is `is-under`, `is-met` or `is-over` that. */\n target?: number;\n /** Return `false` to lock an entry (approved, invoiced): it cannot be moved, resized, edited or removed. */\n editable?: (item: TimelineItem) => boolean;\n /** Fields of a new entry besides `lane`, `start` and `end`. */\n defaults?: Partial<TimelineItem>;\n /**\n * Opens your own dialog to fill a new entry (`'create'`, after the drag or Enter) or to edit one (`'edit'`, double click\n * or Enter on a block). Resolve with the fields to set (`title`, `text`, ...), or with `false` to cancel.\n */\n form?: (item: TimelineItem, mode: 'create' | 'edit') => Promise<Partial<TimelineItem> | false | void> | Partial<TimelineItem> | false | void;\n}\n\ntype Span = { lane: string; start: number; end: number };\ninterface Drag {\n kind: 'create' | 'move' | 'start' | 'end';\n item?: TimelineItem;\n bar?: HTMLElement;\n from: Span;\n anchor: number;\n last: Span;\n ghost?: HTMLElement;\n holder: HTMLElement;\n id: number;\n invalid: boolean;\n}\n\nconst MIN = 60000;\nconst LONG_PRESS = 450;\n\n/** A duration in minutes as people write it: `7h30`, `8h`, `45m`. */\nexport function formatDuration(minutes: number): string {\n const m = Math.round(minutes);\n const [hh, mm] = [Math.floor(m / 60), m % 60];\n if (!hh) return t('teMinutes', { m: mm });\n return mm ? t('teHours', { h: hh, m: String(mm).padStart(2, '0') }) : t('teHoursOnly', { h: hh });\n}\n\n/**\n * Creates, moves, resizes and removes entries on a `range` Timeline: drag an empty lane to create, drag a block to move,\n * its ends to resize; the same with the keyboard (see the ficha). Snaps to `step`, keeps to `from`/`to`, can forbid\n * overlap and lock entries. Shows each lane's total (and a grand total) against `target`.\n *\n * Events on the timeline: `before-create({ lane, start, end })` \u2192 `create(item)`, `before-change(item, next, old)` \u2192\n * `change(item, next, old)`, `before-remove(item)` \u2192 `remove(item)`, `edit(item)` (double click, Enter). With a `store`\n * the records are updated here (the app saves); without, the `items` are.\n * Touch: a block drags at once; an empty lane needs a long press (about half a second) so a swipe still scrolls.\n */\nexport function timeEntry(options: TimeEntryOptions = {}): TimelinePlugin {\n const step = options.step ?? 15;\n const min = options.minDuration ?? step;\n const stepMs = step * MIN;\n const minMs = min * MIN;\n const open = options.overlap !== false;\n\n return {\n init(tl: Timeline) {\n const el = tl.el;\n let drag: Drag | undefined;\n let press: ReturnType<typeof setTimeout> | undefined;\n let refocus: TimelineItem | undefined;\n const cursors = new Map<string, number>();\n const live = h('div', 'op-sr-only', { 'aria-live': 'polite' });\n let off: Array<() => void> = [];\n\n const sc = () => tl.getScale()!;\n /** Time runs along \u2190/\u2192 (horizontal) or \u2191/\u2193 (vertical); lanes change along the other pair. */\n const keys = () => (sc().vertical ? { earlier: 'ArrowUp', later: 'ArrowDown', prev: 'ArrowLeft', next: 'ArrowRight' } : { earlier: 'ArrowLeft', later: 'ArrowRight', prev: 'ArrowUp', next: 'ArrowDown' });\n const lock = (it: TimelineItem) => options.editable?.(it) === false;\n const lanes = () => Array.from(el.querySelectorAll<HTMLElement>('.op-timeline__lane'));\n const laneName = (lane: HTMLElement) => lane.getAttribute('aria-label') ?? '';\n const inLane = (name: string, skip?: TimelineItem) => tl.getItems().filter((x) => x !== skip && x.start && (x.lane ?? '') === name);\n const span = (it: TimelineItem): Span => ({ lane: it.lane ?? '', start: sc().parse(it.start!), end: sc().parse(it.end ?? it.start!) });\n const snap = (v: number) => sc().lo + Math.round((v - sc().lo) / stepMs) * stepMs;\n const pct = (v: number) => `${(((v - sc().lo) / (sc().hi - sc().lo)) * 100).toFixed(3)}%`;\n const place = (node: HTMLElement, s: Span) => {\n node.style[sc().vertical ? 'insetBlockStart' : 'insetInlineStart'] = pct(s.start);\n node.style[sc().vertical ? 'insetBlockEnd' : 'insetInlineEnd'] = `calc(100% - ${pct(s.end)})`;\n };\n const range = (s: Span) => `${sc().format(s.start)}\u2013${sc().format(s.end)}`.replace(/\\d{4}-\\d{2}-\\d{2}T/g, '');\n const say = (key: string, it: Partial<TimelineItem>, s: Span) => (live.textContent = t(key, { title: it.title ?? t('teNew'), range: range(s), lane: s.lane }));\n const store = () => tl.config.store;\n const recOf = (it: TimelineItem): Model | undefined => store()?.getFiltered().find((r) => r.data === it);\n\n const msAt = (track: HTMLElement, x: number, y: number) => {\n const r = track.getBoundingClientRect();\n const [at, from, size] = sc().vertical ? [y, r.top, r.height] : [x, r.left, r.width];\n const f = size ? Math.min(1, Math.max(0, (at - from) / size)) : 0;\n return sc().lo + f * (sc().hi - sc().lo);\n };\n const laneAt = (x: number, y: number, fallback: HTMLElement) =>\n lanes().find((l) => {\n const r = l.getBoundingClientRect();\n return sc().vertical ? x >= r.left && x < r.right : y >= r.top && y < r.bottom;\n }) ?? fallback;\n const trackOf = (lane: HTMLElement) => lane.querySelector<HTMLElement>('.op-timeline__track')!;\n\n const fits = (s: Span, skip?: TimelineItem) => open || !inLane(s.lane, skip).some((x) => { const o = span(x); return s.start < o.end && o.start < s.end; });\n const limit = (s: Span, around: Span, skip?: TimelineItem): Span => {\n if (open) return s;\n const others = inLane(s.lane, skip).map(span);\n const before = Math.max(sc().lo, ...others.filter((o) => o.end <= around.start).map((o) => o.end));\n const after = Math.min(sc().hi, ...others.filter((o) => o.start >= around.end).map((o) => o.start));\n return { ...s, start: Math.max(s.start, before), end: Math.min(s.end, after) };\n };\n\n function candidate(d: Drag, x: number, y: number): Span {\n const own = d.holder.closest<HTMLElement>('.op-timeline__lane')!;\n const track = trackOf(laneAt(x, y, own));\n const at = snap(msAt(trackOf(own), x, y));\n const { from } = d;\n if (d.kind === 'create') return limit({ lane: from.lane, start: Math.min(d.anchor, at), end: Math.max(d.anchor + minMs, at) }, { ...from, start: d.anchor, end: d.anchor });\n if (d.kind === 'start') return limit({ ...from, start: Math.max(sc().lo, Math.min(at, from.end - minMs)) }, from, d.item);\n if (d.kind === 'end') return limit({ ...from, end: Math.min(sc().hi, Math.max(at, from.start + minMs)) }, from, d.item);\n const len = from.end - from.start;\n const start = Math.min(sc().hi - len, Math.max(sc().lo, from.start + at - d.anchor));\n const lane = options.moveAcrossLanes ? laneName(track.closest<HTMLElement>('.op-timeline__lane')!) : from.lane;\n return { lane, start, end: start + len };\n }\n\n function show(d: Drag, s: Span) {\n const ok = fits(s, d.item) && s.end - s.start >= minMs;\n d.invalid = !ok;\n if (d.bar) d.bar.classList.toggle('is-invalid', !ok);\n d.ghost?.classList.toggle('is-invalid', !ok);\n if (!ok) return;\n d.last = s;\n const node = d.bar ?? d.ghost!;\n const lane = lanes().find((l) => laneName(l) === s.lane);\n if (lane && node.parentElement !== trackOf(lane)) trackOf(lane).append(node);\n place(node, s);\n }\n\n function finish(d: Drag, commit: boolean) {\n drag = undefined;\n d.holder.releasePointerCapture?.(d.id);\n d.holder.classList.remove('is-dragging', 'is-resizing');\n el.classList.remove('is-time-dragging');\n d.ghost?.remove();\n d.bar?.classList.remove('is-dragging', 'is-resizing', 'is-invalid');\n const s = d.last;\n const unchanged = d.kind !== 'create' && s.lane === d.from.lane && s.start === d.from.start && s.end === d.from.end;\n if (!commit || unchanged || (d.kind === 'create' && s.end - s.start < stepMs) || s.end - s.start < minMs) return void tl.setItems(tl.getItems());\n apply(d.kind, d.item, s, d.from);\n }\n\n async function apply(kind: Drag['kind'] | 'key', item: TimelineItem | undefined, s: Span, from?: Span) {\n const values = { lane: s.lane, start: sc().format(s.start), end: sc().format(s.end) };\n if (!item) {\n if (tl.emit('before-create', values) === false) return void tl.setItems(tl.getItems());\n const made = { title: t('teNew'), ...options.defaults, ...values } as TimelineItem;\n if (options.form) {\n const filled = await options.form(made, 'create');\n if (!filled) return void tl.setItems(tl.getItems());\n Object.assign(made, filled);\n }\n const item = store() ? store()!.add(made)[0].data : made;\n refocus = item;\n tl.setItems(store() ? tl.getItems() : [...tl.getItems(), item]);\n say('teCreated', item, s);\n return void tl.emit('create', item);\n }\n const old = { lane: from!.lane, start: sc().format(from!.start), end: sc().format(from!.end) };\n if (tl.emit('before-change', item, values, old) === false) return void tl.setItems(tl.getItems());\n refocus = item;\n const rec = recOf(item);\n if (rec) for (const k of ['lane', 'start', 'end'] as const) rec.set(k, values[k]);\n else {\n Object.assign(item, values);\n tl.setItems([...tl.getItems()]);\n }\n say(kind === 'move' || kind === 'key' ? 'teMoved' : 'teResized', item, s);\n tl.emit('change', item, values, old);\n }\n\n /** The dialog's answer to an edit: the fields land on the entry (or its record) like any change. */\n async function edit(item: TimelineItem) {\n tl.emit('edit', item);\n if (!options.form) return;\n const patch = await options.form({ ...item }, 'edit');\n if (!patch) return;\n const old = { ...item };\n if (tl.emit('before-change', item, patch, old) === false) return;\n refocus = item;\n const rec = recOf(item);\n if (rec) for (const [k, v] of Object.entries(patch)) rec.set(k, v);\n else {\n Object.assign(item, patch);\n tl.setItems([...tl.getItems()]);\n }\n tl.emit('change', item, patch, old);\n }\n\n function remove(item: TimelineItem) {\n if (lock(item) || tl.emit('before-remove', item) === false) return;\n const rec = recOf(item);\n if (rec) store()!.remove(rec);\n else tl.setItems(tl.getItems().filter((x) => x !== item));\n say('teRemoved', item, span(item));\n tl.emit('remove', item);\n }\n\n const itemOf = (bar: Element | null) => (bar ? tl.getItems()[Number((bar as HTMLElement).dataset.i)] : undefined);\n\n function begin(e: PointerEvent, d: Omit<Drag, 'id' | 'last' | 'invalid'>) {\n drag = { ...d, last: d.from, id: e.pointerId, invalid: false };\n d.holder.setPointerCapture?.(e.pointerId);\n el.classList.add('is-time-dragging');\n d.holder.classList.add(d.kind === 'move' || d.kind === 'create' ? 'is-dragging' : 'is-resizing');\n d.bar?.classList.add(d.kind === 'move' ? 'is-dragging' : 'is-resizing');\n if (d.kind === 'create') {\n drag.ghost = h('div', 'op-timeentry__ghost', { 'aria-hidden': 'true' });\n d.holder.append(drag.ghost);\n place(drag.ghost, { ...d.from, start: d.anchor, end: d.anchor + minMs });\n }\n }\n\n const onDown = (e: PointerEvent) => {\n if (e.button || drag) return;\n const target = e.target as HTMLElement;\n const bar = target.closest<HTMLElement>('.op-timeline__bar');\n const lane = target.closest<HTMLElement>('.op-timeline__lane');\n if (!lane) return;\n const track = trackOf(lane);\n if (bar) {\n const item = itemOf(bar);\n if (!item || lock(item)) return;\n const kind = target.closest('.op-timeentry__handle--start') ? 'start' : target.closest('.op-timeentry__handle--end') ? 'end' : 'move';\n e.preventDefault();\n return begin(e, { kind, item, bar, holder: track, from: span(item), anchor: snap(msAt(track, e.clientX, e.clientY)) });\n }\n if (!target.closest('.op-timeline__track')) return;\n const go = () => begin(e, { kind: 'create', holder: track, from: { lane: laneName(lane), start: 0, end: 0 }, anchor: snap(msAt(track, e.clientX, e.clientY)) });\n if (e.pointerType === 'touch') {\n press = setTimeout(() => ((press = undefined), go()), LONG_PRESS);\n return;\n }\n e.preventDefault();\n go();\n };\n const onMove = (e: PointerEvent) => {\n if (press && e.pointerType === 'touch') {\n clearTimeout(press);\n press = undefined;\n }\n if (!drag || e.pointerId !== drag.id) return;\n show(drag, candidate(drag, e.clientX, e.clientY));\n };\n const onUp = (e: PointerEvent) => {\n clearTimeout(press);\n press = undefined;\n if (drag && e.pointerId === drag.id) finish(drag, e.type === 'pointerup');\n };\n const onTouchMove = (e: TouchEvent) => drag && e.cancelable && e.preventDefault();\n const onDouble = (e: Event) => {\n const item = itemOf((e.target as HTMLElement).closest('.op-timeline__bar'));\n if (item && !lock(item)) void edit(item);\n };\n\n const move = (item: TimelineItem, key: string, e: KeyboardEvent) => {\n const s = span(item);\n const dir = key === keys().later ? 1 : -1;\n const len = s.end - s.start;\n let next: Span;\n if (e.altKey && e.shiftKey) next = { ...s, start: Math.min(s.end - minMs, Math.max(sc().lo, s.start + dir * stepMs)) };\n else if (e.shiftKey) next = { ...s, end: Math.max(s.start + minMs, Math.min(sc().hi, s.end + dir * stepMs)) };\n else {\n const start = Math.min(sc().hi - len, Math.max(sc().lo, s.start + dir * stepMs));\n next = { ...s, start, end: start + len };\n }\n const bounded = e.shiftKey ? limit(next, s, item) : next;\n if (bounded.end - bounded.start < minMs || !fits(bounded, item)) return void (live.textContent = t('teRefused'));\n if (bounded.start !== s.start || bounded.end !== s.end) apply('key', item, bounded, s);\n };\n const hop = (item: TimelineItem, dir: number) => {\n const names = lanes().map(laneName);\n const to = names[names.indexOf(item.lane ?? '') + dir];\n const s = span(item);\n if (to === undefined || !fits({ ...s, lane: to }, item)) return;\n apply('key', item, { ...s, lane: to }, s);\n };\n\n const onKey = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if (e.key === 'Escape' && drag) {\n e.stopPropagation();\n return finish(drag, false);\n }\n const bar = target.closest<HTMLElement>('.op-timeline__bar');\n const item = itemOf(bar);\n if (item && bar === target) {\n if (lock(item)) return;\n const k = keys();\n if (e.key === k.earlier || e.key === k.later) move(item, e.key, e);\n else if ((e.key === k.prev || e.key === k.next) && options.moveAcrossLanes) hop(item, e.key === k.prev ? -1 : 1);\n else if (e.key === 'Enter') void edit(item);\n else if (e.key === 'Delete' || e.key === 'Backspace') remove(item);\n else return;\n } else if (target.classList.contains('op-timeline__lane')) {\n const name = laneName(target);\n const at = cursors.get(name) ?? sc().lo;\n const k = keys();\n if (e.key === k.earlier || e.key === k.later) cursors.set(name, Math.min(sc().hi - stepMs, Math.max(sc().lo, at + (e.key === k.later ? stepMs : -stepMs))));\n else if (e.key === 'Enter') {\n const end = Math.min(sc().hi, at + (options.duration ?? 60) * MIN);\n const s = limit({ lane: name, start: at, end }, { lane: name, start: at, end: at });\n if (s.end - s.start >= minMs && fits(s)) apply('create', undefined, s);\n else return void (live.textContent = t('teRefused'));\n } else return;\n } else return;\n e.preventDefault();\n e.stopPropagation();\n decorate();\n };\n\n function decorate() {\n if (!tl.getScale()) return;\n const items = tl.getItems();\n let all = 0;\n for (const lane of lanes()) {\n const name = laneName(lane);\n lane.tabIndex = 0;\n lane.classList.add('op-timeentry__lane');\n lane.setAttribute('aria-description', t('teCursor', { lane: name, time: sc().format(cursors.get(name) ?? sc().lo).replace(/^\\d{4}-\\d{2}-\\d{2}T/, '') }));\n const total = inLane(name).reduce((n, x) => n + (span(x).end - span(x).start) / MIN, 0);\n all += total;\n const label = lane.querySelector('.op-timeline__lane-name')!;\n label.textContent = `${name || '\u2014'} \u00B7 ${formatDuration(total)}`;\n for (const k of ['under', 'met', 'over']) lane.classList.remove(`is-${k}`);\n if (options.target) lane.classList.add(total < options.target ? 'is-under' : total === options.target ? 'is-met' : 'is-over');\n const cur = cursors.get(name);\n lane.querySelector('.op-timeentry__cursor')?.remove();\n if (cur !== undefined) {\n const c = h('div', 'op-timeentry__cursor', { 'aria-hidden': 'true' });\n c.style[sc().vertical ? 'insetBlockStart' : 'insetInlineStart'] = pct(cur);\n trackOf(lane).append(c);\n }\n }\n for (const bar of Array.from(el.querySelectorAll<HTMLElement>('.op-timeline__bar'))) {\n const item = items[Number(bar.dataset.i)];\n if (!item) continue;\n const s = span(item);\n const locked = lock(item);\n bar.classList.toggle('is-locked', locked);\n bar.setAttribute('aria-label', `${item.title}, ${range(s)}, ${s.lane}`);\n if (locked) bar.setAttribute('aria-disabled', 'true');\n else if (!bar.querySelector('.op-timeentry__handle')) bar.append(h('span', 'op-timeentry__handle op-timeentry__handle--start', { 'aria-hidden': 'true' }), h('span', 'op-timeentry__handle op-timeentry__handle--end', { 'aria-hidden': 'true' }));\n if (item === refocus) bar.focus();\n }\n refocus = undefined;\n el.querySelector('.op-timeentry__grand')?.remove();\n const grand = h('div', 'op-timeentry__grand', {}, h('span', '', {}, t('teTotal')), h('strong', '', {}, formatDuration(all)));\n el.append(grand, live);\n }\n\n const on = <E extends Event>(type: string, fn: (e: E) => void, opts?: AddEventListenerOptions | boolean) => {\n el.addEventListener(type, fn as EventListener, opts);\n off.push(() => el.removeEventListener(type, fn as EventListener, opts));\n };\n on('pointerdown', onDown);\n on('pointermove', onMove);\n on('pointerup', onUp);\n on('pointercancel', onUp);\n on('dblclick', onDouble);\n on('keydown', onKey, true);\n on('touchmove', onTouchMove, { passive: false });\n off.push(tl.on('paint', decorate));\n el.classList.add('op-timeline--entry');\n decorate();\n return () => {\n clearTimeout(press);\n off.forEach((f) => f());\n off = [];\n el.classList.remove('op-timeline--entry');\n live.remove();\n if (drag) finish(drag, false);\n };\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "MIN", "LONG_PRESS", "formatDuration", "minutes", "m", "hh", "mm", "t", "timeEntry", "options", "step", "min", "stepMs", "minMs", "open", "tl", "el", "drag", "press", "refocus", "cursors", "live", "h", "off", "sc", "keys", "lock", "it", "lanes", "laneName", "lane", "inLane", "name", "skip", "x", "span", "snap", "v", "pct", "place", "node", "s", "range", "say", "key", "store", "recOf", "r", "msAt", "track", "y", "at", "from", "size", "f", "laneAt", "fallback", "l", "trackOf", "fits", "o", "limit", "around", "others", "before", "after", "candidate", "d", "own", "len", "start", "show", "ok", "finish", "commit", "unchanged", "apply", "kind", "item", "values", "made", "filled", "old", "rec", "k", "edit", "patch", "remove", "itemOf", "bar", "begin", "onDown", "target", "go", "onMove", "onUp", "onTouchMove", "onDouble", "move", "e", "dir", "next", "bounded", "hop", "names", "to", "onKey", "end", "decorate", "items", "all", "total", "n", "label", "cur", "locked", "grand", "on", "type", "fn", "opts"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as g}from"./chunk-LHWY6G6Q.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{e as h,f as m}from"./chunk-S4QD5NID.js";h("en",{maskIncomplete:"Complete the format {mask}"});h("pt-BR",{maskIncomplete:"Complete o formato {mask}"});var f={0:/\d/,A:/\p{L}/u,"*":/./su};function u(l){let t=[];for(let e=0;e<l.length;e++){let i=l[e];i==="\\"&&e+1<l.length?t.push({lit:l[++e]}):t.push(i in f?{kind:i}:{lit:i})}return t}var c=l=>l.filter(t=>"kind"in t).length,p=class extends g{baseCls="op-field op-textfield op-maskfield";masks=[];compiled(){let t=this.config.mask;return this.masks=(Array.isArray(t)?t:[t]).map(u).sort((e,i)=>c(e)-c(i))}extract(t){let e=this.masks.length?this.masks:this.compiled(),i=new Set(e.flatMap(r=>r.flatMap(o=>"lit"in o?[o.lit]:[]))),s=e.some(r=>r.some(o=>"kind"in o&&o.kind==="*")),n="";for(let r of t)i.has(r)&&(!s||!/[\p{L}\d]/u.test(r))||(n+=r);return n}pick(t){let e=this.masks.length?this.masks:this.compiled();return e.find(i=>c(i)>=t.length)??e[e.length-1]}format(t,e=this.pick(t)){let i="",s=0;for(let n of e){if(s>=t.length)break;if("lit"in n){i+=n.lit;continue}for(;s<t.length&&!f[n.kind].test(t[s]);)s++;s<t.length&&(i+=t[s++])}return i}norm(t){let e=this.format(this.extract(t??""));return this.config.raw?this.extract(e):e}display(t){return this.format(this.extract(t??""))}setValue(t,e=!1){super.setValue(this.norm(t),e)}createControl(){let t=super.createControl(),e=this.compiled()[0];return this.config.placeholder||(this.input.placeholder=e.map(i=>"lit"in i?i.lit:"_").join("")),this.masks.every(i=>i.every(s=>"lit"in s||s.kind==="0"))&&this.input.setAttribute("inputmode","numeric"),t}onInput(){let t=this.input,e=t.selectionStart??t.value.length,i=this.extract(t.value.slice(0,e)).length,s=this.extract(t.value),n=this.format(s),r=e>=t.value.length;if(t.value=n,!r&&document.activeElement===t){let o=0,a=0;for(;a<n.length&&o<i;)this.extract(n[a++]).length&&o++;t.setSelectionRange(a,a)}this.el.classList.toggle("has-value",!!n),this.commit(this.config.raw?this.extract(n):n),this.error&&this.validate()}check(){let t=super.check(),e=this.extract(this.value??"");if(t||!e)return t;let i=this.pick(e);return e.length<c(i)?m("maskIncomplete",{mask:i.map(s=>"lit"in s?s.lit:"_").join("")}):""}setMask(t){this.config.mask=t,this.compiled(),this.rendered&&this.setValue(this.value,!0)}};d("maskfield",p);export{p as a};
2
+ //# sourceMappingURL=chunk-TVO3Z2BM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/maskfield/maskfield.ts"],
4
+ "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, addMessages } from '../../../core/i18n';\n\naddMessages('en', { maskIncomplete: 'Complete the format {mask}' });\naddMessages('pt-BR', { maskIncomplete: 'Complete o formato {mask}' });\n\nexport interface MaskFieldConfig extends TextFieldConfig {\n /**\n * The pattern: `0` a digit, `A` a letter, `*` any character, `\\` makes the next character a literal. A list picks the\n * pattern by length: `['000.000.000-00', '00.000.000/0000-00']` is a CPF until the 12th digit, then a CNPJ.\n * The core knows no country: formats like these belong to the app.\n */\n mask: string | string[];\n /** The value is only what was typed into the slots (`12345678900`), not the formatted text (`123.456.789-00`). Default false. */\n raw?: boolean;\n}\n\ntype Slot = { kind: '0' | 'A' | '*' } | { lit: string };\nconst KINDS: Record<string, RegExp> = { 0: /\\d/, A: /\\p{L}/u, '*': /./su };\n\nfunction compile(mask: string): Slot[] {\n const out: Slot[] = [];\n for (let i = 0; i < mask.length; i++) {\n const ch = mask[i];\n if (ch === '\\\\' && i + 1 < mask.length) out.push({ lit: mask[++i] });\n else out.push(ch in KINDS ? { kind: ch as '0' | 'A' | '*' } : { lit: ch });\n }\n return out;\n}\nconst slots = (m: Slot[]) => m.filter((s) => 'kind' in s).length;\n\n/** A text field that formats what is typed into a pattern (phone, tax id, postal code, plate...). */\nexport class MaskField extends TextField<string, MaskFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-maskfield';\n private masks: Slot[][] = [];\n\n private compiled(): Slot[][] {\n const m = this.config.mask;\n return (this.masks = (Array.isArray(m) ? m : [m]).map(compile).sort((a, b) => slots(a) - slots(b)));\n }\n\n /** What was typed into the slots: the literals of the patterns are dropped (with a `*` slot, only where the text repeats one). */\n private extract(text: string): string {\n const masks = this.masks.length ? this.masks : this.compiled();\n const lits = new Set(masks.flatMap((m) => m.flatMap((s) => ('lit' in s ? [s.lit] : []))));\n const wild = masks.some((m) => m.some((s) => 'kind' in s && s.kind === '*'));\n let out = '';\n for (const ch of text) if (!(lits.has(ch) && (!wild || !/[\\p{L}\\d]/u.test(ch)))) out += ch;\n return out;\n }\n\n private pick(raw: string): Slot[] {\n const masks = this.masks.length ? this.masks : this.compiled();\n return masks.find((m) => slots(m) >= raw.length) ?? masks[masks.length - 1];\n }\n\n private format(raw: string, mask = this.pick(raw)): string {\n let out = '';\n let i = 0;\n for (const s of mask) {\n if (i >= raw.length) break;\n if ('lit' in s) {\n out += s.lit;\n continue;\n }\n while (i < raw.length && !KINDS[s.kind].test(raw[i])) i++;\n if (i < raw.length) out += raw[i++];\n }\n return out;\n }\n\n private norm(v: string | null): string {\n const text = this.format(this.extract(v ?? ''));\n return this.config.raw ? this.extract(text) : text;\n }\n\n protected override display(v: string): string {\n return this.format(this.extract(v ?? ''));\n }\n\n override setValue(v: string, silent = false): void {\n super.setValue(this.norm(v), silent);\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const sample = this.compiled()[0];\n if (!this.config.placeholder) this.input.placeholder = sample.map((s) => ('lit' in s ? s.lit : '_')).join('');\n if (this.masks.every((m) => m.every((s) => 'lit' in s || s.kind === '0'))) this.input.setAttribute('inputmode', 'numeric');\n return wrap;\n }\n\n protected override onInput() {\n const input = this.input;\n const caret = input.selectionStart ?? input.value.length;\n const before = this.extract(input.value.slice(0, caret)).length;\n const raw = this.extract(input.value);\n const text = this.format(raw);\n const atEnd = caret >= input.value.length;\n input.value = text;\n if (!atEnd && document.activeElement === input) {\n // the caret stays after the same number of typed characters\n let n = 0;\n let pos = 0;\n while (pos < text.length && n < before) if (this.extract(text[pos++]).length) n++;\n input.setSelectionRange(pos, pos);\n }\n this.el.classList.toggle('has-value', !!text);\n this.commit(this.config.raw ? this.extract(text) : text);\n if (this.error) this.validate();\n }\n\n protected override check(): string {\n const base = super.check();\n const raw = this.extract(this.value ?? '');\n if (base || !raw) return base;\n const mask = this.pick(raw);\n if (raw.length < slots(mask)) return t('maskIncomplete', { mask: mask.map((s) => ('lit' in s ? s.lit : '_')).join('') });\n return '';\n }\n\n setMask(mask: string | string[]) {\n this.config.mask = mask;\n this.compiled();\n if (this.rendered) this.setValue(this.value, true);\n }\n}\nregister('maskfield', MaskField);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "KINDS", "compile", "mask", "out", "i", "ch", "slots", "m", "s", "MaskField", "TextField", "a", "b", "text", "masks", "lits", "wild", "raw", "v", "silent", "wrap", "sample", "input", "caret", "before", "atEnd", "n", "pos", "base", "t", "register"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as c}from"./chunk-GNU4VOOE.js";import{c as h}from"./chunk-ZWNQREWS.js";import{a as b}from"./chunk-2ZUZ5HDL.js";import{c as a}from"./chunk-4EZJ5FKJ.js";import{b as i,c as r}from"./chunk-PZSHOSOS.js";import{a as p}from"./chunk-TIPK3SCJ.js";import{f as l}from"./chunk-MW3RWBZ7.js";var d=class extends h{baseCls="op-panel";headerEl;titleEl;bodyEl;toolsEl;iconHost;toggleBtn;bars=[];bodyId=r("op-body");titleId=r("op-title");getBody(){return this.bodyEl}build(){let e=this.config,t=i("div",this.baseCls,{role:"region","aria-labelledby":this.titleId});this.iconHost=i("span","op-panel__icon"),this.titleEl=i("span","op-panel__title",{id:this.titleId}),this.toolsEl=i("div","op-panel__tools"),this.headerEl=i("div","op-panel__header",{},this.iconHost,this.titleEl,this.toolsEl),this.bodyEl=i("div",`op-panel__body ${e.bodyCls??""}`,{id:this.bodyId}),t.append(this.headerEl);let o=(s,f)=>{let n=new c({items:s,cls:f});return n.parent=this,this.bars.push(n),n.el};return e.tbar&&t.append(o(e.tbar,"op-panel__tbar")),t.append(this.bodyEl),e.bbar&&t.append(o(e.bbar,"op-panel__bbar")),e.buttons&&t.append(o(["->",...e.buttons.map(s=>new b(s))],"op-panel__footer")),t}onRender(){super.onRender();let e=this.config;this.setTitle(e.title??""),this.setIcon(e.icon??"");for(let t of e.tools??[])this.addTool(t.icon,t.label,o=>t.handler?.(this,o));e.reloadable&&this.addTool("refresh",l("reload"),()=>{this.reload()}),e.collapsible&&(this.toggleBtn=this.addTool("chevron-up",l("collapse"),()=>this.toggle()),this.toggleBtn.setAttribute("aria-controls",this.bodyId),this.el.classList.add("op-panel--collapsible"),this.listen(this.titleEl,"click",()=>this.toggle())),e.closable&&this.addTool("x",l("close"),()=>this.close()),this.setCollapsed(!!e.collapsed),this.updateHeader()}addTool(e,t,o){let s=i("button","op-panel__tool",{type:"button","aria-label":t,"data-op-tip":t},a(e));return this.listen(s,"click",o),this.toolsEl.append(s),s}updateHeader(){let e=this.config;this.headerEl.hidden=!e.title&&!e.icon&&!e.collapsible&&!e.closable&&!e.reloadable&&!e.tools?.length}async reload(){let e=this.el;return e.classList.contains("is-reloading")||this.emit("before-reload")===!1?!1:(e.classList.add("is-reloading"),this.setLoading(!0),await Promise.resolve(this.config.onReload?.(this)).catch(()=>0),this.setLoading(!1),e.classList.remove("is-reloading"),this.emit("reload"),!0)}setTitle(e){this.config.title=e,this.rendered&&(this.titleEl.textContent=e,this.updateHeader())}setIcon(e){this.config.icon=e,this.rendered&&(this.iconHost.replaceChildren(...e?[a(e)]:[]),this.iconHost.hidden=!e,this.updateHeader())}setCollapsed(e){if(this.config.collapsed=e,!!this.rendered){this.el.classList.toggle("is-collapsed",e);for(let t of[this.bodyEl,...this.bars.map(o=>o.el)])t.hidden=e;this.toggleBtn&&(this.toggleBtn.setAttribute("aria-expanded",String(!e)),this.toggleBtn.setAttribute("aria-label",l(e?"expand":"collapse")))}}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}close(){this.emit("before-close")!==!1&&(this.emit("close"),this.config.closeAction==="hide"?this.hide():this.destroy())}onDestroy(){super.onDestroy(),this.bars.forEach(e=>e.destroy())}};p("panel",d);export{d as a};
2
- //# sourceMappingURL=chunk-LQRFNQ2N.js.map
1
+ import{a as c}from"./chunk-3F4MN2BU.js";import{a as b}from"./chunk-ESRS5ZQV.js";import{c as a}from"./chunk-DIOJGTUN.js";import{c as h}from"./chunk-BQEFLPDA.js";import{a as p}from"./chunk-TIPK3SCJ.js";import{b as i,c as r}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-S4QD5NID.js";var d=class extends h{baseCls="op-panel";headerEl;titleEl;bodyEl;toolsEl;iconHost;toggleBtn;bars=[];bodyId=r("op-body");titleId=r("op-title");getBody(){return this.bodyEl}build(){let e=this.config,t=i("div",this.baseCls,{role:"region","aria-labelledby":this.titleId});this.iconHost=i("span","op-panel__icon"),this.titleEl=i("span","op-panel__title",{id:this.titleId}),this.toolsEl=i("div","op-panel__tools"),this.headerEl=i("div","op-panel__header",{},this.iconHost,this.titleEl,this.toolsEl),this.bodyEl=i("div",`op-panel__body ${e.bodyCls??""}`,{id:this.bodyId}),t.append(this.headerEl);let o=(s,f)=>{let n=new c({items:s,cls:f});return n.parent=this,this.bars.push(n),n.el};return e.tbar&&t.append(o(e.tbar,"op-panel__tbar")),t.append(this.bodyEl),e.bbar&&t.append(o(e.bbar,"op-panel__bbar")),e.buttons&&t.append(o(["->",...e.buttons.map(s=>new b(s))],"op-panel__footer")),t}onRender(){super.onRender();let e=this.config;this.setTitle(e.title??""),this.setIcon(e.icon??"");for(let t of e.tools??[])this.addTool(t.icon,t.label,o=>t.handler?.(this,o));e.reloadable&&this.addTool("refresh",l("reload"),()=>{this.reload()}),e.collapsible&&(this.toggleBtn=this.addTool("chevron-up",l("collapse"),()=>this.toggle()),this.toggleBtn.setAttribute("aria-controls",this.bodyId),this.el.classList.add("op-panel--collapsible"),this.listen(this.titleEl,"click",()=>this.toggle())),e.closable&&this.addTool("x",l("close"),()=>this.close()),this.setCollapsed(!!e.collapsed),this.updateHeader()}addTool(e,t,o){let s=i("button","op-panel__tool",{type:"button","aria-label":t,"data-op-tip":t},a(e));return this.listen(s,"click",o),this.toolsEl.append(s),s}updateHeader(){let e=this.config;this.headerEl.hidden=!e.title&&!e.icon&&!e.collapsible&&!e.closable&&!e.reloadable&&!e.tools?.length}async reload(){let e=this.el;return e.classList.contains("is-reloading")||this.emit("before-reload")===!1?!1:(e.classList.add("is-reloading"),this.setLoading(!0),await Promise.resolve(this.config.onReload?.(this)).catch(()=>0),this.setLoading(!1),e.classList.remove("is-reloading"),this.emit("reload"),!0)}setTitle(e){this.config.title=e,this.rendered&&(this.titleEl.textContent=e,this.updateHeader())}setIcon(e){this.config.icon=e,this.rendered&&(this.iconHost.replaceChildren(...e?[a(e)]:[]),this.iconHost.hidden=!e,this.updateHeader())}setCollapsed(e){if(this.config.collapsed=e,!!this.rendered){this.el.classList.toggle("is-collapsed",e);for(let t of[this.bodyEl,...this.bars.map(o=>o.el)])t.hidden=e;this.toggleBtn&&(this.toggleBtn.setAttribute("aria-expanded",String(!e)),this.toggleBtn.setAttribute("aria-label",l(e?"expand":"collapse")))}}collapse(){this.config.collapsed||this.emit("before-collapse")===!1||(this.setCollapsed(!0),this.emit("collapse"))}expand(){!this.config.collapsed||this.emit("before-expand")===!1||(this.setCollapsed(!1),this.emit("expand"))}toggle(){this.config.collapsed?this.expand():this.collapse()}close(){this.emit("before-close")!==!1&&(this.emit("close"),this.config.closeAction==="hide"?this.hide():this.destroy())}onDestroy(){super.onDestroy(),this.bars.forEach(e=>e.destroy())}};p("panel",d);export{d as a};
2
+ //# sourceMappingURL=chunk-U25QSLAH.js.map
@@ -0,0 +1,2 @@
1
+ import{a as h}from"./chunk-OADWLPSF.js";import{a as w}from"./chunk-ADHKL2GM.js";import{a as R}from"./chunk-2I7HDIOU.js";import{a as m}from"./chunk-SEUIIPHS.js";import{a as y}from"./chunk-BRGT4O6Q.js";import{a as v}from"./chunk-3OA3P37P.js";import{a as F}from"./chunk-QOSTS5I3.js";import{a}from"./chunk-TVO3Z2BM.js";import{a as c}from"./chunk-G26R2F3W.js";import{a as I}from"./chunk-6TZJO2G2.js";import{a as u}from"./chunk-S3ILIWSW.js";import{a as b}from"./chunk-BTGJ3MP4.js";import{a as k}from"./chunk-AJN66F32.js";import{a as l}from"./chunk-5GCTM37D.js";import{a as d}from"./chunk-NAUSRVB6.js";import{a as p}from"./chunk-EO777UIN.js";import{a as O}from"./chunk-FSR6BDVO.js";import{a as f}from"./chunk-T5OGUCY2.js";import{a as C}from"./chunk-OB3VIRQR.js";import{a as x}from"./chunk-U25QSLAH.js";import{a as T}from"./chunk-3F4MN2BU.js";import{a as g}from"./chunk-LHWY6G6Q.js";import{a as s}from"./chunk-ESRS5ZQV.js";import{c as e}from"./chunk-BQEFLPDA.js";var n=(t,r,i,o={})=>new t({name:r,label:i,...o}),$={text:(t,r,i)=>n(g,t,r,i),email:(t,r,i)=>n(g,t,r,{inputType:"email",...i}),password:(t,r,i)=>n(g,t,r,{inputType:"password",...i}),area:(t,r,i)=>n(m,t,r,i),number:(t,r,i)=>n(f,t,r,i),mask:(t,r,i,o)=>n(a,t,r,{mask:i,...o}),time:(t,r,i)=>n(p,t,r,i),date:(t,r,i)=>n(C,t,r,i),datetime:(t,r,i)=>n(d,t,r,i),dateRange:(t,r,i)=>n(l,t,r,i),secret:(t,r,i)=>n(I,t,r,i),slider:(t,r,i)=>n(R,t,r,i),dial:(t,r,i)=>n(O,t,r,i),check:(t,r,i)=>n(u,t,void 0,{boxLabel:r,...i}),toggle:(t,r,i)=>n(y,t,void 0,{boxLabel:r,...i}),radio:(t,r,i,o)=>n(c,t,r,{options:i,...o}),checkGroup:(t,r,i,o)=>n(b,t,r,{options:i,...o}),select:(t,r,i,o)=>n(w,t,r,{options:i,...o}),combo:(t,r,i,o)=>n(k,t,r,{options:i,...o}),suggest:(t,r,i,o)=>n(F,t,r,{query:i,...o}),lookup:(t,r,i,o)=>n(v,t,r,{lookup:i,...o}),button:(t,r,i)=>new s({text:t,handler:r,...i}),primary:(t,r,i)=>new s({text:t,handler:r,variant:"primary",...i}),danger:(t,r,i)=>new s({text:t,handler:r,variant:"danger",...i}),row:(...t)=>new e({layout:"hbox",items:t}),col:(...t)=>new e({layout:"vbox",items:t}),grid:(t,...r)=>new e({layout:{type:"grid",columns:t},items:r}),panel:(t,r,i)=>new x({title:t,items:r,...i}),toolbar:(...t)=>new T({items:t}),form:(t,r)=>new h({items:t,...r})};export{$ as a};
2
+ //# sourceMappingURL=chunk-UCWICDYG.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui/ui.ts"],
4
+ "sourcesContent": ["// Short constructors for the things you write most. They return real component instances (the classes), so they can be\n// used anywhere a config goes: `items: [ui.text('name', 'Name', { required: true }), ui.select('plan', 'Plan', ['Free', 'Pro'])]`.\n// The last argument is always a config object that overrides or adds anything (`{ required: true, help: '\u2026' }`).\nimport { TextField, type TextFieldConfig } from '../components/fields/textfield/textfield';\nimport { TextArea } from '../components/fields/textarea/textarea';\nimport { NumberField } from '../components/fields/numberfield/numberfield';\nimport { MaskField } from '../components/fields/maskfield/maskfield';\nimport { TimeField } from '../components/fields/timefield/timefield';\nimport { DateTimeField } from '../components/fields/datetimefield/datetimefield';\nimport { DateField } from '../components/fields/datefield/datefield';\nimport { DateRangeField } from '../components/fields/daterangefield/daterangefield';\nimport { Checkbox } from '../components/fields/checkbox/checkbox';\nimport { Toggle } from '../components/fields/toggle/toggle';\nimport { CheckboxGroup } from '../components/fields/checkboxgroup/checkboxgroup';\nimport { RadioGroup, type RadioOption } from '../components/fields/radiogroup/radiogroup';\nimport { Select } from '../components/fields/select/select';\nimport { ComboBox } from '../components/fields/combobox/combobox';\nimport { SuggestField } from '../components/fields/suggestfield/suggestfield';\nimport { LookupField } from '../components/fields/lookupfield/lookupfield';\nimport { SecretField } from '../components/fields/secretfield/secretfield';\nimport { Slider } from '../components/fields/slider/slider';\nimport { Dial } from '../components/fields/dial/dial';\nimport { Button } from '../components/base/button/button';\nimport { Panel } from '../components/layout/panel/panel';\nimport { Toolbar } from '../components/layout/toolbar/toolbar';\nimport { Container } from '../core/container';\nimport { Form } from '../components/form/form/form';\nimport type { Component } from '../core/component';\nimport type { AnyConfig } from '../core/registry';\nimport type { Variant } from './enums';\n\ntype Cfg = Record<string, any>;\n// anything a container takes: an instance, a declarative config ({ type: 'fieldset', ... }) or a toolbar string ('->', '-')\ntype Item = Component | AnyConfig | string;\ntype Options = (string | number | { value: unknown; label: string; disabled?: boolean })[];\n\nconst field = <T>(Cls: new (c: any) => T, name: string, label: string | undefined, c: Cfg = {}): T => new Cls({ name, label, ...c });\n\nexport const ui = {\n // ---- fields: (name, label, config?) ----\n text: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, c),\n email: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'email', ...c } satisfies TextFieldConfig),\n password: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'password', ...c }),\n area: (name: string, label?: string, c?: Cfg) => field(TextArea, name, label, c),\n number: (name: string, label?: string, c?: Cfg) => field(NumberField, name, label, c),\n mask: (name: string, label: string | undefined, mask: string | string[], c?: Cfg) => field(MaskField, name, label, { mask, ...c }),\n time: (name: string, label?: string, c?: Cfg) => field(TimeField, name, label, c),\n date: (name: string, label?: string, c?: Cfg) => field(DateField, name, label, c),\n datetime: (name: string, label?: string, c?: Cfg) => field(DateTimeField, name, label, c),\n dateRange: (name: string, label?: string, c?: Cfg) => field(DateRangeField, name, label, c),\n secret: (name: string, label?: string, c?: Cfg) => field(SecretField, name, label, c),\n slider: (name: string, label?: string, c?: Cfg) => field(Slider, name, label, c),\n dial: (name: string, label?: string, c?: Cfg) => field(Dial, name, label, c),\n /** `boxLabel` is the text beside the box. */\n check: (name: string, boxLabel?: string, c?: Cfg) => field(Checkbox, name, undefined, { boxLabel, ...c }),\n /** An on/off switch; `boxLabel` is the text beside it. */\n toggle: (name: string, boxLabel?: string, c?: Cfg) => field(Toggle, name, undefined, { boxLabel, ...c }),\n radio: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(RadioGroup, name, label, { options, ...c }),\n /** Several choices; the value is the list of checked values. */\n checkGroup: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(CheckboxGroup, name, label, { options, ...c }),\n select: (name: string, label: string, options: Options, c?: Cfg) => field(Select, name, label, { options, ...c }),\n combo: (name: string, label: string, options: Options, c?: Cfg) => field(ComboBox, name, label, { options, ...c }),\n suggest: (name: string, label: string, query: (text: string, o: { signal: AbortSignal }) => unknown, c?: Cfg) => field(SuggestField, name, label, { query, ...c }),\n /** `lookup` is a LookupDef or the name given to `registerLookup`. */\n lookup: (name: string, label: string, lookup: Cfg | string, c?: Cfg) => field(LookupField, name, label, { lookup, ...c }),\n\n // ---- actions ----\n button: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, ...c }),\n primary: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'primary' satisfies Variant, ...c }),\n danger: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'danger' satisfies Variant, ...c }),\n\n // ---- structure ----\n row: (...items: Item[]) => new Container({ layout: 'hbox', items } as Cfg),\n col: (...items: Item[]) => new Container({ layout: 'vbox', items } as Cfg),\n /** `columns`: a number (equal columns, one column on narrow containers) or a CSS `grid-template-columns`. */\n grid: (columns: number | string, ...items: Item[]) => new Container({ layout: { type: 'grid', columns }, items } as Cfg),\n panel: (title: string, items: Item[], c?: Cfg) => new Panel({ title, items, ...c } as Cfg),\n toolbar: (...items: Item[]) => new Toolbar({ items } as Cfg),\n form: (items: Item[], c?: Cfg) => new Form({ items, ...c } as Cfg),\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["field", "Cls", "name", "label", "c", "ui", "TextField", "TextArea", "NumberField", "mask", "MaskField", "TimeField", "DateField", "DateTimeField", "DateRangeField", "SecretField", "Slider", "Dial", "boxLabel", "Checkbox", "Toggle", "options", "RadioGroup", "CheckboxGroup", "Select", "ComboBox", "query", "SuggestField", "lookup", "LookupField", "text", "handler", "Button", "items", "Container", "columns", "title", "Panel", "Toolbar", "Form"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{b as n,c as u,d as r,e as o}from"./chunk-PZSHOSOS.js";import{a as f}from"./chunk-3VDLX7ET.js";import{f as p}from"./chunk-S4QD5NID.js";var d,l="hide";function b(s){d=s}function y(s){l=s}var h=s=>!s||!d||d(s),m=()=>l;function c(s){return s?.flatMap(e=>{let t=e.items;return h(e.permission)?[t?{...e,items:c(t)}:e]:l==="hide"?[]:[{...e,disabled:t?()=>!0:!0}]})}var g=class s extends f{static type;static onCreate;config;id;parent;rendered=!1;mounted=!1;destroyed=!1;baseCls="op-component";tag="div";_el;disposers=[];mask;constructor(e={}){super(),this.config={...e,type:e.type??new.target.type},this.id=e.id??u("op"),s.onCreate?.(this);for(let t in e.listeners)this.on(t,e.listeners[t]);e.renderTo&&queueMicrotask(()=>!this.mounted&&!this.destroyed&&!this.parent&&this.mount(e.renderTo))}get el(){return this._el??this.render()}build(){return n(this.tag,this.baseCls)}onRender(){}onMount(){}onDestroy(){}render(){if(this._el)return this._el;let e=this._el=this.build();this.rendered=!0;let t=this.config;if(e.id=this.id,t.cls&&e.classList.add(...t.cls.split(/\s+/).filter(Boolean)),typeof t.style=="string")e.style.cssText+=t.style;else if(t.style)for(let i in t.style)e.style.setProperty(r(i),String(t.style[i]));return t.width!=null&&(e.style.width=o(t.width)),t.height!=null&&(e.style.height=o(t.height)),t.flex!=null&&(e.style.flex=String(t.flex)),t.ariaLabel&&e.setAttribute("aria-label",t.ariaLabel),this.setStableSize(t.stableSize!==!1),(t.hidden||this.denied("hide"))&&(e.hidden=!0),t.tooltip&&(e.dataset.opTip=t.tooltip),t.theme&&this.setTheme(t.theme),this.onRender(),(t.disabled||this.denied("disable"))&&this.setDisabled(!0),t.loading&&this.setLoading(t.loading),e}mount(e=document.body){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Optikos: mount target not found: ${String(e)}`);return t.appendChild(this.el),this.notifyMount(),this}notifyMount(){this.mounted||this.destroyed||(this.mounted=!0,this.onMount(),this.emit("mount"))}destroy(){if(!this.destroyed){this.destroyed=!0,this.onDestroy();for(let e of this.disposers.splice(0).reverse())e();this.parent?.remove(this,!1),this.parent=void 0,this._el?.remove(),this.emit("destroy"),this.clearListeners()}}own(e){return this.disposers.push(e),e}listen(e,t,i,a){return e.addEventListener(t,i,a),this.own(()=>e.removeEventListener(t,i,a))}later(e,t){let i=setTimeout(e,t);return this.own(()=>clearTimeout(i))}onDisabled(e){}setDisabled(e){this.config.disabled=e||this.denied("disable"),e=!!this.config.disabled,this.rendered&&(this.el.classList.toggle("is-disabled",e),this.onDisabled(e))}denied(e){return!h(this.config.permission)&&(this.config.permissionMode??m())===e}show(){this.denied("hide")||(this.config.hidden=!1,this.rendered&&(this.el.hidden=!1),this.emit("show"))}hide(){this.config.hidden=!0,this.rendered&&(this.el.hidden=!0),this.emit("hide")}isHidden(){return!!this.config.hidden}addCls(e){this.el.classList.add(e)}removeCls(e){this.el.classList.remove(e)}toggleCls(e,t){this.el.classList.toggle(e,t)}setWidth(e){this.config.width=e,this.rendered&&(this.el.style.width=o(e))}setHeight(e){this.config.height=e,this.rendered&&(this.el.style.height=o(e))}setFlex(e){this.config.flex=e,this.rendered&&(this.el.style.flex=String(e))}setStableSize(e){this.config.stableSize=e,this.rendered&&this.el.classList.toggle("op-stable",e)}setTooltip(e){this.config.tooltip=e,this.rendered&&(e?this.el.dataset.opTip=e:delete this.el.dataset.opTip)}setTheme(e){let t="--"+this.baseCls+"-";for(let i in e)this.el.style.setProperty(i.startsWith("--")?i:t+r(i),String(e[i]))}setLoading(e){if(this.config.loading=e,!this.rendered)return;let t=this.el;this.mask?.remove(),this.mask=void 0,t.classList.toggle("is-loading",!!e),e?t.setAttribute("aria-busy","true"):t.removeAttribute("aria-busy"),e&&(this.mask=n("div","op-mask",{},n("span","op-spinner",{role:"progressbar","aria-label":p("loading")}),typeof e=="string"?n("div","op-mask__text",{},e):null),t.append(this.mask));for(let i of Array.from(t.children))i!==this.mask&&i.toggleAttribute("inert",!!e)}focusEl(){return this.el}focus(){this.focusEl().focus()}};export{b as a,y as b,h as c,m as d,c as e,g as f};
2
+ //# sourceMappingURL=chunk-UDXO3KM3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/permission.ts", "../src/core/component.ts"],
4
+ "sourcesContent": ["export type PermissionMode = 'hide' | 'disable';\n\nlet resolver: ((permission: string) => boolean) | undefined;\nlet mode: PermissionMode = 'hide';\n\n/** The app's answer to \"may the user do this?\". Without one, every `permission` is granted. */\nexport function setPermissionResolver(fn: ((permission: string) => boolean) | undefined): void {\n resolver = fn;\n}\n\n/** What a component without access does by default: `hide` (default) or `disable`. A component's `permissionMode` wins. */\nexport function setPermissionMode(m: PermissionMode): void {\n mode = m;\n}\n\nexport const allowed = (permission?: string): boolean => !permission || !resolver || resolver(permission);\nexport const permissionMode = (): PermissionMode => mode;\n\n/** Applies each item's `permission` to a list: denied items are dropped (`hide`) or come back `disabled` (`disable`). Nested `items` too. */\nexport function gate<T extends { permission?: string }>(list: T[] | undefined): T[] | undefined {\n return list?.flatMap((i) => {\n const sub = (i as { items?: T[] }).items;\n if (allowed(i.permission)) return [sub ? { ...i, items: gate(sub) } : i];\n return mode === 'hide' ? [] : [{ ...i, disabled: sub ? () => true : true }];\n });\n}\n", "import { Emitter, type Handler } from './emitter';\nimport { h, uid, kebab, px } from './dom';\nimport { t } from './i18n';\nimport { allowed, permissionMode } from './permission';\n\nexport interface ComponentConfig {\n type?: string;\n id?: string;\n cls?: string;\n style?: string | Record<string, string | number>;\n hidden?: boolean;\n disabled?: boolean;\n width?: number | string;\n height?: number | string;\n flex?: number | string;\n tooltip?: string;\n /** Inside a Form: shown only while this returns true (given the form values). A field hidden this way neither validates nor goes into `getValues`. */\n showIf?: (values: Record<string, any>) => boolean;\n /** Inside a Form: enabled only while this returns true (given the form values). */\n enableIf?: (values: Record<string, any>) => boolean;\n /** A permission name: without it (per `setPermissionResolver`) the component is hidden, or disabled with `permissionMode: 'disable'`. */\n permission?: string;\n permissionMode?: 'hide' | 'disable';\n /** Component-scoped tokens: `{ radius: '0' }` on a button sets `--op-button-radius`. Keys starting with `--` are used as is. */\n theme?: Record<string, string | number>;\n /**\n * Default `true`: the component keeps its size when only its *state* changes (loading, searching, invalid).\n * The CSS reserves room for the state's extra content instead of growing. `false` lets it fit the content.\n * Does not apply to new *content* (`setText` with a longer text).\n */\n stableSize?: boolean;\n /** `true` or a text: shows a mask with a spinner over the component. */\n loading?: boolean | string;\n ariaLabel?: string;\n /** Layout `border`: where the item goes. */\n region?: 'north' | 'south' | 'west' | 'east' | 'center';\n /** Layout `grid`: columns spanned; `'full'` takes the whole row. */\n colspan?: number | 'full';\n listeners?: Record<string, Handler>;\n renderTo?: string | HTMLElement;\n /** Free slot for application data. */\n data?: unknown;\n}\n\n/** Anything that owns children (Container) and accepts being asked to drop one. */\nexport interface Parent {\n remove(child: Component, destroy?: boolean): unknown;\n}\n\nexport class Component<C extends ComponentConfig = ComponentConfig> extends Emitter {\n static type?: string;\n /** Called with every new component, config in hand: `optikos/dev` uses it to warn about options nobody reads. */\n static onCreate?: (c: Component<any>) => void;\n config: C;\n readonly id: string;\n parent?: Component & Parent;\n rendered = false;\n mounted = false;\n destroyed = false;\n protected baseCls = 'op-component';\n protected tag: keyof HTMLElementTagNameMap = 'div';\n private _el?: HTMLElement;\n private disposers: Array<() => void> = [];\n private mask?: HTMLElement;\n\n constructor(config: C = {} as C) {\n super();\n this.config = { ...config, type: config.type ?? (new.target as typeof Component).type };\n this.id = config.id ?? uid('op');\n Component.onCreate?.(this);\n for (const k in config.listeners) this.on(k, config.listeners[k]);\n // `new` and `create` must agree: a microtask, because the subclass constructor has not finished yet. `create` mounts first.\n if (config.renderTo) queueMicrotask(() => !this.mounted && !this.destroyed && !this.parent && this.mount(config.renderTo));\n }\n\n /** The root element. Built on first access. */\n get el(): HTMLElement {\n return this._el ?? this.render();\n }\n\n // ---- lifecycle (template method) ----------------------------------------------------------\n\n /** Builds the root element. Subclasses override to create their own DOM. */\n protected build(): HTMLElement {\n return h(this.tag, this.baseCls);\n }\n protected onRender(): void {}\n protected onMount(): void {}\n protected onDestroy(): void {}\n\n /** Builds the DOM once. Safe to call repeatedly. */\n render(): HTMLElement {\n if (this._el) return this._el;\n const el = (this._el = this.build());\n this.rendered = true;\n const c = this.config;\n el.id = this.id;\n if (c.cls) el.classList.add(...c.cls.split(/\\s+/).filter(Boolean));\n if (typeof c.style === 'string') el.style.cssText += c.style;\n else if (c.style) for (const k in c.style) el.style.setProperty(kebab(k), String(c.style[k]));\n if (c.width != null) el.style.width = px(c.width);\n if (c.height != null) el.style.height = px(c.height);\n if (c.flex != null) el.style.flex = String(c.flex);\n if (c.ariaLabel) el.setAttribute('aria-label', c.ariaLabel);\n this.setStableSize(c.stableSize !== false);\n if (c.hidden || this.denied('hide')) el.hidden = true;\n if (c.tooltip) el.dataset.opTip = c.tooltip;\n if (c.theme) this.setTheme(c.theme);\n this.onRender();\n if (c.disabled || this.denied('disable')) this.setDisabled(true);\n if (c.loading) this.setLoading(c.loading);\n return el;\n }\n\n /** Appends to a target (default `document.body`) and fires `onMount` for the whole subtree. */\n mount(target: string | HTMLElement = document.body): this {\n const parent = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (!parent) throw new Error(`Optikos: mount target not found: ${String(target)}`);\n parent.appendChild(this.el);\n this.notifyMount();\n return this;\n }\n\n /** Called when the element becomes part of a mounted tree. Containers override to reach children. */\n notifyMount(): void {\n if (this.mounted || this.destroyed) return;\n this.mounted = true;\n this.onMount();\n this.emit('mount');\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.onDestroy();\n for (const d of this.disposers.splice(0).reverse()) d();\n this.parent?.remove(this, false);\n this.parent = undefined;\n this._el?.remove();\n this.emit('destroy');\n this.clearListeners();\n }\n\n // ---- resources released on destroy --------------------------------------------------------\n\n /** Registers a function to run on `destroy` (listeners, timers, effects). Returns it. */\n own<F extends () => void>(fn: F): F {\n this.disposers.push(fn);\n return fn;\n }\n\n /** Adds a DOM listener released on `destroy`. */\n listen(target: EventTarget, type: string, fn: (e: any) => void, opts?: AddEventListenerOptions | boolean): () => void {\n target.addEventListener(type, fn, opts);\n return this.own(() => target.removeEventListener(type, fn, opts));\n }\n\n /** `setTimeout` released on `destroy`; returns the cancel function. */\n later(fn: () => void, ms: number): () => void {\n const id = setTimeout(fn, ms);\n return this.own(() => clearTimeout(id));\n }\n\n // ---- common state / setters ---------------------------------------------------------------\n\n protected onDisabled(_disabled: boolean): void {}\n\n setDisabled(disabled: boolean): void {\n this.config.disabled = disabled || this.denied('disable');\n disabled = !!this.config.disabled;\n if (!this.rendered) return;\n this.el.classList.toggle('is-disabled', disabled);\n this.onDisabled(disabled);\n }\n\n /** The user lacks `config.permission` and the way to deal with it is `mode`. */\n private denied(mode: 'hide' | 'disable'): boolean {\n return !allowed(this.config.permission) && (this.config.permissionMode ?? permissionMode()) === mode;\n }\n\n show(): void {\n if (this.denied('hide')) return;\n this.config.hidden = false;\n if (this.rendered) this.el.hidden = false;\n this.emit('show');\n }\n hide(): void {\n this.config.hidden = true;\n if (this.rendered) this.el.hidden = true;\n this.emit('hide');\n }\n isHidden(): boolean {\n return !!this.config.hidden;\n }\n\n addCls(name: string): void {\n this.el.classList.add(name);\n }\n removeCls(name: string): void {\n this.el.classList.remove(name);\n }\n toggleCls(name: string, on?: boolean): void {\n this.el.classList.toggle(name, on);\n }\n\n setWidth(v: number | string): void {\n this.config.width = v;\n if (this.rendered) this.el.style.width = px(v);\n }\n setHeight(v: number | string): void {\n this.config.height = v;\n if (this.rendered) this.el.style.height = px(v);\n }\n setFlex(v: number | string): void {\n this.config.flex = v;\n if (this.rendered) this.el.style.flex = String(v);\n }\n\n setStableSize(stable: boolean): void {\n this.config.stableSize = stable;\n if (this.rendered) this.el.classList.toggle('op-stable', stable);\n }\n\n setTooltip(text: string): void {\n this.config.tooltip = text;\n if (!this.rendered) return;\n if (text) this.el.dataset.opTip = text;\n else delete this.el.dataset.opTip;\n }\n\n setTheme(theme: Record<string, string | number>): void {\n const prefix = '--' + this.baseCls + '-';\n for (const k in theme) this.el.style.setProperty(k.startsWith('--') ? k : prefix + kebab(k), String(theme[k]));\n }\n\n /** Shows (or removes) a loading mask. A string is shown as text under the spinner. */\n setLoading(loading: boolean | string): void {\n this.config.loading = loading;\n if (!this.rendered) return;\n const el = this.el;\n this.mask?.remove();\n this.mask = undefined;\n el.classList.toggle('is-loading', !!loading);\n if (loading) el.setAttribute('aria-busy', 'true');\n else el.removeAttribute('aria-busy');\n if (loading) {\n this.mask = h('div', 'op-mask', {}, h('span', 'op-spinner', { role: 'progressbar', 'aria-label': t('loading') }), typeof loading === 'string' ? h('div', 'op-mask__text', {}, loading) : null);\n el.append(this.mask);\n }\n for (const child of Array.from(el.children)) if (child !== this.mask) child.toggleAttribute('inert', !!loading);\n }\n\n /** The element that receives focus on `focus()`. */\n protected focusEl(): HTMLElement {\n return this.el;\n }\n focus(): void {\n this.focusEl().focus();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["resolver", "mode", "setPermissionResolver", "fn", "setPermissionMode", "m", "allowed", "permission", "permissionMode", "gate", "list", "i", "sub", "Component", "_Component", "Emitter", "config", "uid", "k", "h", "el", "c", "kebab", "px", "target", "parent", "d", "fn", "type", "opts", "ms", "id", "_disabled", "disabled", "mode", "allowed", "permissionMode", "name", "on", "v", "stable", "text", "theme", "prefix", "loading", "t", "child"]
7
+ }
@@ -1,3 +1,3 @@
1
- import{a as b}from"./chunk-2ZUZ5HDL.js";import{c as m}from"./chunk-4EZJ5FKJ.js";import{a as v}from"./chunk-A2NKDOYN.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as E}from"./chunk-TIPK3SCJ.js";import{d as y,e as p,f as a}from"./chunk-MW3RWBZ7.js";p("en",{chatPlaceholder:"Type a message",chatSend:"Send",chatTyping:"{n} is typing\u2026",chatToday:"Today",chatYesterday:"Yesterday",chatEmpty:"No messages yet",chatLog:"Conversation",chatSuggestions:"Suggestions",chatReply:"Reply"});p("pt-BR",{chatPlaceholder:"Digite uma mensagem",chatSend:"Enviar",chatTyping:"{n} est\xE1 digitando\u2026",chatToday:"Hoje",chatYesterday:"Ontem",chatEmpty:"Nenhuma mensagem ainda",chatLog:"Conversa",chatSuggestions:"Sugest\xF5es",chatReply:"Responder"});var _=/(\*\*[^*\n]+\*\*|\*[^*\n]+\*|`[^`\n]+`)/;function L(d){let t=[];return d.split(`
1
+ import{a as b}from"./chunk-ESRS5ZQV.js";import{c as m}from"./chunk-DIOJGTUN.js";import{a as E}from"./chunk-TIPK3SCJ.js";import{f as v}from"./chunk-UDXO3KM3.js";import{b as n}from"./chunk-PZSHOSOS.js";import{d as y,e as p,f as a}from"./chunk-S4QD5NID.js";p("en",{chatPlaceholder:"Type a message",chatSend:"Send",chatTyping:"{n} is typing\u2026",chatToday:"Today",chatYesterday:"Yesterday",chatEmpty:"No messages yet",chatLog:"Conversation",chatSuggestions:"Suggestions",chatReply:"Reply"});p("pt-BR",{chatPlaceholder:"Digite uma mensagem",chatSend:"Enviar",chatTyping:"{n} est\xE1 digitando\u2026",chatToday:"Hoje",chatYesterday:"Ontem",chatEmpty:"Nenhuma mensagem ainda",chatLog:"Conversa",chatSuggestions:"Sugest\xF5es",chatReply:"Responder"});var _=/(\*\*[^*\n]+\*\*|\*[^*\n]+\*|`[^`\n]+`)/;function L(d){let t=[];return d.split(`
2
2
  `).forEach((e,s)=>{s&&t.push(document.createElement("br"));for(let i of e.split(_))i&&(i.startsWith("**")&&i.endsWith("**")&&i.length>4?t.push(n("strong","",{},i.slice(2,-2))):i.startsWith("`")&&i.endsWith("`")&&i.length>2?t.push(n("code","op-chat__code",{},i.slice(1,-1))):i.startsWith("*")&&i.endsWith("*")&&i.length>2?t.push(n("em","",{},i.slice(1,-1))):t.push(document.createTextNode(i)))}),t}var l=d=>new Date(d).toDateString(),M=()=>y()._lang,u=class extends v{baseCls="op-chat";msgs=[];seq=0;logEl;emptyEl;typingEl;chipsEl;input;sendBtn;busy=!1;build(){let t=this.config;return this.logEl=n("div","op-chat__log",{role:"log","aria-live":"polite","aria-relevant":"additions","aria-label":a("chatLog"),tabindex:0}),this.emptyEl=n("div","op-chat__empty",{},a("chatEmpty")),this.typingEl=n("div","op-chat__typing",{"aria-hidden":"true"},n("span","op-chat__dots",{},n("i"),n("i"),n("i")),n("span","op-chat__typing-text")),this.typingEl.hidden=!0,this.chipsEl=n("div","op-chat__suggestions",{role:"group","aria-label":a("chatSuggestions")}),this.input=n("textarea","op-chat__input",{rows:1,placeholder:t.placeholder??a("chatPlaceholder"),"aria-label":t.placeholder??a("chatPlaceholder"),maxlength:t.maxLength??null}),this.sendBtn=new b({icon:"send",variant:"primary",ariaLabel:a("chatSend"),handler:()=>this.submit()}),this.own(()=>this.sendBtn.destroy()),n("div",this.baseCls,{},this.logEl,this.chipsEl,n("div","op-chat__composer",{},this.input,this.sendBtn.el))}onRender(){let t=this.config;this.listen(this.input,"input",()=>this.grow()),this.listen(this.input,"keydown",e=>{e.key!=="Enter"||e.shiftKey||e.isComposing||t.sendOnEnter===!1||(e.preventDefault(),this.submit())}),this.listen(this.chipsEl,"click",e=>{let s=e.target.closest("[data-s]");s&&(this.emit("suggestion",s.dataset.s),this.send(s.dataset.s))}),this.listen(this.logEl,"click",e=>{let s=e.target.closest(".op-chat__msg"),i=s&&this.msgs.find(o=>String(o.id)===s.dataset.id);i&&this.emit("message-click",i)}),this.setReadonly(!!t.readonly),this.msgs=(t.messages??[]).map(e=>this.norm(e)),this.setSuggestions(t.suggestions??[]),this.renderAll()}notifyMount(){super.notifyMount(),this.rendered&&(this.sendBtn.notifyMount(),this.scrollToBottom())}norm(t){let e=t.time==null?Date.now():new Date(t.time).getTime();return{...t,id:t.id??`m${++this.seq}`,at:e}}getMessages(){return this.msgs}addMessage(t){let e=this.norm(t);if(this.msgs.push(e),!this.rendered)return this.config.messages=this.msgs,e;let s=this.nearBottom()||e.from===this.config.me;return this.mountMsg(e,this.msgs.length-1),this.syncEmpty(),s&&this.scrollToBottom(),e}setMessages(t){this.msgs=t.map(e=>this.norm(e)),this.config.messages=this.msgs,this.rendered&&(this.renderAll(),this.scrollToBottom())}updateMessage(t,e){let s=this.msgs.findIndex(g=>g.id===t);if(s<0)return;let i=this.nearBottom();if(this.msgs[s]={...this.msgs[s],...e,at:e.time!=null?new Date(e.time).getTime():this.msgs[s].at},!this.rendered)return;let o=this.msgEl(t),r=this.buildMsg(this.msgs[s],s);o?o.replaceWith(r):this.logEl.insertBefore(r,this.typingEl),this.decorate(s),i&&this.scrollToBottom()}appendToMessage(t,e){let s=this.msgs.find(r=>r.id===t);if(!s)return;s.text+=e;let i=this.msgEl(t)?.querySelector(".op-chat__text");if(!i)return;let o=this.nearBottom();this.fill(i,s),o&&this.scrollToBottom()}removeMessage(t){this.msgs=this.msgs.filter(e=>e.id!==t),this.rendered&&this.renderAll()}msgEl(t){return this.logEl.querySelector(`[data-id="${CSS.escape(String(t))}"]`)}renderAll(){this.logEl.replaceChildren(this.emptyEl,...this.msgs.flatMap((t,e)=>this.nodesFor(t,e)),this.typingEl),this.syncEmpty()}nodesFor(t,e){let s=this.msgs[e-1],i=[];return(!s||l(s.at)!==l(t.at))&&i.push(n("div","op-chat__day",{role:"separator"},n("span","",{},this.dayLabel(t.at)))),i.push(this.buildMsg(t,e)),i}mountMsg(t,e){for(let s of this.nodesFor(t,e))this.logEl.insertBefore(s,this.typingEl);this.decorate(e-1),this.decorate(e)}dayLabel(t){let e=l(t),s=Date.now();return e===l(s)?a("chatToday"):e===l(s-864e5)?a("chatYesterday"):new Intl.DateTimeFormat(M(),{dateStyle:"medium"}).format(t)}fill(t,e){let s=this.config.renderer?this.config.renderer(e):L(e.text);t.replaceChildren(...Array.isArray(s)?s:[s])}buildMsg(t,e){let s=this.config,i=t.from===s.me,o=s.users?.[t.from],r=n("article",`op-chat__msg ${i?"is-me":"is-them"}`,{"data-id":String(t.id)}),g=n("div","op-chat__bubble");if(!i&&s.showAuthors!==!1&&o){let c=n("div","op-chat__author",{},o.name);o.color&&(c.style.color=o.color),g.append(c)}let h=t.replyTo!=null?this.msgs.find(c=>c.id===t.replyTo):void 0;h&&g.append(n("div","op-chat__reply",{"aria-label":a("chatReply")},n("strong","",{},h.from===s.me?"":s.users?.[h.from]?.name??h.from),h.text.length>80?`${h.text.slice(0,80)}\u2026`:h.text));let f=n("div","op-chat__text");this.fill(f,t);let T=new Intl.DateTimeFormat(M(),{hour:"2-digit",minute:"2-digit"}).format(t.at);return g.append(f,n("span","op-chat__meta",{},n("time","",{datetime:new Date(t.at).toISOString()},T),i&&t.status?this.statusEl(t.status):"")),r.append(g),this.group(r,e),r}statusEl(t){let e=n("span",`op-chat__status is-${t}`,{role:"img","aria-label":t});return t==="error"?e.append(m("alert")):t!=="sending"&&e.append(m("check"),...t==="sent"?[]:[m("check")]),e}group(t,e){let s=this.msgs[e],i=(o,r)=>!!o&&!!r&&o.from===r.from&&l(o.at)===l(r.at);t.classList.toggle("is-first",!i(this.msgs[e-1],s)),t.classList.toggle("is-last",!i(s,this.msgs[e+1])),t.querySelector(".op-chat__author")?.toggleAttribute("hidden",i(this.msgs[e-1],s))}decorate(t){let e=this.msgs[t],s=e&&this.msgEl(e.id);s&&this.group(s,t)}syncEmpty(){this.emptyEl.hidden=this.msgs.length>0,this.el.classList.toggle("is-empty",!this.msgs.length)}nearBottom(){let t=this.logEl;return t.scrollHeight-t.scrollTop-t.clientHeight<48}scrollToBottom(){this.render(),this.logEl.scrollTop=this.logEl.scrollHeight}setTyping(t){let e=this.nearBottom();this.typingEl.hidden=!t,this.typingEl.querySelector(".op-chat__typing-text").textContent=typeof t=="string"?a("chatTyping",{n:t}):"",t&&e&&this.scrollToBottom()}setSuggestions(t){this.config.suggestions=t,this.rendered&&(this.chipsEl.hidden=!t.length,this.chipsEl.replaceChildren(...t.map(e=>n("button","op-chat__chip",{type:"button","data-s":e},e))))}setBusy(t){this.busy=t,this.el.classList.toggle("is-busy",t),this.logEl.setAttribute("aria-busy",String(t)),this.sendBtn.setDisabled(t||!!this.config.readonly);for(let e of Array.from(this.chipsEl.children))e.disabled=t||!!this.config.readonly}setReadonly(t){this.config.readonly=t,this.rendered&&(this.input.readOnly=t,this.el.classList.toggle("is-readonly",t),this.setBusy(this.busy))}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}focus(){this.render(),this.input.focus()}grow(){this.input.style.height="auto",this.input.style.height=`${this.input.scrollHeight}px`}submit(){let t=this.input.value;this.send(t)&&(this.input.value="",this.grow())}send(t){if(t=t.trim(),!t||this.busy||this.config.readonly||this.emit("before-send",t)===!1)return!1;let e=this.addMessage({from:this.config.me,text:t,time:Date.now(),status:"sending"});return this.emit("send",t,e),!0}};E("chat",u);export{u as a};
3
- //# sourceMappingURL=chunk-FEHGU6EP.js.map
3
+ //# sourceMappingURL=chunk-UL364TLO.js.map
@@ -0,0 +1,2 @@
1
+ import{a as s,b as f}from"./chunk-34KVSA2V.js";import{a as E}from"./chunk-DY3ZYMXD.js";import{a as m}from"./chunk-ESRS5ZQV.js";import{a as g}from"./chunk-DIOJGTUN.js";import{b as d}from"./chunk-PZSHOSOS.js";import{e as p,f as a}from"./chunk-S4QD5NID.js";p("en",{ebCsv:"Export CSV",ebXlsx:"Export Excel",ebPage:"Export this page (CSV)",ebPrint:"Print",ebActions:"Export and print"});p("pt-BR",{ebCsv:"Exportar CSV",ebXlsx:"Exportar Excel",ebPage:"Exportar esta p\xE1gina (CSV)",ebPrint:"Imprimir",ebActions:"Exportar e imprimir"});g({download:'<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/>',printer:'<path d="M6 9V2h12v7M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2M6 14h12v8H6z"/>',table:'<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M3 15h18M9 3v18"/>'});var u={csv:"download",xlsx:"table",page:"file",print:"printer"},B={csv:"ebCsv",xlsx:"ebXlsx",page:"ebPage",print:"ebPrint"},P={csv:"CSV",xlsx:"Excel",page:"1",print:""};function G(n={}){let r=new Map,l=()=>{};return{init(e){let o=n.filename??"export",c={csv:()=>s(e,{filename:o}),xlsx:()=>s(e,{format:"xlsx",filename:o}),page:()=>s(e,{scope:"page",filename:o}),print:()=>f(e,{title:n.title})},x=d("div","op-exportbar op-footer-group",{role:"group","aria-label":a("ebActions")});for(let t of Object.keys(c)){let h=n[t]??(t!=="page"||!!e.config.paging),b=a(B[t]),i=new m({icon:u[t],variant:"ghost",ariaLabel:b,tooltip:b,hidden:!h,text:n.labels?t==="page"?a("ebPage"):t==="print"?a("ebPrint"):P[t]:void 0,handler:async()=>{i.setDisabled(!0);try{await c[t]()}finally{i.setDisabled(!1)}}});i.mount(x),r.set(t,i)}let v=E(e,x);return l=()=>{v(),r.forEach(t=>t.destroy()),r.clear()},()=>l()},setVisible:(e,o)=>r.get(e)?.[o?"show":"hide"](),setDisabled:(e,o)=>r.get(e)?.setDisabled(o)}}export{G as a};
2
+ //# sourceMappingURL=chunk-UUAGMZD2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/exportbar/exportbar.ts"],
4
+ "sourcesContent": ["import { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { Button } from '../../base/button/button';\nimport { registerIcons } from '../../base/icon/icon';\nimport { exportGrid, printGrid } from '../gridexport/gridexport';\nimport { addFooterGroup } from '../grid/footer';\nimport type { Grid, GridPlugin } from '../grid/grid';\n\naddMessages('en', { ebCsv: 'Export CSV', ebXlsx: 'Export Excel', ebPage: 'Export this page (CSV)', ebPrint: 'Print', ebActions: 'Export and print' });\naddMessages('pt-BR', { ebCsv: 'Exportar CSV', ebXlsx: 'Exportar Excel', ebPage: 'Exportar esta p\u00E1gina (CSV)', ebPrint: 'Imprimir', ebActions: 'Exportar e imprimir' });\n\nregisterIcons({\n download: '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3\"/>',\n printer: '<path d=\"M6 9V2h12v7M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2M6 14h12v8H6z\"/>',\n table: '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M3 15h18M9 3v18\"/>',\n});\n\nexport type ExportBarAction = 'csv' | 'xlsx' | 'page' | 'print';\n\nexport interface ExportBarOptions {\n /** Each button: `false` leaves it out. `csv`, `xlsx` and `print` default to true; `page` (CSV of the page on screen) to true on a paged grid. */\n csv?: boolean;\n xlsx?: boolean;\n page?: boolean;\n print?: boolean;\n /** File name without extension. Default `export`. */\n filename?: string;\n /** A heading above the printed table. */\n title?: string;\n /** Show the text beside the icons. Default false (icons with a tooltip). */\n labels?: boolean;\n}\n\nexport interface ExportBar extends GridPlugin {\n setVisible(action: ExportBarAction, visible: boolean): void;\n setDisabled(action: ExportBarAction, disabled: boolean): void;\n}\n\nconst ICON = { csv: 'download', xlsx: 'table', page: 'file', print: 'printer' } as const;\nconst TEXT = { csv: 'ebCsv', xlsx: 'ebXlsx', page: 'ebPage', print: 'ebPrint' } as const;\nconst SHORT = { csv: 'CSV', xlsx: 'Excel', page: '1', print: '' } as const;\n\n/**\n * Export and print buttons inside the grid, in a row with the pager: `plugins: [exportBar({ print: false })]`. They run\n * `exportGrid` and `printGrid`, which still work on their own from your own buttons.\n */\nexport function exportBar(options: ExportBarOptions = {}): ExportBar {\n const buttons = new Map<ExportBarAction, Button>();\n let cleanup = () => {};\n return {\n init(grid: Grid) {\n const name = options.filename ?? 'export';\n const run: Record<ExportBarAction, () => Promise<unknown>> = {\n csv: () => exportGrid(grid, { filename: name }),\n xlsx: () => exportGrid(grid, { format: 'xlsx', filename: name }),\n page: () => exportGrid(grid, { scope: 'page', filename: name }),\n print: () => printGrid(grid, { title: options.title }),\n };\n const group = h('div', 'op-exportbar op-footer-group', { role: 'group', 'aria-label': t('ebActions') });\n for (const action of Object.keys(run) as ExportBarAction[]) {\n const on = options[action] ?? (action !== 'page' || !!grid.config.paging);\n const label = t(TEXT[action]);\n const btn = new Button({\n icon: ICON[action], variant: 'ghost', ariaLabel: label, tooltip: label, hidden: !on,\n text: options.labels ? (action === 'page' ? t('ebPage') : action === 'print' ? t('ebPrint') : SHORT[action]) : undefined,\n handler: async () => {\n btn.setDisabled(true);\n try {\n await run[action]();\n } finally {\n btn.setDisabled(false);\n }\n },\n });\n btn.mount(group);\n buttons.set(action, btn);\n }\n const leave = addFooterGroup(grid, group);\n cleanup = () => {\n leave();\n buttons.forEach((b) => b.destroy());\n buttons.clear();\n };\n return () => cleanup();\n },\n setVisible: (action, visible) => buttons.get(action)?.[visible ? 'show' : 'hide'](),\n setDisabled: (action, disabled) => buttons.get(action)?.setDisabled(disabled),\n };\n}\n"],
5
+ "mappings": "8PAQAA,EAAY,KAAM,CAAE,MAAO,aAAc,OAAQ,eAAgB,OAAQ,yBAA0B,QAAS,QAAS,UAAW,kBAAmB,CAAC,EACpJA,EAAY,QAAS,CAAE,MAAO,eAAgB,OAAQ,iBAAkB,OAAQ,gCAA8B,QAAS,WAAY,UAAW,qBAAsB,CAAC,EAErKC,EAAc,CACZ,SAAU,6EACV,QAAS,iHACT,MAAO,qFACT,CAAC,EAuBD,IAAMC,EAAO,CAAE,IAAK,WAAY,KAAM,QAAS,KAAM,OAAQ,MAAO,SAAU,EACxEC,EAAO,CAAE,IAAK,QAAS,KAAM,SAAU,KAAM,SAAU,MAAO,SAAU,EACxEC,EAAQ,CAAE,IAAK,MAAO,KAAM,QAAS,KAAM,IAAK,MAAO,EAAG,EAMzD,SAASC,EAAUC,EAA4B,CAAC,EAAc,CACnE,IAAMC,EAAU,IAAI,IAChBC,EAAU,IAAM,CAAC,EACrB,MAAO,CACL,KAAKC,EAAY,CACf,IAAMC,EAAOJ,EAAQ,UAAY,SAC3BK,EAAuD,CAC3D,IAAK,IAAMC,EAAWH,EAAM,CAAE,SAAUC,CAAK,CAAC,EAC9C,KAAM,IAAME,EAAWH,EAAM,CAAE,OAAQ,OAAQ,SAAUC,CAAK,CAAC,EAC/D,KAAM,IAAME,EAAWH,EAAM,CAAE,MAAO,OAAQ,SAAUC,CAAK,CAAC,EAC9D,MAAO,IAAMG,EAAUJ,EAAM,CAAE,MAAOH,EAAQ,KAAM,CAAC,CACvD,EACMQ,EAAQC,EAAE,MAAO,+BAAgC,CAAE,KAAM,QAAS,aAAcC,EAAE,WAAW,CAAE,CAAC,EACtG,QAAWC,KAAU,OAAO,KAAKN,CAAG,EAAwB,CAC1D,IAAMO,EAAKZ,EAAQW,CAAM,IAAMA,IAAW,QAAU,CAAC,CAACR,EAAK,OAAO,QAC5DU,EAAQH,EAAEb,EAAKc,CAAM,CAAC,EACtBG,EAAM,IAAIC,EAAO,CACrB,KAAMnB,EAAKe,CAAM,EAAG,QAAS,QAAS,UAAWE,EAAO,QAASA,EAAO,OAAQ,CAACD,EACjF,KAAMZ,EAAQ,OAAUW,IAAW,OAASD,EAAE,QAAQ,EAAIC,IAAW,QAAUD,EAAE,SAAS,EAAIZ,EAAMa,CAAM,EAAK,OAC/G,QAAS,SAAY,CACnBG,EAAI,YAAY,EAAI,EACpB,GAAI,CACF,MAAMT,EAAIM,CAAM,EAAE,CACpB,QAAE,CACAG,EAAI,YAAY,EAAK,CACvB,CACF,CACF,CAAC,EACDA,EAAI,MAAMN,CAAK,EACfP,EAAQ,IAAIU,EAAQG,CAAG,CACzB,CACA,IAAME,EAAQC,EAAed,EAAMK,CAAK,EACxC,OAAAN,EAAU,IAAM,CACdc,EAAM,EACNf,EAAQ,QAASiB,GAAMA,EAAE,QAAQ,CAAC,EAClCjB,EAAQ,MAAM,CAChB,EACO,IAAMC,EAAQ,CACvB,EACA,WAAY,CAACS,EAAQQ,IAAYlB,EAAQ,IAAIU,CAAM,IAAIQ,EAAU,OAAS,MAAM,EAAE,EAClF,YAAa,CAACR,EAAQS,IAAanB,EAAQ,IAAIU,CAAM,GAAG,YAAYS,CAAQ,CAC9E,CACF",
6
+ "names": ["addMessages", "registerIcons", "ICON", "TEXT", "SHORT", "exportBar", "options", "buttons", "cleanup", "grid", "name", "run", "exportGrid", "printGrid", "group", "h", "t", "action", "on", "label", "btn", "Button", "leave", "addFooterGroup", "b", "visible", "disabled"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var i=(n,s)=>s.split(".").reduce((e,t)=>e?.[t],n);function p(n,s,e){let t=s.split("."),o=t.pop();t.reduce((a,c)=>a[c]??={},n)[o]=e}export{i as a,p as b};
2
+ //# sourceMappingURL=chunk-V5G5JECN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/path.ts"],
4
+ "sourcesContent": ["export const getPath = (o: any, path: string): any => path.split('.').reduce((v, k) => v?.[k], o);\n\nexport function setPath(o: any, path: string, value: unknown): void {\n const keys = path.split('.');\n const last = keys.pop()!;\n keys.reduce((v, k) => (v[k] ??= {}), o)[last] = value;\n}\n"],
5
+ "mappings": "AAAO,IAAMA,EAAU,CAACC,EAAQC,IAAsBA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACC,EAAGC,IAAMD,IAAIC,CAAC,EAAGH,CAAC,EAEzF,SAASI,EAAQJ,EAAQC,EAAcI,EAAsB,CAClE,IAAMC,EAAOL,EAAK,MAAM,GAAG,EACrBM,EAAOD,EAAK,IAAI,EACtBA,EAAK,OAAO,CAACJ,EAAGC,IAAOD,EAAEC,CAAC,IAAM,CAAC,EAAIH,CAAC,EAAEO,CAAI,EAAIF,CAClD",
6
+ "names": ["getPath", "o", "path", "v", "k", "setPath", "value", "keys", "last"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{d as a}from"./chunk-S4QD5NID.js";var e=()=>a()._lang,m=(t,n)=>{if(t==null||t==="")return"";let r=t instanceof Date?t:typeof t=="string"&&/^\d{4}-\d{2}-\d{2}$/.test(t)?new Date(+t.slice(0,4),+t.slice(5,7)-1,+t.slice(8,10)):new Date(t);return isNaN(+r)?String(t):new Intl.DateTimeFormat(e(),n).format(r)},u={number:(t,n)=>t==null||t===""?"":new Intl.NumberFormat(e(),n).format(t),money:(t,n)=>t==null||t===""?"":new Intl.NumberFormat(e(),{style:"currency",currency:a()._currency,...n}).format(t),percent:(t,n)=>t==null||t===""?"":new Intl.NumberFormat(e(),{style:"percent",maximumFractionDigits:1,...n}).format(t),date:(t,n)=>m(t,{dateStyle:"medium",...n}),datetime:(t,n)=>m(t,{dateStyle:"medium",timeStyle:"short",...n}),bool:t=>t?"\u2713":"",duration:t=>{if(t==null||t===""||isNaN(Number(t)))return t==null?"":String(t);let n=Math.round(Number(t)),r=(l,s)=>new Intl.NumberFormat(e(),{style:"unit",unit:s,unitDisplay:"narrow"}).format(l),[o,i]=[Math.floor(Math.abs(n)/60),Math.abs(n)%60];return`${n<0?"-":""}${[o&&r(o,"hour"),(i||!o)&&r(i,"minute")].filter(Boolean).join(" ")}`}};function f(t,n){u[t]=n}function y(t,n){let r=typeof t=="function"?t:u[t];if(!r)throw new Error(`Optikos: unknown format "${t}"`);return r(n)}export{f as a,y as b};
2
+ //# sourceMappingURL=chunk-XFDNXSU5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/data/format.ts"],
4
+ "sourcesContent": ["import { getLocale } from '../core/i18n';\n\nexport type Formatter = (value: any, options?: Record<string, any>) => string;\n\nconst lang = () => getLocale()._lang;\nconst date = (v: any, opts: Intl.DateTimeFormatOptions) => {\n if (v == null || v === '') return '';\n // ISO dates without time are local dates, not UTC.\n const d = v instanceof Date ? v : typeof v === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? new Date(+v.slice(0, 4), +v.slice(5, 7) - 1, +v.slice(8, 10)) : new Date(v);\n return isNaN(+d) ? String(v) : new Intl.DateTimeFormat(lang(), opts).format(d);\n};\n\nconst formats: Record<string, Formatter> = {\n number: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), o).format(v)),\n money: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'currency', currency: getLocale()._currency, ...o }).format(v)),\n percent: (v, o) => (v == null || v === '' ? '' : new Intl.NumberFormat(lang(), { style: 'percent', maximumFractionDigits: 1, ...o }).format(v)),\n date: (v, o) => date(v, { dateStyle: 'medium', ...o }),\n datetime: (v, o) => date(v, { dateStyle: 'medium', timeStyle: 'short', ...o }),\n bool: (v) => (v ? '\u2713' : ''),\n duration: (v) => {\n if (v == null || v === '' || isNaN(Number(v))) return v == null ? '' : String(v);\n const total = Math.round(Number(v));\n const unit = (n: number, u: string) => new Intl.NumberFormat(lang(), { style: 'unit', unit: u, unitDisplay: 'narrow' }).format(n);\n const [h, m] = [Math.floor(Math.abs(total) / 60), Math.abs(total) % 60];\n return `${total < 0 ? '-' : ''}${[h && unit(h, 'hour'), (m || !h) && unit(m, 'minute')].filter(Boolean).join(' ')}`;\n },\n};\n\n/** Registers a named formatter, usable as `format: 'name'` in columns. */\nexport function registerFormat(name: string, fn: Formatter): void {\n formats[name] = fn;\n}\n\nexport function format(fmt: string | Formatter, value: unknown): string {\n const fn = typeof fmt === 'function' ? fmt : formats[fmt];\n if (!fn) throw new Error(`Optikos: unknown format \"${fmt}\"`);\n return fn(value);\n}\n"],
5
+ "mappings": "wCAIA,IAAMA,EAAO,IAAMC,EAAU,EAAE,MACzBC,EAAO,CAACC,EAAQC,IAAqC,CACzD,GAAID,GAAK,MAAQA,IAAM,GAAI,MAAO,GAElC,IAAME,EAAIF,aAAa,KAAOA,EAAI,OAAOA,GAAM,UAAY,sBAAsB,KAAKA,CAAC,EAAI,IAAI,KAAK,CAACA,EAAE,MAAM,EAAG,CAAC,EAAG,CAACA,EAAE,MAAM,EAAG,CAAC,EAAI,EAAG,CAACA,EAAE,MAAM,EAAG,EAAE,CAAC,EAAI,IAAI,KAAKA,CAAC,EACrK,OAAO,MAAM,CAACE,CAAC,EAAI,OAAOF,CAAC,EAAI,IAAI,KAAK,eAAeH,EAAK,EAAGI,CAAI,EAAE,OAAOC,CAAC,CAC/E,EAEMC,EAAqC,CACzC,OAAQ,CAACH,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAGO,CAAC,EAAE,OAAOJ,CAAC,EACzF,MAAO,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,WAAY,SAAUC,EAAU,EAAE,UAAW,GAAGM,CAAE,CAAC,EAAE,OAAOJ,CAAC,EACnJ,QAAS,CAACA,EAAGI,IAAOJ,GAAK,MAAQA,IAAM,GAAK,GAAK,IAAI,KAAK,aAAaH,EAAK,EAAG,CAAE,MAAO,UAAW,sBAAuB,EAAG,GAAGO,CAAE,CAAC,EAAE,OAAOJ,CAAC,EAC7I,KAAM,CAACA,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,GAAGI,CAAE,CAAC,EACrD,SAAU,CAACJ,EAAGI,IAAML,EAAKC,EAAG,CAAE,UAAW,SAAU,UAAW,QAAS,GAAGI,CAAE,CAAC,EAC7E,KAAOJ,GAAOA,EAAI,SAAM,GACxB,SAAWA,GAAM,CACf,GAAIA,GAAK,MAAQA,IAAM,IAAM,MAAM,OAAOA,CAAC,CAAC,EAAG,OAAOA,GAAK,KAAO,GAAK,OAAOA,CAAC,EAC/E,IAAMK,EAAQ,KAAK,MAAM,OAAOL,CAAC,CAAC,EAC5BM,EAAO,CAACC,EAAWC,IAAc,IAAI,KAAK,aAAaX,EAAK,EAAG,CAAE,MAAO,OAAQ,KAAMW,EAAG,YAAa,QAAS,CAAC,EAAE,OAAOD,CAAC,EAC1H,CAACE,EAAGC,CAAC,EAAI,CAAC,KAAK,MAAM,KAAK,IAAIL,CAAK,EAAI,EAAE,EAAG,KAAK,IAAIA,CAAK,EAAI,EAAE,EACtE,MAAO,GAAGA,EAAQ,EAAI,IAAM,EAAE,GAAG,CAACI,GAAKH,EAAKG,EAAG,MAAM,GAAIC,GAAK,CAACD,IAAMH,EAAKI,EAAG,QAAQ,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CAAC,EACnH,CACF,EAGO,SAASC,EAAeC,EAAcC,EAAqB,CAChEV,EAAQS,CAAI,EAAIC,CAClB,CAEO,SAASC,EAAOC,EAAyBC,EAAwB,CACtE,IAAMH,EAAK,OAAOE,GAAQ,WAAaA,EAAMZ,EAAQY,CAAG,EACxD,GAAI,CAACF,EAAI,MAAM,IAAI,MAAM,4BAA4BE,CAAG,GAAG,EAC3D,OAAOF,EAAGG,CAAK,CACjB",
6
+ "names": ["lang", "getLocale", "date", "v", "opts", "d", "formats", "o", "total", "unit", "n", "u", "h", "m", "registerFormat", "name", "fn", "format", "fmt", "value"]
7
+ }