@akashjs/runtime 0.2.2 → 0.2.7

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 (552) hide show
  1. package/dist/a11y.cjs +2 -0
  2. package/dist/a11y.cjs.map +1 -0
  3. package/dist/a11y.d.cts +99 -0
  4. package/dist/a11y.d.ts +99 -0
  5. package/dist/a11y.js +2 -0
  6. package/dist/a11y.js.map +1 -0
  7. package/dist/async-component.cjs +2 -0
  8. package/dist/async-component.cjs.map +1 -0
  9. package/dist/async-component.d.cts +44 -0
  10. package/dist/async-component.d.ts +44 -0
  11. package/dist/async-component.js +2 -0
  12. package/dist/async-component.js.map +1 -0
  13. package/dist/await-block.cjs +2 -0
  14. package/dist/await-block.cjs.map +1 -0
  15. package/dist/await-block.d.cts +37 -0
  16. package/dist/await-block.d.ts +37 -0
  17. package/dist/await-block.js +2 -0
  18. package/dist/await-block.js.map +1 -0
  19. package/dist/browser.cjs +2 -0
  20. package/dist/browser.cjs.map +1 -0
  21. package/dist/browser.d.cts +125 -0
  22. package/dist/browser.d.ts +125 -0
  23. package/dist/browser.js +2 -0
  24. package/dist/browser.js.map +1 -0
  25. package/dist/chunk-2HLDEWRT.cjs +2 -0
  26. package/dist/chunk-2HLDEWRT.cjs.map +1 -0
  27. package/dist/chunk-2LKFIID7.cjs +2 -0
  28. package/dist/chunk-2LKFIID7.cjs.map +1 -0
  29. package/dist/chunk-34PQECMN.cjs +2 -0
  30. package/dist/chunk-34PQECMN.cjs.map +1 -0
  31. package/dist/chunk-36VM3RJW.cjs +2 -0
  32. package/dist/chunk-36VM3RJW.cjs.map +1 -0
  33. package/dist/chunk-3PGU24B5.cjs +3 -0
  34. package/dist/chunk-3PGU24B5.cjs.map +1 -0
  35. package/dist/chunk-3XREYIJH.cjs +2 -0
  36. package/dist/chunk-3XREYIJH.cjs.map +1 -0
  37. package/dist/chunk-45DPEU7T.cjs +2 -0
  38. package/dist/chunk-45DPEU7T.cjs.map +1 -0
  39. package/dist/chunk-4J3QBQVW.js +4 -0
  40. package/dist/chunk-4J3QBQVW.js.map +1 -0
  41. package/dist/{chunk-NVZLEJXB.cjs → chunk-4NQEIKH5.cjs} +2 -2
  42. package/dist/{chunk-NVZLEJXB.cjs.map → chunk-4NQEIKH5.cjs.map} +1 -1
  43. package/dist/chunk-5QCWH6QA.cjs +4 -0
  44. package/dist/chunk-5QCWH6QA.cjs.map +1 -0
  45. package/dist/chunk-6O46EMQS.cjs +2 -0
  46. package/dist/chunk-6O46EMQS.cjs.map +1 -0
  47. package/dist/chunk-7IJUJUXE.cjs +2 -0
  48. package/dist/chunk-7IJUJUXE.cjs.map +1 -0
  49. package/dist/chunk-7UX5CSGZ.cjs +2 -0
  50. package/dist/chunk-7UX5CSGZ.cjs.map +1 -0
  51. package/dist/chunk-7VBH4F3P.js +2 -0
  52. package/dist/chunk-7VBH4F3P.js.map +1 -0
  53. package/dist/chunk-7ZPSYZHD.cjs +2 -0
  54. package/dist/chunk-7ZPSYZHD.cjs.map +1 -0
  55. package/dist/chunk-AOFLE33X.js +5 -0
  56. package/dist/chunk-AOFLE33X.js.map +1 -0
  57. package/dist/chunk-AQQQVDBQ.cjs +2 -0
  58. package/dist/chunk-AQQQVDBQ.cjs.map +1 -0
  59. package/dist/chunk-AXB5GHGO.js +2 -0
  60. package/dist/chunk-AXB5GHGO.js.map +1 -0
  61. package/dist/chunk-AZCELE44.cjs +2 -0
  62. package/dist/chunk-AZCELE44.cjs.map +1 -0
  63. package/dist/chunk-BB7P6HTR.js +2 -0
  64. package/dist/chunk-BB7P6HTR.js.map +1 -0
  65. package/dist/chunk-BGSF77LF.js +2 -0
  66. package/dist/chunk-BGSF77LF.js.map +1 -0
  67. package/dist/chunk-BHP3UTTQ.cjs +3 -0
  68. package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
  69. package/dist/chunk-CP6SK2B4.js +2 -0
  70. package/dist/chunk-CP6SK2B4.js.map +1 -0
  71. package/dist/chunk-DFYXFKCH.cjs +2 -0
  72. package/dist/chunk-DFYXFKCH.cjs.map +1 -0
  73. package/dist/chunk-DHFVVFZF.cjs +2 -0
  74. package/dist/chunk-DHFVVFZF.cjs.map +1 -0
  75. package/dist/chunk-DP7G45QM.cjs +13 -0
  76. package/dist/chunk-DP7G45QM.cjs.map +1 -0
  77. package/dist/chunk-E6RB7PRO.js +2 -0
  78. package/dist/chunk-E6RB7PRO.js.map +1 -0
  79. package/dist/chunk-F4FXIPR3.js +2 -0
  80. package/dist/chunk-F4FXIPR3.js.map +1 -0
  81. package/dist/chunk-F6VSSM2P.js +2 -0
  82. package/dist/chunk-F6VSSM2P.js.map +1 -0
  83. package/dist/chunk-FUVSCPU4.cjs +2 -0
  84. package/dist/chunk-FUVSCPU4.cjs.map +1 -0
  85. package/dist/chunk-FVF3T4JJ.js +2 -0
  86. package/dist/chunk-FVF3T4JJ.js.map +1 -0
  87. package/dist/chunk-FVWHMFX6.cjs +5 -0
  88. package/dist/chunk-FVWHMFX6.cjs.map +1 -0
  89. package/dist/chunk-IHEW6F2H.js +2 -0
  90. package/dist/chunk-IHEW6F2H.js.map +1 -0
  91. package/dist/chunk-IJS2EMSE.js +2 -0
  92. package/dist/chunk-IJS2EMSE.js.map +1 -0
  93. package/dist/chunk-IKVHLORY.cjs +11 -0
  94. package/dist/chunk-IKVHLORY.cjs.map +1 -0
  95. package/dist/chunk-IQGSDFBI.cjs +2 -0
  96. package/dist/chunk-IQGSDFBI.cjs.map +1 -0
  97. package/dist/chunk-J6KDUWX6.cjs +2 -0
  98. package/dist/chunk-J6KDUWX6.cjs.map +1 -0
  99. package/dist/chunk-JD3LDHUI.cjs +2 -0
  100. package/dist/chunk-JD3LDHUI.cjs.map +1 -0
  101. package/dist/chunk-JEYTB4AG.js +2 -0
  102. package/dist/chunk-JEYTB4AG.js.map +1 -0
  103. package/dist/chunk-JFLZJPVN.js +2 -0
  104. package/dist/chunk-JFLZJPVN.js.map +1 -0
  105. package/dist/chunk-JLPJ22CE.js +2 -0
  106. package/dist/chunk-JLPJ22CE.js.map +1 -0
  107. package/dist/chunk-JQCN42XX.js +2 -0
  108. package/dist/chunk-JQCN42XX.js.map +1 -0
  109. package/dist/chunk-K2HB5VFA.cjs +2 -0
  110. package/dist/chunk-K2HB5VFA.cjs.map +1 -0
  111. package/dist/chunk-K7TMUF3F.cjs +2 -0
  112. package/dist/chunk-K7TMUF3F.cjs.map +1 -0
  113. package/dist/chunk-KE7BJTCD.js +2 -0
  114. package/dist/chunk-KE7BJTCD.js.map +1 -0
  115. package/dist/chunk-KMEGUPH2.js +3 -0
  116. package/dist/chunk-KMEGUPH2.js.map +1 -0
  117. package/dist/chunk-KUPL3ZVD.js +2 -0
  118. package/dist/chunk-KUPL3ZVD.js.map +1 -0
  119. package/dist/chunk-L3ZZX36S.js +2 -0
  120. package/dist/chunk-L3ZZX36S.js.map +1 -0
  121. package/dist/chunk-LD4C62JY.cjs +2 -0
  122. package/dist/chunk-LD4C62JY.cjs.map +1 -0
  123. package/dist/chunk-LWQPLKL6.cjs +20 -0
  124. package/dist/chunk-LWQPLKL6.cjs.map +1 -0
  125. package/dist/chunk-M5IACTFC.cjs +17 -0
  126. package/dist/chunk-M5IACTFC.cjs.map +1 -0
  127. package/dist/chunk-MADMPRT2.js +20 -0
  128. package/dist/chunk-MADMPRT2.js.map +1 -0
  129. package/dist/chunk-MDHWM3C2.js +2 -0
  130. package/dist/chunk-MDHWM3C2.js.map +1 -0
  131. package/dist/chunk-N3ITIHHM.js +5 -0
  132. package/dist/chunk-N3ITIHHM.js.map +1 -0
  133. package/dist/chunk-N5APNCPB.js +2 -0
  134. package/dist/chunk-N5APNCPB.js.map +1 -0
  135. package/dist/chunk-NBYFHJWB.js +36 -0
  136. package/dist/chunk-NBYFHJWB.js.map +1 -0
  137. package/dist/chunk-NCXMNJUN.js +2 -0
  138. package/dist/chunk-NCXMNJUN.js.map +1 -0
  139. package/dist/chunk-NEQ5TENE.cjs +2 -0
  140. package/dist/chunk-NEQ5TENE.cjs.map +1 -0
  141. package/dist/chunk-NGU2W4PD.cjs +2 -0
  142. package/dist/chunk-NGU2W4PD.cjs.map +1 -0
  143. package/dist/chunk-NHDYQTC5.cjs +36 -0
  144. package/dist/chunk-NHDYQTC5.cjs.map +1 -0
  145. package/dist/chunk-NJXXC5JB.js +2 -0
  146. package/dist/chunk-NJXXC5JB.js.map +1 -0
  147. package/dist/chunk-NQEY7DR5.cjs +2 -0
  148. package/dist/chunk-NQEY7DR5.cjs.map +1 -0
  149. package/dist/chunk-OQV3NYDH.js +3 -0
  150. package/dist/chunk-OQV3NYDH.js.map +1 -0
  151. package/dist/chunk-OZ4GNBKA.js +2 -0
  152. package/dist/chunk-OZ4GNBKA.js.map +1 -0
  153. package/dist/chunk-PPNEAFKE.cjs +5 -0
  154. package/dist/chunk-PPNEAFKE.cjs.map +1 -0
  155. package/dist/chunk-PYASLKWF.js +2 -0
  156. package/dist/chunk-PYASLKWF.js.map +1 -0
  157. package/dist/chunk-Q6S7SUOM.js +2 -0
  158. package/dist/chunk-Q6S7SUOM.js.map +1 -0
  159. package/dist/chunk-QE2TJ6P5.cjs +2 -0
  160. package/dist/chunk-QE2TJ6P5.cjs.map +1 -0
  161. package/dist/chunk-QNVMBXVH.js +2 -0
  162. package/dist/chunk-QNVMBXVH.js.map +1 -0
  163. package/dist/chunk-QQ725EZL.js +2 -0
  164. package/dist/chunk-QQ725EZL.js.map +1 -0
  165. package/dist/chunk-QQTZQ6UX.cjs +2 -0
  166. package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
  167. package/dist/chunk-QSPRVXFV.cjs +2 -0
  168. package/dist/chunk-QSPRVXFV.cjs.map +1 -0
  169. package/dist/chunk-QTQ6RUX4.cjs +5 -0
  170. package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
  171. package/dist/chunk-R65RPMQX.cjs +2 -0
  172. package/dist/chunk-R65RPMQX.cjs.map +1 -0
  173. package/dist/chunk-R7NUVVHP.js +2 -0
  174. package/dist/{chunk-Z5LQV5ND.js.map → chunk-R7NUVVHP.js.map} +1 -1
  175. package/dist/chunk-SXYPAP4B.js +2 -0
  176. package/dist/chunk-SXYPAP4B.js.map +1 -0
  177. package/dist/chunk-T2RVAQEU.js +2 -0
  178. package/dist/chunk-T2RVAQEU.js.map +1 -0
  179. package/dist/chunk-T7A5YOEG.cjs +2 -0
  180. package/dist/chunk-T7A5YOEG.cjs.map +1 -0
  181. package/dist/chunk-TDKDZ3QJ.cjs +2 -0
  182. package/dist/chunk-TDKDZ3QJ.cjs.map +1 -0
  183. package/dist/chunk-TFEHO7SF.cjs +2 -0
  184. package/dist/chunk-TFEHO7SF.cjs.map +1 -0
  185. package/dist/chunk-TSFY5HKB.js +17 -0
  186. package/dist/chunk-TSFY5HKB.js.map +1 -0
  187. package/dist/chunk-TYTEJYUQ.cjs +2 -0
  188. package/dist/chunk-TYTEJYUQ.cjs.map +1 -0
  189. package/dist/chunk-TZHEZW6R.js +11 -0
  190. package/dist/chunk-TZHEZW6R.js.map +1 -0
  191. package/dist/chunk-U65WRXZC.js +13 -0
  192. package/dist/chunk-U65WRXZC.js.map +1 -0
  193. package/dist/chunk-UT4MWGJ3.js +2 -0
  194. package/dist/chunk-UT4MWGJ3.js.map +1 -0
  195. package/dist/chunk-V2JDKH3W.cjs +2 -0
  196. package/dist/chunk-V2JDKH3W.cjs.map +1 -0
  197. package/dist/chunk-VNDSKBXQ.cjs +2 -0
  198. package/dist/chunk-VNDSKBXQ.cjs.map +1 -0
  199. package/dist/chunk-VO4FCKHM.js +2 -0
  200. package/dist/chunk-VO4FCKHM.js.map +1 -0
  201. package/dist/chunk-VUMMC2P5.js +2 -0
  202. package/dist/chunk-VUMMC2P5.js.map +1 -0
  203. package/dist/chunk-VUSNUBNI.js +2 -0
  204. package/dist/chunk-VUSNUBNI.js.map +1 -0
  205. package/dist/chunk-VWTULWXF.js +2 -0
  206. package/dist/chunk-VWTULWXF.js.map +1 -0
  207. package/dist/chunk-VX7PSSOU.js +5 -0
  208. package/dist/chunk-VX7PSSOU.js.map +1 -0
  209. package/dist/chunk-WLSXJU2N.js +13 -0
  210. package/dist/chunk-WLSXJU2N.js.map +1 -0
  211. package/dist/chunk-WOZWFMOK.cjs +2 -0
  212. package/dist/chunk-WOZWFMOK.cjs.map +1 -0
  213. package/dist/chunk-WTDTVWCQ.cjs +2 -0
  214. package/dist/chunk-WTDTVWCQ.cjs.map +1 -0
  215. package/dist/chunk-WZ5ULION.js +2 -0
  216. package/dist/chunk-WZ5ULION.js.map +1 -0
  217. package/dist/chunk-XPLIEN2G.cjs +13 -0
  218. package/dist/chunk-XPLIEN2G.cjs.map +1 -0
  219. package/dist/chunk-XWVNLE2W.cjs +2 -0
  220. package/dist/chunk-XWVNLE2W.cjs.map +1 -0
  221. package/dist/chunk-XZR3J626.cjs +2 -0
  222. package/dist/chunk-XZR3J626.cjs.map +1 -0
  223. package/dist/chunk-YDO5KARN.js +2 -0
  224. package/dist/chunk-YDO5KARN.js.map +1 -0
  225. package/dist/chunk-YURIYBTN.cjs +2 -0
  226. package/dist/chunk-YURIYBTN.cjs.map +1 -0
  227. package/dist/chunk-YXKQTEPR.js +2 -0
  228. package/dist/chunk-YXKQTEPR.js.map +1 -0
  229. package/dist/chunk-Z6K4FYG6.js +2 -0
  230. package/dist/chunk-Z6K4FYG6.js.map +1 -0
  231. package/dist/chunk-ZJULEDLY.js +2 -0
  232. package/dist/chunk-ZJULEDLY.js.map +1 -0
  233. package/dist/{component-C1WnFcRp.d.ts → component-CPVtkASo.d.ts} +2 -3
  234. package/dist/{component-C1WnFcRp.d.cts → component-CxlupKuc.d.cts} +2 -3
  235. package/dist/composables.cjs +2 -0
  236. package/dist/composables.cjs.map +1 -0
  237. package/dist/composables.d.cts +103 -0
  238. package/dist/composables.d.ts +103 -0
  239. package/dist/composables.js +2 -0
  240. package/dist/composables.js.map +1 -0
  241. package/dist/{context-2uQ6fuxu.d.ts → context-Cwt7QCpk.d.cts} +1 -9
  242. package/dist/{context-2uQ6fuxu.d.cts → context-Cwt7QCpk.d.ts} +1 -9
  243. package/dist/core.cjs +1 -1
  244. package/dist/core.d.cts +5 -4
  245. package/dist/core.d.ts +5 -4
  246. package/dist/core.js +1 -1
  247. package/dist/css.cjs +2 -0
  248. package/dist/css.cjs.map +1 -0
  249. package/dist/css.d.cts +42 -0
  250. package/dist/css.d.ts +42 -0
  251. package/dist/css.js +2 -0
  252. package/dist/css.js.map +1 -0
  253. package/dist/data-table.cjs +2 -0
  254. package/dist/data-table.cjs.map +1 -0
  255. package/dist/data-table.d.cts +97 -0
  256. package/dist/data-table.d.ts +97 -0
  257. package/dist/data-table.js +2 -0
  258. package/dist/data-table.js.map +1 -0
  259. package/dist/deep-signal.cjs +2 -0
  260. package/dist/deep-signal.cjs.map +1 -0
  261. package/dist/deep-signal.d.cts +48 -0
  262. package/dist/deep-signal.d.ts +48 -0
  263. package/dist/deep-signal.js +2 -0
  264. package/dist/deep-signal.js.map +1 -0
  265. package/dist/defer.cjs +2 -0
  266. package/dist/defer.cjs.map +1 -0
  267. package/dist/defer.d.cts +55 -0
  268. package/dist/defer.d.ts +55 -0
  269. package/dist/defer.js +2 -0
  270. package/dist/defer.js.map +1 -0
  271. package/dist/deprecation.cjs +2 -0
  272. package/dist/deprecation.cjs.map +1 -0
  273. package/dist/deprecation.d.cts +119 -0
  274. package/dist/deprecation.d.ts +119 -0
  275. package/dist/deprecation.js +2 -0
  276. package/dist/deprecation.js.map +1 -0
  277. package/dist/devtools-overlay-3WRM6GKM.js +57 -0
  278. package/dist/devtools-overlay-3WRM6GKM.js.map +1 -0
  279. package/dist/devtools-overlay-WJGSIB4N.cjs +57 -0
  280. package/dist/devtools-overlay-WJGSIB4N.cjs.map +1 -0
  281. package/dist/devtools.cjs +2 -0
  282. package/dist/devtools.cjs.map +1 -0
  283. package/dist/devtools.d.cts +78 -0
  284. package/dist/devtools.d.ts +78 -0
  285. package/dist/devtools.js +2 -0
  286. package/dist/devtools.js.map +1 -0
  287. package/dist/di.cjs +2 -0
  288. package/dist/di.cjs.map +1 -0
  289. package/dist/di.d.cts +93 -0
  290. package/dist/di.d.ts +93 -0
  291. package/dist/di.js +2 -0
  292. package/dist/di.js.map +1 -0
  293. package/dist/directive.cjs +2 -0
  294. package/dist/directive.cjs.map +1 -0
  295. package/dist/directive.d.cts +102 -0
  296. package/dist/directive.d.ts +102 -0
  297. package/dist/directive.js +2 -0
  298. package/dist/directive.js.map +1 -0
  299. package/dist/error-boundary.cjs +2 -0
  300. package/dist/error-boundary.cjs.map +1 -0
  301. package/dist/error-boundary.d.cts +17 -0
  302. package/dist/error-boundary.d.ts +17 -0
  303. package/dist/error-boundary.js +2 -0
  304. package/dist/error-boundary.js.map +1 -0
  305. package/dist/error-hints.cjs +2 -0
  306. package/dist/error-hints.cjs.map +1 -0
  307. package/dist/error-hints.d.cts +17 -0
  308. package/dist/error-hints.d.ts +17 -0
  309. package/dist/error-hints.js +2 -0
  310. package/dist/error-hints.js.map +1 -0
  311. package/dist/errors.cjs +2 -0
  312. package/dist/errors.cjs.map +1 -0
  313. package/dist/errors.d.cts +35 -0
  314. package/dist/errors.d.ts +35 -0
  315. package/dist/errors.js +2 -0
  316. package/dist/errors.js.map +1 -0
  317. package/dist/event-bus.cjs +2 -0
  318. package/dist/event-bus.cjs.map +1 -0
  319. package/dist/event-bus.d.cts +68 -0
  320. package/dist/event-bus.d.ts +68 -0
  321. package/dist/event-bus.js +2 -0
  322. package/dist/event-bus.js.map +1 -0
  323. package/dist/event-modifiers.cjs +2 -0
  324. package/dist/event-modifiers.cjs.map +1 -0
  325. package/dist/event-modifiers.d.cts +130 -0
  326. package/dist/event-modifiers.d.ts +130 -0
  327. package/dist/event-modifiers.js +2 -0
  328. package/dist/event-modifiers.js.map +1 -0
  329. package/dist/flip.cjs +2 -0
  330. package/dist/flip.cjs.map +1 -0
  331. package/dist/flip.d.cts +66 -0
  332. package/dist/flip.d.ts +66 -0
  333. package/dist/flip.js +2 -0
  334. package/dist/flip.js.map +1 -0
  335. package/dist/head.cjs +2 -0
  336. package/dist/head.cjs.map +1 -0
  337. package/dist/head.d.cts +70 -0
  338. package/dist/head.d.ts +70 -0
  339. package/dist/head.js +2 -0
  340. package/dist/head.js.map +1 -0
  341. package/dist/hydration.cjs +2 -0
  342. package/dist/hydration.cjs.map +1 -0
  343. package/dist/hydration.d.cts +84 -0
  344. package/dist/hydration.d.ts +84 -0
  345. package/dist/hydration.js +2 -0
  346. package/dist/hydration.js.map +1 -0
  347. package/dist/image.cjs +2 -0
  348. package/dist/image.cjs.map +1 -0
  349. package/dist/image.d.cts +54 -0
  350. package/dist/image.d.ts +54 -0
  351. package/dist/image.js +2 -0
  352. package/dist/image.js.map +1 -0
  353. package/dist/index.cjs +1 -63
  354. package/dist/index.cjs.map +1 -1
  355. package/dist/index.d.cts +51 -3152
  356. package/dist/index.d.ts +51 -3152
  357. package/dist/index.js +1 -63
  358. package/dist/index.js.map +1 -1
  359. package/dist/infinite-scroll.cjs +2 -0
  360. package/dist/infinite-scroll.cjs.map +1 -0
  361. package/dist/infinite-scroll.d.cts +49 -0
  362. package/dist/infinite-scroll.d.ts +49 -0
  363. package/dist/infinite-scroll.js +2 -0
  364. package/dist/infinite-scroll.js.map +1 -0
  365. package/dist/leak-detector.cjs +2 -0
  366. package/dist/leak-detector.cjs.map +1 -0
  367. package/dist/leak-detector.d.cts +71 -0
  368. package/dist/leak-detector.d.ts +71 -0
  369. package/dist/leak-detector.js +2 -0
  370. package/dist/leak-detector.js.map +1 -0
  371. package/dist/machine.cjs +1 -1
  372. package/dist/machine.d.cts +1 -1
  373. package/dist/machine.d.ts +1 -1
  374. package/dist/machine.js +1 -1
  375. package/dist/offline.cjs +1 -1
  376. package/dist/offline.d.cts +3 -1
  377. package/dist/offline.d.ts +3 -1
  378. package/dist/offline.js +1 -1
  379. package/dist/perf.cjs +2 -0
  380. package/dist/perf.cjs.map +1 -0
  381. package/dist/perf.d.cts +97 -0
  382. package/dist/perf.d.ts +97 -0
  383. package/dist/perf.js +2 -0
  384. package/dist/perf.js.map +1 -0
  385. package/dist/pipes.cjs +2 -0
  386. package/dist/pipes.cjs.map +1 -0
  387. package/dist/pipes.d.cts +130 -0
  388. package/dist/pipes.d.ts +130 -0
  389. package/dist/pipes.js +2 -0
  390. package/dist/pipes.js.map +1 -0
  391. package/dist/plugin.cjs +2 -0
  392. package/dist/plugin.cjs.map +1 -0
  393. package/dist/plugin.d.cts +70 -0
  394. package/dist/plugin.d.ts +70 -0
  395. package/dist/plugin.js +2 -0
  396. package/dist/plugin.js.map +1 -0
  397. package/dist/portal.cjs +2 -0
  398. package/dist/portal.cjs.map +1 -0
  399. package/dist/portal.d.cts +30 -0
  400. package/dist/portal.d.ts +30 -0
  401. package/dist/portal.js +2 -0
  402. package/dist/portal.js.map +1 -0
  403. package/dist/pwa.cjs +1 -1
  404. package/dist/pwa.d.cts +6 -2
  405. package/dist/pwa.d.ts +6 -2
  406. package/dist/pwa.js +1 -1
  407. package/dist/query-state.cjs +2 -0
  408. package/dist/query-state.cjs.map +1 -0
  409. package/dist/query-state.d.cts +82 -0
  410. package/dist/query-state.d.ts +82 -0
  411. package/dist/query-state.js +2 -0
  412. package/dist/query-state.js.map +1 -0
  413. package/dist/reconcile.cjs +2 -0
  414. package/dist/reconcile.cjs.map +1 -0
  415. package/dist/reconcile.d.cts +42 -0
  416. package/dist/reconcile.d.ts +42 -0
  417. package/dist/reconcile.js +2 -0
  418. package/dist/reconcile.js.map +1 -0
  419. package/dist/scheduler-CKi1esN-.d.cts +9 -0
  420. package/dist/scheduler-CKi1esN-.d.ts +9 -0
  421. package/dist/security.cjs +2 -0
  422. package/dist/security.cjs.map +1 -0
  423. package/dist/security.d.cts +193 -0
  424. package/dist/security.d.ts +193 -0
  425. package/dist/security.js +2 -0
  426. package/dist/security.js.map +1 -0
  427. package/dist/seo.cjs +2 -0
  428. package/dist/seo.cjs.map +1 -0
  429. package/dist/seo.d.cts +118 -0
  430. package/dist/seo.d.ts +118 -0
  431. package/dist/seo.js +2 -0
  432. package/dist/seo.js.map +1 -0
  433. package/dist/{signals-C7XfOHHR.d.cts → signals-DionyGGY.d.cts} +7 -0
  434. package/dist/{signals-C7XfOHHR.d.ts → signals-DionyGGY.d.ts} +7 -0
  435. package/dist/snippets.cjs +2 -0
  436. package/dist/snippets.cjs.map +1 -0
  437. package/dist/snippets.d.cts +109 -0
  438. package/dist/snippets.d.ts +109 -0
  439. package/dist/snippets.js +2 -0
  440. package/dist/snippets.js.map +1 -0
  441. package/dist/ssg.cjs +2 -0
  442. package/dist/ssg.cjs.map +1 -0
  443. package/dist/ssg.d.cts +82 -0
  444. package/dist/ssg.d.ts +82 -0
  445. package/dist/ssg.js +2 -0
  446. package/dist/ssg.js.map +1 -0
  447. package/dist/ssr.cjs +1 -1
  448. package/dist/ssr.d.cts +2 -1
  449. package/dist/ssr.d.ts +2 -1
  450. package/dist/ssr.js +1 -1
  451. package/dist/store.cjs +1 -1
  452. package/dist/store.d.cts +33 -30
  453. package/dist/store.d.ts +33 -30
  454. package/dist/store.js +1 -1
  455. package/dist/suspense.cjs +2 -0
  456. package/dist/suspense.cjs.map +1 -0
  457. package/dist/suspense.d.cts +36 -0
  458. package/dist/suspense.d.ts +36 -0
  459. package/dist/suspense.js +2 -0
  460. package/dist/suspense.js.map +1 -0
  461. package/dist/switch.cjs +2 -0
  462. package/dist/switch.cjs.map +1 -0
  463. package/dist/switch.d.cts +48 -0
  464. package/dist/switch.d.ts +48 -0
  465. package/dist/switch.js +2 -0
  466. package/dist/switch.js.map +1 -0
  467. package/dist/sync.cjs +1 -1
  468. package/dist/sync.d.cts +60 -5
  469. package/dist/sync.d.ts +60 -5
  470. package/dist/sync.js +1 -1
  471. package/dist/test.cjs +4 -4
  472. package/dist/test.cjs.map +1 -1
  473. package/dist/test.d.cts +74 -5
  474. package/dist/test.d.ts +74 -5
  475. package/dist/test.js +4 -4
  476. package/dist/test.js.map +1 -1
  477. package/dist/theme.cjs +2 -0
  478. package/dist/theme.cjs.map +1 -0
  479. package/dist/theme.d.cts +56 -0
  480. package/dist/theme.d.ts +56 -0
  481. package/dist/theme.js +2 -0
  482. package/dist/theme.js.map +1 -0
  483. package/dist/toast.cjs +2 -0
  484. package/dist/toast.cjs.map +1 -0
  485. package/dist/toast.d.cts +66 -0
  486. package/dist/toast.d.ts +66 -0
  487. package/dist/toast.js +2 -0
  488. package/dist/toast.js.map +1 -0
  489. package/dist/transition.cjs +2 -0
  490. package/dist/transition.cjs.map +1 -0
  491. package/dist/transition.d.cts +90 -0
  492. package/dist/transition.d.ts +90 -0
  493. package/dist/transition.js +2 -0
  494. package/dist/transition.js.map +1 -0
  495. package/dist/tweened.cjs +2 -0
  496. package/dist/tweened.cjs.map +1 -0
  497. package/dist/tweened.d.cts +59 -0
  498. package/dist/tweened.d.ts +59 -0
  499. package/dist/tweened.js +2 -0
  500. package/dist/tweened.js.map +1 -0
  501. package/dist/types-DjZCk1xT.d.cts +4 -0
  502. package/dist/types-DjZCk1xT.d.ts +4 -0
  503. package/dist/view-transition.cjs +2 -0
  504. package/dist/view-transition.cjs.map +1 -0
  505. package/dist/view-transition.d.cts +80 -0
  506. package/dist/view-transition.d.ts +80 -0
  507. package/dist/view-transition.js +2 -0
  508. package/dist/view-transition.js.map +1 -0
  509. package/dist/virtual-list.cjs +2 -0
  510. package/dist/virtual-list.cjs.map +1 -0
  511. package/dist/virtual-list.d.cts +67 -0
  512. package/dist/virtual-list.d.ts +67 -0
  513. package/dist/virtual-list.js +2 -0
  514. package/dist/virtual-list.js.map +1 -0
  515. package/dist/watch.cjs +2 -0
  516. package/dist/watch.cjs.map +1 -0
  517. package/dist/watch.d.cts +70 -0
  518. package/dist/watch.d.ts +70 -0
  519. package/dist/watch.js +2 -0
  520. package/dist/watch.js.map +1 -0
  521. package/dist/web-component.cjs +2 -0
  522. package/dist/web-component.cjs.map +1 -0
  523. package/dist/web-component.d.cts +51 -0
  524. package/dist/web-component.d.ts +51 -0
  525. package/dist/web-component.js +2 -0
  526. package/dist/web-component.js.map +1 -0
  527. package/package.json +249 -11
  528. package/dist/chunk-3AL2DVPZ.cjs +0 -13
  529. package/dist/chunk-3AL2DVPZ.cjs.map +0 -1
  530. package/dist/chunk-6NX6JRSV.cjs +0 -32
  531. package/dist/chunk-6NX6JRSV.cjs.map +0 -1
  532. package/dist/chunk-BT6HNBE7.js +0 -5
  533. package/dist/chunk-BT6HNBE7.js.map +0 -1
  534. package/dist/chunk-D6QQYZIC.js +0 -2
  535. package/dist/chunk-D6QQYZIC.js.map +0 -1
  536. package/dist/chunk-H4SAK7A5.cjs +0 -2
  537. package/dist/chunk-H4SAK7A5.cjs.map +0 -1
  538. package/dist/chunk-IKZMC3T6.js +0 -2
  539. package/dist/chunk-IKZMC3T6.js.map +0 -1
  540. package/dist/chunk-IM2VW4TK.js +0 -32
  541. package/dist/chunk-IM2VW4TK.js.map +0 -1
  542. package/dist/chunk-NQVWTQ2I.cjs +0 -5
  543. package/dist/chunk-NQVWTQ2I.cjs.map +0 -1
  544. package/dist/chunk-ODDXU5DO.js +0 -2
  545. package/dist/chunk-ODDXU5DO.js.map +0 -1
  546. package/dist/chunk-POLTPHUA.js +0 -13
  547. package/dist/chunk-POLTPHUA.js.map +0 -1
  548. package/dist/chunk-YIB4EKVI.cjs +0 -2
  549. package/dist/chunk-YIB4EKVI.cjs.map +0 -1
  550. package/dist/chunk-YJQLXUTN.cjs +0 -2
  551. package/dist/chunk-YJQLXUTN.cjs.map +0 -1
  552. package/dist/chunk-Z5LQV5ND.js +0 -2
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function b(l){let{onLoadMore:a,hasMore:s,rootMargin:d="200px",threshold:f=0}=l,n=chunkWOZWFMOK_cjs.c(false),t=chunkWOZWFMOK_cjs.c(false),r=null,e=null,i=false;async function u(){if(!(n()||t()||i)){if(!s()){t.set(true);return}n.set(true);try{await a(),s()||t.set(!0);}finally{n.set(false);}}}function c(p){typeof IntersectionObserver>"u"||(r=new IntersectionObserver(g=>{g[0]?.isIntersecting&&u();},{rootMargin:d,threshold:f}),r.observe(p));}function m(){return e||(e=document.createElement("div"),e.setAttribute("data-akash-sentinel",""),e.style.height="1px",e.setAttribute("aria-hidden","true"),requestAnimationFrame(()=>{e&&!i&&c(e);}),e)}return {sentinel:m,loading:()=>n(),done:()=>t(),reset(){t.set(false),n.set(false);},dispose(){i=true,r?.disconnect(),r=null;}}}exports.a=b;//# sourceMappingURL=chunk-2HLDEWRT.cjs.map
2
+ //# sourceMappingURL=chunk-2HLDEWRT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/infinite-scroll.ts"],"names":["useInfiniteScroll","options","onLoadMore","hasMore","rootMargin","threshold","loading","signal","done","observer","sentinelEl","disposed","handleIntersect","createObserver","el","entries","sentinel"],"mappings":"mEAqDO,SAASA,EAAkBC,CAAAA,CAAgD,CAChF,GAAM,CAAE,UAAA,CAAAC,EAAY,OAAA,CAAAC,CAAAA,CAAS,UAAA,CAAAC,CAAAA,CAAa,QAAS,SAAA,CAAAC,CAAAA,CAAY,CAAE,CAAA,CAAIJ,CAAAA,CAE/DK,EAAUC,mBAAAA,CAAO,KAAK,CAAA,CACtBC,CAAAA,CAAOD,oBAAO,KAAK,CAAA,CACrBE,EAAwC,IAAA,CACxCC,CAAAA,CAAiC,KACjCC,CAAAA,CAAW,KAAA,CAEf,eAAeC,CAAAA,EAAiC,CAC9C,GAAI,EAAAN,CAAAA,IAAaE,CAAAA,EAAK,EAAKG,GAC3B,CAAA,GAAI,CAACR,CAAAA,EAAQ,CAAG,CACdK,CAAAA,CAAK,GAAA,CAAI,IAAI,CAAA,CACb,MACF,CAEAF,CAAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAChB,GAAI,CACF,MAAMJ,GAAW,CACZC,CAAAA,IACHK,CAAAA,CAAK,GAAA,CAAI,CAAA,CAAI,EAEjB,QAAE,CACAF,CAAAA,CAAQ,IAAI,KAAK,EACnB,EACF,CAEA,SAASO,EAAeC,CAAAA,CAAuB,CACzC,OAAO,oBAAA,CAAyB,GAAA,GAEpCL,EAAW,IAAI,oBAAA,CACZM,GAAY,CACPA,CAAAA,CAAQ,CAAC,CAAA,EAAG,gBACdH,CAAAA,GAEJ,EACA,CAAE,UAAA,CAAAR,EAAY,SAAA,CAAAC,CAAU,CAC1B,CAAA,CAEAI,EAAS,OAAA,CAAQK,CAAE,GACrB,CAEA,SAASE,GAAwB,CAC/B,OAAIN,CAAAA,GAEJA,CAAAA,CAAa,SAAS,aAAA,CAAc,KAAK,EACzCA,CAAAA,CAAW,YAAA,CAAa,sBAAuB,EAAE,CAAA,CACjDA,EAAW,KAAA,CAAM,MAAA,CAAS,MAC1BA,CAAAA,CAAW,YAAA,CAAa,cAAe,MAAM,CAAA,CAG7C,sBAAsB,IAAM,CACtBA,CAAAA,EAAc,CAACC,GACjBE,CAAAA,CAAeH,CAAU,EAE7B,CAAC,CAAA,CAEMA,EACT,CAEA,OAAO,CACL,QAAA,CAAAM,EACA,OAAA,CAAS,IAAMV,GAAQ,CACvB,IAAA,CAAM,IAAME,CAAAA,EAAK,CACjB,KAAA,EAAQ,CACNA,EAAK,GAAA,CAAI,KAAK,EACdF,CAAAA,CAAQ,GAAA,CAAI,KAAK,EACnB,CAAA,CACA,SAAU,CACRK,CAAAA,CAAW,KACXF,CAAAA,EAAU,UAAA,GACVA,CAAAA,CAAW,KACb,CACF,CACF","file":"chunk-2HLDEWRT.cjs","sourcesContent":["/**\n * Infinite scroll composable.\n *\n * Uses IntersectionObserver to detect when a sentinel element\n * enters the viewport, then triggers loading more data.\n * Pairs with createCursorPagination() from @akashjs/http.\n *\n * ```ts\n * const { sentinel, loading, done } = useInfiniteScroll({\n * onLoadMore: async () => {\n * pager.loadMore();\n * await fetchNextPage();\n * },\n * hasMore: () => pager.hasMore(),\n * });\n * // Append sentinel() element at the end of your list\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface InfiniteScrollOptions {\n /** Callback to load more items */\n onLoadMore: () => Promise<void> | void;\n /** Whether there are more items to load */\n hasMore: () => boolean;\n /** Root margin for the observer (default: '200px') */\n rootMargin?: string;\n /** Threshold for the observer (default: 0) */\n threshold?: number;\n}\n\nexport interface InfiniteScroll {\n /** Sentinel element to place at the end of the list */\n sentinel: () => HTMLElement;\n /** Whether a load is in progress */\n loading: ReadonlySignal<boolean>;\n /** Whether all items have been loaded */\n done: ReadonlySignal<boolean>;\n /** Reset the scroll state */\n reset(): void;\n /** Dispose the observer */\n dispose(): void;\n}\n\n// --- Implementation ---\n\n/**\n * Create an infinite scroll controller.\n */\nexport function useInfiniteScroll(options: InfiniteScrollOptions): InfiniteScroll {\n const { onLoadMore, hasMore, rootMargin = '200px', threshold = 0 } = options;\n\n const loading = signal(false);\n const done = signal(false);\n let observer: IntersectionObserver | null = null;\n let sentinelEl: HTMLElement | null = null;\n let disposed = false;\n\n async function handleIntersect(): Promise<void> {\n if (loading() || done() || disposed) return;\n if (!hasMore()) {\n done.set(true);\n return;\n }\n\n loading.set(true);\n try {\n await onLoadMore();\n if (!hasMore()) {\n done.set(true);\n }\n } finally {\n loading.set(false);\n }\n }\n\n function createObserver(el: HTMLElement): void {\n if (typeof IntersectionObserver === 'undefined') return;\n\n observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n handleIntersect();\n }\n },\n { rootMargin, threshold },\n );\n\n observer.observe(el);\n }\n\n function sentinel(): HTMLElement {\n if (sentinelEl) return sentinelEl;\n\n sentinelEl = document.createElement('div');\n sentinelEl.setAttribute('data-akash-sentinel', '');\n sentinelEl.style.height = '1px';\n sentinelEl.setAttribute('aria-hidden', 'true');\n\n // Start observing\n requestAnimationFrame(() => {\n if (sentinelEl && !disposed) {\n createObserver(sentinelEl);\n }\n });\n\n return sentinelEl;\n }\n\n return {\n sentinel,\n loading: () => loading(),\n done: () => done(),\n reset() {\n done.set(false);\n loading.set(false);\n },\n dispose() {\n disposed = true;\n observer?.disconnect();\n observer = null;\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');async function j(a,t=1){return typeof indexedDB>"u"?Promise.reject(new Error("IndexedDB not available")):new Promise((d,r)=>{try{let n=indexedDB.open(a,t);n.onupgradeneeded=()=>{let i=n.result;i.objectStoreNames.contains("items")||i.createObjectStore("items"),i.objectStoreNames.contains("pending")||i.createObjectStore("pending",{autoIncrement:!0});},n.onsuccess=()=>d(n.result),n.onerror=()=>r(n.error??new Error("IndexedDB open failed"));}catch(n){r(n);}})}async function x(a,t){return new Promise((d,r)=>{let i=a.transaction(t,"readonly").objectStore(t).getAll();i.onsuccess=()=>d(i.result),i.onerror=()=>r(i.error);})}async function D(a,t,d,r){return new Promise((n,i)=>{let l=a.transaction(t,"readwrite");l.objectStore(t).put(r,d),l.oncomplete=()=>n(),l.onerror=()=>i(l.error);})}async function B(a,t,d){return new Promise((r,n)=>{let i=a.transaction(t,"readwrite");i.objectStore(t).delete(d),i.oncomplete=()=>r(),i.onerror=()=>n(i.error);})}async function p(a,t){return new Promise((d,r)=>{let n=a.transaction(t,"readwrite");n.objectStore(t).clear(),n.oncomplete=()=>d(),n.onerror=()=>r(n.error);})}function A(a,t={}){let d=t.keyField??"id",r=chunkWOZWFMOK_cjs.c([]),n=chunkWOZWFMOK_cjs.c([]),i=chunkWOZWFMOK_cjs.c(false),l=chunkWOZWFMOK_cjs.c(typeof navigator<"u"&&navigator.onLine!=null?!!navigator.onLine:true),b=chunkWOZWFMOK_cjs.d(()=>n().length),o=null,m=null,T=false;typeof window<"u"&&(window.addEventListener("online",()=>{l.set(true),v();}),window.addEventListener("offline",()=>l.set(false)));async function O(){if(!(typeof indexedDB>"u"))try{o=await j(`akash-offline-${a}`,t.version??1);let e=await x(o,"items");r.set(e);let s=await x(o,"pending");n.set(s);}catch(e){console.error("[AkashJS] Offline store init failed:",e);}}let k=O();if(t.sync){let e=t.sync.interval??3e4;m=setInterval(()=>{l()&&b()>0&&!i()&&v();},e);}function g(e){return String(e[d])}function w(e){let s=g(e);r.update(c=>{let f=c.findIndex(u=>g(u)===s);if(f!==-1){let u=[...c];return u[f]=e,u}return [...c,e]}),S({type:"put",key:s,value:e,timestamp:Date.now()}),o&&D(o,"items",s,e);}function I(e){r.update(s=>s.filter(c=>g(c)!==e)),S({type:"delete",key:e,timestamp:Date.now()}),o&&B(o,"items",e);}function S(e){n.update(s=>[...s,e]),o&&o.transaction("pending","readwrite").objectStore("pending").add(e);}async function v(){if(await k,!t.sync||i()||T)return;let e=n();if(e.length===0)return;i.set(true);let s=t.sync.fetch??globalThis.fetch.bind(globalThis);try{if((await s(t.sync.url,{method:"POST",headers:{"Content-Type":"application/json",...t.sync.headers},body:JSON.stringify({ops:e})})).ok){n.set([]),o&&await p(o,"pending");let f=await s(t.sync.url,{headers:t.sync.headers});if(f.ok){let u=await f.json();if(r.set(u),o){await p(o,"items");for(let P of u)await D(o,"items",g(P),P);}}}}catch(c){console.warn("[AkashJS] Offline sync failed:",c);}finally{i.set(false);}}return {items:()=>r(),data:()=>r(),get(e){return r().find(s=>g(s)===e)},put:w,add:w,update(e,s){let c=r().find(f=>g(f)===e);c&&w({...c,...s});},remove:I,clear(){r.set([]),n.set([]),o&&(p(o,"items"),p(o,"pending"));},pending:b,syncing:()=>i(),online:()=>l(),sync:v,dispose(){T=true,m&&clearInterval(m),o?.close();}}}exports.a=A;//# sourceMappingURL=chunk-2LKFIID7.cjs.map
2
+ //# sourceMappingURL=chunk-2LKFIID7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/offline.ts"],"names":["openDB","name","version","resolve","reject","request","db","err","idbGetAll","store","req","idbPut","key","value","tx","idbDelete","idbClear","createOfflineStore","options","keyField","items","signal","pendingOps","syncing","online","pending","computed","syncTimer","disposed","syncNow","init","stored","ops","initPromise","interval","getKey","item","put","list","idx","i","next","queueOp","remove","op","fetchFn","serverResponse","serverItems","partial","existing"],"mappings":"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","file":"chunk-2LKFIID7.cjs","sourcesContent":["/**\n * Offline-first store with IndexedDB persistence and background sync.\n *\n * Data persists across page reloads. Changes made offline queue up\n * and sync automatically when connection returns. Conflict resolution\n * via configurable strategies (last-write-wins, merge, custom).\n *\n * ```ts\n * const todos = createOfflineStore('todos', {\n * sync: { url: '/api/todos', strategy: 'last-write-wins' },\n * });\n *\n * todos.add({ id: '1', text: 'Buy milk', done: false });\n * todos.items(); // reactive list\n * todos.syncing(); // boolean\n * todos.pending(); // number of unsynced changes\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type ConflictStrategy = 'last-write-wins' | 'client-wins' | 'server-wins' | 'manual';\n\nexport interface OfflineStoreOptions<T> {\n /** Sync configuration */\n sync?: {\n /** Server URL for sync */\n url: string;\n /** Conflict resolution strategy (default: 'last-write-wins') */\n strategy?: ConflictStrategy;\n /** Sync interval in ms (default: 30000) */\n interval?: number;\n /** Custom fetch */\n fetch?: typeof globalThis.fetch;\n /** Auth headers */\n headers?: Record<string, string>;\n };\n /** Key field for items (default: 'id') */\n keyField?: string;\n /** Version for schema migrations */\n version?: number;\n}\n\nexport interface OfflineStore<T extends Record<string, unknown>> {\n /** All items (reactive) */\n items: ReadonlySignal<T[]>;\n /** Alias for items (reactive) */\n data: ReadonlySignal<T[]>;\n /** Get a single item by key */\n get(key: string): T | undefined;\n /** Add or update an item */\n put(item: T): void;\n /** Add a new item */\n add(item: T): void;\n /** Update an existing item */\n update(key: string, partial: Partial<T>): void;\n /** Remove an item by key */\n remove(key: string): void;\n /** Clear all items */\n clear(): void;\n /** Number of unsynced changes */\n pending: ReadonlySignal<number>;\n /** Whether sync is in progress */\n syncing: ReadonlySignal<boolean>;\n /** Whether online */\n online: ReadonlySignal<boolean>;\n /** Force a sync now */\n sync(): Promise<void>;\n /** Dispose the store (stop sync, close DB) */\n dispose(): void;\n}\n\n/** An operation in the change queue */\ninterface PendingOp<T> {\n type: 'put' | 'delete';\n key: string;\n value?: T;\n timestamp: number;\n}\n\n// =========================================================================\n// IndexedDB wrapper\n// =========================================================================\n\nasync function openDB(name: string, version = 1): Promise<IDBDatabase> {\n if (typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('IndexedDB not available'));\n }\n return new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(name, version);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains('items')) {\n db.createObjectStore('items');\n }\n if (!db.objectStoreNames.contains('pending')) {\n db.createObjectStore('pending', { autoIncrement: true });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB open failed'));\n } catch (err) {\n reject(err);\n }\n });\n}\n\nasync function idbGetAll<T>(db: IDBDatabase, store: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readonly');\n const req = tx.objectStore(store).getAll();\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(db: IDBDatabase, store: string, key: string, value: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).put(value, key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbDelete(db: IDBDatabase, store: string, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).delete(key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbClear(db: IDBDatabase, store: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n// =========================================================================\n// createOfflineStore\n// =========================================================================\n\n/**\n * Create an offline-first store backed by IndexedDB.\n */\nexport function createOfflineStore<T extends Record<string, unknown>>(\n name: string,\n options: OfflineStoreOptions<T> = {},\n): OfflineStore<T> {\n const keyField = options.keyField ?? 'id';\n const items = signal<T[]>([]);\n const pendingOps = signal<PendingOp<T>[]>([]);\n const syncing = signal(false);\n const online = signal(typeof navigator !== 'undefined' && navigator.onLine != null ? !!navigator.onLine : true);\n const pending = computed(() => pendingOps().length);\n\n let db: IDBDatabase | null = null;\n let syncTimer: ReturnType<typeof setInterval> | null = null;\n let disposed = false;\n\n // Online/offline tracking\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => {\n online.set(true);\n syncNow();\n });\n window.addEventListener('offline', () => online.set(false));\n }\n\n // Initialize — load from IndexedDB\n async function init(): Promise<void> {\n if (typeof indexedDB === 'undefined') return;\n try {\n db = await openDB(`akash-offline-${name}`, options.version ?? 1);\n const stored = await idbGetAll<T>(db, 'items');\n items.set(stored);\n const ops = await idbGetAll<PendingOp<T>>(db, 'pending');\n pendingOps.set(ops);\n } catch (err) { console.error('[AkashJS] Offline store init failed:', err); }\n }\n\n const initPromise = init();\n\n // Start periodic sync\n if (options.sync) {\n const interval = options.sync.interval ?? 30000;\n syncTimer = setInterval(() => {\n if (online() && pending() > 0 && !syncing()) {\n syncNow();\n }\n }, interval);\n }\n\n function getKey(item: T): string {\n return String((item as any)[keyField]);\n }\n\n function put(item: T): void {\n const key = getKey(item);\n items.update((list) => {\n const idx = list.findIndex((i) => getKey(i) === key);\n if (idx !== -1) {\n const next = [...list];\n next[idx] = item;\n return next;\n }\n return [...list, item];\n });\n\n queueOp({ type: 'put', key, value: item, timestamp: Date.now() });\n if (db) idbPut(db, 'items', key, item);\n }\n\n function remove(key: string): void {\n items.update((list) => list.filter((i) => getKey(i) !== key));\n queueOp({ type: 'delete', key, timestamp: Date.now() });\n if (db) idbDelete(db, 'items', key);\n }\n\n function queueOp(op: PendingOp<T>): void {\n pendingOps.update((ops) => [...ops, op]);\n if (db) {\n const tx = db.transaction('pending', 'readwrite');\n tx.objectStore('pending').add(op);\n }\n }\n\n async function syncNow(): Promise<void> {\n await initPromise;\n if (!options.sync || syncing() || disposed) return;\n const ops = pendingOps();\n if (ops.length === 0) return;\n\n syncing.set(true);\n const fetchFn = options.sync.fetch ?? globalThis.fetch.bind(globalThis);\n\n try {\n const response = await fetchFn(options.sync.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.sync.headers,\n },\n body: JSON.stringify({ ops }),\n });\n\n if (response.ok) {\n pendingOps.set([]);\n if (db) await idbClear(db, 'pending');\n\n // Fetch latest server state\n const serverResponse = await fetchFn(options.sync.url, {\n headers: options.sync.headers,\n });\n if (serverResponse.ok) {\n const serverItems = await serverResponse.json() as T[];\n items.set(serverItems);\n // Update IndexedDB\n if (db) {\n await idbClear(db, 'items');\n for (const item of serverItems) {\n await idbPut(db, 'items', getKey(item), item);\n }\n }\n }\n }\n } catch (err) { console.warn('[AkashJS] Offline sync failed:', err); }\n finally {\n syncing.set(false);\n }\n }\n\n return {\n items: () => items(),\n data: () => items(),\n get(key: string) { return items().find((i) => getKey(i) === key); },\n put,\n add: put,\n update(key: string, partial: Partial<T>) {\n const existing = items().find((i) => getKey(i) === key);\n if (existing) put({ ...existing, ...partial });\n },\n remove,\n clear() {\n items.set([]);\n pendingOps.set([]);\n if (db) {\n idbClear(db, 'items');\n idbClear(db, 'pending');\n }\n },\n pending,\n syncing: () => syncing(),\n online: () => online(),\n sync: syncNow,\n dispose() {\n disposed = true;\n if (syncTimer) clearInterval(syncTimer);\n db?.close();\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';function a(){let t=new Map;function r(e){let n=t.get(e);return n||(n=new Set,t.set(e,n)),n}return {on(e,n){return r(e).add(n),()=>r(e).delete(n)},once(e,n){let s=o=>{r(e).delete(s),n(o);};return r(e).add(s),()=>r(e).delete(s)},emit(e,n){let s=t.get(e);if(s)for(let o of Array.from(s))o(n);},off(e,n){r(e).delete(n);},clear(e){e?t.delete(e):t.clear();},listenerCount(e){return t.get(e)?.size??0},hasListeners(e){return (t.get(e)?.size??0)>0}}}var d=null;function i(){return d||(d=a()),d}exports.a=a;exports.b=i;//# sourceMappingURL=chunk-34PQECMN.cjs.map
2
+ //# sourceMappingURL=chunk-34PQECMN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event-bus.ts"],"names":["createEventBus","listeners","getSet","event","set","handler","wrapper","data","globalBus","globalEventBus"],"mappings":"aA8DO,SAASA,GAA4E,CAC1F,IAAMC,CAAAA,CAAY,IAAI,IAEtB,SAASC,CAAAA,CAAOC,CAAAA,CAAkC,CAChD,IAAIC,CAAAA,CAAMH,CAAAA,CAAU,GAAA,CAAIE,CAAK,EAC7B,OAAKC,CAAAA,GACHA,CAAAA,CAAM,IAAI,IACVH,CAAAA,CAAU,GAAA,CAAIE,CAAAA,CAAOC,CAAG,GAEnBA,CACT,CAEA,OAAO,CACL,GAA+BD,CAAAA,CAAUE,CAAAA,CAAyC,CAChF,OAAAH,CAAAA,CAAOC,CAAK,CAAA,CAAE,GAAA,CAAIE,CAAuB,CAAA,CAClC,IAAMH,CAAAA,CAAOC,CAAK,CAAA,CAAE,MAAA,CAAOE,CAAuB,CAC3D,CAAA,CAEA,IAAA,CAAiCF,CAAAA,CAAUE,EAAyC,CAClF,IAAMC,EAA+BC,CAAAA,EAAS,CAC5CL,EAAOC,CAAK,CAAA,CAAE,MAAA,CAAOG,CAAuB,EAC5CD,CAAAA,CAAQE,CAAI,EACd,CAAA,CACA,OAAAL,CAAAA,CAAOC,CAAK,CAAA,CAAE,GAAA,CAAIG,CAAuB,CAAA,CAClC,IAAMJ,EAAOC,CAAK,CAAA,CAAE,OAAOG,CAAuB,CAC3D,CAAA,CAEA,IAAA,CAAiCH,EAAUI,CAAAA,CAAkB,CAC3D,IAAMH,CAAAA,CAAMH,EAAU,GAAA,CAAIE,CAAK,CAAA,CAC/B,GAAIC,EACF,IAAA,IAAWC,CAAAA,IAAW,MAAM,IAAA,CAAKD,CAAG,EAClCC,CAAAA,CAAQE,CAAI,EAGlB,CAAA,CAEA,IAAgCJ,CAAAA,CAAUE,CAAAA,CAAmC,CAC3EH,CAAAA,CAAOC,CAAK,CAAA,CAAE,MAAA,CAAOE,CAAuB,EAC9C,EAEA,KAAA,CAAMF,CAAAA,CAAgC,CAChCA,CAAAA,CACFF,CAAAA,CAAU,OAAOE,CAAK,CAAA,CAEtBF,CAAAA,CAAU,KAAA,GAEd,CAAA,CAEA,aAAA,CAAcE,CAAAA,CAAiC,CAC7C,OAAOF,CAAAA,CAAU,GAAA,CAAIE,CAAK,CAAA,EAAG,MAAQ,CACvC,CAAA,CAEA,aAAaA,CAAAA,CAAkC,CAC7C,QAAQF,CAAAA,CAAU,GAAA,CAAIE,CAAK,CAAA,EAAG,MAAQ,CAAA,EAAK,CAC7C,CACF,CACF,CAMA,IAAIK,CAAAA,CAAkC,IAAA,CAe/B,SAASC,GAA4E,CAC1F,OAAKD,IACHA,CAAAA,CAAYR,CAAAA,IAEPQ,CACT","file":"chunk-34PQECMN.cjs","sourcesContent":["/**\n * Event bus — typed pub/sub for cross-component communication.\n *\n * Fire-and-forget events between unrelated components without\n * prop drilling or context coupling.\n *\n * ```ts\n * const bus = createEventBus<{\n * 'user:login': { userId: string };\n * 'cart:updated': { itemCount: number };\n * 'notification': string;\n * }>();\n *\n * // Subscribe\n * bus.on('user:login', ({ userId }) => fetchProfile(userId));\n *\n * // Emit from anywhere\n * bus.emit('user:login', { userId: '123' });\n *\n * // One-time listener\n * bus.once('cart:updated', ({ itemCount }) => showBadge(itemCount));\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type EventMap = Record<string, unknown>;\nexport type EventHandler<T = unknown> = (data: T) => void;\n\nexport interface EventBus<T extends EventMap> {\n /** Subscribe to an event */\n on<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void;\n /** Subscribe once — auto-removes after first call */\n once<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void;\n /** Emit an event to all listeners */\n emit<K extends keyof T & string>(event: K, data: T[K]): void;\n /** Remove a specific handler */\n off<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): void;\n /** Remove all handlers for an event (or all events) */\n clear(event?: keyof T & string): void;\n /** Get listener count for an event */\n listenerCount(event: keyof T & string): number;\n /** Check if an event has listeners */\n hasListeners(event: keyof T & string): boolean;\n}\n\n// =========================================================================\n// createEventBus\n// =========================================================================\n\n/**\n * Create a typed event bus.\n *\n * ```ts\n * const bus = createEventBus<{\n * 'theme:change': 'light' | 'dark';\n * 'toast': { message: string; type: string };\n * }>();\n * ```\n */\nexport function createEventBus<T extends EventMap = Record<string, unknown>>(): EventBus<T> {\n const listeners = new Map<string, Set<EventHandler>>();\n\n function getSet(event: string): Set<EventHandler> {\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n return set;\n }\n\n return {\n on<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void {\n getSet(event).add(handler as EventHandler);\n return () => getSet(event).delete(handler as EventHandler);\n },\n\n once<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): () => void {\n const wrapper: EventHandler<T[K]> = (data) => {\n getSet(event).delete(wrapper as EventHandler);\n handler(data);\n };\n getSet(event).add(wrapper as EventHandler);\n return () => getSet(event).delete(wrapper as EventHandler);\n },\n\n emit<K extends keyof T & string>(event: K, data: T[K]): void {\n const set = listeners.get(event);\n if (set) {\n for (const handler of Array.from(set)) {\n handler(data);\n }\n }\n },\n\n off<K extends keyof T & string>(event: K, handler: EventHandler<T[K]>): void {\n getSet(event).delete(handler as EventHandler);\n },\n\n clear(event?: keyof T & string): void {\n if (event) {\n listeners.delete(event);\n } else {\n listeners.clear();\n }\n },\n\n listenerCount(event: keyof T & string): number {\n return listeners.get(event)?.size ?? 0;\n },\n\n hasListeners(event: keyof T & string): boolean {\n return (listeners.get(event)?.size ?? 0) > 0;\n },\n };\n}\n\n// =========================================================================\n// Global bus singleton\n// =========================================================================\n\nlet globalBus: EventBus<any> | null = null;\n\n/**\n * Get the global event bus (created on first call).\n *\n * ```ts\n * import { globalEventBus } from '@akashjs/runtime';\n *\n * // In component A:\n * globalEventBus().emit('notification', 'Hello!');\n *\n * // In component B:\n * globalEventBus().on('notification', (msg) => show(msg));\n * ```\n */\nexport function globalEventBus<T extends EventMap = Record<string, unknown>>(): EventBus<T> {\n if (!globalBus) {\n globalBus = createEventBus<T>();\n }\n return globalBus as EventBus<T>;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function Q(e){return Array.isArray(e)?e.join(","):typeof e=="boolean"?e?"true":"false":String(e)}function b(e,t){return typeof t=="number"?Number(e):typeof t=="boolean"?e==="true"||e==="1":Array.isArray(t)?e?e.split(","):[]:e}function u(){return typeof window>"u"?new URLSearchParams:new URLSearchParams(window.location.search)}function x(e,t){if(typeof window>"u")return;let n=e.toString(),r=n?`${window.location.pathname}?${n}${window.location.hash}`:`${window.location.pathname}${window.location.hash}`;t==="push"?window.history.pushState(null,"",r):window.history.replaceState(null,"",r);}var s=new Map,h=false;function R(){h||typeof window>"u"||(h=true,window.addEventListener("popstate",()=>{let e=u();chunkWOZWFMOK_cjs.a(()=>{for(let[t,n]of s){let r=e.get(t),a=r!==null?n.deserialize(r):n.defaultValue;n.signal.set(a);}});}));}function v(e,t,n={}){let{serialize:r=i=>Q(i),deserialize:a=i=>b(i,t),history:w="replace",debounce:d=0,removeDefault:m=true}=n,p=u().get(e),S=p!==null?a(p):t,o=chunkWOZWFMOK_cjs.c(S);s.set(e,{signal:o,deserialize:a,defaultValue:t}),R();let l=null,T=false,z=o.set;o.set=i=>{if(z(i),T);let y=()=>{let c=u();m&&i===t?c.delete(e):c.set(e,r(i)),x(c,w);};d>0?(l&&clearTimeout(l),l=setTimeout(y,d)):y();};o.update;return o.update=i=>{o.set(i(o()));},o}function j(e,t){let n={};for(let[r,a]of Object.entries(e))n[r]=v(r,a.default,{serialize:a.serialize,deserialize:a.deserialize,history:t?.history});return n}function D(){if(typeof window>"u")return;let e=`${window.location.pathname}${window.location.hash}`;window.history.replaceState(null,"",e),chunkWOZWFMOK_cjs.a(()=>{for(let[,t]of s)t.signal.set(t.defaultValue);});}function M(){let e=u(),t={};return e.forEach((n,r)=>{t[r]=n;}),t}function O(e){s.delete(e);}function k(){s.clear();}exports.a=v;exports.b=j;exports.c=D;exports.d=M;exports.e=O;exports.f=k;//# sourceMappingURL=chunk-36VM3RJW.cjs.map
2
+ //# sourceMappingURL=chunk-36VM3RJW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query-state.ts"],"names":["defaultSerialize","value","defaultDeserialize","raw","defaultValue","getSearchParams","updateURL","params","mode","search","url","activeStates","popstateListening","ensurePopstateListener","batch","key","state","useQueryState","options","serialize","v","deserialize","historyMode","debounceMs","removeDefault","initialValue","signal","debounceTimer","isInternalUpdate","originalSet","doUpdate","currentParams","fn","useQueryStates","schema","result","config","clearQueryState","getQueryParams","removeQueryState","resetQueryState"],"mappings":"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","file":"chunk-36VM3RJW.cjs","sourcesContent":["/**\n * URL-synced reactive state.\n *\n * Automatically sync signal values to URL query parameters.\n * Users can share links, use browser back/forward, and state\n * persists across page reloads — all with zero boilerplate.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * const page = useQueryState('page', 1);\n * const tags = useQueryState('tags', ['js']);\n *\n * search.set('akashjs'); // URL → ?q=akashjs&page=1&tags=js\n * // User hits back → signals update automatically\n * ```\n */\n\nimport { signal, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport type { Signal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface QueryStateOptions<T> {\n /** Custom serializer (default: auto-detect from type) */\n serialize?: (value: T) => string;\n /** Custom deserializer (default: auto-detect from type) */\n deserialize?: (raw: string) => T;\n /** Whether to push or replace history entry (default: 'replace') */\n history?: 'push' | 'replace';\n /** Debounce URL updates in ms (default: 0) */\n debounce?: number;\n /** Remove param from URL when value equals default */\n removeDefault?: boolean;\n}\n\n// =========================================================================\n// Serializers\n// =========================================================================\n\nfunction defaultSerialize(value: unknown): string {\n if (Array.isArray(value)) return value.join(',');\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n return String(value);\n}\n\nfunction defaultDeserialize<T>(raw: string, defaultValue: T): T {\n if (typeof defaultValue === 'number') return Number(raw) as T;\n if (typeof defaultValue === 'boolean') return (raw === 'true' || raw === '1') as T;\n if (Array.isArray(defaultValue)) {\n return (raw ? raw.split(',') : []) as T;\n }\n return raw as T;\n}\n\n// =========================================================================\n// URL helpers\n// =========================================================================\n\nfunction getSearchParams(): URLSearchParams {\n if (typeof window === 'undefined') return new URLSearchParams();\n return new URLSearchParams(window.location.search);\n}\n\nfunction updateURL(params: URLSearchParams, mode: 'push' | 'replace'): void {\n if (typeof window === 'undefined') return;\n\n const search = params.toString();\n const url = search ? `${window.location.pathname}?${search}${window.location.hash}` : `${window.location.pathname}${window.location.hash}`;\n\n if (mode === 'push') {\n window.history.pushState(null, '', url);\n } else {\n window.history.replaceState(null, '', url);\n }\n}\n\n// =========================================================================\n// useQueryState — single value\n// =========================================================================\n\n/** Track active query state signals for popstate sync */\nconst activeStates = new Map<string, { signal: Signal<any>; deserialize: (raw: string) => any; defaultValue: any }>();\nlet popstateListening = false;\n\nfunction ensurePopstateListener(): void {\n if (popstateListening || typeof window === 'undefined') return;\n popstateListening = true;\n\n window.addEventListener('popstate', () => {\n const params = getSearchParams();\n batch(() => {\n for (const [key, state] of activeStates) {\n const raw = params.get(key);\n const value = raw !== null\n ? state.deserialize(raw)\n : state.defaultValue;\n state.signal.set(value);\n }\n });\n });\n}\n\n/**\n * Create a signal synced to a URL query parameter.\n *\n * ```ts\n * const search = useQueryState('q', '');\n * search(); // reads from URL or default\n * search.set('hello'); // updates URL to ?q=hello\n * ```\n */\nexport function useQueryState<T>(\n key: string,\n defaultValue: T,\n options: QueryStateOptions<T> = {},\n): Signal<T> {\n const {\n serialize = (v: T) => defaultSerialize(v),\n deserialize = (raw: string) => defaultDeserialize(raw, defaultValue),\n history: historyMode = 'replace',\n debounce: debounceMs = 0,\n removeDefault = true,\n } = options;\n\n // Read initial value from URL\n const params = getSearchParams();\n const raw = params.get(key);\n const initialValue = raw !== null ? deserialize(raw) : defaultValue;\n\n const state = signal<T>(initialValue);\n\n // Register for popstate sync\n activeStates.set(key, { signal: state, deserialize, defaultValue });\n ensurePopstateListener();\n\n // Sync signal → URL\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let isInternalUpdate = false;\n\n const originalSet = state.set;\n state.set = (value: T) => {\n originalSet(value);\n\n if (isInternalUpdate) return;\n\n const doUpdate = () => {\n const currentParams = getSearchParams();\n\n if (removeDefault && value === defaultValue) {\n currentParams.delete(key);\n } else {\n currentParams.set(key, serialize(value));\n }\n\n updateURL(currentParams, historyMode);\n };\n\n if (debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doUpdate, debounceMs);\n } else {\n doUpdate();\n }\n };\n\n const originalUpdate = state.update;\n state.update = (fn: (prev: T) => T) => {\n state.set(fn(state()));\n };\n\n return state;\n}\n\n// =========================================================================\n// useQueryStates — multiple values at once\n// =========================================================================\n\ntype QueryStateSchema = Record<string, {\n default: unknown;\n serialize?: (value: any) => string;\n deserialize?: (raw: string) => any;\n}>;\n\ntype QueryStates<T extends QueryStateSchema> = {\n [K in keyof T]: Signal<T[K]['default']>;\n};\n\n/**\n * Create multiple URL-synced signals at once.\n * All updates within a batch result in a single URL change.\n *\n * ```ts\n * const { q, page, sort } = useQueryStates({\n * q: { default: '' },\n * page: { default: 1 },\n * sort: { default: 'name' },\n * });\n * ```\n */\nexport function useQueryStates<T extends QueryStateSchema>(\n schema: T,\n options?: { history?: 'push' | 'replace' },\n): QueryStates<T> {\n const result = {} as any;\n for (const [key, config] of Object.entries(schema)) {\n result[key] = useQueryState(key, config.default, {\n serialize: config.serialize,\n deserialize: config.deserialize,\n history: options?.history,\n });\n }\n return result;\n}\n\n// =========================================================================\n// Utilities\n// =========================================================================\n\n/**\n * Remove all query state params from the URL.\n */\nexport function clearQueryState(): void {\n if (typeof window === 'undefined') return;\n const url = `${window.location.pathname}${window.location.hash}`;\n window.history.replaceState(null, '', url);\n\n batch(() => {\n for (const [, state] of activeStates) {\n state.signal.set(state.defaultValue);\n }\n });\n}\n\n/**\n * Get all current query params as a plain object.\n */\nexport function getQueryParams(): Record<string, string> {\n const params = getSearchParams();\n const result: Record<string, string> = {};\n params.forEach((value, key) => { result[key] = value; });\n return result;\n}\n\n/**\n * Cleanup: remove a specific query state binding.\n */\nexport function removeQueryState(key: string): void {\n activeStates.delete(key);\n}\n\n/**\n * Cleanup all query state bindings (useful for testing).\n */\nexport function resetQueryState(): void {\n activeStates.clear();\n}\n"]}
@@ -0,0 +1,3 @@
1
+ 'use strict';var p=new Set,g=true,l=null;function f(e){g=e;}function I(e){l=e;}function h(){p.clear();}function b(e,n){let t=((...r)=>(u(n),e(...r)));return Object.keys(e).forEach(r=>{t[r]=e[r];}),t.__deprecated=n,t}function y(e,n){return u(n),e}function u(e){if(!g||p.has(e.name))return;p.add(e.name);let n=[`[AkashJS] DEPRECATED: ${e.name}() is deprecated since v${e.since}`];e.removeIn?n[0]+=` and will be removed in v${e.removeIn}.`:n[0]+=".",e.replacement&&n.push(` Migrate to: ${e.replacement}()`),e.message&&n.push(` ${e.message}`),n.push(` See: ${e.link??"https://akash.js.org/migration"}`);let t=n.join(`
2
+ `);l?l(t):typeof console<"u"&&console.warn(t);}var a=new Map;function v(e){a.set(e.name,e);}function d(){return Array.from(a.values())}function x(e){return d().filter(n=>n.stability===e)}function A(e){return a.get(e)?.stability==="deprecated"}function w(e){return a.get(e)?.deprecation??null}function k(e){let n=[],t=[],r=Object.entries(e);if(r.length===0)return {compatible:true,warnings:n,errors:t};let s=r.filter(([o])=>o.startsWith("@akashjs/"));if(s.length>1){let o=new Set(s.map(([,i])=>i.split(".")[0])),m=new Set(s.map(([,i])=>i.split(".").slice(0,2).join(".")));o.size>1?t.push(`Major version mismatch: ${s.map(([i,c])=>`${i}@${c}`).join(", ")}. All @akashjs packages should be on the same major version.`):m.size>1&&n.push(`Minor version mismatch: ${s.map(([i,c])=>`${i}@${c}`).join(", ")}. Consider updating all packages to the same version with \`akash update\`.`);}return {compatible:t.length===0,warnings:n,errors:t}}exports.a=f;exports.b=I;exports.c=h;exports.d=b;exports.e=y;exports.f=v;exports.g=d;exports.h=x;exports.i=A;exports.j=w;exports.k=k;//# sourceMappingURL=chunk-3PGU24B5.cjs.map
3
+ //# sourceMappingURL=chunk-3PGU24B5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deprecation.ts"],"names":["warned","warningsEnabled","warningHandler","setDeprecationWarnings","enabled","setWarningHandler","handler","resetDeprecationWarnings","deprecated","fn","info","wrapper","args","emitDeprecationWarning","key","deprecatedValue","value","parts","msg","apiRegistry","registerAPI","getRegisteredAPIs","getAPIsByStability","stability","api","isDeprecated","name","getDeprecationInfo","checkCompatibility","packages","warnings","errors","versions","akashPackages","majors","v","minors","n"],"mappings":"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","file":"chunk-3PGU24B5.cjs","sourcesContent":["/**\n * Deprecation warnings and API stability markers.\n *\n * Provides runtime warnings when deprecated APIs are used,\n * with migration hints pointing to the replacement.\n *\n * ```ts\n * // Mark an API as deprecated:\n * export const oldName = deprecated(newImplementation, {\n * name: 'oldName',\n * replacement: 'newName',\n * since: '0.2.0',\n * removeIn: '1.0.0',\n * message: 'Use newName() instead for better performance.',\n * });\n *\n * // Users see:\n * // [AkashJS] DEPRECATED: oldName() is deprecated since v0.2.0 and will be removed in v1.0.0.\n * // Use newName() instead for better performance.\n * // See: https://akash.js.org/migration\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type APIStability = 'stable' | 'experimental' | 'deprecated' | 'internal';\n\nexport interface DeprecationInfo {\n /** Name of the deprecated API */\n name: string;\n /** Replacement API name */\n replacement?: string;\n /** Version when deprecated */\n since: string;\n /** Version when it will be removed */\n removeIn?: string;\n /** Custom migration message */\n message?: string;\n /** Documentation link */\n link?: string;\n}\n\nexport interface APIInfo {\n /** API name */\n name: string;\n /** Stability level */\n stability: APIStability;\n /** Version introduced */\n since: string;\n /** Deprecation info (if deprecated) */\n deprecation?: DeprecationInfo;\n}\n\n// =========================================================================\n// Warning state\n// =========================================================================\n\nconst warned = new Set<string>();\nlet warningsEnabled = true;\nlet warningHandler: ((msg: string) => void) | null = null;\n\n/**\n * Enable or disable deprecation warnings globally.\n */\nexport function setDeprecationWarnings(enabled: boolean): void {\n warningsEnabled = enabled;\n}\n\n/**\n * Set a custom warning handler (default: console.warn).\n */\nexport function setWarningHandler(handler: ((msg: string) => void) | null): void {\n warningHandler = handler;\n}\n\n/**\n * Reset warned-about APIs (useful for testing).\n */\nexport function resetDeprecationWarnings(): void {\n warned.clear();\n}\n\n// =========================================================================\n// deprecated() — wrap a function with a deprecation warning\n// =========================================================================\n\n/**\n * Wrap a function so it emits a deprecation warning on first call.\n *\n * ```ts\n * // Old API that still works but warns:\n * export const createStore = deprecated(defineStore, {\n * name: 'createStore',\n * replacement: 'defineStore',\n * since: '0.2.0',\n * removeIn: '1.0.0',\n * });\n * ```\n */\nexport function deprecated<T extends (...args: any[]) => any>(\n fn: T,\n info: DeprecationInfo,\n): T {\n const wrapper = ((...args: any[]) => {\n emitDeprecationWarning(info);\n return fn(...args);\n }) as unknown as T;\n\n // Copy properties from original\n Object.keys(fn).forEach((key) => {\n (wrapper as any)[key] = (fn as any)[key];\n });\n\n // Mark as deprecated\n (wrapper as any).__deprecated = info;\n\n return wrapper;\n}\n\n/**\n * Mark a value (non-function) as deprecated.\n * Returns the value but warns on first access.\n */\nexport function deprecatedValue<T>(value: T, info: DeprecationInfo): T {\n emitDeprecationWarning(info);\n return value;\n}\n\n// =========================================================================\n// Warning emission\n// =========================================================================\n\nfunction emitDeprecationWarning(info: DeprecationInfo): void {\n if (!warningsEnabled) return;\n if (warned.has(info.name)) return; // Only warn once per API\n warned.add(info.name);\n\n const parts: string[] = [\n `[AkashJS] DEPRECATED: ${info.name}() is deprecated since v${info.since}`,\n ];\n\n if (info.removeIn) {\n parts[0] += ` and will be removed in v${info.removeIn}.`;\n } else {\n parts[0] += '.';\n }\n\n if (info.replacement) {\n parts.push(` Migrate to: ${info.replacement}()`);\n }\n\n if (info.message) {\n parts.push(` ${info.message}`);\n }\n\n parts.push(` See: ${info.link ?? 'https://akash.js.org/migration'}`);\n\n const msg = parts.join('\\n');\n\n if (warningHandler) {\n warningHandler(msg);\n } else if (typeof console !== 'undefined') {\n console.warn(msg);\n }\n}\n\n// =========================================================================\n// API Registry — track stability of all APIs\n// =========================================================================\n\nconst apiRegistry = new Map<string, APIInfo>();\n\n/**\n * Register an API with its stability level.\n */\nexport function registerAPI(info: APIInfo): void {\n apiRegistry.set(info.name, info);\n}\n\n/**\n * Get all registered APIs.\n */\nexport function getRegisteredAPIs(): APIInfo[] {\n return Array.from(apiRegistry.values());\n}\n\n/**\n * Get APIs by stability level.\n */\nexport function getAPIsByStability(stability: APIStability): APIInfo[] {\n return getRegisteredAPIs().filter((api) => api.stability === stability);\n}\n\n/**\n * Check if an API is deprecated.\n */\nexport function isDeprecated(name: string): boolean {\n const info = apiRegistry.get(name);\n return info?.stability === 'deprecated';\n}\n\n/**\n * Get deprecation info for an API.\n */\nexport function getDeprecationInfo(name: string): DeprecationInfo | null {\n const info = apiRegistry.get(name);\n return info?.deprecation ?? null;\n}\n\n// =========================================================================\n// Compatibility check\n// =========================================================================\n\nexport interface CompatibilityResult {\n compatible: boolean;\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Check if package versions are compatible.\n *\n * ```ts\n * const result = checkCompatibility({\n * '@akashjs/runtime': '0.2.0',\n * '@akashjs/router': '0.1.0',\n * });\n * if (!result.compatible) {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function checkCompatibility(\n packages: Record<string, string>,\n): CompatibilityResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const versions = Object.entries(packages);\n if (versions.length === 0) return { compatible: true, warnings, errors };\n\n // Check that all @akashjs packages are on compatible versions\n const akashPackages = versions.filter(([name]) => name.startsWith('@akashjs/'));\n\n if (akashPackages.length > 1) {\n const majors = new Set(akashPackages.map(([, v]) => v.split('.')[0]));\n const minors = new Set(akashPackages.map(([, v]) => v.split('.').slice(0, 2).join('.')));\n\n if (majors.size > 1) {\n errors.push(\n `Major version mismatch: ${akashPackages.map(([n, v]) => `${n}@${v}`).join(', ')}. ` +\n 'All @akashjs packages should be on the same major version.',\n );\n } else if (minors.size > 1) {\n warnings.push(\n `Minor version mismatch: ${akashPackages.map(([n, v]) => `${n}@${v}`).join(', ')}. ` +\n 'Consider updating all packages to the same version with `akash update`.',\n );\n }\n }\n\n return {\n compatible: errors.length === 0,\n warnings,\n errors,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function v(i){return i}function E(...i){let d={},e=[];for(let n of i)typeof n=="function"?e.push(n):typeof n=="object"&&n!==null&&(d=n);let{label:l="inspect",level:m="log",logger:c,when:u}=d,s={dispose:null,get values(){return e.map(n=>n())},get value(){return e.length===1?e[0]():e.map(n=>n())},label:l,sources:e.length};return s.dispose=chunkWOZWFMOK_cjs.e(()=>{if(u&&!u())return;let n=e.map(r=>r());c?c(l,...n):console[m](`[${l}]`,...n);}),s}function b(i,d={}){let{method:e="POST",headers:l={},onSuccess:m,onError:c,fetch:u=globalThis.fetch.bind(globalThis)}=d,s=chunkWOZWFMOK_cjs.c(false),n=chunkWOZWFMOK_cjs.c(null),r=chunkWOZWFMOK_cjs.c(null);async function f(a){s.set(true),r.set(null);try{let o=await u(i,{method:e,headers:{"Content-Type":"application/json",...l},body:JSON.stringify(a)});if(!o.ok)throw new Error(`Form action failed: ${o.status}`);let t=await o.json();return n.set(t),s.set(!1),m?.(t),t}catch(o){let t=o instanceof Error?o:new Error(String(o));throw r.set(t),s.set(false),c?.(t),t}}return {url:i,method:e,submitting:()=>s(),result:()=>n(),error:()=>r(),handle(a){return o=>{o.preventDefault();let t=o.target,p=new FormData(t),h={...a};p.forEach((T,y)=>{h[y]=T;}),f(h);}},submit:f}}function k(i={}){if(typeof window>"u")return ()=>{};let{keyPrefix:d="akash-snapshot",capture:e=["scroll","forms"]}=i;function l(){let n={scrollX:window.scrollX,scrollY:window.scrollY,forms:{},timestamp:Date.now()};return e.includes("forms")&&document.querySelectorAll("form[id]").forEach(r=>{let f=r,a={};new FormData(f).forEach((o,t)=>{a[t]=String(o);}),n.forms[f.id]=a;}),n}function m(n){if(e.includes("scroll")&&requestAnimationFrame(()=>{window.scrollTo(n.scrollX,n.scrollY);}),e.includes("forms"))for(let[r,f]of Object.entries(n.forms)){let a=document.getElementById(r);if(a)for(let[o,t]of Object.entries(f)){let p=a.elements.namedItem(o);p&&(p.value=t);}}}let c=()=>`${d}-${window.location.pathname}`;function u(){try{let n=l();sessionStorage.setItem(c(),JSON.stringify(n));}catch{}}function s(){try{let n=sessionStorage.getItem(c());if(n){let r=JSON.parse(n);Date.now()-r.timestamp<1800*1e3&&m(r);}}catch{}}return window.addEventListener("beforeunload",u),window.addEventListener("popstate",()=>{requestAnimationFrame(s);}),performance.getEntriesByType("navigation")[0]?.type==="back_forward"&&requestAnimationFrame(s),()=>{window.removeEventListener("beforeunload",u);}}exports.a=v;exports.b=E;exports.c=b;exports.d=k;//# sourceMappingURL=chunk-3XREYIJH.cjs.map
2
+ //# sourceMappingURL=chunk-3XREYIJH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/snippets.ts"],"names":["defineSnippet","render","inspect","args","options","sources","arg","label","level","logger","when","result","s","effect","values","defineFormAction","url","method","headers","onSuccess","onError","customFetch","submitting","signal","error","submit","data","response","res","err","e","extraData","form","formData","value","key","enableSnapshots","config","keyPrefix","capture","captureSnapshot","snapshot","formEl","restoreSnapshot","formId","input","saveKey","save","restore","raw"],"mappings":"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","file":"chunk-3XREYIJH.cjs","sourcesContent":["/**\n * Snippets, $inspect, form actions, and navigation snapshots.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Snippets — reusable template fragments\n// =========================================================================\n\nexport type Snippet<TArgs extends unknown[] = []> = (...args: TArgs) => AkashNode;\n\n/**\n * Define a reusable template snippet.\n *\n * ```ts\n * const UserBadge = defineSnippet((name: string, role: string) => {\n * const el = document.createElement('span');\n * el.textContent = `${name} (${role})`;\n * el.className = 'badge';\n * return el;\n * });\n *\n * // Reuse anywhere:\n * container.appendChild(nodeToDOM(UserBadge('Alice', 'admin')));\n * container.appendChild(nodeToDOM(UserBadge('Bob', 'user')));\n * ```\n */\nexport function defineSnippet<TArgs extends unknown[]>(\n render: (...args: TArgs) => AkashNode,\n): Snippet<TArgs> {\n return render;\n}\n\n// =========================================================================\n// $inspect — debug reactive values\n// =========================================================================\n\nexport interface InspectOptions {\n /** Label prefix for console output */\n label?: string;\n /** Log level (default: 'log') */\n level?: 'log' | 'warn' | 'debug' | 'trace';\n /** Custom logger */\n logger?: (label: string, ...values: unknown[]) => void;\n /** Only log when a condition is true */\n when?: () => boolean;\n}\n\n/**\n * Debug helper — logs when reactive values change.\n *\n * ```ts\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * inspect(count, name); // logs: [inspect] 0, 'Alice'\n * count.set(1); // logs: [inspect] 1, 'Alice'\n *\n * // With label:\n * inspect(count, { label: 'counter' });\n * // logs: [counter] 1\n * ```\n */\nexport function inspect(\n ...args: Array<(() => unknown) | InspectOptions>\n): () => void {\n let options: InspectOptions = {};\n const sources: Array<() => unknown> = [];\n\n for (const arg of args) {\n if (typeof arg === 'function') {\n sources.push(arg);\n } else if (typeof arg === 'object' && arg !== null) {\n options = arg as InspectOptions;\n }\n }\n\n const {\n label = 'inspect',\n level = 'log',\n logger,\n when,\n } = options;\n\n const result = {\n dispose: null as unknown as () => void,\n get values() { return sources.map(s => s()); },\n get value() { return sources.length === 1 ? sources[0]() : sources.map(s => s()); },\n label,\n sources: sources.length,\n };\n\n result.dispose = effect(() => {\n if (when && !when()) return;\n\n const values = sources.map((s) => s());\n\n if (logger) {\n logger(label, ...values);\n } else {\n (console as any)[level](`[${label}]`, ...values);\n }\n });\n\n return result as any;\n}\n\n// =========================================================================\n// Form actions — server-side form handling\n// =========================================================================\n\nexport interface FormAction<T = unknown> {\n /** The action URL */\n url: string;\n /** Submit method */\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Whether a submission is in progress */\n submitting: ReadonlySignal<boolean>;\n /** The last result */\n result: ReadonlySignal<T | null>;\n /** The last error */\n error: ReadonlySignal<Error | null>;\n /** Create an onSubmit handler for a <form> */\n handle(formData?: Record<string, unknown>): (e: Event) => void;\n /** Submit programmatically */\n submit(data: Record<string, unknown>): Promise<T>;\n}\n\n/**\n * Define a server-side form action with progressive enhancement.\n *\n * ```ts\n * const createPost = defineFormAction<Post>('/api/posts', {\n * method: 'POST',\n * onSuccess: (post) => navigate(`/posts/${post.id}`),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * // In template:\n * <form onSubmit={createPost.handle()}>\n * <input name=\"title\" />\n * <button disabled={createPost.submitting()}>Create</button>\n * </form>\n * ```\n */\nexport function defineFormAction<T = unknown>(\n url: string,\n options: {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n onSuccess?: (result: T) => void;\n onError?: (error: Error) => void;\n fetch?: typeof globalThis.fetch;\n } = {},\n): FormAction<T> {\n const {\n method = 'POST',\n headers = {},\n onSuccess,\n onError,\n fetch: customFetch = globalThis.fetch.bind(globalThis),\n } = options;\n\n const submitting = signal(false);\n const result = signal<T | null>(null);\n const error = signal<Error | null>(null);\n\n async function submit(data: Record<string, unknown>): Promise<T> {\n submitting.set(true);\n error.set(null);\n\n try {\n const response = await customFetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Form action failed: ${response.status}`);\n }\n\n const res = await response.json() as T;\n result.set(res);\n submitting.set(false);\n onSuccess?.(res);\n return res;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n submitting.set(false);\n onError?.(e);\n throw e;\n }\n }\n\n return {\n url,\n method,\n submitting: () => submitting(),\n result: () => result(),\n error: () => error(),\n handle(extraData?: Record<string, unknown>) {\n return (e: Event) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n const formData = new FormData(form);\n const data: Record<string, unknown> = { ...extraData };\n formData.forEach((value, key) => { data[key] = value; });\n submit(data);\n };\n },\n submit,\n };\n}\n\n// =========================================================================\n// Navigation snapshots — preserve scroll & form state\n// =========================================================================\n\nexport interface SnapshotConfig {\n /** Storage key prefix (default: 'akash-snapshot') */\n keyPrefix?: string;\n /** What to capture */\n capture?: ('scroll' | 'forms')[];\n}\n\ninterface PageSnapshot {\n scrollX: number;\n scrollY: number;\n forms: Record<string, Record<string, string>>;\n timestamp: number;\n}\n\n/**\n * Enable navigation snapshots — preserves scroll position and form\n * state when navigating with back/forward.\n *\n * ```ts\n * enableSnapshots();\n * // Now back/forward restores scroll position and form inputs\n * ```\n */\nexport function enableSnapshots(config: SnapshotConfig = {}): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const { keyPrefix = 'akash-snapshot', capture = ['scroll', 'forms'] } = config;\n\n function captureSnapshot(): PageSnapshot {\n const snapshot: PageSnapshot = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n forms: {},\n timestamp: Date.now(),\n };\n\n if (capture.includes('forms')) {\n document.querySelectorAll('form[id]').forEach((form) => {\n const formEl = form as HTMLFormElement;\n const data: Record<string, string> = {};\n new FormData(formEl).forEach((value, key) => {\n data[key] = String(value);\n });\n snapshot.forms[formEl.id] = data;\n });\n }\n\n return snapshot;\n }\n\n function restoreSnapshot(snapshot: PageSnapshot): void {\n if (capture.includes('scroll')) {\n requestAnimationFrame(() => {\n window.scrollTo(snapshot.scrollX, snapshot.scrollY);\n });\n }\n\n if (capture.includes('forms')) {\n for (const [formId, data] of Object.entries(snapshot.forms)) {\n const form = document.getElementById(formId) as HTMLFormElement | null;\n if (!form) continue;\n for (const [key, value] of Object.entries(data)) {\n const input = form.elements.namedItem(key) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n }\n }\n\n // Save snapshot before navigation\n const saveKey = () => `${keyPrefix}-${window.location.pathname}`;\n\n function save(): void {\n try {\n const snapshot = captureSnapshot();\n sessionStorage.setItem(saveKey(), JSON.stringify(snapshot));\n } catch { /* storage full */ }\n }\n\n function restore(): void {\n try {\n const raw = sessionStorage.getItem(saveKey());\n if (raw) {\n const snapshot = JSON.parse(raw) as PageSnapshot;\n // Only restore if recent (within 30 minutes)\n if (Date.now() - snapshot.timestamp < 30 * 60 * 1000) {\n restoreSnapshot(snapshot);\n }\n }\n } catch { /* */ }\n }\n\n // Listen for navigation\n window.addEventListener('beforeunload', save);\n window.addEventListener('popstate', () => {\n requestAnimationFrame(restore);\n });\n\n // Restore on initial load if coming from back/forward\n if ((performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined)?.type === 'back_forward') {\n requestAnimationFrame(restore);\n }\n\n return () => {\n window.removeEventListener('beforeunload', save);\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkIQGSDFBI_cjs=require('./chunk-IQGSDFBI.cjs');function v(t){return t}function h(t,g){let p=[],i=[],s=[],l={},e=null,r=null,f={provide(n,o){chunkIQGSDFBI_cjs.f(n,o);},onError(n){i.push(n);},onBeforeMount(n){s.push(n);},config:l},u={use(n){return p.push(n),u},config(n,o){return l[n]=o,u},mount(n){if(r=typeof n=="string"?document.querySelector(n):n,!r)throw new Error(`[AkashJS] Mount target not found: ${n}`);for(let o of p)o.setup(f);for(let o of s)o();try{e=t(g??{}),r.appendChild(e);}catch(o){let c=o instanceof Error?o:new Error(String(o));if(i.length>0)for(let a of i)a(c);else throw c}},unmount(){e&&r&&(r.removeChild(e),e=null);}};return u}exports.a=v;exports.b=h;//# sourceMappingURL=chunk-45DPEU7T.cjs.map
2
+ //# sourceMappingURL=chunk-45DPEU7T.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin.ts"],"names":["definePlugin","plugin","createApp","rootComponent","rootProps","plugins","errorHandlers","beforeMountHooks","appConfig","mountedNode","containerEl","pluginCtx","key","value","provide","handler","hook","app","selector","err","e"],"mappings":"mEA+DO,SAASA,EAAaC,CAAAA,CAAwB,CACnD,OAAOA,CACT,CAcO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACa,CACb,IAAMC,CAAAA,CAAoB,EAAC,CACrBC,CAAAA,CAA+C,EAAC,CAChDC,CAAAA,CAAsC,EAAC,CACvCC,EAAqC,EAAC,CACxCC,EAA2B,IAAA,CAC3BC,CAAAA,CAAkC,KAEhCC,CAAAA,CAA2B,CAC/B,OAAA,CAAWC,CAAAA,CAAsBC,EAAU,CAEzCC,mBAAAA,CAAQF,EAAKC,CAAK,EACpB,EACA,OAAA,CAAQE,CAAAA,CAAiC,CACvCT,CAAAA,CAAc,KAAKS,CAAO,EAC5B,CAAA,CACA,aAAA,CAAcC,EAAkB,CAC9BT,CAAAA,CAAiB,IAAA,CAAKS,CAAI,EAC5B,CAAA,CACA,MAAA,CAAQR,CACV,CAAA,CAEMS,CAAAA,CAAmB,CACvB,GAAA,CAAIhB,CAAAA,CAAgB,CAClB,OAAAI,EAAQ,IAAA,CAAKJ,CAAM,EACZgB,CACT,CAAA,CAEA,OAAOL,CAAAA,CAAaC,CAAAA,CAAgB,CAClC,OAAAL,EAAUI,CAAG,CAAA,CAAIC,EACVI,CACT,CAAA,CAEA,MAAMC,CAAAA,CAAgC,CAMpC,GALAR,CAAAA,CACE,OAAOQ,CAAAA,EAAa,QAAA,CAChB,QAAA,CAAS,aAAA,CAA2BA,CAAQ,CAAA,CAC5CA,CAAAA,CAEF,CAACR,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,qCAAqCQ,CAAQ,CAAA,CAC/C,EAIF,IAAA,IAAWjB,CAAAA,IAAUI,CAAAA,CACnBJ,CAAAA,CAAO,MAAMU,CAAS,CAAA,CAIxB,QAAWK,CAAAA,IAAQT,CAAAA,CACjBS,GAAK,CAIP,GAAI,CACFP,CAAAA,CAAcN,EAAeC,CAAAA,EAAa,EAAU,CAAA,CACpDM,CAAAA,CAAY,YAAYD,CAAW,EACrC,CAAA,MAASU,CAAAA,CAAK,CACZ,IAAMC,CAAAA,CAAID,CAAAA,YAAe,KAAA,CAAQA,EAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAAA,CAC5D,GAAIb,EAAc,MAAA,CAAS,CAAA,CACzB,QAAWS,CAAAA,IAAWT,CAAAA,CACpBS,CAAAA,CAAQK,CAAC,OAGX,MAAMA,CAEV,CACF,CAAA,CAEA,OAAA,EAAU,CACJX,CAAAA,EAAeC,CAAAA,GACjBA,CAAAA,CAAY,WAAA,CAAYD,CAAW,CAAA,CACnCA,CAAAA,CAAc,MAElB,CACF,CAAA,CAEA,OAAOQ,CACT","file":"chunk-45DPEU7T.cjs","sourcesContent":["/**\n * Plugin system.\n *\n * Allows third-party extensions to hook into the AkashJS lifecycle.\n * Plugins can provide context values, add global error handlers,\n * register stores, and run setup code.\n *\n * ```ts\n * const authPlugin = definePlugin({\n * name: 'auth',\n * setup(app) {\n * const store = defineStore('auth', { ... })();\n * app.provide(AuthContext, store);\n * app.onError((err) => { if (err.status === 401) logout(); });\n * },\n * });\n *\n * const app = createApp(App);\n * app.use(authPlugin);\n * app.mount('#app');\n * ```\n */\n\nimport { provide } from './context.js';\nimport type { InjectionKey } from './context.js';\nimport type { Component } from './component.js';\n\n// --- Types ---\n\nexport interface PluginContext {\n /** Provide a value to all components */\n provide<T>(key: InjectionKey<T>, value: T): void;\n /** Register a global error handler */\n onError(handler: (error: Error) => void): void;\n /** Register a hook that runs before each component mount */\n onBeforeMount(hook: () => void): void;\n /** Access the app config */\n config: Record<string, unknown>;\n}\n\nexport interface Plugin {\n /** Plugin name (for debugging) */\n name: string;\n /** Setup function called when the plugin is installed */\n setup: (ctx: PluginContext) => void | Promise<void>;\n}\n\nexport interface AppInstance {\n /** Install a plugin */\n use(plugin: Plugin): AppInstance;\n /** Set a config value */\n config(key: string, value: unknown): AppInstance;\n /** Mount the app to a DOM element */\n mount(selector: string | HTMLElement): void;\n /** Unmount the app */\n unmount(): void;\n}\n\n// --- definePlugin ---\n\n/**\n * Define a framework plugin.\n */\nexport function definePlugin(plugin: Plugin): Plugin {\n return plugin;\n}\n\n// --- createApp ---\n\n/**\n * Create an application instance with plugin support.\n *\n * ```ts\n * const app = createApp(App);\n * app.use(authPlugin);\n * app.use(i18nPlugin);\n * app.mount('#app');\n * ```\n */\nexport function createApp<P extends Record<string, unknown>>(\n rootComponent: Component<P>,\n rootProps?: P,\n): AppInstance {\n const plugins: Plugin[] = [];\n const errorHandlers: Array<(error: Error) => void> = [];\n const beforeMountHooks: Array<() => void> = [];\n const appConfig: Record<string, unknown> = {};\n let mountedNode: Node | null = null;\n let containerEl: HTMLElement | null = null;\n\n const pluginCtx: PluginContext = {\n provide<T>(key: InjectionKey<T>, value: T) {\n // Will be called during setup — context scope is active\n provide(key, value);\n },\n onError(handler: (error: Error) => void) {\n errorHandlers.push(handler);\n },\n onBeforeMount(hook: () => void) {\n beforeMountHooks.push(hook);\n },\n config: appConfig,\n };\n\n const app: AppInstance = {\n use(plugin: Plugin) {\n plugins.push(plugin);\n return app;\n },\n\n config(key: string, value: unknown) {\n appConfig[key] = value;\n return app;\n },\n\n mount(selector: string | HTMLElement) {\n containerEl =\n typeof selector === 'string'\n ? document.querySelector<HTMLElement>(selector)\n : selector;\n\n if (!containerEl) {\n throw new Error(\n `[AkashJS] Mount target not found: ${selector}`,\n );\n }\n\n // Run plugin setup\n for (const plugin of plugins) {\n plugin.setup(pluginCtx);\n }\n\n // Run before-mount hooks\n for (const hook of beforeMountHooks) {\n hook();\n }\n\n // Render root component\n try {\n mountedNode = rootComponent((rootProps ?? {}) as any);\n containerEl.appendChild(mountedNode);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (errorHandlers.length > 0) {\n for (const handler of errorHandlers) {\n handler(e);\n }\n } else {\n throw e;\n }\n }\n },\n\n unmount() {\n if (mountedNode && containerEl) {\n containerEl.removeChild(mountedNode);\n mountedNode = null;\n }\n },\n };\n\n return app;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ var r=typeof process>"u"||process.env?.NODE_ENV!=="production",o=[{pattern:/Cannot set property '?(\w+)'? of/,hint:e=>`Did you try to reassign a signal? Use ${e[1]}.set(value) instead of ${e[1]} = value.`},{pattern:/(\w+) is not a function/,hint:e=>`"${e[1]}" may be a signal. Read it with ${e[1]}(), set it with ${e[1]}.set(value).`},{pattern:/Cannot read propert(?:y|ies) of (null|undefined)/,hint:()=>"A value is null/undefined. Use optional chaining (?.) or wrap in <Show when={value()}>."},{pattern:/(\w+)\.(?:forEach|map|filter|reduce) is not a function/,hint:e=>`"${e[1]}" might be a signal containing an array. Call ${e[1]}() first to get the value: ${e[1]}().map(...)`},{pattern:/(\w+)\.set is not a function/,hint:e=>`"${e[1]}" is not a writable signal. Only signal() values have .set(). Computed values are read-only.`},{pattern:/Maximum call stack size exceeded/,hint:()=>"Possible circular dependency. Check if two computed values or effects read and write to each other."}];function n(e){if(!r)return e;for(let{pattern:i,hint:a}of o){let t=i.exec(e.message);if(t){e.message+=`
2
+
3
+ \u{1F4A1} Hint: ${a(t)}`;break}}return e}function s(){r&&(typeof window<"u"&&(window.addEventListener("error",e=>{e.error instanceof Error&&n(e.error);}),window.addEventListener("unhandledrejection",e=>{e.reason instanceof Error&&n(e.reason);})),typeof process<"u"&&process.on&&process.on("uncaughtException",e=>{n(e),console.error(e),process.exit(1);}));}export{n as a,s as b};//# sourceMappingURL=chunk-4J3QBQVW.js.map
4
+ //# sourceMappingURL=chunk-4J3QBQVW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error-hints.ts"],"names":["__DEV__","HINTS","m","enhanceError","error","pattern","hint","match","installErrorHints","event","err"],"mappings":"AAOA,IAAMA,CAAAA,CAAU,OAAO,OAAA,CAAY,GAAA,EAAe,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,YAAA,CAOtEC,CAAAA,CAAqB,CACzB,CAEE,OAAA,CAAS,kCAAA,CACT,KAAOC,CAAAA,EAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAE,CAAC,CAAC,CAAA,uBAAA,EAA0BA,CAAAA,CAAE,CAAC,CAAC,CAAA,SAAA,CAC1F,CAAA,CACA,CAEE,OAAA,CAAS,yBAAA,CACT,KAAOA,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAC,CAAA,gCAAA,EAAmCA,CAAAA,CAAE,CAAC,CAAC,CAAA,gBAAA,EAAmBA,CAAAA,CAAE,CAAC,CAAC,CAAA,YAAA,CACrF,CAAA,CACA,CAEE,OAAA,CAAS,kDAAA,CACT,IAAA,CAAM,IAAM,yFACd,CAAA,CACA,CAEE,OAAA,CAAS,wDAAA,CACT,IAAA,CAAOA,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAC,CAAA,8CAAA,EAAiDA,CAAAA,CAAE,CAAC,CAAC,CAAA,2BAAA,EAA8BA,CAAAA,CAAE,CAAC,CAAC,CAAA,WAAA,CAC9G,CAAA,CACA,CAEE,OAAA,CAAS,8BAAA,CACT,IAAA,CAAOA,GAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAC,CAAA,4FAAA,CACvB,CAAA,CACA,CAEE,OAAA,CAAS,kCAAA,CACT,IAAA,CAAM,IAAM,qGACd,CACF,CAAA,CAKO,SAASC,CAAAA,CAAaC,CAAAA,CAAqB,CAChD,GAAI,CAACJ,CAAAA,CAAS,OAAOI,CAAAA,CAErB,IAAA,GAAW,CAAE,OAAA,CAAAC,CAAAA,CAAS,IAAA,CAAAC,CAAK,CAAA,GAAKL,CAAAA,CAAO,CACrC,IAAMM,CAAAA,CAAQF,CAAAA,CAAQ,IAAA,CAAKD,CAAAA,CAAM,OAAO,CAAA,CACxC,GAAIG,CAAAA,CAAO,CACTH,CAAAA,CAAM,OAAA,EAAW;;AAAA,gBAAA,EAAgBE,CAAAA,CAAKC,CAAK,CAAC,CAAA,CAAA,CAC5C,KACF,CACF,CAEA,OAAOH,CACT,CAMO,SAASI,CAAAA,EAA0B,CACnCR,CAAAA,GAED,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAUS,CAAAA,EAAU,CACtCA,CAAAA,CAAM,KAAA,YAAiB,KAAA,EACzBN,CAAAA,CAAaM,CAAAA,CAAM,KAAK,EAE5B,CAAC,EACD,MAAA,CAAO,gBAAA,CAAiB,oBAAA,CAAuBA,CAAAA,EAAU,CACnDA,CAAAA,CAAM,MAAA,YAAkB,KAAA,EAC1BN,EAAaM,CAAAA,CAAM,MAAM,EAE7B,CAAC,CAAA,CAAA,CAGC,OAAO,OAAA,CAAY,GAAA,EAAe,QAAQ,EAAA,EAC5C,OAAA,CAAQ,EAAA,CAAG,mBAAA,CAAsBC,CAAAA,EAAQ,CACvCP,CAAAA,CAAaO,CAAG,EAChB,OAAA,CAAQ,KAAA,CAAMA,CAAG,CAAA,CACjB,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAAC,CAAA,EAEL","file":"chunk-4J3QBQVW.js","sourcesContent":["/**\n * Developer-friendly error hints.\n *\n * Wraps common runtime errors with actionable messages.\n * Only active in development mode.\n */\n\nconst __DEV__ = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n\ninterface ErrorHint {\n pattern: RegExp;\n hint: (match: RegExpMatchArray) => string;\n}\n\nconst HINTS: ErrorHint[] = [\n {\n // signal() called but assigned with = instead of .set()\n pattern: /Cannot set property '?(\\w+)'? of/,\n hint: (m) => `Did you try to reassign a signal? Use ${m[1]}.set(value) instead of ${m[1]} = value.`,\n },\n {\n // signal() return value used without calling it\n pattern: /(\\w+) is not a function/,\n hint: (m) => `\"${m[1]}\" may be a signal. Read it with ${m[1]}(), set it with ${m[1]}.set(value).`,\n },\n {\n // Accessing property on null/undefined (common with unloaded data)\n pattern: /Cannot read propert(?:y|ies) of (null|undefined)/,\n hint: () => `A value is null/undefined. Use optional chaining (?.) or wrap in <Show when={value()}>.`,\n },\n {\n // forEach/map on non-array (signal not unwrapped)\n pattern: /(\\w+)\\.(?:forEach|map|filter|reduce) is not a function/,\n hint: (m) => `\"${m[1]}\" might be a signal containing an array. Call ${m[1]}() first to get the value: ${m[1]}().map(...)`,\n },\n {\n // .set is not a function (calling .set on a computed or plain value)\n pattern: /(\\w+)\\.set is not a function/,\n hint: (m) => `\"${m[1]}\" is not a writable signal. Only signal() values have .set(). Computed values are read-only.`,\n },\n {\n // Maximum call stack (circular dependency)\n pattern: /Maximum call stack size exceeded/,\n hint: () => `Possible circular dependency. Check if two computed values or effects read and write to each other.`,\n },\n];\n\n/**\n * Enhance an error with a developer hint if one matches.\n */\nexport function enhanceError(error: Error): Error {\n if (!__DEV__) return error;\n\n for (const { pattern, hint } of HINTS) {\n const match = pattern.exec(error.message);\n if (match) {\n error.message += `\\n\\n💡 Hint: ${hint(match)}`;\n break;\n }\n }\n\n return error;\n}\n\n/**\n * Install global error handler that adds hints to unhandled errors.\n * Call once in your app's entry point during development.\n */\nexport function installErrorHints(): void {\n if (!__DEV__) return;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (event) => {\n if (event.error instanceof Error) {\n enhanceError(event.error);\n }\n });\n window.addEventListener('unhandledrejection', (event) => {\n if (event.reason instanceof Error) {\n enhanceError(event.reason);\n }\n });\n }\n\n if (typeof process !== 'undefined' && process.on) {\n process.on('uncaughtException', (err) => {\n enhanceError(err);\n console.error(err);\n process.exit(1);\n });\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk3AL2DVPZ_cjs=require('./chunk-3AL2DVPZ.cjs');function M(t){let n=chunk3AL2DVPZ_cjs.l(t.initial),a=chunk3AL2DVPZ_cjs.l(t.context??{}),d=chunk3AL2DVPZ_cjs.l([t.initial]),g=chunk3AL2DVPZ_cjs.m(()=>t.states[n()]?.type==="final"),y=chunk3AL2DVPZ_cjs.m(()=>{let e=t.states[n()];return e?.on?Object.keys(e.on):[]}),S=t.states[t.initial];S?.entry&&S.entry({data:a(),event:""});function E(e,i){if(g())return;let s=n(),o=t.states[s];if(!o?.on)return;let x=o.on[e];if(!x)return;let r,l,f;if(typeof x=="string")r=x;else {let T=x;r=T.target,l=T.guard,f=T.action;}let c={data:a(),event:e,payload:i};if(l&&!l(c))return;o.exit&&o.exit(c),f&&f(c,i),a.set(c.data),n.set(r),d.update(T=>[...T,r]);let v=t.states[r];v?.entry&&v.entry({data:a(),event:e});}function h(e){let i=t.states[n()];if(!i?.on)return false;let s=i.on[e];if(!s)return false;if(typeof s!="string"){let o=s;if(o.guard)return o.guard({data:a(),event:e})}return true}return {state:()=>n(),context:()=>a(),send:E,matches:e=>n()===e,done:g,reset(){n.set(t.initial),a.set(t.context??{}),d.set([t.initial]);},history:()=>d(),can:h,nextEvents:y}}exports.a=M;//# sourceMappingURL=chunk-NVZLEJXB.cjs.map
2
- //# sourceMappingURL=chunk-NVZLEJXB.cjs.map
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function M(t){let n=chunkWOZWFMOK_cjs.c(t.initial),a=chunkWOZWFMOK_cjs.c(t.context??{}),d=chunkWOZWFMOK_cjs.c([t.initial]),g=chunkWOZWFMOK_cjs.d(()=>t.states[n()]?.type==="final"),y=chunkWOZWFMOK_cjs.d(()=>{let e=t.states[n()];return e?.on?Object.keys(e.on):[]}),S=t.states[t.initial];S?.entry&&S.entry({data:a(),event:""});function E(e,i){if(g())return;let s=n(),o=t.states[s];if(!o?.on)return;let x=o.on[e];if(!x)return;let r,l,f;if(typeof x=="string")r=x;else {let T=x;r=T.target,l=T.guard,f=T.action;}let c={data:a(),event:e,payload:i};if(l&&!l(c))return;o.exit&&o.exit(c),f&&f(c,i),a.set(c.data),n.set(r),d.update(T=>[...T,r]);let v=t.states[r];v?.entry&&v.entry({data:a(),event:e});}function h(e){let i=t.states[n()];if(!i?.on)return false;let s=i.on[e];if(!s)return false;if(typeof s!="string"){let o=s;if(o.guard)return o.guard({data:a(),event:e})}return true}return {state:()=>n(),context:()=>a(),send:E,matches:e=>n()===e,done:g,reset(){n.set(t.initial),a.set(t.context??{}),d.set([t.initial]);},history:()=>d(),can:h,nextEvents:y}}exports.a=M;//# sourceMappingURL=chunk-4NQEIKH5.cjs.map
2
+ //# sourceMappingURL=chunk-4NQEIKH5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/machine.ts"],"names":["createMachine","config","currentState","signal","contextData","stateHistory","done","computed","nextEvents","stateCfg","initialStateCfg","send","event","payload","state","transition","target","guard","action","t","ctx","h","targetCfg","can"],"mappings":"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","file":"chunk-NVZLEJXB.cjs","sourcesContent":["/**\n * State machines for complex UI flows.\n *\n * Finite state machines with typed states, events, guards,\n * actions, and reactive current state signal.\n *\n * ```ts\n * const checkout = createMachine({\n * initial: 'cart',\n * states: {\n * cart: { on: { CHECKOUT: 'shipping' } },\n * shipping: { on: { NEXT: 'payment', BACK: 'cart' } },\n * payment: { on: { PAY: 'processing', BACK: 'shipping' } },\n * processing: { on: { SUCCESS: 'complete', FAIL: 'payment' } },\n * complete: { type: 'final' },\n * },\n * });\n *\n * checkout.state(); // 'cart'\n * checkout.send('CHECKOUT');\n * checkout.state(); // 'shipping'\n * checkout.matches('shipping'); // true\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface MachineConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Initial state */\n initial: TState;\n /** Initial context data */\n context?: TContext;\n /** State definitions */\n states: Record<TState, StateConfig<TState, TEvent, TContext>>;\n}\n\nexport interface StateConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Transitions: event → target state */\n on?: Partial<Record<TEvent, TState | TransitionConfig<TState, TEvent, TContext>>>;\n /** Entry action — runs when entering this state */\n entry?: (ctx: MachineContext<TContext>) => void;\n /** Exit action — runs when leaving this state */\n exit?: (ctx: MachineContext<TContext>) => void;\n /** Final state — machine stops accepting events */\n type?: 'final';\n}\n\nexport interface TransitionConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Target state */\n target: TState;\n /** Guard — transition only if this returns true */\n guard?: (ctx: MachineContext<TContext>) => boolean;\n /** Action — runs during the transition */\n action?: (ctx: MachineContext<TContext>) => void;\n}\n\nexport interface MachineContext<TContext> {\n /** The context data (mutable) */\n data: TContext;\n /** The current event that triggered the transition */\n event: string;\n /** Optional payload passed with the event via send(event, payload) */\n payload?: unknown;\n}\n\nexport interface Machine<TState extends string, TEvent extends string, TContext = unknown> {\n /** Current state (reactive signal) */\n state: ReadonlySignal<TState>;\n /** Context data (reactive signal) */\n context: ReadonlySignal<TContext>;\n /** Send an event to the machine */\n send(event: TEvent, payload?: Record<string, unknown>): void;\n /** Check if currently in a specific state */\n matches(state: TState): boolean;\n /** Whether the machine is in a final state */\n done: ReadonlySignal<boolean>;\n /** Reset to initial state */\n reset(): void;\n /** State history */\n history: ReadonlySignal<TState[]>;\n /** Can a specific event be sent in the current state? */\n can(event: TEvent): boolean;\n /** Get all possible events from current state */\n nextEvents: ReadonlySignal<TEvent[]>;\n}\n\n// =========================================================================\n// createMachine\n// =========================================================================\n\n/**\n * Create a finite state machine.\n */\nexport function createMachine<\n TState extends string,\n TEvent extends string,\n TContext = unknown,\n>(config: MachineConfig<TState, TEvent, TContext>): Machine<TState, TEvent, TContext> {\n const currentState = signal<TState>(config.initial);\n const contextData = signal<TContext>((config.context ?? {}) as TContext);\n const stateHistory = signal<TState[]>([config.initial]);\n\n const done = computed(() => {\n const stateCfg = config.states[currentState()];\n return stateCfg?.type === 'final';\n });\n\n const nextEvents = computed((): TEvent[] => {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return [];\n return Object.keys(stateCfg.on) as TEvent[];\n });\n\n // Run entry action for initial state\n const initialStateCfg = config.states[config.initial];\n if (initialStateCfg?.entry) {\n initialStateCfg.entry({ data: contextData() as TContext, event: '' });\n }\n\n function send(event: TEvent, payload?: unknown): void {\n if (done()) return; // Final state — no more transitions\n\n const state = currentState();\n const stateCfg = config.states[state];\n if (!stateCfg?.on) return;\n\n const transition = stateCfg.on[event];\n if (!transition) return;\n\n let target: TState;\n let guard: ((ctx: MachineContext<TContext>) => boolean) | undefined;\n let action: ((ctx: MachineContext<TContext>) => void) | undefined;\n\n if (typeof transition === 'string') {\n target = transition as TState;\n } else {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n target = t.target;\n guard = t.guard;\n action = t.action;\n }\n\n const ctx: MachineContext<TContext> = {\n data: contextData() as TContext,\n event,\n payload,\n };\n\n // Check guard\n if (guard && !guard(ctx)) return;\n\n // Exit action\n if (stateCfg.exit) {\n stateCfg.exit(ctx);\n }\n\n // Transition action — pass payload as second argument for convenience\n if (action) {\n (action as Function)(ctx, payload);\n }\n\n // Update context if modified\n contextData.set(ctx.data);\n\n // Enter new state\n currentState.set(target);\n stateHistory.update((h) => [...h, target]);\n\n // Entry action for new state\n const targetCfg = config.states[target];\n if (targetCfg?.entry) {\n targetCfg.entry({ data: contextData() as TContext, event });\n }\n }\n\n function can(event: TEvent): boolean {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return false;\n const transition = stateCfg.on[event];\n if (!transition) return false;\n\n if (typeof transition !== 'string') {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n if (t.guard) {\n return t.guard({ data: contextData() as TContext, event });\n }\n }\n return true;\n }\n\n return {\n state: () => currentState(),\n context: () => contextData(),\n send,\n matches: (state: TState) => currentState() === state,\n done,\n reset() {\n currentState.set(config.initial);\n contextData.set((config.context ?? {}) as TContext);\n stateHistory.set([config.initial]);\n },\n history: () => stateHistory(),\n can,\n nextEvents,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/machine.ts"],"names":["createMachine","config","currentState","signal","contextData","stateHistory","done","computed","nextEvents","stateCfg","initialStateCfg","send","event","payload","state","transition","target","guard","action","t","ctx","h","targetCfg","can"],"mappings":"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","file":"chunk-4NQEIKH5.cjs","sourcesContent":["/**\n * State machines for complex UI flows.\n *\n * Finite state machines with typed states, events, guards,\n * actions, and reactive current state signal.\n *\n * ```ts\n * const checkout = createMachine({\n * initial: 'cart',\n * states: {\n * cart: { on: { CHECKOUT: 'shipping' } },\n * shipping: { on: { NEXT: 'payment', BACK: 'cart' } },\n * payment: { on: { PAY: 'processing', BACK: 'shipping' } },\n * processing: { on: { SUCCESS: 'complete', FAIL: 'payment' } },\n * complete: { type: 'final' },\n * },\n * });\n *\n * checkout.state(); // 'cart'\n * checkout.send('CHECKOUT');\n * checkout.state(); // 'shipping'\n * checkout.matches('shipping'); // true\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface MachineConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Initial state */\n initial: TState;\n /** Initial context data */\n context?: TContext;\n /** State definitions */\n states: Record<TState, StateConfig<TState, TEvent, TContext>>;\n}\n\nexport interface StateConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Transitions: event → target state */\n on?: Partial<Record<TEvent, TState | TransitionConfig<TState, TEvent, TContext>>>;\n /** Entry action — runs when entering this state */\n entry?: (ctx: MachineContext<TContext>) => void;\n /** Exit action — runs when leaving this state */\n exit?: (ctx: MachineContext<TContext>) => void;\n /** Final state — machine stops accepting events */\n type?: 'final';\n}\n\nexport interface TransitionConfig<TState extends string, TEvent extends string, TContext = unknown> {\n /** Target state */\n target: TState;\n /** Guard — transition only if this returns true */\n guard?: (ctx: MachineContext<TContext>) => boolean;\n /** Action — runs during the transition */\n action?: (ctx: MachineContext<TContext>) => void;\n}\n\nexport interface MachineContext<TContext> {\n /** The context data (mutable) */\n data: TContext;\n /** The current event that triggered the transition */\n event: string;\n /** Optional payload passed with the event via send(event, payload) */\n payload?: unknown;\n}\n\nexport interface Machine<TState extends string, TEvent extends string, TContext = unknown> {\n /** Current state (reactive signal) */\n state: ReadonlySignal<TState>;\n /** Context data (reactive signal) */\n context: ReadonlySignal<TContext>;\n /** Send an event to the machine */\n send(event: TEvent, payload?: Record<string, unknown>): void;\n /** Check if currently in a specific state */\n matches(state: TState): boolean;\n /** Whether the machine is in a final state */\n done: ReadonlySignal<boolean>;\n /** Reset to initial state */\n reset(): void;\n /** State history */\n history: ReadonlySignal<TState[]>;\n /** Can a specific event be sent in the current state? */\n can(event: TEvent): boolean;\n /** Get all possible events from current state */\n nextEvents: ReadonlySignal<TEvent[]>;\n}\n\n// =========================================================================\n// createMachine\n// =========================================================================\n\n/**\n * Create a finite state machine.\n */\nexport function createMachine<\n TState extends string,\n TEvent extends string,\n TContext = unknown,\n>(config: MachineConfig<TState, TEvent, TContext>): Machine<TState, TEvent, TContext> {\n const currentState = signal<TState>(config.initial);\n const contextData = signal<TContext>((config.context ?? {}) as TContext);\n const stateHistory = signal<TState[]>([config.initial]);\n\n const done = computed(() => {\n const stateCfg = config.states[currentState()];\n return stateCfg?.type === 'final';\n });\n\n const nextEvents = computed((): TEvent[] => {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return [];\n return Object.keys(stateCfg.on) as TEvent[];\n });\n\n // Run entry action for initial state\n const initialStateCfg = config.states[config.initial];\n if (initialStateCfg?.entry) {\n initialStateCfg.entry({ data: contextData() as TContext, event: '' });\n }\n\n function send(event: TEvent, payload?: unknown): void {\n if (done()) return; // Final state — no more transitions\n\n const state = currentState();\n const stateCfg = config.states[state];\n if (!stateCfg?.on) return;\n\n const transition = stateCfg.on[event];\n if (!transition) return;\n\n let target: TState;\n let guard: ((ctx: MachineContext<TContext>) => boolean) | undefined;\n let action: ((ctx: MachineContext<TContext>) => void) | undefined;\n\n if (typeof transition === 'string') {\n target = transition as TState;\n } else {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n target = t.target;\n guard = t.guard;\n action = t.action;\n }\n\n const ctx: MachineContext<TContext> = {\n data: contextData() as TContext,\n event,\n payload,\n };\n\n // Check guard\n if (guard && !guard(ctx)) return;\n\n // Exit action\n if (stateCfg.exit) {\n stateCfg.exit(ctx);\n }\n\n // Transition action — pass payload as second argument for convenience\n if (action) {\n (action as Function)(ctx, payload);\n }\n\n // Update context if modified\n contextData.set(ctx.data);\n\n // Enter new state\n currentState.set(target);\n stateHistory.update((h) => [...h, target]);\n\n // Entry action for new state\n const targetCfg = config.states[target];\n if (targetCfg?.entry) {\n targetCfg.entry({ data: contextData() as TContext, event });\n }\n }\n\n function can(event: TEvent): boolean {\n const stateCfg = config.states[currentState()];\n if (!stateCfg?.on) return false;\n const transition = stateCfg.on[event];\n if (!transition) return false;\n\n if (typeof transition !== 'string') {\n const t = transition as TransitionConfig<TState, TEvent, TContext>;\n if (t.guard) {\n return t.guard({ data: contextData() as TContext, event });\n }\n }\n return true;\n }\n\n return {\n state: () => currentState(),\n context: () => contextData(),\n send,\n matches: (state: TState) => currentState() === state,\n done,\n reset() {\n currentState.set(config.initial);\n contextData.set((config.context ?? {}) as TContext);\n stateHistory.set([config.initial]);\n },\n history: () => stateHistory(),\n can,\n nextEvents,\n };\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';var r=typeof process>"u"||process.env?.NODE_ENV!=="production",o=[{pattern:/Cannot set property '?(\w+)'? of/,hint:e=>`Did you try to reassign a signal? Use ${e[1]}.set(value) instead of ${e[1]} = value.`},{pattern:/(\w+) is not a function/,hint:e=>`"${e[1]}" may be a signal. Read it with ${e[1]}(), set it with ${e[1]}.set(value).`},{pattern:/Cannot read propert(?:y|ies) of (null|undefined)/,hint:()=>"A value is null/undefined. Use optional chaining (?.) or wrap in <Show when={value()}>."},{pattern:/(\w+)\.(?:forEach|map|filter|reduce) is not a function/,hint:e=>`"${e[1]}" might be a signal containing an array. Call ${e[1]}() first to get the value: ${e[1]}().map(...)`},{pattern:/(\w+)\.set is not a function/,hint:e=>`"${e[1]}" is not a writable signal. Only signal() values have .set(). Computed values are read-only.`},{pattern:/Maximum call stack size exceeded/,hint:()=>"Possible circular dependency. Check if two computed values or effects read and write to each other."}];function n(e){if(!r)return e;for(let{pattern:i,hint:a}of o){let t=i.exec(e.message);if(t){e.message+=`
2
+
3
+ \u{1F4A1} Hint: ${a(t)}`;break}}return e}function s(){r&&(typeof window<"u"&&(window.addEventListener("error",e=>{e.error instanceof Error&&n(e.error);}),window.addEventListener("unhandledrejection",e=>{e.reason instanceof Error&&n(e.reason);})),typeof process<"u"&&process.on&&process.on("uncaughtException",e=>{n(e),console.error(e),process.exit(1);}));}exports.a=n;exports.b=s;//# sourceMappingURL=chunk-5QCWH6QA.cjs.map
4
+ //# sourceMappingURL=chunk-5QCWH6QA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error-hints.ts"],"names":["__DEV__","HINTS","m","enhanceError","error","pattern","hint","match","installErrorHints","event","err"],"mappings":"aAOA,IAAMA,CAAAA,CAAU,OAAO,OAAA,CAAY,GAAA,EAAe,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,YAAA,CAOtEC,CAAAA,CAAqB,CACzB,CAEE,OAAA,CAAS,kCAAA,CACT,KAAOC,CAAAA,EAAM,CAAA,sCAAA,EAAyCA,CAAAA,CAAE,CAAC,CAAC,CAAA,uBAAA,EAA0BA,CAAAA,CAAE,CAAC,CAAC,CAAA,SAAA,CAC1F,CAAA,CACA,CAEE,OAAA,CAAS,yBAAA,CACT,KAAOA,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAC,CAAA,gCAAA,EAAmCA,CAAAA,CAAE,CAAC,CAAC,CAAA,gBAAA,EAAmBA,CAAAA,CAAE,CAAC,CAAC,CAAA,YAAA,CACrF,CAAA,CACA,CAEE,OAAA,CAAS,kDAAA,CACT,IAAA,CAAM,IAAM,yFACd,CAAA,CACA,CAEE,OAAA,CAAS,wDAAA,CACT,IAAA,CAAOA,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAC,CAAA,8CAAA,EAAiDA,CAAAA,CAAE,CAAC,CAAC,CAAA,2BAAA,EAA8BA,CAAAA,CAAE,CAAC,CAAC,CAAA,WAAA,CAC9G,CAAA,CACA,CAEE,OAAA,CAAS,8BAAA,CACT,IAAA,CAAOA,GAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,CAAC,CAAC,CAAA,4FAAA,CACvB,CAAA,CACA,CAEE,OAAA,CAAS,kCAAA,CACT,IAAA,CAAM,IAAM,qGACd,CACF,CAAA,CAKO,SAASC,CAAAA,CAAaC,CAAAA,CAAqB,CAChD,GAAI,CAACJ,CAAAA,CAAS,OAAOI,CAAAA,CAErB,IAAA,GAAW,CAAE,OAAA,CAAAC,CAAAA,CAAS,IAAA,CAAAC,CAAK,CAAA,GAAKL,CAAAA,CAAO,CACrC,IAAMM,CAAAA,CAAQF,CAAAA,CAAQ,IAAA,CAAKD,CAAAA,CAAM,OAAO,CAAA,CACxC,GAAIG,CAAAA,CAAO,CACTH,CAAAA,CAAM,OAAA,EAAW;;AAAA,gBAAA,EAAgBE,CAAAA,CAAKC,CAAK,CAAC,CAAA,CAAA,CAC5C,KACF,CACF,CAEA,OAAOH,CACT,CAMO,SAASI,CAAAA,EAA0B,CACnCR,CAAAA,GAED,OAAO,MAAA,CAAW,GAAA,GACpB,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAUS,CAAAA,EAAU,CACtCA,CAAAA,CAAM,KAAA,YAAiB,KAAA,EACzBN,CAAAA,CAAaM,CAAAA,CAAM,KAAK,EAE5B,CAAC,EACD,MAAA,CAAO,gBAAA,CAAiB,oBAAA,CAAuBA,CAAAA,EAAU,CACnDA,CAAAA,CAAM,MAAA,YAAkB,KAAA,EAC1BN,EAAaM,CAAAA,CAAM,MAAM,EAE7B,CAAC,CAAA,CAAA,CAGC,OAAO,OAAA,CAAY,GAAA,EAAe,QAAQ,EAAA,EAC5C,OAAA,CAAQ,EAAA,CAAG,mBAAA,CAAsBC,CAAAA,EAAQ,CACvCP,CAAAA,CAAaO,CAAG,EAChB,OAAA,CAAQ,KAAA,CAAMA,CAAG,CAAA,CACjB,OAAA,CAAQ,IAAA,CAAK,CAAC,EAChB,CAAC,CAAA,EAEL","file":"chunk-5QCWH6QA.cjs","sourcesContent":["/**\n * Developer-friendly error hints.\n *\n * Wraps common runtime errors with actionable messages.\n * Only active in development mode.\n */\n\nconst __DEV__ = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n\ninterface ErrorHint {\n pattern: RegExp;\n hint: (match: RegExpMatchArray) => string;\n}\n\nconst HINTS: ErrorHint[] = [\n {\n // signal() called but assigned with = instead of .set()\n pattern: /Cannot set property '?(\\w+)'? of/,\n hint: (m) => `Did you try to reassign a signal? Use ${m[1]}.set(value) instead of ${m[1]} = value.`,\n },\n {\n // signal() return value used without calling it\n pattern: /(\\w+) is not a function/,\n hint: (m) => `\"${m[1]}\" may be a signal. Read it with ${m[1]}(), set it with ${m[1]}.set(value).`,\n },\n {\n // Accessing property on null/undefined (common with unloaded data)\n pattern: /Cannot read propert(?:y|ies) of (null|undefined)/,\n hint: () => `A value is null/undefined. Use optional chaining (?.) or wrap in <Show when={value()}>.`,\n },\n {\n // forEach/map on non-array (signal not unwrapped)\n pattern: /(\\w+)\\.(?:forEach|map|filter|reduce) is not a function/,\n hint: (m) => `\"${m[1]}\" might be a signal containing an array. Call ${m[1]}() first to get the value: ${m[1]}().map(...)`,\n },\n {\n // .set is not a function (calling .set on a computed or plain value)\n pattern: /(\\w+)\\.set is not a function/,\n hint: (m) => `\"${m[1]}\" is not a writable signal. Only signal() values have .set(). Computed values are read-only.`,\n },\n {\n // Maximum call stack (circular dependency)\n pattern: /Maximum call stack size exceeded/,\n hint: () => `Possible circular dependency. Check if two computed values or effects read and write to each other.`,\n },\n];\n\n/**\n * Enhance an error with a developer hint if one matches.\n */\nexport function enhanceError(error: Error): Error {\n if (!__DEV__) return error;\n\n for (const { pattern, hint } of HINTS) {\n const match = pattern.exec(error.message);\n if (match) {\n error.message += `\\n\\n💡 Hint: ${hint(match)}`;\n break;\n }\n }\n\n return error;\n}\n\n/**\n * Install global error handler that adds hints to unhandled errors.\n * Call once in your app's entry point during development.\n */\nexport function installErrorHints(): void {\n if (!__DEV__) return;\n\n if (typeof window !== 'undefined') {\n window.addEventListener('error', (event) => {\n if (event.error instanceof Error) {\n enhanceError(event.error);\n }\n });\n window.addEventListener('unhandledrejection', (event) => {\n if (event.reason instanceof Error) {\n enhanceError(event.reason);\n }\n });\n }\n\n if (typeof process !== 'undefined' && process.on) {\n process.on('uncaughtException', (err) => {\n enhanceError(err);\n console.error(err);\n process.exit(1);\n });\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var k=chunkXWVNLE2W_cjs.s(u=>{let o=chunkWOZWFMOK_cjs.c(false),a=chunkWOZWFMOK_cjs.c(false);return ()=>{let{src:b,alt:y,width:s,height:i,loading:l="lazy",srcset:c,sizes:d,placeholder:v,blurDataUrl:p,class:m,fallbackSrc:f,onLoad:E,onError:w}=u.props,r=document.createElement("div");if(r.style.position="relative",r.style.display="inline-block",r.style.overflow="hidden",s&&(r.style.width=`${s}px`),i&&(r.style.height=`${i}px`),v==="blur"&&p&&!o()){let t=document.createElement("img");t.src=p,t.alt="",t.setAttribute("aria-hidden","true"),t.style.cssText="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:blur(20px);transform:scale(1.1);",r.appendChild(t);}let e=document.createElement("img");if(e.alt=y,e.loading=l,a()&&f?e.src=f:e.src=b,c&&(e.srcset=c),d&&(e.sizes=d),s&&(e.width=s),i&&(e.height=i),m&&(e.className=m),e.style.display="block",e.style.width="100%",e.style.height="auto",e.addEventListener("load",()=>{o.set(true),E?.();}),e.addEventListener("error",t=>{a.set(true),w?.(t);}),l==="lazy"&&typeof IntersectionObserver<"u"){e.setAttribute("data-src",e.src);let t=e.src;e.removeAttribute("src");let g=new IntersectionObserver(x=>{x[0].isIntersecting&&(e.src=t,g.disconnect());},{rootMargin:"200px"});requestAnimationFrame(()=>{e.parentElement?g.observe(e):e.src=t;});}return r.appendChild(e),r}});exports.a=k;//# sourceMappingURL=chunk-6O46EMQS.cjs.map
2
+ //# sourceMappingURL=chunk-6O46EMQS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/image.ts"],"names":["Image","defineComponent","ctx","loaded","signal","errored","src","alt","width","height","loading","srcset","sizes","placeholder","blurDataUrl","className","fallbackSrc","onLoad","onErrorCb","wrapper","blur","img","e","actualSrc","observer","entries"],"mappings":"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","file":"chunk-6O46EMQS.cjs","sourcesContent":["/**\n * <Image> component.\n *\n * Optimized image rendering with lazy loading, srcset/sizes,\n * blur placeholder, and error fallback.\n *\n * ```html\n * <Image\n * src=\"/photos/hero.jpg\"\n * alt=\"Hero image\"\n * width={800}\n * height={600}\n * placeholder=\"blur\"\n * blurDataUrl=\"data:image/jpeg;base64,...\"\n * srcset=\"/photos/hero-400.jpg 400w, /photos/hero-800.jpg 800w\"\n * sizes=\"(max-width: 600px) 400px, 800px\"\n * loading=\"lazy\"\n * />\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\n\n// --- Types ---\n\nexport interface ImageProps {\n /** Image source URL */\n src: string;\n /** Alt text (required for accessibility) */\n alt: string;\n /** Width in pixels */\n width?: number;\n /** Height in pixels */\n height?: number;\n /** Loading strategy (default: 'lazy') */\n loading?: 'lazy' | 'eager';\n /** Srcset for responsive images */\n srcset?: string;\n /** Sizes attribute for responsive images */\n sizes?: string;\n /** Placeholder strategy */\n placeholder?: 'blur' | 'empty';\n /** Base64 data URL for blur placeholder */\n blurDataUrl?: string;\n /** CSS class */\n class?: string;\n /** Error fallback image URL */\n fallbackSrc?: string;\n /** Callback when image loads */\n onLoad?: () => void;\n /** Callback when image fails to load */\n onError?: (error: Event) => void;\n}\n\n// --- Component ---\n\nexport const Image = defineComponent<ImageProps>((ctx) => {\n const loaded = signal(false);\n const errored = signal(false);\n\n return () => {\n const {\n src,\n alt,\n width,\n height,\n loading = 'lazy',\n srcset,\n sizes,\n placeholder,\n blurDataUrl,\n class: className,\n fallbackSrc,\n onLoad,\n onError: onErrorCb,\n } = ctx.props;\n\n // Wrapper for placeholder\n const wrapper = document.createElement('div');\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n wrapper.style.overflow = 'hidden';\n if (width) wrapper.style.width = `${width}px`;\n if (height) wrapper.style.height = `${height}px`;\n\n // Blur placeholder\n if (placeholder === 'blur' && blurDataUrl && !loaded()) {\n const blur = document.createElement('img');\n blur.src = blurDataUrl;\n blur.alt = '';\n blur.setAttribute('aria-hidden', 'true');\n blur.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;object-fit:cover;filter:blur(20px);transform:scale(1.1);';\n wrapper.appendChild(blur);\n }\n\n // Main image\n const img = document.createElement('img');\n img.alt = alt;\n img.loading = loading;\n\n if (errored() && fallbackSrc) {\n img.src = fallbackSrc;\n } else {\n img.src = src;\n }\n\n if (srcset) img.srcset = srcset;\n if (sizes) img.sizes = sizes;\n if (width) img.width = width;\n if (height) img.height = height;\n if (className) img.className = className;\n\n img.style.display = 'block';\n img.style.width = '100%';\n img.style.height = 'auto';\n\n img.addEventListener('load', () => {\n loaded.set(true);\n onLoad?.();\n });\n\n img.addEventListener('error', (e) => {\n errored.set(true);\n onErrorCb?.(e);\n });\n\n // Intersection Observer for lazy loading (fallback for browsers without native lazy)\n if (loading === 'lazy' && typeof IntersectionObserver !== 'undefined') {\n img.setAttribute('data-src', img.src);\n const actualSrc = img.src;\n img.removeAttribute('src');\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting) {\n img.src = actualSrc;\n observer.disconnect();\n }\n },\n { rootMargin: '200px' },\n );\n\n // Observe after appended to DOM\n requestAnimationFrame(() => {\n if (img.parentElement) {\n observer.observe(img);\n } else {\n // Fallback: set src immediately\n img.src = actualSrc;\n }\n });\n }\n\n wrapper.appendChild(img);\n return wrapper;\n };\n});\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function E(r){let{data:n,columns:l,pageSize:s=0,initialSort:x}=r,i=chunkWOZWFMOK_cjs.c(x??{column:null,direction:null}),f=chunkWOZWFMOK_cjs.c(""),o=chunkWOZWFMOK_cjs.c(1),m=chunkWOZWFMOK_cjs.c(Object.fromEntries(l.map(e=>[e.key,e.visible!==false]))),C=chunkWOZWFMOK_cjs.d(()=>{let e=m();return l.filter(t=>e[t.key])}),T=chunkWOZWFMOK_cjs.d(()=>{let e=f().toLowerCase().trim();if(!e)return n();let t=l.filter(a=>a.filterable),d=t.length>0?t:l;return n().filter(a=>d.some(c=>{let p=b(a,c.key);return String(p).toLowerCase().includes(e)}))}),v=chunkWOZWFMOK_cjs.d(()=>{let{column:e,direction:t}=i(),d=[...T()];if(!e||!t)return d;let a=l.find(c=>c.key===e);return a?d.sort((c,p)=>{if(a.compare){let R=a.compare(c,p);return t==="desc"?-R:R}let O=b(c,e),j=b(p,e),y=z(O,j);return t==="desc"?-y:y}):d}),w=chunkWOZWFMOK_cjs.d(()=>T().length),S=chunkWOZWFMOK_cjs.d(()=>s<=0?1:Math.max(1,Math.ceil(w()/s))),h=chunkWOZWFMOK_cjs.d(()=>{let e=v();if(s<=0)return e;let t=(o()-1)*s;return e.slice(t,t+s)});function D(e){let t=i();t.column===e?t.direction==="asc"?i.set({column:e,direction:"desc"}):t.direction==="desc"?i.set({column:null,direction:null}):i.set({column:e,direction:"asc"}):i.set({column:e,direction:"asc"}),o.set(1);}function k(e){f.set(e),o.set(1);}function P(e){m.update(t=>({...t,[e]:!t[e]}));}function M(e){m.update(t=>({...t,[e]:true}));}function V(e){m.update(t=>({...t,[e]:false}));}return {rows:h,allRows:v,totalRows:w,visibleColumns:C,sortState:()=>i(),filterText:()=>f(),page:()=>o(),totalPages:S,sort:D,filter:k,toggleColumn:P,showColumn:M,hideColumn:V,nextPage(){o()<S()&&o.update(e=>e+1);},prevPage(){o()>1&&o.update(e=>e-1);},goToPage(e){o.set(Math.max(1,Math.min(e,S())));},reset(){i.set({column:null,direction:null}),f.set(""),o.set(1);}}}function b(r,n){return n.split(".").reduce((l,s)=>l?.[s],r)}function z(r,n){return r==null&&n==null?0:r==null?-1:n==null?1:typeof r=="number"&&typeof n=="number"?r-n:String(r).localeCompare(String(n))}exports.a=E;//# sourceMappingURL=chunk-7IJUJUXE.cjs.map
2
+ //# sourceMappingURL=chunk-7IJUJUXE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-table.ts"],"names":["createDataTable","options","data","columns","pageSize","initialSort","sortState","signal","filterText","page","columnVisibility","c","visibleColumns","computed","vis","filteredRows","text","filterableCols","colsToSearch","row","col","value","getNestedValue","sortedRows","column","direction","rows","colDef","a","b","result","aVal","bVal","defaultCompare","totalRows","totalPages","paginatedRows","all","start","sort","columnKey","current","filter","toggleColumn","key","showColumn","hideColumn","p","obj","path","o","k"],"mappings":"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","file":"chunk-7IJUJUXE.cjs","sourcesContent":["/**\n * Headless data table.\n *\n * Signal-based table state management with sorting, filtering,\n * column visibility, and pagination integration. No DOM — just logic.\n *\n * ```ts\n * const table = createDataTable({\n * data: () => users(),\n * columns: [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true, filterable: true },\n * { key: 'age', header: 'Age', sortable: true },\n * ],\n * pageSize: 20,\n * });\n *\n * table.rows(); // current page of sorted/filtered data\n * table.sort('name'); // toggle sort by column\n * table.filter('search term');\n * table.toggleColumn('age');\n * table.nextPage();\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface ColumnDef<T> {\n /** Key to access the data (dot notation supported) */\n key: string;\n /** Display header */\n header: string;\n /** Whether this column is sortable (default: false) */\n sortable?: boolean;\n /** Whether this column is searchable by the global filter (default: false) */\n filterable?: boolean;\n /** Custom sort comparator */\n compare?: (a: T, b: T) => number;\n /** Custom cell value accessor */\n accessor?: (row: T) => unknown;\n /** Whether column is visible by default (default: true) */\n visible?: boolean;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface DataTableOptions<T> {\n /** Reactive data source */\n data: () => T[];\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Page size (0 = no pagination) */\n pageSize?: number;\n /** Initial sort */\n initialSort?: SortState;\n}\n\nexport interface DataTable<T> {\n /** Current page of processed (sorted + filtered) rows */\n rows: ReadonlySignal<T[]>;\n /** All processed rows (before pagination) */\n allRows: ReadonlySignal<T[]>;\n /** Total row count after filtering */\n totalRows: ReadonlySignal<number>;\n /** Visible columns */\n visibleColumns: ReadonlySignal<ColumnDef<T>[]>;\n /** Current sort state */\n sortState: ReadonlySignal<SortState>;\n /** Current filter text */\n filterText: ReadonlySignal<string>;\n /** Current page (1-based) */\n page: ReadonlySignal<number>;\n /** Total pages */\n totalPages: ReadonlySignal<number>;\n /** Toggle or set sort on a column */\n sort(columnKey: string): void;\n /** Set the global filter text */\n filter(text: string): void;\n /** Toggle column visibility */\n toggleColumn(columnKey: string): void;\n /** Show a column */\n showColumn(columnKey: string): void;\n /** Hide a column */\n hideColumn(columnKey: string): void;\n /** Go to next page */\n nextPage(): void;\n /** Go to previous page */\n prevPage(): void;\n /** Go to specific page */\n goToPage(page: number): void;\n /** Reset all state (sort, filter, page) */\n reset(): void;\n}\n\n// --- Implementation ---\n\nexport function createDataTable<T extends Record<string, unknown>>(\n options: DataTableOptions<T>,\n): DataTable<T> {\n const { data, columns, pageSize = 0, initialSort } = options;\n\n const sortState = signal<SortState>(initialSort ?? { column: null, direction: null });\n const filterText = signal('');\n const page = signal(1);\n const columnVisibility = signal<Record<string, boolean>>(\n Object.fromEntries(columns.map((c) => [c.key, c.visible !== false])),\n );\n\n // Visible columns\n const visibleColumns = computed(() => {\n const vis = columnVisibility();\n return columns.filter((c) => vis[c.key]);\n });\n\n // Filtered rows\n const filteredRows = computed(() => {\n const text = filterText().toLowerCase().trim();\n if (!text) return data();\n\n // If no columns explicitly marked filterable, filter all columns\n const filterableCols = columns.filter((c) => c.filterable);\n const colsToSearch = filterableCols.length > 0 ? filterableCols : columns;\n\n return data().filter((row) => {\n return colsToSearch.some((col) => {\n const value = getNestedValue(row, col.key);\n return String(value).toLowerCase().includes(text);\n });\n });\n });\n\n // Sorted rows\n const sortedRows = computed(() => {\n const { column, direction } = sortState();\n const rows = [...filteredRows()];\n\n if (!column || !direction) return rows;\n\n const colDef = columns.find((c) => c.key === column);\n if (!colDef) return rows;\n\n return rows.sort((a, b) => {\n if (colDef.compare) {\n const result = colDef.compare(a, b);\n return direction === 'desc' ? -result : result;\n }\n\n const aVal = getNestedValue(a, column);\n const bVal = getNestedValue(b, column);\n const result = defaultCompare(aVal, bVal);\n return direction === 'desc' ? -result : result;\n });\n });\n\n // Total rows after filtering\n const totalRows = computed(() => filteredRows().length);\n\n // Total pages\n const totalPages = computed(() => {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(totalRows() / pageSize));\n });\n\n // Paginated rows\n const paginatedRows = computed(() => {\n const all = sortedRows();\n if (pageSize <= 0) return all;\n const start = (page() - 1) * pageSize;\n return all.slice(start, start + pageSize);\n });\n\n // --- Actions ---\n\n function sort(columnKey: string): void {\n const current = sortState();\n if (current.column === columnKey) {\n // Cycle: asc → desc → none\n if (current.direction === 'asc') {\n sortState.set({ column: columnKey, direction: 'desc' });\n } else if (current.direction === 'desc') {\n sortState.set({ column: null, direction: null });\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n page.set(1);\n }\n\n function filter(text: string): void {\n filterText.set(text);\n page.set(1);\n }\n\n function toggleColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: !vis[key] }));\n }\n\n function showColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: true }));\n }\n\n function hideColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: false }));\n }\n\n return {\n rows: paginatedRows,\n allRows: sortedRows,\n totalRows,\n visibleColumns,\n sortState: () => sortState(),\n filterText: () => filterText(),\n page: () => page(),\n totalPages,\n sort,\n filter,\n toggleColumn,\n showColumn,\n hideColumn,\n nextPage() { if (page() < totalPages()) page.update((p) => p + 1); },\n prevPage() { if (page() > 1) page.update((p) => p - 1); },\n goToPage(p: number) { page.set(Math.max(1, Math.min(p, totalPages()))); },\n reset() {\n sortState.set({ column: null, direction: null });\n filterText.set('');\n page.set(1);\n },\n };\n}\n\n// --- Helpers ---\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((o: any, k) => o?.[k], obj);\n}\n\nfunction defaultCompare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b));\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function a(e,t){return n=>{t.self&&n.target!==n.currentTarget||(t.preventDefault&&n.preventDefault(),t.stopPropagation&&n.stopPropagation(),t.stopImmediatePropagation&&n.stopImmediatePropagation?.(),e(n));}}function f(e,t,n,o={}){let r=a(n,o),i={once:o.once,capture:o.capture,passive:o.passive};return e.addEventListener(t,r,i),()=>e.removeEventListener(t,r,i)}function g(e){let t=chunkWOZWFMOK_cjs.c(e.clientWidth),n=chunkWOZWFMOK_cjs.c(e.clientHeight);return typeof ResizeObserver<"u"&&new ResizeObserver(r=>{let i=r[0];i&&(t.set(i.contentRect.width),n.set(i.contentRect.height));}).observe(e),{width:()=>t(),height:()=>n()}}function b(e){let t=e??(typeof window<"u"?window:null),n=chunkWOZWFMOK_cjs.c(e?e.scrollLeft:window?.scrollX??0),o=chunkWOZWFMOK_cjs.c(e?e.scrollTop:window?.scrollY??0);if(t){let s=()=>{e?(n.set(e.scrollLeft),o.set(e.scrollTop)):(n.set(window.scrollX),o.set(window.scrollY));};t.addEventListener("scroll",s,{passive:true});}let r=o.set;o.set=s=>{r(s),e?e.scrollTop=s:window?.scrollTo(window.scrollX,s);};let i=n.set;return n.set=s=>{i(s),e?e.scrollLeft=s:window?.scrollTo(s,window.scrollY);},{scrollX:n,scrollY:o}}function m(){return chunkWOZWFMOK_cjs.c(null)}function E(e){return chunkWOZWFMOK_cjs.c(null)}function v(e,t,n){e.name=typeof n=="string"?n:"",e.addEventListener("change",()=>{e.checked&&t.set(n);}),chunkWOZWFMOK_cjs.e(()=>{e.checked=t()===n;});}function d(e,t,n){return chunkWOZWFMOK_cjs.e(()=>{n()?e.classList.add(t):e.classList.remove(t);})}function w(e,t){let n=Object.entries(t).map(([o,r])=>d(e,o,r));return ()=>n.forEach(o=>o())}function p(e,t,n){let o=t.replace(/[A-Z]/g,r=>`-${r.toLowerCase()}`);return chunkWOZWFMOK_cjs.e(()=>{let r=n();r==null?e.style.removeProperty(o):e.style.setProperty(o,typeof r=="number"?`${r}px`:String(r));})}function T(e,t){let n=Object.entries(t).map(([o,r])=>p(e,o,r));return ()=>n.forEach(o=>o())}exports.a=a;exports.b=f;exports.c=g;exports.d=b;exports.e=m;exports.f=E;exports.g=v;exports.h=d;exports.i=w;exports.j=p;exports.k=T;//# sourceMappingURL=chunk-7UX5CSGZ.cjs.map
2
+ //# sourceMappingURL=chunk-7UX5CSGZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event-modifiers.ts"],"names":["withModifiers","handler","modifiers","e","onEvent","el","event","wrapped","listenerOptions","bindDimensions","width","signal","height","entries","entry","bindScroll","target","scrollX","scrollY","originalSetY","value","originalSetX","bindElement","bindGroup","name","bindGroupItem","group","effect","bindClass","className","condition","bindClasses","classes","disposers","cls","d","bindStyle","property","kebab","m","v","bindStyles","styles","prop","valueFn"],"mappings":"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","file":"chunk-7UX5CSGZ.cjs","sourcesContent":["/**\n * Event modifiers and extended bind/class/style directives.\n *\n * Modifiers: onClick|preventDefault|stopPropagation|once|self|capture\n * Extended binds: bind:clientWidth, bind:scrollY, bind:group, bind:this\n * Class directive: class:active={isActive}\n * Style directive: style:color={textColor}\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Event modifiers\n// =========================================================================\n\nexport interface EventModifiers {\n preventDefault?: boolean;\n stopPropagation?: boolean;\n stopImmediatePropagation?: boolean;\n once?: boolean;\n capture?: boolean;\n passive?: boolean;\n self?: boolean;\n}\n\n/**\n * Wrap an event handler with modifiers.\n *\n * ```ts\n * const handler = withModifiers(onClick, {\n * preventDefault: true,\n * stopPropagation: true,\n * once: true,\n * });\n * el.addEventListener('click', handler);\n * ```\n */\nexport function withModifiers<E extends Event>(\n handler: (e: E) => void,\n modifiers: EventModifiers,\n): (e: E) => void {\n return (e: E) => {\n if (modifiers.self && e.target !== e.currentTarget) return;\n if (modifiers.preventDefault) e.preventDefault();\n if (modifiers.stopPropagation) e.stopPropagation();\n if (modifiers.stopImmediatePropagation) (e as any).stopImmediatePropagation?.();\n handler(e);\n };\n}\n\n/**\n * Attach an event handler with modifiers to an element.\n *\n * ```ts\n * onEvent(el, 'click', handler, { preventDefault: true, once: true });\n * ```\n */\nexport function onEvent<K extends keyof HTMLElementEventMap>(\n el: HTMLElement,\n event: K,\n handler: (e: HTMLElementEventMap[K]) => void,\n modifiers: EventModifiers = {},\n): () => void {\n const wrapped = withModifiers(handler, modifiers);\n const listenerOptions: AddEventListenerOptions = {\n once: modifiers.once,\n capture: modifiers.capture,\n passive: modifiers.passive,\n };\n\n el.addEventListener(event, wrapped as EventListener, listenerOptions);\n return () => el.removeEventListener(event, wrapped as EventListener, listenerOptions);\n}\n\n// =========================================================================\n// Extended bind directives\n// =========================================================================\n\n/**\n * Bind element dimensions to signals (read-only, auto-updating).\n *\n * ```ts\n * const { width, height } = bindDimensions(el);\n * width(); // tracks clientWidth\n * ```\n */\nexport function bindDimensions(el: HTMLElement): {\n width: ReadonlySignal<number>;\n height: ReadonlySignal<number>;\n} {\n const width = signal(el.clientWidth);\n const height = signal(el.clientHeight);\n\n if (typeof ResizeObserver !== 'undefined') {\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n width.set(entry.contentRect.width);\n height.set(entry.contentRect.height);\n }\n });\n observer.observe(el);\n }\n\n return {\n width: () => width(),\n height: () => height(),\n };\n}\n\n/**\n * Bind scroll position to signals.\n *\n * ```ts\n * const { scrollX, scrollY } = bindScroll(el);\n * // or for window:\n * const { scrollX, scrollY } = bindScroll();\n * ```\n */\nexport function bindScroll(el?: HTMLElement): {\n scrollX: Signal<number>;\n scrollY: Signal<number>;\n} {\n const target = el ?? (typeof window !== 'undefined' ? window : null);\n const scrollX = signal(el ? el.scrollLeft : (window?.scrollX ?? 0));\n const scrollY = signal(el ? el.scrollTop : (window?.scrollY ?? 0));\n\n if (target) {\n const handler = () => {\n if (el) {\n scrollX.set(el.scrollLeft);\n scrollY.set(el.scrollTop);\n } else {\n scrollX.set(window.scrollX);\n scrollY.set(window.scrollY);\n }\n };\n (target as any).addEventListener('scroll', handler, { passive: true });\n }\n\n // Also allow setting scroll position\n const originalSetY = scrollY.set;\n scrollY.set = (value: number) => {\n originalSetY(value);\n if (el) el.scrollTop = value;\n else window?.scrollTo(window.scrollX, value);\n };\n\n const originalSetX = scrollX.set;\n scrollX.set = (value: number) => {\n originalSetX(value);\n if (el) el.scrollLeft = value;\n else window?.scrollTo(value, window.scrollY);\n };\n\n return { scrollX, scrollY };\n}\n\n/**\n * Bind a signal to an element reference (like bind:this in Svelte).\n *\n * ```ts\n * const myRef = bindElement<HTMLInputElement>();\n * // In render: myRef.set(inputEl);\n * myRef()?.focus();\n * ```\n */\nexport function bindElement<T extends HTMLElement = HTMLElement>(): Signal<T | null> {\n return signal<T | null>(null);\n}\n\n/**\n * Bind a group of radio/checkbox inputs to a signal.\n *\n * ```ts\n * const selected = bindGroup<string>('color');\n * // Apply to each radio: bindGroupItem(radioEl, selected, 'red');\n * ```\n */\nexport function bindGroup<T>(name: string): Signal<T | null> {\n return signal<T | null>(null);\n}\n\nexport function bindGroupItem<T>(\n el: HTMLInputElement,\n group: Signal<T | null>,\n value: T,\n): void {\n el.name = typeof value === 'string' ? value : '';\n el.addEventListener('change', () => {\n if (el.checked) group.set(value);\n });\n\n effect(() => {\n el.checked = group() === value;\n });\n}\n\n// =========================================================================\n// Class directive\n// =========================================================================\n\n/**\n * Conditionally apply a CSS class based on a reactive condition.\n *\n * ```ts\n * bindClass(el, 'active', () => isActive());\n * bindClass(el, 'disabled', () => isDisabled());\n * ```\n */\nexport function bindClass(\n el: HTMLElement,\n className: string,\n condition: () => boolean,\n): () => void {\n return effect(() => {\n if (condition()) {\n el.classList.add(className);\n } else {\n el.classList.remove(className);\n }\n });\n}\n\n/**\n * Apply multiple conditional classes at once.\n *\n * ```ts\n * bindClasses(el, {\n * active: () => isActive(),\n * disabled: () => isDisabled(),\n * 'text-bold': () => isBold(),\n * });\n * ```\n */\nexport function bindClasses(\n el: HTMLElement,\n classes: Record<string, () => boolean>,\n): () => void {\n const disposers = Object.entries(classes).map(([cls, condition]) =>\n bindClass(el, cls, condition),\n );\n return () => disposers.forEach((d) => d());\n}\n\n// =========================================================================\n// Style directive\n// =========================================================================\n\n/**\n * Reactively bind a CSS property to a value.\n *\n * ```ts\n * bindStyle(el, 'color', () => textColor());\n * bindStyle(el, 'font-size', () => `${fontSize()}px`);\n * ```\n */\nexport function bindStyle(\n el: HTMLElement,\n property: string,\n value: () => string | number | null,\n): () => void {\n const kebab = property.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n\n return effect(() => {\n const v = value();\n if (v == null) {\n el.style.removeProperty(kebab);\n } else {\n el.style.setProperty(kebab, typeof v === 'number' ? `${v}px` : String(v));\n }\n });\n}\n\n/**\n * Bind multiple style properties at once.\n *\n * ```ts\n * bindStyles(el, {\n * color: () => color(),\n * 'font-size': () => `${size()}px`,\n * opacity: () => isVisible() ? 1 : 0,\n * });\n * ```\n */\nexport function bindStyles(\n el: HTMLElement,\n styles: Record<string, () => string | number | null>,\n): () => void {\n const disposers = Object.entries(styles).map(([prop, valueFn]) =>\n bindStyle(el, prop, valueFn),\n );\n return () => disposers.forEach((d) => d());\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {e,c}from'./chunk-YXKQTEPR.js';function v(i){return i}function E(...i){let d={},e$1=[];for(let n of i)typeof n=="function"?e$1.push(n):typeof n=="object"&&n!==null&&(d=n);let{label:l="inspect",level:m="log",logger:c,when:u}=d,s={dispose:null,get values(){return e$1.map(n=>n())},get value(){return e$1.length===1?e$1[0]():e$1.map(n=>n())},label:l,sources:e$1.length};return s.dispose=e(()=>{if(u&&!u())return;let n=e$1.map(r=>r());c?c(l,...n):console[m](`[${l}]`,...n);}),s}function b(i,d={}){let{method:e="POST",headers:l={},onSuccess:m,onError:c$1,fetch:u=globalThis.fetch.bind(globalThis)}=d,s=c(false),n=c(null),r=c(null);async function f(a){s.set(true),r.set(null);try{let o=await u(i,{method:e,headers:{"Content-Type":"application/json",...l},body:JSON.stringify(a)});if(!o.ok)throw new Error(`Form action failed: ${o.status}`);let t=await o.json();return n.set(t),s.set(!1),m?.(t),t}catch(o){let t=o instanceof Error?o:new Error(String(o));throw r.set(t),s.set(false),c$1?.(t),t}}return {url:i,method:e,submitting:()=>s(),result:()=>n(),error:()=>r(),handle(a){return o=>{o.preventDefault();let t=o.target,p=new FormData(t),h={...a};p.forEach((T,y)=>{h[y]=T;}),f(h);}},submit:f}}function k(i={}){if(typeof window>"u")return ()=>{};let{keyPrefix:d="akash-snapshot",capture:e=["scroll","forms"]}=i;function l(){let n={scrollX:window.scrollX,scrollY:window.scrollY,forms:{},timestamp:Date.now()};return e.includes("forms")&&document.querySelectorAll("form[id]").forEach(r=>{let f=r,a={};new FormData(f).forEach((o,t)=>{a[t]=String(o);}),n.forms[f.id]=a;}),n}function m(n){if(e.includes("scroll")&&requestAnimationFrame(()=>{window.scrollTo(n.scrollX,n.scrollY);}),e.includes("forms"))for(let[r,f]of Object.entries(n.forms)){let a=document.getElementById(r);if(a)for(let[o,t]of Object.entries(f)){let p=a.elements.namedItem(o);p&&(p.value=t);}}}let c=()=>`${d}-${window.location.pathname}`;function u(){try{let n=l();sessionStorage.setItem(c(),JSON.stringify(n));}catch{}}function s(){try{let n=sessionStorage.getItem(c());if(n){let r=JSON.parse(n);Date.now()-r.timestamp<1800*1e3&&m(r);}}catch{}}return window.addEventListener("beforeunload",u),window.addEventListener("popstate",()=>{requestAnimationFrame(s);}),performance.getEntriesByType("navigation")[0]?.type==="back_forward"&&requestAnimationFrame(s),()=>{window.removeEventListener("beforeunload",u);}}export{v as a,E as b,b as c,k as d};//# sourceMappingURL=chunk-7VBH4F3P.js.map
2
+ //# sourceMappingURL=chunk-7VBH4F3P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/snippets.ts"],"names":["defineSnippet","render","inspect","args","options","sources","arg","label","level","logger","when","result","s","effect","values","defineFormAction","url","method","headers","onSuccess","onError","customFetch","submitting","signal","error","submit","data","response","res","err","e","extraData","form","formData","value","key","enableSnapshots","config","keyPrefix","capture","captureSnapshot","snapshot","formEl","restoreSnapshot","formId","input","saveKey","save","restore","raw"],"mappings":"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","file":"chunk-7VBH4F3P.js","sourcesContent":["/**\n * Snippets, $inspect, form actions, and navigation snapshots.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Snippets — reusable template fragments\n// =========================================================================\n\nexport type Snippet<TArgs extends unknown[] = []> = (...args: TArgs) => AkashNode;\n\n/**\n * Define a reusable template snippet.\n *\n * ```ts\n * const UserBadge = defineSnippet((name: string, role: string) => {\n * const el = document.createElement('span');\n * el.textContent = `${name} (${role})`;\n * el.className = 'badge';\n * return el;\n * });\n *\n * // Reuse anywhere:\n * container.appendChild(nodeToDOM(UserBadge('Alice', 'admin')));\n * container.appendChild(nodeToDOM(UserBadge('Bob', 'user')));\n * ```\n */\nexport function defineSnippet<TArgs extends unknown[]>(\n render: (...args: TArgs) => AkashNode,\n): Snippet<TArgs> {\n return render;\n}\n\n// =========================================================================\n// $inspect — debug reactive values\n// =========================================================================\n\nexport interface InspectOptions {\n /** Label prefix for console output */\n label?: string;\n /** Log level (default: 'log') */\n level?: 'log' | 'warn' | 'debug' | 'trace';\n /** Custom logger */\n logger?: (label: string, ...values: unknown[]) => void;\n /** Only log when a condition is true */\n when?: () => boolean;\n}\n\n/**\n * Debug helper — logs when reactive values change.\n *\n * ```ts\n * const count = signal(0);\n * const name = signal('Alice');\n *\n * inspect(count, name); // logs: [inspect] 0, 'Alice'\n * count.set(1); // logs: [inspect] 1, 'Alice'\n *\n * // With label:\n * inspect(count, { label: 'counter' });\n * // logs: [counter] 1\n * ```\n */\nexport function inspect(\n ...args: Array<(() => unknown) | InspectOptions>\n): () => void {\n let options: InspectOptions = {};\n const sources: Array<() => unknown> = [];\n\n for (const arg of args) {\n if (typeof arg === 'function') {\n sources.push(arg);\n } else if (typeof arg === 'object' && arg !== null) {\n options = arg as InspectOptions;\n }\n }\n\n const {\n label = 'inspect',\n level = 'log',\n logger,\n when,\n } = options;\n\n const result = {\n dispose: null as unknown as () => void,\n get values() { return sources.map(s => s()); },\n get value() { return sources.length === 1 ? sources[0]() : sources.map(s => s()); },\n label,\n sources: sources.length,\n };\n\n result.dispose = effect(() => {\n if (when && !when()) return;\n\n const values = sources.map((s) => s());\n\n if (logger) {\n logger(label, ...values);\n } else {\n (console as any)[level](`[${label}]`, ...values);\n }\n });\n\n return result as any;\n}\n\n// =========================================================================\n// Form actions — server-side form handling\n// =========================================================================\n\nexport interface FormAction<T = unknown> {\n /** The action URL */\n url: string;\n /** Submit method */\n method: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Whether a submission is in progress */\n submitting: ReadonlySignal<boolean>;\n /** The last result */\n result: ReadonlySignal<T | null>;\n /** The last error */\n error: ReadonlySignal<Error | null>;\n /** Create an onSubmit handler for a <form> */\n handle(formData?: Record<string, unknown>): (e: Event) => void;\n /** Submit programmatically */\n submit(data: Record<string, unknown>): Promise<T>;\n}\n\n/**\n * Define a server-side form action with progressive enhancement.\n *\n * ```ts\n * const createPost = defineFormAction<Post>('/api/posts', {\n * method: 'POST',\n * onSuccess: (post) => navigate(`/posts/${post.id}`),\n * onError: (err) => toast.error(err.message),\n * });\n *\n * // In template:\n * <form onSubmit={createPost.handle()}>\n * <input name=\"title\" />\n * <button disabled={createPost.submitting()}>Create</button>\n * </form>\n * ```\n */\nexport function defineFormAction<T = unknown>(\n url: string,\n options: {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n headers?: Record<string, string>;\n onSuccess?: (result: T) => void;\n onError?: (error: Error) => void;\n fetch?: typeof globalThis.fetch;\n } = {},\n): FormAction<T> {\n const {\n method = 'POST',\n headers = {},\n onSuccess,\n onError,\n fetch: customFetch = globalThis.fetch.bind(globalThis),\n } = options;\n\n const submitting = signal(false);\n const result = signal<T | null>(null);\n const error = signal<Error | null>(null);\n\n async function submit(data: Record<string, unknown>): Promise<T> {\n submitting.set(true);\n error.set(null);\n\n try {\n const response = await customFetch(url, {\n method,\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`Form action failed: ${response.status}`);\n }\n\n const res = await response.json() as T;\n result.set(res);\n submitting.set(false);\n onSuccess?.(res);\n return res;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n error.set(e);\n submitting.set(false);\n onError?.(e);\n throw e;\n }\n }\n\n return {\n url,\n method,\n submitting: () => submitting(),\n result: () => result(),\n error: () => error(),\n handle(extraData?: Record<string, unknown>) {\n return (e: Event) => {\n e.preventDefault();\n const form = e.target as HTMLFormElement;\n const formData = new FormData(form);\n const data: Record<string, unknown> = { ...extraData };\n formData.forEach((value, key) => { data[key] = value; });\n submit(data);\n };\n },\n submit,\n };\n}\n\n// =========================================================================\n// Navigation snapshots — preserve scroll & form state\n// =========================================================================\n\nexport interface SnapshotConfig {\n /** Storage key prefix (default: 'akash-snapshot') */\n keyPrefix?: string;\n /** What to capture */\n capture?: ('scroll' | 'forms')[];\n}\n\ninterface PageSnapshot {\n scrollX: number;\n scrollY: number;\n forms: Record<string, Record<string, string>>;\n timestamp: number;\n}\n\n/**\n * Enable navigation snapshots — preserves scroll position and form\n * state when navigating with back/forward.\n *\n * ```ts\n * enableSnapshots();\n * // Now back/forward restores scroll position and form inputs\n * ```\n */\nexport function enableSnapshots(config: SnapshotConfig = {}): () => void {\n if (typeof window === 'undefined') return () => {};\n\n const { keyPrefix = 'akash-snapshot', capture = ['scroll', 'forms'] } = config;\n\n function captureSnapshot(): PageSnapshot {\n const snapshot: PageSnapshot = {\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n forms: {},\n timestamp: Date.now(),\n };\n\n if (capture.includes('forms')) {\n document.querySelectorAll('form[id]').forEach((form) => {\n const formEl = form as HTMLFormElement;\n const data: Record<string, string> = {};\n new FormData(formEl).forEach((value, key) => {\n data[key] = String(value);\n });\n snapshot.forms[formEl.id] = data;\n });\n }\n\n return snapshot;\n }\n\n function restoreSnapshot(snapshot: PageSnapshot): void {\n if (capture.includes('scroll')) {\n requestAnimationFrame(() => {\n window.scrollTo(snapshot.scrollX, snapshot.scrollY);\n });\n }\n\n if (capture.includes('forms')) {\n for (const [formId, data] of Object.entries(snapshot.forms)) {\n const form = document.getElementById(formId) as HTMLFormElement | null;\n if (!form) continue;\n for (const [key, value] of Object.entries(data)) {\n const input = form.elements.namedItem(key) as HTMLInputElement | null;\n if (input) input.value = value;\n }\n }\n }\n }\n\n // Save snapshot before navigation\n const saveKey = () => `${keyPrefix}-${window.location.pathname}`;\n\n function save(): void {\n try {\n const snapshot = captureSnapshot();\n sessionStorage.setItem(saveKey(), JSON.stringify(snapshot));\n } catch { /* storage full */ }\n }\n\n function restore(): void {\n try {\n const raw = sessionStorage.getItem(saveKey());\n if (raw) {\n const snapshot = JSON.parse(raw) as PageSnapshot;\n // Only restore if recent (within 30 minutes)\n if (Date.now() - snapshot.timestamp < 30 * 60 * 1000) {\n restoreSnapshot(snapshot);\n }\n }\n } catch { /* */ }\n }\n\n // Listen for navigation\n window.addEventListener('beforeunload', save);\n window.addEventListener('popstate', () => {\n requestAnimationFrame(restore);\n });\n\n // Restore on initial load if coming from back/forward\n if ((performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined)?.type === 'back_forward') {\n requestAnimationFrame(restore);\n }\n\n return () => {\n window.removeEventListener('beforeunload', save);\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var n=null;function h(){return n}function C(t){n&&n.addPending(t);}var x=chunkXWVNLE2W_cjs.s(t=>{let s=chunkWOZWFMOK_cjs.c(false),i=[],u={addPending(e){i.push(e);},isResolved:()=>s()},a=n;n=u;let r;try{r=t.children();}finally{n=a;}return i.length>0?Promise.all(i).then(()=>{s.set(true);}):s.set(true),()=>{let e=document.createElement("div");return e.setAttribute("data-akash-suspense",""),e.style.display="contents",s()?e.appendChild(chunkXWVNLE2W_cjs.l(r)):e.appendChild(chunkXWVNLE2W_cjs.l(t.props.fallback())),chunkWOZWFMOK_cjs.e(()=>{if(s()){for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(chunkXWVNLE2W_cjs.l(r));}}),e}});exports.a=h;exports.b=C;exports.c=x;//# sourceMappingURL=chunk-7ZPSYZHD.cjs.map
2
+ //# sourceMappingURL=chunk-7ZPSYZHD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/suspense.ts"],"names":["currentSuspenseCtx","getSuspenseContext","registerPending","promise","Suspense","defineComponent","ctx","resolved","signal","pending","suspenseCtx","prevCtx","childrenNode","container","nodeToDOM","effect"],"mappings":"qHAyBA,IAAIA,CAAAA,CAA6C,IAAA,CAM1C,SAASC,CAAAA,EAA6C,CAC3D,OAAOD,CACT,CAOO,SAASE,CAAAA,CAAgBC,CAAAA,CAAiC,CAC3DH,CAAAA,EACFA,EAAmB,UAAA,CAAWG,CAAO,EAEzC,CAkBO,IAAMC,CAAAA,CAAWC,mBAAAA,CAAgCC,CAAAA,EAAQ,CAC9D,IAAMC,CAAAA,CAAWC,mBAAAA,CAAO,KAAK,EACvBC,CAAAA,CAA8B,EAAC,CAE/BC,CAAAA,CAA+B,CACnC,UAAA,CAAWP,CAAAA,CAA2B,CACpCM,CAAAA,CAAQ,IAAA,CAAKN,CAAO,EACtB,CAAA,CACA,WAAY,IAAMI,CAAAA,EACpB,CAAA,CAGMI,CAAAA,CAAUX,CAAAA,CAChBA,CAAAA,CAAqBU,CAAAA,CAGrB,IAAIE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAeN,CAAAA,CAAI,QAAA,GACrB,CAAA,OAAE,CACAN,CAAAA,CAAqBW,EACvB,CAGA,OAAIF,EAAQ,MAAA,CAAS,CAAA,CACnB,OAAA,CAAQ,GAAA,CAAIA,CAAO,CAAA,CAAE,IAAA,CAAK,IAAM,CAC9BF,CAAAA,CAAS,GAAA,CAAI,IAAI,EACnB,CAAC,CAAA,CAGDA,CAAAA,CAAS,GAAA,CAAI,IAAI,CAAA,CAGZ,IAAM,CACX,IAAMM,EAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC9C,OAAAA,CAAAA,CAAU,YAAA,CAAa,qBAAA,CAAuB,EAAE,CAAA,CAChDA,CAAAA,CAAU,KAAA,CAAM,OAAA,CAAU,WAEtBN,CAAAA,EAAS,CACXM,CAAAA,CAAU,WAAA,CAAYC,oBAAUF,CAAY,CAAC,CAAA,CAE7CC,CAAAA,CAAU,WAAA,CAAYC,mBAAAA,CAAUR,CAAAA,CAAI,KAAA,CAAM,UAAU,CAAC,CAAA,CAIvDS,mBAAAA,CAAO,IAAM,CACX,GAAIR,CAAAA,EAAS,CAAG,CACd,KAAOM,CAAAA,CAAU,UAAA,EACfA,CAAAA,CAAU,WAAA,CAAYA,CAAAA,CAAU,UAAU,CAAA,CAE5CA,EAAU,WAAA,CAAYC,mBAAAA,CAAUF,CAAY,CAAC,EAC/C,CACF,CAAC,CAAA,CAEMC,CACT,CACF,CAAC","file":"chunk-7ZPSYZHD.cjs","sourcesContent":["/**\n * <Suspense> component.\n *\n * Shows a fallback while async children are loading.\n * When all pending async work resolves, swaps to the real content.\n *\n * Works with both client rendering and SSR streaming:\n * - Client: shows fallback, swaps when promises resolve\n * - SSR: flushes fallback HTML immediately, then sends replacement when ready\n */\n\nimport { defineComponent } from './component.js';\nimport { signal, effect } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// --- Suspense tracking ---\n\ninterface SuspenseContext {\n /** Register a pending promise */\n addPending(promise: Promise<unknown>): void;\n /** Check if all pending work is resolved */\n isResolved: () => boolean;\n}\n\nlet currentSuspenseCtx: SuspenseContext | null = null;\n\n/**\n * Get the current Suspense context (if inside a <Suspense> boundary).\n * Used by async components and createResource to register pending work.\n */\nexport function getSuspenseContext(): SuspenseContext | null {\n return currentSuspenseCtx;\n}\n\n/**\n * Register a promise with the nearest Suspense boundary.\n * If there is no Suspense boundary, the promise is ignored\n * (component renders without waiting).\n */\nexport function registerPending(promise: Promise<unknown>): void {\n if (currentSuspenseCtx) {\n currentSuspenseCtx.addPending(promise);\n }\n}\n\n// --- Suspense component ---\n\nexport interface SuspenseProps {\n /** Fallback UI shown while children are loading */\n fallback: () => AkashNode;\n}\n\n/**\n * <Suspense> component.\n *\n * ```html\n * <Suspense fallback={() => <Spinner />}>\n * <AsyncComponent />\n * </Suspense>\n * ```\n */\nexport const Suspense = defineComponent<SuspenseProps>((ctx) => {\n const resolved = signal(false);\n const pending: Promise<unknown>[] = [];\n\n const suspenseCtx: SuspenseContext = {\n addPending(promise: Promise<unknown>) {\n pending.push(promise);\n },\n isResolved: () => resolved(),\n };\n\n // Set up the context so child components can register promises\n const prevCtx = currentSuspenseCtx;\n currentSuspenseCtx = suspenseCtx;\n\n // Render children (this may trigger async work registration)\n let childrenNode: AkashNode;\n try {\n childrenNode = ctx.children();\n } finally {\n currentSuspenseCtx = prevCtx;\n }\n\n // If there are pending promises, wait for them\n if (pending.length > 0) {\n Promise.all(pending).then(() => {\n resolved.set(true);\n });\n } else {\n // No async work — resolve immediately\n resolved.set(true);\n }\n\n return () => {\n const container = document.createElement('div');\n container.setAttribute('data-akash-suspense', '');\n container.style.display = 'contents';\n\n if (resolved()) {\n container.appendChild(nodeToDOM(childrenNode));\n } else {\n container.appendChild(nodeToDOM(ctx.props.fallback()));\n }\n\n // Watch for resolution and swap content\n effect(() => {\n if (resolved()) {\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n container.appendChild(nodeToDOM(childrenNode));\n }\n });\n\n return container;\n };\n});\n"]}