optikos 0.1.0 → 0.2.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 (386) hide show
  1. package/CHANGELOG.md +118 -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-27UZFEXD.js +2 -0
  6. package/dist/chunk-27UZFEXD.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-3DBEZGOY.js +2 -0
  12. package/dist/chunk-3DBEZGOY.js.map +7 -0
  13. package/dist/chunk-3S24ZRPK.js +2 -0
  14. package/dist/chunk-3S24ZRPK.js.map +7 -0
  15. package/dist/chunk-3TAW4AKH.js +2 -0
  16. package/dist/chunk-3TAW4AKH.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-5YS7OD5E.js +2 -0
  33. package/dist/{chunk-GZNQPENR.js.map → chunk-5YS7OD5E.js.map} +1 -1
  34. package/dist/{chunk-NV5AIBQP.js → chunk-6VBK2I5B.js} +2 -2
  35. package/dist/{chunk-ZYUXCZX7.js → chunk-7KMIFXHZ.js} +2 -2
  36. package/dist/{chunk-IYPKPLCU.js → chunk-A2NKDOYN.js} +2 -2
  37. package/dist/chunk-A2NKDOYN.js.map +7 -0
  38. package/dist/chunk-ATFJ7PNA.js +2 -0
  39. package/dist/chunk-ATFJ7PNA.js.map +7 -0
  40. package/dist/chunk-BXYWVRKJ.js +2 -0
  41. package/dist/chunk-BXYWVRKJ.js.map +7 -0
  42. package/dist/chunk-CKXS375P.js +2 -0
  43. package/dist/chunk-CKXS375P.js.map +7 -0
  44. package/dist/chunk-CUN5QO4T.js +2 -0
  45. package/dist/{chunk-4DHQKECB.js.map → chunk-CUN5QO4T.js.map} +1 -1
  46. package/dist/chunk-DBMWS3O5.js +2 -0
  47. package/dist/chunk-DBMWS3O5.js.map +7 -0
  48. package/dist/chunk-E4VNLYO2.js +2 -0
  49. package/dist/chunk-E4VNLYO2.js.map +7 -0
  50. package/dist/chunk-EDUMAMK4.js +2 -0
  51. package/dist/chunk-EDUMAMK4.js.map +7 -0
  52. package/dist/chunk-ELYARUCN.js +2 -0
  53. package/dist/{chunk-Z25NC4CS.js → chunk-EV73ADN2.js} +2 -2
  54. package/dist/{chunk-LV6HXFHU.js → chunk-FEHGU6EP.js} +3 -3
  55. package/dist/chunk-FEHGU6EP.js.map +7 -0
  56. package/dist/chunk-FHM5NUS4.js +3 -0
  57. package/dist/chunk-FHM5NUS4.js.map +7 -0
  58. package/dist/chunk-G2DAD3MQ.js +2 -0
  59. package/dist/chunk-G2DAD3MQ.js.map +7 -0
  60. package/dist/chunk-G2KUK6AT.js +2 -0
  61. package/dist/chunk-GBPLNXMP.js +2 -0
  62. package/dist/chunk-GBPLNXMP.js.map +7 -0
  63. package/dist/{chunk-LBCWEWPN.js → chunk-GNU4VOOE.js} +2 -2
  64. package/dist/{chunk-IW7PK4VS.js → chunk-GZ7X34QP.js} +2 -2
  65. package/dist/chunk-HOF4JGMQ.js +2 -0
  66. package/dist/chunk-HOF4JGMQ.js.map +7 -0
  67. package/dist/chunk-HXDTGP2K.js +2 -0
  68. package/dist/chunk-HXDTGP2K.js.map +7 -0
  69. package/dist/{chunk-QEQIJAAB.js → chunk-I4SP6JTU.js} +2 -2
  70. package/dist/chunk-IHE2MQ3W.js +2 -0
  71. package/dist/{chunk-OW2ZSMGS.js.map → chunk-IHE2MQ3W.js.map} +1 -1
  72. package/dist/chunk-II6ITOA6.js +2 -0
  73. package/dist/chunk-II6ITOA6.js.map +7 -0
  74. package/dist/chunk-JBLRAM7Z.js +2 -0
  75. package/dist/{chunk-JZNEB7A7.js.map → chunk-JBLRAM7Z.js.map} +1 -1
  76. package/dist/{chunk-4SUKNSCY.js → chunk-JI265XFO.js} +2 -2
  77. package/dist/chunk-JK74QK3M.js +2 -0
  78. package/dist/chunk-JK74QK3M.js.map +7 -0
  79. package/dist/chunk-JOFQJGZK.js +2 -0
  80. package/dist/chunk-JOFQJGZK.js.map +7 -0
  81. package/dist/chunk-KCEUD232.js +2 -0
  82. package/dist/chunk-KCEUD232.js.map +7 -0
  83. package/dist/chunk-KLLAY2IM.js +2 -0
  84. package/dist/chunk-KLLAY2IM.js.map +7 -0
  85. package/dist/chunk-LBJSMXLV.js +2 -0
  86. package/dist/chunk-LBJSMXLV.js.map +7 -0
  87. package/dist/chunk-LQRFNQ2N.js +2 -0
  88. package/dist/chunk-LQRFNQ2N.js.map +7 -0
  89. package/dist/{chunk-NDBFYIL6.js → chunk-LW2WRUVL.js} +2 -2
  90. package/dist/{chunk-NDBFYIL6.js.map → chunk-LW2WRUVL.js.map} +2 -2
  91. package/dist/chunk-M242VYZA.js +2 -0
  92. package/dist/{chunk-XVIC24AW.js.map → chunk-M242VYZA.js.map} +1 -1
  93. package/dist/chunk-MB3MU6HR.js +2 -0
  94. package/dist/chunk-MB3MU6HR.js.map +7 -0
  95. package/dist/chunk-MW3RWBZ7.js +2 -0
  96. package/dist/chunk-MW3RWBZ7.js.map +7 -0
  97. package/dist/chunk-NXSTUFS7.js +2 -0
  98. package/dist/chunk-NXSTUFS7.js.map +7 -0
  99. package/dist/chunk-OEAXCCVM.js +2 -0
  100. package/dist/chunk-OEAXCCVM.js.map +7 -0
  101. package/dist/chunk-OGRFQTXA.js +2 -0
  102. package/dist/chunk-OGRFQTXA.js.map +7 -0
  103. package/dist/chunk-REW4LR46.js +2 -0
  104. package/dist/chunk-REW4LR46.js.map +7 -0
  105. package/dist/chunk-RNN55473.js +2 -0
  106. package/dist/chunk-RNN55473.js.map +7 -0
  107. package/dist/{chunk-6NJW7QFD.js → chunk-SA53QUBF.js} +2 -2
  108. package/dist/chunk-TIPK3SCJ.js +2 -0
  109. package/dist/chunk-TIPK3SCJ.js.map +7 -0
  110. package/dist/{chunk-TBLICXWW.js → chunk-TOLTUOZS.js} +2 -2
  111. package/dist/{chunk-DXO3UJKL.js → chunk-TZOQWCVH.js} +2 -2
  112. package/dist/chunk-VF7BGP6L.js +2 -0
  113. package/dist/chunk-VF7BGP6L.js.map +7 -0
  114. package/dist/chunk-VU3GIDZ3.js +2 -0
  115. package/dist/chunk-VU3GIDZ3.js.map +7 -0
  116. package/dist/{chunk-SNTHW4K2.js → chunk-W3H7GTJY.js} +2 -2
  117. package/dist/{chunk-ZHVSHDLH.js → chunk-XHOBNSBO.js} +2 -2
  118. package/dist/chunk-XX2MVWFS.js +4 -0
  119. package/dist/chunk-XX2MVWFS.js.map +7 -0
  120. package/dist/chunk-XYZ6VZ5T.js +2 -0
  121. package/dist/chunk-XYZ6VZ5T.js.map +7 -0
  122. package/dist/chunk-YBAYEU25.js +2 -0
  123. package/dist/chunk-YBAYEU25.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 +45 -0
  230. package/dist/css/panel.css +8 -1
  231. package/dist/css/stepper.css +7 -2
  232. package/dist/css/tabs.css +12 -3
  233. package/dist/css/toggle.css +39 -0
  234. package/dist/css/tree.css +94 -0
  235. package/dist/css/widget.css +58 -0
  236. package/dist/css/window.css +4 -0
  237. package/dist/data.js +1 -1
  238. package/dist/index.js +3 -3
  239. package/dist/index.js.map +3 -3
  240. package/dist/optikos.css +1194 -99
  241. package/dist/themes/dark.css +47 -32
  242. package/dist/types/components/badge.d.ts +1 -0
  243. package/dist/types/components/base/badge/badge.d.ts +18 -0
  244. package/dist/types/components/base/chip/chip.d.ts +27 -0
  245. package/dist/types/components/base/codeviewer/codeviewer.d.ts +48 -0
  246. package/dist/types/components/cellediting.d.ts +1 -0
  247. package/dist/types/components/checkboxgroup.d.ts +1 -0
  248. package/dist/types/components/chip.d.ts +1 -0
  249. package/dist/types/components/codeviewer.d.ts +1 -0
  250. package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
  251. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +3 -1
  252. package/dist/types/components/data/grid/grid.d.ts +42 -16
  253. package/dist/types/components/data/tree/tree.d.ts +71 -0
  254. package/dist/types/components/dial.d.ts +1 -0
  255. package/dist/types/components/fieldgroup.d.ts +1 -0
  256. package/dist/types/components/fieldlist.d.ts +1 -0
  257. package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
  258. package/dist/types/components/fields/dial/dial.d.ts +84 -0
  259. package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
  260. package/dist/types/components/form/fieldgroup/fieldgroup.d.ts +33 -0
  261. package/dist/types/components/form/fieldlist/fieldlist.d.ts +58 -0
  262. package/dist/types/components/form/form/form.d.ts +19 -2
  263. package/dist/types/components/form/formactions/formactions.d.ts +34 -0
  264. package/dist/types/components/form/formerrors/formerrors.d.ts +23 -0
  265. package/dist/types/components/form/formsection/formsection.d.ts +26 -0
  266. package/dist/types/components/form/inputgroup/inputgroup.d.ts +28 -0
  267. package/dist/types/components/form/stepform/stepform.d.ts +2 -0
  268. package/dist/types/components/formactions.d.ts +1 -0
  269. package/dist/types/components/formerrors.d.ts +1 -0
  270. package/dist/types/components/formsection.d.ts +1 -0
  271. package/dist/types/components/inputgroup.d.ts +1 -0
  272. package/dist/types/components/layout/fieldset/fieldset.d.ts +9 -0
  273. package/dist/types/components/layout/panel/panel.d.ts +6 -0
  274. package/dist/types/components/layout/panel/reload.d.ts +1 -0
  275. package/dist/types/components/navigation/tabs/tabs.d.ts +8 -0
  276. package/dist/types/components/overlays/menu/menu.d.ts +15 -0
  277. package/dist/types/components/overlays/messagebox/messagebox.d.ts +8 -0
  278. package/dist/types/components/overlays/widget/widget.d.ts +13 -0
  279. package/dist/types/components/overlays/window/window.d.ts +8 -1
  280. package/dist/types/components/toggle.d.ts +1 -0
  281. package/dist/types/components/tree.d.ts +1 -0
  282. package/dist/types/core/component.d.ts +6 -2
  283. package/dist/types/core/i18n.d.ts +5 -0
  284. package/dist/types/core/index.d.ts +1 -1
  285. package/dist/types/core/position.d.ts +4 -1
  286. package/dist/types/data/column.d.ts +9 -4
  287. package/dist/types/index.d.ts +14 -0
  288. package/dist/types/themes/define.d.ts +4 -3
  289. package/dist/types/ui/enums.d.ts +0 -6
  290. package/dist/types/ui/ui.d.ts +12 -3
  291. package/dist/ui.js +1 -1
  292. package/package.json +6 -1
  293. package/dist/chunk-4COBH4QJ.js +0 -2
  294. package/dist/chunk-4COBH4QJ.js.map +0 -7
  295. package/dist/chunk-4DHQKECB.js +0 -2
  296. package/dist/chunk-4Q67QI7J.js +0 -2
  297. package/dist/chunk-4Q67QI7J.js.map +0 -7
  298. package/dist/chunk-5AXLYDKU.js +0 -2
  299. package/dist/chunk-5AXLYDKU.js.map +0 -7
  300. package/dist/chunk-5GNEFX6F.js +0 -2
  301. package/dist/chunk-5Q6Y6CM4.js +0 -2
  302. package/dist/chunk-5Q6Y6CM4.js.map +0 -7
  303. package/dist/chunk-666O2GKD.js +0 -2
  304. package/dist/chunk-A66MDXHL.js +0 -2
  305. package/dist/chunk-A66MDXHL.js.map +0 -7
  306. package/dist/chunk-ARCW54L2.js +0 -2
  307. package/dist/chunk-ARCW54L2.js.map +0 -7
  308. package/dist/chunk-BIYNHKSA.js +0 -2
  309. package/dist/chunk-BIYNHKSA.js.map +0 -7
  310. package/dist/chunk-BNPVRIFT.js +0 -2
  311. package/dist/chunk-BNPVRIFT.js.map +0 -7
  312. package/dist/chunk-C3N7QTQB.js +0 -2
  313. package/dist/chunk-C3N7QTQB.js.map +0 -7
  314. package/dist/chunk-CEXY5A4T.js +0 -2
  315. package/dist/chunk-CN7USUJR.js +0 -2
  316. package/dist/chunk-CN7USUJR.js.map +0 -7
  317. package/dist/chunk-CQRHNTEX.js +0 -2
  318. package/dist/chunk-CUPAPOKC.js +0 -2
  319. package/dist/chunk-CUPAPOKC.js.map +0 -7
  320. package/dist/chunk-GZNQPENR.js +0 -2
  321. package/dist/chunk-HFFK6K4K.js +0 -2
  322. package/dist/chunk-HFFK6K4K.js.map +0 -7
  323. package/dist/chunk-IHAYOSBR.js +0 -2
  324. package/dist/chunk-IO66A6G5.js +0 -2
  325. package/dist/chunk-IO66A6G5.js.map +0 -7
  326. package/dist/chunk-IYPKPLCU.js.map +0 -7
  327. package/dist/chunk-JTYWZMSZ.js +0 -2
  328. package/dist/chunk-JTYWZMSZ.js.map +0 -7
  329. package/dist/chunk-JVEPKW5X.js +0 -2
  330. package/dist/chunk-JVEPKW5X.js.map +0 -7
  331. package/dist/chunk-JZNEB7A7.js +0 -2
  332. package/dist/chunk-K2DGY6MP.js +0 -2
  333. package/dist/chunk-K2DGY6MP.js.map +0 -7
  334. package/dist/chunk-LEE2FEEL.js +0 -2
  335. package/dist/chunk-LEE2FEEL.js.map +0 -7
  336. package/dist/chunk-LMGCV35W.js +0 -2
  337. package/dist/chunk-LMGCV35W.js.map +0 -7
  338. package/dist/chunk-LV6HXFHU.js.map +0 -7
  339. package/dist/chunk-MA5BJL3S.js +0 -2
  340. package/dist/chunk-MA5BJL3S.js.map +0 -7
  341. package/dist/chunk-NHVEP72K.js +0 -2
  342. package/dist/chunk-NHVEP72K.js.map +0 -7
  343. package/dist/chunk-O4DCHALR.js +0 -2
  344. package/dist/chunk-ODWPBBVL.js +0 -2
  345. package/dist/chunk-OW2ZSMGS.js +0 -2
  346. package/dist/chunk-PSPQH35P.js +0 -2
  347. package/dist/chunk-PSPQH35P.js.map +0 -7
  348. package/dist/chunk-T4OYVG2X.js +0 -2
  349. package/dist/chunk-T4OYVG2X.js.map +0 -7
  350. package/dist/chunk-TK2RC3T5.js +0 -2
  351. package/dist/chunk-TK2RC3T5.js.map +0 -7
  352. package/dist/chunk-U3X2FW6U.js +0 -2
  353. package/dist/chunk-U3X2FW6U.js.map +0 -7
  354. package/dist/chunk-UPOBGNJ5.js +0 -2
  355. package/dist/chunk-UPOBGNJ5.js.map +0 -7
  356. package/dist/chunk-XVIC24AW.js +0 -2
  357. package/dist/chunk-XZ5CUZZP.js +0 -2
  358. package/dist/chunk-XZ5CUZZP.js.map +0 -7
  359. package/dist/chunk-XZEOSW3Q.js +0 -2
  360. package/dist/chunk-XZEOSW3Q.js.map +0 -7
  361. package/dist/chunk-YET5PM6F.js +0 -2
  362. package/dist/chunk-YET5PM6F.js.map +0 -7
  363. package/dist/chunk-ZCAAM4NH.js +0 -2
  364. package/dist/chunk-ZCAAM4NH.js.map +0 -7
  365. package/dist/themes/brand.css +0 -240
  366. package/dist/themes/brutal.css +0 -100
  367. package/dist/themes/corporate.css +0 -112
  368. package/dist/themes/editorial.css +0 -110
  369. package/dist/themes/soft.css +0 -101
  370. package/dist/themes/terminal.css +0 -91
  371. /package/dist/{chunk-NWTTHDIM.js.map → chunk-5JEXM5S7.js.map} +0 -0
  372. /package/dist/{chunk-NV5AIBQP.js.map → chunk-6VBK2I5B.js.map} +0 -0
  373. /package/dist/{chunk-ZYUXCZX7.js.map → chunk-7KMIFXHZ.js.map} +0 -0
  374. /package/dist/{chunk-CEXY5A4T.js.map → chunk-ELYARUCN.js.map} +0 -0
  375. /package/dist/{chunk-Z25NC4CS.js.map → chunk-EV73ADN2.js.map} +0 -0
  376. /package/dist/{chunk-CQRHNTEX.js.map → chunk-G2KUK6AT.js.map} +0 -0
  377. /package/dist/{chunk-LBCWEWPN.js.map → chunk-GNU4VOOE.js.map} +0 -0
  378. /package/dist/{chunk-IW7PK4VS.js.map → chunk-GZ7X34QP.js.map} +0 -0
  379. /package/dist/{chunk-QEQIJAAB.js.map → chunk-I4SP6JTU.js.map} +0 -0
  380. /package/dist/{chunk-4SUKNSCY.js.map → chunk-JI265XFO.js.map} +0 -0
  381. /package/dist/{chunk-6NJW7QFD.js.map → chunk-SA53QUBF.js.map} +0 -0
  382. /package/dist/{chunk-TBLICXWW.js.map → chunk-TOLTUOZS.js.map} +0 -0
  383. /package/dist/{chunk-DXO3UJKL.js.map → chunk-TZOQWCVH.js.map} +0 -0
  384. /package/dist/{chunk-SNTHW4K2.js.map → chunk-W3H7GTJY.js.map} +0 -0
  385. /package/dist/{chunk-ZHVSHDLH.js.map → chunk-XHOBNSBO.js.map} +0 -0
  386. /package/dist/{chunk-6O2BXCRN.js.map → chunk-Z2Z52GFT.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/chat/chat/chat.ts"],
4
- "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale } from '../../../core/i18n';\nimport { Button } from '../../base/button/button';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface ChatMessage {\n id?: string | number;\n /** The author's id (compare with the `me` of the config). */\n from: string;\n text: string;\n time?: number | Date | string;\n status?: 'sending' | 'sent' | 'delivered' | 'read' | 'error';\n /** The id of the message this one answers (shown as a quote). */\n replyTo?: string | number;\n /** Anything the app wants to keep with the message. */\n meta?: unknown;\n}\n\nexport interface ChatConfig extends ComponentConfig {\n messages?: ChatMessage[];\n /** The id of whoever is using the chat: their messages go on the right. */\n me: string;\n users?: Record<string, { name: string; color?: string }>;\n /** Show the author's name above the first bubble of a group of theirs. Default true. */\n showAuthors?: boolean;\n placeholder?: string;\n /** Prompt chips above the composer; clicking one sends it. */\n suggestions?: string[];\n readonly?: boolean;\n /** Enter sends and Shift+Enter breaks the line. Default true. */\n sendOnEnter?: boolean;\n maxLength?: number;\n /** Custom bubble content. The default is a minimal, safe formatting (`**bold**`, `*italic*`, `` `code` ``, line breaks). */\n renderer?: (msg: ChatMessage) => string | Node;\n}\n\ntype Msg = ChatMessage & { id: string | number; at: number };\n\nconst INLINE = /(\\*\\*[^*\\n]+\\*\\*|\\*[^*\\n]+\\*|`[^`\\n]+`)/;\n\n/** Text \u2192 nodes: bold, italic, code and line breaks only. Everything else stays text, so nothing can inject markup. */\nfunction format(text: string): Node[] {\n const out: Node[] = [];\n text.split('\\n').forEach((line, i) => {\n if (i) out.push(document.createElement('br'));\n for (const part of line.split(INLINE)) {\n if (!part) continue;\n if (part.startsWith('**') && part.endsWith('**') && part.length > 4) out.push(h('strong', '', {}, part.slice(2, -2)));\n else if (part.startsWith('`') && part.endsWith('`') && part.length > 2) out.push(h('code', 'op-chat__code', {}, part.slice(1, -1)));\n else if (part.startsWith('*') && part.endsWith('*') && part.length > 2) out.push(h('em', '', {}, part.slice(1, -1)));\n else out.push(document.createTextNode(part));\n }\n });\n return out;\n}\n\nconst dayKey = (at: number) => new Date(at).toDateString();\nconst lang = () => getLocale()._lang;\n\n/** Conversation view: bubbles grouped by author and day, delivery ticks, typing dots, streaming text, prompt chips and a composer. */\nexport class Chat extends Component<ChatConfig> {\n protected override baseCls = 'op-chat';\n private msgs: Msg[] = [];\n private seq = 0;\n private logEl!: HTMLElement;\n private emptyEl!: HTMLElement;\n private typingEl!: HTMLElement;\n private chipsEl!: HTMLElement;\n private input!: HTMLTextAreaElement;\n private sendBtn!: Button;\n private busy = false;\n\n protected override build() {\n const c = this.config;\n this.logEl = h('div', 'op-chat__log', { role: 'log', 'aria-live': 'polite', 'aria-relevant': 'additions', 'aria-label': t('chatLog'), tabindex: 0 });\n this.emptyEl = h('div', 'op-chat__empty', {}, t('chatEmpty'));\n this.typingEl = h('div', 'op-chat__typing', { 'aria-hidden': 'true' }, h('span', 'op-chat__dots', {}, h('i'), h('i'), h('i')), h('span', 'op-chat__typing-text'));\n this.typingEl.hidden = true;\n this.chipsEl = h('div', 'op-chat__suggestions', { role: 'group', 'aria-label': t('chatSuggestions') });\n this.input = h('textarea', 'op-chat__input', { rows: 1, placeholder: c.placeholder ?? t('chatPlaceholder'), 'aria-label': c.placeholder ?? t('chatPlaceholder'), maxlength: c.maxLength ?? null });\n this.sendBtn = new Button({ icon: 'send', variant: 'primary', ariaLabel: t('chatSend'), handler: () => this.submit() });\n this.own(() => this.sendBtn.destroy());\n return h('div', this.baseCls, {}, this.logEl, this.chipsEl, h('div', 'op-chat__composer', {}, this.input, this.sendBtn.el));\n }\n\n protected override onRender() {\n const c = this.config;\n this.listen(this.input, 'input', () => this.grow());\n this.listen(this.input, 'keydown', (e: KeyboardEvent) => {\n if (e.key !== 'Enter' || e.shiftKey || e.isComposing || c.sendOnEnter === false) return;\n e.preventDefault();\n this.submit();\n });\n this.listen(this.chipsEl, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-s]');\n if (!b) return;\n this.emit('suggestion', b.dataset.s);\n this.send(b.dataset.s!);\n });\n this.listen(this.logEl, 'click', (e: Event) => {\n const el = (e.target as HTMLElement).closest<HTMLElement>('.op-chat__msg');\n const m = el && this.msgs.find((x) => String(x.id) === el.dataset.id);\n if (m) this.emit('message-click', m);\n });\n this.setReadonly(!!c.readonly);\n this.msgs = (c.messages ?? []).map((m) => this.norm(m));\n this.setSuggestions(c.suggestions ?? []);\n this.renderAll();\n }\n\n override notifyMount() {\n super.notifyMount();\n if (!this.rendered) return; // a Chat in a lazy tab is told it is mounted before it has a DOM\n this.sendBtn.notifyMount();\n this.scrollToBottom();\n }\n\n // ---- messages ------------------------------------------------------------------------------\n\n private norm(m: ChatMessage): Msg {\n const at = m.time == null ? Date.now() : new Date(m.time).getTime();\n return { ...m, id: m.id ?? `m${++this.seq}`, at };\n }\n\n getMessages(): ChatMessage[] {\n return this.msgs;\n }\n\n addMessage(msg: ChatMessage): ChatMessage {\n const m = this.norm(msg);\n this.msgs.push(m);\n if (!this.rendered) return (this.config.messages = this.msgs, m);\n const stick = this.nearBottom() || m.from === this.config.me;\n this.mountMsg(m, this.msgs.length - 1);\n this.syncEmpty();\n if (stick) this.scrollToBottom();\n return m;\n }\n\n setMessages(list: ChatMessage[]): void {\n this.msgs = list.map((m) => this.norm(m));\n this.config.messages = this.msgs; // so a chat that is not rendered yet (a lazy tab) starts with them\n if (this.rendered) {\n this.renderAll();\n this.scrollToBottom();\n }\n }\n\n updateMessage(id: string | number, patch: Partial<ChatMessage>): void {\n const i = this.msgs.findIndex((m) => m.id === id);\n if (i < 0) return;\n const stick = this.nearBottom();\n this.msgs[i] = { ...this.msgs[i], ...patch, at: patch.time != null ? new Date(patch.time).getTime() : this.msgs[i].at };\n if (!this.rendered) return;\n const old = this.msgEl(id);\n const fresh = this.buildMsg(this.msgs[i], i);\n old ? old.replaceWith(fresh) : this.logEl.insertBefore(fresh, this.typingEl);\n this.decorate(i);\n if (stick) this.scrollToBottom();\n }\n\n /** Adds text to a message: for answers that arrive in pieces (AI streaming). Only that bubble's text is redrawn. */\n appendToMessage(id: string | number, text: string): void {\n const m = this.msgs.find((x) => x.id === id);\n if (!m) return;\n m.text += text;\n const el = this.msgEl(id)?.querySelector('.op-chat__text');\n if (!el) return;\n const stick = this.nearBottom();\n this.fill(el as HTMLElement, m);\n if (stick) this.scrollToBottom();\n }\n\n removeMessage(id: string | number): void {\n this.msgs = this.msgs.filter((m) => m.id !== id);\n if (this.rendered) this.renderAll();\n }\n\n private msgEl(id: string | number): HTMLElement | null {\n return this.logEl.querySelector(`[data-id=\"${CSS.escape(String(id))}\"]`);\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n private renderAll(): void {\n this.logEl.replaceChildren(this.emptyEl, ...this.msgs.flatMap((m, i) => this.nodesFor(m, i)), this.typingEl);\n this.syncEmpty();\n }\n\n /** The day separator (when the day changes) and the message itself. */\n private nodesFor(m: Msg, i: number): HTMLElement[] {\n const prev = this.msgs[i - 1];\n const nodes: HTMLElement[] = [];\n if (!prev || dayKey(prev.at) !== dayKey(m.at)) nodes.push(h('div', 'op-chat__day', { role: 'separator' }, h('span', '', {}, this.dayLabel(m.at))));\n nodes.push(this.buildMsg(m, i));\n return nodes;\n }\n\n private mountMsg(m: Msg, i: number): void {\n for (const n of this.nodesFor(m, i)) this.logEl.insertBefore(n, this.typingEl);\n this.decorate(i - 1);\n this.decorate(i);\n }\n\n private dayLabel(at: number): string {\n const d = dayKey(at);\n const now = Date.now();\n if (d === dayKey(now)) return t('chatToday');\n if (d === dayKey(now - 864e5)) return t('chatYesterday');\n return new Intl.DateTimeFormat(lang(), { dateStyle: 'medium' }).format(at);\n }\n\n private fill(el: HTMLElement, m: Msg): void {\n const out = this.config.renderer ? this.config.renderer(m) : format(m.text);\n el.replaceChildren(...(Array.isArray(out) ? out : [out]));\n }\n\n private buildMsg(m: Msg, i: number): HTMLElement {\n const c = this.config;\n const mine = m.from === c.me;\n const user = c.users?.[m.from];\n const el = h('article', `op-chat__msg ${mine ? 'is-me' : 'is-them'}`, { 'data-id': String(m.id) });\n const bubble = h('div', 'op-chat__bubble');\n if (!mine && c.showAuthors !== false && user) {\n const name = h('div', 'op-chat__author', {}, user.name);\n if (user.color) name.style.color = user.color;\n bubble.append(name);\n }\n const quoted = m.replyTo != null ? this.msgs.find((x) => x.id === m.replyTo) : undefined;\n if (quoted) bubble.append(h('div', 'op-chat__reply', { 'aria-label': t('chatReply') }, h('strong', '', {}, quoted.from === c.me ? '' : (c.users?.[quoted.from]?.name ?? quoted.from)), quoted.text.length > 80 ? `${quoted.text.slice(0, 80)}\u2026` : quoted.text));\n const text = h('div', 'op-chat__text');\n this.fill(text, m);\n const time = new Intl.DateTimeFormat(lang(), { hour: '2-digit', minute: '2-digit' }).format(m.at);\n bubble.append(text, h('span', 'op-chat__meta', {}, h('time', '', { datetime: new Date(m.at).toISOString() }, time), mine && m.status ? this.statusEl(m.status) : ''));\n el.append(bubble);\n this.group(el, i);\n return el;\n }\n\n private statusEl(s: NonNullable<ChatMessage['status']>): HTMLElement {\n const el = h('span', `op-chat__status is-${s}`, { role: 'img', 'aria-label': s });\n if (s === 'error') el.append(iconEl('alert'));\n else if (s !== 'sending') el.append(iconEl('check'), ...(s === 'sent' ? [] : [iconEl('check')]));\n return el;\n }\n\n /** Group classes: first/last bubble of a run by the same author on the same day. */\n private group(el: HTMLElement, i: number): void {\n const m = this.msgs[i];\n const same = (a?: Msg, b?: Msg) => !!a && !!b && a.from === b.from && dayKey(a.at) === dayKey(b.at);\n el.classList.toggle('is-first', !same(this.msgs[i - 1], m));\n el.classList.toggle('is-last', !same(m, this.msgs[i + 1]));\n el.querySelector('.op-chat__author')?.toggleAttribute('hidden', same(this.msgs[i - 1], m));\n }\n\n private decorate(i: number): void {\n const m = this.msgs[i];\n const el = m && this.msgEl(m.id);\n if (el) this.group(el, i);\n }\n\n private syncEmpty(): void {\n this.emptyEl.hidden = this.msgs.length > 0;\n this.el.classList.toggle('is-empty', !this.msgs.length);\n }\n\n private nearBottom(): boolean {\n const l = this.logEl;\n return l.scrollHeight - l.scrollTop - l.clientHeight < 48;\n }\n\n scrollToBottom(): void {\n this.render();\n this.logEl.scrollTop = this.logEl.scrollHeight;\n }\n\n // ---- typing, suggestions, state ------------------------------------------------------------\n\n /** `true` shows the dots, a name shows \"name is typing\u2026\", `false` hides them. */\n setTyping(who: boolean | string): void {\n const stick = this.nearBottom();\n this.typingEl.hidden = !who;\n this.typingEl.querySelector('.op-chat__typing-text')!.textContent = typeof who === 'string' ? t('chatTyping', { n: who }) : '';\n if (who && stick) this.scrollToBottom();\n }\n\n setSuggestions(list: string[]): void {\n this.config.suggestions = list;\n if (!this.rendered) return;\n this.chipsEl.hidden = !list.length;\n this.chipsEl.replaceChildren(...list.map((s) => h('button', 'op-chat__chip', { type: 'button', 'data-s': s }, s)));\n }\n\n /** While busy (an answer is on its way) sending is off and the log tells assistive tech to wait. */\n setBusy(busy: boolean): void {\n this.busy = busy;\n this.el.classList.toggle('is-busy', busy);\n this.logEl.setAttribute('aria-busy', String(busy));\n this.sendBtn.setDisabled(busy || !!this.config.readonly);\n for (const b of Array.from(this.chipsEl.children) as HTMLButtonElement[]) b.disabled = busy || !!this.config.readonly;\n }\n\n setReadonly(readonly: boolean): void {\n this.config.readonly = readonly;\n if (!this.rendered) return;\n this.input.readOnly = readonly;\n this.el.classList.toggle('is-readonly', readonly);\n this.setBusy(this.busy);\n }\n\n setPlaceholder(text: string): void {\n this.config.placeholder = text;\n if (this.rendered) this.input.placeholder = text;\n }\n\n override focus(): void {\n this.render();\n this.input.focus();\n }\n\n // ---- sending -------------------------------------------------------------------------------\n\n private grow(): void {\n this.input.style.height = 'auto';\n this.input.style.height = `${this.input.scrollHeight}px`;\n }\n\n private submit(): void {\n const text = this.input.value;\n if (this.send(text)) {\n this.input.value = '';\n this.grow();\n }\n }\n\n /** The same path as the send button. Returns false when nothing was sent (empty, busy, read-only or cancelled). */\n send(text: string): boolean {\n text = text.trim();\n if (!text || this.busy || this.config.readonly || this.emit('before-send', text) === false) return false;\n const msg = this.addMessage({ from: this.config.me, text, time: Date.now(), status: 'sending' });\n this.emit('send', text, msg);\n return true;\n }\n}\nregister('chat', Chat);\n"],
5
- "mappings": "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",
6
- "names": ["INLINE", "format", "text", "out", "line", "i", "part", "h", "dayKey", "at", "lang", "getLocale", "Chat", "Component", "c", "t", "Button", "b", "el", "m", "x", "msg", "stick", "list", "id", "patch", "old", "fresh", "prev", "nodes", "n", "d", "now", "mine", "user", "bubble", "name", "quoted", "time", "s", "iconEl", "same", "a", "l", "who", "busy", "readonly", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- var l=class{handlers=new Map;on(e,a){let t=this.handlers.get(e);return t?t.push(a):this.handlers.set(e,[a]),()=>this.off(e,a)}once(e,a){let t=this.on(e,(...r)=>(t(),a(...r)));return t}off(e,a){if(!a)this.handlers.delete(e);else{let t=this.handlers.get(e);t&&this.handlers.set(e,t.filter(r=>r!==a))}}emit(e,...a){let t=!0;for(let r of this.handlers.get(e)??[])r(...a)===!1&&(t=!1);return t}clearListeners(){this.handlers.clear()}};var i={_lang:"en",_currency:"USD",_firstDay:"0",required:"This field is required",minLength:"Enter at least {n} characters",maxLength:"Enter at most {n} characters",pattern:"Invalid format",email:"Enter a valid email address",min:"Must be at least {n}",max:"Must be at most {n}",range:"Must be between {min} and {max}",number:"Enter a valid number",date:"Enter a valid date",dateMin:"Date must be on or after {n}",dateMax:"Date must be on or before {n}",notInList:"Choose a value from the list",loading:"Loading",close:"Close",ok:"OK",cancel:"Cancel",clear:"Clear",collapse:"Collapse",expand:"Expand",empty:"No data",search:"Search",lookupOpen:"Open search",lookupSelect:"Select",fbEq:"equals",fbNe:"does not equal",fbContains:"contains",fbNotContains:"does not contain",fbStarts:"starts with",fbEnds:"ends with",fbGt:"greater than",fbGe:"greater than or equal",fbLt:"less than",fbLe:"less than or equal",fbBetween:"is between",fbNotBetween:"is not between",fbIn:"is any of",fbNin:"is none of",fbEmpty:"is empty",fbNotEmpty:"is not empty",fbAnd:"Match all (AND)",fbOr:"Match any (OR)",fbAddFilter:"Add filter",fbAddGroup:"Add group",fbRemove:"Remove",fbClear:"Clear all",fbApply:"Apply",fbField:"Field",fbOperator:"Operator",fbValue:"Value",fbTo:"and",fbList:"a, b, c",fbNone:"No filters",fbLabel:"Filters",views:"Views",viewsName:"Name for this view",viewsSave:"Save view",viewsSaveAs:"Save as new view\u2026",viewsDefault:"Open with this view",viewsDelete:"Delete view",viewsConfirmDelete:'Delete the view "{n}"?',viewsReset:"Reset to initial",cpPlaceholder:"Type a command or search\u2026",cpLabel:"Command palette",cpFilters:"Categories",cpAll:"All",cpEmpty:"No matching commands",cpHint:"\u2191\u2193 navigate \xB7 Enter run \xB7 Esc close",chatPlaceholder:"Type a message",chatSend:"Send",chatTyping:"{n} is typing\u2026",chatToday:"Today",chatYesterday:"Yesterday",chatEmpty:"No messages yet",chatLog:"Conversation",chatSuggestions:"Suggestions",chatReply:"Reply",wDockLeft:"Dock to the left",wDockRight:"Dock to the right",wDockTop:"Dock to the top",wDockBottom:"Dock to the bottom",tabErrors:"errors",stepOptional:"optional",stepDone:"completed",stepError:"has errors",stepBack:"Back",stepNext:"Next",stepFinish:"Finish",stepReview:"Review",stepSteps:"Steps",stepOf:"Step {n} of {total}",secretShow:"Show value",secretHide:"Hide value",secretStored:"A value is saved. It cannot be shown again.",secretReplace:"Replace",secretKeep:"Keep current",secretWarnTitle:"Replace the saved value?",secretWarn:"The saved value cannot be displayed and will be discarded as soon as you replace it. Type the new value next; it takes effect when you save.",gridSelected:"{n} selected",gridSelectAll:"Select all {n}",gridClearSel:"Clear selection",gridSelectRow:"Select row",gridSelectPage:"Select all rows",gridRowActions:"Row actions",gridColumns:"Columns",gridResize:"Resize column",gridGroupAll:"All",gridOtherCols:"Other",gridGroups:"Column groups",gridColumnSearch:"Search columns",gridNoColumns:"No matching columns",noResults:"No results",results:"{n} results",pageFirst:"First page",pagePrev:"Previous page",pageNext:"Next page",pageLast:"Last page",pageLabel:"Pagination",pageGoto:"Page {n}",pageInfo:"{from}\u2013{to} of {total}",calPrev:"Previous",calNext:"Next",calOpen:"Open calendar",calMonth:"Choose month",breadcrumb:"Breadcrumb",breadcrumbMore:"Show more",sortAsc:"sorted ascending",sortDesc:"sorted descending"},c={_lang:"pt-BR",_currency:"BRL",_firstDay:"0",required:"Campo obrigat\xF3rio",minLength:"Informe ao menos {n} caracteres",maxLength:"Informe no m\xE1ximo {n} caracteres",pattern:"Formato inv\xE1lido",email:"Informe um e-mail v\xE1lido",min:"Deve ser no m\xEDnimo {n}",max:"Deve ser no m\xE1ximo {n}",range:"Deve estar entre {min} e {max}",number:"Informe um n\xFAmero v\xE1lido",date:"Informe uma data v\xE1lida",dateMin:"A data deve ser {n} ou posterior",dateMax:"A data deve ser {n} ou anterior",notInList:"Escolha um valor da lista",loading:"Carregando",close:"Fechar",ok:"OK",cancel:"Cancelar",clear:"Limpar",collapse:"Recolher",expand:"Expandir",empty:"Sem dados",search:"Pesquisar",lookupOpen:"Abrir pesquisa",lookupSelect:"Selecionar",fbEq:"igual a",fbNe:"diferente de",fbContains:"cont\xE9m",fbNotContains:"n\xE3o cont\xE9m",fbStarts:"come\xE7a com",fbEnds:"termina com",fbGt:"maior que",fbGe:"maior ou igual a",fbLt:"menor que",fbLe:"menor ou igual a",fbBetween:"entre",fbNotBetween:"fora do intervalo",fbIn:"\xE9 um de",fbNin:"n\xE3o \xE9 nenhum de",fbEmpty:"est\xE1 vazio",fbNotEmpty:"n\xE3o est\xE1 vazio",fbAnd:"Todas (E)",fbOr:"Qualquer uma (OU)",fbAddFilter:"Adicionar filtro",fbAddGroup:"Adicionar grupo",fbRemove:"Remover",fbClear:"Limpar tudo",fbApply:"Aplicar",fbField:"Campo",fbOperator:"Operador",fbValue:"Valor",fbTo:"e",fbList:"a, b, c",fbNone:"Sem filtros",fbLabel:"Filtros",views:"Vis\xF5es",viewsName:"Nome desta vis\xE3o",viewsSave:"Salvar vis\xE3o",viewsSaveAs:"Salvar como nova vis\xE3o\u2026",viewsDefault:"Abrir com esta vis\xE3o",viewsDelete:"Excluir vis\xE3o",viewsConfirmDelete:'Excluir a vis\xE3o "{n}"?',viewsReset:"Voltar ao inicial",cpPlaceholder:"Digite um comando ou pesquise\u2026",cpLabel:"Paleta de comandos",cpFilters:"Categorias",cpAll:"Todas",cpEmpty:"Nenhum comando encontrado",cpHint:"\u2191\u2193 navegar \xB7 Enter executar \xB7 Esc fechar",chatPlaceholder:"Digite uma mensagem",chatSend:"Enviar",chatTyping:"{n} est\xE1 digitando\u2026",chatToday:"Hoje",chatYesterday:"Ontem",chatEmpty:"Nenhuma mensagem ainda",chatLog:"Conversa",chatSuggestions:"Sugest\xF5es",chatReply:"Responder",wDockLeft:"Fixar \xE0 esquerda",wDockRight:"Fixar \xE0 direita",wDockTop:"Fixar em cima",wDockBottom:"Fixar embaixo",tabErrors:"erros",stepOptional:"opcional",stepDone:"conclu\xEDda",stepError:"com erros",stepBack:"Voltar",stepNext:"Pr\xF3ximo",stepFinish:"Concluir",stepReview:"Revis\xE3o",stepSteps:"Etapas",stepOf:"Etapa {n} de {total}",secretShow:"Mostrar valor",secretHide:"Ocultar valor",secretStored:"H\xE1 um valor salvo. Ele n\xE3o pode ser exibido novamente.",secretReplace:"Substituir",secretKeep:"Manter o atual",secretWarnTitle:"Substituir o valor salvo?",secretWarn:"O valor salvo n\xE3o pode ser exibido e ser\xE1 descartado assim que voc\xEA o substituir. Digite o novo valor em seguida; ele s\xF3 vale quando voc\xEA salvar.",gridSelected:"{n} selecionado(s)",gridSelectAll:"Selecionar todos os {n}",gridClearSel:"Limpar sele\xE7\xE3o",gridSelectRow:"Selecionar linha",gridSelectPage:"Selecionar todas as linhas",gridRowActions:"A\xE7\xF5es da linha",gridColumns:"Colunas",gridResize:"Redimensionar coluna",gridGroupAll:"Todas",gridOtherCols:"Outras",gridGroups:"Grupos de colunas",gridColumnSearch:"Buscar colunas",gridNoColumns:"Nenhuma coluna encontrada",noResults:"Nenhum resultado",results:"{n} resultados",pageFirst:"Primeira p\xE1gina",pagePrev:"P\xE1gina anterior",pageNext:"Pr\xF3xima p\xE1gina",pageLast:"\xDAltima p\xE1gina",pageLabel:"Pagina\xE7\xE3o",pageGoto:"P\xE1gina {n}",pageInfo:"{from}\u2013{to} de {total}",calPrev:"Anterior",calNext:"Pr\xF3ximo",calOpen:"Abrir calend\xE1rio",calMonth:"Escolher m\xEAs",breadcrumb:"Trilha de navega\xE7\xE3o",breadcrumbMore:"Mostrar mais",sortAsc:"ordenado crescente",sortDesc:"ordenado decrescente"},n={en:i,"pt-BR":c},s=i;function p(o){typeof o=="string"?s=n[o]??n[Object.keys(n).find(e=>e.startsWith(o.split("-")[0]))??"en"]:(s={...i,...o},o._lang&&(n[o._lang]=s))}var m=()=>s;function u(o,e){let a=s[o]??i[o]??o;return e?a.replace(/\{(\w+)\}/g,(t,r)=>String(e[r]??"")):a}export{l as a,n as b,p as c,m as d,u as e};
2
- //# sourceMappingURL=chunk-MA5BJL3S.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/core/emitter.ts", "../src/core/i18n.ts"],
4
- "sourcesContent": ["export type Handler = (...args: any[]) => unknown;\n\n/** Minimal observer. A handler that returns `false` makes `emit` return `false` (used by `before-*` events). */\nexport class Emitter {\n private handlers = new Map<string, Handler[]>();\n\n /** Subscribes; returns the unsubscribe function. */\n on(name: string, fn: Handler): () => void {\n const list = this.handlers.get(name);\n if (list) list.push(fn);\n else this.handlers.set(name, [fn]);\n return () => this.off(name, fn);\n }\n\n once(name: string, fn: Handler): () => void {\n const off = this.on(name, (...a) => {\n off();\n return fn(...a);\n });\n return off;\n }\n\n off(name: string, fn?: Handler): void {\n if (!fn) this.handlers.delete(name);\n else {\n const list = this.handlers.get(name);\n if (list) this.handlers.set(name, list.filter((f) => f !== fn));\n }\n }\n\n /** Returns `false` if any handler returned `false` (the event was cancelled). */\n emit(name: string, ...args: unknown[]): boolean {\n let ok = true;\n for (const fn of this.handlers.get(name) ?? []) if (fn(...args) === false) ok = false;\n return ok;\n }\n\n clearListeners(): void {\n this.handlers.clear();\n }\n}\n", "export type Locale = Record<string, string>;\n\nconst en: Locale = {\n _lang: 'en',\n _currency: 'USD',\n _firstDay: '0',\n required: 'This field is required',\n minLength: 'Enter at least {n} characters',\n maxLength: 'Enter at most {n} characters',\n pattern: 'Invalid format',\n email: 'Enter a valid email address',\n min: 'Must be at least {n}',\n max: 'Must be at most {n}',\n range: 'Must be between {min} and {max}',\n number: 'Enter a valid number',\n date: 'Enter a valid date',\n dateMin: 'Date must be on or after {n}',\n dateMax: 'Date must be on or before {n}',\n notInList: 'Choose a value from the list',\n loading: 'Loading',\n close: 'Close',\n ok: 'OK',\n cancel: 'Cancel',\n clear: 'Clear',\n collapse: 'Collapse',\n expand: 'Expand',\n empty: 'No data',\n search: 'Search',\n lookupOpen: 'Open search',\n lookupSelect: 'Select',\n fbEq: 'equals',\n fbNe: 'does not equal',\n fbContains: 'contains',\n fbNotContains: 'does not contain',\n fbStarts: 'starts with',\n fbEnds: 'ends with',\n fbGt: 'greater than',\n fbGe: 'greater than or equal',\n fbLt: 'less than',\n fbLe: 'less than or equal',\n fbBetween: 'is between',\n fbNotBetween: 'is not between',\n fbIn: 'is any of',\n fbNin: 'is none of',\n fbEmpty: 'is empty',\n fbNotEmpty: 'is not empty',\n fbAnd: 'Match all (AND)',\n fbOr: 'Match any (OR)',\n fbAddFilter: 'Add filter',\n fbAddGroup: 'Add group',\n fbRemove: 'Remove',\n fbClear: 'Clear all',\n fbApply: 'Apply',\n fbField: 'Field',\n fbOperator: 'Operator',\n fbValue: 'Value',\n fbTo: 'and',\n fbList: 'a, b, c',\n fbNone: 'No filters',\n fbLabel: 'Filters',\n views: 'Views',\n viewsName: 'Name for this view',\n viewsSave: 'Save view',\n viewsSaveAs: 'Save as new view\u2026',\n viewsDefault: 'Open with this view',\n viewsDelete: 'Delete view',\n viewsConfirmDelete: 'Delete the view \"{n}\"?',\n viewsReset: 'Reset to initial',\n cpPlaceholder: 'Type a command or search\u2026',\n cpLabel: 'Command palette',\n cpFilters: 'Categories',\n cpAll: 'All',\n cpEmpty: 'No matching commands',\n cpHint: '\u2191\u2193 navigate \u00B7 Enter run \u00B7 Esc close',\n chatPlaceholder: 'Type a message',\n chatSend: 'Send',\n chatTyping: '{n} is typing\u2026',\n chatToday: 'Today',\n chatYesterday: 'Yesterday',\n chatEmpty: 'No messages yet',\n chatLog: 'Conversation',\n chatSuggestions: 'Suggestions',\n chatReply: 'Reply',\n wDockLeft: 'Dock to the left',\n wDockRight: 'Dock to the right',\n wDockTop: 'Dock to the top',\n wDockBottom: 'Dock to the bottom',\n tabErrors: 'errors',\n stepOptional: 'optional',\n stepDone: 'completed',\n stepError: 'has errors',\n stepBack: 'Back',\n stepNext: 'Next',\n stepFinish: 'Finish',\n stepReview: 'Review',\n stepSteps: 'Steps',\n stepOf: 'Step {n} of {total}',\n secretShow: 'Show value',\n secretHide: 'Hide value',\n secretStored: 'A value is saved. It cannot be shown again.',\n secretReplace: 'Replace',\n secretKeep: 'Keep current',\n secretWarnTitle: 'Replace the saved value?',\n secretWarn: 'The saved value cannot be displayed and will be discarded as soon as you replace it. Type the new value next; it takes effect when you save.',\n gridSelected: '{n} selected',\n gridSelectAll: 'Select all {n}',\n gridClearSel: 'Clear selection',\n gridSelectRow: 'Select row',\n gridSelectPage: 'Select all rows',\n gridRowActions: 'Row actions',\n gridColumns: 'Columns',\n gridResize: 'Resize column',\n gridGroupAll: 'All',\n gridOtherCols: 'Other',\n gridGroups: 'Column groups',\n gridColumnSearch: 'Search columns',\n gridNoColumns: 'No matching columns',\n noResults: 'No results',\n results: '{n} results',\n pageFirst: 'First page',\n pagePrev: 'Previous page',\n pageNext: 'Next page',\n pageLast: 'Last page',\n pageLabel: 'Pagination',\n pageGoto: 'Page {n}',\n pageInfo: '{from}\u2013{to} of {total}',\n calPrev: 'Previous',\n calNext: 'Next',\n calOpen: 'Open calendar',\n calMonth: 'Choose month',\n breadcrumb: 'Breadcrumb',\n breadcrumbMore: 'Show more',\n sortAsc: 'sorted ascending',\n sortDesc: 'sorted descending',\n};\n\nconst ptBR: Locale = {\n _lang: 'pt-BR',\n _currency: 'BRL',\n _firstDay: '0',\n required: 'Campo obrigat\u00F3rio',\n minLength: 'Informe ao menos {n} caracteres',\n maxLength: 'Informe no m\u00E1ximo {n} caracteres',\n pattern: 'Formato inv\u00E1lido',\n email: 'Informe um e-mail v\u00E1lido',\n min: 'Deve ser no m\u00EDnimo {n}',\n max: 'Deve ser no m\u00E1ximo {n}',\n range: 'Deve estar entre {min} e {max}',\n number: 'Informe um n\u00FAmero v\u00E1lido',\n date: 'Informe uma data v\u00E1lida',\n dateMin: 'A data deve ser {n} ou posterior',\n dateMax: 'A data deve ser {n} ou anterior',\n notInList: 'Escolha um valor da lista',\n loading: 'Carregando',\n close: 'Fechar',\n ok: 'OK',\n cancel: 'Cancelar',\n clear: 'Limpar',\n collapse: 'Recolher',\n expand: 'Expandir',\n empty: 'Sem dados',\n search: 'Pesquisar',\n lookupOpen: 'Abrir pesquisa',\n lookupSelect: 'Selecionar',\n fbEq: 'igual a',\n fbNe: 'diferente de',\n fbContains: 'cont\u00E9m',\n fbNotContains: 'n\u00E3o cont\u00E9m',\n fbStarts: 'come\u00E7a com',\n fbEnds: 'termina com',\n fbGt: 'maior que',\n fbGe: 'maior ou igual a',\n fbLt: 'menor que',\n fbLe: 'menor ou igual a',\n fbBetween: 'entre',\n fbNotBetween: 'fora do intervalo',\n fbIn: '\u00E9 um de',\n fbNin: 'n\u00E3o \u00E9 nenhum de',\n fbEmpty: 'est\u00E1 vazio',\n fbNotEmpty: 'n\u00E3o est\u00E1 vazio',\n fbAnd: 'Todas (E)',\n fbOr: 'Qualquer uma (OU)',\n fbAddFilter: 'Adicionar filtro',\n fbAddGroup: 'Adicionar grupo',\n fbRemove: 'Remover',\n fbClear: 'Limpar tudo',\n fbApply: 'Aplicar',\n fbField: 'Campo',\n fbOperator: 'Operador',\n fbValue: 'Valor',\n fbTo: 'e',\n fbList: 'a, b, c',\n fbNone: 'Sem filtros',\n fbLabel: 'Filtros',\n views: 'Vis\u00F5es',\n viewsName: 'Nome desta vis\u00E3o',\n viewsSave: 'Salvar vis\u00E3o',\n viewsSaveAs: 'Salvar como nova vis\u00E3o\u2026',\n viewsDefault: 'Abrir com esta vis\u00E3o',\n viewsDelete: 'Excluir vis\u00E3o',\n viewsConfirmDelete: 'Excluir a vis\u00E3o \"{n}\"?',\n viewsReset: 'Voltar ao inicial',\n cpPlaceholder: 'Digite um comando ou pesquise\u2026',\n cpLabel: 'Paleta de comandos',\n cpFilters: 'Categorias',\n cpAll: 'Todas',\n cpEmpty: 'Nenhum comando encontrado',\n cpHint: '\u2191\u2193 navegar \u00B7 Enter executar \u00B7 Esc fechar',\n chatPlaceholder: 'Digite uma mensagem',\n chatSend: 'Enviar',\n chatTyping: '{n} est\u00E1 digitando\u2026',\n chatToday: 'Hoje',\n chatYesterday: 'Ontem',\n chatEmpty: 'Nenhuma mensagem ainda',\n chatLog: 'Conversa',\n chatSuggestions: 'Sugest\u00F5es',\n chatReply: 'Responder',\n wDockLeft: 'Fixar \u00E0 esquerda',\n wDockRight: 'Fixar \u00E0 direita',\n wDockTop: 'Fixar em cima',\n wDockBottom: 'Fixar embaixo',\n tabErrors: 'erros',\n stepOptional: 'opcional',\n stepDone: 'conclu\u00EDda',\n stepError: 'com erros',\n stepBack: 'Voltar',\n stepNext: 'Pr\u00F3ximo',\n stepFinish: 'Concluir',\n stepReview: 'Revis\u00E3o',\n stepSteps: 'Etapas',\n stepOf: 'Etapa {n} de {total}',\n secretShow: 'Mostrar valor',\n secretHide: 'Ocultar valor',\n secretStored: 'H\u00E1 um valor salvo. Ele n\u00E3o pode ser exibido novamente.',\n secretReplace: 'Substituir',\n secretKeep: 'Manter o atual',\n secretWarnTitle: 'Substituir o valor salvo?',\n secretWarn: 'O valor salvo n\u00E3o pode ser exibido e ser\u00E1 descartado assim que voc\u00EA o substituir. Digite o novo valor em seguida; ele s\u00F3 vale quando voc\u00EA salvar.',\n gridSelected: '{n} selecionado(s)',\n gridSelectAll: 'Selecionar todos os {n}',\n gridClearSel: 'Limpar sele\u00E7\u00E3o',\n gridSelectRow: 'Selecionar linha',\n gridSelectPage: 'Selecionar todas as linhas',\n gridRowActions: 'A\u00E7\u00F5es da linha',\n gridColumns: 'Colunas',\n gridResize: 'Redimensionar coluna',\n gridGroupAll: 'Todas',\n gridOtherCols: 'Outras',\n gridGroups: 'Grupos de colunas',\n gridColumnSearch: 'Buscar colunas',\n gridNoColumns: 'Nenhuma coluna encontrada',\n noResults: 'Nenhum resultado',\n results: '{n} resultados',\n pageFirst: 'Primeira p\u00E1gina',\n pagePrev: 'P\u00E1gina anterior',\n pageNext: 'Pr\u00F3xima p\u00E1gina',\n pageLast: '\u00DAltima p\u00E1gina',\n pageLabel: 'Pagina\u00E7\u00E3o',\n pageGoto: 'P\u00E1gina {n}',\n pageInfo: '{from}\u2013{to} de {total}',\n calPrev: 'Anterior',\n calNext: 'Pr\u00F3ximo',\n calOpen: 'Abrir calend\u00E1rio',\n calMonth: 'Escolher m\u00EAs',\n breadcrumb: 'Trilha de navega\u00E7\u00E3o',\n breadcrumbMore: 'Mostrar mais',\n sortAsc: 'ordenado crescente',\n sortDesc: 'ordenado decrescente',\n};\n\nexport const locales: Record<string, Locale> = { en, 'pt-BR': ptBR };\nlet current: Locale = en;\n\n/** Picks a registered locale by name (`'pt-BR'`, or `'pt'` as a prefix) or merges a custom object over English. */\nexport function setLocale(l: string | Locale): void {\n if (typeof l === 'string') {\n current = locales[l] ?? locales[Object.keys(locales).find((k) => k.startsWith(l.split('-')[0])) ?? 'en'];\n } else {\n current = { ...en, ...l };\n if (l._lang) locales[l._lang] = current;\n }\n}\n\nexport const getLocale = (): Locale => current;\n\n/** Translates a key, replacing `{name}` placeholders. */\nexport function t(key: string, vars?: Record<string, string | number>): string {\n const s = current[key] ?? en[key] ?? key;\n return vars ? s.replace(/\\{(\\w+)\\}/g, (_, k) => String(vars[k] ?? '')) : s;\n}\n"],
5
- "mappings": "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",
6
- "names": ["Emitter", "name", "fn", "list", "off", "a", "f", "args", "ok", "en", "ptBR", "locales", "current", "setLocale", "l", "k", "getLocale", "t", "key", "vars", "s", "_"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as R}from"./chunk-ZCAAM4NH.js";import{a as T}from"./chunk-ARCW54L2.js";import{a as k}from"./chunk-SNTHW4K2.js";import{a as H}from"./chunk-LMGCV35W.js";import{a as S,b as y}from"./chunk-OWEQT2HN.js";import{c as A}from"./chunk-NDBFYIL6.js";import{c as x}from"./chunk-JTYWZMSZ.js";import{a as m}from"./chunk-XZEOSW3Q.js";import{c as w}from"./chunk-IHAYOSBR.js";import{a as L,b as M}from"./chunk-IYPKPLCU.js";import{b as l}from"./chunk-PZSHOSOS.js";import{e as u}from"./chunk-MA5BJL3S.js";var v="__select",g="__actions",B={field:v,width:44,align:"center",cls:"op-grid__selcell"},G={field:g,width:44,align:"center",cls:"op-grid__actcell"},z="var(--op-grid-row-height, var(--op-row-height))",E=class extends L{baseCls="op-grid";store;offStore;headEl;headRow;viewport;emptyEl;pager;v;selected=new Set;active=-1;anchor=-1;justDragged=!1;cv=0;selAll;barEl;bulkEl;bulkCount;bulkBtns=[];selectAllBtn;rowMenu;colDd;colList;colSearch;colChips;colGroup="";cols(){let e=this.config;return[...e.checkboxSelection?[B]:[],...this.userCols(),...e.rowActions?.length?[G]:[]]}userCols(){return(this.config.columns??[]).filter(e=>!e.hidden)}visibleActions(){return this.config.rowActionsMode==="visible"&&!!this.config.rowActions?.length}mode(){return this.config.checkboxSelection?"multi":this.config.selection??"single"}build(){let e=this.config,i=l("div",this.baseCls,{role:"grid",tabindex:0,"aria-multiselectable":e.selection==="multi"||e.checkboxSelection?"true":null});return this.headRow=l("div","op-grid__row op-grid__header-row",{role:"row"}),this.headEl=l("div","op-grid__header",{},this.headRow),this.viewport=l("div","op-grid__viewport"),this.emptyEl=l("div","op-grid__empty"),(e.columnMenu||e.bulkActions?.length)&&(this.bulkEl=l("div","op-grid__bulk"),this.bulkEl.hidden=!0,this.barEl=l("div","op-grid__bar",{},this.bulkEl),i.append(this.barEl)),i.append(this.headEl,this.viewport,this.emptyEl),i.classList.toggle("op-grid--striped",!!e.striped),e.paging&&(this.pager=new H({cls:"op-grid__pager"}),i.append(this.pager.el)),i}onRender(){let e=this.config;if(this.bindStore(e.store??new x({data:e.data??[]})),this.buildHeader(),this.buildBar(),this.v=S({scroller:this.viewport,count:this.store.count,rowHeight:e.rowHeight??(y(this.el,z)||36),render:(i,t)=>this.renderRow(i,t),rowCls:"op-grid__row op-grid__body-row"}),this.own(()=>this.v.destroy()),this.sync(),this.listen(this.viewport,"scroll",()=>this.headEl.scrollLeft=this.viewport.scrollLeft,{passive:!0}),this.listen(this.viewport,"click",i=>this.onRowEvent(i,"row-click")),this.listen(this.viewport,"dblclick",i=>this.onRowEvent(i,"row-dblclick")),this.listen(this.el,"keydown",i=>this.onKey(i)),this.listen(this.headRow,"change",i=>{i.target===this.selAll&&(this.selAll.checked?this.store.each(t=>this.selected.add(t)):this.config.keepSelection?this.store.each(t=>this.selected.delete(t)):this.selected.clear(),this.changed())}),e.reorderableColumns&&this.initColumnDrag(),e.resizableColumns&&this.initColumnResize(),this.listen(this.headRow,"click",i=>{if(this.justDragged||i.target.closest(".op-grid__resizer"))return;let t=i.target.closest("[data-field]"),s=t&&this.userCols().find(o=>o.field===t.dataset.field);s&&(this.emit("column-click",s),s.sortable&&this.sortBy(s))}),typeof ResizeObserver<"u"){let i=new ResizeObserver(()=>this.layout());i.observe(this.viewport),this.own(()=>i.disconnect())}this.pager&&(this.pager.setStore(this.store),this.store.pageSize||this.store.setPageSize(e.pageSize??20)),this.own(()=>this.pager?.destroy())}notifyMount(){super.notifyMount(),this.layout(),this.pager?.notifyMount()}layout(){if(this.rendered){if(!this.config.rowHeight){let e=y(this.el,z);e&&this.v.setRowHeight(e)}this.headEl.style.paddingInlineEnd=`${this.viewport.offsetWidth-this.viewport.clientWidth}px`,this.v.refresh()}}bindStore(e){this.offStore?.(),this.store=e;let i=e.subscribe(s=>{this.rendered&&(this.sync(),s.type==="sort"&&this.paintSort())}),t=e.on("loading",s=>this.setLoading(s));this.offStore=()=>(i(),t()),this.own(()=>this.offStore?.())}sync(){let e=this.selected.size;if(!this.config.keepSelection)for(let i of this.selected)this.store.indexOf(i)<0&&this.selected.delete(i);this.active=Math.min(this.active,this.store.count-1),this.v.setCount(this.store.count),this.el.setAttribute("aria-rowcount",String(this.store.totalCount+1)),this.emptyEl.textContent=this.config.emptyText??u("empty"),this.emptyEl.hidden=this.store.count>0||!!this.config.loading,this.el.classList.toggle("is-empty",this.store.count===0),this.updateActiveDescendant(),this.paintSelection(),this.selected.size!==e&&this.emit("select",this.getSelection())}setStore(e){this.config.store=e,this.selected.clear(),this.active=this.anchor=-1,this.rendered&&(this.bindStore(e),this.pager?.setStore(e),this.paintSort(),this.sync())}getStore(){return this.render(),this.store}layoutColumns(){let e=this.cols(),i=this.visibleActions()?this.config.rowActions.length:1,t=o=>o.field===g?`calc(${i} * var(--op-grid-action-size) + ${i+1} * var(--op-grid-action-gap))`:`${o.width}px`,s=e.map(o=>o.field===g?t(o):o.width?`${o.width}px`:`minmax(${o.minWidth??96}px, ${o.flex??1}fr)`).join(" ");this.el.style.setProperty("--op-grid-cols",s),this.el.style.setProperty("--op-grid-min-width",`${e.reduce((o,n)=>o+(n.field===g?i*36:n.width??n.minWidth??96),0)}px`)}buildHeader(){let e=this.cols();this.layoutColumns(),this.el.classList.toggle("op-grid--actions-visible",this.visibleActions()),this.el.classList.toggle("op-grid--reorderable",!!this.config.reorderableColumns),this.el.classList.toggle("op-grid--resizable",!!this.config.resizableColumns),this.el.setAttribute("aria-colcount",String(e.length)),this.selAll=void 0,this.headRow.replaceChildren(...e.map((t,s)=>{let o=t.header??t.field,n=l("div",`op-grid__cell op-grid__hcell${t.align?` op-grid__cell--${t.align}`:""}${t.sortable?" is-sortable":""}`,{role:"columnheader","aria-colindex":s+1,"data-field":t.field});t.field===v?n.append(this.selAll=l("input","op-grid__check",{type:"checkbox","aria-label":u("gridSelectPage")})):t.field===g?n.setAttribute("aria-label",u("gridRowActions")):t.sortable?n.append(l("button","op-grid__sort",{type:"button"},l("span","op-grid__label",{},o),l("span","op-grid__arrow",{"aria-hidden":"true"},w("arrow-up")))):n.append(l("span","op-grid__label",{},o));let r=t.field!==v&&t.field!==g;return this.config.reorderableColumns&&r&&n.classList.add("is-reorderable"),this.canResize(t)&&n.append(l("span","op-grid__resizer",{role:"separator","aria-orientation":"vertical","aria-label":`${u("gridResize")} ${o}`})),r&&!t.sortable&&(this.config.reorderableColumns||this.canResize(t))&&(n.tabIndex=0),n}));let i=this.groupBand(e);this.headEl.replaceChildren(...i?[i]:[],this.headRow),this.paintSort()}groupBand(e){if(this.config.groupHeaders===!1||!e.some(s=>s.group))return null;let i=[],t=0;for(;t<e.length;){let s=e[t].group??"",o=1;for(;t+o<e.length&&(e[t+o].group??"")===s;)o++;let n=l("div",`op-grid__gcell${s?"":" is-empty"}`,{role:"columnheader","aria-colindex":t+1,"aria-colspan":o},s);n.style.gridColumn=`span ${o}`,i.push(n),t+=o}return l("div","op-grid__row op-grid__group-row",{role:"row"},...i)}getColumnGroups(){return[...new Set(this.config.columns.map(e=>e.group).filter(e=>!!e))]}setColumnGroupVisible(e,i){let t=this.config.columns.filter(s=>(s.group??"")===e);if(t.length){for(let s of t)s.hidden=!i;this.config.columns.some(s=>!s.hidden)||(t[0].hidden=!1),this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}}setColumns(e){this.config.columns=e,this.rendered&&(this.cv++,this.buildHeader(),this.paintSelection(),this.v.refresh())}getColumnState(){return this.config.columns.map(e=>({field:e.field,hidden:!!e.hidden,width:e.width}))}setColumnState(e){let i=new Map(this.config.columns.map(s=>[s.field,s])),t=e.flatMap(s=>{let o=i.get(s.field);return i.delete(s.field),o?[{...o,hidden:s.hidden,width:s.width??o.width}]:[]});this.setColumns([...t,...i.values()]),this.emit("columns-change",this.getColumnState())}canResize(e){return!!this.config.resizableColumns&&e.field!==v&&e.field!==g&&e.resizable!==!1}setColumnWidth(e,i){let t=this.config.columns.find(s=>s.field===e);t&&(t.width=i==null?void 0:Math.round(Math.max(t.minWidth??48,Math.min(i,t.maxWidth??1/0))),this.layoutColumns(),this.emit("column-resize",e,t.width),this.emit("columns-change",this.getColumnState()))}initColumnResize(){let e=this.headRow;this.listen(e,"pointerdown",i=>{let t=i.target.closest(".op-grid__resizer");if(!t||i.button)return;i.preventDefault();let s=t.parentElement,o=s.dataset.field,n=this.config.columns.find(p=>p.field===o),r=i.clientX,a=s.getBoundingClientRect().width||n.width||96;this.el.classList.add("is-resizing");let h=n.width,c=p=>{let f=Math.round(Math.max(n.minWidth??48,Math.min(a+(p.clientX-r)*(this.dir()==="rtl"?-1:1),n.maxWidth??1/0)));n.width=h=f,this.layoutColumns()},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),this.el.classList.remove("is-resizing"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),h!==void 0&&(this.emit("column-resize",o,h),this.emit("columns-change",this.getColumnState()))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d)))}),this.listen(e,"dblclick",i=>{let t=i.target.closest(".op-grid__resizer");t&&this.setColumnWidth(t.parentElement.dataset.field,void 0)}),this.listen(e,"keydown",i=>{if(!(i.altKey&&i.shiftKey)||i.key!=="ArrowLeft"&&i.key!=="ArrowRight")return;let t=i.target.closest(".op-grid__hcell"),s=t&&this.config.columns.find(n=>n.field===t.dataset.field);if(!t||!s||!this.canResize(s))return;i.preventDefault();let o=t.getBoundingClientRect().width||s.width||96;this.setColumnWidth(s.field,o+(i.key==="ArrowRight"?16:-16))})}dir(){return getComputedStyle(this.el).direction}moveColumn(e,i){let t=this.config.columns,s=t.find(d=>d.field===e);if(!s||e===i)return;let o=this.userCols(),n=o.indexOf(s),r=[...t.filter(d=>d!==s)],a=i==null?void 0:r.find(d=>d.field===i),h=o.filter(d=>d!==s).pop(),c=a?r.indexOf(a):h?r.indexOf(h)+1:r.length;r.splice(c,0,s),!r.every((d,p)=>d===t[p])&&(this.setColumns(r),this.emit("column-move",e,n,this.userCols().indexOf(s)),this.emit("columns-change",this.getColumnState()))}initColumnDrag(){let e=this.headRow,i=()=>Array.from(e.querySelectorAll(".is-reorderable"));this.listen(e,"pointerdown",t=>{let s=t.target.closest(".is-reorderable");if(!s||t.button||t.target.closest(".op-grid__resizer"))return;let o=s.dataset.field,n=t.clientX,r,a,h=null,c=p=>{if(!r){if(Math.abs(p.clientX-n)<6)return;r=l("div","op-grid__ghost",{},s.textContent??""),a=l("div","op-grid__drop"),this.el.append(r),this.headEl.append(a),s.classList.add("is-dragging-col")}r.style.left=`${p.clientX}px`,r.style.top=`${p.clientY}px`;let f=i(),b=f.find(D=>{let _=D.getBoundingClientRect();return p.clientX<_.left+_.width/2});h=b?b.dataset.field:null;let C=(b??f[f.length-1])?.getBoundingClientRect(),$=this.headEl.getBoundingClientRect();C&&a&&(a.style.left=`${(b?C.left:C.right)-$.left+this.headEl.scrollLeft}px`)},d=()=>{document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d),r&&(r.remove(),a?.remove(),s.classList.remove("is-dragging-col"),this.justDragged=!0,setTimeout(()=>this.justDragged=!1),this.moveColumn(o,h))};document.addEventListener("pointermove",c),document.addEventListener("pointerup",d),this.own(()=>(document.removeEventListener("pointermove",c),document.removeEventListener("pointerup",d)))}),this.listen(e,"keydown",t=>{if(!t.altKey||t.shiftKey||t.key!=="ArrowLeft"&&t.key!=="ArrowRight")return;let s=t.target.closest(".is-reorderable");if(!s)return;t.preventDefault();let o=this.userCols(),n=o.findIndex(h=>h.field===s.dataset.field),r=t.key==="ArrowLeft"?n-1:n+1;if(r<0||r>=o.length)return;this.moveColumn(o[n].field,t.key==="ArrowLeft"?o[r].field:o[r+1]?.field??null);let a=e.querySelector(`[data-field="${CSS.escape(o[n].field)}"]`);(a?.querySelector("button")??a)?.focus()})}paintSort(){let e=this.store.getSorters()[0];for(let i of Array.from(this.headRow.children)){let t=!!e&&i.dataset.field===e.field;i.classList.toggle("is-sorted-asc",t&&e.dir==="asc"),i.classList.toggle("is-sorted-desc",t&&e.dir==="desc"),i.classList.contains("is-sortable")&&i.setAttribute("aria-sort",t?e.dir==="asc"?"ascending":"descending":"none")}}sortBy(e){let i=this.store.getSorters()[0],t=i?.field===e.field?i.dir==="asc"?"desc":null:"asc";this.emit("before-sort",e.field,t)!==!1&&(this.store.sort(t?e.field:null,t??void 0),this.emit("sort",e.field,t))}rowIndexOffset(){return this.store.pageSize?(this.store.page-1)*this.store.pageSize:0}renderRow(e,i){let t=this.store.getAt(i);if(!t)return;let s=this.cols();e.id=`${this.id}-r${i}`,e.dataset.i=String(i),e.setAttribute("role","row"),e.setAttribute("aria-rowindex",String(this.rowIndexOffset()+i+2));let o=this.selected.has(t);e.setAttribute("aria-selected",this.mode()==="none"?"false":String(o)),e.classList.toggle("is-selected",o),e.classList.toggle("is-active",i===this.active),e.classList.toggle("is-odd",i%2===1),(e.dataset.cv!==String(this.cv)||e.children.length!==s.length)&&(e.dataset.cv=String(this.cv),e.replaceChildren(...s.map((n,r)=>l("div",`op-grid__cell${n.align?` op-grid__cell--${n.align}`:""}${n.cls?` ${n.cls}`:""}`,{role:"gridcell","aria-colindex":r+1})))),s.forEach((n,r)=>{let a=e.children[r];if(n.field===v){let c=a.firstElementChild??a.appendChild(l("input","op-grid__check",{type:"checkbox",tabindex:-1,"aria-label":u("gridSelectRow")}));c.checked=o;return}if(n.field===g){let c=this.config.rowActions??[];if(!this.visibleActions()){a.firstChild||a.append(l("button","op-grid__actbtn",{type:"button",tabindex:-1,"aria-label":u("gridRowActions"),"aria-haspopup":"menu"},w("more")));return}(a.children.length!==c.length||a.firstElementChild?.dataset.a==null)&&a.replaceChildren(...c.map((d,p)=>l("button",`op-grid__actbtn${d.variant==="danger"?" is-danger":""}`,{type:"button",tabindex:-1,"data-a":p,"aria-label":d.text,title:d.text},d.icon?w(d.icon):d.text))),c.forEach((d,p)=>a.children[p].disabled=!!d.disabled?.(t));return}let h=A(n,t);typeof h=="string"?a.textContent=h:a.replaceChildren(h)})}indexOfEvent(e){let i=e.target.closest(".op-grid__body-row");return i?Number(i.dataset.i):-1}onRowEvent(e,i){let t=this.indexOfEvent(e),s=this.store.getAt(t);if(s){if(i==="row-click"){let o=e.target.closest(".op-grid__actbtn");if(o){if(o.dataset.a==null)return this.openRowMenu(s,o);o.disabled||this.config.rowActions[Number(o.dataset.a)].handler(s,this);return}this.setActive(t,!1),this.pick(t,e)}this.emit(i,s,t,e)}}getSelection(){return[...this.selected]}select(e,i={}){let t=typeof e=="number"?this.store.getAt(e):e,s=this.mode();!t||s==="none"||((s==="single"||!i.add)&&this.selected.clear(),this.selected.add(t),this.changed())}deselectAll(){this.selected.size&&(this.selected.clear(),this.changed())}changed(){this.v?.refresh(),this.paintSelection(),this.emit("select",this.getSelection())}selectAllFiltered(){if(this.mode()==="multi"){for(let e of this.store.getFiltered())this.selected.add(e);this.changed()}}pick(e,i){let t=this.mode(),s=this.store.getAt(e);if(!(!s||t==="none")){if(t==="multi"&&i.shiftKey&&this.anchor>=0){this.config.checkboxSelection||this.selected.clear();for(let o of this.store.getRange(Math.min(this.anchor,e),Math.max(this.anchor,e)+1))this.selected.add(o)}else t==="multi"&&(i.ctrlKey||i.metaKey||this.config.checkboxSelection)?(this.selected.delete(s)||this.selected.add(s),this.anchor=e):(this.selected.clear(),this.selected.add(s),this.anchor=e);this.changed()}}setActive(e,i=!0){this.active=e,i&&e>=0&&this.v.scrollTo(e),this.v.refresh(),this.updateActiveDescendant()}updateActiveDescendant(){this.active>=0&&this.active<this.store.count?this.el.setAttribute("aria-activedescendant",`${this.id}-r${this.active}`):this.el.removeAttribute("aria-activedescendant")}focusRow(e){this.render(),this.setActive(Math.max(0,Math.min(e,this.store.count-1))),this.el.focus()}scrollToRow(e){this.v?.scrollTo(e)}onKey(e){if(e.target.closest(".op-grid__header"))return;let i=this.store.count;if(!i)return;if((e.key==="ContextMenu"||e.shiftKey&&e.key==="F10")&&this.active>=0&&this.config.rowActions?.length)return e.preventDefault(),this.openRowMenu(this.store.getAt(this.active),document.getElementById(`${this.id}-r${this.active}`)??this.el);let t=Math.max(1,Math.floor((this.viewport.clientHeight||400)/this.config.rowHeight||10)),s=this.active<0?0:this.active,o=this.mode(),n={ArrowDown:Math.min(i-1,this.active<0?0:s+1),ArrowUp:Math.max(0,s-1),Home:0,End:i-1,PageDown:Math.min(i-1,s+t),PageUp:Math.max(0,s-t)};if(e.key in n){e.preventDefault();let r=n[e.key];this.setActive(r),(o==="single"||o==="multi"&&!e.ctrlKey&&!e.metaKey&&!this.config.checkboxSelection)&&this.pick(r,e)}else e.key===" "&&this.active>=0?(e.preventDefault(),o==="multi"?this.pick(this.active,{ctrlKey:!0}):this.pick(this.active,e)):e.key==="Enter"&&this.active>=0?this.emit("row-activate",this.store.getAt(this.active),this.active):(e.key==="a"||e.key==="A")&&(e.ctrlKey||e.metaKey)&&o==="multi"&&(e.preventDefault(),this.store.each(r=>this.selected.add(r)),this.changed())}refresh(){this.v?.refresh()}buildBar(){let e=this.config;if(!this.barEl)return;this.bulkCount=l("span","op-grid__count",{"aria-live":"polite"}),this.selectAllBtn=new m({text:"",variant:"ghost",handler:()=>this.selectAllFiltered()}),this.bulkBtns=(e.bulkActions??[]).map(t=>new m({text:t.text,icon:t.icon,variant:t.variant==="danger"?"danger":"default",handler:()=>t.handler(this.getSelection(),this)}));let i=new m({text:u("gridClearSel"),variant:"ghost",handler:()=>this.deselectAll()});this.bulkEl.append(this.bulkCount,this.selectAllBtn.el,...this.bulkBtns.map(t=>t.el),i.el),this.own(()=>[this.selectAllBtn,...this.bulkBtns,i].forEach(t=>t?.destroy())),e.columnMenu&&this.buildColumnMenu(),this.paintSelection()}paintSelection(){if(!this.rendered)return;let e=this.store.count,i=0;if(this.store.each(o=>this.selected.has(o)&&i++),this.selAll&&(this.selAll.checked=e>0&&i===e,this.selAll.indeterminate=i>0&&i<e),!this.bulkEl)return;let t=this.selected.size;if(this.bulkEl.hidden=!t||!this.config.bulkActions?.length,this.bulkEl.hidden)return;this.bulkCount.textContent=u("gridSelected",{n:t});let s=this.store.getFiltered().length;this.selectAllBtn.el.hidden=!(this.mode()==="multi"&&i===e&&s>e&&t<s),this.selectAllBtn.setText(u("gridSelectAll",{n:s}))}openRowMenu(e,i){this.rowMenu??=new R({}),this.rowMenu.setItems((this.config.rowActions??[]).map(t=>({text:t.text,icon:t.icon,disabled:!!t.disabled?.(e),handler:()=>t.handler(e,this)}))),this.rowMenu.showBy(i)}buildColumnMenu(){let e=new m({text:u("gridColumns"),icon:"columns",variant:"ghost"});this.colSearch=new k({placeholder:u("gridColumnSearch"),clearable:!0}),this.colChips=l("div","op-grid__colchips",{role:"group","aria-label":u("gridGroups")}),this.colList=l("div","op-grid__collist",{role:"group","aria-label":u("gridColumns")});let i=l("div","op-grid__colempty",{},u("gridNoColumns"));i.hidden=!0;let t=l("div","op-grid__colmenu",{},this.colSearch.el,this.colChips,this.colList,i);this.colDd=new T({anchor:e.el,content:t,placement:"bottom-end",role:"dialog",autoFocus:!1}),this.barEl.append(e.el),this.own(()=>e.destroy());let s=()=>{let o=(this.colSearch.getValue()??"").toLowerCase(),n=0,r,a=0,h=()=>r&&(r.hidden=a===0);for(let c of Array.from(this.colList.children)){if(c.classList.contains("op-grid__colgroup")){h(),r=c,a=0;continue}let d=c.dataset.group??"",p=!this.colGroup||d===this.colGroup,f=!o||d.toLowerCase().includes(o)||c.textContent.toLowerCase().includes(o);c.hidden=!(p&&f),c.hidden||(n++,a++)}h(),i.hidden=n>0};this.colSearch.on("change",s),this.listen(this.colChips,"click",o=>{let n=o.target.closest("[data-g]");n&&(this.colGroup=n.dataset.g,this.paintColumnList(),s())}),e.on("click",()=>{if(this.colDd.isOpen())return this.colDd.close();this.colSearch.setValue(""),this.colGroup="",this.paintColumnList(),this.colDd.open(),this.colSearch.focus()}),this.listen(this.colList,"change",o=>{let n=o.target;if(n.dataset.groupToggle!=null)this.setColumnGroupVisible(n.dataset.groupToggle,n.checked);else{let r=this.config.columns.find(a=>a.field===n.value);if(!r)return;r.hidden=!n.checked,this.setColumns(this.config.columns),this.emit("columns-change",this.getColumnState())}this.paintColumnList(),s()})}paintColumnList(){let e=this.config.columns,i=this.getColumnGroups(),t=this.userCols().length===1?this.userCols()[0]:null,s=n=>{let r=l("input","op-grid__check",{type:"checkbox",value:n.field});return r.checked=!n.hidden,r.disabled=n===t,l("label","op-grid__colitem",{"data-group":n.group??""},r,l("span","",{},n.header??n.field))};if(this.colChips.hidden=i.length<2,this.colChips.replaceChildren(...[["",u("gridGroupAll")],...i.map(n=>[n,n])].map(([n,r])=>l("button",`op-grid__colchip${this.colGroup===n?" is-on":""}`,{type:"button","data-g":n,"aria-pressed":String(this.colGroup===n)},r))),!i.length)return this.colList.replaceChildren(...e.map(s));let o=[];for(let n of[...i,""]){let r=e.filter(c=>(c.group??"")===n);if(!r.length)continue;let a=r.filter(c=>!c.hidden).length,h=l("input","op-grid__check",{type:"checkbox","data-group-toggle":n,"aria-label":n||u("gridOtherCols")});h.checked=a===r.length,h.indeterminate=a>0&&a<r.length,o.push(l("div","op-grid__colgroup",{"data-group":n},l("label","",{},h,l("span","",{},n||u("gridOtherCols"))),l("span","op-grid__colcount",{},`${a}/${r.length}`)),...r.map(s))}this.colList.replaceChildren(...o)}onDestroy(){this.pager?.destroy(),this.rowMenu?.destroy(),this.colDd?.destroy(),this.colSearch?.destroy()}};M("grid",E);export{E as a};
2
- //# sourceMappingURL=chunk-NHVEP72K.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/data/grid/grid.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 { virtualize, measure } from '../../../core/virtual';\nimport { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport { cellContent, type Column } from '../../../data/column';\nimport { iconEl } from '../../base/icon/icon';\nimport { Pagination } from '../pagination/pagination';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Dropdown } from '../../overlays/dropdown/dropdown';\nimport { Menu } from '../../overlays/menu/menu';\n\nexport interface GridConfig extends ComponentConfig {\n store?: Store<any>;\n /** Used when no `store` is given. */\n data?: Record<string, any>[];\n columns: Column[];\n selection?: 'none' | 'single' | 'multi';\n /** Row height in px. Default: measured from the `--op-grid-row-height` / `--op-row-height` tokens. */\n rowHeight?: number;\n /** Adds a Pagination bar bound to the store (give the store a `pageSize`, or set it here). */\n paging?: boolean;\n pageSize?: number;\n emptyText?: string;\n striped?: boolean;\n /** Adds a leading checkbox column with a select-all in the header. Implies multi selection; a row click toggles. */\n checkboxSelection?: boolean;\n /** Keep selected records when the page or the filters change. Default false. */\n keepSelection?: boolean;\n /** Buttons shown in a bar above the header while records are selected. */\n bulkActions?: GridAction[];\n /** Actions at the end of every row (see `rowActionsMode`). */\n rowActions?: GridRowAction[];\n /** `'menu'` (default): one \"\u22EF\" button opens a menu. `'visible'`: every action is an icon button, always shown (dimmed until the row is hovered, active or selected). */\n rowActionsMode?: 'menu' | 'visible';\n /** A \"Columns\" button in the bar: toggle columns on and off, with search. */\n columnMenu?: boolean;\n /** Drag a header to a new place (or Alt+\u2190/\u2192 on a focused header). `column-move` and `columns-change` fire; ViewManager saves the order. */\n reorderableColumns?: boolean;\n /** A handle on each header's edge: drag to resize (double-click resets), Alt+Shift+\u2190/\u2192 on a focused header. Widths are part of `getColumnState`. */\n resizableColumns?: boolean;\n /** Show the group labels (`Column.group`) as a band over the header. Default true when any column has a group. */\n groupHeaders?: boolean;\n}\n\nexport interface GridAction {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n handler: (records: Model[], grid: Grid) => void;\n}\nexport interface GridRowAction {\n text: string;\n icon?: string;\n variant?: 'default' | 'danger';\n /** Disabled for the records where this returns true. */\n disabled?: (record: Model) => boolean;\n handler: (record: Model, grid: Grid) => void;\n}\nexport interface ColumnState {\n field: string;\n hidden: boolean;\n width?: number;\n}\n\nconst SEL = '__select';\nconst ACT = '__actions';\nconst SEL_COL: Column = { field: SEL, width: 44, align: 'center', cls: 'op-grid__selcell' };\nconst ACT_COL: Column = { field: ACT, width: 44, align: 'center', cls: 'op-grid__actcell' };\n\nconst ROW = 'var(--op-grid-row-height, var(--op-row-height))';\n\n/** Data grid with a virtualized body: only the visible rows (plus a small overscan) exist in the DOM. */\nexport class Grid extends Component<GridConfig> {\n protected override baseCls = 'op-grid';\n private store!: Store<any>;\n private offStore?: () => void;\n private headEl!: HTMLElement;\n private headRow!: HTMLElement;\n private viewport!: HTMLElement;\n private emptyEl!: HTMLElement;\n private pager?: Pagination;\n private v!: ReturnType<typeof virtualize>;\n private selected = new Set<Model>();\n private active = -1;\n private anchor = -1;\n private justDragged = false;\n private cv = 0; // bumps when the columns change, so pooled rows rebuild their cells\n private selAll?: HTMLInputElement;\n private barEl?: HTMLElement;\n private bulkEl?: HTMLElement;\n private bulkCount?: HTMLElement;\n private bulkBtns: Button[] = [];\n private selectAllBtn?: Button;\n private rowMenu?: Menu;\n private colDd?: Dropdown;\n private colList?: HTMLElement;\n private colSearch?: TextField;\n private colChips?: HTMLElement;\n private colGroup = '';\n\n private cols(): Column[] {\n const c = this.config;\n return [...(c.checkboxSelection ? [SEL_COL] : []), ...this.userCols(), ...(c.rowActions?.length ? [ACT_COL] : [])];\n }\n private userCols(): Column[] {\n return (this.config.columns ?? []).filter((c) => !c.hidden);\n }\n private visibleActions(): boolean {\n return this.config.rowActionsMode === 'visible' && !!this.config.rowActions?.length;\n }\n private mode(): 'none' | 'single' | 'multi' {\n return this.config.checkboxSelection ? 'multi' : (this.config.selection ?? 'single');\n }\n\n protected override build() {\n const c = this.config;\n const el = h('div', this.baseCls, { role: 'grid', tabindex: 0, 'aria-multiselectable': c.selection === 'multi' || c.checkboxSelection ? 'true' : null });\n this.headRow = h('div', 'op-grid__row op-grid__header-row', { role: 'row' });\n this.headEl = h('div', 'op-grid__header', {}, this.headRow);\n this.viewport = h('div', 'op-grid__viewport');\n this.emptyEl = h('div', 'op-grid__empty');\n if (c.columnMenu || c.bulkActions?.length) {\n this.bulkEl = h('div', 'op-grid__bulk');\n this.bulkEl.hidden = true;\n this.barEl = h('div', 'op-grid__bar', {}, this.bulkEl);\n el.append(this.barEl);\n }\n el.append(this.headEl, this.viewport, this.emptyEl);\n el.classList.toggle('op-grid--striped', !!c.striped);\n if (c.paging) {\n this.pager = new Pagination({ cls: 'op-grid__pager' });\n el.append(this.pager.el);\n }\n return el;\n }\n\n protected override onRender() {\n const c = this.config;\n this.bindStore(c.store ?? new Store({ data: c.data ?? [] }));\n this.buildHeader();\n this.buildBar();\n this.v = virtualize({\n scroller: this.viewport,\n count: this.store.count,\n rowHeight: c.rowHeight ?? (measure(this.el, ROW) || 36),\n render: (row, i) => this.renderRow(row, i),\n rowCls: 'op-grid__row op-grid__body-row',\n });\n this.own(() => this.v.destroy());\n this.sync();\n\n this.listen(this.viewport, 'scroll', () => (this.headEl.scrollLeft = this.viewport.scrollLeft), { passive: true });\n this.listen(this.viewport, 'click', (e: MouseEvent) => this.onRowEvent(e, 'row-click'));\n this.listen(this.viewport, 'dblclick', (e: MouseEvent) => this.onRowEvent(e, 'row-dblclick'));\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.headRow, 'change', (e: Event) => {\n if (e.target !== this.selAll) return;\n if (this.selAll!.checked) this.store.each((r) => this.selected.add(r));\n else if (this.config.keepSelection) this.store.each((r) => this.selected.delete(r));\n else this.selected.clear();\n this.changed();\n });\n if (c.reorderableColumns) this.initColumnDrag();\n if (c.resizableColumns) this.initColumnResize();\n this.listen(this.headRow, 'click', (e: Event) => {\n if (this.justDragged || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-field]');\n const col = cell && this.userCols().find((x) => x.field === cell.dataset.field);\n if (!col) return;\n this.emit('column-click', col);\n if (col.sortable) this.sortBy(col);\n });\n if (typeof ResizeObserver !== 'undefined') {\n const ro = new ResizeObserver(() => this.layout());\n ro.observe(this.viewport);\n this.own(() => ro.disconnect());\n }\n if (this.pager) {\n this.pager.setStore(this.store);\n if (!this.store.pageSize) this.store.setPageSize(c.pageSize ?? 20);\n }\n this.own(() => this.pager?.destroy());\n }\n\n override notifyMount() {\n super.notifyMount();\n this.layout();\n this.pager?.notifyMount();\n }\n\n /** Re-measures row height and scrollbar (needed after the grid becomes visible or resizes). */\n private layout() {\n if (!this.rendered) return;\n if (!this.config.rowHeight) {\n const hgt = measure(this.el, ROW);\n if (hgt) this.v.setRowHeight(hgt);\n }\n this.headEl.style.paddingInlineEnd = `${this.viewport.offsetWidth - this.viewport.clientWidth}px`;\n this.v.refresh();\n }\n\n // ---- store ---------------------------------------------------------------------------------\n\n private bindStore(store: Store<any>) {\n this.offStore?.();\n this.store = store;\n const offChange = store.subscribe((c) => {\n if (!this.rendered) return;\n this.sync();\n if (c.type === 'sort') this.paintSort();\n });\n const offLoading = store.on('loading', (on: boolean) => this.setLoading(on));\n this.offStore = () => (offChange(), offLoading());\n this.own(() => this.offStore?.());\n }\n\n /** Brings count, selection and the empty state in line with the store. */\n private sync() {\n const before = this.selected.size;\n if (!this.config.keepSelection) for (const r of this.selected) if (this.store.indexOf(r) < 0) this.selected.delete(r);\n this.active = Math.min(this.active, this.store.count - 1);\n this.v.setCount(this.store.count);\n this.el.setAttribute('aria-rowcount', String(this.store.totalCount + 1));\n this.emptyEl.textContent = this.config.emptyText ?? t('empty');\n this.emptyEl.hidden = this.store.count > 0 || !!this.config.loading;\n this.el.classList.toggle('is-empty', this.store.count === 0);\n this.updateActiveDescendant();\n this.paintSelection();\n if (this.selected.size !== before) this.emit('select', this.getSelection());\n }\n\n setStore(store: Store<any>) {\n this.config.store = store;\n this.selected.clear();\n this.active = this.anchor = -1;\n if (!this.rendered) return;\n this.bindStore(store);\n this.pager?.setStore(store);\n this.paintSort();\n this.sync();\n }\n getStore(): Store<any> {\n this.render();\n return this.store;\n }\n\n // ---- header / columns ----------------------------------------------------------------------\n\n /** Column widths \u2192 the CSS grid template shared by the header and every row. */\n private layoutColumns() {\n const cols = this.cols();\n const n = this.visibleActions() ? this.config.rowActions!.length : 1;\n const wide = (c: Column) => (c.field === ACT ? `calc(${n} * var(--op-grid-action-size) + ${n + 1} * var(--op-grid-action-gap))` : `${c.width}px`);\n const tpl = cols.map((c) => (c.field === ACT ? wide(c) : c.width ? `${c.width}px` : `minmax(${c.minWidth ?? 96}px, ${c.flex ?? 1}fr)`)).join(' ');\n this.el.style.setProperty('--op-grid-cols', tpl);\n this.el.style.setProperty('--op-grid-min-width', `${cols.reduce((sum, c) => sum + (c.field === ACT ? n * 36 : (c.width ?? c.minWidth ?? 96)), 0)}px`);\n }\n\n private buildHeader() {\n const cols = this.cols();\n this.layoutColumns();\n this.el.classList.toggle('op-grid--actions-visible', this.visibleActions());\n this.el.classList.toggle('op-grid--reorderable', !!this.config.reorderableColumns);\n this.el.classList.toggle('op-grid--resizable', !!this.config.resizableColumns);\n this.el.setAttribute('aria-colcount', String(cols.length));\n this.selAll = undefined;\n this.headRow.replaceChildren(\n ...cols.map((c, i) => {\n const label = c.header ?? c.field;\n const cell = h('div', `op-grid__cell op-grid__hcell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.sortable ? ' is-sortable' : ''}`, { role: 'columnheader', 'aria-colindex': i + 1, 'data-field': c.field });\n if (c.field === SEL) cell.append((this.selAll = h('input', 'op-grid__check', { type: 'checkbox', 'aria-label': t('gridSelectPage') })));\n else if (c.field === ACT) cell.setAttribute('aria-label', t('gridRowActions'));\n else if (c.sortable) cell.append(h('button', 'op-grid__sort', { type: 'button' }, h('span', 'op-grid__label', {}, label), h('span', 'op-grid__arrow', { 'aria-hidden': 'true' }, iconEl('arrow-up'))));\n else cell.append(h('span', 'op-grid__label', {}, label));\n const user = c.field !== SEL && c.field !== ACT;\n if (this.config.reorderableColumns && user) cell.classList.add('is-reorderable');\n if (this.canResize(c)) {\n cell.append(h('span', 'op-grid__resizer', { role: 'separator', 'aria-orientation': 'vertical', 'aria-label': `${t('gridResize')} ${label}` }));\n }\n // a sortable header already has its button to focus; the others need a tab stop to be moved/resized by keyboard\n if (user && !c.sortable && (this.config.reorderableColumns || this.canResize(c))) cell.tabIndex = 0;\n return cell;\n }),\n );\n const band = this.groupBand(cols);\n this.headEl.replaceChildren(...(band ? [band] : []), this.headRow);\n this.paintSort();\n }\n\n /** Labels over runs of neighbouring columns that share a group (a dragged column can split a group: it shows twice). */\n private groupBand(cols: Column[]): HTMLElement | null {\n if (this.config.groupHeaders === false || !cols.some((c) => c.group)) return null;\n const cells: HTMLElement[] = [];\n let i = 0;\n while (i < cols.length) {\n const g = cols[i].group ?? '';\n let n = 1;\n while (i + n < cols.length && (cols[i + n].group ?? '') === g) n++;\n const cell = h('div', `op-grid__gcell${g ? '' : ' is-empty'}`, { role: 'columnheader', 'aria-colindex': i + 1, 'aria-colspan': n }, g);\n cell.style.gridColumn = `span ${n}`;\n cells.push(cell);\n i += n;\n }\n return h('div', 'op-grid__row op-grid__group-row', { role: 'row' }, ...cells);\n }\n\n /** The group labels in the order they first appear. */\n getColumnGroups(): string[] {\n return [...new Set(this.config.columns.map((c) => c.group).filter((g): g is string => !!g))];\n }\n\n /** Shows or hides every column of a group at once (at least one column always stays visible). */\n setColumnGroupVisible(group: string, visible: boolean): void {\n const cols = this.config.columns.filter((c) => (c.group ?? '') === group);\n if (!cols.length) return;\n for (const c of cols) c.hidden = !visible;\n if (!this.config.columns.some((c) => !c.hidden)) cols[0].hidden = false;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n\n setColumns(columns: Column[]) {\n this.config.columns = columns;\n if (!this.rendered) return;\n this.cv++;\n this.buildHeader();\n this.paintSelection();\n this.v.refresh();\n }\n\n /** Order, visibility and width of every column; save it and give it back to `setColumnState`. */\n getColumnState(): ColumnState[] {\n return this.config.columns.map((c) => ({ field: c.field, hidden: !!c.hidden, width: c.width }));\n }\n /** Restores a saved state: columns follow its order (unknown ones keep their place at the end). */\n setColumnState(state: ColumnState[]): void {\n const by = new Map(this.config.columns.map((c) => [c.field, c]));\n const ordered = state.flatMap((s) => {\n const c = by.get(s.field);\n by.delete(s.field);\n return c ? [{ ...c, hidden: s.hidden, width: s.width ?? c.width }] : [];\n });\n this.setColumns([...ordered, ...by.values()]);\n this.emit('columns-change', this.getColumnState());\n }\n\n // ---- column drag ---------------------------------------------------------------------------\n\n // ---- column resize -------------------------------------------------------------------------\n\n private canResize(c: Column): boolean {\n return !!this.config.resizableColumns && c.field !== SEL && c.field !== ACT && c.resizable !== false;\n }\n\n /** Sets a column's width in px (clamped to `minWidth`/`maxWidth`); `undefined` gives it back its flexible width. */\n setColumnWidth(field: string, width: number | undefined): void {\n const col = this.config.columns.find((x) => x.field === field);\n if (!col) return;\n col.width = width == null ? undefined : Math.round(Math.max(col.minWidth ?? 48, Math.min(width, col.maxWidth ?? Infinity)));\n this.layoutColumns();\n this.emit('column-resize', field, col.width);\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnResize(): void {\n const head = this.headRow;\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (!grip || e.button) return;\n e.preventDefault();\n const cell = grip.parentElement!;\n const field = cell.dataset.field!;\n const col = this.config.columns.find((x) => x.field === field)!;\n const x0 = e.clientX;\n const w0 = cell.getBoundingClientRect().width || col.width || 96; // a flexible column starts from what it shows now\n this.el.classList.add('is-resizing');\n let last = col.width;\n const move = (m: PointerEvent) => {\n // set without events while dragging; one event when it ends\n const w = Math.round(Math.max(col.minWidth ?? 48, Math.min(w0 + (m.clientX - x0) * (this.dir() === 'rtl' ? -1 : 1), col.maxWidth ?? Infinity)));\n col.width = last = w;\n this.layoutColumns();\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n this.el.classList.remove('is-resizing');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n if (last !== undefined) {\n this.emit('column-resize', field, last);\n this.emit('columns-change', this.getColumnState());\n }\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // double-click on the handle: back to the flexible width\n this.listen(head, 'dblclick', (e: Event) => {\n const grip = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__resizer');\n if (grip) this.setColumnWidth(grip.parentElement!.dataset.field!, undefined);\n });\n // keyboard: Alt+Shift+\u2190/\u2192 on a focused header\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!(e.altKey && e.shiftKey) || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__hcell');\n const col = cell && this.config.columns.find((x) => x.field === cell.dataset.field);\n if (!cell || !col || !this.canResize(col)) return;\n e.preventDefault();\n const w = cell.getBoundingClientRect().width || col.width || 96;\n this.setColumnWidth(col.field, w + (e.key === 'ArrowRight' ? 16 : -16));\n });\n }\n\n private dir(): string {\n return getComputedStyle(this.el).direction;\n }\n\n /** Moves a (user) column in front of `before` (or to the end when null). Hidden columns keep their places. */\n moveColumn(field: string, before: string | null): void {\n const cols = this.config.columns;\n const col = cols.find((x) => x.field === field);\n if (!col || field === before) return;\n const vis = this.userCols();\n const from = vis.indexOf(col);\n const next = [...cols.filter((x) => x !== col)];\n const target = before == null ? undefined : next.find((x) => x.field === before);\n const lastVis = vis.filter((x) => x !== col).pop();\n const at = target ? next.indexOf(target) : lastVis ? next.indexOf(lastVis) + 1 : next.length;\n next.splice(at, 0, col);\n if (next.every((x, i) => x === cols[i])) return;\n this.setColumns(next);\n this.emit('column-move', field, from, this.userCols().indexOf(col));\n this.emit('columns-change', this.getColumnState());\n }\n\n private initColumnDrag(): void {\n const head = this.headRow;\n const cellsOf = () => Array.from(head.querySelectorAll<HTMLElement>('.is-reorderable'));\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell || e.button || (e.target as HTMLElement).closest('.op-grid__resizer')) return;\n const field = cell.dataset.field!;\n const x0 = e.clientX;\n let ghost: HTMLElement | undefined;\n let mark: HTMLElement | undefined;\n let before: string | null = null;\n const move = (m: PointerEvent) => {\n if (!ghost) {\n if (Math.abs(m.clientX - x0) < 6) return; // a click, not a drag\n ghost = h('div', 'op-grid__ghost', {}, cell.textContent ?? '');\n mark = h('div', 'op-grid__drop');\n this.el.append(ghost);\n this.headEl.append(mark);\n cell.classList.add('is-dragging-col');\n }\n ghost.style.left = `${m.clientX}px`;\n ghost.style.top = `${m.clientY}px`;\n // the drop boundary is the nearest cell edge: before the first cell whose middle is right of the pointer\n const cells = cellsOf();\n const hit = cells.find((c) => {\n const r = c.getBoundingClientRect();\n return m.clientX < r.left + r.width / 2;\n });\n before = hit ? hit.dataset.field! : null;\n const edge = hit ?? cells[cells.length - 1];\n const r = edge?.getBoundingClientRect();\n const hr = this.headEl.getBoundingClientRect();\n if (r && mark) mark.style.left = `${(hit ? r.left : r.right) - hr.left + this.headEl.scrollLeft}px`;\n };\n const up = () => {\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n if (!ghost) return;\n ghost.remove();\n mark?.remove();\n cell.classList.remove('is-dragging-col');\n this.justDragged = true;\n setTimeout(() => (this.justDragged = false));\n this.moveColumn(field, before);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(() => (document.removeEventListener('pointermove', move), document.removeEventListener('pointerup', up)));\n });\n // keyboard: Alt+\u2190 / Alt+\u2192 on a focused header moves its column one step\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey || e.shiftKey || (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight')) return;\n const cell = (e.target as HTMLElement).closest<HTMLElement>('.is-reorderable');\n if (!cell) return;\n e.preventDefault();\n const vis = this.userCols();\n const i = vis.findIndex((x) => x.field === cell.dataset.field);\n const j = e.key === 'ArrowLeft' ? i - 1 : i + 1;\n if (j < 0 || j >= vis.length) return;\n this.moveColumn(vis[i].field, e.key === 'ArrowLeft' ? vis[j].field : (vis[j + 1]?.field ?? null));\n const again = head.querySelector<HTMLElement>(`[data-field=\"${CSS.escape(vis[i].field)}\"]`);\n (again?.querySelector<HTMLElement>('button') ?? again)?.focus();\n });\n }\n\n private paintSort() {\n const s = this.store.getSorters()[0];\n for (const cell of Array.from(this.headRow.children) as HTMLElement[]) {\n const on = !!s && cell.dataset.field === s.field;\n cell.classList.toggle('is-sorted-asc', on && s.dir === 'asc');\n cell.classList.toggle('is-sorted-desc', on && s.dir === 'desc');\n if (cell.classList.contains('is-sortable')) cell.setAttribute('aria-sort', on ? (s.dir === 'asc' ? 'ascending' : 'descending') : 'none');\n }\n }\n\n /** asc \u2192 desc \u2192 unsorted. */\n private sortBy(col: Column) {\n const s = this.store.getSorters()[0];\n const dir = s?.field === col.field ? (s.dir === 'asc' ? 'desc' : null) : 'asc';\n if (this.emit('before-sort', col.field, dir) === false) return;\n this.store.sort(dir ? col.field : null, dir ?? undefined);\n this.emit('sort', col.field, dir);\n }\n\n // ---- rows ----------------------------------------------------------------------------------\n\n private rowIndexOffset(): number {\n return this.store.pageSize ? (this.store.page - 1) * this.store.pageSize : 0;\n }\n\n private renderRow(row: HTMLElement, i: number) {\n const rec = this.store.getAt(i);\n if (!rec) return;\n const cols = this.cols();\n row.id = `${this.id}-r${i}`;\n row.dataset.i = String(i);\n row.setAttribute('role', 'row');\n row.setAttribute('aria-rowindex', String(this.rowIndexOffset() + i + 2));\n const sel = this.selected.has(rec);\n row.setAttribute('aria-selected', this.mode() === 'none' ? 'false' : String(sel));\n row.classList.toggle('is-selected', sel);\n row.classList.toggle('is-active', i === this.active);\n row.classList.toggle('is-odd', i % 2 === 1);\n if (row.dataset.cv !== String(this.cv) || row.children.length !== cols.length) {\n row.dataset.cv = String(this.cv);\n row.replaceChildren(...cols.map((c, n) => h('div', `op-grid__cell${c.align ? ` op-grid__cell--${c.align}` : ''}${c.cls ? ` ${c.cls}` : ''}`, { role: 'gridcell', 'aria-colindex': n + 1 })));\n }\n cols.forEach((c, n) => {\n const cell = row.children[n] as HTMLElement;\n if (c.field === SEL) {\n const box = (cell.firstElementChild as HTMLInputElement | null) ?? cell.appendChild(h('input', 'op-grid__check', { type: 'checkbox', tabindex: -1, 'aria-label': t('gridSelectRow') }));\n box.checked = sel;\n return;\n }\n if (c.field === ACT) {\n const acts = this.config.rowActions ?? [];\n if (!this.visibleActions()) {\n if (!cell.firstChild) cell.append(h('button', 'op-grid__actbtn', { type: 'button', tabindex: -1, 'aria-label': t('gridRowActions'), 'aria-haspopup': 'menu' }, iconEl('more')));\n return;\n }\n if (cell.children.length !== acts.length || (cell.firstElementChild as HTMLElement | null)?.dataset.a == null) {\n cell.replaceChildren(...acts.map((a, k) => h('button', `op-grid__actbtn${a.variant === 'danger' ? ' is-danger' : ''}`, { type: 'button', tabindex: -1, 'data-a': k, 'aria-label': a.text, title: a.text }, a.icon ? iconEl(a.icon) : a.text)));\n }\n acts.forEach((a, k) => ((cell.children[k] as HTMLButtonElement).disabled = !!a.disabled?.(rec)));\n return;\n }\n const content = cellContent(c, rec);\n if (typeof content === 'string') cell.textContent = content;\n else cell.replaceChildren(content);\n });\n }\n\n private indexOfEvent(e: Event): number {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-grid__body-row');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private onRowEvent(e: MouseEvent, name: string) {\n const i = this.indexOfEvent(e);\n const rec = this.store.getAt(i);\n if (!rec) return;\n if (name === 'row-click') {\n const btn = (e.target as HTMLElement).closest<HTMLButtonElement>('.op-grid__actbtn');\n if (btn) {\n if (btn.dataset.a == null) return this.openRowMenu(rec, btn);\n if (!btn.disabled) this.config.rowActions![Number(btn.dataset.a)].handler(rec, this);\n return;\n }\n this.setActive(i, false);\n this.pick(i, e);\n }\n this.emit(name, rec, i, e);\n }\n\n // ---- selection / keyboard ------------------------------------------------------------------\n\n getSelection(): Model[] {\n return [...this.selected];\n }\n\n /** Selects a record or row index. `add` keeps the current selection (multi mode). */\n select(target: Model | number, opts: { add?: boolean } = {}): void {\n const rec = typeof target === 'number' ? this.store.getAt(target) : target;\n const mode = this.mode();\n if (!rec || mode === 'none') return;\n if (mode === 'single' || !opts.add) this.selected.clear();\n this.selected.add(rec);\n this.changed();\n }\n\n deselectAll(): void {\n if (!this.selected.size) return;\n this.selected.clear();\n this.changed();\n }\n\n private changed() {\n this.v?.refresh();\n this.paintSelection();\n this.emit('select', this.getSelection());\n }\n\n /** Selects every record that matches the filters, across pages (a remote store: the loaded page). */\n selectAllFiltered(): void {\n if (this.mode() !== 'multi') return;\n for (const r of this.store.getFiltered()) this.selected.add(r);\n this.changed();\n }\n\n /** Click semantics: plain = replace, ctrl/meta = toggle, shift = range from the anchor (multi only). */\n private pick(i: number, e: { ctrlKey?: boolean; metaKey?: boolean; shiftKey?: boolean }) {\n const mode = this.mode();\n const rec = this.store.getAt(i);\n if (!rec || mode === 'none') return;\n if (mode === 'multi' && e.shiftKey && this.anchor >= 0) {\n if (!this.config.checkboxSelection) this.selected.clear();\n for (const r of this.store.getRange(Math.min(this.anchor, i), Math.max(this.anchor, i) + 1)) this.selected.add(r);\n } else if (mode === 'multi' && (e.ctrlKey || e.metaKey || this.config.checkboxSelection)) {\n if (!this.selected.delete(rec)) this.selected.add(rec);\n this.anchor = i;\n } else {\n this.selected.clear();\n this.selected.add(rec);\n this.anchor = i;\n }\n this.changed();\n }\n\n private setActive(i: number, scroll = true) {\n this.active = i;\n if (scroll && i >= 0) this.v.scrollTo(i);\n this.v.refresh();\n this.updateActiveDescendant();\n }\n\n private updateActiveDescendant() {\n if (this.active >= 0 && this.active < this.store.count) this.el.setAttribute('aria-activedescendant', `${this.id}-r${this.active}`);\n else this.el.removeAttribute('aria-activedescendant');\n }\n\n focusRow(i: number) {\n this.render();\n this.setActive(Math.max(0, Math.min(i, this.store.count - 1)));\n this.el.focus();\n }\n\n scrollToRow(i: number) {\n this.v?.scrollTo(i);\n }\n\n private onKey(e: KeyboardEvent) {\n if ((e.target as HTMLElement).closest('.op-grid__header')) return; // header buttons keep their own keys\n const n = this.store.count;\n if (!n) return;\n if ((e.key === 'ContextMenu' || (e.shiftKey && e.key === 'F10')) && this.active >= 0 && this.config.rowActions?.length) {\n e.preventDefault();\n return this.openRowMenu(this.store.getAt(this.active)!, document.getElementById(`${this.id}-r${this.active}`) ?? this.el);\n }\n const page = Math.max(1, Math.floor((this.viewport.clientHeight || 400) / this.config.rowHeight! || 10));\n const cur = this.active < 0 ? 0 : this.active;\n const mode = this.mode();\n const targets: Record<string, number> = {\n ArrowDown: Math.min(n - 1, this.active < 0 ? 0 : cur + 1),\n ArrowUp: Math.max(0, cur - 1),\n Home: 0,\n End: n - 1,\n PageDown: Math.min(n - 1, cur + page),\n PageUp: Math.max(0, cur - page),\n };\n if (e.key in targets) {\n e.preventDefault();\n const to = targets[e.key];\n this.setActive(to);\n if (mode === 'single' || (mode === 'multi' && !e.ctrlKey && !e.metaKey && !this.config.checkboxSelection)) this.pick(to, e);\n } else if (e.key === ' ' && this.active >= 0) {\n e.preventDefault();\n if (mode === 'multi') this.pick(this.active, { ctrlKey: true });\n else this.pick(this.active, e);\n } else if (e.key === 'Enter' && this.active >= 0) {\n this.emit('row-activate', this.store.getAt(this.active), this.active);\n } else if ((e.key === 'a' || e.key === 'A') && (e.ctrlKey || e.metaKey) && mode === 'multi') {\n e.preventDefault();\n this.store.each((r) => this.selected.add(r));\n this.changed();\n }\n }\n\n refresh() {\n this.v?.refresh();\n }\n\n // ---- bar: bulk actions and the column menu ------------------------------------------------\n\n private buildBar() {\n const c = this.config;\n if (!this.barEl) return;\n this.bulkCount = h('span', 'op-grid__count', { 'aria-live': 'polite' });\n this.selectAllBtn = new Button({ text: '', variant: 'ghost', handler: () => this.selectAllFiltered() });\n this.bulkBtns = (c.bulkActions ?? []).map((a) => new Button({ text: a.text, icon: a.icon, variant: a.variant === 'danger' ? 'danger' : 'default', handler: () => a.handler(this.getSelection(), this) }));\n const clear = new Button({ text: t('gridClearSel'), variant: 'ghost', handler: () => this.deselectAll() });\n this.bulkEl!.append(this.bulkCount, this.selectAllBtn.el, ...this.bulkBtns.map((b) => b.el), clear.el);\n this.own(() => [this.selectAllBtn, ...this.bulkBtns, clear].forEach((b) => b?.destroy()));\n if (c.columnMenu) this.buildColumnMenu();\n this.paintSelection();\n }\n\n /** Header checkbox state and the bulk bar, from the current selection. */\n private paintSelection() {\n if (!this.rendered) return;\n const n = this.store.count;\n let k = 0;\n this.store.each((r) => this.selected.has(r) && k++);\n if (this.selAll) {\n this.selAll.checked = n > 0 && k === n;\n this.selAll.indeterminate = k > 0 && k < n;\n }\n if (!this.bulkEl) return;\n const size = this.selected.size;\n this.bulkEl.hidden = !size || !this.config.bulkActions?.length;\n if (this.bulkEl.hidden) return;\n this.bulkCount!.textContent = t('gridSelected', { n: size });\n const more = this.store.getFiltered().length;\n this.selectAllBtn!.el.hidden = !(this.mode() === 'multi' && k === n && more > n && size < more);\n this.selectAllBtn!.setText(t('gridSelectAll', { n: more }));\n }\n\n private openRowMenu(rec: Model, btn: HTMLElement) {\n this.rowMenu ??= new Menu({});\n this.rowMenu.setItems((this.config.rowActions ?? []).map((a) => ({ text: a.text, icon: a.icon, disabled: !!a.disabled?.(rec), handler: () => a.handler(rec, this) })));\n this.rowMenu.showBy(btn);\n }\n private buildColumnMenu() {\n const btn = new Button({ text: t('gridColumns'), icon: 'columns', variant: 'ghost' });\n this.colSearch = new TextField({ placeholder: t('gridColumnSearch'), clearable: true });\n this.colChips = h('div', 'op-grid__colchips', { role: 'group', 'aria-label': t('gridGroups') });\n this.colList = h('div', 'op-grid__collist', { role: 'group', 'aria-label': t('gridColumns') });\n const none = h('div', 'op-grid__colempty', {}, t('gridNoColumns'));\n none.hidden = true;\n const panel = h('div', 'op-grid__colmenu', {}, this.colSearch.el, this.colChips, this.colList, none);\n this.colDd = new Dropdown({ anchor: btn.el, content: panel, placement: 'bottom-end', role: 'dialog', autoFocus: false });\n this.barEl!.append(btn.el);\n this.own(() => btn.destroy());\n /** Search text and the group chip decide what is listed; a search that names a group shows the whole group. */\n const filter = () => {\n const q = (this.colSearch!.getValue() ?? '').toLowerCase();\n let shown = 0;\n let head: HTMLElement | undefined;\n let rowsInGroup = 0;\n const closeGroup = () => head && (head.hidden = rowsInGroup === 0);\n for (const el of Array.from(this.colList!.children) as HTMLElement[]) {\n if (el.classList.contains('op-grid__colgroup')) {\n closeGroup();\n head = el;\n rowsInGroup = 0;\n continue;\n }\n const g = el.dataset.group ?? '';\n const byChip = !this.colGroup || g === this.colGroup;\n const byText = !q || g.toLowerCase().includes(q) || el.textContent!.toLowerCase().includes(q);\n el.hidden = !(byChip && byText);\n if (!el.hidden) (shown++, rowsInGroup++);\n }\n closeGroup();\n none.hidden = shown > 0;\n };\n this.colSearch.on('change', filter);\n this.listen(this.colChips, 'click', (e: Event) => {\n const b = (e.target as HTMLElement).closest<HTMLElement>('[data-g]');\n if (!b) return;\n this.colGroup = b.dataset.g!;\n this.paintColumnList();\n filter();\n });\n btn.on('click', () => {\n if (this.colDd!.isOpen()) return this.colDd!.close();\n this.colSearch!.setValue('');\n this.colGroup = '';\n this.paintColumnList();\n this.colDd!.open();\n this.colSearch!.focus();\n });\n this.listen(this.colList, 'change', (e: Event) => {\n const input = e.target as HTMLInputElement;\n if (input.dataset.groupToggle != null) this.setColumnGroupVisible(input.dataset.groupToggle, input.checked);\n else {\n const col = this.config.columns.find((x) => x.field === input.value);\n if (!col) return;\n col.hidden = !input.checked;\n this.setColumns(this.config.columns);\n this.emit('columns-change', this.getColumnState());\n }\n this.paintColumnList();\n filter();\n });\n }\n\n private paintColumnList() {\n const cols = this.config.columns;\n const groups = this.getColumnGroups();\n const last = this.userCols().length === 1 ? this.userCols()[0] : null; // at least one column stays visible\n const row = (c: Column) => {\n const box = h('input', 'op-grid__check', { type: 'checkbox', value: c.field });\n box.checked = !c.hidden;\n box.disabled = c === last;\n return h('label', 'op-grid__colitem', { 'data-group': c.group ?? '' }, box, h('span', '', {}, c.header ?? c.field));\n };\n this.colChips!.hidden = groups.length < 2;\n this.colChips!.replaceChildren(...[['', t('gridGroupAll')], ...groups.map((g) => [g, g])].map(([g, label]) => h('button', `op-grid__colchip${this.colGroup === g ? ' is-on' : ''}`, { type: 'button', 'data-g': g, 'aria-pressed': String(this.colGroup === g) }, label)));\n if (!groups.length) return this.colList!.replaceChildren(...cols.map(row));\n const out: HTMLElement[] = [];\n for (const g of [...groups, '']) {\n const items = cols.filter((c) => (c.group ?? '') === g);\n if (!items.length) continue;\n const on = items.filter((c) => !c.hidden).length;\n const toggle = h('input', 'op-grid__check', { type: 'checkbox', 'data-group-toggle': g, 'aria-label': g || t('gridOtherCols') });\n toggle.checked = on === items.length;\n toggle.indeterminate = on > 0 && on < items.length;\n out.push(h('div', 'op-grid__colgroup', { 'data-group': g }, h('label', '', {}, toggle, h('span', '', {}, g || t('gridOtherCols'))), h('span', 'op-grid__colcount', {}, `${on}/${items.length}`)), ...items.map(row));\n }\n this.colList!.replaceChildren(...out);\n }\n\n protected override onDestroy() {\n this.pager?.destroy();\n this.rowMenu?.destroy();\n this.colDd?.destroy();\n this.colSearch?.destroy();\n }\n}\nregister('grid', Grid);\n"],
5
- "mappings": "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",
6
- "names": ["SEL", "ACT", "SEL_COL", "ACT_COL", "ROW", "Grid", "Component", "c", "el", "h", "Pagination", "Store", "virtualize", "measure", "row", "i", "e", "r", "cell", "col", "x", "ro", "hgt", "store", "offChange", "offLoading", "on", "before", "t", "cols", "n", "wide", "tpl", "sum", "label", "iconEl", "user", "band", "cells", "g", "group", "visible", "columns", "state", "by", "ordered", "field", "width", "head", "grip", "x0", "w0", "last", "move", "m", "w", "up", "vis", "from", "next", "target", "lastVis", "at", "cellsOf", "ghost", "mark", "hit", "hr", "j", "again", "s", "dir", "rec", "sel", "box", "acts", "a", "k", "content", "cellContent", "name", "btn", "opts", "mode", "scroll", "page", "cur", "targets", "to", "Button", "clear", "b", "size", "more", "Menu", "TextField", "none", "panel", "Dropdown", "filter", "q", "shown", "rowsInGroup", "closeGroup", "byChip", "byText", "input", "groups", "out", "items", "toggle", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as g,b as o}from"./chunk-OWEQT2HN.js";import{a as c,b as d}from"./chunk-IYPKPLCU.js";import{b as n}from"./chunk-PZSHOSOS.js";import{e as m}from"./chunk-MA5BJL3S.js";var p="var(--op-listbox-row-height, var(--op-row-height))",a=class extends c{baseCls="op-listbox";items;active=-1;v;emptyEl;constructor(t={}){super(t),this.items=t.items??[]}build(){let t=n("div","op-listbox",{role:"listbox",tabindex:-1});return this.config.maxHeight!=null&&(t.style.maxHeight=typeof this.config.maxHeight=="number"?`${this.config.maxHeight}px`:this.config.maxHeight),this.emptyEl=n("div","op-listbox__empty"),t.append(this.emptyEl),t}onRender(){this.v=g({scroller:this.el,count:this.items.length,rowHeight:o(this.el,p)||32,render:(t,e)=>this.renderRow(t,e),rowCls:"op-listbox__item"}),this.own(()=>this.v?.destroy()),this.setEmptyText(this.config.emptyText??m("noResults")),this.listen(this.el,"mousedown",t=>t.preventDefault()),this.listen(this.el,"click",t=>{let e=this.indexOf(t.target);e>=0&&this.activate(e)}),this.listen(this.el,"mousemove",t=>{let e=this.indexOf(t.target);e>=0&&e!==this.active&&!this.items[e].disabled&&this.setActive(e,!1)}),this.updateEmpty()}indexOf(t){let e=t.closest(".op-listbox__item");return e?Number(e.dataset.i):-1}renderRow(t,e){let i=this.items[e],s=this.config;t.id=`${this.id}-opt-${e}`,t.dataset.i=String(e),t.setAttribute("role","option"),t.setAttribute("aria-selected",String(this.isSelected(i))),i.disabled?t.setAttribute("aria-disabled","true"):t.removeAttribute("aria-disabled"),t.classList.toggle("is-active",e===this.active),t.classList.toggle("is-selected",this.isSelected(i)),t.classList.toggle("is-disabled",!!i.disabled);let l=i.hint?[n("span","op-listbox__hint",{},i.hint)]:[];if(s.renderer)return t.replaceChildren(s.renderer(i),...l);let h=s.highlight?.trim(),r=h?i.label.toLowerCase().indexOf(h.toLowerCase()):-1;if(r<0)return t.replaceChildren(i.label,...l);t.replaceChildren(i.label.slice(0,r),n("mark","op-listbox__mark",{},i.label.slice(r,r+h.length)),i.label.slice(r+h.length),...l)}isSelected(t){return this.config.selected!==void 0&&t.value===this.config.selected}updateEmpty(){this.emptyEl.hidden=this.items.length>0}getItems(){return this.items}setItems(t){this.items=t,this.config.items=t,this.active=-1,this.rendered&&(this.v.setCount(t.length),this.updateEmpty())}setSelected(t){this.config.selected=t,this.v?.refresh()}setHighlight(t){this.config.highlight=t,this.v?.refresh()}setEmptyText(t){this.config.emptyText=t,this.rendered&&(this.emptyEl.textContent=t)}refresh(){if(!this.rendered)return;let t=o(this.el,p);t?this.v.setRowHeight(t):this.v.refresh()}setActive(t,e=!0){let i=this.items[t];t<-1||t>=this.items.length||i&&i.disabled||(this.active=t,e&&t>=0&&this.v?.scrollTo(t),this.v?.refresh(),this.emit("active-change",i,t))}moveActive(t){let e=this.items.length;if(!e)return;let i=this.active;for(let s=0;s<e;s++)if(i=(i+t+e)%e,i<0&&(i+=e),!this.items[i].disabled)return this.setActive(i)}getActive(){return this.items[this.active]}getActiveIndex(){return this.active}getActiveId(){return this.active>=0?`${this.id}-opt-${this.active}`:""}activate(t=this.active){let e=this.items[t];e&&!e.disabled&&this.emit("select",e,t)}scrollTo(t){this.v?.scrollTo(t)}};d("listbox",a);export{a};
2
- //# sourceMappingURL=chunk-O4DCHALR.js.map
@@ -1,2 +0,0 @@
1
- import{a as o,b as i}from"./chunk-IYPKPLCU.js";import{e as r}from"./chunk-MA5BJL3S.js";var e=class extends o{baseCls="op-spinner";tag="span";onRender(){this.el.setAttribute("role","progressbar"),this.setLabel(this.config.label??r("loading"))}setLabel(t){this.config.label=t,this.rendered&&this.el.setAttribute("aria-label",t)}};i("spinner",e);export{e as a};
2
- //# sourceMappingURL=chunk-ODWPBBVL.js.map
@@ -1,2 +0,0 @@
1
- import{a as l}from"./chunk-676AKAGF.js";import{g as f,h as u}from"./chunk-4AA4FQEM.js";import{c as p}from"./chunk-IHAYOSBR.js";import{a as d,b as m}from"./chunk-IYPKPLCU.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as h}from"./chunk-MA5BJL3S.js";var n={duration:4e3,position:"top-right",max:5},g={info:"info",success:"success",warning:"alert",error:"error"};function v(e){let t=l().querySelector(`.op-toast-region[data-pos="${e}"]`);return t||(t=i("div","op-toast-region",{"data-pos":e}),l().appendChild(t)),t}var r=class extends d{baseCls="op-toast";cancelTimer;remaining=0;started=0;build(){let t=this.config,s=t.type??"info",o=i("div",`op-toast op-toast--${s}`,{role:s==="error"?"alert":"status"}),a=i("div","op-toast__body",{},t.title?i("div","op-toast__title",{},t.title):null,i("div","op-toast__text",{},t.text??""));if(o.append(i("span","op-toast__icon",{},p(g[s])),a),t.closable!==!1){let c=i("button","op-toast__close",{type:"button","aria-label":h("close")},p("x"));this.listen(c,"click",()=>this.close()),o.append(c)}return this.listen(o,"pointerenter",()=>this.pause()),this.listen(o,"pointerleave",()=>this.resume()),this.listen(o,"focusin",()=>this.pause()),this.listen(o,"focusout",()=>this.resume()),o}show(){let t=this.config.position??n.position,s=v(t);t.startsWith("bottom")?s.append(this.el):s.prepend(this.el);for(let o of Array.from(s.children).filter(a=>a!==this.el).slice(n.max-1))o.dispatchEvent(new Event("op-dismiss"));this.listen(this.el,"op-dismiss",()=>this.close()),this.remaining=this.config.duration??n.duration,this.resume(),u(this.el,{dy:10}),this.config.type==="success"&&f(this.el.querySelector(".op-toast__icon")??this.el),this.emit("show")}pause(){this.cancelTimer&&(this.cancelTimer(),this.cancelTimer=void 0,this.remaining-=Date.now()-this.started)}resume(){this.cancelTimer||this.remaining<=0||this.destroyed||(this.started=Date.now(),this.cancelTimer=this.later(()=>this.close(),this.remaining))}close(){this.destroyed||(this.emit("close"),this.destroy())}};m("toast",r);function y(e){let t=new r(typeof e=="string"?{text:e}:e);return t.show(),{close:()=>t.close()}}y.configure=e=>Object.assign(n,e);export{r as a,y as b};
2
- //# sourceMappingURL=chunk-OW2ZSMGS.js.map
@@ -1,2 +0,0 @@
1
- import{a as b}from"./chunk-XZ5CUZZP.js";import{b as a,c as f}from"./chunk-676AKAGF.js";import{a as l,b as m}from"./chunk-VV7CFMPZ.js";import{b as v,c as u}from"./chunk-4AA4FQEM.js";import{c as n}from"./chunk-2UPUC4RK.js";import{b as c}from"./chunk-IYPKPLCU.js";import{b as p}from"./chunk-PZSHOSOS.js";var d=class extends b{baseCls="op-panel op-window";backdrop;visible=!1;cleanup=[];opener=null;moved=!1;leaving=0;constructor(e={}){super({closable:!0,...e})}onRender(){super.onRender();let e=this.config;this.el.setAttribute("role","dialog"),this.el.tabIndex=-1,e.modal!==!1&&this.el.setAttribute("aria-modal","true"),e.draggable!==!1&&this.initDrag()}initDrag(){this.headerEl.classList.add("op-window__handle"),this.listen(this.headerEl,"pointerdown",e=>{if(e.target.closest(".op-panel__tool")||e.button)return;let t=this.el.getBoundingClientRect(),o=e.clientX-t.left,s=e.clientY-t.top;this.el.classList.add("is-dragging");let i=h=>{this.el.style.left=`${Math.max(0,Math.min(h.clientX-o,innerWidth-40))}px`,this.el.style.top=`${Math.max(0,Math.min(h.clientY-s,innerHeight-40))}px`,this.moved=!0},r=()=>{this.el.classList.remove("is-dragging"),document.removeEventListener("pointermove",i),document.removeEventListener("pointerup",r)};document.addEventListener("pointermove",i),document.addEventListener("pointerup",r),this.cleanup.push(r)})}isVisible(){return this.visible}center(){let e=this.el;e.style.left=`${Math.max(0,(innerWidth-e.offsetWidth)/2)}px`,e.style.top=`${Math.max(0,(innerHeight-e.offsetHeight)/3)}px`}show(){if(this.visible||this.destroyed||this.emit("before-show")===!1)return;let e=this.config,t=this.el;this.opener=document.activeElement,e.modal!==!1?(this.backdrop=p("div","op-window-backdrop",{},t),a(this.backdrop,this.opener),this.cleanup.push(f(this.backdrop)),this.listen(this.backdrop,"pointerdown",i=>{i.target===this.backdrop&&(e.closeOnBackdrop?this.close():t.focus())})):a(t,this.opener),this.visible=!0,this.leaving++,t.getAnimations?.().forEach(i=>i.cancel()),this.notifyMount(),this.center(),v(t,this.opener??void 0,"modal"),this.backdrop?.animate?.([{opacity:0},{opacity:1}],{duration:n.ms("modal"),easing:n.easing("enter")}),this.cleanup.push(m(t));let o=i=>{i.key==="Escape"&&e.closeOnEsc!==!1&&!i.defaultPrevented&&(i.stopPropagation(),this.close())};t.addEventListener("keydown",o);let s=()=>!this.moved&&this.center();window.addEventListener("resize",s),this.cleanup.push(()=>t.removeEventListener("keydown",o),()=>window.removeEventListener("resize",s)),e.autoFocus!==!1&&this.focusFirst(),this.emit("show")}focusFirst(){let e=l(this.bodyEl)[0],t=this.el.querySelector(".op-panel__footer .op-button--primary");(e??t??l(this.el).find(o=>!o.classList.contains("op-panel__tool"))??this.el).focus()}hide(){!this.visible||this.emit("before-hide")===!1||(this.release(),this.emit("hide"))}release(e=!0){this.visible=!1,this.cleanup.splice(0).reverse().forEach(i=>i());let t=this.backdrop;this.backdrop=void 0;let o=t??this.el,s=e?u(this.el,this.opener??void 0,"modal"):null;if(s){let i=++this.leaving;t?.animate?.([{opacity:1},{opacity:0}],{duration:n.ms("modal","exit"),easing:n.easing("exit"),fill:"forwards"}),s.then(()=>i===this.leaving&&!this.visible&&(o.remove(),t?.remove()))}else o.remove(),t?.remove();this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus()}onDestroy(){this.visible?this.release(!1):this.leaving&&(this.el.closest(".op-window-backdrop")??this.el).remove(),super.onDestroy()}};c("window",d);export{d as a};
2
- //# sourceMappingURL=chunk-PSPQH35P.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/overlays/window/window.ts"],
4
- "sourcesContent": ["import { Panel, type PanelConfig } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { toLayer, lockModal } from '../../../core/layer';\nimport { trapFocus, focusables } from '../../../core/focus';\nimport { popIn, popOut } from '../../../motion/core';\nimport { motion } from '../../../motion/config';\n\nexport interface WindowConfig extends PanelConfig {\n modal?: boolean;\n draggable?: boolean;\n closeOnEsc?: boolean;\n closeOnBackdrop?: boolean;\n /** Move focus inside on show. Default true. */\n autoFocus?: boolean;\n}\n\n/** Floating dialog. Modal by default: the page behind becomes inert and Tab stays inside. */\nexport class Window extends Panel<WindowConfig> {\n protected override baseCls = 'op-panel op-window';\n private backdrop?: HTMLElement;\n private visible = false;\n private cleanup: Array<() => void> = [];\n private opener: Element | null = null;\n private moved = false;\n private leaving = 0;\n\n constructor(config: WindowConfig = {}) {\n super({ closable: true, ...config });\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'dialog');\n this.el.tabIndex = -1;\n if (c.modal !== false) this.el.setAttribute('aria-modal', 'true');\n if (c.draggable !== false) this.initDrag();\n }\n\n private initDrag() {\n this.headerEl.classList.add('op-window__handle');\n this.listen(this.headerEl, '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) => {\n this.el.style.left = `${Math.max(0, Math.min(m.clientX - dx, innerWidth - 40))}px`;\n this.el.style.top = `${Math.max(0, Math.min(m.clientY - dy, innerHeight - 40))}px`;\n this.moved = true;\n };\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.cleanup.push(up);\n });\n }\n\n isVisible(): boolean {\n return this.visible;\n }\n\n /** Centers in the viewport (also done on show and on resize until the user drags it). */\n center(): void {\n const el = this.el;\n el.style.left = `${Math.max(0, (innerWidth - el.offsetWidth) / 2)}px`;\n el.style.top = `${Math.max(0, (innerHeight - el.offsetHeight) / 3)}px`;\n }\n\n override show(): void {\n if (this.visible || this.destroyed || this.emit('before-show') === false) return;\n const c = this.config;\n const el = this.el;\n this.opener = document.activeElement;\n if (c.modal !== false) {\n this.backdrop = h('div', 'op-window-backdrop', {}, el);\n toLayer(this.backdrop, this.opener);\n this.cleanup.push(lockModal(this.backdrop));\n this.listen(this.backdrop, 'pointerdown', (e: Event) => {\n if (e.target !== this.backdrop) return;\n if (c.closeOnBackdrop) this.close();\n else el.focus();\n });\n } else toLayer(el, this.opener);\n this.visible = true;\n this.leaving++;\n el.getAnimations?.().forEach((a) => a.cancel());\n this.notifyMount();\n this.center();\n void popIn(el, this.opener ?? undefined, 'modal'); // grows out of the button that opened it\n this.backdrop?.animate?.([{ opacity: 0 }, { opacity: 1 }], { duration: motion.ms('modal'), easing: motion.easing('enter') });\n this.cleanup.push(trapFocus(el));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented) {\n e.stopPropagation();\n this.close();\n }\n };\n el.addEventListener('keydown', onKey);\n const onResize = () => !this.moved && this.center();\n window.addEventListener('resize', onResize);\n this.cleanup.push(() => el.removeEventListener('keydown', onKey), () => window.removeEventListener('resize', onResize));\n if (c.autoFocus !== false) this.focusFirst();\n this.emit('show');\n }\n\n private focusFirst() {\n const inBody = focusables(this.bodyEl)[0];\n const primary = this.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary');\n (inBody ?? primary ?? focusables(this.el).find((e) => !e.classList.contains('op-panel__tool')) ?? this.el).focus();\n }\n\n override hide(): void {\n if (!this.visible || this.emit('before-hide') === false) return;\n this.release();\n this.emit('hide');\n }\n\n /** Cleans up at once (the page is usable again) and takes the window off the screen: shrinking toward its opener, 20 % faster than it came. */\n private release(animate = true) {\n this.visible = false;\n this.cleanup.splice(0).reverse().forEach((f) => f());\n const bd = this.backdrop;\n this.backdrop = undefined;\n const target = bd ?? this.el;\n const out = animate ? popOut(this.el, this.opener ?? undefined, 'modal') : null;\n if (out) {\n const id = ++this.leaving;\n bd?.animate?.([{ opacity: 1 }, { opacity: 0 }], { duration: motion.ms('modal', 'exit'), easing: motion.easing('exit'), fill: 'forwards' });\n void out.then(() => id === this.leaving && !this.visible && (target.remove(), bd?.remove()));\n } else {\n target.remove();\n bd?.remove();\n }\n if (this.opener instanceof HTMLElement && this.opener.isConnected) this.opener.focus();\n }\n\n protected override onDestroy() {\n if (this.visible) this.release(false);\n else if (this.leaving) (this.el.closest('.op-window-backdrop') ?? this.el).remove();\n super.onDestroy();\n }\n}\nregister('window', Window);\n"],
5
- "mappings": "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",
6
- "names": ["Window", "Panel", "config", "c", "r", "dx", "dy", "move", "m", "up", "el", "h", "toLayer", "lockModal", "e", "a", "popIn", "motion", "trapFocus", "onKey", "onResize", "inBody", "focusables", "primary", "animate", "f", "bd", "target", "out", "popOut", "id", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as h}from"./chunk-5Q6Y6CM4.js";import{a}from"./chunk-SNTHW4K2.js";import{c as o}from"./chunk-IHAYOSBR.js";import{b as l}from"./chunk-IYPKPLCU.js";import{b as s}from"./chunk-PZSHOSOS.js";import{e as i}from"./chunk-MA5BJL3S.js";var d="\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022",n=class extends a{baseCls="op-field op-textfield op-secret";stored=!1;initialStored=!1;replacing=!1;revealed=!1;eyeBtn;replaceBtn;keepBtn;hint;constructor(e={}){super({autocomplete:"new-password",...e,inputType:"password"}),this.stored=this.initialStored=!!e.stored}emptyValue(){return null}isEmpty(e){return!this.stored&&(e==null||e==="")}createControl(){let e=super.createControl(),t=this.input;return t.spellcheck=!1,this.eyeBtn=s("button","op-secret__eye",{type:"button","aria-pressed":"false"}),this.replaceBtn=s("button","op-secret__replace",{type:"button"},i("secretReplace")),this.keepBtn=s("button","op-secret__keep",{type:"button"},i("secretKeep")),this.hint=s("div","op-secret__hint",{id:`${this.id}-hint`},s("span","op-secret__note",{},i("secretStored")),this.keepBtn),this.listen(this.eyeBtn,"mousedown",r=>r.preventDefault()),this.listen(this.eyeBtn,"click",()=>this.setRevealed(!this.revealed)),this.listen(this.replaceBtn,"click",()=>{this.replace()}),this.listen(this.keepBtn,"click",()=>this.keep()),this.listen(t,"click",()=>this.stored&&void this.replace()),this.listen(t,"keydown",r=>{this.stored&&(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),this.replace())}),this.on("blur",()=>this.config.autoHide!==!1&&this.setRevealed(!1)),e.append(this.eyeBtn,this.replaceBtn),s("div","op-secret__box",{},e,this.hint)}onRender(){super.onRender(),this.paint()}isStored(){return this.stored}isReplacing(){return this.replacing}isRevealed(){return this.revealed}setStored(e){this.stored=e,this.replacing=!1,this.revealed=!1,super.setValue(null,!0),this.paint(),this.emit("stored-change",e)}setValue(e,t=!1){if(e===!0)return this.setStored(!0);e===!1&&(e=null),this.stored&&e!=null&&(this.stored=!1,this.replacing=!0),super.setValue(e,t),this.paint()}markClean(){super.markClean(),this.initialStored=this.stored}reset(){this.setStored(this.initialStored),super.reset()}async replace(){return!this.stored||this.config.readonly||this.config.disabled||this.emit("before-replace")===!1||this.config.confirmReplace!==!1&&!await h.confirm(this.config.replaceText??i("secretWarn"),{danger:!0,title:this.config.replaceTitle??i("secretWarnTitle"),okText:i("secretReplace")})?!1:(this.stored=!1,this.replacing=!0,super.setValue("",!1),this.paint(),this.input.focus(),this.emit("replace"),!0)}keep(){this.replacing&&(this.stored=!0,this.replacing=!1,this.revealed=!1,super.setValue(null,!1),this.paint(),this.emit("keep"))}setRevealed(e){this.stored&&(e=!1),this.revealed=e,this.paint()}getDisplayText(){return this.stored||(this.value??"")!==""?d:""}paint(){if(!this.rendered)return;let e=this.input,t=this.revealed&&!this.stored;e.type=t?"text":"password",e.readOnly=this.stored||!!this.config.readonly,e.placeholder=this.stored?d:this.config.placeholder??"",this.stored&&(e.value=""),e.setAttribute("aria-describedby",this.stored||this.replacing?this.hint.id:""),!this.stored&&!this.replacing&&e.removeAttribute("aria-describedby"),this.eyeBtn.hidden=this.stored,this.eyeBtn.setAttribute("aria-pressed",String(t)),this.eyeBtn.setAttribute("aria-label",i(t?"secretHide":"secretShow")),this.eyeBtn.replaceChildren(o(t?"eye-off":"eye")),this.replaceBtn.hidden=!this.stored,this.hint.hidden=!this.stored&&!this.replacing,this.hint.querySelector(".op-secret__note").hidden=!this.stored,this.keepBtn.hidden=!this.replacing,this.el.classList.toggle("is-stored",this.stored),this.el.classList.toggle("is-replacing",this.replacing),this.el.classList.toggle("is-revealed",t),this.el.classList.toggle("has-value",this.stored||!!e.value)}};l("secretfield",n);export{n as a};
2
- //# sourceMappingURL=chunk-T4OYVG2X.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/fields/secretfield/secretfield.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 { iconEl } from '../../base/icon/icon';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\n\nexport interface SecretFieldConfig extends TextFieldConfig<string | null> {\n /** A secret is already saved. It can never be shown; it can only be replaced. `form.load({ key: true })` sets it too. */\n stored?: boolean;\n /** Ask before replacing a saved secret. Default true. */\n confirmReplace?: boolean;\n replaceTitle?: string;\n replaceText?: string;\n /** The eye hides the value again when the field loses focus. Default true. */\n autoHide?: boolean;\n}\n\nconst MASK = '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022';\n\n/**\n * A field for secrets. While you type you can peek at what you typed (the eye); once a secret is saved it is shown only as a\n * mask and can never be read back: to change it you replace it, after a warning. `getValue()` is `null` while untouched\n * (keep what is saved), the new text once typed, `''` when replaced and left empty.\n */\nexport class SecretField extends TextField<string | null, SecretFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-secret';\n private stored = false;\n private initialStored = false;\n private replacing = false;\n private revealed = false;\n private eyeBtn!: HTMLButtonElement;\n private replaceBtn!: HTMLButtonElement;\n private keepBtn!: HTMLButtonElement;\n private hint!: HTMLElement;\n\n constructor(config: SecretFieldConfig = {}) {\n super({ autocomplete: 'new-password', ...config, inputType: 'password' });\n this.stored = this.initialStored = !!config.stored;\n }\n\n protected override emptyValue(): string | null {\n return null;\n }\n /** A saved secret that was not touched counts as filled in (so `required` is satisfied). */\n protected override isEmpty(v: string | null) {\n return !this.stored && (v == null || v === '');\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const input = this.input;\n input.spellcheck = false;\n this.eyeBtn = h('button', 'op-secret__eye', { type: 'button', 'aria-pressed': 'false' });\n this.replaceBtn = h('button', 'op-secret__replace', { type: 'button' }, t('secretReplace'));\n this.keepBtn = h('button', 'op-secret__keep', { type: 'button' }, t('secretKeep'));\n this.hint = h('div', 'op-secret__hint', { id: `${this.id}-hint` }, h('span', 'op-secret__note', {}, t('secretStored')), this.keepBtn);\n this.listen(this.eyeBtn, 'mousedown', (e: Event) => e.preventDefault()); // keep the focus in the input (it would hide the value)\n this.listen(this.eyeBtn, 'click', () => this.setRevealed(!this.revealed));\n this.listen(this.replaceBtn, 'click', () => void this.replace());\n this.listen(this.keepBtn, 'click', () => this.keep());\n // a saved secret is opened for replacement by clicking or pressing a key in the (read-only) field\n this.listen(input, 'click', () => this.stored && void this.replace());\n this.listen(input, 'keydown', (e: KeyboardEvent) => {\n if (this.stored && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n void this.replace();\n }\n });\n this.on('blur', () => this.config.autoHide !== false && this.setRevealed(false));\n wrap.append(this.eyeBtn, this.replaceBtn);\n return h('div', 'op-secret__box', {}, wrap, this.hint);\n }\n\n protected override onRender() {\n super.onRender();\n this.paint();\n }\n\n // ---- state ---------------------------------------------------------------------------------\n\n isStored(): boolean {\n return this.stored;\n }\n /** The user chose to replace a saved secret and has not finished. */\n isReplacing(): boolean {\n return this.replacing;\n }\n isRevealed(): boolean {\n return this.revealed;\n }\n\n /** Says whether a secret is saved (a saved secret is never given to the field, only the fact that it exists). */\n setStored(stored: boolean): void {\n this.stored = stored;\n this.replacing = false;\n this.revealed = false;\n super.setValue(null, true);\n this.paint();\n this.emit('stored-change', stored);\n }\n\n /** `true` (what `form.load` passes for \"a secret exists\") means saved; a string is a new value typed or set by code. */\n override setValue(v: string | boolean | null, silent = false): void {\n if (v === true) return this.setStored(true);\n if (v === false) v = null;\n if (this.stored && v != null) {\n this.stored = false;\n this.replacing = true;\n }\n super.setValue(v, silent);\n this.paint();\n }\n\n override markClean(): void {\n super.markClean();\n this.initialStored = this.stored;\n }\n /** Back to what was loaded: the saved secret, untouched. */\n override reset(): void {\n this.setStored(this.initialStored);\n super.reset();\n }\n\n /** Warns, then turns a saved secret into an empty field to type the new value in. Resolves to whether it was replaced. */\n async replace(): Promise<boolean> {\n if (!this.stored || this.config.readonly || this.config.disabled || this.emit('before-replace') === false) return false;\n if (this.config.confirmReplace !== false) {\n const ok = await MessageBox.confirm(this.config.replaceText ?? t('secretWarn'), { danger: true, title: this.config.replaceTitle ?? t('secretWarnTitle'), okText: t('secretReplace') });\n if (!ok) return false;\n }\n this.stored = false;\n this.replacing = true;\n super.setValue('', false);\n this.paint();\n this.input.focus();\n this.emit('replace');\n return true;\n }\n\n /** Gives up replacing: the saved secret stays as it was. */\n keep(): void {\n if (!this.replacing) return;\n this.stored = true;\n this.replacing = false;\n this.revealed = false;\n super.setValue(null, false);\n this.paint();\n this.emit('keep');\n }\n\n setRevealed(on: boolean): void {\n if (this.stored) on = false; // there is nothing to see\n this.revealed = on;\n this.paint();\n }\n\n /** Never reveals: a mask when there is something, nothing otherwise. */\n override getDisplayText(): string {\n return this.stored || (this.value ?? '') !== '' ? MASK : '';\n }\n\n // ---- view ----------------------------------------------------------------------------------\n\n private paint(): void {\n if (!this.rendered) return;\n const input = this.input as HTMLInputElement;\n const on = this.revealed && !this.stored;\n input.type = on ? 'text' : 'password';\n input.readOnly = this.stored || !!this.config.readonly;\n input.placeholder = this.stored ? MASK : (this.config.placeholder ?? '');\n if (this.stored) input.value = '';\n input.setAttribute('aria-describedby', this.stored || this.replacing ? this.hint.id : '');\n if (!this.stored && !this.replacing) input.removeAttribute('aria-describedby');\n this.eyeBtn.hidden = this.stored;\n this.eyeBtn.setAttribute('aria-pressed', String(on));\n this.eyeBtn.setAttribute('aria-label', t(on ? 'secretHide' : 'secretShow'));\n this.eyeBtn.replaceChildren(iconEl(on ? 'eye-off' : 'eye'));\n this.replaceBtn.hidden = !this.stored;\n this.hint.hidden = !this.stored && !this.replacing;\n (this.hint.querySelector('.op-secret__note') as HTMLElement).hidden = !this.stored;\n this.keepBtn.hidden = !this.replacing;\n this.el.classList.toggle('is-stored', this.stored);\n this.el.classList.toggle('is-replacing', this.replacing);\n this.el.classList.toggle('is-revealed', on);\n this.el.classList.toggle('has-value', this.stored || !!input.value);\n }\n}\nregister('secretfield', SecretField);\n"],
5
- "mappings": "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",
6
- "names": ["MASK", "SecretField", "TextField", "config", "v", "wrap", "input", "h", "t", "e", "stored", "silent", "MessageBox", "on", "iconEl", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as d}from"./chunk-5Q6Y6CM4.js";import{a as m}from"./chunk-ZCAAM4NH.js";import{a as v}from"./chunk-XZEOSW3Q.js";import{a as f,b as c}from"./chunk-IYPKPLCU.js";import{b as l}from"./chunk-PZSHOSOS.js";import{e as n}from"./chunk-MA5BJL3S.js";var w=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function P(a,e=localStorage){let t=()=>{try{let r=JSON.parse(e.getItem(a)??"[]");return Array.isArray(r)?r:[]}catch{return[]}},i=r=>e.setItem(a,JSON.stringify(r));return{list:t,save(r){let s={...r,id:r.id??w()},o=t(),u=o.findIndex(p=>p.id===s.id);return u<0?o.push(s):o[u]=s,i(o),s},remove(r){i(t().filter(s=>s.id!==r.id))}}}function M(a){let e=async(t,i="",r)=>{let s=await(a.fetch??fetch)(a.url+i,{method:t,headers:{"Content-Type":"application/json",...a.headers},body:r===void 0?void 0:JSON.stringify(r)});if(!s.ok)throw new Error(`Optikos views: ${t} ${a.url+i} \u2192 ${s.status}`);return s.status===204?void 0:s.json().catch(()=>{})};return{list:()=>e("GET"),save:t=>t.id?e("PUT",`/${encodeURIComponent(t.id)}`,t):e("POST","",t),remove:t=>e("DELETE",`/${encodeURIComponent(t.id)}`).then(()=>{})}}var h=class extends f{baseCls="op-viewmanager";btn;menu;views=[];current;initial={};build(){return this.btn=new v({text:n("views"),icon:"menu",variant:"ghost",handler:()=>this.openMenu()}),this.btn.el.setAttribute("aria-haspopup","menu"),this.own(()=>(this.btn.destroy(),this.menu?.destroy())),l("span",this.baseCls,{},this.btn.el)}onRender(){this.config.grid.render(),this.config.filters?.render(),this.initial=this.getState(),this.config.autoLoad!==!1&&this.reload()}notifyMount(){super.notifyMount(),this.btn.notifyMount()}getState(){let{grid:e,filters:t,extra:i}=this.config,r={columns:e.getColumnState(),filter:t?.getFilter()??null,sorters:[...e.getStore().getSorters()]};return i&&(r.extra=Object.fromEntries(Object.entries(i).map(([s,o])=>[s,o.get()]))),r}setState(e){let{grid:t,filters:i,extra:r}=this.config;e.columns&&t.setColumnState(e.columns);let s=e.sorters?.[0];t.getStore().sort(s?.field??null,s?.dir),i&&(i.setFilter(e.filter??null),i.apply());for(let o in e.extra)r?.[o]?.set(e.extra[o])}getViews(){return this.views}getCurrent(){return this.current}async reload(){await this.run(async()=>{this.views=await this.config.storage.list()??[],this.current=this.current&&this.views.find(t=>t.id===this.current.id);let e=this.views.find(t=>t.default);!this.current&&e&&this.config.autoLoad!==!1&&this.apply(e),this.paint()}),this.emit("load",this.views)}apply(e){let t=typeof e=="string"?this.views.find(i=>i.id===e):e;!t||this.emit("before-apply",t)===!1||(this.current=t,this.setState(t.state),this.paint(),this.emit("apply",t))}async save(){if(!this.current)return this.saveAs();await this.store({...this.current,state:this.getState()})}async saveAs(e){if(e??=await d.prompt(n("viewsName"),{title:n("viewsSaveAs")})??"",e=e.trim(),!e)return;let t=this.views.find(i=>i.name.toLowerCase()===e.toLowerCase());await this.store({...t,name:e,state:this.getState()})}async setDefault(e=!0){if(this.current){for(let t of this.views)t!==this.current&&t.default&&await this.store({...t,default:!1},!1);await this.store({...this.current,default:e})}}async remove(e=this.current){!e||!await d.confirm(n("viewsConfirmDelete",{n:e.name}),{danger:!0,okText:n("viewsDelete")})||await this.run(async()=>{await this.config.storage.remove(e),this.views=this.views.filter(t=>t!==e&&t.id!==e.id),this.current?.id===e.id&&(this.current=void 0),this.paint(),this.emit("remove",e)})}reset(){this.current=void 0,this.setState(this.initial),this.paint(),this.emit("reset")}async store(e,t=!0){await this.run(async()=>{let i=await this.config.storage.save(e)||e,r=this.views.findIndex(s=>i.id&&s.id===i.id||s===e);r<0?this.views.push(i):this.views[r]=i,t&&(this.current=i),this.paint(),this.emit("save",i)})}async run(e){try{await e()}catch(t){this.emit("error",t)}}paint(){this.btn.setText(this.current?.name??n("views"))}openMenu(){let e=this.current,t=[...this.views.map(i=>({text:i.default?`${i.name} \u2605`:i.name,checked:i===e||!!e?.id&&i.id===e.id,handler:()=>this.apply(i)})),...this.views.length?["-"]:[],{text:n("viewsSave"),handler:()=>{this.save()}},{text:n("viewsSaveAs"),handler:()=>{this.saveAs()}},...e?[{text:n("viewsDefault"),checked:!!e.default,handler:()=>{this.setDefault(!e.default)}},{text:n("viewsDelete"),handler:()=>{this.remove()}}]:[],"-",{text:n("viewsReset"),handler:()=>this.reset()}];this.menu??=new m({}),this.menu.setItems(t),this.menu.showBy(this.btn.el)}};c("viewmanager",h);export{P as a,M as b,h as c};
2
- //# sourceMappingURL=chunk-TK2RC3T5.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/components/data/viewmanager/viewmanager.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 type { FilterGroup, Sorter } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Menu, type MenuEntry } from '../../overlays/menu/menu';\nimport { MessageBox } from '../../overlays/messagebox/messagebox';\nimport type { Grid, ColumnState } from '../grid/grid';\nimport type { FilterBuilder } from '../filterbuilder/filterbuilder';\n\n/** Everything a view remembers: plain JSON, so it can travel to any backend. */\nexport interface ViewState {\n columns?: ColumnState[];\n filter?: FilterGroup | null;\n sorters?: Sorter[];\n /** Whatever the app registered in `extra` (panel collapsed, density...). */\n extra?: Record<string, unknown>;\n}\nexport interface SavedView {\n id?: string;\n name: string;\n default?: boolean;\n state: ViewState;\n}\n\n/** Where views live. Implement it for your endpoint; `localViewStorage` and `restViewStorage` are ready-made. */\nexport interface ViewStorage {\n list(): Promise<SavedView[]> | SavedView[];\n /** Create (no `id`) or update. May return the stored view (with the id the server gave it). */\n save(view: SavedView): Promise<SavedView | void> | SavedView | void;\n remove(view: SavedView): Promise<void> | void;\n}\n\nconst newId = () => globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n\n/** Views in the browser (`localStorage` by default) under one key. */\nexport function localViewStorage(key: string, storage: Storage = localStorage): ViewStorage {\n const read = (): SavedView[] => {\n try {\n const v = JSON.parse(storage.getItem(key) ?? '[]');\n return Array.isArray(v) ? v : [];\n } catch {\n return [];\n }\n };\n const write = (v: SavedView[]) => storage.setItem(key, JSON.stringify(v));\n return {\n list: read,\n save(view) {\n const saved = { ...view, id: view.id ?? newId() };\n const all = read();\n const i = all.findIndex((x) => x.id === saved.id);\n if (i < 0) all.push(saved);\n else all[i] = saved;\n write(all);\n return saved;\n },\n remove(view) {\n write(read().filter((x) => x.id !== view.id));\n },\n };\n}\n\nexport interface RestViewStorageConfig {\n /** `GET url` lists, `POST url` creates, `PUT url/:id` updates, `DELETE url/:id` removes. JSON in and out. */\n url: string;\n headers?: Record<string, string>;\n fetch?: typeof fetch;\n}\n\n/** Views on your server. Responses must be JSON (the list as an array, create/update returning the stored view). */\nexport function restViewStorage(cfg: RestViewStorageConfig): ViewStorage {\n const call = async (method: string, path = '', body?: unknown) => {\n const res = await (cfg.fetch ?? fetch)(cfg.url + path, { method, headers: { 'Content-Type': 'application/json', ...cfg.headers }, body: body === undefined ? undefined : JSON.stringify(body) });\n if (!res.ok) throw new Error(`Optikos views: ${method} ${cfg.url + path} \u2192 ${res.status}`);\n return res.status === 204 ? undefined : res.json().catch(() => undefined);\n };\n return {\n list: () => call('GET'),\n save: (v) => (v.id ? call('PUT', `/${encodeURIComponent(v.id)}`, v) : call('POST', '', v)),\n remove: (v) => call('DELETE', `/${encodeURIComponent(v.id!)}`).then(() => undefined),\n };\n}\n\nexport interface ViewManagerConfig extends ComponentConfig {\n grid: Grid;\n /** Its filter tree is part of the view. */\n filters?: FilterBuilder;\n storage: ViewStorage;\n /** Extra things to remember: `{ density: { get: () => ..., set: (v) => ... } }`. Stored in `state.extra`. */\n extra?: Record<string, { get(): unknown; set(value: unknown): void }>;\n /** Apply the default view when it opens. Default true. */\n autoLoad?: boolean;\n}\n\n/**\n * \"Views\" button for a Grid (and its FilterBuilder): saves and restores the visible columns and their order, the filters\n * (including nested AND/OR groups) and the sort, under a name, in the storage you give it.\n */\nexport class ViewManager extends Component<ViewManagerConfig> {\n protected override baseCls = 'op-viewmanager';\n private btn!: Button;\n private menu?: Menu;\n private views: SavedView[] = [];\n private current?: SavedView;\n private initial: ViewState = {};\n\n protected override build() {\n this.btn = new Button({ text: t('views'), icon: 'menu', variant: 'ghost', handler: () => this.openMenu() });\n this.btn.el.setAttribute('aria-haspopup', 'menu');\n this.own(() => (this.btn.destroy(), this.menu?.destroy()));\n return h('span', this.baseCls, {}, this.btn.el);\n }\n\n protected override onRender() {\n this.config.grid.render();\n this.config.filters?.render();\n this.initial = this.getState();\n if (this.config.autoLoad !== false) void this.reload();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.btn.notifyMount();\n }\n\n // ---- state ---------------------------------------------------------------------------------\n\n /** The grid's and filter's current setup. */\n getState(): ViewState {\n const { grid, filters, extra } = this.config;\n const state: ViewState = { columns: grid.getColumnState(), filter: filters?.getFilter() ?? null, sorters: [...grid.getStore().getSorters()] };\n if (extra) state.extra = Object.fromEntries(Object.entries(extra).map(([k, e]) => [k, e.get()]));\n return state;\n }\n\n /** Puts a setup on the grid and the filter. */\n setState(s: ViewState): void {\n const { grid, filters, extra } = this.config;\n if (s.columns) grid.setColumnState(s.columns);\n const sort = s.sorters?.[0];\n grid.getStore().sort(sort?.field ?? null, sort?.dir);\n if (filters) {\n filters.setFilter(s.filter ?? null);\n filters.apply();\n }\n for (const k in s.extra) extra?.[k]?.set(s.extra[k]);\n }\n\n // ---- views ---------------------------------------------------------------------------------\n\n getViews(): SavedView[] {\n return this.views;\n }\n getCurrent(): SavedView | undefined {\n return this.current;\n }\n\n /** Reads the views from the storage and applies the default one (unless a view is already active). */\n async reload(): Promise<void> {\n await this.run(async () => {\n this.views = (await this.config.storage.list()) ?? [];\n this.current = this.current && this.views.find((v) => v.id === this.current!.id);\n const def = this.views.find((v) => v.default);\n if (!this.current && def && this.config.autoLoad !== false) this.apply(def);\n this.paint();\n });\n this.emit('load', this.views);\n }\n\n /** Applies a saved view (object or id). */\n apply(view: SavedView | string): void {\n const v = typeof view === 'string' ? this.views.find((x) => x.id === view) : view;\n if (!v || this.emit('before-apply', v) === false) return;\n this.current = v;\n this.setState(v.state);\n this.paint();\n this.emit('apply', v);\n }\n\n /** Saves the current setup into the active view; with none active, asks for a name first. */\n async save(): Promise<void> {\n if (!this.current) return this.saveAs();\n await this.store({ ...this.current, state: this.getState() });\n }\n\n /** Saves the current setup as a view with that name (asked for when omitted); an existing name is overwritten. */\n async saveAs(name?: string): Promise<void> {\n name ??= (await MessageBox.prompt(t('viewsName'), { title: t('viewsSaveAs') })) ?? '';\n name = name.trim();\n if (!name) return;\n const same = this.views.find((v) => v.name.toLowerCase() === name!.toLowerCase());\n await this.store({ ...same, name, state: this.getState() });\n }\n\n /** Marks the active view as the one applied on open (and unmarks the others). */\n async setDefault(on = true): Promise<void> {\n if (!this.current) return;\n for (const v of this.views) if (v !== this.current && v.default) await this.store({ ...v, default: false }, false);\n await this.store({ ...this.current, default: on });\n }\n\n async remove(view = this.current): Promise<void> {\n if (!view || !(await MessageBox.confirm(t('viewsConfirmDelete', { n: view.name }), { danger: true, okText: t('viewsDelete') }))) return;\n await this.run(async () => {\n await this.config.storage.remove(view);\n this.views = this.views.filter((v) => v !== view && v.id !== view.id);\n if (this.current?.id === view.id) this.current = undefined;\n this.paint();\n this.emit('remove', view);\n });\n }\n\n /** Back to the setup the grid had when the manager opened. */\n reset(): void {\n this.current = undefined;\n this.setState(this.initial);\n this.paint();\n this.emit('reset');\n }\n\n private async store(view: SavedView, makeCurrent = true): Promise<void> {\n await this.run(async () => {\n const saved = (await this.config.storage.save(view)) || view;\n const i = this.views.findIndex((v) => (saved.id && v.id === saved.id) || v === view);\n if (i < 0) this.views.push(saved);\n else this.views[i] = saved;\n if (makeCurrent) this.current = saved;\n this.paint();\n this.emit('save', saved);\n });\n }\n\n private async run(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n // ---- UI ------------------------------------------------------------------------------------\n\n private paint(): void {\n this.btn.setText(this.current?.name ?? t('views'));\n }\n\n private openMenu(): void {\n const cur = this.current;\n const items: MenuEntry[] = [\n ...this.views.map((v) => ({ text: v.default ? `${v.name} \u2605` : v.name, checked: v === cur || (!!cur?.id && v.id === cur.id), handler: () => this.apply(v) })),\n ...(this.views.length ? (['-'] as const) : []),\n { text: t('viewsSave'), handler: () => void this.save() },\n { text: t('viewsSaveAs'), handler: () => void this.saveAs() },\n ...(cur ? [{ text: t('viewsDefault'), checked: !!cur.default, handler: () => void this.setDefault(!cur.default) }, { text: t('viewsDelete'), handler: () => void this.remove() }] : []),\n '-',\n { text: t('viewsReset'), handler: () => this.reset() },\n ];\n this.menu ??= new Menu({});\n this.menu.setItems(items);\n this.menu.showBy(this.btn.el);\n }\n}\nregister('viewmanager', ViewManager);\n"],
5
- "mappings": "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",
6
- "names": ["newId", "localViewStorage", "key", "storage", "read", "v", "write", "view", "saved", "all", "i", "x", "restViewStorage", "cfg", "call", "method", "path", "body", "res", "ViewManager", "Component", "Button", "t", "h", "grid", "filters", "extra", "state", "k", "e", "s", "sort", "def", "name", "MessageBox", "same", "on", "makeCurrent", "fn", "err", "cur", "items", "Menu", "register"]
7
- }
@@ -1,2 +0,0 @@
1
- import{a as f}from"./chunk-4COBH4QJ.js";import{a as u}from"./chunk-ARCW54L2.js";import{a as h}from"./chunk-SNTHW4K2.js";import{f as o,g as p}from"./chunk-NWTTHDIM.js";import{c}from"./chunk-IHAYOSBR.js";import{b as l}from"./chunk-IYPKPLCU.js";import{b as d}from"./chunk-PZSHOSOS.js";import{e as n}from"./chunk-MA5BJL3S.js";var a=class extends h{baseCls="op-field op-textfield op-picker op-datefield";cal;dd;garbage=!1;emptyValue(){return null}isEmpty(e){return!e}parse(e){let t=p(e);return this.garbage=!!e.trim()&&!t,t}display(e){return e?o(e,{day:"2-digit",month:"2-digit",year:"numeric"}):""}createControl(){let e=super.createControl(),t=this.input;t.setAttribute("aria-haspopup","dialog"),t.setAttribute("aria-expanded","false");let r=d("button","op-picker__trigger",{type:"button",tabindex:-1,"aria-label":n("calOpen")},c("calendar"));this.listen(r,"mousedown",s=>s.preventDefault()),this.listen(r,"click",()=>{!this.config.disabled&&!this.config.readonly&&this.toggle()}),e.append(r);let i=this.config;return this.cal=new f({value:i.value,min:i.min,max:i.max,firstDay:i.firstDay}),this.dd=new u({anchor:e,content:this.cal,role:"presentation"}),this.cal.on("select",s=>{this.dd.close(),this.setValue(s),t.focus()}),this.dd.on("open",()=>{t.setAttribute("aria-expanded","true"),this.el.classList.add("is-open"),this.cal.setValue(this.value),this.cal.focusDay(),this.emit("expand")}),this.dd.on("close",()=>{t.setAttribute("aria-expanded","false"),this.el.classList.remove("is-open"),this.emit("collapse")}),this.own(()=>this.dd.destroy()),this.on("blur",()=>this.later(()=>{let s=document.activeElement;!this.el.contains(s)&&!this.dd.el.contains(s)&&this.dd.close()},0)),e}onKey(e){e.key==="ArrowDown"&&!this.dd.isOpen()?(e.preventDefault(),this.open()):super.onKey(e)}onInput(){super.onInput(),this.garbage?this.setError(n("date")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1}onDisabled(e){super.onDisabled(e),this.el.querySelector(".op-picker__trigger").disabled=e}check(){if(this.garbage)return n("date");let e=super.check(),t=this.value;if(e||!t)return e;let{min:r,max:i}=this.config;return r&&t<r?n("dateMin",{n:o(r)}):i&&t>i?n("dateMax",{n:o(i)}):""}open(){this.config.disabled||this.config.readonly||!this.rendered||this.dd.open()}close(){this.dd?.close()}toggle(){this.dd.isOpen()?this.close():this.open()}expand(){this.open()}collapse(){this.close()}setMin(e){this.config.min=e,this.cal?.setMin(e)}setMax(e){this.config.max=e,this.cal?.setMax(e)}};l("datefield",a);export{a};
2
- //# sourceMappingURL=chunk-U3X2FW6U.js.map