optikos 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +211 -2
  4. package/THIRD_PARTY_NOTICES.md +83 -0
  5. package/dist/bind.js +2 -0
  6. package/dist/bind.js.map +7 -0
  7. package/dist/chunk-2UPUC4RK.js +2 -0
  8. package/dist/chunk-2UPUC4RK.js.map +7 -0
  9. package/dist/chunk-4AA4FQEM.js +2 -0
  10. package/dist/chunk-4AA4FQEM.js.map +7 -0
  11. package/dist/chunk-4C666HHU.js +2 -0
  12. package/dist/chunk-4C666HHU.js.map +7 -0
  13. package/dist/chunk-4COBH4QJ.js +2 -0
  14. package/dist/chunk-4COBH4QJ.js.map +7 -0
  15. package/dist/chunk-4DHQKECB.js +2 -0
  16. package/dist/chunk-4DHQKECB.js.map +7 -0
  17. package/dist/chunk-4Q67QI7J.js +2 -0
  18. package/dist/chunk-4Q67QI7J.js.map +7 -0
  19. package/dist/chunk-4SUKNSCY.js +2 -0
  20. package/dist/chunk-4SUKNSCY.js.map +7 -0
  21. package/dist/chunk-5AXLYDKU.js +2 -0
  22. package/dist/chunk-5AXLYDKU.js.map +7 -0
  23. package/dist/chunk-5GNEFX6F.js +2 -0
  24. package/dist/chunk-5GNEFX6F.js.map +7 -0
  25. package/dist/chunk-5Q6Y6CM4.js +2 -0
  26. package/dist/chunk-5Q6Y6CM4.js.map +7 -0
  27. package/dist/chunk-666O2GKD.js +2 -0
  28. package/dist/chunk-666O2GKD.js.map +7 -0
  29. package/dist/chunk-676AKAGF.js +2 -0
  30. package/dist/chunk-676AKAGF.js.map +7 -0
  31. package/dist/chunk-6NCXO5ZP.js +2 -0
  32. package/dist/chunk-6NCXO5ZP.js.map +7 -0
  33. package/dist/chunk-6NJW7QFD.js +2 -0
  34. package/dist/chunk-6NJW7QFD.js.map +7 -0
  35. package/dist/chunk-6O2BXCRN.js +2 -0
  36. package/dist/chunk-6O2BXCRN.js.map +7 -0
  37. package/dist/chunk-A66MDXHL.js +2 -0
  38. package/dist/chunk-A66MDXHL.js.map +7 -0
  39. package/dist/chunk-ARCW54L2.js +2 -0
  40. package/dist/chunk-ARCW54L2.js.map +7 -0
  41. package/dist/chunk-BIYNHKSA.js +2 -0
  42. package/dist/chunk-BIYNHKSA.js.map +7 -0
  43. package/dist/chunk-BNPVRIFT.js +2 -0
  44. package/dist/chunk-BNPVRIFT.js.map +7 -0
  45. package/dist/chunk-C3N7QTQB.js +2 -0
  46. package/dist/chunk-C3N7QTQB.js.map +7 -0
  47. package/dist/chunk-CEXY5A4T.js +2 -0
  48. package/dist/chunk-CEXY5A4T.js.map +7 -0
  49. package/dist/chunk-CN7USUJR.js +2 -0
  50. package/dist/chunk-CN7USUJR.js.map +7 -0
  51. package/dist/chunk-CQRHNTEX.js +2 -0
  52. package/dist/chunk-CQRHNTEX.js.map +7 -0
  53. package/dist/chunk-CUPAPOKC.js +2 -0
  54. package/dist/chunk-CUPAPOKC.js.map +7 -0
  55. package/dist/chunk-DXO3UJKL.js +2 -0
  56. package/dist/chunk-DXO3UJKL.js.map +7 -0
  57. package/dist/chunk-GZNQPENR.js +2 -0
  58. package/dist/chunk-GZNQPENR.js.map +7 -0
  59. package/dist/chunk-HFFK6K4K.js +2 -0
  60. package/dist/chunk-HFFK6K4K.js.map +7 -0
  61. package/dist/chunk-IHAYOSBR.js +2 -0
  62. package/dist/chunk-IHAYOSBR.js.map +7 -0
  63. package/dist/chunk-IO66A6G5.js +2 -0
  64. package/dist/chunk-IO66A6G5.js.map +7 -0
  65. package/dist/chunk-IW7PK4VS.js +2 -0
  66. package/dist/chunk-IW7PK4VS.js.map +7 -0
  67. package/dist/chunk-IYPKPLCU.js +2 -0
  68. package/dist/chunk-IYPKPLCU.js.map +7 -0
  69. package/dist/chunk-JTYWZMSZ.js +2 -0
  70. package/dist/chunk-JTYWZMSZ.js.map +7 -0
  71. package/dist/chunk-JVEPKW5X.js +2 -0
  72. package/dist/chunk-JVEPKW5X.js.map +7 -0
  73. package/dist/chunk-JZNEB7A7.js +2 -0
  74. package/dist/chunk-JZNEB7A7.js.map +7 -0
  75. package/dist/chunk-K2DGY6MP.js +2 -0
  76. package/dist/chunk-K2DGY6MP.js.map +7 -0
  77. package/dist/chunk-LBCWEWPN.js +2 -0
  78. package/dist/chunk-LBCWEWPN.js.map +7 -0
  79. package/dist/chunk-LEE2FEEL.js +2 -0
  80. package/dist/chunk-LEE2FEEL.js.map +7 -0
  81. package/dist/chunk-LMGCV35W.js +2 -0
  82. package/dist/chunk-LMGCV35W.js.map +7 -0
  83. package/dist/chunk-LV6HXFHU.js +3 -0
  84. package/dist/chunk-LV6HXFHU.js.map +7 -0
  85. package/dist/chunk-MA5BJL3S.js +2 -0
  86. package/dist/chunk-MA5BJL3S.js.map +7 -0
  87. package/dist/chunk-NDBFYIL6.js +2 -0
  88. package/dist/chunk-NDBFYIL6.js.map +7 -0
  89. package/dist/chunk-NHVEP72K.js +2 -0
  90. package/dist/chunk-NHVEP72K.js.map +7 -0
  91. package/dist/chunk-NV5AIBQP.js +2 -0
  92. package/dist/chunk-NV5AIBQP.js.map +7 -0
  93. package/dist/chunk-NWTTHDIM.js +2 -0
  94. package/dist/chunk-NWTTHDIM.js.map +7 -0
  95. package/dist/chunk-O4DCHALR.js +2 -0
  96. package/dist/chunk-O4DCHALR.js.map +7 -0
  97. package/dist/chunk-ODWPBBVL.js +2 -0
  98. package/dist/chunk-ODWPBBVL.js.map +7 -0
  99. package/dist/chunk-OW2ZSMGS.js +2 -0
  100. package/dist/chunk-OW2ZSMGS.js.map +7 -0
  101. package/dist/chunk-OWEQT2HN.js +2 -0
  102. package/dist/chunk-OWEQT2HN.js.map +7 -0
  103. package/dist/chunk-PSPQH35P.js +2 -0
  104. package/dist/chunk-PSPQH35P.js.map +7 -0
  105. package/dist/chunk-PZSHOSOS.js +2 -0
  106. package/dist/chunk-PZSHOSOS.js.map +7 -0
  107. package/dist/chunk-QEQIJAAB.js +2 -0
  108. package/dist/chunk-QEQIJAAB.js.map +7 -0
  109. package/dist/chunk-SNTHW4K2.js +2 -0
  110. package/dist/chunk-SNTHW4K2.js.map +7 -0
  111. package/dist/chunk-T4OYVG2X.js +2 -0
  112. package/dist/chunk-T4OYVG2X.js.map +7 -0
  113. package/dist/chunk-TBLICXWW.js +2 -0
  114. package/dist/chunk-TBLICXWW.js.map +7 -0
  115. package/dist/chunk-TK2RC3T5.js +2 -0
  116. package/dist/chunk-TK2RC3T5.js.map +7 -0
  117. package/dist/chunk-U3X2FW6U.js +2 -0
  118. package/dist/chunk-U3X2FW6U.js.map +7 -0
  119. package/dist/chunk-UPOBGNJ5.js +2 -0
  120. package/dist/chunk-UPOBGNJ5.js.map +7 -0
  121. package/dist/chunk-VV7CFMPZ.js +2 -0
  122. package/dist/chunk-VV7CFMPZ.js.map +7 -0
  123. package/dist/chunk-X2ASKUFD.js +2 -0
  124. package/dist/chunk-X2ASKUFD.js.map +7 -0
  125. package/dist/chunk-X6AULZI4.js +1 -0
  126. package/dist/chunk-X6AULZI4.js.map +7 -0
  127. package/dist/chunk-XVIC24AW.js +2 -0
  128. package/dist/chunk-XVIC24AW.js.map +7 -0
  129. package/dist/chunk-XZ5CUZZP.js +2 -0
  130. package/dist/chunk-XZ5CUZZP.js.map +7 -0
  131. package/dist/chunk-XZEOSW3Q.js +2 -0
  132. package/dist/chunk-XZEOSW3Q.js.map +7 -0
  133. package/dist/chunk-YET5PM6F.js +2 -0
  134. package/dist/chunk-YET5PM6F.js.map +7 -0
  135. package/dist/chunk-Z25NC4CS.js +2 -0
  136. package/dist/chunk-Z25NC4CS.js.map +7 -0
  137. package/dist/chunk-ZCAAM4NH.js +2 -0
  138. package/dist/chunk-ZCAAM4NH.js.map +7 -0
  139. package/dist/chunk-ZHVSHDLH.js +2 -0
  140. package/dist/chunk-ZHVSHDLH.js.map +7 -0
  141. package/dist/chunk-ZYUXCZX7.js +2 -0
  142. package/dist/chunk-ZYUXCZX7.js.map +7 -0
  143. package/dist/components/breadcrumb.js +2 -0
  144. package/dist/components/breadcrumb.js.map +7 -0
  145. package/dist/components/button.js +2 -0
  146. package/dist/components/button.js.map +7 -0
  147. package/dist/components/calendar.js +2 -0
  148. package/dist/components/calendar.js.map +7 -0
  149. package/dist/components/chat.js +2 -0
  150. package/dist/components/chat.js.map +7 -0
  151. package/dist/components/checkbox.js +2 -0
  152. package/dist/components/checkbox.js.map +7 -0
  153. package/dist/components/combobox.js +2 -0
  154. package/dist/components/combobox.js.map +7 -0
  155. package/dist/components/commandpalette.js +2 -0
  156. package/dist/components/commandpalette.js.map +7 -0
  157. package/dist/components/container.js +2 -0
  158. package/dist/components/container.js.map +7 -0
  159. package/dist/components/dataview.js +2 -0
  160. package/dist/components/dataview.js.map +7 -0
  161. package/dist/components/datefield.js +2 -0
  162. package/dist/components/datefield.js.map +7 -0
  163. package/dist/components/daterangefield.js +2 -0
  164. package/dist/components/daterangefield.js.map +7 -0
  165. package/dist/components/dropdown.js +2 -0
  166. package/dist/components/dropdown.js.map +7 -0
  167. package/dist/components/fieldset.js +2 -0
  168. package/dist/components/fieldset.js.map +7 -0
  169. package/dist/components/filterbuilder.js +2 -0
  170. package/dist/components/filterbuilder.js.map +7 -0
  171. package/dist/components/form.js +2 -0
  172. package/dist/components/form.js.map +7 -0
  173. package/dist/components/grid.js +2 -0
  174. package/dist/components/grid.js.map +7 -0
  175. package/dist/components/icon.js +2 -0
  176. package/dist/components/icon.js.map +7 -0
  177. package/dist/components/label.js +2 -0
  178. package/dist/components/label.js.map +7 -0
  179. package/dist/components/listbox.js +2 -0
  180. package/dist/components/listbox.js.map +7 -0
  181. package/dist/components/lookupfield.js +2 -0
  182. package/dist/components/lookupfield.js.map +7 -0
  183. package/dist/components/menu.js +2 -0
  184. package/dist/components/menu.js.map +7 -0
  185. package/dist/components/messagebox.js +2 -0
  186. package/dist/components/messagebox.js.map +7 -0
  187. package/dist/components/navmenu.js +2 -0
  188. package/dist/components/navmenu.js.map +7 -0
  189. package/dist/components/numberfield.js +2 -0
  190. package/dist/components/numberfield.js.map +7 -0
  191. package/dist/components/pagination.js +2 -0
  192. package/dist/components/pagination.js.map +7 -0
  193. package/dist/components/panel.js +2 -0
  194. package/dist/components/panel.js.map +7 -0
  195. package/dist/components/pickerfield.js +2 -0
  196. package/dist/components/pickerfield.js.map +7 -0
  197. package/dist/components/radiogroup.js +2 -0
  198. package/dist/components/radiogroup.js.map +7 -0
  199. package/dist/components/searchgrid.js +2 -0
  200. package/dist/components/searchgrid.js.map +7 -0
  201. package/dist/components/secretfield.js +2 -0
  202. package/dist/components/secretfield.js.map +7 -0
  203. package/dist/components/select.js +2 -0
  204. package/dist/components/select.js.map +7 -0
  205. package/dist/components/slider.js +2 -0
  206. package/dist/components/slider.js.map +7 -0
  207. package/dist/components/spacer.js +2 -0
  208. package/dist/components/spacer.js.map +7 -0
  209. package/dist/components/spinner.js +2 -0
  210. package/dist/components/spinner.js.map +7 -0
  211. package/dist/components/stepform.js +2 -0
  212. package/dist/components/stepform.js.map +7 -0
  213. package/dist/components/stepper.js +2 -0
  214. package/dist/components/stepper.js.map +7 -0
  215. package/dist/components/suggestfield.js +2 -0
  216. package/dist/components/suggestfield.js.map +7 -0
  217. package/dist/components/table.js +2 -0
  218. package/dist/components/table.js.map +7 -0
  219. package/dist/components/tabs.js +2 -0
  220. package/dist/components/tabs.js.map +7 -0
  221. package/dist/components/textarea.js +2 -0
  222. package/dist/components/textarea.js.map +7 -0
  223. package/dist/components/textfield.js +2 -0
  224. package/dist/components/textfield.js.map +7 -0
  225. package/dist/components/toast.js +2 -0
  226. package/dist/components/toast.js.map +7 -0
  227. package/dist/components/toolbar.js +2 -0
  228. package/dist/components/toolbar.js.map +7 -0
  229. package/dist/components/tooltip.js +2 -0
  230. package/dist/components/tooltip.js.map +7 -0
  231. package/dist/components/viewmanager.js +2 -0
  232. package/dist/components/viewmanager.js.map +7 -0
  233. package/dist/components/viewport.js +2 -0
  234. package/dist/components/viewport.js.map +7 -0
  235. package/dist/components/widget.js +2 -0
  236. package/dist/components/widget.js.map +7 -0
  237. package/dist/components/window.js +2 -0
  238. package/dist/components/window.js.map +7 -0
  239. package/dist/core.js +2 -0
  240. package/dist/core.js.map +7 -0
  241. package/dist/css/base.css +160 -0
  242. package/dist/css/breadcrumb.css +53 -0
  243. package/dist/css/button.css +101 -0
  244. package/dist/css/calendar.css +108 -0
  245. package/dist/css/chat.css +233 -0
  246. package/dist/css/checkbox.css +64 -0
  247. package/dist/css/commandpalette.css +167 -0
  248. package/dist/css/container.css +5 -0
  249. package/dist/css/core.css +88 -0
  250. package/dist/css/dataview.css +56 -0
  251. package/dist/css/dropdown.css +13 -0
  252. package/dist/css/field.css +62 -0
  253. package/dist/css/fieldset.css +32 -0
  254. package/dist/css/filterbuilder.css +125 -0
  255. package/dist/css/form.css +8 -0
  256. package/dist/css/grid.css +367 -0
  257. package/dist/css/icon.css +16 -0
  258. package/dist/css/label.css +12 -0
  259. package/dist/css/layout.css +116 -0
  260. package/dist/css/listbox.css +50 -0
  261. package/dist/css/menu.css +47 -0
  262. package/dist/css/messagebox.css +6 -0
  263. package/dist/css/motion.css +29 -0
  264. package/dist/css/navmenu.css +115 -0
  265. package/dist/css/pagination.css +23 -0
  266. package/dist/css/panel.css +77 -0
  267. package/dist/css/pickerfield.css +85 -0
  268. package/dist/css/radiogroup.css +53 -0
  269. package/dist/css/searchgrid.css +37 -0
  270. package/dist/css/secretfield.css +73 -0
  271. package/dist/css/slider.css +107 -0
  272. package/dist/css/spacer.css +7 -0
  273. package/dist/css/stepform.css +46 -0
  274. package/dist/css/stepper.css +117 -0
  275. package/dist/css/table.css +36 -0
  276. package/dist/css/tabs.css +99 -0
  277. package/dist/css/textarea.css +11 -0
  278. package/dist/css/textfield.css +59 -0
  279. package/dist/css/toast.css +91 -0
  280. package/dist/css/toolbar.css +14 -0
  281. package/dist/css/tooltip.css +17 -0
  282. package/dist/css/viewport.css +9 -0
  283. package/dist/css/widget.css +77 -0
  284. package/dist/css/window.css +31 -0
  285. package/dist/data.js +2 -0
  286. package/dist/data.js.map +7 -0
  287. package/dist/index.js +8 -0
  288. package/dist/index.js.map +7 -0
  289. package/dist/motion.js +2 -0
  290. package/dist/motion.js.map +7 -0
  291. package/dist/optikos.css +3145 -0
  292. package/dist/themes/brand.css +240 -0
  293. package/dist/themes/brutal.css +100 -0
  294. package/dist/themes/compact.css +17 -0
  295. package/dist/themes/corporate.css +112 -0
  296. package/dist/themes/dark.css +38 -0
  297. package/dist/themes/editorial.css +110 -0
  298. package/dist/themes/soft.css +101 -0
  299. package/dist/themes/terminal.css +91 -0
  300. package/dist/types/bind/index.d.ts +23 -0
  301. package/dist/types/components/base/button/button.d.ts +34 -0
  302. package/dist/types/components/base/icon/icon.d.ts +17 -0
  303. package/dist/types/components/base/label/label.d.ts +14 -0
  304. package/dist/types/components/breadcrumb.d.ts +1 -0
  305. package/dist/types/components/button.d.ts +1 -0
  306. package/dist/types/components/calendar.d.ts +1 -0
  307. package/dist/types/components/chat/chat/chat.d.ts +84 -0
  308. package/dist/types/components/chat.d.ts +1 -0
  309. package/dist/types/components/checkbox.d.ts +1 -0
  310. package/dist/types/components/combobox.d.ts +1 -0
  311. package/dist/types/components/commandpalette.d.ts +1 -0
  312. package/dist/types/components/container.d.ts +1 -0
  313. package/dist/types/components/data/dataview/dataview.d.ts +61 -0
  314. package/dist/types/components/data/filterbuilder/filterbuilder.d.ts +71 -0
  315. package/dist/types/components/data/grid/grid.d.ts +151 -0
  316. package/dist/types/components/data/pagination/pagination.d.ts +31 -0
  317. package/dist/types/components/data/searchgrid/searchgrid.d.ts +63 -0
  318. package/dist/types/components/data/table/table.d.ts +26 -0
  319. package/dist/types/components/data/viewmanager/viewmanager.d.ts +86 -0
  320. package/dist/types/components/dataview.d.ts +1 -0
  321. package/dist/types/components/datefield.d.ts +1 -0
  322. package/dist/types/components/daterangefield.d.ts +1 -0
  323. package/dist/types/components/dates/calendar/calendar.d.ts +48 -0
  324. package/dist/types/components/dropdown.d.ts +1 -0
  325. package/dist/types/components/feedback/spinner/spinner.d.ts +11 -0
  326. package/dist/types/components/fields/checkbox/checkbox.d.ts +20 -0
  327. package/dist/types/components/fields/combobox/combobox.d.ts +15 -0
  328. package/dist/types/components/fields/datefield/datefield.d.ts +30 -0
  329. package/dist/types/components/fields/daterangefield/daterangefield.d.ts +32 -0
  330. package/dist/types/components/fields/listbox/listbox.d.ts +54 -0
  331. package/dist/types/components/fields/lookupfield/lookupfield.d.ts +25 -0
  332. package/dist/types/components/fields/numberfield/numberfield.d.ts +31 -0
  333. package/dist/types/components/fields/pickerfield/pickerfield.d.ts +77 -0
  334. package/dist/types/components/fields/radiogroup/radiogroup.d.ts +26 -0
  335. package/dist/types/components/fields/secretfield/secretfield.d.ts +52 -0
  336. package/dist/types/components/fields/select/select.d.ts +10 -0
  337. package/dist/types/components/fields/slider/slider.d.ts +62 -0
  338. package/dist/types/components/fields/suggestfield/suggestfield.d.ts +34 -0
  339. package/dist/types/components/fields/textarea/textarea.d.ts +16 -0
  340. package/dist/types/components/fields/textfield/textfield.d.ts +38 -0
  341. package/dist/types/components/fieldset.d.ts +1 -0
  342. package/dist/types/components/filterbuilder.d.ts +1 -0
  343. package/dist/types/components/form/form/form.d.ts +51 -0
  344. package/dist/types/components/form/stepform/stepform.d.ts +62 -0
  345. package/dist/types/components/form.d.ts +1 -0
  346. package/dist/types/components/grid.d.ts +1 -0
  347. package/dist/types/components/icon.d.ts +1 -0
  348. package/dist/types/components/label.d.ts +1 -0
  349. package/dist/types/components/layout/container/container.d.ts +1 -0
  350. package/dist/types/components/layout/fieldset/fieldset.d.ts +21 -0
  351. package/dist/types/components/layout/panel/panel.d.ts +47 -0
  352. package/dist/types/components/layout/spacer/spacer.d.ts +12 -0
  353. package/dist/types/components/layout/toolbar/toolbar.d.ts +15 -0
  354. package/dist/types/components/layout/viewport/viewport.d.ts +7 -0
  355. package/dist/types/components/listbox.d.ts +1 -0
  356. package/dist/types/components/lookupfield.d.ts +1 -0
  357. package/dist/types/components/menu.d.ts +1 -0
  358. package/dist/types/components/messagebox.d.ts +1 -0
  359. package/dist/types/components/navigation/breadcrumb/breadcrumb.d.ts +32 -0
  360. package/dist/types/components/navigation/navmenu/navmenu.d.ts +63 -0
  361. package/dist/types/components/navigation/stepper/stepper.d.ts +31 -0
  362. package/dist/types/components/navigation/tabs/tabs.d.ts +49 -0
  363. package/dist/types/components/navmenu.d.ts +1 -0
  364. package/dist/types/components/numberfield.d.ts +1 -0
  365. package/dist/types/components/overlays/commandpalette/commandpalette.d.ts +80 -0
  366. package/dist/types/components/overlays/dropdown/dropdown.d.ts +41 -0
  367. package/dist/types/components/overlays/menu/menu.d.ts +41 -0
  368. package/dist/types/components/overlays/messagebox/messagebox.d.ts +53 -0
  369. package/dist/types/components/overlays/toast/toast.d.ts +45 -0
  370. package/dist/types/components/overlays/tooltip/tooltip.d.ts +13 -0
  371. package/dist/types/components/overlays/widget/widget.d.ts +48 -0
  372. package/dist/types/components/overlays/window/window.d.ts +31 -0
  373. package/dist/types/components/pagination.d.ts +1 -0
  374. package/dist/types/components/panel.d.ts +1 -0
  375. package/dist/types/components/pickerfield.d.ts +1 -0
  376. package/dist/types/components/radiogroup.d.ts +1 -0
  377. package/dist/types/components/searchgrid.d.ts +1 -0
  378. package/dist/types/components/secretfield.d.ts +1 -0
  379. package/dist/types/components/select.d.ts +1 -0
  380. package/dist/types/components/slider.d.ts +1 -0
  381. package/dist/types/components/spacer.d.ts +1 -0
  382. package/dist/types/components/spinner.d.ts +1 -0
  383. package/dist/types/components/stepform.d.ts +1 -0
  384. package/dist/types/components/stepper.d.ts +1 -0
  385. package/dist/types/components/suggestfield.d.ts +1 -0
  386. package/dist/types/components/table.d.ts +1 -0
  387. package/dist/types/components/tabs.d.ts +1 -0
  388. package/dist/types/components/textarea.d.ts +1 -0
  389. package/dist/types/components/textfield.d.ts +1 -0
  390. package/dist/types/components/toast.d.ts +1 -0
  391. package/dist/types/components/toolbar.d.ts +1 -0
  392. package/dist/types/components/tooltip.d.ts +1 -0
  393. package/dist/types/components/viewmanager.d.ts +1 -0
  394. package/dist/types/components/viewport.d.ts +1 -0
  395. package/dist/types/components/widget.d.ts +1 -0
  396. package/dist/types/components/window.d.ts +1 -0
  397. package/dist/types/core/component.d.ts +90 -0
  398. package/dist/types/core/container.d.ts +43 -0
  399. package/dist/types/core/date.d.ts +14 -0
  400. package/dist/types/core/dom.d.ts +11 -0
  401. package/dist/types/core/emitter.d.ts +12 -0
  402. package/dist/types/core/field.d.ts +78 -0
  403. package/dist/types/core/focus.d.ts +18 -0
  404. package/dist/types/core/i18n.d.ts +7 -0
  405. package/dist/types/core/index.d.ts +15 -0
  406. package/dist/types/core/layer.d.ts +6 -0
  407. package/dist/types/core/position.d.ts +16 -0
  408. package/dist/types/core/registry.d.ts +12 -0
  409. package/dist/types/core/validators.d.ts +10 -0
  410. package/dist/types/core/virtual.d.ts +24 -0
  411. package/dist/types/data/column.d.ts +27 -0
  412. package/dist/types/data/format.d.ts +4 -0
  413. package/dist/types/data/index.d.ts +5 -0
  414. package/dist/types/data/model.d.ts +28 -0
  415. package/dist/types/data/proxy.d.ts +61 -0
  416. package/dist/types/data/store.d.ts +94 -0
  417. package/dist/types/index.d.ts +53 -0
  418. package/dist/types/layout/layout.d.ts +27 -0
  419. package/dist/types/motion/config.d.ts +83 -0
  420. package/dist/types/motion/core.d.ts +40 -0
  421. package/dist/types/motion/extras.d.ts +66 -0
  422. package/dist/types/motion/index.d.ts +3 -0
  423. package/dist/types/themes/define.d.ts +30 -0
  424. package/dist/types/themes/index.d.ts +1 -0
  425. package/dist/types/ui/enums.d.ts +88 -0
  426. package/dist/types/ui/index.d.ts +2 -0
  427. package/dist/types/ui/ui.d.ts +58 -0
  428. package/dist/ui.js +2 -0
  429. package/dist/ui.js.map +7 -0
  430. package/package.json +99 -4
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/filterbuilder/filterbuilder.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { FilterGroup, FilterNode, FilterOp } from '../../../data/proxy';\nimport type { Store } from '../../../data/store';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu } from '../../overlays/menu/menu';\nimport { Button } from '../../base/button/button';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { NumberField } from '../../fields/numberfield/numberfield';\nimport { DateField } from '../../fields/datefield/datefield';\n\nexport interface FilterField {\n name: string;\n label?: string;\n type?: 'text' | 'number' | 'date' | 'select';\n /** For `select`: the choices. */\n options?: Array<string | number | { value: string | number; label: string }>;\n}\n\nexport interface FilterBuilderConfig extends ComponentConfig {\n fields: FilterField[];\n /** Starting filters. */\n value?: FilterGroup | null;\n /** Filtered as the user edits (`live`) or when Apply is pressed. */\n store?: Store<any>;\n /** Apply on every edit (debounced). Default true. With `false` an Apply button appears. */\n live?: boolean;\n /**\n * What \"Add filter\" does: `'row'` (default) adds an empty row for the first field; `'pick'` first asks\n * which field to filter by (a menu of the fields) and adds the row for it.\n */\n addMode?: 'row' | 'pick';\n /** Deepest group nesting allowed. Default 3. */\n maxDepth?: number;\n}\n\ntype Rule = { kind: 'rule'; id: number; field: string; op: FilterOp; value?: any; value2?: any };\ntype Group = { kind: 'group'; op: 'and' | 'or'; items: Array<Rule | Group> };\n\nconst OPS: Record<NonNullable<FilterField['type']>, FilterOp[]> = {\n text: ['contains', 'notContains', 'eq', 'ne', 'startsWith', 'endsWith', 'in', 'nin', 'empty', 'notEmpty'],\n number: ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'between', 'notBetween', 'empty', 'notEmpty'],\n date: ['eq', 'ne', 'gt', 'ge', 'lt', 'le', 'between', 'notBetween', 'empty', 'notEmpty'],\n select: ['eq', 'ne', 'in', 'nin', 'empty', 'notEmpty'],\n};\nconst KEY: Record<FilterOp, string> = {\n eq: 'fbEq', ne: 'fbNe', contains: 'fbContains', notContains: 'fbNotContains', startsWith: 'fbStarts', endsWith: 'fbEnds',\n gt: 'fbGt', ge: 'fbGe', lt: 'fbLt', le: 'fbLe', between: 'fbBetween', notBetween: 'fbNotBetween', in: 'fbIn', nin: 'fbNin',\n empty: 'fbEmpty', notEmpty: 'fbNotEmpty',\n};\nconst arity = (op: FilterOp) => (op === 'empty' || op === 'notEmpty' ? 0 : op === 'between' || op === 'notBetween' ? 2 : 1);\nconst isList = (op: FilterOp) => op === 'in' || op === 'nin';\n\n/**\n * A dynamic filter editor: rows of `field \u00B7 operator \u00B7 value` that accumulate below each other, joined by AND or OR,\n * with nestable groups. The result is a `FilterGroup` for `Store.filter`.\n */\nexport class FilterBuilder extends Component<FilterBuilderConfig> {\n protected override baseCls = 'op-filterbuilder';\n private root: Group = { kind: 'group', op: 'and', items: [] };\n private parts: Component[] = [];\n private nextId = 1;\n private cancelApply?: () => void;\n private pickMenu?: Menu;\n\n protected override onRender() {\n this.el.setAttribute('role', 'group');\n this.el.setAttribute('aria-label', t('fbLabel'));\n if (this.config.value) this.root = this.fromNode(this.config.value) as Group;\n this.own(() => (this.parts.forEach((p) => p.destroy()), this.pickMenu?.destroy()));\n this.paint();\n if (this.config.value && this.config.store) this.apply(); // the starting filter takes effect right away\n }\n\n // ---- model <-> filter ----------------------------------------------------------------------\n\n private fromNode(n: FilterNode): Rule | Group {\n if ('filters' in n) return { kind: 'group', op: n.op, items: n.filters.map((f) => this.fromNode(f)) };\n const [a, b] = Array.isArray(n.value) && !isList(n.op ?? 'eq') ? n.value : [n.value, undefined];\n return { kind: 'rule', id: this.nextId++, field: n.field, op: n.op ?? 'eq', value: isList(n.op ?? 'eq') ? n.value : a, value2: b };\n }\n\n private field(name: string): FilterField {\n return this.config.fields.find((f) => f.name === name) ?? this.config.fields[0];\n }\n\n private complete(r: Rule): boolean {\n const n = arity(r.op);\n const has = (v: unknown) => v != null && v !== '' && !(Array.isArray(v) && !v.length);\n return n === 0 || (n === 1 ? has(r.value) : has(r.value) && has(r.value2));\n }\n\n private toNode(g: Group): FilterGroup | null {\n const filters = g.items.flatMap((it): FilterNode[] => {\n if (it.kind === 'group') return this.toNode(it) ? [this.toNode(it)!] : [];\n if (!this.complete(it)) return [];\n const n = arity(it.op);\n return [{ field: it.field, op: it.op, ...(n === 1 ? { value: it.value } : n === 2 ? { value: [it.value, it.value2] } : {}) }];\n });\n return filters.length ? { op: g.op, filters } : null;\n }\n\n /** The complete rules as a filter tree (incomplete rows are left out); null when there is nothing to filter by. */\n getFilter(): FilterGroup | null {\n return this.toNode(this.root);\n }\n\n setFilter(filter: FilterGroup | null): void {\n this.root = filter ? (this.fromNode(filter) as Group) : { kind: 'group', op: 'and', items: [] };\n if (this.rendered) this.paint();\n this.changed();\n }\n\n /** Removes every row and applies the empty filter. */\n clear(): void {\n this.setFilter(null);\n this.apply();\n }\n\n /** Pushes the current filter to the store and fires `apply`. */\n apply(): void {\n this.cancelApply?.();\n const f = this.getFilter();\n if (this.emit('before-apply', f) === false) return;\n const store = this.config.store;\n if (store) void (f ? store.filter(f) : store.clearFilter());\n this.emit('apply', f);\n }\n\n /** Adds a row (optionally for a given field) to the root group. */\n addRule(field?: string): void {\n this.root.items.push(this.newRule(field));\n if (this.rendered) this.paint();\n }\n\n setFields(fields: FilterField[]): void {\n this.config.fields = fields;\n if (this.rendered) this.paint();\n }\n\n setStore(store: Store<any> | undefined): void {\n this.config.store = store;\n }\n\n private newRule(field?: string): Rule {\n const f = this.field(field ?? '');\n return { kind: 'rule', id: this.nextId++, field: f.name, op: OPS[f.type ?? 'text'][0] };\n }\n\n private changed(): void {\n this.emit('change', this.getFilter());\n if (this.config.live === false) return;\n this.cancelApply?.();\n this.cancelApply = this.later(() => this.apply(), 250);\n }\n\n // ---- rendering -----------------------------------------------------------------------------\n\n /** Rebuilds the rows, keeping keyboard focus on the same control. */\n private paint(): void {\n const keep = (document.activeElement as HTMLElement | null)?.closest<HTMLElement>('[data-fb]')?.dataset.fb;\n this.parts.splice(0).forEach((p) => p.destroy());\n const kids: HTMLElement[] = [this.group(this.root, 0, null)];\n if (this.config.live === false) kids.push(h('div', 'op-filterbuilder__foot', {}, this.button(t('fbApply'), 'primary', () => this.apply())));\n this.el.replaceChildren(...kids);\n if (this.mounted) this.parts.forEach((p) => p.notifyMount());\n const back = keep && this.el.querySelector<HTMLElement>(`[data-fb=\"${keep}\"]`);\n if (back) (back.matches('select,button,input') ? back : back.querySelector('input'))?.focus();\n }\n\n private button(text: string, variant: 'default' | 'primary' | 'ghost', handler: () => void, icon?: string): HTMLElement {\n const b = new Button({ text, variant, icon, handler });\n this.parts.push(b);\n return b.el;\n }\n\n private select(options: Array<[string, string]>, value: string, label: string, key: string, onChange: (v: string) => void): HTMLSelectElement {\n const s = h('select', 'op-filterbuilder__select', { 'aria-label': label, 'data-fb': key });\n for (const [v, text] of options) s.append(h('option', '', { value: v }, text));\n s.value = value;\n this.listen(s, 'change', () => onChange(s.value));\n return s;\n }\n\n private group(g: Group, depth: number, parent: Group | null): HTMLElement {\n const el = h('div', `op-filterbuilder__group${depth ? ' is-nested' : ''}`, { role: 'group', 'aria-label': t('fbLabel') });\n const logic = this.select([['and', t('fbAnd')], ['or', t('fbOr')]], g.op, t('fbLabel'), `g${depth}:logic`, (v) => {\n g.op = v as 'and' | 'or';\n this.changed();\n });\n const head = h('div', 'op-filterbuilder__head', {}, logic);\n const add = (field?: string) => {\n const r = this.newRule(field);\n g.items.push(r);\n this.paint();\n this.el.querySelector<HTMLElement>(`[data-fb=\"r${r.id}:v1\"] input, select[data-fb=\"r${r.id}:v1\"]`)?.focus();\n };\n const addBtn = this.button(t('fbAddFilter'), 'ghost', () => (this.config.addMode === 'pick' ? this.pick(addBtn, add) : add()), 'plus');\n head.append(addBtn);\n if (depth < (this.config.maxDepth ?? 3)) {\n head.append(\n this.button(t('fbAddGroup'), 'ghost', () => {\n g.items.push({ kind: 'group', op: 'or', items: [this.newRule()] });\n this.paint();\n }, 'plus'),\n );\n }\n if (parent) head.append(this.removeBtn(() => (parent.items.splice(parent.items.indexOf(g), 1), this.paint(), this.changed())));\n else if (g.items.length) head.append(this.button(t('fbClear'), 'ghost', () => this.clear()));\n el.append(head);\n if (!g.items.length && !parent) el.append(h('div', 'op-filterbuilder__none', {}, t('fbNone')));\n for (const it of g.items) el.append(it.kind === 'group' ? this.group(it, depth + 1, g) : this.rule(it, g));\n return el;\n }\n\n /** \"Add filter\" in `pick` mode: a menu of the fields; the chosen one gets the new row. */\n private pick(anchor: HTMLElement, add: (field: string) => void): void {\n this.pickMenu ??= new Menu({});\n this.pickMenu.setItems(this.config.fields.map((f) => ({ text: f.label ?? f.name, handler: () => add(f.name) })));\n this.pickMenu.showBy(anchor);\n }\n\n private removeBtn(onClick: () => void): HTMLElement {\n const b = h('button', 'op-filterbuilder__remove', { type: 'button', 'aria-label': t('fbRemove'), title: t('fbRemove') }, iconEl('x'));\n this.listen(b, 'click', onClick);\n return b;\n }\n\n private rule(r: Rule, parent: Group): HTMLElement {\n const f = this.field(r.field);\n const type = f.type ?? 'text';\n const k = `r${r.id}`;\n const fieldSel = this.select(this.config.fields.map((x) => [x.name, x.label ?? x.name]), r.field, t('fbField'), `${k}:field`, (v) => {\n r.field = v;\n const ops = OPS[this.field(v).type ?? 'text'];\n if (!ops.includes(r.op) || (this.field(v).type ?? 'text') !== type) r.op = ops[0];\n r.value = r.value2 = undefined;\n this.paint();\n this.changed();\n });\n const opSel = this.select(OPS[type].map((o) => [o, t(KEY[o])]), r.op, t('fbOperator'), `${k}:op`, (v) => {\n const prev = r.op;\n r.op = v as FilterOp;\n if (arity(prev) !== arity(r.op) || isList(prev) !== isList(r.op)) r.value = r.value2 = undefined;\n this.paint();\n this.changed();\n });\n const row = h('div', 'op-filterbuilder__row', {}, fieldSel, opSel);\n const n = arity(r.op);\n if (n >= 1) row.append(this.editor(r, f, 'value', `${k}:v1`));\n if (n === 2) row.append(h('span', 'op-filterbuilder__to', {}, t('fbTo')), this.editor(r, f, 'value2', `${k}:v2`));\n row.append(this.removeBtn(() => (parent.items.splice(parent.items.indexOf(r), 1), this.paint(), this.changed())));\n return row;\n }\n\n private editor(r: Rule, f: FilterField, slot: 'value' | 'value2', key: string): HTMLElement {\n const type = f.type ?? 'text';\n const label = t('fbValue');\n const set = (v: unknown) => {\n r[slot] = v;\n this.changed();\n };\n if (type === 'select') {\n const opts = (f.options ?? []).map((o): [string, string] => (typeof o === 'object' ? [String(o.value), o.label] : [String(o), String(o)]));\n const raw = (v: string) => (f.options ?? []).map((o) => (typeof o === 'object' ? o.value : o)).find((o) => String(o) === v) ?? v;\n if (isList(r.op)) {\n // \"is any of\": one toggle chip per option (a native multi-select is tall, scrolls and is easy to mis-click)\n const on = new Set((Array.isArray(r.value) ? r.value : []).map(String));\n const group = h('div', 'op-filterbuilder__chips', { role: 'group', 'aria-label': label, 'data-fb': key });\n for (const [v, text] of opts) {\n const box = h('input', 'op-filterbuilder__chipbox', { type: 'checkbox', value: v });\n box.checked = on.has(v);\n group.append(h('label', 'op-filterbuilder__chip', {}, box, h('span', '', {}, text)));\n }\n this.listen(group, 'change', () => set(Array.from(group.querySelectorAll<HTMLInputElement>('input:checked')).map((i) => raw(i.value))));\n return group;\n }\n const s = h('select', 'op-filterbuilder__select', { 'aria-label': label, 'data-fb': key });\n s.append(h('option', '', { value: '' }, ''));\n for (const [v, text] of opts) s.append(h('option', '', { value: v }, text));\n s.value = r.value != null ? String(r.value) : '';\n this.listen(s, 'change', () => set(s.value === '' ? undefined : raw(s.value)));\n return s;\n }\n if (isList(r.op)) {\n const c = new TextField({ stableSize: false, placeholder: t('fbList'), value: ((r.value as unknown[]) ?? []).join(', ') });\n c.on('change', (v: string) => set(v.split(',').map((x) => x.trim()).filter(Boolean)));\n return this.own1(c, label, key);\n }\n const c = type === 'number' ? new NumberField({ value: r[slot] ?? null, stableSize: false }) : type === 'date' ? new DateField({ value: r[slot] ?? null, stableSize: false }) : new TextField({ value: r[slot] ?? '', stableSize: false });\n c.on('change', (v: unknown) => set(v === '' ? undefined : v));\n return this.own1(c, label, key);\n }\n\n /** Registers an editor, labels its input, and makes Enter apply. */\n private own1(c: TextField<any, any>, label: string, key: string): HTMLElement {\n this.parts.push(c);\n c.on('enter', () => this.apply());\n const el = c.el;\n el.classList.add('op-filterbuilder__value');\n el.dataset.fb = key;\n c.getInput().setAttribute('aria-label', label);\n return el;\n }\n}\nregister('filterbuilder', FilterBuilder);\n"],
5
+ "mappings": "+WAyCA,IAAMA,EAA4D,CAChE,KAAM,CAAC,WAAY,cAAe,KAAM,KAAM,aAAc,WAAY,KAAM,MAAO,QAAS,UAAU,EACxG,OAAQ,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,UAAW,aAAc,QAAS,UAAU,EACzF,KAAM,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,UAAW,aAAc,QAAS,UAAU,EACvF,OAAQ,CAAC,KAAM,KAAM,KAAM,MAAO,QAAS,UAAU,CACvD,EACMC,EAAgC,CACpC,GAAI,OAAQ,GAAI,OAAQ,SAAU,aAAc,YAAa,gBAAiB,WAAY,WAAY,SAAU,SAChH,GAAI,OAAQ,GAAI,OAAQ,GAAI,OAAQ,GAAI,OAAQ,QAAS,YAAa,WAAY,eAAgB,GAAI,OAAQ,IAAK,QACnH,MAAO,UAAW,SAAU,YAC9B,EACMC,EAASC,GAAkBA,IAAO,SAAWA,IAAO,WAAa,EAAIA,IAAO,WAAaA,IAAO,aAAe,EAAI,EACnHC,EAAUD,GAAiBA,IAAO,MAAQA,IAAO,MAM1CE,EAAN,cAA4BC,CAA+B,CAC7C,QAAU,mBACrB,KAAc,CAAE,KAAM,QAAS,GAAI,MAAO,MAAO,CAAC,CAAE,EACpD,MAAqB,CAAC,EACtB,OAAS,EACT,YACA,SAEW,UAAW,CAC5B,KAAK,GAAG,aAAa,OAAQ,OAAO,EACpC,KAAK,GAAG,aAAa,aAAcC,EAAE,SAAS,CAAC,EAC3C,KAAK,OAAO,QAAO,KAAK,KAAO,KAAK,SAAS,KAAK,OAAO,KAAK,GAClE,KAAK,IAAI,KAAO,KAAK,MAAM,QAASC,GAAMA,EAAE,QAAQ,CAAC,EAAG,KAAK,UAAU,QAAQ,EAAE,EACjF,KAAK,MAAM,EACP,KAAK,OAAO,OAAS,KAAK,OAAO,OAAO,KAAK,MAAM,CACzD,CAIQ,SAASC,EAA6B,CAC5C,GAAI,YAAaA,EAAG,MAAO,CAAE,KAAM,QAAS,GAAIA,EAAE,GAAI,MAAOA,EAAE,QAAQ,IAAKC,GAAM,KAAK,SAASA,CAAC,CAAC,CAAE,EACpG,GAAM,CAACC,EAAGC,CAAC,EAAI,MAAM,QAAQH,EAAE,KAAK,GAAK,CAACL,EAAOK,EAAE,IAAM,IAAI,EAAIA,EAAE,MAAQ,CAACA,EAAE,MAAO,MAAS,EAC9F,MAAO,CAAE,KAAM,OAAQ,GAAI,KAAK,SAAU,MAAOA,EAAE,MAAO,GAAIA,EAAE,IAAM,KAAM,MAAOL,EAAOK,EAAE,IAAM,IAAI,EAAIA,EAAE,MAAQE,EAAG,OAAQC,CAAE,CACnI,CAEQ,MAAMC,EAA2B,CACvC,OAAO,KAAK,OAAO,OAAO,KAAMH,GAAMA,EAAE,OAASG,CAAI,GAAK,KAAK,OAAO,OAAO,CAAC,CAChF,CAEQ,SAASC,EAAkB,CACjC,IAAML,EAAIP,EAAMY,EAAE,EAAE,EACdC,EAAOC,GAAeA,GAAK,MAAQA,IAAM,IAAM,EAAE,MAAM,QAAQA,CAAC,GAAK,CAACA,EAAE,QAC9E,OAAOP,IAAM,IAAMA,IAAM,EAAIM,EAAID,EAAE,KAAK,EAAIC,EAAID,EAAE,KAAK,GAAKC,EAAID,EAAE,MAAM,EAC1E,CAEQ,OAAOG,EAA8B,CAC3C,IAAMC,EAAUD,EAAE,MAAM,QAASE,GAAqB,CACpD,GAAIA,EAAG,OAAS,QAAS,OAAO,KAAK,OAAOA,CAAE,EAAI,CAAC,KAAK,OAAOA,CAAE,CAAE,EAAI,CAAC,EACxE,GAAI,CAAC,KAAK,SAASA,CAAE,EAAG,MAAO,CAAC,EAChC,IAAM,EAAIjB,EAAMiB,EAAG,EAAE,EACrB,MAAO,CAAC,CAAE,MAAOA,EAAG,MAAO,GAAIA,EAAG,GAAI,GAAI,IAAM,EAAI,CAAE,MAAOA,EAAG,KAAM,EAAI,IAAM,EAAI,CAAE,MAAO,CAACA,EAAG,MAAOA,EAAG,MAAM,CAAE,EAAI,CAAC,CAAG,CAAC,CAC9H,CAAC,EACD,OAAOD,EAAQ,OAAS,CAAE,GAAID,EAAE,GAAI,QAAAC,CAAQ,EAAI,IAClD,CAGA,WAAgC,CAC9B,OAAO,KAAK,OAAO,KAAK,IAAI,CAC9B,CAEA,UAAUE,EAAkC,CAC1C,KAAK,KAAOA,EAAU,KAAK,SAASA,CAAM,EAAc,CAAE,KAAM,QAAS,GAAI,MAAO,MAAO,CAAC,CAAE,EAC1F,KAAK,UAAU,KAAK,MAAM,EAC9B,KAAK,QAAQ,CACf,CAGA,OAAc,CACZ,KAAK,UAAU,IAAI,EACnB,KAAK,MAAM,CACb,CAGA,OAAc,CACZ,KAAK,cAAc,EACnB,IAAMV,EAAI,KAAK,UAAU,EACzB,GAAI,KAAK,KAAK,eAAgBA,CAAC,IAAM,GAAO,OAC5C,IAAMW,EAAQ,KAAK,OAAO,MACtBA,IAAaX,EAAIW,EAAM,OAAOX,CAAC,EAAIW,EAAM,YAAY,GACzD,KAAK,KAAK,QAASX,CAAC,CACtB,CAGA,QAAQY,EAAsB,CAC5B,KAAK,KAAK,MAAM,KAAK,KAAK,QAAQA,CAAK,CAAC,EACpC,KAAK,UAAU,KAAK,MAAM,CAChC,CAEA,UAAUC,EAA6B,CACrC,KAAK,OAAO,OAASA,EACjB,KAAK,UAAU,KAAK,MAAM,CAChC,CAEA,SAASF,EAAqC,CAC5C,KAAK,OAAO,MAAQA,CACtB,CAEQ,QAAQC,EAAsB,CACpC,IAAMZ,EAAI,KAAK,MAAMY,GAAS,EAAE,EAChC,MAAO,CAAE,KAAM,OAAQ,GAAI,KAAK,SAAU,MAAOZ,EAAE,KAAM,GAAIV,EAAIU,EAAE,MAAQ,MAAM,EAAE,CAAC,CAAE,CACxF,CAEQ,SAAgB,CACtB,KAAK,KAAK,SAAU,KAAK,UAAU,CAAC,EAChC,KAAK,OAAO,OAAS,KACzB,KAAK,cAAc,EACnB,KAAK,YAAc,KAAK,MAAM,IAAM,KAAK,MAAM,EAAG,GAAG,EACvD,CAKQ,OAAc,CACpB,IAAMc,EAAQ,SAAS,eAAsC,QAAqB,WAAW,GAAG,QAAQ,GACxG,KAAK,MAAM,OAAO,CAAC,EAAE,QAAShB,GAAMA,EAAE,QAAQ,CAAC,EAC/C,IAAMiB,EAAsB,CAAC,KAAK,MAAM,KAAK,KAAM,EAAG,IAAI,CAAC,EACvD,KAAK,OAAO,OAAS,IAAOA,EAAK,KAAKC,EAAE,MAAO,yBAA0B,CAAC,EAAG,KAAK,OAAOnB,EAAE,SAAS,EAAG,UAAW,IAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAC1I,KAAK,GAAG,gBAAgB,GAAGkB,CAAI,EAC3B,KAAK,SAAS,KAAK,MAAM,QAASjB,GAAMA,EAAE,YAAY,CAAC,EAC3D,IAAMmB,EAAOH,GAAQ,KAAK,GAAG,cAA2B,aAAaA,CAAI,IAAI,EACzEG,IAAOA,EAAK,QAAQ,qBAAqB,EAAIA,EAAOA,EAAK,cAAc,OAAO,IAAI,MAAM,CAC9F,CAEQ,OAAOC,EAAcC,EAA0CC,EAAqBC,EAA4B,CACtH,IAAMnB,EAAI,IAAIoB,EAAO,CAAE,KAAAJ,EAAM,QAAAC,EAAS,KAAAE,EAAM,QAAAD,CAAQ,CAAC,EACrD,YAAK,MAAM,KAAKlB,CAAC,EACVA,EAAE,EACX,CAEQ,OAAOqB,EAAkCC,EAAeC,EAAeC,EAAaC,EAAkD,CAC5I,IAAM,EAAIX,EAAE,SAAU,2BAA4B,CAAE,aAAcS,EAAO,UAAWC,CAAI,CAAC,EACzF,OAAW,CAACpB,EAAGY,CAAI,IAAKK,EAAS,EAAE,OAAOP,EAAE,SAAU,GAAI,CAAE,MAAOV,CAAE,EAAGY,CAAI,CAAC,EAC7E,SAAE,MAAQM,EACV,KAAK,OAAO,EAAG,SAAU,IAAMG,EAAS,EAAE,KAAK,CAAC,EACzC,CACT,CAEQ,MAAMpB,EAAUqB,EAAeC,EAAmC,CACxE,IAAMC,EAAKd,EAAE,MAAO,0BAA0BY,EAAQ,aAAe,EAAE,GAAI,CAAE,KAAM,QAAS,aAAc/B,EAAE,SAAS,CAAE,CAAC,EAClHkC,EAAQ,KAAK,OAAO,CAAC,CAAC,MAAOlC,EAAE,OAAO,CAAC,EAAG,CAAC,KAAMA,EAAE,MAAM,CAAC,CAAC,EAAGU,EAAE,GAAIV,EAAE,SAAS,EAAG,IAAI+B,CAAK,SAAWtB,GAAM,CAChHC,EAAE,GAAKD,EACP,KAAK,QAAQ,CACf,CAAC,EACK0B,EAAOhB,EAAE,MAAO,yBAA0B,CAAC,EAAGe,CAAK,EACnDE,EAAOrB,GAAmB,CAC9B,IAAMR,EAAI,KAAK,QAAQQ,CAAK,EAC5BL,EAAE,MAAM,KAAKH,CAAC,EACd,KAAK,MAAM,EACX,KAAK,GAAG,cAA2B,cAAcA,EAAE,EAAE,iCAAiCA,EAAE,EAAE,OAAO,GAAG,MAAM,CAC5G,EACM8B,EAAS,KAAK,OAAOrC,EAAE,aAAa,EAAG,QAAS,IAAO,KAAK,OAAO,UAAY,OAAS,KAAK,KAAKqC,EAAQD,CAAG,EAAIA,EAAI,EAAI,MAAM,EACrID,EAAK,OAAOE,CAAM,EACdN,GAAS,KAAK,OAAO,UAAY,IACnCI,EAAK,OACH,KAAK,OAAOnC,EAAE,YAAY,EAAG,QAAS,IAAM,CAC1CU,EAAE,MAAM,KAAK,CAAE,KAAM,QAAS,GAAI,KAAM,MAAO,CAAC,KAAK,QAAQ,CAAC,CAAE,CAAC,EACjE,KAAK,MAAM,CACb,EAAG,MAAM,CACX,EAEEsB,EAAQG,EAAK,OAAO,KAAK,UAAU,KAAOH,EAAO,MAAM,OAAOA,EAAO,MAAM,QAAQtB,CAAC,EAAG,CAAC,EAAG,KAAK,MAAM,EAAG,KAAK,QAAQ,EAAE,CAAC,EACpHA,EAAE,MAAM,QAAQyB,EAAK,OAAO,KAAK,OAAOnC,EAAE,SAAS,EAAG,QAAS,IAAM,KAAK,MAAM,CAAC,CAAC,EAC3FiC,EAAG,OAAOE,CAAI,EACV,CAACzB,EAAE,MAAM,QAAU,CAACsB,GAAQC,EAAG,OAAOd,EAAE,MAAO,yBAA0B,CAAC,EAAGnB,EAAE,QAAQ,CAAC,CAAC,EAC7F,QAAWY,KAAMF,EAAE,MAAOuB,EAAG,OAAOrB,EAAG,OAAS,QAAU,KAAK,MAAMA,EAAImB,EAAQ,EAAGrB,CAAC,EAAI,KAAK,KAAKE,EAAIF,CAAC,CAAC,EACzG,OAAOuB,CACT,CAGQ,KAAKK,EAAqBF,EAAoC,CACpE,KAAK,WAAa,IAAIG,EAAK,CAAC,CAAC,EAC7B,KAAK,SAAS,SAAS,KAAK,OAAO,OAAO,IAAKpC,IAAO,CAAE,KAAMA,EAAE,OAASA,EAAE,KAAM,QAAS,IAAMiC,EAAIjC,EAAE,IAAI,CAAE,EAAE,CAAC,EAC/G,KAAK,SAAS,OAAOmC,CAAM,CAC7B,CAEQ,UAAUE,EAAkC,CAClD,IAAMnC,EAAIc,EAAE,SAAU,2BAA4B,CAAE,KAAM,SAAU,aAAcnB,EAAE,UAAU,EAAG,MAAOA,EAAE,UAAU,CAAE,EAAGyC,EAAO,GAAG,CAAC,EACpI,YAAK,OAAOpC,EAAG,QAASmC,CAAO,EACxBnC,CACT,CAEQ,KAAKE,EAASyB,EAA4B,CAChD,IAAM7B,EAAI,KAAK,MAAMI,EAAE,KAAK,EACtBmC,EAAOvC,EAAE,MAAQ,OACjBwC,EAAI,IAAIpC,EAAE,EAAE,GACZqC,EAAW,KAAK,OAAO,KAAK,OAAO,OAAO,IAAKC,GAAM,CAACA,EAAE,KAAMA,EAAE,OAASA,EAAE,IAAI,CAAC,EAAGtC,EAAE,MAAOP,EAAE,SAAS,EAAG,GAAG2C,CAAC,SAAWlC,GAAM,CACnIF,EAAE,MAAQE,EACV,IAAMqC,EAAMrD,EAAI,KAAK,MAAMgB,CAAC,EAAE,MAAQ,MAAM,GACxC,CAACqC,EAAI,SAASvC,EAAE,EAAE,IAAM,KAAK,MAAME,CAAC,EAAE,MAAQ,UAAYiC,KAAMnC,EAAE,GAAKuC,EAAI,CAAC,GAChFvC,EAAE,MAAQA,EAAE,OAAS,OACrB,KAAK,MAAM,EACX,KAAK,QAAQ,CACf,CAAC,EACKwC,EAAQ,KAAK,OAAOtD,EAAIiD,CAAI,EAAE,IAAKM,GAAM,CAACA,EAAGhD,EAAEN,EAAIsD,CAAC,CAAC,CAAC,CAAC,EAAGzC,EAAE,GAAIP,EAAE,YAAY,EAAG,GAAG2C,CAAC,MAAQlC,GAAM,CACvG,IAAMwC,EAAO1C,EAAE,GACfA,EAAE,GAAKE,GACHd,EAAMsD,CAAI,IAAMtD,EAAMY,EAAE,EAAE,GAAKV,EAAOoD,CAAI,IAAMpD,EAAOU,EAAE,EAAE,KAAGA,EAAE,MAAQA,EAAE,OAAS,QACvF,KAAK,MAAM,EACX,KAAK,QAAQ,CACf,CAAC,EACK2C,EAAM/B,EAAE,MAAO,wBAAyB,CAAC,EAAGyB,EAAUG,CAAK,EAC3D7C,EAAIP,EAAMY,EAAE,EAAE,EACpB,OAAIL,GAAK,GAAGgD,EAAI,OAAO,KAAK,OAAO3C,EAAGJ,EAAG,QAAS,GAAGwC,CAAC,KAAK,CAAC,EACxDzC,IAAM,GAAGgD,EAAI,OAAO/B,EAAE,OAAQ,uBAAwB,CAAC,EAAGnB,EAAE,MAAM,CAAC,EAAG,KAAK,OAAOO,EAAGJ,EAAG,SAAU,GAAGwC,CAAC,KAAK,CAAC,EAChHO,EAAI,OAAO,KAAK,UAAU,KAAOlB,EAAO,MAAM,OAAOA,EAAO,MAAM,QAAQzB,CAAC,EAAG,CAAC,EAAG,KAAK,MAAM,EAAG,KAAK,QAAQ,EAAE,CAAC,EACzG2C,CACT,CAEQ,OAAO3C,EAASJ,EAAgBgD,EAA0BtB,EAA0B,CAC1F,IAAMa,EAAOvC,EAAE,MAAQ,OACjByB,EAAQ5B,EAAE,SAAS,EACnBoD,EAAO3C,GAAe,CAC1BF,EAAE4C,CAAI,EAAI1C,EACV,KAAK,QAAQ,CACf,EACA,GAAIiC,IAAS,SAAU,CACrB,IAAMW,GAAQlD,EAAE,SAAW,CAAC,GAAG,IAAK6C,GAAyB,OAAOA,GAAM,SAAW,CAAC,OAAOA,EAAE,KAAK,EAAGA,EAAE,KAAK,EAAI,CAAC,OAAOA,CAAC,EAAG,OAAOA,CAAC,CAAC,CAAE,EACnIM,EAAO7C,IAAeN,EAAE,SAAW,CAAC,GAAG,IAAK6C,GAAO,OAAOA,GAAM,SAAWA,EAAE,MAAQA,CAAE,EAAE,KAAMA,GAAM,OAAOA,CAAC,IAAMvC,CAAC,GAAKA,EAC/H,GAAIZ,EAAOU,EAAE,EAAE,EAAG,CAEhB,IAAMgD,EAAK,IAAI,KAAK,MAAM,QAAQhD,EAAE,KAAK,EAAIA,EAAE,MAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,EAChEiD,EAAQrC,EAAE,MAAO,0BAA2B,CAAE,KAAM,QAAS,aAAcS,EAAO,UAAWC,CAAI,CAAC,EACxG,OAAW,CAACpB,EAAGY,CAAI,IAAKgC,EAAM,CAC5B,IAAMI,EAAMtC,EAAE,QAAS,4BAA6B,CAAE,KAAM,WAAY,MAAOV,CAAE,CAAC,EAClFgD,EAAI,QAAUF,EAAG,IAAI9C,CAAC,EACtB+C,EAAM,OAAOrC,EAAE,QAAS,yBAA0B,CAAC,EAAGsC,EAAKtC,EAAE,OAAQ,GAAI,CAAC,EAAGE,CAAI,CAAC,CAAC,CACrF,CACA,YAAK,OAAOmC,EAAO,SAAU,IAAMJ,EAAI,MAAM,KAAKI,EAAM,iBAAmC,eAAe,CAAC,EAAE,IAAKE,GAAMJ,EAAII,EAAE,KAAK,CAAC,CAAC,CAAC,EAC/HF,CACT,CACA,IAAMG,EAAIxC,EAAE,SAAU,2BAA4B,CAAE,aAAcS,EAAO,UAAWC,CAAI,CAAC,EACzF8B,EAAE,OAAOxC,EAAE,SAAU,GAAI,CAAE,MAAO,EAAG,EAAG,EAAE,CAAC,EAC3C,OAAW,CAACV,EAAGY,CAAI,IAAKgC,EAAMM,EAAE,OAAOxC,EAAE,SAAU,GAAI,CAAE,MAAOV,CAAE,EAAGY,CAAI,CAAC,EAC1E,OAAAsC,EAAE,MAAQpD,EAAE,OAAS,KAAO,OAAOA,EAAE,KAAK,EAAI,GAC9C,KAAK,OAAOoD,EAAG,SAAU,IAAMP,EAAIO,EAAE,QAAU,GAAK,OAAYL,EAAIK,EAAE,KAAK,CAAC,CAAC,EACtEA,CACT,CACA,GAAI9D,EAAOU,EAAE,EAAE,EAAG,CAChB,IAAMqD,EAAI,IAAIC,EAAU,CAAE,WAAY,GAAO,YAAa7D,EAAE,QAAQ,EAAG,OAASO,EAAE,OAAuB,CAAC,GAAG,KAAK,IAAI,CAAE,CAAC,EACzH,OAAAqD,EAAE,GAAG,SAAWnD,GAAc2C,EAAI3C,EAAE,MAAM,GAAG,EAAE,IAAKoC,GAAMA,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,EAC7E,KAAK,KAAKe,EAAGhC,EAAOC,CAAG,CAChC,CACA,IAAM+B,EAAIlB,IAAS,SAAW,IAAIoB,EAAY,CAAE,MAAOvD,EAAE4C,CAAI,GAAK,KAAM,WAAY,EAAM,CAAC,EAAIT,IAAS,OAAS,IAAIqB,EAAU,CAAE,MAAOxD,EAAE4C,CAAI,GAAK,KAAM,WAAY,EAAM,CAAC,EAAI,IAAIU,EAAU,CAAE,MAAOtD,EAAE4C,CAAI,GAAK,GAAI,WAAY,EAAM,CAAC,EACzO,OAAAS,EAAE,GAAG,SAAWnD,GAAe2C,EAAI3C,IAAM,GAAK,OAAYA,CAAC,CAAC,EACrD,KAAK,KAAKmD,EAAGhC,EAAOC,CAAG,CAChC,CAGQ,KAAK+B,EAAwBhC,EAAeC,EAA0B,CAC5E,KAAK,MAAM,KAAK+B,CAAC,EACjBA,EAAE,GAAG,QAAS,IAAM,KAAK,MAAM,CAAC,EAChC,IAAM3B,EAAK2B,EAAE,GACb,OAAA3B,EAAG,UAAU,IAAI,yBAAyB,EAC1CA,EAAG,QAAQ,GAAKJ,EAChB+B,EAAE,SAAS,EAAE,aAAa,aAAchC,CAAK,EACtCK,CACT,CACF,EACA+B,EAAS,gBAAiBlE,CAAa",
6
+ "names": ["OPS", "KEY", "arity", "op", "isList", "FilterBuilder", "Component", "t", "p", "n", "f", "a", "b", "name", "r", "has", "v", "g", "filters", "it", "filter", "store", "field", "fields", "keep", "kids", "h", "back", "text", "variant", "handler", "icon", "Button", "options", "value", "label", "key", "onChange", "depth", "parent", "el", "logic", "head", "add", "addBtn", "anchor", "Menu", "onClick", "iconEl", "type", "k", "fieldSel", "x", "ops", "opSel", "o", "prev", "row", "slot", "set", "opts", "raw", "on", "group", "box", "i", "s", "c", "TextField", "NumberField", "DateField", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as n}from"./chunk-Z25NC4CS.js";import{b as o}from"./chunk-IYPKPLCU.js";var s=class extends n{baseCls="op-field op-textfield op-picker op-combobox";term="";emptyValue(){return null}isEmpty(t){return t==null||t===""}visibleItems(){let t=this.typed?this.term.trim().toLowerCase():"";if(!t)return this.items;let i=this.config.filter??"contains",p=typeof i=="function"?i:i==="startsWith"?(e,r)=>e.label.toLowerCase().startsWith(r):(e,r)=>e.label.toLowerCase().includes(r);return this.items.filter(e=>p(e,t))}onType(t){this.term=t,this.refreshList(),this.list.setHighlight(t),this.open()}pick(t){this.term="",super.pick(t),this.list.setHighlight("")}settle(){super.settle(),this.term="",this.list.setHighlight("")}};o("combobox",s);export{s as a};
2
+ //# sourceMappingURL=chunk-4SUKNSCY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/combobox/combobox.ts"],
4
+ "sourcesContent": ["import { PickerField, type PickerConfig, type ListItem } from '../pickerfield/pickerfield';\nimport { register } from '../../../core/registry';\n\nexport interface ComboBoxConfig<V = unknown> extends PickerConfig<V> {\n filter?: 'contains' | 'startsWith' | ((item: ListItem, text: string) => boolean);\n}\n\n/** Editable list: typing filters the options locally. */\nexport class ComboBox<V = unknown> extends PickerField<V, ComboBoxConfig<V>> {\n protected override baseCls = 'op-field op-textfield op-picker op-combobox';\n private term = '';\n\n protected override emptyValue(): V {\n return null as V;\n }\n protected override isEmpty(v: V) {\n return v == null || (v as unknown) === '';\n }\n\n protected override visibleItems(): ListItem[] {\n const text = this.typed ? this.term.trim().toLowerCase() : '';\n if (!text) return this.items;\n const f = this.config.filter ?? 'contains';\n const test = typeof f === 'function' ? f : f === 'startsWith' ? (i: ListItem, s: string) => i.label.toLowerCase().startsWith(s) : (i: ListItem, s: string) => i.label.toLowerCase().includes(s);\n return this.items.filter((i) => test(i, text));\n }\n\n protected override onType(text: string) {\n this.term = text;\n this.refreshList();\n this.list.setHighlight(text);\n this.open();\n }\n\n protected override pick(item: ListItem) {\n this.term = '';\n super.pick(item);\n this.list.setHighlight('');\n }\n\n protected override settle() {\n super.settle();\n this.term = '';\n this.list.setHighlight('');\n }\n}\nregister('combobox', ComboBox);\n"],
5
+ "mappings": "gFAQO,IAAMA,EAAN,cAAoCC,CAAkC,CACxD,QAAU,8CACrB,KAAO,GAEI,YAAgB,CACjC,OAAO,IACT,CACmB,QAAQC,EAAM,CAC/B,OAAOA,GAAK,MAASA,IAAkB,EACzC,CAEmB,cAA2B,CAC5C,IAAMC,EAAO,KAAK,MAAQ,KAAK,KAAK,KAAK,EAAE,YAAY,EAAI,GAC3D,GAAI,CAACA,EAAM,OAAO,KAAK,MACvB,IAAMC,EAAI,KAAK,OAAO,QAAU,WAC1BC,EAAO,OAAOD,GAAM,WAAaA,EAAIA,IAAM,aAAe,CAACE,EAAaC,IAAcD,EAAE,MAAM,YAAY,EAAE,WAAWC,CAAC,EAAI,CAACD,EAAaC,IAAcD,EAAE,MAAM,YAAY,EAAE,SAASC,CAAC,EAC9L,OAAO,KAAK,MAAM,OAAQD,GAAMD,EAAKC,EAAGH,CAAI,CAAC,CAC/C,CAEmB,OAAOA,EAAc,CACtC,KAAK,KAAOA,EACZ,KAAK,YAAY,EACjB,KAAK,KAAK,aAAaA,CAAI,EAC3B,KAAK,KAAK,CACZ,CAEmB,KAAKK,EAAgB,CACtC,KAAK,KAAO,GACZ,MAAM,KAAKA,CAAI,EACf,KAAK,KAAK,aAAa,EAAE,CAC3B,CAEmB,QAAS,CAC1B,MAAM,OAAO,EACb,KAAK,KAAO,GACZ,KAAK,KAAK,aAAa,EAAE,CAC3B,CACF,EACAC,EAAS,WAAYT,CAAQ",
6
+ "names": ["ComboBox", "PickerField", "v", "text", "f", "test", "i", "s", "item", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as S}from"./chunk-IO66A6G5.js";import{a as w}from"./chunk-JVEPKW5X.js";import{a as y}from"./chunk-LBCWEWPN.js";import{c}from"./chunk-UPOBGNJ5.js";import{a as x}from"./chunk-K2DGY6MP.js";import{a as l}from"./chunk-XZEOSW3Q.js";import{a as g,b as v}from"./chunk-IYPKPLCU.js";import{b as p}from"./chunk-PZSHOSOS.js";import{e as a}from"./chunk-MA5BJL3S.js";var f=class extends g{baseCls="op-stepform__review";setContent(e){this.el.replaceChildren(...e)}},d=class extends w{baseCls="op-form op-stepform";stepper;body;pane;backBtn;nextBtn;finishBtn;index=0;constructor(e){let t,i=e.steps??[],r=e.review?new f:void 0,s=new S({steps:[...i.map(({title:o,description:B,icon:_,optional:k})=>({title:o,description:B,icon:_,optional:k})),...r?[{title:e.reviewTitle??a("stepReview")}]:[]]}),n=[...i.map(o=>({type:"container",title:o.title,cls:"op-stepform__step",layout:o.layout??{type:"grid",columns:2,gap:12},items:o.items})),...r?[{type:"container",title:e.reviewTitle??a("stepReview"),cls:"op-stepform__step",items:[r]}]:[]],h=new c({cls:"op-stepform__body",flex:1,layout:{type:"card"},items:n}),m=new l({text:e.backText??a("stepBack"),handler:()=>t.back()}),u=new l({text:e.nextText??a("stepNext"),variant:"primary",handler:()=>t.next()}),b=new l({text:e.finishText??a("stepFinish"),variant:"primary",htmlType:"submit"}),C=e.cancelText?[new l({text:e.cancelText,variant:"ghost",handler:()=>t.emit("cancel")})]:[],T=new y({cls:"op-stepform__footer",items:[...C,"->",m,u,b]});super({...e,layout:{type:"vbox"},items:[s,h,T]}),t=this,Object.assign(this,{stepper:s,body:h,pane:r,backBtn:m,nextBtn:u,finishBtn:b}),s.on("before-select",o=>(t.goTo(o),!1)),h.on("activate",()=>t.onActivate())}cfg(){return this.config}count(){return this.body.items.length}real(){return this.count()-(this.pane?1:0)}getStep(){return this.index}getStepCount(){return this.count()}getStepper(){return this.stepper}stepFields(e){let t=this.body.items[e];return t instanceof c?t.query(i=>i instanceof x):[]}validateStep(e){if(e>=this.real())return!0;let t=this.stepFields(e).filter(i=>!i.validate());return this.stepper.setStepState(e,t.length?"error":"done"),!t.length}goTo(e){if(e<0||e>=this.count()||e===this.index||this.emit("before-step-change",this.index,e)===!1)return!1;let t=e;if(this.cfg().linear!==!1&&e>this.index){for(let i=this.index;i<e;i++)if(!this.validateStep(i)){t=i;break}}return t!==this.index&&this.body.setActiveItem(t),t!==e&&this.stepFields(t).find(i=>i.getError())?.focus(),t===e}next(){return this.goTo(this.index+1)}back(){return this.goTo(this.index-1)}onActivate(){let e=this.body.items.indexOf(this.body.getActiveItem());if(e<0)return;let t=this.index;this.index=e,this.stepper.setActive(e);let i=this.count()-1;this.backBtn.config.hidden=e===0,this.nextBtn.config.hidden=e===i,this.finishBtn.config.hidden=e!==i;for(let[r,s]of[[this.backBtn,e===0],[this.nextBtn,e===i],[this.finishBtn,e!==i]])r.rendered&&(r.el.hidden=s);this.pane&&e===i&&this.refreshReview(),e!==t&&(this.emit("step-change",e,t),this.rendered&&this.el.isConnected&&!this.stepFields(e).some(r=>r.getError())&&this.stepFields(e)[0]?.focus())}refreshReview(){let e=this.getValues(),t=this.cfg().review;if(typeof t=="function")return this.pane.setContent([t(e,this)]);let i=[];for(let r=0;r<this.real();r++){let s=this.stepFields(r).filter(n=>n.name);s.length&&(i.push(p("h3","op-stepform__review-title",{},String(this.body.items[r].config.title??""))),i.push(p("dl","op-stepform__review-list",{},...s.flatMap(n=>[p("dt","",{},n.config.label??n.config.boxLabel??n.name),p("dd","",{},this.show_(n))]))))}this.pane.setContent(i)}show_(e){let t=e.getValue();if(typeof t=="boolean")return t?"\u2713":"\u2014";if(e.config.inputType==="password")return t?"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022":"\u2014";let i=e.getDisplayText();return i||(t&&typeof t=="object"&&!Array.isArray(t)?Object.values(t).filter(Boolean).join(" \u2013 ")||"\u2014":Array.isArray(t)&&t.join(", ")||"\u2014")}submit(){if(this.index<this.count()-1)return this.next(),!1;let e=super.submit();for(let t=0;t<this.real();t++)this.stepper.setStepState(t,this.stepFields(t).some(i=>i.getError())?"error":"done");return e&&this.emit("finish",this.getValues()),e}reset(){super.reset(),this.clearErrors();for(let e=0;e<this.count();e++)this.stepper.setStepState(e,"pending");this.index!==0&&this.body.setActiveItem(0)}};v("stepform",d);export{d as a};
2
+ //# sourceMappingURL=chunk-5AXLYDKU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/form/stepform/stepform.ts"],
4
+ "sourcesContent": ["import { Form, type FormConfig } from '../form/form';\nimport { Container, type ContainerConfig } from '../../../core/container';\nimport { Component } from '../../../core/component';\nimport { Field } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { LayoutSpec } from '../../../layout/layout';\nimport { Stepper } from '../../navigation/stepper/stepper';\nimport { Button } from '../../base/button/button';\nimport { Toolbar } from '../../layout/toolbar/toolbar';\nimport '../../layout/container/container';\n\nexport interface FormStep {\n title: string;\n description?: string;\n icon?: string;\n /** May be left alone: the stepper says \"optional\" (its fields are still validated if filled wrongly). */\n optional?: boolean;\n items: ContainerConfig['items'];\n /** Default: two columns (one on a phone). */\n layout?: LayoutSpec;\n}\n\nexport interface StepFormConfig extends FormConfig {\n steps: FormStep[];\n /** Moving forward validates the steps on the way. `false` lets the user click any step. Default true. */\n linear?: boolean;\n /** Adds a last \"Review\" step with a summary of the values; a function renders the summary yourself. */\n review?: boolean | ((values: Record<string, any>, form: StepForm) => string | Node);\n reviewTitle?: string;\n backText?: string;\n nextText?: string;\n finishText?: string;\n /** Shows a Cancel button (fires `cancel`). */\n cancelText?: string;\n}\n\n/** The summary pane of the review step. */\nclass ReviewPane extends Component {\n protected override baseCls = 'op-stepform__review';\n setContent(nodes: Array<Node | string>) {\n this.el.replaceChildren(...nodes);\n }\n}\n\n/** One form, several steps: a Stepper on top, one step at a time, Back / Next / Finish, validation per step and an optional review. */\nexport class StepForm extends Form {\n protected override baseCls = 'op-form op-stepform';\n private stepper!: Stepper;\n private body!: Container;\n private pane?: ReviewPane;\n private backBtn!: Button;\n private nextBtn!: Button;\n private finishBtn!: Button;\n private index = 0;\n\n constructor(config: StepFormConfig) {\n let me!: StepForm;\n const steps = config.steps ?? [];\n const review = config.review ? new ReviewPane() : undefined;\n const stepper = new Stepper({ steps: [...steps.map(({ title, description, icon, optional }) => ({ title, description, icon, optional })), ...(review ? [{ title: config.reviewTitle ?? t('stepReview') }] : [])] });\n const panels = [\n ...steps.map((s) => ({ type: 'container', title: s.title, cls: 'op-stepform__step', layout: s.layout ?? { type: 'grid', columns: 2, gap: 12 }, items: s.items })),\n ...(review ? [{ type: 'container', title: config.reviewTitle ?? t('stepReview'), cls: 'op-stepform__step', items: [review] }] : []),\n ];\n const body = new Container({ cls: 'op-stepform__body', flex: 1, layout: { type: 'card' }, items: panels as never });\n const backBtn = new Button({ text: config.backText ?? t('stepBack'), handler: () => me.back() });\n const nextBtn = new Button({ text: config.nextText ?? t('stepNext'), variant: 'primary', handler: () => me.next() });\n const finishBtn = new Button({ text: config.finishText ?? t('stepFinish'), variant: 'primary', htmlType: 'submit' });\n const cancel = config.cancelText ? [new Button({ text: config.cancelText, variant: 'ghost', handler: () => me.emit('cancel') })] : [];\n const footer = new Toolbar({ cls: 'op-stepform__footer', items: [...cancel, '->', backBtn, nextBtn, finishBtn] });\n super({ ...config, layout: { type: 'vbox' }, items: [stepper, body, footer] });\n me = this;\n Object.assign(this, { stepper, body, pane: review, backBtn, nextBtn, finishBtn });\n stepper.on('before-select', (i: number) => (me.goTo(i), false));\n body.on('activate', () => me.onActivate());\n }\n\n private cfg(): StepFormConfig {\n return this.config as unknown as StepFormConfig;\n }\n\n private count(): number {\n return this.body.items.length;\n }\n private real(): number {\n return this.count() - (this.pane ? 1 : 0);\n }\n\n getStep(): number {\n return this.index;\n }\n getStepCount(): number {\n return this.count();\n }\n getStepper(): Stepper {\n return this.stepper;\n }\n\n private stepFields(i: number): Field<any>[] {\n const step = this.body.items[i];\n return step instanceof Container ? (step.query((c) => c instanceof Field) as Field<any>[]) : [];\n }\n\n /** Validates one step's fields (marks the errors, sets its state on the stepper). */\n validateStep(i: number): boolean {\n if (i >= this.real()) return true;\n const bad = this.stepFields(i).filter((f) => !f.validate());\n this.stepper.setStepState(i, bad.length ? 'error' : 'done');\n return !bad.length;\n }\n\n /** Moves to a step. Forward with `linear` validates the steps on the way and stops at the first invalid one. Returns whether it got there. */\n goTo(j: number): boolean {\n if (j < 0 || j >= this.count() || j === this.index) return false;\n if (this.emit('before-step-change', this.index, j) === false) return false;\n let target = j;\n if (this.cfg().linear !== false && j > this.index) {\n for (let k = this.index; k < j; k++) {\n if (!this.validateStep(k)) {\n target = k;\n break;\n }\n }\n }\n if (target !== this.index) this.body.setActiveItem(target);\n if (target !== j) this.stepFields(target).find((f) => f.getError())?.focus();\n return target === j;\n }\n next(): boolean {\n return this.goTo(this.index + 1);\n }\n back(): boolean {\n return this.goTo(this.index - 1);\n }\n\n /** The card layout changed the visible step (by `goTo`, or because `validate` brought an invalid field into view). */\n private onActivate(): void {\n const i = this.body.items.indexOf(this.body.getActiveItem()!);\n if (i < 0) return;\n const from = this.index;\n this.index = i;\n this.stepper.setActive(i);\n const last = this.count() - 1;\n this.backBtn.config.hidden = i === 0;\n this.nextBtn.config.hidden = i === last;\n this.finishBtn.config.hidden = i !== last;\n for (const [b, hide] of [[this.backBtn, i === 0], [this.nextBtn, i === last], [this.finishBtn, i !== last]] as const) if (b.rendered) b.el.hidden = hide;\n if (this.pane && i === last) this.refreshReview();\n if (i !== from) {\n this.emit('step-change', i, from);\n if (this.rendered && this.el.isConnected && !this.stepFields(i).some((f) => f.getError())) this.stepFields(i)[0]?.focus();\n }\n }\n\n private refreshReview(): void {\n const values = this.getValues();\n const fn = this.cfg().review;\n if (typeof fn === 'function') return this.pane!.setContent([fn(values, this)]);\n const out: Array<Node | string> = [];\n for (let i = 0; i < this.real(); i++) {\n const rows = this.stepFields(i).filter((f) => f.name);\n if (!rows.length) continue;\n out.push(h('h3', 'op-stepform__review-title', {}, String((this.body.items[i].config as { title?: string }).title ?? '')));\n out.push(h('dl', 'op-stepform__review-list', {}, ...rows.flatMap((f) => [h('dt', '', {}, f.config.label ?? (f.config as { boxLabel?: string }).boxLabel ?? f.name!), h('dd', '', {}, this.show_(f))])));\n }\n this.pane!.setContent(out);\n }\n\n /** What the user sees for a field (its display text; ticks for booleans, dots for passwords). */\n private show_(f: Field<any>): string {\n const v = f.getValue();\n if (typeof v === 'boolean') return v ? '\u2713' : '\u2014';\n if ((f.config as { inputType?: string }).inputType === 'password') return v ? '\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022' : '\u2014';\n const text = f.getDisplayText();\n if (text) return text;\n return v && typeof v === 'object' && !Array.isArray(v) ? Object.values(v).filter(Boolean).join(' \u2013 ') || '\u2014' : Array.isArray(v) ? v.join(', ') || '\u2014' : '\u2014';\n }\n\n /** Enter and the Finish button: Next on every step but the last; on the last, validate everything and `finish`. */\n override submit(): boolean {\n if (this.index < this.count() - 1) {\n this.next();\n return false;\n }\n const ok = super.submit();\n for (let i = 0; i < this.real(); i++) this.stepper.setStepState(i, this.stepFields(i).some((f) => f.getError()) ? 'error' : 'done');\n if (ok) this.emit('finish', this.getValues());\n return ok;\n }\n\n /** Clears the values and goes back to the first step. */\n override reset(): void {\n super.reset();\n this.clearErrors();\n for (let i = 0; i < this.count(); i++) this.stepper.setStepState(i, 'pending');\n if (this.index !== 0) this.body.setActiveItem(0);\n }\n}\nregister('stepform', StepForm);\n"],
5
+ "mappings": "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",
6
+ "names": ["ReviewPane", "Component", "nodes", "StepForm", "Form", "config", "me", "steps", "review", "stepper", "Stepper", "title", "description", "icon", "optional", "t", "panels", "s", "body", "Container", "backBtn", "Button", "nextBtn", "finishBtn", "cancel", "footer", "Toolbar", "i", "step", "c", "Field", "bad", "f", "j", "target", "k", "from", "last", "b", "hide", "values", "fn", "out", "rows", "h", "v", "text", "ok", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as o,b as n}from"./chunk-IYPKPLCU.js";var t=class extends o{baseCls="op-label";build(){let e=document.createElement(this.config.for?"label":"span");return e.className="op-label",this.config.for&&(e.htmlFor=this.config.for),e}onRender(){this.setText(this.config.text??""),this.setVariant(this.config.variant??"default")}setText(e){this.config.text=e,this.rendered&&(this.el.textContent=e)}setVariant(e){if(this.config.variant=e,!!this.rendered)for(let i of["default","muted","title"])this.el.classList.toggle(`op-label--${i}`,i===e)}};n("label",t);export{t as a};
2
+ //# sourceMappingURL=chunk-5GNEFX6F.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/base/label/label.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\n\nexport interface LabelConfig extends ComponentConfig {\n text?: string;\n /** Id of the field this label names (renders a `<label for>`). */\n for?: string;\n variant?: 'default' | 'muted' | 'title';\n}\n\nexport class Label extends Component<LabelConfig> {\n protected override baseCls = 'op-label';\n protected override build() {\n const el = document.createElement(this.config.for ? 'label' : 'span');\n el.className = 'op-label';\n if (this.config.for) (el as HTMLLabelElement).htmlFor = this.config.for;\n return el;\n }\n protected override onRender() {\n this.setText(this.config.text ?? '');\n this.setVariant(this.config.variant ?? 'default');\n }\n setText(text: string) {\n this.config.text = text;\n if (this.rendered) this.el.textContent = text;\n }\n setVariant(variant: NonNullable<LabelConfig['variant']>) {\n this.config.variant = variant;\n if (!this.rendered) return;\n for (const v of ['default', 'muted', 'title']) this.el.classList.toggle(`op-label--${v}`, v === variant);\n }\n}\nregister('label', Label);\n"],
5
+ "mappings": "+CAUO,IAAMA,EAAN,cAAoBC,CAAuB,CAC7B,QAAU,WACV,OAAQ,CACzB,IAAMC,EAAK,SAAS,cAAc,KAAK,OAAO,IAAM,QAAU,MAAM,EACpE,OAAAA,EAAG,UAAY,WACX,KAAK,OAAO,MAAMA,EAAwB,QAAU,KAAK,OAAO,KAC7DA,CACT,CACmB,UAAW,CAC5B,KAAK,QAAQ,KAAK,OAAO,MAAQ,EAAE,EACnC,KAAK,WAAW,KAAK,OAAO,SAAW,SAAS,CAClD,CACA,QAAQC,EAAc,CACpB,KAAK,OAAO,KAAOA,EACf,KAAK,WAAU,KAAK,GAAG,YAAcA,EAC3C,CACA,WAAWC,EAA8C,CAEvD,GADA,KAAK,OAAO,QAAUA,EAClB,EAAC,KAAK,SACV,QAAWC,IAAK,CAAC,UAAW,QAAS,OAAO,EAAG,KAAK,GAAG,UAAU,OAAO,aAAaA,CAAC,GAAIA,IAAMD,CAAO,CACzG,CACF,EACAE,EAAS,QAASN,CAAK",
6
+ "names": ["Label", "Component", "el", "text", "variant", "v", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as x}from"./chunk-PSPQH35P.js";import{a as m}from"./chunk-5GNEFX6F.js";import{a as u}from"./chunk-SNTHW4K2.js";import{c}from"./chunk-UPOBGNJ5.js";import{d as p}from"./chunk-IHAYOSBR.js";import{e as a}from"./chunk-MA5BJL3S.js";function l(t){return new Promise(e=>{let r=!1,s=i=>{r||(r=!0,e(i))},o=t.input?new u({value:t.input.value??"",placeholder:t.input.placeholder,validators:t.input.validators,ariaLabel:t.text}):void 0,d=new m({text:t.text,flex:1}),n=new x({title:t.title,cls:"op-messagebox",closeAction:"destroy",items:[new c({layout:{type:"hbox",gap:12,align:"flex-start"},items:[...t.icon?[new p({name:t.icon,cls:"op-messagebox__icon"})]:[],new c({layout:{type:"vbox"},flex:1,items:[d,...o?[o]:[]]})]})],buttons:t.buttons.map(i=>({text:i.text,variant:i.variant??"default",handler:()=>{t.beforeClose?.(i.id,n,o)!==!1&&(s(i.id),n.close())}}))});n.el.setAttribute("role",t.input?"dialog":"alertdialog"),n.el.setAttribute("aria-describedby",d.id),n.on("close",()=>s(t.cancelId??t.buttons[t.buttons.length-1].id));let g=t.buttons.find(i=>i.variant==="primary"||i.variant==="danger");o?.on("enter",()=>n.el.querySelectorAll(".op-panel__footer button")[t.buttons.indexOf(g??t.buttons[0])].click()),n.show(),o||n.el.querySelector(".op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger")?.focus()})}var T={show:l,async alert(t,e={}){await l({text:t,title:e.title,icon:e.icon??"info",buttons:[{id:"ok",text:e.okText??a("ok"),variant:"primary"}],cancelId:"ok"})},async confirm(t,e={}){return await l({text:t,title:e.title,icon:e.icon??(e.danger?"alert":"info"),buttons:[{id:"cancel",text:e.cancelText??a("cancel")},{id:"ok",text:e.okText??a("ok"),variant:e.danger?"danger":"primary"}],cancelId:"cancel"})==="ok"},async prompt(t,e={}){let r=null;return await l({text:t,title:e.title,input:{value:e.value,placeholder:e.placeholder,validators:e.validators},buttons:[{id:"cancel",text:e.cancelText??a("cancel")},{id:"ok",text:e.okText??a("ok"),variant:"primary"}],cancelId:"cancel",beforeClose:(o,d,n)=>{if(o==="ok"){if(!n.validate())return!1;r=n.getValue()}}})==="ok"?r:null}};export{T as a};
2
+ //# sourceMappingURL=chunk-5Q6Y6CM4.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/messagebox/messagebox.ts"],
4
+ "sourcesContent": ["import { Window } from '../window/window';\nimport { Label } from '../../base/label/label';\nimport { TextField } from '../../fields/textfield/textfield';\nimport { Container } from '../../../core/container';\nimport { Icon } from '../../base/icon/icon';\nimport { t } from '../../../core/i18n';\nimport type { Validator } from '../../../core/validators';\n\nexport interface MessageBoxButton {\n id: string;\n text: string;\n variant?: 'default' | 'primary' | 'danger';\n}\n\nexport interface MessageBoxConfig {\n text: string;\n title?: string;\n icon?: string;\n buttons: MessageBoxButton[];\n /** Resolved when closed with Esc or the close button. */\n cancelId?: string;\n /** Adds a text input; `show` then resolves with the button id and the input is read by `prompt`. */\n input?: { value?: string; placeholder?: string; validators?: Validator<string>[] };\n /** Called with the pressed button id before closing; return `false` to keep the dialog open. */\n beforeClose?: (id: string, win: Window, input?: TextField) => boolean | void;\n}\n\nfunction open(cfg: MessageBoxConfig): Promise<string> {\n return new Promise((resolve) => {\n let done = false;\n const finish = (id: string) => {\n if (done) return;\n done = true;\n resolve(id);\n };\n const field = cfg.input ? new TextField({ value: cfg.input.value ?? '', placeholder: cfg.input.placeholder, validators: cfg.input.validators, ariaLabel: cfg.text }) : undefined;\n const message = new Label({ text: cfg.text, flex: 1 });\n const win: Window = new Window({\n title: cfg.title,\n cls: 'op-messagebox',\n closeAction: 'destroy',\n items: [\n new Container({\n layout: { type: 'hbox', gap: 12, align: 'flex-start' },\n items: [...(cfg.icon ? [new Icon({ name: cfg.icon, cls: 'op-messagebox__icon' })] : []), new Container({ layout: { type: 'vbox' }, flex: 1, items: [message, ...(field ? [field] : [])] })],\n }),\n ],\n buttons: cfg.buttons.map((b) => ({\n text: b.text,\n variant: b.variant ?? 'default',\n handler: () => {\n if (cfg.beforeClose?.(b.id, win, field) === false) return;\n finish(b.id);\n win.close();\n },\n })),\n });\n win.el.setAttribute('role', cfg.input ? 'dialog' : 'alertdialog');\n win.el.setAttribute('aria-describedby', message.id);\n win.on('close', () => finish(cfg.cancelId ?? cfg.buttons[cfg.buttons.length - 1].id));\n const primary = cfg.buttons.find((b) => b.variant === 'primary' || b.variant === 'danger');\n field?.on('enter', () => (win.el.querySelectorAll('.op-panel__footer button')[cfg.buttons.indexOf(primary ?? cfg.buttons[0])] as HTMLElement).click());\n win.show();\n // the primary action takes the initial focus unless there is an input\n if (!field) win.el.querySelector<HTMLElement>('.op-panel__footer .op-button--primary, .op-panel__footer .op-button--danger')?.focus();\n });\n}\n\nexport interface AlertOptions {\n title?: string;\n okText?: string;\n icon?: string;\n}\nexport interface ConfirmOptions {\n title?: string;\n okText?: string;\n cancelText?: string;\n danger?: boolean;\n icon?: string;\n}\nexport interface PromptOptions {\n title?: string;\n value?: string;\n placeholder?: string;\n okText?: string;\n cancelText?: string;\n validators?: Validator<string>[];\n}\n\nexport const MessageBox = {\n show: open,\n\n async alert(text: string, o: AlertOptions = {}): Promise<void> {\n await open({ text, title: o.title, icon: o.icon ?? 'info', buttons: [{ id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' }], cancelId: 'ok' });\n },\n\n async confirm(text: string, o: ConfirmOptions = {}): Promise<boolean> {\n const id = await open({\n text,\n title: o.title,\n icon: o.icon ?? (o.danger ? 'alert' : 'info'),\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: o.danger ? 'danger' : 'primary' },\n ],\n cancelId: 'cancel',\n });\n return id === 'ok';\n },\n\n /** Resolves with the text, or `null` when cancelled. The dialog stays open while the validators fail. */\n async prompt(text: string, o: PromptOptions = {}): Promise<string | null> {\n let value: string | null = null;\n const id = await open({\n text,\n title: o.title,\n input: { value: o.value, placeholder: o.placeholder, validators: o.validators },\n buttons: [\n { id: 'cancel', text: o.cancelText ?? t('cancel') },\n { id: 'ok', text: o.okText ?? t('ok'), variant: 'primary' },\n ],\n cancelId: 'cancel',\n beforeClose: (btn, _win, field) => {\n if (btn !== 'ok') return;\n if (!field!.validate()) return false;\n value = field!.getValue();\n },\n });\n return id === 'ok' ? value : null;\n },\n};\n"],
5
+ "mappings": "2OA2BA,SAASA,EAAKC,EAAwC,CACpD,OAAO,IAAI,QAASC,GAAY,CAC9B,IAAIC,EAAO,GACLC,EAAUC,GAAe,CACzBF,IACJA,EAAO,GACPD,EAAQG,CAAE,EACZ,EACMC,EAAQL,EAAI,MAAQ,IAAIM,EAAU,CAAE,MAAON,EAAI,MAAM,OAAS,GAAI,YAAaA,EAAI,MAAM,YAAa,WAAYA,EAAI,MAAM,WAAY,UAAWA,EAAI,IAAK,CAAC,EAAI,OACjKO,EAAU,IAAIC,EAAM,CAAE,KAAMR,EAAI,KAAM,KAAM,CAAE,CAAC,EAC/CS,EAAc,IAAIC,EAAO,CAC7B,MAAOV,EAAI,MACX,IAAK,gBACL,YAAa,UACb,MAAO,CACL,IAAIW,EAAU,CACZ,OAAQ,CAAE,KAAM,OAAQ,IAAK,GAAI,MAAO,YAAa,EACrD,MAAO,CAAC,GAAIX,EAAI,KAAO,CAAC,IAAIY,EAAK,CAAE,KAAMZ,EAAI,KAAM,IAAK,qBAAsB,CAAC,CAAC,EAAI,CAAC,EAAI,IAAIW,EAAU,CAAE,OAAQ,CAAE,KAAM,MAAO,EAAG,KAAM,EAAG,MAAO,CAACJ,EAAS,GAAIF,EAAQ,CAACA,CAAK,EAAI,CAAC,CAAE,CAAE,CAAC,CAAC,CAC5L,CAAC,CACH,EACA,QAASL,EAAI,QAAQ,IAAKa,IAAO,CAC/B,KAAMA,EAAE,KACR,QAASA,EAAE,SAAW,UACtB,QAAS,IAAM,CACTb,EAAI,cAAca,EAAE,GAAIJ,EAAKJ,CAAK,IAAM,KAC5CF,EAAOU,EAAE,EAAE,EACXJ,EAAI,MAAM,EACZ,CACF,EAAE,CACJ,CAAC,EACDA,EAAI,GAAG,aAAa,OAAQT,EAAI,MAAQ,SAAW,aAAa,EAChES,EAAI,GAAG,aAAa,mBAAoBF,EAAQ,EAAE,EAClDE,EAAI,GAAG,QAAS,IAAMN,EAAOH,EAAI,UAAYA,EAAI,QAAQA,EAAI,QAAQ,OAAS,CAAC,EAAE,EAAE,CAAC,EACpF,IAAMc,EAAUd,EAAI,QAAQ,KAAMa,GAAMA,EAAE,UAAY,WAAaA,EAAE,UAAY,QAAQ,EACzFR,GAAO,GAAG,QAAS,IAAOI,EAAI,GAAG,iBAAiB,0BAA0B,EAAET,EAAI,QAAQ,QAAQc,GAAWd,EAAI,QAAQ,CAAC,CAAC,CAAC,EAAkB,MAAM,CAAC,EACrJS,EAAI,KAAK,EAEJJ,GAAOI,EAAI,GAAG,cAA2B,6EAA6E,GAAG,MAAM,CACtI,CAAC,CACH,CAuBO,IAAMM,EAAa,CACxB,KAAMhB,EAEN,MAAM,MAAMiB,EAAcC,EAAkB,CAAC,EAAkB,CAC7D,MAAMlB,EAAK,CAAE,KAAAiB,EAAM,MAAOC,EAAE,MAAO,KAAMA,EAAE,MAAQ,OAAQ,QAAS,CAAC,CAAE,GAAI,KAAM,KAAMA,EAAE,QAAUC,EAAE,IAAI,EAAG,QAAS,SAAU,CAAC,EAAG,SAAU,IAAK,CAAC,CACrJ,EAEA,MAAM,QAAQF,EAAcC,EAAoB,CAAC,EAAqB,CAWpE,OAVW,MAAMlB,EAAK,CACpB,KAAAiB,EACA,MAAOC,EAAE,MACT,KAAMA,EAAE,OAASA,EAAE,OAAS,QAAU,QACtC,QAAS,CACP,CAAE,GAAI,SAAU,KAAMA,EAAE,YAAcC,EAAE,QAAQ,CAAE,EAClD,CAAE,GAAI,KAAM,KAAMD,EAAE,QAAUC,EAAE,IAAI,EAAG,QAASD,EAAE,OAAS,SAAW,SAAU,CAClF,EACA,SAAU,QACZ,CAAC,IACa,IAChB,EAGA,MAAM,OAAOD,EAAcC,EAAmB,CAAC,EAA2B,CACxE,IAAIE,EAAuB,KAgB3B,OAfW,MAAMpB,EAAK,CACpB,KAAAiB,EACA,MAAOC,EAAE,MACT,MAAO,CAAE,MAAOA,EAAE,MAAO,YAAaA,EAAE,YAAa,WAAYA,EAAE,UAAW,EAC9E,QAAS,CACP,CAAE,GAAI,SAAU,KAAMA,EAAE,YAAcC,EAAE,QAAQ,CAAE,EAClD,CAAE,GAAI,KAAM,KAAMD,EAAE,QAAUC,EAAE,IAAI,EAAG,QAAS,SAAU,CAC5D,EACA,SAAU,SACV,YAAa,CAACE,EAAKC,EAAMhB,IAAU,CACjC,GAAIe,IAAQ,KACZ,IAAI,CAACf,EAAO,SAAS,EAAG,MAAO,GAC/Bc,EAAQd,EAAO,SAAS,EAC1B,CACF,CAAC,IACa,KAAOc,EAAQ,IAC/B,CACF",
6
+ "names": ["open", "cfg", "resolve", "done", "finish", "id", "field", "TextField", "message", "Label", "win", "Window", "Container", "Icon", "b", "primary", "MessageBox", "text", "o", "t", "value", "btn", "_win"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as i,b as o}from"./chunk-IYPKPLCU.js";var t=class extends i{baseCls="op-spacer";tag="span";onRender(){let e=this.config;e.width==null&&e.flex==null&&!e.line&&(this.el.style.flex="1"),this.setLine(!!e.line)}setLine(e){this.config.line=e,this.rendered&&(this.el.classList.toggle("op-spacer--line",e),e?this.el.setAttribute("role","separator"):this.el.setAttribute("aria-hidden","true"),e&&this.el.removeAttribute("aria-hidden"))}};o("spacer",t);export{t as a};
2
+ //# sourceMappingURL=chunk-666O2GKD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/layout/spacer/spacer.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\n\nexport interface SpacerConfig extends ComponentConfig {\n /** Renders a vertical separator line. */\n line?: boolean;\n}\n\n/** Without `width`/`flex` it takes the free space (`flex: 1`), pushing the next items away. */\nexport class Spacer extends Component<SpacerConfig> {\n protected override baseCls = 'op-spacer';\n protected override tag = 'span' as const;\n protected override onRender() {\n const c = this.config;\n if (c.width == null && c.flex == null && !c.line) this.el.style.flex = '1';\n this.setLine(!!c.line);\n }\n setLine(line: boolean) {\n this.config.line = line;\n if (!this.rendered) return;\n this.el.classList.toggle('op-spacer--line', line);\n if (line) this.el.setAttribute('role', 'separator');\n else this.el.setAttribute('aria-hidden', 'true');\n if (line) this.el.removeAttribute('aria-hidden');\n }\n}\nregister('spacer', Spacer);\n"],
5
+ "mappings": "+CASO,IAAMA,EAAN,cAAqBC,CAAwB,CAC/B,QAAU,YACV,IAAM,OACN,UAAW,CAC5B,IAAMC,EAAI,KAAK,OACXA,EAAE,OAAS,MAAQA,EAAE,MAAQ,MAAQ,CAACA,EAAE,OAAM,KAAK,GAAG,MAAM,KAAO,KACvE,KAAK,QAAQ,CAAC,CAACA,EAAE,IAAI,CACvB,CACA,QAAQC,EAAe,CACrB,KAAK,OAAO,KAAOA,EACd,KAAK,WACV,KAAK,GAAG,UAAU,OAAO,kBAAmBA,CAAI,EAC5CA,EAAM,KAAK,GAAG,aAAa,OAAQ,WAAW,EAC7C,KAAK,GAAG,aAAa,cAAe,MAAM,EAC3CA,GAAM,KAAK,GAAG,gBAAgB,aAAa,EACjD,CACF,EACAC,EAAS,SAAUJ,CAAM",
6
+ "names": ["Spacer", "Component", "c", "line", "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 s}from"./chunk-CUPAPOKC.js";import{b as u}from"./chunk-676AKAGF.js";import{b as l}from"./chunk-PZSHOSOS.js";var p=400,o,i,d,c=!1,r=e=>e instanceof Element?e.closest("[data-op-tip]"):null;function m(e){let t=e.dataset.opTip;t&&(o??=l("div","op-tooltip",{role:"tooltip",id:"op-tooltip"}),o.textContent=t,u(o,e),i=e,e.setAttribute("aria-describedby","op-tooltip"),s(o,e,{placement:"top",offset:6}))}function n(){clearTimeout(d),i&&i.removeAttribute("aria-describedby"),i=void 0,o?.remove()}function f(e,t){clearTimeout(d),i!==e&&(n(),d=setTimeout(()=>m(e),t))}function E(){c||typeof document>"u"||(c=!0,document.addEventListener("pointerover",e=>{if(e.pointerType==="touch")return;let t=r(e.target);t&&f(t,p)}),document.addEventListener("pointerout",e=>{let t=r(e.target);t&&!t.contains(e.relatedTarget)&&n()}),document.addEventListener("focusin",e=>{let t=r(e.target),a=!0;try{a=!!t?.matches(":focus-visible")}catch{}t&&a&&f(t,0)}),document.addEventListener("focusout",n),document.addEventListener("pointerdown",n,!0),document.addEventListener("keydown",e=>e.key==="Escape"&&n(),!0),document.addEventListener("scroll",n,!0))}E();var L={configure(e){e.delay!=null&&(p=e.delay)},show:m,hide:n};function b(e,t){e.dataset.opTip=t}export{L as a,b};
2
+ //# sourceMappingURL=chunk-6NJW7QFD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/tooltip/tooltip.ts"],
4
+ "sourcesContent": ["import { h } from '../../../core/dom';\nimport { toLayer } from '../../../core/layer';\nimport { place } from '../../../core/position';\n\n// Tooltips are plain attributes: any element (or Component with `tooltip`) carries `data-op-tip`,\n// and one delegated set of listeners shows a single shared tooltip element.\nlet delay = 400;\nlet el: HTMLElement | undefined;\nlet target: HTMLElement | undefined;\nlet timer: ReturnType<typeof setTimeout> | undefined;\nlet installed = false;\n\nconst tipOf = (n: EventTarget | null) => (n instanceof Element ? n.closest<HTMLElement>('[data-op-tip]') : null);\n\nfunction show(t: HTMLElement) {\n const text = t.dataset.opTip;\n if (!text) return;\n el ??= h('div', 'op-tooltip', { role: 'tooltip', id: 'op-tooltip' });\n el.textContent = text;\n toLayer(el, t);\n target = t;\n t.setAttribute('aria-describedby', 'op-tooltip');\n place(el, t, { placement: 'top', offset: 6 });\n}\n\nfunction hide() {\n clearTimeout(timer);\n if (target) target.removeAttribute('aria-describedby');\n target = undefined;\n el?.remove();\n}\n\nfunction schedule(t: HTMLElement, ms: number) {\n clearTimeout(timer);\n if (target === t) return;\n hide();\n timer = setTimeout(() => show(t), ms);\n}\n\nfunction install() {\n if (installed || typeof document === 'undefined') return;\n installed = true;\n document.addEventListener('pointerover', (e: Event) => {\n if ((e as PointerEvent).pointerType === 'touch') return;\n const t = tipOf(e.target);\n if (t) schedule(t, delay);\n });\n document.addEventListener('pointerout', (e: Event) => {\n const t = tipOf(e.target);\n if (t && !t.contains((e as PointerEvent).relatedTarget as Node)) hide();\n });\n document.addEventListener('focusin', (e: Event) => {\n const t = tipOf(e.target);\n let visible = true;\n try {\n visible = !!t?.matches(':focus-visible');\n } catch { /* engine without :focus-visible */ }\n if (t && visible) schedule(t, 0);\n });\n document.addEventListener('focusout', hide);\n document.addEventListener('pointerdown', hide, true);\n document.addEventListener('keydown', (e: KeyboardEvent) => e.key === 'Escape' && hide(), true);\n document.addEventListener('scroll', hide, true);\n}\ninstall();\n\nexport const Tooltip = {\n /** Default delay (ms) before a hover tooltip shows. */\n configure(o: { delay?: number }) {\n if (o.delay != null) delay = o.delay;\n },\n show,\n hide,\n};\n\n/** Gives any element a tooltip (same as the `tooltip` config on components). */\nexport function attachTooltip(target: HTMLElement, text: string): void {\n target.dataset.opTip = text;\n}\n"],
5
+ "mappings": "wHAMA,IAAIA,EAAQ,IACRC,EACAC,EACAC,EACAC,EAAY,GAEVC,EAASC,GAA2BA,aAAa,QAAUA,EAAE,QAAqB,eAAe,EAAI,KAE3G,SAASC,EAAKC,EAAgB,CAC5B,IAAMC,EAAOD,EAAE,QAAQ,MAClBC,IACLR,IAAOS,EAAE,MAAO,aAAc,CAAE,KAAM,UAAW,GAAI,YAAa,CAAC,EACnET,EAAG,YAAcQ,EACjBE,EAAQV,EAAIO,CAAC,EACbN,EAASM,EACTA,EAAE,aAAa,mBAAoB,YAAY,EAC/CI,EAAMX,EAAIO,EAAG,CAAE,UAAW,MAAO,OAAQ,CAAE,CAAC,EAC9C,CAEA,SAASK,GAAO,CACd,aAAaV,CAAK,EACdD,GAAQA,EAAO,gBAAgB,kBAAkB,EACrDA,EAAS,OACTD,GAAI,OAAO,CACb,CAEA,SAASa,EAASN,EAAgBO,EAAY,CAC5C,aAAaZ,CAAK,EACdD,IAAWM,IACfK,EAAK,EACLV,EAAQ,WAAW,IAAMI,EAAKC,CAAC,EAAGO,CAAE,EACtC,CAEA,SAASC,GAAU,CACbZ,GAAa,OAAO,SAAa,MACrCA,EAAY,GACZ,SAAS,iBAAiB,cAAgB,GAAa,CACrD,GAAK,EAAmB,cAAgB,QAAS,OACjD,IAAM,EAAIC,EAAM,EAAE,MAAM,EACpB,GAAGS,EAAS,EAAGd,CAAK,CAC1B,CAAC,EACD,SAAS,iBAAiB,aAAe,GAAa,CACpD,IAAM,EAAIK,EAAM,EAAE,MAAM,EACpB,GAAK,CAAC,EAAE,SAAU,EAAmB,aAAqB,GAAGQ,EAAK,CACxE,CAAC,EACD,SAAS,iBAAiB,UAAY,GAAa,CACjD,IAAM,EAAIR,EAAM,EAAE,MAAM,EACpBY,EAAU,GACd,GAAI,CACFA,EAAU,CAAC,CAAC,GAAG,QAAQ,gBAAgB,CACzC,MAAQ,CAAsC,CAC1C,GAAKA,GAASH,EAAS,EAAG,CAAC,CACjC,CAAC,EACD,SAAS,iBAAiB,WAAYD,CAAI,EAC1C,SAAS,iBAAiB,cAAeA,EAAM,EAAI,EACnD,SAAS,iBAAiB,UAAY,GAAqB,EAAE,MAAQ,UAAYA,EAAK,EAAG,EAAI,EAC7F,SAAS,iBAAiB,SAAUA,EAAM,EAAI,EAChD,CACAG,EAAQ,EAED,IAAME,EAAU,CAErB,UAAUC,EAAuB,CAC3BA,EAAE,OAAS,OAAMnB,EAAQmB,EAAE,MACjC,EACA,KAAAZ,EACA,KAAAM,CACF,EAGO,SAASO,EAAclB,EAAqBO,EAAoB,CACrEP,EAAO,QAAQ,MAAQO,CACzB",
6
+ "names": ["delay", "el", "target", "timer", "installed", "tipOf", "n", "show", "t", "text", "h", "toLayer", "place", "hide", "schedule", "ms", "install", "visible", "Tooltip", "o", "attachTooltip"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as m}from"./chunk-K2DGY6MP.js";import{e as p}from"./chunk-6NCXO5ZP.js";import{b as u}from"./chunk-IYPKPLCU.js";import{b as o}from"./chunk-PZSHOSOS.js";var l=class extends m{baseCls="op-field op-slider";track;fill;knobs=[];bubbles=[];marksEl;get min(){return this.config.min??0}get max(){return this.config.max??100}get step(){return this.config.step??1}get isRange(){return!!this.config.range}emptyValue(){return this.isRange?[this.min,this.max]:this.min}isEmpty(){return!1}fmt(t){return this.config.format?this.config.format(t):String(t)}vals(){return Array.isArray(this.value)?[...this.value]:[this.value]}snap(t){let e=Math.round((t-this.min)/this.step)*this.step+this.min,i=(String(this.step).split(".")[1]??"").length;return Math.max(this.min,Math.min(this.max,Number(e.toFixed(i))))}createControl(){let t=this.config;this.track=o("div","op-slider__track"),this.fill=o("div","op-slider__fill"),this.marksEl=o("div","op-slider__marks",{"aria-hidden":"true"}),this.track.append(this.fill,this.marksEl),this.buildKnobs(),this.listen(this.track,"pointerdown",i=>this.onTrackDown(i));let e=o("div","op-slider__box",{},this.track);return t.showScale&&e.append(o("div","op-slider__scale",{},o("span","",{},this.fmt(this.min)),o("span","",{},this.fmt(this.max)))),this.inputEl=this.knobs[0],e}buildKnobs(){this.knobs.forEach(e=>e.remove()),this.knobs=[],this.bubbles=[];let t=this.isRange?2:1;for(let e=0;e<t;e++){let i=o("span","op-slider__bubble",{"aria-hidden":"true"}),s=o("div","op-slider__knob",{role:"slider",tabindex:0,"aria-orientation":"horizontal","data-i":e},i);this.listen(s,"pointerdown",n=>this.onKnobDown(n,e)),this.listen(s,"keydown",n=>this.onKey(n,e)),this.listen(s,"focus",()=>this.el.classList.add("is-focus-knob")),this.listen(s,"blur",()=>this.el.classList.remove("is-focus-knob")),this.knobs.push(s),this.bubbles.push(i),this.track.append(s)}}onRender(){super.onRender(),this.knobs.forEach(t=>t.setAttribute("aria-labelledby",`${this.id}-label`)),this.el.querySelector(".op-field__label").id=`${this.id}-label`,this.paintMarks(),this.el.classList.toggle("has-bubble-always",this.config.showValue==="always"),this.el.classList.toggle("has-bubble-never",this.config.showValue==="never")}pct(t){return this.max===this.min?0:(t-this.min)/(this.max-this.min)*100}applyValue(t){let e=Array.isArray(t)?t:[t];this.knobs.forEach((n,a)=>{let r=e[a]??e[0];n.style.left=`${this.pct(r)}%`,n.setAttribute("aria-valuemin",String(a===1?e[0]:this.min)),n.setAttribute("aria-valuemax",String(a===0&&this.isRange?e[1]:this.max)),n.setAttribute("aria-valuenow",String(r)),n.setAttribute("aria-valuetext",this.fmt(r)),this.bubbles[a].textContent=this.fmt(r)});let i=this.isRange?this.pct(e[0]):0,s=this.pct(this.isRange?e[1]:e[0]);this.fill.style.left=`${i}%`,this.fill.style.width=`${Math.max(0,s-i)}%`}paintMarks(){let t=this.config.marks;if(this.marksEl.replaceChildren(),!t)return;let e=Array.isArray(t)?t:(()=>{let i=Math.floor((this.max-this.min)/this.step),s=Math.ceil(i/20)||1;return Array.from({length:Math.floor(i/s)+1},(n,a)=>({value:this.min+a*s*this.step}))})();for(let i of e){let s=o("span","op-slider__mark",{},i.label?o("span","op-slider__mark-label",{},i.label):"");s.style.left=`${this.pct(i.value)}%`,this.marksEl.append(s)}}valueAt(t){let e=this.track.getBoundingClientRect();return this.snap(this.min+Math.max(0,Math.min(1,(t.clientX-e.left)/(e.width||1)))*(this.max-this.min))}nearest(t){if(!this.isRange)return 0;let[e,i]=this.vals();return Math.abs(t-e)<=Math.abs(t-i)?t>i?1:0:1}onTrackDown(t){if(t.target.closest(".op-slider__knob")||this.config.disabled||this.config.readonly||t.button)return;let e=this.nearest(this.valueAt(t));this.onKnobDown(t,e)}onKnobDown(t,e){if(this.config.disabled||this.config.readonly||t.button)return;t.preventDefault();let i=this.knobs[e];i.focus(),i.setPointerCapture?.(t.pointerId),this.el.classList.add("is-dragging"),this.emit("slide-start");let s=p(i,"x"),n=t.clientX;this.setAt(e,this.valueAt(t));let a=h=>{s.move(h.clientX-n),n=h.clientX,this.setAt(e,this.valueAt(h))},r=()=>{i.removeEventListener("pointermove",a),i.removeEventListener("pointerup",r),i.removeEventListener("pointercancel",r),this.el.classList.remove("is-dragging"),s.release(),this.flushSettled(),this.emit("slide-end",this.value)};i.addEventListener("pointermove",a),i.addEventListener("pointerup",r),i.addEventListener("pointercancel",r),this.own(r)}setAt(t,e){let i=this.vals();this.isRange?i[t]=t===0?Math.min(e,i[1]):Math.max(e,i[0]):i[0]=e;let s=this.isRange?[i[0],i[1]]:i[0];this.isEqual(s,this.value)||(this.commit(s),this.applyValue(s))}onKey(t,e){if(this.config.disabled||this.config.readonly)return;let i=this.vals(),s=i[e],n=this.step*10,a=this.isRange&&e===1?i[0]:this.min,r=this.isRange&&e===0?i[1]:this.max,h={ArrowRight:s+this.step,ArrowUp:s+this.step,ArrowLeft:s-this.step,ArrowDown:s-this.step,PageUp:s+n,PageDown:s-n,Home:a,End:r};t.key in h&&(t.preventDefault(),this.setAt(e,Math.max(a,Math.min(r,this.snap(h[t.key])))),this.flushSettled(),this.emit("slide-end",this.value))}getPercent(){return this.pct(this.vals()[0])}refresh(){this.rendered&&(this.applyValue(this.value),this.paintMarks())}setMin(t){this.config.min=t,this.value=this.clampAll(this.value),this.refresh()}setMax(t){this.config.max=t,this.value=this.clampAll(this.value),this.refresh()}setStep(t){this.config.step=t,this.value=this.clampAll(this.value),this.refresh()}clampAll(t){return Array.isArray(t)?[this.snap(t[0]),this.snap(t[1])]:this.snap(t)}setRange(t){if(t===this.isRange)return;let e=this.vals();this.config.range=t,this.value=t?[e[0],this.max]:e[0],this.rendered&&(this.buildKnobs(),this.inputEl=this.knobs[0],this.applyValue(this.value))}onDisabled(t){this.knobs.forEach(e=>(e.tabIndex=t?-1:0,e.setAttribute("aria-disabled",String(t))))}onReadonly(t){this.knobs.forEach(e=>e.setAttribute("aria-readonly",String(t)))}};u("slider",l);export{l as a};
2
+ //# sourceMappingURL=chunk-6O2BXCRN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/fields/slider/slider.ts"],
4
+ "sourcesContent": ["import { Field, type FieldConfig } from '../../../core/field';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { knobStretch } from '../../../motion/extras';\n\nexport interface SliderMark {\n value: number;\n label?: string;\n}\n\nexport interface SliderConfig extends FieldConfig<number | [number, number]> {\n min?: number;\n max?: number;\n step?: number;\n /** Two knobs: the value is `[low, high]`. */\n range?: boolean;\n marks?: boolean | SliderMark[];\n /** When the bubble with the value shows. Default `drag` (while dragging or focused). */\n showValue?: 'drag' | 'always' | 'never';\n format?: (v: number) => string;\n showScale?: boolean;\n}\n\ntype V = number | [number, number];\n\n/** A bar with a ball to drag: a number, or a range with two balls. */\nexport class Slider extends Field<V, SliderConfig> {\n protected override baseCls = 'op-field op-slider';\n private track!: HTMLElement;\n private fill!: HTMLElement;\n private knobs: HTMLElement[] = [];\n private bubbles: HTMLElement[] = [];\n private marksEl!: HTMLElement;\n\n private get min() {\n return this.config.min ?? 0;\n }\n private get max() {\n return this.config.max ?? 100;\n }\n private get step() {\n return this.config.step ?? 1;\n }\n private get isRange() {\n return !!this.config.range;\n }\n\n protected override emptyValue(): V {\n return this.isRange ? [this.min, this.max] : this.min;\n }\n protected override isEmpty(): boolean {\n return false;\n }\n\n private fmt(v: number): string {\n return this.config.format ? this.config.format(v) : String(v);\n }\n private vals(): number[] {\n return Array.isArray(this.value) ? [...this.value] : [this.value as number];\n }\n\n /** Snaps to a multiple of `step` inside [min, max] (without float noise). */\n private snap(v: number): number {\n const n = Math.round((v - this.min) / this.step) * this.step + this.min;\n const dec = (String(this.step).split('.')[1] ?? '').length;\n return Math.max(this.min, Math.min(this.max, Number(n.toFixed(dec))));\n }\n\n protected createControl() {\n const c = this.config;\n this.track = h('div', 'op-slider__track');\n this.fill = h('div', 'op-slider__fill');\n this.marksEl = h('div', 'op-slider__marks', { 'aria-hidden': 'true' });\n this.track.append(this.fill, this.marksEl);\n this.buildKnobs();\n this.listen(this.track, 'pointerdown', (e: PointerEvent) => this.onTrackDown(e));\n const box = h('div', 'op-slider__box', {}, this.track);\n if (c.showScale) box.append(h('div', 'op-slider__scale', {}, h('span', '', {}, this.fmt(this.min)), h('span', '', {}, this.fmt(this.max))));\n this.inputEl = this.knobs[0];\n return box;\n }\n\n private buildKnobs() {\n this.knobs.forEach((k) => k.remove());\n this.knobs = [];\n this.bubbles = [];\n const n = this.isRange ? 2 : 1;\n for (let i = 0; i < n; i++) {\n const bubble = h('span', 'op-slider__bubble', { 'aria-hidden': 'true' });\n const knob = h('div', 'op-slider__knob', { role: 'slider', tabindex: 0, 'aria-orientation': 'horizontal', 'data-i': i }, bubble);\n this.listen(knob, 'pointerdown', (e: PointerEvent) => this.onKnobDown(e, i));\n this.listen(knob, 'keydown', (e: KeyboardEvent) => this.onKey(e, i));\n this.listen(knob, 'focus', () => this.el.classList.add('is-focus-knob'));\n this.listen(knob, 'blur', () => this.el.classList.remove('is-focus-knob'));\n this.knobs.push(knob);\n this.bubbles.push(bubble);\n this.track.append(knob);\n }\n }\n\n protected override onRender() {\n super.onRender();\n this.knobs.forEach((k) => k.setAttribute('aria-labelledby', `${this.id}-label`));\n (this.el.querySelector('.op-field__label') as HTMLElement).id = `${this.id}-label`;\n this.paintMarks();\n this.el.classList.toggle('has-bubble-always', this.config.showValue === 'always');\n this.el.classList.toggle('has-bubble-never', this.config.showValue === 'never');\n }\n\n // ---- painting -----------------------------------------------------------------------------\n\n private pct(v: number): number {\n return this.max === this.min ? 0 : ((v - this.min) / (this.max - this.min)) * 100;\n }\n\n protected applyValue(v: V): void {\n const vals = Array.isArray(v) ? v : [v];\n this.knobs.forEach((k, i) => {\n const x = vals[i] ?? vals[0];\n k.style.left = `${this.pct(x)}%`;\n k.setAttribute('aria-valuemin', String(i === 1 ? vals[0] : this.min));\n k.setAttribute('aria-valuemax', String(i === 0 && this.isRange ? vals[1] : this.max));\n k.setAttribute('aria-valuenow', String(x));\n k.setAttribute('aria-valuetext', this.fmt(x));\n this.bubbles[i].textContent = this.fmt(x);\n });\n const lo = this.isRange ? this.pct(vals[0]) : 0;\n const hi = this.pct(this.isRange ? vals[1] : vals[0]);\n this.fill.style.left = `${lo}%`;\n this.fill.style.width = `${Math.max(0, hi - lo)}%`;\n }\n\n private paintMarks() {\n const m = this.config.marks;\n this.marksEl.replaceChildren();\n if (!m) return;\n const list: SliderMark[] = Array.isArray(m) ? m : (() => {\n const n = Math.floor((this.max - this.min) / this.step);\n const every = Math.ceil(n / 20) || 1;\n return Array.from({ length: Math.floor(n / every) + 1 }, (_, i) => ({ value: this.min + i * every * this.step }));\n })();\n for (const mk of list) {\n const tick = h('span', 'op-slider__mark', {}, mk.label ? h('span', 'op-slider__mark-label', {}, mk.label) : '');\n tick.style.left = `${this.pct(mk.value)}%`;\n this.marksEl.append(tick);\n }\n }\n\n // ---- pointer ------------------------------------------------------------------------------\n\n private valueAt(e: PointerEvent): number {\n const r = this.track.getBoundingClientRect();\n return this.snap(this.min + Math.max(0, Math.min(1, (e.clientX - r.left) / (r.width || 1))) * (this.max - this.min));\n }\n\n private nearest(v: number): number {\n if (!this.isRange) return 0;\n const [a, b] = this.vals();\n return Math.abs(v - a) <= Math.abs(v - b) ? (v > b ? 1 : 0) : 1;\n }\n\n private onTrackDown(e: PointerEvent) {\n if ((e.target as HTMLElement).closest('.op-slider__knob') || this.config.disabled || this.config.readonly || e.button) return;\n const i = this.nearest(this.valueAt(e));\n this.onKnobDown(e, i);\n }\n\n private onKnobDown(e: PointerEvent, i: number) {\n if (this.config.disabled || this.config.readonly || e.button) return;\n e.preventDefault();\n const knob = this.knobs[i];\n knob.focus();\n knob.setPointerCapture?.(e.pointerId);\n this.el.classList.add('is-dragging');\n this.emit('slide-start');\n const stretch = knobStretch(knob, 'x');\n let prev = e.clientX;\n this.setAt(i, this.valueAt(e));\n const move = (m: PointerEvent) => {\n stretch.move(m.clientX - prev);\n prev = m.clientX;\n this.setAt(i, this.valueAt(m));\n };\n const up = () => {\n knob.removeEventListener('pointermove', move);\n knob.removeEventListener('pointerup', up);\n knob.removeEventListener('pointercancel', up);\n this.el.classList.remove('is-dragging');\n stretch.release();\n (this.flushSettled(), this.emit('slide-end', this.value));\n };\n knob.addEventListener('pointermove', move);\n knob.addEventListener('pointerup', up);\n knob.addEventListener('pointercancel', up);\n this.own(up);\n }\n\n /** The user moved knob `i` to `v`: update the value (knobs of a range never cross) and tell everyone. */\n private setAt(i: number, v: number) {\n const vals = this.vals();\n if (this.isRange) vals[i] = i === 0 ? Math.min(v, vals[1]) : Math.max(v, vals[0]);\n else vals[0] = v;\n const next: V = this.isRange ? ([vals[0], vals[1]] as [number, number]) : vals[0];\n if (this.isEqual(next, this.value)) return;\n this.commit(next);\n this.applyValue(next);\n }\n\n private onKey(e: KeyboardEvent, i: number) {\n if (this.config.disabled || this.config.readonly) return;\n const vals = this.vals();\n const cur = vals[i];\n const big = this.step * 10;\n const lo = this.isRange && i === 1 ? vals[0] : this.min;\n const hi = this.isRange && i === 0 ? vals[1] : this.max;\n const to: Record<string, number> = { ArrowRight: cur + this.step, ArrowUp: cur + this.step, ArrowLeft: cur - this.step, ArrowDown: cur - this.step, PageUp: cur + big, PageDown: cur - big, Home: lo, End: hi };\n if (!(e.key in to)) return;\n e.preventDefault();\n this.setAt(i, Math.max(lo, Math.min(hi, this.snap(to[e.key]))));\n (this.flushSettled(), this.emit('slide-end', this.value));\n }\n\n // ---- API ----------------------------------------------------------------------------------\n\n /** Where the (first) knob is, 0\u2013100. */\n getPercent(): number {\n return this.pct(this.vals()[0]);\n }\n\n private refresh() {\n if (!this.rendered) return;\n this.applyValue(this.value);\n this.paintMarks();\n }\n\n setMin(min: number) {\n this.config.min = min;\n this.value = this.clampAll(this.value);\n this.refresh();\n }\n setMax(max: number) {\n this.config.max = max;\n this.value = this.clampAll(this.value);\n this.refresh();\n }\n setStep(step: number) {\n this.config.step = step;\n this.value = this.clampAll(this.value);\n this.refresh();\n }\n private clampAll(v: V): V {\n return Array.isArray(v) ? ([this.snap(v[0]), this.snap(v[1])] as [number, number]) : this.snap(v);\n }\n\n /** Switches between one knob and two; the value is converted. */\n setRange(range: boolean) {\n if (range === this.isRange) return;\n const v = this.vals();\n this.config.range = range;\n this.value = range ? [v[0], this.max] : v[0];\n if (!this.rendered) return;\n this.buildKnobs();\n this.inputEl = this.knobs[0];\n this.applyValue(this.value);\n }\n\n protected override onDisabled(disabled: boolean) {\n this.knobs.forEach((k) => ((k.tabIndex = disabled ? -1 : 0), k.setAttribute('aria-disabled', String(disabled))));\n }\n protected override onReadonly(readonly: boolean) {\n this.knobs.forEach((k) => k.setAttribute('aria-readonly', String(readonly)));\n }\n}\nregister('slider', Slider);\n"],
5
+ "mappings": "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",
6
+ "names": ["Slider", "Field", "v", "n", "dec", "c", "h", "e", "box", "k", "i", "bubble", "knob", "vals", "x", "lo", "hi", "m", "list", "every", "_", "mk", "tick", "r", "a", "b", "stretch", "knobStretch", "prev", "move", "up", "next", "cur", "big", "to", "min", "max", "step", "range", "disabled", "readonly", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as d}from"./chunk-ZCAAM4NH.js";import{c as p}from"./chunk-IHAYOSBR.js";import{a as c,b as l}from"./chunk-IYPKPLCU.js";import{b as i}from"./chunk-PZSHOSOS.js";import{e as m}from"./chunk-MA5BJL3S.js";var h=class extends c{baseCls="op-breadcrumb";tag="nav";list;menu;onRender(){this.list=i("ol","op-breadcrumb__list"),this.el.append(this.list),this.config.ariaLabel||this.el.setAttribute("aria-label",m("breadcrumb")),this.config.separator!=null&&this.setSeparator(this.config.separator),this.listen(this.list,"click",e=>{let r=e.target;if(r.closest(".op-breadcrumb__more"))return this.showHidden(r.closest("button"));let t=r.closest("[data-i]");t&&this.go(Number(t.dataset.i),e)}),this.own(()=>this.menu?.destroy()),this.paint()}items(){return this.config.items??[]}collapsed(){let e=this.items().length,r=Math.max(3,this.config.maxItems??4);return e<=r?[]:Array.from({length:e-(r-1)},(t,s)=>s+1)}paint(){let e=this.items(),r=this.collapsed(),t=e.length-1,s=[];e.forEach((n,a)=>{if(r.includes(a)){a===r[0]&&s.push(i("li","",{},i("button","op-breadcrumb__more",{type:"button","aria-label":m("breadcrumbMore"),"aria-haspopup":"menu","aria-expanded":"false"},"\u2026")));return}let o=[n.icon?p(n.icon):null,n.text],u=a===t?i("span","op-breadcrumb__current",{"aria-current":"page"},...o):n.href?i("a","op-breadcrumb__item",{href:n.href,"data-i":a},...o):i("button","op-breadcrumb__item",{type:"button","data-i":a},...o);s.push(i("li","",{},u))}),this.list.replaceChildren(...s)}go(e,r){let t=this.items()[e];return!t||e===this.items().length-1?!1:this.emit("before-navigate",t,e)===!1?(r?.preventDefault(),!1):(t.handler?.(t),this.emit("navigate",t,e),!0)}showHidden(e){let r=this.items();this.menu??=new d({}),this.menu.setItems(this.collapsed().map(t=>({text:r[t].text,icon:r[t].icon,handler:()=>{this.go(t)&&r[t].href&&(location.href=r[t].href)}}))),this.menu.on("show",()=>e.setAttribute("aria-expanded","true")),this.menu.on("hide",()=>e.setAttribute("aria-expanded","false")),this.menu.showBy(e)}setItems(e){this.config.items=e,this.rendered&&this.paint()}setMaxItems(e){this.config.maxItems=e,this.rendered&&this.paint()}setSeparator(e){this.config.separator=e,this.rendered&&this.el.style.setProperty("--op-breadcrumb-separator",JSON.stringify(e))}};l("breadcrumb",h);export{h as a};
2
+ //# sourceMappingURL=chunk-A66MDXHL.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/navigation/breadcrumb/breadcrumb.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport { iconEl } from '../../base/icon/icon';\nimport { Menu } from '../../overlays/menu/menu';\n\nexport interface BreadcrumbItem {\n text: string;\n icon?: string;\n /** Renders a real link (native navigation, middle-click, copy link). */\n href?: string;\n handler?: (item: BreadcrumbItem) => void;\n}\n\nexport interface BreadcrumbConfig extends ComponentConfig {\n items?: BreadcrumbItem[];\n /** More items than this collapse the middle into a \"\u2026\" menu. Minimum 3, default 4. */\n maxItems?: number;\n separator?: string;\n}\n\nexport class Breadcrumb extends Component<BreadcrumbConfig> {\n protected override baseCls = 'op-breadcrumb';\n protected override tag = 'nav' as const;\n private list!: HTMLElement;\n private menu?: Menu;\n\n protected override onRender() {\n this.list = h('ol', 'op-breadcrumb__list');\n this.el.append(this.list);\n if (!this.config.ariaLabel) this.el.setAttribute('aria-label', t('breadcrumb'));\n if (this.config.separator != null) this.setSeparator(this.config.separator);\n this.listen(this.list, 'click', (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if (target.closest('.op-breadcrumb__more')) return this.showHidden(target.closest('button')!);\n const el = target.closest<HTMLElement>('[data-i]');\n if (el) this.go(Number(el.dataset.i), e);\n });\n this.own(() => this.menu?.destroy());\n this.paint();\n }\n\n private items(): BreadcrumbItem[] {\n return this.config.items ?? [];\n }\n\n /** Indexes hidden behind the \"\u2026\" button (empty when everything fits). */\n private collapsed(): number[] {\n const n = this.items().length;\n const max = Math.max(3, this.config.maxItems ?? 4);\n if (n <= max) return [];\n return Array.from({ length: n - (max - 1) }, (_, i) => i + 1);\n }\n\n private paint() {\n const items = this.items();\n const hidden = this.collapsed();\n const last = items.length - 1;\n const lis: HTMLElement[] = [];\n items.forEach((item, i) => {\n if (hidden.includes(i)) {\n if (i === hidden[0]) lis.push(h('li', '', {}, h('button', 'op-breadcrumb__more', { type: 'button', 'aria-label': t('breadcrumbMore'), 'aria-haspopup': 'menu', 'aria-expanded': 'false' }, '\u2026')));\n return;\n }\n const content = [item.icon ? iconEl(item.icon) : null, item.text];\n const node =\n i === last\n ? h('span', 'op-breadcrumb__current', { 'aria-current': 'page' }, ...content)\n : item.href\n ? h('a', 'op-breadcrumb__item', { href: item.href, 'data-i': i }, ...content)\n : h('button', 'op-breadcrumb__item', { type: 'button', 'data-i': i }, ...content);\n lis.push(h('li', '', {}, node));\n });\n this.list.replaceChildren(...lis);\n }\n\n /** Runs `before-navigate` / handler / `navigate`. Returns false when cancelled. */\n private go(i: number, e?: Event): boolean {\n const item = this.items()[i];\n if (!item || i === this.items().length - 1) return false;\n if (this.emit('before-navigate', item, i) === false) {\n e?.preventDefault();\n return false;\n }\n item.handler?.(item);\n this.emit('navigate', item, i);\n return true;\n }\n\n private showHidden(button: HTMLElement) {\n const items = this.items();\n this.menu ??= new Menu({});\n this.menu.setItems(\n this.collapsed().map((i) => ({\n text: items[i].text,\n icon: items[i].icon,\n handler: () => {\n if (this.go(i) && items[i].href) location.href = items[i].href!;\n },\n })),\n );\n this.menu.on('show', () => button.setAttribute('aria-expanded', 'true'));\n this.menu.on('hide', () => button.setAttribute('aria-expanded', 'false'));\n this.menu.showBy(button);\n }\n\n setItems(items: BreadcrumbItem[]) {\n this.config.items = items;\n if (this.rendered) this.paint();\n }\n\n setMaxItems(max: number) {\n this.config.maxItems = max;\n if (this.rendered) this.paint();\n }\n\n /** Any text, e.g. `'/'` or `'\u203A'`. */\n setSeparator(separator: string) {\n this.config.separator = separator;\n if (this.rendered) this.el.style.setProperty('--op-breadcrumb-separator', JSON.stringify(separator));\n }\n}\nregister('breadcrumb', Breadcrumb);\n"],
5
+ "mappings": "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",
6
+ "names": ["Breadcrumb", "Component", "h", "t", "target", "el", "n", "max", "_", "i", "items", "hidden", "last", "lis", "item", "content", "iconEl", "node", "e", "button", "Menu", "separator", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as f,b as m}from"./chunk-CUPAPOKC.js";import{b as d}from"./chunk-676AKAGF.js";import{a as u}from"./chunk-VV7CFMPZ.js";import{b as g,c as v}from"./chunk-4AA4FQEM.js";import{a as n,b as l,d as p}from"./chunk-IYPKPLCU.js";import{b as a}from"./chunk-PZSHOSOS.js";var o=[],s=class extends n{baseCls="op-dropdown";content;open_=!1;release=[];leaving=0;build(){let e=a("div","op-dropdown",{role:this.config.role??"dialog"});e.hidden=!0;let t=this.config.content;return t&&(this.content=t instanceof HTMLElement||t instanceof n?t:p(t),e.append(this.content instanceof n?this.content.el:this.content)),e}getAnchor(){let e=this.config.anchor;return e instanceof n?e.el:e instanceof HTMLElement?e:void 0}isOpen(){return this.open_}open(){if(this.open_||this.destroyed||this.emit("before-open")===!1)return;let e=this.getAnchor();d(this.el,e),this.leaving++,this.el.getAnimations?.().forEach(i=>i.cancel()),this.el.hidden=!1,this.open_=!0,o.push(this),this.el.classList.add("is-open"),this.content instanceof n&&this.content.notifyMount(),this.reposition(),g(this.el,e??this.config.anchor,"dropdown"),e?.setAttribute("aria-expanded","true");let t=this.config,r=i=>{let h=i.target;t.closeOnOutside!==!1&&!this.el.contains(h)&&!e?.contains(h)&&this.close()},c=i=>{i.key==="Escape"&&t.closeOnEsc!==!1&&o[o.length-1]===this&&(i.stopPropagation(),this.close(),(e?.querySelector("input,button")??e)?.focus?.())};document.addEventListener("pointerdown",r,!0),document.addEventListener("keydown",c,!0),this.release=[()=>document.removeEventListener("pointerdown",r,!0),()=>document.removeEventListener("keydown",c,!0),m(()=>this.reposition())],t.autoFocus&&u(this.el)[0]?.focus(),this.emit("open")}close(){if(!this.open_||this.emit("before-close")===!1)return;this.open_=!1,o.splice(o.indexOf(this),1),this.el.classList.remove("is-open");let e=v(this.el,this.getAnchor()??this.config.anchor,"dropdown");if(e){let t=++this.leaving;e.then(()=>t===this.leaving&&!this.open_&&(this.el.hidden=!0))}else this.el.hidden=!0;this.getAnchor()?.setAttribute("aria-expanded","false"),this.release.splice(0).forEach(t=>t()),this.emit("close")}toggle(){this.open_?this.close():this.open()}reposition(){let e=this.getAnchor()??this.config.anchor;if(!this.open_||!e||e instanceof n)return;let t=this.config;f(this.el,e,{placement:t.placement??"bottom-start",offset:t.offset,flip:t.flip,matchWidth:t.matchWidth})}setAnchor(e){this.config.anchor=e,this.reposition()}setPlacement(e){this.config.placement=e,this.reposition()}setContent(e){this.content instanceof n&&this.content!==e&&this.content.destroy(),this.config.content=e,this.content=e,this.el.replaceChildren(e instanceof n?e.el:e),this.reposition()}onDestroy(){this.open_&&o.splice(o.indexOf(this),1),this.open_=!1,this.release.splice(0).forEach(e=>e()),this.getAnchor()?.setAttribute("aria-expanded","false"),this.content instanceof n&&this.content.destroy()}};l("dropdown",s);export{s as a};
2
+ //# sourceMappingURL=chunk-ARCW54L2.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/overlays/dropdown/dropdown.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { toLayer } from '../../../core/layer';\nimport { place, track, type Placement } from '../../../core/position';\nimport { focusables } from '../../../core/focus';\nimport { popIn, popOut } from '../../../motion/core';\n\nexport interface DropdownConfig extends ComponentConfig {\n anchor?: HTMLElement | Component | { x: number; y: number };\n content?: HTMLElement | Component | AnyConfig;\n placement?: Placement;\n offset?: number;\n flip?: boolean;\n matchWidth?: boolean;\n closeOnOutside?: boolean;\n closeOnEsc?: boolean;\n role?: string;\n /** Move focus to the first focusable element of the content on open. */\n autoFocus?: boolean;\n}\n\nconst openStack: Dropdown[] = [];\n\n/** Floating panel anchored to an element. Lives in the global layer; closes on outside click and Esc. */\nexport class Dropdown extends Component<DropdownConfig> {\n protected override baseCls = 'op-dropdown';\n private content?: HTMLElement | Component;\n private open_ = false;\n private release: Array<() => void> = [];\n private leaving = 0;\n\n protected override build() {\n const el = h('div', 'op-dropdown', { role: this.config.role ?? 'dialog' });\n el.hidden = true;\n const c = this.config.content;\n if (c) {\n this.content = c instanceof HTMLElement || c instanceof Component ? c : create(c);\n el.append(this.content instanceof Component ? this.content.el : this.content);\n }\n return el;\n }\n\n getAnchor(): HTMLElement | undefined {\n const a = this.config.anchor;\n return a instanceof Component ? a.el : a instanceof HTMLElement ? a : undefined;\n }\n\n isOpen(): boolean {\n return this.open_;\n }\n\n open(): void {\n if (this.open_ || this.destroyed || this.emit('before-open') === false) return;\n const anchor = this.getAnchor();\n toLayer(this.el, anchor);\n this.leaving++; // a pending hide from a close animation must not hide us again\n this.el.getAnimations?.().forEach((a) => a.cancel());\n this.el.hidden = false;\n this.open_ = true;\n openStack.push(this);\n this.el.classList.add('is-open');\n if (this.content instanceof Component) this.content.notifyMount();\n this.reposition();\n void popIn(this.el, anchor ?? (this.config.anchor as { x: number; y: number } | undefined), 'dropdown');\n anchor?.setAttribute('aria-expanded', 'true');\n const c = this.config;\n const outside = (e: Event) => {\n const t = e.target as Node;\n if (c.closeOnOutside !== false && !this.el.contains(t) && !anchor?.contains(t)) this.close();\n };\n const key = (e: KeyboardEvent) => {\n // only the most recently opened dropdown reacts, so Esc closes one level at a time\n if (e.key === 'Escape' && c.closeOnEsc !== false && openStack[openStack.length - 1] === this) {\n e.stopPropagation();\n this.close();\n (anchor?.querySelector<HTMLElement>('input,button') ?? anchor)?.focus?.();\n }\n };\n document.addEventListener('pointerdown', outside, true);\n document.addEventListener('keydown', key, true);\n this.release = [() => document.removeEventListener('pointerdown', outside, true), () => document.removeEventListener('keydown', key, true), track(() => this.reposition())];\n if (c.autoFocus) focusables(this.el)[0]?.focus();\n this.emit('open');\n }\n\n close(): void {\n if (!this.open_ || this.emit('before-close') === false) return;\n this.open_ = false;\n openStack.splice(openStack.indexOf(this), 1);\n this.el.classList.remove('is-open');\n // shrinks back toward the trigger, then hides (at once when there is no animation)\n const out = popOut(this.el, this.getAnchor() ?? (this.config.anchor as { x: number; y: number } | undefined), 'dropdown');\n if (out) {\n const id = ++this.leaving;\n void out.then(() => id === this.leaving && !this.open_ && (this.el.hidden = true));\n } else this.el.hidden = true;\n this.getAnchor()?.setAttribute('aria-expanded', 'false');\n this.release.splice(0).forEach((r) => r());\n this.emit('close');\n }\n\n toggle(): void {\n if (this.open_) this.close();\n else this.open();\n }\n\n reposition(): void {\n const anchor = this.getAnchor() ?? (this.config.anchor as { x: number; y: number } | undefined);\n if (!this.open_ || !anchor || anchor instanceof Component) return;\n const c = this.config;\n place(this.el, anchor, { placement: c.placement ?? 'bottom-start', offset: c.offset, flip: c.flip, matchWidth: c.matchWidth });\n }\n\n setAnchor(anchor: HTMLElement | Component | { x: number; y: number }): void {\n this.config.anchor = anchor;\n this.reposition();\n }\n setPlacement(placement: Placement): void {\n this.config.placement = placement;\n this.reposition();\n }\n setContent(content: HTMLElement | Component): void {\n if (this.content instanceof Component && this.content !== content) this.content.destroy();\n this.config.content = content;\n this.content = content;\n this.el.replaceChildren(content instanceof Component ? content.el : content);\n this.reposition();\n }\n\n protected override onDestroy() {\n if (this.open_) openStack.splice(openStack.indexOf(this), 1);\n this.open_ = false;\n this.release.splice(0).forEach((r) => r());\n this.getAnchor()?.setAttribute('aria-expanded', 'false');\n if (this.content instanceof Component) this.content.destroy();\n }\n}\nregister('dropdown', Dropdown);\n"],
5
+ "mappings": "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",
6
+ "names": ["openStack", "Dropdown", "Component", "el", "h", "c", "create", "a", "anchor", "toLayer", "popIn", "outside", "e", "t", "key", "track", "focusables", "out", "popOut", "id", "r", "place", "placement", "content", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{b as v,c as f}from"./chunk-676AKAGF.js";import{b as g}from"./chunk-VV7CFMPZ.js";import{c}from"./chunk-IHAYOSBR.js";import{a as m,b as u}from"./chunk-IYPKPLCU.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as h}from"./chunk-MA5BJL3S.js";var y=()=>/mac|iphone|ipad/i.test(navigator.platform||navigator.userAgent);function b(a,t){let e=t.toLowerCase().split("+"),i=e.pop(),n=r=>e.includes(r),s=y();return a.key.toLowerCase()===i&&a.ctrlKey===(n("ctrl")||n("mod")&&!s)&&a.metaKey===(n("meta")||n("mod")&&s)&&a.shiftKey===n("shift")&&a.altKey===n("alt")}var E=(a,t)=>{let e=0;for(let i of a)if(i===t[e]&&++e===t.length)return!0;return!t.length};function C(a,t){let e=a.title.toLowerCase(),i=[a.category,a.description,...a.keywords??[]].join(" ").toLowerCase(),n=0;for(let s of t.toLowerCase().split(/\s+/).filter(Boolean)){let r=e.indexOf(s),l=r===0?100:r>0?/[\s\-_/]/.test(e[r-1])?80:60:s.length>2&&E(e,s)?30:i.includes(s)?20:0;if(!l)return 0;n+=l}return n}function _(a,t){let e=t.toLowerCase().split(/\s+/).filter(Boolean),i=a.toLowerCase(),n=[];for(let l of e){let p=i.indexOf(l);p>=0&&n.push([p,p+l.length])}n.sort((l,p)=>l[0]-p[0]);let s=[],r=0;for(let[l,p]of n)l<r||(s.push(a.slice(r,l),o("mark","op-palette__mark",{},a.slice(l,p))),r=p);return s.push(a.slice(r)),s.filter(l=>l!=="")}var d=class extends m{baseCls="op-palette-backdrop";commands;levels=[];query="";cat=null;shown=[];active=0;opened=!1;opener=null;release=[];panel;input;filtersEl;listEl;live;crumb;constructor(t={}){super(t),this.commands=[...t.commands??[]];let e=t.hotkey===void 0?"mod+k":t.hotkey;e&&this.listen(document,"keydown",i=>{!b(i,e)||this.destroyed||(i.preventDefault(),this.toggle())},!0)}build(){let t=this.config;this.input=o("input","op-palette__input",{type:"text",role:"combobox","aria-expanded":"true","aria-autocomplete":"list",autocomplete:"off",spellcheck:"false",placeholder:t.placeholder??h("cpPlaceholder")}),this.crumb=o("span","op-palette__crumb"),this.crumb.hidden=!0,this.filtersEl=o("div","op-palette__filters",{role:"group","aria-label":h("cpFilters")}),this.listEl=o("div","op-palette__list",{role:"listbox",id:`${this.id}-list`}),this.input.setAttribute("aria-controls",this.listEl.id),this.live=o("div","op-sr-only",{"aria-live":"polite"}),this.panel=o("div","op-palette",{role:"dialog","aria-modal":"true","aria-label":h("cpLabel")},o("div","op-palette__search",{},c("search"),this.crumb,this.input),this.filtersEl,this.listEl,this.live,o("div","op-palette__hint",{},h("cpHint")));let e=o("div","op-palette-backdrop",{},this.panel);return this.listen(this.input,"input",()=>{this.query=this.input.value,this.active=0,this.paint()}),this.listen(this.panel,"keydown",i=>this.onKey(i)),this.listen(e,"pointerdown",i=>i.target===e&&this.close()),this.listen(this.listEl,"pointermove",i=>{let n=this.indexOf(i);n>=0&&n!==this.active&&this.setActive(n)}),this.listen(this.listEl,"click",i=>{let n=this.indexOf(i);n>=0&&this.choose(this.shown[n])}),this.listen(this.filtersEl,"click",i=>{let n=i.target.closest("[data-cat]");n&&(this.cat=n.dataset.cat||null,this.active=0,this.paint(),this.input.focus())}),e}getCommands(){return this.commands}setCommands(t){this.commands=[...t],this.levels[0]&&(this.levels[0].commands=this.commands),this.opened&&this.paint()}register(t){let e=Array.isArray(t)?t:[t];return this.commands.push(...e),this.opened&&this.paint(),()=>this.setCommands(this.commands.filter(i=>!e.includes(i)))}run(t){let e=this.commands.find(i=>i.id===t);return e?this.exec(e):Promise.resolve()}isOpen(){return this.opened}toggle(){this.opened?this.close():this.open()}open(){if(this.opened||this.destroyed||this.emit("before-open")===!1)return;this.opener=document.activeElement;let t=this.el;this.levels=[{title:"",commands:this.commands}],this.query=this.input.value="",this.cat=null,this.active=0,v(t,this.opener),this.release.push(f(t),g(this.panel)),this.opened=!0,t.classList.add("is-open"),this.notifyMount(),this.paint(),this.input.focus(),this.emit("open")}close(){this.opened&&(this.opened=!1,this.release.splice(0).reverse().forEach(t=>t()),this.el.classList.remove("is-open"),this.el.remove(),this.opener instanceof HTMLElement&&this.opener.isConnected&&this.opener.focus(),this.emit("close"))}onDestroy(){this.opened=!1,this.release.splice(0).forEach(t=>t()),this.panel&&this.el.remove()}level(){return this.levels[this.levels.length-1]}results(){let t=this.level().commands.filter(s=>!s.hidden?.()&&(!this.cat||s.category===this.cat)),e=this.query.trim();if(e)return t.map(s=>({c:s,s:C(s,e)})).filter(s=>s.s>0).sort((s,r)=>r.s-s.s).map(s=>s.c).slice(0,this.config.maxResults??50);let i=this.config.categories??[],n=s=>s.category===void 0?1e6:i.includes(s.category)?i.indexOf(s.category):i.length;return t.map((s,r)=>({c:s,i:r})).sort((s,r)=>n(s.c)-n(r.c)||s.i-r.i).map(s=>s.c).slice(0,this.config.maxResults??50)}paint(){let t=this.level();this.crumb.hidden=this.levels.length<2,this.crumb.textContent=t.title,this.paintFilters(),this.shown=this.results(),this.active=Math.min(this.active,Math.max(0,this.shown.length-1));let e=!!this.query.trim(),i=[],n;this.shown.forEach((s,r)=>{!e&&s.category!==n&&(n=s.category,n&&i.push(o("div","op-palette__group",{role:"presentation"},n)));let l=o("div",`op-palette__item${s.disabled?" is-disabled":""}`,{role:"option",id:`${this.id}-o${r}`,"aria-disabled":s.disabled?"true":null,"data-i":r},s.icon?o("span","op-palette__icon",{},c(s.icon)):o("span","op-palette__icon"),o("span","op-palette__text",{},o("span","op-palette__title",{},..._(s.title,this.query)),s.description?o("span","op-palette__desc",{},s.description):""),e&&s.category?o("span","op-palette__cat",{},s.category):"",s.children?o("span","op-palette__more",{"aria-hidden":"true"},c("chevron-right")):"",s.shortcut?o("kbd","op-palette__kbd",{},s.shortcut):"");i.push(l)}),this.shown.length||i.push(o("div","op-palette__empty",{},this.config.emptyText??h("cpEmpty"))),this.listEl.replaceChildren(...i),this.live.textContent=this.shown.length?h("results",{n:this.shown.length}):h("noResults"),this.setActive(this.active,!1)}paintFilters(){let t=[...new Set(this.level().commands.filter(i=>!i.hidden?.()&&i.category).map(i=>i.category))];this.filtersEl.hidden=this.config.filters===!1||t.length<2,this.cat&&!t.includes(this.cat)&&(this.cat=null);let e=(i,n)=>o("button",`op-palette__chip${(this.cat??"")===n?" is-on":""}`,{type:"button","data-cat":n,"aria-pressed":String((this.cat??"")===n)},i);this.filtersEl.replaceChildren(e(h("cpAll"),""),...t.map(i=>e(i,i)))}indexOf(t){let e=t.target.closest(".op-palette__item");return e?Number(e.dataset.i):-1}setActive(t,e=!0){this.active=t;for(let i of Array.from(this.listEl.querySelectorAll(".op-palette__item"))){let n=Number(i.dataset.i)===t;i.classList.toggle("is-active",n),i.setAttribute("aria-selected",String(n)),n&&(this.input.setAttribute("aria-activedescendant",i.id),e&&i.scrollIntoView?.({block:"nearest"}))}this.shown.length||this.input.removeAttribute("aria-activedescendant")}onKey(t){let e=this.shown.length;switch(t.key){case"ArrowDown":case"ArrowUp":t.preventDefault(),e&&this.setActive((this.active+(t.key==="ArrowDown"?1:e-1))%e);break;case"Home":case"End":t.target===this.input&&!this.input.value&&(t.preventDefault(),e&&this.setActive(t.key==="Home"?0:e-1));break;case"Enter":if(t.target.closest(".op-palette__chip"))return;t.preventDefault(),this.shown[this.active]&&this.choose(this.shown[this.active]);break;case"Escape":t.preventDefault(),t.stopPropagation(),this.levels.length>1?this.back():this.close();break;case"Backspace":!this.input.value&&this.levels.length>1&&(t.preventDefault(),this.back());break}}back(){this.levels.pop(),this.query=this.input.value="",this.cat=null,this.active=0,this.paint(),this.input.focus()}async choose(t){if(!(!t||t.disabled)){if(t.children){try{let e=typeof t.children=="function"?await t.children():t.children;this.levels.push({title:t.title,commands:e}),this.query=this.input.value="",this.cat=null,this.active=0,this.paint(),this.input.focus()}catch(e){this.emit("error",e)}return}this.close(),await this.exec(t)}}async exec(t){try{this.emit("run",t),await t.handler?.({palette:this,command:t})}catch(e){this.emit("error",e)}}};u("commandpalette",d);export{d as a};
2
+ //# sourceMappingURL=chunk-BIYNHKSA.js.map