optikos 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (527) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/LICENSE +21 -0
  3. package/README.md +213 -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-23XLG2EM.js +2 -0
  8. package/dist/chunk-23XLG2EM.js.map +7 -0
  9. package/dist/chunk-27UZFEXD.js +2 -0
  10. package/dist/chunk-27UZFEXD.js.map +7 -0
  11. package/dist/chunk-2UPUC4RK.js +2 -0
  12. package/dist/chunk-2UPUC4RK.js.map +7 -0
  13. package/dist/chunk-2ZRNGG2N.js +2 -0
  14. package/dist/chunk-2ZRNGG2N.js.map +7 -0
  15. package/dist/chunk-2ZUZ5HDL.js +2 -0
  16. package/dist/chunk-2ZUZ5HDL.js.map +7 -0
  17. package/dist/chunk-3DBEZGOY.js +2 -0
  18. package/dist/chunk-3DBEZGOY.js.map +7 -0
  19. package/dist/chunk-3S24ZRPK.js +2 -0
  20. package/dist/chunk-3S24ZRPK.js.map +7 -0
  21. package/dist/chunk-3TAW4AKH.js +2 -0
  22. package/dist/chunk-3TAW4AKH.js.map +7 -0
  23. package/dist/chunk-4AA4FQEM.js +2 -0
  24. package/dist/chunk-4AA4FQEM.js.map +7 -0
  25. package/dist/chunk-4C666HHU.js +2 -0
  26. package/dist/chunk-4C666HHU.js.map +7 -0
  27. package/dist/chunk-4EZJ5FKJ.js +2 -0
  28. package/dist/chunk-4EZJ5FKJ.js.map +7 -0
  29. package/dist/chunk-4LZZ244E.js +2 -0
  30. package/dist/chunk-4LZZ244E.js.map +7 -0
  31. package/dist/chunk-4SYIIX5A.js +2 -0
  32. package/dist/chunk-4SYIIX5A.js.map +7 -0
  33. package/dist/chunk-5BC72727.js +2 -0
  34. package/dist/chunk-5BC72727.js.map +7 -0
  35. package/dist/chunk-5DJTP53N.js +2 -0
  36. package/dist/chunk-5DJTP53N.js.map +7 -0
  37. package/dist/chunk-5JEXM5S7.js +2 -0
  38. package/dist/chunk-5JEXM5S7.js.map +7 -0
  39. package/dist/chunk-5Q76ACVI.js +2 -0
  40. package/dist/chunk-5Q76ACVI.js.map +7 -0
  41. package/dist/chunk-5QUY72FX.js +2 -0
  42. package/dist/chunk-5QUY72FX.js.map +7 -0
  43. package/dist/chunk-5YS7OD5E.js +2 -0
  44. package/dist/chunk-5YS7OD5E.js.map +7 -0
  45. package/dist/chunk-676AKAGF.js +2 -0
  46. package/dist/chunk-676AKAGF.js.map +7 -0
  47. package/dist/chunk-6NCXO5ZP.js +2 -0
  48. package/dist/chunk-6NCXO5ZP.js.map +7 -0
  49. package/dist/chunk-6VBK2I5B.js +2 -0
  50. package/dist/chunk-6VBK2I5B.js.map +7 -0
  51. package/dist/chunk-7KMIFXHZ.js +2 -0
  52. package/dist/chunk-7KMIFXHZ.js.map +7 -0
  53. package/dist/chunk-A2NKDOYN.js +2 -0
  54. package/dist/chunk-A2NKDOYN.js.map +7 -0
  55. package/dist/chunk-ATFJ7PNA.js +2 -0
  56. package/dist/chunk-ATFJ7PNA.js.map +7 -0
  57. package/dist/chunk-BXYWVRKJ.js +2 -0
  58. package/dist/chunk-BXYWVRKJ.js.map +7 -0
  59. package/dist/chunk-CKXS375P.js +2 -0
  60. package/dist/chunk-CKXS375P.js.map +7 -0
  61. package/dist/chunk-CUN5QO4T.js +2 -0
  62. package/dist/chunk-CUN5QO4T.js.map +7 -0
  63. package/dist/chunk-DBMWS3O5.js +2 -0
  64. package/dist/chunk-DBMWS3O5.js.map +7 -0
  65. package/dist/chunk-E4VNLYO2.js +2 -0
  66. package/dist/chunk-E4VNLYO2.js.map +7 -0
  67. package/dist/chunk-EDUMAMK4.js +2 -0
  68. package/dist/chunk-EDUMAMK4.js.map +7 -0
  69. package/dist/chunk-ELYARUCN.js +2 -0
  70. package/dist/chunk-ELYARUCN.js.map +7 -0
  71. package/dist/chunk-EV73ADN2.js +2 -0
  72. package/dist/chunk-EV73ADN2.js.map +7 -0
  73. package/dist/chunk-FEHGU6EP.js +3 -0
  74. package/dist/chunk-FEHGU6EP.js.map +7 -0
  75. package/dist/chunk-FHM5NUS4.js +3 -0
  76. package/dist/chunk-FHM5NUS4.js.map +7 -0
  77. package/dist/chunk-G2DAD3MQ.js +2 -0
  78. package/dist/chunk-G2DAD3MQ.js.map +7 -0
  79. package/dist/chunk-G2KUK6AT.js +2 -0
  80. package/dist/chunk-G2KUK6AT.js.map +7 -0
  81. package/dist/chunk-GBPLNXMP.js +2 -0
  82. package/dist/chunk-GBPLNXMP.js.map +7 -0
  83. package/dist/chunk-GNU4VOOE.js +2 -0
  84. package/dist/chunk-GNU4VOOE.js.map +7 -0
  85. package/dist/chunk-GZ7X34QP.js +2 -0
  86. package/dist/chunk-GZ7X34QP.js.map +7 -0
  87. package/dist/chunk-HOF4JGMQ.js +2 -0
  88. package/dist/chunk-HOF4JGMQ.js.map +7 -0
  89. package/dist/chunk-HXDTGP2K.js +2 -0
  90. package/dist/chunk-HXDTGP2K.js.map +7 -0
  91. package/dist/chunk-I4SP6JTU.js +2 -0
  92. package/dist/chunk-I4SP6JTU.js.map +7 -0
  93. package/dist/chunk-IHE2MQ3W.js +2 -0
  94. package/dist/chunk-IHE2MQ3W.js.map +7 -0
  95. package/dist/chunk-II6ITOA6.js +2 -0
  96. package/dist/chunk-II6ITOA6.js.map +7 -0
  97. package/dist/chunk-JBLRAM7Z.js +2 -0
  98. package/dist/chunk-JBLRAM7Z.js.map +7 -0
  99. package/dist/chunk-JI265XFO.js +2 -0
  100. package/dist/chunk-JI265XFO.js.map +7 -0
  101. package/dist/chunk-JK74QK3M.js +2 -0
  102. package/dist/chunk-JK74QK3M.js.map +7 -0
  103. package/dist/chunk-JOFQJGZK.js +2 -0
  104. package/dist/chunk-JOFQJGZK.js.map +7 -0
  105. package/dist/chunk-KCEUD232.js +2 -0
  106. package/dist/chunk-KCEUD232.js.map +7 -0
  107. package/dist/chunk-KLLAY2IM.js +2 -0
  108. package/dist/chunk-KLLAY2IM.js.map +7 -0
  109. package/dist/chunk-LBJSMXLV.js +2 -0
  110. package/dist/chunk-LBJSMXLV.js.map +7 -0
  111. package/dist/chunk-LQRFNQ2N.js +2 -0
  112. package/dist/chunk-LQRFNQ2N.js.map +7 -0
  113. package/dist/chunk-LW2WRUVL.js +2 -0
  114. package/dist/chunk-LW2WRUVL.js.map +7 -0
  115. package/dist/chunk-M242VYZA.js +2 -0
  116. package/dist/chunk-M242VYZA.js.map +7 -0
  117. package/dist/chunk-MB3MU6HR.js +2 -0
  118. package/dist/chunk-MB3MU6HR.js.map +7 -0
  119. package/dist/chunk-MW3RWBZ7.js +2 -0
  120. package/dist/chunk-MW3RWBZ7.js.map +7 -0
  121. package/dist/chunk-NXSTUFS7.js +2 -0
  122. package/dist/chunk-NXSTUFS7.js.map +7 -0
  123. package/dist/chunk-OEAXCCVM.js +2 -0
  124. package/dist/chunk-OEAXCCVM.js.map +7 -0
  125. package/dist/chunk-OGRFQTXA.js +2 -0
  126. package/dist/chunk-OGRFQTXA.js.map +7 -0
  127. package/dist/chunk-OWEQT2HN.js +2 -0
  128. package/dist/chunk-OWEQT2HN.js.map +7 -0
  129. package/dist/chunk-PZSHOSOS.js +2 -0
  130. package/dist/chunk-PZSHOSOS.js.map +7 -0
  131. package/dist/chunk-REW4LR46.js +2 -0
  132. package/dist/chunk-REW4LR46.js.map +7 -0
  133. package/dist/chunk-RNN55473.js +2 -0
  134. package/dist/chunk-RNN55473.js.map +7 -0
  135. package/dist/chunk-SA53QUBF.js +2 -0
  136. package/dist/chunk-SA53QUBF.js.map +7 -0
  137. package/dist/chunk-TIPK3SCJ.js +2 -0
  138. package/dist/chunk-TIPK3SCJ.js.map +7 -0
  139. package/dist/chunk-TOLTUOZS.js +2 -0
  140. package/dist/chunk-TOLTUOZS.js.map +7 -0
  141. package/dist/chunk-TZOQWCVH.js +2 -0
  142. package/dist/chunk-TZOQWCVH.js.map +7 -0
  143. package/dist/chunk-VF7BGP6L.js +2 -0
  144. package/dist/chunk-VF7BGP6L.js.map +7 -0
  145. package/dist/chunk-VU3GIDZ3.js +2 -0
  146. package/dist/chunk-VU3GIDZ3.js.map +7 -0
  147. package/dist/chunk-VV7CFMPZ.js +2 -0
  148. package/dist/chunk-VV7CFMPZ.js.map +7 -0
  149. package/dist/chunk-W3H7GTJY.js +2 -0
  150. package/dist/chunk-W3H7GTJY.js.map +7 -0
  151. package/dist/chunk-X2ASKUFD.js +2 -0
  152. package/dist/chunk-X2ASKUFD.js.map +7 -0
  153. package/dist/chunk-X6AULZI4.js +1 -0
  154. package/dist/chunk-X6AULZI4.js.map +7 -0
  155. package/dist/chunk-XHOBNSBO.js +2 -0
  156. package/dist/chunk-XHOBNSBO.js.map +7 -0
  157. package/dist/chunk-XX2MVWFS.js +4 -0
  158. package/dist/chunk-XX2MVWFS.js.map +7 -0
  159. package/dist/chunk-XYZ6VZ5T.js +2 -0
  160. package/dist/chunk-XYZ6VZ5T.js.map +7 -0
  161. package/dist/chunk-YBAYEU25.js +2 -0
  162. package/dist/chunk-YBAYEU25.js.map +7 -0
  163. package/dist/chunk-YHEMA56R.js +2 -0
  164. package/dist/chunk-YHEMA56R.js.map +7 -0
  165. package/dist/chunk-Z2JBUHKA.js +2 -0
  166. package/dist/chunk-Z2JBUHKA.js.map +7 -0
  167. package/dist/chunk-Z2Z52GFT.js +2 -0
  168. package/dist/chunk-Z2Z52GFT.js.map +7 -0
  169. package/dist/chunk-ZPPELYNJ.js +2 -0
  170. package/dist/chunk-ZPPELYNJ.js.map +7 -0
  171. package/dist/chunk-ZVK4L5GK.js +2 -0
  172. package/dist/chunk-ZVK4L5GK.js.map +7 -0
  173. package/dist/chunk-ZWNQREWS.js +2 -0
  174. package/dist/chunk-ZWNQREWS.js.map +7 -0
  175. package/dist/components/badge.js +2 -0
  176. package/dist/components/badge.js.map +7 -0
  177. package/dist/components/breadcrumb.js +2 -0
  178. package/dist/components/breadcrumb.js.map +7 -0
  179. package/dist/components/button.js +2 -0
  180. package/dist/components/button.js.map +7 -0
  181. package/dist/components/calendar.js +2 -0
  182. package/dist/components/calendar.js.map +7 -0
  183. package/dist/components/cellediting.js +2 -0
  184. package/dist/components/cellediting.js.map +7 -0
  185. package/dist/components/chat.js +2 -0
  186. package/dist/components/chat.js.map +7 -0
  187. package/dist/components/checkbox.js +2 -0
  188. package/dist/components/checkbox.js.map +7 -0
  189. package/dist/components/checkboxgroup.js +2 -0
  190. package/dist/components/checkboxgroup.js.map +7 -0
  191. package/dist/components/chip.js +2 -0
  192. package/dist/components/chip.js.map +7 -0
  193. package/dist/components/codeviewer.js +2 -0
  194. package/dist/components/codeviewer.js.map +7 -0
  195. package/dist/components/combobox.js +2 -0
  196. package/dist/components/combobox.js.map +7 -0
  197. package/dist/components/commandpalette.js +2 -0
  198. package/dist/components/commandpalette.js.map +7 -0
  199. package/dist/components/container.js +2 -0
  200. package/dist/components/container.js.map +7 -0
  201. package/dist/components/dataview.js +2 -0
  202. package/dist/components/dataview.js.map +7 -0
  203. package/dist/components/datefield.js +2 -0
  204. package/dist/components/datefield.js.map +7 -0
  205. package/dist/components/daterangefield.js +2 -0
  206. package/dist/components/daterangefield.js.map +7 -0
  207. package/dist/components/dial.js +2 -0
  208. package/dist/components/dial.js.map +7 -0
  209. package/dist/components/dropdown.js +2 -0
  210. package/dist/components/dropdown.js.map +7 -0
  211. package/dist/components/fieldgroup.js +2 -0
  212. package/dist/components/fieldgroup.js.map +7 -0
  213. package/dist/components/fieldlist.js +2 -0
  214. package/dist/components/fieldlist.js.map +7 -0
  215. package/dist/components/fieldset.js +2 -0
  216. package/dist/components/fieldset.js.map +7 -0
  217. package/dist/components/filterbuilder.js +2 -0
  218. package/dist/components/filterbuilder.js.map +7 -0
  219. package/dist/components/form.js +2 -0
  220. package/dist/components/form.js.map +7 -0
  221. package/dist/components/formactions.js +2 -0
  222. package/dist/components/formactions.js.map +7 -0
  223. package/dist/components/formerrors.js +2 -0
  224. package/dist/components/formerrors.js.map +7 -0
  225. package/dist/components/formsection.js +2 -0
  226. package/dist/components/formsection.js.map +7 -0
  227. package/dist/components/grid.js +2 -0
  228. package/dist/components/grid.js.map +7 -0
  229. package/dist/components/icon.js +2 -0
  230. package/dist/components/icon.js.map +7 -0
  231. package/dist/components/inputgroup.js +2 -0
  232. package/dist/components/inputgroup.js.map +7 -0
  233. package/dist/components/label.js +2 -0
  234. package/dist/components/label.js.map +7 -0
  235. package/dist/components/listbox.js +2 -0
  236. package/dist/components/listbox.js.map +7 -0
  237. package/dist/components/lookupfield.js +2 -0
  238. package/dist/components/lookupfield.js.map +7 -0
  239. package/dist/components/menu.js +2 -0
  240. package/dist/components/menu.js.map +7 -0
  241. package/dist/components/messagebox.js +2 -0
  242. package/dist/components/messagebox.js.map +7 -0
  243. package/dist/components/navmenu.js +2 -0
  244. package/dist/components/navmenu.js.map +7 -0
  245. package/dist/components/numberfield.js +2 -0
  246. package/dist/components/numberfield.js.map +7 -0
  247. package/dist/components/pagination.js +2 -0
  248. package/dist/components/pagination.js.map +7 -0
  249. package/dist/components/panel.js +2 -0
  250. package/dist/components/panel.js.map +7 -0
  251. package/dist/components/pickerfield.js +2 -0
  252. package/dist/components/pickerfield.js.map +7 -0
  253. package/dist/components/radiogroup.js +2 -0
  254. package/dist/components/radiogroup.js.map +7 -0
  255. package/dist/components/searchgrid.js +2 -0
  256. package/dist/components/searchgrid.js.map +7 -0
  257. package/dist/components/secretfield.js +2 -0
  258. package/dist/components/secretfield.js.map +7 -0
  259. package/dist/components/select.js +2 -0
  260. package/dist/components/select.js.map +7 -0
  261. package/dist/components/slider.js +2 -0
  262. package/dist/components/slider.js.map +7 -0
  263. package/dist/components/spacer.js +2 -0
  264. package/dist/components/spacer.js.map +7 -0
  265. package/dist/components/spinner.js +2 -0
  266. package/dist/components/spinner.js.map +7 -0
  267. package/dist/components/stepform.js +2 -0
  268. package/dist/components/stepform.js.map +7 -0
  269. package/dist/components/stepper.js +2 -0
  270. package/dist/components/stepper.js.map +7 -0
  271. package/dist/components/suggestfield.js +2 -0
  272. package/dist/components/suggestfield.js.map +7 -0
  273. package/dist/components/table.js +2 -0
  274. package/dist/components/table.js.map +7 -0
  275. package/dist/components/tabs.js +2 -0
  276. package/dist/components/tabs.js.map +7 -0
  277. package/dist/components/textarea.js +2 -0
  278. package/dist/components/textarea.js.map +7 -0
  279. package/dist/components/textfield.js +2 -0
  280. package/dist/components/textfield.js.map +7 -0
  281. package/dist/components/toast.js +2 -0
  282. package/dist/components/toast.js.map +7 -0
  283. package/dist/components/toggle.js +2 -0
  284. package/dist/components/toggle.js.map +7 -0
  285. package/dist/components/toolbar.js +2 -0
  286. package/dist/components/toolbar.js.map +7 -0
  287. package/dist/components/tooltip.js +2 -0
  288. package/dist/components/tooltip.js.map +7 -0
  289. package/dist/components/tree.js +2 -0
  290. package/dist/components/tree.js.map +7 -0
  291. package/dist/components/viewmanager.js +2 -0
  292. package/dist/components/viewmanager.js.map +7 -0
  293. package/dist/components/viewport.js +2 -0
  294. package/dist/components/viewport.js.map +7 -0
  295. package/dist/components/widget.js +2 -0
  296. package/dist/components/widget.js.map +7 -0
  297. package/dist/components/window.js +2 -0
  298. package/dist/components/window.js.map +7 -0
  299. package/dist/core.js +2 -0
  300. package/dist/core.js.map +7 -0
  301. package/dist/css/badge.css +39 -0
  302. package/dist/css/base.css +180 -0
  303. package/dist/css/breadcrumb.css +53 -0
  304. package/dist/css/button.css +103 -0
  305. package/dist/css/calendar.css +108 -0
  306. package/dist/css/cellediting.css +33 -0
  307. package/dist/css/chat.css +232 -0
  308. package/dist/css/checkbox.css +64 -0
  309. package/dist/css/checkboxgroup.css +12 -0
  310. package/dist/css/chip.css +64 -0
  311. package/dist/css/codeviewer.css +109 -0
  312. package/dist/css/commandpalette.css +167 -0
  313. package/dist/css/container.css +5 -0
  314. package/dist/css/core.css +88 -0
  315. package/dist/css/dataview.css +56 -0
  316. package/dist/css/dial.css +203 -0
  317. package/dist/css/dropdown.css +13 -0
  318. package/dist/css/field.css +62 -0
  319. package/dist/css/fieldgroup.css +26 -0
  320. package/dist/css/fieldlist.css +84 -0
  321. package/dist/css/fieldset.css +68 -0
  322. package/dist/css/filterbuilder.css +125 -0
  323. package/dist/css/form.css +8 -0
  324. package/dist/css/formactions.css +40 -0
  325. package/dist/css/formerrors.css +39 -0
  326. package/dist/css/formsection.css +45 -0
  327. package/dist/css/grid.css +378 -0
  328. package/dist/css/icon.css +16 -0
  329. package/dist/css/inputgroup.css +58 -0
  330. package/dist/css/label.css +12 -0
  331. package/dist/css/layout.css +116 -0
  332. package/dist/css/listbox.css +50 -0
  333. package/dist/css/menu.css +92 -0
  334. package/dist/css/messagebox.css +6 -0
  335. package/dist/css/motion.css +29 -0
  336. package/dist/css/navmenu.css +115 -0
  337. package/dist/css/pagination.css +23 -0
  338. package/dist/css/panel.css +84 -0
  339. package/dist/css/pickerfield.css +85 -0
  340. package/dist/css/radiogroup.css +53 -0
  341. package/dist/css/searchgrid.css +37 -0
  342. package/dist/css/secretfield.css +73 -0
  343. package/dist/css/slider.css +107 -0
  344. package/dist/css/spacer.css +7 -0
  345. package/dist/css/stepform.css +46 -0
  346. package/dist/css/stepper.css +122 -0
  347. package/dist/css/table.css +36 -0
  348. package/dist/css/tabs.css +108 -0
  349. package/dist/css/textarea.css +11 -0
  350. package/dist/css/textfield.css +59 -0
  351. package/dist/css/toast.css +91 -0
  352. package/dist/css/toggle.css +39 -0
  353. package/dist/css/toolbar.css +14 -0
  354. package/dist/css/tooltip.css +17 -0
  355. package/dist/css/tree.css +94 -0
  356. package/dist/css/viewport.css +9 -0
  357. package/dist/css/widget.css +135 -0
  358. package/dist/css/window.css +35 -0
  359. package/dist/data.js +2 -0
  360. package/dist/data.js.map +7 -0
  361. package/dist/index.js +8 -0
  362. package/dist/index.js.map +7 -0
  363. package/dist/motion.js +2 -0
  364. package/dist/motion.js.map +7 -0
  365. package/dist/optikos.css +4240 -0
  366. package/dist/themes/compact.css +17 -0
  367. package/dist/themes/dark.css +53 -0
  368. package/dist/types/bind/index.d.ts +23 -0
  369. package/dist/types/components/badge.d.ts +1 -0
  370. package/dist/types/components/base/badge/badge.d.ts +18 -0
  371. package/dist/types/components/base/button/button.d.ts +34 -0
  372. package/dist/types/components/base/chip/chip.d.ts +27 -0
  373. package/dist/types/components/base/codeviewer/codeviewer.d.ts +48 -0
  374. package/dist/types/components/base/icon/icon.d.ts +17 -0
  375. package/dist/types/components/base/label/label.d.ts +14 -0
  376. package/dist/types/components/breadcrumb.d.ts +1 -0
  377. package/dist/types/components/button.d.ts +1 -0
  378. package/dist/types/components/calendar.d.ts +1 -0
  379. package/dist/types/components/cellediting.d.ts +1 -0
  380. package/dist/types/components/chat/chat/chat.d.ts +84 -0
  381. package/dist/types/components/chat.d.ts +1 -0
  382. package/dist/types/components/checkbox.d.ts +1 -0
  383. package/dist/types/components/checkboxgroup.d.ts +1 -0
  384. package/dist/types/components/chip.d.ts +1 -0
  385. package/dist/types/components/codeviewer.d.ts +1 -0
  386. package/dist/types/components/combobox.d.ts +1 -0
  387. package/dist/types/components/commandpalette.d.ts +1 -0
  388. package/dist/types/components/container.d.ts +1 -0
  389. package/dist/types/components/data/cellediting/cellediting.d.ts +10 -0
  390. package/dist/types/components/data/dataview/dataview.d.ts +61 -0
  391. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +73 -0
  392. package/dist/types/components/data/grid/grid.d.ts +177 -0
  393. package/dist/types/components/data/pagination/pagination.d.ts +31 -0
  394. package/dist/types/components/data/searchgrid/searchgrid.d.ts +63 -0
  395. package/dist/types/components/data/table/table.d.ts +26 -0
  396. package/dist/types/components/data/tree/tree.d.ts +71 -0
  397. package/dist/types/components/data/viewmanager/viewmanager.d.ts +86 -0
  398. package/dist/types/components/dataview.d.ts +1 -0
  399. package/dist/types/components/datefield.d.ts +1 -0
  400. package/dist/types/components/daterangefield.d.ts +1 -0
  401. package/dist/types/components/dates/calendar/calendar.d.ts +48 -0
  402. package/dist/types/components/dial.d.ts +1 -0
  403. package/dist/types/components/dropdown.d.ts +1 -0
  404. package/dist/types/components/feedback/spinner/spinner.d.ts +11 -0
  405. package/dist/types/components/fieldgroup.d.ts +1 -0
  406. package/dist/types/components/fieldlist.d.ts +1 -0
  407. package/dist/types/components/fields/checkbox/checkbox.d.ts +20 -0
  408. package/dist/types/components/fields/checkboxgroup/checkboxgroup.d.ts +27 -0
  409. package/dist/types/components/fields/combobox/combobox.d.ts +15 -0
  410. package/dist/types/components/fields/datefield/datefield.d.ts +30 -0
  411. package/dist/types/components/fields/daterangefield/daterangefield.d.ts +32 -0
  412. package/dist/types/components/fields/dial/dial.d.ts +84 -0
  413. package/dist/types/components/fields/listbox/listbox.d.ts +54 -0
  414. package/dist/types/components/fields/lookupfield/lookupfield.d.ts +25 -0
  415. package/dist/types/components/fields/numberfield/numberfield.d.ts +31 -0
  416. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +77 -0
  417. package/dist/types/components/fields/radiogroup/radiogroup.d.ts +26 -0
  418. package/dist/types/components/fields/secretfield/secretfield.d.ts +52 -0
  419. package/dist/types/components/fields/select/select.d.ts +10 -0
  420. package/dist/types/components/fields/slider/slider.d.ts +62 -0
  421. package/dist/types/components/fields/suggestfield/suggestfield.d.ts +34 -0
  422. package/dist/types/components/fields/textarea/textarea.d.ts +16 -0
  423. package/dist/types/components/fields/textfield/textfield.d.ts +38 -0
  424. package/dist/types/components/fields/toggle/toggle.d.ts +9 -0
  425. package/dist/types/components/fieldset.d.ts +1 -0
  426. package/dist/types/components/filterbuilder.d.ts +1 -0
  427. package/dist/types/components/form/fieldgroup/fieldgroup.d.ts +33 -0
  428. package/dist/types/components/form/fieldlist/fieldlist.d.ts +58 -0
  429. package/dist/types/components/form/form/form.d.ts +68 -0
  430. package/dist/types/components/form/formactions/formactions.d.ts +34 -0
  431. package/dist/types/components/form/formerrors/formerrors.d.ts +23 -0
  432. package/dist/types/components/form/formsection/formsection.d.ts +26 -0
  433. package/dist/types/components/form/inputgroup/inputgroup.d.ts +28 -0
  434. package/dist/types/components/form/stepform/stepform.d.ts +64 -0
  435. package/dist/types/components/form.d.ts +1 -0
  436. package/dist/types/components/formactions.d.ts +1 -0
  437. package/dist/types/components/formerrors.d.ts +1 -0
  438. package/dist/types/components/formsection.d.ts +1 -0
  439. package/dist/types/components/grid.d.ts +1 -0
  440. package/dist/types/components/icon.d.ts +1 -0
  441. package/dist/types/components/inputgroup.d.ts +1 -0
  442. package/dist/types/components/label.d.ts +1 -0
  443. package/dist/types/components/layout/container/container.d.ts +1 -0
  444. package/dist/types/components/layout/fieldset/fieldset.d.ts +30 -0
  445. package/dist/types/components/layout/panel/panel.d.ts +53 -0
  446. package/dist/types/components/layout/panel/reload.d.ts +1 -0
  447. package/dist/types/components/layout/spacer/spacer.d.ts +12 -0
  448. package/dist/types/components/layout/toolbar/toolbar.d.ts +15 -0
  449. package/dist/types/components/layout/viewport/viewport.d.ts +7 -0
  450. package/dist/types/components/listbox.d.ts +1 -0
  451. package/dist/types/components/lookupfield.d.ts +1 -0
  452. package/dist/types/components/menu.d.ts +1 -0
  453. package/dist/types/components/messagebox.d.ts +1 -0
  454. package/dist/types/components/navigation/breadcrumb/breadcrumb.d.ts +32 -0
  455. package/dist/types/components/navigation/navmenu/navmenu.d.ts +63 -0
  456. package/dist/types/components/navigation/stepper/stepper.d.ts +31 -0
  457. package/dist/types/components/navigation/tabs/tabs.d.ts +57 -0
  458. package/dist/types/components/navmenu.d.ts +1 -0
  459. package/dist/types/components/numberfield.d.ts +1 -0
  460. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +80 -0
  461. package/dist/types/components/overlays/dropdown/dropdown.d.ts +41 -0
  462. package/dist/types/components/overlays/menu/menu.d.ts +56 -0
  463. package/dist/types/components/overlays/messagebox/messagebox.d.ts +61 -0
  464. package/dist/types/components/overlays/toast/toast.d.ts +45 -0
  465. package/dist/types/components/overlays/tooltip/tooltip.d.ts +13 -0
  466. package/dist/types/components/overlays/widget/widget.d.ts +61 -0
  467. package/dist/types/components/overlays/window/window.d.ts +38 -0
  468. package/dist/types/components/pagination.d.ts +1 -0
  469. package/dist/types/components/panel.d.ts +1 -0
  470. package/dist/types/components/pickerfield.d.ts +1 -0
  471. package/dist/types/components/radiogroup.d.ts +1 -0
  472. package/dist/types/components/searchgrid.d.ts +1 -0
  473. package/dist/types/components/secretfield.d.ts +1 -0
  474. package/dist/types/components/select.d.ts +1 -0
  475. package/dist/types/components/slider.d.ts +1 -0
  476. package/dist/types/components/spacer.d.ts +1 -0
  477. package/dist/types/components/spinner.d.ts +1 -0
  478. package/dist/types/components/stepform.d.ts +1 -0
  479. package/dist/types/components/stepper.d.ts +1 -0
  480. package/dist/types/components/suggestfield.d.ts +1 -0
  481. package/dist/types/components/table.d.ts +1 -0
  482. package/dist/types/components/tabs.d.ts +1 -0
  483. package/dist/types/components/textarea.d.ts +1 -0
  484. package/dist/types/components/textfield.d.ts +1 -0
  485. package/dist/types/components/toast.d.ts +1 -0
  486. package/dist/types/components/toggle.d.ts +1 -0
  487. package/dist/types/components/toolbar.d.ts +1 -0
  488. package/dist/types/components/tooltip.d.ts +1 -0
  489. package/dist/types/components/tree.d.ts +1 -0
  490. package/dist/types/components/viewmanager.d.ts +1 -0
  491. package/dist/types/components/viewport.d.ts +1 -0
  492. package/dist/types/components/widget.d.ts +1 -0
  493. package/dist/types/components/window.d.ts +1 -0
  494. package/dist/types/core/component.d.ts +94 -0
  495. package/dist/types/core/container.d.ts +43 -0
  496. package/dist/types/core/date.d.ts +14 -0
  497. package/dist/types/core/dom.d.ts +11 -0
  498. package/dist/types/core/emitter.d.ts +12 -0
  499. package/dist/types/core/field.d.ts +78 -0
  500. package/dist/types/core/focus.d.ts +18 -0
  501. package/dist/types/core/i18n.d.ts +12 -0
  502. package/dist/types/core/index.d.ts +15 -0
  503. package/dist/types/core/layer.d.ts +6 -0
  504. package/dist/types/core/position.d.ts +19 -0
  505. package/dist/types/core/registry.d.ts +12 -0
  506. package/dist/types/core/validators.d.ts +10 -0
  507. package/dist/types/core/virtual.d.ts +24 -0
  508. package/dist/types/data/column.d.ts +32 -0
  509. package/dist/types/data/format.d.ts +4 -0
  510. package/dist/types/data/index.d.ts +5 -0
  511. package/dist/types/data/model.d.ts +28 -0
  512. package/dist/types/data/proxy.d.ts +61 -0
  513. package/dist/types/data/store.d.ts +94 -0
  514. package/dist/types/index.d.ts +67 -0
  515. package/dist/types/layout/layout.d.ts +27 -0
  516. package/dist/types/motion/config.d.ts +83 -0
  517. package/dist/types/motion/core.d.ts +40 -0
  518. package/dist/types/motion/extras.d.ts +66 -0
  519. package/dist/types/motion/index.d.ts +3 -0
  520. package/dist/types/themes/define.d.ts +31 -0
  521. package/dist/types/themes/index.d.ts +1 -0
  522. package/dist/types/ui/enums.d.ts +82 -0
  523. package/dist/types/ui/index.d.ts +2 -0
  524. package/dist/types/ui/ui.d.ts +67 -0
  525. package/dist/ui.js +2 -0
  526. package/dist/ui.js.map +7 -0
  527. package/package.json +104 -4
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/widget/widget.ts"],
4
+ "sourcesContent": ["import { Panel, type PanelConfig, type PanelTool } from '../../layout/panel/panel';\nimport { register } from '../../../core/registry';\nimport { t, addMessages } from '../../../core/i18n';\nimport { toLayer } from '../../../core/layer';\nimport { focusables } from '../../../core/focus';\nimport { h } from '../../../core/dom';\n\naddMessages('en', {\n wDockLeft: 'Dock to the left',\n wDockRight: 'Dock to the right',\n wDockTop: 'Dock to the top',\n wDockBottom: 'Dock to the bottom',\n wResize: 'Resize',\n});\naddMessages('pt-BR', {\n wDockLeft: 'Fixar \u00E0 esquerda',\n wDockRight: 'Fixar \u00E0 direita',\n wDockTop: 'Fixar em cima',\n wDockBottom: 'Fixar embaixo',\n wResize: 'Redimensionar',\n});\n\nexport type WidgetSide = 'right' | 'left' | 'top' | 'bottom';\n\nexport interface WidgetConfig extends PanelConfig {\n side?: WidgetSide;\n /** Float above the page (default). `false`: an ordinary panel where the layout puts it. */\n floating?: boolean;\n /** Width on the sides, height on top/bottom (CSS length or px). */\n size?: number | string;\n /** Header buttons that let the user pick the side. */\n sideSwitcher?: boolean;\n /** Which sides the switcher offers. Default left, right, bottom. */\n sides?: WidgetSide[];\n closeOnEsc?: boolean;\n /** On open the focus goes to the widget itself; `true` focuses its first field instead. Default false. */\n autoFocus?: boolean;\n /** The user can move it by its header (pointer drag, or Alt+arrow keys). A move frees it from the side; `setSide` docks it again. */\n draggable?: boolean;\n /** The user can resize it: the inner edge while docked, a corner grip once moved; arrow keys on the handle. */\n resizable?: boolean;\n}\n\nconst MIN = 160; // px: the smallest a user can make it\n\nconst ICON: Record<WidgetSide, string> = { left: 'chevron-left', right: 'chevron-right', top: 'chevron-up', bottom: 'chevron-down' };\nconst LABEL: Record<WidgetSide, string> = { left: 'wDockLeft', right: 'wDockRight', top: 'wDockTop', bottom: 'wDockBottom' };\nconst SIDES: WidgetSide[] = ['right', 'left', 'top', 'bottom'];\n\n/** A panel that floats over the page, attached to one edge. Not modal: the page behind stays usable. */\nexport class Widget extends Panel<WidgetConfig> {\n protected override baseCls = 'op-panel op-widget';\n private opened = false;\n private opener: Element | null = null;\n private cancelHide?: () => void;\n private userTools: number;\n private pos?: { x: number; y: number };\n private grip?: HTMLElement;\n\n constructor(config: WidgetConfig = {}) {\n const tools: PanelTool[] = [...(config.tools ?? [])];\n const sides = config.sides ?? (['left', 'right', 'bottom'] as WidgetSide[]);\n // `this` does not exist yet: the handlers look the widget up through the panel they receive\n if (config.sideSwitcher) for (const s of sides) tools.push({ icon: ICON[s], label: t(LABEL[s]), handler: (p) => (p as Widget).setSide(s) });\n super({ closable: true, closeAction: 'hide', floating: true, side: 'right', layout: 'fit', hidden: true, ...config, tools });\n this.userTools = config.tools?.length ?? 0;\n }\n\n protected override onRender() {\n super.onRender();\n const c = this.config;\n this.el.setAttribute('role', 'complementary');\n this.el.classList.toggle('is-floating', c.floating !== false);\n if (c.sideSwitcher) {\n (c.sides ?? ['left', 'right', 'bottom']).forEach((s, i) => {\n const b = this.el.querySelectorAll<HTMLElement>('.op-panel__tool')[this.userTools + i];\n if (b) b.dataset.side = s;\n });\n }\n this.paintSide();\n if (c.size != null) this.setSize(c.size);\n if (c.draggable && c.floating !== false) this.initDrag();\n this.setResizable(!!c.resizable);\n this.listen(this.el, 'keydown', (e: KeyboardEvent) => {\n if (e.key === 'Escape' && c.closeOnEsc !== false && !e.defaultPrevented && c.floating !== false) {\n e.stopPropagation();\n this.close();\n }\n });\n }\n\n // ---- side / size ---------------------------------------------------------------------------\n\n getSide(): WidgetSide {\n return this.config.side ?? 'right';\n }\n\n setSide(side: WidgetSide): void {\n if (side === this.getSide() || !SIDES.includes(side)) return;\n this.config.side = side;\n this.resetPosition();\n this.paintSide();\n this.emit('side-change', side);\n }\n\n private paintSide(): void {\n if (!this.rendered) return;\n const side = this.getSide();\n for (const s of SIDES) this.el.classList.toggle(`op-widget--${s}`, s === side);\n for (const b of Array.from(this.el.querySelectorAll<HTMLElement>('[data-side]'))) b.setAttribute('aria-pressed', String(b.dataset.side === side));\n this.paintGrip();\n }\n\n /** Where the user left it (viewport px), or undefined while it sits on its side. */\n getPosition(): { x: number; y: number } | undefined {\n return this.pos;\n }\n\n /** Puts a dragged widget back on its side. */\n resetPosition(): void {\n if (!this.pos) return;\n this.pos = undefined;\n const st = this.el.style;\n for (const k of ['inset', 'inset-inline', 'inset-block', 'left', 'top', 'width', 'height']) st.removeProperty(k);\n this.el.classList.remove('is-moved');\n this.paintGrip();\n this.emit('move', undefined);\n }\n\n private moveTo(x: number, y: number): void {\n const el = this.el;\n if (!this.pos) {\n // first move: pin the current size, because the side rules (insets) stop applying\n const r = el.getBoundingClientRect();\n if (r.width) {\n el.style.width = `${r.width}px`;\n el.style.height = `${r.height}px`;\n }\n el.classList.add('is-moved');\n }\n const w = el.offsetWidth || el.getBoundingClientRect().width;\n const h = el.offsetHeight || el.getBoundingClientRect().height;\n this.pos = { x: Math.max(0, Math.min(x, innerWidth - Math.min(w, innerWidth) )), y: Math.max(0, Math.min(y, innerHeight - Math.min(h, innerHeight))) };\n el.style.inset = 'auto';\n el.style.left = `${this.pos.x}px`;\n el.style.top = `${this.pos.y}px`;\n this.paintGrip();\n this.emit('move', this.pos);\n }\n\n private initDrag(): void {\n const head = this.headerEl;\n head.classList.add('op-widget__handle');\n head.tabIndex = 0;\n head.setAttribute('aria-roledescription', 'draggable');\n this.listen(head, 'pointerdown', (e: PointerEvent) => {\n if ((e.target as HTMLElement).closest('.op-panel__tool') || e.button) return;\n const r = this.el.getBoundingClientRect();\n const dx = e.clientX - r.left;\n const dy = e.clientY - r.top;\n this.el.classList.add('is-dragging');\n const move = (m: PointerEvent) => this.moveTo(m.clientX - dx, m.clientY - dy);\n const up = () => {\n this.el.classList.remove('is-dragging');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(up);\n });\n // keyboard: Alt+arrows nudge it, Alt+Home puts it back on its side\n this.listen(head, 'keydown', (e: KeyboardEvent) => {\n if (!e.altKey) return;\n const step = e.shiftKey ? 64 : 16;\n const r = this.el.getBoundingClientRect();\n const to: Record<string, [number, number]> = { ArrowLeft: [r.left - step, r.top], ArrowRight: [r.left + step, r.top], ArrowUp: [r.left, r.top - step], ArrowDown: [r.left, r.top + step] };\n if (e.key === 'Home') {\n e.preventDefault();\n this.resetPosition();\n } else if (to[e.key]) {\n e.preventDefault();\n this.moveTo(...to[e.key]);\n }\n });\n }\n\n setSize(size: number | string): void {\n this.config.size = size;\n if (this.rendered) this.el.style.setProperty('--op-widget-size', typeof size === 'number' ? `${size}px` : size);\n }\n\n // ---- resize --------------------------------------------------------------------------------\n\n /** Adds or removes the resize handle (only for a floating widget). */\n setResizable(resizable: boolean): void {\n this.config.resizable = resizable;\n if (!this.rendered) return;\n this.grip?.remove();\n this.grip = undefined;\n if (!resizable || this.config.floating === false) return;\n const grip = (this.grip = h('div', 'op-widget__resize', { role: 'separator', tabindex: 0, 'aria-label': t('wResize') }));\n this.el.append(grip);\n this.listen(grip, 'pointerdown', (e: PointerEvent) => {\n if (e.button) return;\n e.preventDefault();\n const r = this.el.getBoundingClientRect();\n const x0 = e.clientX;\n const y0 = e.clientY;\n this.el.classList.add('is-resizing');\n const move = (m: PointerEvent) => this.resizeBy(r, m.clientX - x0, m.clientY - y0);\n const up = () => {\n this.el.classList.remove('is-resizing');\n document.removeEventListener('pointermove', move);\n document.removeEventListener('pointerup', up);\n };\n document.addEventListener('pointermove', move);\n document.addEventListener('pointerup', up);\n this.own(up);\n });\n this.listen(grip, 'keydown', (e: KeyboardEvent) => {\n const step = e.shiftKey ? 64 : 16;\n const d: Record<string, [number, number]> = { ArrowLeft: [-step, 0], ArrowRight: [step, 0], ArrowUp: [0, -step], ArrowDown: [0, step] };\n if (!d[e.key] || e.altKey) return;\n e.preventDefault();\n this.resizeBy(this.el.getBoundingClientRect(), ...d[e.key]);\n });\n this.paintGrip();\n }\n\n /**\n * Resizes from rect `r` by a pointer (or key) delta. Moved: the corner grip sets width and height. Docked: the inner edge\n * sets the size, so pulling it away from the docked edge makes the widget bigger.\n */\n private resizeBy(r: { width: number; height: number }, dx: number, dy: number): void {\n const clamp = (v: number, max: number) => Math.round(Math.max(MIN, Math.min(v, max)));\n if (this.pos) {\n if (dx) this.el.style.width = `${clamp(r.width + dx, innerWidth - this.pos.x)}px`;\n if (dy) this.el.style.height = `${clamp(r.height + dy, innerHeight - this.pos.y)}px`;\n } else {\n const side = this.getSide();\n const across = side === 'left' || side === 'right';\n const grow = side === 'right' ? -dx : side === 'left' ? dx : side === 'bottom' ? -dy : dy;\n this.setSize(clamp((across ? r.width : r.height) + grow, (across ? innerWidth : innerHeight) - 32));\n }\n this.paintGrip();\n const box = this.el.getBoundingClientRect();\n this.emit('resize', { width: Math.round(box.width), height: Math.round(box.height) });\n }\n\n /** The handle's orientation and value follow the dimension it changes. */\n private paintGrip(): void {\n const g = this.grip;\n if (!g) return;\n const side = this.getSide();\n const across = !!this.pos || side === 'left' || side === 'right';\n const r = this.el.getBoundingClientRect();\n g.setAttribute('aria-orientation', across ? 'vertical' : 'horizontal');\n g.setAttribute('aria-valuemin', String(MIN));\n g.setAttribute('aria-valuenow', String(Math.round(across ? r.width : r.height)));\n }\n\n // ---- open / close --------------------------------------------------------------------------\n\n isOpen(): boolean {\n return this.config.floating === false ? !this.isHidden() : this.opened;\n }\n open(): void {\n this.show();\n }\n /** Opens or closes (with no argument: the other one). `toggle()` stays the Panel's collapse. */\n setOpen(open = !this.isOpen()): void {\n if (open) this.show();\n else this.hide();\n }\n\n override show(): void {\n if (this.config.floating === false) return super.show();\n if (this.opened || this.destroyed || this.emit('before-show') === false) return;\n this.cancelHide?.();\n this.opener = document.activeElement;\n const el = this.el;\n this.opened = true;\n this.config.hidden = false;\n toLayer(el, this.opener);\n el.hidden = false;\n this.notifyMount();\n // next frame, so the slide-in transition has a starting point\n requestAnimationFrame(() => this.opened && el.classList.add('is-open'));\n if (el.tabIndex < 0 && !el.hasAttribute('tabindex')) el.tabIndex = -1;\n ((this.config.autoFocus && focusables(this.getBody())[0]) || el).focus();\n this.emit('show');\n }\n\n override hide(): void {\n if (this.config.floating === false) return super.hide();\n if (!this.opened || this.emit('before-hide') === false) return;\n this.opened = false;\n this.config.hidden = true;\n this.el.classList.remove('is-open');\n this.cancelHide = this.later(() => (this.el.hidden = true), 250);\n const back = this.opener;\n if (back instanceof HTMLElement && back.isConnected && this.el.contains(document.activeElement)) back.focus();\n this.emit('hide');\n }\n\n protected override onDestroy(): void {\n super.onDestroy();\n this.el.remove();\n }\n}\nregister('widget', Widget);\n"],
5
+ "mappings": "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",
6
+ "names": ["addMessages", "MIN", "ICON", "LABEL", "SIDES", "Widget", "Panel", "config", "tools", "sides", "s", "t", "p", "c", "b", "e", "side", "st", "k", "x", "y", "el", "r", "w", "h", "head", "dx", "dy", "move", "m", "up", "step", "to", "size", "resizable", "grip", "x0", "y0", "d", "clamp", "v", "max", "across", "grow", "box", "g", "open", "toLayer", "focusables", "back", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as o}from"./chunk-A2NKDOYN.js";import{a as i}from"./chunk-TIPK3SCJ.js";import{f as r}from"./chunk-MW3RWBZ7.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-5DJTP53N.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": "wHASO,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{d as l}from"./chunk-MW3RWBZ7.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-5JEXM5S7.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}from"./chunk-A2NKDOYN.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as d}from"./chunk-TIPK3SCJ.js";import{f as m}from"./chunk-MW3RWBZ7.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-5Q76ACVI.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{c as d}from"./chunk-ZWNQREWS.js";import{a as c}from"./chunk-2ZRNGG2N.js";import{c as x}from"./chunk-4EZJ5FKJ.js";import{b as n}from"./chunk-PZSHOSOS.js";import{a as l}from"./chunk-TIPK3SCJ.js";var a=class extends d{baseCls="op-inputgroup";affixes=[];getField(){return this.query(i=>i instanceof c)[0]}onRender(){super.onRender(),this.paint();for(let i of["invalid","valid"])this.getField()?.on(i,()=>this.describe())}describe(){let i=this.getField()?.el.querySelector("[aria-invalid]");if(!i)return;let t=[...(i.getAttribute("aria-describedby")??"").split(" ").filter(r=>r&&!r.startsWith(`${this.id}-`)),...this.affixes.filter(r=>r.tagName==="SPAN").map(r=>r.id)];t.length?i.setAttribute("aria-describedby",t.join(" ")):i.removeAttribute("aria-describedby")}paint(){let i=this.getField();if(!i)return;this.affixes.forEach(e=>e.remove()),this.affixes=[];let o=i.el.querySelector(".op-field__control"),t=o.querySelector(":scope > .op-inputgroup__row");t||(t=n("div","op-inputgroup__row"),t.append(...Array.from(o.childNodes)),o.append(t));let r=(e,p)=>{if(typeof e=="string")return n("span",`op-inputgroup__affix op-inputgroup__affix--${p}`,{id:`${this.id}-${p}`},e);let u=n("button",`op-inputgroup__affix op-inputgroup__btn op-inputgroup__affix--${p}`,{type:"button","aria-label":e.ariaLabel??null},e.icon?x(e.icon):"",e.text?n("span","",{},e.text):"");return this.listen(u,"click",()=>e.handler?.(i)),u},{prefix:f,suffix:s}=this.config;f!=null&&t.prepend(this.track(r(f,"prefix"))),s!=null&&t.append(this.track(r(s,"suffix"))),i.el.classList.toggle("has-prefix",f!=null),i.el.classList.toggle("has-suffix",s!=null),this.describe()}track(i){return this.affixes.push(i),i}setPrefix(i){this.config.prefix=i,this.rendered&&this.paint()}setSuffix(i){this.config.suffix=i,this.rendered&&this.paint()}};l("inputgroup",a);export{a};
2
+ //# sourceMappingURL=chunk-5QUY72FX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/form/inputgroup/inputgroup.ts"],
4
+ "sourcesContent": ["import { Container, type ContainerConfig } from '../../../core/container';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\n\n/** Text joined to the input (`'R$'`, `'.com'`), or a button. */\nexport type InputAffix = string | { icon?: string; text?: string; ariaLabel?: string; handler?: (field: Field<any>) => void };\n\nexport interface InputGroupConfig extends ContainerConfig {\n prefix?: InputAffix;\n suffix?: InputAffix;\n}\n\n/** Joins text or buttons to a field's input box. The field keeps its label, help, error, name and value. */\nexport class InputGroup extends Container<InputGroupConfig> {\n protected override baseCls = 'op-inputgroup';\n private affixes: HTMLElement[] = [];\n\n /** The field inside. */\n getField(): Field<any> | undefined {\n return this.query((c) => c instanceof Field)[0] as Field<any> | undefined;\n }\n\n protected override onRender() {\n super.onRender();\n this.paint();\n // the field rewrites aria-describedby when its error changes (and says so right after): put the affix text back\n for (const ev of ['invalid', 'valid']) this.getField()?.on(ev, () => this.describe());\n }\n\n /** Text affixes describe the input, after the field's own help and error. */\n private describe() {\n const input = this.getField()?.el.querySelector('[aria-invalid]');\n if (!input) return;\n const own = (input.getAttribute('aria-describedby') ?? '').split(' ').filter((id) => id && !id.startsWith(`${this.id}-`));\n const ids = [...own, ...this.affixes.filter((a) => a.tagName === 'SPAN').map((a) => a.id)];\n if (ids.length) input.setAttribute('aria-describedby', ids.join(' '));\n else input.removeAttribute('aria-describedby');\n }\n\n /** `[prefix][the field's input box][suffix]` inside the field's control. */\n private paint() {\n const field = this.getField();\n if (!field) return;\n this.affixes.forEach((a) => a.remove());\n this.affixes = [];\n const control = field.el.querySelector<HTMLElement>('.op-field__control')!;\n let row = control.querySelector<HTMLElement>(':scope > .op-inputgroup__row');\n if (!row) {\n row = h('div', 'op-inputgroup__row');\n row.append(...Array.from(control.childNodes));\n control.append(row);\n }\n const make = (a: InputAffix, side: 'prefix' | 'suffix') => {\n if (typeof a === 'string') return h('span', `op-inputgroup__affix op-inputgroup__affix--${side}`, { id: `${this.id}-${side}` }, a);\n const b = h('button', `op-inputgroup__affix op-inputgroup__btn op-inputgroup__affix--${side}`, { type: 'button', 'aria-label': a.ariaLabel ?? null }, a.icon ? iconEl(a.icon) : '', a.text ? h('span', '', {}, a.text) : '');\n this.listen(b, 'click', () => a.handler?.(field));\n return b;\n };\n const { prefix, suffix } = this.config;\n if (prefix != null) row.prepend(this.track(make(prefix, 'prefix')));\n if (suffix != null) row.append(this.track(make(suffix, 'suffix')));\n field.el.classList.toggle('has-prefix', prefix != null);\n field.el.classList.toggle('has-suffix', suffix != null);\n this.describe();\n }\n\n private track(a: HTMLElement) {\n this.affixes.push(a);\n return a;\n }\n\n setPrefix(prefix: InputAffix | undefined) {\n this.config.prefix = prefix;\n if (this.rendered) this.paint();\n }\n setSuffix(suffix: InputAffix | undefined) {\n this.config.suffix = suffix;\n if (this.rendered) this.paint();\n }\n}\nregister('inputgroup', InputGroup);\n"],
5
+ "mappings": "wMAeO,IAAMA,EAAN,cAAyBC,CAA4B,CACvC,QAAU,gBACrB,QAAyB,CAAC,EAGlC,UAAmC,CACjC,OAAO,KAAK,MAAOC,GAAMA,aAAaC,CAAK,EAAE,CAAC,CAChD,CAEmB,UAAW,CAC5B,MAAM,SAAS,EACf,KAAK,MAAM,EAEX,QAAWC,IAAM,CAAC,UAAW,OAAO,EAAG,KAAK,SAAS,GAAG,GAAGA,EAAI,IAAM,KAAK,SAAS,CAAC,CACtF,CAGQ,UAAW,CACjB,IAAMC,EAAQ,KAAK,SAAS,GAAG,GAAG,cAAc,gBAAgB,EAChE,GAAI,CAACA,EAAO,OAEZ,IAAMC,EAAM,CAAC,IADAD,EAAM,aAAa,kBAAkB,GAAK,IAAI,MAAM,GAAG,EAAE,OAAQE,GAAOA,GAAM,CAACA,EAAG,WAAW,GAAG,KAAK,EAAE,GAAG,CAAC,EACnG,GAAG,KAAK,QAAQ,OAAQC,GAAMA,EAAE,UAAY,MAAM,EAAE,IAAKA,GAAMA,EAAE,EAAE,CAAC,EACrFF,EAAI,OAAQD,EAAM,aAAa,mBAAoBC,EAAI,KAAK,GAAG,CAAC,EAC/DD,EAAM,gBAAgB,kBAAkB,CAC/C,CAGQ,OAAQ,CACd,IAAMI,EAAQ,KAAK,SAAS,EAC5B,GAAI,CAACA,EAAO,OACZ,KAAK,QAAQ,QAASD,GAAMA,EAAE,OAAO,CAAC,EACtC,KAAK,QAAU,CAAC,EAChB,IAAME,EAAUD,EAAM,GAAG,cAA2B,oBAAoB,EACpEE,EAAMD,EAAQ,cAA2B,8BAA8B,EACtEC,IACHA,EAAMC,EAAE,MAAO,oBAAoB,EACnCD,EAAI,OAAO,GAAG,MAAM,KAAKD,EAAQ,UAAU,CAAC,EAC5CA,EAAQ,OAAOC,CAAG,GAEpB,IAAME,EAAO,CAACL,EAAeM,IAA8B,CACzD,GAAI,OAAON,GAAM,SAAU,OAAOI,EAAE,OAAQ,8CAA8CE,CAAI,GAAI,CAAE,GAAI,GAAG,KAAK,EAAE,IAAIA,CAAI,EAAG,EAAGN,CAAC,EACjI,IAAMO,EAAIH,EAAE,SAAU,iEAAiEE,CAAI,GAAI,CAAE,KAAM,SAAU,aAAcN,EAAE,WAAa,IAAK,EAAGA,EAAE,KAAOQ,EAAOR,EAAE,IAAI,EAAI,GAAIA,EAAE,KAAOI,EAAE,OAAQ,GAAI,CAAC,EAAGJ,EAAE,IAAI,EAAI,EAAE,EAC3N,YAAK,OAAOO,EAAG,QAAS,IAAMP,EAAE,UAAUC,CAAK,CAAC,EACzCM,CACT,EACM,CAAE,OAAAE,EAAQ,OAAAC,CAAO,EAAI,KAAK,OAC5BD,GAAU,MAAMN,EAAI,QAAQ,KAAK,MAAME,EAAKI,EAAQ,QAAQ,CAAC,CAAC,EAC9DC,GAAU,MAAMP,EAAI,OAAO,KAAK,MAAME,EAAKK,EAAQ,QAAQ,CAAC,CAAC,EACjET,EAAM,GAAG,UAAU,OAAO,aAAcQ,GAAU,IAAI,EACtDR,EAAM,GAAG,UAAU,OAAO,aAAcS,GAAU,IAAI,EACtD,KAAK,SAAS,CAChB,CAEQ,MAAMV,EAAgB,CAC5B,YAAK,QAAQ,KAAKA,CAAC,EACZA,CACT,CAEA,UAAUS,EAAgC,CACxC,KAAK,OAAO,OAASA,EACjB,KAAK,UAAU,KAAK,MAAM,CAChC,CACA,UAAUC,EAAgC,CACxC,KAAK,OAAO,OAASA,EACjB,KAAK,UAAU,KAAK,MAAM,CAChC,CACF,EACAC,EAAS,aAAcnB,CAAU",
6
+ "names": ["InputGroup", "Container", "c", "Field", "ev", "input", "ids", "id", "a", "field", "control", "row", "h", "make", "side", "b", "iconEl", "prefix", "suffix", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c}from"./chunk-4EZJ5FKJ.js";import{a as d}from"./chunk-A2NKDOYN.js";import{b as a}from"./chunk-PZSHOSOS.js";import{a as p}from"./chunk-TIPK3SCJ.js";var l=class extends d{baseCls="op-navmenu";tag="nav";items=[];open=new Set;active;query="";focusId;root;onRender(){let e=this.config;this.items=e.items??[],this.active=e.active;let t=i=>i.forEach(s=>(s.expanded&&this.open.add(s.id),s.items&&t(s.items)));t(this.items),this.active&&this.openParents(this.active),this.root=a("ul","op-navmenu__tree",{role:"tree","aria-label":e.ariaLabel??null}),this.el.append(this.root),this.listen(this.root,"click",i=>{let s=i.target.closest(".op-navmenu__item");s&&this.activate(s.dataset.id)}),this.listen(this.root,"keydown",i=>this.onKey(i)),this.listen(this.root,"focusin",i=>{let s=i.target.closest(".op-navmenu__item");s&&(this.focusId=s.dataset.id)}),this.paint()}getItem(e,t=this.items){for(let i of t){if(i.id===e)return i;let s=i.items&&this.getItem(e,i.items);if(s)return s}}parentsOf(e,t=this.items,i=[]){for(let s of t){if(s.id===e)return i;let n=s.items&&this.parentsOf(e,s.items,[...i,s]);if(n)return n}}openParents(e){for(let t of this.parentsOf(e)??[])this.open.add(t.id)}matches(e,t){return e.text.toLowerCase().includes(t)||!!e.items?.some(i=>this.matches(i,t))}visible(e){return e.hidden||this.query&&!this.matches(e,this.query)?!1:!e.items||e.items.some(t=>this.visible(t))}isOpen(e){return this.query||this.config.collapsed?!0:this.open.has(e.id)}paint(){this.el.classList.toggle("is-rail",!!this.config.collapsed),this.root.replaceChildren(...this.items.filter(i=>this.visible(i)).map(i=>this.node(i,1)));let t=this.focusId&&this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`)||this.root.querySelector(".op-navmenu__item.is-active")||this.root.querySelector(".op-navmenu__item");this.root.querySelectorAll(".op-navmenu__item").forEach(i=>i.tabIndex=i===t?0:-1)}node(e,t){let i=!!e.items,s=i&&this.isOpen(e),n=!!this.config.collapsed,r=a("li","op-navmenu__node",{role:"none"}),o=a("div",`op-navmenu__item${i?" is-group":""}${s?" is-expanded":""}${e.id===this.active?" is-active":""}${e.disabled?" is-disabled":""}`,{role:"treeitem","data-id":e.id,"aria-level":t,"aria-expanded":i?String(s):null,"aria-current":e.id===this.active?"page":null,"aria-disabled":e.disabled?"true":null,title:n?e.text:null,tabindex:-1});return o.style.setProperty("--_level",String(t-1)),o.append(a("span","op-navmenu__icon",{},e.icon?c(e.icon):""),a("span","op-navmenu__text",{},e.text)),e.badge!=null&&e.badge!==""&&o.append(a("span","op-navmenu__badge",{},String(e.badge))),i&&o.append(a("span","op-navmenu__chevron",{"aria-hidden":"true"},c("chevron-down"))),r.append(o),i&&s&&r.append(a("ul","op-navmenu__group",{role:"group"},...e.items.filter(h=>this.visible(h)).map(h=>this.node(h,t+1)))),r}activate(e){let t=this.getItem(e);if(!(!t||t.disabled)){if(t.items)return this.toggle(e);this.select(e)}}select(e){let t=this.getItem(e);!t||t.disabled||this.emit("before-select",t)===!1||(this.setActive(e),this.emit("select",t))}setActive(e){this.active=e,this.config.active=e,e&&(this.openParents(e),this.focusId=e),this.rendered&&this.paint()}getActive(){return this.active?this.getItem(this.active):void 0}expand(e){let t=this.getItem(e);if(!(!t?.items||this.open.has(e))){if(this.config.accordion)for(let i of this.siblings(e))this.open.delete(i.id);this.open.add(e),this.rendered&&this.paint(),this.emit("expand",t)}}collapse(e){let t=this.getItem(e);!t?.items||!this.open.delete(e)||(this.rendered&&this.paint(),this.emit("collapse",t))}toggle(e){this.open.has(e)?this.collapse(e):this.expand(e)}siblings(e){let t=this.parentsOf(e)??[];return(t.length?t[t.length-1].items:this.items).filter(s=>s.id!==e&&s.items)}expandAll(){let e=t=>t.forEach(i=>i.items&&(this.open.add(i.id),e(i.items)));e(this.items),this.rendered&&this.paint()}collapseAll(){this.open.clear(),this.active&&this.openParents(this.active),this.rendered&&this.paint()}setItems(e){this.items=e,this.config.items=e,this.rendered&&this.paint()}updateItem(e,t){let i=this.getItem(e);i&&(Object.assign(i,t),this.rendered&&this.paint())}setCollapsed(e){this.config.collapsed=e,this.rendered&&this.paint()}filter(e){this.query=e.trim().toLowerCase(),this.rendered&&this.paint()}rows(){return Array.from(this.root.querySelectorAll(".op-navmenu__item"))}focusRow(e){e&&(this.rows().forEach(t=>t.tabIndex=t===e?0:-1),e.focus())}onKey(e){let t=e.target.closest(".op-navmenu__item");if(!t)return;let i=this.rows(),s=i.indexOf(t),n=this.getItem(t.dataset.id),r=t.getAttribute("aria-expanded")==="true";switch(e.key){case"ArrowDown":this.focusRow(i[s+1]);break;case"ArrowUp":this.focusRow(i[s-1]);break;case"Home":this.focusRow(i[0]);break;case"End":this.focusRow(i[i.length-1]);break;case"ArrowRight":n.items&&!r?this.expand(n.id):n.items&&this.focusRow(i[s+1]);break;case"ArrowLeft":if(n.items&&r)this.collapse(n.id);else{let h=this.parentsOf(n.id)?.pop();h&&this.focusRow(this.root.querySelector(`[data-id="${CSS.escape(h.id)}"]`)??void 0)}break;case"Enter":case" ":this.activate(n.id);break;default:return}e.preventDefault(),this.focusId=document.activeElement?.dataset?.id??n.id;let o=this.root.querySelector(`[data-id="${CSS.escape(this.focusId)}"]`);o&&document.activeElement!==o&&this.focusRow(o)}};p("navmenu",l);export{l as a};
2
+ //# sourceMappingURL=chunk-5YS7OD5E.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/navigation/navmenu/navmenu.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { iconEl } from '../../base/icon/icon';\n\nexport interface NavItem {\n id: string;\n text: string;\n icon?: string;\n badge?: string | number;\n items?: NavItem[];\n disabled?: boolean;\n hidden?: boolean;\n /** Groups: start open. */\n expanded?: boolean;\n data?: unknown;\n}\n\nexport interface NavMenuConfig extends ComponentConfig {\n items?: NavItem[];\n /** id of the active leaf. */\n active?: string;\n /** Rail: icons only. */\n collapsed?: boolean;\n /** Opening a group closes the others at its level. */\n accordion?: boolean;\n}\n\n/** Sidebar tree: groups that open and close, one active leaf, badges, rail mode, filter and the APG tree keyboard model. */\nexport class NavMenu extends Component<NavMenuConfig> {\n protected override baseCls = 'op-navmenu';\n protected override tag = 'nav' as const;\n private items: NavItem[] = [];\n private open = new Set<string>();\n private active?: string;\n private query = '';\n private focusId?: string;\n private root!: HTMLElement;\n\n protected override onRender() {\n const c = this.config;\n this.items = c.items ?? [];\n this.active = c.active;\n const seed = (list: NavItem[]) => list.forEach((i) => (i.expanded && this.open.add(i.id), i.items && seed(i.items)));\n seed(this.items);\n if (this.active) this.openParents(this.active);\n this.root = h('ul', 'op-navmenu__tree', { role: 'tree', 'aria-label': c.ariaLabel ?? null });\n this.el.append(this.root);\n this.listen(this.root, 'click', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.activate(row.dataset.id!);\n });\n this.listen(this.root, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.listen(this.root, 'focusin', (e: Event) => {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (row) this.focusId = row.dataset.id;\n });\n this.paint();\n }\n\n // ---- model -----------------------------------------------------------------------------------\n\n getItem(id: string, list = this.items): NavItem | undefined {\n for (const i of list) {\n if (i.id === id) return i;\n const hit = i.items && this.getItem(id, i.items);\n if (hit) return hit;\n }\n }\n private parentsOf(id: string, list = this.items, trail: NavItem[] = []): NavItem[] | undefined {\n for (const i of list) {\n if (i.id === id) return trail;\n const hit = i.items && this.parentsOf(id, i.items, [...trail, i]);\n if (hit) return hit;\n }\n }\n private openParents(id: string) {\n for (const p of this.parentsOf(id) ?? []) this.open.add(p.id);\n }\n private matches(i: NavItem, q: string): boolean {\n return i.text.toLowerCase().includes(q) || !!i.items?.some((c) => this.matches(c, q));\n }\n /** Visible = not hidden, matches the filter, and a group has at least one visible child. */\n private visible(i: NavItem): boolean {\n if (i.hidden) return false;\n if (this.query && !this.matches(i, this.query)) return false;\n return !i.items || i.items.some((c) => this.visible(c));\n }\n private isOpen(i: NavItem): boolean {\n return this.query || this.config.collapsed ? true : this.open.has(i.id);\n }\n\n // ---- rendering -------------------------------------------------------------------------------\n\n private paint() {\n this.el.classList.toggle('is-rail', !!this.config.collapsed);\n this.root.replaceChildren(...this.items.filter((i) => this.visible(i)).map((i) => this.node(i, 1)));\n const f = this.focusId && this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n const first = f || this.root.querySelector<HTMLElement>('.op-navmenu__item.is-active') || this.root.querySelector<HTMLElement>('.op-navmenu__item');\n this.root.querySelectorAll<HTMLElement>('.op-navmenu__item').forEach((r) => (r.tabIndex = r === first ? 0 : -1));\n }\n\n private node(i: NavItem, level: number): HTMLElement {\n const group = !!i.items;\n const open = group && this.isOpen(i);\n const rail = !!this.config.collapsed;\n const li = h('li', 'op-navmenu__node', { role: 'none' });\n const row = h('div', `op-navmenu__item${group ? ' is-group' : ''}${open ? ' is-expanded' : ''}${i.id === this.active ? ' is-active' : ''}${i.disabled ? ' is-disabled' : ''}`, {\n role: 'treeitem', 'data-id': i.id, 'aria-level': level, 'aria-expanded': group ? String(open) : null, 'aria-current': i.id === this.active ? 'page' : null,\n 'aria-disabled': i.disabled ? 'true' : null, title: rail ? i.text : null, tabindex: -1,\n });\n row.style.setProperty('--_level', String(level - 1));\n row.append(h('span', 'op-navmenu__icon', {}, i.icon ? iconEl(i.icon) : ''), h('span', 'op-navmenu__text', {}, i.text));\n if (i.badge != null && i.badge !== '') row.append(h('span', 'op-navmenu__badge', {}, String(i.badge)));\n if (group) row.append(h('span', 'op-navmenu__chevron', { 'aria-hidden': 'true' }, iconEl('chevron-down')));\n li.append(row);\n if (group && open) li.append(h('ul', 'op-navmenu__group', { role: 'group' }, ...i.items!.filter((c) => this.visible(c)).map((c) => this.node(c, level + 1))));\n return li;\n }\n\n // ---- behavior --------------------------------------------------------------------------------\n\n private activate(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled) return;\n if (i.items) return this.toggle(id);\n this.select(id);\n }\n\n private select(id: string) {\n const i = this.getItem(id);\n if (!i || i.disabled || this.emit('before-select', i) === false) return;\n this.setActive(id);\n this.emit('select', i);\n }\n\n /** Marks a leaf as the active page (and opens its parents). Does not emit `select`. */\n setActive(id: string | undefined) {\n this.active = id;\n this.config.active = id;\n if (id) {\n this.openParents(id);\n this.focusId = id;\n }\n if (this.rendered) this.paint();\n }\n getActive(): NavItem | undefined {\n return this.active ? this.getItem(this.active) : undefined;\n }\n\n expand(id: string) {\n const i = this.getItem(id);\n if (!i?.items || this.open.has(id)) return;\n if (this.config.accordion) for (const sib of this.siblings(id)) this.open.delete(sib.id);\n this.open.add(id);\n this.rendered && this.paint();\n this.emit('expand', i);\n }\n collapse(id: string) {\n const i = this.getItem(id);\n if (!i?.items || !this.open.delete(id)) return;\n this.rendered && this.paint();\n this.emit('collapse', i);\n }\n toggle(id: string) {\n if (this.open.has(id)) this.collapse(id);\n else this.expand(id);\n }\n private siblings(id: string): NavItem[] {\n const parents = this.parentsOf(id) ?? [];\n const list = parents.length ? parents[parents.length - 1].items! : this.items;\n return list.filter((x) => x.id !== id && x.items);\n }\n expandAll() {\n const walk = (l: NavItem[]) => l.forEach((i) => i.items && (this.open.add(i.id), walk(i.items)));\n walk(this.items);\n this.rendered && this.paint();\n }\n collapseAll() {\n this.open.clear();\n if (this.active) this.openParents(this.active);\n this.rendered && this.paint();\n }\n\n setItems(items: NavItem[]) {\n this.items = items;\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n /** Changes an item in place (a badge, a label, disabled...). */\n updateItem(id: string, patch: Partial<NavItem>) {\n const i = this.getItem(id);\n if (!i) return;\n Object.assign(i, patch);\n if (this.rendered) this.paint();\n }\n setCollapsed(collapsed: boolean) {\n this.config.collapsed = collapsed;\n if (this.rendered) this.paint();\n }\n /** Hides what does not match and opens the groups that have a match; empty text clears the filter. */\n filter(text: string) {\n this.query = text.trim().toLowerCase();\n if (this.rendered) this.paint();\n }\n\n // ---- keyboard (APG tree) ---------------------------------------------------------------------\n\n private rows(): HTMLElement[] {\n return Array.from(this.root.querySelectorAll<HTMLElement>('.op-navmenu__item'));\n }\n private focusRow(row?: HTMLElement) {\n if (!row) return;\n this.rows().forEach((r) => (r.tabIndex = r === row ? 0 : -1));\n row.focus();\n }\n\n private onKey(e: KeyboardEvent) {\n const row = (e.target as HTMLElement).closest<HTMLElement>('.op-navmenu__item');\n if (!row) return;\n const rows = this.rows();\n const i = rows.indexOf(row);\n const item = this.getItem(row.dataset.id!)!;\n const open = row.getAttribute('aria-expanded') === 'true';\n switch (e.key) {\n case 'ArrowDown': this.focusRow(rows[i + 1]); break;\n case 'ArrowUp': this.focusRow(rows[i - 1]); break;\n case 'Home': this.focusRow(rows[0]); break;\n case 'End': this.focusRow(rows[rows.length - 1]); break;\n case 'ArrowRight':\n if (item.items && !open) this.expand(item.id);\n else if (item.items) this.focusRow(rows[i + 1]);\n break;\n case 'ArrowLeft':\n if (item.items && open) this.collapse(item.id);\n else {\n const parent = this.parentsOf(item.id)?.pop();\n if (parent) this.focusRow(this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(parent.id)}\"]`) ?? undefined);\n }\n break;\n case 'Enter':\n case ' ': this.activate(item.id); break;\n default: return;\n }\n e.preventDefault();\n this.focusId = (document.activeElement as HTMLElement | null)?.dataset?.id ?? item.id;\n // a repaint (expand/collapse/select) rebuilt the rows: put the focus back on the one the user is on\n const again = this.root.querySelector<HTMLElement>(`[data-id=\"${CSS.escape(this.focusId)}\"]`);\n if (again && document.activeElement !== again) this.focusRow(again);\n }\n}\nregister('navmenu', NavMenu);\n"],
5
+ "mappings": "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",
6
+ "names": ["NavMenu", "Component", "c", "seed", "list", "i", "h", "e", "row", "id", "hit", "trail", "p", "q", "first", "r", "level", "group", "open", "rail", "li", "iconEl", "sib", "parents", "x", "walk", "l", "items", "patch", "collapsed", "text", "rows", "item", "parent", "again", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var e;function i(){return(!e||!e.isConnected)&&(e=document.createElement("div"),e.className="op-layer",document.body.appendChild(e)),e}function a(n,r){let o=r?.closest("[data-op-theme]")?.getAttribute("data-op-theme");o&&n.setAttribute("data-op-theme",o),i().appendChild(n)}function d(n){let r=i(),o=[...Array.from(document.body.children),...Array.from(r.children)].filter(t=>t!==r&&t!==n&&!t.hasAttribute("inert")&&!t.classList.contains("op-toast-region"));for(let t of o)t.setAttribute("inert","");return()=>o.forEach(t=>t.removeAttribute("inert"))}export{i as a,a as b,d as c};
2
+ //# sourceMappingURL=chunk-676AKAGF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/layer.ts"],
4
+ "sourcesContent": ["let root: HTMLElement | undefined;\n\n/** The single `body > .op-layer` that holds every floating element (dropdowns, windows, tooltips, toasts). */\nexport function layer(): HTMLElement {\n if (!root || !root.isConnected) {\n root = document.createElement('div');\n root.className = 'op-layer';\n document.body.appendChild(root);\n }\n return root;\n}\n\n/** Moves `el` into the layer, keeping the theme scope of `from` (floating elements leave their themed ancestor). */\nexport function toLayer(el: HTMLElement, from?: Element | null): void {\n const theme = from?.closest('[data-op-theme]')?.getAttribute('data-op-theme');\n if (theme) el.setAttribute('data-op-theme', theme);\n layer().appendChild(el);\n}\n\n/** Makes everything except `modal` inert (outside the layer and earlier layer children). Returns the release function. */\nexport function lockModal(modal: HTMLElement): () => void {\n const l = layer();\n const locked = [...Array.from(document.body.children), ...Array.from(l.children)].filter(\n (e) => e !== l && e !== modal && !e.hasAttribute('inert') && !e.classList.contains('op-toast-region'),\n );\n for (const e of locked) e.setAttribute('inert', '');\n return () => locked.forEach((e) => e.removeAttribute('inert'));\n}\n"],
5
+ "mappings": "AAAA,IAAIA,EAGG,SAASC,GAAqB,CACnC,OAAI,CAACD,GAAQ,CAACA,EAAK,eACjBA,EAAO,SAAS,cAAc,KAAK,EACnCA,EAAK,UAAY,WACjB,SAAS,KAAK,YAAYA,CAAI,GAEzBA,CACT,CAGO,SAASE,EAAQC,EAAiBC,EAA6B,CACpE,IAAMC,EAAQD,GAAM,QAAQ,iBAAiB,GAAG,aAAa,eAAe,EACxEC,GAAOF,EAAG,aAAa,gBAAiBE,CAAK,EACjDJ,EAAM,EAAE,YAAYE,CAAE,CACxB,CAGO,SAASG,EAAUC,EAAgC,CACxD,IAAMC,EAAIP,EAAM,EACVQ,EAAS,CAAC,GAAG,MAAM,KAAK,SAAS,KAAK,QAAQ,EAAG,GAAG,MAAM,KAAKD,EAAE,QAAQ,CAAC,EAAE,OAC/EE,GAAMA,IAAMF,GAAKE,IAAMH,GAAS,CAACG,EAAE,aAAa,OAAO,GAAK,CAACA,EAAE,UAAU,SAAS,iBAAiB,CACtG,EACA,QAAWA,KAAKD,EAAQC,EAAE,aAAa,QAAS,EAAE,EAClD,MAAO,IAAMD,EAAO,QAASC,GAAMA,EAAE,gBAAgB,OAAO,CAAC,CAC/D",
6
+ "names": ["root", "layer", "toLayer", "el", "from", "theme", "lockModal", "modal", "l", "locked", "e"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as s}from"./chunk-2UPUC4RK.js";var h=t=>s.isOn()&&typeof t.animate=="function",E=t=>t.finished.then(()=>{},()=>{}),T=t=>{if("getBoundingClientRect"in t){let e=t.getBoundingClientRect();return{x:e.left+e.width/2,y:e.top+e.height/2}}return t};function P(t,e,n,r,a,c=16){let o=n-t,m=r-e,u=Math.hypot(o,m)||1,f=t+o/2-m/u*a*u,p=e+m/2+o/u*a*u;return Array.from({length:c+1},(y,g)=>{let d=g/c,i=1-d;return{x:i*i*t+2*i*d*f+d*d*n,y:i*i*e+2*i*d*p+d*d*r}})}function A(t,e,n={}){if(!h(t))return null;let r=T(t),a=T(e),c=P(0,0,a.x-r.x,a.y-r.y,n.bend??s.get().arc.bend).map(o=>({transform:`translate(${o.x}px, ${o.y}px)`}));return t.animate(c,{duration:n.duration??s.get().duration.move,easing:s.easing("move"),fill:"forwards"})}function C(t,e,n=s.get().rubber.resistance){let r=Math.abs(t);return Math.sign(t)*e*(1-1/(r*n/e+1))}function O(t,e="y"){let n=0,r,a=()=>(e==="y"?t.clientHeight:t.clientWidth)*.3||80,c=()=>t.style.transform=n?`translate${e.toUpperCase()}(${C(n,a())}px)`:"",o=()=>{let i=t.style.transform||`translate${e.toUpperCase()}(0px)`;n=0,t.style.transform="",h(t)&&t.animate([{transform:i},{transform:"none"}],{duration:s.get().rubber.settle,easing:s.easing("enter")})},m=()=>e==="y"?t.scrollTop<=0:t.scrollLeft<=0,u=()=>e==="y"?t.scrollTop+t.clientHeight>=t.scrollHeight-1:t.scrollLeft+t.clientWidth>=t.scrollWidth-1,f=i=>{if(!s.isOn())return;let l=e==="y"?i.deltaY:i.deltaX;(m()&&l<0||u()&&l>0||n!==0)&&(i.preventDefault(),n-=l,m()&&!u()&&(n=Math.max(0,n)),u()&&!m()&&(n=Math.min(0,n)),c(),clearTimeout(r),r=setTimeout(o,120))},p=null,y=i=>p=e==="y"?i.touches[0].clientY:i.touches[0].clientX,g=i=>{if(p==null||!s.isOn())return;let l=(e==="y"?i.touches[0].clientY:i.touches[0].clientX)-p;(m()&&l>0||u()&&l<0)&&(i.preventDefault(),n=l,c())},d=()=>(n&&o(),p=null);return t.addEventListener("wheel",f,{passive:!1}),t.addEventListener("touchstart",y,{passive:!0}),t.addEventListener("touchmove",g,{passive:!1}),t.addEventListener("touchend",d),()=>{clearTimeout(r),t.removeEventListener("wheel",f),t.removeEventListener("touchstart",y),t.removeEventListener("touchmove",g),t.removeEventListener("touchend",d)}}function $(t,e="x"){let n=0;return{move(r){if(!s.isOn()||!r)return;let a=1+s.get().stretch.amount;t.style.transition="none",t.style.transformOrigin=e==="x"?r>0?"left center":"right center":r>0?"center top":"center bottom",t.style.transform=e==="x"?`scaleX(${a})`:`scaleY(${a})`,n=r},release(){if(!n&&!t.style.transform)return;n=0;let r=t.style.transform;t.style.transform="",t.style.transition="",h(t)&&r&&t.animate([{transform:r},{transform:"none"}],{duration:s.ms("press","exit")*2,easing:s.easing("enter")})}}}function R(t,e,n={}){let{min:r=0,max:a=100,step:c=1,axis:o="x"}=n,m=$(t,o),u=n.value??r,f=()=>t.style[o==="x"?"left":"top"]=`${(u-r)/(a-r)*100}%`,p=(i,l=!0)=>{let v=Math.max(r,Math.min(a,Math.round((i-r)/c)*c+r));v!==u&&(u=v,f(),l&&n.onChange?.(u))},y=i=>{let l=e.getBoundingClientRect(),v=o==="x"?(i.clientX-l.left)/(l.width||1):(i.clientY-l.top)/(l.height||1);return r+Math.max(0,Math.min(1,v))*(a-r)},g=0,d=i=>{i.preventDefault(),g=o==="x"?i.clientX:i.clientY,t.setPointerCapture?.(i.pointerId);let l=b=>{let L=o==="x"?b.clientX:b.clientY;m.move(L-g),g=L,p(y(b))},v=()=>{t.removeEventListener("pointermove",l),t.removeEventListener("pointerup",v),t.removeEventListener("pointercancel",v),m.release()};t.addEventListener("pointermove",l),t.addEventListener("pointerup",v),t.addEventListener("pointercancel",v)};return t.addEventListener("pointerdown",d),f(),{getValue:()=>u,setValue:i=>p(i,!1),dispose:()=>t.removeEventListener("pointerdown",d)}}function X(t,e){let n=typeof e=="string"?document.createTextNode(e):e;if(!h(t))return t.replaceChildren(n),Promise.resolve();let{swap:r}=s.get().duration,a=s.get().blur;getComputedStyle(t).position==="static"&&(t.style.position="relative");let c=document.createElement("span");c.style.cssText="position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none",c.append(...Array.from(t.childNodes));let o=document.createElement("span");o.style.cssText="display:inline-flex;align-items:center;justify-content:center;max-inline-size:100%",o.append(n),t.replaceChildren(c,o);let m={duration:r,easing:s.easing("move"),fill:"both"},u=c.animate([{opacity:1,filter:"blur(0px)"},{opacity:0,filter:`blur(${a}px)`}],m),f=o.animate([{opacity:0,filter:`blur(${a}px)`},{opacity:1,filter:"blur(0px)"}],m);return Promise.all([E(u),E(f)]).then(()=>{t.replaceChildren(...Array.from(o.childNodes))})}var w=t=>({left:"inset(0 100% 0 0)",right:"inset(0 0 0 100%)",top:"inset(0 0 100% 0)",bottom:"inset(100% 0 0 0)",center:"inset(0 50% 0 50%)"})[t];function Y(t,e="left"){return h(t)?E(t.animate([{clipPath:w(e)},{clipPath:"inset(0 0 0 0)"}],{duration:s.get().duration.reveal,easing:s.easing("enter"),fill:"backwards"})):null}function B(t,e,n="left"){if(!h(t))return t.style.background=e,Promise.resolve();t.style.isolation="isolate",getComputedStyle(t).position==="static"&&(t.style.position="relative");let r=document.createElement("span");r.style.cssText=`position:absolute;inset:0;z-index:-1;border-radius:inherit;background:${e};pointer-events:none`,t.prepend(r);let a=r.animate([{clipPath:w(n)},{clipPath:"inset(0 0 0 0)"}],{duration:s.get().duration.reveal,easing:s.easing("move"),fill:"both"});return E(a).then(()=>{t.style.background=e,r.remove()})}var x=new Map,M={snapshot(t,e){x.set(t,e.getBoundingClientRect())},has:t=>x.has(t),release(t){x.delete(t)},mount(t,e){let n=x.get(t);if(x.delete(t),!n||!h(e))return null;let r=e.getBoundingClientRect(),a=n.width/(r.width||1),c=n.height/(r.height||1),o=P(n.left-r.left,n.top-r.top,0,0,s.get().arc.bend),m=o.map((u,f)=>{let p=f/(o.length-1);return{transform:`translate(${u.x}px, ${u.y}px) scale(${a+(1-a)*p}, ${c+(1-c)*p})`}});return e.style.transformOrigin="0 0",e.animate(m,{duration:s.get().duration.move,easing:s.easing("move"),fill:"backwards"})},transition(t,e,n){return M.snapshot(t,e),M.mount(t,n)}};export{P as a,A as b,C as c,O as d,$ as e,R as f,X as g,Y as h,B as i,M as j};
2
+ //# sourceMappingURL=chunk-6NCXO5ZP.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/motion/extras.ts"],
4
+ "sourcesContent": ["import { motion } from './config';\n\nconst ok = (el: Element): boolean => motion.isOn() && typeof (el as HTMLElement).animate === 'function';\nconst done = (a: Animation): Promise<void> => a.finished.then(() => undefined, () => undefined);\n\ntype Pt = { x: number; y: number };\nconst centerOf = (to: Element | Pt): Pt => {\n if ('getBoundingClientRect' in to) {\n const r = to.getBoundingClientRect();\n return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n }\n return to;\n};\n\n/**\n * Points of a quadratic curve from (x0,y0) to (x1,y1) that bows sideways by `bend` \u00D7 the distance: the path of a thing that\n * is thrown, not slid (rule 7). `steps + 1` points, the first and last are the ends.\n */\nexport function arcPoints(x0: number, y0: number, x1: number, y1: number, bend: number, steps = 16): Pt[] {\n const dx = x1 - x0;\n const dy = y1 - y0;\n const d = Math.hypot(dx, dy) || 1;\n const cx = x0 + dx / 2 - (dy / d) * bend * d;\n const cy = y0 + dy / 2 + (dx / d) * bend * d;\n return Array.from({ length: steps + 1 }, (_, i) => {\n const t = i / steps;\n const u = 1 - t;\n return { x: u * u * x0 + 2 * u * t * cx + t * t * x1, y: u * u * y0 + 2 * u * t * cy + t * t * y1 };\n });\n}\n\n/** Moves an element to a target along an arc, ease-in-out (rules 7 and 9). The element ends at the target; `Animation.cancel()` undoes it. */\nexport function moveArc(el: HTMLElement, to: Element | Pt, o: { bend?: number; duration?: number } = {}): Animation | null {\n if (!ok(el)) return null;\n const a = centerOf(el);\n const b = centerOf(to);\n const frames = arcPoints(0, 0, b.x - a.x, b.y - a.y, o.bend ?? motion.get().arc.bend).map((p) => ({ transform: `translate(${p.x}px, ${p.y}px)` }));\n return el.animate(frames, { duration: o.duration ?? motion.get().duration.move, easing: motion.easing('move'), fill: 'forwards' });\n}\n\n/** Resistance past a limit: the further you pull, the less it moves (never more than `limit`). Pure, for your own drags (rule 19). */\nexport function rubberBand(distance: number, limit: number, resistance = motion.get().rubber.resistance): number {\n const d = Math.abs(distance);\n return Math.sign(distance) * limit * (1 - 1 / ((d * resistance) / limit + 1));\n}\n\n/**\n * Rubber-band overscroll for a scrollable element, only when you push past its start or end (rule 19): the content follows the\n * finger with growing resistance and eases back (no bounce) when you let go. Returns the function that removes it.\n */\nexport function rubberScroll(scroller: HTMLElement, axis: 'y' | 'x' = 'y'): () => void {\n let pull = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const limit = () => (axis === 'y' ? scroller.clientHeight : scroller.clientWidth) * 0.3 || 80;\n const paint = () => (scroller.style.transform = pull ? `translate${axis.toUpperCase()}(${rubberBand(pull, limit())}px)` : '');\n const settle = () => {\n const from = scroller.style.transform || `translate${axis.toUpperCase()}(0px)`;\n pull = 0;\n scroller.style.transform = '';\n if (ok(scroller)) scroller.animate([{ transform: from }, { transform: 'none' }], { duration: motion.get().rubber.settle, easing: motion.easing('enter') });\n };\n const atStart = () => (axis === 'y' ? scroller.scrollTop <= 0 : scroller.scrollLeft <= 0);\n const atEnd = () => (axis === 'y' ? scroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 1 : scroller.scrollLeft + scroller.clientWidth >= scroller.scrollWidth - 1);\n const wheel = (e: WheelEvent) => {\n if (!motion.isOn()) return;\n const d = axis === 'y' ? e.deltaY : e.deltaX;\n // only past an end (or while already pulled): ordinary scrolling is left alone\n if (!((atStart() && d < 0) || (atEnd() && d > 0) || pull !== 0)) return;\n e.preventDefault();\n pull -= d;\n if (atStart() && !atEnd()) pull = Math.max(0, pull);\n if (atEnd() && !atStart()) pull = Math.min(0, pull);\n paint();\n clearTimeout(timer);\n timer = setTimeout(settle, 120);\n };\n let y0: number | null = null;\n const start = (e: TouchEvent) => (y0 = axis === 'y' ? e.touches[0].clientY : e.touches[0].clientX);\n const move = (e: TouchEvent) => {\n if (y0 == null || !motion.isOn()) return;\n const d = (axis === 'y' ? e.touches[0].clientY : e.touches[0].clientX) - y0;\n if ((atStart() && d > 0) || (atEnd() && d < 0)) {\n e.preventDefault();\n pull = d;\n paint();\n }\n };\n const end = () => (pull ? settle() : undefined, (y0 = null));\n scroller.addEventListener('wheel', wheel, { passive: false });\n scroller.addEventListener('touchstart', start, { passive: true });\n scroller.addEventListener('touchmove', move, { passive: false });\n scroller.addEventListener('touchend', end);\n return () => {\n clearTimeout(timer);\n scroller.removeEventListener('wheel', wheel);\n scroller.removeEventListener('touchstart', start);\n scroller.removeEventListener('touchmove', move);\n scroller.removeEventListener('touchend', end);\n };\n}\n\n/**\n * A knob that stretches `stretch.amount` (12 %) along its travel while it moves, from the side it is moving away from, and\n * relaxes when released. While held nothing tweens (rule 14): the stretch follows the pointer directly.\n */\nexport function knobStretch(knob: HTMLElement, axis: 'x' | 'y' = 'x') {\n let last = 0;\n return {\n /** Call with the movement since the last call (px, signed). */\n move(delta: number) {\n if (!motion.isOn() || !delta) return;\n const s = 1 + motion.get().stretch.amount;\n knob.style.transition = 'none';\n knob.style.transformOrigin = axis === 'x' ? (delta > 0 ? 'left center' : 'right center') : delta > 0 ? 'center top' : 'center bottom';\n knob.style.transform = axis === 'x' ? `scaleX(${s})` : `scaleY(${s})`;\n last = delta;\n },\n release() {\n if (!last && !knob.style.transform) return;\n last = 0;\n const from = knob.style.transform;\n knob.style.transform = '';\n knob.style.transition = '';\n if (ok(knob) && from) knob.animate([{ transform: from }, { transform: 'none' }], { duration: motion.ms('press', 'exit') * 2, easing: motion.easing('enter') });\n },\n };\n}\n\n/** Makes `knob` draggable along `track`: value from `min` to `max` in `step`s, the knob positioned in %, stretching as it moves. */\nexport function dragKnob(knob: HTMLElement, track: HTMLElement, o: { min?: number; max?: number; step?: number; value?: number; axis?: 'x' | 'y'; onChange?: (v: number) => void } = {}) {\n const { min = 0, max = 100, step = 1, axis = 'x' } = o;\n const stretch = knobStretch(knob, axis);\n let value = o.value ?? min;\n const place = () => (knob.style[axis === 'x' ? 'left' : 'top'] = `${((value - min) / (max - min)) * 100}%`);\n const set = (v: number, emit = true) => {\n const q = Math.max(min, Math.min(max, Math.round((v - min) / step) * step + min));\n if (q === value) return;\n value = q;\n place();\n if (emit) o.onChange?.(value);\n };\n const at = (e: PointerEvent) => {\n const r = track.getBoundingClientRect();\n const ratio = axis === 'x' ? (e.clientX - r.left) / (r.width || 1) : (e.clientY - r.top) / (r.height || 1);\n return min + Math.max(0, Math.min(1, ratio)) * (max - min);\n };\n let prev = 0;\n const down = (e: PointerEvent) => {\n e.preventDefault();\n prev = axis === 'x' ? e.clientX : e.clientY;\n knob.setPointerCapture?.(e.pointerId);\n const move = (m: PointerEvent) => {\n const p = axis === 'x' ? m.clientX : m.clientY;\n stretch.move(p - prev);\n prev = p;\n set(at(m));\n };\n const up = () => {\n knob.removeEventListener('pointermove', move);\n knob.removeEventListener('pointerup', up);\n knob.removeEventListener('pointercancel', up);\n stretch.release();\n };\n knob.addEventListener('pointermove', move);\n knob.addEventListener('pointerup', up);\n knob.addEventListener('pointercancel', up);\n };\n knob.addEventListener('pointerdown', down);\n place();\n return {\n getValue: () => value,\n setValue: (v: number) => set(v, false),\n dispose: () => knob.removeEventListener('pointerdown', down),\n };\n}\n\n/**\n * Replaces the content of `host` with `next` letting the old and the new coexist for the whole transition: the old fades out\n * while the new fades in, both softly blurred (rules 16 and 18). No flash, no empty frame in between.\n */\nexport function swap(host: HTMLElement, next: Node | string): Promise<void> {\n const node = typeof next === 'string' ? document.createTextNode(next) : next;\n if (!ok(host)) {\n host.replaceChildren(node);\n return Promise.resolve();\n }\n const { swap: dur } = motion.get().duration;\n const b = motion.get().blur;\n if (getComputedStyle(host).position === 'static') host.style.position = 'relative';\n const old = document.createElement('span');\n old.style.cssText = 'position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none';\n old.append(...Array.from(host.childNodes));\n const fresh = document.createElement('span');\n fresh.style.cssText = 'display:inline-flex;align-items:center;justify-content:center;max-inline-size:100%';\n fresh.append(node);\n host.replaceChildren(old, fresh);\n const opts = { duration: dur, easing: motion.easing('move'), fill: 'both' as const };\n const a = old.animate([{ opacity: 1, filter: 'blur(0px)' }, { opacity: 0, filter: `blur(${b}px)` }], opts);\n const c = fresh.animate([{ opacity: 0, filter: `blur(${b}px)` }, { opacity: 1, filter: 'blur(0px)' }], opts);\n return Promise.all([done(a), done(c)]).then(() => {\n host.replaceChildren(...Array.from(fresh.childNodes));\n });\n}\n\ntype From = 'left' | 'right' | 'top' | 'bottom' | 'center';\nconst hidden = (from: From) => ({ left: 'inset(0 100% 0 0)', right: 'inset(0 0 0 100%)', top: 'inset(0 0 100% 0)', bottom: 'inset(100% 0 0 0)', center: 'inset(0 50% 0 50%)' })[from];\n\n/** Reveals an element through a mask that wipes across it (rule 17). */\nexport function reveal(el: HTMLElement, from: From = 'left'): Promise<void> | null {\n if (!ok(el)) return null;\n return done(el.animate([{ clipPath: hidden(from) }, { clipPath: 'inset(0 0 0 0)' }], { duration: motion.get().duration.reveal, easing: motion.easing('enter'), fill: 'backwards' }));\n}\n\n/** Changes an element's background by wiping the new color across it through a mask, instead of fading (rule 17). */\nexport function wipeColor(el: HTMLElement, color: string, from: From = 'left'): Promise<void> {\n if (!ok(el)) {\n el.style.background = color;\n return Promise.resolve();\n }\n el.style.isolation = 'isolate';\n if (getComputedStyle(el).position === 'static') el.style.position = 'relative';\n const layer = document.createElement('span');\n layer.style.cssText = `position:absolute;inset:0;z-index:-1;border-radius:inherit;background:${color};pointer-events:none`;\n el.prepend(layer);\n const a = layer.animate([{ clipPath: hidden(from) }, { clipPath: 'inset(0 0 0 0)' }], { duration: motion.get().duration.reveal, easing: motion.easing('move'), fill: 'both' });\n return done(a).then(() => {\n el.style.background = color;\n layer.remove();\n });\n}\n\nconst rects = new Map<string, DOMRect>();\n\n/**\n * Shared-element transitions by identity (rule 20, \"layoutId\"): `snapshot` the element where it is, show the next screen, and\n * `mount` the element that has the same id there: it flies from the old rectangle to the new one along an arc, ease-in-out.\n */\nexport const layoutId = {\n snapshot(id: string, el: Element): void {\n rects.set(id, el.getBoundingClientRect());\n },\n has: (id: string) => rects.has(id),\n release(id: string): void {\n rects.delete(id);\n },\n mount(id: string, el: HTMLElement): Animation | null {\n const from = rects.get(id);\n rects.delete(id);\n if (!from || !ok(el)) return null;\n const to = el.getBoundingClientRect();\n const sx = from.width / (to.width || 1);\n const sy = from.height / (to.height || 1);\n const pts = arcPoints(from.left - to.left, from.top - to.top, 0, 0, motion.get().arc.bend);\n const frames = pts.map((p, i) => {\n const t = i / (pts.length - 1);\n return { transform: `translate(${p.x}px, ${p.y}px) scale(${sx + (1 - sx) * t}, ${sy + (1 - sy) * t})` };\n });\n el.style.transformOrigin = '0 0';\n return el.animate(frames, { duration: motion.get().duration.move, easing: motion.easing('move'), fill: 'backwards' });\n },\n /** `snapshot` + `mount` in one go, for when the new element already exists. */\n transition(id: string, from: Element, to: HTMLElement): Animation | null {\n layoutId.snapshot(id, from);\n return layoutId.mount(id, to);\n },\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["ok", "el", "motion", "done", "a", "centerOf", "to", "r", "arcPoints", "x0", "y0", "x1", "y1", "bend", "steps", "dx", "dy", "d", "cx", "cy", "_", "i", "t", "u", "moveArc", "o", "b", "frames", "p", "rubberBand", "distance", "limit", "resistance", "rubberScroll", "scroller", "axis", "pull", "timer", "paint", "settle", "from", "atStart", "atEnd", "wheel", "e", "start", "move", "end", "knobStretch", "knob", "last", "delta", "s", "dragKnob", "track", "min", "max", "step", "stretch", "value", "place", "set", "v", "emit", "q", "at", "ratio", "prev", "down", "m", "up", "swap", "host", "next", "node", "dur", "old", "fresh", "opts", "c", "hidden", "reveal", "wipeColor", "color", "layer", "rects", "layoutId", "id", "sx", "sy", "pts"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as n}from"./chunk-2ZRNGG2N.js";import{b as e}from"./chunk-PZSHOSOS.js";import{a as r}from"./chunk-TIPK3SCJ.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-6VBK2I5B.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{a as m}from"./chunk-W3H7GTJY.js";import{f as u}from"./chunk-PZSHOSOS.js";import{a as o}from"./chunk-TIPK3SCJ.js";import{d as a,f as n}from"./chunk-MW3RWBZ7.js";var l=class extends m{baseCls="op-field op-textfield op-numberfield";garbage=!1;emptyValue(){return null}isEmpty(e){return e==null}get decimalSep(){return a()._lang.startsWith("pt")?",":"."}parse(e){this.garbage=!1;let t=e.trim();if(!t)return null;let r=Number(this.decimalSep===","?t.replace(/\./g,"").replace(",","."):t.replace(/,/g,""));return Number.isNaN(r)?(this.garbage=!0,null):r}display(e){if(e==null)return"";let t=this.config.decimals;return(t==null?String(e):e.toFixed(t)).replace(".",this.decimalSep)}createControl(){let e=super.createControl(),t=this.input;return t.setAttribute("inputmode","decimal"),t.setAttribute("role","spinbutton"),this.syncAria(),this.listen(t,"blur",()=>{this.garbage||(this.input.value=this.display(this.value))}),e}syncAria(){let{min:e,max:t}=this.config,r=this.inputEl;e!=null?r.setAttribute("aria-valuemin",String(e)):r.removeAttribute("aria-valuemin"),t!=null?r.setAttribute("aria-valuemax",String(t)):r.removeAttribute("aria-valuemax"),this.value!=null?r.setAttribute("aria-valuenow",String(this.value)):r.removeAttribute("aria-valuenow")}onInput(){super.onInput(),this.syncAria(),this.garbage?this.setError(n("number")):this.error&&this.validate()}applyValue(e){super.applyValue(e),this.garbage=!1,this.syncAria()}check(){if(this.garbage)return n("number");let e=super.check(),t=this.value,{min:r,max:i}=this.config;return e||t==null?e:r!=null&&i!=null&&(t<r||t>i)?n("range",{min:r,max:i}):r!=null&&t<r?n("min",{n:r}):i!=null&&t>i?n("max",{n:i}):""}onKey(e){let t=e.key==="PageUp"||e.key==="PageDown";e.key==="ArrowUp"||e.key==="ArrowDown"||t?(e.preventDefault(),this.bump((e.key.endsWith("Up")?1:-1)*(t?10:1))):super.onKey(e)}bump(e){let{step:t=1,min:r,max:i,decimals:p}=this.config,s=(this.value??0)+t*e;(r!=null||i!=null)&&(s=u(s,r??-1/0,i??1/0)),s=Number(s.toFixed(p??10)),this.setValue(s)}increment(){this.bump(1)}decrement(){this.bump(-1)}setMin(e){this.config.min=e,this.rendered&&this.syncAria()}setMax(e){this.config.max=e,this.rendered&&this.syncAria()}setStep(e){this.config.step=e}setDecimals(e){this.config.decimals=e,this.rendered&&(this.input.value=this.display(this.value))}};o("numberfield",l);export{l as a};
2
+ //# sourceMappingURL=chunk-7KMIFXHZ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/numberfield/numberfield.ts"],
4
+ "sourcesContent": ["import { TextField, type TextFieldConfig } from '../textfield/textfield';\nimport { register } from '../../../core/registry';\nimport { t, getLocale } from '../../../core/i18n';\nimport { clamp } from '../../../core/dom';\n\nexport interface NumberFieldConfig extends TextFieldConfig<number | null> {\n min?: number;\n max?: number;\n step?: number;\n /** Fixed decimals shown (and applied when the user leaves the field). */\n decimals?: number;\n}\n\nexport class NumberField extends TextField<number | null, NumberFieldConfig> {\n protected override baseCls = 'op-field op-textfield op-numberfield';\n /** Text that is not a number: reported as an error instead of silently dropped. */\n private garbage = false;\n\n protected override emptyValue() {\n return null;\n }\n protected override isEmpty(v: number | null) {\n return v == null;\n }\n\n private get decimalSep() {\n return getLocale()._lang.startsWith('pt') ? ',' : '.';\n }\n\n protected override parse(text: string): number | null {\n this.garbage = false;\n const s = text.trim();\n if (!s) return null;\n const n = Number(this.decimalSep === ',' ? s.replace(/\\./g, '').replace(',', '.') : s.replace(/,/g, ''));\n if (Number.isNaN(n)) {\n this.garbage = true;\n return null;\n }\n return n;\n }\n\n protected override display(v: number | null): string {\n if (v == null) return '';\n const d = this.config.decimals;\n return (d == null ? String(v) : v.toFixed(d)).replace('.', this.decimalSep);\n }\n\n protected override createControl() {\n const wrap = super.createControl();\n const i = this.input;\n i.setAttribute('inputmode', 'decimal');\n i.setAttribute('role', 'spinbutton');\n this.syncAria();\n // on blur the text is normalized to the configured decimals\n this.listen(i, 'blur', () => {\n if (!this.garbage) this.input.value = this.display(this.value);\n });\n return wrap;\n }\n\n private syncAria() {\n const { min, max } = this.config;\n const i = this.inputEl;\n if (min != null) i.setAttribute('aria-valuemin', String(min)); else i.removeAttribute('aria-valuemin');\n if (max != null) i.setAttribute('aria-valuemax', String(max)); else i.removeAttribute('aria-valuemax');\n if (this.value != null) i.setAttribute('aria-valuenow', String(this.value)); else i.removeAttribute('aria-valuenow');\n }\n\n protected override onInput() {\n super.onInput();\n this.syncAria();\n if (this.garbage) this.setError(t('number'));\n else if (this.error) this.validate();\n }\n protected override applyValue(v: number | null) {\n super.applyValue(v);\n this.garbage = false;\n this.syncAria();\n }\n\n protected override check(): string {\n if (this.garbage) return t('number');\n const base = super.check();\n const v = this.value;\n const { min, max } = this.config;\n if (base || v == null) return base;\n if (min != null && max != null && (v < min || v > max)) return t('range', { min, max });\n if (min != null && v < min) return t('min', { n: min });\n if (max != null && v > max) return t('max', { n: max });\n return '';\n }\n\n protected override onKey(e: KeyboardEvent) {\n const big = e.key === 'PageUp' || e.key === 'PageDown';\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown' || big) {\n e.preventDefault();\n this.bump((e.key.endsWith('Up') ? 1 : -1) * (big ? 10 : 1));\n } else super.onKey(e);\n }\n\n private bump(times: number) {\n const { step = 1, min, max, decimals } = this.config;\n let n = (this.value ?? 0) + step * times;\n if (min != null || max != null) n = clamp(n, min ?? -Infinity, max ?? Infinity);\n n = Number(n.toFixed(decimals ?? 10));\n this.setValue(n);\n }\n increment() {\n this.bump(1);\n }\n decrement() {\n this.bump(-1);\n }\n\n setMin(min: number | undefined) {\n this.config.min = min;\n if (this.rendered) this.syncAria();\n }\n setMax(max: number | undefined) {\n this.config.max = max;\n if (this.rendered) this.syncAria();\n }\n setStep(step: number) {\n this.config.step = step;\n }\n setDecimals(decimals: number | undefined) {\n this.config.decimals = decimals;\n if (this.rendered) this.input.value = this.display(this.value);\n }\n}\nregister('numberfield', NumberField);\n"],
5
+ "mappings": "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",
6
+ "names": ["NumberField", "TextField", "v", "getLocale", "text", "s", "n", "d", "wrap", "i", "min", "max", "t", "base", "big", "times", "step", "decimals", "clamp", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{b as s,c as l,d as r,e as n}from"./chunk-PZSHOSOS.js";import{a as d,f as h}from"./chunk-MW3RWBZ7.js";var a=class extends d{static type;config;id;parent;rendered=!1;mounted=!1;destroyed=!1;baseCls="op-component";tag="div";_el;disposers=[];mask;constructor(e={}){super(),this.config={...e},this.id=e.id??l("op");for(let t in e.listeners)this.on(t,e.listeners[t])}get el(){return this._el??this.render()}build(){return s(this.tag,this.baseCls)}onRender(){}onMount(){}onDestroy(){}render(){if(this._el)return this._el;let e=this._el=this.build();this.rendered=!0;let t=this.config;if(e.id=this.id,t.cls&&e.classList.add(...t.cls.split(/\s+/).filter(Boolean)),typeof t.style=="string")e.style.cssText+=t.style;else if(t.style)for(let i in t.style)e.style.setProperty(r(i),String(t.style[i]));return t.width!=null&&(e.style.width=n(t.width)),t.height!=null&&(e.style.height=n(t.height)),t.flex!=null&&(e.style.flex=String(t.flex)),t.ariaLabel&&e.setAttribute("aria-label",t.ariaLabel),this.setStableSize(t.stableSize!==!1),t.hidden&&(e.hidden=!0),t.tooltip&&(e.dataset.opTip=t.tooltip),t.theme&&this.setTheme(t.theme),this.onRender(),t.disabled&&this.setDisabled(!0),t.loading&&this.setLoading(t.loading),e}mount(e=document.body){let t=typeof e=="string"?document.querySelector(e):e;if(!t)throw new Error(`Optikos: mount target not found: ${String(e)}`);return t.appendChild(this.el),this.notifyMount(),this}notifyMount(){this.mounted||this.destroyed||(this.mounted=!0,this.onMount(),this.emit("mount"))}destroy(){if(!this.destroyed){this.destroyed=!0,this.onDestroy();for(let e of this.disposers.splice(0).reverse())e();this.parent?.remove(this,!1),this.parent=void 0,this._el?.remove(),this.emit("destroy"),this.clearListeners()}}own(e){return this.disposers.push(e),e}listen(e,t,i,o){return e.addEventListener(t,i,o),this.own(()=>e.removeEventListener(t,i,o))}later(e,t){let i=setTimeout(e,t);return this.own(()=>clearTimeout(i))}onDisabled(e){}setDisabled(e){this.config.disabled=e,this.rendered&&(this.el.classList.toggle("is-disabled",e),this.onDisabled(e))}show(){this.config.hidden=!1,this.rendered&&(this.el.hidden=!1),this.emit("show")}hide(){this.config.hidden=!0,this.rendered&&(this.el.hidden=!0),this.emit("hide")}isHidden(){return!!this.config.hidden}addCls(e){this.el.classList.add(e)}removeCls(e){this.el.classList.remove(e)}toggleCls(e,t){this.el.classList.toggle(e,t)}setWidth(e){this.config.width=e,this.rendered&&(this.el.style.width=n(e))}setHeight(e){this.config.height=e,this.rendered&&(this.el.style.height=n(e))}setFlex(e){this.config.flex=e,this.rendered&&(this.el.style.flex=String(e))}setStableSize(e){this.config.stableSize=e,this.rendered&&this.el.classList.toggle("op-stable",e)}setTooltip(e){this.config.tooltip=e,this.rendered&&(e?this.el.dataset.opTip=e:delete this.el.dataset.opTip)}setTheme(e){let t="--"+this.baseCls+"-";for(let i in e)this.el.style.setProperty(i.startsWith("--")?i:t+r(i),String(e[i]))}setLoading(e){if(this.config.loading=e,!this.rendered)return;let t=this.el;this.mask?.remove(),this.mask=void 0,t.classList.toggle("is-loading",!!e),e?t.setAttribute("aria-busy","true"):t.removeAttribute("aria-busy"),e&&(this.mask=s("div","op-mask",{},s("span","op-spinner",{role:"progressbar","aria-label":h("loading")}),typeof e=="string"?s("div","op-mask__text",{},e):null),t.append(this.mask));for(let i of Array.from(t.children))i!==this.mask&&i.toggleAttribute("inert",!!e)}focusEl(){return this.el}focus(){this.focusEl().focus()}};export{a};
2
+ //# sourceMappingURL=chunk-A2NKDOYN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/component.ts"],
4
+ "sourcesContent": ["import { Emitter, type Handler } from './emitter';\nimport { h, uid, kebab, px } from './dom';\nimport { t } from './i18n';\n\nexport interface ComponentConfig {\n type?: string;\n id?: string;\n cls?: string;\n style?: string | Record<string, string | number>;\n hidden?: boolean;\n disabled?: boolean;\n width?: number | string;\n height?: number | string;\n flex?: number | string;\n tooltip?: string;\n /** Inside a Form: shown only while this returns true (given the form values). A field hidden this way neither validates nor goes into `getValues`. */\n showIf?: (values: Record<string, any>) => boolean;\n /** Inside a Form: enabled only while this returns true (given the form values). */\n enableIf?: (values: Record<string, any>) => boolean;\n /** Component-scoped tokens: `{ radius: '0' }` on a button sets `--op-button-radius`. Keys starting with `--` are used as is. */\n theme?: Record<string, string | number>;\n /**\n * Default `true`: the component keeps its size when only its *state* changes (loading, searching, invalid).\n * The CSS reserves room for the state's extra content instead of growing. `false` lets it fit the content.\n * Does not apply to new *content* (`setText` with a longer text).\n */\n stableSize?: boolean;\n /** `true` or a text: shows a mask with a spinner over the component. */\n loading?: boolean | string;\n ariaLabel?: string;\n /** Layout `border`: where the item goes. */\n region?: 'north' | 'south' | 'west' | 'east' | 'center';\n /** Layout `grid`: columns spanned; `'full'` takes the whole row. */\n colspan?: number | 'full';\n listeners?: Record<string, Handler>;\n renderTo?: string | HTMLElement;\n /** Free slot for application data. */\n data?: unknown;\n}\n\n/** Anything that owns children (Container) and accepts being asked to drop one. */\nexport interface Parent {\n remove(child: Component, destroy?: boolean): unknown;\n}\n\nexport class Component<C extends ComponentConfig = ComponentConfig> extends Emitter {\n static type?: string;\n config: C;\n readonly id: string;\n parent?: Component & Parent;\n rendered = false;\n mounted = false;\n destroyed = false;\n protected baseCls = 'op-component';\n protected tag: keyof HTMLElementTagNameMap = 'div';\n private _el?: HTMLElement;\n private disposers: Array<() => void> = [];\n private mask?: HTMLElement;\n\n constructor(config: C = {} as C) {\n super();\n this.config = { ...config };\n this.id = config.id ?? uid('op');\n for (const k in config.listeners) this.on(k, config.listeners[k]);\n }\n\n /** The root element. Built on first access. */\n get el(): HTMLElement {\n return this._el ?? this.render();\n }\n\n // ---- lifecycle (template method) ----------------------------------------------------------\n\n /** Builds the root element. Subclasses override to create their own DOM. */\n protected build(): HTMLElement {\n return h(this.tag, this.baseCls);\n }\n protected onRender(): void {}\n protected onMount(): void {}\n protected onDestroy(): void {}\n\n /** Builds the DOM once. Safe to call repeatedly. */\n render(): HTMLElement {\n if (this._el) return this._el;\n const el = (this._el = this.build());\n this.rendered = true;\n const c = this.config;\n el.id = this.id;\n if (c.cls) el.classList.add(...c.cls.split(/\\s+/).filter(Boolean));\n if (typeof c.style === 'string') el.style.cssText += c.style;\n else if (c.style) for (const k in c.style) el.style.setProperty(kebab(k), String(c.style[k]));\n if (c.width != null) el.style.width = px(c.width);\n if (c.height != null) el.style.height = px(c.height);\n if (c.flex != null) el.style.flex = String(c.flex);\n if (c.ariaLabel) el.setAttribute('aria-label', c.ariaLabel);\n this.setStableSize(c.stableSize !== false);\n if (c.hidden) el.hidden = true;\n if (c.tooltip) el.dataset.opTip = c.tooltip;\n if (c.theme) this.setTheme(c.theme);\n this.onRender();\n if (c.disabled) this.setDisabled(true);\n if (c.loading) this.setLoading(c.loading);\n return el;\n }\n\n /** Appends to a target (default `document.body`) and fires `onMount` for the whole subtree. */\n mount(target: string | HTMLElement = document.body): this {\n const parent = typeof target === 'string' ? document.querySelector<HTMLElement>(target) : target;\n if (!parent) throw new Error(`Optikos: mount target not found: ${String(target)}`);\n parent.appendChild(this.el);\n this.notifyMount();\n return this;\n }\n\n /** Called when the element becomes part of a mounted tree. Containers override to reach children. */\n notifyMount(): void {\n if (this.mounted || this.destroyed) return;\n this.mounted = true;\n this.onMount();\n this.emit('mount');\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.onDestroy();\n for (const d of this.disposers.splice(0).reverse()) d();\n this.parent?.remove(this, false);\n this.parent = undefined;\n this._el?.remove();\n this.emit('destroy');\n this.clearListeners();\n }\n\n // ---- resources released on destroy --------------------------------------------------------\n\n /** Registers a function to run on `destroy` (listeners, timers, effects). Returns it. */\n own<F extends () => void>(fn: F): F {\n this.disposers.push(fn);\n return fn;\n }\n\n /** Adds a DOM listener released on `destroy`. */\n listen(target: EventTarget, type: string, fn: (e: any) => void, opts?: AddEventListenerOptions | boolean): () => void {\n target.addEventListener(type, fn, opts);\n return this.own(() => target.removeEventListener(type, fn, opts));\n }\n\n /** `setTimeout` released on `destroy`; returns the cancel function. */\n later(fn: () => void, ms: number): () => void {\n const id = setTimeout(fn, ms);\n return this.own(() => clearTimeout(id));\n }\n\n // ---- common state / setters ---------------------------------------------------------------\n\n protected onDisabled(_disabled: boolean): void {}\n\n setDisabled(disabled: boolean): void {\n this.config.disabled = disabled;\n if (!this.rendered) return;\n this.el.classList.toggle('is-disabled', disabled);\n this.onDisabled(disabled);\n }\n\n show(): void {\n this.config.hidden = false;\n if (this.rendered) this.el.hidden = false;\n this.emit('show');\n }\n hide(): void {\n this.config.hidden = true;\n if (this.rendered) this.el.hidden = true;\n this.emit('hide');\n }\n isHidden(): boolean {\n return !!this.config.hidden;\n }\n\n addCls(name: string): void {\n this.el.classList.add(name);\n }\n removeCls(name: string): void {\n this.el.classList.remove(name);\n }\n toggleCls(name: string, on?: boolean): void {\n this.el.classList.toggle(name, on);\n }\n\n setWidth(v: number | string): void {\n this.config.width = v;\n if (this.rendered) this.el.style.width = px(v);\n }\n setHeight(v: number | string): void {\n this.config.height = v;\n if (this.rendered) this.el.style.height = px(v);\n }\n setFlex(v: number | string): void {\n this.config.flex = v;\n if (this.rendered) this.el.style.flex = String(v);\n }\n\n setStableSize(stable: boolean): void {\n this.config.stableSize = stable;\n if (this.rendered) this.el.classList.toggle('op-stable', stable);\n }\n\n setTooltip(text: string): void {\n this.config.tooltip = text;\n if (!this.rendered) return;\n if (text) this.el.dataset.opTip = text;\n else delete this.el.dataset.opTip;\n }\n\n setTheme(theme: Record<string, string | number>): void {\n const prefix = '--' + this.baseCls + '-';\n for (const k in theme) this.el.style.setProperty(k.startsWith('--') ? k : prefix + kebab(k), String(theme[k]));\n }\n\n /** Shows (or removes) a loading mask. A string is shown as text under the spinner. */\n setLoading(loading: boolean | string): void {\n this.config.loading = loading;\n if (!this.rendered) return;\n const el = this.el;\n this.mask?.remove();\n this.mask = undefined;\n el.classList.toggle('is-loading', !!loading);\n if (loading) el.setAttribute('aria-busy', 'true');\n else el.removeAttribute('aria-busy');\n if (loading) {\n this.mask = h('div', 'op-mask', {}, h('span', 'op-spinner', { role: 'progressbar', 'aria-label': t('loading') }), typeof loading === 'string' ? h('div', 'op-mask__text', {}, loading) : null);\n el.append(this.mask);\n }\n for (const child of Array.from(el.children)) if (child !== this.mask) child.toggleAttribute('inert', !!loading);\n }\n\n /** The element that receives focus on `focus()`. */\n protected focusEl(): HTMLElement {\n return this.el;\n }\n focus(): void {\n this.focusEl().focus();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Component", "Emitter", "config", "uid", "k", "h", "el", "c", "kebab", "px", "target", "parent", "d", "fn", "type", "opts", "ms", "id", "_disabled", "disabled", "name", "on", "v", "stable", "text", "theme", "prefix", "loading", "t", "child"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as c}from"./chunk-HXDTGP2K.js";import{a as R}from"./chunk-VU3GIDZ3.js";import{a as u}from"./chunk-6VBK2I5B.js";import{a as k}from"./chunk-NXSTUFS7.js";import{a as C}from"./chunk-G2KUK6AT.js";import{a as S}from"./chunk-Z2Z52GFT.js";import{a}from"./chunk-XHOBNSBO.js";import{a as l}from"./chunk-I4SP6JTU.js";import{a as d}from"./chunk-OGRFQTXA.js";import{a as x}from"./chunk-JI265XFO.js";import{a as y}from"./chunk-EDUMAMK4.js";import{a as L}from"./chunk-JK74QK3M.js";import{a as w}from"./chunk-GBPLNXMP.js";import{a as b}from"./chunk-TZOQWCVH.js";import{a as h}from"./chunk-LQRFNQ2N.js";import{a as T}from"./chunk-GNU4VOOE.js";import{a as f}from"./chunk-7KMIFXHZ.js";import{a as m}from"./chunk-3TAW4AKH.js";import{a as p}from"./chunk-W3H7GTJY.js";import{c as s}from"./chunk-ZWNQREWS.js";import{a as g}from"./chunk-2ZUZ5HDL.js";var n=(t,e,o,r={})=>new t({name:e,label:o,...r}),v={text:(t,e,o)=>n(p,t,e,o),email:(t,e,o)=>n(p,t,e,{inputType:"email",...o}),password:(t,e,o)=>n(p,t,e,{inputType:"password",...o}),area:(t,e,o)=>n(a,t,e,o),number:(t,e,o)=>n(f,t,e,o),date:(t,e,o)=>n(m,t,e,o),dateRange:(t,e,o)=>n(y,t,e,o),secret:(t,e,o)=>n(k,t,e,o),slider:(t,e,o)=>n(S,t,e,o),dial:(t,e,o)=>n(L,t,e,o),check:(t,e,o)=>n(l,t,void 0,{boxLabel:e,...o}),toggle:(t,e,o)=>n(c,t,void 0,{boxLabel:e,...o}),radio:(t,e,o,r)=>n(u,t,e,{options:o,...r}),checkGroup:(t,e,o,r)=>n(d,t,e,{options:o,...r}),select:(t,e,o,r)=>n(C,t,e,{options:o,...r}),combo:(t,e,o,r)=>n(x,t,e,{options:o,...r}),suggest:(t,e,o,r)=>n(b,t,e,{query:o,...r}),lookup:(t,e,o,r)=>n(w,t,e,{lookup:o,...r}),button:(t,e,o)=>new g({text:t,handler:e,...o}),primary:(t,e,o)=>new g({text:t,handler:e,variant:"primary",...o}),danger:(t,e,o)=>new g({text:t,handler:e,variant:"danger",...o}),row:(...t)=>new s({layout:"hbox",items:t}),col:(...t)=>new s({layout:"vbox",items:t}),grid:(t,...e)=>new s({layout:{type:"grid",columns:t},items:e}),panel:(t,e,o)=>new h({title:t,items:e,...o}),toolbar:(...t)=>new T({items:t}),form:(t,e)=>new R({items:t,...e})};var i=t=>t,Y=i({Default:"default",Primary:"primary",Danger:"danger",Ghost:"ghost"}),Z=i({Top:"top",Left:"left"}),_=i({Vertical:"vertical",Horizontal:"horizontal"}),$=i({North:"north",South:"south",West:"west",East:"east",Center:"center"}),tt=i({Right:"right",Left:"left",Top:"top",Bottom:"bottom"}),et=i({Fit:"fit",HBox:"hbox",VBox:"vbox",Border:"border",Grid:"grid",Card:"card"}),ot=i({None:"none",Single:"single",Multi:"multi"}),nt=i({Info:"info",Success:"success",Warning:"warning",Error:"error"}),rt=i({Eq:"eq",Ne:"ne",Contains:"contains",NotContains:"notContains",StartsWith:"startsWith",EndsWith:"endsWith",Gt:"gt",Ge:"ge",Lt:"lt",Le:"le",Between:"between",NotBetween:"notBetween",In:"in",Nin:"nin",Empty:"empty",NotEmpty:"notEmpty"}),it=i({Light:"light",Dark:"dark"});export{v as a,Y as b,Z as c,_ as d,$ as e,tt as f,et as g,ot as h,nt as i,rt as j,it as k};
2
+ //# sourceMappingURL=chunk-ATFJ7PNA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/ui/ui.ts", "../src/ui/enums.ts"],
4
+ "sourcesContent": ["// Short constructors for the things you write most. They return real component instances (the classes), so they can be\n// used anywhere a config goes: `items: [ui.text('name', 'Name', { required: true }), ui.select('plan', 'Plan', ['Free', 'Pro'])]`.\n// The last argument is always a config object that overrides or adds anything (`{ required: true, help: '\u2026' }`).\nimport { TextField, type TextFieldConfig } from '../components/fields/textfield/textfield';\nimport { TextArea } from '../components/fields/textarea/textarea';\nimport { NumberField } from '../components/fields/numberfield/numberfield';\nimport { DateField } from '../components/fields/datefield/datefield';\nimport { DateRangeField } from '../components/fields/daterangefield/daterangefield';\nimport { Checkbox } from '../components/fields/checkbox/checkbox';\nimport { Toggle } from '../components/fields/toggle/toggle';\nimport { CheckboxGroup } from '../components/fields/checkboxgroup/checkboxgroup';\nimport { RadioGroup, type RadioOption } from '../components/fields/radiogroup/radiogroup';\nimport { Select } from '../components/fields/select/select';\nimport { ComboBox } from '../components/fields/combobox/combobox';\nimport { SuggestField } from '../components/fields/suggestfield/suggestfield';\nimport { LookupField } from '../components/fields/lookupfield/lookupfield';\nimport { SecretField } from '../components/fields/secretfield/secretfield';\nimport { Slider } from '../components/fields/slider/slider';\nimport { Dial } from '../components/fields/dial/dial';\nimport { Button } from '../components/base/button/button';\nimport { Panel } from '../components/layout/panel/panel';\nimport { Toolbar } from '../components/layout/toolbar/toolbar';\nimport { Container } from '../core/container';\nimport { Form } from '../components/form/form/form';\nimport type { Component } from '../core/component';\nimport type { AnyConfig } from '../core/registry';\nimport type { Variant } from './enums';\n\ntype Cfg = Record<string, any>;\n// anything a container takes: an instance, a declarative config ({ type: 'fieldset', ... }) or a toolbar string ('->', '-')\ntype Item = Component | AnyConfig | string;\ntype Options = (string | number | { value: unknown; label: string; disabled?: boolean })[];\n\nconst field = <T>(Cls: new (c: any) => T, name: string, label: string | undefined, c: Cfg = {}): T => new Cls({ name, label, ...c });\n\nexport const ui = {\n // ---- fields: (name, label, config?) ----\n text: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, c),\n email: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'email', ...c } satisfies TextFieldConfig),\n password: (name: string, label?: string, c?: Cfg) => field(TextField, name, label, { inputType: 'password', ...c }),\n area: (name: string, label?: string, c?: Cfg) => field(TextArea, name, label, c),\n number: (name: string, label?: string, c?: Cfg) => field(NumberField, name, label, c),\n date: (name: string, label?: string, c?: Cfg) => field(DateField, name, label, c),\n dateRange: (name: string, label?: string, c?: Cfg) => field(DateRangeField, name, label, c),\n secret: (name: string, label?: string, c?: Cfg) => field(SecretField, name, label, c),\n slider: (name: string, label?: string, c?: Cfg) => field(Slider, name, label, c),\n dial: (name: string, label?: string, c?: Cfg) => field(Dial, name, label, c),\n /** `boxLabel` is the text beside the box. */\n check: (name: string, boxLabel?: string, c?: Cfg) => field(Checkbox, name, undefined, { boxLabel, ...c }),\n /** An on/off switch; `boxLabel` is the text beside it. */\n toggle: (name: string, boxLabel?: string, c?: Cfg) => field(Toggle, name, undefined, { boxLabel, ...c }),\n radio: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(RadioGroup, name, label, { options, ...c }),\n /** Several choices; the value is the list of checked values. */\n checkGroup: (name: string, label: string, options: RadioOption[], c?: Cfg) => field(CheckboxGroup, name, label, { options, ...c }),\n select: (name: string, label: string, options: Options, c?: Cfg) => field(Select, name, label, { options, ...c }),\n combo: (name: string, label: string, options: Options, c?: Cfg) => field(ComboBox, name, label, { options, ...c }),\n suggest: (name: string, label: string, query: (text: string, o: { signal: AbortSignal }) => unknown, c?: Cfg) => field(SuggestField, name, label, { query, ...c }),\n /** `lookup` is a LookupDef or the name given to `registerLookup`. */\n lookup: (name: string, label: string, lookup: Cfg | string, c?: Cfg) => field(LookupField, name, label, { lookup, ...c }),\n\n // ---- actions ----\n button: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, ...c }),\n primary: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'primary' satisfies Variant, ...c }),\n danger: (text: string, handler?: (b: Button, ev: MouseEvent) => unknown, c?: Cfg) => new Button({ text, handler, variant: 'danger' satisfies Variant, ...c }),\n\n // ---- structure ----\n row: (...items: Item[]) => new Container({ layout: 'hbox', items } as Cfg),\n col: (...items: Item[]) => new Container({ layout: 'vbox', items } as Cfg),\n /** `columns`: a number (equal columns, one column on narrow containers) or a CSS `grid-template-columns`. */\n grid: (columns: number | string, ...items: Item[]) => new Container({ layout: { type: 'grid', columns }, items } as Cfg),\n panel: (title: string, items: Item[], c?: Cfg) => new Panel({ title, items, ...c } as Cfg),\n toolbar: (...items: Item[]) => new Toolbar({ items } as Cfg),\n form: (items: Item[], c?: Cfg) => new Form({ items, ...c } as Cfg),\n};\n", "// Named values for the options that are plain strings in configs. Each is a const object plus a type of the same name,\n// so `Variant.Primary` and `'primary'` are interchangeable: use whichever you like, the editor completes both.\nconst e = <T extends Record<string, string>>(o: T) => o;\n\nexport const Variant = e({ Default: 'default', Primary: 'primary', Danger: 'danger', Ghost: 'ghost' } as const);\nexport type Variant = (typeof Variant)[keyof typeof Variant];\n\nexport const LabelPos = e({ Top: 'top', Left: 'left' } as const);\nexport type LabelPos = (typeof LabelPos)[keyof typeof LabelPos];\n\nexport const Direction = e({ Vertical: 'vertical', Horizontal: 'horizontal' } as const);\nexport type Direction = (typeof Direction)[keyof typeof Direction];\n\n/** Layout `border` regions. */\nexport const Region = e({ North: 'north', South: 'south', West: 'west', East: 'east', Center: 'center' } as const);\nexport type Region = (typeof Region)[keyof typeof Region];\n\n/** Widget sides. */\nexport const Side = e({ Right: 'right', Left: 'left', Top: 'top', Bottom: 'bottom' } as const);\nexport type Side = (typeof Side)[keyof typeof Side];\n\nexport const LayoutKind = e({ Fit: 'fit', HBox: 'hbox', VBox: 'vbox', Border: 'border', Grid: 'grid', Card: 'card' } as const);\nexport type LayoutKind = (typeof LayoutKind)[keyof typeof LayoutKind];\n\nexport const Selection = e({ None: 'none', Single: 'single', Multi: 'multi' } as const);\nexport type Selection = (typeof Selection)[keyof typeof Selection];\n\nexport const ToastType = e({ Info: 'info', Success: 'success', Warning: 'warning', Error: 'error' } as const);\nexport type ToastType = (typeof ToastType)[keyof typeof ToastType];\n\n/** Filter operators (Store.filter, FilterBuilder, lookup filters). */\nexport const Op = e({\n Eq: 'eq', Ne: 'ne', Contains: 'contains', NotContains: 'notContains', StartsWith: 'startsWith', EndsWith: 'endsWith',\n Gt: 'gt', Ge: 'ge', Lt: 'lt', Le: 'le', Between: 'between', NotBetween: 'notBetween', In: 'in', Nin: 'nin', Empty: 'empty', NotEmpty: 'notEmpty',\n} as const);\nexport type Op = (typeof Op)[keyof typeof Op];\n\n/** The shipped themes (`setTheme(ThemeName.Dark)`; add `' compact'` for the dense variant). */\nexport const ThemeName = e({ Light: 'light', Dark: 'dark' } as const);\nexport type ThemeName = (typeof ThemeName)[keyof typeof ThemeName];\n"],
5
+ "mappings": "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",
6
+ "names": ["field", "Cls", "name", "label", "c", "ui", "TextField", "TextArea", "NumberField", "DateField", "DateRangeField", "SecretField", "Slider", "Dial", "boxLabel", "Checkbox", "Toggle", "options", "RadioGroup", "CheckboxGroup", "Select", "ComboBox", "query", "SuggestField", "lookup", "LookupField", "text", "handler", "Button", "items", "Container", "columns", "title", "Panel", "Toolbar", "Form", "e", "o", "Variant", "LabelPos", "Direction", "Region", "Side", "LayoutKind", "Selection", "ToastType", "Op", "ThemeName"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as v}from"./chunk-KLLAY2IM.js";import{a as m}from"./chunk-FHM5NUS4.js";import{a as w}from"./chunk-2ZUZ5HDL.js";import{a as f}from"./chunk-A2NKDOYN.js";import{b as u}from"./chunk-PZSHOSOS.js";import{a as c}from"./chunk-TIPK3SCJ.js";import{e as d,f as n}from"./chunk-MW3RWBZ7.js";d("en",{views:"Views",viewsName:"Name for this view",viewsSave:"Save view",viewsSaveAs:"Save as new view\u2026",viewsDefault:"Open with this view",viewsDelete:"Delete view",viewsConfirmDelete:'Delete the view "{n}"?',viewsReset:"Reset to initial"});d("pt-BR",{views:"Vis\xF5es",viewsName:"Nome desta vis\xE3o",viewsSave:"Salvar vis\xE3o",viewsSaveAs:"Salvar como nova vis\xE3o\u2026",viewsDefault:"Abrir com esta vis\xE3o",viewsDelete:"Excluir vis\xE3o",viewsConfirmDelete:'Excluir a vis\xE3o "{n}"?',viewsReset:"Voltar ao inicial"});var g=()=>globalThis.crypto?.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function M(a,e=localStorage){let t=()=>{try{let s=JSON.parse(e.getItem(a)??"[]");return Array.isArray(s)?s:[]}catch{return[]}},i=s=>e.setItem(a,JSON.stringify(s));return{list:t,save(s){let r={...s,id:s.id??g()},o=t(),h=o.findIndex(p=>p.id===r.id);return h<0?o.push(r):o[h]=r,i(o),r},remove(s){i(t().filter(r=>r.id!==s.id))}}}function P(a){let e=async(t,i="",s)=>{let r=await(a.fetch??fetch)(a.url+i,{method:t,headers:{"Content-Type":"application/json",...a.headers},body:s===void 0?void 0:JSON.stringify(s)});if(!r.ok)throw new Error(`Optikos views: ${t} ${a.url+i} \u2192 ${r.status}`);return r.status===204?void 0:r.json().catch(()=>{})};return{list:()=>e("GET"),save:t=>t.id?e("PUT",`/${encodeURIComponent(t.id)}`,t):e("POST","",t),remove:t=>e("DELETE",`/${encodeURIComponent(t.id)}`).then(()=>{})}}var l=class extends f{baseCls="op-viewmanager";btn;menu;views=[];current;initial={};build(){return this.btn=new w({text:n("views"),icon:"menu",variant:"ghost",handler:()=>this.openMenu()}),this.btn.el.setAttribute("aria-haspopup","menu"),this.own(()=>(this.btn.destroy(),this.menu?.destroy())),u("span",this.baseCls,{},this.btn.el)}onRender(){this.config.grid.render(),this.config.filters?.render(),this.initial=this.getState(),this.config.autoLoad!==!1&&this.reload()}notifyMount(){super.notifyMount(),this.btn.notifyMount()}getState(){let{grid:e,filters:t,extra:i}=this.config,s={columns:e.getColumnState(),filter:t?.getFilter()??null,sorters:[...e.getStore().getSorters()]};return i&&(s.extra=Object.fromEntries(Object.entries(i).map(([r,o])=>[r,o.get()]))),s}setState(e){let{grid:t,filters:i,extra:s}=this.config;e.columns&&t.setColumnState(e.columns);let r=e.sorters?.[0];t.getStore().sort(r?.field??null,r?.dir),i&&(i.setFilter(e.filter??null),i.apply());for(let o in e.extra)s?.[o]?.set(e.extra[o])}getViews(){return this.views}getCurrent(){return this.current}async reload(){await this.run(async()=>{this.views=await this.config.storage.list()??[],this.current=this.current&&this.views.find(t=>t.id===this.current.id);let e=this.views.find(t=>t.default);!this.current&&e&&this.config.autoLoad!==!1&&this.apply(e),this.paint()}),this.emit("load",this.views)}apply(e){let t=typeof e=="string"?this.views.find(i=>i.id===e):e;!t||this.emit("before-apply",t)===!1||(this.current=t,this.setState(t.state),this.paint(),this.emit("apply",t))}async save(){if(!this.current)return this.saveAs();await this.store({...this.current,state:this.getState()})}async saveAs(e){if(e??=await v.prompt(n("viewsName"),{title:n("viewsSaveAs")})??"",e=e.trim(),!e)return;let t=this.views.find(i=>i.name.toLowerCase()===e.toLowerCase());await this.store({...t,name:e,state:this.getState()})}async setDefault(e=!0){if(this.current){for(let t of this.views)t!==this.current&&t.default&&await this.store({...t,default:!1},!1);await this.store({...this.current,default:e})}}async remove(e=this.current){!e||!await v.confirm(n("viewsConfirmDelete",{n:e.name}),{danger:!0,okText:n("viewsDelete")})||await this.run(async()=>{await this.config.storage.remove(e),this.views=this.views.filter(t=>t!==e&&t.id!==e.id),this.current?.id===e.id&&(this.current=void 0),this.paint(),this.emit("remove",e)})}reset(){this.current=void 0,this.setState(this.initial),this.paint(),this.emit("reset")}async store(e,t=!0){await this.run(async()=>{let i=await this.config.storage.save(e)||e,s=this.views.findIndex(r=>i.id&&r.id===i.id||r===e);s<0?this.views.push(i):this.views[s]=i,t&&(this.current=i),this.paint(),this.emit("save",i)})}async run(e){try{await e()}catch(t){this.emit("error",t)}}paint(){this.btn.setText(this.current?.name??n("views"))}openMenu(){let e=this.current,t=[...this.views.map(i=>({text:i.default?`${i.name} \u2605`:i.name,checked:i===e||!!e?.id&&i.id===e.id,handler:()=>this.apply(i)})),...this.views.length?["-"]:[],{text:n("viewsSave"),handler:()=>{this.save()}},{text:n("viewsSaveAs"),handler:()=>{this.saveAs()}},...e?[{text:n("viewsDefault"),checked:!!e.default,handler:()=>{this.setDefault(!e.default)}},{text:n("viewsDelete"),handler:()=>{this.remove()}}]:[],"-",{text:n("viewsReset"),handler:()=>this.reset()}];this.menu??=new m({}),this.menu.setItems(t),this.menu.showBy(this.btn.el)}};c("viewmanager",l);export{M as a,P as b,l as c};
2
+ //# sourceMappingURL=chunk-BXYWVRKJ.js.map