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
package/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
4
+ and the project uses [Semantic Versioning](https://semver.org/). Until 1.0, minor versions may contain breaking changes.
5
+
6
+ ## [0.1.0] - 2026-11-08
7
+
8
+ First public release.
9
+
10
+ ### Added
11
+
12
+ - Core: `Component`, `Container`, `Field`, the `create`/`register` registry, layouts (`fit`, `hbox`, `vbox`, `border`,
13
+ `grid`, `card`, responsive below a container width), validators, i18n (`en`, `pt-BR`), focus and positioning utilities,
14
+ list virtualization.
15
+ - Data: `Store` with local or remote sorting, filter trees (AND/OR) and paging; `Model`; memory, function and REST proxies; formatters.
16
+ - Components: button, icon, label; container, panel, viewport, fieldset, toolbar, spacer; textfield, textarea,
17
+ numberfield, secretfield, checkbox, radiogroup, select, combobox, suggestfield, lookupfield, datefield, daterangefield,
18
+ slider, listbox; form (with tabs) and stepform; grid, table, dataview, pagination, filterbuilder, searchgrid,
19
+ viewmanager; calendar; window, MessageBox, toast, menu, dropdown, tooltip, widget, commandpalette; tabs, breadcrumb,
20
+ navmenu, stepper; spinner and loading masks; chat.
21
+ - `optikos/bind`: `signal`, `computed`, `effect`, `bind`, `fromStore`.
22
+ - `optikos/motion`: animation helpers on the Web Animations API with one global setting and a kill switch.
23
+ - `optikos/ui`: `ui.*` shortcuts and enums.
24
+ - Themes: design tokens in `@layer optikos`, `defineTheme()`/`setTheme()`, and the ready-made themes `dark`, `compact`,
25
+ `corporate`, `soft`, `brutal`, `terminal`, `editorial` and `brand`.
26
+ - Per-component entry points (`optikos/components/<name>`) and stylesheets (`optikos/css/<name>.css`).
27
+
28
+ [0.1.0]: https://github.com/Denis-Zickuhr/optikos/releases/tag/v0.1.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Denis Zickuhr
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,212 @@
1
- # Temporary Holding Version
1
+ # Optikos
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ [![npm](https://img.shields.io/npm/v/optikos)](https://www.npmjs.com/package/optikos)
4
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue)](https://github.com/Denis-Zickuhr/optikos/blob/main/LICENSE)
5
+
6
+ Declarative UI components in plain TypeScript: describe screens, forms, grids and windows as configuration objects,
7
+ with no runtime dependencies.
8
+
9
+ - **Fast**: no virtual DOM. Setters update only the part of the DOM that changed, and grids and long lists are virtualized.
10
+ - **Light**: zero runtime dependencies. Each component can be imported on its own, and its size is checked on every build.
11
+ - **Complete**: fields, pickers, data grid, filter builder, windows, menus, tabs, command palette, chat and more.
12
+ - **Themeable**: every color, space, radius, font and shadow is a CSS custom property, and all styles live in `@layer optikos`.
13
+ - **Accessible**: keyboard support, focus management and ARIA are part of each component's spec.
14
+ - **Extensible**: your own components, layouts and themes use the same public API as the built-in ones.
15
+
16
+ ## Install
17
+
18
+ ```sh
19
+ npm i optikos
20
+ ```
21
+
22
+ ## Quick start
23
+
24
+ ```ts
25
+ import { create, toast, type Form } from 'optikos';
26
+ import 'optikos/optikos.css';
27
+ import 'optikos/themes/dark.css';
28
+
29
+ document.documentElement.setAttribute('data-op-theme', 'dark');
30
+
31
+ const form = create<Form>({
32
+ type: 'form',
33
+ items: [
34
+ { type: 'textfield', name: 'name', label: 'Name', required: true },
35
+ { type: 'textfield', name: 'email', label: 'Email', inputType: 'email' },
36
+ { type: 'select', name: 'plan', label: 'Plan', options: ['Free', 'Pro'] },
37
+ ],
38
+ });
39
+
40
+ create({
41
+ type: 'panel',
42
+ title: 'New customer',
43
+ renderTo: document.body,
44
+ items: [form],
45
+ buttons: [{ text: 'Save', variant: 'primary', handler: () => form.isValid() && toast(`Saved ${form.getValues().name}`) }],
46
+ });
47
+ ```
48
+
49
+ `create()` builds a component tree from a config. Each `type` is a registered component class, so you can also write
50
+ `new TextField({ ... })`, or use the `ui` shortcuts:
51
+
52
+ ```ts
53
+ import { ui } from 'optikos';
54
+
55
+ const signup = ui.form([
56
+ ui.text('name', 'Name', { required: true }),
57
+ ui.email('email', 'Email'),
58
+ ui.row(ui.date('from', 'From'), ui.date('to', 'To')),
59
+ ui.primary('Sign up', () => signup.submit()),
60
+ ]);
61
+ ```
62
+
63
+ ### Data grid
64
+
65
+ ```ts
66
+ import { create, Store } from 'optikos';
67
+
68
+ const orders = new Store({
69
+ data: [
70
+ { id: 1, customer: 'Ada Lovelace', total: 120 },
71
+ { id: 2, customer: 'Alan Turing', total: 80 },
72
+ ],
73
+ });
74
+
75
+ create({
76
+ type: 'grid',
77
+ store: orders,
78
+ height: 320,
79
+ paging: true,
80
+ renderTo: document.body,
81
+ columns: [
82
+ { field: 'id', header: '#', width: 60, sortable: true },
83
+ { field: 'customer', header: 'Customer', flex: 1, sortable: true },
84
+ { field: 'total', header: 'Total', format: 'money', align: 'right' },
85
+ ],
86
+ });
87
+
88
+ orders.filter({ field: 'customer', op: 'contains', value: 'ada' });
89
+ ```
90
+
91
+ A `Store` can also load from a function or a REST endpoint, with remote sorting, filtering and paging.
92
+
93
+ ### Reactive bindings (optional)
94
+
95
+ Components only have setters. `optikos/bind` adds signals on top and calls those setters for you:
96
+
97
+ ```ts
98
+ import { create, type Button } from 'optikos';
99
+ import { signal, bind } from 'optikos/bind';
100
+
101
+ const clicks = signal(0);
102
+ const button = create<Button>({ type: 'button', text: 'Click me', renderTo: document.body, handler: () => clicks.update((n) => n + 1) });
103
+ bind(button, { text: () => `Clicked ${clicks()} times` });
104
+ ```
105
+
106
+ ## Imports
107
+
108
+ | Import | What you get |
109
+ |---|---|
110
+ | `optikos` | everything: core, data, themes, motion, `ui`, and every component registered |
111
+ | `optikos/core` | `Component`, `Container`, `Field`, `create`, `register`, layouts, validators, i18n (no components) |
112
+ | `optikos/components/<name>` | one component, which registers its `type` (e.g. `optikos/components/grid`) |
113
+ | `optikos/data` | `Store`, `Model`, proxies, formatters |
114
+ | `optikos/bind` | `signal`, `computed`, `effect`, `bind`, `fromStore` |
115
+ | `optikos/motion` | animation helpers and the global motion settings |
116
+ | `optikos/ui` | the `ui.*` shortcuts and enums (`Variant`, `Direction`, `Op`...) |
117
+ | `optikos/optikos.css` | all styles: tokens, layouts and every component |
118
+ | `optikos/css/<name>.css` | one stylesheet (`base.css` holds the tokens; `core.css`, `field.css` and `layout.css` are shared) |
119
+ | `optikos/themes/<theme>.css` | a ready-made theme |
120
+
121
+ Components register themselves when their module is imported, so the package is marked as having side effects.
122
+ Importing from `optikos` therefore includes every component. To ship less, import the core and only the components you use:
123
+
124
+ ```ts
125
+ import { create } from 'optikos/core';
126
+ import 'optikos/components/button';
127
+ import 'optikos/components/textfield';
128
+
129
+ create({ type: 'textfield', label: 'Search', renderTo: document.body });
130
+ ```
131
+
132
+ ## Components
133
+
134
+ | Category | Components (`type`) |
135
+ |---|---|
136
+ | Base | `button`, `icon`, `label` |
137
+ | Layout | `container`, `panel`, `viewport`, `fieldset`, `toolbar`, `spacer`, plus the layouts `fit`, `hbox`, `vbox`, `border`, `grid`, `card` |
138
+ | Fields | `textfield`, `textarea`, `numberfield`, `secretfield`, `checkbox`, `radiogroup`, `select`, `combobox`, `suggestfield`, `lookupfield`, `datefield`, `daterangefield`, `slider`, `listbox` |
139
+ | Forms | `form` (validation, `load`/`getValues`, tabs), `stepform` (multi-step wizard) |
140
+ | Data | `grid` (virtualized, sorting, selection, paging, column menu, bulk actions), `table`, `dataview`, `pagination`, `filterbuilder`, `searchgrid`, `viewmanager` (saved views) |
141
+ | Dates | `calendar` (single date or range) |
142
+ | Overlays | `window`, `MessageBox` (alert/confirm/prompt), `toast()`, `menu`, `dropdown`, `tooltip`, `widget`, `commandpalette` |
143
+ | Navigation | `tabs`, `breadcrumb`, `navmenu`, `stepper` |
144
+ | Feedback | `spinner`, plus `loading: true` on any component |
145
+ | Chat | `chat` (messages, typing indicator, streaming replies, suggestions) |
146
+
147
+ ## Themes and tokens
148
+
149
+ All styles are in `@layer optikos`, so any CSS you write outside a layer wins without `!important`.
150
+ A theme is a value of `data-op-theme`, on `<html>` or on any element to scope it. Themes can be combined: `data-op-theme="dark compact"`.
151
+
152
+ Ready-made themes: `light` (default, included in `optikos.css`), `dark`, `compact` (density), `corporate`, `soft`,
153
+ `brutal`, `terminal`, `editorial` and `brand`. Each one is a file in `optikos/themes/<theme>.css`.
154
+
155
+ Write a theme in CSS:
156
+
157
+ ```css
158
+ @layer optikos {
159
+ [data-op-theme~='ocean'] { --op-color-primary: #0e7490; --op-radius: 0.125rem; }
160
+ }
161
+ ```
162
+
163
+ or in TypeScript, with typed keys:
164
+
165
+ ```ts
166
+ import { defineTheme, setTheme } from 'optikos';
167
+
168
+ const brand = defineTheme({
169
+ color: { primary: '#7c3aed', primarySoft: '#f5f3ff' },
170
+ button: { radius: '62.5rem' },
171
+ }, 'brand');
172
+
173
+ brand.inject(); // installs the CSS without activating it
174
+ setTheme('dark brand'); // sets data-op-theme on <html> (or on any element: setTheme(names, el))
175
+ ```
176
+
177
+ Components also accept per-instance tokens: `{ type: 'button', theme: { radius: '0' } }`.
178
+
179
+ ## Browser support
180
+
181
+ Current evergreen browsers. The JavaScript targets ES2022, and the CSS uses cascade layers, `:has()`, `color-mix()`,
182
+ `inert` and `dvh` units, which works in Chrome/Edge 111+, Firefox 121+ and Safari 16.2+. No polyfills are included.
183
+
184
+ ## Documentation and demos
185
+
186
+ - [Docs site](https://denis-zickuhr.github.io/optikos/): every component with live, editable examples, its spec sheet,
187
+ the guides and the design tokens.
188
+ - [Docs sources (Portuguese)](https://github.com/Denis-Zickuhr/optikos/tree/main/docs): one spec sheet per component in
189
+ [`docs/components`](https://github.com/Denis-Zickuhr/optikos/tree/main/docs/components), plus guides on
190
+ [theming](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/theming.md),
191
+ [motion](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/motion.md),
192
+ [`ui` shortcuts](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/ui.md) and
193
+ [architecture](https://github.com/Denis-Zickuhr/optikos/blob/main/docs/architecture.md).
194
+ - [Demos](https://github.com/Denis-Zickuhr/optikos/tree/main/demos): CRM, admin dashboard, ERP, chat, photo gallery,
195
+ shop, event landing page, workbench, motion lab and customization. Run them with `npm run dev`.
196
+
197
+ ## Contributing / Development
198
+
199
+ ```sh
200
+ npm install
201
+ npm run dev # dev server: index of sandboxes and demos at /dev/
202
+ npm run sandbox -- fields # one sandbox category
203
+ npm run demo -- crm # one demo
204
+ npm run site # living docs, with live reload
205
+ npm run check # generate index, typecheck, tests, build with size budgets
206
+ ```
207
+
208
+ See [CONTRIBUTING.md](CONTRIBUTING.md) and the project rules in [AGENTS.md](AGENTS.md).
209
+
210
+ ## License
211
+
212
+ [MIT](LICENSE) © Denis Zickuhr. The built-in icons come from Lucide and Feather; see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
@@ -0,0 +1,83 @@
1
+ # Third-party notices
2
+
3
+ Optikos is MIT licensed (see `LICENSE`). It ships the third-party material listed below.
4
+
5
+ ## Built-in icons
6
+
7
+ The SVG paths of the built-in icons (`src/components/base/icon/icon.ts`, bundled into `dist/`) are taken from or
8
+ derived from [Lucide](https://lucide.dev) (ISC) and [Feather](https://feathericons.com) (MIT). Lucide's own license
9
+ also covers the Lucide icons that come from Feather. Both license texts follow.
10
+
11
+ ### Lucide — ISC License
12
+
13
+ ```
14
+ ISC License
15
+
16
+ Copyright (c) 2026 Lucide Icons and Contributors
17
+
18
+ Permission to use, copy, modify, and/or distribute this software for any
19
+ purpose with or without fee is hereby granted, provided that the above
20
+ copyright notice and this permission notice appear in all copies.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
23
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
24
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
25
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
26
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
27
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
28
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29
+
30
+ ---
31
+
32
+ The following Lucide icons are derived from the Feather project:
33
+
34
+ airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out
35
+
36
+ The MIT License (MIT) (for the icons listed above)
37
+
38
+ Copyright (c) 2013-present Cole Bemis
39
+
40
+ Permission is hereby granted, free of charge, to any person obtaining a copy
41
+ of this software and associated documentation files (the "Software"), to deal
42
+ in the Software without restriction, including without limitation the rights
43
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
44
+ copies of the Software, and to permit persons to whom the Software is
45
+ furnished to do so, subject to the following conditions:
46
+
47
+ The above copyright notice and this permission notice shall be included in all
48
+ copies or substantial portions of the Software.
49
+
50
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
51
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
52
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
53
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
54
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
55
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56
+ SOFTWARE.
57
+ ```
58
+
59
+ ### Feather — MIT License
60
+
61
+ ```
62
+ The MIT License (MIT)
63
+
64
+ Copyright (c) 2013-2023 Cole Bemis
65
+
66
+ Permission is hereby granted, free of charge, to any person obtaining a copy
67
+ of this software and associated documentation files (the "Software"), to deal
68
+ in the Software without restriction, including without limitation the rights
69
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
70
+ copies of the Software, and to permit persons to whom the Software is
71
+ furnished to do so, subject to the following conditions:
72
+
73
+ The above copyright notice and this permission notice shall be included in all
74
+ copies or substantial portions of the Software.
75
+
76
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
77
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
78
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
79
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
80
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
81
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
82
+ SOFTWARE.
83
+ ```
package/dist/bind.js ADDED
@@ -0,0 +1,2 @@
1
+ import"./chunk-4C666HHU.js";var s;function d(t){let n=t,e=new Set,o=(()=>(s&&(e.add(s),s.deps.add(e)),n));return o.set=r=>{if(!Object.is(r,n)){n=r;for(let i of[...e])i.run()}},o.update=r=>o.set(r(n)),o}function f(t){let n,e={deps:new Set,run(){for(let r of e.deps)r.delete(e);e.deps.clear(),n?.();let o=s;s=e;try{n=t()}finally{s=o}}};return e.run(),()=>{for(let o of e.deps)o.delete(e);e.deps.clear(),n?.()}}function a(t){let n=d(void 0);return f(()=>n.set(t())),n}function p(t){let n=d(0);return t.subscribe(()=>n.update(e=>e+1)),()=>(n(),t)}function l(t,n){for(let e in n){let o=`set${e[0].toUpperCase()}${e.slice(1)}`,r=t[o];if(typeof r!="function")throw new Error(`Optikos bind: ${t.constructor.name} has no ${o}()`);let i=n[e];t.own(f(()=>{r.call(t,i())}));let c=i.set;e==="value"&&c&&t.own(t.on("change",u=>c(u)))}}export{l as bind,a as computed,f as effect,p as fromStore,d as signal};
2
+ //# sourceMappingURL=bind.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/bind/index.ts"],
4
+ "sourcesContent": ["// Optional reactive layer. Components only know setters; this module calls them from signals.\n// Nothing in `core` or `components` imports this file.\nimport type { Component } from '../core/component';\n\ntype Sub = () => void;\nlet running: Effect | undefined;\n\ninterface Effect {\n run(): void;\n deps: Set<Set<Effect>>;\n}\n\nexport interface Signal<T> {\n (): T;\n set(value: T): void;\n update(fn: (v: T) => T): void;\n}\n\nexport function signal<T>(initial: T): Signal<T> {\n let value = initial;\n const subs = new Set<Effect>();\n const read = (() => {\n if (running) {\n subs.add(running);\n running.deps.add(subs);\n }\n return value;\n }) as Signal<T>;\n read.set = (v) => {\n if (Object.is(v, value)) return;\n value = v;\n for (const e of [...subs]) e.run();\n };\n read.update = (fn) => read.set(fn(value));\n return read;\n}\n\n/** Runs `fn` now and again whenever a signal it read changes. Returns the dispose function. */\nexport function effect(fn: () => void | Sub): () => void {\n let cleanup: void | Sub;\n const e: Effect = {\n deps: new Set(),\n run() {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n const prev = running;\n running = e;\n try {\n cleanup = fn();\n } finally {\n running = prev;\n }\n },\n };\n e.run();\n return () => {\n for (const d of e.deps) d.delete(e);\n e.deps.clear();\n cleanup?.();\n };\n}\n\n/** A read-only signal derived from others. */\nexport function computed<T>(fn: () => T): () => T {\n const s = signal<T>(undefined as T);\n effect(() => s.set(fn()));\n return s;\n}\n\n/** Wraps a Store (or anything with `subscribe`) so reading it inside an effect/computed re-runs that effect on every change. Call it once, outside effects. */\nexport function fromStore<S extends { subscribe(fn: () => void): () => void }>(store: S): () => S {\n const tick = signal(0);\n store.subscribe(() => tick.update((n) => n + 1));\n return () => (tick(), store);\n}\n\n/**\n * `bind(button, { text: () => `Count: ${n()}`, disabled: isBusy })` \u2192 `button.setText(...)`, `button.setDisabled(...)`\n * re-run when the sources change, and are disposed with the component. A source that is a writable signal on `value`\n * is two-way: the field's `change` event writes back.\n */\nexport function bind(cmp: Component<any>, map: Record<string, () => unknown>): void {\n for (const key in map) {\n const setter = `set${key[0].toUpperCase()}${key.slice(1)}`;\n const fn = (cmp as unknown as Record<string, unknown>)[setter];\n if (typeof fn !== 'function') throw new Error(`Optikos bind: ${cmp.constructor.name} has no ${setter}()`);\n const src = map[key];\n cmp.own(effect(() => void fn.call(cmp, src())));\n const write = (src as { set?: (v: unknown) => void }).set;\n if (key === 'value' && write) cmp.own(cmp.on('change', (v) => write(v)));\n }\n}\n"],
5
+ "mappings": "4BAKA,IAAIA,EAaG,SAASC,EAAUC,EAAuB,CAC/C,IAAIC,EAAQD,EACNE,EAAO,IAAI,IACXC,GAAQ,KACRL,IACFI,EAAK,IAAIJ,CAAO,EAChBA,EAAQ,KAAK,IAAII,CAAI,GAEhBD,IAET,OAAAE,EAAK,IAAOC,GAAM,CAChB,GAAI,QAAO,GAAGA,EAAGH,CAAK,EACtB,CAAAA,EAAQG,EACR,QAAWC,IAAK,CAAC,GAAGH,CAAI,EAAGG,EAAE,IAAI,EACnC,EACAF,EAAK,OAAUG,GAAOH,EAAK,IAAIG,EAAGL,CAAK,CAAC,EACjCE,CACT,CAGO,SAASI,EAAOD,EAAkC,CACvD,IAAIE,EACE,EAAY,CAChB,KAAM,IAAI,IACV,KAAM,CACJ,QAAWC,KAAK,EAAE,KAAMA,EAAE,OAAO,CAAC,EAClC,EAAE,KAAK,MAAM,EACbD,IAAU,EACV,IAAME,EAAOZ,EACbA,EAAU,EACV,GAAI,CACFU,EAAUF,EAAG,CACf,QAAE,CACAR,EAAUY,CACZ,CACF,CACF,EACA,SAAE,IAAI,EACC,IAAM,CACX,QAAWD,KAAK,EAAE,KAAMA,EAAE,OAAO,CAAC,EAClC,EAAE,KAAK,MAAM,EACbD,IAAU,CACZ,CACF,CAGO,SAASG,EAAYL,EAAsB,CAChD,IAAMM,EAAIb,EAAU,MAAc,EAClC,OAAAQ,EAAO,IAAMK,EAAE,IAAIN,EAAG,CAAC,CAAC,EACjBM,CACT,CAGO,SAASC,EAA+DC,EAAmB,CAChG,IAAMC,EAAOhB,EAAO,CAAC,EACrB,OAAAe,EAAM,UAAU,IAAMC,EAAK,OAAQC,GAAMA,EAAI,CAAC,CAAC,EACxC,KAAOD,EAAK,EAAGD,EACxB,CAOO,SAASG,EAAKC,EAAqBC,EAA0C,CAClF,QAAWC,KAAOD,EAAK,CACrB,IAAME,EAAS,MAAMD,EAAI,CAAC,EAAE,YAAY,CAAC,GAAGA,EAAI,MAAM,CAAC,CAAC,GAClDd,EAAMY,EAA2CG,CAAM,EAC7D,GAAI,OAAOf,GAAO,WAAY,MAAM,IAAI,MAAM,iBAAiBY,EAAI,YAAY,IAAI,WAAWG,CAAM,IAAI,EACxG,IAAMC,EAAMH,EAAIC,CAAG,EACnBF,EAAI,IAAIX,EAAO,IAAG,CAAQD,EAAG,KAAKY,EAAKI,EAAI,CAAC,EAAC,CAAC,EAC9C,IAAMC,EAASD,EAAuC,IAClDF,IAAQ,SAAWG,GAAOL,EAAI,IAAIA,EAAI,GAAG,SAAWd,GAAMmB,EAAMnB,CAAC,CAAC,CAAC,CACzE,CACF",
6
+ "names": ["running", "signal", "initial", "value", "subs", "read", "v", "e", "fn", "effect", "cleanup", "d", "prev", "computed", "s", "fromStore", "store", "tick", "n", "bind", "cmp", "map", "key", "setter", "src", "write"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var a={enabled:!0,respectReducedMotion:!0,ease:{out:"cubic-bezier(0, 0, 0.2, 1)",in:"cubic-bezier(0.4, 0, 1, 1)",inOut:"cubic-bezier(0.4, 0, 0.2, 1)"},duration:{dropdown:200,popover:200,modal:240,press:100,pulse:450,reveal:350,swap:220,move:450,enter:250},dropdownRange:[150,250],exitRatio:.8,stagger:{step:30,max:12},press:{scale:.97},popover:{scale:.95},stretch:{amount:.12},arc:{bend:.25},blur:4,rubber:{resistance:.55,settle:320},allowBounce:!1,originFromTrigger:!0};function p(e){if(/spring|elastic|bounce/i.test(e))return!0;let o=/cubic-bezier\(([^)]+)\)/i.exec(e);if(!o)return!1;let[,t,,n]=o[1].split(",").map(Number);return t<0||t>1||n<0||n>1}var r=structuredClone(a),i=new Set,c=(e,o)=>{let t=Array.isArray(e)?[...e]:{...e};for(let n in o)t[n]=o[n]&&typeof o[n]=="object"&&!Array.isArray(o[n])&&e[n]?c(e[n],o[n]):o[n];return t},m=()=>typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches;function u(){if(typeof document>"u")return;let e=r,o=s.isOn(),t=document.documentElement.style,n=(d,l)=>t.setProperty(`--op-motion-${d}`,String(l));n("ease-out",e.ease.out),n("ease-in",e.ease.in),n("ease-in-out",e.ease.inOut),n("press-scale",o?e.press.scale:1),n("press-duration",`${o?e.duration.press:0}ms`),n("popover-scale",o?e.popover.scale:1),n("dropdown-duration",`${o?s.dropdownMs():0}ms`),n("exit-ratio",e.exitRatio),n("stagger-step",`${o?e.stagger.step:0}ms`),n("blur",`${e.blur}px`),document.documentElement.classList.toggle("op-motion-off",!o)}var s={get(){return r},set(e){let o=[],t=c(r,e);for(let n of Object.keys(t.ease))!t.allowBounce&&p(t.ease[n])&&(o.push(`ease.${n}: "${t.ease[n]}" bounces (set allowBounce: true to use it)`),t.ease[n]=r.ease[n]);return r=t,u(),i.forEach(n=>n(r)),{rejected:o}},reset(){r=structuredClone(a),u(),i.forEach(e=>e(r))},enable(){s.set({enabled:!0})},disable(){s.set({enabled:!1})},isOn(){return r.enabled&&!(r.respectReducedMotion&&m())},dropdownMs(){let[e,o]=r.dropdownRange;return Math.max(e,Math.min(o,r.duration.dropdown))},ms(e,o="enter"){let t=e==="dropdown"?s.dropdownMs():r.duration[e];return o==="exit"?Math.round(t*r.exitRatio):t},easing(e){return e==="enter"?r.ease.out:e==="exit"?r.ease.in:r.ease.inOut},on(e){return i.add(e),()=>{i.delete(e)}}};u();export{a,p as b,s as c};
2
+ //# sourceMappingURL=chunk-2UPUC4RK.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/motion/config.ts"],
4
+ "sourcesContent": ["/** Global motion settings: one object, one switch. Defaults are the numbers of the 20 motion rules. */\nexport interface MotionConfig {\n enabled: boolean;\n /** When true (default) a user who asked the OS for reduced motion gets none. */\n respectReducedMotion: boolean;\n ease: { out: string; in: string; inOut: string };\n /** Milliseconds. */\n duration: { dropdown: number; popover: number; modal: number; press: number; pulse: number; reveal: number; swap: number; move: number; enter: number };\n /** The dropdown duration is clamped into this range (rule 2). */\n dropdownRange: [number, number];\n /** Exit duration = enter duration \u00D7 this (rule 15). */\n exitRatio: number;\n stagger: { step: number; max: number };\n press: { scale: number };\n popover: { scale: number };\n stretch: { amount: number };\n arc: { bend: number };\n /** Blur in px used by crossfades (rule 18). */\n blur: number;\n rubber: { resistance: number; settle: number };\n /** Rule 13: easings that overshoot are refused unless this is true. */\n allowBounce: boolean;\n originFromTrigger: boolean;\n}\n\nexport const DEFAULTS: MotionConfig = {\n enabled: true,\n respectReducedMotion: true,\n ease: { out: 'cubic-bezier(0, 0, 0.2, 1)', in: 'cubic-bezier(0.4, 0, 1, 1)', inOut: 'cubic-bezier(0.4, 0, 0.2, 1)' },\n duration: { dropdown: 200, popover: 200, modal: 240, press: 100, pulse: 450, reveal: 350, swap: 220, move: 450, enter: 250 },\n dropdownRange: [150, 250],\n exitRatio: 0.8,\n stagger: { step: 30, max: 12 },\n press: { scale: 0.97 },\n popover: { scale: 0.95 },\n stretch: { amount: 0.12 },\n arc: { bend: 0.25 },\n blur: 4,\n rubber: { resistance: 0.55, settle: 320 },\n allowBounce: false,\n originFromTrigger: true,\n};\n\nexport type DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? (T[K] extends unknown[] ? T[K] : DeepPartial<T[K]>) : T[K] };\n\n/** A `cubic-bezier` whose control points leave [0, 1] on the y axis overshoots (bounces); springs always do. */\nexport function isBouncy(easing: string): boolean {\n if (/spring|elastic|bounce/i.test(easing)) return true;\n const m = /cubic-bezier\\(([^)]+)\\)/i.exec(easing);\n if (!m) return false;\n const [, y1, , y2] = m[1].split(',').map(Number);\n return y1 < 0 || y1 > 1 || y2 < 0 || y2 > 1;\n}\n\ntype Listener = (c: Readonly<MotionConfig>) => void;\nlet current: MotionConfig = structuredClone(DEFAULTS);\nconst listeners = new Set<Listener>();\n\nconst merge = (base: any, patch: any): any => {\n const out = Array.isArray(base) ? [...base] : { ...base };\n for (const k in patch) out[k] = patch[k] && typeof patch[k] === 'object' && !Array.isArray(patch[k]) && base[k] ? merge(base[k], patch[k]) : patch[k];\n return out;\n};\n\nconst reduced = () => typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n/** Writes the settings that CSS needs as custom properties on <html>, and the `op-motion-off` class. */\nfunction apply(): void {\n if (typeof document === 'undefined') return;\n const c = current;\n const on = motion.isOn();\n const s = document.documentElement.style;\n const set = (k: string, v: string | number) => s.setProperty(`--op-motion-${k}`, String(v));\n set('ease-out', c.ease.out);\n set('ease-in', c.ease.in);\n set('ease-in-out', c.ease.inOut);\n set('press-scale', on ? c.press.scale : 1);\n set('press-duration', `${on ? c.duration.press : 0}ms`);\n set('popover-scale', on ? c.popover.scale : 1);\n set('dropdown-duration', `${on ? motion.dropdownMs() : 0}ms`);\n set('exit-ratio', c.exitRatio);\n set('stagger-step', `${on ? c.stagger.step : 0}ms`);\n set('blur', `${c.blur}px`);\n document.documentElement.classList.toggle('op-motion-off', !on);\n}\n\nexport const motion = {\n get(): Readonly<MotionConfig> {\n return current;\n },\n /**\n * Changes the settings (deep merge). Easings that bounce are refused while `allowBounce` is false; the rest of the patch\n * still applies. Returns what was refused.\n */\n set(patch: DeepPartial<MotionConfig>): { rejected: string[] } {\n const rejected: string[] = [];\n const next = merge(current, patch) as MotionConfig;\n for (const k of Object.keys(next.ease) as Array<keyof MotionConfig['ease']>) {\n if (!next.allowBounce && isBouncy(next.ease[k])) {\n rejected.push(`ease.${k}: \"${next.ease[k]}\" bounces (set allowBounce: true to use it)`);\n next.ease[k] = current.ease[k];\n }\n }\n current = next;\n apply();\n listeners.forEach((fn) => fn(current));\n return { rejected };\n },\n reset(): void {\n current = structuredClone(DEFAULTS);\n apply();\n listeners.forEach((fn) => fn(current));\n },\n enable(): void {\n motion.set({ enabled: true });\n },\n disable(): void {\n motion.set({ enabled: false });\n },\n /** Motion is switched on and the user did not ask for reduced motion (unless `respectReducedMotion` is off). */\n isOn(): boolean {\n return current.enabled && !(current.respectReducedMotion && reduced());\n },\n /** The dropdown duration, clamped into `dropdownRange`. */\n dropdownMs(): number {\n const [lo, hi] = current.dropdownRange;\n return Math.max(lo, Math.min(hi, current.duration.dropdown));\n },\n /** Duration for a kind of motion in a phase: exits are `exitRatio` times shorter (rule 15). */\n ms(kind: keyof MotionConfig['duration'], phase: 'enter' | 'exit' = 'enter'): number {\n const base = kind === 'dropdown' ? motion.dropdownMs() : current.duration[kind];\n return phase === 'exit' ? Math.round(base * current.exitRatio) : base;\n },\n /** Easing for a phase: entrances ease-out, exits ease-in, movement ease-in-out. */\n easing(phase: 'enter' | 'exit' | 'move'): string {\n return phase === 'enter' ? current.ease.out : phase === 'exit' ? current.ease.in : current.ease.inOut;\n },\n /** Subscribe to changes; returns the unsubscribe function. */\n on(fn: Listener): () => void {\n listeners.add(fn);\n return () => void listeners.delete(fn);\n },\n};\napply();\n"],
5
+ "mappings": "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",
6
+ "names": ["DEFAULTS", "isBouncy", "easing", "m", "y1", "y2", "current", "listeners", "merge", "base", "patch", "out", "k", "reduced", "apply", "c", "on", "motion", "s", "set", "v", "rejected", "next", "fn", "lo", "hi", "kind", "phase"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{c as t}from"./chunk-2UPUC4RK.js";var a=e=>!!e&&t.isOn()&&typeof e.animate=="function",s=e=>Promise.all(e.map(n=>n.finished.catch(()=>{}))).then(()=>{});function l(e,n){if(!e||!t.get().originFromTrigger)return;let r=n.getBoundingClientRect(),i="getBoundingClientRect"in e?e.getBoundingClientRect():{left:e.x,top:e.y,width:0,height:0},o=(m,u)=>Math.max(0,Math.min(m,u));return`${o(i.left+i.width/2-r.left,r.width)}px ${o(i.top+i.height/2-r.top,r.height)}px`}function c(e,n,r="dropdown"){if(!a(e))return null;let i=l(n,e);i&&(e.style.transformOrigin=i);let o=t.get().popover.scale;return s([e.animate([{opacity:0,transform:`scale(${o})`},{opacity:1,transform:"scale(1)"}],{duration:t.ms(r),easing:t.easing("enter"),fill:"backwards"})])}function g(e,n,r="dropdown"){if(!a(e))return null;let i=l(n,e);i&&(e.style.transformOrigin=i);let o=t.get().popover.scale;return s([e.animate([{opacity:1,transform:"scale(1)"},{opacity:0,transform:`scale(${o})`}],{duration:t.ms(r,"exit"),easing:t.easing("exit"),fill:"forwards"})])}var d=(e,n={})=>Math.min(e,n.max??t.get().stagger.max)*(n.step??t.get().stagger.step);function p(e,n={}){let r=Array.from(e);return!r.length||!a(r[0])?null:s(r.map((i,o)=>i.animate([{opacity:0,transform:`translateY(${n.dy??6}px)`},{opacity:1,transform:"none"}],{duration:t.ms("enter"),easing:t.easing("enter"),delay:d(o,n),fill:"backwards"})))}function y(e,n,r={}){let i=n.flatMap(o=>Array.from(e.querySelectorAll(o)));return p(i,r)}function x(e,n="var(--op-color-success)"){return a(e)?s([e.animate([{boxShadow:`0 0 0 0 color-mix(in srgb, ${n} 55%, transparent)`,transform:"scale(1)"},{transform:"scale(1.03)",offset:.35},{boxShadow:`0 0 0 0.6rem color-mix(in srgb, ${n} 0%, transparent)`,transform:"scale(1)"}],{duration:t.get().duration.pulse,easing:t.easing("enter")})]):null}function b(e,n={}){return a(e)?s([e.animate([{opacity:0,transform:`translateY(${n.dy??8}px)`},{opacity:1,transform:"none"}],{duration:t.ms("enter"),easing:t.easing("enter"),delay:n.delay??0,fill:"backwards"})]):null}function h(e,n={}){return a(e)?s([e.animate([{opacity:1,transform:"none"},{opacity:0,transform:`translateY(${n.dy??8}px)`}],{duration:t.ms("enter","exit"),easing:t.easing("exit"),fill:"forwards"})]):null}export{l as a,c as b,g as c,d,p as e,y as f,x as g,b as h,h as i};
2
+ //# sourceMappingURL=chunk-4AA4FQEM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/motion/core.ts"],
4
+ "sourcesContent": ["import { motion } from './config';\n\n/** True when this element can be animated now (motion is on and the browser has the Web Animations API). */\nconst can = (el: Element | undefined): el is HTMLElement => !!el && motion.isOn() && typeof (el as HTMLElement).animate === 'function';\nconst settled = (a: Animation[]): Promise<void> => Promise.all(a.map((x) => x.finished.catch(() => undefined))).then(() => undefined);\n\ntype Trigger = Element | { x: number; y: number } | undefined;\n\n/** `transform-origin` that puts the popover's growth point at the trigger (rules 11 and 12). */\nexport function originFor(trigger: Trigger, el: HTMLElement): string | undefined {\n if (!trigger || !motion.get().originFromTrigger) return undefined;\n const r = el.getBoundingClientRect();\n const t = 'getBoundingClientRect' in trigger ? trigger.getBoundingClientRect() : { left: trigger.x, top: trigger.y, width: 0, height: 0 };\n const clamp = (v: number, max: number) => Math.max(0, Math.min(v, max));\n return `${clamp(t.left + t.width / 2 - r.left, r.width)}px ${clamp(t.top + t.height / 2 - r.top, r.height)}px`;\n}\n\ntype Kind = 'dropdown' | 'popover' | 'modal';\n\n/**\n * A floating element appears: fades in and scales up from `popover.scale` (0.95), growing out of the trigger, ease-out.\n * Resolves when it finished; `null` when nothing was animated (motion off, no Web Animations).\n */\nexport function popIn(el: HTMLElement, trigger?: Trigger, kind: Kind = 'dropdown'): Promise<void> | null {\n if (!can(el)) return null;\n const o = originFor(trigger, el);\n if (o) el.style.transformOrigin = o;\n const s = motion.get().popover.scale;\n return settled([el.animate([{ opacity: 0, transform: `scale(${s})` }, { opacity: 1, transform: 'scale(1)' }], { duration: motion.ms(kind), easing: motion.easing('enter'), fill: 'backwards' })]);\n}\n\n/** The inverse: shrinks back toward the trigger, `exitRatio` (80 %) as long as the entrance, ease-in. The caller hides the element when it resolves. */\nexport function popOut(el: HTMLElement, trigger?: Trigger, kind: Kind = 'dropdown'): Promise<void> | null {\n if (!can(el)) return null;\n const o = originFor(trigger, el);\n if (o) el.style.transformOrigin = o;\n const s = motion.get().popover.scale;\n return settled([el.animate([{ opacity: 1, transform: 'scale(1)' }, { opacity: 0, transform: `scale(${s})` }], { duration: motion.ms(kind, 'exit'), easing: motion.easing('exit'), fill: 'forwards' })]);\n}\n\nexport interface StaggerOptions {\n /** Delay between consecutive items (ms). Default `stagger.step` (30). */\n step?: number;\n /** After this many items the delay stops growing. Default `stagger.max` (12). */\n max?: number;\n /** Start offset in px (rises from below). Default 6. */\n dy?: number;\n}\n\n/** The delay (ms) of the item at `index` in a staggered group. */\nexport const staggerDelay = (index: number, o: StaggerOptions = {}): number => Math.min(index, o.max ?? motion.get().stagger.max) * (o.step ?? motion.get().stagger.step);\n\n/** Items of a list enter one after the other, 30 ms apart (rule 3), each ease-out. */\nexport function stagger(els: ArrayLike<Element>, o: StaggerOptions = {}): Promise<void> | null {\n const list = Array.from(els);\n if (!list.length || !can(list[0])) return null;\n return settled(list.map((el, i) => (el as HTMLElement).animate([{ opacity: 0, transform: `translateY(${o.dy ?? 6}px)` }, { opacity: 1, transform: 'none' }], { duration: motion.ms('enter'), easing: motion.easing('enter'), delay: staggerDelay(i, o), fill: 'backwards' })));\n}\n\n/** The parts of a card settle in order: every match of the first selector, then the second... one stagger step apart (rule 6). */\nexport function staggerDetails(root: ParentNode, selectors: string[], o: StaggerOptions = {}): Promise<void> | null {\n const els = selectors.flatMap((s) => Array.from(root.querySelectorAll(s)));\n return stagger(els, o);\n}\n\n/** A subtle ring and a tiny swell to confirm that something worked (rule 8). */\nexport function pulse(el: HTMLElement, color = 'var(--op-color-success)'): Promise<void> | null {\n if (!can(el)) return null;\n return settled([\n el.animate(\n [\n { boxShadow: `0 0 0 0 color-mix(in srgb, ${color} 55%, transparent)`, transform: 'scale(1)' },\n { transform: 'scale(1.03)', offset: 0.35 },\n { boxShadow: `0 0 0 0.6rem color-mix(in srgb, ${color} 0%, transparent)`, transform: 'scale(1)' },\n ],\n { duration: motion.get().duration.pulse, easing: motion.easing('enter') },\n ),\n ]);\n}\n\n/** A plain entrance: fade in while rising a little, ease-out (rule 1). */\nexport function enter(el: HTMLElement, o: { dy?: number; delay?: number } = {}): Promise<void> | null {\n if (!can(el)) return null;\n return settled([el.animate([{ opacity: 0, transform: `translateY(${o.dy ?? 8}px)` }, { opacity: 1, transform: 'none' }], { duration: motion.ms('enter'), easing: motion.easing('enter'), delay: o.delay ?? 0, fill: 'backwards' })]);\n}\n\n/** The same motion going out: shorter by `exitRatio`, ease-in (rules 1 and 15). */\nexport function exit(el: HTMLElement, o: { dy?: number } = {}): Promise<void> | null {\n if (!can(el)) return null;\n return settled([el.animate([{ opacity: 1, transform: 'none' }, { opacity: 0, transform: `translateY(${o.dy ?? 8}px)` }], { duration: motion.ms('enter', 'exit'), easing: motion.easing('exit'), fill: 'forwards' })]);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["can", "el", "motion", "settled", "a", "x", "originFor", "trigger", "t", "clamp", "v", "max", "popIn", "kind", "o", "s", "popOut", "staggerDelay", "index", "stagger", "els", "list", "i", "staggerDetails", "root", "selectors", "pulse", "color", "enter", "exit"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var d=Object.defineProperty;var e=(c,a)=>{for(var b in a)d(c,b,{get:a[b],enumerable:!0})};export{e as a};
2
+ //# sourceMappingURL=chunk-4C666HHU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as E,b as o,c as D,d as c,e as g,h as C}from"./chunk-NWTTHDIM.js";import{c as M}from"./chunk-IHAYOSBR.js";import{a as k,b as x}from"./chunk-IYPKPLCU.js";import{b as n}from"./chunk-PZSHOSOS.js";import{d as L,e as v}from"./chunk-MA5BJL3S.js";var f=(_,t)=>new Intl.DateTimeFormat(L()._lang,_).format(t),w=class extends k{baseCls="op-calendar";cursor=D();mode="days";titleEl;bodyEl;prevEl;nextEl;build(){let t=n("div","op-calendar",{role:"dialog","aria-label":v("calMonth")});return this.prevEl=n("button","op-calendar__nav",{type:"button","aria-label":v("calPrev")},M("chevron-left")),this.nextEl=n("button","op-calendar__nav",{type:"button","aria-label":v("calNext")},M("chevron-right")),this.titleEl=n("button","op-calendar__title",{type:"button","aria-live":"polite"}),this.bodyEl=n("div","op-calendar__body"),t.append(n("div","op-calendar__header",{},this.prevEl,this.titleEl,this.nextEl),this.bodyEl),t}onRender(){let t=this.first();t&&o(t)&&(this.cursor=t),this.listen(this.prevEl,"click",()=>this.step(-1)),this.listen(this.nextEl,"click",()=>this.step(1)),this.listen(this.titleEl,"click",()=>{this.mode=this.mode==="days"?"months":"days",this.paint()}),this.listen(this.bodyEl,"click",e=>{let s=e.target.closest("[data-iso],[data-month]");if(s)if(s.dataset.month){let[i,r]=s.dataset.month.split("-").map(Number),p=o(this.cursor);this.cursor=g(this.cursor,(i-p.getFullYear())*12+(r-1-p.getMonth())),this.mode="days",this.paint(),this.emit("navigate",i,r-1),this.focusDay()}else this.choose(s.dataset.iso)}),this.listen(this.bodyEl,"keydown",e=>this.onKey(e)),this.paint()}blocked(t){let{min:e,max:s,isDisabled:i}=this.config;return!!e&&t<e||!!s&&t>s||!!i?.(t)}span(){let t=this.config.value;return t?typeof t=="string"?{start:t,end:t}:t:{start:null,end:null}}first(){return this.span().start}choose(t){if(this.blocked(t))return;if(!this.config.range)return this.setValue(t),void this.emit("select",t);let{start:e,end:s}=this.span();if(e&&!s){let i=t<e?{start:t,end:e}:{start:e,end:t};this.setValue(i),this.emit("select",i)}else this.setValue({start:t,end:null}),this.emit("start",t)}step(t){this.cursor=this.mode==="days"?g(this.cursor,t):g(this.cursor,t*12),this.paint();let e=o(this.cursor);this.emit("navigate",e.getFullYear(),e.getMonth())}move(t){let e=o(this.cursor);this.cursor=t;let s=o(t);this.paint(),(s.getMonth()!==e.getMonth()||s.getFullYear()!==e.getFullYear())&&this.emit("navigate",s.getFullYear(),s.getMonth()),this.focusDay()}onKey(t){if(this.mode!=="days")return;let e=this.cursor,s=(o(e).getDay()-this.weekStart()+7)%7,i={ArrowLeft:c(e,-1),ArrowRight:c(e,1),ArrowUp:c(e,-7),ArrowDown:c(e,7),Home:c(e,-s),End:c(e,6-s),PageUp:g(e,t.shiftKey?-12:-1),PageDown:g(e,t.shiftKey?12:1)};i[t.key]?(t.preventDefault(),this.move(i[t.key])):(t.key==="Enter"||t.key===" ")&&(t.preventDefault(),this.choose(e))}weekStart(){return this.config.firstDay??C()}paint(){let t=o(this.cursor);this.el.classList.toggle("is-months",this.mode==="months"),this.titleEl.textContent=this.mode==="days"?f({month:"long",year:"numeric"},t):String(t.getFullYear()),this.mode==="days"?this.paintDays(t):this.paintMonths(t)}paintDays(t){let e=this.weekStart(),s=n("tr");for(let d=0;d<7;d++){let m=new Date(2023,0,1+(e+d)%7);s.append(n("th","op-calendar__dow",{scope:"col",abbr:f({weekday:"long"},m)},f({weekday:"short"},m)))}let i=[],r=new Date(t.getFullYear(),t.getMonth(),1);r.setDate(1-(r.getDay()-e+7)%7);let p=D(),{start:h,end:u}=this.config.range?this.span():{start:this.first(),end:this.first()};for(let d=0;d<6;d++){let m=n("tr");for(let b=0;b<7;b++){let y=new Date(r.getFullYear(),r.getMonth(),r.getDate()+d*7+b),a=E(y),l=n("td","op-calendar__day",{role:"gridcell","data-iso":a,tabindex:a===this.cursor?0:-1,"aria-selected":String(!!h&&a>=h&&a<=(u??h)),"aria-label":f({dateStyle:"full"},y),"aria-disabled":this.blocked(a)?"true":null,"aria-current":a===p?"date":null},String(y.getDate()));l.classList.toggle("is-outside",y.getMonth()!==t.getMonth()),l.classList.toggle("is-today",a===p),l.classList.toggle("is-selected",a===h||a===u),l.classList.toggle("is-in-range",!!h&&!!u&&a>h&&a<u),l.classList.toggle("is-range-start",!!this.config.range&&a===h),l.classList.toggle("is-range-end",!!this.config.range&&a===u),l.classList.toggle("is-disabled",this.blocked(a)),m.append(l)}i.push(m)}this.bodyEl.replaceChildren(n("table","op-calendar__grid",{role:"grid"},n("thead","",{},s),n("tbody","",{},...i)))}paintMonths(t){let e=Array.from({length:12},(s,i)=>{let r=n("button","op-calendar__month",{type:"button","data-month":`${t.getFullYear()}-${String(i+1).padStart(2,"0")}`},f({month:"short"},new Date(2e3,i,1)));return r.classList.toggle("is-selected",i===t.getMonth()),r});this.bodyEl.replaceChildren(n("div","op-calendar__months",{},...e))}setValue(t){this.config.value=t;let e=this.first();e&&o(e)&&(this.cursor=e),this.rendered&&(this.mode="days",this.paint())}setRange(t){this.config.range=t,this.config.value=null,this.rendered&&this.paint()}setMin(t){this.config.min=t,this.rendered&&this.paint()}setMax(t){this.config.max=t,this.rendered&&this.paint()}showMonth(t,e){this.cursor=E(new Date(t,e,1)),this.rendered&&this.paint()}focusDay(){this.render(),this.bodyEl.querySelector('[tabindex="0"]')?.focus()}};x("calendar",w);export{w as a};
2
+ //# sourceMappingURL=chunk-4COBH4QJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/dates/calendar/calendar.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t, getLocale } from '../../../core/i18n';\nimport { toISO, fromISO, today, addDays, addMonths, firstDay } from '../../../core/date';\nimport { iconEl } from '../../base/icon/icon';\n\n/** Both ends are `YYYY-MM-DD`; `end` is null while the user has only picked the first day. */\nexport interface DateRange {\n start: string | null;\n end: string | null;\n}\n\nexport interface CalendarConfig extends ComponentConfig {\n /** Selected day, `YYYY-MM-DD`; with `range: true`, a `DateRange`. */\n value?: string | DateRange | null;\n /** Pick a start and an end day (two clicks). */\n range?: boolean;\n min?: string;\n max?: string;\n /** 0 = Sunday. Default: the locale's. */\n firstDay?: number;\n isDisabled?: (iso: string) => boolean;\n}\n\nconst fmt = (opts: Intl.DateTimeFormatOptions, d: Date) => new Intl.DateTimeFormat(getLocale()._lang, opts).format(d);\n\n/** Month calendar. Click the title to pick a month; arrow keys, Page keys and Home/End move the focused day. */\nexport class Calendar extends Component<CalendarConfig> {\n protected override baseCls = 'op-calendar';\n private cursor = today(); // the focused day; its month is the visible month\n private mode: 'days' | 'months' = 'days';\n private titleEl!: HTMLElement;\n private bodyEl!: HTMLElement;\n private prevEl!: HTMLButtonElement;\n private nextEl!: HTMLButtonElement;\n\n protected override build() {\n const el = h('div', 'op-calendar', { role: 'dialog', 'aria-label': t('calMonth') });\n this.prevEl = h('button', 'op-calendar__nav', { type: 'button', 'aria-label': t('calPrev') }, iconEl('chevron-left'));\n this.nextEl = h('button', 'op-calendar__nav', { type: 'button', 'aria-label': t('calNext') }, iconEl('chevron-right'));\n this.titleEl = h('button', 'op-calendar__title', { type: 'button', 'aria-live': 'polite' });\n this.bodyEl = h('div', 'op-calendar__body');\n el.append(h('div', 'op-calendar__header', {}, this.prevEl, this.titleEl, this.nextEl), this.bodyEl);\n return el;\n }\n\n protected override onRender() {\n const v = this.first();\n if (v && fromISO(v)) this.cursor = v;\n this.listen(this.prevEl, 'click', () => this.step(-1));\n this.listen(this.nextEl, 'click', () => this.step(1));\n this.listen(this.titleEl, 'click', () => {\n this.mode = this.mode === 'days' ? 'months' : 'days';\n this.paint();\n });\n this.listen(this.bodyEl, 'click', (e: Event) => {\n const cell = (e.target as HTMLElement).closest<HTMLElement>('[data-iso],[data-month]');\n if (!cell) return;\n if (cell.dataset.month) {\n const [y, m] = cell.dataset.month.split('-').map(Number);\n const cur = fromISO(this.cursor)!;\n this.cursor = addMonths(this.cursor, (y - cur.getFullYear()) * 12 + (m - 1 - cur.getMonth()));\n this.mode = 'days';\n this.paint();\n this.emit('navigate', y, m - 1);\n this.focusDay();\n } else this.choose(cell.dataset.iso!);\n });\n this.listen(this.bodyEl, 'keydown', (e: KeyboardEvent) => this.onKey(e));\n this.paint();\n }\n\n private blocked(iso: string) {\n const { min, max, isDisabled } = this.config;\n return (!!min && iso < min) || (!!max && iso > max) || !!isDisabled?.(iso);\n }\n\n /** The value as a range (a single day is a one-day range). */\n private span(): DateRange {\n const v = this.config.value;\n return !v ? { start: null, end: null } : typeof v === 'string' ? { start: v, end: v } : v;\n }\n private first(): string | null {\n return this.span().start;\n }\n\n private choose(iso: string) {\n if (this.blocked(iso)) return;\n if (!this.config.range) {\n this.setValue(iso);\n return void this.emit('select', iso);\n }\n const { start, end } = this.span();\n if (start && !end) {\n const r = iso < start ? { start: iso, end: start } : { start, end: iso };\n this.setValue(r);\n this.emit('select', r);\n } else {\n this.setValue({ start: iso, end: null });\n this.emit('start', iso);\n }\n }\n\n private step(dir: number) {\n this.cursor = this.mode === 'days' ? addMonths(this.cursor, dir) : addMonths(this.cursor, dir * 12);\n this.paint();\n const d = fromISO(this.cursor)!;\n this.emit('navigate', d.getFullYear(), d.getMonth());\n }\n\n private move(next: string) {\n const before = fromISO(this.cursor)!;\n this.cursor = next;\n const d = fromISO(next)!;\n this.paint();\n if (d.getMonth() !== before.getMonth() || d.getFullYear() !== before.getFullYear()) this.emit('navigate', d.getFullYear(), d.getMonth());\n this.focusDay();\n }\n\n private onKey(e: KeyboardEvent) {\n if (this.mode !== 'days') return;\n const c = this.cursor;\n const dow = (fromISO(c)!.getDay() - this.weekStart() + 7) % 7;\n const moves: Record<string, string> = {\n ArrowLeft: addDays(c, -1),\n ArrowRight: addDays(c, 1),\n ArrowUp: addDays(c, -7),\n ArrowDown: addDays(c, 7),\n Home: addDays(c, -dow),\n End: addDays(c, 6 - dow),\n PageUp: addMonths(c, e.shiftKey ? -12 : -1),\n PageDown: addMonths(c, e.shiftKey ? 12 : 1),\n };\n if (moves[e.key]) {\n e.preventDefault();\n this.move(moves[e.key]);\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this.choose(c);\n }\n }\n\n private weekStart() {\n return this.config.firstDay ?? firstDay();\n }\n\n private paint() {\n const cur = fromISO(this.cursor)!;\n this.el.classList.toggle('is-months', this.mode === 'months');\n this.titleEl.textContent = this.mode === 'days' ? fmt({ month: 'long', year: 'numeric' }, cur) : String(cur.getFullYear());\n this.mode === 'days' ? this.paintDays(cur) : this.paintMonths(cur);\n }\n\n private paintDays(cur: Date) {\n const first = this.weekStart();\n const head = h('tr');\n for (let i = 0; i < 7; i++) {\n const d = new Date(2023, 0, 1 + ((first + i) % 7)); // 2023-01-01 is a Sunday\n head.append(h('th', 'op-calendar__dow', { scope: 'col', abbr: fmt({ weekday: 'long' }, d) }, fmt({ weekday: 'short' }, d)));\n }\n const rows: HTMLElement[] = [];\n const start = new Date(cur.getFullYear(), cur.getMonth(), 1);\n start.setDate(1 - ((start.getDay() - first + 7) % 7));\n const todayIso = today();\n const { start: from, end: to } = this.config.range ? this.span() : { start: this.first(), end: this.first() };\n for (let w = 0; w < 6; w++) {\n const tr = h('tr');\n for (let d = 0; d < 7; d++) {\n const day = new Date(start.getFullYear(), start.getMonth(), start.getDate() + w * 7 + d);\n const iso = toISO(day);\n const td = h('td', 'op-calendar__day', {\n role: 'gridcell',\n 'data-iso': iso,\n tabindex: iso === this.cursor ? 0 : -1,\n 'aria-selected': String(!!from && iso >= from && iso <= (to ?? from)),\n 'aria-label': fmt({ dateStyle: 'full' }, day),\n 'aria-disabled': this.blocked(iso) ? 'true' : null,\n 'aria-current': iso === todayIso ? 'date' : null,\n }, String(day.getDate()));\n td.classList.toggle('is-outside', day.getMonth() !== cur.getMonth());\n td.classList.toggle('is-today', iso === todayIso);\n td.classList.toggle('is-selected', iso === from || iso === to);\n td.classList.toggle('is-in-range', !!from && !!to && iso > from && iso < to);\n td.classList.toggle('is-range-start', !!this.config.range && iso === from);\n td.classList.toggle('is-range-end', !!this.config.range && iso === to);\n td.classList.toggle('is-disabled', this.blocked(iso));\n tr.append(td);\n }\n rows.push(tr);\n }\n this.bodyEl.replaceChildren(h('table', 'op-calendar__grid', { role: 'grid' }, h('thead', '', {}, head), h('tbody', '', {}, ...rows)));\n }\n\n private paintMonths(cur: Date) {\n const cells = Array.from({ length: 12 }, (_, m) => {\n const b = h('button', 'op-calendar__month', { type: 'button', 'data-month': `${cur.getFullYear()}-${String(m + 1).padStart(2, '0')}` }, fmt({ month: 'short' }, new Date(2000, m, 1)));\n b.classList.toggle('is-selected', m === cur.getMonth());\n return b;\n });\n this.bodyEl.replaceChildren(h('div', 'op-calendar__months', {}, ...cells));\n }\n\n // ---- API -----------------------------------------------------------------------------------\n\n setValue(value: string | DateRange | null) {\n this.config.value = value;\n const iso = this.first();\n if (iso && fromISO(iso)) this.cursor = iso;\n if (this.rendered) {\n this.mode = 'days';\n this.paint();\n }\n }\n /** Switches between single-day and range picking. */\n setRange(range: boolean) {\n this.config.range = range;\n this.config.value = null;\n if (this.rendered) this.paint();\n }\n setMin(min: string | undefined) {\n this.config.min = min;\n if (this.rendered) this.paint();\n }\n setMax(max: string | undefined) {\n this.config.max = max;\n if (this.rendered) this.paint();\n }\n showMonth(year: number, month: number) {\n this.cursor = toISO(new Date(year, month, 1));\n if (this.rendered) this.paint();\n }\n focusDay() {\n this.render();\n this.bodyEl.querySelector<HTMLElement>('[tabindex=\"0\"]')?.focus();\n }\n}\nregister('calendar', Calendar);\n"],
5
+ "mappings": "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",
6
+ "names": ["fmt", "opts", "d", "getLocale", "Calendar", "Component", "today", "el", "h", "t", "iconEl", "v", "fromISO", "cell", "y", "m", "cur", "addMonths", "iso", "min", "max", "isDisabled", "start", "end", "r", "dir", "next", "before", "e", "c", "dow", "moves", "addDays", "firstDay", "first", "head", "i", "rows", "todayIso", "from", "to", "w", "tr", "day", "toISO", "td", "cells", "_", "b", "value", "range", "year", "month", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as h}from"./chunk-NHVEP72K.js";import{a}from"./chunk-XZEOSW3Q.js";import{a as f,b as p,d as c}from"./chunk-IYPKPLCU.js";import{b as o}from"./chunk-PZSHOSOS.js";import{e as n}from"./chunk-MA5BJL3S.js";var m=new Map;function M(r,e){m.set(r,e)}function g(r){let e=typeof r=="string"?m.get(r):r;if(!e)throw new Error(`Optikos: unknown lookup "${r}". Did you call registerLookup?`);return e}var y=r=>typeof r.store=="function"?r.store():r.store,v=r=>!r||r==="textfield"||r==="textarea",k=r=>r==null||r===""||Array.isArray(r)&&!r.length,l=class extends f{baseCls="op-searchgrid";def;store;fields=[];grid;form;build(){this.def=g(this.config.lookup),this.store=y(this.def);let e=this.def;this.form=o("div","op-searchgrid__filters",{role:"search"});let i=[new a({text:n("search"),icon:"search",variant:"primary",handler:()=>{this.search()}}),new a({text:n("clear"),handler:()=>this.clear()})];return this.fields=(e.filters??[]).map(t=>{let{op:s,field:x,...u}=t,d=c({...u,renderTo:void 0});return d.on("enter",()=>{this.search()}),{cfg:t,cmp:d}}),this.form.append(...this.fields.map(t=>t.cmp.el),o("div","op-searchgrid__buttons",{},...i.map(t=>t.el))),this.grid=new h({store:this.store,columns:e.columns,selection:e.selection??"single",paging:e.paging!==!1,flex:1}),this.grid.on("select",t=>this.emit("select",t)),this.grid.on("row-activate",()=>this.confirm()),this.grid.on("row-dblclick",()=>this.confirm()),this.own(()=>[...i,this.grid,...this.fields.map(t=>t.cmp)].forEach(t=>t.destroy())),o("div",this.baseCls,{},this.form,this.grid.el)}onRender(){this.def.autoSearch!==!1&&this.search()}notifyMount(){super.notifyMount(),this.fields.forEach(e=>e.cmp.notifyMount()),this.grid.notifyMount()}confirm(){let e=this.grid.getSelection();e.length&&this.emit("confirm",e)}getFilters(){return this.fields.flatMap(({cfg:e,cmp:i})=>{let t=i.getValue?.();if(k(t))return[];let s=e.field??e.name;return typeof t=="object"&&!Array.isArray(t)&&"start"in t?t.start?[{field:s,op:"between",value:[t.start,t.end??t.start]}]:[]:[{field:s,op:e.op??(v(e.type)?"contains":"eq"),value:t}]})}async search(e){e!=null&&this.setQuery(e);let i=this.getFilters();this.emit("before-search",i)!==!1&&(await(i.length?this.store.filter(i):this.store.clearFilter()),this.emit("search",i))}clear(){this.fields.forEach(e=>e.cmp.clear?.()),this.search()}setQuery(e){let i=this.def.queryField??this.def.filters?.[0]?.name;this.fields.find(t=>t.cfg.name===i)?.cmp?.setValue?.(e)}getSelection(){return this.grid.getSelection()}getGrid(){return this.grid}getStore(){return this.store}focus(){(this.fields[0]?.cmp??this.grid).focus()}};p("searchgrid",l);export{M as a,g as b,y as c,l as d};
2
+ //# sourceMappingURL=chunk-4DHQKECB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/data/searchgrid/searchgrid.ts"],
4
+ "sourcesContent": ["import { Component, type ComponentConfig } from '../../../core/component';\nimport { register, create, type AnyConfig } from '../../../core/registry';\nimport { h } from '../../../core/dom';\nimport { t } from '../../../core/i18n';\nimport type { Store } from '../../../data/store';\nimport type { Model } from '../../../data/model';\nimport type { Column } from '../../../data/column';\nimport type { FilterOp, FilterSpec } from '../../../data/proxy';\nimport { Button } from '../../base/button/button';\nimport { Grid } from '../grid/grid';\n\n/** A filter field of a lookup: any field config, plus how its value is matched. */\nexport type LookupFilter = AnyConfig & { name: string; op?: FilterOp; field?: string };\n\n/** Everything that describes \"search for a record\": shared by SearchGrid and LookupField. */\nexport interface LookupDef {\n /** A function gives every instance its own store (recommended when the definition is reused). */\n store: Store<any> | (() => Store<any>);\n columns: Column[];\n filters?: LookupFilter[];\n /** Name of the filter that receives the quick text (LookupField typing). Default: the first filter. */\n queryField?: string;\n valueField?: string;\n displayField?: string;\n selection?: 'single' | 'multi';\n paging?: boolean;\n /** Search when shown. Default true. */\n autoSearch?: boolean;\n title?: string;\n width?: number;\n height?: number;\n}\n\nconst defs = new Map<string, LookupDef>();\n/** Registers a lookup definition for declarative use by name (`lookup: 'people'`). */\nexport function registerLookup(name: string, def: LookupDef): void {\n defs.set(name, def);\n}\nexport function resolveLookup(lookup: LookupDef | string): LookupDef {\n const d = typeof lookup === 'string' ? defs.get(lookup) : lookup;\n if (!d) throw new Error(`Optikos: unknown lookup \"${lookup}\". Did you call registerLookup?`);\n return d;\n}\nexport const lookupStore = (def: LookupDef): Store<any> => (typeof def.store === 'function' ? def.store() : def.store);\n\nexport interface SearchGridConfig extends ComponentConfig {\n lookup: LookupDef | string;\n}\n\nconst textual = (type?: string) => !type || type === 'textfield' || type === 'textarea';\nconst blank = (v: unknown) => v == null || v === '' || (Array.isArray(v) && !v.length);\n\n/** Filters on top, results grid below. The Store does the searching; this component only turns the filter fields into specs. */\nexport class SearchGrid extends Component<SearchGridConfig> {\n protected override baseCls = 'op-searchgrid';\n private def!: LookupDef;\n private store!: Store<any>;\n private fields: Array<{ cfg: LookupFilter; cmp: Component }> = [];\n private grid!: Grid;\n private form!: HTMLElement;\n\n protected override build() {\n this.def = resolveLookup(this.config.lookup);\n this.store = lookupStore(this.def);\n const d = this.def;\n this.form = h('div', 'op-searchgrid__filters', { role: 'search' });\n const btns = [\n new Button({ text: t('search'), icon: 'search', variant: 'primary', handler: () => void this.search() }),\n new Button({ text: t('clear'), handler: () => this.clear() }),\n ];\n this.fields = (d.filters ?? []).map((cfg) => {\n const { op: _o, field: _f, ...fieldCfg } = cfg;\n const cmp = create({ ...fieldCfg, renderTo: undefined } as AnyConfig);\n cmp.on('enter', () => void this.search());\n return { cfg, cmp };\n });\n this.form.append(...this.fields.map((f) => f.cmp.el), h('div', 'op-searchgrid__buttons', {}, ...btns.map((b) => b.el)));\n this.grid = new Grid({ store: this.store, columns: d.columns, selection: d.selection ?? 'single', paging: d.paging !== false, flex: 1 });\n this.grid.on('select', (recs: Model[]) => this.emit('select', recs));\n this.grid.on('row-activate', () => this.confirm());\n this.grid.on('row-dblclick', () => this.confirm());\n this.own(() => [...btns, this.grid, ...this.fields.map((f) => f.cmp)].forEach((c) => c.destroy()));\n return h('div', this.baseCls, {}, this.form, this.grid.el);\n }\n\n protected override onRender() {\n if (this.def.autoSearch !== false) void this.search();\n }\n\n override notifyMount() {\n super.notifyMount();\n this.fields.forEach((f) => f.cmp.notifyMount());\n this.grid.notifyMount();\n }\n\n private confirm() {\n const recs = this.grid.getSelection();\n if (recs.length) this.emit('confirm', recs);\n }\n\n /** The non-empty filter fields as filter specs. */\n getFilters(): FilterSpec[] {\n return this.fields.flatMap(({ cfg, cmp }) => {\n const v = (cmp as any).getValue?.();\n if (blank(v)) return [];\n const field = cfg.field ?? cfg.name;\n if (typeof v === 'object' && !Array.isArray(v) && 'start' in v) return v.start ? [{ field, op: 'between' as const, value: [v.start, v.end ?? v.start] }] : [];\n return [{ field, op: cfg.op ?? (textual(cfg.type) ? 'contains' : 'eq'), value: v }];\n });\n }\n\n /** Filters the store with the current fields (or loads it, when there are none). Resolves when the results are in. */\n async search(query?: string): Promise<void> {\n if (query != null) this.setQuery(query);\n const specs = this.getFilters();\n if (this.emit('before-search', specs) === false) return;\n await (specs.length ? this.store.filter(specs) : this.store.clearFilter());\n this.emit('search', specs);\n }\n\n /** Empties the filter fields and searches again. */\n clear(): void {\n this.fields.forEach((f) => (f.cmp as any).clear?.());\n void this.search();\n }\n\n /** Fills the quick-search field (`queryField`, default the first filter) without searching. */\n setQuery(text: string): void {\n const name = this.def.queryField ?? this.def.filters?.[0]?.name;\n (this.fields.find((f) => f.cfg.name === name)?.cmp as any)?.setValue?.(text);\n }\n\n getSelection(): Model[] {\n return this.grid.getSelection();\n }\n getGrid(): Grid {\n return this.grid;\n }\n getStore(): Store<any> {\n return this.store;\n }\n override focus(): void {\n (this.fields[0]?.cmp ?? this.grid).focus();\n }\n}\nregister('searchgrid', SearchGrid);\n"],
5
+ "mappings": "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",
6
+ "names": ["defs", "registerLookup", "name", "def", "resolveLookup", "lookup", "d", "lookupStore", "textual", "type", "blank", "v", "SearchGrid", "Component", "h", "btns", "Button", "t", "cfg", "_o", "_f", "fieldCfg", "cmp", "create", "f", "b", "Grid", "recs", "c", "field", "query", "specs", "text", "register"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{a as M}from"./chunk-ZYUXCZX7.js";import{a as S}from"./chunk-U3X2FW6U.js";import{a as L}from"./chunk-ZCAAM4NH.js";import{a as y}from"./chunk-SNTHW4K2.js";import{a as A}from"./chunk-XZEOSW3Q.js";import{c as _}from"./chunk-IHAYOSBR.js";import{a as k,b as x}from"./chunk-IYPKPLCU.js";import{b as a}from"./chunk-PZSHOSOS.js";import{e as r}from"./chunk-MA5BJL3S.js";var F={text:["contains","notContains","eq","ne","startsWith","endsWith","in","nin","empty","notEmpty"],number:["eq","ne","gt","ge","lt","le","between","notBetween","empty","notEmpty"],date:["eq","ne","gt","ge","lt","le","between","notBetween","empty","notEmpty"],select:["eq","ne","in","nin","empty","notEmpty"]},G={eq:"fbEq",ne:"fbNe",contains:"fbContains",notContains:"fbNotContains",startsWith:"fbStarts",endsWith:"fbEnds",gt:"fbGt",ge:"fbGe",lt:"fbLt",le:"fbLe",between:"fbBetween",notBetween:"fbNotBetween",in:"fbIn",nin:"fbNin",empty:"fbEmpty",notEmpty:"fbNotEmpty"},v=m=>m==="empty"||m==="notEmpty"?0:m==="between"||m==="notBetween"?2:1,b=m=>m==="in"||m==="nin",w=class extends k{baseCls="op-filterbuilder";root={kind:"group",op:"and",items:[]};parts=[];nextId=1;cancelApply;pickMenu;onRender(){this.el.setAttribute("role","group"),this.el.setAttribute("aria-label",r("fbLabel")),this.config.value&&(this.root=this.fromNode(this.config.value)),this.own(()=>(this.parts.forEach(e=>e.destroy()),this.pickMenu?.destroy())),this.paint(),this.config.value&&this.config.store&&this.apply()}fromNode(e){if("filters"in e)return{kind:"group",op:e.op,items:e.filters.map(n=>this.fromNode(n))};let[i,t]=Array.isArray(e.value)&&!b(e.op??"eq")?e.value:[e.value,void 0];return{kind:"rule",id:this.nextId++,field:e.field,op:e.op??"eq",value:b(e.op??"eq")?e.value:i,value2:t}}field(e){return this.config.fields.find(i=>i.name===e)??this.config.fields[0]}complete(e){let i=v(e.op),t=n=>n!=null&&n!==""&&!(Array.isArray(n)&&!n.length);return i===0||(i===1?t(e.value):t(e.value)&&t(e.value2))}toNode(e){let i=e.items.flatMap(t=>{if(t.kind==="group")return this.toNode(t)?[this.toNode(t)]:[];if(!this.complete(t))return[];let n=v(t.op);return[{field:t.field,op:t.op,...n===1?{value:t.value}:n===2?{value:[t.value,t.value2]}:{}}]});return i.length?{op:e.op,filters:i}:null}getFilter(){return this.toNode(this.root)}setFilter(e){this.root=e?this.fromNode(e):{kind:"group",op:"and",items:[]},this.rendered&&this.paint(),this.changed()}clear(){this.setFilter(null),this.apply()}apply(){this.cancelApply?.();let e=this.getFilter();if(this.emit("before-apply",e)===!1)return;let i=this.config.store;i&&(e?i.filter(e):i.clearFilter()),this.emit("apply",e)}addRule(e){this.root.items.push(this.newRule(e)),this.rendered&&this.paint()}setFields(e){this.config.fields=e,this.rendered&&this.paint()}setStore(e){this.config.store=e}newRule(e){let i=this.field(e??"");return{kind:"rule",id:this.nextId++,field:i.name,op:F[i.type??"text"][0]}}changed(){this.emit("change",this.getFilter()),this.config.live!==!1&&(this.cancelApply?.(),this.cancelApply=this.later(()=>this.apply(),250))}paint(){let e=document.activeElement?.closest("[data-fb]")?.dataset.fb;this.parts.splice(0).forEach(n=>n.destroy());let i=[this.group(this.root,0,null)];this.config.live===!1&&i.push(a("div","op-filterbuilder__foot",{},this.button(r("fbApply"),"primary",()=>this.apply()))),this.el.replaceChildren(...i),this.mounted&&this.parts.forEach(n=>n.notifyMount());let t=e&&this.el.querySelector(`[data-fb="${e}"]`);t&&(t.matches("select,button,input")?t:t.querySelector("input"))?.focus()}button(e,i,t,n){let p=new A({text:e,variant:i,icon:n,handler:t});return this.parts.push(p),p.el}select(e,i,t,n,p){let s=a("select","op-filterbuilder__select",{"aria-label":t,"data-fb":n});for(let[h,d]of e)s.append(a("option","",{value:h},d));return s.value=i,this.listen(s,"change",()=>p(s.value)),s}group(e,i,t){let n=a("div",`op-filterbuilder__group${i?" is-nested":""}`,{role:"group","aria-label":r("fbLabel")}),p=this.select([["and",r("fbAnd")],["or",r("fbOr")]],e.op,r("fbLabel"),`g${i}:logic`,o=>{e.op=o,this.changed()}),s=a("div","op-filterbuilder__head",{},p),h=o=>{let l=this.newRule(o);e.items.push(l),this.paint(),this.el.querySelector(`[data-fb="r${l.id}:v1"] input, select[data-fb="r${l.id}:v1"]`)?.focus()},d=this.button(r("fbAddFilter"),"ghost",()=>this.config.addMode==="pick"?this.pick(d,h):h(),"plus");s.append(d),i<(this.config.maxDepth??3)&&s.append(this.button(r("fbAddGroup"),"ghost",()=>{e.items.push({kind:"group",op:"or",items:[this.newRule()]}),this.paint()},"plus")),t?s.append(this.removeBtn(()=>(t.items.splice(t.items.indexOf(e),1),this.paint(),this.changed()))):e.items.length&&s.append(this.button(r("fbClear"),"ghost",()=>this.clear())),n.append(s),!e.items.length&&!t&&n.append(a("div","op-filterbuilder__none",{},r("fbNone")));for(let o of e.items)n.append(o.kind==="group"?this.group(o,i+1,e):this.rule(o,e));return n}pick(e,i){this.pickMenu??=new L({}),this.pickMenu.setItems(this.config.fields.map(t=>({text:t.label??t.name,handler:()=>i(t.name)}))),this.pickMenu.showBy(e)}removeBtn(e){let i=a("button","op-filterbuilder__remove",{type:"button","aria-label":r("fbRemove"),title:r("fbRemove")},_("x"));return this.listen(i,"click",e),i}rule(e,i){let t=this.field(e.field),n=t.type??"text",p=`r${e.id}`,s=this.select(this.config.fields.map(l=>[l.name,l.label??l.name]),e.field,r("fbField"),`${p}:field`,l=>{e.field=l;let u=F[this.field(l).type??"text"];(!u.includes(e.op)||(this.field(l).type??"text")!==n)&&(e.op=u[0]),e.value=e.value2=void 0,this.paint(),this.changed()}),h=this.select(F[n].map(l=>[l,r(G[l])]),e.op,r("fbOperator"),`${p}:op`,l=>{let u=e.op;e.op=l,(v(u)!==v(e.op)||b(u)!==b(e.op))&&(e.value=e.value2=void 0),this.paint(),this.changed()}),d=a("div","op-filterbuilder__row",{},s,h),o=v(e.op);return o>=1&&d.append(this.editor(e,t,"value",`${p}:v1`)),o===2&&d.append(a("span","op-filterbuilder__to",{},r("fbTo")),this.editor(e,t,"value2",`${p}:v2`)),d.append(this.removeBtn(()=>(i.items.splice(i.items.indexOf(e),1),this.paint(),this.changed()))),d}editor(e,i,t,n){let p=i.type??"text",s=r("fbValue"),h=o=>{e[t]=o,this.changed()};if(p==="select"){let o=(i.options??[]).map(f=>typeof f=="object"?[String(f.value),f.label]:[String(f),String(f)]),l=f=>(i.options??[]).map(c=>typeof c=="object"?c.value:c).find(c=>String(c)===f)??f;if(b(e.op)){let f=new Set((Array.isArray(e.value)?e.value:[]).map(String)),c=a("div","op-filterbuilder__chips",{role:"group","aria-label":s,"data-fb":n});for(let[g,N]of o){let E=a("input","op-filterbuilder__chipbox",{type:"checkbox",value:g});E.checked=f.has(g),c.append(a("label","op-filterbuilder__chip",{},E,a("span","",{},N)))}return this.listen(c,"change",()=>h(Array.from(c.querySelectorAll("input:checked")).map(g=>l(g.value)))),c}let u=a("select","op-filterbuilder__select",{"aria-label":s,"data-fb":n});u.append(a("option","",{value:""},""));for(let[f,c]of o)u.append(a("option","",{value:f},c));return u.value=e.value!=null?String(e.value):"",this.listen(u,"change",()=>h(u.value===""?void 0:l(u.value))),u}if(b(e.op)){let o=new y({stableSize:!1,placeholder:r("fbList"),value:(e.value??[]).join(", ")});return o.on("change",l=>h(l.split(",").map(u=>u.trim()).filter(Boolean))),this.own1(o,s,n)}let d=p==="number"?new M({value:e[t]??null,stableSize:!1}):p==="date"?new S({value:e[t]??null,stableSize:!1}):new y({value:e[t]??"",stableSize:!1});return d.on("change",o=>h(o===""?void 0:o)),this.own1(d,s,n)}own1(e,i,t){this.parts.push(e),e.on("enter",()=>this.apply());let n=e.el;return n.classList.add("op-filterbuilder__value"),n.dataset.fb=t,e.getInput().setAttribute("aria-label",i),n}};x("filterbuilder",w);export{w as a};
2
+ //# sourceMappingURL=chunk-4Q67QI7J.js.map