optikos 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (432) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/dist/bind.js +1 -1
  3. package/dist/bind.js.map +4 -4
  4. package/dist/{chunk-5JEXM5S7.js → chunk-2GKIF7A6.js} +2 -2
  5. package/dist/chunk-2HNQ2XRY.js +2 -0
  6. package/dist/chunk-2HNQ2XRY.js.map +7 -0
  7. package/dist/chunk-2QMI2RRB.js +2 -0
  8. package/dist/chunk-2QMI2RRB.js.map +7 -0
  9. package/dist/{chunk-W3H7GTJY.js → chunk-2YRQULDC.js} +2 -2
  10. package/dist/{chunk-ZPPELYNJ.js → chunk-3BG75P7T.js} +2 -2
  11. package/dist/{chunk-GNU4VOOE.js → chunk-3F4MN2BU.js} +2 -2
  12. package/dist/chunk-3FCIZKIN.js +2 -0
  13. package/dist/chunk-3FCIZKIN.js.map +7 -0
  14. package/dist/{chunk-5DJTP53N.js → chunk-3FK52VQX.js} +2 -2
  15. package/dist/chunk-3QRA3XOA.js +2 -0
  16. package/dist/chunk-3QRA3XOA.js.map +7 -0
  17. package/dist/chunk-3TCITFUU.js +2 -0
  18. package/dist/chunk-3TCITFUU.js.map +7 -0
  19. package/dist/chunk-3VDLX7ET.js +2 -0
  20. package/dist/chunk-3VDLX7ET.js.map +7 -0
  21. package/dist/{chunk-3TAW4AKH.js → chunk-4AZ44KV4.js} +2 -2
  22. package/dist/{chunk-TZOQWCVH.js → chunk-4CWYF4O7.js} +2 -2
  23. package/dist/{chunk-REW4LR46.js → chunk-4OB2IM5L.js} +2 -2
  24. package/dist/{chunk-2YZB6XQR.js → chunk-4S3HRFQB.js} +2 -2
  25. package/dist/chunk-5BMG5ZBY.js +2 -0
  26. package/dist/{chunk-KLLAY2IM.js.map → chunk-5BMG5ZBY.js.map} +2 -2
  27. package/dist/chunk-5PWPAN62.js +2 -0
  28. package/dist/chunk-5PWPAN62.js.map +7 -0
  29. package/dist/chunk-5PYJ6FJK.js +2 -0
  30. package/dist/chunk-5PYJ6FJK.js.map +7 -0
  31. package/dist/{chunk-OGRFQTXA.js → chunk-643FOYQB.js} +2 -2
  32. package/dist/{chunk-JOFQJGZK.js → chunk-6BOM5KZR.js} +2 -2
  33. package/dist/chunk-6LJK4QWF.js +2 -0
  34. package/dist/chunk-6LJK4QWF.js.map +7 -0
  35. package/dist/{chunk-JK74QK3M.js → chunk-6PZPBPAD.js} +2 -2
  36. package/dist/chunk-7Y2GHQRB.js +2 -0
  37. package/dist/{chunk-YHEMA56R.js → chunk-AQ3RTHG5.js} +2 -2
  38. package/dist/{chunk-M242VYZA.js → chunk-AT7VFZRB.js} +2 -2
  39. package/dist/{chunk-ZVK4L5GK.js → chunk-BCVOUMJJ.js} +2 -2
  40. package/dist/{chunk-HOF4JGMQ.js → chunk-BIGL3ZVD.js} +2 -2
  41. package/dist/chunk-BJWREA76.js +2 -0
  42. package/dist/chunk-BJWREA76.js.map +7 -0
  43. package/dist/{chunk-ZWNQREWS.js → chunk-BQEFLPDA.js} +2 -2
  44. package/dist/{chunk-ZWNQREWS.js.map → chunk-BQEFLPDA.js.map} +2 -2
  45. package/dist/{chunk-FEHGU6EP.js → chunk-C3MWS7P2.js} +2 -2
  46. package/dist/{chunk-G2KUK6AT.js → chunk-CFGCB37K.js} +2 -2
  47. package/dist/{chunk-JI265XFO.js → chunk-CMV3F6HR.js} +2 -2
  48. package/dist/{chunk-TOLTUOZS.js → chunk-CWIE74NX.js} +2 -2
  49. package/dist/{chunk-4EZJ5FKJ.js → chunk-DIOJGTUN.js} +2 -2
  50. package/dist/chunk-DJUSVBD5.js +2 -0
  51. package/dist/chunk-DJUSVBD5.js.map +7 -0
  52. package/dist/{chunk-HXDTGP2K.js → chunk-DWA45BWR.js} +2 -2
  53. package/dist/chunk-DWTDNKXX.js +2 -0
  54. package/dist/chunk-DWTDNKXX.js.map +7 -0
  55. package/dist/chunk-ESCLDVFS.js +2 -0
  56. package/dist/{chunk-YBAYEU25.js.map → chunk-ESCLDVFS.js.map} +1 -1
  57. package/dist/chunk-EXIADWI7.js +2 -0
  58. package/dist/chunk-EXIADWI7.js.map +7 -0
  59. package/dist/{chunk-5QUY72FX.js → chunk-F4HZUAKM.js} +2 -2
  60. package/dist/chunk-FCJI2JF7.js +3 -0
  61. package/dist/chunk-FCJI2JF7.js.map +7 -0
  62. package/dist/{chunk-Q26YZYTD.js → chunk-FPU53CCV.js} +2 -2
  63. package/dist/{chunk-3S24ZRPK.js → chunk-GEBAYD6N.js} +2 -2
  64. package/dist/{chunk-G2DAD3MQ.js → chunk-GEJKFE4X.js} +2 -2
  65. package/dist/chunk-GFFZTFQH.js +2 -0
  66. package/dist/chunk-GFFZTFQH.js.map +7 -0
  67. package/dist/chunk-GFJRGBQR.js +2 -0
  68. package/dist/chunk-GFJRGBQR.js.map +7 -0
  69. package/dist/chunk-GZIDE5K2.js +2 -0
  70. package/dist/chunk-GZIDE5K2.js.map +7 -0
  71. package/dist/{chunk-5Q76ACVI.js → chunk-H25XXQVH.js} +2 -2
  72. package/dist/chunk-HG7OOHGD.js +2 -0
  73. package/dist/chunk-HG7OOHGD.js.map +7 -0
  74. package/dist/{chunk-2ZUZ5HDL.js → chunk-HLS5FI55.js} +2 -2
  75. package/dist/chunk-HRW25TMU.js +2 -0
  76. package/dist/chunk-HX6TWXTX.js +2 -0
  77. package/dist/chunk-HX6TWXTX.js.map +7 -0
  78. package/dist/chunk-I5A74NMJ.js +2 -0
  79. package/dist/chunk-I5A74NMJ.js.map +7 -0
  80. package/dist/chunk-IUOEPAWG.js +2 -0
  81. package/dist/chunk-IUOEPAWG.js.map +7 -0
  82. package/dist/{chunk-IHE2MQ3W.js → chunk-J5QPFJ7M.js} +2 -2
  83. package/dist/chunk-JE56CJX2.js +2 -0
  84. package/dist/chunk-JE56CJX2.js.map +7 -0
  85. package/dist/chunk-JJLOUMCJ.js +2 -0
  86. package/dist/chunk-JJLOUMCJ.js.map +7 -0
  87. package/dist/chunk-JLKIHXZP.js +3 -0
  88. package/dist/chunk-JLKIHXZP.js.map +7 -0
  89. package/dist/{chunk-5BC72727.js → chunk-JSEI44A7.js} +2 -2
  90. package/dist/chunk-L5SQQFO7.js +2 -0
  91. package/dist/chunk-L5SQQFO7.js.map +7 -0
  92. package/dist/chunk-M2ZRKHE4.js +2 -0
  93. package/dist/chunk-M2ZRKHE4.js.map +7 -0
  94. package/dist/chunk-M7FNPRV4.js +2 -0
  95. package/dist/chunk-M7FNPRV4.js.map +7 -0
  96. package/dist/chunk-MNSDGJKA.js +3 -0
  97. package/dist/chunk-MNSDGJKA.js.map +7 -0
  98. package/dist/{chunk-DBMWS3O5.js → chunk-MQ5BYGFY.js} +2 -2
  99. package/dist/chunk-N2LS4JD6.js +2 -0
  100. package/dist/chunk-N2LS4JD6.js.map +7 -0
  101. package/dist/chunk-NJ5IFOPR.js +4 -0
  102. package/dist/{chunk-XX2MVWFS.js.map → chunk-NJ5IFOPR.js.map} +1 -1
  103. package/dist/{chunk-NXSTUFS7.js → chunk-NNR2FNHG.js} +2 -2
  104. package/dist/chunk-NQV4THNE.js +2 -0
  105. package/dist/{chunk-UXXJOU5J.js.map → chunk-NQV4THNE.js.map} +1 -1
  106. package/dist/{chunk-XHOBNSBO.js → chunk-P4O57S6N.js} +2 -2
  107. package/dist/{chunk-MB3MU6HR.js → chunk-PGVLRMTQ.js} +2 -2
  108. package/dist/chunk-PMOXLQ72.js +2 -0
  109. package/dist/chunk-PMOXLQ72.js.map +7 -0
  110. package/dist/chunk-Q6FY4L2F.js +2 -0
  111. package/dist/chunk-Q6FY4L2F.js.map +7 -0
  112. package/dist/chunk-R32HPK7R.js +2 -0
  113. package/dist/chunk-R32HPK7R.js.map +7 -0
  114. package/dist/{chunk-Z2JBUHKA.js → chunk-RG6SHPHF.js} +2 -2
  115. package/dist/{chunk-EDUMAMK4.js → chunk-S2CMWKVB.js} +2 -2
  116. package/dist/chunk-S4QD5NID.js +2 -0
  117. package/dist/chunk-S4QD5NID.js.map +7 -0
  118. package/dist/chunk-SB4ICXBV.js +2 -0
  119. package/dist/chunk-SB4ICXBV.js.map +7 -0
  120. package/dist/{chunk-23XLG2EM.js → chunk-SEW5OCQF.js} +2 -2
  121. package/dist/chunk-SWCB2GMN.js +2 -0
  122. package/dist/chunk-SWCB2GMN.js.map +7 -0
  123. package/dist/chunk-TQPQ4UEA.js +2 -0
  124. package/dist/chunk-TQPQ4UEA.js.map +7 -0
  125. package/dist/{chunk-Z2Z52GFT.js → chunk-U5L76VVB.js} +2 -2
  126. package/dist/chunk-UDXO3KM3.js +2 -0
  127. package/dist/chunk-UDXO3KM3.js.map +7 -0
  128. package/dist/{chunk-LQRFNQ2N.js → chunk-UQRQH2JW.js} +2 -2
  129. package/dist/chunk-V5G5JECN.js +2 -0
  130. package/dist/chunk-V5G5JECN.js.map +7 -0
  131. package/dist/{chunk-JBLRAM7Z.js → chunk-XFIREDWO.js} +2 -2
  132. package/dist/chunk-XQHATUKN.js +2 -0
  133. package/dist/{chunk-LW2WRUVL.js.map → chunk-XQHATUKN.js.map} +4 -4
  134. package/dist/chunk-XR677UYD.js +2 -0
  135. package/dist/chunk-XR677UYD.js.map +7 -0
  136. package/dist/{chunk-RNN55473.js → chunk-YDX2PCVL.js} +2 -2
  137. package/dist/{chunk-RNN55473.js.map → chunk-YDX2PCVL.js.map} +1 -1
  138. package/dist/chunk-YJTUFK4P.js +2 -0
  139. package/dist/chunk-YLFSCQL3.js +2 -0
  140. package/dist/chunk-YLFSCQL3.js.map +7 -0
  141. package/dist/chunk-YXOKWCYS.js +2 -0
  142. package/dist/chunk-YXOKWCYS.js.map +7 -0
  143. package/dist/{chunk-I4SP6JTU.js → chunk-Z6L55FTN.js} +2 -2
  144. package/dist/{chunk-6VBK2I5B.js → chunk-ZSPJZ3ZH.js} +2 -2
  145. package/dist/components/avatar.js +2 -0
  146. package/dist/components/avatar.js.map +7 -0
  147. package/dist/components/badge.js +1 -1
  148. package/dist/components/breadcrumb.js +1 -1
  149. package/dist/components/button.js +1 -1
  150. package/dist/components/calendar.js +1 -1
  151. package/dist/components/carousel.js +2 -0
  152. package/dist/components/carousel.js.map +7 -0
  153. package/dist/components/cellediting.js +1 -1
  154. package/dist/components/chart.js +2 -0
  155. package/dist/components/chart.js.map +7 -0
  156. package/dist/components/chat.js +1 -1
  157. package/dist/components/checkbox.js +1 -1
  158. package/dist/components/checkboxgroup.js +1 -1
  159. package/dist/components/chip.js +1 -1
  160. package/dist/components/codeviewer.js +1 -1
  161. package/dist/components/combobox.js +1 -1
  162. package/dist/components/commandpalette.js +1 -1
  163. package/dist/components/container.js +1 -1
  164. package/dist/components/dataview.js +1 -1
  165. package/dist/components/datefield.js +1 -1
  166. package/dist/components/daterangefield.js +1 -1
  167. package/dist/components/datetimefield.js +2 -0
  168. package/dist/components/datetimefield.js.map +7 -0
  169. package/dist/components/dial.js +1 -1
  170. package/dist/components/dropdown.js +1 -1
  171. package/dist/components/fieldgroup.js +1 -1
  172. package/dist/components/fieldlist.js +1 -1
  173. package/dist/components/fieldset.js +1 -1
  174. package/dist/components/filterbuilder.js +1 -1
  175. package/dist/components/form.js +1 -1
  176. package/dist/components/formactions.js +1 -1
  177. package/dist/components/formerrors.js +1 -1
  178. package/dist/components/formsection.js +1 -1
  179. package/dist/components/grid.js +1 -1
  180. package/dist/components/gridexport.js +2 -0
  181. package/dist/components/gridexport.js.map +7 -0
  182. package/dist/components/gridstate.js +2 -0
  183. package/dist/components/gridstate.js.map +7 -0
  184. package/dist/components/grouping.js +2 -0
  185. package/dist/components/grouping.js.map +7 -0
  186. package/dist/components/icon.js +1 -1
  187. package/dist/components/image.js +2 -0
  188. package/dist/components/image.js.map +7 -0
  189. package/dist/components/imagecanvas.js +2 -0
  190. package/dist/components/imagecanvas.js.map +7 -0
  191. package/dist/components/imagefield.js +2 -0
  192. package/dist/components/imagefield.js.map +7 -0
  193. package/dist/components/inputgroup.js +1 -1
  194. package/dist/components/label.js +1 -1
  195. package/dist/components/listbox.js +1 -1
  196. package/dist/components/lookupfield.js +1 -1
  197. package/dist/components/maskfield.js +2 -0
  198. package/dist/components/maskfield.js.map +7 -0
  199. package/dist/components/menu.js +1 -1
  200. package/dist/components/messagebox.js +1 -1
  201. package/dist/components/navmenu.js +1 -1
  202. package/dist/components/numberfield.js +1 -1
  203. package/dist/components/pagination.js +1 -1
  204. package/dist/components/panel.js +1 -1
  205. package/dist/components/pickerfield.js +1 -1
  206. package/dist/components/radiogroup.js +1 -1
  207. package/dist/components/rowediting.js +2 -0
  208. package/dist/components/rowediting.js.map +7 -0
  209. package/dist/components/searchgrid.js +1 -1
  210. package/dist/components/secretfield.js +1 -1
  211. package/dist/components/select.js +1 -1
  212. package/dist/components/shortcuts.js +2 -0
  213. package/dist/components/shortcuts.js.map +7 -0
  214. package/dist/components/slider.js +1 -1
  215. package/dist/components/spacer.js +1 -1
  216. package/dist/components/spinner.js +1 -1
  217. package/dist/components/stat.js +2 -0
  218. package/dist/components/stat.js.map +7 -0
  219. package/dist/components/stepform.js +1 -1
  220. package/dist/components/stepper.js +1 -1
  221. package/dist/components/suggestfield.js +1 -1
  222. package/dist/components/table.js +1 -1
  223. package/dist/components/tabs.js +1 -1
  224. package/dist/components/textarea.js +1 -1
  225. package/dist/components/textfield.js +1 -1
  226. package/dist/components/timefield.js +2 -0
  227. package/dist/components/timefield.js.map +7 -0
  228. package/dist/components/timeline.js +2 -0
  229. package/dist/components/timeline.js.map +7 -0
  230. package/dist/components/toast.js +1 -1
  231. package/dist/components/toggle.js +1 -1
  232. package/dist/components/toolbar.js +1 -1
  233. package/dist/components/tree.js +1 -1
  234. package/dist/components/treegrid.js +2 -0
  235. package/dist/components/treegrid.js.map +7 -0
  236. package/dist/components/viewmanager.js +1 -1
  237. package/dist/components/viewport.js +1 -1
  238. package/dist/components/widget.js +1 -1
  239. package/dist/components/window.js +1 -1
  240. package/dist/core.js +1 -1
  241. package/dist/css/avatar.css +68 -0
  242. package/dist/css/base.css +9 -0
  243. package/dist/css/carousel.css +119 -0
  244. package/dist/css/chart.css +168 -0
  245. package/dist/css/core.css +36 -0
  246. package/dist/css/datetimefield.css +15 -0
  247. package/dist/css/grid.css +40 -0
  248. package/dist/css/gridexport.css +35 -0
  249. package/dist/css/grouping.css +49 -0
  250. package/dist/css/image.css +46 -0
  251. package/dist/css/imagecanvas.css +75 -0
  252. package/dist/css/imagefield.css +103 -0
  253. package/dist/css/rowediting.css +39 -0
  254. package/dist/css/shortcuts.css +34 -0
  255. package/dist/css/stat.css +64 -0
  256. package/dist/css/stepform.css +1 -0
  257. package/dist/css/timeline.css +140 -0
  258. package/dist/css/treegrid.css +35 -0
  259. package/dist/css/window.css +2 -2
  260. package/dist/data.js +1 -1
  261. package/dist/dev.js +2 -0
  262. package/dist/dev.js.map +7 -0
  263. package/dist/index.js +16 -5
  264. package/dist/index.js.map +4 -4
  265. package/dist/optikos.css +1111 -21
  266. package/dist/testing.js +2 -0
  267. package/dist/testing.js.map +7 -0
  268. package/dist/themes/dark.css +7 -0
  269. package/dist/types/bind/index.d.ts +1 -1
  270. package/dist/types/bind/viewmodel.d.ts +33 -0
  271. package/dist/types/components/avatar.d.ts +1 -0
  272. package/dist/types/components/base/avatar/avatar.d.ts +22 -0
  273. package/dist/types/components/base/image/image.d.ts +25 -0
  274. package/dist/types/components/base/imagecanvas/imagecanvas.d.ts +39 -0
  275. package/dist/types/components/carousel.d.ts +1 -0
  276. package/dist/types/components/chart.d.ts +1 -0
  277. package/dist/types/components/charts/chart/chart.d.ts +64 -0
  278. package/dist/types/components/charts/stat/stat.d.ts +34 -0
  279. package/dist/types/components/data/cellediting/cellediting.d.ts +3 -0
  280. package/dist/types/components/data/grid/grid.d.ts +37 -0
  281. package/dist/types/components/data/gridexport/gridexport.d.ts +29 -0
  282. package/dist/types/components/data/gridstate/gridstate.d.ts +23 -0
  283. package/dist/types/components/data/grouping/grouping.d.ts +31 -0
  284. package/dist/types/components/data/rowediting/rowediting.d.ts +13 -0
  285. package/dist/types/components/data/searchgrid/searchgrid.d.ts +9 -2
  286. package/dist/types/components/data/timeline/timeline.d.ts +60 -0
  287. package/dist/types/components/data/treegrid/treegrid.d.ts +32 -0
  288. package/dist/types/components/datetimefield.d.ts +1 -0
  289. package/dist/types/components/fields/datetimefield/datetimefield.d.ts +28 -0
  290. package/dist/types/components/fields/imagefield/imagefield.d.ts +48 -0
  291. package/dist/types/components/fields/maskfield/maskfield.d.ts +28 -0
  292. package/dist/types/components/fields/numberfield/numberfield.d.ts +9 -0
  293. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +3 -0
  294. package/dist/types/components/fields/timefield/timefield.d.ts +24 -0
  295. package/dist/types/components/form/fieldlist/fieldlist.d.ts +2 -0
  296. package/dist/types/components/form/form/form.d.ts +5 -0
  297. package/dist/types/components/form/stepform/stepform.d.ts +1 -1
  298. package/dist/types/components/gridexport.d.ts +1 -0
  299. package/dist/types/components/gridstate.d.ts +1 -0
  300. package/dist/types/components/grouping.d.ts +1 -0
  301. package/dist/types/components/image.d.ts +1 -0
  302. package/dist/types/components/imagecanvas.d.ts +1 -0
  303. package/dist/types/components/imagefield.d.ts +1 -0
  304. package/dist/types/components/layout/carousel/carousel.d.ts +58 -0
  305. package/dist/types/components/maskfield.d.ts +1 -0
  306. package/dist/types/components/navigation/navmenu/navmenu.d.ts +2 -0
  307. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +2 -0
  308. package/dist/types/components/overlays/menu/menu.d.ts +4 -1
  309. package/dist/types/components/overlays/shortcuts/shortcuts.d.ts +27 -0
  310. package/dist/types/components/overlays/window/window.d.ts +14 -1
  311. package/dist/types/components/rowediting.d.ts +1 -0
  312. package/dist/types/components/shortcuts.d.ts +1 -0
  313. package/dist/types/components/stat.d.ts +1 -0
  314. package/dist/types/components/timefield.d.ts +1 -0
  315. package/dist/types/components/timeline.d.ts +1 -0
  316. package/dist/types/components/treegrid.d.ts +1 -0
  317. package/dist/types/core/component.d.ts +7 -0
  318. package/dist/types/core/container.d.ts +10 -1
  319. package/dist/types/core/dev.d.ts +2 -0
  320. package/dist/types/core/field.d.ts +4 -0
  321. package/dist/types/core/i18n.d.ts +2 -0
  322. package/dist/types/core/index.d.ts +4 -1
  323. package/dist/types/core/path.d.ts +2 -0
  324. package/dist/types/core/permission.d.ts +11 -0
  325. package/dist/types/core/state.d.ts +9 -0
  326. package/dist/types/data/column.d.ts +8 -0
  327. package/dist/types/data/index.d.ts +1 -1
  328. package/dist/types/data/model.d.ts +2 -0
  329. package/dist/types/data/store.d.ts +21 -0
  330. package/dist/types/dev/index.d.ts +2 -0
  331. package/dist/types/dev/keys.d.ts +1 -0
  332. package/dist/types/index.d.ts +17 -0
  333. package/dist/types/testing/index.d.ts +25 -0
  334. package/dist/types/themes/color.d.ts +14 -0
  335. package/dist/types/themes/contrast.d.ts +15 -0
  336. package/dist/types/themes/define.d.ts +25 -3
  337. package/dist/types/themes/index.d.ts +3 -1
  338. package/dist/types/themes/seeds.d.ts +11 -0
  339. package/dist/types/ui/ui.d.ts +6 -0
  340. package/dist/ui.js +1 -1
  341. package/package.json +9 -1
  342. package/dist/chunk-2ZRNGG2N.js +0 -2
  343. package/dist/chunk-2ZRNGG2N.js.map +0 -7
  344. package/dist/chunk-4EQEHJB3.js +0 -2
  345. package/dist/chunk-4EQEHJB3.js.map +0 -7
  346. package/dist/chunk-4LZZ244E.js +0 -2
  347. package/dist/chunk-4LZZ244E.js.map +0 -7
  348. package/dist/chunk-4SYIIX5A.js +0 -2
  349. package/dist/chunk-4SYIIX5A.js.map +0 -7
  350. package/dist/chunk-7KMIFXHZ.js +0 -2
  351. package/dist/chunk-7KMIFXHZ.js.map +0 -7
  352. package/dist/chunk-A2NKDOYN.js +0 -2
  353. package/dist/chunk-A2NKDOYN.js.map +0 -7
  354. package/dist/chunk-CKXS375P.js +0 -2
  355. package/dist/chunk-CKXS375P.js.map +0 -7
  356. package/dist/chunk-EJGWCKE4.js +0 -2
  357. package/dist/chunk-EJGWCKE4.js.map +0 -7
  358. package/dist/chunk-ELYARUCN.js +0 -2
  359. package/dist/chunk-EV73ADN2.js +0 -2
  360. package/dist/chunk-EV73ADN2.js.map +0 -7
  361. package/dist/chunk-GD5JGKM7.js +0 -2
  362. package/dist/chunk-GD5JGKM7.js.map +0 -7
  363. package/dist/chunk-GZ7X34QP.js +0 -2
  364. package/dist/chunk-KCEUD232.js +0 -2
  365. package/dist/chunk-KCEUD232.js.map +0 -7
  366. package/dist/chunk-KLLAY2IM.js +0 -2
  367. package/dist/chunk-LBJSMXLV.js +0 -2
  368. package/dist/chunk-LBJSMXLV.js.map +0 -7
  369. package/dist/chunk-LW2WRUVL.js +0 -2
  370. package/dist/chunk-MW3RWBZ7.js +0 -2
  371. package/dist/chunk-MW3RWBZ7.js.map +0 -7
  372. package/dist/chunk-OEAXCCVM.js +0 -2
  373. package/dist/chunk-OEAXCCVM.js.map +0 -7
  374. package/dist/chunk-UB5RYS7T.js +0 -2
  375. package/dist/chunk-UB5RYS7T.js.map +0 -7
  376. package/dist/chunk-UXXJOU5J.js +0 -2
  377. package/dist/chunk-VU3GIDZ3.js +0 -2
  378. package/dist/chunk-VU3GIDZ3.js.map +0 -7
  379. package/dist/chunk-W2BAFOCN.js +0 -3
  380. package/dist/chunk-W2BAFOCN.js.map +0 -7
  381. package/dist/chunk-WFGTQZIQ.js +0 -2
  382. package/dist/chunk-WFGTQZIQ.js.map +0 -7
  383. package/dist/chunk-XX2MVWFS.js +0 -4
  384. package/dist/chunk-XYZ6VZ5T.js +0 -2
  385. package/dist/chunk-YBAYEU25.js +0 -2
  386. package/dist/chunk-YF75HKL6.js +0 -2
  387. package/dist/chunk-YF75HKL6.js.map +0 -7
  388. /package/dist/{chunk-5JEXM5S7.js.map → chunk-2GKIF7A6.js.map} +0 -0
  389. /package/dist/{chunk-W3H7GTJY.js.map → chunk-2YRQULDC.js.map} +0 -0
  390. /package/dist/{chunk-ZPPELYNJ.js.map → chunk-3BG75P7T.js.map} +0 -0
  391. /package/dist/{chunk-GNU4VOOE.js.map → chunk-3F4MN2BU.js.map} +0 -0
  392. /package/dist/{chunk-5DJTP53N.js.map → chunk-3FK52VQX.js.map} +0 -0
  393. /package/dist/{chunk-3TAW4AKH.js.map → chunk-4AZ44KV4.js.map} +0 -0
  394. /package/dist/{chunk-TZOQWCVH.js.map → chunk-4CWYF4O7.js.map} +0 -0
  395. /package/dist/{chunk-REW4LR46.js.map → chunk-4OB2IM5L.js.map} +0 -0
  396. /package/dist/{chunk-2YZB6XQR.js.map → chunk-4S3HRFQB.js.map} +0 -0
  397. /package/dist/{chunk-OGRFQTXA.js.map → chunk-643FOYQB.js.map} +0 -0
  398. /package/dist/{chunk-JOFQJGZK.js.map → chunk-6BOM5KZR.js.map} +0 -0
  399. /package/dist/{chunk-JK74QK3M.js.map → chunk-6PZPBPAD.js.map} +0 -0
  400. /package/dist/{chunk-GZ7X34QP.js.map → chunk-7Y2GHQRB.js.map} +0 -0
  401. /package/dist/{chunk-YHEMA56R.js.map → chunk-AQ3RTHG5.js.map} +0 -0
  402. /package/dist/{chunk-M242VYZA.js.map → chunk-AT7VFZRB.js.map} +0 -0
  403. /package/dist/{chunk-ZVK4L5GK.js.map → chunk-BCVOUMJJ.js.map} +0 -0
  404. /package/dist/{chunk-HOF4JGMQ.js.map → chunk-BIGL3ZVD.js.map} +0 -0
  405. /package/dist/{chunk-FEHGU6EP.js.map → chunk-C3MWS7P2.js.map} +0 -0
  406. /package/dist/{chunk-G2KUK6AT.js.map → chunk-CFGCB37K.js.map} +0 -0
  407. /package/dist/{chunk-JI265XFO.js.map → chunk-CMV3F6HR.js.map} +0 -0
  408. /package/dist/{chunk-TOLTUOZS.js.map → chunk-CWIE74NX.js.map} +0 -0
  409. /package/dist/{chunk-4EZJ5FKJ.js.map → chunk-DIOJGTUN.js.map} +0 -0
  410. /package/dist/{chunk-HXDTGP2K.js.map → chunk-DWA45BWR.js.map} +0 -0
  411. /package/dist/{chunk-5QUY72FX.js.map → chunk-F4HZUAKM.js.map} +0 -0
  412. /package/dist/{chunk-Q26YZYTD.js.map → chunk-FPU53CCV.js.map} +0 -0
  413. /package/dist/{chunk-3S24ZRPK.js.map → chunk-GEBAYD6N.js.map} +0 -0
  414. /package/dist/{chunk-G2DAD3MQ.js.map → chunk-GEJKFE4X.js.map} +0 -0
  415. /package/dist/{chunk-5Q76ACVI.js.map → chunk-H25XXQVH.js.map} +0 -0
  416. /package/dist/{chunk-2ZUZ5HDL.js.map → chunk-HLS5FI55.js.map} +0 -0
  417. /package/dist/{chunk-XYZ6VZ5T.js.map → chunk-HRW25TMU.js.map} +0 -0
  418. /package/dist/{chunk-IHE2MQ3W.js.map → chunk-J5QPFJ7M.js.map} +0 -0
  419. /package/dist/{chunk-5BC72727.js.map → chunk-JSEI44A7.js.map} +0 -0
  420. /package/dist/{chunk-DBMWS3O5.js.map → chunk-MQ5BYGFY.js.map} +0 -0
  421. /package/dist/{chunk-NXSTUFS7.js.map → chunk-NNR2FNHG.js.map} +0 -0
  422. /package/dist/{chunk-XHOBNSBO.js.map → chunk-P4O57S6N.js.map} +0 -0
  423. /package/dist/{chunk-MB3MU6HR.js.map → chunk-PGVLRMTQ.js.map} +0 -0
  424. /package/dist/{chunk-Z2JBUHKA.js.map → chunk-RG6SHPHF.js.map} +0 -0
  425. /package/dist/{chunk-EDUMAMK4.js.map → chunk-S2CMWKVB.js.map} +0 -0
  426. /package/dist/{chunk-23XLG2EM.js.map → chunk-SEW5OCQF.js.map} +0 -0
  427. /package/dist/{chunk-Z2Z52GFT.js.map → chunk-U5L76VVB.js.map} +0 -0
  428. /package/dist/{chunk-LQRFNQ2N.js.map → chunk-UQRQH2JW.js.map} +0 -0
  429. /package/dist/{chunk-JBLRAM7Z.js.map → chunk-XFIREDWO.js.map} +0 -0
  430. /package/dist/{chunk-ELYARUCN.js.map → chunk-YJTUFK4P.js.map} +0 -0
  431. /package/dist/{chunk-I4SP6JTU.js.map → chunk-Z6L55FTN.js.map} +0 -0
  432. /package/dist/{chunk-6VBK2I5B.js.map → chunk-ZSPJZ3ZH.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/timeline/timeline.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale, addMessages } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\n\naddMessages('en', { timeline: 'Timeline', tlNow: 'Now', tlFromTo: '{from} to {to}' });\naddMessages('pt-BR', { timeline: 'Linha do tempo', tlNow: 'Agora', tlFromTo: '{from} at\u00E9 {to}' });\n\nexport interface TimelineItem {\n id?: string | number;\n title: string;\n text?: string;\n icon?: string;\n tone?: 'default' | 'success' | 'warning' | 'danger' | 'info';\n /** `list`: when it happened (an ISO date or time, or any text). */\n time?: string;\n /** `range`: ISO dates or date-times. */\n start?: string;\n end?: string;\n /** `range`: the row (a person, a room, a phase). */\n lane?: string;\n}\n\nexport interface TimelineConfig extends ComponentConfig {\n /** `list`: events one under the other, with a marker (default). `range`: a schedule: bars over a time axis, one row per `lane`. */\n mode?: 'list' | 'range';\n items?: TimelineItem[];\n /** Items from a Store (its records are `TimelineItem`s). */\n store?: Store<any>;\n /** `range`: the order of the rows. Default: order of appearance. */\n lanes?: string[];\n /** `range`: the window shown. Default: from the first start to the last end. */\n from?: string;\n to?: string;\n /** `range`: a marker at the current time. Default true. */\n now?: boolean;\n /** Optional features (`timeEntry()`...). See `TimelinePlugin`. */\n plugins?: TimelinePlugin[];\n}\n\n/** Extends a Timeline without growing its base: `init` runs once it is rendered and may return a cleanup. The timeline fires `paint` after every repaint. */\nexport interface TimelinePlugin {\n init(timeline: Timeline): void | (() => void);\n}\n\n/** The time axis of a `range` timeline: its ends in ms, and how to read and write the item dates (`clock`: `'HH:mm'` of one day, else ISO). */\nexport interface TimelineScale {\n lo: number;\n hi: number;\n clock: boolean;\n parse(v: string): number;\n format(ms: number): string;\n}\n\nconst CLOCK = /^\\d{1,2}:\\d{2}$/;\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst DAY = 86400000;\nconst when = (v: string, o: Intl.DateTimeFormatOptions) => (/^\\d{4}-\\d{2}/.test(v) && !isNaN(+new Date(v)) ? new Intl.DateTimeFormat(getLocale()._lang, o).format(new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v)) : v);\n\n/** Events as a vertical list, or a schedule (phases, staff shifts) as bars on a time axis. Click or Enter on an item fires `select`. */\nexport class Timeline extends Component<TimelineConfig> {\n protected override baseCls = 'op-timeline';\n private items: TimelineItem[] = [];\n private scale?: TimelineScale;\n\n protected override build() {\n return h('div', this.baseCls);\n }\n\n protected override onRender() {\n this.el.classList.add(`op-timeline--${this.config.mode ?? 'list'}`);\n const store = this.config.store;\n if (store) this.own(store.subscribe(() => this.setItems(store.getFiltered().map((r) => r.data))));\n this.setItems(store ? store.getFiltered().map((r) => r.data) : (this.config.items ?? []));\n for (const p of this.config.plugins ?? []) {\n const off = p.init(this);\n if (off) this.own(off);\n }\n this.listen(this.el, 'click', (e: Event) => this.pick(e.target as HTMLElement));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => e.key === 'Enter' && this.pick(e.target as HTMLElement));\n }\n\n private pick(el: HTMLElement) {\n const i = Number(el.closest<HTMLElement>('[data-i]')?.dataset.i);\n if (this.items[i]) this.emit('select', this.items[i]);\n }\n\n getItems(): TimelineItem[] {\n return this.items;\n }\n\n /** The time axis of a `range` timeline (set by the last paint), for plugins. */\n getScale(): TimelineScale | undefined {\n return this.scale;\n }\n\n setItems(items: TimelineItem[]) {\n this.items = items;\n if (this.rendered) this.paint();\n }\n\n private paint() {\n this.el.setAttribute('role', 'list');\n this.el.setAttribute('aria-label', this.config.ariaLabel ?? t('timeline'));\n this.el.replaceChildren(...(this.config.mode === 'range' ? this.range() : this.list()));\n this.emit('paint');\n }\n\n private list(): HTMLElement[] {\n return this.items.map((it, i) =>\n h('div', `op-timeline__item${it.tone && it.tone !== 'default' ? ` is-${it.tone}` : ''}`, { role: 'listitem', 'data-i': i, tabindex: 0 },\n h('div', 'op-timeline__when', {}, it.time ? when(it.time, /T/.test(it.time) ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }) : ''),\n h('div', 'op-timeline__marker', { 'aria-hidden': 'true' }, it.icon ? iconEl(it.icon) : null),\n h('div', 'op-timeline__body', {}, h('div', 'op-timeline__title', {}, it.title), it.text ? h('div', 'op-timeline__text', {}, it.text) : null),\n ),\n );\n }\n\n private range(): HTMLElement[] {\n const c = this.config;\n const clock = CLOCK.test(c.from ?? this.items.find((x) => x.start)?.start ?? '');\n const ms = (v: string) => (clock ? (Number(v.slice(0, -3)) * 60 + Number(v.slice(-2))) * 60000 : +new Date(/^\\d{4}-\\d{2}-\\d{2}$/.test(v) ? `${v}T00:00` : v));\n const spans = this.items.filter((x) => x.start).map((x) => ({ x, a: ms(x.start!), b: ms(x.end ?? x.start!) + (!clock && x.end && /^\\d{4}-\\d{2}-\\d{2}$/.test(x.end) ? DAY : 0) }));\n if (!spans.length && !(c.from && c.to)) return [];\n const lo = c.from ? ms(c.from) : Math.min(...spans.map((s) => s.a));\n const hi = c.to ? ms(c.to) + (/^\\d{4}-\\d{2}-\\d{2}$/.test(c.to) ? DAY : 0) : Math.max(...spans.map((s) => s.b), lo + 1);\n const pct = (v: number) => `${(Math.min(Math.max((v - lo) / (hi - lo), 0), 1) * 100).toFixed(3)}%`;\n const lanes = [...(c.lanes ?? []), ...spans.map((s) => s.x.lane ?? '').filter((l, i, a) => a.indexOf(l) === i && !(c.lanes ?? []).includes(l))];\n this.scale = { lo, hi, clock, parse: ms, format: (v) => (clock ? `${pad(Math.floor(v / 3600000))}:${pad(Math.round(v / 60000) % 60)}` : ((d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`)(new Date(v))) };\n const long = !clock && hi - lo > 62 * DAY;\n const tickEls: HTMLElement[] = [];\n const tickAt = (at: number, text: string) => {\n const tick = h('span', 'op-timeline__tick', {}, text);\n tick.style.insetInlineStart = pct(at);\n tickEls.push(tick);\n };\n if (clock) for (let at = Math.ceil(lo / 3600000) * 3600000, hop = (hi - lo) / 3600000 > 14 ? 7200000 : 3600000; at < hi; at += hop) tickAt(at, this.scale.format(at));\n else\n for (let d = new Date(lo); +d < hi; long ? d.setMonth(d.getMonth() + 1, 1) : d.setDate(d.getDate() + 1)) {\n d.setHours(0, 0, 0, 0);\n if (+d < lo) continue;\n tickAt(+d, new Intl.DateTimeFormat(getLocale()._lang, long ? { month: 'short' } : { day: 'numeric', month: 'short' }).format(d));\n }\n const out: HTMLElement[] = [h('div', 'op-timeline__axis', {}, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', { 'aria-hidden': 'true' }, ...tickEls))];\n for (const lane of lanes) {\n const bars = spans.filter((s) => (s.x.lane ?? '') === lane).map(({ x, a, b }) => {\n const bar = h('div', `op-timeline__bar${x.tone && x.tone !== 'default' ? ` is-${x.tone}` : ''}`, { role: 'listitem', tabindex: 0, 'data-i': this.items.indexOf(x), 'aria-label': `${x.title}, ${t('tlFromTo', { from: when(x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.start!) ? 'short' : undefined }), to: when(x.end ?? x.start!, { dateStyle: 'medium', timeStyle: /T/.test(x.end ?? '') ? 'short' : undefined }) })}` }, x.icon ? iconEl(x.icon) : null, h('span', 'op-timeline__bar-text', {}, x.title));\n bar.title = x.text ?? x.title;\n bar.style.insetInlineStart = pct(a);\n bar.style.insetInlineEnd = `calc(100% - ${pct(Math.max(b, a + (hi - lo) / 200))})`;\n return bar;\n });\n out.push(h('div', 'op-timeline__lane', { role: 'group', 'aria-label': lane }, h('span', 'op-timeline__lane-name', {}, lane), h('div', 'op-timeline__track', {}, ...bars)));\n }\n const now = Date.now();\n if (c.now !== false && !clock && now >= lo && now <= hi) {\n const mark = h('div', 'op-timeline__now', { 'aria-hidden': 'true', title: t('tlNow') });\n mark.style.insetInlineStart = pct(now);\n out.push(h('div', 'op-timeline__nowrow', { 'aria-hidden': 'true' }, h('span', 'op-timeline__lane-name'), h('div', 'op-timeline__track', {}, mark)));\n }\n return out;\n }\n}\nregister('timeline', Timeline);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "CLOCK", "pad", "n", "DAY", "when", "v", "o", "getLocale", "Timeline", "Component", "h", "store", "r", "p", "off", "e", "el", "items", "t", "it", "iconEl", "c", "clock", "x", "ms", "spans", "lo", "s", "hi", "pct", "lanes", "l", "i", "a", "d", "long", "tickEls", "tickAt", "at", "text", "tick", "hop", "out", "lane", "bars", "b", "bar", "now", "mark", "register"]
7
+ }
@@ -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 v}from"./chunk-MNSDGJKA.js";import{c as p}from"./chunk-DIOJGTUN.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{e as c,f}from"./chunk-UDXO3KM3.js";import{b as a}from"./chunk-PZSHOSOS.js";var m=class extends f{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;flyout;flyoutOf;hoverTimer;onRender(){let e=this.config;this.items=c(e.items)??[],this.active=e.active;let i=t=>t.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&i(s.items)));i(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",t=>{let s=t.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",t=>this.onKey(t)),this.listen(this.root,"pointerover",t=>{let s=t.target.closest(".op-navmenu__item.is-group");this.hoverTimer?.(),!(!this.config.collapsed||!s||s.dataset.id===this.flyoutOf)&&(this.hoverTimer=this.later(()=>this.openFlyout(s.dataset.id,!1),200))}),this.listen(this.root,"pointerleave",()=>this.hoverTimer?.()),this.own(()=>this.flyout?.destroy()),this.listen(this.root,"focusin",t=>{let s=t.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,i=this.items){for(let t of i){if(t.id===e)return t;let s=t.items&&this.getItem(e,t.items);if(s)return s}}parentsOf(e,i=this.items,t=[]){for(let s of i){if(s.id===e)return t;let n=s.items&&this.parentsOf(e,s.items,[...t,s]);if(n)return n}}openParents(e){for(let i of this.parentsOf(e)??[])this.open.add(i.id)}matches(e,i){return e.text.toLowerCase().includes(i)||!!e.items?.some(t=>this.matches(t,i))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(i=>this.visible(i))}isOpen(e){return this.config.collapsed?!1:this.query?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(t=>this.visible(t)).map(t=>this.node(t,1)));let i=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(t=>t.tabIndex=t===i?0:-1)}node(e,i){let t=!!e.items,s=t&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),l=t&&!!this.active&&!!this.parentsOf(this.active)?.some(d=>d.id===e.id),o=n&&t,h=a("div",`op-navmenu__item${t?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${l&&n?" has-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":i,"aria-expanded":t?String(o?this.flyoutOf===e.id:s):null,"aria-current":e.id===this.active?"page":null,"aria-haspopup":o?"menu":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return h.style.setProperty("--_level",String(i-1)),h.append(a("span","op-navmenu__icon",{},e.icon?p(e.icon):o?e.text.charAt(0).toUpperCase():""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&h.append(a("span","op-navmenu__badge",{},String(e.badge))),t&&h.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},p("chevron-down"))),r.append(h),t&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(d=>this.visible(d)).map(d=>this.node(d,i+1)))),r}activate(e){let i=this.getItem(e);if(!(!i||i.disabled)){if(i.items&&this.config.collapsed)return this.openFlyout(e,!0);if(i.items)return this.toggle(e);this.select(e)}}select(e){let i=this.getItem(e);!i||i.disabled||this.emit("before-select",i)===!1||(this.setActive(e),this.emit("select",i))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let i=this.getItem(e);if(!(!i?.items||this.open.has(e))){if(this.config.accordion)for(let t of this.siblings(e))this.open.delete(t.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",i)}}collapse(e){let i=this.getItem(e);!i?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",i))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let i=this.parentsOf(e)??[];return(i.length?i[i.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=i=>i.forEach(t=>t.items&&(this.open.add(t.id),e(t.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=c(e)??[],this.config.items=e,this.rendered&&this.paint()}updateItem(e,i){let t=this.getItem(e);t&&(Object.assign(t,i),this.rendered&&this.paint())}openFlyout(e,i){let t=this.getItem(e),s=this.root.querySelector(`[data-id="${CSS.escape(e)}"]`);if(!t?.items||!s)return;let n=(r,l)=>r.filter(o=>this.visible(o)).map(o=>({text:o.text,icon:o.icon,badge:o.badge,disabled:o.disabled,group:l?t.text:void 0,items:o.items?n(o.items,!1):void 0,handler:o.items?void 0:()=>this.select(o.id)}));this.flyout||(this.flyout=new v({cls:"op-navmenu__flyout"}),this.flyout.on("hide",()=>{let r=this.flyoutOf;this.flyoutOf=void 0,r&&this.root.querySelector(`[data-id="${CSS.escape(r)}"]`)?.setAttribute("aria-expanded","false")}),this.listen(this.flyout.el,"keydown",r=>r.key==="ArrowLeft"&&!r.target.closest('.op-menu__item[aria-expanded="true"]')&&this.flyout.hide())),this.flyout.hide(),this.flyoutOf=e,this.flyout.setItems(n(t.items,!0)),s.setAttribute("aria-expanded","true"),this.flyout.showBy(s,"right-start",i)}setCollapsed(e){this.config.collapsed=e,e||this.flyout?.hide(),this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(i=>i.tabIndex=i===e?0:-1),e.focus())}onKey(e){let i=e.target.closest(".op-navmenu__item");if(!i)return;let t=this.rows(),s=t.indexOf(i),n=this.getItem(i.dataset.id),r=i.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(t[s+1]);break;case"ArrowUp":this.focusRow(t[s-1]);break;case"Home":this.focusRow(t[0]);break;case"End":this.focusRow(t[t.length-1]);break;case"ArrowRight":n.items&&this.config.collapsed?this.openFlyout(n.id,!0):n.items&&!r?this.expand(n.id):n.items&&this.focusRow(t[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let o=this.parentsOf(n.id)?.pop();o&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(o.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}if(e.preventDefault(),this.flyout?.el.contains(document.activeElement))return;this.focusId=document.activeElement?.dataset?.id??n.id;let l=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);l&&document.activeElement!==l&&this.focusRow(l)}};u("navmenu",m);export{m as a};
2
+ //# sourceMappingURL=chunk-SWCB2GMN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/navigation/navmenu/navmenu.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { gate } from '../../../core/permission';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Hidden (or disabled) while `setPermissionResolver` denies it. */\n permission?: string;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n /** Rail mode: the floating menu of a group, and the group it belongs to. */\n private flyout?: Menu;\n private flyoutOf?: string;\n private hoverTimer?: () => void;\n\n protected override onRender() {\n const c = this.config;\n this.items = gate(c.items) ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n // rail: hovering a group's icon opens its menu (after a short pause, so passing over the rail does not)\n this.listen(this.root, 'pointerover', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item.is-group');\n this.hoverTimer?.();\n if (!this.config.collapsed || !row || row.dataset.id === this.flyoutOf) return;\n this.hoverTimer = this.later(() => this.openFlyout(row.dataset.id!, false), 200);\n });\n this.listen(this.root, 'pointerleave', () => this.hoverTimer?.());\n this.own(() => this.flyout?.destroy());\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n if (this.config.collapsed) return false; // rail: a group's children live in its floating menu\n return this.query ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const holdsActive = group && !!this.active && !!this.parentsOf(this.active)?.some((p) => p.id === i.id);\n const flying = rail && group;\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${holdsActive && rail ? ' has-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(flying ? this.flyoutOf === i.id : open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-haspopup': flying ? 'menu' : null, 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n // in the rail a group shows its icon (or its initial) and opens a floating menu\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : flying ? i.text.charAt(0).toUpperCase() : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items && this.config.collapsed) return this.openFlyout(id, true);\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = gate(items) ?? [];\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n /** Rail mode: a group's children in a Menu beside its icon (title as the header, badges kept). */\n private openFlyout(id: string, focus: boolean) {\n const group = this.getItem(id);\n const row = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(id)}\"]`);\n if (!group?.items || !row) return;\n const entries = (list: NavItem[], top: boolean): MenuEntry[] =>\n list.filter((c) => this.visible(c)).map((c) => ({\n text: c.text, icon: c.icon, badge: c.badge, disabled: c.disabled, group: top ? group.text : undefined,\n items: c.items ? entries(c.items, false) : undefined,\n handler: c.items ? undefined : () => this.select(c.id),\n }));\n if (!this.flyout) {\n this.flyout = new Menu({ cls: 'op-navmenu__flyout' });\n this.flyout.on('hide', () => {\n const was = this.flyoutOf;\n this.flyoutOf = undefined;\n if (was) this.root.querySelector(`[data-id=\"${CSS.escape(was)}\"]`)?.setAttribute('aria-expanded', 'false');\n });\n // \u2190 closes it (the Menu only does that for submenus) and gives the focus back to the icon\n this.listen(this.flyout.el, 'keydown', (e: KeyboardEvent) => e.key === 'ArrowLeft' && !(e.target as HTMLElement).closest('.op-menu__item[aria-expanded=\"true\"]') && this.flyout!.hide());\n }\n this.flyout.hide();\n this.flyoutOf = id;\n this.flyout.setItems(entries(group.items, true));\n row.setAttribute('aria-expanded', 'true');\n this.flyout.showBy(row, 'right-start', focus);\n }\n\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (!collapsed) this.flyout?.hide();\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && this.config.collapsed) this.openFlyout(item.id, true);\n else if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n if (this.flyout?.el.contains(document.activeElement)) return; // the focus went to the rail's floating menu: leave it there\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
5
+ "mappings": "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",
6
+ "names": ["NavMenu", "Component", "c", "gate", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "holdsActive", "flying", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "focus", "entries", "top", "Menu", "was", "collapsed", "text", "rows", "item", "parent", "again", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as c}from"./chunk-M7FNPRV4.js";import{a as h}from"./chunk-4AZ44KV4.js";import{a as p}from"./chunk-XR677UYD.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{b as m}from"./chunk-PZSHOSOS.js";import{e as n,f as a}from"./chunk-S4QD5NID.js";n("en",{dtDate:"Date",dtTime:"Time",datetime:"Enter a date and a time"});n("pt-BR",{dtDate:"Data",dtTime:"Hora",datetime:"Informe a data e a hora"});var r=o=>String(o).padStart(2,"0"),d=class extends p{baseCls="op-field op-datetimefield";date;time;emptyValue(){return null}isEmpty(e){return!e}createControl(){let{min:e,max:t,step:s}=this.config;this.date=new h({min:e,max:t,ariaLabel:a("dtDate")}),this.time=new c({step:s,ariaLabel:a("dtTime")});for(let i of[this.date,this.time])i.on("change",()=>this.compose());return this.own(()=>(this.date.destroy(),this.time.destroy())),this.inputEl=this.date.el.querySelector("input"),m("div","op-datetimefield__parts",{role:"group"},this.date.el,this.time.el)}compose(){let e=this.date.getValue(),t=this.time.getValue(),s=null;e&&t&&(s=this.config.utc?new Date(+e.slice(0,4),+e.slice(5,7)-1,+e.slice(8),+t.slice(0,2),+t.slice(3)).toISOString():`${e}T${t}`),this.commit(s)}applyValue(e){let t=null,s=null;if(e){let i=this.config.utc?new Date(e):void 0;[t,s]=i?[`${i.getFullYear()}-${r(i.getMonth()+1)}-${r(i.getDate())}`,`${r(i.getHours())}:${r(i.getMinutes())}`]:e.split("T").map(l=>l.slice(0,l.includes(":")?5:10))}this.date.setValue(t,!0),this.time.setValue(s,!0)}getDisplayText(){return this.value?[this.date.getDisplayText(),this.time.getDisplayText()].join(" "):""}check(){let[e,t]=[this.date.getValue(),this.time.getValue()];return!this.date.isValid()||!this.time.isValid()||!!e!=!!t?a("datetime"):super.check()}onDisabled(e){this.date.setDisabled(e),this.time.setDisabled(e)}onReadonly(e){this.date.setReadonly(e),this.time.setReadonly(e)}setMin(e){this.config.min=e,this.date.setMin(e)}setMax(e){this.config.max=e,this.date.setMax(e)}};u("datetimefield",d);export{d as a};
2
+ //# sourceMappingURL=chunk-TQPQ4UEA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/datetimefield/datetimefield.ts"],
4
+ "sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, addMessages } from '../../../core/i18n';\nimport { DateField } from '../datefield/datefield';\nimport { TimeField } from '../timefield/timefield';\n\naddMessages('en', { dtDate: 'Date', dtTime: 'Time', datetime: 'Enter a date and a time' });\naddMessages('pt-BR', { dtDate: 'Data', dtTime: 'Hora', datetime: 'Informe a data e a hora' });\n\nexport interface DateTimeFieldConfig extends FieldConfig<string | null> {\n /** Earliest and latest date, `YYYY-MM-DD`. */\n min?: string;\n max?: string;\n /** Minutes moved by \u2191/\u2193 in the time part. */\n step?: number;\n /** The value is the ISO instant (`2026-11-10T17:30:00.000Z`) of what the user typed, in their time zone. Default: the local `YYYY-MM-DDTHH:mm`. */\n utc?: boolean;\n}\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** A date and a time of day side by side. The value is one ISO string (local, or UTC with `utc`) or null. */\nexport class DateTimeField extends Field<string | null, DateTimeFieldConfig> {\n protected override baseCls = 'op-field op-datetimefield';\n private date!: DateField;\n private time!: TimeField;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: string | null) {\n return !v;\n }\n\n protected createControl() {\n const { min, max, step } = this.config;\n this.date = new DateField({ min, max, ariaLabel: t('dtDate') });\n this.time = new TimeField({ step, ariaLabel: t('dtTime') });\n for (const f of [this.date, this.time]) f.on('change', () => this.compose());\n this.own(() => (this.date.destroy(), this.time.destroy()));\n this.inputEl = this.date.el.querySelector('input')!;\n return h('div', 'op-datetimefield__parts', { role: 'group' }, this.date.el, this.time.el);\n }\n\n /** Both parts \u2192 the value. One part alone is not a value yet (`check` says so). */\n private compose() {\n const d = this.date.getValue();\n const tm = this.time.getValue();\n let v: string | null = null;\n if (d && tm) v = this.config.utc ? new Date(+d.slice(0, 4), +d.slice(5, 7) - 1, +d.slice(8), +tm.slice(0, 2), +tm.slice(3)).toISOString() : `${d}T${tm}`;\n this.commit(v);\n }\n\n protected applyValue(v: string | null) {\n let d: string | null = null;\n let tm: string | null = null;\n if (v) {\n const x = this.config.utc ? new Date(v) : undefined;\n [d, tm] = x ? [`${x.getFullYear()}-${pad(x.getMonth() + 1)}-${pad(x.getDate())}`, `${pad(x.getHours())}:${pad(x.getMinutes())}`] : v.split('T').map((s) => s.slice(0, s.includes(':') ? 5 : 10));\n }\n this.date.setValue(d, true);\n this.time.setValue(tm, true);\n }\n\n override getDisplayText() {\n return this.value ? [this.date.getDisplayText(), this.time.getDisplayText()].join(' ') : '';\n }\n\n protected override check(): string {\n const [d, tm] = [this.date.getValue(), this.time.getValue()];\n if (!this.date.isValid() || !this.time.isValid() || (!!d !== !!tm)) return t('datetime');\n return super.check();\n }\n\n protected override onDisabled(disabled: boolean) {\n this.date.setDisabled(disabled);\n this.time.setDisabled(disabled);\n }\n protected override onReadonly(readonly: boolean) {\n this.date.setReadonly(readonly);\n this.time.setReadonly(readonly);\n }\n\n setMin(min: string | undefined) {\n this.config.min = min;\n this.date.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.date.setMax(max);\n }\n}\nregister('datetimefield', DateTimeField);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "pad", "n", "DateTimeField", "Field", "v", "min", "max", "step", "DateField", "t", "TimeField", "f", "h", "d", "tm", "x", "s", "disabled", "readonly", "register"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{a as m}from"./chunk-2ZRNGG2N.js";import{e as p}from"./chunk-6NCXO5ZP.js";import{b as o}from"./chunk-PZSHOSOS.js";import{a as u}from"./chunk-TIPK3SCJ.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
2
- //# sourceMappingURL=chunk-Z2Z52GFT.js.map
1
+ import{a as m}from"./chunk-XR677UYD.js";import{a as u}from"./chunk-TIPK3SCJ.js";import{e as p}from"./chunk-6NCXO5ZP.js";import{b as o}from"./chunk-PZSHOSOS.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
2
+ //# sourceMappingURL=chunk-U5L76VVB.js.map
@@ -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,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-HLS5FI55.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-UQRQH2JW.js.map
@@ -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
+ }
@@ -1,2 +1,2 @@
1
- import{c as h}from"./chunk-LW2WRUVL.js";import{c as d}from"./chunk-OEAXCCVM.js";import{a as l}from"./chunk-A2NKDOYN.js";import{b as e}from"./chunk-PZSHOSOS.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{f as p}from"./chunk-MW3RWBZ7.js";var r=class extends l{baseCls="op-table";tag="table";store;unsub;onRender(){let t=this.config;this.el.classList.toggle("op-table--striped",!!t.striped),this.bind(t.store??new d({data:t.data??[]})),this.own(()=>this.unsub?.())}bind(t){this.unsub?.(),this.store=t,this.unsub=t.subscribe(()=>this.paint()),this.paint()}cols(){return(this.config.columns??Object.keys(this.store.getAt(0)?.data??{}).map(o=>({field:o}))).filter(o=>!o.hidden)}paint(){let t=this.config,n=this.cols(),o=e("tr","",{},...n.map(i=>e("th",i.align?`op-table__cell--${i.align}`:"",{scope:"col"},i.header??i.field))),a=this.store.getRange().map(i=>e("tr","",{},...n.map(s=>e("td",`${s.align?`op-table__cell--${s.align}`:""} ${s.cls??""}`.trim(),{},h(s,i))))),m=a.length?a:[e("tr","op-table__empty",{},e("td","",{colspan:n.length||1},t.emptyText??p("empty")))];this.el.replaceChildren(...t.caption?[e("caption","",{},t.caption)]:[],e("thead","",{},o),e("tbody","",{},...m))}setData(t){this.config.data=t,this.rendered&&this.store.loadData(t)}setStore(t){this.config.store=t,this.rendered&&this.bind(t)}setColumns(t){this.config.columns=t,this.rendered&&this.paint()}setCaption(t){this.config.caption=t,this.rendered&&this.paint()}};c("table",r);export{r as a};
2
- //# sourceMappingURL=chunk-JBLRAM7Z.js.map
1
+ import{a as c}from"./chunk-TIPK3SCJ.js";import{a as h}from"./chunk-2HNQ2XRY.js";import{c as d}from"./chunk-L5SQQFO7.js";import{f as l}from"./chunk-UDXO3KM3.js";import{b as e}from"./chunk-PZSHOSOS.js";import{f as p}from"./chunk-S4QD5NID.js";var r=class extends l{baseCls="op-table";tag="table";store;unsub;onRender(){let t=this.config;this.el.classList.toggle("op-table--striped",!!t.striped),this.bind(t.store??new d({data:t.data??[]})),this.own(()=>this.unsub?.())}bind(t){this.unsub?.(),this.store=t,this.unsub=t.subscribe(()=>this.paint()),this.paint()}cols(){return(this.config.columns??Object.keys(this.store.getAt(0)?.data??{}).map(o=>({field:o}))).filter(o=>!o.hidden)}paint(){let t=this.config,n=this.cols(),o=e("tr","",{},...n.map(i=>e("th",i.align?`op-table__cell--${i.align}`:"",{scope:"col"},i.header??i.field))),a=this.store.getRange().map(i=>e("tr","",{},...n.map(s=>e("td",`${s.align?`op-table__cell--${s.align}`:""} ${s.cls??""}`.trim(),{},h(s,i))))),m=a.length?a:[e("tr","op-table__empty",{},e("td","",{colspan:n.length||1},t.emptyText??p("empty")))];this.el.replaceChildren(...t.caption?[e("caption","",{},t.caption)]:[],e("thead","",{},o),e("tbody","",{},...m))}setData(t){this.config.data=t,this.rendered&&this.store.loadData(t)}setStore(t){this.config.store=t,this.rendered&&this.bind(t)}setColumns(t){this.config.columns=t,this.rendered&&this.paint()}setCaption(t){this.config.caption=t,this.rendered&&this.paint()}};c("table",r);export{r as a};
2
+ //# sourceMappingURL=chunk-XFIREDWO.js.map
@@ -0,0 +1,2 @@
1
+ import{d as o}from"./chunk-S4QD5NID.js";var r=()=>o()._lang,a=(t,e)=>{if(t==null||t==="")return"";let n=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(+n)?String(t):new Intl.DateTimeFormat(r(),e).format(n)},i={number:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(r(),e).format(t),money:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(r(),{style:"currency",currency:o()._currency,...e}).format(t),percent:(t,e)=>t==null||t===""?"":new Intl.NumberFormat(r(),{style:"percent",maximumFractionDigits:1,...e}).format(t),date:(t,e)=>a(t,{dateStyle:"medium",...e}),datetime:(t,e)=>a(t,{dateStyle:"medium",timeStyle:"short",...e}),bool:t=>t?"\u2713":""};function s(t,e){i[t]=e}function l(t,e){let n=typeof t=="function"?t:i[t];if(!n)throw new Error(`Optikos: unknown format "${t}"`);return n(e)}export{s as a,l as b};
2
+ //# sourceMappingURL=chunk-XQHATUKN.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/data/format.ts", "../src/data/column.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};\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", "import { format, type Formatter } from './format';\nimport type { Model } from './model';\n\n/** A grid/table column. `T` is the record shape: `field` then autocompletes its keys (any string still works). */\nexport interface Column<T extends Record<string, any> = any> {\n field: Extract<keyof T, string> | (string & {});\n header?: string;\n /** Fixed width in px. */\n width?: number;\n /** Share of the free space (like CSS `fr`). Default 1 when there is no `width`. */\n flex?: number;\n /** A label that groups columns (\"Identification\", \"Values\"...): a band over the header and sections in the column menu. */\n group?: string;\n minWidth?: number;\n /** Upper bound when the user resizes it. */\n maxWidth?: number;\n /** `false` keeps a column's width fixed even when the grid has `resizableColumns`. */\n resizable?: boolean;\n align?: 'left' | 'center' | 'right';\n sortable?: boolean;\n hidden?: boolean;\n /** Name registered with `registerFormat` (`money`, `date`, `number`, `percent`, `bool`) or a function. */\n format?: string | Formatter;\n /** Full control over the cell content. Text is escaped; return a Node for markup. */\n renderer?: (value: any, rec: Model<T>, col: Column<T>) => string | Node;\n cls?: string;\n /** With the `cellEditing()` grid plugin: `true` (an editor for the value's type), a field type (`'select'`) or a field config. */\n editor?: boolean | string | Record<string, any>;\n /** With `cellEditing()`: whether this record's cell can be edited (default: every record, when `editor` is set). */\n editable?: (rec: Model<T>) => boolean;\n}\n\n/** Cell content for a record: `renderer` first, then `format`, then the plain value. */\nexport function cellContent<T extends Record<string, any>>(col: Column<T>, rec: Model<T>): string | Node {\n const v = rec.data[col.field];\n if (col.renderer) return col.renderer(v, rec, col);\n if (col.format) return format(col.format, v);\n return v == null ? '' : String(v);\n}\n"],
5
- "mappings": "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,EAC1B,EAGO,SAASK,EAAeC,EAAcC,EAAqB,CAChEJ,EAAQG,CAAI,EAAIC,CAClB,CAEO,SAASC,EAAOC,EAAyBC,EAAwB,CACtE,IAAMH,EAAK,OAAOE,GAAQ,WAAaA,EAAMN,EAAQM,CAAG,EACxD,GAAI,CAACF,EAAI,MAAM,IAAI,MAAM,4BAA4BE,CAAG,GAAG,EAC3D,OAAOF,EAAGG,CAAK,CACjB,CCGO,SAASC,EAA2CC,EAAgBC,EAA8B,CACvG,IAAMC,EAAID,EAAI,KAAKD,EAAI,KAAK,EAC5B,OAAIA,EAAI,SAAiBA,EAAI,SAASE,EAAGD,EAAKD,CAAG,EAC7CA,EAAI,OAAeG,EAAOH,EAAI,OAAQE,CAAC,EACpCA,GAAK,KAAO,GAAK,OAAOA,CAAC,CAClC",
6
- "names": ["lang", "getLocale", "date", "v", "opts", "d", "formats", "o", "registerFormat", "name", "fn", "format", "fmt", "value", "cellContent", "col", "rec", "v", "format"]
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};\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,EAC1B,EAGO,SAASK,EAAeC,EAAcC,EAAqB,CAChEJ,EAAQG,CAAI,EAAIC,CAClB,CAEO,SAASC,EAAOC,EAAyBC,EAAwB,CACtE,IAAMH,EAAK,OAAOE,GAAQ,WAAaA,EAAMN,EAAQM,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", "registerFormat", "name", "fn", "format", "fmt", "value"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{a as n}from"./chunk-V5G5JECN.js";import{f as o}from"./chunk-UDXO3KM3.js";import{b as r,c as s}from"./chunk-PZSHOSOS.js";import{f as l}from"./chunk-S4QD5NID.js";var a=class extends o{baseCls="op-field";value;original;error="";inputEl;labelEl;helpEl;errorEl;dirty=!1;cancelSettle;constructor(e={}){super(e),this.value=this.original=e.value??this.emptyValue()}get name(){return this.config.name}emptyValue(){return""}isEmpty(e){return e==null||e===""||Array.isArray(e)&&!e.length}isEqual(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}build(){let e=this.config,t=r("div",`${this.baseCls}${e.labelPos==="left"?" op-field--label-left":""}`);this.labelEl=r("label","op-field__label");let i=r("div","op-field__control",{},this.createControl());return this.helpEl=r("div","op-field__help",{id:`${this.id}-help`}),this.errorEl=r("div","op-field__error",{id:`${this.id}-error`,role:"alert"}),t.append(this.labelEl,i,this.helpEl,this.errorEl),t}onRender(){let e=this.config,t=this.inputEl;t.id||=s("op-input"),this.labelEl.htmlFor=t.id,e.ariaLabel&&t!==this.el&&(t.setAttribute("aria-label",e.ariaLabel),this.el.removeAttribute("aria-label")),this.setLabel(e.label??""),this.setHelp(e.help??""),this.setRequired(!!e.required),this.setReadonly(!!e.readonly),this.applyValue(this.value),this.paintError(),this.listen(this.el,"focusin",()=>{this.el.classList.add("is-focused"),this.emit("focus")}),this.listen(this.el,"focusout",i=>{this.el.contains(i.relatedTarget)||(this.flushSettled(),this.el.classList.remove("is-focused"),(e.validateOn??"blur")==="blur"&&this.validate(),this.emit("blur"))})}focusEl(){return this.render(),this.inputEl}getValue(){return this.value}setValue(e,t=!1){let i=this.value;this.value=e,this.rendered&&this.applyValue(e),this.isEqual(i,e)||this.changed(i,t)}fillFrom(e){let t=this.name?n(e,this.name):void 0;t!==void 0&&this.setValue(t,!0)}commit(e){let t=this.value;this.value=e,this.isEqual(t,e)||this.changed(t,!1)}changed(e,t){this.updateDirty(),!t&&((this.config.validateOn==="change"||this.error)&&this.validate(),this.emit("change",this.value,e),this.queueSettled())}queueSettled(){this.cancelSettle?.(),this.cancelSettle=void 0;let e=this.config.debounce;if(!e)return void this.emit("settled",this.value);this.cancelSettle=this.later(()=>{this.cancelSettle=void 0,this.emit("settled",this.value)},e)}flushSettled(){this.cancelSettle&&(this.cancelSettle(),this.cancelSettle=void 0,this.emit("settled",this.value))}updateDirty(){let e=this.isDirty();e!==this.dirty&&(this.dirty=e,this.rendered&&this.el.classList.toggle("is-dirty",e),this.emit("dirty-change",e))}getDisplayText(){let e=this.value;return this.isEmpty(e)?"":String(e)}clear(){this.setValue(this.emptyValue())}isDirty(){return!this.isEqual(this.value,this.original)}markClean(){this.original=this.value,this.updateDirty()}reset(){this.setValue(this.original,!0),this.clearError()}check(){let e=this.value;if(this.isEmpty(e))return this.config.required?l("required"):"";for(let t of this.config.validators??[]){let i=t(e,this);if(typeof i=="string")return i}return""}validate(){let e=this.check();return e?this.setError(e):this.clearError(),!e}isValid(){return!this.check()}getError(){return this.error}setError(e){let t=this.error;this.error=e,this.paintError(),e&&e!==t&&this.emit("invalid",e)}clearError(){this.error&&(this.error="",this.paintError(),this.emit("valid"))}paintError(){this.rendered&&(this.errorEl.textContent=this.error,this.el.classList.toggle("is-invalid",!!this.error),this.inputEl.setAttribute("aria-invalid",String(!!this.error)),this.describe())}describe(){let e=[this.error&&this.errorEl.id,this.config.help&&this.helpEl.id].filter(Boolean);e.length?this.inputEl.setAttribute("aria-describedby",e.join(" ")):this.inputEl.removeAttribute("aria-describedby")}setLabel(e){this.config.label=e,this.rendered&&(this.labelEl.textContent=e,this.labelEl.hidden=!e)}setHelp(e){this.config.help=e,this.rendered&&(this.helpEl.textContent=e,this.helpEl.hidden=!e,this.describe())}setRequired(e){this.config.required=e,this.rendered&&(this.el.classList.toggle("is-required",e),this.inputEl.setAttribute("aria-required",String(e)))}setReadonly(e){this.config.readonly=e,this.rendered&&(this.el.classList.toggle("is-readonly",e),this.onReadonly(e))}setValidators(e){this.config.validators=e}onReadonly(e){}};export{a};
2
+ //# sourceMappingURL=chunk-XR677UYD.js.map
@@ -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{c as n}from"./chunk-ZWNQREWS.js";import{a as d}from"./chunk-2ZRNGG2N.js";import{b as r,c as o}from"./chunk-PZSHOSOS.js";import{a as s}from"./chunk-TIPK3SCJ.js";var l=class extends n{baseCls="op-field op-fieldgroup";labelEl;bodyEl;helpEl;errorEl;error="";constructor(e={}){super(e);for(let t of this.items)t.config.width!=null&&t.config.flex==null&&(t.config.flex="none");for(let t of this.getFields()){t.config.labelPos="top";for(let i of["invalid","valid"])t.on(i,()=>this.paintError())}}getBody(){return this.bodyEl}getFields(){return this.query(e=>e instanceof d)}getError(){return this.error}build(){let e=super.build();return this.labelEl=r("div","op-field__label",{id:o("op-fg")}),this.bodyEl=r("div","op-fieldgroup__body"),this.helpEl=r("div","op-field__help",{id:o("op-fg-help")}),this.errorEl=r("div","op-field__error",{id:o("op-fg-err"),role:"alert"}),e.append(this.labelEl,r("div","op-field__control",{},this.bodyEl),this.helpEl,this.errorEl),e.setAttribute("role","group"),e.setAttribute("aria-labelledby",this.labelEl.id),e}onRender(){let e=this.config;e.layout??={type:"hbox",stackBelow:e.stackBelow},super.onRender();let t=e.labelPos;for(let i=this.parent;!t&&i;i=i.parent)t=i.config.labelPos;this.el.classList.toggle("op-field--label-left",t==="left"),this.setLabel(e.label??""),this.setHelp(e.help??""),this.el.classList.toggle("is-required",!!e.required||this.getFields().some(i=>i.config.required)),this.listen(this.labelEl,"click",()=>this.getFields()[0]?.focus()),this.error="",this.paintError()}paintError(){let e=this.getFields().map(t=>t.getError()).find(Boolean)??"";e!==this.error&&(this.error=e,this.rendered&&(this.errorEl.textContent=e,this.el.classList.toggle("is-invalid",!!e),this.describe(),this.emit(e?"invalid":"valid",e)))}describe(){let e=[this.error&&this.errorEl.id,this.config.help&&this.helpEl.id].filter(Boolean);e.length?this.el.setAttribute("aria-describedby",e.join(" ")):this.el.removeAttribute("aria-describedby")}setLabel(e){this.config.label=e,this.rendered&&(this.labelEl.textContent=e,this.labelEl.hidden=!e)}setHelp(e){this.config.help=e,this.rendered&&(this.helpEl.textContent=e,this.helpEl.hidden=!e,this.describe())}};s("fieldgroup",l);export{l as a};
2
- //# sourceMappingURL=chunk-RNN55473.js.map
1
+ import{c as n}from"./chunk-BQEFLPDA.js";import{a as d}from"./chunk-XR677UYD.js";import{a as s}from"./chunk-TIPK3SCJ.js";import{b as r,c as o}from"./chunk-PZSHOSOS.js";var l=class extends n{baseCls="op-field op-fieldgroup";labelEl;bodyEl;helpEl;errorEl;error="";constructor(e={}){super(e);for(let t of this.items)t.config.width!=null&&t.config.flex==null&&(t.config.flex="none");for(let t of this.getFields()){t.config.labelPos="top";for(let i of["invalid","valid"])t.on(i,()=>this.paintError())}}getBody(){return this.bodyEl}getFields(){return this.query(e=>e instanceof d)}getError(){return this.error}build(){let e=super.build();return this.labelEl=r("div","op-field__label",{id:o("op-fg")}),this.bodyEl=r("div","op-fieldgroup__body"),this.helpEl=r("div","op-field__help",{id:o("op-fg-help")}),this.errorEl=r("div","op-field__error",{id:o("op-fg-err"),role:"alert"}),e.append(this.labelEl,r("div","op-field__control",{},this.bodyEl),this.helpEl,this.errorEl),e.setAttribute("role","group"),e.setAttribute("aria-labelledby",this.labelEl.id),e}onRender(){let e=this.config;e.layout??={type:"hbox",stackBelow:e.stackBelow},super.onRender();let t=e.labelPos;for(let i=this.parent;!t&&i;i=i.parent)t=i.config.labelPos;this.el.classList.toggle("op-field--label-left",t==="left"),this.setLabel(e.label??""),this.setHelp(e.help??""),this.el.classList.toggle("is-required",!!e.required||this.getFields().some(i=>i.config.required)),this.listen(this.labelEl,"click",()=>this.getFields()[0]?.focus()),this.error="",this.paintError()}paintError(){let e=this.getFields().map(t=>t.getError()).find(Boolean)??"";e!==this.error&&(this.error=e,this.rendered&&(this.errorEl.textContent=e,this.el.classList.toggle("is-invalid",!!e),this.describe(),this.emit(e?"invalid":"valid",e)))}describe(){let e=[this.error&&this.errorEl.id,this.config.help&&this.helpEl.id].filter(Boolean);e.length?this.el.setAttribute("aria-describedby",e.join(" ")):this.el.removeAttribute("aria-describedby")}setLabel(e){this.config.label=e,this.rendered&&(this.labelEl.textContent=e,this.labelEl.hidden=!e)}setHelp(e){this.config.help=e,this.rendered&&(this.helpEl.textContent=e,this.helpEl.hidden=!e,this.describe())}};s("fieldgroup",l);export{l as a};
2
+ //# sourceMappingURL=chunk-YDX2PCVL.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/components/form/fieldgroup/fieldgroup.ts"],
4
- "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h, uid } from '../../../core/dom';\nimport type { Component } from '../../../core/component';\n\nexport interface FieldGroupConfig extends ContainerConfig {\n label?: string;\n help?: string;\n /** The `*` marker (also shown when any field inside is required). */\n required?: boolean;\n /** Default: the form's `labelPos`. */\n labelPos?: 'top' | 'left';\n /** Under this width (px) the row becomes a column. */\n stackBelow?: number;\n}\n\n/** Several inputs read as one field: one label, one help line and one error line over a row of fields. */\nexport class FieldGroup extends Container<FieldGroupConfig> {\n protected override baseCls = 'op-field op-fieldgroup';\n private labelEl!: HTMLElement;\n private bodyEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private errorEl!: HTMLElement;\n private error = '';\n\n constructor(config: FieldGroupConfig = {}) {\n super(config);\n // the fields keep their labels for screen readers only: their own label position must not shape the row\n // a field that sets a width keeps it; the others share what is left\n for (const c of this.items) if (c.config.width != null && c.config.flex == null) c.config.flex = 'none' as never;\n for (const f of this.getFields()) {\n f.config.labelPos = 'top';\n for (const ev of ['invalid', 'valid']) f.on(ev, () => this.paintError()); // also before the group is rendered\n }\n }\n\n override getBody() {\n return this.bodyEl;\n }\n\n /** The fields inside (also inside nested containers). */\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getError(): string {\n return this.error;\n }\n\n protected override build() {\n const el = super.build();\n this.labelEl = h('div', 'op-field__label', { id: uid('op-fg') });\n this.bodyEl = h('div', 'op-fieldgroup__body');\n this.helpEl = h('div', 'op-field__help', { id: uid('op-fg-help') });\n this.errorEl = h('div', 'op-field__error', { id: uid('op-fg-err'), role: 'alert' });\n el.append(this.labelEl, h('div', 'op-field__control', {}, this.bodyEl), this.helpEl, this.errorEl);\n el.setAttribute('role', 'group');\n el.setAttribute('aria-labelledby', this.labelEl.id);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout ??= { type: 'hbox', stackBelow: c.stackBelow };\n super.onRender();\n let pos = c.labelPos;\n for (let p: Component | undefined = this.parent as Component | undefined; !pos && p; p = p.parent as Component | undefined) pos = (p.config as FieldGroupConfig).labelPos;\n this.el.classList.toggle('op-field--label-left', pos === 'left');\n this.setLabel(c.label ?? '');\n this.setHelp(c.help ?? '');\n this.el.classList.toggle('is-required', !!c.required || this.getFields().some((f) => f.config.required));\n this.listen(this.labelEl, 'click', () => this.getFields()[0]?.focus());\n this.error = '';\n this.paintError();\n }\n\n /** The group shows the first error of its fields, in one line. */\n private paintError() {\n const msg = this.getFields().map((f) => f.getError()).find(Boolean) ?? '';\n if (msg === this.error) return;\n this.error = msg;\n if (!this.rendered) return;\n this.errorEl.textContent = msg;\n this.el.classList.toggle('is-invalid', !!msg);\n this.describe();\n this.emit(msg ? 'invalid' : 'valid', msg);\n }\n\n private describe() {\n const ids = [this.error && this.errorEl.id, this.config.help && this.helpEl.id].filter(Boolean);\n if (ids.length) this.el.setAttribute('aria-describedby', ids.join(' '));\n else this.el.removeAttribute('aria-describedby');\n }\n\n setLabel(label: string) {\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) {\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}\nregister('fieldgroup', FieldGroup);\n"],
4
+ "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h, uid } from '../../../core/dom';\nimport type { Component } from '../../../core/component';\n\nexport interface FieldGroupConfig extends ContainerConfig {\n label?: string;\n help?: string;\n /** The `*` marker (also shown when any field inside is required). */\n required?: boolean;\n /** Default: the form's `labelPos`. */\n labelPos?: 'top' | 'left';\n /** Under this width (px) the row becomes a column. */\n stackBelow?: number;\n}\n\n/** Several inputs read as one field: one label, one help line and one error line over a row of fields. */\nexport class FieldGroup extends Container<FieldGroupConfig> {\n protected override baseCls = 'op-field op-fieldgroup';\n private labelEl!: HTMLElement;\n private bodyEl!: HTMLElement;\n private helpEl!: HTMLElement;\n private errorEl!: HTMLElement;\n private error = '';\n\n constructor(config: FieldGroupConfig = {}) {\n super(config);\n // the fields keep their labels for screen readers only: their own label position must not shape the row\n // a field that sets a width keeps it; the others share what is left\n for (const c of this.items) if (c.config.width != null && c.config.flex == null) c.config.flex = 'none';\n for (const f of this.getFields()) {\n f.config.labelPos = 'top';\n for (const ev of ['invalid', 'valid']) f.on(ev, () => this.paintError()); // also before the group is rendered\n }\n }\n\n override getBody() {\n return this.bodyEl;\n }\n\n /** The fields inside (also inside nested containers). */\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getError(): string {\n return this.error;\n }\n\n protected override build() {\n const el = super.build();\n this.labelEl = h('div', 'op-field__label', { id: uid('op-fg') });\n this.bodyEl = h('div', 'op-fieldgroup__body');\n this.helpEl = h('div', 'op-field__help', { id: uid('op-fg-help') });\n this.errorEl = h('div', 'op-field__error', { id: uid('op-fg-err'), role: 'alert' });\n el.append(this.labelEl, h('div', 'op-field__control', {}, this.bodyEl), this.helpEl, this.errorEl);\n el.setAttribute('role', 'group');\n el.setAttribute('aria-labelledby', this.labelEl.id);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout ??= { type: 'hbox', stackBelow: c.stackBelow };\n super.onRender();\n let pos = c.labelPos;\n for (let p: Component | undefined = this.parent as Component | undefined; !pos && p; p = p.parent as Component | undefined) pos = (p.config as FieldGroupConfig).labelPos;\n this.el.classList.toggle('op-field--label-left', pos === 'left');\n this.setLabel(c.label ?? '');\n this.setHelp(c.help ?? '');\n this.el.classList.toggle('is-required', !!c.required || this.getFields().some((f) => f.config.required));\n this.listen(this.labelEl, 'click', () => this.getFields()[0]?.focus());\n this.error = '';\n this.paintError();\n }\n\n /** The group shows the first error of its fields, in one line. */\n private paintError() {\n const msg = this.getFields().map((f) => f.getError()).find(Boolean) ?? '';\n if (msg === this.error) return;\n this.error = msg;\n if (!this.rendered) return;\n this.errorEl.textContent = msg;\n this.el.classList.toggle('is-invalid', !!msg);\n this.describe();\n this.emit(msg ? 'invalid' : 'valid', msg);\n }\n\n private describe() {\n const ids = [this.error && this.errorEl.id, this.config.help && this.helpEl.id].filter(Boolean);\n if (ids.length) this.el.setAttribute('aria-describedby', ids.join(' '));\n else this.el.removeAttribute('aria-describedby');\n }\n\n setLabel(label: string) {\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) {\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}\nregister('fieldgroup', FieldGroup);\n"],
5
5
  "mappings": "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",
6
6
  "names": ["FieldGroup", "Container", "config", "c", "f", "ev", "Field", "el", "h", "uid", "pos", "p", "msg", "ids", "label", "help", "register"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{c as r}from"./chunk-BQEFLPDA.js";import{a as o}from"./chunk-TIPK3SCJ.js";o("container",r);
2
+ //# sourceMappingURL=chunk-YJTUFK4P.js.map
@@ -0,0 +1,2 @@
1
+ var o={get(t){try{return JSON.parse(localStorage.getItem(`optikos:${t}`)??"null")}catch{return null}},set(t,e){try{localStorage.setItem(`optikos:${t}`,JSON.stringify(e))}catch{}}},n=o;function a(t){n=t??o}var s=t=>new Promise(e=>e(n.get(t))).then(e=>e??null,()=>null),i=(t,e)=>new Promise(r=>r(n.set(t,e))).catch(()=>{});export{a,s as b,i as c};
2
+ //# sourceMappingURL=chunk-YLFSCQL3.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/state.ts"],
4
+ "sourcesContent": ["/** Where per-user UI state (column widths, filters, density...) is kept. Both calls may be async (a REST endpoint). */\nexport interface StateStorage {\n get(key: string): unknown | Promise<unknown>;\n set(key: string, value: unknown): void | Promise<void>;\n}\n\nconst local: StateStorage = {\n get(key) {\n try {\n return JSON.parse(localStorage.getItem(`optikos:${key}`) ?? 'null');\n } catch {\n return null;\n }\n },\n set(key, value) {\n try {\n localStorage.setItem(`optikos:${key}`, JSON.stringify(value));\n } catch {\n // private mode or a full disk: the state is a convenience, not data\n }\n },\n};\n\nlet current: StateStorage = local;\n\n/** Replaces the default (`localStorage`) for every `persist`: send it to your API to follow the user across devices. */\nexport function setStateStorage(storage: StateStorage | undefined): void {\n current = storage ?? local;\n}\n\n// a storage that fails (offline, quota) must never break the screen that asked\nexport const loadState = <T = unknown>(key: string): Promise<T | null> =>\n new Promise((ok) => ok(current.get(key))).then((v) => (v ?? null) as T | null, () => null);\nexport const saveState = (key: string, value: unknown): Promise<void> =>\n new Promise<void>((ok) => ok(current.set(key, value))).catch(() => {});\n"],
5
+ "mappings": "AAMA,IAAMA,EAAsB,CAC1B,IAAIC,EAAK,CACP,GAAI,CACF,OAAO,KAAK,MAAM,aAAa,QAAQ,WAAWA,CAAG,EAAE,GAAK,MAAM,CACpE,MAAQ,CACN,OAAO,IACT,CACF,EACA,IAAIA,EAAKC,EAAO,CACd,GAAI,CACF,aAAa,QAAQ,WAAWD,CAAG,GAAI,KAAK,UAAUC,CAAK,CAAC,CAC9D,MAAQ,CAER,CACF,CACF,EAEIC,EAAwBH,EAGrB,SAASI,EAAgBC,EAAyC,CACvEF,EAAUE,GAAWL,CACvB,CAGO,IAAMM,EAA0BL,GACrC,IAAI,QAASM,GAAOA,EAAGJ,EAAQ,IAAIF,CAAG,CAAC,CAAC,EAAE,KAAMO,GAAOA,GAAK,KAAmB,IAAM,IAAI,EAC9EC,EAAY,CAACR,EAAaC,IACrC,IAAI,QAAeK,GAAOA,EAAGJ,EAAQ,IAAIF,EAAKC,CAAK,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC",
6
+ "names": ["local", "key", "value", "current", "setStateStorage", "storage", "loadState", "ok", "v", "saveState"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as u}from"./chunk-DWA45BWR.js";import{a as B}from"./chunk-3FCIZKIN.js";import{a as b}from"./chunk-ZSPJZ3ZH.js";import{a as L}from"./chunk-NNR2FNHG.js";import{a as T}from"./chunk-CFGCB37K.js";import{a as R}from"./chunk-U5L76VVB.js";import{a}from"./chunk-P4O57S6N.js";import{a as c}from"./chunk-S2CMWKVB.js";import{a as l}from"./chunk-TQPQ4UEA.js";import{a as y}from"./chunk-M7FNPRV4.js";import{a as v}from"./chunk-6PZPBPAD.js";import{a as F}from"./chunk-JJLOUMCJ.js";import{a as k}from"./chunk-4CWYF4O7.js";import{a as m}from"./chunk-5PWPAN62.js";import{a as S}from"./chunk-UQRQH2JW.js";import{a as w}from"./chunk-3F4MN2BU.js";import{a as C}from"./chunk-Z6L55FTN.js";import{a as x}from"./chunk-643FOYQB.js";import{a as h}from"./chunk-CMV3F6HR.js";import{a as f}from"./chunk-R32HPK7R.js";import{a as d}from"./chunk-4AZ44KV4.js";import{a as g}from"./chunk-2YRQULDC.js";import{a as p}from"./chunk-HLS5FI55.js";import{c as s}from"./chunk-BQEFLPDA.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),N={text:(t,e,o)=>n(g,t,e,o),email:(t,e,o)=>n(g,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(g,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(a,t,e,o),number:(t,e,o)=>n(f,t,e,o),mask:(t,e,o,r)=>n(m,t,e,{mask:o,...r}),time:(t,e,o)=>n(y,t,e,o),date:(t,e,o)=>n(d,t,e,o),datetime:(t,e,o)=>n(l,t,e,o),dateRange:(t,e,o)=>n(c,t,e,o),secret:(t,e,o)=>n(L,t,e,o),slider:(t,e,o)=>n(R,t,e,o),dial:(t,e,o)=>n(v,t,e,o),check:(t,e,o)=>n(C,t,void 0,{boxLabel:e,...o}),toggle:(t,e,o)=>n(u,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(b,t,e,{options:o,...r}),checkGroup:(t,e,o,r)=>n(x,t,e,{options:o,...r}),select:(t,e,o,r)=>n(T,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(h,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(k,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(F,t,e,{lookup:o,...r}),button:(t,e,o)=>new p({text:t,handler:e,...o}),primary:(t,e,o)=>new p({text:t,handler:e,variant:"primary",...o}),danger:(t,e,o)=>new p({text:t,handler:e,variant:"danger",...o}),row:(...t)=>new s({layout:"hbox",items:t}),col:(...t)=>new s({layout:"vbox",items:t}),grid:(t,...e)=>new s({layout:{type:"grid",columns:t},items:e}),panel:(t,e,o)=>new S({title:t,items:e,...o}),toolbar:(...t)=>new w({items:t}),form:(t,e)=>new B({items:t,...e})};var i=t=>t,ot=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),nt=i({Top:"top",Left:"left"}),rt=i({Vertical:"vertical",Horizontal:"horizontal"}),it=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),st=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),gt=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),pt=i({None:"none",Single:"single",Multi:"multi"}),at=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),ft=i({Eq:"eq",Ne:"ne",Contains:"contains",NotContains:"notContains",StartsWith:"startsWith",EndsWith:"endsWith",Gt:"gt",Ge:"ge",Lt:"lt",Le:"le",Between:"between",NotBetween:"notBetween",In:"in",Nin:"nin",Empty:"empty",NotEmpty:"notEmpty"}),mt=i({Light:"light",Dark:"dark"});export{N as a,ot as b,nt as c,rt as d,it as e,st as f,gt as g,pt as h,at as i,ft as j,mt as k};
2
+ //# sourceMappingURL=chunk-YXOKWCYS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui/ui.ts", "../src/ui/enums.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", "// Named values for the options that are plain strings in configs. Each is a const object plus a type of the same name,\n// so `Variant.Primary` and `'primary'` are interchangeable: use whichever you like, the editor completes both.\nconst e = <T extends Record<string, string>>(o: T) => o;\n\nexport const Variant = e({ Default: 'default', Primary: 'primary', Danger: 'danger', Ghost: 'ghost' } as const);\nexport type Variant = (typeof Variant)[keyof typeof Variant];\n\nexport const LabelPos = e({ Top: 'top', Left: 'left' } as const);\nexport type LabelPos = (typeof LabelPos)[keyof typeof LabelPos];\n\nexport const Direction = e({ Vertical: 'vertical', Horizontal: 'horizontal' } as const);\nexport type Direction = (typeof Direction)[keyof typeof Direction];\n\n/** Layout `border` regions. */\nexport const Region = e({ North: 'north', South: 'south', West: 'west', East: 'east', Center: 'center' } as const);\nexport type Region = (typeof Region)[keyof typeof Region];\n\n/** Widget sides. */\nexport const Side = e({ Right: 'right', Left: 'left', Top: 'top', Bottom: 'bottom' } as const);\nexport type Side = (typeof Side)[keyof typeof Side];\n\nexport const LayoutKind = e({ Fit: 'fit', HBox: 'hbox', VBox: 'vbox', Border: 'border', Grid: 'grid', Card: 'card' } as const);\nexport type LayoutKind = (typeof LayoutKind)[keyof typeof LayoutKind];\n\nexport const Selection = e({ None: 'none', Single: 'single', Multi: 'multi' } as const);\nexport type Selection = (typeof Selection)[keyof typeof Selection];\n\nexport const ToastType = e({ Info: 'info', Success: 'success', Warning: 'warning', Error: 'error' } as const);\nexport type ToastType = (typeof ToastType)[keyof typeof ToastType];\n\n/** Filter operators (Store.filter, FilterBuilder, lookup filters). */\nexport const Op = e({\n Eq: 'eq', Ne: 'ne', Contains: 'contains', NotContains: 'notContains', StartsWith: 'startsWith', EndsWith: 'endsWith',\n Gt: 'gt', Ge: 'ge', Lt: 'lt', Le: 'le', Between: 'between', NotBetween: 'notBetween', In: 'in', Nin: 'nin', Empty: 'empty', NotEmpty: 'notEmpty',\n} as const);\nexport type Op = (typeof Op)[keyof typeof Op];\n\n/** The shipped themes (`setTheme(ThemeName.Dark)`; add `' compact'` for the dense variant). */\nexport const ThemeName = e({ Light: 'light', Dark: 'dark' } as const);\nexport type ThemeName = (typeof ThemeName)[keyof typeof ThemeName];\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", "e", "o", "Variant", "LabelPos", "Direction", "Region", "Side", "LayoutKind", "Selection", "ToastType", "Op", "ThemeName"]
7
+ }
@@ -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-XR677UYD.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-Z6L55FTN.js.map