optikos 0.1.0 → 0.3.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 (390) hide show
  1. package/CHANGELOG.md +135 -0
  2. package/README.md +13 -11
  3. package/dist/chunk-23XLG2EM.js +2 -0
  4. package/dist/{chunk-666O2GKD.js.map → chunk-23XLG2EM.js.map} +1 -1
  5. package/dist/chunk-2YZB6XQR.js +2 -0
  6. package/dist/chunk-2YZB6XQR.js.map +7 -0
  7. package/dist/chunk-2ZRNGG2N.js +2 -0
  8. package/dist/chunk-2ZRNGG2N.js.map +7 -0
  9. package/dist/chunk-2ZUZ5HDL.js +2 -0
  10. package/dist/chunk-2ZUZ5HDL.js.map +7 -0
  11. package/dist/chunk-3S24ZRPK.js +2 -0
  12. package/dist/chunk-3S24ZRPK.js.map +7 -0
  13. package/dist/chunk-3TAW4AKH.js +2 -0
  14. package/dist/chunk-3TAW4AKH.js.map +7 -0
  15. package/dist/chunk-4EQEHJB3.js +2 -0
  16. package/dist/chunk-4EQEHJB3.js.map +7 -0
  17. package/dist/chunk-4EZJ5FKJ.js +2 -0
  18. package/dist/{chunk-IHAYOSBR.js.map → chunk-4EZJ5FKJ.js.map} +1 -1
  19. package/dist/chunk-4LZZ244E.js +2 -0
  20. package/dist/chunk-4LZZ244E.js.map +7 -0
  21. package/dist/chunk-4SYIIX5A.js +2 -0
  22. package/dist/chunk-4SYIIX5A.js.map +7 -0
  23. package/dist/chunk-5BC72727.js +2 -0
  24. package/dist/chunk-5BC72727.js.map +7 -0
  25. package/dist/chunk-5DJTP53N.js +2 -0
  26. package/dist/{chunk-ODWPBBVL.js.map → chunk-5DJTP53N.js.map} +1 -1
  27. package/dist/{chunk-NWTTHDIM.js → chunk-5JEXM5S7.js} +2 -2
  28. package/dist/chunk-5Q76ACVI.js +2 -0
  29. package/dist/{chunk-O4DCHALR.js.map → chunk-5Q76ACVI.js.map} +1 -1
  30. package/dist/chunk-5QUY72FX.js +2 -0
  31. package/dist/chunk-5QUY72FX.js.map +7 -0
  32. package/dist/{chunk-NV5AIBQP.js → chunk-6VBK2I5B.js} +2 -2
  33. package/dist/{chunk-ZYUXCZX7.js → chunk-7KMIFXHZ.js} +2 -2
  34. package/dist/{chunk-IYPKPLCU.js → chunk-A2NKDOYN.js} +2 -2
  35. package/dist/chunk-A2NKDOYN.js.map +7 -0
  36. package/dist/chunk-CKXS375P.js +2 -0
  37. package/dist/chunk-CKXS375P.js.map +7 -0
  38. package/dist/chunk-DBMWS3O5.js +2 -0
  39. package/dist/chunk-DBMWS3O5.js.map +7 -0
  40. package/dist/chunk-E4VNLYO2.js +2 -0
  41. package/dist/chunk-E4VNLYO2.js.map +7 -0
  42. package/dist/chunk-EDUMAMK4.js +2 -0
  43. package/dist/chunk-EDUMAMK4.js.map +7 -0
  44. package/dist/chunk-EJGWCKE4.js +2 -0
  45. package/dist/{chunk-4DHQKECB.js.map → chunk-EJGWCKE4.js.map} +1 -1
  46. package/dist/chunk-ELYARUCN.js +2 -0
  47. package/dist/{chunk-Z25NC4CS.js → chunk-EV73ADN2.js} +2 -2
  48. package/dist/{chunk-LV6HXFHU.js → chunk-FEHGU6EP.js} +3 -3
  49. package/dist/chunk-FEHGU6EP.js.map +7 -0
  50. package/dist/chunk-G2DAD3MQ.js +2 -0
  51. package/dist/chunk-G2DAD3MQ.js.map +7 -0
  52. package/dist/chunk-G2KUK6AT.js +2 -0
  53. package/dist/chunk-GD5JGKM7.js +2 -0
  54. package/dist/chunk-GD5JGKM7.js.map +7 -0
  55. package/dist/{chunk-LBCWEWPN.js → chunk-GNU4VOOE.js} +2 -2
  56. package/dist/{chunk-IW7PK4VS.js → chunk-GZ7X34QP.js} +2 -2
  57. package/dist/chunk-HOF4JGMQ.js +2 -0
  58. package/dist/chunk-HOF4JGMQ.js.map +7 -0
  59. package/dist/chunk-HXDTGP2K.js +2 -0
  60. package/dist/chunk-HXDTGP2K.js.map +7 -0
  61. package/dist/{chunk-QEQIJAAB.js → chunk-I4SP6JTU.js} +2 -2
  62. package/dist/chunk-IHE2MQ3W.js +2 -0
  63. package/dist/{chunk-OW2ZSMGS.js.map → chunk-IHE2MQ3W.js.map} +1 -1
  64. package/dist/chunk-JBLRAM7Z.js +2 -0
  65. package/dist/{chunk-JZNEB7A7.js.map → chunk-JBLRAM7Z.js.map} +1 -1
  66. package/dist/{chunk-4SUKNSCY.js → chunk-JI265XFO.js} +2 -2
  67. package/dist/chunk-JK74QK3M.js +2 -0
  68. package/dist/chunk-JK74QK3M.js.map +7 -0
  69. package/dist/chunk-JOFQJGZK.js +2 -0
  70. package/dist/chunk-JOFQJGZK.js.map +7 -0
  71. package/dist/chunk-KCEUD232.js +2 -0
  72. package/dist/chunk-KCEUD232.js.map +7 -0
  73. package/dist/chunk-KLLAY2IM.js +2 -0
  74. package/dist/chunk-KLLAY2IM.js.map +7 -0
  75. package/dist/chunk-LBJSMXLV.js +2 -0
  76. package/dist/chunk-LBJSMXLV.js.map +7 -0
  77. package/dist/chunk-LQRFNQ2N.js +2 -0
  78. package/dist/chunk-LQRFNQ2N.js.map +7 -0
  79. package/dist/{chunk-NDBFYIL6.js → chunk-LW2WRUVL.js} +2 -2
  80. package/dist/{chunk-NDBFYIL6.js.map → chunk-LW2WRUVL.js.map} +2 -2
  81. package/dist/chunk-M242VYZA.js +2 -0
  82. package/dist/{chunk-XVIC24AW.js.map → chunk-M242VYZA.js.map} +1 -1
  83. package/dist/chunk-MB3MU6HR.js +2 -0
  84. package/dist/chunk-MB3MU6HR.js.map +7 -0
  85. package/dist/chunk-MW3RWBZ7.js +2 -0
  86. package/dist/chunk-MW3RWBZ7.js.map +7 -0
  87. package/dist/chunk-NXSTUFS7.js +2 -0
  88. package/dist/chunk-NXSTUFS7.js.map +7 -0
  89. package/dist/chunk-OEAXCCVM.js +2 -0
  90. package/dist/chunk-OEAXCCVM.js.map +7 -0
  91. package/dist/chunk-OGRFQTXA.js +2 -0
  92. package/dist/chunk-OGRFQTXA.js.map +7 -0
  93. package/dist/chunk-Q26YZYTD.js +2 -0
  94. package/dist/chunk-Q26YZYTD.js.map +7 -0
  95. package/dist/chunk-REW4LR46.js +2 -0
  96. package/dist/chunk-REW4LR46.js.map +7 -0
  97. package/dist/chunk-RNN55473.js +2 -0
  98. package/dist/chunk-RNN55473.js.map +7 -0
  99. package/dist/{chunk-6NJW7QFD.js → chunk-SA53QUBF.js} +2 -2
  100. package/dist/chunk-TIPK3SCJ.js +2 -0
  101. package/dist/chunk-TIPK3SCJ.js.map +7 -0
  102. package/dist/{chunk-TBLICXWW.js → chunk-TOLTUOZS.js} +2 -2
  103. package/dist/{chunk-DXO3UJKL.js → chunk-TZOQWCVH.js} +2 -2
  104. package/dist/chunk-UB5RYS7T.js +2 -0
  105. package/dist/chunk-UB5RYS7T.js.map +7 -0
  106. package/dist/chunk-UXXJOU5J.js +2 -0
  107. package/dist/chunk-UXXJOU5J.js.map +7 -0
  108. package/dist/chunk-VU3GIDZ3.js +2 -0
  109. package/dist/chunk-VU3GIDZ3.js.map +7 -0
  110. package/dist/chunk-W2BAFOCN.js +3 -0
  111. package/dist/chunk-W2BAFOCN.js.map +7 -0
  112. package/dist/{chunk-SNTHW4K2.js → chunk-W3H7GTJY.js} +2 -2
  113. package/dist/chunk-WFGTQZIQ.js +2 -0
  114. package/dist/chunk-WFGTQZIQ.js.map +7 -0
  115. package/dist/{chunk-ZHVSHDLH.js → chunk-XHOBNSBO.js} +2 -2
  116. package/dist/chunk-XX2MVWFS.js +4 -0
  117. package/dist/chunk-XX2MVWFS.js.map +7 -0
  118. package/dist/chunk-XYZ6VZ5T.js +2 -0
  119. package/dist/chunk-XYZ6VZ5T.js.map +7 -0
  120. package/dist/chunk-YBAYEU25.js +2 -0
  121. package/dist/chunk-YBAYEU25.js.map +7 -0
  122. package/dist/chunk-YF75HKL6.js +2 -0
  123. package/dist/chunk-YF75HKL6.js.map +7 -0
  124. package/dist/chunk-YHEMA56R.js +2 -0
  125. package/dist/{chunk-5GNEFX6F.js.map → chunk-YHEMA56R.js.map} +1 -1
  126. package/dist/chunk-Z2JBUHKA.js +2 -0
  127. package/dist/chunk-Z2JBUHKA.js.map +7 -0
  128. package/dist/{chunk-6O2BXCRN.js → chunk-Z2Z52GFT.js} +2 -2
  129. package/dist/chunk-ZPPELYNJ.js +2 -0
  130. package/dist/chunk-ZPPELYNJ.js.map +7 -0
  131. package/dist/chunk-ZVK4L5GK.js +2 -0
  132. package/dist/chunk-ZVK4L5GK.js.map +7 -0
  133. package/dist/chunk-ZWNQREWS.js +2 -0
  134. package/dist/chunk-ZWNQREWS.js.map +7 -0
  135. package/dist/components/badge.js +2 -0
  136. package/dist/components/badge.js.map +7 -0
  137. package/dist/components/breadcrumb.js +1 -1
  138. package/dist/components/button.js +1 -1
  139. package/dist/components/calendar.js +1 -1
  140. package/dist/components/cellediting.js +2 -0
  141. package/dist/components/cellediting.js.map +7 -0
  142. package/dist/components/chat.js +1 -1
  143. package/dist/components/checkbox.js +1 -1
  144. package/dist/components/checkboxgroup.js +2 -0
  145. package/dist/components/checkboxgroup.js.map +7 -0
  146. package/dist/components/chip.js +2 -0
  147. package/dist/components/chip.js.map +7 -0
  148. package/dist/components/codeviewer.js +2 -0
  149. package/dist/components/codeviewer.js.map +7 -0
  150. package/dist/components/combobox.js +1 -1
  151. package/dist/components/commandpalette.js +1 -1
  152. package/dist/components/container.js +1 -1
  153. package/dist/components/dataview.js +1 -1
  154. package/dist/components/datefield.js +1 -1
  155. package/dist/components/daterangefield.js +1 -1
  156. package/dist/components/dial.js +2 -0
  157. package/dist/components/dial.js.map +7 -0
  158. package/dist/components/dropdown.js +1 -1
  159. package/dist/components/fieldgroup.js +2 -0
  160. package/dist/components/fieldgroup.js.map +7 -0
  161. package/dist/components/fieldlist.js +2 -0
  162. package/dist/components/fieldlist.js.map +7 -0
  163. package/dist/components/fieldset.js +1 -1
  164. package/dist/components/filterbuilder.js +1 -1
  165. package/dist/components/form.js +1 -1
  166. package/dist/components/formactions.js +2 -0
  167. package/dist/components/formactions.js.map +7 -0
  168. package/dist/components/formerrors.js +2 -0
  169. package/dist/components/formerrors.js.map +7 -0
  170. package/dist/components/formsection.js +2 -0
  171. package/dist/components/formsection.js.map +7 -0
  172. package/dist/components/grid.js +1 -1
  173. package/dist/components/icon.js +1 -1
  174. package/dist/components/inputgroup.js +2 -0
  175. package/dist/components/inputgroup.js.map +7 -0
  176. package/dist/components/label.js +1 -1
  177. package/dist/components/listbox.js +1 -1
  178. package/dist/components/lookupfield.js +1 -1
  179. package/dist/components/menu.js +1 -1
  180. package/dist/components/messagebox.js +1 -1
  181. package/dist/components/navmenu.js +1 -1
  182. package/dist/components/numberfield.js +1 -1
  183. package/dist/components/pagination.js +1 -1
  184. package/dist/components/panel.js +1 -1
  185. package/dist/components/pickerfield.js +1 -1
  186. package/dist/components/radiogroup.js +1 -1
  187. package/dist/components/searchgrid.js +1 -1
  188. package/dist/components/secretfield.js +1 -1
  189. package/dist/components/select.js +1 -1
  190. package/dist/components/slider.js +1 -1
  191. package/dist/components/spacer.js +1 -1
  192. package/dist/components/spinner.js +1 -1
  193. package/dist/components/stepform.js +1 -1
  194. package/dist/components/stepper.js +1 -1
  195. package/dist/components/suggestfield.js +1 -1
  196. package/dist/components/table.js +1 -1
  197. package/dist/components/tabs.js +1 -1
  198. package/dist/components/textarea.js +1 -1
  199. package/dist/components/textfield.js +1 -1
  200. package/dist/components/toast.js +1 -1
  201. package/dist/components/toggle.js +2 -0
  202. package/dist/components/toggle.js.map +7 -0
  203. package/dist/components/toolbar.js +1 -1
  204. package/dist/components/tooltip.js +1 -1
  205. package/dist/components/tree.js +2 -0
  206. package/dist/components/tree.js.map +7 -0
  207. package/dist/components/viewmanager.js +1 -1
  208. package/dist/components/viewport.js +1 -1
  209. package/dist/components/widget.js +1 -1
  210. package/dist/components/window.js +1 -1
  211. package/dist/core.js +1 -1
  212. package/dist/css/badge.css +39 -0
  213. package/dist/css/base.css +71 -51
  214. package/dist/css/button.css +2 -0
  215. package/dist/css/cellediting.css +33 -0
  216. package/dist/css/chat.css +0 -1
  217. package/dist/css/checkboxgroup.css +12 -0
  218. package/dist/css/chip.css +64 -0
  219. package/dist/css/codeviewer.css +109 -0
  220. package/dist/css/dial.css +203 -0
  221. package/dist/css/fieldgroup.css +26 -0
  222. package/dist/css/fieldlist.css +84 -0
  223. package/dist/css/fieldset.css +36 -0
  224. package/dist/css/formactions.css +40 -0
  225. package/dist/css/formerrors.css +39 -0
  226. package/dist/css/formsection.css +45 -0
  227. package/dist/css/grid.css +14 -3
  228. package/dist/css/inputgroup.css +58 -0
  229. package/dist/css/menu.css +54 -0
  230. package/dist/css/navmenu.css +9 -7
  231. package/dist/css/panel.css +8 -1
  232. package/dist/css/stepform.css +9 -0
  233. package/dist/css/stepper.css +7 -2
  234. package/dist/css/tabs.css +12 -3
  235. package/dist/css/toggle.css +39 -0
  236. package/dist/css/tree.css +94 -0
  237. package/dist/css/widget.css +58 -0
  238. package/dist/css/window.css +4 -0
  239. package/dist/data.js +1 -1
  240. package/dist/index.js +3 -3
  241. package/dist/index.js.map +3 -3
  242. package/dist/optikos.css +1221 -106
  243. package/dist/themes/dark.css +47 -32
  244. package/dist/types/components/badge.d.ts +1 -0
  245. package/dist/types/components/base/badge/badge.d.ts +18 -0
  246. package/dist/types/components/base/chip/chip.d.ts +27 -0
  247. package/dist/types/components/base/codeviewer/codeviewer.d.ts +48 -0
  248. package/dist/types/components/cellediting.d.ts +1 -0
  249. package/dist/types/components/checkboxgroup.d.ts +1 -0
  250. package/dist/types/components/chip.d.ts +1 -0
  251. package/dist/types/components/codeviewer.d.ts +1 -0
  252. package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
  253. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +3 -1
  254. package/dist/types/components/data/grid/grid.d.ts +42 -16
  255. package/dist/types/components/data/tree/tree.d.ts +71 -0
  256. package/dist/types/components/dial.d.ts +1 -0
  257. package/dist/types/components/fieldgroup.d.ts +1 -0
  258. package/dist/types/components/fieldlist.d.ts +1 -0
  259. package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
  260. package/dist/types/components/fields/dial/dial.d.ts +84 -0
  261. package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
  262. package/dist/types/components/form/fieldgroup/fieldgroup.d.ts +33 -0
  263. package/dist/types/components/form/fieldlist/fieldlist.d.ts +58 -0
  264. package/dist/types/components/form/form/form.d.ts +19 -2
  265. package/dist/types/components/form/formactions/formactions.d.ts +34 -0
  266. package/dist/types/components/form/formerrors/formerrors.d.ts +23 -0
  267. package/dist/types/components/form/formsection/formsection.d.ts +26 -0
  268. package/dist/types/components/form/inputgroup/inputgroup.d.ts +28 -0
  269. package/dist/types/components/form/stepform/stepform.d.ts +30 -4
  270. package/dist/types/components/formactions.d.ts +1 -0
  271. package/dist/types/components/formerrors.d.ts +1 -0
  272. package/dist/types/components/formsection.d.ts +1 -0
  273. package/dist/types/components/inputgroup.d.ts +1 -0
  274. package/dist/types/components/layout/fieldset/fieldset.d.ts +9 -0
  275. package/dist/types/components/layout/panel/panel.d.ts +6 -0
  276. package/dist/types/components/layout/panel/reload.d.ts +1 -0
  277. package/dist/types/components/navigation/navmenu/navmenu.d.ts +6 -0
  278. package/dist/types/components/navigation/tabs/tabs.d.ts +8 -0
  279. package/dist/types/components/overlays/menu/menu.d.ts +17 -0
  280. package/dist/types/components/overlays/messagebox/messagebox.d.ts +8 -0
  281. package/dist/types/components/overlays/widget/widget.d.ts +13 -0
  282. package/dist/types/components/overlays/window/window.d.ts +8 -1
  283. package/dist/types/components/toggle.d.ts +1 -0
  284. package/dist/types/components/tree.d.ts +1 -0
  285. package/dist/types/core/component.d.ts +6 -2
  286. package/dist/types/core/i18n.d.ts +5 -0
  287. package/dist/types/core/index.d.ts +1 -1
  288. package/dist/types/core/position.d.ts +4 -1
  289. package/dist/types/data/column.d.ts +9 -4
  290. package/dist/types/index.d.ts +14 -0
  291. package/dist/types/themes/define.d.ts +4 -3
  292. package/dist/types/ui/enums.d.ts +0 -6
  293. package/dist/types/ui/ui.d.ts +12 -3
  294. package/dist/ui.js +1 -1
  295. package/package.json +6 -1
  296. package/dist/chunk-4COBH4QJ.js +0 -2
  297. package/dist/chunk-4COBH4QJ.js.map +0 -7
  298. package/dist/chunk-4DHQKECB.js +0 -2
  299. package/dist/chunk-4Q67QI7J.js +0 -2
  300. package/dist/chunk-4Q67QI7J.js.map +0 -7
  301. package/dist/chunk-5AXLYDKU.js +0 -2
  302. package/dist/chunk-5AXLYDKU.js.map +0 -7
  303. package/dist/chunk-5GNEFX6F.js +0 -2
  304. package/dist/chunk-5Q6Y6CM4.js +0 -2
  305. package/dist/chunk-5Q6Y6CM4.js.map +0 -7
  306. package/dist/chunk-666O2GKD.js +0 -2
  307. package/dist/chunk-A66MDXHL.js +0 -2
  308. package/dist/chunk-A66MDXHL.js.map +0 -7
  309. package/dist/chunk-ARCW54L2.js +0 -2
  310. package/dist/chunk-ARCW54L2.js.map +0 -7
  311. package/dist/chunk-BIYNHKSA.js +0 -2
  312. package/dist/chunk-BIYNHKSA.js.map +0 -7
  313. package/dist/chunk-BNPVRIFT.js +0 -2
  314. package/dist/chunk-BNPVRIFT.js.map +0 -7
  315. package/dist/chunk-C3N7QTQB.js +0 -2
  316. package/dist/chunk-C3N7QTQB.js.map +0 -7
  317. package/dist/chunk-CEXY5A4T.js +0 -2
  318. package/dist/chunk-CN7USUJR.js +0 -2
  319. package/dist/chunk-CN7USUJR.js.map +0 -7
  320. package/dist/chunk-CQRHNTEX.js +0 -2
  321. package/dist/chunk-CUPAPOKC.js +0 -2
  322. package/dist/chunk-CUPAPOKC.js.map +0 -7
  323. package/dist/chunk-GZNQPENR.js +0 -2
  324. package/dist/chunk-GZNQPENR.js.map +0 -7
  325. package/dist/chunk-HFFK6K4K.js +0 -2
  326. package/dist/chunk-HFFK6K4K.js.map +0 -7
  327. package/dist/chunk-IHAYOSBR.js +0 -2
  328. package/dist/chunk-IO66A6G5.js +0 -2
  329. package/dist/chunk-IO66A6G5.js.map +0 -7
  330. package/dist/chunk-IYPKPLCU.js.map +0 -7
  331. package/dist/chunk-JTYWZMSZ.js +0 -2
  332. package/dist/chunk-JTYWZMSZ.js.map +0 -7
  333. package/dist/chunk-JVEPKW5X.js +0 -2
  334. package/dist/chunk-JVEPKW5X.js.map +0 -7
  335. package/dist/chunk-JZNEB7A7.js +0 -2
  336. package/dist/chunk-K2DGY6MP.js +0 -2
  337. package/dist/chunk-K2DGY6MP.js.map +0 -7
  338. package/dist/chunk-LEE2FEEL.js +0 -2
  339. package/dist/chunk-LEE2FEEL.js.map +0 -7
  340. package/dist/chunk-LMGCV35W.js +0 -2
  341. package/dist/chunk-LMGCV35W.js.map +0 -7
  342. package/dist/chunk-LV6HXFHU.js.map +0 -7
  343. package/dist/chunk-MA5BJL3S.js +0 -2
  344. package/dist/chunk-MA5BJL3S.js.map +0 -7
  345. package/dist/chunk-NHVEP72K.js +0 -2
  346. package/dist/chunk-NHVEP72K.js.map +0 -7
  347. package/dist/chunk-O4DCHALR.js +0 -2
  348. package/dist/chunk-ODWPBBVL.js +0 -2
  349. package/dist/chunk-OW2ZSMGS.js +0 -2
  350. package/dist/chunk-PSPQH35P.js +0 -2
  351. package/dist/chunk-PSPQH35P.js.map +0 -7
  352. package/dist/chunk-T4OYVG2X.js +0 -2
  353. package/dist/chunk-T4OYVG2X.js.map +0 -7
  354. package/dist/chunk-TK2RC3T5.js +0 -2
  355. package/dist/chunk-TK2RC3T5.js.map +0 -7
  356. package/dist/chunk-U3X2FW6U.js +0 -2
  357. package/dist/chunk-U3X2FW6U.js.map +0 -7
  358. package/dist/chunk-UPOBGNJ5.js +0 -2
  359. package/dist/chunk-UPOBGNJ5.js.map +0 -7
  360. package/dist/chunk-XVIC24AW.js +0 -2
  361. package/dist/chunk-XZ5CUZZP.js +0 -2
  362. package/dist/chunk-XZ5CUZZP.js.map +0 -7
  363. package/dist/chunk-XZEOSW3Q.js +0 -2
  364. package/dist/chunk-XZEOSW3Q.js.map +0 -7
  365. package/dist/chunk-YET5PM6F.js +0 -2
  366. package/dist/chunk-YET5PM6F.js.map +0 -7
  367. package/dist/chunk-ZCAAM4NH.js +0 -2
  368. package/dist/chunk-ZCAAM4NH.js.map +0 -7
  369. package/dist/themes/brand.css +0 -240
  370. package/dist/themes/brutal.css +0 -100
  371. package/dist/themes/corporate.css +0 -112
  372. package/dist/themes/editorial.css +0 -110
  373. package/dist/themes/soft.css +0 -101
  374. package/dist/themes/terminal.css +0 -91
  375. /package/dist/{chunk-NWTTHDIM.js.map → chunk-5JEXM5S7.js.map} +0 -0
  376. /package/dist/{chunk-NV5AIBQP.js.map → chunk-6VBK2I5B.js.map} +0 -0
  377. /package/dist/{chunk-ZYUXCZX7.js.map → chunk-7KMIFXHZ.js.map} +0 -0
  378. /package/dist/{chunk-CEXY5A4T.js.map → chunk-ELYARUCN.js.map} +0 -0
  379. /package/dist/{chunk-Z25NC4CS.js.map → chunk-EV73ADN2.js.map} +0 -0
  380. /package/dist/{chunk-CQRHNTEX.js.map → chunk-G2KUK6AT.js.map} +0 -0
  381. /package/dist/{chunk-LBCWEWPN.js.map → chunk-GNU4VOOE.js.map} +0 -0
  382. /package/dist/{chunk-IW7PK4VS.js.map → chunk-GZ7X34QP.js.map} +0 -0
  383. /package/dist/{chunk-QEQIJAAB.js.map → chunk-I4SP6JTU.js.map} +0 -0
  384. /package/dist/{chunk-4SUKNSCY.js.map → chunk-JI265XFO.js.map} +0 -0
  385. /package/dist/{chunk-6NJW7QFD.js.map → chunk-SA53QUBF.js.map} +0 -0
  386. /package/dist/{chunk-TBLICXWW.js.map → chunk-TOLTUOZS.js.map} +0 -0
  387. /package/dist/{chunk-DXO3UJKL.js.map → chunk-TZOQWCVH.js.map} +0 -0
  388. /package/dist/{chunk-SNTHW4K2.js.map → chunk-W3H7GTJY.js.map} +0 -0
  389. /package/dist/{chunk-ZHVSHDLH.js.map → chunk-XHOBNSBO.js.map} +0 -0
  390. /package/dist/{chunk-6O2BXCRN.js.map → chunk-Z2Z52GFT.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/fields/daterangefield/daterangefield.ts"],
4
- "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { parseDate, formatDate } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Calendar, type DateRange } from '../../dates/calendar/calendar';\n\nexport interface DateRangeFieldConfig extends TextFieldConfig<DateRange | null> {\n min?: string;\n max?: string;\n firstDay?: number;\n}\n\nconst SEP = /\\s*(?:\u2013|\u2014|\\s-\\s|\\sto\\s|\\sa\\s)\\s*/;\nconst short = (iso: string) => formatDate(iso, { day: '2-digit', month: '2-digit', year: 'numeric' });\n\n/**\n * Value is `{ start, end }` (ISO dates) or null. The text reads `01/03/2025 \u2013 15/03/2025` (typed or picked); the calendar\n * takes two clicks, and the popup closes on the second.\n */\nexport class DateRangeField extends TextField<DateRange | null, DateRangeFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-picker op-datefield op-daterange';\n private cal!: Calendar;\n private dd!: Dropdown;\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: DateRange | null) {\n return !v?.start;\n }\n\n protected override parse(text: string): DateRange | null {\n this.garbage = false;\n if (!text.trim()) return null;\n const [a, b] = text.trim().split(SEP);\n const start = parseDate(a);\n const end = b ? parseDate(b) : null;\n if (!start || (b && !end)) {\n this.garbage = true;\n return null;\n }\n return end && end < start ? { start: end, end: start } : { start, end: end ?? start };\n }\n protected override display(v: DateRange | null) {\n return v?.start ? (v.end && v.end !== v.start ? `${short(v.start)} \u2013 ${short(v.end)}` : short(v.start)) : '';\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.setAttribute('aria-haspopup', 'dialog');\n input.setAttribute('aria-expanded', 'false');\n const trigger = h('button', 'op-picker__trigger', { type: 'button', tabindex: -1, 'aria-label': t('calOpen') }, iconEl('calendar'));\n this.listen(trigger, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(trigger, 'click', () => {\n if (!this.config.disabled && !this.config.readonly) this.toggle();\n });\n wrap.append(trigger);\n const c = this.config;\n this.cal = new Calendar({ range: true, value: c.value, min: c.min, max: c.max, firstDay: c.firstDay });\n this.dd = new Dropdown({ anchor: wrap, content: this.cal, role: 'presentation' });\n this.cal.on('select', (r: DateRange) => {\n this.dd.close();\n this.setValue(r);\n input.focus();\n });\n this.dd.on('open', () => {\n input.setAttribute('aria-expanded', 'true');\n this.el.classList.add('is-open');\n this.cal.setValue(this.value);\n this.cal.focusDay();\n this.emit('expand');\n });\n this.dd.on('close', () => {\n input.setAttribute('aria-expanded', 'false');\n this.el.classList.remove('is-open');\n this.emit('collapse');\n });\n this.own(() => this.dd.destroy());\n this.on('blur', () =>\n this.later(() => {\n const a = document.activeElement;\n if (!this.el.contains(a) && !this.dd.el.contains(a)) this.dd.close();\n }, 0),\n );\n return wrap;\n }\n\n protected override onKey(e: KeyboardEvent) {\n if (e.key === 'ArrowDown' && !this.dd.isOpen()) {\n e.preventDefault();\n this.open();\n } else super.onKey(e);\n }\n protected override onInput() {\n super.onInput();\n if (this.garbage) this.setError(t('date'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: DateRange | null) {\n super.applyValue(v);\n this.garbage = false;\n }\n protected override onDisabled(disabled: boolean) {\n super.onDisabled(disabled);\n (this.el.querySelector('.op-picker__trigger') as HTMLButtonElement).disabled = disabled;\n }\n\n protected override check(): string {\n if (this.garbage) return t('date');\n const base = super.check();\n const v = this.value;\n if (base || !v) return base;\n const { min, max } = this.config;\n if (min && v.start! < min) return t('dateMin', { n: formatDate(min) });\n if (max && (v.end ?? v.start!) > max) return t('dateMax', { n: formatDate(max) });\n return '';\n }\n\n open() {\n if (this.config.disabled || this.config.readonly || !this.rendered) return;\n this.dd.open();\n }\n close() {\n this.dd?.close();\n }\n toggle() {\n if (this.dd.isOpen()) this.close();\n else this.open();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n this.cal?.setMin(min);\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n this.cal?.setMax(max);\n }\n}\nregister('daterangefield', DateRangeField);\n"],
5
- "mappings": "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",
6
- "names": ["SEP", "short", "iso", "formatDate", "DateRangeField", "TextField", "v", "text", "a", "b", "start", "parseDate", "end", "wrap", "input", "trigger", "h", "t", "iconEl", "e", "c", "Calendar", "Dropdown", "r", "disabled", "base", "min", "max", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as g}from"./chunk-ZHVSHDLH.js";import{a as k}from"./chunk-JVEPKW5X.js";import{a as T}from"./chunk-LEE2FEEL.js";import{a as d}from"./chunk-NV5AIBQP.js";import{a as w}from"./chunk-T4OYVG2X.js";import{a as c}from"./chunk-CQRHNTEX.js";import{a as h}from"./chunk-6O2BXCRN.js";import{a as C}from"./chunk-DXO3UJKL.js";import{a as b}from"./chunk-XZ5CUZZP.js";import{a as x}from"./chunk-LBCWEWPN.js";import{a as l}from"./chunk-QEQIJAAB.js";import{a as u}from"./chunk-4SUKNSCY.js";import{a as y}from"./chunk-BNPVRIFT.js";import{a as f}from"./chunk-ZYUXCZX7.js";import{a as m}from"./chunk-U3X2FW6U.js";import{a}from"./chunk-SNTHW4K2.js";import{c as s}from"./chunk-UPOBGNJ5.js";import{a as p}from"./chunk-XZEOSW3Q.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),S={text:(t,e,o)=>n(a,t,e,o),email:(t,e,o)=>n(a,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(a,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(g,t,e,o),number:(t,e,o)=>n(f,t,e,o),date:(t,e,o)=>n(m,t,e,o),dateRange:(t,e,o)=>n(y,t,e,o),secret:(t,e,o)=>n(w,t,e,o),slider:(t,e,o)=>n(h,t,e,o),check:(t,e,o)=>n(l,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(d,t,e,{options:o,...r}),select:(t,e,o,r)=>n(c,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(u,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(C,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(T,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:typeof t=="number"?`repeat(${t}, 1fr)`:t},items:e}),panel:(t,e,o)=>new b({title:t,items:e,...o}),toolbar:(...t)=>new x({items:t}),form:(t,e)=>new k({items:t,...e})};var i=t=>t,H=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),$=i({Top:"top",Left:"left"}),j=i({Vertical:"vertical",Horizontal:"horizontal"}),J=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),Q=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),U=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),X=i({None:"none",Single:"single",Multi:"multi"}),Y=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),Z=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"}),_=i({Light:"light",Dark:"dark",Corporate:"corporate",Brutal:"brutal",Soft:"soft",Terminal:"terminal",Editorial:"editorial",Brand:"brand"});export{S as a,H as b,$ as c,j as d,J as e,Q as f,U as g,X as h,Y as i,Z as j,_ as k};
2
- //# sourceMappingURL=chunk-C3N7QTQB.js.map
@@ -1,7 +0,0 @@
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 { DateField } from '../components/fields/datefield/datefield';\nimport { DateRangeField } from '../components/fields/daterangefield/daterangefield';\nimport { Checkbox } from '../components/fields/checkbox/checkbox';\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 { 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, ComponentConfig } from '../core/component';\nimport type { Variant } from './enums';\n\ntype Cfg = Record<string, any>;\ntype Item = Component | ComponentConfig | 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 date: (name: string, label?: string, c?: Cfg) => field(DateField, 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 /** `boxLabel` is the text beside the box. */\n check: (name: string, boxLabel?: string, c?: Cfg) => field(Checkbox, name, undefined, { boxLabel, ...c }),\n radio: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(RadioGroup, 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) or a CSS `grid-template-columns`. */\n grid: (columns: number | string, ...items: Item[]) => new Container({ layout: { type: 'grid', columns: typeof columns === 'number' ? `repeat(${columns}, 1fr)` : 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', Corporate: 'corporate', Brutal: 'brutal', Soft: 'soft', Terminal: 'terminal', Editorial: 'editorial', Brand: 'brand' } 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", "DateField", "DateRangeField", "SecretField", "Slider", "boxLabel", "Checkbox", "options", "RadioGroup", "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 +0,0 @@
1
- import{c as r}from"./chunk-UPOBGNJ5.js";import{b as o}from"./chunk-IYPKPLCU.js";o("container",r);
2
- //# sourceMappingURL=chunk-CEXY5A4T.js.map
@@ -1,2 +0,0 @@
1
- import{a as p}from"./chunk-XZ5CUZZP.js";import{b as c}from"./chunk-676AKAGF.js";import{a as f}from"./chunk-VV7CFMPZ.js";import{b as a}from"./chunk-IYPKPLCU.js";import{e as h}from"./chunk-MA5BJL3S.js";var u={left:"chevron-left",right:"chevron-right",top:"chevron-up",bottom:"chevron-down"},m={left:"wDockLeft",right:"wDockRight",top:"wDockTop",bottom:"wDockBottom"},g=["right","left","top","bottom"],d=class extends p{baseCls="op-panel op-widget";opened=!1;opener=null;cancelHide;userTools;pos;constructor(e={}){let t=[...e.tools??[]],i=e.sides??["left","right","bottom"];if(e.sideSwitcher)for(let o of i)t.push({icon:u[o],label:h(m[o]),handler:s=>s.setSide(o)});super({closable:!0,closeAction:"hide",floating:!0,side:"right",layout:"fit",hidden:!0,...e,tools:t}),this.userTools=e.tools?.length??0}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","complementary"),this.el.classList.toggle("is-floating",e.floating!==!1),e.sideSwitcher&&(e.sides??["left","right","bottom"]).forEach((t,i)=>{let o=this.el.querySelectorAll(".op-panel__tool")[this.userTools+i];o&&(o.dataset.side=t)}),this.paintSide(),e.size!=null&&this.setSize(e.size),e.draggable&&e.floating!==!1&&this.initDrag(),this.listen(this.el,"keydown",t=>{t.key==="Escape"&&e.closeOnEsc!==!1&&!t.defaultPrevented&&e.floating!==!1&&(t.stopPropagation(),this.close())})}getSide(){return this.config.side??"right"}setSide(e){e===this.getSide()||!g.includes(e)||(this.config.side=e,this.resetPosition(),this.paintSide(),this.emit("side-change",e))}paintSide(){if(!this.rendered)return;let e=this.getSide();for(let t of g)this.el.classList.toggle(`op-widget--${t}`,t===e);for(let t of Array.from(this.el.querySelectorAll("[data-side]")))t.setAttribute("aria-pressed",String(t.dataset.side===e))}getPosition(){return this.pos}resetPosition(){if(!this.pos)return;this.pos=void 0;let e=this.el.style;for(let t of["inset","inset-inline","inset-block","left","top","width","height"])e.removeProperty(t);this.el.classList.remove("is-moved"),this.emit("move",void 0)}moveTo(e,t){let i=this.el;if(!this.pos){let n=i.getBoundingClientRect();n.width&&(i.style.width=`${n.width}px`,i.style.height=`${n.height}px`),i.classList.add("is-moved")}let o=i.offsetWidth||i.getBoundingClientRect().width,s=i.offsetHeight||i.getBoundingClientRect().height;this.pos={x:Math.max(0,Math.min(e,innerWidth-Math.min(o,innerWidth))),y:Math.max(0,Math.min(t,innerHeight-Math.min(s,innerHeight)))},i.style.inset="auto",i.style.left=`${this.pos.x}px`,i.style.top=`${this.pos.y}px`,this.emit("move",this.pos)}initDrag(){let e=this.headerEl;e.classList.add("op-widget__handle"),e.tabIndex=0,e.setAttribute("aria-roledescription","draggable"),this.listen(e,"pointerdown",t=>{if(t.target.closest(".op-panel__tool")||t.button)return;let i=this.el.getBoundingClientRect(),o=t.clientX-i.left,s=t.clientY-i.top;this.el.classList.add("is-dragging");let n=l=>this.moveTo(l.clientX-o,l.clientY-s),r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",n),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",n),document.addEventListener("pointerup",r),this.own(r)}),this.listen(e,"keydown",t=>{if(!t.altKey)return;let i=t.shiftKey?64:16,o=this.el.getBoundingClientRect(),s={ArrowLeft:[o.left-i,o.top],ArrowRight:[o.left+i,o.top],ArrowUp:[o.left,o.top-i],ArrowDown:[o.left,o.top+i]};t.key==="Home"?(t.preventDefault(),this.resetPosition()):s[t.key]&&(t.preventDefault(),this.moveTo(...s[t.key]))})}setSize(e){this.config.size=e,this.rendered&&this.el.style.setProperty("--op-widget-size",typeof e=="number"?`${e}px`:e)}isOpen(){return this.config.floating===!1?!this.isHidden():this.opened}open(){this.show()}setOpen(e=!this.isOpen()){e?this.show():this.hide()}show(){if(this.config.floating===!1)return super.show();if(this.opened||this.destroyed||this.emit("before-show")===!1)return;this.cancelHide?.(),this.opener=document.activeElement;let e=this.el;this.opened=!0,this.config.hidden=!1,c(e,this.opener),e.hidden=!1,this.notifyMount(),requestAnimationFrame(()=>this.opened&&e.classList.add("is-open")),this.config.autoFocus!==!1&&(f(this.getBody())[0]??e).focus(),this.emit("show")}hide(){if(this.config.floating===!1)return super.hide();if(!this.opened||this.emit("before-hide")===!1)return;this.opened=!1,this.config.hidden=!0,this.el.classList.remove("is-open"),this.cancelHide=this.later(()=>this.el.hidden=!0,250);let e=this.opener;e instanceof HTMLElement&&e.isConnected&&this.el.contains(document.activeElement)&&e.focus(),this.emit("hide")}onDestroy(){super.onDestroy(),this.el.remove()}};a("widget",d);export{d as a};
2
- //# sourceMappingURL=chunk-CN7USUJR.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/overlays/widget/widget.ts"],
4
- "sourcesContent": ["import { Panel, type PanelConfig, type PanelTool } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { t } from '../../../core/i18n';\nimport { toLayer } from '../../../core/layer';\nimport { focusables } from '../../../core/focus';\n\nexport type WidgetSide = 'right' | 'left' | 'top' | 'bottom';\n\nexport interface WidgetConfig extends PanelConfig {\n side?: WidgetSide;\n /** Float above the page (default). `false`: an ordinary panel where the layout puts it. */\n floating?: boolean;\n /** Width on the sides, height on top/bottom (CSS length or px). */\n size?: number | string;\n /** Header buttons that let the user pick the side. */\n sideSwitcher?: boolean;\n /** Which sides the switcher offers. Default left, right, bottom. */\n sides?: WidgetSide[];\n closeOnEsc?: boolean;\n autoFocus?: boolean;\n /** The user can move it by its header (pointer drag, or Alt+arrow keys). A move frees it from the side; `setSide` docks it again. */\n draggable?: boolean;\n}\n\nconst ICON: Record<WidgetSide, string> = { left: 'chevron-left', right: 'chevron-right', top: 'chevron-up', bottom: 'chevron-down' };\nconst LABEL: Record<WidgetSide, string> = { left: 'wDockLeft', right: 'wDockRight', top: 'wDockTop', bottom: 'wDockBottom' };\nconst SIDES: WidgetSide[] = ['right', 'left', 'top', 'bottom'];\n\n/** A panel that floats over the page, attached to one edge. Not modal: the page behind stays usable. */\nexport class Widget extends Panel<WidgetConfig> {\n protected override baseCls = 'op-panel op-widget';\n private opened = false;\n private opener: Element | null = null;\n private cancelHide?: () => void;\n private userTools: number;\n private pos?: { x: number; y: number };\n\n constructor(config: WidgetConfig = {}) {\n const tools: PanelTool[] = [...(config.tools ?? [])];\n const sides = config.sides ?? (['left', 'right', 'bottom'] as WidgetSide[]);\n // `this` does not exist yet: the handlers look the widget up through the panel they receive\n if (config.sideSwitcher) for (const s of sides) tools.push({ icon: ICON[s], label: t(LABEL[s]), handler: (p) => (p as Widget).setSide(s) });\n super({ closable: true, closeAction: 'hide', floating: true, side: 'right', layout: 'fit', hidden: true, ...config, tools });\n this.userTools = config.tools?.length ?? 0;\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'complementary');\n this.el.classList.toggle('is-floating', c.floating !== false);\n if (c.sideSwitcher) {\n (c.sides ?? ['left', 'right', 'bottom']).forEach((s, i) => {\n const b = this.el.querySelectorAll<HTMLElement>('.op-panel__tool')[this.userTools + i];\n if (b) b.dataset.side = s;\n });\n }\n this.paintSide();\n if (c.size != null) this.setSize(c.size);\n if (c.draggable && c.floating !== false) this.initDrag();\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented && c.floating !== false) {\n e.stopPropagation();\n this.close();\n }\n });\n }\n\n // ---- side / size ---------------------------------------------------------------------------\n\n getSide(): WidgetSide {\n return this.config.side ?? 'right';\n }\n\n setSide(side: WidgetSide): void {\n if (side === this.getSide() || !SIDES.includes(side)) return;\n this.config.side = side;\n this.resetPosition();\n this.paintSide();\n this.emit('side-change', side);\n }\n\n private paintSide(): void {\n if (!this.rendered) return;\n const side = this.getSide();\n for (const s of SIDES) this.el.classList.toggle(`op-widget--${s}`, s === side);\n for (const b of Array.from(this.el.querySelectorAll<HTMLElement>('[data-side]'))) b.setAttribute('aria-pressed', String(b.dataset.side === side));\n }\n\n /** Where the user left it (viewport px), or undefined while it sits on its side. */\n getPosition(): { x: number; y: number } | undefined {\n return this.pos;\n }\n\n /** Puts a dragged widget back on its side. */\n resetPosition(): void {\n if (!this.pos) return;\n this.pos = undefined;\n const st = this.el.style;\n for (const k of ['inset', 'inset-inline', 'inset-block', 'left', 'top', 'width', 'height']) st.removeProperty(k);\n this.el.classList.remove('is-moved');\n this.emit('move', undefined);\n }\n\n private moveTo(x: number, y: number): void {\n const el = this.el;\n if (!this.pos) {\n // first move: pin the current size, because the side rules (insets) stop applying\n const r = el.getBoundingClientRect();\n if (r.width) {\n el.style.width = `${r.width}px`;\n el.style.height = `${r.height}px`;\n }\n el.classList.add('is-moved');\n }\n const w = el.offsetWidth || el.getBoundingClientRect().width;\n const h = el.offsetHeight || el.getBoundingClientRect().height;\n this.pos = { x: Math.max(0, Math.min(x, innerWidth - Math.min(w, innerWidth) )), y: Math.max(0, Math.min(y, innerHeight - Math.min(h, innerHeight))) };\n el.style.inset = 'auto';\n el.style.left = `${this.pos.x}px`;\n el.style.top = `${this.pos.y}px`;\n this.emit('move', this.pos);\n }\n\n private initDrag(): void {\n const head = this.headerEl;\n head.classList.add('op-widget__handle');\n head.tabIndex = 0;\n head.setAttribute('aria-roledescription', 'draggable');\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).closest('.op-panel__tool') || e.button) return;\n const r = this.el.getBoundingClientRect();\n const dx = e.clientX - r.left;\n const dy = e.clientY - r.top;\n this.el.classList.add('is-dragging');\n const move = (m: PointerEvent) => this.moveTo(m.clientX - dx, m.clientY - dy);\n const up = () => {\n this.el.classList.remove('is-dragging');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(up);\n });\n // keyboard: Alt+arrows nudge it, Alt+Home puts it back on its side\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey) return;\n const step = e.shiftKey ? 64 : 16;\n const r = this.el.getBoundingClientRect();\n const to: Record<string, [number, number]> = { ArrowLeft: [r.left - step, r.top], ArrowRight: [r.left + step, r.top], ArrowUp: [r.left, r.top - step], ArrowDown: [r.left, r.top + step] };\n if (e.key === 'Home') {\n e.preventDefault();\n this.resetPosition();\n } else if (to[e.key]) {\n e.preventDefault();\n this.moveTo(...to[e.key]);\n }\n });\n }\n\n setSize(size: number | string): void {\n this.config.size = size;\n if (this.rendered) this.el.style.setProperty('--op-widget-size', typeof size === 'number' ? `${size}px` : size);\n }\n\n // ---- open / close --------------------------------------------------------------------------\n\n isOpen(): boolean {\n return this.config.floating === false ? !this.isHidden() : this.opened;\n }\n open(): void {\n this.show();\n }\n /** Opens or closes (with no argument: the other one). `toggle()` stays the Panel's collapse. */\n setOpen(open = !this.isOpen()): void {\n if (open) this.show();\n else this.hide();\n }\n\n override show(): void {\n if (this.config.floating === false) return super.show();\n if (this.opened || this.destroyed || this.emit('before-show') === false) return;\n this.cancelHide?.();\n this.opener = document.activeElement;\n const el = this.el;\n this.opened = true;\n this.config.hidden = false;\n toLayer(el, this.opener);\n el.hidden = false;\n this.notifyMount();\n // next frame, so the slide-in transition has a starting point\n requestAnimationFrame(() => this.opened && el.classList.add('is-open'));\n if (this.config.autoFocus !== false) (focusables(this.getBody())[0] ?? el).focus();\n this.emit('show');\n }\n\n override hide(): void {\n if (this.config.floating === false) return super.hide();\n if (!this.opened || this.emit('before-hide') === false) return;\n this.opened = false;\n this.config.hidden = true;\n this.el.classList.remove('is-open');\n this.cancelHide = this.later(() => (this.el.hidden = true), 250);\n const back = this.opener;\n if (back instanceof HTMLElement && back.isConnected && this.el.contains(document.activeElement)) back.focus();\n this.emit('hide');\n }\n\n protected override onDestroy(): void {\n super.onDestroy();\n this.el.remove();\n }\n}\nregister('widget', Widget);\n"],
5
- "mappings": "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",
6
- "names": ["ICON", "LABEL", "SIDES", "Widget", "Panel", "config", "tools", "sides", "s", "t", "p", "c", "b", "e", "side", "st", "k", "x", "y", "el", "r", "w", "h", "head", "dx", "dy", "move", "m", "up", "step", "to", "size", "open", "toLayer", "focusables", "back", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as o}from"./chunk-Z25NC4CS.js";import{b as t}from"./chunk-IYPKPLCU.js";var e=class extends o{baseCls="op-field op-textfield op-picker op-select";editable(){return!1}emptyValue(){return null}isEmpty(r){return r==null||r===""}};t("select",e);export{e as a};
2
- //# sourceMappingURL=chunk-CQRHNTEX.js.map
@@ -1,2 +0,0 @@
1
- var g={top:"bottom",bottom:"top",left:"right",right:"left"};function x(o,e,n={}){let{offset:r=4,flip:b=!0,margin:d=8}=n,[w,a="center"]=(n.placement??"bottom-start").split("-"),t="getBoundingClientRect"in e?e.getBoundingClientRect():{left:e.x,right:e.x,top:e.y,bottom:e.y,width:0,height:0};n.matchWidth&&(o.style.minWidth=`${t.width}px`);let f=document.documentElement.clientWidth||window.innerWidth,h=document.documentElement.clientHeight||window.innerHeight,m=o.offsetWidth,s=o.offsetHeight,u=c=>c==="bottom"?t.bottom+r+s<=h-d:c==="top"?t.top-r-s>=d:c==="right"?t.right+r+m<=f-d:t.left-r-m>=d,i=w;b&&!u(i)&&u(g[i])&&(i=g[i]);let l,p;i==="bottom"||i==="top"?(p=i==="bottom"?t.bottom+r:t.top-r-s,l=a==="start"?t.left:a==="end"?t.right-m:t.left+(t.width-m)/2):(l=i==="right"?t.right+r:t.left-r-m,p=a==="start"?t.top:a==="end"?t.bottom-s:t.top+(t.height-s)/2),l=Math.max(d,Math.min(l,f-m-d)),p=Math.max(d,Math.min(p,h-s-d)),o.style.left=`${l}px`,o.style.top=`${p}px`,o.dataset.side=i}function v(o){let e=!1,n=()=>{e||(e=!0,requestAnimationFrame(()=>{e=!1,o()}))};return window.addEventListener("scroll",n,!0),window.addEventListener("resize",n),()=>{window.removeEventListener("scroll",n,!0),window.removeEventListener("resize",n)}}export{x as a,v as b};
2
- //# sourceMappingURL=chunk-CUPAPOKC.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/core/position.ts"],
4
- "sourcesContent": ["export type Side = 'top' | 'bottom' | 'left' | 'right';\nexport type Placement = Side | `${Side}-start` | `${Side}-end`;\n\nexport interface PlaceOptions {\n placement?: Placement;\n offset?: number;\n flip?: boolean;\n matchWidth?: boolean;\n margin?: number;\n}\n\nconst opposite: Record<Side, Side> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };\n\n/** Positions a floating element (`position: fixed`) next to an anchor element or a point, flipping and clamping to the viewport. */\nexport function place(el: HTMLElement, anchor: Element | { x: number; y: number }, o: PlaceOptions = {}): void {\n const { offset = 4, flip = true, margin = 8 } = o;\n const [side0, align = 'center'] = (o.placement ?? 'bottom-start').split('-') as [Side, string?];\n const a = 'getBoundingClientRect' in anchor ? anchor.getBoundingClientRect() : { left: anchor.x, right: anchor.x, top: anchor.y, bottom: anchor.y, width: 0, height: 0 };\n if (o.matchWidth) el.style.minWidth = `${a.width}px`;\n const vw = document.documentElement.clientWidth || window.innerWidth;\n const vh = document.documentElement.clientHeight || window.innerHeight;\n const w = el.offsetWidth;\n const hgt = el.offsetHeight;\n\n const fits = (s: Side) =>\n s === 'bottom' ? a.bottom + offset + hgt <= vh - margin : s === 'top' ? a.top - offset - hgt >= margin : s === 'right' ? a.right + offset + w <= vw - margin : a.left - offset - w >= margin;\n let side = side0;\n if (flip && !fits(side) && fits(opposite[side])) side = opposite[side];\n\n let left: number;\n let top: number;\n if (side === 'bottom' || side === 'top') {\n top = side === 'bottom' ? a.bottom + offset : a.top - offset - hgt;\n left = align === 'start' ? a.left : align === 'end' ? a.right - w : a.left + (a.width - w) / 2;\n } else {\n left = side === 'right' ? a.right + offset : a.left - offset - w;\n top = align === 'start' ? a.top : align === 'end' ? a.bottom - hgt : a.top + (a.height - hgt) / 2;\n }\n left = Math.max(margin, Math.min(left, vw - w - margin));\n top = Math.max(margin, Math.min(top, vh - hgt - margin));\n el.style.left = `${left}px`;\n el.style.top = `${top}px`;\n el.dataset.side = side;\n}\n\n/** Calls `fn` (throttled to a frame) on any scroll or resize. Returns the cleanup function. */\nexport function track(fn: () => void): () => void {\n let queued = false;\n const run = () => {\n if (queued) return;\n queued = true;\n requestAnimationFrame(() => {\n queued = false;\n fn();\n });\n };\n window.addEventListener('scroll', run, true);\n window.addEventListener('resize', run);\n return () => {\n window.removeEventListener('scroll', run, true);\n window.removeEventListener('resize', run);\n };\n}\n"],
5
- "mappings": "AAWA,IAAMA,EAA+B,CAAE,IAAK,SAAU,OAAQ,MAAO,KAAM,QAAS,MAAO,MAAO,EAG3F,SAASC,EAAMC,EAAiBC,EAA4CC,EAAkB,CAAC,EAAS,CAC7G,GAAM,CAAE,OAAAC,EAAS,EAAG,KAAAC,EAAO,GAAM,OAAAC,EAAS,CAAE,EAAIH,EAC1C,CAACI,EAAOC,EAAQ,QAAQ,GAAKL,EAAE,WAAa,gBAAgB,MAAM,GAAG,EACrEM,EAAI,0BAA2BP,EAASA,EAAO,sBAAsB,EAAI,CAAE,KAAMA,EAAO,EAAG,MAAOA,EAAO,EAAG,IAAKA,EAAO,EAAG,OAAQA,EAAO,EAAG,MAAO,EAAG,OAAQ,CAAE,EACnKC,EAAE,aAAYF,EAAG,MAAM,SAAW,GAAGQ,EAAE,KAAK,MAChD,IAAMC,EAAK,SAAS,gBAAgB,aAAe,OAAO,WACpDC,EAAK,SAAS,gBAAgB,cAAgB,OAAO,YACrDC,EAAIX,EAAG,YACPY,EAAMZ,EAAG,aAETa,EAAQC,GACZA,IAAM,SAAWN,EAAE,OAASL,EAASS,GAAOF,EAAKL,EAASS,IAAM,MAAQN,EAAE,IAAML,EAASS,GAAOP,EAASS,IAAM,QAAUN,EAAE,MAAQL,EAASQ,GAAKF,EAAKJ,EAASG,EAAE,KAAOL,EAASQ,GAAKN,EACpLU,EAAOT,EACPF,GAAQ,CAACS,EAAKE,CAAI,GAAKF,EAAKf,EAASiB,CAAI,CAAC,IAAGA,EAAOjB,EAASiB,CAAI,GAErE,IAAIC,EACAC,EACAF,IAAS,UAAYA,IAAS,OAChCE,EAAMF,IAAS,SAAWP,EAAE,OAASL,EAASK,EAAE,IAAML,EAASS,EAC/DI,EAAOT,IAAU,QAAUC,EAAE,KAAOD,IAAU,MAAQC,EAAE,MAAQG,EAAIH,EAAE,MAAQA,EAAE,MAAQG,GAAK,IAE7FK,EAAOD,IAAS,QAAUP,EAAE,MAAQL,EAASK,EAAE,KAAOL,EAASQ,EAC/DM,EAAMV,IAAU,QAAUC,EAAE,IAAMD,IAAU,MAAQC,EAAE,OAASI,EAAMJ,EAAE,KAAOA,EAAE,OAASI,GAAO,GAElGI,EAAO,KAAK,IAAIX,EAAQ,KAAK,IAAIW,EAAMP,EAAKE,EAAIN,CAAM,CAAC,EACvDY,EAAM,KAAK,IAAIZ,EAAQ,KAAK,IAAIY,EAAKP,EAAKE,EAAMP,CAAM,CAAC,EACvDL,EAAG,MAAM,KAAO,GAAGgB,CAAI,KACvBhB,EAAG,MAAM,IAAM,GAAGiB,CAAG,KACrBjB,EAAG,QAAQ,KAAOe,CACpB,CAGO,SAASG,EAAMC,EAA4B,CAChD,IAAIC,EAAS,GACPC,EAAM,IAAM,CACZD,IACJA,EAAS,GACT,sBAAsB,IAAM,CAC1BA,EAAS,GACTD,EAAG,CACL,CAAC,EACH,EACA,cAAO,iBAAiB,SAAUE,EAAK,EAAI,EAC3C,OAAO,iBAAiB,SAAUA,CAAG,EAC9B,IAAM,CACX,OAAO,oBAAoB,SAAUA,EAAK,EAAI,EAC9C,OAAO,oBAAoB,SAAUA,CAAG,CAC1C,CACF",
6
- "names": ["opposite", "place", "el", "anchor", "o", "offset", "flip", "margin", "side0", "align", "a", "vw", "vh", "w", "hgt", "fits", "s", "side", "left", "top", "track", "fn", "queued", "run"]
7
- }
@@ -1,2 +0,0 @@
1
- import{c}from"./chunk-IHAYOSBR.js";import{a as d,b as p}from"./chunk-IYPKPLCU.js";import{b as a}from"./chunk-PZSHOSOS.js";var l=class extends d{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;onRender(){let e=this.config;this.items=e.items??[],this.active=e.active;let t=i=>i.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&t(s.items)));t(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",i=>{let s=i.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",i=>this.onKey(i)),this.listen(this.root,"focusin",i=>{let s=i.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,t=this.items){for(let i of t){if(i.id===e)return i;let s=i.items&&this.getItem(e,i.items);if(s)return s}}parentsOf(e,t=this.items,i=[]){for(let s of t){if(s.id===e)return i;let n=s.items&&this.parentsOf(e,s.items,[...i,s]);if(n)return n}}openParents(e){for(let t of this.parentsOf(e)??[])this.open.add(t.id)}matches(e,t){return e.text.toLowerCase().includes(t)||!!e.items?.some(i=>this.matches(i,t))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(t=>this.visible(t))}isOpen(e){return this.query||this.config.collapsed?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(i=>this.visible(i)).map(i=>this.node(i,1)));let t=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(i=>i.tabIndex=i===t?0:-1)}node(e,t){let i=!!e.items,s=i&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),o=a("div",`op-navmenu__item${i?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":t,"aria-expanded":i?String(s):null,"aria-current":e.id===this.active?"page":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return o.style.setProperty("--_level",String(t-1)),o.append(a("span","op-navmenu__icon",{},e.icon?c(e.icon):""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&o.append(a("span","op-navmenu__badge",{},String(e.badge))),i&&o.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},c("chevron-down"))),r.append(o),i&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(h=>this.visible(h)).map(h=>this.node(h,t+1)))),r}activate(e){let t=this.getItem(e);if(!(!t||t.disabled)){if(t.items)return this.toggle(e);this.select(e)}}select(e){let t=this.getItem(e);!t||t.disabled||this.emit("before-select",t)===!1||(this.setActive(e),this.emit("select",t))}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 t=this.getItem(e);if(!(!t?.items||this.open.has(e))){if(this.config.accordion)for(let i of this.siblings(e))this.open.delete(i.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",t)}}collapse(e){let t=this.getItem(e);!t?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",t))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let t=this.parentsOf(e)??[];return(t.length?t[t.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=t=>t.forEach(i=>i.items&&(this.open.add(i.id),e(i.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=e,this.config.items=e,this.rendered&&this.paint()}updateItem(e,t){let i=this.getItem(e);i&&(Object.assign(i,t),this.rendered&&this.paint())}setCollapsed(e){this.config.collapsed=e,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(t=>t.tabIndex=t===e?0:-1),e.focus())}onKey(e){let t=e.target.closest(".op-navmenu__item");if(!t)return;let i=this.rows(),s=i.indexOf(t),n=this.getItem(t.dataset.id),r=t.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(i[s+1]);break;case"ArrowUp":this.focusRow(i[s-1]);break;case"Home":this.focusRow(i[0]);break;case"End":this.focusRow(i[i.length-1]);break;case"ArrowRight":n.items&&!r?this.expand(n.id):n.items&&this.focusRow(i[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let h=this.parentsOf(n.id)?.pop();h&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(h.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}e.preventDefault(),this.focusId=document.activeElement?.dataset?.id??n.id;let o=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);o&&document.activeElement!==o&&this.focusRow(o)}};p("navmenu",l);export{l as a};
2
- //# sourceMappingURL=chunk-GZNQPENR.js.map
@@ -1,7 +0,0 @@
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 { iconEl } from '../../base/icon/icon';\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 /** 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\n protected override onRender() {\n const c = this.config;\n this.items = 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 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 return this.query || this.config.collapsed ? 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 row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : ''), 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) 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 = 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 setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\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 && !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 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", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "collapsed", "text", "rows", "item", "parent", "again", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{c as b}from"./chunk-UPOBGNJ5.js";import{c as h}from"./chunk-VV7CFMPZ.js";import{c}from"./chunk-IHAYOSBR.js";import{b as p}from"./chunk-IYPKPLCU.js";import{b as r}from"./chunk-PZSHOSOS.js";import{e as l}from"./chunk-MA5BJL3S.js";var d=class extends b{baseCls="op-tabs";barEl;panelsEl;tabs=new Map;pending=new Set;rover;constructor(t={}){super({defaultType:"container",...t})}getBody(){return this.panelsEl}build(){let t=this.config.position==="left",e=r("div",`op-tabs${t?" op-tabs--left":""}`);return this.barEl=r("div","op-tabs__bar",{role:"tablist","aria-orientation":t?"vertical":"horizontal"}),this.panelsEl=r("div","op-tabs__panels"),e.append(this.barEl,this.panelsEl),e}onRender(){let t=this.config;t.layout={type:"card",activeItem:t.active??0},this.items.forEach(e=>this.addHeader(e)),this.rover=h(this.barEl,{selector:"[role=tab]",orientation:t.position==="left"?"vertical":"horizontal",onMove:e=>this.setActive(this.items.find(i=>this.tabs.get(i)===e))}),this.own(()=>this.rover?.destroy()),this.on("activate",e=>this.syncHeaders(e)),this.listen(this.barEl,"click",e=>{let i=e.target,s=i.closest("[role=tab]"),o=this.items.find(n=>this.tabs.get(n)===s);o&&(i.closest(".op-tabs__close")?this.closeTab(o):this.setActive(o))}),this.listen(this.barEl,"keydown",e=>{let i=this.items.find(s=>this.tabs.get(s)===e.target.closest("[role=tab]"));e.key==="Delete"&&i&&this.closeTab(i)}),super.onRender()}forcing;attach(t,e){if(this.config.lazy!==!1&&t!==this.getActiveItem()&&t!==this.forcing){this.pending.add(t);return}super.attach(t,e),t.el.setAttribute("role","tabpanel");let i=this.tabs.get(t);i&&(t.el.setAttribute("aria-labelledby",i.id),i.setAttribute("aria-controls",t.el.id))}ensure(t){this.pending.delete(t)&&(this.forcing=t,this.attach(t,this.items.indexOf(t)),this.forcing=void 0)}tabConfig(t){let e=t.config;return{title:e.title??"",icon:e.icon,closable:e.closable??this.config.closable??!1,disabled:!!e.disabled}}addHeader(t){let{title:e,icon:i,closable:s,disabled:o}=this.tabConfig(t),n=r("div","op-tabs__tab",{role:"tab",id:`${t.id}-tab`,tabindex:-1,"aria-selected":"false","aria-disabled":o?"true":null});n.append(i?c(i):"",r("span","op-tabs__title",{},e)),s&&n.append(r("span","op-tabs__close",{"aria-hidden":"true","data-op-tip":l("close")},c("x"))),this.tabs.set(t,n),this.barEl.append(...[...this.items].filter(a=>this.tabs.has(a)).map(a=>this.tabs.get(a)))}syncHeaders(t){for(let[i,s]of this.tabs){let o=i===t;s.setAttribute("aria-selected",String(o)),s.classList.toggle("is-active",o)}let e=t&&this.tabs.get(t);this.rover?.sync(e||void 0)}getActive(){return this.getActiveItem()}setActive(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(s=>s.id===t):t,i=this.getActiveItem();!e||e===i||this.tabConfig(e).disabled||this.emit("before-change",e,i)!==!1&&(this.ensure(e),this.setActiveItem(e),this.emit("change",e,this.items.indexOf(e)))}insert(t,e){let i=super.insert(t,e);return this.rendered&&(this.addHeader(i),this.ensure(i),this.setActive(i)),i}closeTab(t){let e=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(i=>i.id===t):t;!e||this.emit("before-close",e)===!1||(this.remove(e),this.emit("close",e))}remove(t,e=!0){let i=typeof t=="number"?this.items[t]:typeof t=="string"?this.items.find(n=>n.id===t):t,s=i&&this.tabs.get(i)?.contains(document.activeElement),o=super.remove(t,e);if(i){this.tabs.get(i)?.remove(),this.tabs.delete(i),this.pending.delete(i);let n=this.getActiveItem();n&&this.ensure(n),s&&n&&this.tabs.get(n)?.focus()}return o}setTabState(t,e){let i=this.tabs.get(t);if(!i)return;i.classList.toggle("has-error",!!e.errors),i.classList.toggle("is-dirty",!!e.dirty);let s=i.querySelector(".op-tabs__badge");if(!e.errors)return s?.remove();s||(s=r("span","op-tabs__badge"),i.insertBefore(s,i.querySelector(".op-tabs__close"))),s.replaceChildren(String(e.errors),r("span","op-sr-only",{},` ${l("tabErrors")}`))}setTitle(t,e){t.config.title=e;let i=this.tabs.get(t)?.querySelector(".op-tabs__title");i&&(i.textContent=e)}};p("tabs",d);export{d as a};
2
- //# sourceMappingURL=chunk-HFFK6K4K.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/navigation/tabs/tabs.ts"],
4
- "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Component } from '../../../core/component';\nimport { register, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { roving } from '../../../core/focus';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface TabsConfig extends ContainerConfig {\n /** Initially active tab (index or id). */\n active?: number | string;\n position?: 'top' | 'left';\n /** Build a panel's DOM only the first time its tab is activated. Default true. */\n lazy?: boolean;\n /** Default `closable` for tabs. */\n closable?: boolean;\n}\n\n/**\n * Items are the panels. Each may carry `title`, `icon`, `closable` and `disabled` for its tab header.\n * Tabs reuse the `card` layout of Container for the panels.\n */\nexport class Tabs extends Container<TabsConfig> {\n protected override baseCls = 'op-tabs';\n private barEl!: HTMLElement;\n private panelsEl!: HTMLElement;\n private tabs = new Map<Component, HTMLElement>();\n private pending = new Set<Component>();\n private rover?: ReturnType<typeof roving>;\n\n constructor(config: TabsConfig = {}) {\n super({ defaultType: 'container', ...config });\n }\n\n override getBody() {\n return this.panelsEl;\n }\n\n protected override build() {\n const left = this.config.position === 'left';\n const el = h('div', `op-tabs${left ? ' op-tabs--left' : ''}`);\n this.barEl = h('div', 'op-tabs__bar', { role: 'tablist', 'aria-orientation': left ? 'vertical' : 'horizontal' });\n this.panelsEl = h('div', 'op-tabs__panels');\n el.append(this.barEl, this.panelsEl);\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n c.layout = { type: 'card', activeItem: c.active ?? 0 };\n this.items.forEach((p) => this.addHeader(p));\n this.rover = roving(this.barEl, {\n selector: '[role=tab]',\n orientation: c.position === 'left' ? 'vertical' : 'horizontal',\n onMove: (tab) => this.setActive(this.items.find((p) => this.tabs.get(p) === tab)!),\n });\n this.own(() => this.rover?.destroy());\n this.on('activate', (p?: Component) => this.syncHeaders(p));\n this.listen(this.barEl, 'click', (e: Event) => {\n const target = e.target as HTMLElement;\n const tab = target.closest<HTMLElement>('[role=tab]');\n const panel = this.items.find((p) => this.tabs.get(p) === tab);\n if (!panel) return;\n if (target.closest('.op-tabs__close')) this.closeTab(panel);\n else this.setActive(panel);\n });\n this.listen(this.barEl, 'keydown', (e: KeyboardEvent) => {\n const panel = this.items.find((p) => this.tabs.get(p) === (e.target as HTMLElement).closest('[role=tab]'));\n if (e.key === 'Delete' && panel) this.closeTab(panel);\n });\n super.onRender();\n }\n\n private forcing?: Component;\n\n /** Lazy panels (everything but the active one) are attached the first time they are activated. */\n protected override attach(p: Component, index: number) {\n if (this.config.lazy !== false && p !== this.getActiveItem() && p !== this.forcing) {\n this.pending.add(p);\n return;\n }\n super.attach(p, index);\n p.el.setAttribute('role', 'tabpanel');\n const tab = this.tabs.get(p);\n if (tab) {\n p.el.setAttribute('aria-labelledby', tab.id);\n tab.setAttribute('aria-controls', p.el.id);\n }\n }\n\n /** Builds a pending panel's DOM now. */\n private ensure(p: Component) {\n if (!this.pending.delete(p)) return;\n this.forcing = p;\n this.attach(p, this.items.indexOf(p));\n this.forcing = undefined;\n }\n\n private tabConfig(p: Component) {\n const c = p.config as AnyConfig;\n return { title: (c.title as string) ?? '', icon: c.icon as string | undefined, closable: (c.closable as boolean) ?? this.config.closable ?? false, disabled: !!c.disabled };\n }\n\n private addHeader(p: Component) {\n const { title, icon, closable, disabled } = this.tabConfig(p);\n const tab = h('div', 'op-tabs__tab', { role: 'tab', id: `${p.id}-tab`, tabindex: -1, 'aria-selected': 'false', 'aria-disabled': disabled ? 'true' : null });\n tab.append(icon ? iconEl(icon) : '', h('span', 'op-tabs__title', {}, title));\n if (closable) tab.append(h('span', 'op-tabs__close', { 'aria-hidden': 'true', 'data-op-tip': t('close') }, iconEl('x')));\n this.tabs.set(p, tab);\n this.barEl.append(...[...this.items].filter((x) => this.tabs.has(x)).map((x) => this.tabs.get(x)!));\n }\n\n private syncHeaders(active?: Component) {\n for (const [p, tab] of this.tabs) {\n const on = p === active;\n tab.setAttribute('aria-selected', String(on));\n tab.classList.toggle('is-active', on);\n }\n const tab = active && this.tabs.get(active);\n this.rover?.sync(tab || undefined);\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n getActive(): Component | undefined {\n return this.getActiveItem();\n }\n\n /** Activates a tab (instance, id or index). `before-change` can cancel. */\n setActive(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n const prev = this.getActiveItem();\n if (!p || p === prev || this.tabConfig(p).disabled) return;\n if (this.emit('before-change', p, prev) === false) return;\n this.ensure(p);\n this.setActiveItem(p);\n this.emit('change', p, this.items.indexOf(p));\n }\n\n override insert(index: number, item: AnyConfig | Component | string): Component {\n const p = super.insert(index, item);\n if (this.rendered) {\n this.addHeader(p);\n this.ensure(p); // a tab added after render becomes the active one right away\n this.setActive(p);\n }\n return p;\n }\n\n /** Closes a tab (`before-close` can cancel). The neighbor becomes active. */\n closeTab(tab: Component | string | number): void {\n const p = typeof tab === 'number' ? this.items[tab] : typeof tab === 'string' ? this.items.find((x) => x.id === tab) : tab;\n if (!p || this.emit('before-close', p) === false) return;\n this.remove(p);\n this.emit('close', p);\n }\n\n override remove(child: Component | string | number, destroy = true): Component | undefined {\n const p = typeof child === 'number' ? this.items[child] : typeof child === 'string' ? this.items.find((x) => x.id === child) : child;\n const hadFocus = p && this.tabs.get(p)?.contains(document.activeElement);\n const removed = super.remove(child, destroy);\n if (p) {\n this.tabs.get(p)?.remove();\n this.tabs.delete(p);\n this.pending.delete(p);\n const active = this.getActiveItem();\n if (active) this.ensure(active);\n if (hadFocus && active) this.tabs.get(active)?.focus();\n }\n return removed;\n }\n\n /** Marks a tab header: a badge with the number of errors in its panel and a dot while something in it changed. */\n setTabState(tab: Component, state: { errors?: number; dirty?: boolean }): void {\n const el = this.tabs.get(tab);\n if (!el) return;\n el.classList.toggle('has-error', !!state.errors);\n el.classList.toggle('is-dirty', !!state.dirty);\n let badge = el.querySelector<HTMLElement>('.op-tabs__badge');\n if (!state.errors) return badge?.remove();\n if (!badge) {\n badge = h('span', 'op-tabs__badge');\n el.insertBefore(badge, el.querySelector('.op-tabs__close'));\n }\n badge.replaceChildren(String(state.errors), h('span', 'op-sr-only', {}, ` ${t('tabErrors')}`));\n }\n\n setTitle(tab: Component, title: string) {\n (tab.config as AnyConfig).title = title;\n const el = this.tabs.get(tab)?.querySelector('.op-tabs__title');\n if (el) el.textContent = title;\n }\n}\nregister('tabs', Tabs);\n"],
5
- "mappings": "2OAsBO,IAAMA,EAAN,cAAmBC,CAAsB,CAC3B,QAAU,UACrB,MACA,SACA,KAAO,IAAI,IACX,QAAU,IAAI,IACd,MAER,YAAYC,EAAqB,CAAC,EAAG,CACnC,MAAM,CAAE,YAAa,YAAa,GAAGA,CAAO,CAAC,CAC/C,CAES,SAAU,CACjB,OAAO,KAAK,QACd,CAEmB,OAAQ,CACzB,IAAMC,EAAO,KAAK,OAAO,WAAa,OAChCC,EAAKC,EAAE,MAAO,UAAUF,EAAO,iBAAmB,EAAE,EAAE,EAC5D,YAAK,MAAQE,EAAE,MAAO,eAAgB,CAAE,KAAM,UAAW,mBAAoBF,EAAO,WAAa,YAAa,CAAC,EAC/G,KAAK,SAAWE,EAAE,MAAO,iBAAiB,EAC1CD,EAAG,OAAO,KAAK,MAAO,KAAK,QAAQ,EAC5BA,CACT,CAEmB,UAAW,CAC5B,IAAME,EAAI,KAAK,OACfA,EAAE,OAAS,CAAE,KAAM,OAAQ,WAAYA,EAAE,QAAU,CAAE,EACrD,KAAK,MAAM,QAASC,GAAM,KAAK,UAAUA,CAAC,CAAC,EAC3C,KAAK,MAAQC,EAAO,KAAK,MAAO,CAC9B,SAAU,aACV,YAAaF,EAAE,WAAa,OAAS,WAAa,aAClD,OAASG,GAAQ,KAAK,UAAU,KAAK,MAAM,KAAMF,GAAM,KAAK,KAAK,IAAIA,CAAC,IAAME,CAAG,CAAE,CACnF,CAAC,EACD,KAAK,IAAI,IAAM,KAAK,OAAO,QAAQ,CAAC,EACpC,KAAK,GAAG,WAAaF,GAAkB,KAAK,YAAYA,CAAC,CAAC,EAC1D,KAAK,OAAO,KAAK,MAAO,QAAU,GAAa,CAC7C,IAAMG,EAAS,EAAE,OACXD,EAAMC,EAAO,QAAqB,YAAY,EAC9CC,EAAQ,KAAK,MAAM,KAAMJ,GAAM,KAAK,KAAK,IAAIA,CAAC,IAAME,CAAG,EACxDE,IACDD,EAAO,QAAQ,iBAAiB,EAAG,KAAK,SAASC,CAAK,EACrD,KAAK,UAAUA,CAAK,EAC3B,CAAC,EACD,KAAK,OAAO,KAAK,MAAO,UAAY,GAAqB,CACvD,IAAMA,EAAQ,KAAK,MAAM,KAAMJ,GAAM,KAAK,KAAK,IAAIA,CAAC,IAAO,EAAE,OAAuB,QAAQ,YAAY,CAAC,EACrG,EAAE,MAAQ,UAAYI,GAAO,KAAK,SAASA,CAAK,CACtD,CAAC,EACD,MAAM,SAAS,CACjB,CAEQ,QAGW,OAAOJ,EAAcK,EAAe,CACrD,GAAI,KAAK,OAAO,OAAS,IAASL,IAAM,KAAK,cAAc,GAAKA,IAAM,KAAK,QAAS,CAClF,KAAK,QAAQ,IAAIA,CAAC,EAClB,MACF,CACA,MAAM,OAAOA,EAAGK,CAAK,EACrBL,EAAE,GAAG,aAAa,OAAQ,UAAU,EACpC,IAAME,EAAM,KAAK,KAAK,IAAIF,CAAC,EACvBE,IACFF,EAAE,GAAG,aAAa,kBAAmBE,EAAI,EAAE,EAC3CA,EAAI,aAAa,gBAAiBF,EAAE,GAAG,EAAE,EAE7C,CAGQ,OAAOA,EAAc,CACtB,KAAK,QAAQ,OAAOA,CAAC,IAC1B,KAAK,QAAUA,EACf,KAAK,OAAOA,EAAG,KAAK,MAAM,QAAQA,CAAC,CAAC,EACpC,KAAK,QAAU,OACjB,CAEQ,UAAUA,EAAc,CAC9B,IAAMD,EAAIC,EAAE,OACZ,MAAO,CAAE,MAAQD,EAAE,OAAoB,GAAI,KAAMA,EAAE,KAA4B,SAAWA,EAAE,UAAwB,KAAK,OAAO,UAAY,GAAO,SAAU,CAAC,CAACA,EAAE,QAAS,CAC5K,CAEQ,UAAUC,EAAc,CAC9B,GAAM,CAAE,MAAAM,EAAO,KAAAC,EAAM,SAAAC,EAAU,SAAAC,CAAS,EAAI,KAAK,UAAUT,CAAC,EACtDE,EAAMJ,EAAE,MAAO,eAAgB,CAAE,KAAM,MAAO,GAAI,GAAGE,EAAE,EAAE,OAAQ,SAAU,GAAI,gBAAiB,QAAS,gBAAiBS,EAAW,OAAS,IAAK,CAAC,EAC1JP,EAAI,OAAOK,EAAOG,EAAOH,CAAI,EAAI,GAAIT,EAAE,OAAQ,iBAAkB,CAAC,EAAGQ,CAAK,CAAC,EACvEE,GAAUN,EAAI,OAAOJ,EAAE,OAAQ,iBAAkB,CAAE,cAAe,OAAQ,cAAea,EAAE,OAAO,CAAE,EAAGD,EAAO,GAAG,CAAC,CAAC,EACvH,KAAK,KAAK,IAAIV,EAAGE,CAAG,EACpB,KAAK,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,KAAK,EAAE,OAAQU,GAAM,KAAK,KAAK,IAAIA,CAAC,CAAC,EAAE,IAAKA,GAAM,KAAK,KAAK,IAAIA,CAAC,CAAE,CAAC,CACpG,CAEQ,YAAYC,EAAoB,CACtC,OAAW,CAACb,EAAGE,CAAG,IAAK,KAAK,KAAM,CAChC,IAAMY,EAAKd,IAAMa,EACjBX,EAAI,aAAa,gBAAiB,OAAOY,CAAE,CAAC,EAC5CZ,EAAI,UAAU,OAAO,YAAaY,CAAE,CACtC,CACA,IAAMZ,EAAMW,GAAU,KAAK,KAAK,IAAIA,CAAM,EAC1C,KAAK,OAAO,KAAKX,GAAO,MAAS,CACnC,CAIA,WAAmC,CACjC,OAAO,KAAK,cAAc,CAC5B,CAGA,UAAUA,EAAwC,CAChD,IAAMF,EAAI,OAAOE,GAAQ,SAAW,KAAK,MAAMA,CAAG,EAAI,OAAOA,GAAQ,SAAW,KAAK,MAAM,KAAMU,GAAMA,EAAE,KAAOV,CAAG,EAAIA,EACjHa,EAAO,KAAK,cAAc,EAC5B,CAACf,GAAKA,IAAMe,GAAQ,KAAK,UAAUf,CAAC,EAAE,UACtC,KAAK,KAAK,gBAAiBA,EAAGe,CAAI,IAAM,KAC5C,KAAK,OAAOf,CAAC,EACb,KAAK,cAAcA,CAAC,EACpB,KAAK,KAAK,SAAUA,EAAG,KAAK,MAAM,QAAQA,CAAC,CAAC,EAC9C,CAES,OAAOK,EAAeW,EAAiD,CAC9E,IAAMhB,EAAI,MAAM,OAAOK,EAAOW,CAAI,EAClC,OAAI,KAAK,WACP,KAAK,UAAUhB,CAAC,EAChB,KAAK,OAAOA,CAAC,EACb,KAAK,UAAUA,CAAC,GAEXA,CACT,CAGA,SAASE,EAAwC,CAC/C,IAAMF,EAAI,OAAOE,GAAQ,SAAW,KAAK,MAAMA,CAAG,EAAI,OAAOA,GAAQ,SAAW,KAAK,MAAM,KAAMU,GAAMA,EAAE,KAAOV,CAAG,EAAIA,EACnH,CAACF,GAAK,KAAK,KAAK,eAAgBA,CAAC,IAAM,KAC3C,KAAK,OAAOA,CAAC,EACb,KAAK,KAAK,QAASA,CAAC,EACtB,CAES,OAAOiB,EAAoCC,EAAU,GAA6B,CACzF,IAAMlB,EAAI,OAAOiB,GAAU,SAAW,KAAK,MAAMA,CAAK,EAAI,OAAOA,GAAU,SAAW,KAAK,MAAM,KAAML,GAAMA,EAAE,KAAOK,CAAK,EAAIA,EACzHE,EAAWnB,GAAK,KAAK,KAAK,IAAIA,CAAC,GAAG,SAAS,SAAS,aAAa,EACjEoB,EAAU,MAAM,OAAOH,EAAOC,CAAO,EAC3C,GAAIlB,EAAG,CACL,KAAK,KAAK,IAAIA,CAAC,GAAG,OAAO,EACzB,KAAK,KAAK,OAAOA,CAAC,EAClB,KAAK,QAAQ,OAAOA,CAAC,EACrB,IAAMa,EAAS,KAAK,cAAc,EAC9BA,GAAQ,KAAK,OAAOA,CAAM,EAC1BM,GAAYN,GAAQ,KAAK,KAAK,IAAIA,CAAM,GAAG,MAAM,CACvD,CACA,OAAOO,CACT,CAGA,YAAYlB,EAAgBmB,EAAmD,CAC7E,IAAMxB,EAAK,KAAK,KAAK,IAAIK,CAAG,EAC5B,GAAI,CAACL,EAAI,OACTA,EAAG,UAAU,OAAO,YAAa,CAAC,CAACwB,EAAM,MAAM,EAC/CxB,EAAG,UAAU,OAAO,WAAY,CAAC,CAACwB,EAAM,KAAK,EAC7C,IAAIC,EAAQzB,EAAG,cAA2B,iBAAiB,EAC3D,GAAI,CAACwB,EAAM,OAAQ,OAAOC,GAAO,OAAO,EACnCA,IACHA,EAAQxB,EAAE,OAAQ,gBAAgB,EAClCD,EAAG,aAAayB,EAAOzB,EAAG,cAAc,iBAAiB,CAAC,GAE5DyB,EAAM,gBAAgB,OAAOD,EAAM,MAAM,EAAGvB,EAAE,OAAQ,aAAc,CAAC,EAAG,IAAIa,EAAE,WAAW,CAAC,EAAE,CAAC,CAC/F,CAEA,SAAST,EAAgBI,EAAe,CACrCJ,EAAI,OAAqB,MAAQI,EAClC,IAAMT,EAAK,KAAK,KAAK,IAAIK,CAAG,GAAG,cAAc,iBAAiB,EAC1DL,IAAIA,EAAG,YAAcS,EAC3B,CACF,EACAiB,EAAS,OAAQ9B,CAAI",
6
- "names": ["Tabs", "Container", "config", "left", "el", "h", "c", "p", "roving", "tab", "target", "panel", "index", "title", "icon", "closable", "disabled", "iconEl", "t", "x", "active", "on", "prev", "item", "child", "destroy", "hadFocus", "removed", "state", "badge", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as l,b as h}from"./chunk-IYPKPLCU.js";import{b as M}from"./chunk-PZSHOSOS.js";var e=r=>`<path d="${r}"/>`,n={"chevron-down":e("m6 9 6 6 6-6"),"chevron-up":e("m18 15-6-6-6 6"),"chevron-left":e("m15 18-6-6 6-6"),"chevron-right":e("m9 18 6-6-6-6"),"chevrons-left":e("m11 17-5-5 5-5M18 17l-5-5 5-5"),"chevrons-right":e("m6 17 5-5-5-5M13 17l5-5-5-5"),x:e("M18 6 6 18M6 6l12 12"),check:e("M20 6 9 17l-5-5"),plus:e("M5 12h14M12 5v14"),minus:e("M5 12h14"),search:'<circle cx="11" cy="11" r="8"/>'+e("m21 21-4.3-4.3"),calendar:'<rect x="3" y="4" width="18" height="18" rx="2"/>'+e("M16 2v4M8 2v4M3 10h18"),info:'<circle cx="12" cy="12" r="10"/>'+e("M12 16v-4M12 8h.01"),alert:e("m21.7 18-8-14a2 2 0 0 0-3.5 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.7-3ZM12 9v4M12 17h.01"),error:'<circle cx="12" cy="12" r="10"/>'+e("m15 9-6 6M9 9l6 6"),success:'<circle cx="12" cy="12" r="10"/>'+e("m9 12 2 2 4-4"),menu:e("M4 6h16M4 12h16M4 18h16"),"arrow-up":e("m5 12 7-7 7 7M12 19V5"),"arrow-down":e("M12 5v14M19 12l-7 7-7-7"),columns:'<rect x="3" y="3" width="18" height="18" rx="2"/>'+e("M9 3v18M15 3v18"),filter:e("M22 3H2l8 9.5V19l4 2v-8.5z"),send:e("m22 2-7 20-4-9-9-4zM22 2 11 13"),sparkles:e("M12 3l1.9 5.6L19.5 10.5l-5.6 1.9L12 18l-1.9-5.6L4.5 10.5l5.6-1.9zM19 3v4M21 5h-4M5 17v4M7 19H3"),file:e("M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8zM14 2v6h6M8 13h8M8 17h8"),box:e("M21 8 12 3 3 8v8l9 5 9-5zM3 8l9 5 9-5M12 13v8"),truck:e("M1 3h15v13H1zM16 8h4l3 3v5h-7")+'<circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/>',clock:'<circle cx="12" cy="12" r="10"/>'+e("M12 6v6l4 2"),shield:e("M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"),list:e("M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"),eye:e("M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7S2 12 2 12z")+'<circle cx="12" cy="12" r="3"/>',"eye-off":e("M17.9 17.9A10.1 10.1 0 0 1 12 19c-6.4 0-10-7-10-7a18.5 18.5 0 0 1 5.1-5.9M9.9 5.2A9.7 9.7 0 0 1 12 5c6.4 0 10 7 10 7a18.5 18.5 0 0 1-2.2 3.2M14.1 14.1a3 3 0 1 1-4.2-4.2M2 2l20 20"),heart:e("M20.8 4.6a5.5 5.5 0 0 0-7.8 0L12 5.7l-1-1.1a5.5 5.5 0 0 0-7.8 7.8l1 1.1L12 21l7.8-7.5 1-1.1a5.5 5.5 0 0 0 0-7.8z"),image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/>'+e("m21 15-5-5L5 21"),cloud:e("M18 10h-1.3A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z"),folder:e("M4 4h5l2 3h9a1 1 0 0 1 1 1v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z"),share:e("M4 12v7a1 1 0 0 0 1 1h14a1 1 0 0 0 1-1v-7M16 6l-4-4-4 4M12 2v14"),message:e("M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"),more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',user:e("M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2")+'<circle cx="12" cy="7" r="4"/>',home:e("m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2zM9 22V12h6v10"),trash:e("M3 6h18M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6M10 11v6M14 11v6M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2"),edit:e("M12 20h9M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"),sun:'<circle cx="12" cy="12" r="4"/>'+e("M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"),moon:e("M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"),bell:e("M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9M10.3 21a1.9 1.9 0 0 0 3.4 0"),chart:e("M3 3v18h18M19 9l-5 5-4-4-3 3"),settings:'<circle cx="12" cy="12" r="3"/>'+e("M12 2v3M12 19v3M2 12h3M19 12h3M4.9 4.9 7 7M17 17l2.1 2.1M4.9 19.1 7 17M17 7l2.1-2.1"),users:e("M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2M23 21v-2a4 4 0 0 0-3-3.9M16 3.1a4 4 0 0 1 0 7.8")+'<circle cx="9" cy="7" r="4"/>'};function m(r){Object.assign(n,r)}var d=r=>r in n;function x(r,c){let t=M("span","op-icon");return i(t,r,c),t}function i(r,c,t){c&&!(c in n)&&console.warn(`Optikos: unknown icon "${c}" (register it with registerIcons)`);let o=n[c]??"";r.innerHTML=o.startsWith("<svg")?o:`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${o}</svg>`,t?(r.setAttribute("role","img"),r.setAttribute("aria-label",t),r.removeAttribute("aria-hidden")):(r.setAttribute("aria-hidden","true"),r.removeAttribute("role"),r.removeAttribute("aria-label"))}var s=class extends l{baseCls="op-icon";tag="span";onRender(){i(this.el,this.config.name??"",this.config.label)}setName(c){this.config.name=c,this.rendered&&i(this.el,c,this.config.label)}setLabel(c){this.config.label=c,this.rendered&&i(this.el,this.config.name??"",c)}};h("icon",s);export{m as a,d as b,x as c,s as d};
2
- //# sourceMappingURL=chunk-IHAYOSBR.js.map
@@ -1,2 +0,0 @@
1
- import{c as n}from"./chunk-IHAYOSBR.js";import{a as l,b as h}from"./chunk-IYPKPLCU.js";import{b as e}from"./chunk-PZSHOSOS.js";import{e as p}from"./chunk-MA5BJL3S.js";var o=class extends l{baseCls="op-stepper";tag="nav";list;active=0;states=[];onRender(){let t=this.config;this.active=t.active??0,this.el.setAttribute("aria-label",t.ariaLabel??p("stepSteps")),this.list=e("ol","op-stepper__list"),this.el.append(this.list),this.listen(this.list,"click",s=>{let i=s.target.closest(".op-stepper__btn");if(!i||i.disabled)return;let r=Number(i.dataset.i);this.emit("before-select",r)!==!1&&(this.setActive(r),this.emit("select",r))}),this.paint()}steps(){return this.config.steps??[]}paint(){this.list.replaceChildren(...this.steps().map((t,s)=>{let i=this.states[s]??"pending",r=s===this.active,d=e("span","op-stepper__marker",{"aria-hidden":"true"},i==="done"&&!r?n("check"):i==="error"?"!":t.icon?n(t.icon):String(s+1)),a=i==="done"&&!r?p("stepDone"):i==="error"?p("stepError"):"",c=e("button","op-stepper__btn",{type:"button","data-i":s,"aria-current":r?"step":null},d,e("span","op-stepper__text",{},e("span","op-stepper__title",{},t.title),t.description?e("span","op-stepper__desc",{},t.description):"",t.optional?e("span","op-stepper__opt",{},p("stepOptional")):"",a?e("span","op-sr-only",{},a):""));c.disabled=this.config.clickable===!1;let m=s===this.steps().length-1;return e("li",`op-stepper__step${r?" is-current":""}${i==="done"?" is-done":""}${i==="error"?" is-error":""}${t.optional?" is-optional":""}`,{},c,m?"":e("span","op-stepper__line",{"aria-hidden":"true"}))}))}setActive(t){this.active=Math.max(0,Math.min(t,this.steps().length-1)),this.config.active=this.active,this.rendered&&this.paint()}getActive(){return this.active}setStepState(t,s){this.states[t]=s,this.rendered&&this.paint()}getStepState(t){return this.states[t]??"pending"}setSteps(t){this.config.steps=t,this.states=[],this.rendered&&this.paint()}};h("stepper",o);export{o as a};
2
- //# sourceMappingURL=chunk-IO66A6G5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/navigation/stepper/stepper.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface Step {\n id?: string;\n title: string;\n description?: string;\n icon?: string;\n optional?: boolean;\n}\nexport type StepState = 'pending' | 'done' | 'error';\n\nexport interface StepperConfig extends ComponentConfig {\n steps?: Step[];\n active?: number;\n /** Steps can be clicked. Default true. */\n clickable?: boolean;\n}\n\n/** Where you are in a multi-step process: numbered steps with done / current / error states. */\nexport class Stepper extends Component<StepperConfig> {\n protected override baseCls = 'op-stepper';\n protected override tag = 'nav' as const;\n private list!: HTMLElement;\n private active = 0;\n private states: StepState[] = [];\n\n protected override onRender() {\n const c = this.config;\n this.active = c.active ?? 0;\n this.el.setAttribute('aria-label', c.ariaLabel ?? t('stepSteps'));\n this.list = h('ol', 'op-stepper__list');\n this.el.append(this.list);\n this.listen(this.list, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-stepper__btn');\n if (!b || b.disabled) return;\n const i = Number(b.dataset.i);\n if (this.emit('before-select', i) === false) return;\n this.setActive(i);\n this.emit('select', i);\n });\n this.paint();\n }\n\n private steps(): Step[] {\n return this.config.steps ?? [];\n }\n\n private paint() {\n this.list.replaceChildren(\n ...this.steps().map((s, i) => {\n const state = this.states[i] ?? 'pending';\n const current = i === this.active;\n const marker = h('span', 'op-stepper__marker', { 'aria-hidden': 'true' }, state === 'done' && !current ? iconEl('check') : state === 'error' ? '!' : s.icon ? iconEl(s.icon) : String(i + 1));\n const status = state === 'done' && !current ? t('stepDone') : state === 'error' ? t('stepError') : '';\n const btn = h('button', 'op-stepper__btn', { type: 'button', 'data-i': i, 'aria-current': current ? 'step' : null }, marker,\n h('span', 'op-stepper__text', {},\n h('span', 'op-stepper__title', {}, s.title),\n s.description ? h('span', 'op-stepper__desc', {}, s.description) : '',\n s.optional ? h('span', 'op-stepper__opt', {}, t('stepOptional')) : '',\n status ? h('span', 'op-sr-only', {}, status) : ''));\n btn.disabled = this.config.clickable === false;\n const last = i === this.steps().length - 1;\n return h('li', `op-stepper__step${current ? ' is-current' : ''}${state === 'done' ? ' is-done' : ''}${state === 'error' ? ' is-error' : ''}${s.optional ? ' is-optional' : ''}`, {}, btn, last ? '' : h('span', 'op-stepper__line', { 'aria-hidden': 'true' }));\n }),\n );\n }\n\n setActive(i: number) {\n this.active = Math.max(0, Math.min(i, this.steps().length - 1));\n this.config.active = this.active;\n if (this.rendered) this.paint();\n }\n getActive(): number {\n return this.active;\n }\n\n setStepState(i: number, state: StepState) {\n this.states[i] = state;\n if (this.rendered) this.paint();\n }\n getStepState(i: number): StepState {\n return this.states[i] ?? 'pending';\n }\n\n setSteps(steps: Step[]) {\n this.config.steps = steps;\n this.states = [];\n if (this.rendered) this.paint();\n }\n}\nregister('stepper', Stepper);\n"],
5
- "mappings": "uKAuBO,IAAMA,EAAN,cAAsBC,CAAyB,CACjC,QAAU,aACV,IAAM,MACjB,KACA,OAAS,EACT,OAAsB,CAAC,EAEZ,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACf,KAAK,OAASA,EAAE,QAAU,EAC1B,KAAK,GAAG,aAAa,aAAcA,EAAE,WAAaC,EAAE,WAAW,CAAC,EAChE,KAAK,KAAOC,EAAE,KAAM,kBAAkB,EACtC,KAAK,GAAG,OAAO,KAAK,IAAI,EACxB,KAAK,OAAO,KAAK,KAAM,QAAUC,GAAa,CAC5C,IAAMC,EAAKD,EAAE,OAAuB,QAA2B,kBAAkB,EACjF,GAAI,CAACC,GAAKA,EAAE,SAAU,OACtB,IAAMC,EAAI,OAAOD,EAAE,QAAQ,CAAC,EACxB,KAAK,KAAK,gBAAiBC,CAAC,IAAM,KACtC,KAAK,UAAUA,CAAC,EAChB,KAAK,KAAK,SAAUA,CAAC,EACvB,CAAC,EACD,KAAK,MAAM,CACb,CAEQ,OAAgB,CACtB,OAAO,KAAK,OAAO,OAAS,CAAC,CAC/B,CAEQ,OAAQ,CACd,KAAK,KAAK,gBACR,GAAG,KAAK,MAAM,EAAE,IAAI,CAACC,EAAGD,IAAM,CAC5B,IAAME,EAAQ,KAAK,OAAOF,CAAC,GAAK,UAC1BG,EAAUH,IAAM,KAAK,OACrBI,EAASP,EAAE,OAAQ,qBAAsB,CAAE,cAAe,MAAO,EAAGK,IAAU,QAAU,CAACC,EAAUE,EAAO,OAAO,EAAIH,IAAU,QAAU,IAAMD,EAAE,KAAOI,EAAOJ,EAAE,IAAI,EAAI,OAAOD,EAAI,CAAC,CAAC,EACtLM,EAASJ,IAAU,QAAU,CAACC,EAAUP,EAAE,UAAU,EAAIM,IAAU,QAAUN,EAAE,WAAW,EAAI,GAC7FW,EAAMV,EAAE,SAAU,kBAAmB,CAAE,KAAM,SAAU,SAAUG,EAAG,eAAgBG,EAAU,OAAS,IAAK,EAAGC,EACnHP,EAAE,OAAQ,mBAAoB,CAAC,EAC7BA,EAAE,OAAQ,oBAAqB,CAAC,EAAGI,EAAE,KAAK,EAC1CA,EAAE,YAAcJ,EAAE,OAAQ,mBAAoB,CAAC,EAAGI,EAAE,WAAW,EAAI,GACnEA,EAAE,SAAWJ,EAAE,OAAQ,kBAAmB,CAAC,EAAGD,EAAE,cAAc,CAAC,EAAI,GACnEU,EAAST,EAAE,OAAQ,aAAc,CAAC,EAAGS,CAAM,EAAI,EAAE,CAAC,EACtDC,EAAI,SAAW,KAAK,OAAO,YAAc,GACzC,IAAMC,EAAOR,IAAM,KAAK,MAAM,EAAE,OAAS,EACzC,OAAOH,EAAE,KAAM,mBAAmBM,EAAU,cAAgB,EAAE,GAAGD,IAAU,OAAS,WAAa,EAAE,GAAGA,IAAU,QAAU,YAAc,EAAE,GAAGD,EAAE,SAAW,eAAiB,EAAE,GAAI,CAAC,EAAGM,EAAKC,EAAO,GAAKX,EAAE,OAAQ,mBAAoB,CAAE,cAAe,MAAO,CAAC,CAAC,CAChQ,CAAC,CACH,CACF,CAEA,UAAUG,EAAW,CACnB,KAAK,OAAS,KAAK,IAAI,EAAG,KAAK,IAAIA,EAAG,KAAK,MAAM,EAAE,OAAS,CAAC,CAAC,EAC9D,KAAK,OAAO,OAAS,KAAK,OACtB,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,WAAoB,CAClB,OAAO,KAAK,MACd,CAEA,aAAaA,EAAWE,EAAkB,CACxC,KAAK,OAAOF,CAAC,EAAIE,EACb,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,aAAaF,EAAsB,CACjC,OAAO,KAAK,OAAOA,CAAC,GAAK,SAC3B,CAEA,SAASS,EAAe,CACtB,KAAK,OAAO,MAAQA,EACpB,KAAK,OAAS,CAAC,EACX,KAAK,UAAU,KAAK,MAAM,CAChC,CACF,EACAC,EAAS,UAAWjB,CAAO",
6
- "names": ["Stepper", "Component", "c", "t", "h", "e", "b", "i", "s", "state", "current", "marker", "iconEl", "status", "btn", "last", "steps", "register"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/core/component.ts", "../src/core/registry.ts"],
4
- "sourcesContent": ["import { Emitter, type Handler } from './emitter';\nimport { h, uid, kebab, px } from './dom';\nimport { t } from './i18n';\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 /** 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. */\n colspan?: number;\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 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 };\n this.id = config.id ?? uid('op');\n for (const k in config.listeners) this.on(k, config.listeners[k]);\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) 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.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;\n if (!this.rendered) return;\n this.el.classList.toggle('is-disabled', disabled);\n this.onDisabled(disabled);\n }\n\n show(): void {\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", "import type { Component, ComponentConfig } from './component';\n\nexport type ComponentClass = { new (config: any): Component<any>; type?: string };\n/** Config accepted by `create` and `items`: the base keys plus whatever the chosen `type` understands. */\nexport type AnyConfig = ComponentConfig & Record<string, any>;\n\nconst types = new Map<string, ComponentClass>();\n\n/** Registers a component class under a `type`. Users register their own the same way. */\nexport function register(type: string, cls: ComponentClass): void {\n cls.type = type;\n types.set(type, cls);\n}\n\nexport const getType = (type: string): ComponentClass | undefined => types.get(type);\n\n/** Builds a component from a config (or passes an instance through). `renderTo` mounts it. */\nexport function create<T extends Component = Component>(config: AnyConfig | Component): T {\n if (typeof (config as Component).render === 'function') return config as T;\n const cfg = config as AnyConfig;\n const Cls = cfg.type ? types.get(cfg.type) : undefined;\n if (!Cls) throw new Error(`Optikos: unknown component type \"${cfg.type}\". Did you import or register it?`);\n const cmp = new Cls(cfg) as T;\n if (cfg.renderTo) cmp.mount(cfg.renderTo);\n return cmp;\n}\n"],
5
- "mappings": "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",
6
- "names": ["Component", "Emitter", "config", "uid", "k", "h", "el", "c", "kebab", "px", "target", "parent", "d", "fn", "type", "opts", "ms", "id", "_disabled", "disabled", "name", "on", "v", "stable", "text", "theme", "prefix", "loading", "t", "child", "types", "register", "type", "cls", "getType", "create", "config", "cfg", "Cls", "cmp"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as p}from"./chunk-MA5BJL3S.js";var y=0;function g(r,i){return r==null||!i?.type?r:i.type==="number"?r===""?null:Number(r):i.type==="boolean"?r==="false"?!1:!!r:String(r)}var d=class{constructor(i={},e={}){this.def=e;let t={...i};for(let s in e.fields){let o=e.fields[s];t[s]=g(t[s]===void 0?o.default:t[s],o)}this.data=t,this.phantom=this.data[e.idField??"id"]===void 0}def;data;phantom;owner;clientId=`c${++y}`;original={};get id(){return this.data[this.def.idField??"id"]??this.clientId}get(i){return this.data[i]}set(i,e){let t=g(e,this.def.fields?.[i]);this.data[i]!==t&&(i in this.original||(this.original[i]=this.data[i]),this.data[i]=t,this.owner?.recordChanged(this,i))}isDirty(){return Object.keys(this.original).length>0}getChanges(){let i={};for(let e in this.original)i[e]=this.data[e];return i}commit(){this.original={},this.phantom=!1}reject(){Object.assign(this.data,this.original),this.original={}}};var v=(r,i)=>r==null?i==null?0:1:i==null?-1:typeof r=="string"&&typeof i=="string"?r.localeCompare(i,void 0,{numeric:!0}):r<i?-1:r>i?1:0,l=r=>String(r??"").toLowerCase(),c=r=>r==null||r===""||Array.isArray(r)&&!r.length,T=/^\d{4}-\d{2}-\d{2}(T[\d:.]+Z?)?$/,n=r=>r instanceof Date?r.getTime():typeof r=="string"&&T.test(r)?Date.parse(r):r;function b(r,i){let e=r.value,t=n(i),s=()=>!c(i)&&t>=n(e[0])&&t<=n(e[1]),o=()=>e.some(a=>n(a)==t);switch(r.op??"eq"){case"eq":return t==n(e);case"ne":return t!=n(e);case"contains":return l(i).includes(l(e));case"notContains":return!l(i).includes(l(e));case"startsWith":return l(i).startsWith(l(e));case"endsWith":return l(i).endsWith(l(e));case"gt":return t>n(e);case"ge":return t>=n(e);case"lt":return t<n(e);case"le":return t<=n(e);case"between":return s();case"notBetween":return!s();case"in":return o();case"nin":return!o();case"empty":return c(i);case"notEmpty":return!c(i)}}function u(r,i){return"filters"in r?r.filters.length?r.op==="or"?r.filters.some(e=>u(e,i)):r.filters.every(e=>u(e,i)):!0:b(r,i[r.field])}var f=class extends p{constructor(e={}){super();this.cfg=e;this.sorters=e.sorters??[],this.pageLen=e.pageSize??0;for(let t in e.listeners)this.on(t,e.listeners[t]);e.proxy&&(this.proxy=typeof e.proxy=="function"?{read:e.proxy}:e.proxy),e.data&&this.setRecords(e.data.map(t=>this.wrap(t)),e.data.length),e.autoLoad&&this.proxy&&this.load()}cfg;all=[];rows=[];visible=[];removed=[];sorters;filters=[];params={};proxy;pageNo=1;pageLen;total=0;abort;loading=!1;get remote(){return!!this.cfg.remote&&!!this.proxy}wrap(e){let t=e instanceof d?e:new d(e,this.cfg.model);return t.owner=this,t}fire(e,...t){this.emit(e,...t),this.emit("change",{type:e})}get count(){return this.visible.length}get totalCount(){return this.remote?this.total:this.rows.length}getFiltered(){return this.rows}getAt(e){return this.visible[e]}getRange(e=0,t=this.visible.length){return this.visible.slice(e,t)}getById(e){return this.all.find(t=>t.id===e)}indexOf(e){return this.visible.indexOf(e)}getData(){return this.visible.map(e=>e.data)}each(e){this.visible.forEach(e)}loadData(e){this.removed=[],this.setRecords(e.map(t=>this.wrap(t)),e.length),this.fire("load")}async load(e){if(!this.proxy)throw new Error("Optikos Store: load() needs a proxy");e&&(this.params=e);let t={...this.params};if(this.remote&&Object.assign(t,{page:this.pageNo,pageSize:this.pageLen||void 0,sorters:this.sorters,filters:this.filters.filter(o=>typeof o!="function")}),this.emit("before-load",t)===!1)return;this.abort?.abort();let s=this.abort=new AbortController;this.loading=!0,this.emit("loading",!0);try{let o=await this.proxy.read(t,s.signal);if(s.signal.aborted)return;let{data:a,total:h}=Array.isArray(o)?{data:o,total:o.length}:o;this.removed=[],this.setRecords(a.map(m=>this.wrap(m)),h??a.length),this.loading=!1,this.emit("loading",!1),this.fire("load")}catch(o){if(s.signal.aborted)return;this.loading=!1,this.emit("loading",!1),this.emit("load-error",o)}}setRecords(e,t){this.all=e,this.total=t,this.refreshView()}refreshView(){if(this.remote){this.rows=this.visible=this.all;return}let e=this.all;this.filters.length&&(e=e.filter(s=>this.filters.every(o=>typeof o=="function"?o(s):u(o,s.data)))),this.sorters.length&&(e=[...e].sort((s,o)=>{for(let a of this.sorters){let h=v(s.data[a.field],o.data[a.field]);if(h)return a.dir==="desc"?-h:h}return 0})),this.rows=e;let t=this.pageCount;this.pageNo>t&&(this.pageNo=t),this.visible=this.pageLen?e.slice((this.pageNo-1)*this.pageLen,this.pageNo*this.pageLen):e}getSorters(){return this.sorters}sort(e,t){let s=this.sorters[0];this.sorters=e?[{field:e,dir:t??(s?.field===e&&s.dir==="asc"?"desc":"asc")}]:[],this.pageNo=1,this.changeView("sort")}filter(e){return this.filters=Array.isArray(e)?e:[e],this.pageNo=1,this.changeView("filter")}clearFilter(){return this.filters=[],this.pageNo=1,this.changeView("filter")}getFilters(){return this.filters.filter(e=>typeof e!="function")}changeView(e){return this.remote?this.load():(this.refreshView(),this.fire(e),Promise.resolve())}get page(){return this.pageNo}get pageSize(){return this.pageLen}get pageCount(){return this.pageLen?Math.max(1,Math.ceil(this.totalCount/this.pageLen)):1}setPage(e){e=Math.min(Math.max(1,e),this.pageCount),e!==this.pageNo&&(this.pageNo=e,this.remote?this.load():(this.refreshView(),this.fire("page")))}setPageSize(e){this.pageLen=e,this.pageNo=1,this.changeView("page")}add(e){let t=(Array.isArray(e)?e:[e]).map(s=>this.wrap(s));return this.all=[...this.all,...t],this.total+=t.length,this.refreshView(),this.fire("add",t),t}insert(e,t){let s=this.wrap(t);return this.all=[...this.all.slice(0,e),s,...this.all.slice(e)],this.total++,this.refreshView(),this.fire("add",[s]),s}remove(e){let s=(Array.isArray(e)?e:[typeof e=="number"?this.visible[e]:e]).filter(o=>o&&this.all.includes(o));s.length&&(this.all=this.all.filter(o=>!s.includes(o)),this.removed.push(...s.filter(o=>!o.phantom)),this.total-=s.length,this.refreshView(),this.fire("remove",s))}clear(){this.removed.push(...this.all.filter(e=>!e.phantom)),this.setRecords([],0),this.fire("remove",[])}recordChanged(e,t){(this.sorters.some(s=>s.field===t)||this.filters.length)&&this.refreshView(),this.fire("update",e,t)}getModified(){return this.all.filter(e=>e.phantom||e.isDirty())}getRemoved(){return this.removed}commitChanges(){this.all.forEach(e=>e.commit()),this.removed=[]}async sync(){let e=this.proxy;if(!e)throw new Error("Optikos Store: sync() needs a proxy");for(let t of this.removed)await e.destroy?.(t.data);this.removed=[];for(let t of this.all){if(t.phantom)Object.assign(t.data,await e.create?.(t.data)??{});else if(t.isDirty())Object.assign(t.data,await e.update?.(t.data)??{});else continue;t.commit()}this.fire("sync")}subscribe(e){return this.on("change",e)}};export{d as a,u as b,f as c};
2
- //# sourceMappingURL=chunk-JTYWZMSZ.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/data/model.ts", "../src/data/store.ts"],
4
- "sourcesContent": ["export interface FieldDef {\n type?: 'string' | 'number' | 'boolean';\n default?: unknown;\n}\nexport interface ModelDef {\n idField?: string;\n fields?: Record<string, FieldDef>;\n}\n\nexport interface RecordOwner {\n recordChanged(rec: Model, field: string): void;\n}\n\nlet cid = 0;\n\nfunction convert(v: unknown, def?: FieldDef): unknown {\n if (v == null || !def?.type) return v;\n if (def.type === 'number') return v === '' ? null : Number(v);\n if (def.type === 'boolean') return v === 'false' ? false : Boolean(v);\n return String(v);\n}\n\n/** One record. `data` holds the values; `set` tracks the original value of each changed field. */\nexport class Model<T extends Record<string, any> = Record<string, any>> {\n data: T;\n phantom: boolean;\n owner?: RecordOwner;\n private readonly clientId = `c${++cid}`;\n private original: Partial<T> = {};\n\n constructor(raw: Partial<T> = {}, private def: ModelDef = {}) {\n const data: Record<string, unknown> = { ...raw };\n for (const f in def.fields) {\n const fd = def.fields[f];\n data[f] = convert(data[f] === undefined ? fd.default : data[f], fd);\n }\n this.data = data as T;\n this.phantom = this.data[def.idField ?? 'id'] === undefined;\n }\n\n get id(): string | number {\n return this.data[this.def.idField ?? 'id'] ?? this.clientId;\n }\n\n get<K extends keyof T>(field: K): T[K] {\n return this.data[field];\n }\n\n set<K extends keyof T>(field: K, value: T[K]): void {\n const v = convert(value, this.def.fields?.[field as string]) as T[K];\n if (this.data[field] === v) return;\n if (!(field in this.original)) this.original[field] = this.data[field];\n this.data[field] = v;\n this.owner?.recordChanged(this as Model, field as string);\n }\n\n isDirty(): boolean {\n return Object.keys(this.original).length > 0;\n }\n getChanges(): Partial<T> {\n const out: Partial<T> = {};\n for (const k in this.original) out[k] = this.data[k];\n return out;\n }\n commit(): void {\n this.original = {};\n this.phantom = false;\n }\n reject(): void {\n Object.assign(this.data, this.original);\n this.original = {};\n }\n}\n", "import { Emitter } from '../core/emitter';\nimport { Model, type ModelDef, type RecordOwner } from './model';\nimport type { FilterNode, FilterSpec, Proxy, ReadParams, ReadResult, Sorter } from './proxy';\n\nexport type StoreProxy<T> = Proxy<T> | ((params: ReadParams, signal?: AbortSignal) => Promise<ReadResult<T> | T[]> | ReadResult<T> | T[]);\nexport type FilterFn<T extends Record<string, any>> = (rec: Model<T>) => boolean;\n\nexport interface StoreConfig<T extends Record<string, any>> {\n data?: Partial<T>[];\n model?: ModelDef;\n proxy?: StoreProxy<T>;\n /** 0 = no paging. */\n pageSize?: number;\n /** Sort, filter and paging are done by the proxy (it receives them in `read`). Default false: done locally. */\n remote?: boolean;\n sorters?: Sorter[];\n autoLoad?: boolean;\n listeners?: Record<string, (...a: any[]) => unknown>;\n}\n\nconst cmp = (a: any, b: any) => (a == null ? (b == null ? 0 : 1) : b == null ? -1 : typeof a === 'string' && typeof b === 'string' ? a.localeCompare(b, undefined, { numeric: true }) : a < b ? -1 : a > b ? 1 : 0);\n\nconst text = (v: any) => String(v ?? '').toLowerCase();\nconst empty = (v: any) => v == null || v === '' || (Array.isArray(v) && !v.length);\nconst ISO = /^\\d{4}-\\d{2}-\\d{2}(T[\\d:.]+Z?)?$/;\n/** Dates (Date objects or ISO strings) compare by time; anything else compares as is. */\nconst num = (v: any) => (v instanceof Date ? v.getTime() : typeof v === 'string' && ISO.test(v) ? Date.parse(v) : v);\n\nfunction test(spec: FilterSpec, raw: any): boolean {\n const x = spec.value as any;\n const v = num(raw);\n const between = () => !empty(raw) && v >= num(x[0]) && v <= num(x[1]);\n const listed = () => (x as unknown[]).some((i) => num(i) == v);\n switch (spec.op ?? 'eq') {\n case 'eq': return v == num(x);\n case 'ne': return v != num(x);\n case 'contains': return text(raw).includes(text(x));\n case 'notContains': return !text(raw).includes(text(x));\n case 'startsWith': return text(raw).startsWith(text(x));\n case 'endsWith': return text(raw).endsWith(text(x));\n case 'gt': return v > num(x);\n case 'ge': return v >= num(x);\n case 'lt': return v < num(x);\n case 'le': return v <= num(x);\n case 'between': return between();\n case 'notBetween': return !between();\n case 'in': return listed();\n case 'nin': return !listed();\n case 'empty': return empty(raw);\n case 'notEmpty': return !empty(raw);\n }\n}\n\n/** Does a record's data satisfy a filter node? Groups are AND/OR; an empty group matches everything. */\nexport function matchFilter(node: FilterNode, data: Record<string, any>): boolean {\n if ('filters' in node) {\n if (!node.filters.length) return true;\n return node.op === 'or' ? node.filters.some((f) => matchFilter(f, data)) : node.filters.every((f) => matchFilter(f, data));\n }\n return test(node, data[node.field]);\n}\n\n/**\n * Records + a view over them (filtered, sorted, paged). Events: `load`, `before-load`, `load-error`, `add`, `remove`,\n * `update`, `sort`, `filter`, `page`, `sync`, and `change` for any of them (payload `{ type }`).\n */\nexport class Store<T extends Record<string, any> = Record<string, any>> extends Emitter implements RecordOwner {\n private all: Model<T>[] = [];\n private rows: Model<T>[] = [];\n private visible: Model<T>[] = [];\n private removed: Model<T>[] = [];\n private sorters: Sorter[];\n private filters: Array<FilterNode | FilterFn<T>> = [];\n private params: Record<string, unknown> = {};\n private proxy?: Proxy<T>;\n private pageNo = 1;\n private pageLen: number;\n private total = 0;\n private abort?: AbortController;\n loading = false;\n\n constructor(private cfg: StoreConfig<T> = {}) {\n super();\n this.sorters = cfg.sorters ?? [];\n this.pageLen = cfg.pageSize ?? 0;\n for (const k in cfg.listeners) this.on(k, cfg.listeners[k]);\n if (cfg.proxy) this.proxy = typeof cfg.proxy === 'function' ? { read: cfg.proxy } : cfg.proxy;\n if (cfg.data) this.setRecords(cfg.data.map((r) => this.wrap(r)), cfg.data.length);\n if (cfg.autoLoad && this.proxy) void this.load();\n }\n\n private get remote() {\n return !!this.cfg.remote && !!this.proxy;\n }\n private wrap(raw: Partial<T> | Model<T>): Model<T> {\n const m = raw instanceof Model ? raw : new Model<T>(raw, this.cfg.model);\n m.owner = this;\n return m;\n }\n private fire(type: string, ...args: unknown[]) {\n this.emit(type, ...args);\n this.emit('change', { type });\n }\n\n // ---- reading -------------------------------------------------------------------------------\n\n /** Number of records in the current view (the current page). */\n get count(): number {\n return this.visible.length;\n }\n /** Records matching the filters, across pages (remote: what the server reported). */\n get totalCount(): number {\n return this.remote ? this.total : this.rows.length;\n }\n /** Every record matching the filters, across pages (a remote store only knows the loaded page). */\n getFiltered(): Model<T>[] {\n return this.rows;\n }\n getAt(i: number): Model<T> | undefined {\n return this.visible[i];\n }\n getRange(start = 0, end = this.visible.length): Model<T>[] {\n return this.visible.slice(start, end);\n }\n getById(id: string | number): Model<T> | undefined {\n return this.all.find((r) => r.id === id);\n }\n indexOf(rec: Model<T>): number {\n return this.visible.indexOf(rec);\n }\n /** Plain data of the current view. */\n getData(): T[] {\n return this.visible.map((r) => r.data);\n }\n each(fn: (rec: Model<T>, i: number) => void): void {\n this.visible.forEach(fn);\n }\n\n // ---- loading -------------------------------------------------------------------------------\n\n /** Replaces all records with local data. */\n loadData(data: Partial<T>[]): void {\n this.removed = [];\n this.setRecords(data.map((r) => this.wrap(r)), data.length);\n this.fire('load');\n }\n\n /** Reads through the proxy. Extra `params` are sent to it and remembered for later reloads. A newer load cancels the older one. */\n async load(params?: Record<string, unknown>): Promise<void> {\n if (!this.proxy) throw new Error('Optikos Store: load() needs a proxy');\n if (params) this.params = params;\n const req: ReadParams = { ...this.params };\n if (this.remote) Object.assign(req, { page: this.pageNo, pageSize: this.pageLen || undefined, sorters: this.sorters, filters: this.filters.filter((f): f is FilterNode => typeof f !== 'function') });\n if (this.emit('before-load', req) === false) return;\n this.abort?.abort();\n const ctl = (this.abort = new AbortController());\n this.loading = true;\n this.emit('loading', true);\n try {\n const res = await this.proxy.read(req, ctl.signal);\n if (ctl.signal.aborted) return;\n const { data, total } = Array.isArray(res) ? { data: res, total: res.length } : res;\n this.removed = [];\n this.setRecords(data.map((r) => this.wrap(r)), total ?? data.length);\n this.loading = false;\n this.emit('loading', false);\n this.fire('load');\n } catch (err) {\n if (ctl.signal.aborted) return;\n this.loading = false;\n this.emit('loading', false);\n this.emit('load-error', err);\n }\n }\n\n private setRecords(recs: Model<T>[], total: number) {\n this.all = recs;\n this.total = total;\n this.refreshView();\n }\n\n /** Recomputes filtered/sorted/paged rows from `all`. */\n private refreshView() {\n if (this.remote) {\n this.rows = this.visible = this.all;\n return;\n }\n let rows = this.all;\n if (this.filters.length) rows = rows.filter((r) => this.filters.every((f) => (typeof f === 'function' ? f(r) : matchFilter(f, r.data))));\n if (this.sorters.length) {\n rows = [...rows].sort((a, b) => {\n for (const s of this.sorters) {\n const d = cmp(a.data[s.field], b.data[s.field]);\n if (d) return s.dir === 'desc' ? -d : d;\n }\n return 0;\n });\n }\n this.rows = rows;\n const pages = this.pageCount;\n if (this.pageNo > pages) this.pageNo = pages;\n this.visible = this.pageLen ? rows.slice((this.pageNo - 1) * this.pageLen, this.pageNo * this.pageLen) : rows;\n }\n\n // ---- sort / filter / paging ----------------------------------------------------------------\n\n getSorters(): Sorter[] {\n return this.sorters;\n }\n /** `sort('name')` toggles asc/desc when already sorted by it; `sort('name', 'desc')` is explicit; `sort(null)` clears. */\n sort(field: string | null, dir?: 'asc' | 'desc'): void {\n const cur = this.sorters[0];\n this.sorters = field ? [{ field, dir: dir ?? (cur?.field === field && cur.dir === 'asc' ? 'desc' : 'asc') }] : [];\n this.pageNo = 1;\n this.changeView('sort');\n }\n\n /**\n * Replaces the filters (top level = AND). Accepts specs, groups (`{ op: 'or', filters }`), or a predicate.\n * Resolves when the view is up to date (for a remote store, after the reload).\n */\n filter(f: FilterNode | FilterNode[] | FilterFn<T>): Promise<void> {\n this.filters = Array.isArray(f) ? f : [f];\n this.pageNo = 1;\n return this.changeView('filter');\n }\n clearFilter(): Promise<void> {\n this.filters = [];\n this.pageNo = 1;\n return this.changeView('filter');\n }\n /** The active filter nodes (predicates are not included). */\n getFilters(): FilterNode[] {\n return this.filters.filter((f): f is FilterNode => typeof f !== 'function');\n }\n\n private changeView(type: string): Promise<void> {\n if (this.remote) return this.load();\n this.refreshView();\n this.fire(type);\n return Promise.resolve();\n }\n\n get page(): number {\n return this.pageNo;\n }\n get pageSize(): number {\n return this.pageLen;\n }\n get pageCount(): number {\n return this.pageLen ? Math.max(1, Math.ceil(this.totalCount / this.pageLen)) : 1;\n }\n setPage(n: number): void {\n n = Math.min(Math.max(1, n), this.pageCount);\n if (n === this.pageNo) return;\n this.pageNo = n;\n if (this.remote) void this.load();\n else {\n this.refreshView();\n this.fire('page');\n }\n }\n setPageSize(n: number): void {\n this.pageLen = n;\n this.pageNo = 1;\n this.changeView('page');\n }\n\n // ---- editing -------------------------------------------------------------------------------\n\n add(raw: Partial<T> | Partial<T>[]): Model<T>[] {\n const recs = (Array.isArray(raw) ? raw : [raw]).map((r) => this.wrap(r));\n this.all = [...this.all, ...recs];\n this.total += recs.length;\n this.refreshView();\n this.fire('add', recs);\n return recs;\n }\n\n insert(index: number, raw: Partial<T>): Model<T> {\n const rec = this.wrap(raw);\n this.all = [...this.all.slice(0, index), rec, ...this.all.slice(index)];\n this.total++;\n this.refreshView();\n this.fire('add', [rec]);\n return rec;\n }\n\n remove(target: Model<T> | number | Array<Model<T>>): void {\n const list = Array.isArray(target) ? target : [typeof target === 'number' ? this.visible[target] : target];\n const gone = list.filter((r) => r && this.all.includes(r));\n if (!gone.length) return;\n this.all = this.all.filter((r) => !gone.includes(r));\n this.removed.push(...gone.filter((r) => !r.phantom));\n this.total -= gone.length;\n this.refreshView();\n this.fire('remove', gone);\n }\n\n clear(): void {\n this.removed.push(...this.all.filter((r) => !r.phantom));\n this.setRecords([], 0);\n this.fire('remove', []);\n }\n\n recordChanged(rec: Model, field: string): void {\n if (this.sorters.some((s) => s.field === field) || this.filters.length) this.refreshView();\n this.fire('update', rec, field);\n }\n\n getModified(): Model<T>[] {\n return this.all.filter((r) => r.phantom || r.isDirty());\n }\n getRemoved(): Model<T>[] {\n return this.removed;\n }\n commitChanges(): void {\n this.all.forEach((r) => r.commit());\n this.removed = [];\n }\n\n /** Writes pending changes through the proxy: deletes, then creates and updates, one at a time. */\n async sync(): Promise<void> {\n const p = this.proxy;\n if (!p) throw new Error('Optikos Store: sync() needs a proxy');\n for (const r of this.removed) await p.destroy?.(r.data);\n this.removed = [];\n for (const r of this.all) {\n if (r.phantom) Object.assign(r.data, (await p.create?.(r.data)) ?? {});\n else if (r.isDirty()) Object.assign(r.data, (await p.update?.(r.data)) ?? {});\n else continue;\n r.commit();\n }\n this.fire('sync');\n }\n\n /** Observable interface used by `optikos/bind`: calls `fn` on any change; returns the unsubscribe function. */\n subscribe(fn: (change: { type: string }) => void): () => void {\n return this.on('change', fn);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["cid", "convert", "v", "def", "Model", "raw", "data", "f", "fd", "field", "value", "out", "k", "cmp", "a", "b", "text", "v", "empty", "ISO", "num", "test", "spec", "raw", "x", "between", "listed", "i", "matchFilter", "node", "data", "f", "Store", "Emitter", "cfg", "k", "r", "m", "Model", "type", "args", "start", "end", "id", "rec", "fn", "params", "req", "ctl", "res", "total", "err", "recs", "rows", "s", "d", "pages", "field", "dir", "cur", "n", "index", "target", "gone", "p"]
7
- }
@@ -1,2 +0,0 @@
1
- import{c as n}from"./chunk-UPOBGNJ5.js";import{a}from"./chunk-K2DGY6MP.js";import{b as l}from"./chunk-IYPKPLCU.js";var u=(o,t)=>t.split(".").reduce((e,i)=>e?.[i],o);function y(o,t,e){let i=t.split("."),s=i.pop(),d=i.reduce((f,c)=>f[c]??={},o);d[s]=e}var r=class extends n{baseCls="op-form";tag="form";constructor(t={}){let e=[...t.items??[]];t.tabs&&e.push({type:"tabs",flex:1,items:t.tabs.map(i=>({type:"container",title:i.title,icon:i.icon,cls:"op-form__tab",layout:i.layout??{type:"grid",columns:2,gap:12},items:i.items}))}),super({...t,items:e})}build(){let t=super.build();return t.setAttribute("novalidate",""),t}onRender(){if(this.config.layout??={type:"vbox"},this.config.labelPos)for(let t of this.getFields())t.config.labelPos??=this.config.labelPos;super.onRender(),this.config.readonly&&this.setReadonly(!0);for(let t of this.getFields())for(let e of["invalid","valid","dirty-change","change"])t.on(e,()=>this.syncTabs());this.listen(this.el,"submit",t=>{t.preventDefault(),this.submit()}),this.listen(this.el,"keydown",t=>{let e=t.target;t.key==="Enter"&&e instanceof HTMLInputElement&&!t.defaultPrevented&&e.type!=="button"&&(t.preventDefault(),this.submit())})}getFields(){return this.query(t=>t instanceof a)}getField(t){return this.getFields().find(e=>e.name===t)}getValues(t={}){let e={};for(let i of this.getFields())i.name&&(!t.dirtyOnly||i.isDirty())&&y(e,i.name,i.getValue());return e}setValues(t){for(let e of this.getFields()){let i=e.name?u(t,e.name):void 0;i!==void 0&&e.setValue(i,!0)}}load(t){this.setValues("data"in t&&"get"in t?t.data:t),this.markClean(),this.clearErrors(),this.emit("load",t)}reveal(t){let e=t;for(;e.parent;){let i=e.parent;i.items?.includes(e)&&(typeof i.setActive=="function"?i.setActive(e):i.layout?.activate&&i.layout.activate(i,e)),e=i}}syncTabs(){for(let t of this.query(e=>typeof e.setTabState=="function"))for(let e of t.items){let i=e instanceof n?e.query(s=>s instanceof a):[];t.setTabState(e,{errors:i.filter(s=>s.getError()).length,dirty:i.some(s=>s.isDirty())})}}updateRecord(t){let e=this.getValues(),i=new Set(this.getFields().filter(s=>s.name&&s.isDirty()).map(s=>s.name.split(".")[0]));for(let s of i)t.set(s,e[s])}markClean(){this.getFields().forEach(t=>t.markClean()),this.syncTabs()}reset(){this.getFields().forEach(t=>t.reset()),this.syncTabs()}isDirty(){return this.getFields().some(t=>t.isDirty())}isValid(){return this.getFields().every(t=>t.isValid())}clearErrors(){this.getFields().forEach(t=>t.clearError()),this.syncTabs()}validate(){let t=this.getFields().filter(e=>!e.validate());return this.syncTabs(),t.length&&(this.reveal(t[0]),t[0].focus(),this.emit("invalid",t)),this.el.classList.toggle("is-invalid",!!t.length),!t.length}submit(){return this.emit("before-submit")===!1||!this.validate()?!1:(this.emit("submit",this.getValues()),!0)}setReadonly(t){this.config.readonly=t,this.getFields().forEach(e=>e.setReadonly(t))}};l("form",r);export{r as a};
2
- //# sourceMappingURL=chunk-JVEPKW5X.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/form/form/form.ts"],
4
- "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport type { Model } from '../../../data/model';\nimport type { Component } from '../../../core/component';\nimport type { LayoutSpec } from '../../../layout/layout';\n\nexport interface FormTab {\n title: string;\n icon?: string;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface FormConfig extends ContainerConfig {\n /** Shortcut: the fields in tabs, still one form (one `getValues`, one `validate`, one dirty). */\n tabs?: FormTab[];\n /** Default `labelPos` for fields that do not set their own. */\n labelPos?: 'top' | 'left';\n readonly?: boolean;\n}\n\nconst getPath = (o: any, path: string) => path.split('.').reduce((v, k) => v?.[k], o);\nfunction setPath(o: any, path: string, value: unknown) {\n const keys = path.split('.');\n const last = keys.pop()!;\n const target = keys.reduce((v, k) => (v[k] ??= {}), o);\n target[last] = value;\n}\n\nexport class Form extends Container<FormConfig> {\n protected override baseCls = 'op-form';\n protected override tag = 'form' as const;\n\n constructor(config: FormConfig = {}) {\n const items = [...(config.items ?? [])];\n if (config.tabs) {\n items.push({\n type: 'tabs',\n flex: 1,\n items: config.tabs.map((t) => ({ type: 'container', title: t.title, icon: t.icon, cls: 'op-form__tab', layout: t.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: t.items })),\n } as never);\n }\n super({ ...config, items });\n }\n\n protected override build() {\n const el = super.build();\n el.setAttribute('novalidate', '');\n return el;\n }\n\n protected override onRender() {\n this.config.layout ??= { type: 'vbox' };\n if (this.config.labelPos) for (const f of this.getFields()) f.config.labelPos ??= this.config.labelPos;\n super.onRender();\n if (this.config.readonly) this.setReadonly(true);\n for (const f of this.getFields()) for (const ev of ['invalid', 'valid', 'dirty-change', 'change']) f.on(ev, () => this.syncTabs());\n // Native submit (a `type=submit` button) and Enter inside a single-line field both go through submit().\n this.listen(this.el, 'submit', (e: Event) => {\n e.preventDefault();\n this.submit();\n });\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n const t = e.target as HTMLElement;\n if (e.key === 'Enter' && t instanceof HTMLInputElement && !e.defaultPrevented && t.type !== 'button') {\n e.preventDefault();\n this.submit();\n }\n });\n }\n\n getFields(): Field<any>[] {\n return this.query((c) => c instanceof Field) as Field<any>[];\n }\n\n getField(name: string): Field<any> | undefined {\n return this.getFields().find((f) => f.name === name);\n }\n\n /** Nested object built from field names (`address.city` \u2192 `{ address: { city } }`). */\n getValues(opts: { dirtyOnly?: boolean } = {}): Record<string, any> {\n const out: Record<string, any> = {};\n for (const f of this.getFields()) if (f.name && (!opts.dirtyOnly || f.isDirty())) setPath(out, f.name, f.getValue());\n return out;\n }\n\n /** Sets the fields present in `values` (silently). */\n setValues(values: Record<string, any>): void {\n for (const f of this.getFields()) {\n const v = f.name ? getPath(values, f.name) : undefined;\n if (v !== undefined) f.setValue(v, true);\n }\n }\n\n /** Fills the form from a plain object or a Model, and makes it the \"clean\" state. */\n load(record: Record<string, any> | Model): void {\n this.setValues('data' in record && 'get' in record ? (record as Model).data : record);\n this.markClean();\n this.clearErrors();\n this.emit('load', record);\n }\n\n /** Brings a field into view: asks every ancestor that shows one child at a time (Tabs, a card layout) to show the branch. */\n protected reveal(field: Component): void {\n let node: Component = field;\n while (node.parent) {\n const p = node.parent as any;\n if (p.items?.includes(node)) {\n if (typeof p.setActive === 'function') p.setActive(node);\n else if (p.layout?.activate) p.layout.activate(p, node);\n }\n node = p;\n }\n }\n\n /** Error counts and \"changed\" dots on the headers of every Tabs inside the form. */\n protected syncTabs(): void {\n for (const tabs of this.query((c) => typeof (c as any).setTabState === 'function') as any[]) {\n for (const panel of tabs.items as Component[]) {\n const fields = panel instanceof Container ? (panel.query((c) => c instanceof Field) as Field<any>[]) : [];\n tabs.setTabState(panel, { errors: fields.filter((f) => f.getError()).length, dirty: fields.some((f) => f.isDirty()) });\n }\n }\n }\n\n /** Writes the changed fields back into a Model. */\n updateRecord(model: Model): void {\n const all = this.getValues();\n const keys = new Set(this.getFields().filter((f) => f.name && f.isDirty()).map((f) => f.name!.split('.')[0]));\n for (const k of keys) model.set(k, all[k]);\n }\n\n markClean(): void {\n this.getFields().forEach((f) => f.markClean());\n this.syncTabs();\n }\n reset(): void {\n this.getFields().forEach((f) => f.reset());\n this.syncTabs();\n }\n isDirty(): boolean {\n return this.getFields().some((f) => f.isDirty());\n }\n isValid(): boolean {\n return this.getFields().every((f) => f.isValid());\n }\n clearErrors(): void {\n this.getFields().forEach((f) => f.clearError());\n this.syncTabs();\n }\n\n /** Validates every field (marks errors) and focuses the first invalid one. */\n validate(): boolean {\n const bad = this.getFields().filter((f) => !f.validate());\n this.syncTabs();\n if (bad.length) {\n this.reveal(bad[0]); // the tab / step that holds it comes forward first\n bad[0].focus();\n this.emit('invalid', bad);\n }\n this.el.classList.toggle('is-invalid', !!bad.length);\n return !bad.length;\n }\n\n submit(): boolean {\n if (this.emit('before-submit') === false) return false;\n if (!this.validate()) return false;\n this.emit('submit', this.getValues());\n return true;\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n this.getFields().forEach((f) => f.setReadonly(readonly));\n }\n}\nregister('form', Form);\n"],
5
- "mappings": "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",
6
- "names": ["getPath", "path", "v", "k", "setPath", "value", "keys", "last", "target", "Form", "Container", "config", "items", "t", "el", "f", "ev", "e", "c", "Field", "name", "opts", "out", "values", "record", "field", "node", "p", "tabs", "panel", "fields", "model", "all", "bad", "readonly", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{c as h}from"./chunk-NDBFYIL6.js";import{c as d}from"./chunk-JTYWZMSZ.js";import{a as l,b as c}from"./chunk-IYPKPLCU.js";import{b as e}from"./chunk-PZSHOSOS.js";import{e as p}from"./chunk-MA5BJL3S.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-JZNEB7A7.js.map
@@ -1,2 +0,0 @@
1
- import{a as o}from"./chunk-IYPKPLCU.js";import{b as r,c as s}from"./chunk-PZSHOSOS.js";import{e as l}from"./chunk-MA5BJL3S.js";var n=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,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)}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{n as a};
2
- //# sourceMappingURL=chunk-K2DGY6MP.js.map