@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,5 @@
1
+ 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)}export{i as a,d as b,a as c,c as d};//# sourceMappingURL=chunk-AOFLE33X.js.map
5
+ //# sourceMappingURL=chunk-AOFLE33X.js.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-AOFLE33X.js","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
+ 'use strict';function f(r){let t=r.length;if(t===0)return [];let n=[],s=new Array(t).fill(-1),o=[];for(let e=0;e<t;e++){let c=r[e];if(c===-1)continue;let u=0,m=n.length;for(;u<m;){let p=u+m>>1;n[p]<c?u=p+1:m=p;}n[u]=c,o[u]=e,u>0&&(s[e]=o[u-1]);}let i=new Array(n.length),l=o[n.length-1];for(let e=n.length-1;e>=0;e--)i[e]=l,l=s[l];return i}function h(r,t){let n=[],s=new Map;for(let e=0;e<r.length;e++)s.set(r[e],e);let o=new Array(t.length);for(let e=0;e<t.length;e++)o[e]=s.get(t[e])??-1;let i=new Set(t);for(let e=0;e<r.length;e++)i.has(r[e])||n.push({type:"remove",oldIndex:e});let l=new Set(f(o));for(let e=0;e<t.length;e++)o[e]===-1?n.push({type:"insert",newIndex:e}):l.has(e)||n.push({type:"move",newIndex:e,oldIndex:o[e]});return n}function b(r,t){let n=h(r,t),s=0,o=0,i=0;for(let l of n)l.type==="insert"?s++:l.type==="move"?o++:i++;return {inserts:s,moves:o,removes:i}}exports.a=f;exports.b=h;exports.c=b;//# sourceMappingURL=chunk-AQQQVDBQ.cjs.map
2
+ //# sourceMappingURL=chunk-AQQQVDBQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/reconcile.ts"],"names":["longestIncreasingSubsequence","arr","n","tails","predecessors","indices","i","value","lo","hi","mid","result","k","reconcileKeys","oldKeys","newKeys","ops","oldKeyMap","newToOld","newKeySet","lis","countOps","inserts","moves","removes","op"],"mappings":"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","file":"chunk-AQQQVDBQ.cjs","sourcesContent":["/**\n * List reconciliation with Longest Increasing Subsequence (LIS).\n *\n * When a keyed list updates, we need to determine the minimal set of\n * DOM operations (inserts, moves, removes). The LIS of the new key\n * positions tells us which nodes are already in the correct relative\n * order and don't need to move.\n *\n * This is the same algorithm used by Vue 3, Solid, and Inferno.\n */\n\n/**\n * Find the Longest Increasing Subsequence of indices.\n * Returns the indices into the input array that form the LIS.\n *\n * Time: O(n log n), Space: O(n)\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // tails[i] = smallest tail value for increasing subsequence of length i+1\n const tails: number[] = [];\n // predecessors[i] = index of previous element in the LIS ending at i\n const predecessors: number[] = new Array(n).fill(-1);\n // indices[i] = index in arr of the tail for length i+1\n const indices: number[] = [];\n\n for (let i = 0; i < n; i++) {\n const value = arr[i];\n\n // Skip items not in the old list (marked as -1)\n if (value === -1) continue;\n\n // Binary search for the position to insert/replace\n let lo = 0;\n let hi = tails.length;\n\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid] < value) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n\n tails[lo] = value;\n indices[lo] = i;\n\n if (lo > 0) {\n predecessors[i] = indices[lo - 1];\n }\n }\n\n // Reconstruct the LIS by following predecessors\n const result: number[] = new Array(tails.length);\n let k = indices[tails.length - 1];\n\n for (let i = tails.length - 1; i >= 0; i--) {\n result[i] = k;\n k = predecessors[k];\n }\n\n return result;\n}\n\n/**\n * Reconcile two keyed lists and return the minimal DOM operations.\n *\n * @param oldKeys - Keys of the current DOM list\n * @param newKeys - Keys of the new data list\n * @returns Operations to transform old into new\n */\nexport interface ReconcileOp {\n type: 'insert' | 'move' | 'remove';\n /** Index in the NEW array (for insert/move) */\n newIndex?: number;\n /** Index in the OLD array (for remove/move source) */\n oldIndex?: number;\n}\n\nexport function reconcileKeys(\n oldKeys: unknown[],\n newKeys: unknown[],\n): ReconcileOp[] {\n const ops: ReconcileOp[] = [];\n\n // Build old key → index map\n const oldKeyMap = new Map<unknown, number>();\n for (let i = 0; i < oldKeys.length; i++) {\n oldKeyMap.set(oldKeys[i], i);\n }\n\n // For each new key, find its position in old (or -1 if new)\n const newToOld: number[] = new Array(newKeys.length);\n for (let i = 0; i < newKeys.length; i++) {\n newToOld[i] = oldKeyMap.get(newKeys[i]) ?? -1;\n }\n\n // Find nodes that need to be removed (in old but not in new)\n const newKeySet = new Set(newKeys);\n for (let i = 0; i < oldKeys.length; i++) {\n if (!newKeySet.has(oldKeys[i])) {\n ops.push({ type: 'remove', oldIndex: i });\n }\n }\n\n // Find the LIS of old indices — these nodes stay in place\n const lis = new Set(longestIncreasingSubsequence(newToOld));\n\n // Nodes not in the LIS need to be moved or inserted\n for (let i = 0; i < newKeys.length; i++) {\n if (newToOld[i] === -1) {\n // New item — insert\n ops.push({ type: 'insert', newIndex: i });\n } else if (!lis.has(i)) {\n // Existing item not in LIS — move\n ops.push({ type: 'move', newIndex: i, oldIndex: newToOld[i] });\n }\n // Items in LIS stay in place — no op needed\n }\n\n return ops;\n}\n\n/**\n * Count the minimum number of DOM operations needed.\n */\nexport function countOps(oldKeys: unknown[], newKeys: unknown[]): {\n inserts: number;\n moves: number;\n removes: number;\n} {\n const ops = reconcileKeys(oldKeys, newKeys);\n let inserts = 0, moves = 0, removes = 0;\n for (const op of ops) {\n if (op.type === 'insert') inserts++;\n else if (op.type === 'move') moves++;\n else removes++;\n }\n return { inserts, moves, removes };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ function l(n,t,...r){if(r.length>0&&r.every(e=>typeof e=="function")){let e=t(n);for(let i of r)e=i(e);return e}return t(n,...r)}function f(...n){return (t,...r)=>{let e=t;for(let i of n)e=i(e,...r);return e}}function y(n){return n}var F=n=>String(n).toUpperCase(),d=n=>String(n).toLowerCase(),b=n=>{let t=String(n);return t.charAt(0).toUpperCase()+t.slice(1)},T=n=>String(n).replace(/\b\w/g,t=>t.toUpperCase()),h=n=>String(n).trim(),x=(n,t=50,r="...")=>{let e=String(n);return e.length<=t?e:e.slice(0,t-r.length)+r},P=(n,t="medium",r)=>{let e=n instanceof Date?n:new Date(n);if(isNaN(e.getTime()))return String(n);if(t==="iso")return e.toISOString();let i=r??"en-US",o={short:{year:"2-digit",month:"numeric",day:"numeric"},medium:{year:"numeric",month:"numeric",day:"numeric"},long:{year:"numeric",month:"long",day:"numeric"},full:{weekday:"long",year:"numeric",month:"long",day:"numeric"},time:{hour:"numeric",minute:"2-digit"}};return new Intl.DateTimeFormat(i,o[t]).format(e)},I=(n,t="USD",r)=>new Intl.NumberFormat(r??"en-US",{style:"currency",currency:t}).format(Number(n)),S=(n,t,r)=>{let e={};if(t){let[i,o]=t.split("-").map(Number);e.minimumFractionDigits=i,e.maximumFractionDigits=o??i;}return new Intl.NumberFormat(r??"en-US",e).format(Number(n))},D=(n,t=0,r)=>new Intl.NumberFormat(r??"en-US",{style:"percent",minimumFractionDigits:t,maximumFractionDigits:t}).format(Number(n)),w=(n,t=2)=>JSON.stringify(n,null,t),N=(n,t,r)=>{let e=r??`${t}s`;return `${n} ${n===1?t:e}`},U=(n,t)=>{let e=(n instanceof Date?n.getTime():Number(n))-Date.now(),i=Math.abs(e),o=[[6e4,"second"],[36e5,"minute"],[864e5,"hour"],[2592e6,"day"],[31536e6,"month"],[1/0,"year"]],a={second:1e3,minute:6e4,hour:36e5,day:864e5,month:2592e6,year:31536e6},s="second";for(let[p,g]of o)if(i<p){s=g;break}let m=Math.round(e/a[s]);if(typeof Intl<"u"&&Intl.RelativeTimeFormat)return new Intl.RelativeTimeFormat(t??"en",{numeric:"auto"}).format(m,s);let u=Math.abs(m),c=m<0?"ago":"from now";return `${u} ${s}${u!==1?"s":""} ${c}`};export{l as a,f as b,y as c,F as d,d as e,b as f,T as g,h,x as i,P as j,I as k,S as l,D as m,w as n,N as o,U as p};//# sourceMappingURL=chunk-AXB5GHGO.js.map
2
+ //# sourceMappingURL=chunk-AXB5GHGO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pipes.ts"],"names":["pipe","value","transform","rest","a","result","fn","chain","pipes","args","p","definePipe","uppercase","lowercase","capitalize","s","titleCase","c","trim","truncate","maxLength","suffix","date","format","locale","d","loc","options","currency","currencyCode","number","digitsInfo","opts","min","max","percent","decimals","json","indent","plural","singular","pluralForm","relativeTime","diff","absDiff","units","divisors","unit","threshold","u","n","abs"],"mappings":"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","file":"chunk-AXB5GHGO.js","sourcesContent":["/**\n * Pipes — template transform functions.\n *\n * Pure functions that transform display values. Chainable, memoized,\n * and usable both in templates and in script.\n *\n * ```ts\n * import { pipe, uppercase, date, currency } from '@akashjs/runtime';\n *\n * pipe('hello', uppercase); // 'HELLO'\n * pipe(new Date(), date, 'short'); // '3/29/26'\n * pipe(1234.5, currency, 'USD'); // '$1,234.50'\n * pipe('hello world', capitalize, truncate, 5); // 'Hello...'\n * ```\n */\n\n// =========================================================================\n// Pipe type and runner\n// =========================================================================\n\nexport type PipeFn<TIn = any, TOut = any> = (value: TIn, ...args: any[]) => TOut;\n\n/**\n * Apply a pipe transform to a value.\n *\n * ```ts\n * pipe('hello', uppercase); // 'HELLO'\n * pipe(1234, currency, 'USD'); // '$1,234.00'\n * ```\n */\nexport function pipe(value: any, transform: Function, ...rest: any[]): any {\n // If all remaining args are functions, chain them: pipe(5, fn1, fn2, fn3)\n if (rest.length > 0 && rest.every(a => typeof a === 'function')) {\n let result = transform(value);\n for (const fn of rest) {\n result = fn(result);\n }\n return result;\n }\n // Otherwise, pass extra args to the transform: pipe('hello', truncate, 5)\n return transform(value, ...rest);\n}\n\n/**\n * Chain multiple pipes together.\n *\n * ```ts\n * const format = chain(trim, capitalize, truncate);\n * format(' hello world ', 10); // 'Hello w...'\n * ```\n */\nexport function chain<T>(...pipes: PipeFn[]): PipeFn<T, any> {\n return (value: T, ...args: any[]) => {\n let result: any = value;\n for (const p of pipes) {\n result = p(result, ...args);\n }\n return result;\n };\n}\n\n/**\n * Define a custom pipe.\n *\n * ```ts\n * const reverse = definePipe<string, string>((value) =>\n * value.split('').reverse().join('')\n * );\n * pipe('hello', reverse); // 'olleh'\n * ```\n */\nexport function definePipe<TIn, TOut>(fn: PipeFn<TIn, TOut>): PipeFn<TIn, TOut> {\n return fn;\n}\n\n// =========================================================================\n// Built-in pipes\n// =========================================================================\n\n/** Convert string to uppercase */\nexport const uppercase: PipeFn<string, string> = (value) => String(value).toUpperCase();\n\n/** Convert string to lowercase */\nexport const lowercase: PipeFn<string, string> = (value) => String(value).toLowerCase();\n\n/** Capitalize first letter */\nexport const capitalize: PipeFn<string, string> = (value) => {\n const s = String(value);\n return s.charAt(0).toUpperCase() + s.slice(1);\n};\n\n/** Title case — capitalize each word */\nexport const titleCase: PipeFn<string, string> = (value) => {\n return String(value).replace(/\\b\\w/g, (c) => c.toUpperCase());\n};\n\n/** Trim whitespace */\nexport const trim: PipeFn<string, string> = (value) => String(value).trim();\n\n/**\n * Truncate string to a max length, adding ellipsis.\n *\n * ```ts\n * pipe('Hello World', truncate, 8); // 'Hello...'\n * ```\n */\nexport const truncate: PipeFn<string, string> = (value, maxLength: number = 50, suffix = '...') => {\n const s = String(value);\n if (s.length <= maxLength) return s;\n return s.slice(0, maxLength - suffix.length) + suffix;\n};\n\n/**\n * Format a date.\n *\n * ```ts\n * pipe(new Date(), date); // '3/29/2026'\n * pipe(new Date(), date, 'short'); // '3/29/26'\n * pipe(new Date(), date, 'long'); // 'March 29, 2026'\n * pipe(new Date(), date, 'time'); // '2:30 PM'\n * pipe(new Date(), date, 'iso'); // '2026-03-29T...'\n * ```\n */\nexport const date: PipeFn<Date | string | number, string> = (\n value,\n format: 'short' | 'medium' | 'long' | 'full' | 'time' | 'iso' = 'medium',\n locale?: string,\n) => {\n const d = value instanceof Date ? value : new Date(value);\n if (isNaN(d.getTime())) return String(value);\n\n if (format === 'iso') return d.toISOString();\n\n const loc = locale ?? 'en-US';\n\n const options: Record<string, Intl.DateTimeFormatOptions> = {\n short: { year: '2-digit', month: 'numeric', day: 'numeric' },\n medium: { year: 'numeric', month: 'numeric', day: 'numeric' },\n long: { year: 'numeric', month: 'long', day: 'numeric' },\n full: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' },\n time: { hour: 'numeric', minute: '2-digit' },\n };\n\n return new Intl.DateTimeFormat(loc, options[format]).format(d);\n};\n\n/**\n * Format a number as currency.\n *\n * ```ts\n * pipe(1234.5, currency); // '$1,234.50'\n * pipe(1234.5, currency, 'EUR'); // '€1,234.50'\n * ```\n */\nexport const currency: PipeFn<number, string> = (value, currencyCode = 'USD', locale?: string) => {\n return new Intl.NumberFormat(locale ?? 'en-US', {\n style: 'currency',\n currency: currencyCode,\n }).format(Number(value));\n};\n\n/**\n * Format a number with locale formatting.\n *\n * ```ts\n * pipe(1234567.89, number); // '1,234,567.89'\n * pipe(1234567.89, number, '0-2'); // '1,234,567.89' (0-2 decimal digits)\n * ```\n */\nexport const number: PipeFn<number, string> = (value, digitsInfo?: string, locale?: string) => {\n const opts: Intl.NumberFormatOptions = {};\n if (digitsInfo) {\n const [min, max] = digitsInfo.split('-').map(Number);\n opts.minimumFractionDigits = min;\n opts.maximumFractionDigits = max ?? min;\n }\n return new Intl.NumberFormat(locale ?? 'en-US', opts).format(Number(value));\n};\n\n/**\n * Format a number as a percentage.\n *\n * ```ts\n * pipe(0.85, percent); // '85%'\n * pipe(0.856, percent); // '86%'\n * ```\n */\nexport const percent: PipeFn<number, string> = (value, decimals = 0, locale?: string) => {\n return new Intl.NumberFormat(locale ?? 'en-US', {\n style: 'percent',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(Number(value));\n};\n\n/**\n * JSON stringify with formatting.\n *\n * ```ts\n * pipe({ a: 1 }, json); // '{\\n \"a\": 1\\n}'\n * pipe({ a: 1 }, json, 0); // '{\"a\":1}'\n * ```\n */\nexport const json: PipeFn<unknown, string> = (value, indent = 2) => {\n return JSON.stringify(value, null, indent);\n};\n\n/**\n * Pluralize a string based on count.\n *\n * ```ts\n * pipe(1, plural, 'item', 'items'); // '1 item'\n * pipe(5, plural, 'item', 'items'); // '5 items'\n * ```\n */\nexport const plural: PipeFn<number, string> = (value, singular: string, pluralForm?: string) => {\n const p = pluralForm ?? `${singular}s`;\n return `${value} ${value === 1 ? singular : p}`;\n};\n\n/**\n * Relative time formatting.\n *\n * ```ts\n * pipe(Date.now() - 60000, relativeTime); // '1 minute ago'\n * ```\n */\nexport const relativeTime: PipeFn<Date | number, string> = (value, locale?: string) => {\n const d = value instanceof Date ? value.getTime() : Number(value);\n const diff = d - Date.now();\n const absDiff = Math.abs(diff);\n\n const units: Array<[number, Intl.RelativeTimeFormatUnit]> = [\n [60000, 'second'],\n [3600000, 'minute'],\n [86400000, 'hour'],\n [2592000000, 'day'],\n [31536000000, 'month'],\n [Infinity, 'year'],\n ];\n\n const divisors: Record<string, number> = {\n second: 1000, minute: 60000, hour: 3600000,\n day: 86400000, month: 2592000000, year: 31536000000,\n };\n\n let unit: Intl.RelativeTimeFormatUnit = 'second';\n for (const [threshold, u] of units) {\n if (absDiff < threshold) { unit = u; break; }\n }\n\n const n = Math.round(diff / divisors[unit]);\n\n if (typeof Intl !== 'undefined' && Intl.RelativeTimeFormat) {\n return new Intl.RelativeTimeFormat(locale ?? 'en', { numeric: 'auto' }).format(n, unit);\n }\n\n const abs = Math.abs(n);\n const suffix = n < 0 ? 'ago' : 'from now';\n return `${abs} ${unit}${abs !== 1 ? 's' : ''} ${suffix}`;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');function j(t,e={}){let{trigger:n="viewport",loading:r,error:i,prefetch:u=false,minLoadTime:l=0,rootMargin:b="200px"}=e,f=null,a=null,c=null;function g(){if(a)return a;let p=Date.now();return a=t().then(async o=>{let d=Date.now()-p;l>0&&d<l&&await new Promise(v=>setTimeout(v,l-d)),f=o.default;}).catch(o=>{c=o instanceof Error?o:new Error(String(o));}),a}return u&&g(),chunkXWVNLE2W_cjs.s(p=>{let o=chunkWOZWFMOK_cjs.c("idle");async function v(){o()==="idle"&&(o.set("loading"),await g(),o.set(c?"error":"ready"));}return ()=>{let s=document.createElement("div");s.style.display="contents";let m=o();return m==="ready"&&f?(s.appendChild(f(p.props)),s):m==="error"&&i&&c?(s.appendChild(chunkXWVNLE2W_cjs.l(i(c))),s):(r&&m==="loading"&&s.appendChild(chunkXWVNLE2W_cjs.l(r())),m==="idle"&&w(s,n,v,b).then(C=>{}),s)}})}async function w(t,e,n,r){return e==="immediate"?(n(),()=>{}):e==="viewport"?E(t,n,r):e==="interaction"||e==="hover"?P(t,n,e):e==="idle"?L(n):typeof e=="object"&&e.type==="timer"?k(n,e.delay):typeof e=="object"&&e.type==="custom"?D(n,e.condition):(n(),()=>{})}function E(t,e,n){if(typeof IntersectionObserver>"u")return e(),()=>{};let r=new IntersectionObserver(i=>{i[0]?.isIntersecting&&(r.disconnect(),e());},{rootMargin:n});return requestAnimationFrame(()=>r.observe(t)),()=>r.disconnect()}function P(t,e,n){let r=n==="hover"?["mouseenter","focusin"]:["click","mouseenter","focusin","touchstart"],i=()=>{for(let u of r)t.removeEventListener(u,i);e();};for(let u of r)t.addEventListener(u,i,{once:true,passive:true});return ()=>{for(let u of r)t.removeEventListener(u,i);}}function L(t){if(typeof requestIdleCallback<"u"){let n=requestIdleCallback(()=>t());return ()=>cancelIdleCallback(n)}let e=setTimeout(t,200);return ()=>clearTimeout(e)}function k(t,e){let n=setTimeout(t,e);return ()=>clearTimeout(n)}function D(t,e){let n=()=>{e()?t():requestAnimationFrame(n);};return requestAnimationFrame(n),()=>{}}exports.a=j;//# sourceMappingURL=chunk-AZCELE44.cjs.map
2
+ //# sourceMappingURL=chunk-AZCELE44.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defer.ts"],"names":["defer","loader","options","trigger","loadingFn","errorFn","prefetch","minLoadTime","rootMargin","resolvedComp","loadPromise","loadError","startLoad","start","mod","elapsed","r","err","defineComponent","ctx","state","signal","triggerLoad","container","s","nodeToDOM","setupTrigger","cleanup","el","load","setupViewportTrigger","setupInteractionTrigger","setupIdleTrigger","setupTimerTrigger","setupCustomTrigger","observer","entries","type","events","handler","event","id","timer","delay","condition","check"],"mappings":"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","file":"chunk-AZCELE44.cjs","sourcesContent":["/**\n * Deferred loading with triggers.\n *\n * Lazy-load components based on viewport visibility, user interaction,\n * idle time, timer, hover, or custom conditions.\n *\n * ```ts\n * const LazyComments = defer(() => import('./Comments.akash'), {\n * trigger: 'viewport',\n * loading: () => <Skeleton variant=\"text\" />,\n * });\n *\n * const LazyChart = defer(() => import('./Chart.akash'), {\n * trigger: 'idle',\n * loading: () => <Spinner />,\n * });\n *\n * const LazyDropdown = defer(() => import('./Dropdown.akash'), {\n * trigger: 'interaction', // loads on hover/focus/click\n * });\n * ```\n */\n\nimport { signal } from './signals.js';\nimport { defineComponent } from './component.js';\nimport { nodeToDOM } from './dom.js';\nimport type { Component } from './component.js';\nimport type { AkashNode } from './types.js';\nimport type { ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type DeferTrigger =\n | 'immediate'\n | 'viewport'\n | 'interaction'\n | 'idle'\n | 'hover'\n | { type: 'timer'; delay: number }\n | { type: 'custom'; condition: () => boolean };\n\nexport interface DeferOptions {\n /** When to start loading (default: 'viewport') */\n trigger?: DeferTrigger;\n /** Loading placeholder */\n loading?: () => AkashNode;\n /** Error fallback */\n error?: (err: Error) => AkashNode;\n /** Prefetch — start loading early but don't render until triggered */\n prefetch?: boolean;\n /** Minimum loading time in ms (prevent flash of loading state) */\n minLoadTime?: number;\n /** Viewport root margin for 'viewport' trigger */\n rootMargin?: string;\n}\n\n// =========================================================================\n// defer()\n// =========================================================================\n\n/**\n * Create a deferred component that loads based on a trigger.\n */\nexport function defer<P extends Record<string, unknown>>(\n loader: () => Promise<{ default: Component<P> }>,\n options: DeferOptions = {},\n): Component<P> {\n const {\n trigger = 'viewport',\n loading: loadingFn,\n error: errorFn,\n prefetch = false,\n minLoadTime = 0,\n rootMargin = '200px',\n } = options;\n\n let resolvedComp: Component<P> | null = null;\n let loadPromise: Promise<void> | null = null;\n let loadError: Error | null = null;\n\n function startLoad(): Promise<void> {\n if (loadPromise) return loadPromise;\n\n const start = Date.now();\n loadPromise = loader()\n .then(async (mod) => {\n // Enforce minimum load time\n const elapsed = Date.now() - start;\n if (minLoadTime > 0 && elapsed < minLoadTime) {\n await new Promise((r) => setTimeout(r, minLoadTime - elapsed));\n }\n resolvedComp = mod.default;\n })\n .catch((err) => {\n loadError = err instanceof Error ? err : new Error(String(err));\n });\n\n return loadPromise;\n }\n\n // Prefetch if requested\n if (prefetch) startLoad();\n\n return defineComponent<P>((ctx) => {\n const state = signal<'idle' | 'loading' | 'ready' | 'error'>('idle');\n let triggerCleanup: (() => void) | null = null;\n\n async function triggerLoad(): Promise<void> {\n if (state() !== 'idle') return;\n state.set('loading');\n await startLoad();\n state.set(loadError ? 'error' : 'ready');\n }\n\n return () => {\n const container = document.createElement('div');\n container.style.display = 'contents';\n\n const s = state();\n\n if (s === 'ready' && resolvedComp) {\n container.appendChild(resolvedComp(ctx.props as any));\n return container;\n }\n\n if (s === 'error' && errorFn && loadError) {\n container.appendChild(nodeToDOM(errorFn(loadError)));\n return container;\n }\n\n // Show loading placeholder\n if (loadingFn && s === 'loading') {\n container.appendChild(nodeToDOM(loadingFn()));\n }\n\n // Set up trigger\n if (s === 'idle') {\n setupTrigger(container, trigger, triggerLoad, rootMargin).then((cleanup) => {\n triggerCleanup = cleanup;\n });\n }\n\n return container;\n };\n });\n}\n\n// =========================================================================\n// Trigger setup\n// =========================================================================\n\nasync function setupTrigger(\n el: HTMLElement,\n trigger: DeferTrigger,\n load: () => void,\n rootMargin: string,\n): Promise<() => void> {\n if (trigger === 'immediate') {\n load();\n return () => {};\n }\n\n if (trigger === 'viewport') {\n return setupViewportTrigger(el, load, rootMargin);\n }\n\n if (trigger === 'interaction' || trigger === 'hover') {\n return setupInteractionTrigger(el, load, trigger);\n }\n\n if (trigger === 'idle') {\n return setupIdleTrigger(load);\n }\n\n if (typeof trigger === 'object' && trigger.type === 'timer') {\n return setupTimerTrigger(load, trigger.delay);\n }\n\n if (typeof trigger === 'object' && trigger.type === 'custom') {\n return setupCustomTrigger(load, trigger.condition);\n }\n\n load();\n return () => {};\n}\n\nfunction setupViewportTrigger(\n el: HTMLElement,\n load: () => void,\n rootMargin: string,\n): () => void {\n if (typeof IntersectionObserver === 'undefined') {\n load();\n return () => {};\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n observer.disconnect();\n load();\n }\n },\n { rootMargin },\n );\n\n // Observe after element is in DOM\n requestAnimationFrame(() => observer.observe(el));\n return () => observer.disconnect();\n}\n\nfunction setupInteractionTrigger(\n el: HTMLElement,\n load: () => void,\n type: 'interaction' | 'hover',\n): () => void {\n const events = type === 'hover'\n ? ['mouseenter', 'focusin']\n : ['click', 'mouseenter', 'focusin', 'touchstart'];\n\n const handler = () => {\n for (const event of events) {\n el.removeEventListener(event, handler);\n }\n load();\n };\n\n for (const event of events) {\n el.addEventListener(event, handler, { once: true, passive: true });\n }\n\n return () => {\n for (const event of events) {\n el.removeEventListener(event, handler);\n }\n };\n}\n\nfunction setupIdleTrigger(load: () => void): () => void {\n if (typeof requestIdleCallback !== 'undefined') {\n const id = requestIdleCallback(() => load());\n return () => cancelIdleCallback(id);\n }\n // Fallback\n const timer = setTimeout(load, 200);\n return () => clearTimeout(timer);\n}\n\nfunction setupTimerTrigger(load: () => void, delay: number): () => void {\n const timer = setTimeout(load, delay);\n return () => clearTimeout(timer);\n}\n\nfunction setupCustomTrigger(load: () => void, condition: () => boolean): () => void {\n const check = () => {\n if (condition()) load();\n else requestAnimationFrame(check);\n };\n requestAnimationFrame(check);\n return () => {}; // Can't cancel rAF chain easily\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {c,d}from'./chunk-YXKQTEPR.js';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$1){let r,n;typeof i=="string"?(r=s,n=c$1??{}):(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]=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=c([]),g=c(false),v=c(n.presence??{}),x=c(new Map),T=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$1=s?.throttle??50,r=s?.target??(typeof document<"u"?document:null),n=c(0),t=c(0),o=0,l=null;function u(y){n.set(y.clientX),t.set(y.clientY);let m=Date.now();m-o>=c$1?(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$1-(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$1=s?.timeout??2e3,r=c(false),n=null;function t(){r.set(true),i.presence.set({...i.presence.peek?.()??{},typing:true}),n&&clearTimeout(n),n=setTimeout(o,c$1);}function o(){r.set(false),i.presence.set({...i.presence.peek?.()??{},typing:false}),n&&(clearTimeout(n),n=null);}let l=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}}export{h as a,L as b,W as c,_ as d,j as e,A as f};//# sourceMappingURL=chunk-BB7P6HTR.js.map
2
+ //# sourceMappingURL=chunk-BB7P6HTR.js.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-BB7P6HTR.js","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
+ import {c}from'./chunk-YXKQTEPR.js';var p=Symbol("deepSignal"),m=Symbol("deepRaw");function h(o){let u=c(0),a=JSON.parse(JSON.stringify(o)),f=new Map;function d(r){let e=f.get(r);return e||(e=c(0),f.set(r,e)),e}let l=false;function c$1(r){if(l)return;let e=f.get(r);e&&e.update(i=>i+1);}function T(r,e){l=true;try{return r()}finally{l=false,c$1(e);}}function y(r,e=[]){return new Proxy(r,{get(i,t,s){if(t==="$raw")return JSON.parse(JSON.stringify(a));if(t==="$signal")return ()=>(u(),JSON.parse(JSON.stringify(a)));if(t===p)return u;if(t===m)return a;let n=Reflect.get(i,t,s),g=[...e,String(t)].join(".");if(d(g)(),Array.isArray(i)&&typeof n=="function"&&new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]).has(String(t))){let w=e.join(".")||"__root";return (...b)=>T(()=>n.apply(i,b),w)}return n!==null&&typeof n=="object"?y(n,[...e,String(t)]):n},set(i,t,s){let n=Reflect.set(i,t,s);return c$1([...e,String(t)].join(".")),u.update(g=>g+1),n},deleteProperty(i,t){let s=Reflect.deleteProperty(i,t);return c$1([...e,String(t)].join(".")),u.update(n=>n+1),s}})}return y(a)}function N(o){return o.$raw??o}function D(o){if(o===null||typeof o!="object")return false;try{return o[p]!==void 0}catch{return false}}export{h as a,N as b,D as c};//# sourceMappingURL=chunk-BGSF77LF.js.map
2
+ //# sourceMappingURL=chunk-BGSF77LF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deep-signal.ts"],"names":["SIGNAL_KEY","RAW_KEY","deepSignal","initialValue","version","signal","raw","pathSignals","getPathSignal","path","s","batchedNotify","notifyPath","v","batchNotify","fn","createProxy","target","obj","prop","receiver","value","currentPath","arrPath","args","result","toRaw","proxy","isDeepSignal"],"mappings":"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","file":"chunk-BGSF77LF.js","sourcesContent":["/**\n * Deep reactive signals.\n *\n * Unlike regular signals that are shallow, deepSignal() tracks\n * nested property access and triggers updates when any nested\n * property changes.\n *\n * ```ts\n * const state = deepSignal({ user: { name: 'Alice', age: 30 }, items: [1, 2, 3] });\n * state.user.name; // 'Alice' (tracked)\n * state.user.name = 'Bob'; // triggers reactivity\n * state.items.push(4); // triggers reactivity\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport { batch } from './scheduler.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type DeepSignal<T> = T extends object\n ? { [K in keyof T]: DeepSignal<T[K]> } & { readonly $raw: T; readonly $signal: () => T }\n : T;\n\n// =========================================================================\n// deepSignal()\n// =========================================================================\n\nconst SIGNAL_KEY = Symbol('deepSignal');\nconst RAW_KEY = Symbol('deepRaw');\n\n/**\n * Create a deeply reactive signal. Nested property access is tracked,\n * and setting any nested property triggers updates.\n *\n * ```ts\n * const state = deepSignal({\n * user: { name: 'Alice', age: 30 },\n * todos: [{ text: 'Buy milk', done: false }],\n * });\n *\n * effect(() => {\n * console.log(state.user.name); // re-runs when name changes\n * });\n *\n * state.user.name = 'Bob'; // triggers the effect above\n * ```\n */\nexport function deepSignal<T extends object>(initialValue: T): DeepSignal<T> {\n const version = signal(0); // root-level signal for $signal compatibility\n const raw = JSON.parse(JSON.stringify(initialValue));\n\n // Per-path signals for fine-grained tracking\n const pathSignals = new Map<string, ReturnType<typeof signal<number>>>();\n\n function getPathSignal(path: string): ReturnType<typeof signal<number>> {\n let s = pathSignals.get(path);\n if (!s) {\n s = signal(0);\n pathSignals.set(path, s);\n }\n return s;\n }\n\n let batchedNotify = false;\n function notifyPath(path: string): void {\n if (batchedNotify) return;\n // Only notify the exact path that changed — not ancestors\n const s = pathSignals.get(path);\n if (s) s.update(v => v + 1);\n }\n function batchNotify(fn: () => unknown, path: string): unknown {\n batchedNotify = true;\n try {\n return fn();\n } finally {\n batchedNotify = false;\n notifyPath(path);\n }\n }\n\n function createProxy<O extends object>(target: O, path: string[] = []): DeepSignal<O> {\n return new Proxy(target, {\n get(obj, prop, receiver) {\n // Special properties\n if (prop === '$raw') return JSON.parse(JSON.stringify(raw));\n if (prop === '$signal') return () => { version(); return JSON.parse(JSON.stringify(raw)); };\n if (prop === SIGNAL_KEY) return version;\n if (prop === RAW_KEY) return raw;\n\n const value = Reflect.get(obj, prop, receiver);\n\n // Track read — use per-path signal for fine-grained reactivity\n const currentPath = [...path, String(prop)].join('.');\n getPathSignal(currentPath)();\n\n // Batch array mutation methods so they fire only one notification\n if (Array.isArray(obj) && typeof value === 'function') {\n const mutators = new Set(['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse', 'fill', 'copyWithin']);\n if (mutators.has(String(prop))) {\n const arrPath = path.join('.') || '__root';\n return (...args: unknown[]) => batchNotify(() => value.apply(obj, args), arrPath);\n }\n }\n\n // Wrap nested objects in proxies\n if (value !== null && typeof value === 'object') {\n return createProxy(value, [...path, String(prop)]);\n }\n\n return value;\n },\n\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n notifyPath([...path, String(prop)].join('.'));\n version.update(v => v + 1); // for $signal users only\n return result;\n },\n\n deleteProperty(obj, prop) {\n const result = Reflect.deleteProperty(obj, prop);\n notifyPath([...path, String(prop)].join('.'));\n version.update(v => v + 1); // for $signal users only\n return result;\n },\n }) as DeepSignal<O>;\n }\n\n // Wrap arrays to track mutation methods\n if (Array.isArray(raw)) {\n const arrayProxy = createProxy(raw);\n return arrayProxy as DeepSignal<T>;\n }\n\n return createProxy(raw);\n}\n\n/**\n * Get the raw (unwrapped) value from a deep signal.\n */\nexport function toRaw<T>(proxy: DeepSignal<T>): T {\n return (proxy as any).$raw ?? proxy;\n}\n\n/**\n * Check if a value is a deep signal proxy.\n */\nexport function isDeepSignal(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n try {\n return (value as any)[SIGNAL_KEY] !== undefined;\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ 'use strict';var b=new Set(["a","abbr","address","article","aside","b","bdi","bdo","blockquote","br","caption","cite","code","col","colgroup","dd","del","details","dfn","div","dl","dt","em","figcaption","figure","footer","h1","h2","h3","h4","h5","h6","header","hr","i","img","ins","kbd","li","main","mark","nav","ol","p","pre","q","rp","rt","ruby","s","samp","section","small","span","strong","sub","summary","sup","table","tbody","td","tfoot","th","thead","time","tr","u","ul","var","wbr"]),S=new Set(["alt","class","dir","href","id","lang","name","rel","src","style","tabindex","target","title","type","width","height","colspan","rowspan","scope","loading","decoding"]),w=/^(javascript|data|vbscript):/i,A=/^on/i;function O(e,n={}){if(typeof document>"u")return e.replace(/<[^>]*>/g,"");let{allowTags:r=[],allowAttrs:t=[],allowDataAttrs:o=true,allowAriaAttrs:s=true,allowStyle:i=false,tagFilter:a,attrFilter:u}=n,c=new Set([...b,...r]),f=new Set([...S,...t]);i||f.delete("style");let d=new DOMParser().parseFromString(e,"text/html");return h(d.body,c,f,o,s,a,u),d.body.innerHTML}function h(e,n,r,t,o,s,i){let a=Array.from(e.childNodes);for(let u of a)if(u.nodeType===Node.ELEMENT_NODE){let c=u,f=c.tagName.toLowerCase();if(!(s?s(f):n.has(f))){let l=document.createTextNode(c.textContent??"");e.replaceChild(l,u);continue}let y=Array.from(c.attributes);for(let l of y){let p=l.name.toLowerCase(),g=l.value;if(A.test(p)){c.removeAttribute(l.name);continue}if(!(p.startsWith("data-")&&t)&&!(p.startsWith("aria-")&&o)){if(i&&!i(p,g,f)){c.removeAttribute(l.name);continue}if(!r.has(p)){c.removeAttribute(l.name);continue}if((p==="href"||p==="src")&&w.test(g)){c.removeAttribute(l.name);continue}}}h(c,n,r,t,o,s,i);}}function v(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function k(e,n){return r=>{e.innerHTML=O(r,n);}}function P(e={}){let r={...{"default-src":["'self'"],"script-src":["'self'"],"style-src":["'self'","'unsafe-inline'"],"img-src":["'self'","data:","https:"],"font-src":["'self'","https:"],"connect-src":["'self'"],"frame-ancestors":["'none'"],"base-uri":["'self'"],"form-action":["'self'"],"object-src":["'none'"]},...e.directives};if(e.nonce){let t=`'nonce-${e.nonce}'`;r["script-src"]&&r["script-src"].push(t),r["style-src"]&&r["style-src"].push(t);}return e.reportUri&&(r["report-uri"]=[e.reportUri]),Object.entries(r).map(([t,o])=>`${t} ${o.join(" ")}`).join("; ")}function T(e={}){return e.reportOnly?"Content-Security-Policy-Report-Only":"Content-Security-Policy"}function E(e={}){let n={};if(e.csp!==false){let r=e.csp??{};n[T(r)]=P(r);}if(e.frameOptions!==false&&(n["X-Frame-Options"]=e.frameOptions??"DENY"),e.contentTypeOptions!==false&&(n["X-Content-Type-Options"]="nosniff"),n["X-XSS-Protection"]=e.xssProtection?"1; mode=block":"0",e.hsts!==false){let r=e.hsts??{maxAge:31536e3,includeSubDomains:true},t=`max-age=${r.maxAge}`;r.includeSubDomains&&(t+="; includeSubDomains"),r.preload&&(t+="; preload"),n["Strict-Transport-Security"]=t;}if(e.referrerPolicy!==false&&(n["Referrer-Policy"]=e.referrerPolicy??"strict-origin-when-cross-origin"),e.permissionsPolicy!==false){let r=e.permissionsPolicy??{camera:[],microphone:[],geolocation:[],payment:[]};n["Permissions-Policy"]=Object.entries(r).map(([t,o])=>`${t}=(${o.join(" ")})`).join(", ");}return e.coop!==false&&(n["Cross-Origin-Opener-Policy"]=e.coop??"same-origin"),e.coep!==false&&(n["Cross-Origin-Embedder-Policy"]=e.coep??"require-corp"),n}function x(e,...n){let r=new Set(["__proto__","constructor","prototype"]);for(let t of n)if(!(!t||typeof t!="object"))for(let o of Object.keys(t)){if(r.has(o))continue;let s=e[o],i=t[o];m(i)&&m(s)?e[o]=x({...s},i):e[o]=i;}return e}function R(e){if(e===null||typeof e!="object")return e;Object.freeze(e);for(let n of Object.values(e))typeof n=="object"&&n!==null&&R(n);return e}function m(e){return e!==null&&typeof e=="object"&&Object.getPrototypeOf(e)===Object.prototype}async function N(e,n="sha384"){let t=new TextEncoder().encode(e),o=n==="sha256"?"SHA-256":n==="sha384"?"SHA-384":"SHA-512",s=await crypto.subtle.digest(o,t),i=new Uint8Array(s),a=btoa(String.fromCharCode(...i));return `${n}-${a}`}function C(){let e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,n=>n.toString(16).padStart(2,"0")).join("")}function D(e={}){let{headerName:n="X-CSRF-Token",cookieName:r="csrf-token",tokenGenerator:t=C}=e,o=null;function s(){if(!o){if(typeof document<"u"){let a=document.cookie.match(new RegExp(`${r}=([^;]+)`));if(a)return o=a[1],o}o=t();}return o}return {interceptor:async(a,u)=>{let c=a.method.toUpperCase();return ["POST","PUT","PATCH","DELETE"].includes(c)&&a.headers.set(n,s()),u(a)},token:s,refresh(){o=t();}}}function H(e,n={}){if(e==null)return null;let{allowedHosts:r,allowedProtocols:t=["http:","https:"],allowRelative:o=true}=n;if(e.startsWith("/")&&!e.startsWith("//"))return o?e:null;try{let s=new URL(e);return !t.includes(s.protocol)||r&&!r.includes(s.hostname)?null:s.toString()}catch{return null}}function j(e){let{maxAttempts:n,windowMs:r}=e,t=[];return {check(){let o=Date.now();for(;t.length>0&&t[0]<o-r;)t.shift();return t.length>=n?false:(t.push(o),true)},remaining(){let o=Date.now();for(;t.length>0&&t[0]<o-r;)t.shift();return Math.max(0,n-t.length)},reset(){t.length=0;}}}
2
+ exports.a=O;exports.b=v;exports.c=k;exports.d=P;exports.e=T;exports.f=E;exports.g=x;exports.h=R;exports.i=N;exports.j=C;exports.k=D;exports.l=H;exports.m=j;//# sourceMappingURL=chunk-BHP3UTTQ.cjs.map
3
+ //# sourceMappingURL=chunk-BHP3UTTQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/security.ts"],"names":["SAFE_TAGS","SAFE_ATTRS","DANGEROUS_PROTOCOLS","DANGEROUS_ATTRS","sanitize","html","options","allowTags","allowAttrs","allowDataAttrs","allowAriaAttrs","allowStyle","tagFilter","attrFilter","allowedTags","allowedAttrs","doc","sanitizeNode","node","children","child","el","tag","text","attrs","attr","name","value","escapeHtml","str","createSafeHTML","generateCSP","config","directives","nonceValue","key","values","getCSPHeaderName","generateSecurityHeaders","headers","cspConfig","hsts","policy","safeMerge","target","sources","DANGEROUS_KEYS","source","targetVal","sourceVal","isPlainObject","deepFreeze","obj","val","generateSRI","content","algorithm","data","hashAlgo","hashBuffer","hashArray","base64","generateCSRFToken","array","b","createCSRFInterceptor","headerName","cookieName","tokenGenerator","token","getToken","match","request","next","method","sanitizeURL","url","allowedHosts","allowedProtocols","allowRelative","parsed","createRateLimiter","maxAttempts","windowMs","attempts","now"],"mappings":"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","file":"chunk-BHP3UTTQ.cjs","sourcesContent":["/**\n * Security module — built-in protection for AkashJS apps.\n *\n * Auto-sanitization, CSP support, prototype pollution prevention,\n * and secure defaults. AkashJS is secure by default.\n */\n\n// =========================================================================\n// HTML Sanitizer — DOMPurify-style, zero dependencies\n// =========================================================================\n\n/** Tags allowed by default in sanitized HTML */\nconst SAFE_TAGS = new Set([\n 'a', 'abbr', 'address', 'article', 'aside', 'b', 'bdi', 'bdo',\n 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup',\n 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 'figcaption',\n 'figure', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',\n 'hr', 'i', 'img', 'ins', 'kbd', 'li', 'main', 'mark', 'nav', 'ol',\n 'p', 'pre', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'small',\n 'span', 'strong', 'sub', 'summary', 'sup', 'table', 'tbody', 'td',\n 'tfoot', 'th', 'thead', 'time', 'tr', 'u', 'ul', 'var', 'wbr',\n]);\n\n/** Attributes allowed by default */\nconst SAFE_ATTRS = new Set([\n 'alt', 'class', 'dir', 'href', 'id', 'lang', 'name', 'rel',\n 'src', 'style', 'tabindex', 'target', 'title', 'type', 'width',\n 'height', 'colspan', 'rowspan', 'scope', 'loading', 'decoding',\n]);\n\n/** Dangerous URL protocols */\nconst DANGEROUS_PROTOCOLS = /^(javascript|data|vbscript):/i;\n\n/** Dangerous attribute names (event handlers) */\nconst DANGEROUS_ATTRS = /^on/i;\n\nexport interface SanitizeOptions {\n /** Additional allowed tags */\n allowTags?: string[];\n /** Additional allowed attributes */\n allowAttrs?: string[];\n /** Allow data-* attributes (default: true) */\n allowDataAttrs?: boolean;\n /** Allow aria-* attributes (default: true) */\n allowAriaAttrs?: boolean;\n /** Allow style attribute (default: false) */\n allowStyle?: boolean;\n /** Custom tag filter */\n tagFilter?: (tag: string) => boolean;\n /** Custom attribute filter */\n attrFilter?: (attr: string, value: string, tag: string) => boolean;\n}\n\n/**\n * Sanitize HTML string — remove dangerous tags, attributes, and URLs.\n *\n * ```ts\n * const safe = sanitize(userInput);\n * el.innerHTML = safe; // Safe from XSS\n *\n * // With options:\n * const safe = sanitize(html, { allowTags: ['iframe'], allowStyle: true });\n * ```\n */\nexport function sanitize(html: string, options: SanitizeOptions = {}): string {\n if (typeof document === 'undefined') {\n // SSR fallback — strip all tags\n return html.replace(/<[^>]*>/g, '');\n }\n\n const {\n allowTags = [],\n allowAttrs = [],\n allowDataAttrs = true,\n allowAriaAttrs = true,\n allowStyle = false,\n tagFilter,\n attrFilter,\n } = options;\n\n const allowedTags = new Set([...SAFE_TAGS, ...allowTags]);\n const allowedAttrs = new Set([...SAFE_ATTRS, ...allowAttrs]);\n\n if (!allowStyle) allowedAttrs.delete('style');\n\n // Parse HTML using browser's parser\n const doc = new DOMParser().parseFromString(html, 'text/html');\n sanitizeNode(doc.body, allowedTags, allowedAttrs, allowDataAttrs, allowAriaAttrs, tagFilter, attrFilter);\n\n return doc.body.innerHTML;\n}\n\nfunction sanitizeNode(\n node: Node,\n allowedTags: Set<string>,\n allowedAttrs: Set<string>,\n allowDataAttrs: boolean,\n allowAriaAttrs: boolean,\n tagFilter?: (tag: string) => boolean,\n attrFilter?: (attr: string, value: string, tag: string) => boolean,\n): void {\n const children = Array.from(node.childNodes);\n\n for (const child of children) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n\n // Check if tag is allowed\n const isAllowed = tagFilter ? tagFilter(tag) : allowedTags.has(tag);\n\n if (!isAllowed) {\n // Replace dangerous element with its text content\n const text = document.createTextNode(el.textContent ?? '');\n node.replaceChild(text, child);\n continue;\n }\n\n // Sanitize attributes\n const attrs = Array.from(el.attributes);\n for (const attr of attrs) {\n const name = attr.name.toLowerCase();\n const value = attr.value;\n\n // Always remove event handlers\n if (DANGEROUS_ATTRS.test(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Check data-* and aria-*\n if (name.startsWith('data-') && allowDataAttrs) continue;\n if (name.startsWith('aria-') && allowAriaAttrs) continue;\n\n // Custom filter\n if (attrFilter && !attrFilter(name, value, tag)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Check if attribute is allowed\n if (!allowedAttrs.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n\n // Sanitize URLs\n if ((name === 'href' || name === 'src') && DANGEROUS_PROTOCOLS.test(value)) {\n el.removeAttribute(attr.name);\n continue;\n }\n }\n\n // Recurse into children\n sanitizeNode(el, allowedTags, allowedAttrs, allowDataAttrs, allowAriaAttrs, tagFilter, attrFilter);\n }\n }\n}\n\n/**\n * Escape HTML entities — prevents XSS in text content.\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n/**\n * Create a safe HTML setter that sanitizes automatically.\n *\n * ```ts\n * const setHTML = createSafeHTML(el);\n * setHTML(userContent); // Auto-sanitized\n * ```\n */\nexport function createSafeHTML(el: HTMLElement, options?: SanitizeOptions): (html: string) => void {\n return (html: string) => {\n el.innerHTML = sanitize(html, options);\n };\n}\n\n// =========================================================================\n// CSP (Content Security Policy) Support\n// =========================================================================\n\nexport interface CSPConfig {\n /** Nonce for inline scripts/styles */\n nonce?: string;\n /** Report-only mode (default: false) */\n reportOnly?: boolean;\n /** Report URI for CSP violations */\n reportUri?: string;\n /** Custom directives */\n directives?: Record<string, string[]>;\n}\n\n/**\n * Generate a CSP header string.\n *\n * ```ts\n * const csp = generateCSP({\n * nonce: 'abc123',\n * directives: {\n * 'script-src': [\"'self'\"],\n * 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n * 'img-src': [\"'self'\", 'data:', 'https:'],\n * },\n * });\n * // \"script-src 'self' 'nonce-abc123'; style-src 'self' 'unsafe-inline'; ...\"\n * ```\n */\nexport function generateCSP(config: CSPConfig = {}): string {\n const defaults: Record<string, string[]> = {\n 'default-src': [\"'self'\"],\n 'script-src': [\"'self'\"],\n 'style-src': [\"'self'\", \"'unsafe-inline'\"],\n 'img-src': [\"'self'\", 'data:', 'https:'],\n 'font-src': [\"'self'\", 'https:'],\n 'connect-src': [\"'self'\"],\n 'frame-ancestors': [\"'none'\"],\n 'base-uri': [\"'self'\"],\n 'form-action': [\"'self'\"],\n 'object-src': [\"'none'\"],\n };\n\n const directives = { ...defaults, ...config.directives };\n\n // Add nonce\n if (config.nonce) {\n const nonceValue = `'nonce-${config.nonce}'`;\n if (directives['script-src']) {\n directives['script-src'].push(nonceValue);\n }\n if (directives['style-src']) {\n directives['style-src'].push(nonceValue);\n }\n }\n\n // Add report-uri\n if (config.reportUri) {\n directives['report-uri'] = [config.reportUri];\n }\n\n return Object.entries(directives)\n .map(([key, values]) => `${key} ${values.join(' ')}`)\n .join('; ');\n}\n\n/**\n * Get the CSP header name based on config.\n */\nexport function getCSPHeaderName(config: CSPConfig = {}): string {\n return config.reportOnly\n ? 'Content-Security-Policy-Report-Only'\n : 'Content-Security-Policy';\n}\n\n// =========================================================================\n// Security Headers (Helmet-like)\n// =========================================================================\n\nexport interface SecurityHeadersConfig {\n /** Content Security Policy (false to disable) */\n csp?: CSPConfig | false;\n /** X-Frame-Options (default: 'DENY') */\n frameOptions?: 'DENY' | 'SAMEORIGIN' | false;\n /** X-Content-Type-Options (default: 'nosniff') */\n contentTypeOptions?: boolean;\n /** X-XSS-Protection (default: '0' — let CSP handle it) */\n xssProtection?: boolean;\n /** Strict-Transport-Security */\n hsts?: { maxAge: number; includeSubDomains?: boolean; preload?: boolean } | false;\n /** Referrer-Policy (default: 'strict-origin-when-cross-origin') */\n referrerPolicy?: string | false;\n /** Permissions-Policy */\n permissionsPolicy?: Record<string, string[]> | false;\n /** Cross-Origin-Opener-Policy */\n coop?: 'same-origin' | 'same-origin-allow-popups' | 'unsafe-none' | false;\n /** Cross-Origin-Embedder-Policy */\n coep?: 'require-corp' | 'credentialless' | 'unsafe-none' | false;\n}\n\n/**\n * Generate security headers for SSR responses.\n *\n * ```ts\n * const headers = generateSecurityHeaders();\n * // Apply to your server response\n * for (const [name, value] of Object.entries(headers)) {\n * res.setHeader(name, value);\n * }\n * ```\n */\nexport function generateSecurityHeaders(config: SecurityHeadersConfig = {}): Record<string, string> {\n const headers: Record<string, string> = {};\n\n // CSP\n if (config.csp !== false) {\n const cspConfig = config.csp ?? {};\n headers[getCSPHeaderName(cspConfig)] = generateCSP(cspConfig);\n }\n\n // X-Frame-Options\n if (config.frameOptions !== false) {\n headers['X-Frame-Options'] = config.frameOptions ?? 'DENY';\n }\n\n // X-Content-Type-Options\n if (config.contentTypeOptions !== false) {\n headers['X-Content-Type-Options'] = 'nosniff';\n }\n\n // X-XSS-Protection (disabled by default — CSP is better)\n headers['X-XSS-Protection'] = config.xssProtection ? '1; mode=block' : '0';\n\n // HSTS\n if (config.hsts !== false) {\n const hsts = config.hsts ?? { maxAge: 31536000, includeSubDomains: true };\n let value = `max-age=${hsts.maxAge}`;\n if (hsts.includeSubDomains) value += '; includeSubDomains';\n if (hsts.preload) value += '; preload';\n headers['Strict-Transport-Security'] = value;\n }\n\n // Referrer-Policy\n if (config.referrerPolicy !== false) {\n headers['Referrer-Policy'] = config.referrerPolicy ?? 'strict-origin-when-cross-origin';\n }\n\n // Permissions-Policy\n if (config.permissionsPolicy !== false) {\n const policy = config.permissionsPolicy ?? {\n camera: [],\n microphone: [],\n geolocation: [],\n 'payment': [],\n };\n headers['Permissions-Policy'] = Object.entries(policy)\n .map(([key, values]) => `${key}=(${values.join(' ')})`)\n .join(', ');\n }\n\n // COOP\n if (config.coop !== false) {\n headers['Cross-Origin-Opener-Policy'] = config.coop ?? 'same-origin';\n }\n\n // COEP\n if (config.coep !== false) {\n headers['Cross-Origin-Embedder-Policy'] = config.coep ?? 'require-corp';\n }\n\n return headers;\n}\n\n// =========================================================================\n// Prototype Pollution Prevention\n// =========================================================================\n\n/**\n * Safe deep merge that prevents prototype pollution.\n * Will not set __proto__, constructor, or prototype keys.\n *\n * ```ts\n * const result = safeMerge(defaults, userConfig);\n * ```\n */\nexport function safeMerge<T extends Record<string, unknown>>(\n target: T,\n ...sources: Partial<T>[]\n): T {\n const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n for (const source of sources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const key of Object.keys(source)) {\n if (DANGEROUS_KEYS.has(key)) continue;\n\n const targetVal = (target as any)[key];\n const sourceVal = (source as any)[key];\n\n if (isPlainObject(sourceVal) && isPlainObject(targetVal)) {\n (target as any)[key] = safeMerge({ ...targetVal }, sourceVal);\n } else {\n (target as any)[key] = sourceVal;\n }\n }\n }\n\n return target;\n}\n\n/**\n * Freeze an object deeply — prevents any modification.\n */\nexport function deepFreeze<T>(obj: T): Readonly<T> {\n if (obj === null || typeof obj !== 'object') return obj;\n Object.freeze(obj);\n for (const value of Object.values(obj)) {\n if (typeof value === 'object' && value !== null) {\n deepFreeze(value);\n }\n }\n return obj;\n}\n\nfunction isPlainObject(val: unknown): val is Record<string, unknown> {\n return val !== null && typeof val === 'object' && Object.getPrototypeOf(val) === Object.prototype;\n}\n\n// =========================================================================\n// Subresource Integrity (SRI)\n// =========================================================================\n\n/**\n * Generate SRI hash for a script/style resource.\n * For use in <script integrity=\"...\"> and <link integrity=\"...\">.\n *\n * ```ts\n * // In Node.js build script:\n * const hash = await generateSRI(fileContent);\n * // 'sha384-...'\n * ```\n */\nexport async function generateSRI(content: string, algorithm: 'sha256' | 'sha384' | 'sha512' = 'sha384'): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(content);\n\n const hashAlgo = algorithm === 'sha256' ? 'SHA-256' : algorithm === 'sha384' ? 'SHA-384' : 'SHA-512';\n const hashBuffer = await crypto.subtle.digest(hashAlgo, data);\n const hashArray = new Uint8Array(hashBuffer);\n const base64 = btoa(String.fromCharCode(...hashArray));\n\n return `${algorithm}-${base64}`;\n}\n\n// =========================================================================\n// CSRF Protection\n// =========================================================================\n\n/**\n * Generate a CSRF token.\n */\nexport function generateCSRFToken(): string {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n}\n\n/**\n * Create an HTTP interceptor that attaches CSRF tokens.\n *\n * ```ts\n * const csrf = createCSRFInterceptor();\n * const http = createHttpClient({ interceptors: [csrf.interceptor] });\n * // Token is auto-attached to every mutation request\n * ```\n */\nexport function createCSRFInterceptor(options: {\n headerName?: string;\n cookieName?: string;\n tokenGenerator?: () => string;\n} = {}) {\n const {\n headerName = 'X-CSRF-Token',\n cookieName = 'csrf-token',\n tokenGenerator = generateCSRFToken,\n } = options;\n\n let token: string | null = null;\n\n function getToken(): string {\n if (!token) {\n // Try to read from cookie\n if (typeof document !== 'undefined') {\n const match = document.cookie.match(new RegExp(`${cookieName}=([^;]+)`));\n if (match) {\n token = match[1];\n return token;\n }\n }\n // Generate new token\n token = tokenGenerator();\n }\n return token;\n }\n\n const interceptor = async (request: Request, next: (req: Request) => Promise<Response>): Promise<Response> => {\n const method = request.method.toUpperCase();\n // Only attach to mutating requests\n if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {\n request.headers.set(headerName, getToken());\n }\n return next(request);\n };\n\n return {\n interceptor,\n token: getToken,\n refresh() { token = tokenGenerator(); },\n };\n}\n\n// =========================================================================\n// Input Validation\n// =========================================================================\n\n/**\n * Validate and sanitize a URL — prevent open redirect attacks.\n *\n * ```ts\n * const safe = sanitizeURL(userInput, { allowedHosts: ['example.com'] });\n * if (safe) window.location.href = safe;\n * ```\n */\nexport function sanitizeURL(url: string, options: {\n allowedHosts?: string[];\n allowedProtocols?: string[];\n allowRelative?: boolean;\n} = {}): string | null {\n if (url == null) return null;\n\n const {\n allowedHosts,\n allowedProtocols = ['http:', 'https:'],\n allowRelative = true,\n } = options;\n\n // Relative URLs\n if (url.startsWith('/') && !url.startsWith('//')) {\n return allowRelative ? url : null;\n }\n\n try {\n const parsed = new URL(url);\n\n // Check protocol\n if (!allowedProtocols.includes(parsed.protocol)) return null;\n\n // Check host\n if (allowedHosts && !allowedHosts.includes(parsed.hostname)) return null;\n\n return parsed.toString();\n } catch {\n return null;\n }\n}\n\n/**\n * Rate limiter for client-side actions (e.g., form submissions).\n *\n * ```ts\n * const limiter = createRateLimiter({ maxAttempts: 5, windowMs: 60000 });\n * if (!limiter.check()) {\n * toast.error('Too many attempts. Please wait.');\n * return;\n * }\n * ```\n */\nexport function createRateLimiter(options: {\n maxAttempts: number;\n windowMs: number;\n}) {\n const { maxAttempts, windowMs } = options;\n const attempts: number[] = [];\n\n return {\n check(): boolean {\n const now = Date.now();\n // Remove old attempts\n while (attempts.length > 0 && attempts[0] < now - windowMs) {\n attempts.shift();\n }\n if (attempts.length >= maxAttempts) return false;\n attempts.push(now);\n return true;\n },\n remaining(): number {\n const now = Date.now();\n while (attempts.length > 0 && attempts[0] < now - windowMs) {\n attempts.shift();\n }\n return Math.max(0, maxAttempts - attempts.length);\n },\n reset(): void {\n attempts.length = 0;\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import {c,d}from'./chunk-YXKQTEPR.js';async function j(a,t=1){return typeof indexedDB>"u"?Promise.reject(new Error("IndexedDB not available")):new Promise((d,r)=>{try{let n=indexedDB.open(a,t);n.onupgradeneeded=()=>{let i=n.result;i.objectStoreNames.contains("items")||i.createObjectStore("items"),i.objectStoreNames.contains("pending")||i.createObjectStore("pending",{autoIncrement:!0});},n.onsuccess=()=>d(n.result),n.onerror=()=>r(n.error??new Error("IndexedDB open failed"));}catch(n){r(n);}})}async function x(a,t){return new Promise((d,r)=>{let i=a.transaction(t,"readonly").objectStore(t).getAll();i.onsuccess=()=>d(i.result),i.onerror=()=>r(i.error);})}async function D(a,t,d,r){return new Promise((n,i)=>{let l=a.transaction(t,"readwrite");l.objectStore(t).put(r,d),l.oncomplete=()=>n(),l.onerror=()=>i(l.error);})}async function B(a,t,d){return new Promise((r,n)=>{let i=a.transaction(t,"readwrite");i.objectStore(t).delete(d),i.oncomplete=()=>r(),i.onerror=()=>n(i.error);})}async function p(a,t){return new Promise((d,r)=>{let n=a.transaction(t,"readwrite");n.objectStore(t).clear(),n.oncomplete=()=>d(),n.onerror=()=>r(n.error);})}function A(a,t={}){let d$1=t.keyField??"id",r=c([]),n=c([]),i=c(false),l=c(typeof navigator<"u"&&navigator.onLine!=null?!!navigator.onLine:true),b=d(()=>n().length),o=null,m=null,T=false;typeof window<"u"&&(window.addEventListener("online",()=>{l.set(true),v();}),window.addEventListener("offline",()=>l.set(false)));async function O(){if(!(typeof indexedDB>"u"))try{o=await j(`akash-offline-${a}`,t.version??1);let e=await x(o,"items");r.set(e);let s=await x(o,"pending");n.set(s);}catch(e){console.error("[AkashJS] Offline store init failed:",e);}}let k=O();if(t.sync){let e=t.sync.interval??3e4;m=setInterval(()=>{l()&&b()>0&&!i()&&v();},e);}function g(e){return String(e[d$1])}function w(e){let s=g(e);r.update(c=>{let f=c.findIndex(u=>g(u)===s);if(f!==-1){let u=[...c];return u[f]=e,u}return [...c,e]}),S({type:"put",key:s,value:e,timestamp:Date.now()}),o&&D(o,"items",s,e);}function I(e){r.update(s=>s.filter(c=>g(c)!==e)),S({type:"delete",key:e,timestamp:Date.now()}),o&&B(o,"items",e);}function S(e){n.update(s=>[...s,e]),o&&o.transaction("pending","readwrite").objectStore("pending").add(e);}async function v(){if(await k,!t.sync||i()||T)return;let e=n();if(e.length===0)return;i.set(true);let s=t.sync.fetch??globalThis.fetch.bind(globalThis);try{if((await s(t.sync.url,{method:"POST",headers:{"Content-Type":"application/json",...t.sync.headers},body:JSON.stringify({ops:e})})).ok){n.set([]),o&&await p(o,"pending");let f=await s(t.sync.url,{headers:t.sync.headers});if(f.ok){let u=await f.json();if(r.set(u),o){await p(o,"items");for(let P of u)await D(o,"items",g(P),P);}}}}catch(c){console.warn("[AkashJS] Offline sync failed:",c);}finally{i.set(false);}}return {items:()=>r(),data:()=>r(),get(e){return r().find(s=>g(s)===e)},put:w,add:w,update(e,s){let c=r().find(f=>g(f)===e);c&&w({...c,...s});},remove:I,clear(){r.set([]),n.set([]),o&&(p(o,"items"),p(o,"pending"));},pending:b,syncing:()=>i(),online:()=>l(),sync:v,dispose(){T=true,m&&clearInterval(m),o?.close();}}}export{A as a};//# sourceMappingURL=chunk-CP6SK2B4.js.map
2
+ //# sourceMappingURL=chunk-CP6SK2B4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/offline.ts"],"names":["openDB","name","version","resolve","reject","request","db","err","idbGetAll","store","req","idbPut","key","value","tx","idbDelete","idbClear","createOfflineStore","options","keyField","items","signal","pendingOps","syncing","online","pending","computed","syncTimer","disposed","syncNow","init","stored","ops","initPromise","interval","getKey","item","put","list","idx","i","next","queueOp","remove","op","fetchFn","serverResponse","serverItems","partial","existing"],"mappings":"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","file":"chunk-CP6SK2B4.js","sourcesContent":["/**\n * Offline-first store with IndexedDB persistence and background sync.\n *\n * Data persists across page reloads. Changes made offline queue up\n * and sync automatically when connection returns. Conflict resolution\n * via configurable strategies (last-write-wins, merge, custom).\n *\n * ```ts\n * const todos = createOfflineStore('todos', {\n * sync: { url: '/api/todos', strategy: 'last-write-wins' },\n * });\n *\n * todos.add({ id: '1', text: 'Buy milk', done: false });\n * todos.items(); // reactive list\n * todos.syncing(); // boolean\n * todos.pending(); // number of unsynced changes\n * ```\n */\n\nimport { signal, computed } from './signals.js';\nimport type { Signal, ReadonlySignal } from './signals.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport type ConflictStrategy = 'last-write-wins' | 'client-wins' | 'server-wins' | 'manual';\n\nexport interface OfflineStoreOptions<T> {\n /** Sync configuration */\n sync?: {\n /** Server URL for sync */\n url: string;\n /** Conflict resolution strategy (default: 'last-write-wins') */\n strategy?: ConflictStrategy;\n /** Sync interval in ms (default: 30000) */\n interval?: number;\n /** Custom fetch */\n fetch?: typeof globalThis.fetch;\n /** Auth headers */\n headers?: Record<string, string>;\n };\n /** Key field for items (default: 'id') */\n keyField?: string;\n /** Version for schema migrations */\n version?: number;\n}\n\nexport interface OfflineStore<T extends Record<string, unknown>> {\n /** All items (reactive) */\n items: ReadonlySignal<T[]>;\n /** Alias for items (reactive) */\n data: ReadonlySignal<T[]>;\n /** Get a single item by key */\n get(key: string): T | undefined;\n /** Add or update an item */\n put(item: T): void;\n /** Add a new item */\n add(item: T): void;\n /** Update an existing item */\n update(key: string, partial: Partial<T>): void;\n /** Remove an item by key */\n remove(key: string): void;\n /** Clear all items */\n clear(): void;\n /** Number of unsynced changes */\n pending: ReadonlySignal<number>;\n /** Whether sync is in progress */\n syncing: ReadonlySignal<boolean>;\n /** Whether online */\n online: ReadonlySignal<boolean>;\n /** Force a sync now */\n sync(): Promise<void>;\n /** Dispose the store (stop sync, close DB) */\n dispose(): void;\n}\n\n/** An operation in the change queue */\ninterface PendingOp<T> {\n type: 'put' | 'delete';\n key: string;\n value?: T;\n timestamp: number;\n}\n\n// =========================================================================\n// IndexedDB wrapper\n// =========================================================================\n\nasync function openDB(name: string, version = 1): Promise<IDBDatabase> {\n if (typeof indexedDB === 'undefined') {\n return Promise.reject(new Error('IndexedDB not available'));\n }\n return new Promise((resolve, reject) => {\n try {\n const request = indexedDB.open(name, version);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains('items')) {\n db.createObjectStore('items');\n }\n if (!db.objectStoreNames.contains('pending')) {\n db.createObjectStore('pending', { autoIncrement: true });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error ?? new Error('IndexedDB open failed'));\n } catch (err) {\n reject(err);\n }\n });\n}\n\nasync function idbGetAll<T>(db: IDBDatabase, store: string): Promise<T[]> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readonly');\n const req = tx.objectStore(store).getAll();\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(db: IDBDatabase, store: string, key: string, value: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).put(value, key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbDelete(db: IDBDatabase, store: string, key: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).delete(key);\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\nasync function idbClear(db: IDBDatabase, store: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const tx = db.transaction(store, 'readwrite');\n tx.objectStore(store).clear();\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n });\n}\n\n// =========================================================================\n// createOfflineStore\n// =========================================================================\n\n/**\n * Create an offline-first store backed by IndexedDB.\n */\nexport function createOfflineStore<T extends Record<string, unknown>>(\n name: string,\n options: OfflineStoreOptions<T> = {},\n): OfflineStore<T> {\n const keyField = options.keyField ?? 'id';\n const items = signal<T[]>([]);\n const pendingOps = signal<PendingOp<T>[]>([]);\n const syncing = signal(false);\n const online = signal(typeof navigator !== 'undefined' && navigator.onLine != null ? !!navigator.onLine : true);\n const pending = computed(() => pendingOps().length);\n\n let db: IDBDatabase | null = null;\n let syncTimer: ReturnType<typeof setInterval> | null = null;\n let disposed = false;\n\n // Online/offline tracking\n if (typeof window !== 'undefined') {\n window.addEventListener('online', () => {\n online.set(true);\n syncNow();\n });\n window.addEventListener('offline', () => online.set(false));\n }\n\n // Initialize — load from IndexedDB\n async function init(): Promise<void> {\n if (typeof indexedDB === 'undefined') return;\n try {\n db = await openDB(`akash-offline-${name}`, options.version ?? 1);\n const stored = await idbGetAll<T>(db, 'items');\n items.set(stored);\n const ops = await idbGetAll<PendingOp<T>>(db, 'pending');\n pendingOps.set(ops);\n } catch (err) { console.error('[AkashJS] Offline store init failed:', err); }\n }\n\n const initPromise = init();\n\n // Start periodic sync\n if (options.sync) {\n const interval = options.sync.interval ?? 30000;\n syncTimer = setInterval(() => {\n if (online() && pending() > 0 && !syncing()) {\n syncNow();\n }\n }, interval);\n }\n\n function getKey(item: T): string {\n return String((item as any)[keyField]);\n }\n\n function put(item: T): void {\n const key = getKey(item);\n items.update((list) => {\n const idx = list.findIndex((i) => getKey(i) === key);\n if (idx !== -1) {\n const next = [...list];\n next[idx] = item;\n return next;\n }\n return [...list, item];\n });\n\n queueOp({ type: 'put', key, value: item, timestamp: Date.now() });\n if (db) idbPut(db, 'items', key, item);\n }\n\n function remove(key: string): void {\n items.update((list) => list.filter((i) => getKey(i) !== key));\n queueOp({ type: 'delete', key, timestamp: Date.now() });\n if (db) idbDelete(db, 'items', key);\n }\n\n function queueOp(op: PendingOp<T>): void {\n pendingOps.update((ops) => [...ops, op]);\n if (db) {\n const tx = db.transaction('pending', 'readwrite');\n tx.objectStore('pending').add(op);\n }\n }\n\n async function syncNow(): Promise<void> {\n await initPromise;\n if (!options.sync || syncing() || disposed) return;\n const ops = pendingOps();\n if (ops.length === 0) return;\n\n syncing.set(true);\n const fetchFn = options.sync.fetch ?? globalThis.fetch.bind(globalThis);\n\n try {\n const response = await fetchFn(options.sync.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.sync.headers,\n },\n body: JSON.stringify({ ops }),\n });\n\n if (response.ok) {\n pendingOps.set([]);\n if (db) await idbClear(db, 'pending');\n\n // Fetch latest server state\n const serverResponse = await fetchFn(options.sync.url, {\n headers: options.sync.headers,\n });\n if (serverResponse.ok) {\n const serverItems = await serverResponse.json() as T[];\n items.set(serverItems);\n // Update IndexedDB\n if (db) {\n await idbClear(db, 'items');\n for (const item of serverItems) {\n await idbPut(db, 'items', getKey(item), item);\n }\n }\n }\n }\n } catch (err) { console.warn('[AkashJS] Offline sync failed:', err); }\n finally {\n syncing.set(false);\n }\n }\n\n return {\n items: () => items(),\n data: () => items(),\n get(key: string) { return items().find((i) => getKey(i) === key); },\n put,\n add: put,\n update(key: string, partial: Partial<T>) {\n const existing = items().find((i) => getKey(i) === key);\n if (existing) put({ ...existing, ...partial });\n },\n remove,\n clear() {\n items.set([]);\n pendingOps.set([]);\n if (db) {\n idbClear(db, 'items');\n idbClear(db, 'pending');\n }\n },\n pending,\n syncing: () => syncing(),\n online: () => online(),\n sync: syncNow,\n dispose() {\n disposed = true;\n if (syncTimer) clearInterval(syncTimer);\n db?.close();\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';function u(e,h,n={}){let{props:i=[],shadow:d=true,styles:t}=n;class s extends HTMLElement{static get observedAttributes(){return i}_root;_mounted=false;_props={};constructor(){super(),this._root=d?this.attachShadow({mode:"open"}):this;}connectedCallback(){for(let o of i){let r=this.getAttribute(o);r!==null&&(this._props[o]=l(r));}this._render(),this._mounted=true;}disconnectedCallback(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);this._mounted=false;}attributeChangedCallback(o,r,a){this._props[o]=a!==null?l(a):void 0,this._mounted&&this._render();}_render(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);if(d&&t){let r=document.createElement("style");r.textContent=t,this._root.appendChild(r);}let o=h(this._props);this._root.appendChild(o);}setProps(o){Object.assign(this._props,o),this._mounted&&this._render();}}return typeof customElements<"u"&&!customElements.get(e)&&(n.extends?customElements.define(e,s,{extends:n.extends}):customElements.define(e,s)),s}function c(e,h={}){let{props:n=[],shadow:i=true,styles:d}=h;return class extends HTMLElement{static get observedAttributes(){return n}_root;_mounted=false;_props={};constructor(){super(),this._root=i?this.attachShadow({mode:"open"}):this;}connectedCallback(){for(let t of n){let s=this.getAttribute(t);s!==null&&(this._props[t]=l(s));}this._render(),this._mounted=true;}disconnectedCallback(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);this._mounted=false;}attributeChangedCallback(t,s,p){this._props[t]=p!==null?l(p):void 0,this._mounted&&this._render();}_render(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);if(i&&d){let t=document.createElement("style");t.textContent=d,this._root.appendChild(t);}this._root.appendChild(e(this._props));}}}function l(e){try{return JSON.parse(e)}catch{return e}}exports.a=u;exports.b=c;//# sourceMappingURL=chunk-DFYXFKCH.cjs.map
2
+ //# sourceMappingURL=chunk-DFYXFKCH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/web-component.ts"],"names":["defineCustomElement","tagName","component","options","props","shadow","styles","AkashElement","prop","attr","parseAttributeValue","name","_oldValue","newValue","styleEl","node","newProps","toCustomElement","_old","val","s","value"],"mappings":"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","file":"chunk-DFYXFKCH.cjs","sourcesContent":["/**\n * Web Components output.\n *\n * Compile AkashJS components to native Custom Elements that can\n * be used in any framework or plain HTML.\n *\n * ```ts\n * import { defineCustomElement } from '@akashjs/runtime';\n * import Counter from './Counter.akash';\n *\n * defineCustomElement('my-counter', Counter, {\n * props: ['initial'],\n * shadow: true,\n * });\n *\n * // Now usable as: <my-counter initial=\"5\"></my-counter>\n * ```\n */\n\nimport type { Component } from './component.js';\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface CustomElementOptions {\n /** Props to observe as attributes */\n props?: string[];\n /** Use Shadow DOM (default: true) */\n shadow?: boolean;\n /** CSS styles to inject (for shadow DOM) */\n styles?: string;\n /** Extend an existing element */\n extends?: string;\n}\n\n// =========================================================================\n// defineCustomElement\n// =========================================================================\n\n/**\n * Register an AkashJS component as a Custom Element.\n *\n * ```ts\n * defineCustomElement('my-counter', Counter, {\n * props: ['initial', 'step'],\n * shadow: true,\n * styles: ':host { display: block; }',\n * });\n * ```\n */\nexport function defineCustomElement<P extends Record<string, unknown>>(\n tagName: string,\n component: Component<P>,\n options: CustomElementOptions = {},\n): typeof HTMLElement {\n const { props = [], shadow = true, styles } = options;\n\n class AkashElement extends HTMLElement {\n static get observedAttributes(): string[] {\n return props;\n }\n\n private _root: ShadowRoot | HTMLElement;\n private _mounted = false;\n private _props: Record<string, unknown> = {};\n\n constructor() {\n super();\n this._root = shadow ? this.attachShadow({ mode: 'open' }) : this;\n }\n\n connectedCallback(): void {\n // Read initial attribute values\n for (const prop of props) {\n const attr = this.getAttribute(prop);\n if (attr !== null) {\n this._props[prop] = parseAttributeValue(attr);\n }\n }\n\n this._render();\n this._mounted = true;\n }\n\n disconnectedCallback(): void {\n // Clear rendered content\n while (this._root.firstChild) {\n this._root.removeChild(this._root.firstChild);\n }\n this._mounted = false;\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this._props[name] = newValue !== null ? parseAttributeValue(newValue) : undefined;\n if (this._mounted) {\n this._render();\n }\n }\n\n private _render(): void {\n // Clear previous\n while (this._root.firstChild) {\n this._root.removeChild(this._root.firstChild);\n }\n\n // Inject styles if shadow DOM\n if (shadow && styles) {\n const styleEl = document.createElement('style');\n styleEl.textContent = styles;\n this._root.appendChild(styleEl);\n }\n\n // Render component\n const node = component(this._props as any);\n this._root.appendChild(node);\n }\n\n // Allow programmatic prop setting\n setProps(newProps: Partial<P>): void {\n Object.assign(this._props, newProps);\n if (this._mounted) this._render();\n }\n }\n\n // Register the custom element\n if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n if (options.extends) {\n customElements.define(tagName, AkashElement, { extends: options.extends });\n } else {\n customElements.define(tagName, AkashElement);\n }\n }\n\n return AkashElement;\n}\n\n/**\n * Convert an AkashJS component to a Custom Element class without registering.\n * Useful for testing or when you want to register later.\n */\nexport function toCustomElement<P extends Record<string, unknown>>(\n component: Component<P>,\n options: CustomElementOptions = {},\n): typeof HTMLElement {\n // Same implementation but without auto-registration\n const { props = [], shadow = true, styles } = options;\n\n return class extends HTMLElement {\n static get observedAttributes() { return props; }\n\n private _root: ShadowRoot | HTMLElement;\n private _mounted = false;\n private _props: Record<string, unknown> = {};\n\n constructor() {\n super();\n this._root = shadow ? this.attachShadow({ mode: 'open' }) : this;\n }\n\n connectedCallback() {\n for (const prop of props) {\n const attr = this.getAttribute(prop);\n if (attr !== null) this._props[prop] = parseAttributeValue(attr);\n }\n this._render();\n this._mounted = true;\n }\n\n disconnectedCallback() {\n while (this._root.firstChild) this._root.removeChild(this._root.firstChild);\n this._mounted = false;\n }\n\n attributeChangedCallback(name: string, _old: string | null, val: string | null) {\n this._props[name] = val !== null ? parseAttributeValue(val) : undefined;\n if (this._mounted) this._render();\n }\n\n private _render() {\n while (this._root.firstChild) this._root.removeChild(this._root.firstChild);\n if (shadow && styles) {\n const s = document.createElement('style');\n s.textContent = styles;\n this._root.appendChild(s);\n }\n this._root.appendChild(component(this._props as any));\n }\n } as any;\n}\n\n// =========================================================================\n// Helpers\n// =========================================================================\n\nfunction parseAttributeValue(value: string): unknown {\n // Try to parse as JSON (numbers, booleans, objects)\n try {\n return JSON.parse(value);\n } catch {\n return value; // Keep as string\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkXWVNLE2W_cjs=require('./chunk-XWVNLE2W.cjs'),chunkWOZWFMOK_cjs=require('./chunk-WOZWFMOK.cjs');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=chunkWOZWFMOK_cjs.c(0),c=chunkWOZWFMOK_cjs.c(t.containerHeight??400),u=t.overscan??3,m=chunkWOZWFMOK_cjs.d(()=>v(i(),c(),t.itemHeight,t.items().length,u)),s=chunkWOZWFMOK_cjs.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.set(e);}return {range:m,visibleItems:s,onScroll:a,setContainerHeight:n,scrollTop:(()=>i())}}var E=chunkXWVNLE2W_cjs.s(t=>{let{itemHeight:i,containerHeight:c,overscan:u=3}=t.props,m=chunkWOZWFMOK_cjs.c(0);return ()=>{let s=t.props.each,a=c??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=n.start;l<n.end;l++){let h=s[l];if(!h)continue;let g=chunkXWVNLE2W_cjs.l(t.props.children(h,l));g instanceof HTMLElement&&(g.style.height=`${i}px`),r.appendChild(g);}return o.appendChild(r),e.appendChild(o),e}});exports.a=v;exports.b=V;exports.c=E;//# sourceMappingURL=chunk-DHFVVFZF.cjs.map
2
+ //# sourceMappingURL=chunk-DHFVVFZF.cjs.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-DHFVVFZF.cjs","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,13 @@
1
+ 'use strict';function c(){return typeof document<"u"&&"startViewTransition"in document}function f(t,e={}){let{className:n,onBefore:o,onAfter:s,fallback:i="instant"}=e;if(o?.(),c()){n&&document.documentElement.classList.add(n);let a=document.startViewTransition(async()=>{await t();});return {finished:a.finished.then(()=>{n&&document.documentElement.classList.remove(n),s?.();}),updateCallbackDone:a.updateCallbackDone,ready:a.ready,skipTransition:()=>a.skipTransition()}}if(i==="fade")return m(t,e);let r=t(),d=r instanceof Promise?r:Promise.resolve();return s?.(),{finished:d,updateCallbackDone:d,ready:Promise.resolve(),skipTransition:()=>{}}}function u(t={}){let{duration:e="0.25s",easing:n="ease",oldAnimation:o,newAnimation:s}=t,i=`::view-transition-old(root),
2
+ ::view-transition-new(root) {
3
+ `;return i+=` animation-duration: ${e};
4
+ `,i+=` animation-timing-function: ${n};
5
+ `,i+=`}
6
+ `,o&&(i+=`::view-transition-old(root) {
7
+ animation-name: ${o};
8
+ }
9
+ `),s&&(i+=`::view-transition-new(root) {
10
+ animation-name: ${s};
11
+ }
12
+ `),i}function w(t,e){t.style.viewTransitionName=e;}function m(t,e){let n=document.documentElement,o=new Promise(async s=>{n.style.transition="opacity 0.15s ease",n.style.opacity="0",await new Promise(i=>setTimeout(i,150)),await t(),n.style.opacity="1",await new Promise(i=>setTimeout(i,150)),n.style.transition="",n.style.opacity="",e.onAfter?.(),s();});return {finished:o,updateCallbackDone:o,ready:Promise.resolve(),skipTransition:()=>{n.style.transition="",n.style.opacity="";}}}exports.a=c;exports.b=f;exports.c=u;exports.d=w;//# sourceMappingURL=chunk-DP7G45QM.cjs.map
13
+ //# sourceMappingURL=chunk-DP7G45QM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/view-transition.ts"],"names":["supportsViewTransitions","startViewTransition","updateCallback","options","className","onBefore","onAfter","fallback","transition","fadeTransition","result","done","viewTransitionCSS","config","duration","easing","oldAnimation","newAnimation","css","assignTransitionName","el","name","finished","resolve","r"],"mappings":"aAmDO,SAASA,CAAAA,EAAmC,CACjD,OAAO,OAAO,SAAa,GAAA,EAAe,qBAAA,GAAyB,QACrE,CAgBO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CAAiC,EAAC,CAClB,CAChB,GAAM,CAAE,SAAA,CAAAC,CAAAA,CAAW,QAAA,CAAAC,CAAAA,CAAU,QAAAC,CAAAA,CAAS,QAAA,CAAAC,CAAAA,CAAW,SAAU,CAAA,CAAIJ,CAAAA,CAK/D,GAHAE,CAAAA,KAGIL,CAAAA,EAAwB,CAAG,CACzBI,CAAAA,EAAW,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAIA,CAAS,CAAA,CAE/D,IAAMI,CAAAA,CAAc,QAAA,CAAiB,mBAAA,CAAoB,SAAY,CACnE,MAAMN,IACR,CAAC,CAAA,CAOD,OAAO,CACL,QAAA,CANeM,CAAAA,CAAW,QAAA,CAAS,KAAK,IAAM,CAC1CJ,CAAAA,EAAW,QAAA,CAAS,gBAAgB,SAAA,CAAU,MAAA,CAAOA,CAAS,CAAA,CAClEE,MACF,CAAC,CAAA,CAIC,kBAAA,CAAoBE,CAAAA,CAAW,kBAAA,CAC/B,KAAA,CAAOA,CAAAA,CAAW,MAClB,cAAA,CAAgB,IAAMA,CAAAA,CAAW,cAAA,EACnC,CACF,CAGA,GAAID,IAAa,MAAA,CACf,OAAOE,CAAAA,CAAeP,CAAAA,CAAgBC,CAAO,CAAA,CAI/C,IAAMO,CAAAA,CAASR,GAAe,CACxBS,CAAAA,CAAOD,CAAAA,YAAkB,OAAA,CAAUA,CAAAA,CAAS,OAAA,CAAQ,OAAA,EAAQ,CAElE,OAAAJ,CAAAA,IAAU,CAEH,CACL,QAAA,CAAUK,CAAAA,CACV,kBAAA,CAAoBA,CAAAA,CACpB,KAAA,CAAO,QAAQ,OAAA,EAAQ,CACvB,cAAA,CAAgB,IAAM,CAAC,CACzB,CACF,CAiBO,SAASC,CAAAA,CAAkBC,CAAAA,CAK9B,EAAC,CAAW,CACd,GAAM,CACJ,QAAA,CAAAC,EAAW,OAAA,CACX,MAAA,CAAAC,CAAAA,CAAS,MAAA,CACT,aAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAA,CAAIJ,EAEAK,CAAAA,CAAM,CAAA;AAAA;AAAA,CAAA,CACV,OAAAA,CAAAA,EAAO,CAAA,sBAAA,EAAyBJ,CAAQ,CAAA;AAAA,CAAA,CACxCI,CAAAA,EAAO,gCAAgCH,CAAM,CAAA;AAAA,CAAA,CAC7CG,CAAAA,EAAO,CAAA;AAAA,CAAA,CAEHF,IACFE,CAAAA,EAAO,CAAA;AAAA,kBAAA,EAAoDF,CAAY,CAAA;AAAA;AAAA,CAAA,CAAA,CAErEC,IACFC,CAAAA,EAAO,CAAA;AAAA,kBAAA,EAAoDD,CAAY,CAAA;AAAA;AAAA,CAAA,CAAA,CAGlEC,CACT,CAUO,SAASC,CAAAA,CAAqBC,EAAiBC,CAAAA,CAAoB,CACxED,EAAG,KAAA,CAAM,kBAAA,CAAqBC,EAChC,CAMA,SAASZ,EACPP,CAAAA,CACAC,CAAAA,CACgB,CAChB,IAAMiB,CAAAA,CAAK,QAAA,CAAS,eAAA,CAEdE,CAAAA,CAAW,IAAI,QAAc,MAAOC,CAAAA,EAAY,CAEpDH,CAAAA,CAAG,KAAA,CAAM,WAAa,oBAAA,CACtBA,CAAAA,CAAG,MAAM,OAAA,CAAU,GAAA,CAEnB,MAAM,IAAI,OAAA,CAASI,GAAM,UAAA,CAAWA,CAAAA,CAAG,GAAG,CAAC,CAAA,CAG3C,MAAMtB,CAAAA,EAAe,CAGrBkB,CAAAA,CAAG,MAAM,OAAA,CAAU,GAAA,CAEnB,MAAM,IAAI,OAAA,CAASI,GAAM,UAAA,CAAWA,CAAAA,CAAG,GAAG,CAAC,CAAA,CAE3CJ,EAAG,KAAA,CAAM,UAAA,CAAa,GACtBA,CAAAA,CAAG,KAAA,CAAM,QAAU,EAAA,CAEnBjB,CAAAA,CAAQ,OAAA,IAAU,CAClBoB,CAAAA,GACF,CAAC,CAAA,CAED,OAAO,CACL,QAAA,CAAAD,CAAAA,CACA,mBAAoBA,CAAAA,CACpB,KAAA,CAAO,OAAA,CAAQ,OAAA,EAAQ,CACvB,cAAA,CAAgB,IAAM,CACpBF,CAAAA,CAAG,MAAM,UAAA,CAAa,EAAA,CACtBA,EAAG,KAAA,CAAM,OAAA,CAAU,GACrB,CACF,CACF","file":"chunk-DP7G45QM.cjs","sourcesContent":["/**\n * View Transitions API integration.\n *\n * Wraps the browser's native View Transitions API for smooth\n * page transitions. Falls back gracefully when not supported.\n *\n * ```ts\n * // With router\n * const router = createRouter(routes);\n * enableViewTransitions(router);\n *\n * // Manual\n * await startViewTransition(() => {\n * updateDOM();\n * });\n * ```\n */\n\n// =========================================================================\n// Types\n// =========================================================================\n\nexport interface ViewTransitionOptions {\n /** CSS class to add to the document during transition */\n className?: string;\n /** Callback before the transition starts */\n onBefore?: () => void;\n /** Callback after the transition completes */\n onAfter?: () => void;\n /** Fallback behavior when API is not supported (default: 'instant') */\n fallback?: 'instant' | 'fade' | 'none';\n}\n\nexport interface ViewTransition {\n /** Promise that resolves when transition animation is complete */\n finished: Promise<void>;\n /** Promise that resolves when the DOM update callback has run */\n updateCallbackDone: Promise<void>;\n /** Promise that resolves when the transition is ready to animate */\n ready: Promise<void>;\n /** Skip the transition animation */\n skipTransition(): void;\n}\n\n// =========================================================================\n// Feature detection\n// =========================================================================\n\n/**\n * Check if the View Transitions API is supported.\n */\nexport function supportsViewTransitions(): boolean {\n return typeof document !== 'undefined' && 'startViewTransition' in document;\n}\n\n// =========================================================================\n// startViewTransition\n// =========================================================================\n\n/**\n * Start a view transition with the native API, falling back\n * to instant DOM update when not supported.\n *\n * ```ts\n * await startViewTransition(() => {\n * container.innerHTML = newContent;\n * });\n * ```\n */\nexport function startViewTransition(\n updateCallback: () => void | Promise<void>,\n options: ViewTransitionOptions = {},\n): ViewTransition {\n const { className, onBefore, onAfter, fallback = 'instant' } = options;\n\n onBefore?.();\n\n // Native View Transitions API\n if (supportsViewTransitions()) {\n if (className) document.documentElement.classList.add(className);\n\n const transition = (document as any).startViewTransition(async () => {\n await updateCallback();\n });\n\n const finished = transition.finished.then(() => {\n if (className) document.documentElement.classList.remove(className);\n onAfter?.();\n });\n\n return {\n finished,\n updateCallbackDone: transition.updateCallbackDone,\n ready: transition.ready,\n skipTransition: () => transition.skipTransition(),\n };\n }\n\n // Fallback\n if (fallback === 'fade') {\n return fadeTransition(updateCallback, options);\n }\n\n // Instant fallback\n const result = updateCallback();\n const done = result instanceof Promise ? result : Promise.resolve();\n\n onAfter?.();\n\n return {\n finished: done,\n updateCallbackDone: done,\n ready: Promise.resolve(),\n skipTransition: () => {},\n };\n}\n\n// =========================================================================\n// CSS helpers for View Transitions\n// =========================================================================\n\n/**\n * Generate CSS for customizing view transitions.\n *\n * ```ts\n * const css = viewTransitionCSS({\n * duration: '0.3s',\n * oldAnimation: 'slide-out-left',\n * newAnimation: 'slide-in-right',\n * });\n * ```\n */\nexport function viewTransitionCSS(config: {\n duration?: string;\n easing?: string;\n oldAnimation?: string;\n newAnimation?: string;\n} = {}): string {\n const {\n duration = '0.25s',\n easing = 'ease',\n oldAnimation,\n newAnimation,\n } = config;\n\n let css = `::view-transition-old(root),\\n::view-transition-new(root) {\\n`;\n css += ` animation-duration: ${duration};\\n`;\n css += ` animation-timing-function: ${easing};\\n`;\n css += `}\\n`;\n\n if (oldAnimation) {\n css += `::view-transition-old(root) {\\n animation-name: ${oldAnimation};\\n}\\n`;\n }\n if (newAnimation) {\n css += `::view-transition-new(root) {\\n animation-name: ${newAnimation};\\n}\\n`;\n }\n\n return css;\n}\n\n/**\n * Assign a view-transition-name to an element for per-element transitions.\n *\n * ```ts\n * assignTransitionName(headerEl, 'page-header');\n * assignTransitionName(contentEl, 'page-content');\n * ```\n */\nexport function assignTransitionName(el: HTMLElement, name: string): void {\n el.style.viewTransitionName = name;\n}\n\n// =========================================================================\n// Fade fallback (for browsers without View Transitions)\n// =========================================================================\n\nfunction fadeTransition(\n updateCallback: () => void | Promise<void>,\n options: ViewTransitionOptions,\n): ViewTransition {\n const el = document.documentElement;\n\n const finished = new Promise<void>(async (resolve) => {\n // Fade out\n el.style.transition = 'opacity 0.15s ease';\n el.style.opacity = '0';\n\n await new Promise((r) => setTimeout(r, 150));\n\n // Update DOM\n await updateCallback();\n\n // Fade in\n el.style.opacity = '1';\n\n await new Promise((r) => setTimeout(r, 150));\n\n el.style.transition = '';\n el.style.opacity = '';\n\n options.onAfter?.();\n resolve();\n });\n\n return {\n finished,\n updateCallbackDone: finished,\n ready: Promise.resolve(),\n skipTransition: () => {\n el.style.transition = '';\n el.style.opacity = '';\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 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"]);export{p as a,u as b,f as c};//# sourceMappingURL=chunk-E6RB7PRO.js.map
2
+ //# sourceMappingURL=chunk-E6RB7PRO.js.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-E6RB7PRO.js","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,2 @@
1
+ function u(e,h,n={}){let{props:i=[],shadow:d=true,styles:t}=n;class s extends HTMLElement{static get observedAttributes(){return i}_root;_mounted=false;_props={};constructor(){super(),this._root=d?this.attachShadow({mode:"open"}):this;}connectedCallback(){for(let o of i){let r=this.getAttribute(o);r!==null&&(this._props[o]=l(r));}this._render(),this._mounted=true;}disconnectedCallback(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);this._mounted=false;}attributeChangedCallback(o,r,a){this._props[o]=a!==null?l(a):void 0,this._mounted&&this._render();}_render(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);if(d&&t){let r=document.createElement("style");r.textContent=t,this._root.appendChild(r);}let o=h(this._props);this._root.appendChild(o);}setProps(o){Object.assign(this._props,o),this._mounted&&this._render();}}return typeof customElements<"u"&&!customElements.get(e)&&(n.extends?customElements.define(e,s,{extends:n.extends}):customElements.define(e,s)),s}function c(e,h={}){let{props:n=[],shadow:i=true,styles:d}=h;return class extends HTMLElement{static get observedAttributes(){return n}_root;_mounted=false;_props={};constructor(){super(),this._root=i?this.attachShadow({mode:"open"}):this;}connectedCallback(){for(let t of n){let s=this.getAttribute(t);s!==null&&(this._props[t]=l(s));}this._render(),this._mounted=true;}disconnectedCallback(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);this._mounted=false;}attributeChangedCallback(t,s,p){this._props[t]=p!==null?l(p):void 0,this._mounted&&this._render();}_render(){for(;this._root.firstChild;)this._root.removeChild(this._root.firstChild);if(i&&d){let t=document.createElement("style");t.textContent=d,this._root.appendChild(t);}this._root.appendChild(e(this._props));}}}function l(e){try{return JSON.parse(e)}catch{return e}}export{u as a,c as b};//# sourceMappingURL=chunk-F4FXIPR3.js.map
2
+ //# sourceMappingURL=chunk-F4FXIPR3.js.map