@saolabs/client 1.0.0 → 1.0.2

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 (378) hide show
  1. package/README.md +52 -195
  2. package/dist/index.d.ts +20 -5
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +14 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/plugins.d.ts +2 -2
  7. package/dist/plugins.js +2 -2
  8. package/dist/src/core/app/Application.d.ts +17 -15
  9. package/dist/src/core/app/Application.d.ts.map +1 -1
  10. package/dist/src/core/app/Application.js +41 -18
  11. package/dist/src/core/app/Application.js.map +1 -1
  12. package/dist/src/core/bootstrap/app.d.ts +1 -1
  13. package/dist/src/core/bootstrap/app.d.ts.map +1 -1
  14. package/dist/src/core/bootstrap/app.js +74 -4
  15. package/dist/src/core/bootstrap/app.js.map +1 -1
  16. package/dist/src/core/bootstrap/bundle.d.ts +41 -0
  17. package/dist/src/core/bootstrap/bundle.d.ts.map +1 -0
  18. package/dist/src/core/bootstrap/bundle.js +98 -0
  19. package/dist/src/core/bootstrap/bundle.js.map +1 -0
  20. package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts +1 -1
  21. package/dist/src/core/bootstrap/providers/ApiServiceProvider.d.ts.map +1 -1
  22. package/dist/src/core/bootstrap/providers/ApiServiceProvider.js +3 -3
  23. package/dist/src/core/bootstrap/providers/ApiServiceProvider.js.map +1 -1
  24. package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts +1 -1
  25. package/dist/src/core/bootstrap/providers/CoreServiceProvider.d.ts.map +1 -1
  26. package/dist/src/core/bootstrap/providers/CoreServiceProvider.js +11 -8
  27. package/dist/src/core/bootstrap/providers/CoreServiceProvider.js.map +1 -1
  28. package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts +3 -1
  29. package/dist/src/core/bootstrap/providers/HelperServiceProvider.d.ts.map +1 -1
  30. package/dist/src/core/bootstrap/providers/HelperServiceProvider.js +8 -3
  31. package/dist/src/core/bootstrap/providers/HelperServiceProvider.js.map +1 -1
  32. package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts +2 -1
  33. package/dist/src/core/bootstrap/providers/RouteServiceProvider.d.ts.map +1 -1
  34. package/dist/src/core/bootstrap/providers/RouteServiceProvider.js +14 -4
  35. package/dist/src/core/bootstrap/providers/RouteServiceProvider.js.map +1 -1
  36. package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts +4 -4
  37. package/dist/src/core/bootstrap/providers/ServiceProvider.d.ts.map +1 -1
  38. package/dist/src/core/bootstrap/providers/ServiceProvider.js +5 -5
  39. package/dist/src/core/bootstrap/providers/ServiceProvider.js.map +1 -1
  40. package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts +1 -1
  41. package/dist/src/core/bootstrap/providers/ViewServiceProvider.d.ts.map +1 -1
  42. package/dist/src/core/bootstrap/providers/ViewServiceProvider.js +3 -3
  43. package/dist/src/core/bootstrap/providers/ViewServiceProvider.js.map +1 -1
  44. package/dist/src/core/bootstrap/providers/default-providers.d.ts +1 -1
  45. package/dist/src/core/bootstrap/providers/default-providers.d.ts.map +1 -1
  46. package/dist/src/core/bootstrap/providers/default-providers.js +44 -11
  47. package/dist/src/core/bootstrap/providers/default-providers.js.map +1 -1
  48. package/dist/src/core/bootstrap/providers/index.d.ts +9 -9
  49. package/dist/src/core/bootstrap/providers/index.d.ts.map +1 -1
  50. package/dist/src/core/bootstrap/providers/index.js +8 -8
  51. package/dist/src/core/bootstrap/providers/index.js.map +1 -1
  52. package/dist/src/core/bootstrap/providers/provider-order.d.ts +1 -1
  53. package/dist/src/core/bootstrap/providers/provider-order.d.ts.map +1 -1
  54. package/dist/src/core/bootstrap/ssr.d.ts +47 -0
  55. package/dist/src/core/bootstrap/ssr.d.ts.map +1 -0
  56. package/dist/src/core/bootstrap/ssr.js +125 -0
  57. package/dist/src/core/bootstrap/ssr.js.map +1 -0
  58. package/dist/src/core/cache/ViewCache.d.ts +1 -1
  59. package/dist/src/core/cache/ViewCache.d.ts.map +1 -1
  60. package/dist/src/core/cache/index.d.ts +1 -1
  61. package/dist/src/core/cache/index.d.ts.map +1 -1
  62. package/dist/src/core/cache/index.js +1 -1
  63. package/dist/src/core/cache/index.js.map +1 -1
  64. package/dist/src/core/contracts/ApplicationInterface.d.ts +13 -11
  65. package/dist/src/core/contracts/ApplicationInterface.d.ts.map +1 -1
  66. package/dist/src/core/contracts/BlockInterface.d.ts +10 -10
  67. package/dist/src/core/contracts/BlockInterface.d.ts.map +1 -1
  68. package/dist/src/core/contracts/BundleInterface.d.ts +38 -0
  69. package/dist/src/core/contracts/BundleInterface.d.ts.map +1 -0
  70. package/dist/src/core/contracts/BundleInterface.js +2 -0
  71. package/dist/src/core/contracts/BundleInterface.js.map +1 -0
  72. package/dist/src/core/contracts/ComponentInterface.d.ts +7 -6
  73. package/dist/src/core/contracts/ComponentInterface.d.ts.map +1 -1
  74. package/dist/src/core/contracts/ElementInterface.d.ts +91 -27
  75. package/dist/src/core/contracts/ElementInterface.d.ts.map +1 -1
  76. package/dist/src/core/contracts/HeadServiceInterface.d.ts +37 -0
  77. package/dist/src/core/contracts/HeadServiceInterface.d.ts.map +1 -0
  78. package/dist/src/core/contracts/HeadServiceInterface.js +3 -0
  79. package/dist/src/core/contracts/HeadServiceInterface.js.map +1 -0
  80. package/dist/src/core/contracts/HelperInterface.d.ts +9 -1
  81. package/dist/src/core/contracts/HelperInterface.d.ts.map +1 -1
  82. package/dist/src/core/contracts/HttpServiceInterface.d.ts +3 -0
  83. package/dist/src/core/contracts/HttpServiceInterface.d.ts.map +1 -1
  84. package/dist/src/core/contracts/MarkerInterface.d.ts +29 -44
  85. package/dist/src/core/contracts/MarkerInterface.d.ts.map +1 -1
  86. package/dist/src/core/contracts/ReactiveInterface.d.ts +9 -9
  87. package/dist/src/core/contracts/ReactiveInterface.d.ts.map +1 -1
  88. package/dist/src/core/contracts/RouterInterface.d.ts +5 -2
  89. package/dist/src/core/contracts/RouterInterface.d.ts.map +1 -1
  90. package/dist/src/core/contracts/SectionInterface.d.ts +48 -0
  91. package/dist/src/core/contracts/SectionInterface.d.ts.map +1 -0
  92. package/dist/src/core/contracts/SectionInterface.js +2 -0
  93. package/dist/src/core/contracts/SectionInterface.js.map +1 -0
  94. package/dist/src/core/contracts/ServiceProviderInterface.d.ts +3 -3
  95. package/dist/src/core/contracts/ServiceProviderInterface.d.ts.map +1 -1
  96. package/dist/src/core/contracts/ViewControllerInterface.d.ts +116 -15
  97. package/dist/src/core/contracts/ViewControllerInterface.d.ts.map +1 -1
  98. package/dist/src/core/contracts/ViewInterface.d.ts +31 -5
  99. package/dist/src/core/contracts/ViewInterface.d.ts.map +1 -1
  100. package/dist/src/core/contracts/ViewManagerInterface.d.ts +47 -5
  101. package/dist/src/core/contracts/ViewManagerInterface.d.ts.map +1 -1
  102. package/dist/src/core/contracts/ViewStateInterface.d.ts +39 -2
  103. package/dist/src/core/contracts/ViewStateInterface.d.ts.map +1 -1
  104. package/dist/src/core/contracts/common.d.ts +3 -3
  105. package/dist/src/core/contracts/common.js +3 -3
  106. package/dist/src/core/contracts/utils.d.ts +19 -19
  107. package/dist/src/core/contracts/utils.d.ts.map +1 -1
  108. package/dist/src/core/contracts/views.d.ts +1 -22
  109. package/dist/src/core/contracts/views.d.ts.map +1 -1
  110. package/dist/src/core/devtools/hook.d.ts +66 -0
  111. package/dist/src/core/devtools/hook.d.ts.map +1 -0
  112. package/dist/src/core/devtools/hook.js +114 -0
  113. package/dist/src/core/devtools/hook.js.map +1 -0
  114. package/dist/src/core/devtools/index.d.ts +34 -0
  115. package/dist/src/core/devtools/index.d.ts.map +1 -0
  116. package/dist/src/core/devtools/index.js +33 -0
  117. package/dist/src/core/devtools/index.js.map +1 -0
  118. package/dist/src/core/devtools/inspector.d.ts +31 -0
  119. package/dist/src/core/devtools/inspector.d.ts.map +1 -0
  120. package/dist/src/core/devtools/inspector.js +249 -0
  121. package/dist/src/core/devtools/inspector.js.map +1 -0
  122. package/dist/src/core/elements/Block.d.ts +9 -7
  123. package/dist/src/core/elements/Block.d.ts.map +1 -1
  124. package/dist/src/core/elements/Block.js +33 -9
  125. package/dist/src/core/elements/Block.js.map +1 -1
  126. package/dist/src/core/elements/BlockOutlet.d.ts +19 -8
  127. package/dist/src/core/elements/BlockOutlet.d.ts.map +1 -1
  128. package/dist/src/core/elements/BlockOutlet.js +57 -13
  129. package/dist/src/core/elements/BlockOutlet.js.map +1 -1
  130. package/dist/src/core/elements/Component.d.ts +83 -11
  131. package/dist/src/core/elements/Component.d.ts.map +1 -1
  132. package/dist/src/core/elements/Component.js +334 -13
  133. package/dist/src/core/elements/Component.js.map +1 -1
  134. package/dist/src/core/elements/ForeachSlotCache.d.ts +95 -0
  135. package/dist/src/core/elements/ForeachSlotCache.d.ts.map +1 -0
  136. package/dist/src/core/elements/ForeachSlotCache.js +149 -0
  137. package/dist/src/core/elements/ForeachSlotCache.js.map +1 -0
  138. package/dist/src/core/elements/Fragment.d.ts +19 -13
  139. package/dist/src/core/elements/Fragment.d.ts.map +1 -1
  140. package/dist/src/core/elements/Fragment.js +43 -20
  141. package/dist/src/core/elements/Fragment.js.map +1 -1
  142. package/dist/src/core/elements/Html.d.ts +89 -12
  143. package/dist/src/core/elements/Html.d.ts.map +1 -1
  144. package/dist/src/core/elements/Html.js +707 -106
  145. package/dist/src/core/elements/Html.js.map +1 -1
  146. package/dist/src/core/elements/Output.d.ts +34 -10
  147. package/dist/src/core/elements/Output.d.ts.map +1 -1
  148. package/dist/src/core/elements/Output.js +141 -26
  149. package/dist/src/core/elements/Output.js.map +1 -1
  150. package/dist/src/core/elements/Reactive.d.ts +85 -14
  151. package/dist/src/core/elements/Reactive.d.ts.map +1 -1
  152. package/dist/src/core/elements/Reactive.js +315 -41
  153. package/dist/src/core/elements/Reactive.js.map +1 -1
  154. package/dist/src/core/elements/TextElement.d.ts +11 -7
  155. package/dist/src/core/elements/TextElement.d.ts.map +1 -1
  156. package/dist/src/core/elements/TextElement.js +18 -11
  157. package/dist/src/core/elements/TextElement.js.map +1 -1
  158. package/dist/src/core/elements/Wrapper.d.ts +24 -13
  159. package/dist/src/core/elements/Wrapper.d.ts.map +1 -1
  160. package/dist/src/core/elements/Wrapper.js +65 -8
  161. package/dist/src/core/elements/Wrapper.js.map +1 -1
  162. package/dist/src/core/elements/Yield.d.ts +10 -9
  163. package/dist/src/core/elements/Yield.d.ts.map +1 -1
  164. package/dist/src/core/elements/Yield.js +31 -19
  165. package/dist/src/core/elements/Yield.js.map +1 -1
  166. package/dist/src/core/elements/helpers.d.ts +7 -7
  167. package/dist/src/core/elements/helpers.d.ts.map +1 -1
  168. package/dist/src/core/elements/helpers.js +4 -4
  169. package/dist/src/core/elements/index.d.ts +12 -11
  170. package/dist/src/core/elements/index.d.ts.map +1 -1
  171. package/dist/src/core/elements/index.js +12 -11
  172. package/dist/src/core/elements/index.js.map +1 -1
  173. package/dist/src/core/elements/reconcileChildren.d.ts +7 -0
  174. package/dist/src/core/elements/reconcileChildren.d.ts.map +1 -0
  175. package/dist/src/core/elements/reconcileChildren.js +74 -0
  176. package/dist/src/core/elements/reconcileChildren.js.map +1 -0
  177. package/dist/src/core/hellpers/utils.d.ts +2 -2
  178. package/dist/src/core/hellpers/utils.js +4 -4
  179. package/dist/src/core/helpers/ApiClient.d.ts +58 -0
  180. package/dist/src/core/helpers/ApiClient.d.ts.map +1 -0
  181. package/dist/src/core/helpers/ApiClient.js +131 -0
  182. package/dist/src/core/helpers/ApiClient.js.map +1 -0
  183. package/dist/src/core/helpers/app.d.ts +3 -0
  184. package/dist/src/core/helpers/app.d.ts.map +1 -0
  185. package/dist/src/core/helpers/app.js +63 -0
  186. package/dist/src/core/helpers/app.js.map +1 -0
  187. package/dist/src/core/helpers/transition.d.ts +34 -0
  188. package/dist/src/core/helpers/transition.d.ts.map +1 -0
  189. package/dist/src/core/helpers/transition.js +118 -0
  190. package/dist/src/core/helpers/transition.js.map +1 -0
  191. package/dist/src/core/helpers/utils.d.ts +26 -0
  192. package/dist/src/core/helpers/utils.d.ts.map +1 -0
  193. package/dist/src/core/helpers/utils.js +96 -0
  194. package/dist/src/core/helpers/utils.js.map +1 -0
  195. package/dist/src/core/helpers/view.d.ts +39 -0
  196. package/dist/src/core/helpers/view.d.ts.map +1 -0
  197. package/dist/src/core/helpers/view.js +286 -0
  198. package/dist/src/core/helpers/view.js.map +1 -0
  199. package/dist/src/core/routers/Router.d.ts +108 -7
  200. package/dist/src/core/routers/Router.d.ts.map +1 -1
  201. package/dist/src/core/routers/Router.js +444 -68
  202. package/dist/src/core/routers/Router.js.map +1 -1
  203. package/dist/src/core/routers/index.d.ts +2 -2
  204. package/dist/src/core/routers/index.d.ts.map +1 -1
  205. package/dist/src/core/routers/index.js +1 -1
  206. package/dist/src/core/routers/index.js.map +1 -1
  207. package/dist/src/core/services/AssetManager.d.ts +112 -0
  208. package/dist/src/core/services/AssetManager.d.ts.map +1 -0
  209. package/dist/src/core/services/AssetManager.js +361 -0
  210. package/dist/src/core/services/AssetManager.js.map +1 -0
  211. package/dist/src/core/services/BlockManager.d.ts +73 -2
  212. package/dist/src/core/services/BlockManager.d.ts.map +1 -1
  213. package/dist/src/core/services/BlockManager.js +270 -48
  214. package/dist/src/core/services/BlockManager.js.map +1 -1
  215. package/dist/src/core/services/DomService.js +3 -3
  216. package/dist/src/core/services/DomService.js.map +1 -1
  217. package/dist/src/core/services/HeadService.d.ts +24 -0
  218. package/dist/src/core/services/HeadService.d.ts.map +1 -0
  219. package/dist/src/core/services/HeadService.js +120 -0
  220. package/dist/src/core/services/HeadService.js.map +1 -0
  221. package/dist/src/core/services/HelperService.d.ts +14 -3
  222. package/dist/src/core/services/HelperService.d.ts.map +1 -1
  223. package/dist/src/core/services/HelperService.js +32 -2
  224. package/dist/src/core/services/HelperService.js.map +1 -1
  225. package/dist/src/core/services/HttpService.d.ts +8 -0
  226. package/dist/src/core/services/HttpService.d.ts.map +1 -1
  227. package/dist/src/core/services/HttpService.js +121 -47
  228. package/dist/src/core/services/HttpService.js.map +1 -1
  229. package/dist/src/core/services/MarkerRegistry.d.ts +51 -8
  230. package/dist/src/core/services/MarkerRegistry.d.ts.map +1 -1
  231. package/dist/src/core/services/MarkerRegistry.js +135 -14
  232. package/dist/src/core/services/MarkerRegistry.js.map +1 -1
  233. package/dist/src/core/services/PageCache.d.ts +101 -0
  234. package/dist/src/core/services/PageCache.d.ts.map +1 -0
  235. package/dist/src/core/services/PageCache.js +184 -0
  236. package/dist/src/core/services/PageCache.js.map +1 -0
  237. package/dist/src/core/services/SectionManager.d.ts +100 -0
  238. package/dist/src/core/services/SectionManager.d.ts.map +1 -0
  239. package/dist/src/core/services/SectionManager.js +408 -0
  240. package/dist/src/core/services/SectionManager.js.map +1 -0
  241. package/dist/src/core/services/StorageService.js +1 -1
  242. package/dist/src/core/services/TranslationService.d.ts +21 -0
  243. package/dist/src/core/services/TranslationService.d.ts.map +1 -0
  244. package/dist/src/core/services/TranslationService.js +95 -0
  245. package/dist/src/core/services/TranslationService.js.map +1 -0
  246. package/dist/src/core/services/index.d.ts +11 -8
  247. package/dist/src/core/services/index.d.ts.map +1 -1
  248. package/dist/src/core/services/index.js +11 -8
  249. package/dist/src/core/services/index.js.map +1 -1
  250. package/dist/src/core/types/utils.d.ts +8 -8
  251. package/dist/src/core/types/utils.d.ts.map +1 -1
  252. package/dist/src/core/view/LoopContext.d.ts +21 -1
  253. package/dist/src/core/view/LoopContext.d.ts.map +1 -1
  254. package/dist/src/core/view/LoopContext.js +36 -0
  255. package/dist/src/core/view/LoopContext.js.map +1 -1
  256. package/dist/src/core/view/ResourceScope.d.ts +38 -0
  257. package/dist/src/core/view/ResourceScope.d.ts.map +1 -0
  258. package/dist/src/core/view/ResourceScope.js +167 -0
  259. package/dist/src/core/view/ResourceScope.js.map +1 -0
  260. package/dist/src/core/view/Section.d.ts +17 -32
  261. package/dist/src/core/view/Section.d.ts.map +1 -1
  262. package/dist/src/core/view/Section.js +14 -55
  263. package/dist/src/core/view/Section.js.map +1 -1
  264. package/dist/src/core/view/View.d.ts +43 -7
  265. package/dist/src/core/view/View.d.ts.map +1 -1
  266. package/dist/src/core/view/View.js +22 -4
  267. package/dist/src/core/view/View.js.map +1 -1
  268. package/dist/src/core/view/ViewController.d.ts +313 -40
  269. package/dist/src/core/view/ViewController.d.ts.map +1 -1
  270. package/dist/src/core/view/ViewController.js +1002 -147
  271. package/dist/src/core/view/ViewController.js.map +1 -1
  272. package/dist/src/core/view/ViewManager.d.ts +318 -27
  273. package/dist/src/core/view/ViewManager.d.ts.map +1 -1
  274. package/dist/src/core/view/ViewManager.js +1199 -258
  275. package/dist/src/core/view/ViewManager.js.map +1 -1
  276. package/dist/src/core/view/ViewState.d.ts +185 -6
  277. package/dist/src/core/view/ViewState.d.ts.map +1 -1
  278. package/dist/src/core/view/ViewState.js +851 -123
  279. package/dist/src/core/view/ViewState.js.map +1 -1
  280. package/dist/src/core/view/index.d.ts +5 -5
  281. package/dist/src/core/view/index.d.ts.map +1 -1
  282. package/dist/src/core/view/index.js +5 -5
  283. package/dist/src/core/view/index.js.map +1 -1
  284. package/dist/src/testing/index.d.ts +69 -0
  285. package/dist/src/testing/index.d.ts.map +1 -0
  286. package/dist/src/testing/index.js +140 -0
  287. package/dist/src/testing/index.js.map +1 -0
  288. package/index.ts +29 -5
  289. package/package.json +30 -21
  290. package/plugins.ts +2 -2
  291. package/src/core/app/Application.ts +58 -31
  292. package/src/core/bootstrap/app.ts +80 -6
  293. package/src/core/bootstrap/bundle.ts +101 -0
  294. package/src/core/bootstrap/providers/ApiServiceProvider.ts +4 -4
  295. package/src/core/bootstrap/providers/CoreServiceProvider.ts +14 -8
  296. package/src/core/bootstrap/providers/HelperServiceProvider.ts +8 -3
  297. package/src/core/bootstrap/providers/RouteServiceProvider.ts +15 -4
  298. package/src/core/bootstrap/providers/ServiceProvider.ts +8 -8
  299. package/src/core/bootstrap/providers/ViewServiceProvider.ts +3 -3
  300. package/src/core/bootstrap/providers/default-providers.ts +51 -16
  301. package/src/core/bootstrap/providers/index.ts +9 -9
  302. package/src/core/bootstrap/providers/provider-order.test.ts +16 -27
  303. package/src/core/bootstrap/providers/provider-order.ts +1 -1
  304. package/src/core/bootstrap/ssr.ts +136 -0
  305. package/src/core/cache/ViewCache.ts +1 -1
  306. package/src/core/cache/index.ts +1 -1
  307. package/src/core/contracts/ApplicationInterface.ts +13 -11
  308. package/src/core/contracts/BlockInterface.ts +18 -18
  309. package/src/core/contracts/BundleInterface.ts +40 -0
  310. package/src/core/contracts/ComponentInterface.ts +7 -6
  311. package/src/core/contracts/ElementInterface.ts +95 -27
  312. package/src/core/contracts/HeadServiceInterface.ts +41 -0
  313. package/src/core/contracts/HelperInterface.ts +9 -1
  314. package/src/core/contracts/HttpServiceInterface.ts +3 -0
  315. package/src/core/contracts/MarkerInterface.ts +22 -49
  316. package/src/core/contracts/ReactiveInterface.ts +9 -9
  317. package/src/core/contracts/RouterInterface.ts +5 -2
  318. package/src/core/contracts/SectionInterface.ts +49 -0
  319. package/src/core/contracts/ServiceProviderInterface.ts +3 -3
  320. package/src/core/contracts/ViewControllerInterface.ts +124 -16
  321. package/src/core/contracts/ViewInterface.ts +34 -5
  322. package/src/core/contracts/ViewManagerInterface.ts +40 -5
  323. package/src/core/contracts/ViewStateInterface.ts +39 -2
  324. package/src/core/contracts/common.ts +3 -3
  325. package/src/core/contracts/utils.ts +19 -19
  326. package/src/core/contracts/views.ts +2 -22
  327. package/src/core/devtools/hook.ts +142 -0
  328. package/src/core/devtools/index.ts +38 -0
  329. package/src/core/devtools/inspector.ts +270 -0
  330. package/src/core/elements/Block.ts +43 -21
  331. package/src/core/elements/BlockOutlet.ts +61 -21
  332. package/src/core/elements/Component.ts +352 -18
  333. package/src/core/elements/ElementManager.ts +9 -9
  334. package/src/core/elements/ForeachSlotCache.ts +170 -0
  335. package/src/core/elements/Fragment.ts +50 -32
  336. package/src/core/elements/Html.ts +696 -117
  337. package/src/core/elements/Output.ts +147 -30
  338. package/src/core/elements/Reactive.ts +329 -52
  339. package/src/core/elements/TextElement.ts +25 -16
  340. package/src/core/elements/Wrapper.ts +84 -18
  341. package/src/core/elements/Yield.ts +35 -24
  342. package/src/core/elements/helpers.ts +12 -12
  343. package/src/core/elements/index.ts +25 -24
  344. package/src/core/elements/reconcileChildren.ts +70 -0
  345. package/src/core/{hellpers → helpers}/ApiClient.ts +8 -1
  346. package/src/core/{hellpers → helpers}/app.ts +13 -2
  347. package/src/core/helpers/transition.ts +127 -0
  348. package/src/core/{hellpers → helpers}/utils.ts +4 -4
  349. package/src/core/helpers/view.ts +283 -0
  350. package/src/core/routers/Router.ts +458 -64
  351. package/src/core/routers/index.ts +2 -2
  352. package/src/core/services/AssetManager.ts +387 -0
  353. package/src/core/services/BlockManager.ts +272 -50
  354. package/src/core/services/DomService.ts +3 -3
  355. package/src/core/services/HeadService.ts +124 -0
  356. package/src/core/services/HelperService.ts +34 -4
  357. package/src/core/services/HttpService.ts +116 -55
  358. package/src/core/services/MarkerRegistry.ts +142 -16
  359. package/src/core/services/PageCache.ts +239 -0
  360. package/src/core/services/SectionManager.ts +387 -0
  361. package/src/core/services/StorageService.ts +1 -1
  362. package/src/core/services/TranslationService.ts +91 -0
  363. package/src/core/services/index.ts +11 -8
  364. package/src/core/types/utils.ts +8 -8
  365. package/src/core/view/LoopContext.ts +38 -1
  366. package/src/core/view/ResourceScope.ts +174 -0
  367. package/src/core/view/Section.ts +21 -68
  368. package/src/core/view/View.ts +57 -8
  369. package/src/core/view/ViewController.ts +1070 -186
  370. package/src/core/view/ViewManager.ts +1346 -272
  371. package/src/core/view/ViewState.ts +834 -116
  372. package/src/core/view/index.ts +5 -5
  373. package/src/testing/index.ts +184 -0
  374. package/dist/src/core/services/MarkerService.d.ts +0 -299
  375. package/dist/src/core/services/MarkerService.d.ts.map +0 -1
  376. package/dist/src/core/services/MarkerService.js +0 -723
  377. package/dist/src/core/services/MarkerService.js.map +0 -1
  378. package/src/core/services/MarkerService.ts +0 -923
@@ -0,0 +1,58 @@
1
+ /**
2
+ * API Module - V2 TypeScript
3
+ * Centralized API service for backend communication
4
+ */
5
+ import { APIClientInterface } from '../contracts/ApiInterface.js';
6
+ import { HttpService } from '../services/HttpService.js';
7
+ export interface APIEndpoints {
8
+ system?: {
9
+ config?: string;
10
+ data?: string;
11
+ };
12
+ [key: string]: any;
13
+ }
14
+ export declare class ApiClient implements APIClientInterface {
15
+ private http;
16
+ private endpoints;
17
+ constructor();
18
+ /**
19
+ * Setup default headers including CSRF token
20
+ * @private
21
+ */
22
+ private setupDefaultHeaders;
23
+ init(config: Record<string, any>): void;
24
+ /**
25
+ * Load API endpoints from config
26
+ * @private
27
+ */
28
+ private loadEndpoints;
29
+ /**
30
+ * Get view data for specific URI
31
+ * V1 compatible: returns response.data if status=true, else {}
32
+ */
33
+ getViewData(uri: string): Promise<any>;
34
+ /**
35
+ * Get system configuration
36
+ * V1 compatible
37
+ */
38
+ getSystemConfig(): Promise<any>;
39
+ /**
40
+ * Get system data
41
+ * V1 compatible
42
+ */
43
+ getSystemData(): Promise<any>;
44
+ /**
45
+ * Get data for current URI
46
+ * Optimization: SSR-safe window access
47
+ */
48
+ getURIData(): Promise<any>;
49
+ /**
50
+ * Set custom endpoint
51
+ */
52
+ setEndpoint(key: string, value: string): void;
53
+ /**
54
+ * Get HTTP service instance for custom requests
55
+ */
56
+ getHttpService(): HttpService;
57
+ }
58
+ //# sourceMappingURL=ApiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiClient.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/ApiClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,WAAW,YAAY;IACzB,MAAM,CAAC,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,qBAAa,SAAU,YAAW,kBAAkB;IAChD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,SAAS,CAAe;;IAQhC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkB3B,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAWvC;;;OAGG;IACH,OAAO,CAAC,aAAa;IAOrB;;;OAGG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU5C;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAerC;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC;IAenC;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IAShC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAO7C;;OAEG;IACH,cAAc,IAAI,WAAW;CAGhC"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * API Module - V2 TypeScript
3
+ * Centralized API service for backend communication
4
+ */
5
+ import { HttpService } from '../services/HttpService.js';
6
+ export class ApiClient {
7
+ constructor() {
8
+ this.http = new HttpService();
9
+ this.setupDefaultHeaders();
10
+ this.endpoints = this.loadEndpoints();
11
+ }
12
+ /**
13
+ * Setup default headers including CSRF token
14
+ * @private
15
+ */
16
+ setupDefaultHeaders() {
17
+ this.http.setHeader('Content-Type', 'application/json');
18
+ this.http.setHeader('Accept', 'application/json');
19
+ this.http.setHeader('X-Requested-With', 'XMLHttpRequest');
20
+ this.http.setHeader('X-DATA-TYPE', 'json');
21
+ // Get CSRF token from meta tag (SSR support)
22
+ if (typeof document !== 'undefined') {
23
+ const csrfToken = document.querySelector('meta[name="csrf-token"]');
24
+ if (csrfToken) {
25
+ const token = csrfToken.getAttribute('content');
26
+ if (token) {
27
+ this.http.setHeader('X-CSRF-TOKEN', token);
28
+ }
29
+ }
30
+ }
31
+ }
32
+ init(config) {
33
+ if (typeof config.baseUrl === 'string')
34
+ this.http.setBaseUrl(config.baseUrl);
35
+ if (typeof config.timeout === 'number')
36
+ this.http.setTimeout(config.timeout);
37
+ for (const [name, value] of Object.entries(config.headers || {})) {
38
+ this.http.setHeader(name, String(value));
39
+ }
40
+ if (config.endpoints && typeof config.endpoints === 'object') {
41
+ this.endpoints = { ...this.endpoints, ...config.endpoints };
42
+ }
43
+ }
44
+ /**
45
+ * Load API endpoints from config
46
+ * @private
47
+ */
48
+ loadEndpoints() {
49
+ if (typeof window === 'undefined') {
50
+ return {};
51
+ }
52
+ return window.ONE_CONFIGS?.api?.endpoints || {};
53
+ }
54
+ /**
55
+ * Get view data for specific URI
56
+ * V1 compatible: returns response.data if status=true, else {}
57
+ */
58
+ async getViewData(uri) {
59
+ try {
60
+ const response = await this.http.get(uri);
61
+ return response.status ? response.data : {};
62
+ }
63
+ catch (error) {
64
+ console.error('[API] Error getting view data:', error);
65
+ return {};
66
+ }
67
+ }
68
+ /**
69
+ * Get system configuration
70
+ * V1 compatible
71
+ */
72
+ async getSystemConfig() {
73
+ const endpoint = this.endpoints?.system?.config;
74
+ if (!endpoint) {
75
+ return {};
76
+ }
77
+ try {
78
+ const response = await this.http.get(endpoint);
79
+ return response.status ? response.data : {};
80
+ }
81
+ catch (error) {
82
+ console.error('[API] Error getting system config:', error);
83
+ return {};
84
+ }
85
+ }
86
+ /**
87
+ * Get system data
88
+ * V1 compatible
89
+ */
90
+ async getSystemData() {
91
+ const endpoint = this.endpoints?.system?.data;
92
+ if (!endpoint) {
93
+ return {};
94
+ }
95
+ try {
96
+ const response = await this.http.get(endpoint);
97
+ return response.status ? response.data : {};
98
+ }
99
+ catch (error) {
100
+ console.error('[API] Error getting system data:', error);
101
+ return {};
102
+ }
103
+ }
104
+ /**
105
+ * Get data for current URI
106
+ * Optimization: SSR-safe window access
107
+ */
108
+ async getURIData() {
109
+ if (typeof window === 'undefined') {
110
+ return {};
111
+ }
112
+ const uri = window.location.pathname + window.location.search;
113
+ return this.getViewData(uri);
114
+ }
115
+ /**
116
+ * Set custom endpoint
117
+ */
118
+ setEndpoint(key, value) {
119
+ if (!this.endpoints[key]) {
120
+ this.endpoints[key] = {};
121
+ }
122
+ Object.assign(this.endpoints[key], typeof value === 'string' ? { url: value } : value);
123
+ }
124
+ /**
125
+ * Get HTTP service instance for custom requests
126
+ */
127
+ getHttpService() {
128
+ return this.http;
129
+ }
130
+ }
131
+ //# sourceMappingURL=ApiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiClient.js","sourceRoot":"","sources":["../../../../src/core/helpers/ApiClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAUzD,MAAM,OAAO,SAAS;IAIlB;QACI,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACK,mBAAmB;QACvB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAE3C,6CAA6C;QAC7C,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;YACpE,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAChD,IAAI,KAAK,EAAE,CAAC;oBACR,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBAC/C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,CAAC,MAA2B;QAC5B,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC3D,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAChE,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,aAAa;QACjB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAQ,MAAc,CAAC,WAAW,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,GAAW;QACzB,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;QAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;YAC3D,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC;QAC9C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9D,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAW,EAAE,KAAa;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,cAAc;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;CACJ"}
@@ -0,0 +1,3 @@
1
+ import { AppFactory } from "../contracts/ApplicationInterface.js";
2
+ export declare const app: AppFactory;
3
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAc,MAAM,sCAAsC,CAAC;AAkE9E,eAAO,MAAM,GAAG,EAAiB,UAAU,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { Application } from "../app/Application.js";
2
+ /**
3
+ * Container instance để quản lý services
4
+ * Tương tự Laravel's app container
5
+ */
6
+ const AppInstance = new Application();
7
+ // Tự đăng ký container dưới key 'App' — compiled view luôn gọi `app("App")`
8
+ // để lấy Application (App.View, App.Helper, App.Router...). Thiếu dòng này thì
9
+ // mọi view compiled ném "Cannot resolve: App". (Unit test cũ dùng `new View()`
10
+ // trực tiếp nên không lộ; chỉ lộ khi chạy view compiled thật trên trình duyệt.)
11
+ AppInstance.instance('App', AppInstance);
12
+ /**
13
+ * Helper function để lấy/đăng ký services
14
+ * Cách dùng:
15
+ * - app() - trả về container instance
16
+ * - app('service_name') - lấy service
17
+ * - app('key', value) - đăng ký instance
18
+ *
19
+ * @param key - Tên service (optional)
20
+ * @param value - Giá trị service (optional)
21
+ * @returns Container instance, service, hoặc void
22
+ *
23
+ * @example
24
+ * // Lấy container
25
+ * const container = app();
26
+ * container.singleton('store', Store);
27
+ *
28
+ * // Lấy service trực tiếp
29
+ * const store = app('store');
30
+ *
31
+ * // Đăng ký instance
32
+ * app('config', { api: 'https://api.example.com' });
33
+ */
34
+ const appFactory = (key, value) => {
35
+ if (key === undefined || key === null) {
36
+ // Không truyền gì → trả về container
37
+ return AppInstance;
38
+ }
39
+ // Compiler contract: mọi generated view dùng app("App"). Alias này phải
40
+ // tồn tại cả sau flush()/test teardown, không phụ thuộc singleton map.
41
+ if (key === 'App' && value === undefined) {
42
+ return AppInstance;
43
+ }
44
+ if (value !== undefined) {
45
+ // Truyền 2 tham số → đăng ký instance
46
+ AppInstance.instance(key, value);
47
+ return;
48
+ }
49
+ // Truyền 1 tham số → lấy service
50
+ return AppInstance.make(key);
51
+ };
52
+ // Add make method to app function for TypeScript compatibility
53
+ appFactory.make = (name) => AppInstance.make(name);
54
+ appFactory.instance = (name, value) => AppInstance.instance(name, value);
55
+ appFactory.resolve = (name, defaultValue) => AppInstance.resolve(name, defaultValue);
56
+ appFactory.register = (name, factory) => AppInstance.bind(name, factory);
57
+ appFactory.bind = (name, factory) => AppInstance.bind(name, factory);
58
+ appFactory.singleton = (name, factory) => AppInstance.singleton(name, factory);
59
+ appFactory.has = (name) => AppInstance.has(name);
60
+ appFactory.flush = () => { AppInstance.flush(); };
61
+ appFactory.destroy = () => { AppInstance.destroy(); };
62
+ export const app = appFactory;
63
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../../src/core/helpers/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD;;;GAGG;AACH,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAEtC,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,WAAW,CAAC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,GAAG,CAAI,GAAgB,EAAE,KAAW,EAAgC,EAAE;IAClF,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACpC,qCAAqC;QACrC,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,wEAAwE;IACxE,uEAAuE;IACvE,IAAI,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,WAAW,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,sCAAsC;QACtC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACjC,OAAO;IACX,CAAC;IACD,iCAAiC;IACjC,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,+DAA+D;AAC/D,UAAU,CAAC,IAAI,GAAG,CAAI,IAAgB,EAAK,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,UAAU,CAAC,QAAQ,GAAG,CAAI,IAAgB,EAAE,KAAQ,EAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxG,UAAU,CAAC,OAAO,GAAG,CAAI,IAAgB,EAAE,YAAgB,EAAK,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC3G,UAAU,CAAC,QAAQ,GAAG,CAAI,IAAgB,EAAE,OAAgB,EAAe,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC9G,UAAU,CAAC,IAAI,GAAG,CAAI,IAAgB,EAAE,OAAgB,EAAe,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC1G,UAAU,CAAC,SAAS,GAAG,CAAI,IAAgB,EAAE,OAAgB,EAAe,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpH,UAAU,CAAC,GAAG,GAAG,CAAC,IAAgB,EAAW,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtE,UAAU,CAAC,KAAK,GAAG,GAAS,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,UAAU,CAAC,OAAO,GAAG,GAAS,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,GAAG,GAAG,UAAwB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Transition enter/leave cho element — `@transition('fade')`.
3
+ *
4
+ * # Quy ước class (giống Vue, để người dùng không phải học lại)
5
+ * enter: `{n}-enter-from` `{n}-enter-active` → frame sau → `{n}-enter-to`
6
+ * leave: `{n}-leave-from` `{n}-leave-active` → frame sau → `{n}-leave-to`
7
+ * `-active` có mặt suốt quá trình (chỗ đặt `transition:`), `-from`/`-to` là
8
+ * hai đầu giá trị.
9
+ *
10
+ * # Vì sao dùng `getAnimations()` chứ không nghe `transitionend`
11
+ * `transitionend` bắn MỘT lần cho MỖI property, không bắn nếu giá trị không
12
+ * đổi, và không phân biệt transition của element với của con nó — nên cách
13
+ * làm kinh điển phải parse `transition-duration` + hẹn giờ dự phòng.
14
+ * `element.getAnimations()` trả thẳng mọi animation/transition đang chạy trên
15
+ * element kèm promise `.finished`, xử lý đúng cả trường hợp nhiều property và
16
+ * bị huỷ giữa chừng. Không có animation nào → resolve ngay → hành vi y hệt
17
+ * lúc chưa có transition (đây cũng là đường chạy trong jsdom).
18
+ *
19
+ * # Vì sao cần `isLeaving()`
20
+ * Element rời đi phải NẰM LẠI DOM tới khi animation xong, trong khi
21
+ * `Reactive.clearContent()`/`_cleanOrphanNodes()` quét sạch mọi node giữa cặp
22
+ * marker. Hai vòng quét đó phải bỏ qua node đang leave, nếu không node bị giật
23
+ * đi ngay và animation không bao giờ thấy được.
24
+ */
25
+ /** True khi node đang chạy leave và chưa được gỡ. */
26
+ export declare function isLeaving(node: Node): boolean;
27
+ /** Chạy enter. Bị enter/leave khác chen ngang → thoát, không đụng DOM nữa. */
28
+ export declare function runEnter(el: Element, name: string): Promise<void>;
29
+ /**
30
+ * Chạy leave rồi GỠ node. Trả promise resolve sau khi node đã rời DOM.
31
+ * Element được đánh dấu leaving ngay lập tức để không ai giật mất giữa chừng.
32
+ */
33
+ export declare function runLeave(el: Element, name: string): Promise<void>;
34
+ //# sourceMappingURL=transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/transition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAQH,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE7C;AAgDD,8EAA8E;AAC9E,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvE;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvE"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Transition enter/leave cho element — `@transition('fade')`.
3
+ *
4
+ * # Quy ước class (giống Vue, để người dùng không phải học lại)
5
+ * enter: `{n}-enter-from` `{n}-enter-active` → frame sau → `{n}-enter-to`
6
+ * leave: `{n}-leave-from` `{n}-leave-active` → frame sau → `{n}-leave-to`
7
+ * `-active` có mặt suốt quá trình (chỗ đặt `transition:`), `-from`/`-to` là
8
+ * hai đầu giá trị.
9
+ *
10
+ * # Vì sao dùng `getAnimations()` chứ không nghe `transitionend`
11
+ * `transitionend` bắn MỘT lần cho MỖI property, không bắn nếu giá trị không
12
+ * đổi, và không phân biệt transition của element với của con nó — nên cách
13
+ * làm kinh điển phải parse `transition-duration` + hẹn giờ dự phòng.
14
+ * `element.getAnimations()` trả thẳng mọi animation/transition đang chạy trên
15
+ * element kèm promise `.finished`, xử lý đúng cả trường hợp nhiều property và
16
+ * bị huỷ giữa chừng. Không có animation nào → resolve ngay → hành vi y hệt
17
+ * lúc chưa có transition (đây cũng là đường chạy trong jsdom).
18
+ *
19
+ * # Vì sao cần `isLeaving()`
20
+ * Element rời đi phải NẰM LẠI DOM tới khi animation xong, trong khi
21
+ * `Reactive.clearContent()`/`_cleanOrphanNodes()` quét sạch mọi node giữa cặp
22
+ * marker. Hai vòng quét đó phải bỏ qua node đang leave, nếu không node bị giật
23
+ * đi ngay và animation không bao giờ thấy được.
24
+ */
25
+ /** Node đang chạy leave — vòng quét DOM giữa marker phải BỎ QUA. */
26
+ const leavingNodes = new WeakSet();
27
+ /** Sequence hiện tại của mỗi element — chống enter/leave chồng nhau (reorder). */
28
+ const generation = new WeakMap();
29
+ /** True khi node đang chạy leave và chưa được gỡ. */
30
+ export function isLeaving(node) {
31
+ return leavingNodes.has(node);
32
+ }
33
+ function bump(el) {
34
+ const next = (generation.get(el) ?? 0) + 1;
35
+ generation.set(el, next);
36
+ return next;
37
+ }
38
+ const isCurrent = (el, token) => generation.get(el) === token;
39
+ /** Đợi sang frame kế — để trình duyệt kịp áp `-from` trước khi đổi sang `-to`. */
40
+ function nextFrame() {
41
+ return new Promise(resolve => {
42
+ if (typeof requestAnimationFrame !== 'function')
43
+ return resolve();
44
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
45
+ });
46
+ }
47
+ /**
48
+ * Đợi mọi animation/transition trên element kết thúc.
49
+ * `allSettled` vì `.finished` REJECT khi animation bị huỷ — với ta thì huỷ
50
+ * cũng là xong, không phải lỗi.
51
+ *
52
+ * ponytail: animation vô hạn (`animation-iteration-count: infinite`) trên
53
+ * element đang leave sẽ giữ node lại mãi. Thêm timeout trần nếu gặp thật.
54
+ */
55
+ async function whenAnimationsDone(el) {
56
+ const getAnimations = el.getAnimations;
57
+ if (typeof getAnimations !== 'function')
58
+ return; // jsdom / browser cũ
59
+ const running = getAnimations.call(el);
60
+ if (!running || running.length === 0)
61
+ return;
62
+ await Promise.allSettled(running.map(a => a.finished));
63
+ }
64
+ const classesOf = (name, phase) => ({
65
+ from: `${name}-${phase}-from`,
66
+ active: `${name}-${phase}-active`,
67
+ to: `${name}-${phase}-to`,
68
+ });
69
+ /** Gỡ mọi class transition của cả 2 phase — dùng khi bị huỷ giữa chừng. */
70
+ function clearClasses(el, name) {
71
+ for (const phase of ['enter', 'leave']) {
72
+ const c = classesOf(name, phase);
73
+ el.classList.remove(c.from, c.active, c.to);
74
+ }
75
+ }
76
+ /** Chạy enter. Bị enter/leave khác chen ngang → thoát, không đụng DOM nữa. */
77
+ export async function runEnter(el, name) {
78
+ const token = bump(el);
79
+ const c = classesOf(name, 'enter');
80
+ clearClasses(el, name);
81
+ el.classList.add(c.from, c.active);
82
+ await nextFrame();
83
+ if (!isCurrent(el, token))
84
+ return;
85
+ el.classList.remove(c.from);
86
+ el.classList.add(c.to);
87
+ await whenAnimationsDone(el);
88
+ if (!isCurrent(el, token))
89
+ return;
90
+ el.classList.remove(c.active, c.to);
91
+ }
92
+ /**
93
+ * Chạy leave rồi GỠ node. Trả promise resolve sau khi node đã rời DOM.
94
+ * Element được đánh dấu leaving ngay lập tức để không ai giật mất giữa chừng.
95
+ */
96
+ export async function runLeave(el, name) {
97
+ const token = bump(el);
98
+ const c = classesOf(name, 'leave');
99
+ leavingNodes.add(el);
100
+ clearClasses(el, name);
101
+ el.classList.add(c.from, c.active);
102
+ await nextFrame();
103
+ if (!isCurrent(el, token)) {
104
+ leavingNodes.delete(el);
105
+ return;
106
+ }
107
+ el.classList.remove(c.from);
108
+ el.classList.add(c.to);
109
+ await whenAnimationsDone(el);
110
+ if (!isCurrent(el, token)) {
111
+ leavingNodes.delete(el);
112
+ return;
113
+ }
114
+ leavingNodes.delete(el);
115
+ el.classList.remove(c.active, c.to);
116
+ el.remove();
117
+ }
118
+ //# sourceMappingURL=transition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transition.js","sourceRoot":"","sources":["../../../../src/core/helpers/transition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare function generateUUID(length?: number): string;
2
+ export declare function escapeHTML(str: string): string;
3
+ export declare function isEmpty(value: any): boolean;
4
+ export declare function isObject(value: any): boolean;
5
+ export declare function hasProperty(obj: any, prop: string): boolean;
6
+ export declare function hasMethod(obj: any, method: string): boolean;
7
+ export declare function hasAnyProperty(obj: any, props: string[]): boolean;
8
+ export declare function hasData(value: any): boolean;
9
+ export declare function isArray(value: any): boolean;
10
+ export declare function isString(value: any): boolean;
11
+ export declare function isNumber(value: any): boolean;
12
+ export declare function isBoolean(value: any): boolean;
13
+ export declare function isFunction(value: any): boolean;
14
+ export declare function isPromise(value: any): boolean;
15
+ export declare function isHTMLElement(value: any): boolean;
16
+ export declare function isNode(value: any): boolean;
17
+ export declare function isCommentNode(value: any): boolean;
18
+ export declare function isTextNode(value: any): boolean;
19
+ export declare function isSaoElement(value: any): boolean;
20
+ export declare function isOneHtml(value: any): boolean;
21
+ export declare function isOneText(value: any): boolean;
22
+ export declare function isOneNativeElement(value: any): boolean;
23
+ export declare function isOneReactive(value: any): boolean;
24
+ export declare function isSaoFragment(value: any): boolean;
25
+ export declare function isOneBlock(value: any): boolean;
26
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAMxD;AAUD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAM3C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D;AACD,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D;AACD,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAEjE;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE3C;AACD,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE3C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE1C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEhD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEtD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAEjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAE9C"}
@@ -0,0 +1,96 @@
1
+ export function generateUUID(length = 36) {
2
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
3
+ const r = (Math.random() * 16) | 0;
4
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
5
+ return v.toString(16);
6
+ }).substring(0, length);
7
+ }
8
+ const htmlEscapeMap = {
9
+ '&': '&amp;',
10
+ '<': '&lt;',
11
+ '>': '&gt;',
12
+ '"': '&quot;',
13
+ "'": '&#39;',
14
+ };
15
+ const htmlEscapeRe = /[&<>"']/g;
16
+ export function escapeHTML(str) {
17
+ return str.replace(htmlEscapeRe, (ch) => htmlEscapeMap[ch]);
18
+ }
19
+ export function isEmpty(value) {
20
+ if (value == null)
21
+ return true;
22
+ if (typeof value === 'string' && value.trim() === '')
23
+ return true;
24
+ if (Array.isArray(value) && value.length === 0)
25
+ return true;
26
+ if (typeof value === 'object' && Object.keys(value).length === 0)
27
+ return true;
28
+ return false;
29
+ }
30
+ export function isObject(value) {
31
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
32
+ }
33
+ export function hasProperty(obj, prop) {
34
+ return obj != null && Object.prototype.hasOwnProperty.call(obj, prop);
35
+ }
36
+ export function hasMethod(obj, method) {
37
+ return obj != null && typeof obj[method] === 'function';
38
+ }
39
+ export function hasAnyProperty(obj, props) {
40
+ return obj != null && props.some(prop => Object.prototype.hasOwnProperty.call(obj, prop));
41
+ }
42
+ export function hasData(value) {
43
+ return isObject(value) && Object.keys(value).length > 0;
44
+ }
45
+ export function isArray(value) {
46
+ return Array.isArray(value);
47
+ }
48
+ export function isString(value) {
49
+ return typeof value === 'string';
50
+ }
51
+ export function isNumber(value) {
52
+ return typeof value === 'number' && !isNaN(value);
53
+ }
54
+ export function isBoolean(value) {
55
+ return typeof value === 'boolean';
56
+ }
57
+ export function isFunction(value) {
58
+ return typeof value === 'function';
59
+ }
60
+ export function isPromise(value) {
61
+ return value instanceof Promise || (value !== null && typeof value === 'object' && typeof value.then === 'function');
62
+ }
63
+ export function isHTMLElement(value) {
64
+ return value instanceof HTMLElement;
65
+ }
66
+ export function isNode(value) {
67
+ return value instanceof Node;
68
+ }
69
+ export function isCommentNode(value) {
70
+ return value instanceof Comment;
71
+ }
72
+ export function isTextNode(value) {
73
+ return value instanceof Text;
74
+ }
75
+ export function isSaoElement(value) {
76
+ return value && typeof value === 'object' && 'isSaoElement' in value && value.isSaoElement === true;
77
+ }
78
+ export function isOneHtml(value) {
79
+ return value && typeof value === 'object' && 'isOneHtml' in value && value.isOneHtml === true;
80
+ }
81
+ export function isOneText(value) {
82
+ return value && typeof value === 'object' && 'isOneText' in value && value.isOneText === true;
83
+ }
84
+ export function isOneNativeElement(value) {
85
+ return value && typeof value === 'object' && 'isOneNativeElement' in value && value.isOneNativeElement === true;
86
+ }
87
+ export function isOneReactive(value) {
88
+ return value && typeof value === 'object' && 'isOneReactive' in value && value.isOneReactive === true;
89
+ }
90
+ export function isSaoFragment(value) {
91
+ return value && typeof value === 'object' && 'isSaoFragment' in value && value.isSaoFragment === true;
92
+ }
93
+ export function isOneBlock(value) {
94
+ return value && typeof value === 'object' && 'isOneBlock' in value && value.isOneBlock === true;
95
+ }
96
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/helpers/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { HtmlInterface, SaoNodeInterface, SaoElementChildren, DOMElement, WrapperInterface, SaoChildrenFactoryOutput } from "../contracts/ElementInterface.js";
2
+ import type { ViewControllerInterface } from "../contracts/ViewControllerInterface.js";
3
+ /** Commit initial data; hydration discards pending notifications before subscribe. */
4
+ export declare function commitView(ctrl: ViewControllerInterface, discardPending?: boolean): void;
5
+ /** Flush state + reactive queues after a lifecycle transition. */
6
+ export declare function flushView(ctrl: ViewControllerInterface): void;
7
+ /** Start a view through its controller, then make the initial DOM snapshot current. */
8
+ export declare function activateView(ctrl: ViewControllerInterface): void;
9
+ /**
10
+ * Claim an already-rendered Wrapper tree without inserting or clearing DOM.
11
+ * Used by both route hydration and nested @include hydration.
12
+ */
13
+ export declare function claimHydratedView(ctrl: ViewControllerInterface, root: HtmlInterface, wrapper?: WrapperInterface | null): void;
14
+ /**
15
+ * Mount danh sách children vào TRƯỚC một anchor node (RUNTIME_CONTRACT.md §2 —
16
+ * insertion point tường minh). Dùng cho Component (@include), và mọi chỗ cần
17
+ * mount content vào giữa cặp markers có sẵn.
18
+ */
19
+ export declare function mountChildrenBeforeAnchor(anchor: Node, children: SaoChildrenFactoryOutput | SaoElementChildren, parentForSao: HtmlInterface | null): void;
20
+ /**
21
+ * Hydrate mode: gọi render() đệ quy trên children để tạo JS objects
22
+ * và claim DOM nodes, nhưng KHÔNG appendChild/insertBefore vào DOM
23
+ * (vì DOM đã có từ server-rendered HTML).
24
+ *
25
+ * Khác mountElementList ở chỗ: bỏ mọi thao tác DOM mutation,
26
+ * chỉ giữ lại phần tạo element tree + gán parent.
27
+ */
28
+ export declare function hydrateElementList(root: HtmlInterface, elements: SaoElementChildren): void;
29
+ /**
30
+ * Mounts a list of SaoNodeInterface elements into a given root HtmlInterface.
31
+ * This function is responsible for appending the DOM nodes of each element
32
+ * to the root's DOM element and returning the list of mounted DOM nodes.
33
+ * @param root - The HtmlInterface to mount the elements into.
34
+ * @param elements - An array of SaoNodeInterface elements to be mounted.
35
+ * @returns An array of the mounted DOM nodes.
36
+ */
37
+ export declare function mountElementList(root: HtmlInterface, elements: SaoNodeInterface[] | DOMElement[] | SaoElementChildren): Element[];
38
+ export declare function mountElementListBefore(root: HtmlInterface, elements: SaoNodeInterface[] | DOMElement[] | SaoElementChildren): Element[];
39
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/core/helpers/view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAc,UAAU,EAAE,gBAAgB,EAAiB,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC/L,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AAEvF,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,IAAI,EAAE,uBAAuB,EAAE,cAAc,GAAE,OAAe,GAAG,IAAI,CAG/F;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAG7D;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,CAGhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC7B,IAAI,EAAE,uBAAuB,EAC7B,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE,gBAAgB,GAAG,IAAuB,GACpD,IAAI,CAMN;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,IAAI,EACZ,QAAQ,EAAE,wBAAwB,GAAG,kBAAkB,EACvD,YAAY,EAAE,aAAa,GAAG,IAAI,GACnC,IAAI,CAwBN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAsC1F;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,GAAG,kBAAkB,GAAG,OAAO,EAAE,CA4EjI;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,UAAU,EAAE,GAAG,kBAAkB,GAAG,OAAO,EAAE,CA4EvI"}