@akashjs/runtime 0.2.2 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/dist/a11y.cjs +2 -0
  2. package/dist/a11y.cjs.map +1 -0
  3. package/dist/a11y.d.cts +99 -0
  4. package/dist/a11y.d.ts +99 -0
  5. package/dist/a11y.js +2 -0
  6. package/dist/a11y.js.map +1 -0
  7. package/dist/async-component.cjs +2 -0
  8. package/dist/async-component.cjs.map +1 -0
  9. package/dist/async-component.d.cts +44 -0
  10. package/dist/async-component.d.ts +44 -0
  11. package/dist/async-component.js +2 -0
  12. package/dist/async-component.js.map +1 -0
  13. package/dist/await-block.cjs +2 -0
  14. package/dist/await-block.cjs.map +1 -0
  15. package/dist/await-block.d.cts +37 -0
  16. package/dist/await-block.d.ts +37 -0
  17. package/dist/await-block.js +2 -0
  18. package/dist/await-block.js.map +1 -0
  19. package/dist/browser.cjs +2 -0
  20. package/dist/browser.cjs.map +1 -0
  21. package/dist/browser.d.cts +125 -0
  22. package/dist/browser.d.ts +125 -0
  23. package/dist/browser.js +2 -0
  24. package/dist/browser.js.map +1 -0
  25. package/dist/chunk-2HLDEWRT.cjs +2 -0
  26. package/dist/chunk-2HLDEWRT.cjs.map +1 -0
  27. package/dist/chunk-2LKFIID7.cjs +2 -0
  28. package/dist/chunk-2LKFIID7.cjs.map +1 -0
  29. package/dist/chunk-34PQECMN.cjs +2 -0
  30. package/dist/chunk-34PQECMN.cjs.map +1 -0
  31. package/dist/chunk-36VM3RJW.cjs +2 -0
  32. package/dist/chunk-36VM3RJW.cjs.map +1 -0
  33. package/dist/chunk-3PGU24B5.cjs +3 -0
  34. package/dist/chunk-3PGU24B5.cjs.map +1 -0
  35. package/dist/chunk-3XREYIJH.cjs +2 -0
  36. package/dist/chunk-3XREYIJH.cjs.map +1 -0
  37. package/dist/chunk-45DPEU7T.cjs +2 -0
  38. package/dist/chunk-45DPEU7T.cjs.map +1 -0
  39. package/dist/chunk-4J3QBQVW.js +4 -0
  40. package/dist/chunk-4J3QBQVW.js.map +1 -0
  41. package/dist/{chunk-NVZLEJXB.cjs → chunk-4NQEIKH5.cjs} +2 -2
  42. package/dist/{chunk-NVZLEJXB.cjs.map → chunk-4NQEIKH5.cjs.map} +1 -1
  43. package/dist/chunk-5QCWH6QA.cjs +4 -0
  44. package/dist/chunk-5QCWH6QA.cjs.map +1 -0
  45. package/dist/chunk-6O46EMQS.cjs +2 -0
  46. package/dist/chunk-6O46EMQS.cjs.map +1 -0
  47. package/dist/chunk-7IJUJUXE.cjs +2 -0
  48. package/dist/chunk-7IJUJUXE.cjs.map +1 -0
  49. package/dist/chunk-7UX5CSGZ.cjs +2 -0
  50. package/dist/chunk-7UX5CSGZ.cjs.map +1 -0
  51. package/dist/chunk-7VBH4F3P.js +2 -0
  52. package/dist/chunk-7VBH4F3P.js.map +1 -0
  53. package/dist/chunk-7ZPSYZHD.cjs +2 -0
  54. package/dist/chunk-7ZPSYZHD.cjs.map +1 -0
  55. package/dist/chunk-AOFLE33X.js +5 -0
  56. package/dist/chunk-AOFLE33X.js.map +1 -0
  57. package/dist/chunk-AQQQVDBQ.cjs +2 -0
  58. package/dist/chunk-AQQQVDBQ.cjs.map +1 -0
  59. package/dist/chunk-AXB5GHGO.js +2 -0
  60. package/dist/chunk-AXB5GHGO.js.map +1 -0
  61. package/dist/chunk-AZCELE44.cjs +2 -0
  62. package/dist/chunk-AZCELE44.cjs.map +1 -0
  63. package/dist/chunk-BB7P6HTR.js +2 -0
  64. package/dist/chunk-BB7P6HTR.js.map +1 -0
  65. package/dist/chunk-BGSF77LF.js +2 -0
  66. package/dist/chunk-BGSF77LF.js.map +1 -0
  67. package/dist/chunk-BHP3UTTQ.cjs +3 -0
  68. package/dist/chunk-BHP3UTTQ.cjs.map +1 -0
  69. package/dist/chunk-CP6SK2B4.js +2 -0
  70. package/dist/chunk-CP6SK2B4.js.map +1 -0
  71. package/dist/chunk-DFYXFKCH.cjs +2 -0
  72. package/dist/chunk-DFYXFKCH.cjs.map +1 -0
  73. package/dist/chunk-DHFVVFZF.cjs +2 -0
  74. package/dist/chunk-DHFVVFZF.cjs.map +1 -0
  75. package/dist/chunk-DP7G45QM.cjs +13 -0
  76. package/dist/chunk-DP7G45QM.cjs.map +1 -0
  77. package/dist/chunk-E6RB7PRO.js +2 -0
  78. package/dist/chunk-E6RB7PRO.js.map +1 -0
  79. package/dist/chunk-F4FXIPR3.js +2 -0
  80. package/dist/chunk-F4FXIPR3.js.map +1 -0
  81. package/dist/chunk-F6VSSM2P.js +2 -0
  82. package/dist/chunk-F6VSSM2P.js.map +1 -0
  83. package/dist/chunk-FUVSCPU4.cjs +2 -0
  84. package/dist/chunk-FUVSCPU4.cjs.map +1 -0
  85. package/dist/chunk-FVF3T4JJ.js +2 -0
  86. package/dist/chunk-FVF3T4JJ.js.map +1 -0
  87. package/dist/chunk-FVWHMFX6.cjs +5 -0
  88. package/dist/chunk-FVWHMFX6.cjs.map +1 -0
  89. package/dist/chunk-IHEW6F2H.js +2 -0
  90. package/dist/chunk-IHEW6F2H.js.map +1 -0
  91. package/dist/chunk-IJS2EMSE.js +2 -0
  92. package/dist/chunk-IJS2EMSE.js.map +1 -0
  93. package/dist/chunk-IKVHLORY.cjs +11 -0
  94. package/dist/chunk-IKVHLORY.cjs.map +1 -0
  95. package/dist/chunk-IQGSDFBI.cjs +2 -0
  96. package/dist/chunk-IQGSDFBI.cjs.map +1 -0
  97. package/dist/chunk-J6KDUWX6.cjs +2 -0
  98. package/dist/chunk-J6KDUWX6.cjs.map +1 -0
  99. package/dist/chunk-JD3LDHUI.cjs +2 -0
  100. package/dist/chunk-JD3LDHUI.cjs.map +1 -0
  101. package/dist/chunk-JEYTB4AG.js +2 -0
  102. package/dist/chunk-JEYTB4AG.js.map +1 -0
  103. package/dist/chunk-JFLZJPVN.js +2 -0
  104. package/dist/chunk-JFLZJPVN.js.map +1 -0
  105. package/dist/chunk-JLPJ22CE.js +2 -0
  106. package/dist/chunk-JLPJ22CE.js.map +1 -0
  107. package/dist/chunk-JQCN42XX.js +2 -0
  108. package/dist/chunk-JQCN42XX.js.map +1 -0
  109. package/dist/chunk-K2HB5VFA.cjs +2 -0
  110. package/dist/chunk-K2HB5VFA.cjs.map +1 -0
  111. package/dist/chunk-K7TMUF3F.cjs +2 -0
  112. package/dist/chunk-K7TMUF3F.cjs.map +1 -0
  113. package/dist/chunk-KE7BJTCD.js +2 -0
  114. package/dist/chunk-KE7BJTCD.js.map +1 -0
  115. package/dist/chunk-KMEGUPH2.js +3 -0
  116. package/dist/chunk-KMEGUPH2.js.map +1 -0
  117. package/dist/chunk-KUPL3ZVD.js +2 -0
  118. package/dist/chunk-KUPL3ZVD.js.map +1 -0
  119. package/dist/chunk-L3ZZX36S.js +2 -0
  120. package/dist/chunk-L3ZZX36S.js.map +1 -0
  121. package/dist/chunk-LD4C62JY.cjs +2 -0
  122. package/dist/chunk-LD4C62JY.cjs.map +1 -0
  123. package/dist/chunk-LWQPLKL6.cjs +20 -0
  124. package/dist/chunk-LWQPLKL6.cjs.map +1 -0
  125. package/dist/chunk-M5IACTFC.cjs +17 -0
  126. package/dist/chunk-M5IACTFC.cjs.map +1 -0
  127. package/dist/chunk-MADMPRT2.js +20 -0
  128. package/dist/chunk-MADMPRT2.js.map +1 -0
  129. package/dist/chunk-MDHWM3C2.js +2 -0
  130. package/dist/chunk-MDHWM3C2.js.map +1 -0
  131. package/dist/chunk-N3ITIHHM.js +5 -0
  132. package/dist/chunk-N3ITIHHM.js.map +1 -0
  133. package/dist/chunk-N5APNCPB.js +2 -0
  134. package/dist/chunk-N5APNCPB.js.map +1 -0
  135. package/dist/chunk-NBYFHJWB.js +36 -0
  136. package/dist/chunk-NBYFHJWB.js.map +1 -0
  137. package/dist/chunk-NCXMNJUN.js +2 -0
  138. package/dist/chunk-NCXMNJUN.js.map +1 -0
  139. package/dist/chunk-NEQ5TENE.cjs +2 -0
  140. package/dist/chunk-NEQ5TENE.cjs.map +1 -0
  141. package/dist/chunk-NGU2W4PD.cjs +2 -0
  142. package/dist/chunk-NGU2W4PD.cjs.map +1 -0
  143. package/dist/chunk-NHDYQTC5.cjs +36 -0
  144. package/dist/chunk-NHDYQTC5.cjs.map +1 -0
  145. package/dist/chunk-NJXXC5JB.js +2 -0
  146. package/dist/chunk-NJXXC5JB.js.map +1 -0
  147. package/dist/chunk-NQEY7DR5.cjs +2 -0
  148. package/dist/chunk-NQEY7DR5.cjs.map +1 -0
  149. package/dist/chunk-OQV3NYDH.js +3 -0
  150. package/dist/chunk-OQV3NYDH.js.map +1 -0
  151. package/dist/chunk-OZ4GNBKA.js +2 -0
  152. package/dist/chunk-OZ4GNBKA.js.map +1 -0
  153. package/dist/chunk-PPNEAFKE.cjs +5 -0
  154. package/dist/chunk-PPNEAFKE.cjs.map +1 -0
  155. package/dist/chunk-PYASLKWF.js +2 -0
  156. package/dist/chunk-PYASLKWF.js.map +1 -0
  157. package/dist/chunk-Q6S7SUOM.js +2 -0
  158. package/dist/chunk-Q6S7SUOM.js.map +1 -0
  159. package/dist/chunk-QE2TJ6P5.cjs +2 -0
  160. package/dist/chunk-QE2TJ6P5.cjs.map +1 -0
  161. package/dist/chunk-QNVMBXVH.js +2 -0
  162. package/dist/chunk-QNVMBXVH.js.map +1 -0
  163. package/dist/chunk-QQ725EZL.js +2 -0
  164. package/dist/chunk-QQ725EZL.js.map +1 -0
  165. package/dist/chunk-QQTZQ6UX.cjs +2 -0
  166. package/dist/chunk-QQTZQ6UX.cjs.map +1 -0
  167. package/dist/chunk-QSPRVXFV.cjs +2 -0
  168. package/dist/chunk-QSPRVXFV.cjs.map +1 -0
  169. package/dist/chunk-QTQ6RUX4.cjs +5 -0
  170. package/dist/chunk-QTQ6RUX4.cjs.map +1 -0
  171. package/dist/chunk-R65RPMQX.cjs +2 -0
  172. package/dist/chunk-R65RPMQX.cjs.map +1 -0
  173. package/dist/chunk-R7NUVVHP.js +2 -0
  174. package/dist/{chunk-Z5LQV5ND.js.map → chunk-R7NUVVHP.js.map} +1 -1
  175. package/dist/chunk-SXYPAP4B.js +2 -0
  176. package/dist/chunk-SXYPAP4B.js.map +1 -0
  177. package/dist/chunk-T2RVAQEU.js +2 -0
  178. package/dist/chunk-T2RVAQEU.js.map +1 -0
  179. package/dist/chunk-T7A5YOEG.cjs +2 -0
  180. package/dist/chunk-T7A5YOEG.cjs.map +1 -0
  181. package/dist/chunk-TDKDZ3QJ.cjs +2 -0
  182. package/dist/chunk-TDKDZ3QJ.cjs.map +1 -0
  183. package/dist/chunk-TFEHO7SF.cjs +2 -0
  184. package/dist/chunk-TFEHO7SF.cjs.map +1 -0
  185. package/dist/chunk-TSFY5HKB.js +17 -0
  186. package/dist/chunk-TSFY5HKB.js.map +1 -0
  187. package/dist/chunk-TYTEJYUQ.cjs +2 -0
  188. package/dist/chunk-TYTEJYUQ.cjs.map +1 -0
  189. package/dist/chunk-TZHEZW6R.js +11 -0
  190. package/dist/chunk-TZHEZW6R.js.map +1 -0
  191. package/dist/chunk-U65WRXZC.js +13 -0
  192. package/dist/chunk-U65WRXZC.js.map +1 -0
  193. package/dist/chunk-UT4MWGJ3.js +2 -0
  194. package/dist/chunk-UT4MWGJ3.js.map +1 -0
  195. package/dist/chunk-V2JDKH3W.cjs +2 -0
  196. package/dist/chunk-V2JDKH3W.cjs.map +1 -0
  197. package/dist/chunk-VNDSKBXQ.cjs +2 -0
  198. package/dist/chunk-VNDSKBXQ.cjs.map +1 -0
  199. package/dist/chunk-VO4FCKHM.js +2 -0
  200. package/dist/chunk-VO4FCKHM.js.map +1 -0
  201. package/dist/chunk-VUMMC2P5.js +2 -0
  202. package/dist/chunk-VUMMC2P5.js.map +1 -0
  203. package/dist/chunk-VUSNUBNI.js +2 -0
  204. package/dist/chunk-VUSNUBNI.js.map +1 -0
  205. package/dist/chunk-VWTULWXF.js +2 -0
  206. package/dist/chunk-VWTULWXF.js.map +1 -0
  207. package/dist/chunk-VX7PSSOU.js +5 -0
  208. package/dist/chunk-VX7PSSOU.js.map +1 -0
  209. package/dist/chunk-WLSXJU2N.js +13 -0
  210. package/dist/chunk-WLSXJU2N.js.map +1 -0
  211. package/dist/chunk-WOZWFMOK.cjs +2 -0
  212. package/dist/chunk-WOZWFMOK.cjs.map +1 -0
  213. package/dist/chunk-WTDTVWCQ.cjs +2 -0
  214. package/dist/chunk-WTDTVWCQ.cjs.map +1 -0
  215. package/dist/chunk-WZ5ULION.js +2 -0
  216. package/dist/chunk-WZ5ULION.js.map +1 -0
  217. package/dist/chunk-XPLIEN2G.cjs +13 -0
  218. package/dist/chunk-XPLIEN2G.cjs.map +1 -0
  219. package/dist/chunk-XWVNLE2W.cjs +2 -0
  220. package/dist/chunk-XWVNLE2W.cjs.map +1 -0
  221. package/dist/chunk-XZR3J626.cjs +2 -0
  222. package/dist/chunk-XZR3J626.cjs.map +1 -0
  223. package/dist/chunk-YDO5KARN.js +2 -0
  224. package/dist/chunk-YDO5KARN.js.map +1 -0
  225. package/dist/chunk-YURIYBTN.cjs +2 -0
  226. package/dist/chunk-YURIYBTN.cjs.map +1 -0
  227. package/dist/chunk-YXKQTEPR.js +2 -0
  228. package/dist/chunk-YXKQTEPR.js.map +1 -0
  229. package/dist/chunk-Z6K4FYG6.js +2 -0
  230. package/dist/chunk-Z6K4FYG6.js.map +1 -0
  231. package/dist/chunk-ZJULEDLY.js +2 -0
  232. package/dist/chunk-ZJULEDLY.js.map +1 -0
  233. package/dist/{component-C1WnFcRp.d.ts → component-CPVtkASo.d.ts} +2 -3
  234. package/dist/{component-C1WnFcRp.d.cts → component-CxlupKuc.d.cts} +2 -3
  235. package/dist/composables.cjs +2 -0
  236. package/dist/composables.cjs.map +1 -0
  237. package/dist/composables.d.cts +103 -0
  238. package/dist/composables.d.ts +103 -0
  239. package/dist/composables.js +2 -0
  240. package/dist/composables.js.map +1 -0
  241. package/dist/{context-2uQ6fuxu.d.ts → context-Cwt7QCpk.d.cts} +1 -9
  242. package/dist/{context-2uQ6fuxu.d.cts → context-Cwt7QCpk.d.ts} +1 -9
  243. package/dist/core.cjs +1 -1
  244. package/dist/core.d.cts +5 -4
  245. package/dist/core.d.ts +5 -4
  246. package/dist/core.js +1 -1
  247. package/dist/css.cjs +2 -0
  248. package/dist/css.cjs.map +1 -0
  249. package/dist/css.d.cts +42 -0
  250. package/dist/css.d.ts +42 -0
  251. package/dist/css.js +2 -0
  252. package/dist/css.js.map +1 -0
  253. package/dist/data-table.cjs +2 -0
  254. package/dist/data-table.cjs.map +1 -0
  255. package/dist/data-table.d.cts +97 -0
  256. package/dist/data-table.d.ts +97 -0
  257. package/dist/data-table.js +2 -0
  258. package/dist/data-table.js.map +1 -0
  259. package/dist/deep-signal.cjs +2 -0
  260. package/dist/deep-signal.cjs.map +1 -0
  261. package/dist/deep-signal.d.cts +48 -0
  262. package/dist/deep-signal.d.ts +48 -0
  263. package/dist/deep-signal.js +2 -0
  264. package/dist/deep-signal.js.map +1 -0
  265. package/dist/defer.cjs +2 -0
  266. package/dist/defer.cjs.map +1 -0
  267. package/dist/defer.d.cts +55 -0
  268. package/dist/defer.d.ts +55 -0
  269. package/dist/defer.js +2 -0
  270. package/dist/defer.js.map +1 -0
  271. package/dist/deprecation.cjs +2 -0
  272. package/dist/deprecation.cjs.map +1 -0
  273. package/dist/deprecation.d.cts +119 -0
  274. package/dist/deprecation.d.ts +119 -0
  275. package/dist/deprecation.js +2 -0
  276. package/dist/deprecation.js.map +1 -0
  277. package/dist/devtools-overlay-3WRM6GKM.js +57 -0
  278. package/dist/devtools-overlay-3WRM6GKM.js.map +1 -0
  279. package/dist/devtools-overlay-WJGSIB4N.cjs +57 -0
  280. package/dist/devtools-overlay-WJGSIB4N.cjs.map +1 -0
  281. package/dist/devtools.cjs +2 -0
  282. package/dist/devtools.cjs.map +1 -0
  283. package/dist/devtools.d.cts +78 -0
  284. package/dist/devtools.d.ts +78 -0
  285. package/dist/devtools.js +2 -0
  286. package/dist/devtools.js.map +1 -0
  287. package/dist/di.cjs +2 -0
  288. package/dist/di.cjs.map +1 -0
  289. package/dist/di.d.cts +93 -0
  290. package/dist/di.d.ts +93 -0
  291. package/dist/di.js +2 -0
  292. package/dist/di.js.map +1 -0
  293. package/dist/directive.cjs +2 -0
  294. package/dist/directive.cjs.map +1 -0
  295. package/dist/directive.d.cts +102 -0
  296. package/dist/directive.d.ts +102 -0
  297. package/dist/directive.js +2 -0
  298. package/dist/directive.js.map +1 -0
  299. package/dist/error-boundary.cjs +2 -0
  300. package/dist/error-boundary.cjs.map +1 -0
  301. package/dist/error-boundary.d.cts +17 -0
  302. package/dist/error-boundary.d.ts +17 -0
  303. package/dist/error-boundary.js +2 -0
  304. package/dist/error-boundary.js.map +1 -0
  305. package/dist/error-hints.cjs +2 -0
  306. package/dist/error-hints.cjs.map +1 -0
  307. package/dist/error-hints.d.cts +17 -0
  308. package/dist/error-hints.d.ts +17 -0
  309. package/dist/error-hints.js +2 -0
  310. package/dist/error-hints.js.map +1 -0
  311. package/dist/errors.cjs +2 -0
  312. package/dist/errors.cjs.map +1 -0
  313. package/dist/errors.d.cts +35 -0
  314. package/dist/errors.d.ts +35 -0
  315. package/dist/errors.js +2 -0
  316. package/dist/errors.js.map +1 -0
  317. package/dist/event-bus.cjs +2 -0
  318. package/dist/event-bus.cjs.map +1 -0
  319. package/dist/event-bus.d.cts +68 -0
  320. package/dist/event-bus.d.ts +68 -0
  321. package/dist/event-bus.js +2 -0
  322. package/dist/event-bus.js.map +1 -0
  323. package/dist/event-modifiers.cjs +2 -0
  324. package/dist/event-modifiers.cjs.map +1 -0
  325. package/dist/event-modifiers.d.cts +130 -0
  326. package/dist/event-modifiers.d.ts +130 -0
  327. package/dist/event-modifiers.js +2 -0
  328. package/dist/event-modifiers.js.map +1 -0
  329. package/dist/flip.cjs +2 -0
  330. package/dist/flip.cjs.map +1 -0
  331. package/dist/flip.d.cts +66 -0
  332. package/dist/flip.d.ts +66 -0
  333. package/dist/flip.js +2 -0
  334. package/dist/flip.js.map +1 -0
  335. package/dist/head.cjs +2 -0
  336. package/dist/head.cjs.map +1 -0
  337. package/dist/head.d.cts +70 -0
  338. package/dist/head.d.ts +70 -0
  339. package/dist/head.js +2 -0
  340. package/dist/head.js.map +1 -0
  341. package/dist/hydration.cjs +2 -0
  342. package/dist/hydration.cjs.map +1 -0
  343. package/dist/hydration.d.cts +84 -0
  344. package/dist/hydration.d.ts +84 -0
  345. package/dist/hydration.js +2 -0
  346. package/dist/hydration.js.map +1 -0
  347. package/dist/image.cjs +2 -0
  348. package/dist/image.cjs.map +1 -0
  349. package/dist/image.d.cts +54 -0
  350. package/dist/image.d.ts +54 -0
  351. package/dist/image.js +2 -0
  352. package/dist/image.js.map +1 -0
  353. package/dist/index.cjs +1 -63
  354. package/dist/index.cjs.map +1 -1
  355. package/dist/index.d.cts +51 -3152
  356. package/dist/index.d.ts +51 -3152
  357. package/dist/index.js +1 -63
  358. package/dist/index.js.map +1 -1
  359. package/dist/infinite-scroll.cjs +2 -0
  360. package/dist/infinite-scroll.cjs.map +1 -0
  361. package/dist/infinite-scroll.d.cts +49 -0
  362. package/dist/infinite-scroll.d.ts +49 -0
  363. package/dist/infinite-scroll.js +2 -0
  364. package/dist/infinite-scroll.js.map +1 -0
  365. package/dist/leak-detector.cjs +2 -0
  366. package/dist/leak-detector.cjs.map +1 -0
  367. package/dist/leak-detector.d.cts +71 -0
  368. package/dist/leak-detector.d.ts +71 -0
  369. package/dist/leak-detector.js +2 -0
  370. package/dist/leak-detector.js.map +1 -0
  371. package/dist/machine.cjs +1 -1
  372. package/dist/machine.d.cts +1 -1
  373. package/dist/machine.d.ts +1 -1
  374. package/dist/machine.js +1 -1
  375. package/dist/offline.cjs +1 -1
  376. package/dist/offline.d.cts +3 -1
  377. package/dist/offline.d.ts +3 -1
  378. package/dist/offline.js +1 -1
  379. package/dist/perf.cjs +2 -0
  380. package/dist/perf.cjs.map +1 -0
  381. package/dist/perf.d.cts +97 -0
  382. package/dist/perf.d.ts +97 -0
  383. package/dist/perf.js +2 -0
  384. package/dist/perf.js.map +1 -0
  385. package/dist/pipes.cjs +2 -0
  386. package/dist/pipes.cjs.map +1 -0
  387. package/dist/pipes.d.cts +130 -0
  388. package/dist/pipes.d.ts +130 -0
  389. package/dist/pipes.js +2 -0
  390. package/dist/pipes.js.map +1 -0
  391. package/dist/plugin.cjs +2 -0
  392. package/dist/plugin.cjs.map +1 -0
  393. package/dist/plugin.d.cts +70 -0
  394. package/dist/plugin.d.ts +70 -0
  395. package/dist/plugin.js +2 -0
  396. package/dist/plugin.js.map +1 -0
  397. package/dist/portal.cjs +2 -0
  398. package/dist/portal.cjs.map +1 -0
  399. package/dist/portal.d.cts +30 -0
  400. package/dist/portal.d.ts +30 -0
  401. package/dist/portal.js +2 -0
  402. package/dist/portal.js.map +1 -0
  403. package/dist/pwa.cjs +1 -1
  404. package/dist/pwa.d.cts +6 -2
  405. package/dist/pwa.d.ts +6 -2
  406. package/dist/pwa.js +1 -1
  407. package/dist/query-state.cjs +2 -0
  408. package/dist/query-state.cjs.map +1 -0
  409. package/dist/query-state.d.cts +82 -0
  410. package/dist/query-state.d.ts +82 -0
  411. package/dist/query-state.js +2 -0
  412. package/dist/query-state.js.map +1 -0
  413. package/dist/reconcile.cjs +2 -0
  414. package/dist/reconcile.cjs.map +1 -0
  415. package/dist/reconcile.d.cts +42 -0
  416. package/dist/reconcile.d.ts +42 -0
  417. package/dist/reconcile.js +2 -0
  418. package/dist/reconcile.js.map +1 -0
  419. package/dist/scheduler-CKi1esN-.d.cts +9 -0
  420. package/dist/scheduler-CKi1esN-.d.ts +9 -0
  421. package/dist/security.cjs +2 -0
  422. package/dist/security.cjs.map +1 -0
  423. package/dist/security.d.cts +193 -0
  424. package/dist/security.d.ts +193 -0
  425. package/dist/security.js +2 -0
  426. package/dist/security.js.map +1 -0
  427. package/dist/seo.cjs +2 -0
  428. package/dist/seo.cjs.map +1 -0
  429. package/dist/seo.d.cts +118 -0
  430. package/dist/seo.d.ts +118 -0
  431. package/dist/seo.js +2 -0
  432. package/dist/seo.js.map +1 -0
  433. package/dist/{signals-C7XfOHHR.d.cts → signals-DionyGGY.d.cts} +7 -0
  434. package/dist/{signals-C7XfOHHR.d.ts → signals-DionyGGY.d.ts} +7 -0
  435. package/dist/snippets.cjs +2 -0
  436. package/dist/snippets.cjs.map +1 -0
  437. package/dist/snippets.d.cts +109 -0
  438. package/dist/snippets.d.ts +109 -0
  439. package/dist/snippets.js +2 -0
  440. package/dist/snippets.js.map +1 -0
  441. package/dist/ssg.cjs +2 -0
  442. package/dist/ssg.cjs.map +1 -0
  443. package/dist/ssg.d.cts +82 -0
  444. package/dist/ssg.d.ts +82 -0
  445. package/dist/ssg.js +2 -0
  446. package/dist/ssg.js.map +1 -0
  447. package/dist/ssr.cjs +1 -1
  448. package/dist/ssr.d.cts +2 -1
  449. package/dist/ssr.d.ts +2 -1
  450. package/dist/ssr.js +1 -1
  451. package/dist/store.cjs +1 -1
  452. package/dist/store.d.cts +33 -30
  453. package/dist/store.d.ts +33 -30
  454. package/dist/store.js +1 -1
  455. package/dist/suspense.cjs +2 -0
  456. package/dist/suspense.cjs.map +1 -0
  457. package/dist/suspense.d.cts +36 -0
  458. package/dist/suspense.d.ts +36 -0
  459. package/dist/suspense.js +2 -0
  460. package/dist/suspense.js.map +1 -0
  461. package/dist/switch.cjs +2 -0
  462. package/dist/switch.cjs.map +1 -0
  463. package/dist/switch.d.cts +48 -0
  464. package/dist/switch.d.ts +48 -0
  465. package/dist/switch.js +2 -0
  466. package/dist/switch.js.map +1 -0
  467. package/dist/sync.cjs +1 -1
  468. package/dist/sync.d.cts +60 -5
  469. package/dist/sync.d.ts +60 -5
  470. package/dist/sync.js +1 -1
  471. package/dist/test.cjs +4 -4
  472. package/dist/test.cjs.map +1 -1
  473. package/dist/test.d.cts +74 -5
  474. package/dist/test.d.ts +74 -5
  475. package/dist/test.js +4 -4
  476. package/dist/test.js.map +1 -1
  477. package/dist/theme.cjs +2 -0
  478. package/dist/theme.cjs.map +1 -0
  479. package/dist/theme.d.cts +56 -0
  480. package/dist/theme.d.ts +56 -0
  481. package/dist/theme.js +2 -0
  482. package/dist/theme.js.map +1 -0
  483. package/dist/toast.cjs +2 -0
  484. package/dist/toast.cjs.map +1 -0
  485. package/dist/toast.d.cts +66 -0
  486. package/dist/toast.d.ts +66 -0
  487. package/dist/toast.js +2 -0
  488. package/dist/toast.js.map +1 -0
  489. package/dist/transition.cjs +2 -0
  490. package/dist/transition.cjs.map +1 -0
  491. package/dist/transition.d.cts +90 -0
  492. package/dist/transition.d.ts +90 -0
  493. package/dist/transition.js +2 -0
  494. package/dist/transition.js.map +1 -0
  495. package/dist/tweened.cjs +2 -0
  496. package/dist/tweened.cjs.map +1 -0
  497. package/dist/tweened.d.cts +59 -0
  498. package/dist/tweened.d.ts +59 -0
  499. package/dist/tweened.js +2 -0
  500. package/dist/tweened.js.map +1 -0
  501. package/dist/types-DjZCk1xT.d.cts +4 -0
  502. package/dist/types-DjZCk1xT.d.ts +4 -0
  503. package/dist/view-transition.cjs +2 -0
  504. package/dist/view-transition.cjs.map +1 -0
  505. package/dist/view-transition.d.cts +80 -0
  506. package/dist/view-transition.d.ts +80 -0
  507. package/dist/view-transition.js +2 -0
  508. package/dist/view-transition.js.map +1 -0
  509. package/dist/virtual-list.cjs +2 -0
  510. package/dist/virtual-list.cjs.map +1 -0
  511. package/dist/virtual-list.d.cts +67 -0
  512. package/dist/virtual-list.d.ts +67 -0
  513. package/dist/virtual-list.js +2 -0
  514. package/dist/virtual-list.js.map +1 -0
  515. package/dist/watch.cjs +2 -0
  516. package/dist/watch.cjs.map +1 -0
  517. package/dist/watch.d.cts +70 -0
  518. package/dist/watch.d.ts +70 -0
  519. package/dist/watch.js +2 -0
  520. package/dist/watch.js.map +1 -0
  521. package/dist/web-component.cjs +2 -0
  522. package/dist/web-component.cjs.map +1 -0
  523. package/dist/web-component.d.cts +51 -0
  524. package/dist/web-component.d.ts +51 -0
  525. package/dist/web-component.js +2 -0
  526. package/dist/web-component.js.map +1 -0
  527. package/package.json +249 -11
  528. package/dist/chunk-3AL2DVPZ.cjs +0 -13
  529. package/dist/chunk-3AL2DVPZ.cjs.map +0 -1
  530. package/dist/chunk-6NX6JRSV.cjs +0 -32
  531. package/dist/chunk-6NX6JRSV.cjs.map +0 -1
  532. package/dist/chunk-BT6HNBE7.js +0 -5
  533. package/dist/chunk-BT6HNBE7.js.map +0 -1
  534. package/dist/chunk-D6QQYZIC.js +0 -2
  535. package/dist/chunk-D6QQYZIC.js.map +0 -1
  536. package/dist/chunk-H4SAK7A5.cjs +0 -2
  537. package/dist/chunk-H4SAK7A5.cjs.map +0 -1
  538. package/dist/chunk-IKZMC3T6.js +0 -2
  539. package/dist/chunk-IKZMC3T6.js.map +0 -1
  540. package/dist/chunk-IM2VW4TK.js +0 -32
  541. package/dist/chunk-IM2VW4TK.js.map +0 -1
  542. package/dist/chunk-NQVWTQ2I.cjs +0 -5
  543. package/dist/chunk-NQVWTQ2I.cjs.map +0 -1
  544. package/dist/chunk-ODDXU5DO.js +0 -2
  545. package/dist/chunk-ODDXU5DO.js.map +0 -1
  546. package/dist/chunk-POLTPHUA.js +0 -13
  547. package/dist/chunk-POLTPHUA.js.map +0 -1
  548. package/dist/chunk-YIB4EKVI.cjs +0 -2
  549. package/dist/chunk-YIB4EKVI.cjs.map +0 -1
  550. package/dist/chunk-YJQLXUTN.cjs +0 -2
  551. package/dist/chunk-YJQLXUTN.cjs.map +0 -1
  552. package/dist/chunk-Z5LQV5ND.js +0 -2
@@ -0,0 +1,36 @@
1
+ import {c}from'./chunk-YXKQTEPR.js';function v(e,t={}){let s=c(false),i=c(false),n=c(!navigator.onLine),r=null;window.addEventListener("online",()=>n.set(false)),window.addEventListener("offline",()=>n.set(true));let c$1=new Promise((u,o)=>{if(!("serviceWorker"in navigator)){o(new Error("Service workers not supported"));return}navigator.serviceWorker.register(e,{scope:t.scope}).then(a=>{r=a,s.set(true),t.onReady?.(a),u(a),a.addEventListener("updatefound",()=>{let l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(i.set(true),t.onUpdate?.(a),t.autoReload&&(l.postMessage({type:"SKIP_WAITING"}),window.location.reload()));});});}).catch(a=>{t.onError?.(a),o(a);});});return {registered:()=>s(),updateAvailable:()=>i(),offline:()=>n(),ready:c$1,async update(){r&&await r.update();},skipWaiting(){r?.waiting&&(r.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload());},async unregister(){return r?r.unregister():false}}}function f(e){let t=Array.isArray(e)?e:e.runtimeCache??[],s=Array.isArray(e)?[]:e.precache??[],i=Array.isArray(e)?"akash-cache-v1":e.cacheName??"akash-cache-v1",n=`// Auto-generated service worker by AkashJS
2
+ const CACHE_NAME = '${i}';
3
+ const PRECACHE_URLS = ${JSON.stringify(s)};
4
+
5
+ self.addEventListener('install', (event) => {
6
+ ${s.length>0?`event.waitUntil(
7
+ caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))
8
+ );`:""}
9
+ self.skipWaiting();
10
+ });
11
+
12
+ self.addEventListener('activate', (event) => {
13
+ event.waitUntil(clients.claim());
14
+ });
15
+
16
+ self.addEventListener('message', (event) => {
17
+ if (event.data?.type === 'SKIP_WAITING') {
18
+ self.skipWaiting();
19
+ }
20
+ });
21
+
22
+ self.addEventListener('fetch', (event) => {
23
+ const url = new URL(event.request.url);
24
+ `;for(let r of t){let c=r.match??r.urlPattern;if(!c)continue;let u=c instanceof RegExp?c.toString():`new RegExp(${JSON.stringify(c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))})`,o=r.cacheName??i;n+=`
25
+ if (${u}.test(url.pathname)) {
26
+ event.respondWith(${p(r.strategy,o)});
27
+ return;
28
+ }
29
+ `;}return n+=`
30
+ // Default: network-first
31
+ event.respondWith(
32
+ fetch(event.request).catch(() => caches.match(event.request))
33
+ );
34
+ });
35
+ `,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}export{v as a,f as b,y as c};//# sourceMappingURL=chunk-NBYFHJWB.js.map
36
+ //# sourceMappingURL=chunk-NBYFHJWB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-NBYFHJWB.js","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {s,q,l}from'./chunk-KE7BJTCD.js';import {c}from'./chunk-YXKQTEPR.js';var f=s(n=>{let o=c(null);q(r=>{o.set(r);});function l$1(){o.set(null);}return ()=>{let r=o();return r?l(n.props.fallback(r,l$1)):l(n.children())}});export{f as a};//# sourceMappingURL=chunk-NCXMNJUN.js.map
2
+ //# sourceMappingURL=chunk-NCXMNJUN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error-boundary.ts"],"names":["ErrorBoundary","defineComponent","ctx","error","signal","onError","err","retry","currentError","nodeToDOM"],"mappings":"4EA8BO,IAAMA,CAAAA,CAAgBC,EAAqCC,CAAAA,EAAQ,CACxE,IAAMC,CAAAA,CAAQC,CAAAA,CAAqB,IAAI,CAAA,CAEvCC,CAAAA,CAASC,CAAAA,EAAQ,CACfH,CAAAA,CAAM,GAAA,CAAIG,CAAG,EACf,CAAC,EAED,SAASC,GAAAA,EAAQ,CACfJ,CAAAA,CAAM,GAAA,CAAI,IAAI,EAChB,CAEA,OAAO,IAAM,CACX,IAAMK,EAAeL,CAAAA,EAAM,CAE3B,OAAIK,CAAAA,CACKC,CAAAA,CAAUP,CAAAA,CAAI,MAAM,QAAA,CAASM,CAAAA,CAAcD,GAAK,CAAC,CAAA,CAGnDE,CAAAA,CAAUP,EAAI,QAAA,EAAU,CACjC,CACF,CAAC","file":"chunk-NCXMNJUN.js","sourcesContent":["/**\n * ErrorBoundary component.\n *\n * Declarative error handling — catches errors from child components\n * and renders a fallback UI.\n *\n * ```html\n * <ErrorBoundary fallback={(err) => <p>Error: {err.message}</p>}>\n * <RiskyComponent />\n * </ErrorBoundary>\n * ```\n */\n\nimport { defineComponent, onError } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\nexport interface ErrorBoundaryProps {\n /** Render function called when an error is caught */\n fallback: (error: Error, retry: () => void) => AkashNode;\n}\n\n/**\n * ErrorBoundary component.\n *\n * Catches errors from descendant components and renders a fallback.\n * The fallback receives the error and a `retry` function that re-renders\n * the children.\n */\nexport const ErrorBoundary = defineComponent<ErrorBoundaryProps>((ctx) => {\n const error = signal<Error | null>(null);\n\n onError((err) => {\n error.set(err);\n });\n\n function retry() {\n error.set(null);\n }\n\n return () => {\n const currentError = error();\n\n if (currentError) {\n return nodeToDOM(ctx.props.fallback(currentError, retry));\n }\n\n return nodeToDOM(ctx.children());\n };\n});\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');var h=class{entry;constructor(s,c){this.entry={value:s,timestamp:Date.now(),peerId:c};}get value(){return this.entry.value}get timestamp(){return this.entry.timestamp}set(s,c){let r=Date.now();return this.entry={value:s,timestamp:Math.max(r,this.entry.timestamp+1),peerId:c},true}merge(s){return s.timestamp>this.entry.timestamp||s.timestamp===this.entry.timestamp&&(!s.peerId||!this.entry.peerId||s.peerId>=this.entry.peerId)?(this.entry=s,true):false}toEntry(){return {...this.entry}}};function L(i){let s=null,c=[],r=[];return {send(n){s?.send(JSON.stringify({...n,type:"op",room:i.room}));},onReceive(n){c.push(n);let t=false;return ()=>{if(t)return;t=true;let o=c.indexOf(n);o!==-1&&c.splice(o,1);}},onPresence(n){return r.push(n),()=>{let t=r.indexOf(n);t!==-1&&r.splice(t,1);}},sendPresence(n){s?.send(JSON.stringify({type:"presence",room:i.room,data:n}));},connect(){s=new WebSocket(i.url,i.protocols),s.onmessage=n=>{try{let t=JSON.parse(n.data);if(t.type==="op")for(let o of c)o(t);else if(t.type==="presence")for(let o of r)o(t.peerId,t.data);}catch{}},s.onopen=()=>{s?.send(JSON.stringify({type:"join",room:i.room}));};},disconnect(){s?.close(),s=null;}}}function W(){let i=[],s=[];return {send(c){for(let r of i)r(c);},onReceive(c){i.push(c);let r=false;return ()=>{if(r)return;r=true;let n=i.indexOf(c);n!==-1&&i.splice(n,1);}},sendPresence(c,r){for(let n of s)n(r??"unknown",c);},onPresence(c){s.push(c);let r=false;return ()=>{if(r)return;r=true;let n=s.indexOf(c);n!==-1&&s.splice(n,1);}},connect(){},disconnect(){}}}var D=0;function _(i,s,c){let r,n;typeof i=="string"?(r=s,n=c??{}):(r=i,n=s??{});let t=n.peerId??`peer-${++D}-${Date.now()}`,o=n.transport??W(),l=new Map,u={};for(let[e,a]of Object.entries(r))l.set(e,new h(a,t)),u[e]=chunkWOZWFMOK_cjs.c(a);let y={};for(let e of Object.keys(r)){let a=u[e],d=l.get(e),p=(()=>a());p.set=k=>{d.set(k,t),a.set(k),o.send({type:"set",key:e,value:k,timestamp:d.timestamp,peerId:t});},p.update=k=>{p.set(k(a()));},p.peek=()=>a.peek(),y[e]=p;}let m=chunkWOZWFMOK_cjs.c([]),g=chunkWOZWFMOK_cjs.c(false),v=chunkWOZWFMOK_cjs.c(n.presence??{}),x=chunkWOZWFMOK_cjs.c(new Map),T=chunkWOZWFMOK_cjs.c([]);function O(e,a){if(e in u){u[e].set(a);let d=l.get(e);d&&d.set(a,t),o.send({type:"set",key:e,value:a,timestamp:Date.now(),peerId:t});}T.update(d=>d.filter(p=>p.key!==e));}let R=o.onReceive(e=>{if(e.peerId!==t&&e.type==="set"&&l.has(e.key)){let a=l.get(e.key),d=a.value,p=a.timestamp;if(n.onConflict&&p>0&&Math.abs(e.timestamp-p)<1e3&&e.peerId!==t){let w={key:e.key,localValue:d,remoteValue:e.value,localTimestamp:p,remoteTimestamp:e.timestamp,remotePeerId:e.peerId},S;try{S=n.onConflict(w);}catch(b){console.warn("[AkashJS Sync] onConflict handler threw, falling back to LWW:",b),a.merge({value:e.value,timestamp:e.timestamp,peerId:e.peerId})&&u[e.key].set(e.value),S="__fallback__";}S==="__fallback__"||(S!==void 0?(a.set(S,t),u[e.key].set(S),o.send({type:"set",key:e.key,value:S,timestamp:Date.now(),peerId:t})):T.update(b=>[...b,w]));}else a.merge({value:e.value,timestamp:e.timestamp,peerId:e.peerId})&&u[e.key].set(e.value);}}),P=v.set;v.set=e=>{P.call(v,e),o.sendPresence?.(e,t);};let C=o.onPresence?.((e,a)=>{e!==t&&x.update(d=>{let p=new Map(d);return a===null?p.delete(e):p.set(e,a),p});});return {state:y,peers:()=>m(),presence:v,peerPresence:()=>x(),conflicts:()=>T(),resolveConflict:O,peerId:t,connected:()=>g(),connect(){o.connect(),g.set(true);let e=v();Object.keys(e).length>0&&o.sendPresence?.(e,t);},disconnect(){o.sendPresence?.(null,t),o.disconnect(),g.set(false);},dispose(){o.sendPresence?.(null,t),R(),C?.(),o.disconnect();}}}function j(i,s){let c=s?.throttle??50,r=s?.target??(typeof document<"u"?document:null),n=chunkWOZWFMOK_cjs.c(0),t=chunkWOZWFMOK_cjs.c(0),o=0,l=null;function u(y){n.set(y.clientX),t.set(y.clientY);let m=Date.now();m-o>=c?(o=m,i.presence.set({...i.presence.peek?.()??{},cursor:{x:y.clientX,y:y.clientY}})):l||(l=setTimeout(()=>{l=null,o=Date.now(),i.presence.set({...i.presence.peek?.()??{},cursor:{x:n.peek(),y:t.peek()}});},c-(m-o)));}return r?.addEventListener?.("mousemove",u),{x:()=>n(),y:()=>t(),dispose(){r?.removeEventListener?.("mousemove",u),l&&clearTimeout(l);}}}function A(i,s){let c=s?.timeout??2e3,r=chunkWOZWFMOK_cjs.c(false),n=null;function t(){r.set(true),i.presence.set({...i.presence.peek?.()??{},typing:true}),n&&clearTimeout(n),n=setTimeout(o,c);}function o(){r.set(false),i.presence.set({...i.presence.peek?.()??{},typing:false}),n&&(clearTimeout(n),n=null);}let l=chunkWOZWFMOK_cjs.d(()=>{let u=i.peerPresence(),y=[];if(u instanceof Map)for(let[m,g]of u)g&&typeof g=="object"&&g.typing&&y.push(m);return y});return {isTyping:()=>r(),othersTyping:l,start:t,stop:o}}exports.a=h;exports.b=L;exports.c=W;exports.d=_;exports.e=j;exports.f=A;//# sourceMappingURL=chunk-NEQ5TENE.cjs.map
2
+ //# sourceMappingURL=chunk-NEQ5TENE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sync.ts"],"names":["LWWRegister","initialValue","peerId","value","ts","remote","createWebSocketTransport","options","ws","opHandlers","presenceHandlers","op","handler","removed","i","data","e","msg","h","createLocalTransport","senderPeerId","peerIdCounter","createSync","roomIdOrState","stateOrOptions","maybeOptions","initialState","transport","registers","stateSignals","key","signal","state","original","register","proxy","fn","peers","connected","presence","peerPresenceMap","conflictsSignal","resolveConflict","list","c","unsubOps","localValue","localTimestamp","conflict","resolved","err","originalPresenceSet","unsubPresence","remotePeerId","map","next","p","useCursor","doc","throttleMs","target","x","y","lastSend","pending","onMove","now","useTypingIndicator","timeout","isTyping","timer","start","stop","othersTyping","computed","typing","id"],"mappings":"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","file":"chunk-NEQ5TENE.cjs","sourcesContent":["/**\n * Collaborative signals with CRDT.\n *\n * Make any signal multiplayer with one line. Multiple users can\n * edit the same state simultaneously with automatic conflict\n * resolution via Last-Writer-Wins Register and Operation-based CRDTs.\n *\n * ```ts\n * const doc = createSync('doc-123', {\n * title: '',\n * blocks: [],\n * cursor: { x: 0, y: 0 },\n * });\n *\n * doc.state.title.set('Hello'); // syncs to all peers\n * doc.peers(); // list of connected users\n * doc.presence.set({ cursor: { x: 10, y: 20 } });\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// CRDT — Last-Writer-Wins Register\n// =========================================================================\n\nexport interface LWWEntry<T> {\n value: T;\n timestamp: number;\n peerId: string;\n}\n\n/**\n * Last-Writer-Wins Register — simplest CRDT for single values.\n * The write with the highest timestamp wins on conflict.\n */\nexport class LWWRegister<T> {\n private entry: LWWEntry<T>;\n\n constructor(initialValue: T, peerId: string) {\n this.entry = { value: initialValue, timestamp: Date.now(), peerId };\n }\n\n get value(): T {\n return this.entry.value;\n }\n\n get timestamp(): number {\n return this.entry.timestamp;\n }\n\n set(value: T, peerId: string): boolean {\n const ts = Date.now();\n // Local writes always succeed unconditionally — the register always\n // advances for intentional writes. Conflict resolution only applies\n // in merge() for remote ops.\n this.entry = { value, timestamp: Math.max(ts, this.entry.timestamp + 1), peerId };\n return true;\n }\n\n merge(remote: LWWEntry<T>): boolean {\n if (\n remote.timestamp > this.entry.timestamp ||\n (remote.timestamp === this.entry.timestamp && (\n !remote.peerId || !this.entry.peerId || remote.peerId >= this.entry.peerId\n ))\n ) {\n this.entry = remote;\n return true;\n }\n return false;\n }\n\n toEntry(): LWWEntry<T> {\n return { ...this.entry };\n }\n}\n\n// =========================================================================\n// Operation log for list CRDTs\n// =========================================================================\n\nexport type SyncOp =\n | { type: 'set'; key: string; value: unknown; timestamp: number; peerId: string }\n | { type: 'insert'; key: string; index: number; value: unknown; timestamp: number; peerId: string }\n | { type: 'delete'; key: string; index: number; timestamp: number; peerId: string };\n\n// =========================================================================\n// Sync transport interface\n// =========================================================================\n\nexport interface SyncTransport {\n /** Send an operation to peers */\n send(op: SyncOp): void;\n /** Listen for operations from peers */\n onReceive(handler: (op: SyncOp) => void): () => void;\n /** Listen for peer presence updates */\n onPresence?(handler: (peerId: string, data: unknown) => void): () => void;\n /** Send presence data (peerId passed by createSync internals) */\n sendPresence?(data: unknown, peerId?: string): void;\n /** Connect to the sync channel */\n connect(): void;\n /** Disconnect */\n disconnect(): void;\n}\n\n// =========================================================================\n// WebSocket transport\n// =========================================================================\n\nexport interface WebSocketTransportOptions {\n url: string;\n room: string;\n protocols?: string | string[];\n}\n\nexport function createWebSocketTransport(options: WebSocketTransportOptions): SyncTransport {\n let ws: WebSocket | null = null;\n const opHandlers: Array<(op: SyncOp) => void> = [];\n const presenceHandlers: Array<(peerId: string, data: unknown) => void> = [];\n\n return {\n send(op: SyncOp) {\n ws?.send(JSON.stringify({ ...op, type: 'op', room: options.room }));\n },\n onReceive(handler) {\n opHandlers.push(handler);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const i = opHandlers.indexOf(handler);\n if (i !== -1) opHandlers.splice(i, 1);\n };\n },\n onPresence(handler) {\n presenceHandlers.push(handler);\n return () => {\n const i = presenceHandlers.indexOf(handler);\n if (i !== -1) presenceHandlers.splice(i, 1);\n };\n },\n sendPresence(data) {\n ws?.send(JSON.stringify({ type: 'presence', room: options.room, data }));\n },\n connect() {\n ws = new WebSocket(options.url, options.protocols);\n ws.onmessage = (e) => {\n try {\n const msg = JSON.parse(e.data);\n if (msg.type === 'op') {\n for (const h of opHandlers) h(msg);\n } else if (msg.type === 'presence') {\n for (const h of presenceHandlers) h(msg.peerId, msg.data);\n }\n } catch { /* ignore parse errors */ }\n };\n ws.onopen = () => {\n ws?.send(JSON.stringify({ type: 'join', room: options.room }));\n };\n },\n disconnect() {\n ws?.close();\n ws = null;\n },\n };\n}\n\n// =========================================================================\n// In-memory transport (for testing / single-tab)\n// =========================================================================\n\nexport function createLocalTransport(): SyncTransport {\n const opHandlers: Array<(op: SyncOp) => void> = [];\n const presenceHandlers: Array<(peerId: string, data: unknown) => void> = [];\n return {\n send(op) {\n for (const h of opHandlers) h(op);\n },\n onReceive(handler) {\n opHandlers.push(handler);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const i = opHandlers.indexOf(handler);\n if (i !== -1) opHandlers.splice(i, 1);\n };\n },\n sendPresence(data, senderPeerId?: string) {\n for (const h of presenceHandlers) h(senderPeerId ?? 'unknown', data);\n },\n onPresence(handler) {\n presenceHandlers.push(handler);\n let removed = false;\n return () => {\n if (removed) return;\n removed = true;\n const i = presenceHandlers.indexOf(handler);\n if (i !== -1) presenceHandlers.splice(i, 1);\n };\n },\n connect() {},\n disconnect() {},\n };\n}\n\n// =========================================================================\n// createSync — the main API\n// =========================================================================\n\nexport interface SyncConflict {\n key: string;\n localValue: unknown;\n remoteValue: unknown;\n localTimestamp: number;\n remoteTimestamp: number;\n remotePeerId: string;\n}\n\nexport interface SyncOptions {\n /** Transport for sending/receiving operations */\n transport?: SyncTransport;\n /** Unique peer ID (default: random) */\n peerId?: string;\n /** Initial presence data — broadcast on connect */\n presence?: Record<string, unknown>;\n /** Custom conflict resolver. Return the winning value, or undefined to queue for manual resolution. */\n onConflict?: (conflict: SyncConflict) => unknown | undefined;\n}\n\nexport interface SyncDoc<T extends Record<string, unknown>> {\n /** Reactive synced state — each key is a Signal */\n state: { [K in keyof T]: Signal<T[K]> };\n /** Connected peers (reactive) */\n peers: ReadonlySignal<PeerInfo[]>;\n /** Local presence data */\n presence: Signal<Record<string, unknown>>;\n /** Peer presence map (reactive) */\n peerPresence: ReadonlySignal<Map<string, unknown>>;\n /** Unresolved conflicts (reactive) */\n conflicts: ReadonlySignal<SyncConflict[]>;\n /** Resolve a conflict by choosing a value for a key */\n resolveConflict: (key: string, value: unknown) => void;\n /** This peer's ID */\n peerId: string;\n /** Whether connected */\n connected: ReadonlySignal<boolean>;\n /** Connect to the sync channel */\n connect(): void;\n /** Disconnect */\n disconnect(): void;\n /** Dispose the sync doc */\n dispose(): void;\n}\n\nexport interface PeerInfo {\n id: string;\n joinedAt: number;\n}\n\nlet peerIdCounter = 0;\n\n/**\n * Create a collaborative synced document.\n *\n * ```ts\n * const doc = createSync('room-1', { title: '', count: 0 }, {\n * transport: createWebSocketTransport({ url: 'wss://sync.example.com', room: 'room-1' }),\n * });\n *\n * doc.state.title.set('Hello'); // auto-syncs to all peers\n * doc.peers(); // connected users\n * ```\n */\nexport function createSync<T extends Record<string, unknown>>(\n initialState: T,\n options?: SyncOptions,\n): SyncDoc<T>;\nexport function createSync<T extends Record<string, unknown>>(\n roomIdOrState: string | T,\n stateOrOptions?: T | SyncOptions,\n maybeOptions?: SyncOptions,\n): SyncDoc<T> {\n // Support both old (roomId, state, options) and new (state, options) signatures\n let initialState: T;\n let options: SyncOptions;\n if (typeof roomIdOrState === 'string') {\n initialState = stateOrOptions as T;\n options = maybeOptions ?? {};\n } else {\n initialState = roomIdOrState;\n options = (stateOrOptions as SyncOptions) ?? {};\n }\n const peerId = options.peerId ?? `peer-${++peerIdCounter}-${Date.now()}`;\n const transport = options.transport ?? createLocalTransport();\n\n // Create CRDT registers and signals for each state key\n const registers = new Map<string, LWWRegister<unknown>>();\n const stateSignals: Record<string, Signal<unknown>> = {};\n\n for (const [key, value] of Object.entries(initialState)) {\n registers.set(key, new LWWRegister(value, peerId));\n stateSignals[key] = signal(value);\n }\n\n // Intercept signal.set to broadcast operations\n const state = {} as { [K in keyof T]: Signal<T[K]> };\n for (const key of Object.keys(initialState)) {\n const original = stateSignals[key];\n const register = registers.get(key)!;\n\n const proxy: Signal<any> = (() => original()) as any;\n proxy.set = (value: any) => {\n register.set(value, peerId);\n original.set(value);\n transport.send({\n type: 'set',\n key,\n value,\n timestamp: register.timestamp,\n peerId,\n });\n };\n proxy.update = (fn: (prev: any) => any) => {\n proxy.set(fn(original()));\n };\n proxy.peek = () => original.peek();\n\n (state as any)[key] = proxy;\n }\n\n // Peers\n const peers = signal<PeerInfo[]>([]);\n const connected = signal(false);\n const presence = signal<Record<string, unknown>>(options.presence ?? {});\n const peerPresenceMap = signal(new Map<string, unknown>());\n\n // Conflict tracking\n const conflictsSignal = signal<SyncConflict[]>([]);\n\n function resolveConflict(key: string, value: unknown): void {\n // Apply the resolved value\n if (key in stateSignals) {\n stateSignals[key].set(value);\n const register = registers.get(key);\n if (register) register.set(value, peerId);\n // Broadcast the resolution\n transport.send({ type: 'set', key, value, timestamp: Date.now(), peerId });\n }\n // Remove from conflicts list\n conflictsSignal.update(list => list.filter(c => c.key !== key));\n }\n\n // Listen for remote operations (skip self-originated ops)\n const unsubOps = transport.onReceive((op) => {\n if (op.peerId === peerId) return;\n if (op.type === 'set' && registers.has(op.key)) {\n const register = registers.get(op.key)!;\n const localValue = register.value;\n const localTimestamp = register.timestamp;\n\n // Check for conflict: remote write to a key we also recently wrote\n const isConflict = options.onConflict && localTimestamp > 0 &&\n Math.abs(op.timestamp - localTimestamp) < 1000 && // within 1s window\n op.peerId !== peerId;\n\n if (isConflict) {\n const conflict: SyncConflict = {\n key: op.key,\n localValue,\n remoteValue: op.value,\n localTimestamp,\n remoteTimestamp: op.timestamp,\n remotePeerId: op.peerId,\n };\n let resolved: unknown;\n try {\n resolved = options.onConflict!(conflict);\n } catch (err) {\n console.warn('[AkashJS Sync] onConflict handler threw, falling back to LWW:', err);\n // Fallback to standard LWW merge\n const merged = register.merge({ value: op.value, timestamp: op.timestamp, peerId: op.peerId });\n if (merged) stateSignals[op.key].set(op.value);\n resolved = '__fallback__';\n }\n if (resolved === '__fallback__') {\n // Already handled by LWW fallback above\n } else if (resolved !== undefined) {\n register.set(resolved, peerId);\n stateSignals[op.key].set(resolved);\n transport.send({ type: 'set', key: op.key, value: resolved, timestamp: Date.now(), peerId });\n } else {\n conflictsSignal.update(list => [...list, conflict]);\n }\n } else {\n // No conflict handler or no conflict — standard LWW merge\n const merged = register.merge({\n value: op.value,\n timestamp: op.timestamp,\n peerId: op.peerId,\n });\n if (merged) {\n stateSignals[op.key].set(op.value);\n }\n }\n }\n });\n\n // Intercept presence.set to broadcast with peerId\n const originalPresenceSet = presence.set;\n presence.set = (data: Record<string, unknown>) => {\n originalPresenceSet.call(presence, data);\n transport.sendPresence?.(data, peerId);\n };\n\n // Listen for presence — filter out self\n const unsubPresence = transport.onPresence?.((remotePeerId, data) => {\n if (remotePeerId === peerId) return; // ignore own presence\n peerPresenceMap.update((map) => {\n const next = new Map(map);\n if (data === null) {\n next.delete(remotePeerId); // peer disconnected\n } else {\n next.set(remotePeerId, data);\n }\n return next;\n });\n });\n\n return {\n state,\n peers: () => peers(),\n presence,\n peerPresence: () => peerPresenceMap(),\n conflicts: () => conflictsSignal(),\n resolveConflict,\n peerId,\n connected: () => connected(),\n connect() {\n transport.connect();\n connected.set(true);\n // Broadcast initial presence on connect\n const p = presence();\n if (Object.keys(p).length > 0) {\n transport.sendPresence?.(p, peerId);\n }\n },\n disconnect() {\n // Broadcast null presence to signal departure\n transport.sendPresence?.(null, peerId);\n transport.disconnect();\n connected.set(false);\n },\n dispose() {\n transport.sendPresence?.(null, peerId);\n unsubOps();\n unsubPresence?.();\n transport.disconnect();\n },\n };\n}\n\n// =========================================================================\n// Presence composables\n// =========================================================================\n\n/**\n * Track cursor position and broadcast via sync presence.\n * Throttles updates to avoid flooding the transport.\n *\n * ```ts\n * const cursor = useCursor(doc, { throttle: 50 });\n * // Automatically tracks mousemove and broadcasts { cursor: { x, y } }\n * // Other peers: doc.peerPresence().get(peerId).cursor\n * ```\n */\nexport function useCursor(\n doc: SyncDoc<any>,\n options?: { throttle?: number; target?: HTMLElement },\n): { x: ReadonlySignal<number>; y: ReadonlySignal<number>; dispose: () => void } {\n const throttleMs = options?.throttle ?? 50;\n const target = options?.target ?? (typeof document !== 'undefined' ? document : null);\n const x = signal(0);\n const y = signal(0);\n let lastSend = 0;\n let pending: ReturnType<typeof setTimeout> | null = null;\n\n function onMove(e: MouseEvent): void {\n x.set(e.clientX);\n y.set(e.clientY);\n\n const now = Date.now();\n if (now - lastSend >= throttleMs) {\n lastSend = now;\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, cursor: { x: e.clientX, y: e.clientY } });\n } else if (!pending) {\n pending = setTimeout(() => {\n pending = null;\n lastSend = Date.now();\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, cursor: { x: x.peek(), y: y.peek() } });\n }, throttleMs - (now - lastSend));\n }\n }\n\n target?.addEventListener?.('mousemove', onMove as EventListener);\n\n return {\n x: () => x(),\n y: () => y(),\n dispose() {\n target?.removeEventListener?.('mousemove', onMove as EventListener);\n if (pending) clearTimeout(pending);\n },\n };\n}\n\n/**\n * Typing indicator — broadcasts typing state with auto-timeout.\n *\n * ```ts\n * const typing = useTypingIndicator(doc, { timeout: 2000 });\n * typing.start(); // broadcasts { typing: true }\n * // Auto-stops after 2s of inactivity\n * typing.stop(); // manual stop\n *\n * // Other peers typing:\n * typing.othersTyping(); // string[] of peer IDs currently typing\n * ```\n */\nexport function useTypingIndicator(\n doc: SyncDoc<any>,\n options?: { timeout?: number },\n): {\n isTyping: ReadonlySignal<boolean>;\n othersTyping: ReadonlySignal<string[]>;\n start: () => void;\n stop: () => void;\n} {\n const timeout = options?.timeout ?? 2000;\n const isTyping = signal(false);\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function start(): void {\n isTyping.set(true);\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, typing: true });\n if (timer) clearTimeout(timer);\n timer = setTimeout(stop, timeout);\n }\n\n function stop(): void {\n isTyping.set(false);\n doc.presence.set({ ...doc.presence.peek?.() ?? {}, typing: false });\n if (timer) { clearTimeout(timer); timer = null; }\n }\n\n const othersTyping = computed(() => {\n const peers = doc.peerPresence();\n const typing: string[] = [];\n if (peers instanceof Map) {\n for (const [id, data] of peers) {\n if (data && typeof data === 'object' && (data as any).typing) {\n typing.push(id);\n }\n }\n }\n return typing;\n });\n\n return {\n isTyping: () => isTyping(),\n othersTyping,\n start,\n stop,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';function E(a,c={}){let{duration:f=300,easing:u="cubic-bezier(0.2, 0, 0, 1)",delay:P=0,selector:d,keyAttribute:A="data-key",onComplete:p}=c,r=new Map;function h(){return Array.from(d?a.querySelectorAll(d):a.children)}function m(t){return t.getAttribute(A)??t.id??""}function g(){r=new Map;for(let t of h()){let e=m(t);if(e){let i=t.getBoundingClientRect();r.set(e,{left:i.left,top:i.top,width:i.width,height:i.height});}}}function b(){let t=h(),e=[];for(let n of t){let o=m(n),s=r.get(o);if(!s)continue;let l=n.getBoundingClientRect(),y=s.left-l.left,w=s.top-l.top,M=s.width/(l.width||1),v=s.height/(l.height||1);if(Math.abs(y)<.5&&Math.abs(w)<.5&&Math.abs(M-1)<.01&&Math.abs(v-1)<.01)continue;let x=n.animate([{transform:`translate(${y}px, ${w}px) scale(${M}, ${v})`},{transform:"translate(0, 0) scale(1, 1)"}],{duration:f,easing:u,delay:P,fill:"both"});e.push(x);}let i=new Set(t.map(m));for(let[n,o]of r)i.has(n);return r.clear(),new Promise(n=>{if(e.length===0){p?.(),n();return}Promise.all(e.map(o=>o.finished)).then(()=>{for(let o of e)o.cancel();p?.(),n();});})}return {measure:g,animate:b,async flip(t){return g(),t(),await new Promise(e=>requestAnimationFrame(e)),b()}}}async function F(a,c,f){return E(a,f).flip(c)}exports.a=E;exports.b=F;//# sourceMappingURL=chunk-NGU2W4PD.cjs.map
2
+ //# sourceMappingURL=chunk-NGU2W4PD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flip.ts"],"names":["createFlip","container","options","duration","easing","delay","selector","keyAttribute","onComplete","firstPositions","getElements","getKey","el","measure","key","rect","animate","elements","animations","first","last","dx","dy","dw","dh","animation","currentKeys","resolve","a","update","r","flip"],"mappings":"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","file":"chunk-NGU2W4PD.cjs","sourcesContent":["/**\n * FLIP animations for list reordering.\n *\n * First-Last-Invert-Play: measure element positions before and after\n * a DOM change, then animate from old to new positions.\n *\n * ```ts\n * const flip = createFlip(listContainer, {\n * duration: 300,\n * easing: 'cubic-bezier(0.2, 0, 0, 1)',\n * });\n *\n * // Before changing the list:\n * flip.measure();\n * // Change the DOM (reorder, add, remove)\n * items.set(newOrder);\n * // Animate:\n * flip.animate();\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface FlipOptions {\n /** Animation duration in ms (default: 300) */\n duration?: number;\n /** CSS easing (default: 'cubic-bezier(0.2, 0, 0, 1)') */\n easing?: string;\n /** Delay in ms */\n delay?: number;\n /** Only animate elements matching this selector */\n selector?: string;\n /** Key attribute to track elements across reorders (default: 'data-key') */\n keyAttribute?: string;\n /** Callback when animation completes */\n onComplete?: () => void;\n}\n\nexport interface FlipController {\n /** Measure current positions (call BEFORE DOM change) */\n measure(): void;\n /** Animate from measured positions to current (call AFTER DOM change) */\n animate(): Promise<void>;\n /** Measure and animate in one step using a callback */\n flip(update: () => void): Promise<void>;\n}\n\ninterface Rect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n// =========================================================================\n// createFlip\n// =========================================================================\n\n/**\n * Create a FLIP animation controller for a container.\n *\n * ```ts\n * const flip = createFlip(container);\n * flip.flip(() => {\n * // reorder DOM elements here\n * container.appendChild(container.firstChild); // move first to last\n * });\n * ```\n */\nexport function createFlip(\n container: HTMLElement,\n options: FlipOptions = {},\n): FlipController {\n const {\n duration = 300,\n easing = 'cubic-bezier(0.2, 0, 0, 1)',\n delay = 0,\n selector,\n keyAttribute = 'data-key',\n onComplete,\n } = options;\n\n let firstPositions = new Map<string, Rect>();\n\n function getElements(): HTMLElement[] {\n if (selector) {\n return Array.from(container.querySelectorAll<HTMLElement>(selector));\n }\n return Array.from(container.children) as HTMLElement[];\n }\n\n function getKey(el: HTMLElement): string {\n return el.getAttribute(keyAttribute) ?? el.id ?? '';\n }\n\n function measure(): void {\n firstPositions = new Map();\n for (const el of getElements()) {\n const key = getKey(el);\n if (key) {\n const rect = el.getBoundingClientRect();\n firstPositions.set(key, {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n });\n }\n }\n }\n\n function animate(): Promise<void> {\n const elements = getElements();\n const animations: Animation[] = [];\n\n for (const el of elements) {\n const key = getKey(el);\n const first = firstPositions.get(key);\n if (!first) continue; // New element — could add enter animation\n\n const last = el.getBoundingClientRect();\n\n const dx = first.left - last.left;\n const dy = first.top - last.top;\n const dw = first.width / (last.width || 1);\n const dh = first.height / (last.height || 1);\n\n // Skip if no movement\n if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5 && Math.abs(dw - 1) < 0.01 && Math.abs(dh - 1) < 0.01) {\n continue;\n }\n\n const animation = el.animate(\n [\n {\n transform: `translate(${dx}px, ${dy}px) scale(${dw}, ${dh})`,\n },\n {\n transform: 'translate(0, 0) scale(1, 1)',\n },\n ],\n {\n duration,\n easing,\n delay,\n fill: 'both',\n },\n );\n\n animations.push(animation);\n }\n\n // Detect removed elements (in first but not in last)\n const currentKeys = new Set(elements.map(getKey));\n for (const [key, rect] of firstPositions) {\n if (!currentKeys.has(key)) {\n // Element was removed — could add exit animation placeholder\n }\n }\n\n firstPositions.clear();\n\n return new Promise<void>((resolve) => {\n if (animations.length === 0) {\n onComplete?.();\n resolve();\n return;\n }\n\n Promise.all(animations.map((a) => a.finished)).then(() => {\n // Clean up fill\n for (const a of animations) {\n a.cancel();\n }\n onComplete?.();\n resolve();\n });\n });\n }\n\n return {\n measure,\n animate,\n async flip(update: () => void): Promise<void> {\n measure();\n update();\n // Wait one frame for DOM to update\n await new Promise((r) => requestAnimationFrame(r));\n return animate();\n },\n };\n}\n\n/**\n * One-shot FLIP animation helper.\n *\n * ```ts\n * await flip(container, () => {\n * // reorder items\n * }, { duration: 300 });\n * ```\n */\nexport async function flip(\n container: HTMLElement,\n update: () => void,\n options?: FlipOptions,\n): Promise<void> {\n const ctrl = createFlip(container, options);\n return ctrl.flip(update);\n}\n"]}
@@ -0,0 +1,36 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function v(e,t={}){let s=chunkWOZWFMOK_cjs.c(false),i=chunkWOZWFMOK_cjs.c(false),n=chunkWOZWFMOK_cjs.c(!navigator.onLine),r=null;window.addEventListener("online",()=>n.set(false)),window.addEventListener("offline",()=>n.set(true));let c=new Promise((u,o)=>{if(!("serviceWorker"in navigator)){o(new Error("Service workers not supported"));return}navigator.serviceWorker.register(e,{scope:t.scope}).then(a=>{r=a,s.set(true),t.onReady?.(a),u(a),a.addEventListener("updatefound",()=>{let l=a.installing;l&&l.addEventListener("statechange",()=>{l.state==="installed"&&navigator.serviceWorker.controller&&(i.set(true),t.onUpdate?.(a),t.autoReload&&(l.postMessage({type:"SKIP_WAITING"}),window.location.reload()));});});}).catch(a=>{t.onError?.(a),o(a);});});return {registered:()=>s(),updateAvailable:()=>i(),offline:()=>n(),ready:c,async update(){r&&await r.update();},skipWaiting(){r?.waiting&&(r.waiting.postMessage({type:"SKIP_WAITING"}),window.location.reload());},async unregister(){return r?r.unregister():false}}}function f(e){let t=Array.isArray(e)?e:e.runtimeCache??[],s=Array.isArray(e)?[]:e.precache??[],i=Array.isArray(e)?"akash-cache-v1":e.cacheName??"akash-cache-v1",n=`// Auto-generated service worker by AkashJS
2
+ const CACHE_NAME = '${i}';
3
+ const PRECACHE_URLS = ${JSON.stringify(s)};
4
+
5
+ self.addEventListener('install', (event) => {
6
+ ${s.length>0?`event.waitUntil(
7
+ caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))
8
+ );`:""}
9
+ self.skipWaiting();
10
+ });
11
+
12
+ self.addEventListener('activate', (event) => {
13
+ event.waitUntil(clients.claim());
14
+ });
15
+
16
+ self.addEventListener('message', (event) => {
17
+ if (event.data?.type === 'SKIP_WAITING') {
18
+ self.skipWaiting();
19
+ }
20
+ });
21
+
22
+ self.addEventListener('fetch', (event) => {
23
+ const url = new URL(event.request.url);
24
+ `;for(let r of t){let c=r.match??r.urlPattern;if(!c)continue;let u=c instanceof RegExp?c.toString():`new RegExp(${JSON.stringify(c.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))})`,o=r.cacheName??i;n+=`
25
+ if (${u}.test(url.pathname)) {
26
+ event.respondWith(${p(r.strategy,o)});
27
+ return;
28
+ }
29
+ `;}return n+=`
30
+ // Default: network-first
31
+ event.respondWith(
32
+ fetch(event.request).catch(() => caches.match(event.request))
33
+ );
34
+ });
35
+ `,n}function p(e,t){switch(e){case "cache-first":return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }))`;case "network-first":return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${t}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;case "stale-while-revalidate":return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${t}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;case "network-only":return "fetch(event.request)";case "cache-only":return "caches.match(event.request)"}}async function y(e,t){return await Notification.requestPermission()!=="granted"?null:await e.pushManager.subscribe({userVisibleOnly:true,applicationServerKey:d(t)})}function d(e){let t="=".repeat((4-e.length%4)%4),s=(e+t).replace(/-/g,"+").replace(/_/g,"/"),i=atob(s);return Uint8Array.from(i,n=>n.charCodeAt(0))}exports.a=v;exports.b=f;exports.c=y;//# sourceMappingURL=chunk-NHDYQTC5.cjs.map
36
+ //# sourceMappingURL=chunk-NHDYQTC5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pwa.ts"],"names":["registerServiceWorker","swUrl","options","registered","signal","updateAvailable","offline","registration","ready","resolve","reject","reg","newWorker","err","generateSWScript","routesOrConfig","routes","precache","globalCacheName","script","route","matchValue","pattern","cacheName","generateStrategyCode","strategy","subscribePush","vapidPublicKey","urlBase64ToUint8Array","base64String","padding","base64","rawData","char"],"mappings":"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","file":"chunk-NHDYQTC5.cjs","sourcesContent":["/**\n * PWA / Service Worker support.\n *\n * Register service workers, configure caching strategies,\n * handle updates, and manage push notifications.\n *\n * ```ts\n * const sw = registerServiceWorker('/sw.js', {\n * onUpdate: () => toast.info('New version available!'),\n * });\n * sw.ready; // Promise<ServiceWorkerRegistration>\n * sw.update(); // check for updates\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface SWOptions {\n /** Callback when a new version is available */\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n /** Callback when the SW is ready */\n onReady?: (registration: ServiceWorkerRegistration) => void;\n /** Callback on registration error */\n onError?: (error: Error) => void;\n /** Auto-reload on update (default: false) */\n autoReload?: boolean;\n /** Scope of the service worker */\n scope?: string;\n}\n\nexport interface SWRegistration {\n /** Whether the SW is registered */\n registered: ReadonlySignal<boolean>;\n /** Whether an update is available */\n updateAvailable: ReadonlySignal<boolean>;\n /** Whether the app is running offline */\n offline: ReadonlySignal<boolean>;\n /** The raw SW registration (available after ready) */\n ready: Promise<ServiceWorkerRegistration>;\n /** Check for updates */\n update(): Promise<void>;\n /** Skip waiting and activate new SW */\n skipWaiting(): void;\n /** Unregister the service worker */\n unregister(): Promise<boolean>;\n}\n\n// =========================================================================\n// Service Worker registration\n// =========================================================================\n\n/**\n * Register a service worker with update detection.\n */\nexport function registerServiceWorker(\n swUrl: string,\n options: SWOptions = {},\n): SWRegistration {\n const registered = signal(false);\n const updateAvailable = signal(false);\n const offline = signal(!navigator.onLine);\n\n let registration: ServiceWorkerRegistration | null = null;\n\n // Track online/offline\n window.addEventListener('online', () => offline.set(false));\n window.addEventListener('offline', () => offline.set(true));\n\n const ready = new Promise<ServiceWorkerRegistration>((resolve, reject) => {\n if (!('serviceWorker' in navigator)) {\n reject(new Error('Service workers not supported'));\n return;\n }\n\n navigator.serviceWorker\n .register(swUrl, { scope: options.scope })\n .then((reg) => {\n registration = reg;\n registered.set(true);\n options.onReady?.(reg);\n resolve(reg);\n\n // Listen for updates\n reg.addEventListener('updatefound', () => {\n const newWorker = reg.installing;\n if (!newWorker) return;\n\n newWorker.addEventListener('statechange', () => {\n if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {\n updateAvailable.set(true);\n options.onUpdate?.(reg);\n\n if (options.autoReload) {\n newWorker.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n }\n });\n });\n })\n .catch((err) => {\n options.onError?.(err);\n reject(err);\n });\n });\n\n return {\n registered: () => registered(),\n updateAvailable: () => updateAvailable(),\n offline: () => offline(),\n ready,\n async update() {\n if (registration) {\n await registration.update();\n }\n },\n skipWaiting() {\n if (registration?.waiting) {\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\n window.location.reload();\n }\n },\n async unregister() {\n if (registration) {\n return registration.unregister();\n }\n return false;\n },\n };\n}\n\n// =========================================================================\n// Caching strategies (for SW scripts)\n// =========================================================================\n\nexport type CacheStrategy = 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'network-only' | 'cache-only';\n\nexport interface CacheRoute {\n /** URL pattern to match (string or regex) */\n match: string | RegExp;\n /** Caching strategy */\n strategy: CacheStrategy;\n /** Cache name */\n cacheName?: string;\n /** Max entries in cache */\n maxEntries?: number;\n /** Max age in seconds */\n maxAgeSeconds?: number;\n}\n\n/**\n * Generate a service worker script from cache route configs.\n *\n * ```ts\n * const swScript = generateSWScript([\n * { match: /\\.(?:js|css)$/, strategy: 'cache-first', cacheName: 'assets' },\n * { match: '/api/', strategy: 'network-first', maxAgeSeconds: 300 },\n * { match: /\\.(?:png|jpg|svg)$/, strategy: 'cache-first', cacheName: 'images' },\n * ]);\n * ```\n */\nexport function generateSWScript(routesOrConfig: CacheRoute[] | { cacheName?: string; precache?: string[]; runtimeCache?: CacheRoute[] }): string {\n // Accept both array of routes and config object\n const routes: CacheRoute[] = Array.isArray(routesOrConfig)\n ? routesOrConfig\n : routesOrConfig.runtimeCache ?? [];\n const precache = Array.isArray(routesOrConfig) ? [] : routesOrConfig.precache ?? [];\n const globalCacheName = Array.isArray(routesOrConfig) ? 'akash-cache-v1' : routesOrConfig.cacheName ?? 'akash-cache-v1';\n let script = `// Auto-generated service worker by AkashJS\nconst CACHE_NAME = '${globalCacheName}';\nconst PRECACHE_URLS = ${JSON.stringify(precache)};\n\nself.addEventListener('install', (event) => {\n ${precache.length > 0 ? `event.waitUntil(\n caches.open(CACHE_NAME).then(cache => cache.addAll(PRECACHE_URLS))\n );` : ''}\n self.skipWaiting();\n});\n\nself.addEventListener('activate', (event) => {\n event.waitUntil(clients.claim());\n});\n\nself.addEventListener('message', (event) => {\n if (event.data?.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\nself.addEventListener('fetch', (event) => {\n const url = new URL(event.request.url);\n`;\n\n for (const route of routes) {\n // Support both 'match' and 'urlPattern' property names\n const matchValue = route.match ?? (route as any).urlPattern;\n if (!matchValue) continue;\n\n const pattern = matchValue instanceof RegExp\n ? matchValue.toString()\n : `new RegExp(${JSON.stringify(matchValue.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))})`;\n\n const cacheName = route.cacheName ?? globalCacheName;\n\n script += `\n if (${pattern}.test(url.pathname)) {\n event.respondWith(${generateStrategyCode(route.strategy, cacheName)});\n return;\n }\n`;\n }\n\n script += `\n // Default: network-first\n event.respondWith(\n fetch(event.request).catch(() => caches.match(event.request))\n );\n});\n`;\n\n return script;\n}\n\nfunction generateStrategyCode(strategy: CacheStrategy, cacheName: string): string {\n switch (strategy) {\n case 'cache-first':\n return `caches.match(event.request).then(cached => cached || fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }))`;\n case 'network-first':\n return `fetch(event.request).then(response => { const clone = response.clone(); caches.open('${cacheName}').then(cache => cache.put(event.request, clone)); return response; }).catch(() => caches.match(event.request))`;\n case 'stale-while-revalidate':\n return `caches.match(event.request).then(cached => { const fetchPromise = fetch(event.request).then(response => { caches.open('${cacheName}').then(cache => cache.put(event.request, response.clone())); return response; }); return cached || fetchPromise; })`;\n case 'network-only':\n return `fetch(event.request)`;\n case 'cache-only':\n return `caches.match(event.request)`;\n }\n}\n\n// =========================================================================\n// Push notifications\n// =========================================================================\n\n/**\n * Request push notification permission and subscribe.\n */\nexport async function subscribePush(\n registration: ServiceWorkerRegistration,\n vapidPublicKey: string,\n): Promise<PushSubscription | null> {\n const permission = await Notification.requestPermission();\n if (permission !== 'granted') return null;\n\n const subscription = await registration.pushManager.subscribe({\n userVisibleOnly: true,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applicationServerKey: urlBase64ToUint8Array(vapidPublicKey) as any,\n });\n\n return subscription;\n}\n\nfunction urlBase64ToUint8Array(base64String: string): Uint8Array {\n const padding = '='.repeat((4 - (base64String.length % 4)) % 4);\n const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');\n const rawData = atob(base64);\n return Uint8Array.from(rawData, (char) => char.charCodeAt(0));\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {s,l}from'./chunk-KE7BJTCD.js';import {c as c$1}from'./chunk-YXKQTEPR.js';var c=s(e=>{let s=c$1({status:"pending"}),r=e.props.promise;return e.props.promise.then(t=>{e.props.promise===r&&s.set({status:"resolved",value:t});}).catch(t=>{e.props.promise===r&&s.set({status:"rejected",error:t instanceof Error?t:new Error(String(t))});}),()=>{let t=s();switch(t.status){case "pending":return e.props.pending?l(e.props.pending()):document.createComment("await-pending");case "resolved":return l(e.props.then(t.value));case "rejected":return e.props.catch?l(e.props.catch(t.error)):document.createComment("await-error")}}});function m(e){let s=c$1({status:"pending"});return e.then(r=>s.set({status:"resolved",value:r})).catch(r=>s.set({status:"rejected",error:r instanceof Error?r:new Error(String(r))})),()=>s()}export{c as a,m as b};//# sourceMappingURL=chunk-NJXXC5JB.js.map
2
+ //# sourceMappingURL=chunk-NJXXC5JB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/await-block.ts"],"names":["Await","defineComponent","ctx","state","signal","currentPromise","value","err","s","nodeToDOM","awaitSignal","promise","error"],"mappings":"iFAgDO,IAAMA,EAAQC,CAAAA,CAAkCC,CAAAA,EAAQ,CAC7D,IAAMC,EAAQC,GAAAA,CAA4B,CAAE,MAAA,CAAQ,SAAU,CAAC,CAAA,CAG3DC,CAAAA,CAAiBH,EAAI,KAAA,CAAM,OAAA,CAE/B,OAAAA,CAAAA,CAAI,KAAA,CAAM,OAAA,CACP,IAAA,CAAMI,GAAU,CACXJ,CAAAA,CAAI,MAAM,OAAA,GAAYG,CAAAA,EACxBF,EAAM,GAAA,CAAI,CAAE,MAAA,CAAQ,UAAA,CAAY,MAAAG,CAAM,CAAC,EAE3C,CAAC,CAAA,CACA,MAAOC,CAAAA,EAAQ,CACVL,CAAAA,CAAI,KAAA,CAAM,UAAYG,CAAAA,EACxBF,CAAAA,CAAM,IAAI,CACR,MAAA,CAAQ,WACR,KAAA,CAAOI,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAM,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAG,CAAC,CAC3D,CAAC,EAEL,CAAC,CAAA,CAEI,IAAM,CACX,IAAMC,CAAAA,CAAIL,GAAM,CAEhB,OAAQK,EAAE,MAAA,EACR,KAAK,SAAA,CACH,OAAON,CAAAA,CAAI,KAAA,CAAM,QACbO,CAAAA,CAAUP,CAAAA,CAAI,MAAM,OAAA,EAAS,CAAA,CAC7B,QAAA,CAAS,cAAc,eAAe,CAAA,CAE5C,KAAK,UAAA,CACH,OAAOO,EAAUP,CAAAA,CAAI,KAAA,CAAM,IAAA,CAAKM,CAAAA,CAAE,KAAK,CAAC,CAAA,CAE1C,KAAK,UAAA,CACH,OAAON,EAAI,KAAA,CAAM,KAAA,CACbO,CAAAA,CAAUP,CAAAA,CAAI,MAAM,KAAA,CAAMM,CAAAA,CAAE,KAAK,CAAC,CAAA,CAClC,SAAS,aAAA,CAAc,aAAa,CAC5C,CACF,CACF,CAAC,EAcM,SAASE,CAAAA,CAAeC,CAAAA,CAAqB,CAClD,IAAMR,CAAAA,CAAQC,GAAAA,CAAsB,CAAE,OAAQ,SAAU,CAAC,EAEzD,OAAAO,CAAAA,CACG,KAAML,CAAAA,EAAUH,CAAAA,CAAM,GAAA,CAAI,CAAE,OAAQ,UAAA,CAAY,KAAA,CAAAG,CAAM,CAAC,CAAC,EACxD,KAAA,CAAOM,CAAAA,EAAUT,CAAAA,CAAM,GAAA,CAAI,CAC1B,MAAA,CAAQ,UAAA,CACR,MAAOS,CAAAA,YAAiB,KAAA,CAAQA,EAAQ,IAAI,KAAA,CAAM,MAAA,CAAOA,CAAK,CAAC,CACjE,CAAC,CAAC,CAAA,CAEG,IAAMT,GACf","file":"chunk-NJXXC5JB.js","sourcesContent":["/**\n * Await block — template-level async handling.\n *\n * Renders different content for pending/resolved/rejected states\n * of a promise, similar to Svelte's {#await} blocks.\n *\n * ```ts\n * Await({\n * promise: fetchUser(userId()),\n * pending: () => <Spinner />,\n * then: (user) => <UserCard user={user} />,\n * catch: (err) => <Error message={err.message} />,\n * });\n * ```\n */\n\nimport { defineComponent } from './component.js';\nimport { signal } from './signals.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface AwaitProps<T> {\n /** The promise to await */\n promise: Promise<T>;\n /** Render while pending */\n pending?: () => AkashNode;\n /** Render when resolved */\n then: (value: T) => AkashNode;\n /** Render when rejected */\n catch?: (error: Error) => AkashNode;\n}\n\ntype AwaitState<T> =\n | { status: 'pending' }\n | { status: 'resolved'; value: T }\n | { status: 'rejected'; error: Error };\n\n// =========================================================================\n// Await component\n// =========================================================================\n\n/**\n * <Await> component — declarative promise handling.\n */\nexport const Await = defineComponent<AwaitProps<any>>((ctx) => {\n const state = signal<AwaitState<unknown>>({ status: 'pending' });\n\n // Track the promise to handle race conditions\n let currentPromise = ctx.props.promise;\n\n ctx.props.promise\n .then((value) => {\n if (ctx.props.promise === currentPromise) {\n state.set({ status: 'resolved', value });\n }\n })\n .catch((err) => {\n if (ctx.props.promise === currentPromise) {\n state.set({\n status: 'rejected',\n error: err instanceof Error ? err : new Error(String(err)),\n });\n }\n });\n\n return () => {\n const s = state();\n\n switch (s.status) {\n case 'pending':\n return ctx.props.pending\n ? nodeToDOM(ctx.props.pending())\n : document.createComment('await-pending');\n\n case 'resolved':\n return nodeToDOM(ctx.props.then(s.value));\n\n case 'rejected':\n return ctx.props.catch\n ? nodeToDOM(ctx.props.catch(s.error))\n : document.createComment('await-error');\n }\n };\n});\n\n// =========================================================================\n// Functional await helper\n// =========================================================================\n\n/**\n * Functional await block — returns a signal that updates as the promise resolves.\n *\n * ```ts\n * const result = awaitSignal(fetchData());\n * result().status; // 'pending' | 'resolved' | 'rejected'\n * ```\n */\nexport function awaitSignal<T>(promise: Promise<T>) {\n const state = signal<AwaitState<T>>({ status: 'pending' });\n\n promise\n .then((value) => state.set({ status: 'resolved', value }))\n .catch((error) => state.set({\n status: 'rejected',\n error: error instanceof Error ? error : new Error(String(error)),\n }));\n\n return () => state();\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';function p(...o){let n=[];for(let e of o)if(e){if(typeof e=="string")n.push(e);else if(Array.isArray(e)){let t=p(...e);t&&n.push(t);}else if(typeof e=="object")for(let[t,r]of Object.entries(e))r&&n.push(t);}return n.join(" ")}function u(o){let n=[];for(let[e,t]of Object.entries(o)){if(t==null)continue;let r=s(e),l=typeof t=="number"&&!i.has(e)?`${t}px`:String(t);n.push(`${r}: ${l}`);}return n.join("; ")}function f(o,n){for(let[e,t]of Object.entries(n))if(t==null)o.style.removeProperty(s(e));else {let r=typeof t=="number"&&!i.has(e)?`${t}px`:String(t);o.style.setProperty(s(e),r);}}function s(o){return o.replace(/[A-Z]/g,n=>`-${n.toLowerCase()}`)}var i=new Set(["animationIterationCount","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","fillOpacity","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","fontWeight","gridColumn","gridRow","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom"]);exports.a=p;exports.b=u;exports.c=f;//# sourceMappingURL=chunk-NQEY7DR5.cjs.map
2
+ //# sourceMappingURL=chunk-NQEY7DR5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/css.ts"],"names":["cx","inputs","classes","input","nested","key","value","css","styles","parts","prop","camelToKebab","val","UNITLESS_PROPS","applyStyles","el","str","m"],"mappings":"aAuBO,SAASA,CAAAA,CAAAA,GAAMC,EAA2B,CAC/C,IAAMC,EAAoB,EAAC,CAE3B,IAAA,IAAWC,CAAAA,IAASF,CAAAA,CAClB,GAAKE,GAEL,GAAI,OAAOA,CAAAA,EAAU,QAAA,CACnBD,CAAAA,CAAQ,IAAA,CAAKC,CAAK,CAAA,CAAA,KAAA,GACT,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAG,CAC/B,IAAMC,CAAAA,CAASJ,CAAAA,CAAG,GAAGG,CAAK,CAAA,CACtBC,GAAQF,CAAAA,CAAQ,IAAA,CAAKE,CAAM,EACjC,CAAA,KAAA,GAAW,OAAOD,GAAU,QAAA,CAC1B,IAAA,GAAW,CAACE,CAAAA,CAAKC,CAAK,CAAA,GAAK,OAAO,OAAA,CAAQH,CAAK,CAAA,CACzCG,CAAAA,EAAOJ,CAAAA,CAAQ,IAAA,CAAKG,CAAG,EAAA,CAKjC,OAAOH,EAAQ,IAAA,CAAK,GAAG,CACzB,CAgBO,SAASK,CAAAA,CAAIC,CAAAA,CAA+B,CACjD,IAAMC,EAAkB,EAAC,CAEzB,IAAA,GAAW,CAACJ,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQE,CAAM,CAAA,CAAG,CACjD,GAAIF,GAAS,IAAA,CAAM,SAEnB,IAAMI,CAAAA,CAAOC,CAAAA,CAAaN,CAAG,CAAA,CACvBO,CAAAA,CAAM,OAAON,CAAAA,EAAU,QAAA,EAAY,CAACO,EAAe,GAAA,CAAIR,CAAG,CAAA,CAC5D,CAAA,EAAGC,CAAK,CAAA,EAAA,CAAA,CACR,OAAOA,CAAK,CAAA,CAEhBG,CAAAA,CAAM,IAAA,CAAK,CAAA,EAAGC,CAAI,KAAKE,CAAG,CAAA,CAAE,EAC9B,CAEA,OAAOH,EAAM,IAAA,CAAK,IAAI,CACxB,CASO,SAASK,CAAAA,CAAYC,EAAiBP,CAAAA,CAA6B,CACxE,IAAA,GAAW,CAACH,CAAAA,CAAKC,CAAK,IAAK,MAAA,CAAO,OAAA,CAAQE,CAAM,CAAA,CAC9C,GAAIF,CAAAA,EAAS,KACXS,CAAAA,CAAG,KAAA,CAAM,eAAeJ,CAAAA,CAAaN,CAAG,CAAC,CAAA,CAAA,KACpC,CACL,IAAMO,CAAAA,CAAM,OAAON,CAAAA,EAAU,UAAY,CAACO,CAAAA,CAAe,GAAA,CAAIR,CAAG,CAAA,CAC5D,CAAA,EAAGC,CAAK,CAAA,EAAA,CAAA,CACR,MAAA,CAAOA,CAAK,CAAA,CAChBS,CAAAA,CAAG,KAAA,CAAM,YAAYJ,CAAAA,CAAaN,CAAG,EAAGO,CAAG,EAC7C,CAEJ,CAIA,SAASD,CAAAA,CAAaK,CAAAA,CAAqB,CACzC,OAAOA,EAAI,OAAA,CAAQ,QAAA,CAAWC,CAAAA,EAAM,CAAA,CAAA,EAAIA,CAAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAC3D,CAGA,IAAMJ,CAAAA,CAAiB,IAAI,IAAI,CAC7B,yBAAA,CAA2B,SAAA,CAAW,cAAA,CAAgB,iBAAA,CACtD,aAAA,CAAe,cAAe,MAAA,CAAQ,UAAA,CAAY,cAAA,CAClD,YAAA,CAAc,cAAA,CAAgB,WAAA,CAAa,aAAc,YAAA,CACzD,SAAA,CAAW,WAAA,CAAa,YAAA,CAAc,SAAA,CAAW,OAAA,CAAS,UAC1D,SAAA,CAAW,QAAA,CAAU,QAAA,CAAU,MACjC,CAAC,CAAA","file":"chunk-NQEY7DR5.cjs","sourcesContent":["/**\n * CSS utility functions.\n *\n * cx() for class name merging and css() for dynamic style objects.\n * Tiny but used in every component.\n */\n\n// --- cx() — class name merging ---\n\ntype CxInput = string | boolean | null | undefined | Record<string, boolean> | CxInput[];\n\n/**\n * Merge class names conditionally. Falsy values are filtered out.\n * Object keys are included when their value is truthy.\n *\n * ```ts\n * cx('btn', isActive && 'btn-active', { 'btn-lg': isLarge })\n * // 'btn btn-active btn-lg'\n *\n * cx('card', undefined, false, null, 'card-primary')\n * // 'card card-primary'\n * ```\n */\nexport function cx(...inputs: CxInput[]): string {\n const classes: string[] = [];\n\n for (const input of inputs) {\n if (!input) continue;\n\n if (typeof input === 'string') {\n classes.push(input);\n } else if (Array.isArray(input)) {\n const nested = cx(...input);\n if (nested) classes.push(nested);\n } else if (typeof input === 'object') {\n for (const [key, value] of Object.entries(input)) {\n if (value) classes.push(key);\n }\n }\n }\n\n return classes.join(' ');\n}\n\n// --- css() — dynamic style objects ---\n\ntype CssValue = string | number | null | undefined;\ntype CssProperties = Record<string, CssValue>;\n\n/**\n * Build a CSS style string from an object. Handles camelCase → kebab-case\n * conversion and filters out null/undefined values.\n *\n * ```ts\n * css({ backgroundColor: 'red', fontSize: 14, display: isVisible ? 'block' : 'none' })\n * // 'background-color: red; font-size: 14px; display: block'\n * ```\n */\nexport function css(styles: CssProperties): string {\n const parts: string[] = [];\n\n for (const [key, value] of Object.entries(styles)) {\n if (value == null) continue;\n\n const prop = camelToKebab(key);\n const val = typeof value === 'number' && !UNITLESS_PROPS.has(key)\n ? `${value}px`\n : String(value);\n\n parts.push(`${prop}: ${val}`);\n }\n\n return parts.join('; ');\n}\n\n/**\n * Apply a style object to an element.\n *\n * ```ts\n * applyStyles(el, { color: 'red', marginTop: 10 });\n * ```\n */\nexport function applyStyles(el: HTMLElement, styles: CssProperties): void {\n for (const [key, value] of Object.entries(styles)) {\n if (value == null) {\n el.style.removeProperty(camelToKebab(key));\n } else {\n const val = typeof value === 'number' && !UNITLESS_PROPS.has(key)\n ? `${value}px`\n : String(value);\n el.style.setProperty(camelToKebab(key), val);\n }\n }\n}\n\n// --- Helpers ---\n\nfunction camelToKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\n/** CSS properties that don't get automatic px units */\nconst UNITLESS_PROPS = new Set([\n 'animationIterationCount', 'boxFlex', 'boxFlexGroup', 'boxOrdinalGroup',\n 'columnCount', 'fillOpacity', 'flex', 'flexGrow', 'flexPositive',\n 'flexShrink', 'flexNegative', 'flexOrder', 'fontWeight', 'gridColumn',\n 'gridRow', 'lineClamp', 'lineHeight', 'opacity', 'order', 'orphans',\n 'tabSize', 'widows', 'zIndex', 'zoom',\n]);\n"]}
@@ -0,0 +1,3 @@
1
+ var p=new Set,g=true,l=null;function f(e){g=e;}function I(e){l=e;}function h(){p.clear();}function b(e,n){let t=((...r)=>(u(n),e(...r)));return Object.keys(e).forEach(r=>{t[r]=e[r];}),t.__deprecated=n,t}function y(e,n){return u(n),e}function u(e){if(!g||p.has(e.name))return;p.add(e.name);let n=[`[AkashJS] DEPRECATED: ${e.name}() is deprecated since v${e.since}`];e.removeIn?n[0]+=` and will be removed in v${e.removeIn}.`:n[0]+=".",e.replacement&&n.push(` Migrate to: ${e.replacement}()`),e.message&&n.push(` ${e.message}`),n.push(` See: ${e.link??"https://akash.js.org/migration"}`);let t=n.join(`
2
+ `);l?l(t):typeof console<"u"&&console.warn(t);}var a=new Map;function v(e){a.set(e.name,e);}function d(){return Array.from(a.values())}function x(e){return d().filter(n=>n.stability===e)}function A(e){return a.get(e)?.stability==="deprecated"}function w(e){return a.get(e)?.deprecation??null}function k(e){let n=[],t=[],r=Object.entries(e);if(r.length===0)return {compatible:true,warnings:n,errors:t};let s=r.filter(([o])=>o.startsWith("@akashjs/"));if(s.length>1){let o=new Set(s.map(([,i])=>i.split(".")[0])),m=new Set(s.map(([,i])=>i.split(".").slice(0,2).join(".")));o.size>1?t.push(`Major version mismatch: ${s.map(([i,c])=>`${i}@${c}`).join(", ")}. All @akashjs packages should be on the same major version.`):m.size>1&&n.push(`Minor version mismatch: ${s.map(([i,c])=>`${i}@${c}`).join(", ")}. Consider updating all packages to the same version with \`akash update\`.`);}return {compatible:t.length===0,warnings:n,errors:t}}export{f as a,I as b,h as c,b as d,y as e,v as f,d as g,x as h,A as i,w as j,k};//# sourceMappingURL=chunk-OQV3NYDH.js.map
3
+ //# sourceMappingURL=chunk-OQV3NYDH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deprecation.ts"],"names":["warned","warningsEnabled","warningHandler","setDeprecationWarnings","enabled","setWarningHandler","handler","resetDeprecationWarnings","deprecated","fn","info","wrapper","args","emitDeprecationWarning","key","deprecatedValue","value","parts","msg","apiRegistry","registerAPI","getRegisteredAPIs","getAPIsByStability","stability","api","isDeprecated","name","getDeprecationInfo","checkCompatibility","packages","warnings","errors","versions","akashPackages","majors","v","minors","n"],"mappings":"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","file":"chunk-OQV3NYDH.js","sourcesContent":["/**\n * Deprecation warnings and API stability markers.\n *\n * Provides runtime warnings when deprecated APIs are used,\n * with migration hints pointing to the replacement.\n *\n * ```ts\n * // Mark an API as deprecated:\n * export const oldName = deprecated(newImplementation, {\n * name: 'oldName',\n * replacement: 'newName',\n * since: '0.2.0',\n * removeIn: '1.0.0',\n * message: 'Use newName() instead for better performance.',\n * });\n *\n * // Users see:\n * // [AkashJS] DEPRECATED: oldName() is deprecated since v0.2.0 and will be removed in v1.0.0.\n * // Use newName() instead for better performance.\n * // See: https://akash.js.org/migration\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type APIStability = 'stable' | 'experimental' | 'deprecated' | 'internal';\n\nexport interface DeprecationInfo {\n /** Name of the deprecated API */\n name: string;\n /** Replacement API name */\n replacement?: string;\n /** Version when deprecated */\n since: string;\n /** Version when it will be removed */\n removeIn?: string;\n /** Custom migration message */\n message?: string;\n /** Documentation link */\n link?: string;\n}\n\nexport interface APIInfo {\n /** API name */\n name: string;\n /** Stability level */\n stability: APIStability;\n /** Version introduced */\n since: string;\n /** Deprecation info (if deprecated) */\n deprecation?: DeprecationInfo;\n}\n\n// =========================================================================\n// Warning state\n// =========================================================================\n\nconst warned = new Set<string>();\nlet warningsEnabled = true;\nlet warningHandler: ((msg: string) => void) | null = null;\n\n/**\n * Enable or disable deprecation warnings globally.\n */\nexport function setDeprecationWarnings(enabled: boolean): void {\n warningsEnabled = enabled;\n}\n\n/**\n * Set a custom warning handler (default: console.warn).\n */\nexport function setWarningHandler(handler: ((msg: string) => void) | null): void {\n warningHandler = handler;\n}\n\n/**\n * Reset warned-about APIs (useful for testing).\n */\nexport function resetDeprecationWarnings(): void {\n warned.clear();\n}\n\n// =========================================================================\n// deprecated() — wrap a function with a deprecation warning\n// =========================================================================\n\n/**\n * Wrap a function so it emits a deprecation warning on first call.\n *\n * ```ts\n * // Old API that still works but warns:\n * export const createStore = deprecated(defineStore, {\n * name: 'createStore',\n * replacement: 'defineStore',\n * since: '0.2.0',\n * removeIn: '1.0.0',\n * });\n * ```\n */\nexport function deprecated<T extends (...args: any[]) => any>(\n fn: T,\n info: DeprecationInfo,\n): T {\n const wrapper = ((...args: any[]) => {\n emitDeprecationWarning(info);\n return fn(...args);\n }) as unknown as T;\n\n // Copy properties from original\n Object.keys(fn).forEach((key) => {\n (wrapper as any)[key] = (fn as any)[key];\n });\n\n // Mark as deprecated\n (wrapper as any).__deprecated = info;\n\n return wrapper;\n}\n\n/**\n * Mark a value (non-function) as deprecated.\n * Returns the value but warns on first access.\n */\nexport function deprecatedValue<T>(value: T, info: DeprecationInfo): T {\n emitDeprecationWarning(info);\n return value;\n}\n\n// =========================================================================\n// Warning emission\n// =========================================================================\n\nfunction emitDeprecationWarning(info: DeprecationInfo): void {\n if (!warningsEnabled) return;\n if (warned.has(info.name)) return; // Only warn once per API\n warned.add(info.name);\n\n const parts: string[] = [\n `[AkashJS] DEPRECATED: ${info.name}() is deprecated since v${info.since}`,\n ];\n\n if (info.removeIn) {\n parts[0] += ` and will be removed in v${info.removeIn}.`;\n } else {\n parts[0] += '.';\n }\n\n if (info.replacement) {\n parts.push(` Migrate to: ${info.replacement}()`);\n }\n\n if (info.message) {\n parts.push(` ${info.message}`);\n }\n\n parts.push(` See: ${info.link ?? 'https://akash.js.org/migration'}`);\n\n const msg = parts.join('\\n');\n\n if (warningHandler) {\n warningHandler(msg);\n } else if (typeof console !== 'undefined') {\n console.warn(msg);\n }\n}\n\n// =========================================================================\n// API Registry — track stability of all APIs\n// =========================================================================\n\nconst apiRegistry = new Map<string, APIInfo>();\n\n/**\n * Register an API with its stability level.\n */\nexport function registerAPI(info: APIInfo): void {\n apiRegistry.set(info.name, info);\n}\n\n/**\n * Get all registered APIs.\n */\nexport function getRegisteredAPIs(): APIInfo[] {\n return Array.from(apiRegistry.values());\n}\n\n/**\n * Get APIs by stability level.\n */\nexport function getAPIsByStability(stability: APIStability): APIInfo[] {\n return getRegisteredAPIs().filter((api) => api.stability === stability);\n}\n\n/**\n * Check if an API is deprecated.\n */\nexport function isDeprecated(name: string): boolean {\n const info = apiRegistry.get(name);\n return info?.stability === 'deprecated';\n}\n\n/**\n * Get deprecation info for an API.\n */\nexport function getDeprecationInfo(name: string): DeprecationInfo | null {\n const info = apiRegistry.get(name);\n return info?.deprecation ?? null;\n}\n\n// =========================================================================\n// Compatibility check\n// =========================================================================\n\nexport interface CompatibilityResult {\n compatible: boolean;\n warnings: string[];\n errors: string[];\n}\n\n/**\n * Check if package versions are compatible.\n *\n * ```ts\n * const result = checkCompatibility({\n * '@akashjs/runtime': '0.2.0',\n * '@akashjs/router': '0.1.0',\n * });\n * if (!result.compatible) {\n * console.error(result.errors);\n * }\n * ```\n */\nexport function checkCompatibility(\n packages: Record<string, string>,\n): CompatibilityResult {\n const warnings: string[] = [];\n const errors: string[] = [];\n\n const versions = Object.entries(packages);\n if (versions.length === 0) return { compatible: true, warnings, errors };\n\n // Check that all @akashjs packages are on compatible versions\n const akashPackages = versions.filter(([name]) => name.startsWith('@akashjs/'));\n\n if (akashPackages.length > 1) {\n const majors = new Set(akashPackages.map(([, v]) => v.split('.')[0]));\n const minors = new Set(akashPackages.map(([, v]) => v.split('.').slice(0, 2).join('.')));\n\n if (majors.size > 1) {\n errors.push(\n `Major version mismatch: ${akashPackages.map(([n, v]) => `${n}@${v}`).join(', ')}. ` +\n 'All @akashjs packages should be on the same major version.',\n );\n } else if (minors.size > 1) {\n warnings.push(\n `Minor version mismatch: ${akashPackages.map(([n, v]) => `${n}@${v}`).join(', ')}. ` +\n 'Consider updating all packages to the same version with `akash update`.',\n );\n }\n }\n\n return {\n compatible: errors.length === 0,\n warnings,\n errors,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {c,d}from'./chunk-YXKQTEPR.js';function E(r){let{data:n,columns:l,pageSize:s=0,initialSort:x}=r,i=c(x??{column:null,direction:null}),f=c(""),o=c(1),m=c(Object.fromEntries(l.map(e=>[e.key,e.visible!==false]))),C=d(()=>{let e=m();return l.filter(t=>e[t.key])}),T=d(()=>{let e=f().toLowerCase().trim();if(!e)return n();let t=l.filter(a=>a.filterable),d=t.length>0?t:l;return n().filter(a=>d.some(c=>{let p=b(a,c.key);return String(p).toLowerCase().includes(e)}))}),v=d(()=>{let{column:e,direction:t}=i(),d=[...T()];if(!e||!t)return d;let a=l.find(c=>c.key===e);return a?d.sort((c,p)=>{if(a.compare){let R=a.compare(c,p);return t==="desc"?-R:R}let O=b(c,e),j=b(p,e),y=z(O,j);return t==="desc"?-y:y}):d}),w=d(()=>T().length),S=d(()=>s<=0?1:Math.max(1,Math.ceil(w()/s))),h=d(()=>{let e=v();if(s<=0)return e;let t=(o()-1)*s;return e.slice(t,t+s)});function D(e){let t=i();t.column===e?t.direction==="asc"?i.set({column:e,direction:"desc"}):t.direction==="desc"?i.set({column:null,direction:null}):i.set({column:e,direction:"asc"}):i.set({column:e,direction:"asc"}),o.set(1);}function k(e){f.set(e),o.set(1);}function P(e){m.update(t=>({...t,[e]:!t[e]}));}function M(e){m.update(t=>({...t,[e]:true}));}function V(e){m.update(t=>({...t,[e]:false}));}return {rows:h,allRows:v,totalRows:w,visibleColumns:C,sortState:()=>i(),filterText:()=>f(),page:()=>o(),totalPages:S,sort:D,filter:k,toggleColumn:P,showColumn:M,hideColumn:V,nextPage(){o()<S()&&o.update(e=>e+1);},prevPage(){o()>1&&o.update(e=>e-1);},goToPage(e){o.set(Math.max(1,Math.min(e,S())));},reset(){i.set({column:null,direction:null}),f.set(""),o.set(1);}}}function b(r,n){return n.split(".").reduce((l,s)=>l?.[s],r)}function z(r,n){return r==null&&n==null?0:r==null?-1:n==null?1:typeof r=="number"&&typeof n=="number"?r-n:String(r).localeCompare(String(n))}export{E as a};//# sourceMappingURL=chunk-OZ4GNBKA.js.map
2
+ //# sourceMappingURL=chunk-OZ4GNBKA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data-table.ts"],"names":["createDataTable","options","data","columns","pageSize","initialSort","sortState","signal","filterText","page","columnVisibility","c","visibleColumns","computed","vis","filteredRows","text","filterableCols","colsToSearch","row","col","value","getNestedValue","sortedRows","column","direction","rows","colDef","a","b","result","aVal","bVal","defaultCompare","totalRows","totalPages","paginatedRows","all","start","sort","columnKey","current","filter","toggleColumn","key","showColumn","hideColumn","p","obj","path","o","k"],"mappings":"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","file":"chunk-OZ4GNBKA.js","sourcesContent":["/**\n * Headless data table.\n *\n * Signal-based table state management with sorting, filtering,\n * column visibility, and pagination integration. No DOM — just logic.\n *\n * ```ts\n * const table = createDataTable({\n * data: () => users(),\n * columns: [\n * { key: 'name', header: 'Name', sortable: true },\n * { key: 'email', header: 'Email', sortable: true, filterable: true },\n * { key: 'age', header: 'Age', sortable: true },\n * ],\n * pageSize: 20,\n * });\n *\n * table.rows(); // current page of sorted/filtered data\n * table.sort('name'); // toggle sort by column\n * table.filter('search term');\n * table.toggleColumn('age');\n * table.nextPage();\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface ColumnDef<T> {\n /** Key to access the data (dot notation supported) */\n key: string;\n /** Display header */\n header: string;\n /** Whether this column is sortable (default: false) */\n sortable?: boolean;\n /** Whether this column is searchable by the global filter (default: false) */\n filterable?: boolean;\n /** Custom sort comparator */\n compare?: (a: T, b: T) => number;\n /** Custom cell value accessor */\n accessor?: (row: T) => unknown;\n /** Whether column is visible by default (default: true) */\n visible?: boolean;\n}\n\nexport type SortDirection = 'asc' | 'desc' | null;\n\nexport interface SortState {\n column: string | null;\n direction: SortDirection;\n}\n\nexport interface DataTableOptions<T> {\n /** Reactive data source */\n data: () => T[];\n /** Column definitions */\n columns: ColumnDef<T>[];\n /** Page size (0 = no pagination) */\n pageSize?: number;\n /** Initial sort */\n initialSort?: SortState;\n}\n\nexport interface DataTable<T> {\n /** Current page of processed (sorted + filtered) rows */\n rows: ReadonlySignal<T[]>;\n /** All processed rows (before pagination) */\n allRows: ReadonlySignal<T[]>;\n /** Total row count after filtering */\n totalRows: ReadonlySignal<number>;\n /** Visible columns */\n visibleColumns: ReadonlySignal<ColumnDef<T>[]>;\n /** Current sort state */\n sortState: ReadonlySignal<SortState>;\n /** Current filter text */\n filterText: ReadonlySignal<string>;\n /** Current page (1-based) */\n page: ReadonlySignal<number>;\n /** Total pages */\n totalPages: ReadonlySignal<number>;\n /** Toggle or set sort on a column */\n sort(columnKey: string): void;\n /** Set the global filter text */\n filter(text: string): void;\n /** Toggle column visibility */\n toggleColumn(columnKey: string): void;\n /** Show a column */\n showColumn(columnKey: string): void;\n /** Hide a column */\n hideColumn(columnKey: string): void;\n /** Go to next page */\n nextPage(): void;\n /** Go to previous page */\n prevPage(): void;\n /** Go to specific page */\n goToPage(page: number): void;\n /** Reset all state (sort, filter, page) */\n reset(): void;\n}\n\n// --- Implementation ---\n\nexport function createDataTable<T extends Record<string, unknown>>(\n options: DataTableOptions<T>,\n): DataTable<T> {\n const { data, columns, pageSize = 0, initialSort } = options;\n\n const sortState = signal<SortState>(initialSort ?? { column: null, direction: null });\n const filterText = signal('');\n const page = signal(1);\n const columnVisibility = signal<Record<string, boolean>>(\n Object.fromEntries(columns.map((c) => [c.key, c.visible !== false])),\n );\n\n // Visible columns\n const visibleColumns = computed(() => {\n const vis = columnVisibility();\n return columns.filter((c) => vis[c.key]);\n });\n\n // Filtered rows\n const filteredRows = computed(() => {\n const text = filterText().toLowerCase().trim();\n if (!text) return data();\n\n // If no columns explicitly marked filterable, filter all columns\n const filterableCols = columns.filter((c) => c.filterable);\n const colsToSearch = filterableCols.length > 0 ? filterableCols : columns;\n\n return data().filter((row) => {\n return colsToSearch.some((col) => {\n const value = getNestedValue(row, col.key);\n return String(value).toLowerCase().includes(text);\n });\n });\n });\n\n // Sorted rows\n const sortedRows = computed(() => {\n const { column, direction } = sortState();\n const rows = [...filteredRows()];\n\n if (!column || !direction) return rows;\n\n const colDef = columns.find((c) => c.key === column);\n if (!colDef) return rows;\n\n return rows.sort((a, b) => {\n if (colDef.compare) {\n const result = colDef.compare(a, b);\n return direction === 'desc' ? -result : result;\n }\n\n const aVal = getNestedValue(a, column);\n const bVal = getNestedValue(b, column);\n const result = defaultCompare(aVal, bVal);\n return direction === 'desc' ? -result : result;\n });\n });\n\n // Total rows after filtering\n const totalRows = computed(() => filteredRows().length);\n\n // Total pages\n const totalPages = computed(() => {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(totalRows() / pageSize));\n });\n\n // Paginated rows\n const paginatedRows = computed(() => {\n const all = sortedRows();\n if (pageSize <= 0) return all;\n const start = (page() - 1) * pageSize;\n return all.slice(start, start + pageSize);\n });\n\n // --- Actions ---\n\n function sort(columnKey: string): void {\n const current = sortState();\n if (current.column === columnKey) {\n // Cycle: asc → desc → none\n if (current.direction === 'asc') {\n sortState.set({ column: columnKey, direction: 'desc' });\n } else if (current.direction === 'desc') {\n sortState.set({ column: null, direction: null });\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n } else {\n sortState.set({ column: columnKey, direction: 'asc' });\n }\n page.set(1);\n }\n\n function filter(text: string): void {\n filterText.set(text);\n page.set(1);\n }\n\n function toggleColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: !vis[key] }));\n }\n\n function showColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: true }));\n }\n\n function hideColumn(key: string): void {\n columnVisibility.update((vis) => ({ ...vis, [key]: false }));\n }\n\n return {\n rows: paginatedRows,\n allRows: sortedRows,\n totalRows,\n visibleColumns,\n sortState: () => sortState(),\n filterText: () => filterText(),\n page: () => page(),\n totalPages,\n sort,\n filter,\n toggleColumn,\n showColumn,\n hideColumn,\n nextPage() { if (page() < totalPages()) page.update((p) => p + 1); },\n prevPage() { if (page() > 1) page.update((p) => p - 1); },\n goToPage(p: number) { page.set(Math.max(1, Math.min(p, totalPages()))); },\n reset() {\n sortState.set({ column: null, direction: null });\n filterText.set('');\n page.set(1);\n },\n };\n}\n\n// --- Helpers ---\n\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((o: any, k) => o?.[k], obj);\n}\n\nfunction defaultCompare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n return String(a).localeCompare(String(b));\n}\n"]}
@@ -0,0 +1,5 @@
1
+ 'use strict';var r={AK0010:{code:"AK0010",message:"provide() called outside of component setup.",hint:"provide() must be called inside defineComponent()."},AK0012:{code:"AK0012",message:"inject() called outside of component setup.",hint:"inject() must be called inside defineComponent()."},AK0013:{code:"AK0013",message:"No provider found for injected context.",hint:"Make sure an ancestor component calls provide() with this key."},AK0020:{code:"AK0020",message:"onMount() called outside of component setup.",hint:"onMount() must be called inside defineComponent()."},AK0021:{code:"AK0021",message:"onUnmount() called outside of component setup.",hint:"onUnmount() must be called inside defineComponent()."},AK0022:{code:"AK0022",message:"onError() called outside of component setup.",hint:"onError() must be called inside defineComponent()."},AK0030:{code:"AK0030",message:"Circular dependency detected in computed signal.",hint:"A computed signal is reading itself, directly or via other computeds."},AK0031:{code:"AK0031",message:"Signal set() called during computation.",hint:"Do not set signals inside computed() or during effect execution. Use batch() or set signals in event handlers."},AK0040:{code:"AK0040",message:"Component setup must return a render function.",hint:"The function passed to defineComponent() must return () => AkashNode."},AK0041:{code:"AK0041",message:"Required prop is missing.",hint:"Check that the parent component is passing all required props."},AK0050:{code:"AK0050",message:"useRoute() called outside of router context.",hint:"Make sure your component is rendered inside a router provider."},AK0051:{code:"AK0051",message:"No route matched the current URL.",hint:"Add a catch-all route ([...rest]) to handle unmatched paths."},AK0052:{code:"AK0052",message:"Route guard threw an error.",hint:"Check the guard function for unhandled exceptions."},AK0060:{code:"AK0060",message:"Form submitted while invalid.",hint:"The submit handler was not called because validation failed. Check form.errors()."},AK0061:{code:"AK0061",message:"Async validator timed out.",hint:"The async validator did not resolve within the expected time. Check your async validation logic."},AK0070:{code:"AK0070",message:"HTTP request failed.",hint:"Check the server response status and network connectivity."},AK0071:{code:"AK0071",message:"createResource() fetcher threw an error.",hint:"Check the fetcher function passed to createResource()."}},s="https://akashjs.dev/errors";function i(e,t){let o=r[e];if(!o)return `[AkashJS ${e}] Unknown error code.`;let n=`[AkashJS ${e}] ${o.message}`;return t&&(n+=`
2
+ ${t}`),n+=`
3
+ ${o.hint}`,n+=`
4
+ See: ${s}/${e}`,n}function d(e,t){return new Error(i(e,t))}function a(e){return r[e]}function c(){return Object.keys(r)}exports.a=i;exports.b=d;exports.c=a;exports.d=c;//# sourceMappingURL=chunk-PPNEAFKE.cjs.map
5
+ //# sourceMappingURL=chunk-PPNEAFKE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts"],"names":["errors","DOC_BASE","formatError","code","context","def","msg","akashError","getErrorDef","getAllErrorCodes"],"mappings":"aAqBA,IAAMA,EAAmC,CAEvC,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,8CAAA,CACT,IAAA,CAAM,oDACR,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,6CAAA,CACT,IAAA,CAAM,mDACR,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,yCAAA,CACT,IAAA,CAAM,gEACR,CAAA,CAGA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,8CAAA,CACT,IAAA,CAAM,oDACR,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,QAAA,CACN,QAAS,gDAAA,CACT,IAAA,CAAM,sDACR,CAAA,CACA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,8CAAA,CACT,KAAM,oDACR,CAAA,CAGA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,kDAAA,CACT,KAAM,uEACR,CAAA,CACA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,yCAAA,CACT,KAAM,gHACR,CAAA,CAGA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,gDAAA,CACT,KAAM,uEACR,CAAA,CACA,OAAQ,CACN,IAAA,CAAM,SACN,OAAA,CAAS,2BAAA,CACT,KAAM,gEACR,CAAA,CAGA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,+CACT,IAAA,CAAM,gEACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,oCACT,IAAA,CAAM,8DACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,8BACT,IAAA,CAAM,oDACR,EAGA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,gCACT,IAAA,CAAM,mFACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,6BACT,IAAA,CAAM,kGACR,EAGA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,uBACT,IAAA,CAAM,4DACR,EACA,MAAA,CAAQ,CACN,KAAM,QAAA,CACN,OAAA,CAAS,2CACT,IAAA,CAAM,wDACR,CACF,CAAA,CAIMC,CAAAA,CAAW,6BAKV,SAASC,CAAAA,CAAYC,EAAcC,CAAAA,CAA0B,CAClE,IAAMC,CAAAA,CAAML,CAAAA,CAAOG,CAAI,CAAA,CACvB,GAAI,CAACE,CAAAA,CACH,OAAO,YAAYF,CAAI,CAAA,qBAAA,CAAA,CAGzB,IAAIG,CAAAA,CAAM,CAAA,SAAA,EAAYH,CAAI,CAAA,EAAA,EAAKE,CAAAA,CAAI,OAAO,CAAA,CAAA,CAC1C,OAAID,IACFE,CAAAA,EAAO;AAAA,EAAA,EAAOF,CAAO,IAEvBE,CAAAA,EAAO;AAAA,EAAA,EAAOD,CAAAA,CAAI,IAAI,CAAA,CAAA,CACtBC,CAAAA,EAAO;AAAA,OAAA,EAAYL,CAAQ,CAAA,CAAA,EAAIE,CAAI,CAAA,CAAA,CAC5BG,CACT,CAKO,SAASC,CAAAA,CAAWJ,CAAAA,CAAcC,CAAAA,CAAyB,CAChE,OAAO,IAAI,KAAA,CAAMF,CAAAA,CAAYC,EAAMC,CAAO,CAAC,CAC7C,CAKO,SAASI,CAAAA,CAAYL,CAAAA,CAAoC,CAC9D,OAAOH,EAAOG,CAAI,CACpB,CAKO,SAASM,GAA6B,CAC3C,OAAO,MAAA,CAAO,IAAA,CAAKT,CAAM,CAC3B","file":"chunk-PPNEAFKE.cjs","sourcesContent":["/**\n * Error message catalog.\n *\n * Every AkashJS runtime error has a unique code (AK0001, AK0002, etc.),\n * a one-line description, and a link to detailed documentation.\n *\n * Usage:\n * throw akashError('AK0010', 'provide()');\n */\n\n// --- Error registry ---\n\nexport interface ErrorDef {\n /** Error code */\n code: string;\n /** Short description */\n message: string;\n /** Extended explanation and fix suggestion */\n hint: string;\n}\n\nconst errors: Record<string, ErrorDef> = {\n // --- Context errors (AK001x) ---\n AK0010: {\n code: 'AK0010',\n message: 'provide() called outside of component setup.',\n hint: 'provide() must be called inside defineComponent().',\n },\n AK0012: {\n code: 'AK0012',\n message: 'inject() called outside of component setup.',\n hint: 'inject() must be called inside defineComponent().',\n },\n AK0013: {\n code: 'AK0013',\n message: 'No provider found for injected context.',\n hint: 'Make sure an ancestor component calls provide() with this key.',\n },\n\n // --- Lifecycle errors (AK002x) ---\n AK0020: {\n code: 'AK0020',\n message: 'onMount() called outside of component setup.',\n hint: 'onMount() must be called inside defineComponent().',\n },\n AK0021: {\n code: 'AK0021',\n message: 'onUnmount() called outside of component setup.',\n hint: 'onUnmount() must be called inside defineComponent().',\n },\n AK0022: {\n code: 'AK0022',\n message: 'onError() called outside of component setup.',\n hint: 'onError() must be called inside defineComponent().',\n },\n\n // --- Signal errors (AK003x) ---\n AK0030: {\n code: 'AK0030',\n message: 'Circular dependency detected in computed signal.',\n hint: 'A computed signal is reading itself, directly or via other computeds.',\n },\n AK0031: {\n code: 'AK0031',\n message: 'Signal set() called during computation.',\n hint: 'Do not set signals inside computed() or during effect execution. Use batch() or set signals in event handlers.',\n },\n\n // --- Component errors (AK004x) ---\n AK0040: {\n code: 'AK0040',\n message: 'Component setup must return a render function.',\n hint: 'The function passed to defineComponent() must return () => AkashNode.',\n },\n AK0041: {\n code: 'AK0041',\n message: 'Required prop is missing.',\n hint: 'Check that the parent component is passing all required props.',\n },\n\n // --- Router errors (AK005x) ---\n AK0050: {\n code: 'AK0050',\n message: 'useRoute() called outside of router context.',\n hint: 'Make sure your component is rendered inside a router provider.',\n },\n AK0051: {\n code: 'AK0051',\n message: 'No route matched the current URL.',\n hint: 'Add a catch-all route ([...rest]) to handle unmatched paths.',\n },\n AK0052: {\n code: 'AK0052',\n message: 'Route guard threw an error.',\n hint: 'Check the guard function for unhandled exceptions.',\n },\n\n // --- Form errors (AK006x) ---\n AK0060: {\n code: 'AK0060',\n message: 'Form submitted while invalid.',\n hint: 'The submit handler was not called because validation failed. Check form.errors().',\n },\n AK0061: {\n code: 'AK0061',\n message: 'Async validator timed out.',\n hint: 'The async validator did not resolve within the expected time. Check your async validation logic.',\n },\n\n // --- HTTP errors (AK007x) ---\n AK0070: {\n code: 'AK0070',\n message: 'HTTP request failed.',\n hint: 'Check the server response status and network connectivity.',\n },\n AK0071: {\n code: 'AK0071',\n message: 'createResource() fetcher threw an error.',\n hint: 'Check the fetcher function passed to createResource().',\n },\n};\n\n// --- Public API ---\n\nconst DOC_BASE = 'https://akashjs.dev/errors';\n\n/**\n * Format an AkashJS error with code, message, hint, and doc link.\n */\nexport function formatError(code: string, context?: string): string {\n const def = errors[code];\n if (!def) {\n return `[AkashJS ${code}] Unknown error code.`;\n }\n\n let msg = `[AkashJS ${code}] ${def.message}`;\n if (context) {\n msg += `\\n ${context}`;\n }\n msg += `\\n ${def.hint}`;\n msg += `\\n See: ${DOC_BASE}/${code}`;\n return msg;\n}\n\n/**\n * Create and throw an AkashJS error.\n */\nexport function akashError(code: string, context?: string): Error {\n return new Error(formatError(code, context));\n}\n\n/**\n * Get the error definition for a code.\n */\nexport function getErrorDef(code: string): ErrorDef | undefined {\n return errors[code];\n}\n\n/**\n * Get all registered error codes.\n */\nexport function getAllErrorCodes(): string[] {\n return Object.keys(errors);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {c}from'./chunk-YXKQTEPR.js';var v=0;function h(u={}){let{maxVisible:T=5,defaultDuration:l=3e3,position:f="top-right"}=u,i=c([]),e=new Map;function o(t,s,n){let r=`toast-${++v}`,p=n?.duration??l,y=n?.dismissible??true,x={id:r,type:t,message:s,duration:p,dismissible:y,createdAt:Date.now()};if(i.update(g=>{let d=[...g,x];if(d.length>T){let O=d.shift();a(O.id);}return d}),p>0){let g=setTimeout(()=>c$1(r),p);e.set(r,g);}return r}function c$1(t){a(t),i.update(s=>s.filter(n=>n.id!==t));}function b(){for(let[t]of e)a(t);i.set([]);}function a(t){let s=e.get(t);s&&(clearTimeout(s),e.delete(t));}return {toasts:(()=>i()),position:f,success:(t,s)=>o("success",t,s),error:(t,s)=>o("error",t,s),info:(t,s)=>o("info",t,s),warning:(t,s)=>o("warning",t,s),add:o,dismiss:c$1,dismissAll:b}}export{h as a};//# sourceMappingURL=chunk-PYASLKWF.js.map
2
+ //# sourceMappingURL=chunk-PYASLKWF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/toast.ts"],"names":["idCounter","createToaster","options","maxVisible","defaultDuration","position","toasts","signal","timers","add","type","message","opts","id","duration","dismissible","toast","list","next","removed","clearTimer","timer","dismiss","t","dismissAll","msg"],"mappings":"oCAyEA,IAAIA,CAAAA,CAAY,CAAA,CAKT,SAASC,CAAAA,CAAcC,CAAAA,CAA0B,EAAC,CAAY,CACnE,GAAM,CACJ,UAAA,CAAAC,CAAAA,CAAa,EACb,eAAA,CAAAC,CAAAA,CAAkB,GAAA,CAClB,QAAA,CAAAC,CAAAA,CAAW,WACb,EAAIH,CAAAA,CAEEI,CAAAA,CAASC,CAAAA,CAAgB,EAAE,CAAA,CAC3BC,EAAS,IAAI,GAAA,CAEnB,SAASC,CAAAA,CAAIC,CAAAA,CAAiBC,CAAAA,CAAiBC,EAA6B,CAC1E,IAAMC,CAAAA,CAAK,CAAA,MAAA,EAAS,EAAEb,CAAS,GACzBc,CAAAA,CAAWF,CAAAA,EAAM,QAAA,EAAYR,CAAAA,CAC7BW,CAAAA,CAAcH,CAAAA,EAAM,aAAe,IAAA,CAEnCI,CAAAA,CAAe,CACnB,EAAA,CAAAH,CAAAA,CACA,IAAA,CAAAH,EACA,OAAA,CAAAC,CAAAA,CACA,QAAA,CAAAG,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,UAAW,IAAA,CAAK,GAAA,EAClB,CAAA,CAaA,GAXAT,CAAAA,CAAO,OAAQW,CAAAA,EAAS,CACtB,IAAMC,CAAAA,CAAO,CAAC,GAAGD,EAAMD,CAAK,CAAA,CAE5B,GAAIE,CAAAA,CAAK,MAAA,CAASf,CAAAA,CAAY,CAC5B,IAAMgB,CAAAA,CAAUD,CAAAA,CAAK,KAAA,EAAM,CAC3BE,CAAAA,CAAWD,EAAQ,EAAE,EACvB,CACA,OAAOD,CACT,CAAC,EAGGJ,CAAAA,CAAW,CAAA,CAAG,CAChB,IAAMO,CAAAA,CAAQ,UAAA,CAAW,IAAMC,GAAAA,CAAQT,CAAE,CAAA,CAAGC,CAAQ,CAAA,CACpDN,CAAAA,CAAO,GAAA,CAAIK,EAAIQ,CAAK,EACtB,CAEA,OAAOR,CACT,CAEA,SAASS,GAAAA,CAAQT,CAAAA,CAAkB,CACjCO,CAAAA,CAAWP,CAAE,CAAA,CACbP,EAAO,MAAA,CAAQW,CAAAA,EAASA,CAAAA,CAAK,MAAA,CAAQM,CAAAA,EAAMA,CAAAA,CAAE,KAAOV,CAAE,CAAC,EACzD,CAEA,SAASW,CAAAA,EAAmB,CAC1B,IAAA,GAAW,CAACX,CAAE,CAAA,GAAKL,CAAAA,CACjBY,CAAAA,CAAWP,CAAE,CAAA,CAEfP,CAAAA,CAAO,GAAA,CAAI,EAAE,EACf,CAEA,SAASc,CAAAA,CAAWP,CAAAA,CAAkB,CACpC,IAAMQ,CAAAA,CAAQb,CAAAA,CAAO,GAAA,CAAIK,CAAE,CAAA,CACvBQ,CAAAA,GACF,YAAA,CAAaA,CAAK,CAAA,CAClBb,EAAO,MAAA,CAAOK,CAAE,CAAA,EAEpB,CAEA,OAAO,CACL,QAAS,IAAMP,CAAAA,EAAO,CAAA,CACtB,QAAA,CAAAD,CAAAA,CACA,OAAA,CAAS,CAACoB,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,EAChD,KAAA,CAAO,CAACa,CAAAA,CAAKb,CAAAA,GAASH,CAAAA,CAAI,OAAA,CAASgB,EAAKb,CAAI,CAAA,CAC5C,IAAA,CAAM,CAACa,CAAAA,CAAKb,CAAAA,GAASH,EAAI,MAAA,CAAQgB,CAAAA,CAAKb,CAAI,CAAA,CAC1C,OAAA,CAAS,CAACa,EAAKb,CAAAA,GAASH,CAAAA,CAAI,SAAA,CAAWgB,CAAAA,CAAKb,CAAI,CAAA,CAChD,GAAA,CAAAH,CAAAA,CACA,OAAA,CAAAa,GAAAA,CACA,UAAA,CAAAE,CACF,CACF","file":"chunk-PYASLKWF.js","sourcesContent":["/**\n * Toast notification system.\n *\n * Signal-based toast queue with auto-dismiss, stacking, and positions.\n *\n * ```ts\n * const toast = createToaster();\n * toast.success('Saved!');\n * toast.error('Something went wrong');\n * toast.info('Tip: try dark mode', { duration: 5000 });\n * toast.toasts(); // reactive list of active toasts\n * ```\n */\n\nimport { signal } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport type ToastType = 'success' | 'error' | 'info' | 'warning';\n\nexport type ToastPosition =\n | 'top-right' | 'top-left' | 'top-center'\n | 'bottom-right' | 'bottom-left' | 'bottom-center';\n\nexport interface Toast {\n id: string;\n type: ToastType;\n message: string;\n duration: number;\n dismissible: boolean;\n createdAt: number;\n}\n\nexport interface ToastOptions {\n /** Duration in ms (default: 3000, 0 = no auto-dismiss) */\n duration?: number;\n /** Whether the toast can be manually dismissed (default: true) */\n dismissible?: boolean;\n}\n\nexport interface ToasterOptions {\n /** Max visible toasts (default: 5) */\n maxVisible?: number;\n /** Default duration in ms (default: 3000) */\n defaultDuration?: number;\n /** Position (default: 'top-right') */\n position?: ToastPosition;\n}\n\nexport interface Toaster {\n /** Active toasts (reactive signal) */\n toasts: ReadonlySignal<Toast[]>;\n /** Position setting */\n position: ToastPosition;\n /** Show a success toast */\n success(message: string, options?: ToastOptions): string;\n /** Show an error toast */\n error(message: string, options?: ToastOptions): string;\n /** Show an info toast */\n info(message: string, options?: ToastOptions): string;\n /** Show a warning toast */\n warning(message: string, options?: ToastOptions): string;\n /** Show a toast with custom type */\n add(type: ToastType, message: string, options?: ToastOptions): string;\n /** Dismiss a specific toast */\n dismiss(id: string): void;\n /** Dismiss all toasts */\n dismissAll(): void;\n}\n\n// --- Implementation ---\n\nlet idCounter = 0;\n\n/**\n * Create a toast notification manager.\n */\nexport function createToaster(options: ToasterOptions = {}): Toaster {\n const {\n maxVisible = 5,\n defaultDuration = 3000,\n position = 'top-right',\n } = options;\n\n const toasts = signal<Toast[]>([]);\n const timers = new Map<string, ReturnType<typeof setTimeout>>();\n\n function add(type: ToastType, message: string, opts?: ToastOptions): string {\n const id = `toast-${++idCounter}`;\n const duration = opts?.duration ?? defaultDuration;\n const dismissible = opts?.dismissible ?? true;\n\n const toast: Toast = {\n id,\n type,\n message,\n duration,\n dismissible,\n createdAt: Date.now(),\n };\n\n toasts.update((list) => {\n const next = [...list, toast];\n // Trim to maxVisible\n if (next.length > maxVisible) {\n const removed = next.shift()!;\n clearTimer(removed.id);\n }\n return next;\n });\n\n // Auto-dismiss\n if (duration > 0) {\n const timer = setTimeout(() => dismiss(id), duration);\n timers.set(id, timer);\n }\n\n return id;\n }\n\n function dismiss(id: string): void {\n clearTimer(id);\n toasts.update((list) => list.filter((t) => t.id !== id));\n }\n\n function dismissAll(): void {\n for (const [id] of timers) {\n clearTimer(id);\n }\n toasts.set([]);\n }\n\n function clearTimer(id: string): void {\n const timer = timers.get(id);\n if (timer) {\n clearTimeout(timer);\n timers.delete(id);\n }\n }\n\n return {\n toasts: (() => toasts()) as ReadonlySignal<Toast[]>,\n position,\n success: (msg, opts) => add('success', msg, opts),\n error: (msg, opts) => add('error', msg, opts),\n info: (msg, opts) => add('info', msg, opts),\n warning: (msg, opts) => add('warning', msg, opts),\n add,\n dismiss,\n dismissAll,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {s,l}from'./chunk-KE7BJTCD.js';import {c,d}from'./chunk-YXKQTEPR.js';function v(t,i,c,u,m=3){let s,a,n,e,o;typeof t=="object"?(s=t.scrollTop,a=t.containerHeight,n=t.itemHeight,e=t.totalItems,o=t.overscan??3):(s=t,a=i,n=c,e=u,o=m);let r=Math.floor(s/n),l=Math.ceil(a/n),h=Math.max(0,r-o),g=Math.min(e,r+l+o);return {start:h,end:g,totalHeight:e*n,offsetTop:h*n}}function V(t){let i=c(0),c$1=c(t.containerHeight??400),u=t.overscan??3,m=d(()=>v(i(),c$1(),t.itemHeight,t.items().length,u)),s=d(()=>{let e=m();return t.items().slice(e.start,e.end).map((o,r)=>({item:o,index:e.start+r}))});function a(e){let o=e.target;i.set(o.scrollTop);}function n(e){c$1.set(e);}return {range:m,visibleItems:s,onScroll:a,setContainerHeight:n,scrollTop:(()=>i())}}var E=s(t=>{let{itemHeight:i,containerHeight:c$1,overscan:u=3}=t.props,m=c(0);return ()=>{let s=t.props.each,a=c$1??400,n=v(m(),a,i,s.length,u),e=document.createElement("div");e.style.height=`${a}px`,e.style.overflow="auto",e.style.position="relative",e.addEventListener("scroll",()=>{m.set(e.scrollTop);},{passive:true});let o=document.createElement("div");o.style.height=`${n.totalHeight}px`,o.style.position="relative";let r=document.createElement("div");r.style.position="absolute",r.style.top=`${n.offsetTop}px`,r.style.left="0",r.style.right="0";for(let l$1=n.start;l$1<n.end;l$1++){let h=s[l$1];if(!h)continue;let g=l(t.props.children(h,l$1));g instanceof HTMLElement&&(g.style.height=`${i}px`),r.appendChild(g);}return o.appendChild(r),e.appendChild(o),e}});export{v as a,V as b,E as c};//# sourceMappingURL=chunk-Q6S7SUOM.js.map
2
+ //# sourceMappingURL=chunk-Q6S7SUOM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/virtual-list.ts"],"names":["calculateRange","scrollTopOrOpts","containerHeight","itemHeight","totalItems","overscan","st","ch","ih","ti","os","firstVisible","visibleCount","start","end","useVirtualList","options","scrollTop","signal","range","computed","visibleItems","r","item","i","onScroll","target","setContainerHeight","height","VirtualFor","defineComponent","ctx","fixedHeight","items","outer","inner","content","row","nodeToDOM"],"mappings":"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","file":"chunk-Q6S7SUOM.js","sourcesContent":["/**\n * <VirtualFor> — virtualized list rendering.\n *\n * Only renders items visible in the viewport plus a small overscan\n * buffer. Essential for rendering thousands of items without\n * destroying performance.\n *\n * ```html\n * <VirtualFor\n * each={items()}\n * key={(item) => item.id}\n * itemHeight={40}\n * overscan={5}\n * >\n * {(item) => <div class=\"row\">{item.name}</div>}\n * </VirtualFor>\n * ```\n */\n\nimport { signal, effect, computed } from './signals.js';\nimport { defineComponent } from './component.js';\nimport { nodeToDOM } from './dom.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport interface VirtualForProps<T> {\n /** Array of items */\n each: T[];\n /** Key function for reconciliation */\n key: (item: T) => unknown;\n /** Fixed height per item in pixels */\n itemHeight: number;\n /** Container height in pixels (default: auto-detect from parent) */\n containerHeight?: number;\n /** Number of extra items to render above/below viewport */\n overscan?: number;\n /** Render function for each item */\n children: (item: T, index: number) => AkashNode;\n}\n\n// --- Virtual scroll calculations ---\n\nexport interface VirtualRange {\n /** First visible index */\n start: number;\n /** Last visible index (exclusive) */\n end: number;\n /** Total content height in pixels */\n totalHeight: number;\n /** Offset of the first rendered item */\n offsetTop: number;\n}\n\n/**\n * Calculate the visible range given scroll position and dimensions.\n */\nexport function calculateRange(\n scrollTopOrOpts: number | { scrollTop: number; containerHeight: number; itemHeight: number; totalItems: number; overscan?: number },\n containerHeight?: number,\n itemHeight?: number,\n totalItems?: number,\n overscan = 3,\n): VirtualRange {\n let st: number, ch: number, ih: number, ti: number, os: number;\n if (typeof scrollTopOrOpts === 'object') {\n st = scrollTopOrOpts.scrollTop;\n ch = scrollTopOrOpts.containerHeight;\n ih = scrollTopOrOpts.itemHeight;\n ti = scrollTopOrOpts.totalItems;\n os = scrollTopOrOpts.overscan ?? 3;\n } else {\n st = scrollTopOrOpts;\n ch = containerHeight!;\n ih = itemHeight!;\n ti = totalItems!;\n os = overscan;\n }\n\n const firstVisible = Math.floor(st / ih);\n const visibleCount = Math.ceil(ch / ih);\n\n const start = Math.max(0, firstVisible - os);\n const end = Math.min(ti, firstVisible + visibleCount + os);\n\n return {\n start,\n end,\n totalHeight: ti * ih,\n offsetTop: start * ih,\n };\n}\n\n// --- useVirtualList composable ---\n\n/**\n * Low-level virtual list composable for custom implementations.\n *\n * ```ts\n * const { containerRef, range, visibleItems } = useVirtualList({\n * items: () => allItems(),\n * itemHeight: 40,\n * overscan: 5,\n * });\n * ```\n */\nexport function useVirtualList<T>(options: {\n items: () => T[];\n itemHeight: number;\n containerHeight?: number;\n overscan?: number;\n}) {\n const scrollTop = signal(0);\n const containerHeight = signal(options.containerHeight ?? 400);\n const overscan = options.overscan ?? 3;\n\n const range = computed((): VirtualRange => {\n return calculateRange(\n scrollTop(),\n containerHeight(),\n options.itemHeight,\n options.items().length,\n overscan,\n );\n });\n\n const visibleItems = computed(() => {\n const r = range();\n return options.items().slice(r.start, r.end).map((item, i) => ({\n item,\n index: r.start + i,\n }));\n });\n\n function onScroll(e: Event): void {\n const target = e.target as HTMLElement;\n scrollTop.set(target.scrollTop);\n }\n\n function setContainerHeight(height: number): void {\n containerHeight.set(height);\n }\n\n return {\n range,\n visibleItems,\n onScroll,\n setContainerHeight,\n scrollTop: (() => scrollTop()) as ReadonlySignal<number>,\n };\n}\n\n// --- <VirtualFor> component ---\n\nexport const VirtualFor = defineComponent<VirtualForProps<any>>((ctx) => {\n const {\n itemHeight,\n containerHeight: fixedHeight,\n overscan = 3,\n } = ctx.props;\n\n const scrollTop = signal(0);\n\n return () => {\n const items = ctx.props.each;\n const height = fixedHeight ?? 400;\n\n const r = calculateRange(scrollTop(), height, itemHeight, items.length, overscan);\n\n // Outer container (scrollable)\n const outer = document.createElement('div');\n outer.style.height = `${height}px`;\n outer.style.overflow = 'auto';\n outer.style.position = 'relative';\n\n outer.addEventListener('scroll', () => {\n scrollTop.set(outer.scrollTop);\n }, { passive: true });\n\n // Inner spacer (total height)\n const inner = document.createElement('div');\n inner.style.height = `${r.totalHeight}px`;\n inner.style.position = 'relative';\n\n // Rendered items container\n const content = document.createElement('div');\n content.style.position = 'absolute';\n content.style.top = `${r.offsetTop}px`;\n content.style.left = '0';\n content.style.right = '0';\n\n // Render visible items\n for (let i = r.start; i < r.end; i++) {\n const item = items[i];\n if (!item) continue;\n\n const row = nodeToDOM(ctx.props.children(item, i));\n if (row instanceof HTMLElement) {\n row.style.height = `${itemHeight}px`;\n }\n content.appendChild(row);\n }\n\n inner.appendChild(content);\n outer.appendChild(inner);\n return outer;\n };\n});\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function m(o,t){let e=chunkWOZWFMOK_cjs.c(0),n=chunkWOZWFMOK_cjs.c(t?.immediate!==false),u=null;function a(){l(),u=setInterval(()=>e.update(r=>r+1),o);}function l(){u&&(clearInterval(u),u=null);}return n()&&a(),{count:(()=>e()),isActive:(()=>n()),pause(){n.set(false),l();},resume(){n.set(true),a();},reset(){e.set(0);},dispose(){l();}}}function f(o){let t=chunkWOZWFMOK_cjs.c(false),e=null;function n(){u(),t.set(false),e=setTimeout(()=>t.set(true),o);}function u(){e&&(clearTimeout(e),e=null);}return n(),{ready:(()=>t()),restart(){n();},dispose(){u();}}}function d(o,t){let e=chunkWOZWFMOK_cjs.c(o()),n=null;return chunkWOZWFMOK_cjs.e(()=>{let u=o();return n&&clearTimeout(n),n=setTimeout(()=>e.set(u),t),()=>{n&&clearTimeout(n);}}),(()=>e())}function T(o,t){let e=chunkWOZWFMOK_cjs.c(o()),n=0,u=null;return chunkWOZWFMOK_cjs.e(()=>{let a=o(),l=Date.now(),r=l-n;return r>=t?(e.set(a),n=l):(u&&clearTimeout(u),u=setTimeout(()=>{e.set(a),n=Date.now();},t-r)),()=>{u&&clearTimeout(u);}}),(()=>e())}function p(o=0,t){let e=t?.min??-1/0,n=t?.max??1/0,u=l=>Math.min(n,Math.max(e,l)),a=chunkWOZWFMOK_cjs.c(u(o));return {count:(()=>a()),inc(l=1){a.update(r=>u(r+l));},dec(l=1){a.update(r=>u(r-l));},set(l){a.set(u(l));},reset(){a.set(u(o));}}}function y(o=false){let t=chunkWOZWFMOK_cjs.c(o);return {value:(()=>t()),toggle(){t.update(e=>!e);},setTrue(){t.set(true);},setFalse(){t.set(false);}}}function g(o){let t,e=chunkWOZWFMOK_cjs.c(void 0);return chunkWOZWFMOK_cjs.e(()=>{let n=o();e.set(t),t=n;}),(()=>e())}exports.a=m;exports.b=f;exports.c=d;exports.d=T;exports.e=p;exports.f=y;exports.g=g;//# sourceMappingURL=chunk-QE2TJ6P5.cjs.map
2
+ //# sourceMappingURL=chunk-QE2TJ6P5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/composables.ts"],"names":["useInterval","ms","options","count","signal","isActive","timer","start","stop","c","useTimeout","ready","useDebounce","source","delay","debounced","effect","value","useThrottle","interval","throttled","lastUpdate","now","elapsed","useCounter","initial","min","max","clamp","v","delta","useToggle","usePrevious","lastValue","tracked","current"],"mappings":"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","file":"chunk-QE2TJ6P5.cjs","sourcesContent":["/**\n * Reactive composables — signal-based utility functions.\n *\n * Timers, debounce, throttle, and other commonly needed\n * reactive primitives that every app uses.\n */\n\nimport { signal, effect } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// --- useInterval ---\n\n/**\n * Create a reactive interval that ticks at a given rate.\n *\n * ```ts\n * const { count, pause, resume, reset } = useInterval(1000);\n * count(); // increments every second\n * ```\n */\nexport function useInterval(ms: number, options?: { immediate?: boolean }) {\n const count = signal(0);\n const isActive = signal(options?.immediate !== false);\n let timer: ReturnType<typeof setInterval> | null = null;\n\n function start() {\n stop();\n timer = setInterval(() => count.update((c) => c + 1), ms);\n }\n\n function stop() {\n if (timer) { clearInterval(timer); timer = null; }\n }\n\n if (isActive()) start();\n\n return {\n count: (() => count()) as ReadonlySignal<number>,\n isActive: (() => isActive()) as ReadonlySignal<boolean>,\n pause() { isActive.set(false); stop(); },\n resume() { isActive.set(true); start(); },\n reset() { count.set(0); },\n dispose() { stop(); },\n };\n}\n\n// --- useTimeout ---\n\n/**\n * Reactive timeout that exposes ready state.\n *\n * ```ts\n * const { ready, restart } = useTimeout(3000);\n * ready(); // false, then true after 3s\n * ```\n */\nexport function useTimeout(ms: number) {\n const ready = signal(false);\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n function start() {\n stop();\n ready.set(false);\n timer = setTimeout(() => ready.set(true), ms);\n }\n\n function stop() {\n if (timer) { clearTimeout(timer); timer = null; }\n }\n\n start();\n\n return {\n ready: (() => ready()) as ReadonlySignal<boolean>,\n restart() { start(); },\n dispose() { stop(); },\n };\n}\n\n// --- useDebounce ---\n\n/**\n * Debounce a signal value. The output updates only after the input\n * stops changing for the given delay.\n *\n * ```ts\n * const search = signal('');\n * const debouncedSearch = useDebounce(search, 300);\n * // debouncedSearch() updates 300ms after last search.set()\n * ```\n */\nexport function useDebounce<T>(source: () => T, delay: number): ReadonlySignal<T> {\n const debounced = signal<T>(source());\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n effect(() => {\n const value = source();\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => debounced.set(value), delay);\n return () => { if (timer) clearTimeout(timer); };\n });\n\n return (() => debounced()) as ReadonlySignal<T>;\n}\n\n// --- useThrottle ---\n\n/**\n * Throttle a signal value. The output updates at most once per interval.\n *\n * ```ts\n * const scrollY = signal(0);\n * const throttled = useThrottle(scrollY, 100);\n * ```\n */\nexport function useThrottle<T>(source: () => T, interval: number): ReadonlySignal<T> {\n const throttled = signal<T>(source());\n let lastUpdate = 0;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n effect(() => {\n const value = source();\n const now = Date.now();\n const elapsed = now - lastUpdate;\n\n if (elapsed >= interval) {\n throttled.set(value);\n lastUpdate = now;\n } else {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n throttled.set(value);\n lastUpdate = Date.now();\n }, interval - elapsed);\n }\n return () => { if (timer) clearTimeout(timer); };\n });\n\n return (() => throttled()) as ReadonlySignal<T>;\n}\n\n// --- useCounter ---\n\n/**\n * Simple reactive counter with inc/dec/set/reset.\n *\n * ```ts\n * const { count, inc, dec, set, reset } = useCounter(0);\n * ```\n */\nexport function useCounter(initial = 0, options?: { min?: number; max?: number }) {\n const min = options?.min ?? -Infinity;\n const max = options?.max ?? Infinity;\n const clamp = (v: number) => Math.min(max, Math.max(min, v));\n const count = signal(clamp(initial));\n return {\n count: (() => count()) as ReadonlySignal<number>,\n inc(delta = 1) { count.update((c) => clamp(c + delta)); },\n dec(delta = 1) { count.update((c) => clamp(c - delta)); },\n set(value: number) { count.set(clamp(value)); },\n reset() { count.set(clamp(initial)); },\n };\n}\n\n// --- useToggle ---\n\n/**\n * Reactive boolean toggle.\n *\n * ```ts\n * const { value, toggle, setTrue, setFalse } = useToggle(false);\n * ```\n */\nexport function useToggle(initial = false) {\n const value = signal(initial);\n return {\n value: (() => value()) as ReadonlySignal<boolean>,\n toggle() { value.update((v) => !v); },\n setTrue() { value.set(true); },\n setFalse() { value.set(false); },\n };\n}\n\n// --- usePrevious ---\n\n/**\n * Track the previous value of a signal.\n *\n * ```ts\n * const count = signal(0);\n * const prev = usePrevious(count);\n * count.set(1);\n * prev(); // 0\n * ```\n */\nexport function usePrevious<T>(source: () => T): ReadonlySignal<T | undefined> {\n let lastValue: T | undefined;\n const tracked = signal<T | undefined>(undefined);\n\n effect(() => {\n const current = source();\n tracked.set(lastValue);\n lastValue = current;\n });\n\n return (() => tracked()) as ReadonlySignal<T | undefined>;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {c,d,e}from'./chunk-YXKQTEPR.js';function T(s={}){let{themes:i={light:{},dark:{}},storageKey:t="akash-theme",attribute:f="data-theme",syncSystem:g=true}=s,o=Object.keys(i);function d$1(){return typeof window>"u"?s.defaultTheme??"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function h(){if(typeof window<"u"&&t){let e=localStorage.getItem(t);if(e&&o.includes(e))return e}return s.defaultTheme??d$1()}let n=c(h()),a=d(()=>n()==="dark");function y(e){if(typeof document>"u")return;document.documentElement.setAttribute(f,e);let r=i[e];if(r)for(let[m,p]of Object.entries(r))document.documentElement.style.setProperty(m,p);document.documentElement.classList.remove(...o),document.documentElement.classList.add(e);}return e(()=>{let e=n();y(e),typeof window<"u"&&t&&localStorage.setItem(t,e);}),g&&typeof window<"u"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",r=>{localStorage.getItem(t)||n.set(r.matches?"dark":"light");}),{current:()=>n(),isDark:a,set(e){o.includes(e)&&n.set(e);},toggle(){n.set(a()?"light":"dark");},setSystem(){typeof window<"u"&&t&&localStorage.removeItem(t),n.set(d$1());},themes:o}}export{T as a};//# sourceMappingURL=chunk-QNVMBXVH.js.map
2
+ //# sourceMappingURL=chunk-QNVMBXVH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/theme.ts"],"names":["useTheme","config","themes","storageKey","attribute","syncSystem","themeNames","getSystemTheme","getInitialTheme","stored","current","signal","isDark","computed","applyTheme","name","vars","key","value","effect","e","theme"],"mappings":"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","file":"chunk-QNVMBXVH.js","sourcesContent":["/**\n * Theme / dark mode system.\n *\n * Signal-based theme management with system preference detection,\n * CSS variable injection, and localStorage persistence.\n *\n * ```ts\n * const theme = useTheme({\n * themes: {\n * light: { '--bg': '#fff', '--text': '#111' },\n * dark: { '--bg': '#111', '--text': '#eee' },\n * },\n * });\n *\n * theme.current(); // 'light' or 'dark'\n * theme.toggle(); // switch between light/dark\n * theme.set('dark'); // set explicitly\n * theme.isDark(); // boolean\n * ```\n */\n\nimport { signal, computed, effect } from './signals.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// --- Types ---\n\nexport type ThemeVariables = Record<string, string>;\n\nexport interface ThemeConfig {\n /** Theme definitions (name → CSS variables) */\n themes?: Record<string, ThemeVariables>;\n /** Default theme name (default: auto-detect from system) */\n defaultTheme?: string;\n /** localStorage key for persistence (default: 'akash-theme') */\n storageKey?: string;\n /** CSS attribute to set on <html> (default: 'data-theme') */\n attribute?: string;\n /** Whether to sync with system preference (default: true) */\n syncSystem?: boolean;\n}\n\nexport interface Theme {\n /** Current theme name (reactive) */\n current: ReadonlySignal<string>;\n /** Whether dark mode is active */\n isDark: ReadonlySignal<boolean>;\n /** Set a specific theme */\n set(theme: string): void;\n /** Toggle between light and dark */\n toggle(): void;\n /** Set the system preference strategy */\n setSystem(): void;\n /** Available theme names */\n themes: string[];\n}\n\n// --- Implementation ---\n\n/**\n * Create a theme manager with system preference detection and persistence.\n */\nexport function useTheme(config: ThemeConfig = {}): Theme {\n const {\n themes = {\n light: {},\n dark: {},\n },\n storageKey = 'akash-theme',\n attribute = 'data-theme',\n syncSystem = true,\n } = config;\n\n const themeNames = Object.keys(themes);\n\n // Detect system preference\n function getSystemTheme(): string {\n if (typeof window === 'undefined') return config.defaultTheme ?? 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n // Read persisted theme or use default\n function getInitialTheme(): string {\n if (typeof window !== 'undefined' && storageKey) {\n const stored = localStorage.getItem(storageKey);\n if (stored && themeNames.includes(stored)) return stored;\n }\n return config.defaultTheme ?? getSystemTheme();\n }\n\n const current = signal(getInitialTheme());\n const isDark = computed(() => current() === 'dark');\n\n // Apply theme\n function applyTheme(name: string): void {\n if (typeof document === 'undefined') return;\n\n // Set attribute on <html>\n document.documentElement.setAttribute(attribute, name);\n\n // Apply CSS variables\n const vars = themes[name];\n if (vars) {\n for (const [key, value] of Object.entries(vars)) {\n document.documentElement.style.setProperty(key, value);\n }\n }\n\n // Add/remove class for convenience\n document.documentElement.classList.remove(...themeNames);\n document.documentElement.classList.add(name);\n }\n\n // React to theme changes\n effect(() => {\n const name = current();\n applyTheme(name);\n\n // Persist\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.setItem(storageKey, name);\n }\n });\n\n // Sync with system preference changes\n if (syncSystem && typeof window !== 'undefined') {\n const mql = window.matchMedia('(prefers-color-scheme: dark)');\n mql.addEventListener('change', (e) => {\n // Only auto-switch if user hasn't manually overridden\n const stored = localStorage.getItem(storageKey);\n if (!stored) {\n current.set(e.matches ? 'dark' : 'light');\n }\n });\n }\n\n return {\n current: () => current(),\n isDark,\n set(theme: string) {\n if (themeNames.includes(theme)) {\n current.set(theme);\n }\n },\n toggle() {\n current.set(isDark() ? 'light' : 'dark');\n },\n setSystem() {\n if (typeof window !== 'undefined' && storageKey) {\n localStorage.removeItem(storageKey);\n }\n current.set(getSystemTheme());\n },\n themes: themeNames,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {c}from'./chunk-YXKQTEPR.js';function b(l){let{onLoadMore:a,hasMore:s,rootMargin:d="200px",threshold:f=0}=l,n=c(false),t=c(false),r=null,e=null,i=false;async function u(){if(!(n()||t()||i)){if(!s()){t.set(true);return}n.set(true);try{await a(),s()||t.set(!0);}finally{n.set(false);}}}function c$1(p){typeof IntersectionObserver>"u"||(r=new IntersectionObserver(g=>{g[0]?.isIntersecting&&u();},{rootMargin:d,threshold:f}),r.observe(p));}function m(){return e||(e=document.createElement("div"),e.setAttribute("data-akash-sentinel",""),e.style.height="1px",e.setAttribute("aria-hidden","true"),requestAnimationFrame(()=>{e&&!i&&c$1(e);}),e)}return {sentinel:m,loading:()=>n(),done:()=>t(),reset(){t.set(false),n.set(false);},dispose(){i=true,r?.disconnect(),r=null;}}}export{b as a};//# sourceMappingURL=chunk-QQ725EZL.js.map
2
+ //# sourceMappingURL=chunk-QQ725EZL.js.map