optikos 0.0.0-stage → 0.1.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 (430) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +211 -2
  4. package/THIRD_PARTY_NOTICES.md +83 -0
  5. package/dist/bind.js +2 -0
  6. package/dist/bind.js.map +7 -0
  7. package/dist/chunk-2UPUC4RK.js +2 -0
  8. package/dist/chunk-2UPUC4RK.js.map +7 -0
  9. package/dist/chunk-4AA4FQEM.js +2 -0
  10. package/dist/chunk-4AA4FQEM.js.map +7 -0
  11. package/dist/chunk-4C666HHU.js +2 -0
  12. package/dist/chunk-4C666HHU.js.map +7 -0
  13. package/dist/chunk-4COBH4QJ.js +2 -0
  14. package/dist/chunk-4COBH4QJ.js.map +7 -0
  15. package/dist/chunk-4DHQKECB.js +2 -0
  16. package/dist/chunk-4DHQKECB.js.map +7 -0
  17. package/dist/chunk-4Q67QI7J.js +2 -0
  18. package/dist/chunk-4Q67QI7J.js.map +7 -0
  19. package/dist/chunk-4SUKNSCY.js +2 -0
  20. package/dist/chunk-4SUKNSCY.js.map +7 -0
  21. package/dist/chunk-5AXLYDKU.js +2 -0
  22. package/dist/chunk-5AXLYDKU.js.map +7 -0
  23. package/dist/chunk-5GNEFX6F.js +2 -0
  24. package/dist/chunk-5GNEFX6F.js.map +7 -0
  25. package/dist/chunk-5Q6Y6CM4.js +2 -0
  26. package/dist/chunk-5Q6Y6CM4.js.map +7 -0
  27. package/dist/chunk-666O2GKD.js +2 -0
  28. package/dist/chunk-666O2GKD.js.map +7 -0
  29. package/dist/chunk-676AKAGF.js +2 -0
  30. package/dist/chunk-676AKAGF.js.map +7 -0
  31. package/dist/chunk-6NCXO5ZP.js +2 -0
  32. package/dist/chunk-6NCXO5ZP.js.map +7 -0
  33. package/dist/chunk-6NJW7QFD.js +2 -0
  34. package/dist/chunk-6NJW7QFD.js.map +7 -0
  35. package/dist/chunk-6O2BXCRN.js +2 -0
  36. package/dist/chunk-6O2BXCRN.js.map +7 -0
  37. package/dist/chunk-A66MDXHL.js +2 -0
  38. package/dist/chunk-A66MDXHL.js.map +7 -0
  39. package/dist/chunk-ARCW54L2.js +2 -0
  40. package/dist/chunk-ARCW54L2.js.map +7 -0
  41. package/dist/chunk-BIYNHKSA.js +2 -0
  42. package/dist/chunk-BIYNHKSA.js.map +7 -0
  43. package/dist/chunk-BNPVRIFT.js +2 -0
  44. package/dist/chunk-BNPVRIFT.js.map +7 -0
  45. package/dist/chunk-C3N7QTQB.js +2 -0
  46. package/dist/chunk-C3N7QTQB.js.map +7 -0
  47. package/dist/chunk-CEXY5A4T.js +2 -0
  48. package/dist/chunk-CEXY5A4T.js.map +7 -0
  49. package/dist/chunk-CN7USUJR.js +2 -0
  50. package/dist/chunk-CN7USUJR.js.map +7 -0
  51. package/dist/chunk-CQRHNTEX.js +2 -0
  52. package/dist/chunk-CQRHNTEX.js.map +7 -0
  53. package/dist/chunk-CUPAPOKC.js +2 -0
  54. package/dist/chunk-CUPAPOKC.js.map +7 -0
  55. package/dist/chunk-DXO3UJKL.js +2 -0
  56. package/dist/chunk-DXO3UJKL.js.map +7 -0
  57. package/dist/chunk-GZNQPENR.js +2 -0
  58. package/dist/chunk-GZNQPENR.js.map +7 -0
  59. package/dist/chunk-HFFK6K4K.js +2 -0
  60. package/dist/chunk-HFFK6K4K.js.map +7 -0
  61. package/dist/chunk-IHAYOSBR.js +2 -0
  62. package/dist/chunk-IHAYOSBR.js.map +7 -0
  63. package/dist/chunk-IO66A6G5.js +2 -0
  64. package/dist/chunk-IO66A6G5.js.map +7 -0
  65. package/dist/chunk-IW7PK4VS.js +2 -0
  66. package/dist/chunk-IW7PK4VS.js.map +7 -0
  67. package/dist/chunk-IYPKPLCU.js +2 -0
  68. package/dist/chunk-IYPKPLCU.js.map +7 -0
  69. package/dist/chunk-JTYWZMSZ.js +2 -0
  70. package/dist/chunk-JTYWZMSZ.js.map +7 -0
  71. package/dist/chunk-JVEPKW5X.js +2 -0
  72. package/dist/chunk-JVEPKW5X.js.map +7 -0
  73. package/dist/chunk-JZNEB7A7.js +2 -0
  74. package/dist/chunk-JZNEB7A7.js.map +7 -0
  75. package/dist/chunk-K2DGY6MP.js +2 -0
  76. package/dist/chunk-K2DGY6MP.js.map +7 -0
  77. package/dist/chunk-LBCWEWPN.js +2 -0
  78. package/dist/chunk-LBCWEWPN.js.map +7 -0
  79. package/dist/chunk-LEE2FEEL.js +2 -0
  80. package/dist/chunk-LEE2FEEL.js.map +7 -0
  81. package/dist/chunk-LMGCV35W.js +2 -0
  82. package/dist/chunk-LMGCV35W.js.map +7 -0
  83. package/dist/chunk-LV6HXFHU.js +3 -0
  84. package/dist/chunk-LV6HXFHU.js.map +7 -0
  85. package/dist/chunk-MA5BJL3S.js +2 -0
  86. package/dist/chunk-MA5BJL3S.js.map +7 -0
  87. package/dist/chunk-NDBFYIL6.js +2 -0
  88. package/dist/chunk-NDBFYIL6.js.map +7 -0
  89. package/dist/chunk-NHVEP72K.js +2 -0
  90. package/dist/chunk-NHVEP72K.js.map +7 -0
  91. package/dist/chunk-NV5AIBQP.js +2 -0
  92. package/dist/chunk-NV5AIBQP.js.map +7 -0
  93. package/dist/chunk-NWTTHDIM.js +2 -0
  94. package/dist/chunk-NWTTHDIM.js.map +7 -0
  95. package/dist/chunk-O4DCHALR.js +2 -0
  96. package/dist/chunk-O4DCHALR.js.map +7 -0
  97. package/dist/chunk-ODWPBBVL.js +2 -0
  98. package/dist/chunk-ODWPBBVL.js.map +7 -0
  99. package/dist/chunk-OW2ZSMGS.js +2 -0
  100. package/dist/chunk-OW2ZSMGS.js.map +7 -0
  101. package/dist/chunk-OWEQT2HN.js +2 -0
  102. package/dist/chunk-OWEQT2HN.js.map +7 -0
  103. package/dist/chunk-PSPQH35P.js +2 -0
  104. package/dist/chunk-PSPQH35P.js.map +7 -0
  105. package/dist/chunk-PZSHOSOS.js +2 -0
  106. package/dist/chunk-PZSHOSOS.js.map +7 -0
  107. package/dist/chunk-QEQIJAAB.js +2 -0
  108. package/dist/chunk-QEQIJAAB.js.map +7 -0
  109. package/dist/chunk-SNTHW4K2.js +2 -0
  110. package/dist/chunk-SNTHW4K2.js.map +7 -0
  111. package/dist/chunk-T4OYVG2X.js +2 -0
  112. package/dist/chunk-T4OYVG2X.js.map +7 -0
  113. package/dist/chunk-TBLICXWW.js +2 -0
  114. package/dist/chunk-TBLICXWW.js.map +7 -0
  115. package/dist/chunk-TK2RC3T5.js +2 -0
  116. package/dist/chunk-TK2RC3T5.js.map +7 -0
  117. package/dist/chunk-U3X2FW6U.js +2 -0
  118. package/dist/chunk-U3X2FW6U.js.map +7 -0
  119. package/dist/chunk-UPOBGNJ5.js +2 -0
  120. package/dist/chunk-UPOBGNJ5.js.map +7 -0
  121. package/dist/chunk-VV7CFMPZ.js +2 -0
  122. package/dist/chunk-VV7CFMPZ.js.map +7 -0
  123. package/dist/chunk-X2ASKUFD.js +2 -0
  124. package/dist/chunk-X2ASKUFD.js.map +7 -0
  125. package/dist/chunk-X6AULZI4.js +1 -0
  126. package/dist/chunk-X6AULZI4.js.map +7 -0
  127. package/dist/chunk-XVIC24AW.js +2 -0
  128. package/dist/chunk-XVIC24AW.js.map +7 -0
  129. package/dist/chunk-XZ5CUZZP.js +2 -0
  130. package/dist/chunk-XZ5CUZZP.js.map +7 -0
  131. package/dist/chunk-XZEOSW3Q.js +2 -0
  132. package/dist/chunk-XZEOSW3Q.js.map +7 -0
  133. package/dist/chunk-YET5PM6F.js +2 -0
  134. package/dist/chunk-YET5PM6F.js.map +7 -0
  135. package/dist/chunk-Z25NC4CS.js +2 -0
  136. package/dist/chunk-Z25NC4CS.js.map +7 -0
  137. package/dist/chunk-ZCAAM4NH.js +2 -0
  138. package/dist/chunk-ZCAAM4NH.js.map +7 -0
  139. package/dist/chunk-ZHVSHDLH.js +2 -0
  140. package/dist/chunk-ZHVSHDLH.js.map +7 -0
  141. package/dist/chunk-ZYUXCZX7.js +2 -0
  142. package/dist/chunk-ZYUXCZX7.js.map +7 -0
  143. package/dist/components/breadcrumb.js +2 -0
  144. package/dist/components/breadcrumb.js.map +7 -0
  145. package/dist/components/button.js +2 -0
  146. package/dist/components/button.js.map +7 -0
  147. package/dist/components/calendar.js +2 -0
  148. package/dist/components/calendar.js.map +7 -0
  149. package/dist/components/chat.js +2 -0
  150. package/dist/components/chat.js.map +7 -0
  151. package/dist/components/checkbox.js +2 -0
  152. package/dist/components/checkbox.js.map +7 -0
  153. package/dist/components/combobox.js +2 -0
  154. package/dist/components/combobox.js.map +7 -0
  155. package/dist/components/commandpalette.js +2 -0
  156. package/dist/components/commandpalette.js.map +7 -0
  157. package/dist/components/container.js +2 -0
  158. package/dist/components/container.js.map +7 -0
  159. package/dist/components/dataview.js +2 -0
  160. package/dist/components/dataview.js.map +7 -0
  161. package/dist/components/datefield.js +2 -0
  162. package/dist/components/datefield.js.map +7 -0
  163. package/dist/components/daterangefield.js +2 -0
  164. package/dist/components/daterangefield.js.map +7 -0
  165. package/dist/components/dropdown.js +2 -0
  166. package/dist/components/dropdown.js.map +7 -0
  167. package/dist/components/fieldset.js +2 -0
  168. package/dist/components/fieldset.js.map +7 -0
  169. package/dist/components/filterbuilder.js +2 -0
  170. package/dist/components/filterbuilder.js.map +7 -0
  171. package/dist/components/form.js +2 -0
  172. package/dist/components/form.js.map +7 -0
  173. package/dist/components/grid.js +2 -0
  174. package/dist/components/grid.js.map +7 -0
  175. package/dist/components/icon.js +2 -0
  176. package/dist/components/icon.js.map +7 -0
  177. package/dist/components/label.js +2 -0
  178. package/dist/components/label.js.map +7 -0
  179. package/dist/components/listbox.js +2 -0
  180. package/dist/components/listbox.js.map +7 -0
  181. package/dist/components/lookupfield.js +2 -0
  182. package/dist/components/lookupfield.js.map +7 -0
  183. package/dist/components/menu.js +2 -0
  184. package/dist/components/menu.js.map +7 -0
  185. package/dist/components/messagebox.js +2 -0
  186. package/dist/components/messagebox.js.map +7 -0
  187. package/dist/components/navmenu.js +2 -0
  188. package/dist/components/navmenu.js.map +7 -0
  189. package/dist/components/numberfield.js +2 -0
  190. package/dist/components/numberfield.js.map +7 -0
  191. package/dist/components/pagination.js +2 -0
  192. package/dist/components/pagination.js.map +7 -0
  193. package/dist/components/panel.js +2 -0
  194. package/dist/components/panel.js.map +7 -0
  195. package/dist/components/pickerfield.js +2 -0
  196. package/dist/components/pickerfield.js.map +7 -0
  197. package/dist/components/radiogroup.js +2 -0
  198. package/dist/components/radiogroup.js.map +7 -0
  199. package/dist/components/searchgrid.js +2 -0
  200. package/dist/components/searchgrid.js.map +7 -0
  201. package/dist/components/secretfield.js +2 -0
  202. package/dist/components/secretfield.js.map +7 -0
  203. package/dist/components/select.js +2 -0
  204. package/dist/components/select.js.map +7 -0
  205. package/dist/components/slider.js +2 -0
  206. package/dist/components/slider.js.map +7 -0
  207. package/dist/components/spacer.js +2 -0
  208. package/dist/components/spacer.js.map +7 -0
  209. package/dist/components/spinner.js +2 -0
  210. package/dist/components/spinner.js.map +7 -0
  211. package/dist/components/stepform.js +2 -0
  212. package/dist/components/stepform.js.map +7 -0
  213. package/dist/components/stepper.js +2 -0
  214. package/dist/components/stepper.js.map +7 -0
  215. package/dist/components/suggestfield.js +2 -0
  216. package/dist/components/suggestfield.js.map +7 -0
  217. package/dist/components/table.js +2 -0
  218. package/dist/components/table.js.map +7 -0
  219. package/dist/components/tabs.js +2 -0
  220. package/dist/components/tabs.js.map +7 -0
  221. package/dist/components/textarea.js +2 -0
  222. package/dist/components/textarea.js.map +7 -0
  223. package/dist/components/textfield.js +2 -0
  224. package/dist/components/textfield.js.map +7 -0
  225. package/dist/components/toast.js +2 -0
  226. package/dist/components/toast.js.map +7 -0
  227. package/dist/components/toolbar.js +2 -0
  228. package/dist/components/toolbar.js.map +7 -0
  229. package/dist/components/tooltip.js +2 -0
  230. package/dist/components/tooltip.js.map +7 -0
  231. package/dist/components/viewmanager.js +2 -0
  232. package/dist/components/viewmanager.js.map +7 -0
  233. package/dist/components/viewport.js +2 -0
  234. package/dist/components/viewport.js.map +7 -0
  235. package/dist/components/widget.js +2 -0
  236. package/dist/components/widget.js.map +7 -0
  237. package/dist/components/window.js +2 -0
  238. package/dist/components/window.js.map +7 -0
  239. package/dist/core.js +2 -0
  240. package/dist/core.js.map +7 -0
  241. package/dist/css/base.css +160 -0
  242. package/dist/css/breadcrumb.css +53 -0
  243. package/dist/css/button.css +101 -0
  244. package/dist/css/calendar.css +108 -0
  245. package/dist/css/chat.css +233 -0
  246. package/dist/css/checkbox.css +64 -0
  247. package/dist/css/commandpalette.css +167 -0
  248. package/dist/css/container.css +5 -0
  249. package/dist/css/core.css +88 -0
  250. package/dist/css/dataview.css +56 -0
  251. package/dist/css/dropdown.css +13 -0
  252. package/dist/css/field.css +62 -0
  253. package/dist/css/fieldset.css +32 -0
  254. package/dist/css/filterbuilder.css +125 -0
  255. package/dist/css/form.css +8 -0
  256. package/dist/css/grid.css +367 -0
  257. package/dist/css/icon.css +16 -0
  258. package/dist/css/label.css +12 -0
  259. package/dist/css/layout.css +116 -0
  260. package/dist/css/listbox.css +50 -0
  261. package/dist/css/menu.css +47 -0
  262. package/dist/css/messagebox.css +6 -0
  263. package/dist/css/motion.css +29 -0
  264. package/dist/css/navmenu.css +115 -0
  265. package/dist/css/pagination.css +23 -0
  266. package/dist/css/panel.css +77 -0
  267. package/dist/css/pickerfield.css +85 -0
  268. package/dist/css/radiogroup.css +53 -0
  269. package/dist/css/searchgrid.css +37 -0
  270. package/dist/css/secretfield.css +73 -0
  271. package/dist/css/slider.css +107 -0
  272. package/dist/css/spacer.css +7 -0
  273. package/dist/css/stepform.css +46 -0
  274. package/dist/css/stepper.css +117 -0
  275. package/dist/css/table.css +36 -0
  276. package/dist/css/tabs.css +99 -0
  277. package/dist/css/textarea.css +11 -0
  278. package/dist/css/textfield.css +59 -0
  279. package/dist/css/toast.css +91 -0
  280. package/dist/css/toolbar.css +14 -0
  281. package/dist/css/tooltip.css +17 -0
  282. package/dist/css/viewport.css +9 -0
  283. package/dist/css/widget.css +77 -0
  284. package/dist/css/window.css +31 -0
  285. package/dist/data.js +2 -0
  286. package/dist/data.js.map +7 -0
  287. package/dist/index.js +8 -0
  288. package/dist/index.js.map +7 -0
  289. package/dist/motion.js +2 -0
  290. package/dist/motion.js.map +7 -0
  291. package/dist/optikos.css +3145 -0
  292. package/dist/themes/brand.css +240 -0
  293. package/dist/themes/brutal.css +100 -0
  294. package/dist/themes/compact.css +17 -0
  295. package/dist/themes/corporate.css +112 -0
  296. package/dist/themes/dark.css +38 -0
  297. package/dist/themes/editorial.css +110 -0
  298. package/dist/themes/soft.css +101 -0
  299. package/dist/themes/terminal.css +91 -0
  300. package/dist/types/bind/index.d.ts +23 -0
  301. package/dist/types/components/base/button/button.d.ts +34 -0
  302. package/dist/types/components/base/icon/icon.d.ts +17 -0
  303. package/dist/types/components/base/label/label.d.ts +14 -0
  304. package/dist/types/components/breadcrumb.d.ts +1 -0
  305. package/dist/types/components/button.d.ts +1 -0
  306. package/dist/types/components/calendar.d.ts +1 -0
  307. package/dist/types/components/chat/chat/chat.d.ts +84 -0
  308. package/dist/types/components/chat.d.ts +1 -0
  309. package/dist/types/components/checkbox.d.ts +1 -0
  310. package/dist/types/components/combobox.d.ts +1 -0
  311. package/dist/types/components/commandpalette.d.ts +1 -0
  312. package/dist/types/components/container.d.ts +1 -0
  313. package/dist/types/components/data/dataview/dataview.d.ts +61 -0
  314. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +71 -0
  315. package/dist/types/components/data/grid/grid.d.ts +151 -0
  316. package/dist/types/components/data/pagination/pagination.d.ts +31 -0
  317. package/dist/types/components/data/searchgrid/searchgrid.d.ts +63 -0
  318. package/dist/types/components/data/table/table.d.ts +26 -0
  319. package/dist/types/components/data/viewmanager/viewmanager.d.ts +86 -0
  320. package/dist/types/components/dataview.d.ts +1 -0
  321. package/dist/types/components/datefield.d.ts +1 -0
  322. package/dist/types/components/daterangefield.d.ts +1 -0
  323. package/dist/types/components/dates/calendar/calendar.d.ts +48 -0
  324. package/dist/types/components/dropdown.d.ts +1 -0
  325. package/dist/types/components/feedback/spinner/spinner.d.ts +11 -0
  326. package/dist/types/components/fields/checkbox/checkbox.d.ts +20 -0
  327. package/dist/types/components/fields/combobox/combobox.d.ts +15 -0
  328. package/dist/types/components/fields/datefield/datefield.d.ts +30 -0
  329. package/dist/types/components/fields/daterangefield/daterangefield.d.ts +32 -0
  330. package/dist/types/components/fields/listbox/listbox.d.ts +54 -0
  331. package/dist/types/components/fields/lookupfield/lookupfield.d.ts +25 -0
  332. package/dist/types/components/fields/numberfield/numberfield.d.ts +31 -0
  333. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +77 -0
  334. package/dist/types/components/fields/radiogroup/radiogroup.d.ts +26 -0
  335. package/dist/types/components/fields/secretfield/secretfield.d.ts +52 -0
  336. package/dist/types/components/fields/select/select.d.ts +10 -0
  337. package/dist/types/components/fields/slider/slider.d.ts +62 -0
  338. package/dist/types/components/fields/suggestfield/suggestfield.d.ts +34 -0
  339. package/dist/types/components/fields/textarea/textarea.d.ts +16 -0
  340. package/dist/types/components/fields/textfield/textfield.d.ts +38 -0
  341. package/dist/types/components/fieldset.d.ts +1 -0
  342. package/dist/types/components/filterbuilder.d.ts +1 -0
  343. package/dist/types/components/form/form/form.d.ts +51 -0
  344. package/dist/types/components/form/stepform/stepform.d.ts +62 -0
  345. package/dist/types/components/form.d.ts +1 -0
  346. package/dist/types/components/grid.d.ts +1 -0
  347. package/dist/types/components/icon.d.ts +1 -0
  348. package/dist/types/components/label.d.ts +1 -0
  349. package/dist/types/components/layout/container/container.d.ts +1 -0
  350. package/dist/types/components/layout/fieldset/fieldset.d.ts +21 -0
  351. package/dist/types/components/layout/panel/panel.d.ts +47 -0
  352. package/dist/types/components/layout/spacer/spacer.d.ts +12 -0
  353. package/dist/types/components/layout/toolbar/toolbar.d.ts +15 -0
  354. package/dist/types/components/layout/viewport/viewport.d.ts +7 -0
  355. package/dist/types/components/listbox.d.ts +1 -0
  356. package/dist/types/components/lookupfield.d.ts +1 -0
  357. package/dist/types/components/menu.d.ts +1 -0
  358. package/dist/types/components/messagebox.d.ts +1 -0
  359. package/dist/types/components/navigation/breadcrumb/breadcrumb.d.ts +32 -0
  360. package/dist/types/components/navigation/navmenu/navmenu.d.ts +63 -0
  361. package/dist/types/components/navigation/stepper/stepper.d.ts +31 -0
  362. package/dist/types/components/navigation/tabs/tabs.d.ts +49 -0
  363. package/dist/types/components/navmenu.d.ts +1 -0
  364. package/dist/types/components/numberfield.d.ts +1 -0
  365. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +80 -0
  366. package/dist/types/components/overlays/dropdown/dropdown.d.ts +41 -0
  367. package/dist/types/components/overlays/menu/menu.d.ts +41 -0
  368. package/dist/types/components/overlays/messagebox/messagebox.d.ts +53 -0
  369. package/dist/types/components/overlays/toast/toast.d.ts +45 -0
  370. package/dist/types/components/overlays/tooltip/tooltip.d.ts +13 -0
  371. package/dist/types/components/overlays/widget/widget.d.ts +48 -0
  372. package/dist/types/components/overlays/window/window.d.ts +31 -0
  373. package/dist/types/components/pagination.d.ts +1 -0
  374. package/dist/types/components/panel.d.ts +1 -0
  375. package/dist/types/components/pickerfield.d.ts +1 -0
  376. package/dist/types/components/radiogroup.d.ts +1 -0
  377. package/dist/types/components/searchgrid.d.ts +1 -0
  378. package/dist/types/components/secretfield.d.ts +1 -0
  379. package/dist/types/components/select.d.ts +1 -0
  380. package/dist/types/components/slider.d.ts +1 -0
  381. package/dist/types/components/spacer.d.ts +1 -0
  382. package/dist/types/components/spinner.d.ts +1 -0
  383. package/dist/types/components/stepform.d.ts +1 -0
  384. package/dist/types/components/stepper.d.ts +1 -0
  385. package/dist/types/components/suggestfield.d.ts +1 -0
  386. package/dist/types/components/table.d.ts +1 -0
  387. package/dist/types/components/tabs.d.ts +1 -0
  388. package/dist/types/components/textarea.d.ts +1 -0
  389. package/dist/types/components/textfield.d.ts +1 -0
  390. package/dist/types/components/toast.d.ts +1 -0
  391. package/dist/types/components/toolbar.d.ts +1 -0
  392. package/dist/types/components/tooltip.d.ts +1 -0
  393. package/dist/types/components/viewmanager.d.ts +1 -0
  394. package/dist/types/components/viewport.d.ts +1 -0
  395. package/dist/types/components/widget.d.ts +1 -0
  396. package/dist/types/components/window.d.ts +1 -0
  397. package/dist/types/core/component.d.ts +90 -0
  398. package/dist/types/core/container.d.ts +43 -0
  399. package/dist/types/core/date.d.ts +14 -0
  400. package/dist/types/core/dom.d.ts +11 -0
  401. package/dist/types/core/emitter.d.ts +12 -0
  402. package/dist/types/core/field.d.ts +78 -0
  403. package/dist/types/core/focus.d.ts +18 -0
  404. package/dist/types/core/i18n.d.ts +7 -0
  405. package/dist/types/core/index.d.ts +15 -0
  406. package/dist/types/core/layer.d.ts +6 -0
  407. package/dist/types/core/position.d.ts +16 -0
  408. package/dist/types/core/registry.d.ts +12 -0
  409. package/dist/types/core/validators.d.ts +10 -0
  410. package/dist/types/core/virtual.d.ts +24 -0
  411. package/dist/types/data/column.d.ts +27 -0
  412. package/dist/types/data/format.d.ts +4 -0
  413. package/dist/types/data/index.d.ts +5 -0
  414. package/dist/types/data/model.d.ts +28 -0
  415. package/dist/types/data/proxy.d.ts +61 -0
  416. package/dist/types/data/store.d.ts +94 -0
  417. package/dist/types/index.d.ts +53 -0
  418. package/dist/types/layout/layout.d.ts +27 -0
  419. package/dist/types/motion/config.d.ts +83 -0
  420. package/dist/types/motion/core.d.ts +40 -0
  421. package/dist/types/motion/extras.d.ts +66 -0
  422. package/dist/types/motion/index.d.ts +3 -0
  423. package/dist/types/themes/define.d.ts +30 -0
  424. package/dist/types/themes/index.d.ts +1 -0
  425. package/dist/types/ui/enums.d.ts +88 -0
  426. package/dist/types/ui/index.d.ts +2 -0
  427. package/dist/types/ui/ui.d.ts +58 -0
  428. package/dist/ui.js +2 -0
  429. package/dist/ui.js.map +7 -0
  430. package/package.json +99 -4
@@ -0,0 +1,2 @@
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
@@ -0,0 +1,7 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import{a as n}from"./chunk-K2DGY6MP.js";import{b as r}from"./chunk-IYPKPLCU.js";import{b as e}from"./chunk-PZSHOSOS.js";var s=class extends n{baseCls="op-field op-radiogroup";group;inputs=[];emptyValue(){return null}createControl(){return this.group=e("div","op-radiogroup__options",{role:"radiogroup","aria-labelledby":`${this.id}-label`}),this.listen(this.group,"change",t=>{let i=this.inputs.indexOf(t.target);if(!(i<0)){if(this.config.readonly)return this.applyValue(this.value);this.commit(this.opts()[i].value),this.paintChecked()}}),this.buildOptions(),this.inputEl=this.inputs[0]??this.group,this.group}opts(){return(this.config.options??[]).map(t=>typeof t=="object"?t:{value:t,label:t,disabled:!1})}buildOptions(){this.inputs=[],this.group.replaceChildren(...this.opts().map(t=>{let i=e("input","op-radio__input",{type:"radio",name:this.id,value:String(t.value),disabled:!!t.disabled});return this.inputs.push(i),e("label","op-radio",{},i,e("span","op-radio__dot"),e("span","op-radio__text",{},t.label))})),this.group.classList.toggle("op-radiogroup__options--horizontal",this.config.direction==="horizontal")}onRender(){super.onRender(),this.el.querySelector(".op-field__label").id=`${this.id}-label`}applyValue(t){let i=this.opts();this.inputs.forEach((o,p)=>o.checked=t!=null&&i[p].value===t),this.paintChecked()}paintChecked(){for(let t of this.inputs)t.closest("label").classList.toggle("is-checked",t.checked)}getDisplayText(){let t=this.getValue();return this.opts().find(i=>i.value===t)?.label??""}onDisabled(t){this.inputs.forEach((i,o)=>i.disabled=t||!!this.opts()[o].disabled)}setOptions(t){this.config.options=t,this.rendered&&(this.buildOptions(),this.inputEl=this.inputs[0]??this.group,this.applyValue(this.value),this.onDisabled(!!this.config.disabled))}};r("radiogroup",s);export{s as a};
2
+ //# sourceMappingURL=chunk-NV5AIBQP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/radiogroup/radiogroup.ts"],
4
+ "sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\n\nexport type RadioOption = string | { value: string | number; label: string; disabled?: boolean };\n\nexport interface RadioGroupConfig extends FieldConfig<string | number | null> {\n options?: RadioOption[];\n direction?: 'vertical' | 'horizontal';\n}\n\nexport class RadioGroup extends Field<string | number | null, RadioGroupConfig> {\n protected override baseCls = 'op-field op-radiogroup';\n private group!: HTMLElement;\n private inputs: HTMLInputElement[] = [];\n\n protected override emptyValue() {\n return null;\n }\n\n protected createControl() {\n this.group = h('div', 'op-radiogroup__options', { role: 'radiogroup', 'aria-labelledby': `${this.id}-label` });\n this.listen(this.group, 'change', (e: Event) => {\n const i = this.inputs.indexOf(e.target as HTMLInputElement);\n if (i < 0) return;\n if (this.config.readonly) return this.applyValue(this.value);\n this.commit(this.opts()[i].value);\n this.paintChecked(); // `commit` leaves the native control alone, but the custom dot follows the `is-checked` class\n });\n this.buildOptions();\n this.inputEl = this.inputs[0] ?? this.group;\n return this.group;\n }\n\n private opts() {\n return (this.config.options ?? []).map((o) => (typeof o === 'object' ? o : { value: o, label: o, disabled: false }));\n }\n\n private buildOptions() {\n this.inputs = [];\n this.group.replaceChildren(\n ...this.opts().map((o) => {\n const input = h('input', 'op-radio__input', { type: 'radio', name: this.id, value: String(o.value), disabled: !!o.disabled });\n this.inputs.push(input);\n return h('label', 'op-radio', {}, input, h('span', 'op-radio__dot'), h('span', 'op-radio__text', {}, o.label));\n }),\n );\n this.group.classList.toggle('op-radiogroup__options--horizontal', this.config.direction === 'horizontal');\n }\n\n protected override onRender() {\n super.onRender();\n // the group is labelled by the field label\n (this.el.querySelector('.op-field__label') as HTMLElement).id = `${this.id}-label`;\n }\n\n protected applyValue(v: string | number | null) {\n const opts = this.opts();\n this.inputs.forEach((input, i) => (input.checked = v != null && opts[i].value === v));\n this.paintChecked();\n }\n\n /** The `is-checked` class (what the styled dot reads) mirrors the native `checked` of each option. */\n private paintChecked() {\n for (const input of this.inputs) input.closest('label')!.classList.toggle('is-checked', input.checked);\n }\n\n override getDisplayText(): string {\n const v = this.getValue();\n return this.opts().find((o) => o.value === v)?.label ?? '';\n }\n\n protected override onDisabled(disabled: boolean) {\n this.inputs.forEach((i, n) => (i.disabled = disabled || !!this.opts()[n].disabled));\n }\n\n setOptions(options: RadioOption[]) {\n this.config.options = options;\n if (!this.rendered) return;\n this.buildOptions();\n this.inputEl = this.inputs[0] ?? this.group;\n this.applyValue(this.value);\n this.onDisabled(!!this.config.disabled);\n }\n}\nregister('radiogroup', RadioGroup);\n"],
5
+ "mappings": "wHAWO,IAAMA,EAAN,cAAyBC,CAAgD,CAC3D,QAAU,yBACrB,MACA,OAA6B,CAAC,EAEnB,YAAa,CAC9B,OAAO,IACT,CAEU,eAAgB,CACxB,YAAK,MAAQC,EAAE,MAAO,yBAA0B,CAAE,KAAM,aAAc,kBAAmB,GAAG,KAAK,EAAE,QAAS,CAAC,EAC7G,KAAK,OAAO,KAAK,MAAO,SAAWC,GAAa,CAC9C,IAAM,EAAI,KAAK,OAAO,QAAQA,EAAE,MAA0B,EAC1D,GAAI,IAAI,GACR,IAAI,KAAK,OAAO,SAAU,OAAO,KAAK,WAAW,KAAK,KAAK,EAC3D,KAAK,OAAO,KAAK,KAAK,EAAE,CAAC,EAAE,KAAK,EAChC,KAAK,aAAa,EACpB,CAAC,EACD,KAAK,aAAa,EAClB,KAAK,QAAU,KAAK,OAAO,CAAC,GAAK,KAAK,MAC/B,KAAK,KACd,CAEQ,MAAO,CACb,OAAQ,KAAK,OAAO,SAAW,CAAC,GAAG,IAAKC,GAAO,OAAOA,GAAM,SAAWA,EAAI,CAAE,MAAOA,EAAG,MAAOA,EAAG,SAAU,EAAM,CAAE,CACrH,CAEQ,cAAe,CACrB,KAAK,OAAS,CAAC,EACf,KAAK,MAAM,gBACT,GAAG,KAAK,KAAK,EAAE,IAAKA,GAAM,CACxB,IAAMC,EAAQH,EAAE,QAAS,kBAAmB,CAAE,KAAM,QAAS,KAAM,KAAK,GAAI,MAAO,OAAOE,EAAE,KAAK,EAAG,SAAU,CAAC,CAACA,EAAE,QAAS,CAAC,EAC5H,YAAK,OAAO,KAAKC,CAAK,EACfH,EAAE,QAAS,WAAY,CAAC,EAAGG,EAAOH,EAAE,OAAQ,eAAe,EAAGA,EAAE,OAAQ,iBAAkB,CAAC,EAAGE,EAAE,KAAK,CAAC,CAC/G,CAAC,CACH,EACA,KAAK,MAAM,UAAU,OAAO,qCAAsC,KAAK,OAAO,YAAc,YAAY,CAC1G,CAEmB,UAAW,CAC5B,MAAM,SAAS,EAEd,KAAK,GAAG,cAAc,kBAAkB,EAAkB,GAAK,GAAG,KAAK,EAAE,QAC5E,CAEU,WAAWE,EAA2B,CAC9C,IAAMC,EAAO,KAAK,KAAK,EACvB,KAAK,OAAO,QAAQ,CAACF,EAAOG,IAAOH,EAAM,QAAUC,GAAK,MAAQC,EAAKC,CAAC,EAAE,QAAUF,CAAE,EACpF,KAAK,aAAa,CACpB,CAGQ,cAAe,CACrB,QAAWD,KAAS,KAAK,OAAQA,EAAM,QAAQ,OAAO,EAAG,UAAU,OAAO,aAAcA,EAAM,OAAO,CACvG,CAES,gBAAyB,CAChC,IAAMC,EAAI,KAAK,SAAS,EACxB,OAAO,KAAK,KAAK,EAAE,KAAMF,GAAMA,EAAE,QAAUE,CAAC,GAAG,OAAS,EAC1D,CAEmB,WAAWG,EAAmB,CAC/C,KAAK,OAAO,QAAQ,CAAC,EAAGC,IAAO,EAAE,SAAWD,GAAY,CAAC,CAAC,KAAK,KAAK,EAAEC,CAAC,EAAE,QAAS,CACpF,CAEA,WAAWC,EAAwB,CACjC,KAAK,OAAO,QAAUA,EACjB,KAAK,WACV,KAAK,aAAa,EAClB,KAAK,QAAU,KAAK,OAAO,CAAC,GAAK,KAAK,MACtC,KAAK,WAAW,KAAK,KAAK,EAC1B,KAAK,WAAW,CAAC,CAAC,KAAK,OAAO,QAAQ,EACxC,CACF,EACAC,EAAS,aAAcZ,CAAU",
6
+ "names": ["RadioGroup", "Field", "h", "e", "o", "input", "v", "opts", "i", "disabled", "n", "options", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{d as l}from"./chunk-MA5BJL3S.js";import{a as m}from"./chunk-4C666HHU.js";var w={};m(w,{addDays:()=>D,addMonths:()=>y,firstDay:()=>h,formatDate:()=>d,fromISO:()=>s,parseDate:()=>p,toISO:()=>o,today:()=>f});var u=(t,n=2)=>String(t).padStart(n,"0"),o=t=>`${u(t.getFullYear(),4)}-${u(t.getMonth()+1)}-${u(t.getDate())}`;function s(t){let n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)return null;let e=new Date(+n[1],+n[2]-1,+n[3]);return e.getMonth()===+n[2]-1&&e.getDate()===+n[3]?e:null}var f=()=>o(new Date);function D(t,n){let e=s(t);return e.setDate(e.getDate()+n),o(e)}function y(t,n){let e=s(t),g=e.getDate();return e.setDate(1),e.setMonth(e.getMonth()+n),e.setDate(Math.min(g,new Date(e.getFullYear(),e.getMonth()+1,0).getDate())),o(e)}var d=(t,n={dateStyle:"short"})=>{let e=s(t);return e?new Intl.DateTimeFormat(l()._lang,n).format(e):""};function p(t){if(t=t.trim(),!t)return null;let n=s(t);if(n)return o(n);let e=t.split(/[/.\-\s]+/).map(Number);if(e.length!==3||e.some(a=>!Number.isInteger(a)))return null;let g=new Intl.DateTimeFormat(l()._lang).formatToParts(new Date(2e3,10,25)).filter(a=>a.type==="day"||a.type==="month"||a.type==="year").map(a=>a.type),r={};g.forEach((a,c)=>r[a]=e[c]),r.year<100&&(r.year+=2e3);let i=new Date(r.year,r.month-1,r.day);return i.getFullYear()===r.year&&i.getMonth()===r.month-1&&i.getDate()===r.day?o(i):null}function h(){let t=l();if(t._firstDay&&t._firstDay!=="0")return Number(t._firstDay);try{let n=new Intl.Locale(t._lang).getWeekInfo?.()??new Intl.Locale(t._lang).weekInfo;if(n?.firstDay)return n.firstDay%7}catch{}return 0}export{o as a,s as b,f as c,D as d,y as e,d as f,p as g,h,w as i};
2
+ //# sourceMappingURL=chunk-NWTTHDIM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/date.ts"],
4
+ "sourcesContent": ["import { getLocale } from './i18n';\n\n/** Dates are handled as ISO strings (`YYYY-MM-DD`) and as local-midnight `Date`s; never UTC, so there is no time zone drift. */\nconst pad = (n: number, w = 2) => String(n).padStart(w, '0');\nexport const toISO = (d: Date): string => `${pad(d.getFullYear(), 4)}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n\nexport function fromISO(iso: string): Date | null {\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(iso);\n if (!m) return null;\n const d = new Date(+m[1], +m[2] - 1, +m[3]);\n return d.getMonth() === +m[2] - 1 && d.getDate() === +m[3] ? d : null;\n}\n\nexport const today = (): string => toISO(new Date());\n\nexport function addDays(iso: string, n: number): string {\n const d = fromISO(iso)!;\n d.setDate(d.getDate() + n);\n return toISO(d);\n}\n\n/** Moves by whole months, clamping the day (Jan 31 + 1 month \u2192 Feb 28). */\nexport function addMonths(iso: string, n: number): string {\n const d = fromISO(iso)!;\n const day = d.getDate();\n d.setDate(1);\n d.setMonth(d.getMonth() + n);\n d.setDate(Math.min(day, new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate()));\n return toISO(d);\n}\n\nexport const formatDate = (iso: string, opts: Intl.DateTimeFormatOptions = { dateStyle: 'short' }): string => {\n const d = fromISO(iso);\n return d ? new Intl.DateTimeFormat(getLocale()._lang, opts).format(d) : '';\n};\n\n/**\n * Parses what a user types: ISO, or day/month/year in the order the current locale uses (derived from `Intl`),\n * with `/`, `-` or `.` as separators and 2- or 4-digit years.\n */\nexport function parseDate(text: string): string | null {\n text = text.trim();\n if (!text) return null;\n const iso = fromISO(text);\n if (iso) return toISO(iso);\n const parts = text.split(/[/.\\-\\s]+/).map(Number);\n if (parts.length !== 3 || parts.some((n) => !Number.isInteger(n))) return null;\n const order = new Intl.DateTimeFormat(getLocale()._lang).formatToParts(new Date(2000, 10, 25)).filter((p) => p.type === 'day' || p.type === 'month' || p.type === 'year').map((p) => p.type);\n const v: Record<string, number> = {};\n order.forEach((k, i) => (v[k] = parts[i]));\n if (v.year < 100) v.year += 2000;\n const d = new Date(v.year, v.month - 1, v.day);\n return d.getFullYear() === v.year && d.getMonth() === v.month - 1 && d.getDate() === v.day ? toISO(d) : null;\n}\n\n/** 0 = Sunday. Reads the locale's week start when the engine knows it. */\nexport function firstDay(): number {\n const l = getLocale();\n if (l._firstDay && l._firstDay !== '0') return Number(l._firstDay);\n try {\n const info = (new Intl.Locale(l._lang) as any).getWeekInfo?.() ?? (new Intl.Locale(l._lang) as any).weekInfo;\n if (info?.firstDay) return info.firstDay % 7;\n } catch { /* fall through */ }\n return 0;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["date_exports", "__export", "addDays", "addMonths", "firstDay", "formatDate", "fromISO", "parseDate", "toISO", "today", "pad", "n", "w", "toISO", "d", "fromISO", "iso", "m", "today", "addDays", "addMonths", "day", "formatDate", "opts", "getLocale", "parseDate", "text", "parts", "order", "p", "v", "k", "i", "firstDay", "l", "info"]
7
+ }
@@ -0,0 +1,2 @@
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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/listbox/listbox.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';\n\nexport interface ListItem {\n value: unknown;\n label: string;\n disabled?: boolean;\n /** Secondary text at the end of the row (e.g. the record id). */\n hint?: string;\n /** The original option/record this item was built from. */\n raw?: unknown;\n}\n\nexport interface ListBoxConfig extends ComponentConfig {\n items?: ListItem[];\n selected?: unknown;\n emptyText?: string;\n maxHeight?: number | string;\n /** Custom cell content; default is the label (with `highlight` applied). */\n renderer?: (item: ListItem) => string | Node;\n /** Text to mark inside labels (the search term). */\n highlight?: string;\n}\n\nconst ROW = 'var(--op-listbox-row-height, var(--op-row-height))';\n\n/**\n * Virtualized list of options. It never takes focus: the owner keeps it (a combobox input) and points\n * `aria-activedescendant` at `getActiveId()`.\n */\nexport class ListBox extends Component<ListBoxConfig> {\n protected override baseCls = 'op-listbox';\n private items: ListItem[];\n private active = -1;\n private v?: ReturnType<typeof virtualize>;\n private emptyEl!: HTMLElement;\n\n constructor(config: ListBoxConfig = {}) {\n super(config);\n this.items = config.items ?? [];\n }\n\n protected override build() {\n const el = h('div', 'op-listbox', { role: 'listbox', tabindex: -1 });\n if (this.config.maxHeight != null) el.style.maxHeight = typeof this.config.maxHeight === 'number' ? `${this.config.maxHeight}px` : this.config.maxHeight;\n this.emptyEl = h('div', 'op-listbox__empty');\n el.append(this.emptyEl);\n return el;\n }\n\n protected override onRender() {\n this.v = virtualize({\n scroller: this.el,\n count: this.items.length,\n rowHeight: measure(this.el, ROW) || 32,\n render: (row, i) => this.renderRow(row, i),\n rowCls: 'op-listbox__item',\n });\n this.own(() => this.v?.destroy());\n this.setEmptyText(this.config.emptyText ?? t('noResults'));\n // keep focus in the owner field\n this.listen(this.el, 'mousedown', (e: Event) => e.preventDefault());\n this.listen(this.el, 'click', (e: Event) => {\n const i = this.indexOf(e.target as HTMLElement);\n if (i >= 0) this.activate(i);\n });\n this.listen(this.el, 'mousemove', (e: Event) => {\n const i = this.indexOf(e.target as HTMLElement);\n if (i >= 0 && i !== this.active && !this.items[i].disabled) this.setActive(i, false);\n });\n this.updateEmpty();\n }\n\n private indexOf(target: HTMLElement): number {\n const row = target.closest<HTMLElement>('.op-listbox__item');\n return row ? Number(row.dataset.i) : -1;\n }\n\n private renderRow(row: HTMLElement, i: number) {\n const item = this.items[i];\n const c = this.config;\n row.id = `${this.id}-opt-${i}`;\n row.dataset.i = String(i);\n row.setAttribute('role', 'option');\n row.setAttribute('aria-selected', String(this.isSelected(item)));\n if (item.disabled) row.setAttribute('aria-disabled', 'true');\n else row.removeAttribute('aria-disabled');\n row.classList.toggle('is-active', i === this.active);\n row.classList.toggle('is-selected', this.isSelected(item));\n row.classList.toggle('is-disabled', !!item.disabled);\n const hint = item.hint ? [h('span', 'op-listbox__hint', {}, item.hint)] : [];\n if (c.renderer) return row.replaceChildren(c.renderer(item) as Node, ...hint);\n const hl = c.highlight?.trim();\n const at = hl ? item.label.toLowerCase().indexOf(hl.toLowerCase()) : -1;\n if (at < 0) return row.replaceChildren(item.label, ...hint);\n row.replaceChildren(item.label.slice(0, at), h('mark', 'op-listbox__mark', {}, item.label.slice(at, at + hl!.length)), item.label.slice(at + hl!.length), ...hint);\n }\n\n private isSelected(item: ListItem) {\n return this.config.selected !== undefined && item.value === this.config.selected;\n }\n\n private updateEmpty() {\n this.emptyEl.hidden = this.items.length > 0;\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n getItems(): ListItem[] {\n return this.items;\n }\n\n setItems(items: ListItem[]) {\n this.items = items;\n this.config.items = items;\n this.active = -1;\n if (!this.rendered) return;\n this.v!.setCount(items.length);\n this.updateEmpty();\n }\n\n setSelected(value: unknown) {\n this.config.selected = value;\n this.v?.refresh();\n }\n\n setHighlight(text: string) {\n this.config.highlight = text;\n this.v?.refresh();\n }\n\n setEmptyText(text: string) {\n this.config.emptyText = text;\n if (this.rendered) this.emptyEl.textContent = text;\n }\n\n /** Re-measures the row height and redraws (call after the list becomes visible). */\n refresh() {\n if (!this.rendered) return;\n const h = measure(this.el, ROW);\n if (h) this.v!.setRowHeight(h);\n else this.v!.refresh();\n }\n\n setActive(index: number, scroll = true) {\n const item = this.items[index];\n if (index < -1 || index >= this.items.length || (item && item.disabled)) return;\n this.active = index;\n if (scroll && index >= 0) this.v?.scrollTo(index);\n this.v?.refresh();\n this.emit('active-change', item, index);\n }\n\n /** Moves the active item by `delta`, skipping disabled ones and wrapping around. */\n moveActive(delta: number) {\n const n = this.items.length;\n if (!n) return;\n let i = this.active;\n for (let step = 0; step < n; step++) {\n i = (i + delta + n) % n;\n if (i < 0) i += n;\n if (!this.items[i].disabled) return this.setActive(i);\n }\n }\n\n getActive(): ListItem | undefined {\n return this.items[this.active];\n }\n getActiveIndex(): number {\n return this.active;\n }\n getActiveId(): string {\n return this.active >= 0 ? `${this.id}-opt-${this.active}` : '';\n }\n\n /** Picks the item at `index` (default: the active one) and emits `select`. */\n activate(index = this.active) {\n const item = this.items[index];\n if (item && !item.disabled) this.emit('select', item, index);\n }\n\n scrollTo(index: number) {\n this.v?.scrollTo(index);\n }\n}\nregister('listbox', ListBox);\n"],
5
+ "mappings": "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",
6
+ "names": ["ROW", "ListBox", "Component", "config", "el", "h", "virtualize", "measure", "row", "i", "t", "e", "target", "item", "c", "hint", "hl", "at", "items", "value", "text", "index", "scroll", "delta", "n", "step", "register"]
7
+ }
@@ -0,0 +1,2 @@
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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/feedback/spinner/spinner.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { t } from '../../../core/i18n';\n\nexport interface SpinnerConfig extends ComponentConfig {\n label?: string;\n}\n\n/** Indeterminate progress indicator. The loading mask (`loading` config on any component) uses the same element. */\nexport class Spinner extends Component<SpinnerConfig> {\n protected override baseCls = 'op-spinner';\n protected override tag = 'span' as const;\n protected override onRender() {\n this.el.setAttribute('role', 'progressbar');\n this.setLabel(this.config.label ?? t('loading'));\n }\n setLabel(label: string) {\n this.config.label = label;\n if (this.rendered) this.el.setAttribute('aria-label', label);\n }\n}\nregister('spinner', Spinner);\n"],
5
+ "mappings": "uFASO,IAAMA,EAAN,cAAsBC,CAAyB,CACjC,QAAU,aACV,IAAM,OACN,UAAW,CAC5B,KAAK,GAAG,aAAa,OAAQ,aAAa,EAC1C,KAAK,SAAS,KAAK,OAAO,OAASC,EAAE,SAAS,CAAC,CACjD,CACA,SAASC,EAAe,CACtB,KAAK,OAAO,MAAQA,EAChB,KAAK,UAAU,KAAK,GAAG,aAAa,aAAcA,CAAK,CAC7D,CACF,EACAC,EAAS,UAAWJ,CAAO",
6
+ "names": ["Spinner", "Component", "t", "label", "register"]
7
+ }
@@ -0,0 +1,2 @@
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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/toast/toast.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 { layer } from '../../../core/layer';\nimport { iconEl } from '../../base/icon/icon';\nimport { pulse, enter } from '../../../motion/core';\n\nexport type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top' | 'bottom';\n\nexport interface ToastConfig extends ComponentConfig {\n text?: string;\n title?: string;\n type?: 'info' | 'success' | 'warning' | 'error';\n /** ms before it closes by itself; 0 keeps it until closed. Default 4000. */\n duration?: number;\n closable?: boolean;\n position?: ToastPosition;\n}\n\nconst defaults: { duration: number; position: ToastPosition; max: number } = { duration: 4000, position: 'top-right', max: 5 };\nconst icons = { info: 'info', success: 'success', warning: 'alert', error: 'error' };\n\nfunction region(pos: ToastPosition): HTMLElement {\n let r = layer().querySelector<HTMLElement>(`.op-toast-region[data-pos=\"${pos}\"]`);\n if (!r) {\n r = h('div', 'op-toast-region', { 'data-pos': pos });\n layer().appendChild(r);\n }\n return r;\n}\n\nexport class Toast extends Component<ToastConfig> {\n protected override baseCls = 'op-toast';\n private cancelTimer?: () => void;\n private remaining = 0;\n private started = 0;\n\n protected override build() {\n const c = this.config;\n const type = c.type ?? 'info';\n const el = h('div', `op-toast op-toast--${type}`, { role: type === 'error' ? 'alert' : 'status' });\n const body = h('div', 'op-toast__body', {}, c.title ? h('div', 'op-toast__title', {}, c.title) : null, h('div', 'op-toast__text', {}, c.text ?? ''));\n el.append(h('span', 'op-toast__icon', {}, iconEl(icons[type])), body);\n if (c.closable !== false) {\n const x = h('button', 'op-toast__close', { type: 'button', 'aria-label': t('close') }, iconEl('x'));\n this.listen(x, 'click', () => this.close());\n el.append(x);\n }\n this.listen(el, 'pointerenter', () => this.pause());\n this.listen(el, 'pointerleave', () => this.resume());\n this.listen(el, 'focusin', () => this.pause());\n this.listen(el, 'focusout', () => this.resume());\n return el;\n }\n\n /** Puts the toast on screen and starts the timer. */\n override show() {\n const pos = this.config.position ?? defaults.position;\n const r = region(pos);\n if (pos.startsWith('bottom')) r.append(this.el);\n else r.prepend(this.el);\n for (const old of Array.from(r.children).filter((e) => e !== this.el).slice(defaults.max - 1)) (old as HTMLElement).dispatchEvent(new Event('op-dismiss'));\n this.listen(this.el, 'op-dismiss', () => this.close());\n this.remaining = this.config.duration ?? defaults.duration;\n this.resume();\n void enter(this.el, { dy: 10 });\n if (this.config.type === 'success') void pulse(this.el.querySelector<HTMLElement>('.op-toast__icon') ?? this.el); // a small ring confirms it worked\n this.emit('show');\n }\n\n private pause() {\n if (!this.cancelTimer) return;\n this.cancelTimer();\n this.cancelTimer = undefined;\n this.remaining -= Date.now() - this.started;\n }\n private resume() {\n if (this.cancelTimer || this.remaining <= 0 || this.destroyed) return;\n this.started = Date.now();\n this.cancelTimer = this.later(() => this.close(), this.remaining);\n }\n\n close() {\n if (this.destroyed) return;\n this.emit('close');\n this.destroy();\n }\n}\nregister('toast', Toast);\n\nexport interface ToastHandle {\n close(): void;\n}\n\n/** `toast('Saved')` or `toast({ text, title, type, duration, closable, position })`. */\nexport function toast(opts: string | ToastConfig): ToastHandle {\n const t = new Toast(typeof opts === 'string' ? { text: opts } : opts);\n t.show();\n return { close: () => t.close() };\n}\ntoast.configure = (o: Partial<typeof defaults>) => Object.assign(defaults, o);\n"],
5
+ "mappings": "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",
6
+ "names": ["defaults", "icons", "region", "pos", "r", "layer", "h", "Toast", "Component", "c", "type", "el", "body", "iconEl", "x", "t", "old", "e", "enter", "pulse", "register", "toast", "opts", "o"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{b as a}from"./chunk-PZSHOSOS.js";function b(e){let u=e.overscan??6,{count:o,rowHeight:t}=e,p=a("div","op-virtual");e.scroller.appendChild(p);let s=[],h=[];function i(l=!1){p.style.height=`${o*t}px`;let c=e.scroller.clientHeight||400,n=Math.min(o,Math.ceil(c/t)+u*2+1);if(n!==s.length){for(;s.length>n;)s.pop().remove();for(;s.length<n;){let r=a("div",e.rowCls??"op-virtual__row");r.style.cssText="position:absolute;inset-inline:0;top:0",s.push(r),p.appendChild(r)}h.length=0,l=!0}let f=Math.max(0,Math.min(Math.floor(e.scroller.scrollTop/t)-u,o-n));for(let r=f;r<f+n;r++){let m=r%n;if(!l&&h[m]===r)continue;h[m]=r;let d=s[m];d.style.transform=`translateY(${r*t}px)`,d.style.height=`${t}px`,e.render(d,r)}}let v=()=>i();return e.scroller.addEventListener("scroll",v,{passive:!0}),i(!0),{spacer:p,rows:s,refresh:()=>i(!0),setCount(l){o=l,i(!0)},setRowHeight(l){t=l,i(!0)},scrollTo(l){let c=l*t,n=e.scroller.clientHeight||400;c<e.scroller.scrollTop?e.scroller.scrollTop=c:c+t>e.scroller.scrollTop+n&&(e.scroller.scrollTop=c+t-n),i()},destroy(){e.scroller.removeEventListener("scroll",v),p.remove()}}}function w(e,u){let o=a("div");o.style.cssText=`position:absolute;visibility:hidden;pointer-events:none;block-size:${u}`,e.appendChild(o);let t=o.offsetHeight;return o.remove(),t}export{b as a,w as b};
2
+ //# sourceMappingURL=chunk-OWEQT2HN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/virtual.ts"],
4
+ "sourcesContent": ["import { h } from './dom';\n\nexport interface VirtualOptions {\n /** Scrolling element. */\n scroller: HTMLElement;\n count: number;\n rowHeight: number;\n /** Extra rows rendered above/below the viewport. Default 6. */\n overscan?: number;\n /** Fills a pooled row element with the data of row `index`. */\n render(row: HTMLElement, index: number): void;\n rowCls?: string;\n}\n\n/** Fixed-height virtual list: only the visible rows exist in the DOM, reused as a pool. */\nexport function virtualize(o: VirtualOptions) {\n const overscan = o.overscan ?? 6;\n let { count, rowHeight } = o;\n const spacer = h('div', 'op-virtual');\n o.scroller.appendChild(spacer);\n const pool: HTMLElement[] = [];\n const assigned: number[] = [];\n\n function update(force = false) {\n spacer.style.height = `${count * rowHeight}px`;\n const viewH = o.scroller.clientHeight || 400;\n const need = Math.min(count, Math.ceil(viewH / rowHeight) + overscan * 2 + 1);\n if (need !== pool.length) {\n while (pool.length > need) pool.pop()!.remove();\n while (pool.length < need) {\n const row = h('div', o.rowCls ?? 'op-virtual__row');\n // rows are positioned by transform inside the spacer, whatever class the caller gives them\n row.style.cssText = 'position:absolute;inset-inline:0;top:0';\n pool.push(row);\n spacer.appendChild(row);\n }\n assigned.length = 0;\n force = true;\n }\n const first = Math.max(0, Math.min(Math.floor(o.scroller.scrollTop / rowHeight) - overscan, count - need));\n for (let i = first; i < first + need; i++) {\n const slot = i % need;\n if (!force && assigned[slot] === i) continue;\n assigned[slot] = i;\n const row = pool[slot];\n row.style.transform = `translateY(${i * rowHeight}px)`;\n row.style.height = `${rowHeight}px`;\n o.render(row, i);\n }\n }\n\n const onScroll = () => update();\n o.scroller.addEventListener('scroll', onScroll, { passive: true });\n update(true);\n\n return {\n spacer,\n /** Rows currently in the DOM. */\n rows: pool,\n refresh: () => update(true),\n setCount(n: number) {\n count = n;\n update(true);\n },\n setRowHeight(px: number) {\n rowHeight = px;\n update(true);\n },\n scrollTo(index: number) {\n const top = index * rowHeight;\n const viewH = o.scroller.clientHeight || 400;\n if (top < o.scroller.scrollTop) o.scroller.scrollTop = top;\n else if (top + rowHeight > o.scroller.scrollTop + viewH) o.scroller.scrollTop = top + rowHeight - viewH;\n update();\n },\n destroy() {\n o.scroller.removeEventListener('scroll', onScroll);\n spacer.remove();\n },\n };\n}\n\n/** Resolves a CSS length (usually a token expression like `var(--op-row-height)`) to pixels in the context of `el`. Returns 0 when not laid out. */\nexport function measure(el: HTMLElement, length: string): number {\n const probe = h('div');\n probe.style.cssText = `position:absolute;visibility:hidden;pointer-events:none;block-size:${length}`;\n el.appendChild(probe);\n const n = probe.offsetHeight;\n probe.remove();\n return n;\n}\n"],
5
+ "mappings": "wCAeO,SAASA,EAAWC,EAAmB,CAC5C,IAAMC,EAAWD,EAAE,UAAY,EAC3B,CAAE,MAAAE,EAAO,UAAAC,CAAU,EAAIH,EACrBI,EAASC,EAAE,MAAO,YAAY,EACpCL,EAAE,SAAS,YAAYI,CAAM,EAC7B,IAAME,EAAsB,CAAC,EACvBC,EAAqB,CAAC,EAE5B,SAASC,EAAOC,EAAQ,GAAO,CAC7BL,EAAO,MAAM,OAAS,GAAGF,EAAQC,CAAS,KAC1C,IAAMO,EAAQV,EAAE,SAAS,cAAgB,IACnCW,EAAO,KAAK,IAAIT,EAAO,KAAK,KAAKQ,EAAQP,CAAS,EAAIF,EAAW,EAAI,CAAC,EAC5E,GAAIU,IAASL,EAAK,OAAQ,CACxB,KAAOA,EAAK,OAASK,GAAML,EAAK,IAAI,EAAG,OAAO,EAC9C,KAAOA,EAAK,OAASK,GAAM,CACzB,IAAMC,EAAMP,EAAE,MAAOL,EAAE,QAAU,iBAAiB,EAElDY,EAAI,MAAM,QAAU,yCACpBN,EAAK,KAAKM,CAAG,EACbR,EAAO,YAAYQ,CAAG,CACxB,CACAL,EAAS,OAAS,EAClBE,EAAQ,EACV,CACA,IAAMI,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAMb,EAAE,SAAS,UAAYG,CAAS,EAAIF,EAAUC,EAAQS,CAAI,CAAC,EACzG,QAASG,EAAID,EAAOC,EAAID,EAAQF,EAAMG,IAAK,CACzC,IAAMC,EAAOD,EAAIH,EACjB,GAAI,CAACF,GAASF,EAASQ,CAAI,IAAMD,EAAG,SACpCP,EAASQ,CAAI,EAAID,EACjB,IAAMF,EAAMN,EAAKS,CAAI,EACrBH,EAAI,MAAM,UAAY,cAAcE,EAAIX,CAAS,MACjDS,EAAI,MAAM,OAAS,GAAGT,CAAS,KAC/BH,EAAE,OAAOY,EAAKE,CAAC,CACjB,CACF,CAEA,IAAME,EAAW,IAAMR,EAAO,EAC9B,OAAAR,EAAE,SAAS,iBAAiB,SAAUgB,EAAU,CAAE,QAAS,EAAK,CAAC,EACjER,EAAO,EAAI,EAEJ,CACL,OAAAJ,EAEA,KAAME,EACN,QAAS,IAAME,EAAO,EAAI,EAC1B,SAASS,EAAW,CAClBf,EAAQe,EACRT,EAAO,EAAI,CACb,EACA,aAAaU,EAAY,CACvBf,EAAYe,EACZV,EAAO,EAAI,CACb,EACA,SAASW,EAAe,CACtB,IAAMC,EAAMD,EAAQhB,EACdO,EAAQV,EAAE,SAAS,cAAgB,IACrCoB,EAAMpB,EAAE,SAAS,UAAWA,EAAE,SAAS,UAAYoB,EAC9CA,EAAMjB,EAAYH,EAAE,SAAS,UAAYU,IAAOV,EAAE,SAAS,UAAYoB,EAAMjB,EAAYO,GAClGF,EAAO,CACT,EACA,SAAU,CACRR,EAAE,SAAS,oBAAoB,SAAUgB,CAAQ,EACjDZ,EAAO,OAAO,CAChB,CACF,CACF,CAGO,SAASiB,EAAQC,EAAiBC,EAAwB,CAC/D,IAAMC,EAAQnB,EAAE,KAAK,EACrBmB,EAAM,MAAM,QAAU,sEAAsED,CAAM,GAClGD,EAAG,YAAYE,CAAK,EACpB,IAAMP,EAAIO,EAAM,aAChB,OAAAA,EAAM,OAAO,EACNP,CACT",
6
+ "names": ["virtualize", "o", "overscan", "count", "rowHeight", "spacer", "h", "pool", "assigned", "update", "force", "viewH", "need", "row", "first", "i", "slot", "onScroll", "n", "px", "index", "top", "measure", "el", "length", "probe"]
7
+ }
@@ -0,0 +1,2 @@
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
@@ -0,0 +1,7 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ function s(e,t){for(let n in t){let r=t[n];r==null||r===!1?e.removeAttribute(n):e.setAttribute(n,r===!0?"":String(r))}}function u(e,t="",n,...r){let i=document.createElement(e);t&&(i.className=t),n&&s(i,n);for(let o of r)o!=null&&o!==!1&&i.append(typeof o=="number"?String(o):o);return i}var l=0,m=(e="op")=>`${e}-${++l}`,p=e=>e.replace(/[A-Z]/g,t=>"-"+t.toLowerCase()),a=e=>typeof e=="number"?`${e}px`:e,f=(e,t,n)=>Math.min(Math.max(e,t),n);export{s as a,u as b,m as c,p as d,a as e,f};
2
+ //# sourceMappingURL=chunk-PZSHOSOS.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/dom.ts"],
4
+ "sourcesContent": ["export type Child = Node | string | number | null | undefined | false;\nexport type Attrs = Record<string, string | number | boolean | null | undefined>;\n\n/** Sets attributes; `null`, `undefined` and `false` remove, `true` sets an empty attribute. */\nexport function attr(el: Element, attrs: Attrs): void {\n for (const k in attrs) {\n const v = attrs[k];\n if (v == null || v === false) el.removeAttribute(k);\n else el.setAttribute(k, v === true ? '' : String(v));\n }\n}\n\n/** Tiny element factory: `h('button', 'op-button', { type: 'button' }, 'Save')`. */\nexport function h<K extends keyof HTMLElementTagNameMap>(tag: K, cls = '', attrs?: Attrs, ...kids: Child[]): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (cls) el.className = cls;\n if (attrs) attr(el, attrs);\n for (const k of kids) if (k != null && k !== false) el.append(typeof k === 'number' ? String(k) : k);\n return el;\n}\n\nlet seq = 0;\nexport const uid = (prefix = 'op'): string => `${prefix}-${++seq}`;\nexport const kebab = (s: string): string => s.replace(/[A-Z]/g, (m) => '-' + m.toLowerCase());\nexport const px = (v: number | string): string => (typeof v === 'number' ? `${v}px` : v);\nexport const clamp = (n: number, min: number, max: number): number => Math.min(Math.max(n, min), max);\nexport const isEl = (v: unknown): v is HTMLElement => typeof HTMLElement !== 'undefined' && v instanceof HTMLElement;\n"],
5
+ "mappings": "AAIO,SAASA,EAAKC,EAAaC,EAAoB,CACpD,QAAWC,KAAKD,EAAO,CACrB,IAAME,EAAIF,EAAMC,CAAC,EACbC,GAAK,MAAQA,IAAM,GAAOH,EAAG,gBAAgBE,CAAC,EAC7CF,EAAG,aAAaE,EAAGC,IAAM,GAAO,GAAK,OAAOA,CAAC,CAAC,CACrD,CACF,CAGO,SAASC,EAAyCC,EAAQC,EAAM,GAAIL,KAAkBM,EAAyC,CACpI,IAAMP,EAAK,SAAS,cAAcK,CAAG,EACjCC,IAAKN,EAAG,UAAYM,GACpBL,GAAOF,EAAKC,EAAIC,CAAK,EACzB,QAAWC,KAAKK,EAAUL,GAAK,MAAQA,IAAM,IAAOF,EAAG,OAAO,OAAOE,GAAM,SAAW,OAAOA,CAAC,EAAIA,CAAC,EACnG,OAAOF,CACT,CAEA,IAAIQ,EAAM,EACGC,EAAM,CAACC,EAAS,OAAiB,GAAGA,CAAM,IAAI,EAAEF,CAAG,GACnDG,EAASC,GAAsBA,EAAE,QAAQ,SAAWC,GAAM,IAAMA,EAAE,YAAY,CAAC,EAC/EC,EAAMX,GAAgC,OAAOA,GAAM,SAAW,GAAGA,CAAC,KAAOA,EACzEY,EAAQ,CAACC,EAAWC,EAAaC,IAAwB,KAAK,IAAI,KAAK,IAAIF,EAAGC,CAAG,EAAGC,CAAG",
6
+ "names": ["attr", "el", "attrs", "k", "v", "h", "tag", "cls", "kids", "seq", "uid", "prefix", "kebab", "s", "m", "px", "clamp", "n", "min", "max"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as s}from"./chunk-K2DGY6MP.js";import{c as r}from"./chunk-IHAYOSBR.js";import{b as o}from"./chunk-IYPKPLCU.js";import{b as i}from"./chunk-PZSHOSOS.js";var n=class extends s{baseCls="op-field op-checkbox";textEl;emptyValue(){return!1}isEmpty(e){return!e}createControl(){let e=this.inputEl=i("input","op-checkbox__input",{type:"checkbox"});this.textEl=i("span","op-checkbox__text");let t=i("span","op-checkbox__box",{},r("check"),i("span","op-checkbox__dash")),c=i("label","op-checkbox__label",{},e,t,this.textEl);return this.listen(e,"change",()=>{if(this.config.readonly)return void(e.checked=this.value);this.config.indeterminate=!1,this.paint(),this.commit(e.checked)}),c}onRender(){super.onRender(),this.setBoxLabel(this.config.boxLabel??""),this.setIndeterminate(!!this.config.indeterminate)}applyValue(e){this.inputEl.checked=!!e,this.paint()}paint(){let e=this.inputEl,t=!!this.config.indeterminate;e.indeterminate=t,e.setAttribute("aria-checked",t?"mixed":String(e.checked)),this.el.classList.toggle("is-checked",e.checked&&!t),this.el.classList.toggle("is-indeterminate",t)}onDisabled(e){this.inputEl.disabled=e}setBoxLabel(e){this.config.boxLabel=e,this.rendered&&(this.textEl.textContent=e,this.textEl.hidden=!e)}setIndeterminate(e){this.config.indeterminate=e,this.rendered&&this.paint()}toggle(){this.setIndeterminate(!1),this.setValue(!this.value)}};o("checkbox",n);export{n as a};
2
+ //# sourceMappingURL=chunk-QEQIJAAB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/checkbox/checkbox.ts"],
4
+ "sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface CheckboxConfig extends FieldConfig<boolean> {\n boxLabel?: string;\n indeterminate?: boolean;\n}\n\nexport class Checkbox extends Field<boolean, CheckboxConfig> {\n protected override baseCls = 'op-field op-checkbox';\n private textEl!: HTMLElement;\n\n protected override emptyValue() {\n return false;\n }\n /** `required` means \"must be checked\". */\n protected override isEmpty(v: boolean) {\n return !v;\n }\n\n protected createControl() {\n const input = (this.inputEl = h('input', 'op-checkbox__input', { type: 'checkbox' }));\n this.textEl = h('span', 'op-checkbox__text');\n const box = h('span', 'op-checkbox__box', {}, iconEl('check'), h('span', 'op-checkbox__dash'));\n const label = h('label', 'op-checkbox__label', {}, input, box, this.textEl);\n this.listen(input, 'change', () => {\n if (this.config.readonly) return void (input.checked = this.value);\n this.config.indeterminate = false;\n this.paint();\n this.commit(input.checked);\n });\n return label;\n }\n\n protected override onRender() {\n super.onRender();\n this.setBoxLabel(this.config.boxLabel ?? '');\n this.setIndeterminate(!!this.config.indeterminate);\n }\n\n protected applyValue(v: boolean) {\n (this.inputEl as HTMLInputElement).checked = !!v;\n this.paint();\n }\n\n private paint() {\n const input = this.inputEl as HTMLInputElement;\n const mixed = !!this.config.indeterminate;\n input.indeterminate = mixed;\n input.setAttribute('aria-checked', mixed ? 'mixed' : String(input.checked));\n this.el.classList.toggle('is-checked', input.checked && !mixed);\n this.el.classList.toggle('is-indeterminate', mixed);\n }\n\n protected override onDisabled(disabled: boolean) {\n (this.inputEl as HTMLInputElement).disabled = disabled;\n }\n\n setBoxLabel(text: string) {\n this.config.boxLabel = text;\n if (!this.rendered) return;\n this.textEl.textContent = text;\n this.textEl.hidden = !text;\n }\n setIndeterminate(on: boolean) {\n this.config.indeterminate = on;\n if (this.rendered) this.paint();\n }\n toggle() {\n this.setIndeterminate(false);\n this.setValue(!this.value);\n }\n}\nregister('checkbox', Checkbox);\n"],
5
+ "mappings": "gKAUO,IAAMA,EAAN,cAAuBC,CAA+B,CACxC,QAAU,uBACrB,OAEW,YAAa,CAC9B,MAAO,EACT,CAEmB,QAAQC,EAAY,CACrC,MAAO,CAACA,CACV,CAEU,eAAgB,CACxB,IAAMC,EAAS,KAAK,QAAUC,EAAE,QAAS,qBAAsB,CAAE,KAAM,UAAW,CAAC,EACnF,KAAK,OAASA,EAAE,OAAQ,mBAAmB,EAC3C,IAAMC,EAAMD,EAAE,OAAQ,mBAAoB,CAAC,EAAGE,EAAO,OAAO,EAAGF,EAAE,OAAQ,mBAAmB,CAAC,EACvFG,EAAQH,EAAE,QAAS,qBAAsB,CAAC,EAAGD,EAAOE,EAAK,KAAK,MAAM,EAC1E,YAAK,OAAOF,EAAO,SAAU,IAAM,CACjC,GAAI,KAAK,OAAO,SAAU,OAAO,KAAMA,EAAM,QAAU,KAAK,OAC5D,KAAK,OAAO,cAAgB,GAC5B,KAAK,MAAM,EACX,KAAK,OAAOA,EAAM,OAAO,CAC3B,CAAC,EACMI,CACT,CAEmB,UAAW,CAC5B,MAAM,SAAS,EACf,KAAK,YAAY,KAAK,OAAO,UAAY,EAAE,EAC3C,KAAK,iBAAiB,CAAC,CAAC,KAAK,OAAO,aAAa,CACnD,CAEU,WAAWL,EAAY,CAC9B,KAAK,QAA6B,QAAU,CAAC,CAACA,EAC/C,KAAK,MAAM,CACb,CAEQ,OAAQ,CACd,IAAMC,EAAQ,KAAK,QACbK,EAAQ,CAAC,CAAC,KAAK,OAAO,cAC5BL,EAAM,cAAgBK,EACtBL,EAAM,aAAa,eAAgBK,EAAQ,QAAU,OAAOL,EAAM,OAAO,CAAC,EAC1E,KAAK,GAAG,UAAU,OAAO,aAAcA,EAAM,SAAW,CAACK,CAAK,EAC9D,KAAK,GAAG,UAAU,OAAO,mBAAoBA,CAAK,CACpD,CAEmB,WAAWC,EAAmB,CAC9C,KAAK,QAA6B,SAAWA,CAChD,CAEA,YAAYC,EAAc,CACxB,KAAK,OAAO,SAAWA,EAClB,KAAK,WACV,KAAK,OAAO,YAAcA,EAC1B,KAAK,OAAO,OAAS,CAACA,EACxB,CACA,iBAAiBC,EAAa,CAC5B,KAAK,OAAO,cAAgBA,EACxB,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,QAAS,CACP,KAAK,iBAAiB,EAAK,EAC3B,KAAK,SAAS,CAAC,KAAK,KAAK,CAC3B,CACF,EACAC,EAAS,WAAYZ,CAAQ",
6
+ "names": ["Checkbox", "Field", "v", "input", "h", "box", "iconEl", "label", "mixed", "disabled", "text", "on", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as o}from"./chunk-K2DGY6MP.js";import{c as p}from"./chunk-IHAYOSBR.js";import{b as l}from"./chunk-IYPKPLCU.js";import{b as n}from"./chunk-PZSHOSOS.js";import{e as s}from"./chunk-MA5BJL3S.js";var r=class extends o{baseCls="op-field op-textfield";clearBtn;createInput(){return n("input","op-textfield__input",{type:this.config.inputType??"text"})}get input(){return this.inputEl}createControl(){let t=this.config,e=this.inputEl=this.createInput(),i=n("div","op-textfield__wrap",{},e);return t.placeholder&&(e.placeholder=t.placeholder),t.maxLength!=null&&(e.maxLength=t.maxLength),t.autocomplete&&(e.autocomplete=t.autocomplete),this.listen(e,"input",()=>this.onInput()),this.listen(e,"keydown",a=>this.onKey(a)),t.selectOnFocus&&this.listen(e,"focus",()=>e.select()),t.clearable&&(this.clearBtn=n("button","op-textfield__clear",{type:"button",tabindex:-1,"aria-label":s("clear")},p("x")),this.listen(this.clearBtn,"click",()=>{this.setValue(this.parse("")),e.focus()}),i.append(this.clearBtn)),i}onInput(){this.el.classList.toggle("has-value",!!this.input.value),this.commit(this.parse(this.input.value))}parse(t){return t}display(t){return t==null?"":String(t)}onKey(t){t.key==="Enter"&&!t.defaultPrevented?(this.flushSettled(),this.emit("enter",this.getValue())):t.key==="Escape"&&this.config.clearable&&this.input.value&&(t.stopPropagation(),this.setValue(this.parse("")))}getDisplayText(){return this.rendered?this.input.value:this.display(this.value)}applyValue(t){this.input.value=this.display(t),this.el.classList.toggle("has-value",!!this.input.value)}onReadonly(t){this.input.readOnly=t}onDisabled(t){this.input.disabled=t,this.clearBtn&&(this.clearBtn.disabled=t)}check(){let t=super.check(),e=this.display(this.value),i=this.config;return t||!e?t:i.minLength!=null&&e.length<i.minLength?s("minLength",{n:i.minLength}):i.pattern&&!new RegExp(i.pattern).test(e)?s("pattern"):""}setPlaceholder(t){this.config.placeholder=t,this.rendered&&(this.input.placeholder=t)}setMaxLength(t){this.config.maxLength=t,this.rendered&&(this.input.maxLength=t)}setInputType(t){this.config.inputType=t,this.rendered&&this.input instanceof HTMLInputElement&&(this.input.type=t)}select(){this.input.select()}getInput(){return this.render(),this.input}};l("textfield",r);export{r as a};
2
+ //# sourceMappingURL=chunk-SNTHW4K2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/textfield/textfield.ts"],
4
+ "sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface TextFieldConfig<V = string> extends FieldConfig<V> {\n inputType?: 'text' | 'email' | 'tel' | 'url' | 'search' | 'password';\n placeholder?: string;\n maxLength?: number;\n minLength?: number;\n pattern?: string;\n autocomplete?: string;\n selectOnFocus?: boolean;\n clearable?: boolean;\n}\n\ntype Input = HTMLInputElement | HTMLTextAreaElement;\n\nexport class TextField<V = string, C extends TextFieldConfig<V> = TextFieldConfig<V>> extends Field<V, C> {\n protected override baseCls = 'op-field op-textfield';\n protected clearBtn?: HTMLButtonElement;\n\n /** Subclasses (TextArea, ...) replace the native control. */\n protected createInput(): Input {\n return h('input', 'op-textfield__input', { type: this.config.inputType ?? 'text' });\n }\n\n protected get input(): Input {\n return this.inputEl as Input;\n }\n\n protected createControl() {\n const c = this.config;\n const input = (this.inputEl = this.createInput());\n const wrap = h('div', 'op-textfield__wrap', {}, input);\n if (c.placeholder) input.placeholder = c.placeholder;\n if (c.maxLength != null) input.maxLength = c.maxLength;\n if (c.autocomplete) input.autocomplete = c.autocomplete as AutoFill;\n this.listen(input, 'input', () => this.onInput());\n this.listen(input, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n if (c.selectOnFocus) this.listen(input, 'focus', () => input.select());\n if (c.clearable) {\n this.clearBtn = h('button', 'op-textfield__clear', { type: 'button', tabindex: -1, 'aria-label': t('clear') }, iconEl('x'));\n this.listen(this.clearBtn, 'click', () => {\n this.setValue(this.parse(''));\n input.focus();\n });\n wrap.append(this.clearBtn);\n }\n return wrap;\n }\n\n /** The text the user typed becomes the value on every edit. */\n protected onInput(): void {\n this.el.classList.toggle('has-value', !!this.input.value);\n this.commit(this.parse(this.input.value));\n }\n\n /** Text \u2192 value. Subclasses with non-string values (NumberField) override. */\n protected parse(text: string): V {\n return text as V;\n }\n /** Value \u2192 text shown in the input. */\n protected display(v: V): string {\n return v == null ? '' : String(v);\n }\n\n protected onKey(e: KeyboardEvent): void {\n if (e.key === 'Enter' && !e.defaultPrevented) (this.flushSettled(), this.emit('enter', this.getValue()));\n else if (e.key === 'Escape' && this.config.clearable && this.input.value) {\n e.stopPropagation();\n this.setValue(this.parse(''));\n }\n }\n\n override getDisplayText(): string {\n return this.rendered ? this.input.value : this.display(this.value);\n }\n\n protected applyValue(v: V): void {\n this.input.value = this.display(v);\n this.el.classList.toggle('has-value', !!this.input.value);\n }\n\n protected override onReadonly(readonly: boolean) {\n this.input.readOnly = readonly;\n }\n protected override onDisabled(disabled: boolean) {\n this.input.disabled = disabled;\n if (this.clearBtn) this.clearBtn.disabled = disabled;\n }\n\n protected override check(): string {\n const base = super.check();\n const v = this.display(this.value);\n const c = this.config;\n if (base || !v) return base;\n if (c.minLength != null && v.length < c.minLength) return t('minLength', { n: c.minLength });\n if (c.pattern && !new RegExp(c.pattern).test(v)) return t('pattern');\n return '';\n }\n\n setPlaceholder(text: string) {\n this.config.placeholder = text;\n if (this.rendered) this.input.placeholder = text;\n }\n setMaxLength(n: number) {\n this.config.maxLength = n;\n if (this.rendered) this.input.maxLength = n;\n }\n setInputType(type: NonNullable<TextFieldConfig['inputType']>) {\n this.config.inputType = type;\n if (this.rendered && this.input instanceof HTMLInputElement) this.input.type = type;\n }\n select() {\n this.input.select();\n }\n getInput(): Input {\n this.render();\n return this.input;\n }\n}\nregister('textfield', TextField);\n"],
5
+ "mappings": "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",
6
+ "names": ["TextField", "Field", "h", "c", "input", "wrap", "e", "t", "iconEl", "text", "v", "readonly", "disabled", "base", "n", "type", "register"]
7
+ }
@@ -0,0 +1,2 @@
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