@akashjs/runtime 0.2.6 → 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 (542) 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-2U643GJZ.cjs → chunk-2LKFIID7.cjs} +2 -2
  28. package/dist/{chunk-2U643GJZ.cjs.map → chunk-2LKFIID7.cjs.map} +1 -1
  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-2Q6SYE5O.cjs → chunk-4NQEIKH5.cjs} +2 -2
  42. package/dist/{chunk-2Q6SYE5O.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-5NHDEY2C.js.map → chunk-CP6SK2B4.js.map} +1 -1
  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-U53YRJNV.js → chunk-NBYFHJWB.js} +3 -3
  136. package/dist/{chunk-U53YRJNV.js.map → chunk-NBYFHJWB.js.map} +1 -1
  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-ZYVQQ5VR.cjs → chunk-NHDYQTC5.cjs} +3 -3
  144. package/dist/{chunk-ZYVQQ5VR.cjs.map → chunk-NHDYQTC5.cjs.map} +1 -1
  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-AVVJKYT3.cjs → chunk-QSPRVXFV.cjs} +2 -2
  168. package/dist/{chunk-AVVJKYT3.cjs.map → chunk-QSPRVXFV.cjs.map} +1 -1
  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-5A7KDBDU.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-TKFJGLUO.js.map → chunk-VWTULWXF.js.map} +1 -1
  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-CB1mCq2h.d.cts → context-Cwt7QCpk.d.cts} +1 -9
  242. package/dist/{context-CB1mCq2h.d.ts → 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-CJWKBTP4.js → devtools-overlay-3WRM6GKM.js} +3 -3
  278. package/dist/{devtools-overlay-CJWKBTP4.js.map → devtools-overlay-3WRM6GKM.js.map} +1 -1
  279. package/dist/{devtools-overlay-EQ3G755P.cjs → devtools-overlay-WJGSIB4N.cjs} +4 -4
  280. package/dist/{devtools-overlay-EQ3G755P.cjs.map → devtools-overlay-WJGSIB4N.cjs.map} +1 -1
  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 +50 -3155
  356. package/dist/index.d.ts +50 -3155
  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 +1 -1
  377. package/dist/offline.d.ts +1 -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 +1 -1
  405. package/dist/pwa.d.ts +1 -1
  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 +1 -1
  453. package/dist/store.d.ts +1 -1
  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 +1 -1
  469. package/dist/sync.d.ts +1 -1
  470. package/dist/sync.js +1 -1
  471. package/dist/test.cjs +2 -2
  472. package/dist/test.cjs.map +1 -1
  473. package/dist/test.d.cts +5 -4
  474. package/dist/test.d.ts +5 -4
  475. package/dist/test.js +2 -2
  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-35DJOBEO.cjs +0 -2
  529. package/dist/chunk-35DJOBEO.cjs.map +0 -1
  530. package/dist/chunk-3GRR4VW2.js +0 -13
  531. package/dist/chunk-3GRR4VW2.js.map +0 -1
  532. package/dist/chunk-5A7KDBDU.js +0 -2
  533. package/dist/chunk-5NHDEY2C.js +0 -2
  534. package/dist/chunk-6GGYM5SF.cjs +0 -5
  535. package/dist/chunk-6GGYM5SF.cjs.map +0 -1
  536. package/dist/chunk-EEILP4OL.cjs +0 -13
  537. package/dist/chunk-EEILP4OL.cjs.map +0 -1
  538. package/dist/chunk-FTTNKDZQ.js +0 -5
  539. package/dist/chunk-FTTNKDZQ.js.map +0 -1
  540. package/dist/chunk-H2HNKYN2.js +0 -2
  541. package/dist/chunk-H2HNKYN2.js.map +0 -1
  542. package/dist/chunk-TKFJGLUO.js +0 -2
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/di.ts"],"names":["providerIdCounter","defineProvider","config","rootInstances","createInjector","providers","parent","instances","multiInstances","registrations","reg","injector","provider","id","values","parentValues","instance","resolveRegistration","childProviders","currentInjector","setCurrentInjector","prev","injectProvider","clearProviders"],"mappings":"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","file":"chunk-T7A5YOEG.cjs","sourcesContent":["/**\n * Hierarchical Dependency Injection.\n *\n * Extends the basic provide/inject with multi-level injectors,\n * provider factories, tree-shakable providers, and multi-providers.\n *\n * ```ts\n * // Define a provider with factory\n * const ApiService = defineProvider({\n * factory: () => createHttpClient({ baseUrl: '/api' }),\n * });\n *\n * // Tree-shakable provider (only bundled if injected)\n * const Logger = defineProvider({\n * factory: () => new ConsoleLogger(),\n * providedIn: 'root',\n * });\n *\n * // Use in component\n * const api = injectProvider(ApiService);\n * ```\n */\n\nimport { signal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface ProviderDef<T> {\n _type: 'provider';\n factory: () => T;\n providedIn?: 'root' | 'component';\n multi?: boolean;\n _id: symbol;\n}\n\nexport interface Injector {\n /** Get a provider value */\n get<T>(provider: ProviderDef<T>): T;\n /** Check if a provider is registered */\n has(provider: ProviderDef<unknown>): boolean;\n /** Create a child injector */\n createChild(providers?: ProviderRegistration[]): Injector;\n /** Dispose this injector and all cached instances */\n dispose(): void;\n}\n\nexport interface ProviderRegistration<T = unknown> {\n provide: ProviderDef<T>;\n useFactory?: () => T;\n useValue?: T;\n useExisting?: ProviderDef<T>;\n multi?: boolean;\n}\n\n// =========================================================================\n// defineProvider\n// =========================================================================\n\nlet providerIdCounter = 0;\n\n/**\n * Define a typed provider.\n *\n * ```ts\n * const DatabaseService = defineProvider({\n * factory: () => new Database(config),\n * providedIn: 'root', // singleton, tree-shakable\n * });\n * ```\n */\nexport function defineProvider<T>(config: {\n factory: () => T;\n providedIn?: 'root' | 'component';\n multi?: boolean;\n}): ProviderDef<T> {\n return {\n _type: 'provider',\n factory: config.factory,\n providedIn: config.providedIn,\n multi: config.multi,\n _id: Symbol(`provider-${++providerIdCounter}`),\n };\n}\n\n// =========================================================================\n// Injector implementation\n// =========================================================================\n\nconst rootInstances = new Map<symbol, unknown>();\n\n/**\n * Create an injector with hierarchical resolution.\n *\n * ```ts\n * const injector = createInjector([\n * { provide: ApiService, useFactory: () => new MockApi() },\n * { provide: Logger, useValue: console },\n * ]);\n *\n * const api = injector.get(ApiService);\n * ```\n */\nexport function createInjector(\n providers: ProviderRegistration[] = [],\n parent?: Injector,\n): Injector {\n const instances = new Map<symbol, unknown>();\n const multiInstances = new Map<symbol, unknown[]>();\n const registrations = new Map<symbol, ProviderRegistration>();\n\n // Register providers\n for (const reg of providers) {\n registrations.set(reg.provide._id, reg);\n }\n\n const injector: Injector = {\n get<T>(provider: ProviderDef<T>): T {\n const id = provider._id;\n\n // Multi-provider\n if (provider.multi) {\n if (multiInstances.has(id)) return multiInstances.get(id) as T;\n const values: unknown[] = [];\n const reg = registrations.get(id);\n if (reg?.useFactory) values.push(reg.useFactory());\n else if (reg?.useValue !== undefined) values.push(reg.useValue);\n if (parent?.has(provider)) {\n const parentValues = parent.get(provider);\n if (Array.isArray(parentValues)) values.push(...parentValues);\n }\n multiInstances.set(id, values);\n return values as T;\n }\n\n // Check local cache\n if (instances.has(id)) return instances.get(id) as T;\n\n // Check root singleton\n if (provider.providedIn === 'root' && rootInstances.has(id)) {\n return rootInstances.get(id) as T;\n }\n\n // Check local registrations\n const reg = registrations.get(id);\n if (reg) {\n const instance = resolveRegistration(reg, injector);\n instances.set(id, instance);\n return instance as T;\n }\n\n // Check parent\n if (parent) {\n return parent.get(provider);\n }\n\n // Use default factory\n const instance = provider.factory();\n\n // Cache at appropriate level\n if (provider.providedIn === 'root') {\n rootInstances.set(id, instance);\n } else {\n instances.set(id, instance);\n }\n\n return instance;\n },\n\n has(provider: ProviderDef<unknown>): boolean {\n if (instances.has(provider._id)) return true;\n if (registrations.has(provider._id)) return true;\n if (provider.providedIn === 'root' && rootInstances.has(provider._id)) return true;\n if (parent) return parent.has(provider);\n return false;\n },\n\n createChild(childProviders?: ProviderRegistration[]): Injector {\n return createInjector(childProviders ?? [], injector);\n },\n\n dispose() {\n instances.clear();\n multiInstances.clear();\n },\n };\n\n return injector;\n}\n\nfunction resolveRegistration(reg: ProviderRegistration, injector: Injector): unknown {\n if (reg.useValue !== undefined) return reg.useValue;\n if (reg.useFactory) return reg.useFactory();\n if (reg.useExisting) return injector.get(reg.useExisting);\n return reg.provide.factory();\n}\n\n// =========================================================================\n// Component-level injection helpers\n// =========================================================================\n\nlet currentInjector: Injector | null = null;\n\n/**\n * Set the current injector (called by component setup).\n * @internal\n */\nexport function setCurrentInjector(injector: Injector | null): Injector | null {\n const prev = currentInjector;\n currentInjector = injector;\n return prev;\n}\n\n/**\n * Inject a provider in the current component context.\n *\n * ```ts\n * const api = injectProvider(ApiService);\n * ```\n */\nexport function injectProvider<T>(provider: ProviderDef<T>): T {\n if (!currentInjector) {\n // Fallback to root or create new instance\n if (provider.providedIn === 'root') {\n if (rootInstances.has(provider._id)) {\n return rootInstances.get(provider._id) as T;\n }\n const instance = provider.factory();\n rootInstances.set(provider._id, instance);\n return instance;\n }\n return provider.factory();\n }\n return currentInjector.get(provider);\n}\n\n/**\n * Clear root provider instances (useful for testing).\n */\nexport function clearProviders(): void {\n rootInstances.clear();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var L=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])',"[contenteditable]"].join(", ");function A(e,r={}){let{initialFocus:t,returnFocus:l=true,escapeDeactivates:d=true,allowOutsideClick:f=false,onDeactivate:n}=r,o=chunkWOZWFMOK_cjs.c(false),c=null;function a(){return typeof e=="function"?e():e}function u(){let i=a();return i?Array.from(i.querySelectorAll(L)):[]}function m(i){if(i.key==="Escape"&&d){i.preventDefault(),b(),n?.();return}if(i.key!=="Tab")return;let s=u();if(s.length===0)return;let p=s[0],v=s[s.length-1];i.shiftKey?document.activeElement===p&&(i.preventDefault(),v.focus()):document.activeElement===v&&(i.preventDefault(),p.focus());}function y(i){if(!o()||f)return;let s=a();if(!s)return;let p=i.relatedTarget;if(p&&!s.contains(p)){let v=u();v.length>0&&v[0].focus();}}function h(){if(o())return;o.set(true),c=document.activeElement,document.addEventListener("keydown",m,true);let i=a();i&&i.addEventListener("focusout",y),requestAnimationFrame(()=>{if(t)(typeof t=="string"?a()?.querySelector(t):t)?.focus();else {let s=u();s.length>0&&s[0].focus();}});}function b(){if(!o())return;o.set(false),document.removeEventListener("keydown",m,true);let i=a();i&&i.removeEventListener("focusout",y),l&&c&&(c.focus(),c=null);}return {activate:h,deactivate:b,active:()=>o()}}var g=null;function K(){if(g&&document.body.contains(g))return g;let e=document.createElement("div");return e.setAttribute("role","status"),e.setAttribute("aria-live","polite"),e.setAttribute("aria-atomic","true"),e.style.cssText=["position: absolute","width: 1px","height: 1px","padding: 0","margin: -1px","overflow: hidden","clip: rect(0,0,0,0)","white-space: nowrap","border: 0"].join("; "),document.body.appendChild(e),g=e,e}function k(){return (e,r="polite")=>{if(typeof document>"u")return;let t=K();t.setAttribute("aria-live",r),t.textContent="",requestAnimationFrame(()=>{t.textContent=e;});}}function w(){let e=[],r=new Set,t=false;function l(n){for(let o of e)if(!(o.scope&&!r.has(o.scope))&&T(n,o.key)){o.preventDefault!==false&&n.preventDefault(),o.handler(n);return}}function d(){t||typeof document>"u"||(document.addEventListener("keydown",l),t=true);}function f(n,o,c){let a={key:n,handler:o,scope:c?.scope,description:c?.description??"",preventDefault:c?.preventDefault};return e.push(a),d(),()=>{let u=e.indexOf(a);u!==-1&&e.splice(u,1);}}return {bind:f,enableScope(n){r.add(n);},disableScope(n){r.delete(n);},getBindings(){return e.map(n=>({key:M(n.key),description:n.description??"",scope:n.scope}))},dispose(){e.length=0,typeof document<"u"&&document.removeEventListener("keydown",l),t=false;}}}function T(e,r){let t=r.toLowerCase().split("+"),l=t.pop(),d=t.includes("mod"),f=t.includes("ctrl"),n=t.includes("shift"),o=t.includes("alt"),a=typeof navigator<"u"&&navigator.platform?.includes("Mac")?e.metaKey:e.ctrlKey;return d&&!a||f&&!e.ctrlKey||n&&!e.shiftKey||o&&!e.altKey?false:e.key.toLowerCase()===l||e.code.toLowerCase()===l}function M(e){let r=typeof navigator<"u"&&navigator.platform?.includes("Mac");return e.replace(/mod/gi,r?"\u2318":"Ctrl").replace(/shift/gi,r?"\u21E7":"Shift").replace(/alt/gi,r?"\u2325":"Alt").replace(/\+/g,r?"":"+")}exports.a=A;exports.b=k;exports.c=w;//# sourceMappingURL=chunk-TDKDZ3QJ.cjs.map
2
+ //# sourceMappingURL=chunk-TDKDZ3QJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/a11y.ts"],"names":["FOCUSABLE_SELECTOR","useFocusTrap","container","options","initialFocus","returnFocus","escapeDeactivates","allowOutsideClick","onDeactivate","active","signal","previouslyFocused","getContainer","getFocusableElements","el","handleKeyDown","e","deactivate","focusable","first","last","handleFocusOut","relatedTarget","activate","announceRegion","ensureAnnounceRegion","useAnnounce","message","politeness","region","useKeyboard","bindings","activeScopes","listening","binding","matchesKey","startListening","bind","key","handler","idx","scope","b","formatKeyCombo","combo","parts","needsMod","needsCtrl","needsShift","needsAlt","modPressed","isMac"],"mappings":"mEAoCA,IAAMA,EAAqB,CACzB,SAAA,CAAW,wBAAA,CAA0B,uBAAA,CACrC,yBAA0B,0BAAA,CAC1B,iCAAA,CAAmC,mBACrC,CAAA,CAAE,KAAK,IAAI,CAAA,CAeJ,SAASC,CAAAA,CACdC,CAAAA,CACAC,EAA4B,EAAC,CAClB,CACX,GAAM,CACJ,YAAA,CAAAC,CAAAA,CACA,WAAA,CAAAC,CAAAA,CAAc,KACd,iBAAA,CAAAC,CAAAA,CAAoB,IAAA,CACpB,iBAAA,CAAAC,EAAoB,KAAA,CACpB,YAAA,CAAAC,CACF,CAAA,CAAIL,CAAAA,CAEEM,EAASC,mBAAAA,CAAO,KAAK,CAAA,CACvBC,CAAAA,CAAwC,KAE5C,SAASC,CAAAA,EAAmC,CAC1C,OAAO,OAAOV,CAAAA,EAAc,UAAA,CAAaA,CAAAA,EAAU,CAAIA,CACzD,CAEA,SAASW,GAAsC,CAC7C,IAAMC,EAAKF,CAAAA,EAAa,CACxB,OAAKE,CAAAA,CACE,MAAM,IAAA,CAAKA,CAAAA,CAAG,iBAA8Bd,CAAkB,CAAC,EADtD,EAElB,CAEA,SAASe,EAAcC,CAAAA,CAAwB,CAC7C,GAAIA,CAAAA,CAAE,GAAA,GAAQ,UAAYV,CAAAA,CAAmB,CAC3CU,CAAAA,CAAE,cAAA,GACFC,CAAAA,EAAW,CACXT,CAAAA,IAAe,CACf,MACF,CAEA,GAAIQ,CAAAA,CAAE,GAAA,GAAQ,MAAO,OAErB,IAAME,EAAYL,CAAAA,EAAqB,CACvC,GAAIK,CAAAA,CAAU,MAAA,GAAW,CAAA,CAAG,OAE5B,IAAMC,CAAAA,CAAQD,CAAAA,CAAU,CAAC,CAAA,CACnBE,CAAAA,CAAOF,EAAUA,CAAAA,CAAU,MAAA,CAAS,CAAC,CAAA,CAEvCF,EAAE,QAAA,CAEA,QAAA,CAAS,gBAAkBG,CAAAA,GAC7BH,CAAAA,CAAE,gBAAe,CACjBI,CAAAA,CAAK,KAAA,EAAM,CAAA,CAIT,SAAS,aAAA,GAAkBA,CAAAA,GAC7BJ,CAAAA,CAAE,cAAA,GACFG,CAAAA,CAAM,KAAA,EAAM,EAGlB,CAEA,SAASE,CAAAA,CAAeL,CAAAA,CAAqB,CAC3C,GAAI,CAACP,GAAO,EAAKF,CAAAA,CAAmB,OACpC,IAAMO,EAAKF,CAAAA,EAAa,CACxB,GAAI,CAACE,CAAAA,CAAI,OAET,IAAMQ,CAAAA,CAAgBN,CAAAA,CAAE,aAAA,CACxB,GAAIM,CAAAA,EAAiB,CAACR,EAAG,QAAA,CAASQ,CAAa,EAAG,CAEhD,IAAMJ,CAAAA,CAAYL,CAAAA,GACdK,CAAAA,CAAU,MAAA,CAAS,CAAA,EACrBA,CAAAA,CAAU,CAAC,CAAA,CAAE,KAAA,GAEjB,CACF,CAEA,SAASK,CAAAA,EAAiB,CACxB,GAAId,CAAAA,GAAU,OACdA,CAAAA,CAAO,GAAA,CAAI,IAAI,EAEfE,CAAAA,CAAoB,QAAA,CAAS,aAAA,CAE7B,QAAA,CAAS,iBAAiB,SAAA,CAAWI,CAAAA,CAAe,IAAI,CAAA,CAExD,IAAMD,CAAAA,CAAKF,CAAAA,GACPE,CAAAA,EACFA,CAAAA,CAAG,iBAAiB,UAAA,CAAYO,CAAc,CAAA,CAIhD,qBAAA,CAAsB,IAAM,CAC1B,GAAIjB,CAAAA,CAAAA,CACa,OAAOA,GAAiB,QAAA,CACnCQ,CAAAA,EAAa,EAAG,aAAA,CAA2BR,CAAY,CAAA,CACvDA,CAAAA,GACI,OAAM,CAAA,KACT,CACL,IAAMc,CAAAA,CAAYL,CAAAA,EAAqB,CACnCK,CAAAA,CAAU,OAAS,CAAA,EAAGA,CAAAA,CAAU,CAAC,CAAA,CAAE,KAAA,GACzC,CACF,CAAC,EACH,CAEA,SAASD,CAAAA,EAAmB,CAC1B,GAAI,CAACR,CAAAA,GAAU,OACfA,CAAAA,CAAO,GAAA,CAAI,KAAK,EAEhB,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWM,CAAAA,CAAe,IAAI,CAAA,CAE3D,IAAMD,CAAAA,CAAKF,CAAAA,GACPE,CAAAA,EACFA,CAAAA,CAAG,oBAAoB,UAAA,CAAYO,CAAc,EAG/ChB,CAAAA,EAAeM,CAAAA,GACjBA,CAAAA,CAAkB,KAAA,GAClBA,CAAAA,CAAoB,IAAA,EAExB,CAEA,OAAO,CACL,SAAAY,CAAAA,CACA,UAAA,CAAAN,CAAAA,CACA,MAAA,CAAQ,IAAMR,CAAAA,EAChB,CACF,CAQA,IAAIe,EAAqC,IAAA,CAEzC,SAASC,CAAAA,EAAoC,CAC3C,GAAID,CAAAA,EAAkB,QAAA,CAAS,IAAA,CAAK,QAAA,CAASA,CAAc,CAAA,CACzD,OAAOA,CAAAA,CAGT,IAAMV,EAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACvC,OAAAA,EAAG,YAAA,CAAa,MAAA,CAAQ,QAAQ,CAAA,CAChCA,EAAG,YAAA,CAAa,WAAA,CAAa,QAAQ,CAAA,CACrCA,CAAAA,CAAG,aAAa,aAAA,CAAe,MAAM,CAAA,CACrCA,CAAAA,CAAG,MAAM,OAAA,CAAU,CACjB,qBACA,YAAA,CACA,aAAA,CACA,aACA,cAAA,CACA,kBAAA,CACA,qBAAA,CACA,qBAAA,CACA,WACF,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAEX,SAAS,IAAA,CAAK,WAAA,CAAYA,CAAE,CAAA,CAC5BU,EAAiBV,CAAAA,CACVA,CACT,CAWO,SAASY,CAAAA,EAAgE,CAC9E,OAAO,CAACC,CAAAA,CAAiBC,CAAAA,CAAuB,WAAa,CAC3D,GAAI,OAAO,QAAA,CAAa,IAAa,OAErC,IAAMC,CAAAA,CAASJ,CAAAA,GACfI,CAAAA,CAAO,YAAA,CAAa,YAAaD,CAAU,CAAA,CAG3CC,EAAO,WAAA,CAAc,EAAA,CACrB,qBAAA,CAAsB,IAAM,CAC1BA,CAAAA,CAAO,WAAA,CAAcF,EACvB,CAAC,EACH,CACF,CA8CO,SAASG,CAAAA,EAA+B,CAC7C,IAAMC,CAAAA,CAAyB,EAAC,CAC1BC,CAAAA,CAAe,IAAI,GAAA,CACrBC,CAAAA,CAAY,KAAA,CAEhB,SAASlB,EAAcC,CAAAA,CAAwB,CAC7C,QAAWkB,CAAAA,IAAWH,CAAAA,CACpB,GAAI,EAAAG,CAAAA,CAAQ,KAAA,EAAS,CAACF,EAAa,GAAA,CAAIE,CAAAA,CAAQ,KAAK,CAAA,CAAA,EAChDC,CAAAA,CAAWnB,EAAGkB,CAAAA,CAAQ,GAAG,CAAA,CAAG,CAC1BA,EAAQ,cAAA,GAAmB,KAAA,EAC7BlB,CAAAA,CAAE,cAAA,GAEJkB,CAAAA,CAAQ,OAAA,CAAQlB,CAAC,CAAA,CACjB,MACF,CAEJ,CAEA,SAASoB,CAAAA,EAAuB,CAC1BH,GACA,OAAO,QAAA,CAAa,GAAA,GACxB,QAAA,CAAS,iBAAiB,SAAA,CAAWlB,CAAa,EAClDkB,CAAAA,CAAY,IAAA,EACd,CAEA,SAASI,CAAAA,CACPC,CAAAA,CACAC,CAAAA,CACApC,EACY,CACZ,IAAM+B,EAAsB,CAC1B,GAAA,CAAAI,EACA,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAOpC,CAAAA,EAAS,MAChB,WAAA,CAAaA,CAAAA,EAAS,WAAA,EAAe,EAAA,CACrC,eAAgBA,CAAAA,EAAS,cAC3B,CAAA,CACA,OAAA4B,EAAS,IAAA,CAAKG,CAAO,EACrBE,CAAAA,EAAe,CAER,IAAM,CACX,IAAMI,CAAAA,CAAMT,CAAAA,CAAS,QAAQG,CAAO,CAAA,CAChCM,IAAQ,EAAA,EAAIT,CAAAA,CAAS,OAAOS,CAAAA,CAAK,CAAC,EACxC,CACF,CAEA,OAAO,CACL,KAAAH,CAAAA,CACA,WAAA,CAAYI,EAAe,CAAET,CAAAA,CAAa,GAAA,CAAIS,CAAK,EAAG,CAAA,CACtD,YAAA,CAAaA,CAAAA,CAAe,CAAET,EAAa,MAAA,CAAOS,CAAK,EAAG,CAAA,CAC1D,aAAc,CACZ,OAAOV,EAAS,GAAA,CAAKW,CAAAA,GAAO,CAC1B,GAAA,CAAKC,CAAAA,CAAeD,CAAAA,CAAE,GAAG,EACzB,WAAA,CAAaA,CAAAA,CAAE,WAAA,EAAe,EAAA,CAC9B,MAAOA,CAAAA,CAAE,KACX,CAAA,CAAE,CACJ,EACA,OAAA,EAAU,CACRX,EAAS,MAAA,CAAS,CAAA,CACd,OAAO,QAAA,CAAa,GAAA,EACtB,QAAA,CAAS,mBAAA,CAAoB,UAAWhB,CAAa,CAAA,CAEvDkB,CAAAA,CAAY,MACd,CACF,CACF,CAIA,SAASE,CAAAA,CAAW,EAAkBS,CAAAA,CAAwB,CAC5D,IAAMC,CAAAA,CAAQD,CAAAA,CAAM,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CACrCN,EAAMO,CAAAA,CAAM,GAAA,GAEZC,CAAAA,CAAWD,CAAAA,CAAM,SAAS,KAAK,CAAA,CAC/BE,CAAAA,CAAYF,CAAAA,CAAM,SAAS,MAAM,CAAA,CACjCG,EAAaH,CAAAA,CAAM,QAAA,CAAS,OAAO,CAAA,CACnCI,CAAAA,CAAWJ,CAAAA,CAAM,QAAA,CAAS,KAAK,CAAA,CAI/BK,CAAAA,CADQ,OAAO,SAAA,CAAc,KAAe,SAAA,CAAU,QAAA,EAAU,QAAA,CAAS,KAAK,EACzD,CAAA,CAAE,OAAA,CAAU,EAAE,OAAA,CAKzC,OAHIJ,GAAY,CAACI,CAAAA,EACbH,CAAAA,EAAa,CAAC,EAAE,OAAA,EAChBC,CAAAA,EAAc,CAAC,CAAA,CAAE,QAAA,EACjBC,GAAY,CAAC,CAAA,CAAE,MAAA,CAAe,KAAA,CAE3B,EAAE,GAAA,CAAI,WAAA,KAAkBX,CAAAA,EAAO,CAAA,CAAE,KAAK,WAAA,EAAY,GAAMA,CACjE,CAEA,SAASK,CAAAA,CAAeC,CAAAA,CAAuB,CAC7C,IAAMO,EAAQ,OAAO,SAAA,CAAc,GAAA,EAAe,SAAA,CAAU,UAAU,QAAA,CAAS,KAAK,EACpF,OAAOP,CAAAA,CACJ,QAAQ,OAAA,CAASO,CAAAA,CAAQ,QAAA,CAAM,MAAM,EACrC,OAAA,CAAQ,SAAA,CAAWA,EAAQ,QAAA,CAAM,OAAO,EACxC,OAAA,CAAQ,OAAA,CAASA,CAAAA,CAAQ,QAAA,CAAM,KAAK,CAAA,CACpC,OAAA,CAAQ,MAAOA,CAAAA,CAAQ,EAAA,CAAK,GAAG,CACpC","file":"chunk-TDKDZ3QJ.cjs","sourcesContent":["/**\n * Accessibility composables.\n *\n * Built-in a11y primitives that no other framework ships natively.\n * Focus management, screen reader announcements, and keyboard shortcuts.\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// useFocusTrap\n// =========================================================================\n\nexport interface FocusTrapOptions {\n /** CSS selector or element to focus initially (default: first focusable) */\n initialFocus?: string | HTMLElement;\n /** Return focus to the previously focused element on deactivate */\n returnFocus?: boolean;\n /** Escape key deactivates the trap (default: true) */\n escapeDeactivates?: boolean;\n /** Allow clicks outside the trap container (default: false) */\n allowOutsideClick?: boolean;\n /** Callback when Escape deactivates */\n onDeactivate?: () => void;\n}\n\nexport interface FocusTrap {\n /** Activate the focus trap */\n activate(): void;\n /** Deactivate the focus trap */\n deactivate(): void;\n /** Whether the trap is currently active */\n active: ReadonlySignal<boolean>;\n}\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]', 'button:not([disabled])', 'input:not([disabled])',\n 'select:not([disabled])', 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])', '[contenteditable]',\n].join(', ');\n\n/**\n * Trap focus inside a container element.\n *\n * ```ts\n * const trap = useFocusTrap(dialogRef, {\n * initialFocus: '#first-input',\n * returnFocus: true,\n * escapeDeactivates: true,\n * });\n * trap.activate(); // on open\n * trap.deactivate(); // on close\n * ```\n */\nexport function useFocusTrap(\n container: HTMLElement | (() => HTMLElement | null),\n options: FocusTrapOptions = {},\n): FocusTrap {\n const {\n initialFocus,\n returnFocus = true,\n escapeDeactivates = true,\n allowOutsideClick = false,\n onDeactivate,\n } = options;\n\n const active = signal(false);\n let previouslyFocused: HTMLElement | null = null;\n\n function getContainer(): HTMLElement | null {\n return typeof container === 'function' ? container() : container;\n }\n\n function getFocusableElements(): HTMLElement[] {\n const el = getContainer();\n if (!el) return [];\n return Array.from(el.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n }\n\n function handleKeyDown(e: KeyboardEvent): void {\n if (e.key === 'Escape' && escapeDeactivates) {\n e.preventDefault();\n deactivate();\n onDeactivate?.();\n return;\n }\n\n if (e.key !== 'Tab') return;\n\n const focusable = getFocusableElements();\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n // Shift+Tab: wrap from first to last\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n // Tab: wrap from last to first\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n }\n\n function handleFocusOut(e: FocusEvent): void {\n if (!active() || allowOutsideClick) return;\n const el = getContainer();\n if (!el) return;\n\n const relatedTarget = e.relatedTarget as HTMLElement | null;\n if (relatedTarget && !el.contains(relatedTarget)) {\n // Focus escaped — pull it back\n const focusable = getFocusableElements();\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n }\n }\n\n function activate(): void {\n if (active()) return;\n active.set(true);\n\n previouslyFocused = document.activeElement as HTMLElement | null;\n\n document.addEventListener('keydown', handleKeyDown, true);\n\n const el = getContainer();\n if (el) {\n el.addEventListener('focusout', handleFocusOut);\n }\n\n // Focus the initial element\n requestAnimationFrame(() => {\n if (initialFocus) {\n const target = typeof initialFocus === 'string'\n ? getContainer()?.querySelector<HTMLElement>(initialFocus)\n : initialFocus;\n target?.focus();\n } else {\n const focusable = getFocusableElements();\n if (focusable.length > 0) focusable[0].focus();\n }\n });\n }\n\n function deactivate(): void {\n if (!active()) return;\n active.set(false);\n\n document.removeEventListener('keydown', handleKeyDown, true);\n\n const el = getContainer();\n if (el) {\n el.removeEventListener('focusout', handleFocusOut);\n }\n\n if (returnFocus && previouslyFocused) {\n previouslyFocused.focus();\n previouslyFocused = null;\n }\n }\n\n return {\n activate,\n deactivate,\n active: () => active(),\n };\n}\n\n// =========================================================================\n// useAnnounce\n// =========================================================================\n\nexport type AriaLive = 'polite' | 'assertive' | 'off';\n\nlet announceRegion: HTMLElement | null = null;\n\nfunction ensureAnnounceRegion(): HTMLElement {\n if (announceRegion && document.body.contains(announceRegion)) {\n return announceRegion;\n }\n\n const el = document.createElement('div');\n el.setAttribute('role', 'status');\n el.setAttribute('aria-live', 'polite');\n el.setAttribute('aria-atomic', 'true');\n el.style.cssText = [\n 'position: absolute',\n 'width: 1px',\n 'height: 1px',\n 'padding: 0',\n 'margin: -1px',\n 'overflow: hidden',\n 'clip: rect(0,0,0,0)',\n 'white-space: nowrap',\n 'border: 0',\n ].join('; ');\n\n document.body.appendChild(el);\n announceRegion = el;\n return el;\n}\n\n/**\n * Screen reader announcements via ARIA live regions.\n *\n * ```ts\n * const announce = useAnnounce();\n * announce('Page loaded: Dashboard');\n * announce('Error: Invalid email', 'assertive');\n * ```\n */\nexport function useAnnounce(): (message: string, politeness?: AriaLive) => void {\n return (message: string, politeness: AriaLive = 'polite') => {\n if (typeof document === 'undefined') return;\n\n const region = ensureAnnounceRegion();\n region.setAttribute('aria-live', politeness);\n\n // Clear then set to trigger announcement\n region.textContent = '';\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n };\n}\n\n// =========================================================================\n// useKeyboard\n// =========================================================================\n\nexport interface KeyBinding {\n /** Key combo: 'mod+k', 'Escape', 'ArrowDown', 'shift+Enter' */\n key: string;\n /** Handler function */\n handler: (e: KeyboardEvent) => void;\n /** Optional scope (only active when scope is enabled) */\n scope?: string;\n /** Description for help dialog */\n description?: string;\n /** Prevent default browser behavior (default: true) */\n preventDefault?: boolean;\n}\n\nexport interface KeyboardManager {\n /** Register a binding */\n bind(key: string, handler: (e: KeyboardEvent) => void, options?: {\n scope?: string;\n description?: string;\n preventDefault?: boolean;\n }): () => void;\n /** Enable a scope */\n enableScope(scope: string): void;\n /** Disable a scope */\n disableScope(scope: string): void;\n /** Get all bindings (for help dialog) */\n getBindings(): Array<{ key: string; description: string; scope?: string }>;\n /** Dispose all bindings */\n dispose(): void;\n}\n\n/**\n * Keyboard shortcut manager with scope support.\n *\n * ```ts\n * const kb = useKeyboard();\n * kb.bind('mod+k', () => openSearch(), { description: 'Open search' });\n * kb.bind('Escape', () => close(), { scope: 'modal' });\n * kb.enableScope('modal');\n * ```\n */\nexport function useKeyboard(): KeyboardManager {\n const bindings: KeyBinding[] = [];\n const activeScopes = new Set<string>();\n let listening = false;\n\n function handleKeyDown(e: KeyboardEvent): void {\n for (const binding of bindings) {\n if (binding.scope && !activeScopes.has(binding.scope)) continue;\n if (matchesKey(e, binding.key)) {\n if (binding.preventDefault !== false) {\n e.preventDefault();\n }\n binding.handler(e);\n return;\n }\n }\n }\n\n function startListening(): void {\n if (listening) return;\n if (typeof document === 'undefined') return;\n document.addEventListener('keydown', handleKeyDown);\n listening = true;\n }\n\n function bind(\n key: string,\n handler: (e: KeyboardEvent) => void,\n options?: { scope?: string; description?: string; preventDefault?: boolean },\n ): () => void {\n const binding: KeyBinding = {\n key,\n handler,\n scope: options?.scope,\n description: options?.description ?? '',\n preventDefault: options?.preventDefault,\n };\n bindings.push(binding);\n startListening();\n\n return () => {\n const idx = bindings.indexOf(binding);\n if (idx !== -1) bindings.splice(idx, 1);\n };\n }\n\n return {\n bind,\n enableScope(scope: string) { activeScopes.add(scope); },\n disableScope(scope: string) { activeScopes.delete(scope); },\n getBindings() {\n return bindings.map((b) => ({\n key: formatKeyCombo(b.key),\n description: b.description ?? '',\n scope: b.scope,\n }));\n },\n dispose() {\n bindings.length = 0;\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handleKeyDown);\n }\n listening = false;\n },\n };\n}\n\n// --- Key matching ---\n\nfunction matchesKey(e: KeyboardEvent, combo: string): boolean {\n const parts = combo.toLowerCase().split('+');\n const key = parts.pop()!;\n\n const needsMod = parts.includes('mod');\n const needsCtrl = parts.includes('ctrl');\n const needsShift = parts.includes('shift');\n const needsAlt = parts.includes('alt');\n\n // mod = Cmd on Mac, Ctrl elsewhere\n const isMac = typeof navigator !== 'undefined' && navigator.platform?.includes('Mac');\n const modPressed = isMac ? e.metaKey : e.ctrlKey;\n\n if (needsMod && !modPressed) return false;\n if (needsCtrl && !e.ctrlKey) return false;\n if (needsShift && !e.shiftKey) return false;\n if (needsAlt && !e.altKey) return false;\n\n return e.key.toLowerCase() === key || e.code.toLowerCase() === key;\n}\n\nfunction formatKeyCombo(combo: string): string {\n const isMac = typeof navigator !== 'undefined' && navigator.platform?.includes('Mac');\n return combo\n .replace(/mod/gi, isMac ? '⌘' : 'Ctrl')\n .replace(/shift/gi, isMac ? '⇧' : 'Shift')\n .replace(/alt/gi, isMac ? '⌥' : 'Alt')\n .replace(/\\+/g, isMac ? '' : '+');\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function w(i){let P=typeof i=="function"?{loader:i}:i,{loader:C,loading:c,error:f,timeout:s,delay:y=200}=P,l=null,t=null,o=null;function A(){return t||(t=C().then(e=>{l=e.default;}).catch(e=>{o=e instanceof Error?e:new Error(String(e));}),t)}return chunkXWVNLE2W_cjs.s(e=>{let n=chunkWOZWFMOK_cjs.c("loading"),m=chunkWOZWFMOK_cjs.c(false);A().then(()=>{o?n.set("error"):n.set("ready");});let a=null;y>0?a=setTimeout(()=>m.set(true),y):m.set(true);let u=null;return s&&(u=setTimeout(()=>{n()==="loading"&&(o=new Error(`Async component timed out after ${s}ms`),n.set("error"));},s)),()=>{let r=n();return r!=="loading"&&(a&&clearTimeout(a),u&&clearTimeout(u)),r==="ready"&&l?l(e.props):r==="error"&&f&&o?chunkXWVNLE2W_cjs.l(f(o)):r==="loading"&&m()&&c?chunkXWVNLE2W_cjs.l(c()):document.createComment("async-loading")}})}exports.a=w;//# sourceMappingURL=chunk-TFEHO7SF.cjs.map
2
+ //# sourceMappingURL=chunk-TFEHO7SF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/async-component.ts"],"names":["defineAsyncComponent","loaderOrOptions","options","loader","loadingFn","errorFn","timeout","delay","resolvedComp","loadPromise","loadError","startLoad","mod","err","defineComponent","ctx","state","signal","showLoading","delayTimer","timeoutTimer","s","nodeToDOM"],"mappings":"qHAiDO,SAASA,EACdC,CAAAA,CACc,CACd,IAAMC,CAAAA,CACJ,OAAOD,GAAoB,UAAA,CACvB,CAAE,OAAQA,CAAgB,CAAA,CAC1BA,EAEA,CACJ,MAAA,CAAAE,EACA,OAAA,CAASC,CAAAA,CACT,MAAOC,CAAAA,CACP,OAAA,CAAAC,EACA,KAAA,CAAAC,CAAAA,CAAQ,GACV,CAAA,CAAIL,CAAAA,CAGAM,EAAoC,IAAA,CACpCC,CAAAA,CAAoC,KACpCC,CAAAA,CAA0B,IAAA,CAE9B,SAASC,CAAAA,EAA2B,CAClC,OAAIF,CAAAA,GAEJA,CAAAA,CAAcN,GAAO,CAClB,IAAA,CAAMS,GAAQ,CACbJ,CAAAA,CAAeI,EAAI,QACrB,CAAC,EACA,KAAA,CAAOC,CAAAA,EAAQ,CACdH,CAAAA,CAAYG,CAAAA,YAAe,MAAQA,CAAAA,CAAM,IAAI,MAAM,MAAA,CAAOA,CAAG,CAAC,EAChE,CAAC,EAEIJ,CAAAA,CACT,CAEA,OAAOK,mBAAAA,CAAoBC,CAAAA,EAAQ,CACjC,IAAMC,CAAAA,CAAQC,oBAAsC,SAAS,CAAA,CACvDC,EAAcD,mBAAAA,CAAO,KAAK,EAGhCN,CAAAA,EAAU,CAAE,KAAK,IAAM,CACjBD,EACFM,CAAAA,CAAM,GAAA,CAAI,OAAO,CAAA,CAEjBA,CAAAA,CAAM,IAAI,OAAO,EAErB,CAAC,CAAA,CAGD,IAAIG,EAAmD,IAAA,CACnDZ,CAAAA,CAAQ,EACVY,CAAAA,CAAa,UAAA,CAAW,IAAMD,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAAGX,CAAK,EAE1DW,CAAAA,CAAY,GAAA,CAAI,IAAI,CAAA,CAItB,IAAIE,EAAqD,IAAA,CACzD,OAAId,IACFc,CAAAA,CAAe,UAAA,CAAW,IAAM,CAC1BJ,CAAAA,KAAY,SAAA,GACdN,CAAAA,CAAY,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmCJ,CAAO,CAAA,EAAA,CAAI,CAAA,CACpEU,EAAM,GAAA,CAAI,OAAO,GAErB,CAAA,CAAGV,CAAO,GAGL,IAAM,CACX,IAAMe,CAAAA,CAAIL,CAAAA,GAQV,OALIK,CAAAA,GAAM,YACJF,CAAAA,EAAY,YAAA,CAAaA,CAAU,CAAA,CACnCC,CAAAA,EAAc,aAAaA,CAAY,CAAA,CAAA,CAGzCC,IAAM,OAAA,EAAWb,CAAAA,CACZA,EAAaO,CAAAA,CAAI,KAAY,EAGlCM,CAAAA,GAAM,OAAA,EAAWhB,GAAWK,CAAAA,CACvBY,mBAAAA,CAAUjB,EAAQK,CAAS,CAAC,EAGjCW,CAAAA,GAAM,SAAA,EAAaH,GAAY,EAAKd,CAAAA,CAC/BkB,oBAAUlB,CAAAA,EAAW,EAIvB,QAAA,CAAS,aAAA,CAAc,eAAe,CAC/C,CACF,CAAC,CACH","file":"chunk-TFEHO7SF.cjs","sourcesContent":["/**\n * defineAsyncComponent — lazy component loading.\n *\n * Wraps a dynamic import() into a component that shows a loading\n * state while the chunk downloads, an error state if it fails,\n * and the real component once resolved.\n *\n * ```ts\n * const LazyChart = defineAsyncComponent(() => import('./Chart.akash'));\n *\n * // With loading/error:\n * const LazyChart = defineAsyncComponent({\n * loader: () => import('./Chart.akash'),\n * loading: () => <Spinner />,\n * error: (err) => <p>Failed: {err.message}</p>,\n * timeout: 10000,\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\n\n// --- Types ---\n\nexport type AsyncComponentLoader<P extends Record<string, unknown> = any> =\n () => Promise<{ default: Component<P> }>;\n\nexport interface AsyncComponentOptions<P extends Record<string, unknown> = any> {\n /** The async loader function (dynamic import) */\n loader: AsyncComponentLoader<P>;\n /** Component to show while loading */\n loading?: () => AkashNode;\n /** Component to show on error */\n error?: (error: Error) => AkashNode;\n /** Timeout in ms — show error after this (default: none) */\n timeout?: number;\n /** Delay in ms before showing loading state (default: 200) */\n delay?: number;\n}\n\n// --- defineAsyncComponent ---\n\n/**\n * Define a component that loads asynchronously via dynamic import.\n */\nexport function defineAsyncComponent<P extends Record<string, unknown> = any>(\n loaderOrOptions: AsyncComponentLoader<P> | AsyncComponentOptions<P>,\n): Component<P> {\n const options: AsyncComponentOptions<P> =\n typeof loaderOrOptions === 'function'\n ? { loader: loaderOrOptions }\n : loaderOrOptions;\n\n const {\n loader,\n loading: loadingFn,\n error: errorFn,\n timeout,\n delay = 200,\n } = options;\n\n // Cache the loaded component\n let resolvedComp: Component<P> | null = null;\n let loadPromise: Promise<void> | null = null;\n let loadError: Error | null = null;\n\n function startLoad(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n loadPromise = loader()\n .then((mod) => {\n resolvedComp = mod.default;\n })\n .catch((err) => {\n loadError = err instanceof Error ? err : new Error(String(err));\n });\n\n return loadPromise;\n }\n\n return defineComponent<P>((ctx) => {\n const state = signal<'loading' | 'ready' | 'error'>('loading');\n const showLoading = signal(false);\n\n // Start loading\n startLoad().then(() => {\n if (loadError) {\n state.set('error');\n } else {\n state.set('ready');\n }\n });\n\n // Delay before showing loading indicator\n let delayTimer: ReturnType<typeof setTimeout> | null = null;\n if (delay > 0) {\n delayTimer = setTimeout(() => showLoading.set(true), delay);\n } else {\n showLoading.set(true);\n }\n\n // Timeout\n let timeoutTimer: ReturnType<typeof setTimeout> | null = null;\n if (timeout) {\n timeoutTimer = setTimeout(() => {\n if (state() === 'loading') {\n loadError = new Error(`Async component timed out after ${timeout}ms`);\n state.set('error');\n }\n }, timeout);\n }\n\n return () => {\n const s = state();\n\n // Clear timers once resolved\n if (s !== 'loading') {\n if (delayTimer) clearTimeout(delayTimer);\n if (timeoutTimer) clearTimeout(timeoutTimer);\n }\n\n if (s === 'ready' && resolvedComp) {\n return resolvedComp(ctx.props as any);\n }\n\n if (s === 'error' && errorFn && loadError) {\n return nodeToDOM(errorFn(loadError));\n }\n\n if (s === 'loading' && showLoading() && loadingFn) {\n return nodeToDOM(loadingFn());\n }\n\n // Nothing to show yet\n return document.createComment('async-loading');\n };\n });\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import {s,l}from'./chunk-KE7BJTCD.js';function a(t){return {enterFrom:`${t}-enter-from`,enterActive:`${t}-enter-active`,enterTo:`${t}-enter-to`,exitFrom:`${t}-exit-from`,exitActive:`${t}-exit-active`,exitTo:`${t}-exit-to`}}function d(t,e,i){return new Promise(r=>{t.classList.add(e.enterFrom,e.enterActive),t.offsetHeight,t.classList.remove(e.enterFrom),t.classList.add(e.enterTo);let n=()=>{t.classList.remove(e.enterActive,e.enterTo),t.removeEventListener("transitionend",n),r();};i!==void 0?setTimeout(n,i):(t.addEventListener("transitionend",n,{once:true}),setTimeout(n,5e3));})}function c(t,e,i){return new Promise(r=>{t.classList.add(e.exitFrom,e.exitActive),t.offsetHeight,t.classList.remove(e.exitFrom),t.classList.add(e.exitTo);let n=()=>{t.classList.remove(e.exitActive,e.exitTo),t.removeEventListener("transitionend",n),r();};i!==void 0?setTimeout(n,i):(t.addEventListener("transitionend",n,{once:true}),setTimeout(n,5e3));})}var f=s(t=>{let e=t.props.name??"akash",i=a(e);return ()=>{let r=document.createElement("div");if(r.style.display="contents",t.props.when){let n=l(t.children());r.appendChild(n),n instanceof HTMLElement&&(t.props.onEnter?.(n),d(n,i,t.props.duration).then(()=>{t.props.onAfterEnter?.(n);}));}return r}});function v(t,e={}){let{property:i="all",duration:r="0.3s",easing:n="ease"}=e;return `
2
+ .${t}-enter-active,
3
+ .${t}-exit-active {
4
+ transition: ${i} ${r} ${n};
5
+ }
6
+
7
+ .${t}-enter-from,
8
+ .${t}-exit-to {
9
+ opacity: 0;
10
+ }
11
+
12
+ .${t}-enter-to,
13
+ .${t}-exit-from {
14
+ opacity: 1;
15
+ }
16
+ `.trim()}export{a,d as b,c,f as d,v as e};//# sourceMappingURL=chunk-TSFY5HKB.js.map
17
+ //# sourceMappingURL=chunk-TSFY5HKB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/transition.ts"],"names":["getTransitionClasses","name","enterTransition","el","classes","duration","resolve","onEnd","exitTransition","Transition","defineComponent","ctx","container","content","nodeToDOM","generateTransitionCSS","options","property","easing"],"mappings":"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","file":"chunk-TSFY5HKB.js","sourcesContent":["/**\n * Transition/Animation system.\n *\n * Provides CSS-based enter/exit transitions for elements.\n * Works with <Transition> component or programmatic API.\n *\n * Class naming convention (matches Vue/Svelte):\n * - `{name}-enter-from` — initial enter state\n * - `{name}-enter-active` — active enter transition\n * - `{name}-enter-to` — final enter state\n * - `{name}-exit-from` — initial exit state\n * - `{name}-exit-active` — active exit transition\n * - `{name}-exit-to` — final exit state\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// --- Types ---\n\nexport interface TransitionProps {\n /** Transition name (used as CSS class prefix) */\n name?: string;\n /** Duration in ms (overrides CSS transition duration) */\n duration?: number;\n /** Whether the content is shown */\n when: boolean;\n /** CSS transition mode */\n mode?: 'in-out' | 'out-in';\n /** Callback when enter transition starts */\n onEnter?: (el: HTMLElement) => void;\n /** Callback when enter transition completes */\n onAfterEnter?: (el: HTMLElement) => void;\n /** Callback when exit transition starts */\n onExit?: (el: HTMLElement) => void;\n /** Callback when exit transition completes */\n onAfterExit?: (el: HTMLElement) => void;\n}\n\nexport interface TransitionClasses {\n enterFrom: string;\n enterActive: string;\n enterTo: string;\n exitFrom: string;\n exitActive: string;\n exitTo: string;\n}\n\n// --- CSS class helpers ---\n\n/**\n * Get the transition CSS class names for a given transition name.\n */\nexport function getTransitionClasses(name: string): TransitionClasses {\n return {\n enterFrom: `${name}-enter-from`,\n enterActive: `${name}-enter-active`,\n enterTo: `${name}-enter-to`,\n exitFrom: `${name}-exit-from`,\n exitActive: `${name}-exit-active`,\n exitTo: `${name}-exit-to`,\n };\n}\n\n// --- Programmatic transition API ---\n\n/**\n * Run an enter transition on an element.\n * Returns a promise that resolves when the transition completes.\n */\nexport function enterTransition(\n el: HTMLElement,\n classes: TransitionClasses,\n duration?: number,\n): Promise<void> {\n return new Promise((resolve) => {\n // Apply initial state\n el.classList.add(classes.enterFrom, classes.enterActive);\n\n // Force reflow to ensure the initial state is applied\n void el.offsetHeight;\n\n // Transition to final state\n el.classList.remove(classes.enterFrom);\n el.classList.add(classes.enterTo);\n\n const onEnd = () => {\n el.classList.remove(classes.enterActive, classes.enterTo);\n el.removeEventListener('transitionend', onEnd);\n resolve();\n };\n\n if (duration !== undefined) {\n setTimeout(onEnd, duration);\n } else {\n el.addEventListener('transitionend', onEnd, { once: true });\n // Fallback timeout in case transitionend never fires\n setTimeout(onEnd, 5000);\n }\n });\n}\n\n/**\n * Run an exit transition on an element.\n * Returns a promise that resolves when the transition completes.\n */\nexport function exitTransition(\n el: HTMLElement,\n classes: TransitionClasses,\n duration?: number,\n): Promise<void> {\n return new Promise((resolve) => {\n el.classList.add(classes.exitFrom, classes.exitActive);\n\n void el.offsetHeight;\n\n el.classList.remove(classes.exitFrom);\n el.classList.add(classes.exitTo);\n\n const onEnd = () => {\n el.classList.remove(classes.exitActive, classes.exitTo);\n el.removeEventListener('transitionend', onEnd);\n resolve();\n };\n\n if (duration !== undefined) {\n setTimeout(onEnd, duration);\n } else {\n el.addEventListener('transitionend', onEnd, { once: true });\n setTimeout(onEnd, 5000);\n }\n });\n}\n\n// --- <Transition> component ---\n\n/**\n * <Transition> component.\n *\n * Applies CSS enter/exit transitions when `when` changes.\n *\n * ```html\n * <Transition name=\"fade\" when={isVisible()}>\n * <div>Content</div>\n * </Transition>\n * ```\n *\n * CSS:\n * ```css\n * .fade-enter-active, .fade-exit-active {\n * transition: opacity 0.3s;\n * }\n * .fade-enter-from, .fade-exit-to {\n * opacity: 0;\n * }\n * ```\n */\nexport const Transition = defineComponent<TransitionProps>((ctx) => {\n const name = ctx.props.name ?? 'akash';\n const classes = getTransitionClasses(name);\n\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n if (ctx.props.when) {\n const content = nodeToDOM(ctx.children());\n container.appendChild(content);\n\n // Run enter transition on mount\n if (content instanceof HTMLElement) {\n ctx.props.onEnter?.(content);\n enterTransition(content, classes, ctx.props.duration).then(() => {\n ctx.props.onAfterEnter?.(content);\n });\n }\n }\n\n return container;\n };\n});\n\n// --- Preset transition styles ---\n\n/**\n * Generate CSS for common transition presets.\n * Inject this into your app's styles or use the CLI to generate it.\n */\nexport function generateTransitionCSS(name: string, options: {\n property?: string;\n duration?: string;\n easing?: string;\n} = {}): string {\n const {\n property = 'all',\n duration = '0.3s',\n easing = 'ease',\n } = options;\n\n return `\n.${name}-enter-active,\n.${name}-exit-active {\n transition: ${property} ${duration} ${easing};\n}\n\n.${name}-enter-from,\n.${name}-exit-to {\n opacity: 0;\n}\n\n.${name}-enter-to,\n.${name}-exit-from {\n opacity: 1;\n}\n`.trim();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkIQGSDFBI_cjs=require('./chunk-IQGSDFBI.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function g(o,e,r,n){let c=[],d=chunkIQGSDFBI_cjs.c(),N=chunkWOZWFMOK_cjs.e(()=>{let s=String(r());for(let t of c)t.parentNode&&t.parentNode.removeChild(t);c=[];let i=n[s]??n._default,a=e.parentNode;if(i&&a){let t=d?chunkIQGSDFBI_cjs.d(d,i):i(),f=t instanceof DocumentFragment?Array.from(t.childNodes):[t];for(let k of f)a.insertBefore(k,e);c=f;}},{render:true});return ()=>{N();for(let s of c)s.parentNode&&s.parentNode.removeChild(s);}}var y=chunkXWVNLE2W_cjs.s(o=>()=>{let e=document.createElement("div");e.style.display="contents";let r=document.createComment("switch");e.appendChild(r);let n={...o.props.cases};return o.props.fallback&&(n._default=()=>chunkXWVNLE2W_cjs.l(o.props.fallback())),g(e,r,()=>o.props.on,Object.fromEntries(Object.entries(n).map(([c,d])=>[c,()=>chunkXWVNLE2W_cjs.l(d())]))),e});function C(o,e){let r=String(o),n=e[r]??e._;return n?n(o):void 0}exports.a=g;exports.b=y;exports.c=C;//# sourceMappingURL=chunk-TYTEJYUQ.cjs.map
2
+ //# sourceMappingURL=chunk-TYTEJYUQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/switch.ts"],"names":["renderSwitch","parent","anchor","expression","cases","currentNodes","scope","getCurrentScope","dispose","effect","value","node","branch","liveParent","runInScope","nodes","n","Switch","defineComponent","ctx","container","casesMap","nodeToDOM","k","v","match","key"],"mappings":"uKAsCO,SAASA,CAAAA,CACdC,EACAC,CAAAA,CACAC,CAAAA,CACAC,EACY,CACZ,IAAIC,CAAAA,CAAuB,EAAC,CAGtBC,CAAAA,CAAQC,qBAAgB,CAExBC,CAAAA,CAAUC,oBACd,IAAM,CACJ,IAAMC,CAAAA,CAAQ,MAAA,CAAOP,CAAAA,EAAY,CAAA,CAGjC,IAAA,IAAWQ,KAAQN,CAAAA,CACbM,CAAAA,CAAK,YAAYA,CAAAA,CAAK,UAAA,CAAW,YAAYA,CAAI,CAAA,CAEvDN,CAAAA,CAAe,EAAC,CAGhB,IAAMO,EAASR,CAAAA,CAAMM,CAAK,GAAKN,CAAAA,CAAM,QAAA,CAC/BS,EAAaX,CAAAA,CAAO,UAAA,CAC1B,GAAIU,CAAAA,EAAUC,CAAAA,CAAY,CACxB,IAAMF,CAAAA,CAAOL,CAAAA,CAAQQ,oBAAWR,CAAAA,CAAOM,CAAM,EAAIA,CAAAA,EAAO,CAClDG,CAAAA,CAAQJ,CAAAA,YAAgB,gBAAA,CAC1B,KAAA,CAAM,KAAKA,CAAAA,CAAK,UAAU,EAC1B,CAACA,CAAI,EACT,IAAA,IAAWK,CAAAA,IAAKD,CAAAA,CACdF,CAAAA,CAAW,YAAA,CAAaG,CAAAA,CAAGd,CAAM,CAAA,CAEnCG,CAAAA,CAAeU,EACjB,CACF,CAAA,CACA,CAAE,MAAA,CAAQ,IAAK,CACjB,CAAA,CAEA,OAAO,IAAM,CACXP,CAAAA,EAAQ,CACR,QAAWG,CAAAA,IAAQN,CAAAA,CACbM,EAAK,UAAA,EAAYA,CAAAA,CAAK,UAAA,CAAW,WAAA,CAAYA,CAAI,EAEzD,CACF,CA8BO,IAAMM,EAASC,mBAAAA,CAA8BC,CAAAA,EAC3C,IAAM,CACX,IAAMC,CAAAA,CAAY,QAAA,CAAS,aAAA,CAAc,KAAK,EAC9CA,CAAAA,CAAU,KAAA,CAAM,QAAU,UAAA,CAC1B,IAAMlB,EAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CkB,CAAAA,CAAU,WAAA,CAAYlB,CAAM,CAAA,CAE5B,IAAMmB,EAAW,CAAE,GAAGF,EAAI,KAAA,CAAM,KAAM,CAAA,CACtC,OAAIA,CAAAA,CAAI,KAAA,CAAM,WACZE,CAAAA,CAAS,QAAA,CAAW,IAAMC,mBAAAA,CAAUH,CAAAA,CAAI,MAAM,QAAA,EAAW,CAAA,CAAA,CAG3DnB,CAAAA,CACEoB,CAAAA,CACAlB,CAAAA,CACA,IAAMiB,CAAAA,CAAI,KAAA,CAAM,GAChB,MAAA,CAAO,WAAA,CACL,OAAO,OAAA,CAAQE,CAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAACE,EAAGC,CAAC,CAAA,GAAM,CACvCD,CAAAA,CACA,IAAMD,oBAAUE,CAAAA,EAAG,CACrB,CAAC,CACH,CACF,EAEOJ,CACT,CACD,EAkBM,SAASK,CAAAA,CACdf,EACAN,CAAAA,CACe,CACf,IAAMsB,CAAAA,CAAM,MAAA,CAAOhB,CAAK,EAClBE,CAAAA,CAASR,CAAAA,CAAMsB,CAAG,CAAA,EAAKtB,CAAAA,CAAM,CAAA,CACnC,OAAOQ,CAAAA,CAASA,CAAAA,CAAOF,CAAK,CAAA,CAAI,MAClC","file":"chunk-TYTEJYUQ.cjs","sourcesContent":["/**\n * Switch/Case/Default control flow component.\n *\n * Renders one of multiple branches based on a reactive expression.\n *\n * ```html\n * <Switch on={status()}>\n * <Case value=\"loading\"><Spinner /></Case>\n * <Case value=\"error\"><ErrorMessage /></Case>\n * <Case value=\"success\"><Content /></Case>\n * <Default><Fallback /></Default>\n * </Switch>\n * ```\n *\n * Or programmatic:\n * ```ts\n * renderSwitch(container, anchor, () => status(), {\n * loading: () => Spinner({}),\n * error: () => ErrorView({}),\n * success: () => Content({}),\n * _default: () => Fallback({}),\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal, effect } from './signals.js';\nimport { getCurrentScope, runInScope } from './context.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// =========================================================================\n// Programmatic renderSwitch\n// =========================================================================\n\n/**\n * Render a switch block. Swaps DOM based on reactive expression value.\n */\nexport function renderSwitch(\n parent: Node,\n anchor: Node,\n expression: () => unknown,\n cases: Record<string, () => Node>,\n): () => void {\n let currentNodes: Node[] = [];\n\n // Capture scope so children inherit provide/inject context\n const scope = getCurrentScope();\n\n const dispose = effect(\n () => {\n const value = String(expression());\n\n // Remove current nodes\n for (const node of currentNodes) {\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n currentNodes = [];\n\n // Find matching case or default\n const branch = cases[value] ?? cases._default;\n const liveParent = anchor.parentNode;\n if (branch && liveParent) {\n const node = scope ? runInScope(scope, branch) : branch();\n const nodes = node instanceof DocumentFragment\n ? Array.from(node.childNodes)\n : [node];\n for (const n of nodes) {\n liveParent.insertBefore(n, anchor);\n }\n currentNodes = nodes;\n }\n },\n { render: true },\n );\n\n return () => {\n dispose();\n for (const node of currentNodes) {\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n };\n}\n\n// =========================================================================\n// <Switch> component\n// =========================================================================\n\nexport interface SwitchProps {\n /** The value to switch on */\n on: unknown;\n /** Cases map: value → render function */\n cases: Record<string, () => AkashNode>;\n /** Default case */\n fallback?: () => AkashNode;\n}\n\n/**\n * <Switch> component — declarative switch/case.\n *\n * ```ts\n * Switch({\n * on: status(),\n * cases: {\n * loading: () => Spinner({}),\n * error: () => ErrorView({}),\n * success: () => Content({}),\n * },\n * fallback: () => 'Unknown status',\n * });\n * ```\n */\nexport const Switch = defineComponent<SwitchProps>((ctx) => {\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n const anchor = document.createComment('switch');\n container.appendChild(anchor);\n\n const casesMap = { ...ctx.props.cases };\n if (ctx.props.fallback) {\n casesMap._default = () => nodeToDOM(ctx.props.fallback!());\n }\n\n renderSwitch(\n container,\n anchor,\n () => ctx.props.on,\n Object.fromEntries(\n Object.entries(casesMap).map(([k, v]) => [\n k,\n () => nodeToDOM(v()),\n ]),\n ),\n );\n\n return container;\n };\n});\n\n// =========================================================================\n// match() — functional pattern matching for signals\n// =========================================================================\n\n/**\n * Pattern match on a signal value. Returns the result of the matching branch.\n *\n * ```ts\n * const message = match(status(), {\n * loading: () => 'Loading...',\n * error: () => 'Something went wrong',\n * success: () => 'Done!',\n * _: () => 'Unknown',\n * });\n * ```\n */\nexport function match<T, R>(\n value: T,\n cases: Record<string, (value: T) => R> & { _?: (value: T) => R },\n): R | undefined {\n const key = String(value);\n const branch = cases[key] ?? cases._;\n return branch ? branch(value) : undefined;\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import {c as c$1}from'./chunk-N3ITIHHM.js';function o(t){let r=Array.isArray(t)?t:[t];for(let e of r){let n={"@context":"https://schema.org",...e};c$1({script:[{type:"application/ld+json",innerHTML:JSON.stringify(n)}]});}}function s(t){let r=[{property:"og:title",content:t.title}];t.description&&r.push({property:"og:description",content:t.description}),t.image&&r.push({property:"og:image",content:t.image}),t.url&&r.push({property:"og:url",content:t.url}),t.type&&r.push({property:"og:type",content:t.type}),t.siteName&&r.push({property:"og:site_name",content:t.siteName}),t.locale&&r.push({property:"og:locale",content:t.locale}),c$1({meta:r});}function p(t){let r=[{name:"twitter:title",content:t.title}];t.card&&r.push({name:"twitter:card",content:t.card}),t.description&&r.push({name:"twitter:description",content:t.description}),t.image&&r.push({name:"twitter:image",content:t.image}),t.site&&r.push({name:"twitter:site",content:t.site}),t.creator&&r.push({name:"twitter:creator",content:t.creator}),c$1({meta:r});}function c(t){let r=[];t.description&&r.push({name:"description",content:t.description}),t.robots&&r.push({name:"robots",content:t.robots});let e=[];t.canonical&&e.push({rel:"canonical",href:t.canonical}),c$1({title:t.title,meta:r,link:e}),t.openGraph&&s(t.openGraph),t.twitter&&p(t.twitter),t.structuredData&&o(t.structuredData);}function u(t,r){let e=`<?xml version="1.0" encoding="UTF-8"?>
2
+ `;e+=`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ `;for(let n of r)e+=` <url>
4
+ `,e+=` <loc>${t}${n.url}</loc>
5
+ `,n.lastmod&&(e+=` <lastmod>${n.lastmod}</lastmod>
6
+ `),n.changefreq&&(e+=` <changefreq>${n.changefreq}</changefreq>
7
+ `),n.priority!=null&&(e+=` <priority>${n.priority}</priority>
8
+ `),e+=` </url>
9
+ `;return e+=`</urlset>
10
+ `,e}export{o as a,s as b,p as c,c as d,u as e};//# sourceMappingURL=chunk-TZHEZW6R.js.map
11
+ //# sourceMappingURL=chunk-TZHEZW6R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/seo.ts"],"names":["useStructuredData","data","items","item","ld","useHead","useOpenGraph","meta","useTwitterCard","useSEO","config","link","generateSitemap","baseUrl","entries","xml","entry"],"mappings":"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","file":"chunk-TZHEZW6R.js","sourcesContent":["/**\n * SEO utilities.\n *\n * Structured data (JSON-LD), Open Graph helpers, and canonical URL management.\n * Works with useHead() for SSR-compatible head tag management.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'Article',\n * headline: 'My Post',\n * author: { '@type': 'Person', name: 'Alice' },\n * });\n * ```\n */\n\nimport { useHead } from './head.js';\n\n// --- Types ---\n\nexport interface StructuredData {\n '@context'?: string;\n '@type': string;\n [key: string]: unknown;\n}\n\nexport interface OpenGraphData {\n title: string;\n description?: string;\n image?: string;\n url?: string;\n type?: string;\n siteName?: string;\n locale?: string;\n}\n\nexport interface TwitterCardData {\n card?: 'summary' | 'summary_large_image' | 'player' | 'app';\n title: string;\n description?: string;\n image?: string;\n site?: string;\n creator?: string;\n}\n\nexport interface SEOConfig {\n title: string;\n description?: string;\n canonical?: string;\n robots?: string;\n openGraph?: OpenGraphData;\n twitter?: TwitterCardData;\n structuredData?: StructuredData | StructuredData[];\n}\n\n// --- useStructuredData ---\n\n/**\n * Inject JSON-LD structured data into the document head.\n * Data is automatically wrapped with @context.\n *\n * ```ts\n * useStructuredData({\n * '@type': 'WebSite',\n * name: 'AkashJS',\n * url: 'https://akashjs.dev',\n * });\n * ```\n */\nexport function useStructuredData(data: StructuredData | StructuredData[]): void {\n const items = Array.isArray(data) ? data : [data];\n\n for (const item of items) {\n const ld = { '@context': 'https://schema.org', ...item };\n useHead({\n script: [\n { type: 'application/ld+json', innerHTML: JSON.stringify(ld) },\n ],\n });\n }\n}\n\n// --- useOpenGraph ---\n\n/**\n * Set Open Graph meta tags.\n *\n * ```ts\n * useOpenGraph({\n * title: 'My Page',\n * description: 'Page description',\n * image: '/og-image.jpg',\n * type: 'article',\n * });\n * ```\n */\nexport function useOpenGraph(data: OpenGraphData): void {\n const meta: Array<{ property: string; content: string }> = [\n { property: 'og:title', content: data.title },\n ];\n\n if (data.description) meta.push({ property: 'og:description', content: data.description });\n if (data.image) meta.push({ property: 'og:image', content: data.image });\n if (data.url) meta.push({ property: 'og:url', content: data.url });\n if (data.type) meta.push({ property: 'og:type', content: data.type });\n if (data.siteName) meta.push({ property: 'og:site_name', content: data.siteName });\n if (data.locale) meta.push({ property: 'og:locale', content: data.locale });\n\n useHead({ meta });\n}\n\n// --- useTwitterCard ---\n\n/**\n * Set Twitter Card meta tags.\n *\n * ```ts\n * useTwitterCard({\n * card: 'summary_large_image',\n * title: 'My Page',\n * image: '/twitter-card.jpg',\n * });\n * ```\n */\nexport function useTwitterCard(data: TwitterCardData): void {\n const meta: Array<{ name: string; content: string }> = [\n { name: 'twitter:title', content: data.title },\n ];\n\n if (data.card) meta.push({ name: 'twitter:card', content: data.card });\n if (data.description) meta.push({ name: 'twitter:description', content: data.description });\n if (data.image) meta.push({ name: 'twitter:image', content: data.image });\n if (data.site) meta.push({ name: 'twitter:site', content: data.site });\n if (data.creator) meta.push({ name: 'twitter:creator', content: data.creator });\n\n useHead({ meta });\n}\n\n// --- useSEO (all-in-one) ---\n\n/**\n * Set all SEO-related head tags at once.\n *\n * ```ts\n * useSEO({\n * title: 'My Page | MySite',\n * description: 'Page description',\n * canonical: 'https://mysite.com/page',\n * openGraph: { title: 'My Page', image: '/og.jpg' },\n * twitter: { card: 'summary_large_image', title: 'My Page' },\n * structuredData: { '@type': 'WebPage', name: 'My Page' },\n * });\n * ```\n */\nexport function useSEO(config: SEOConfig): void {\n const meta: Array<{ name?: string; property?: string; content: string }> = [];\n\n if (config.description) {\n meta.push({ name: 'description', content: config.description });\n }\n if (config.robots) {\n meta.push({ name: 'robots', content: config.robots });\n }\n\n const link: Array<{ rel: string; href: string }> = [];\n if (config.canonical) {\n link.push({ rel: 'canonical', href: config.canonical });\n }\n\n useHead({ title: config.title, meta, link });\n\n if (config.openGraph) useOpenGraph(config.openGraph);\n if (config.twitter) useTwitterCard(config.twitter);\n if (config.structuredData) useStructuredData(config.structuredData);\n}\n\n// --- Sitemap generation (for CLI/build) ---\n\nexport interface SitemapEntry {\n url: string;\n lastmod?: string;\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n priority?: number;\n}\n\n/**\n * Generate a sitemap.xml string from route entries.\n *\n * ```ts\n * const xml = generateSitemap('https://mysite.com', [\n * { url: '/', priority: 1.0 },\n * { url: '/about', changefreq: 'monthly' },\n * { url: '/blog/hello', lastmod: '2026-03-29' },\n * ]);\n * ```\n */\nexport function generateSitemap(baseUrl: string, entries: SitemapEntry[]): string {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n xml += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n';\n\n for (const entry of entries) {\n xml += ' <url>\\n';\n xml += ` <loc>${baseUrl}${entry.url}</loc>\\n`;\n if (entry.lastmod) xml += ` <lastmod>${entry.lastmod}</lastmod>\\n`;\n if (entry.changefreq) xml += ` <changefreq>${entry.changefreq}</changefreq>\\n`;\n if (entry.priority != null) xml += ` <priority>${entry.priority}</priority>\\n`;\n xml += ' </url>\\n';\n }\n\n xml += '</urlset>\\n';\n return xml;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ var f=false,u=[],l=0;function g(){f=true,u=[],l=performance.now();}function P(){f=false;let r=performance.now();return {entries:[...u],totalDuration:r-l,startTime:l,endTime:r}}function E(){return f}function m(r,e,t){f&&u.push({type:r,name:e,duration:t,timestamp:performance.now()});}function p(r){let e=r.entries.filter(n=>n.type==="render"),t=r.entries.filter(n=>n.type==="effect"),s=r.entries.filter(n=>n.type==="signal-update"),o=r.entries.filter(n=>n.type==="computed"),c=n=>n.length>0?n.reduce((a,i)=>a+i.duration,0)/n.length:0,d=n=>n.length>0?n.reduce((a,i)=>i.duration>a.duration?i:a):null;return {totalRenders:e.length,totalEffects:t.length,totalSignalUpdates:s.length,totalComputedEvals:o.length,avgRenderTime:c(e),avgEffectTime:c(t),slowestRender:d(e),slowestEffect:d(t)}}function w(r,e){let t=performance.now(),s=e(),o=performance.now()-t;return m("render",r,o),{result:s,duration:o}}async function y(r,e){let t=performance.now(),s=await e(),o=performance.now()-t;return m("render",r,o),{result:s,duration:o}}function T(r){let e=0,t=0;return {start(){e=performance.now();},stop(){t=performance.now()-e,m("render",r,t);},get duration(){return t}}}function x(r){let e=p(r),t=`
2
+ Performance Profile
3
+ `;return t+=" "+"\u2500".repeat(50)+`
4
+ `,t+=` Duration: ${r.totalDuration.toFixed(1)} ms
5
+ `,t+=` Renders: ${e.totalRenders} (avg ${e.avgRenderTime.toFixed(2)} ms)
6
+ `,t+=` Effects: ${e.totalEffects} (avg ${e.avgEffectTime.toFixed(2)} ms)
7
+ `,t+=` Signal updates: ${e.totalSignalUpdates}
8
+ `,t+=` Computed evals: ${e.totalComputedEvals}
9
+ `,e.slowestRender&&(t+=` Slowest render: ${e.slowestRender.name} (${e.slowestRender.duration.toFixed(2)} ms)
10
+ `),e.slowestEffect&&(t+=` Slowest effect: ${e.slowestEffect.name} (${e.slowestEffect.duration.toFixed(2)} ms)
11
+ `),t+=" "+"\u2500".repeat(50)+`
12
+ `,t}export{g as a,P as b,E as c,m as d,p as e,w as f,y as g,T as h,x as i};//# sourceMappingURL=chunk-U65WRXZC.js.map
13
+ //# sourceMappingURL=chunk-U65WRXZC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/perf.ts"],"names":["profiling","entries","profileStart","startProfiling","stopProfiling","endTime","isProfiling","recordPerfEntry","type","name","duration","getProfileSummary","profile","renders","e","effects","signalUpdates","computeds","avg","arr","s","slowest","measureSync","fn","start","result","measureAsync","createTimer","startTime","dur","formatProfile","summary","out"],"mappings":"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","file":"chunk-U65WRXZC.js","sourcesContent":["/**\n * Performance profiling utilities.\n *\n * Measure component render times, signal propagation, and\n * effect execution for performance debugging.\n *\n * ```ts\n * import { startProfiling, stopProfiling, getProfile } from '@akashjs/runtime';\n *\n * startProfiling();\n * // ... do stuff ...\n * stopProfiling();\n * console.table(getProfile().entries);\n * ```\n */\n\n// --- Types ---\n\nexport interface PerfEntry {\n type: 'render' | 'effect' | 'signal-update' | 'computed';\n name: string;\n duration: number;\n timestamp: number;\n}\n\nexport interface PerfProfile {\n entries: PerfEntry[];\n totalDuration: number;\n startTime: number;\n endTime: number;\n}\n\nexport interface PerfSummary {\n totalRenders: number;\n totalEffects: number;\n totalSignalUpdates: number;\n totalComputedEvals: number;\n avgRenderTime: number;\n avgEffectTime: number;\n slowestRender: PerfEntry | null;\n slowestEffect: PerfEntry | null;\n}\n\n// --- Profiling state ---\n\nlet profiling = false;\nlet entries: PerfEntry[] = [];\nlet profileStart = 0;\n\n// --- Public API ---\n\n/**\n * Start profiling. Clears previous data.\n */\nexport function startProfiling(): void {\n profiling = true;\n entries = [];\n profileStart = performance.now();\n}\n\n/**\n * Stop profiling.\n */\nexport function stopProfiling(): PerfProfile {\n profiling = false;\n const endTime = performance.now();\n\n return {\n entries: [...entries],\n totalDuration: endTime - profileStart,\n startTime: profileStart,\n endTime,\n };\n}\n\n/**\n * Check if profiling is active.\n */\nexport function isProfiling(): boolean {\n return profiling;\n}\n\n/**\n * Record a performance entry (called internally by the framework).\n */\nexport function recordPerfEntry(\n type: PerfEntry['type'],\n name: string,\n duration: number,\n): void {\n if (!profiling) return;\n entries.push({\n type,\n name,\n duration,\n timestamp: performance.now(),\n });\n}\n\n/**\n * Get a summary of the profiling data.\n */\nexport function getProfileSummary(profile: PerfProfile): PerfSummary {\n const renders = profile.entries.filter((e) => e.type === 'render');\n const effects = profile.entries.filter((e) => e.type === 'effect');\n const signalUpdates = profile.entries.filter((e) => e.type === 'signal-update');\n const computeds = profile.entries.filter((e) => e.type === 'computed');\n\n const avg = (arr: PerfEntry[]) =>\n arr.length > 0 ? arr.reduce((s, e) => s + e.duration, 0) / arr.length : 0;\n\n const slowest = (arr: PerfEntry[]) =>\n arr.length > 0 ? arr.reduce((s, e) => (e.duration > s.duration ? e : s)) : null;\n\n return {\n totalRenders: renders.length,\n totalEffects: effects.length,\n totalSignalUpdates: signalUpdates.length,\n totalComputedEvals: computeds.length,\n avgRenderTime: avg(renders),\n avgEffectTime: avg(effects),\n slowestRender: slowest(renders),\n slowestEffect: slowest(effects),\n };\n}\n\n// --- Measurement helpers ---\n\n/**\n * Measure the time to execute a function.\n *\n * ```ts\n * const { result, duration } = measureSync('my-operation', () => expensiveWork());\n * ```\n */\nexport function measureSync<T>(name: string, fn: () => T): { result: T; duration: number } {\n const start = performance.now();\n const result = fn();\n const duration = performance.now() - start;\n recordPerfEntry('render', name, duration);\n return { result, duration };\n}\n\n/**\n * Measure the time to execute an async function.\n */\nexport async function measureAsync<T>(\n name: string,\n fn: () => Promise<T>,\n): Promise<{ result: T; duration: number }> {\n const start = performance.now();\n const result = await fn();\n const duration = performance.now() - start;\n recordPerfEntry('render', name, duration);\n return { result, duration };\n}\n\n/**\n * Create a named timer for manual start/stop measurement.\n *\n * ```ts\n * const timer = createTimer('data-fetch');\n * timer.start();\n * await fetch(...);\n * timer.stop(); // records the entry\n * timer.duration; // ms\n * ```\n */\nexport function createTimer(name: string) {\n let startTime = 0;\n let dur = 0;\n\n return {\n start() { startTime = performance.now(); },\n stop() {\n dur = performance.now() - startTime;\n recordPerfEntry('render', name, dur);\n },\n get duration() { return dur; },\n };\n}\n\n/**\n * Format a profile for console output.\n */\nexport function formatProfile(profile: PerfProfile): string {\n const summary = getProfileSummary(profile);\n let out = '\\n Performance Profile\\n';\n out += ' ' + '─'.repeat(50) + '\\n';\n out += ` Duration: ${profile.totalDuration.toFixed(1)} ms\\n`;\n out += ` Renders: ${summary.totalRenders} (avg ${summary.avgRenderTime.toFixed(2)} ms)\\n`;\n out += ` Effects: ${summary.totalEffects} (avg ${summary.avgEffectTime.toFixed(2)} ms)\\n`;\n out += ` Signal updates: ${summary.totalSignalUpdates}\\n`;\n out += ` Computed evals: ${summary.totalComputedEvals}\\n`;\n\n if (summary.slowestRender) {\n out += ` Slowest render: ${summary.slowestRender.name} (${summary.slowestRender.duration.toFixed(2)} ms)\\n`;\n }\n if (summary.slowestEffect) {\n out += ` Slowest effect: ${summary.slowestEffect.name} (${summary.slowestEffect.duration.toFixed(2)} ms)\\n`;\n }\n\n out += ' ' + '─'.repeat(50) + '\\n';\n return out;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ function f(r){let t=r.length;if(t===0)return [];let n=[],s=new Array(t).fill(-1),o=[];for(let e=0;e<t;e++){let c=r[e];if(c===-1)continue;let u=0,m=n.length;for(;u<m;){let p=u+m>>1;n[p]<c?u=p+1:m=p;}n[u]=c,o[u]=e,u>0&&(s[e]=o[u-1]);}let i=new Array(n.length),l=o[n.length-1];for(let e=n.length-1;e>=0;e--)i[e]=l,l=s[l];return i}function h(r,t){let n=[],s=new Map;for(let e=0;e<r.length;e++)s.set(r[e],e);let o=new Array(t.length);for(let e=0;e<t.length;e++)o[e]=s.get(t[e])??-1;let i=new Set(t);for(let e=0;e<r.length;e++)i.has(r[e])||n.push({type:"remove",oldIndex:e});let l=new Set(f(o));for(let e=0;e<t.length;e++)o[e]===-1?n.push({type:"insert",newIndex:e}):l.has(e)||n.push({type:"move",newIndex:e,oldIndex:o[e]});return n}function b(r,t){let n=h(r,t),s=0,o=0,i=0;for(let l of n)l.type==="insert"?s++:l.type==="move"?o++:i++;return {inserts:s,moves:o,removes:i}}export{f as a,h as b,b as c};//# sourceMappingURL=chunk-UT4MWGJ3.js.map
2
+ //# sourceMappingURL=chunk-UT4MWGJ3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reconcile.ts"],"names":["longestIncreasingSubsequence","arr","n","tails","predecessors","indices","i","value","lo","hi","mid","result","k","reconcileKeys","oldKeys","newKeys","ops","oldKeyMap","newToOld","newKeySet","lis","countOps","inserts","moves","removes","op"],"mappings":"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","file":"chunk-UT4MWGJ3.js","sourcesContent":["/**\n * List reconciliation with Longest Increasing Subsequence (LIS).\n *\n * When a keyed list updates, we need to determine the minimal set of\n * DOM operations (inserts, moves, removes). The LIS of the new key\n * positions tells us which nodes are already in the correct relative\n * order and don't need to move.\n *\n * This is the same algorithm used by Vue 3, Solid, and Inferno.\n */\n\n/**\n * Find the Longest Increasing Subsequence of indices.\n * Returns the indices into the input array that form the LIS.\n *\n * Time: O(n log n), Space: O(n)\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // tails[i] = smallest tail value for increasing subsequence of length i+1\n const tails: number[] = [];\n // predecessors[i] = index of previous element in the LIS ending at i\n const predecessors: number[] = new Array(n).fill(-1);\n // indices[i] = index in arr of the tail for length i+1\n const indices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n const value = arr[i];\n\n // Skip items not in the old list (marked as -1)\n if (value === -1) continue;\n\n // Binary search for the position to insert/replace\n let lo = 0;\n let hi = tails.length;\n\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid] < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n tails[lo] = value;\n indices[lo] = i;\n\n if (lo > 0) {\n predecessors[i] = indices[lo - 1];\n }\n }\n\n // Reconstruct the LIS by following predecessors\n const result: number[] = new Array(tails.length);\n let k = indices[tails.length - 1];\n\n for (let i = tails.length - 1; i >= 0; i--) {\n result[i] = k;\n k = predecessors[k];\n }\n\n return result;\n}\n\n/**\n * Reconcile two keyed lists and return the minimal DOM operations.\n *\n * @param oldKeys - Keys of the current DOM list\n * @param newKeys - Keys of the new data list\n * @returns Operations to transform old into new\n */\nexport interface ReconcileOp {\n type: 'insert' | 'move' | 'remove';\n /** Index in the NEW array (for insert/move) */\n newIndex?: number;\n /** Index in the OLD array (for remove/move source) */\n oldIndex?: number;\n}\n\nexport function reconcileKeys(\n oldKeys: unknown[],\n newKeys: unknown[],\n): ReconcileOp[] {\n const ops: ReconcileOp[] = [];\n\n // Build old key → index map\n const oldKeyMap = new Map<unknown, number>();\n for (let i = 0; i < oldKeys.length; i++) {\n oldKeyMap.set(oldKeys[i], i);\n }\n\n // For each new key, find its position in old (or -1 if new)\n const newToOld: number[] = new Array(newKeys.length);\n for (let i = 0; i < newKeys.length; i++) {\n newToOld[i] = oldKeyMap.get(newKeys[i]) ?? -1;\n }\n\n // Find nodes that need to be removed (in old but not in new)\n const newKeySet = new Set(newKeys);\n for (let i = 0; i < oldKeys.length; i++) {\n if (!newKeySet.has(oldKeys[i])) {\n ops.push({ type: 'remove', oldIndex: i });\n }\n }\n\n // Find the LIS of old indices — these nodes stay in place\n const lis = new Set(longestIncreasingSubsequence(newToOld));\n\n // Nodes not in the LIS need to be moved or inserted\n for (let i = 0; i < newKeys.length; i++) {\n if (newToOld[i] === -1) {\n // New item — insert\n ops.push({ type: 'insert', newIndex: i });\n } else if (!lis.has(i)) {\n // Existing item not in LIS — move\n ops.push({ type: 'move', newIndex: i, oldIndex: newToOld[i] });\n }\n // Items in LIS stay in place — no op needed\n }\n\n return ops;\n}\n\n/**\n * Count the minimum number of DOM operations needed.\n */\nexport function countOps(oldKeys: unknown[], newKeys: unknown[]): {\n inserts: number;\n moves: number;\n removes: number;\n} {\n const ops = reconcileKeys(oldKeys, newKeys);\n let inserts = 0, moves = 0, removes = 0;\n for (const op of ops) {\n if (op.type === 'insert') inserts++;\n else if (op.type === 'move') moves++;\n else removes++;\n }\n return { inserts, moves, removes };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function w(e,t,u={}){let{immediate:x=false,once:O=false,debounce:i,deep:l=false}=u,T=Array.isArray(e),s=T?e:[e],o=s.map(()=>{}),h=true,c=null,f=false,y=null,b=()=>{f=true,c&&clearTimeout(c),y?.();};y=chunkWOZWFMOK_cjs.e(()=>{let n=s.map(r=>r());if(h){h=false,o=l?n.map(k):[...n],x&&m(n,s.map(()=>{}));return}if(!(l?n.some((r,p)=>!S(r,o[p])):n.some((r,p)=>!Object.is(r,o[p]))))return;let a=[...o];o=l?n.map(k):[...n],m(n,a);});function m(n,d){if(f)return;let a=()=>{O&&(f=true,queueMicrotask(b)),T?t(n,d):t(n[0],d[0]);};i&&i>0?(c&&clearTimeout(c),c=setTimeout(a,i)):a();}return b}function v(e,t){return w(e,t,{once:true})}function g(e,t,u){return w(e,t,{debounce:u})}function k(e){if(e===null||typeof e!="object")return e;try{return JSON.parse(JSON.stringify(e))}catch{return e}}function S(e,t){if(Object.is(e,t))return true;if(e===null||t===null||typeof e!="object"||typeof t!="object")return false;try{return JSON.stringify(e)===JSON.stringify(t)}catch{return false}}exports.a=w;exports.b=v;exports.c=g;//# sourceMappingURL=chunk-V2JDKH3W.cjs.map
2
+ //# sourceMappingURL=chunk-V2JDKH3W.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/watch.ts"],"names":["watch","source","callback","options","immediate","once","debounceMs","deep","isMulti","sources","oldValues","isFirst","debounceTimer","disposed","disposeEffect","dispose","effect","newValues","s","deepClone","fireCallback","v","i","deepEqual","prevValues","newVals","oldVals","doCall","watchOnce","watchDebounced","ms","value","a","b"],"mappings":"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","file":"chunk-V2JDKH3W.cjs","sourcesContent":["/**\n * watch() — react to signal changes with old/new values.\n *\n * Unlike effect() which just re-runs, watch() gives you the previous\n * and current value so you can react to *what changed*.\n *\n * ```ts\n * const count = signal(0);\n * watch(count, (newVal, oldVal) => {\n * console.log(`Changed from ${oldVal} to ${newVal}`);\n * });\n *\n * // With options:\n * watch(count, callback, { immediate: true, once: true });\n *\n * // Multiple sources:\n * watch([count, name], ([newCount, newName], [oldCount, oldName]) => { ... });\n * ```\n */\n\nimport { effect } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface WatchOptions {\n /** Run callback immediately with current value (default: false) */\n immediate?: boolean;\n /** Only fire once, then auto-dispose (default: false) */\n once?: boolean;\n /** Debounce callback in ms */\n debounce?: number;\n /** Deep comparison for objects (default: false) */\n deep?: boolean;\n}\n\nexport type WatchSource<T> = () => T;\nexport type WatchCallback<T> = (newValue: T, oldValue: T | undefined) => void;\nexport type WatchArrayCallback<T extends unknown[]> = (newValues: T, oldValues: (T[number] | undefined)[]) => void;\n\n// =========================================================================\n// watch() — single source\n// =========================================================================\n\n/**\n * Watch a reactive source and call back with old + new values.\n *\n * ```ts\n * const dispose = watch(count, (newVal, oldVal) => {\n * analytics.track('count_changed', { from: oldVal, to: newVal });\n * });\n * ```\n */\nexport function watch<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n options?: WatchOptions,\n): () => void;\n\n/**\n * Watch multiple sources.\n */\nexport function watch<T extends unknown[]>(\n sources: { [K in keyof T]: WatchSource<T[K]> },\n callback: WatchArrayCallback<T>,\n options?: WatchOptions,\n): () => void;\n\nexport function watch(\n source: WatchSource<any> | WatchSource<any>[],\n callback: any,\n options: WatchOptions = {},\n): () => void {\n const { immediate = false, once = false, debounce: debounceMs, deep = false } = options;\n\n const isMulti = Array.isArray(source);\n const sources = isMulti ? source : [source];\n\n let oldValues: any[] = sources.map(() => undefined);\n let isFirst = true;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let disposed = false;\n let disposeEffect: (() => void) | null = null;\n\n const dispose = () => {\n disposed = true;\n if (debounceTimer) clearTimeout(debounceTimer);\n disposeEffect?.();\n };\n\n disposeEffect = effect(() => {\n // Read all sources to establish tracking\n const newValues = sources.map((s) => s());\n\n if (isFirst) {\n isFirst = false;\n oldValues = deep ? newValues.map(deepClone) : [...newValues];\n\n if (immediate) {\n fireCallback(newValues, sources.map(() => undefined));\n }\n return;\n }\n\n // Check if anything actually changed\n const changed = deep\n ? newValues.some((v, i) => !deepEqual(v, oldValues[i]))\n : newValues.some((v, i) => !Object.is(v, oldValues[i]));\n\n if (!changed) return;\n\n const prevValues = [...oldValues];\n oldValues = deep ? newValues.map(deepClone) : [...newValues];\n\n fireCallback(newValues, prevValues);\n });\n\n function fireCallback(newVals: any[], oldVals: any[]): void {\n if (disposed) return;\n\n const doCall = () => {\n if (once) {\n // Dispose BEFORE calling callback so any signal writes in the\n // callback don't re-trigger this watcher\n disposed = true;\n queueMicrotask(dispose);\n }\n\n if (isMulti) {\n callback(newVals, oldVals);\n } else {\n callback(newVals[0], oldVals[0]);\n }\n };\n\n if (debounceMs && debounceMs > 0) {\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(doCall, debounceMs);\n } else {\n doCall();\n }\n }\n\n return dispose;\n}\n\n// =========================================================================\n// watchOnce — convenience\n// =========================================================================\n\n/**\n * Watch a source once, then auto-dispose.\n *\n * ```ts\n * watchOnce(isReady, (ready) => {\n * if (ready) initApp();\n * });\n * ```\n */\nexport function watchOnce<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n): () => void {\n return watch(source, callback, { once: true });\n}\n\n// =========================================================================\n// watchDebounced — convenience\n// =========================================================================\n\n/**\n * Watch with built-in debounce.\n *\n * ```ts\n * watchDebounced(searchInput, (query) => {\n * fetchResults(query);\n * }, 300);\n * ```\n */\nexport function watchDebounced<T>(\n source: WatchSource<T>,\n callback: WatchCallback<T>,\n ms: number,\n): () => void {\n return watch(source, callback, { debounce: ms });\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction deepClone<T>(value: T): T {\n if (value === null || typeof value !== 'object') return value;\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return value;\n }\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n try {\n return JSON.stringify(a) === JSON.stringify(b);\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var p=Symbol("deepSignal"),m=Symbol("deepRaw");function h(o){let u=chunkWOZWFMOK_cjs.c(0),a=JSON.parse(JSON.stringify(o)),f=new Map;function d(r){let e=f.get(r);return e||(e=chunkWOZWFMOK_cjs.c(0),f.set(r,e)),e}let l=false;function c(r){if(l)return;let e=f.get(r);e&&e.update(i=>i+1);}function T(r,e){l=true;try{return r()}finally{l=false,c(e);}}function y(r,e=[]){return new Proxy(r,{get(i,t,s){if(t==="$raw")return JSON.parse(JSON.stringify(a));if(t==="$signal")return ()=>(u(),JSON.parse(JSON.stringify(a)));if(t===p)return u;if(t===m)return a;let n=Reflect.get(i,t,s),g=[...e,String(t)].join(".");if(d(g)(),Array.isArray(i)&&typeof n=="function"&&new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]).has(String(t))){let w=e.join(".")||"__root";return (...b)=>T(()=>n.apply(i,b),w)}return n!==null&&typeof n=="object"?y(n,[...e,String(t)]):n},set(i,t,s){let n=Reflect.set(i,t,s);return c([...e,String(t)].join(".")),u.update(g=>g+1),n},deleteProperty(i,t){let s=Reflect.deleteProperty(i,t);return c([...e,String(t)].join(".")),u.update(n=>n+1),s}})}return y(a)}function N(o){return o.$raw??o}function D(o){if(o===null||typeof o!="object")return false;try{return o[p]!==void 0}catch{return false}}exports.a=h;exports.b=N;exports.c=D;//# sourceMappingURL=chunk-VNDSKBXQ.cjs.map
2
+ //# sourceMappingURL=chunk-VNDSKBXQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deep-signal.ts"],"names":["SIGNAL_KEY","RAW_KEY","deepSignal","initialValue","version","signal","raw","pathSignals","getPathSignal","path","s","batchedNotify","notifyPath","v","batchNotify","fn","createProxy","target","obj","prop","receiver","value","currentPath","arrPath","args","result","toRaw","proxy","isDeepSignal"],"mappings":"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","file":"chunk-VNDSKBXQ.cjs","sourcesContent":["/**\n * Deep reactive signals.\n *\n * Unlike regular signals that are shallow, deepSignal() tracks\n * nested property access and triggers updates when any nested\n * property changes.\n *\n * ```ts\n * const state = deepSignal({ user: { name: 'Alice', age: 30 }, items: [1, 2, 3] });\n * state.user.name; // 'Alice' (tracked)\n * state.user.name = 'Bob'; // triggers reactivity\n * state.items.push(4); // triggers reactivity\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport { batch } from './scheduler.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type DeepSignal<T> = T extends object\n ? { [K in keyof T]: DeepSignal<T[K]> } & { readonly $raw: T; readonly $signal: () => T }\n : T;\n\n// =========================================================================\n// deepSignal()\n// =========================================================================\n\nconst SIGNAL_KEY = Symbol('deepSignal');\nconst RAW_KEY = Symbol('deepRaw');\n\n/**\n * Create a deeply reactive signal. Nested property access is tracked,\n * and setting any nested property triggers updates.\n *\n * ```ts\n * const state = deepSignal({\n * user: { name: 'Alice', age: 30 },\n * todos: [{ text: 'Buy milk', done: false }],\n * });\n *\n * effect(() => {\n * console.log(state.user.name); // re-runs when name changes\n * });\n *\n * state.user.name = 'Bob'; // triggers the effect above\n * ```\n */\nexport function deepSignal<T extends object>(initialValue: T): DeepSignal<T> {\n const version = signal(0); // root-level signal for $signal compatibility\n const raw = JSON.parse(JSON.stringify(initialValue));\n\n // Per-path signals for fine-grained tracking\n const pathSignals = new Map<string, ReturnType<typeof signal<number>>>();\n\n function getPathSignal(path: string): ReturnType<typeof signal<number>> {\n let s = pathSignals.get(path);\n if (!s) {\n s = signal(0);\n pathSignals.set(path, s);\n }\n return s;\n }\n\n let batchedNotify = false;\n function notifyPath(path: string): void {\n if (batchedNotify) return;\n // Only notify the exact path that changed — not ancestors\n const s = pathSignals.get(path);\n if (s) s.update(v => v + 1);\n }\n function batchNotify(fn: () => unknown, path: string): unknown {\n batchedNotify = true;\n try {\n return fn();\n } finally {\n batchedNotify = false;\n notifyPath(path);\n }\n }\n\n function createProxy<O extends object>(target: O, path: string[] = []): DeepSignal<O> {\n return new Proxy(target, {\n get(obj, prop, receiver) {\n // Special properties\n if (prop === '$raw') return JSON.parse(JSON.stringify(raw));\n if (prop === '$signal') return () => { version(); return JSON.parse(JSON.stringify(raw)); };\n if (prop === SIGNAL_KEY) return version;\n if (prop === RAW_KEY) return raw;\n\n const value = Reflect.get(obj, prop, receiver);\n\n // Track read — use per-path signal for fine-grained reactivity\n const currentPath = [...path, String(prop)].join('.');\n getPathSignal(currentPath)();\n\n // Batch array mutation methods so they fire only one notification\n if (Array.isArray(obj) && typeof value === 'function') {\n const mutators = new Set(['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse', 'fill', 'copyWithin']);\n if (mutators.has(String(prop))) {\n const arrPath = path.join('.') || '__root';\n return (...args: unknown[]) => batchNotify(() => value.apply(obj, args), arrPath);\n }\n }\n\n // Wrap nested objects in proxies\n if (value !== null && typeof value === 'object') {\n return createProxy(value, [...path, String(prop)]);\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n notifyPath([...path, String(prop)].join('.'));\n version.update(v => v + 1); // for $signal users only\n return result;\n },\n\n deleteProperty(obj, prop) {\n const result = Reflect.deleteProperty(obj, prop);\n notifyPath([...path, String(prop)].join('.'));\n version.update(v => v + 1); // for $signal users only\n return result;\n },\n }) as DeepSignal<O>;\n }\n\n // Wrap arrays to track mutation methods\n if (Array.isArray(raw)) {\n const arrayProxy = createProxy(raw);\n return arrayProxy as DeepSignal<T>;\n }\n\n return createProxy(raw);\n}\n\n/**\n * Get the raw (unwrapped) value from a deep signal.\n */\nexport function toRaw<T>(proxy: DeepSignal<T>): T {\n return (proxy as any).$raw ?? proxy;\n}\n\n/**\n * Check if a value is a deep signal proxy.\n */\nexport function isDeepSignal(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n try {\n return (value as any)[SIGNAL_KEY] !== undefined;\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {s,l}from'./chunk-KE7BJTCD.js';import {c,e}from'./chunk-YXKQTEPR.js';var n=null;function h(){return n}function C(t){n&&n.addPending(t);}var x=s(t=>{let s=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$1=document.createElement("div");return e$1.setAttribute("data-akash-suspense",""),e$1.style.display="contents",s()?e$1.appendChild(l(r)):e$1.appendChild(l(t.props.fallback())),e(()=>{if(s()){for(;e$1.firstChild;)e$1.removeChild(e$1.firstChild);e$1.appendChild(l(r));}}),e$1}});export{h as a,C as b,x as c};//# sourceMappingURL=chunk-VO4FCKHM.js.map
2
+ //# sourceMappingURL=chunk-VO4FCKHM.js.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":"4EAyBA,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,CAAAA,CAAgCC,CAAAA,EAAQ,CAC9D,IAAMC,CAAAA,CAAWC,CAAAA,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,IAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC9C,OAAAA,GAAAA,CAAU,YAAA,CAAa,qBAAA,CAAuB,EAAE,CAAA,CAChDA,GAAAA,CAAU,KAAA,CAAM,OAAA,CAAU,WAEtBN,CAAAA,EAAS,CACXM,GAAAA,CAAU,WAAA,CAAYC,EAAUF,CAAY,CAAC,CAAA,CAE7CC,GAAAA,CAAU,WAAA,CAAYC,CAAAA,CAAUR,CAAAA,CAAI,KAAA,CAAM,UAAU,CAAC,CAAA,CAIvDS,CAAAA,CAAO,IAAM,CACX,GAAIR,CAAAA,EAAS,CAAG,CACd,KAAOM,GAAAA,CAAU,UAAA,EACfA,GAAAA,CAAU,WAAA,CAAYA,GAAAA,CAAU,UAAU,CAAA,CAE5CA,IAAU,WAAA,CAAYC,CAAAA,CAAUF,CAAY,CAAC,EAC/C,CACF,CAAC,CAAA,CAEMC,GACT,CACF,CAAC","file":"chunk-VO4FCKHM.js","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"]}
@@ -0,0 +1,2 @@
1
+ import {b}from'./chunk-AOFLE33X.js';var c=Symbol("akash.context"),t=null;function i(e=t){let n={values:new Map,parent:e};return t=n,n}function p(e){t=e.parent;}function l(){return t}function a(e,n){let o=t;t=e;try{return n()}finally{t=o;}}function T(e){return {[c]:true,_type:void 0,defaultValue:e,id:Symbol("context")}}function f(e,n){if(!t)throw b("AK0010");t.values.set(e.id,n);}function d(e,n){if(!t)throw b("AK0012");let o=t;for(;o;){if(o.values.has(e.id))return o.values.get(e.id);o=o.parent;}if(n!==void 0)return n;if(e.defaultValue!==void 0)return e.defaultValue;throw b("AK0013")}export{i as a,p as b,l as c,a as d,T as e,f,d as g};//# sourceMappingURL=chunk-VUMMC2P5.js.map
2
+ //# sourceMappingURL=chunk-VUMMC2P5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context.ts"],"names":["CONTEXT_BRAND","currentScope","pushScope","parent","scope","popScope","getCurrentScope","runInScope","fn","prev","createContext","defaultValue","provide","key","value","akashError","inject","fallback"],"mappings":"oCAWA,IAAMA,CAAAA,CAAgB,MAAA,CAAO,eAAe,CAAA,CAgBxCC,EAAoC,IAAA,CAGjC,SAASC,CAAAA,CAAUC,CAAAA,CAA8BF,EAA4B,CAClF,IAAMG,CAAAA,CAAsB,CAAE,OAAQ,IAAI,GAAA,CAAO,MAAA,CAAAD,CAAO,CAAA,CACxD,OAAAF,CAAAA,CAAeG,CAAAA,CACRA,CACT,CAGO,SAASC,CAAAA,CAASD,CAAAA,CAA2B,CAClDH,CAAAA,CAAeG,CAAAA,CAAM,OACvB,CAGO,SAASE,CAAAA,EAAuC,CACrD,OAAOL,CACT,CAOO,SAASM,CAAAA,CAAcH,CAAAA,CAAqBI,EAAgB,CACjE,IAAMC,CAAAA,CAAOR,CAAAA,CACbA,EAAeG,CAAAA,CACf,GAAI,CACF,OAAOI,GACT,CAAA,OAAE,CACAP,CAAAA,CAAeQ,EACjB,CACF,CAWO,SAASC,CAAAA,CAAiBC,EAAmC,CAClE,OAAO,CACL,CAACX,CAAa,EAAG,IAAA,CACjB,KAAA,CAAO,MAAA,CACP,aAAAW,CAAAA,CACA,EAAA,CAAI,MAAA,CAAO,SAAS,CACtB,CACF,CAQO,SAASC,EAAWC,CAAAA,CAAsBC,CAAAA,CAAgB,CAC/D,GAAI,CAACb,CAAAA,CACH,MAAMc,CAAAA,CAAW,QAAQ,EAE3Bd,CAAAA,CAAa,MAAA,CAAO,GAAA,CAAIY,CAAAA,CAAI,GAAIC,CAAK,EACvC,CASO,SAASE,EAAUH,CAAAA,CAAsBI,CAAAA,CAAiB,CAC/D,GAAI,CAAChB,CAAAA,CACH,MAAMc,CAAAA,CAAW,QAAQ,EAI3B,IAAIX,CAAAA,CAA6BH,CAAAA,CACjC,KAAOG,CAAAA,EAAO,CACZ,GAAIA,CAAAA,CAAM,OAAO,GAAA,CAAIS,CAAAA,CAAI,EAAE,CAAA,CACzB,OAAOT,CAAAA,CAAM,MAAA,CAAO,GAAA,CAAIS,CAAAA,CAAI,EAAE,CAAA,CAEhCT,CAAAA,CAAQA,CAAAA,CAAM,OAChB,CAGA,GAAIa,CAAAA,GAAa,MAAA,CAAW,OAAOA,EACnC,GAAIJ,CAAAA,CAAI,YAAA,GAAiB,MAAA,CAAW,OAAOA,CAAAA,CAAI,YAAA,CAE/C,MAAME,CAAAA,CAAW,QAAQ,CAC3B","file":"chunk-VUMMC2P5.js","sourcesContent":["/**\n * Lightweight dependency injection via provide/inject.\n *\n * Context is scoped to the component tree — no injector hierarchy,\n * no decorators, no classes. Just createContext(), provide(), inject().\n */\n\n// --- Types ---\n\nimport { akashError } from './errors.js';\n\nconst CONTEXT_BRAND = Symbol('akash.context');\n\nexport interface InjectionKey<T> {\n readonly [CONTEXT_BRAND]: true;\n readonly _type: T; // phantom type — never used at runtime\n readonly defaultValue: T | undefined;\n readonly id: symbol;\n}\n\n// --- Context stack (managed by component system) ---\n\ninterface ContextScope {\n values: Map<symbol, unknown>;\n parent: ContextScope | null;\n}\n\nlet currentScope: ContextScope | null = null;\n\n/** @internal — called by defineComponent to push/pop context scopes */\nexport function pushScope(parent: ContextScope | null = currentScope): ContextScope {\n const scope: ContextScope = { values: new Map(), parent };\n currentScope = scope;\n return scope;\n}\n\n/** @internal */\nexport function popScope(scope: ContextScope): void {\n currentScope = scope.parent;\n}\n\n/** @internal */\nexport function getCurrentScope(): ContextScope | null {\n return currentScope;\n}\n\n/**\n * Run a function within a given scope so that provide/inject\n * work correctly for components created asynchronously\n * (e.g., lazy-loaded route components).\n */\nexport function runInScope<T>(scope: ContextScope, fn: () => T): T {\n const prev = currentScope;\n currentScope = scope;\n try {\n return fn();\n } finally {\n currentScope = prev;\n }\n}\n\n// --- Public API ---\n\n/**\n * Create a typed context key with an optional default value.\n *\n * ```ts\n * const ThemeContext = createContext<'light' | 'dark'>('light');\n * ```\n */\nexport function createContext<T>(defaultValue?: T): InjectionKey<T> {\n return {\n [CONTEXT_BRAND]: true,\n _type: undefined as T,\n defaultValue,\n id: Symbol('context'),\n };\n}\n\n/**\n * Provide a value for a context key in the current component scope.\n * All descendant components can inject() this value.\n *\n * Must be called inside defineComponent() setup.\n */\nexport function provide<T>(key: InjectionKey<T>, value: T): void {\n if (!currentScope) {\n throw akashError('AK0010');\n }\n currentScope.values.set(key.id, value);\n}\n\n/**\n * Inject a value from the nearest ancestor that provided it.\n *\n * Must be called inside defineComponent() setup.\n */\nexport function inject<T>(key: InjectionKey<T>): T;\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T;\nexport function inject<T>(key: InjectionKey<T>, fallback?: T): T {\n if (!currentScope) {\n throw akashError('AK0012');\n }\n\n // Walk up the scope chain\n let scope: ContextScope | null = currentScope;\n while (scope) {\n if (scope.values.has(key.id)) {\n return scope.values.get(key.id) as T;\n }\n scope = scope.parent;\n }\n\n // Check fallback, then default\n if (fallback !== undefined) return fallback;\n if (key.defaultValue !== undefined) return key.defaultValue;\n\n throw akashError('AK0013');\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {d as d$1}from'./chunk-VWTULWXF.js';var p=new Map,d=new Map,m=0,b=0;function y(e,n,t){p.set(e||`signal_${m++}`,{name:e,read:n,get subscriberCount(){return t()}});}function k(e,n){let t=e||`effect_${b++}`,o={name:t,runCount:0,isRender:n.isRender,sourceCount:0};return d.set(t,o),()=>{o.runCount++,o.sourceCount=n.getSourceCount();}}function c(e){let t=d$1()[e];if(!t)return null;let o=t.$snapshot(),s=t.$__meta,a={},l=[];if(s){for(let r of s.getterKeys)try{a[r]=t[r]();}catch{a[r]="<error>";}l.push(...s.actionKeys);}else for(let[r,f]of Object.entries(t))r.startsWith("$")||r in o||typeof f=="function"&&l.push(r);return {$id:e,state:o,getters:a,actions:l,subscriberCount:0}}var u=new Map,g=new Map;function S(){return {stores(){return Object.keys(d$1())},store(e){return c(e)},storeSnapshots(){let e={};for(let n of Object.keys(d$1())){let t=c(n);t&&(e[n]=t);}return e},signals(){return [...p.values()].map(e=>({name:e.name,value:e.read(),subscribers:e.subscriberCount}))},effects(){return [...d.values()].map(e=>({name:e.name,runs:e.runCount,isRender:e.isRender,sources:e.sourceCount}))},version(){return {runtime:"0.2.7"}},log(e){if(e){let n=c(e);n?(console.group(`\u{1F50D} Store: ${e}`),console.log("State:",n.state),console.log("Getters:",n.getters),console.log("Actions:",n.actions),console.groupEnd()):console.warn(`Store "${e}" not found. Available:`,Object.keys(d$1()));}else {let n=Object.keys(d$1());console.group("\u{1F50D} AkashJS Stores");for(let t of n){let o=c(t);o&&(console.group(t),console.log("State:",o.state),console.log("Getters:",o.getters),console.groupEnd());}console.groupEnd();}},startRecording(e){let n=d$1()[e];if(!n){console.warn(`Store "${e}" not found.`);return}let t=[];t.push({timestamp:Date.now(),state:n.$snapshot()});let o=n.$subscribe(s=>{t.push({timestamp:Date.now(),state:{...s}});});u.set(e,t),g.set(e,o),console.log(`\u23FA Recording store "${e}". Call __AKASH_DEVTOOLS__.stopRecording("${e}") to view history.`);},stopRecording(e){let n=g.get(e);n&&n(),g.delete(e);let t=u.get(e)??[];return u.delete(e),console.log(`\u23F9 Stopped recording "${e}". ${t.length} snapshots captured.`),console.table(t.map((o,s)=>({"#":s,time:new Date(o.timestamp).toISOString().slice(11,23),state:JSON.stringify(o.state)}))),t}}}function h(e){let n=S();typeof globalThis<"u"&&(globalThis.__AKASH_DEVTOOLS__=n,console.log("%c\u{1F527} AkashJS DevTools installed. Access via __AKASH_DEVTOOLS__ in console.","color: #7c3aed; font-weight: bold;"),console.log(" .stores() \u2014 list stores"),console.log(' .store("id") \u2014 inspect store'),console.log(" .log() \u2014 pretty-print all stores"),console.log(' .log("id") \u2014 pretty-print one store'),console.log(' .startRecording("id") \u2014 record state changes'),console.log(' .stopRecording("id") \u2014 view recorded history'),console.log(" .signals() \u2014 list tracked signals"),console.log(" .effects() \u2014 list tracked effects")),e?.overlay&&import('./devtools-overlay-3WRM6GKM.js').then(t=>t.mountDevtoolsOverlay());}export{y as a,k as b,h as c};//# sourceMappingURL=chunk-VUSNUBNI.js.map
2
+ //# sourceMappingURL=chunk-VUSNUBNI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/devtools.ts"],"names":["trackedSignals","trackedEffects","signalCounter","effectCounter","__trackSignal","name","read","getSubscriberCount","__trackEffect","meta","id","entry","inspectStore","store","__getStoreInstances","snapshot","getters","actions","key","value","recordings","recordingDisposers","createDevToolsAPI","result","snap","s","storeId","stores","history","unsubscribe","state","disposer","h","i","installDevtools","options","api","m"],"mappings":"2CAkCA,IAAMA,CAAAA,CAAiB,IAAI,GAAA,CACrBC,CAAAA,CAAiB,IAAI,GAAA,CACvBC,CAAAA,CAAgB,CAAA,CAChBC,CAAAA,CAAgB,CAAA,CAGb,SAASC,CAAAA,CAAcC,CAAAA,CAAcC,EAAqBC,CAAAA,CAAwC,CACvGP,CAAAA,CAAe,GAAA,CAAIK,CAAAA,EAAQ,CAAA,OAAA,EAAUH,CAAAA,EAAe,CAAA,CAAA,CAAI,CACtD,IAAA,CAAAG,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,IAAI,eAAA,EAAkB,CAAE,OAAOC,CAAAA,EAAsB,CACvD,CAAkB,EACpB,CAGO,SAASC,CAAAA,CAAcH,CAAAA,CAAcI,CAAAA,CAAuE,CACjH,IAAMC,CAAAA,CAAKL,CAAAA,EAAQ,CAAA,OAAA,EAAUF,GAAe,CAAA,CAAA,CACtCQ,CAAAA,CAAuB,CAC3B,IAAA,CAAMD,EACN,QAAA,CAAU,CAAA,CACV,QAAA,CAAUD,CAAAA,CAAK,QAAA,CACf,WAAA,CAAa,CACf,CAAA,CACA,OAAAR,CAAAA,CAAe,GAAA,CAAIS,CAAAA,CAAIC,CAAK,EAGrB,IAAM,CACXA,CAAAA,CAAM,QAAA,EAAA,CACNA,EAAM,WAAA,CAAcF,CAAAA,CAAK,cAAA,GAC3B,CACF,CAYA,SAASG,CAAAA,CAAaF,EAAkC,CAEtD,IAAMG,CAAAA,CADYC,GAAAA,GACMJ,CAAE,CAAA,CAC1B,GAAI,CAACG,EAAO,OAAO,IAAA,CAEnB,IAAME,CAAAA,CAAWF,CAAAA,CAAM,SAAA,EAAU,CAC3BJ,CAAAA,CAAQI,EAAc,OAAA,CACtBG,CAAAA,CAAmC,EAAC,CACpCC,EAAoB,EAAC,CAE3B,GAAIR,CAAAA,CAAM,CAER,IAAA,IAAWS,CAAAA,IAAOT,CAAAA,CAAK,UAAA,CACrB,GAAI,CAAEO,CAAAA,CAAQE,CAAG,EAAKL,CAAAA,CAAcK,CAAG,CAAA,GAAK,MAAQ,CAAEF,CAAAA,CAAQE,CAAG,CAAA,CAAI,UAAW,CAElFD,CAAAA,CAAQ,IAAA,CAAK,GAAGR,CAAAA,CAAK,UAAU,EACjC,CAAA,YAEa,CAACS,CAAAA,CAAKC,CAAK,CAAA,GAAK,OAAO,OAAA,CAAQN,CAAK,CAAA,CACzCK,CAAAA,CAAI,WAAW,GAAG,CAAA,EAAKA,CAAAA,IAAOH,CAAAA,EAC9B,OAAOI,CAAAA,EAAU,UAAA,EAAYF,CAAAA,CAAQ,KAAKC,CAAG,CAAA,CAIrD,OAAO,CACL,GAAA,CAAKR,CAAAA,CACL,KAAA,CAAOK,CAAAA,CACP,QAAAC,CAAAA,CACA,OAAA,CAAAC,CAAAA,CACA,eAAA,CAAiB,CACnB,CACF,CAyBA,IAAMG,EAAa,IAAI,GAAA,CACjBC,CAAAA,CAAqB,IAAI,IAE/B,SAASC,CAAAA,EAAiC,CACxC,OAAO,CACL,MAAA,EAAS,CACP,OAAO,MAAA,CAAO,IAAA,CAAKR,GAAAA,EAAqB,CAC1C,EAEA,KAAA,CAAMJ,CAAAA,CAAY,CAChB,OAAOE,EAAaF,CAAE,CACxB,CAAA,CAEA,cAAA,EAAiB,CACf,IAAMa,CAAAA,CAAwC,EAAC,CAC/C,IAAA,IAAWb,CAAAA,IAAM,MAAA,CAAO,IAAA,CAAKI,KAAqB,CAAA,CAAG,CACnD,IAAMU,EAAOZ,CAAAA,CAAaF,CAAE,CAAA,CACxBc,CAAAA,GAAMD,EAAOb,CAAE,CAAA,CAAIc,CAAAA,EACzB,CACA,OAAOD,CACT,CAAA,CAEA,OAAA,EAAU,CACR,OAAO,CAAC,GAAGvB,CAAAA,CAAe,QAAQ,CAAA,CAAE,GAAA,CAAIyB,CAAAA,GAAM,CAC5C,IAAA,CAAMA,CAAAA,CAAE,IAAA,CACR,KAAA,CAAOA,CAAAA,CAAE,IAAA,EAAK,CACd,WAAA,CAAaA,EAAE,eACjB,CAAA,CAAE,CACJ,CAAA,CAEA,SAAU,CACR,OAAO,CAAC,GAAGxB,EAAe,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,GAAM,CAC5C,IAAA,CAAM,CAAA,CAAE,KACR,IAAA,CAAM,CAAA,CAAE,QAAA,CACR,QAAA,CAAU,EAAE,QAAA,CACZ,OAAA,CAAS,CAAA,CAAE,WACb,EAAE,CACJ,CAAA,CAEA,OAAA,EAAU,CACR,OAAO,CAAE,OAAA,CAAS,OAAoB,CACxC,CAAA,CAEA,GAAA,CAAIyB,CAAAA,CAAkB,CACpB,GAAIA,CAAAA,CAAS,CACX,IAAMF,CAAAA,CAAOZ,EAAac,CAAO,CAAA,CAC7BF,CAAAA,EACF,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAaE,CAAO,CAAA,CAAE,EACpC,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAUF,CAAAA,CAAK,KAAK,CAAA,CAChC,OAAA,CAAQ,GAAA,CAAI,WAAYA,CAAAA,CAAK,OAAO,CAAA,CACpC,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAYA,CAAAA,CAAK,OAAO,EACpC,OAAA,CAAQ,QAAA,EAAS,EAEjB,OAAA,CAAQ,KAAK,CAAA,OAAA,EAAUE,CAAO,CAAA,uBAAA,CAAA,CAA2B,MAAA,CAAO,KAAKZ,GAAAA,EAAqB,CAAC,EAE/F,CAAA,KAAO,CACL,IAAMa,CAAAA,CAAS,OAAO,IAAA,CAAKb,GAAAA,EAAqB,CAAA,CAChD,QAAQ,KAAA,CAAM,0BAAmB,CAAA,CACjC,IAAA,IAAWJ,KAAMiB,CAAAA,CAAQ,CACvB,IAAMH,CAAAA,CAAOZ,CAAAA,CAAaF,CAAE,CAAA,CACxBc,CAAAA,GACF,QAAQ,KAAA,CAAMd,CAAE,CAAA,CAChB,OAAA,CAAQ,IAAI,QAAA,CAAUc,CAAAA,CAAK,KAAK,CAAA,CAChC,QAAQ,GAAA,CAAI,UAAA,CAAYA,CAAAA,CAAK,OAAO,CAAA,CACpC,OAAA,CAAQ,QAAA,EAAS,EAErB,CACA,OAAA,CAAQ,QAAA,GACV,CACF,EAEA,cAAA,CAAeE,CAAAA,CAAiB,CAC9B,IAAMb,EAAQC,GAAAA,EAAoB,CAAEY,CAAO,CAAA,CAC3C,GAAI,CAACb,CAAAA,CAAO,CACV,QAAQ,IAAA,CAAK,CAAA,OAAA,EAAUa,CAAO,CAAA,YAAA,CAAc,EAC5C,MACF,CAEA,IAAME,CAAAA,CAAyF,EAAC,CAEhGA,CAAAA,CAAQ,IAAA,CAAK,CAAE,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAG,MAAOf,CAAAA,CAAM,SAAA,EAAY,CAAC,EAEhE,IAAMgB,CAAAA,CAAchB,CAAAA,CAAM,UAAA,CAAYiB,GAAU,CAC9CF,CAAAA,CAAQ,IAAA,CAAK,CAAE,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAG,MAAO,CAAE,GAAGE,CAAM,CAAE,CAAC,EAC7D,CAAC,CAAA,CAEDV,CAAAA,CAAW,IAAIM,CAAAA,CAASE,CAAO,CAAA,CAC/BP,CAAAA,CAAmB,GAAA,CAAIK,CAAAA,CAASG,CAAW,CAAA,CAC3C,QAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsBH,CAAO,CAAA,0CAAA,EAA6CA,CAAO,CAAA,mBAAA,CAAqB,EACpH,CAAA,CAEA,cAAcA,CAAAA,CAAiB,CAC7B,IAAMK,CAAAA,CAAWV,CAAAA,CAAmB,GAAA,CAAIK,CAAO,CAAA,CAC3CK,GAAUA,CAAAA,EAAS,CACvBV,CAAAA,CAAmB,MAAA,CAAOK,CAAO,CAAA,CAEjC,IAAME,CAAAA,CAAUR,CAAAA,CAAW,IAAIM,CAAO,CAAA,EAAK,EAAC,CAC5C,OAAAN,CAAAA,CAAW,MAAA,CAAOM,CAAO,EAEzB,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAAwBA,CAAO,MAAME,CAAAA,CAAQ,MAAM,CAAA,oBAAA,CAAsB,CAAA,CACrF,QAAQ,KAAA,CAAMA,CAAAA,CAAQ,GAAA,CAAI,CAACI,CAAAA,CAAGC,CAAAA,IAAO,CACnC,GAAA,CAAKA,EACL,IAAA,CAAM,IAAI,IAAA,CAAKD,CAAAA,CAAE,SAAS,CAAA,CAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAI,EAAE,CAAA,CACtD,KAAA,CAAO,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAE,KAAK,CAC/B,EAAE,CAAC,CAAA,CAEIJ,CACT,CACF,CACF,CAgBO,SAASM,CAAAA,CAAgBC,CAAAA,CAAiC,CAC/D,IAAMC,CAAAA,CAAMd,CAAAA,EAAkB,CAE1B,OAAO,UAAA,CAAe,GAAA,GACvB,UAAA,CAAmB,mBAAqBc,CAAAA,CACzC,OAAA,CAAQ,GAAA,CACN,mFAAA,CACA,oCACF,CAAA,CACA,OAAA,CAAQ,GAAA,CAAI,6CAAwC,EACpD,OAAA,CAAQ,GAAA,CAAI,+CAA0C,CAAA,CACtD,OAAA,CAAQ,GAAA,CAAI,yDAAoD,CAAA,CAChE,QAAQ,GAAA,CAAI,wDAAmD,CAAA,CAC/D,OAAA,CAAQ,IAAI,sDAAiD,CAAA,CAC7D,OAAA,CAAQ,GAAA,CAAI,uDAAkD,CAAA,CAC9D,OAAA,CAAQ,GAAA,CAAI,sDAAiD,CAAA,CAC7D,OAAA,CAAQ,GAAA,CAAI,sDAAiD,GAI3DD,CAAAA,EAAS,OAAA,EACX,OAAO,gCAAuB,EAAE,IAAA,CAAKE,CAAAA,EAAKA,CAAAA,CAAE,oBAAA,EAAsB,EAEtE","file":"chunk-VUSNUBNI.js","sourcesContent":["/**\n * AkashJS DevTools — Console-based debugging utilities.\n *\n * Call `installDevtools()` in development to expose `__AKASH_DEVTOOLS__`\n * on the global object. Access it from the browser console:\n *\n * ```js\n * __AKASH_DEVTOOLS__.stores() // list all stores\n * __AKASH_DEVTOOLS__.store('cart') // inspect a store\n * __AKASH_DEVTOOLS__.signals() // list tracked signals\n * __AKASH_DEVTOOLS__.effects() // list active effects\n * ```\n */\n\nimport { __getStoreInstances } from './store.js';\n\ndeclare const __RUNTIME_VERSION__: string;\nimport type { Store } from './store.js';\n\n// --- Signal/Effect tracking ---\n\ninterface TrackedSignal {\n name: string;\n read: () => unknown;\n subscriberCount: number;\n}\n\ninterface TrackedEffect {\n name: string;\n runCount: number;\n isRender: boolean;\n sourceCount: number;\n}\n\nconst trackedSignals = new Map<string, TrackedSignal>();\nconst trackedEffects = new Map<string, TrackedEffect>();\nlet signalCounter = 0;\nlet effectCounter = 0;\n\n/** Register a signal for devtools tracking (call in dev mode) */\nexport function __trackSignal(name: string, read: () => unknown, getSubscriberCount: () => number): void {\n trackedSignals.set(name || `signal_${signalCounter++}`, {\n name,\n read,\n get subscriberCount() { return getSubscriberCount(); },\n } as TrackedSignal);\n}\n\n/** Register an effect for devtools tracking */\nexport function __trackEffect(name: string, meta: { isRender: boolean; getSourceCount: () => number }): () => void {\n const id = name || `effect_${effectCounter++}`;\n const entry: TrackedEffect = {\n name: id,\n runCount: 0,\n isRender: meta.isRender,\n sourceCount: 0,\n };\n trackedEffects.set(id, entry);\n\n // Return a function to increment run count (called each time effect runs)\n return () => {\n entry.runCount++;\n entry.sourceCount = meta.getSourceCount();\n };\n}\n\n// --- Store inspection ---\n\ninterface StoreSnapshot {\n $id: string;\n state: Record<string, unknown>;\n getters: Record<string, unknown>;\n actions: string[];\n subscriberCount: number;\n}\n\nfunction inspectStore(id: string): StoreSnapshot | null {\n const instances = __getStoreInstances();\n const store = instances[id];\n if (!store) return null;\n\n const snapshot = store.$snapshot();\n const meta = (store as any).$__meta as { stateKeys: string[]; getterKeys: string[]; actionKeys: string[] } | undefined;\n const getters: Record<string, unknown> = {};\n const actions: string[] = [];\n\n if (meta) {\n // Use metadata from store creation — no function calling needed\n for (const key of meta.getterKeys) {\n try { getters[key] = (store as any)[key](); } catch { getters[key] = '<error>'; }\n }\n actions.push(...meta.actionKeys);\n } else {\n // Fallback for stores without metadata\n for (const [key, value] of Object.entries(store)) {\n if (key.startsWith('$') || key in snapshot) continue;\n if (typeof value === 'function') actions.push(key);\n }\n }\n\n return {\n $id: id,\n state: snapshot,\n getters,\n actions,\n subscriberCount: 0,\n };\n}\n\n// --- DevTools API ---\n\nexport interface DevToolsAPI {\n /** List all registered stores */\n stores(): string[];\n /** Inspect a specific store by ID */\n store(id: string): StoreSnapshot | null;\n /** Get all store snapshots */\n storeSnapshots(): Record<string, StoreSnapshot>;\n /** List tracked signals with current values */\n signals(): Array<{ name: string; value: unknown; subscribers: number }>;\n /** List tracked effects with run counts */\n effects(): Array<{ name: string; runs: number; isRender: boolean; sources: number }>;\n /** Get framework version info */\n version(): { runtime: string };\n /** Pretty-print store state to console */\n log(storeId?: string): void;\n /** Record store state history for time-travel */\n startRecording(storeId: string): void;\n /** Stop recording and return history */\n stopRecording(storeId: string): Array<{ timestamp: number; state: Record<string, unknown>; action?: string }>;\n}\n\nconst recordings = new Map<string, Array<{ timestamp: number; state: Record<string, unknown>; action?: string }>>();\nconst recordingDisposers = new Map<string, () => void>();\n\nfunction createDevToolsAPI(): DevToolsAPI {\n return {\n stores() {\n return Object.keys(__getStoreInstances());\n },\n\n store(id: string) {\n return inspectStore(id);\n },\n\n storeSnapshots() {\n const result: Record<string, StoreSnapshot> = {};\n for (const id of Object.keys(__getStoreInstances())) {\n const snap = inspectStore(id);\n if (snap) result[id] = snap;\n }\n return result;\n },\n\n signals() {\n return [...trackedSignals.values()].map(s => ({\n name: s.name,\n value: s.read(),\n subscribers: s.subscriberCount,\n }));\n },\n\n effects() {\n return [...trackedEffects.values()].map(e => ({\n name: e.name,\n runs: e.runCount,\n isRender: e.isRender,\n sources: e.sourceCount,\n }));\n },\n\n version() {\n return { runtime: __RUNTIME_VERSION__ };\n },\n\n log(storeId?: string) {\n if (storeId) {\n const snap = inspectStore(storeId);\n if (snap) {\n console.group(`🔍 Store: ${storeId}`);\n console.log('State:', snap.state);\n console.log('Getters:', snap.getters);\n console.log('Actions:', snap.actions);\n console.groupEnd();\n } else {\n console.warn(`Store \"${storeId}\" not found. Available:`, Object.keys(__getStoreInstances()));\n }\n } else {\n const stores = Object.keys(__getStoreInstances());\n console.group('🔍 AkashJS Stores');\n for (const id of stores) {\n const snap = inspectStore(id);\n if (snap) {\n console.group(id);\n console.log('State:', snap.state);\n console.log('Getters:', snap.getters);\n console.groupEnd();\n }\n }\n console.groupEnd();\n }\n },\n\n startRecording(storeId: string) {\n const store = __getStoreInstances()[storeId];\n if (!store) {\n console.warn(`Store \"${storeId}\" not found.`);\n return;\n }\n\n const history: Array<{ timestamp: number; state: Record<string, unknown>; action?: string }> = [];\n // Record initial state\n history.push({ timestamp: Date.now(), state: store.$snapshot() });\n\n const unsubscribe = store.$subscribe((state) => {\n history.push({ timestamp: Date.now(), state: { ...state } });\n });\n\n recordings.set(storeId, history);\n recordingDisposers.set(storeId, unsubscribe);\n console.log(`⏺ Recording store \"${storeId}\". Call __AKASH_DEVTOOLS__.stopRecording(\"${storeId}\") to view history.`);\n },\n\n stopRecording(storeId: string) {\n const disposer = recordingDisposers.get(storeId);\n if (disposer) disposer();\n recordingDisposers.delete(storeId);\n\n const history = recordings.get(storeId) ?? [];\n recordings.delete(storeId);\n\n console.log(`⏹ Stopped recording \"${storeId}\". ${history.length} snapshots captured.`);\n console.table(history.map((h, i) => ({\n '#': i,\n time: new Date(h.timestamp).toISOString().slice(11, 23),\n state: JSON.stringify(h.state),\n })));\n\n return history;\n },\n };\n}\n\n/**\n * Install AkashJS DevTools on the global object.\n * Call this in your app's entry point during development:\n *\n * ```ts\n * import { installDevtools } from '@akashjs/runtime';\n * if (import.meta.env.DEV) installDevtools();\n * ```\n */\nexport interface DevToolsOptions {\n /** Enable the visual overlay panel (toggle with Ctrl+Shift+D) */\n overlay?: boolean;\n}\n\nexport function installDevtools(options?: DevToolsOptions): void {\n const api = createDevToolsAPI();\n\n if (typeof globalThis !== 'undefined') {\n (globalThis as any).__AKASH_DEVTOOLS__ = api;\n console.log(\n '%c🔧 AkashJS DevTools installed. Access via __AKASH_DEVTOOLS__ in console.',\n 'color: #7c3aed; font-weight: bold;'\n );\n console.log(' .stores() — list stores');\n console.log(' .store(\"id\") — inspect store');\n console.log(' .log() — pretty-print all stores');\n console.log(' .log(\"id\") — pretty-print one store');\n console.log(' .startRecording(\"id\") — record state changes');\n console.log(' .stopRecording(\"id\") — view recorded history');\n console.log(' .signals() — list tracked signals');\n console.log(' .effects() — list tracked effects');\n }\n\n // Mount visual overlay if requested\n if (options?.overlay) {\n import('./devtools-overlay.js').then(m => m.mountDevtoolsOverlay());\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {d as d$1}from'./chunk-BB7P6HTR.js';import {c,d,a,e}from'./chunk-YXKQTEPR.js';var K=[];function F(c){K.push(...c.plugins);}var k=new Map;function D(c,f){return ()=>{if(k.has(c))return k.get(c);let o=f.state(),n=$(c,o,f);return k.set(c,n),n}}function $(c$1,f,o){let n={},p=Object.keys(f);for(let e of p)n[e]=c(f[e]);let i={$id:c$1};for(let e of p)i[e]=n[e];let h=[],m=[];if(i.$__meta={stateKeys:p,getterKeys:h,actionKeys:m},o.getters)for(let[e,t]of Object.entries(o.getters))h.push(e),i[e]=d(()=>t.call(i,n));let R=[...K,...o.plugins??[]];if(o.actions)for(let[e,t]of Object.entries(o.actions))m.push(e),i[e]=(...S)=>{for(let s of R)s.onAction?.(i,e,S);return t.apply(i,S)};i.$reset=()=>{let e=o.state();for(let t of p)n[t].set(e[t]);},i.$patch=e=>{a(()=>{if(typeof e=="function")e(n);else for(let[t,S]of Object.entries(e))t in n&&n[t].set(S);});},i.$snapshot=()=>{let e={};for(let t of p)e[t]=n[t]();return e};let w=new Set,d$2=null;if(i.$subscribe=e$1=>{if(w.add(e$1),!d$2){let t=true;d$2=e(()=>{for(let s of p)n[s]();if(t){t=false;return}let S=i.$snapshot();for(let s of w)s(S);});}return ()=>{w.delete(e$1),w.size===0&&d$2&&(d$2(),d$2=null);}},o.persist&&typeof window<"u"){let e$1=O(c$1,o.persist);for(let t of e$1){let S=t.storage==="sessionStorage"?sessionStorage:localStorage,s=t.serialize??JSON.stringify,y=t.deserialize??JSON.parse,g=t.pick??p;try{let r=S.getItem(t.key);if(r){let a=y(r);for(let l of g)l in a&&l in n&&n[l].set(a[l]);}}catch{}let u=false,b=true;e(()=>{for(let r of g)r in n&&n[r]();if(b){b=false;return}u||(u=true,queueMicrotask(()=>{u=false;let r={};for(let a of g)a in n&&(r[a]=n[a].peek());try{S.setItem(t.key,s(r));}catch{}}));}),t.storage!=="sessionStorage"&&window.addEventListener("storage",r=>{if(!(r.key!==t.key||!r.newValue))try{let a=y(r.newValue);for(let l of g)l in a&&l in n&&n[l].set(a[l]);}catch{}});}}if(o.sync&&o.sync.enabled!==false){let e$1=o.sync,t=e$1.pick??p,S={};for(let y of t)S[y]=n[y]?.peek?.()??f[y];let s=d$1(S,{transport:e$1.transport,peerId:e$1.peerId});for(let y of t){if(!(y in n)||!(y in s.state))continue;let g=n[y],u=s.state[y],b=g.set,r=false;g.set=a=>{b.call(g,a),r||u.set(a);},e(()=>{let a=u();r=true,g.set(a),r=false;});}i.$sync={peers:s.peers,presence:s.presence,peerPresence:s.peerPresence,peerId:s.peerId,connected:s.connected,connect:s.connect.bind(s),disconnect:s.disconnect.bind(s)};}for(let e of R)e.init?.(i);return i}function O(c,f){return f===true?[{key:`akash-store:${c}`}]:f===false?[]:Array.isArray(f)?f.map((o,n)=>({...o,key:o.key??`akash-store:${c}:${n}`})):[{...f,key:f.key??`akash-store:${c}`}]}function _(){k.clear();}function E(){return Object.fromEntries(k)}export{F as a,D as b,_ as c,E as d};//# sourceMappingURL=chunk-VWTULWXF.js.map
2
+ //# sourceMappingURL=chunk-VWTULWXF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-TKFJGLUO.js","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
1
+ {"version":3,"sources":["../src/store.ts"],"names":["globalPlugins","configureStores","options","storeInstances","defineStore","id","definition","initialState","store","createStoreInstance","stateSignals","stateKeys","key","signal","getterKeys","actionKeys","getterFn","computed","plugins","actionFn","args","plugin","fresh","partialOrFn","batch","value","snapshot","subscribers","subscribeEffect","callback","isInitial","effect","cb","configs","normalizePersistConfigs","cfg","storage","serialize","deserialize","persistKeys","raw","saved","persistScheduled","isInitialPersist","e","updated","syncOpts","syncKeys","syncState","doc","createSync","localSignal","syncSignal","originalSet","fromSync","remoteVal","persist","p","i","clearStores","__getStoreInstances"],"mappings":"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","file":"chunk-VWTULWXF.js","sourcesContent":["/**\n * Global state management via defineStore().\n *\n * Stores are singleton signal containers that persist across\n * components. They provide shared state, computed getters,\n * and actions — no external library needed.\n *\n * ```ts\n * const useCounterStore = defineStore('counter', {\n * state: () => ({ count: 0, name: 'Counter' }),\n * getters: {\n * doubled: (state) => state.count() * 2,\n * },\n * actions: {\n * increment() { this.count.update(c => c + 1); },\n * reset() { this.count.set(0); },\n * },\n * });\n *\n * // In any component:\n * const store = useCounterStore();\n * store.count(); // 0\n * store.doubled(); // 0\n * store.increment();\n * store.count(); // 1\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport { batch } from './scheduler.js';\nimport { createSync } from './sync.js';\nimport type { SyncDoc } from './sync.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\ntype StateFactory<S> = () => S;\n\ntype Getters<S, G> = {\n [K in keyof G]: (state: SignalifiedState<S>) => G[K];\n};\n\ntype Actions<A> = {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n};\n\n/** Maps plain state values to signals */\ntype SignalifiedState<S> = {\n [K in keyof S]: Signal<S[K]>;\n};\n\n/** The store instance returned to consumers */\nexport type Store<S, G, A> = SignalifiedState<S> & {\n [K in keyof G]: ReadonlySignal<G[K]>;\n} & {\n [K in keyof A]: A[K] extends (...args: infer P) => infer R\n ? (...args: P) => R\n : never;\n} & {\n /** Reset all state to initial values */\n $reset(): void;\n /** Merge partial state into the store, or apply changes via callback */\n $patch(partialOrFn: Partial<S> | ((state: SignalifiedState<S>) => void)): void;\n /** Subscribe to all state changes */\n $subscribe(callback: (state: S) => void): () => void;\n /** Get a plain snapshot of current state */\n $snapshot(): S;\n /** Store ID */\n $id: string;\n};\n\nexport interface PersistOptions<S> {\n /** Only persist these state keys (default: all) */\n pick?: (keyof S)[];\n /** Storage backend (default: 'localStorage') */\n storage?: 'localStorage' | 'sessionStorage';\n /** Custom storage key (default: 'akash-store:{storeId}') */\n key?: string;\n /** Custom serializer (default: JSON.stringify) */\n serialize?: (value: unknown) => string;\n /** Custom deserializer (default: JSON.parse) */\n deserialize?: (value: string) => unknown;\n}\n\nexport interface StoreSyncOptions {\n /** Sync transport (WebSocket, local, etc.) */\n transport?: import('./sync.js').SyncTransport;\n /** Enable sync — uses provided or default transport */\n enabled?: boolean;\n /** Sync room/channel name (default: store ID) */\n room?: string;\n /** Unique peer ID */\n peerId?: string;\n /** Enable presence tracking */\n presence?: boolean;\n /** Only sync these state keys (default: all) */\n pick?: string[];\n}\n\nexport interface StoreDefinition<S, G, A> {\n state: StateFactory<S>;\n getters?: Getters<S, G>;\n actions?: A & ThisType<\n SignalifiedState<S> &\n { [K in keyof G]: ReadonlySignal<G[K]> } &\n A\n >;\n plugins?: StorePlugin[];\n /** Auto-persist state to storage. true = persist all to localStorage. */\n persist?: boolean | PersistOptions<S> | PersistOptions<S>[];\n /** Sync state across peers via CRDT. Adds real-time collaboration to any store. */\n sync?: StoreSyncOptions;\n}\n\n// --- Plugin system ---\n\nexport interface StorePlugin {\n init?(store: Store<any, any, any>): void;\n onAction?(store: Store<any, any, any>, actionName: string, args: unknown[]): void;\n}\n\nconst globalPlugins: StorePlugin[] = [];\n\n/** Register global plugins that apply to all stores */\nexport function configureStores(options: { plugins: StorePlugin[] }): void {\n globalPlugins.push(...options.plugins);\n}\n\n// --- Store registry (singleton) ---\n\nconst storeInstances = new Map<string, Store<any, any, any>>();\n\n// --- defineStore ---\n\n/**\n * Define a global store. Returns a composable function that\n * always returns the same store instance (singleton).\n */\nexport function defineStore<\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = {},\n A extends Record<string, (...args: any[]) => any> = {},\n>(\n id: string,\n definition: StoreDefinition<S, G, A>,\n): () => Store<S, G, A> {\n return () => {\n // Return existing instance if already created\n if (storeInstances.has(id)) {\n return storeInstances.get(id) as Store<S, G, A>;\n }\n\n const initialState = definition.state();\n const store = createStoreInstance(id, initialState, definition);\n storeInstances.set(id, store);\n return store;\n };\n}\n\nfunction createStoreInstance<\n S extends Record<string, unknown>,\n G extends Record<string, unknown>,\n A extends Record<string, (...args: any[]) => any>,\n>(\n id: string,\n initialState: S,\n definition: StoreDefinition<S, G, A>,\n): Store<S, G, A> {\n // Create signals for each state property\n const stateSignals: Record<string, Signal<unknown>> = {};\n const stateKeys = Object.keys(initialState);\n\n for (const key of stateKeys) {\n stateSignals[key] = signal(initialState[key]);\n }\n\n // Build the store object first so getters can reference other getters via `this`\n const store: any = { $id: id };\n\n // Add state signals\n for (const key of stateKeys) {\n store[key] = stateSignals[key];\n }\n\n // Metadata for devtools — avoids calling functions to classify them\n const getterKeys: string[] = [];\n const actionKeys: string[] = [];\n store.$__meta = { stateKeys, getterKeys, actionKeys };\n\n // Create computed getters — bound to store so `this.otherGetter()` works\n if (definition.getters) {\n for (const [key, getterFn] of Object.entries(definition.getters)) {\n getterKeys.push(key);\n store[key] = computed(() =>\n (getterFn as Function).call(store, stateSignals),\n );\n }\n }\n\n // Collect all plugins (global + per-store)\n const plugins = [...globalPlugins, ...(definition.plugins ?? [])];\n\n // Bind actions with `this` pointing to the full store (state + getters + actions)\n if (definition.actions) {\n for (const [key, actionFn] of Object.entries(definition.actions)) {\n actionKeys.push(key);\n store[key] = (...args: unknown[]) => {\n for (const plugin of plugins) plugin.onAction?.(store, key, args);\n return (actionFn as Function).apply(store, args);\n };\n }\n }\n\n // $reset\n store.$reset = () => {\n const fresh = definition.state();\n for (const key of stateKeys) {\n stateSignals[key].set(fresh[key as keyof S]);\n }\n };\n\n // $patch — merge partial state or apply via callback (batched)\n store.$patch = (partialOrFn: Partial<S> | ((state: any) => void)) => {\n batch(() => {\n if (typeof partialOrFn === 'function') {\n partialOrFn(stateSignals);\n } else {\n for (const [key, value] of Object.entries(partialOrFn)) {\n if (key in stateSignals) {\n stateSignals[key].set(value);\n }\n }\n }\n });\n };\n\n // $snapshot\n store.$snapshot = (): S => {\n const snapshot: Record<string, unknown> = {};\n for (const key of stateKeys) {\n snapshot[key] = stateSignals[key]();\n }\n return snapshot as S;\n };\n\n // $subscribe — watch all state signals and notify on change\n const subscribers = new Set<(state: S) => void>();\n let subscribeEffect: (() => void) | null = null;\n store.$subscribe = (callback: (state: S) => void): (() => void) => {\n subscribers.add(callback);\n // Start watching if this is the first subscriber\n if (!subscribeEffect) {\n let isInitial = true;\n subscribeEffect = effect(() => {\n // Read all state signals to track them\n for (const key of stateKeys) {\n stateSignals[key]();\n }\n // Skip initial run — only notify on actual changes\n if (isInitial) {\n isInitial = false;\n return;\n }\n const snapshot = store.$snapshot();\n for (const cb of subscribers) {\n cb(snapshot);\n }\n });\n }\n return () => {\n subscribers.delete(callback);\n // Dispose effect when no subscribers remain\n if (subscribers.size === 0 && subscribeEffect) {\n subscribeEffect();\n subscribeEffect = null;\n }\n };\n };\n\n // --- Persistence ---\n if (definition.persist && typeof window !== 'undefined') {\n const configs = normalizePersistConfigs(id, definition.persist);\n for (const cfg of configs) {\n const storage = cfg.storage === 'sessionStorage' ? sessionStorage : localStorage;\n const serialize = cfg.serialize ?? JSON.stringify;\n const deserialize = cfg.deserialize ?? JSON.parse;\n const persistKeys = cfg.pick ?? stateKeys;\n\n // Hydrate: read from storage and merge into state\n try {\n const raw = storage.getItem(cfg.key);\n if (raw) {\n const saved = deserialize(raw) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in saved && key in stateSignals) {\n stateSignals[key].set(saved[key]);\n }\n }\n }\n } catch { /* corrupt storage — ignore */ }\n\n // Write: subscribe to state changes and persist (debounced via microtask)\n // The effect tracks signals to detect changes; the microtask reads\n // fresh values so sequential updates in the same tick are all captured.\n let persistScheduled = false;\n let isInitialPersist = true;\n effect(() => {\n // Track the persisted signals (read them so the effect re-runs on change)\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) stateSignals[key]();\n }\n // Skip the initial run (hydration just happened, don't write stale defaults)\n if (isInitialPersist) { isInitialPersist = false; return; }\n // Schedule a microtask to capture the LATEST values after all sync updates\n if (!persistScheduled) {\n persistScheduled = true;\n queueMicrotask(() => {\n persistScheduled = false;\n // Read fresh values NOW, not when the effect ran\n const snapshot: Record<string, unknown> = {};\n for (const key of persistKeys as string[]) {\n if (key in stateSignals) snapshot[key] = stateSignals[key].peek();\n }\n try { storage.setItem(cfg.key, serialize(snapshot)); } catch { /* quota exceeded */ }\n });\n }\n });\n\n // Cross-tab sync: listen for storage events from other tabs\n if (cfg.storage !== 'sessionStorage') {\n window.addEventListener('storage', (e) => {\n if (e.key !== cfg.key || !e.newValue) return;\n try {\n const updated = deserialize(e.newValue) as Record<string, unknown>;\n for (const key of persistKeys as string[]) {\n if (key in updated && key in stateSignals) {\n stateSignals[key].set(updated[key]);\n }\n }\n } catch { /* ignore parse errors */ }\n });\n }\n }\n }\n\n // --- Sync ---\n if (definition.sync && (definition.sync.enabled !== false)) {\n const syncOpts = definition.sync;\n const syncKeys = syncOpts.pick ?? stateKeys;\n\n const syncState: Record<string, unknown> = {};\n for (const key of syncKeys) {\n syncState[key] = stateSignals[key]?.peek?.() ?? initialState[key as keyof S];\n }\n\n const doc = createSync(syncState as Record<string, unknown>, {\n transport: syncOpts.transport,\n peerId: syncOpts.peerId,\n });\n\n // Wire: local signal changes → sync broadcast\n for (const key of syncKeys) {\n if (!(key in stateSignals) || !(key in doc.state)) continue;\n const localSignal = stateSignals[key];\n const syncSignal = (doc.state as Record<string, any>)[key];\n\n const originalSet = localSignal.set;\n let fromSync = false;\n localSignal.set = (value: unknown) => {\n originalSet.call(localSignal, value);\n if (!fromSync) syncSignal.set(value);\n };\n\n // Listen for remote changes\n effect(() => {\n const remoteVal = syncSignal();\n fromSync = true;\n localSignal.set(remoteVal);\n fromSync = false;\n });\n }\n\n // Expose sync metadata on the store\n (store as any).$sync = {\n peers: doc.peers,\n presence: doc.presence,\n peerPresence: doc.peerPresence,\n peerId: doc.peerId,\n connected: doc.connected,\n connect: doc.connect.bind(doc),\n disconnect: doc.disconnect.bind(doc),\n };\n }\n\n // Initialize plugins\n for (const plugin of plugins) plugin.init?.(store);\n\n return store as Store<S, G, A>;\n}\n\nfunction normalizePersistConfigs<S>(id: string, persist: boolean | PersistOptions<S> | PersistOptions<S>[]): Array<PersistOptions<S> & { key: string }> {\n if (persist === true) {\n return [{ key: `akash-store:${id}` }];\n }\n if (persist === false) return [];\n if (Array.isArray(persist)) {\n return persist.map((p, i) => ({ ...p, key: p.key ?? `akash-store:${id}:${i}` }));\n }\n return [{ ...persist, key: persist.key ?? `akash-store:${id}` }];\n}\n\n/**\n * Clear all store instances (useful for testing).\n */\nexport function clearStores(): void {\n storeInstances.clear();\n}\n\n/** @internal — exposes store registry for devtools */\nexport function __getStoreInstances(): Record<string, Store<any, any, any>> {\n return Object.fromEntries(storeInstances);\n}\n"]}
@@ -0,0 +1,5 @@
1
+ var o=false,c=new Map,a=0;function f(){o=true;}function u(){o=false,c.clear();}function l(){return o}function d(t){if(!o)return -1;let e=++a;return c.set(e,{id:e,createdAt:Date.now(),stackTrace:i(),componentName:t??null,disposed:false}),e}function p(t){if(!o||t===-1)return;let e=c.get(t);e&&(e.disposed=true,c.delete(t));}function k(){return Array.from(c.values())}function s(t=3e4){if(!o)return [];let e=Date.now(),n=[];for(let r of c.values())!r.disposed&&e-r.createdAt>t&&n.push({effectId:r.id,age:e-r.createdAt,componentName:r.componentName,stackTrace:r.stackTrace});return n}function m(t=3e4){let e=s(t);if(e.length!==0){console.warn(`[AkashJS] ${e.length} potential effect leak(s) detected:`);for(let n of e){let r=n.componentName?` in ${n.componentName}`:"";console.warn(` Effect #${n.effectId}${r} \u2014 active for ${(n.age/1e3).toFixed(1)}s`),n.stackTrace&&console.warn(` Created at:
2
+ ${n.stackTrace}`);}}}function g(){return {enabled:o,activeCount:c.size,totalTracked:a}}function i(){try{let e=new Error().stack;return e?e.split(`
3
+ `).slice(3,8).join(`
4
+ `):null}catch{return null}}export{f as a,u as b,l as c,d,p as e,k as f,s as g,m as h,g as i};//# sourceMappingURL=chunk-VX7PSSOU.js.map
5
+ //# sourceMappingURL=chunk-VX7PSSOU.js.map