@tachui/cli 0.8.0-alpha → 0.8.5-alpha

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 (638) hide show
  1. package/README.md +15 -0
  2. package/bin/tacho.js +57 -7
  3. package/dist/cli/src/commands/analyze-imports.d.ts +18 -0
  4. package/dist/cli/src/commands/analyze-imports.d.ts.map +1 -0
  5. package/dist/cli/src/commands/analyze-imports.js +152 -0
  6. package/dist/cli/src/commands/analyze-imports.js.map +1 -0
  7. package/dist/cli/src/commands/analyze.d.ts.map +1 -0
  8. package/dist/{commands → cli/src/commands}/analyze.js +226 -13
  9. package/dist/cli/src/commands/analyze.js.map +1 -0
  10. package/dist/cli/src/commands/dev.d.ts.map +1 -0
  11. package/dist/cli/src/commands/dev.js.map +1 -0
  12. package/dist/cli/src/commands/generate.d.ts.map +1 -0
  13. package/dist/{commands → cli/src/commands}/generate.js +0 -21
  14. package/dist/cli/src/commands/generate.js.map +1 -0
  15. package/dist/cli/src/commands/init.d.ts.map +1 -0
  16. package/dist/{commands → cli/src/commands}/init.js +1 -28
  17. package/dist/cli/src/commands/init.js.map +1 -0
  18. package/dist/cli/src/commands/migrate/remove-modifier-trigger.d.ts +3 -0
  19. package/dist/cli/src/commands/migrate/remove-modifier-trigger.d.ts.map +1 -0
  20. package/dist/cli/src/commands/migrate/remove-modifier-trigger.js +103 -0
  21. package/dist/cli/src/commands/migrate/remove-modifier-trigger.js.map +1 -0
  22. package/dist/cli/src/commands/migrate.d.ts.map +1 -0
  23. package/dist/{commands → cli/src/commands}/migrate.js +5 -3
  24. package/dist/cli/src/commands/migrate.js.map +1 -0
  25. package/dist/cli/src/commands/modifier-docs.d.ts +24 -0
  26. package/dist/cli/src/commands/modifier-docs.d.ts.map +1 -0
  27. package/dist/cli/src/commands/modifier-docs.js +375 -0
  28. package/dist/cli/src/commands/modifier-docs.js.map +1 -0
  29. package/dist/cli/src/commands/optimize.d.ts.map +1 -0
  30. package/dist/cli/src/commands/optimize.js.map +1 -0
  31. package/dist/cli/src/import-optimizer.d.ts +50 -0
  32. package/dist/cli/src/import-optimizer.d.ts.map +1 -0
  33. package/dist/cli/src/import-optimizer.js +227 -0
  34. package/dist/cli/src/import-optimizer.js.map +1 -0
  35. package/dist/cli/src/index.d.ts.map +1 -0
  36. package/dist/{index.js → cli/src/index.js} +14 -3
  37. package/dist/cli/src/index.js.map +1 -0
  38. package/dist/cli/src/migrations/remove-modifier-trigger.d.ts +7 -0
  39. package/dist/cli/src/migrations/remove-modifier-trigger.d.ts.map +1 -0
  40. package/dist/cli/src/migrations/remove-modifier-trigger.js +99 -0
  41. package/dist/cli/src/migrations/remove-modifier-trigger.js.map +1 -0
  42. package/dist/core/package.json +223 -0
  43. package/dist/core/src/assets/Asset.d.ts +11 -0
  44. package/dist/core/src/assets/Asset.d.ts.map +1 -0
  45. package/dist/core/src/assets/Asset.js +12 -0
  46. package/dist/core/src/assets/Asset.js.map +1 -0
  47. package/dist/core/src/assets/AssetCollection.d.ts +14 -0
  48. package/dist/core/src/assets/AssetCollection.d.ts.map +1 -0
  49. package/dist/core/src/assets/AssetCollection.js +133 -0
  50. package/dist/core/src/assets/AssetCollection.js.map +1 -0
  51. package/dist/core/src/assets/ColorAsset.d.ts +31 -0
  52. package/dist/core/src/assets/ColorAsset.d.ts.map +1 -0
  53. package/dist/core/src/assets/ColorAsset.js +182 -0
  54. package/dist/core/src/assets/ColorAsset.js.map +1 -0
  55. package/dist/core/src/assets/FontAsset.d.ts +114 -0
  56. package/dist/core/src/assets/FontAsset.d.ts.map +1 -0
  57. package/dist/core/src/assets/FontAsset.js +289 -0
  58. package/dist/core/src/assets/FontAsset.js.map +1 -0
  59. package/dist/core/src/assets/ImageAsset.d.ts +35 -0
  60. package/dist/core/src/assets/ImageAsset.d.ts.map +1 -0
  61. package/dist/core/src/assets/ImageAsset.js +69 -0
  62. package/dist/core/src/assets/ImageAsset.js.map +1 -0
  63. package/dist/core/src/assets/index.d.ts +27 -0
  64. package/dist/core/src/assets/index.d.ts.map +1 -0
  65. package/dist/core/src/assets/index.js +137 -0
  66. package/dist/core/src/assets/index.js.map +1 -0
  67. package/dist/core/src/assets/types.d.ts +10 -0
  68. package/dist/core/src/assets/types.d.ts.map +1 -0
  69. package/dist/core/src/assets/types.js +6 -0
  70. package/dist/core/src/assets/types.js.map +1 -0
  71. package/dist/core/src/compiler/advanced-parser.d.ts +113 -0
  72. package/dist/core/src/compiler/advanced-parser.d.ts.map +1 -0
  73. package/dist/core/src/compiler/advanced-parser.js +702 -0
  74. package/dist/core/src/compiler/advanced-parser.js.map +1 -0
  75. package/dist/core/src/compiler/codegen.d.ts +20 -0
  76. package/dist/core/src/compiler/codegen.d.ts.map +1 -0
  77. package/dist/core/src/compiler/codegen.js +509 -0
  78. package/dist/core/src/compiler/codegen.js.map +1 -0
  79. package/dist/core/src/compiler/enhanced-codegen.d.ts +121 -0
  80. package/dist/core/src/compiler/enhanced-codegen.d.ts.map +1 -0
  81. package/dist/core/src/compiler/enhanced-codegen.js +607 -0
  82. package/dist/core/src/compiler/enhanced-codegen.js.map +1 -0
  83. package/dist/core/src/compiler/index.d.ts +14 -0
  84. package/dist/core/src/compiler/index.d.ts.map +1 -0
  85. package/dist/core/src/compiler/index.js +12 -0
  86. package/dist/core/src/compiler/index.js.map +1 -0
  87. package/dist/core/src/compiler/parser.d.ts +12 -0
  88. package/dist/core/src/compiler/parser.d.ts.map +1 -0
  89. package/dist/core/src/compiler/parser.js +407 -0
  90. package/dist/core/src/compiler/parser.js.map +1 -0
  91. package/dist/core/src/compiler/plugin.d.ts +13 -0
  92. package/dist/core/src/compiler/plugin.d.ts.map +1 -0
  93. package/dist/core/src/compiler/plugin.js +456 -0
  94. package/dist/core/src/compiler/plugin.js.map +1 -0
  95. package/dist/core/src/compiler/types.d.ts +177 -0
  96. package/dist/core/src/compiler/types.d.ts.map +1 -0
  97. package/dist/core/src/compiler/types.js +5 -0
  98. package/dist/core/src/compiler/types.js.map +1 -0
  99. package/dist/core/src/components/factory.d.ts +24 -0
  100. package/dist/core/src/components/factory.d.ts.map +1 -0
  101. package/dist/core/src/components/factory.js +19 -0
  102. package/dist/core/src/components/factory.js.map +1 -0
  103. package/dist/core/src/components/index.d.ts +12 -0
  104. package/dist/core/src/components/index.d.ts.map +1 -0
  105. package/dist/core/src/components/index.js +9 -0
  106. package/dist/core/src/components/index.js.map +1 -0
  107. package/dist/core/src/components/wrapper.d.ts +142 -0
  108. package/dist/core/src/components/wrapper.d.ts.map +1 -0
  109. package/dist/core/src/components/wrapper.js +628 -0
  110. package/dist/core/src/components/wrapper.js.map +1 -0
  111. package/dist/core/src/concatenation/concatenatable.d.ts +63 -0
  112. package/dist/core/src/concatenation/concatenatable.d.ts.map +1 -0
  113. package/dist/core/src/concatenation/concatenatable.js +158 -0
  114. package/dist/core/src/concatenation/concatenatable.js.map +1 -0
  115. package/dist/core/src/concatenation/concatenated-component.d.ts +124 -0
  116. package/dist/core/src/concatenation/concatenated-component.d.ts.map +1 -0
  117. package/dist/core/src/concatenation/concatenated-component.js +447 -0
  118. package/dist/core/src/concatenation/concatenated-component.js.map +1 -0
  119. package/dist/core/src/concatenation/index.d.ts +13 -0
  120. package/dist/core/src/concatenation/index.d.ts.map +1 -0
  121. package/dist/core/src/concatenation/index.js +16 -0
  122. package/dist/core/src/concatenation/index.js.map +1 -0
  123. package/dist/core/src/concatenation/text-optimizer.d.ts +104 -0
  124. package/dist/core/src/concatenation/text-optimizer.d.ts.map +1 -0
  125. package/dist/core/src/concatenation/text-optimizer.js +349 -0
  126. package/dist/core/src/concatenation/text-optimizer.js.map +1 -0
  127. package/dist/core/src/concatenation/types.d.ts +88 -0
  128. package/dist/core/src/concatenation/types.d.ts.map +1 -0
  129. package/dist/core/src/concatenation/types.js +23 -0
  130. package/dist/core/src/concatenation/types.js.map +1 -0
  131. package/dist/core/src/config.d.ts +7 -0
  132. package/dist/core/src/config.d.ts.map +1 -0
  133. package/dist/core/src/config.js +17 -0
  134. package/dist/core/src/config.js.map +1 -0
  135. package/dist/core/src/constants/frame-utils.d.ts +68 -0
  136. package/dist/core/src/constants/frame-utils.d.ts.map +1 -0
  137. package/dist/core/src/constants/frame-utils.js +156 -0
  138. package/dist/core/src/constants/frame-utils.js.map +1 -0
  139. package/dist/core/src/constants/index.d.ts +8 -0
  140. package/dist/core/src/constants/index.d.ts.map +1 -0
  141. package/dist/core/src/constants/index.js +8 -0
  142. package/dist/core/src/constants/index.js.map +1 -0
  143. package/dist/core/src/constants/layout.d.ts +96 -0
  144. package/dist/core/src/constants/layout.d.ts.map +1 -0
  145. package/dist/core/src/constants/layout.js +124 -0
  146. package/dist/core/src/constants/layout.js.map +1 -0
  147. package/dist/core/src/css-classes/component-base.d.ts +40 -0
  148. package/dist/core/src/css-classes/component-base.d.ts.map +1 -0
  149. package/dist/core/src/css-classes/component-base.js +90 -0
  150. package/dist/core/src/css-classes/component-base.js.map +1 -0
  151. package/dist/core/src/css-classes/css-class-manager.d.ts +89 -0
  152. package/dist/core/src/css-classes/css-class-manager.d.ts.map +1 -0
  153. package/dist/core/src/css-classes/css-class-manager.js +328 -0
  154. package/dist/core/src/css-classes/css-class-manager.js.map +1 -0
  155. package/dist/core/src/css-classes/dom-integration.d.ts +76 -0
  156. package/dist/core/src/css-classes/dom-integration.d.ts.map +1 -0
  157. package/dist/core/src/css-classes/dom-integration.js +104 -0
  158. package/dist/core/src/css-classes/dom-integration.js.map +1 -0
  159. package/dist/core/src/css-classes/enhanced-renderer.d.ts +42 -0
  160. package/dist/core/src/css-classes/enhanced-renderer.d.ts.map +1 -0
  161. package/dist/core/src/css-classes/enhanced-renderer.js +121 -0
  162. package/dist/core/src/css-classes/enhanced-renderer.js.map +1 -0
  163. package/dist/core/src/css-classes/index.d.ts +14 -0
  164. package/dist/core/src/css-classes/index.d.ts.map +1 -0
  165. package/dist/core/src/css-classes/index.js +14 -0
  166. package/dist/core/src/css-classes/index.js.map +1 -0
  167. package/dist/core/src/css-classes/types.d.ts +59 -0
  168. package/dist/core/src/css-classes/types.d.ts.map +1 -0
  169. package/dist/core/src/css-classes/types.js +8 -0
  170. package/dist/core/src/css-classes/types.js.map +1 -0
  171. package/dist/core/src/css-classes/utilities.d.ts +104 -0
  172. package/dist/core/src/css-classes/utilities.d.ts.map +1 -0
  173. package/dist/core/src/css-classes/utilities.js +126 -0
  174. package/dist/core/src/css-classes/utilities.js.map +1 -0
  175. package/dist/core/src/gradients/css-generator.d.ts +10 -0
  176. package/dist/core/src/gradients/css-generator.d.ts.map +1 -0
  177. package/dist/core/src/gradients/css-generator.js +123 -0
  178. package/dist/core/src/gradients/css-generator.js.map +1 -0
  179. package/dist/core/src/gradients/examples.d.ts +432 -0
  180. package/dist/core/src/gradients/examples.d.ts.map +1 -0
  181. package/dist/core/src/gradients/examples.js +588 -0
  182. package/dist/core/src/gradients/examples.js.map +1 -0
  183. package/dist/core/src/gradients/gradient-asset.d.ts +10 -0
  184. package/dist/core/src/gradients/gradient-asset.d.ts.map +1 -0
  185. package/dist/core/src/gradients/gradient-asset.js +25 -0
  186. package/dist/core/src/gradients/gradient-asset.js.map +1 -0
  187. package/dist/core/src/gradients/index.d.ts +19 -0
  188. package/dist/core/src/gradients/index.d.ts.map +1 -0
  189. package/dist/core/src/gradients/index.js +56 -0
  190. package/dist/core/src/gradients/index.js.map +1 -0
  191. package/dist/core/src/gradients/performance.d.ts +146 -0
  192. package/dist/core/src/gradients/performance.d.ts.map +1 -0
  193. package/dist/core/src/gradients/performance.js +413 -0
  194. package/dist/core/src/gradients/performance.js.map +1 -0
  195. package/dist/core/src/gradients/presets.d.ts +165 -0
  196. package/dist/core/src/gradients/presets.d.ts.map +1 -0
  197. package/dist/core/src/gradients/presets.js +371 -0
  198. package/dist/core/src/gradients/presets.js.map +1 -0
  199. package/dist/core/src/gradients/reactive.d.ts +167 -0
  200. package/dist/core/src/gradients/reactive.d.ts.map +1 -0
  201. package/dist/core/src/gradients/reactive.js +329 -0
  202. package/dist/core/src/gradients/reactive.js.map +1 -0
  203. package/dist/core/src/gradients/state-gradient-asset.d.ts +67 -0
  204. package/dist/core/src/gradients/state-gradient-asset.d.ts.map +1 -0
  205. package/dist/core/src/gradients/state-gradient-asset.js +145 -0
  206. package/dist/core/src/gradients/state-gradient-asset.js.map +1 -0
  207. package/dist/core/src/gradients/types.d.ts +6 -0
  208. package/dist/core/src/gradients/types.d.ts.map +1 -0
  209. package/dist/core/src/gradients/types.js +6 -0
  210. package/dist/core/src/gradients/types.js.map +1 -0
  211. package/dist/core/src/gradients/utils.d.ts +313 -0
  212. package/dist/core/src/gradients/utils.d.ts.map +1 -0
  213. package/dist/core/src/gradients/utils.js +513 -0
  214. package/dist/core/src/gradients/utils.js.map +1 -0
  215. package/dist/core/src/gradients/validation.d.ts +156 -0
  216. package/dist/core/src/gradients/validation.d.ts.map +1 -0
  217. package/dist/core/src/gradients/validation.js +392 -0
  218. package/dist/core/src/gradients/validation.js.map +1 -0
  219. package/dist/core/src/index.d.ts +33 -0
  220. package/dist/core/src/index.d.ts.map +1 -0
  221. package/dist/core/src/index.js +57 -0
  222. package/dist/core/src/index.js.map +1 -0
  223. package/dist/core/src/lifecycle/hooks.d.ts +101 -0
  224. package/dist/core/src/lifecycle/hooks.d.ts.map +1 -0
  225. package/dist/core/src/lifecycle/hooks.js +241 -0
  226. package/dist/core/src/lifecycle/hooks.js.map +1 -0
  227. package/dist/core/src/modifiers/alignment.d.ts +5 -0
  228. package/dist/core/src/modifiers/alignment.d.ts.map +1 -0
  229. package/dist/core/src/modifiers/alignment.js +19 -0
  230. package/dist/core/src/modifiers/alignment.js.map +1 -0
  231. package/dist/core/src/modifiers/base.d.ts +128 -0
  232. package/dist/core/src/modifiers/base.d.ts.map +1 -0
  233. package/dist/core/src/modifiers/base.js +1062 -0
  234. package/dist/core/src/modifiers/base.js.map +1 -0
  235. package/dist/core/src/modifiers/builder.d.ts +148 -0
  236. package/dist/core/src/modifiers/builder.d.ts.map +1 -0
  237. package/dist/core/src/modifiers/builder.js +903 -0
  238. package/dist/core/src/modifiers/builder.js.map +1 -0
  239. package/dist/core/src/modifiers/core.d.ts +14 -0
  240. package/dist/core/src/modifiers/core.d.ts.map +1 -0
  241. package/dist/core/src/modifiers/core.js +16 -0
  242. package/dist/core/src/modifiers/core.js.map +1 -0
  243. package/dist/core/src/modifiers/corner-radius.d.ts +8 -0
  244. package/dist/core/src/modifiers/corner-radius.d.ts.map +1 -0
  245. package/dist/core/src/modifiers/corner-radius.js +19 -0
  246. package/dist/core/src/modifiers/corner-radius.js.map +1 -0
  247. package/dist/core/src/modifiers/factories.d.ts +88 -0
  248. package/dist/core/src/modifiers/factories.d.ts.map +1 -0
  249. package/dist/core/src/modifiers/factories.js +376 -0
  250. package/dist/core/src/modifiers/factories.js.map +1 -0
  251. package/dist/core/src/modifiers/index.d.ts +17 -0
  252. package/dist/core/src/modifiers/index.d.ts.map +1 -0
  253. package/dist/core/src/modifiers/index.js +16 -0
  254. package/dist/core/src/modifiers/index.js.map +1 -0
  255. package/dist/core/src/modifiers/layout-priority.d.ts +8 -0
  256. package/dist/core/src/modifiers/layout-priority.d.ts.map +1 -0
  257. package/dist/core/src/modifiers/layout-priority.js +19 -0
  258. package/dist/core/src/modifiers/layout-priority.js.map +1 -0
  259. package/dist/core/src/modifiers/opacity.d.ts +8 -0
  260. package/dist/core/src/modifiers/opacity.d.ts.map +1 -0
  261. package/dist/core/src/modifiers/opacity.js +19 -0
  262. package/dist/core/src/modifiers/opacity.js.map +1 -0
  263. package/dist/core/src/modifiers/presets.d.ts +368 -0
  264. package/dist/core/src/modifiers/presets.d.ts.map +1 -0
  265. package/dist/core/src/modifiers/presets.js +394 -0
  266. package/dist/core/src/modifiers/presets.js.map +1 -0
  267. package/dist/core/src/modifiers/proxy.d.ts +4 -0
  268. package/dist/core/src/modifiers/proxy.d.ts.map +1 -0
  269. package/dist/core/src/modifiers/proxy.js +212 -0
  270. package/dist/core/src/modifiers/proxy.js.map +1 -0
  271. package/dist/core/src/modifiers/registration-utils.d.ts +7 -0
  272. package/dist/core/src/modifiers/registration-utils.d.ts.map +1 -0
  273. package/dist/core/src/modifiers/registration-utils.js +46 -0
  274. package/dist/core/src/modifiers/registration-utils.js.map +1 -0
  275. package/dist/core/src/modifiers/registry.d.ts +78 -0
  276. package/dist/core/src/modifiers/registry.d.ts.map +1 -0
  277. package/dist/core/src/modifiers/registry.js +397 -0
  278. package/dist/core/src/modifiers/registry.js.map +1 -0
  279. package/dist/core/src/modifiers/types.d.ts +6 -0
  280. package/dist/core/src/modifiers/types.d.ts.map +1 -0
  281. package/dist/core/src/modifiers/types.js +6 -0
  282. package/dist/core/src/modifiers/types.js.map +1 -0
  283. package/dist/core/src/plugins/index.d.ts +16 -0
  284. package/dist/core/src/plugins/index.d.ts.map +1 -0
  285. package/dist/core/src/plugins/index.js +21 -0
  286. package/dist/core/src/plugins/index.js.map +1 -0
  287. package/dist/core/src/plugins/legacy-adapter.d.ts +35 -0
  288. package/dist/core/src/plugins/legacy-adapter.d.ts.map +1 -0
  289. package/dist/core/src/plugins/legacy-adapter.js +57 -0
  290. package/dist/core/src/plugins/legacy-adapter.js.map +1 -0
  291. package/dist/core/src/plugins/simplified-component-registry.d.ts +40 -0
  292. package/dist/core/src/plugins/simplified-component-registry.d.ts.map +1 -0
  293. package/dist/core/src/plugins/simplified-component-registry.js +97 -0
  294. package/dist/core/src/plugins/simplified-component-registry.js.map +1 -0
  295. package/dist/core/src/plugins/simplified-lazy-loader.d.ts +65 -0
  296. package/dist/core/src/plugins/simplified-lazy-loader.d.ts.map +1 -0
  297. package/dist/core/src/plugins/simplified-lazy-loader.js +205 -0
  298. package/dist/core/src/plugins/simplified-lazy-loader.js.map +1 -0
  299. package/dist/core/src/plugins/simplified-plugin-manager.d.ts +24 -0
  300. package/dist/core/src/plugins/simplified-plugin-manager.d.ts.map +1 -0
  301. package/dist/core/src/plugins/simplified-plugin-manager.js +77 -0
  302. package/dist/core/src/plugins/simplified-plugin-manager.js.map +1 -0
  303. package/dist/core/src/plugins/simplified-tachui-instance.d.ts +54 -0
  304. package/dist/core/src/plugins/simplified-tachui-instance.d.ts.map +1 -0
  305. package/dist/core/src/plugins/simplified-tachui-instance.js +114 -0
  306. package/dist/core/src/plugins/simplified-tachui-instance.js.map +1 -0
  307. package/dist/core/src/plugins/simplified-types.d.ts +63 -0
  308. package/dist/core/src/plugins/simplified-types.d.ts.map +1 -0
  309. package/dist/core/src/plugins/simplified-types.js +18 -0
  310. package/dist/core/src/plugins/simplified-types.js.map +1 -0
  311. package/dist/core/src/plugins/simplified-utils.d.ts +39 -0
  312. package/dist/core/src/plugins/simplified-utils.d.ts.map +1 -0
  313. package/dist/core/src/plugins/simplified-utils.js +104 -0
  314. package/dist/core/src/plugins/simplified-utils.js.map +1 -0
  315. package/dist/core/src/reactive/cleanup.d.ts +115 -0
  316. package/dist/core/src/reactive/cleanup.d.ts.map +1 -0
  317. package/dist/core/src/reactive/cleanup.js +187 -0
  318. package/dist/core/src/reactive/cleanup.js.map +1 -0
  319. package/dist/core/src/reactive/computed.d.ts +115 -0
  320. package/dist/core/src/reactive/computed.d.ts.map +1 -0
  321. package/dist/core/src/reactive/computed.js +237 -0
  322. package/dist/core/src/reactive/computed.js.map +1 -0
  323. package/dist/core/src/reactive/context.d.ts +83 -0
  324. package/dist/core/src/reactive/context.d.ts.map +1 -0
  325. package/dist/core/src/reactive/context.js +286 -0
  326. package/dist/core/src/reactive/context.js.map +1 -0
  327. package/dist/core/src/reactive/effect.d.ts +79 -0
  328. package/dist/core/src/reactive/effect.d.ts.map +1 -0
  329. package/dist/core/src/reactive/effect.js +159 -0
  330. package/dist/core/src/reactive/effect.js.map +1 -0
  331. package/dist/core/src/reactive/enhanced-effect.d.ts +108 -0
  332. package/dist/core/src/reactive/enhanced-effect.d.ts.map +1 -0
  333. package/dist/core/src/reactive/enhanced-effect.js +265 -0
  334. package/dist/core/src/reactive/enhanced-effect.js.map +1 -0
  335. package/dist/core/src/reactive/enhanced-signal.d.ts +91 -0
  336. package/dist/core/src/reactive/enhanced-signal.d.ts.map +1 -0
  337. package/dist/core/src/reactive/enhanced-signal.js +175 -0
  338. package/dist/core/src/reactive/enhanced-signal.js.map +1 -0
  339. package/dist/core/src/reactive/equality.d.ts +51 -0
  340. package/dist/core/src/reactive/equality.d.ts.map +1 -0
  341. package/dist/core/src/reactive/equality.js +169 -0
  342. package/dist/core/src/reactive/equality.js.map +1 -0
  343. package/dist/core/src/reactive/index.d.ts +22 -0
  344. package/dist/core/src/reactive/index.d.ts.map +1 -0
  345. package/dist/core/src/reactive/index.js +33 -0
  346. package/dist/core/src/reactive/index.js.map +1 -0
  347. package/dist/core/src/reactive/migration.d.ts +104 -0
  348. package/dist/core/src/reactive/migration.d.ts.map +1 -0
  349. package/dist/core/src/reactive/migration.js +257 -0
  350. package/dist/core/src/reactive/migration.js.map +1 -0
  351. package/dist/core/src/reactive/ownership.d.ts +75 -0
  352. package/dist/core/src/reactive/ownership.d.ts.map +1 -0
  353. package/dist/core/src/reactive/ownership.js +155 -0
  354. package/dist/core/src/reactive/ownership.js.map +1 -0
  355. package/dist/core/src/reactive/scheduler.d.ts +56 -0
  356. package/dist/core/src/reactive/scheduler.d.ts.map +1 -0
  357. package/dist/core/src/reactive/scheduler.js +263 -0
  358. package/dist/core/src/reactive/scheduler.js.map +1 -0
  359. package/dist/core/src/reactive/signal-list.d.ts +100 -0
  360. package/dist/core/src/reactive/signal-list.d.ts.map +1 -0
  361. package/dist/core/src/reactive/signal-list.js +240 -0
  362. package/dist/core/src/reactive/signal-list.js.map +1 -0
  363. package/dist/core/src/reactive/signal.d.ts +82 -0
  364. package/dist/core/src/reactive/signal.d.ts.map +1 -0
  365. package/dist/core/src/reactive/signal.js +172 -0
  366. package/dist/core/src/reactive/signal.js.map +1 -0
  367. package/dist/core/src/reactive/theme.d.ts +12 -0
  368. package/dist/core/src/reactive/theme.d.ts.map +1 -0
  369. package/dist/core/src/reactive/theme.js +41 -0
  370. package/dist/core/src/reactive/theme.js.map +1 -0
  371. package/dist/core/src/reactive/types.d.ts +6 -0
  372. package/dist/core/src/reactive/types.d.ts.map +1 -0
  373. package/dist/core/src/reactive/types.js +6 -0
  374. package/dist/core/src/reactive/types.js.map +1 -0
  375. package/dist/core/src/reactive/unified-scheduler.d.ts +112 -0
  376. package/dist/core/src/reactive/unified-scheduler.d.ts.map +1 -0
  377. package/dist/core/src/reactive/unified-scheduler.js +315 -0
  378. package/dist/core/src/reactive/unified-scheduler.js.map +1 -0
  379. package/dist/core/src/runtime/component-context.d.ts +73 -0
  380. package/dist/core/src/runtime/component-context.d.ts.map +1 -0
  381. package/dist/core/src/runtime/component-context.js +278 -0
  382. package/dist/core/src/runtime/component-context.js.map +1 -0
  383. package/dist/core/src/runtime/component.d.ts +112 -0
  384. package/dist/core/src/runtime/component.d.ts.map +1 -0
  385. package/dist/core/src/runtime/component.js +394 -0
  386. package/dist/core/src/runtime/component.js.map +1 -0
  387. package/dist/core/src/runtime/context.d.ts +138 -0
  388. package/dist/core/src/runtime/context.d.ts.map +1 -0
  389. package/dist/core/src/runtime/context.js +411 -0
  390. package/dist/core/src/runtime/context.js.map +1 -0
  391. package/dist/core/src/runtime/dom-bridge.d.ts +70 -0
  392. package/dist/core/src/runtime/dom-bridge.d.ts.map +1 -0
  393. package/dist/core/src/runtime/dom-bridge.js +481 -0
  394. package/dist/core/src/runtime/dom-bridge.js.map +1 -0
  395. package/dist/core/src/runtime/element-override.d.ts +82 -0
  396. package/dist/core/src/runtime/element-override.d.ts.map +1 -0
  397. package/dist/core/src/runtime/element-override.js +360 -0
  398. package/dist/core/src/runtime/element-override.js.map +1 -0
  399. package/dist/core/src/runtime/event-delegation.d.ts +59 -0
  400. package/dist/core/src/runtime/event-delegation.d.ts.map +1 -0
  401. package/dist/core/src/runtime/event-delegation.js +220 -0
  402. package/dist/core/src/runtime/event-delegation.js.map +1 -0
  403. package/dist/core/src/runtime/index.d.ts +24 -0
  404. package/dist/core/src/runtime/index.d.ts.map +1 -0
  405. package/dist/core/src/runtime/index.js +36 -0
  406. package/dist/core/src/runtime/index.js.map +1 -0
  407. package/dist/core/src/runtime/lazy-component.d.ts +58 -0
  408. package/dist/core/src/runtime/lazy-component.d.ts.map +1 -0
  409. package/dist/core/src/runtime/lazy-component.js +206 -0
  410. package/dist/core/src/runtime/lazy-component.js.map +1 -0
  411. package/dist/core/src/runtime/lifecycle.d.ts +8 -0
  412. package/dist/core/src/runtime/lifecycle.d.ts.map +1 -0
  413. package/dist/core/src/runtime/lifecycle.js +9 -0
  414. package/dist/core/src/runtime/lifecycle.js.map +1 -0
  415. package/dist/core/src/runtime/mounting.d.ts +9 -0
  416. package/dist/core/src/runtime/mounting.d.ts.map +1 -0
  417. package/dist/core/src/runtime/mounting.js +15 -0
  418. package/dist/core/src/runtime/mounting.js.map +1 -0
  419. package/dist/core/src/runtime/optimization.d.ts +8 -0
  420. package/dist/core/src/runtime/optimization.d.ts.map +1 -0
  421. package/dist/core/src/runtime/optimization.js +12 -0
  422. package/dist/core/src/runtime/optimization.js.map +1 -0
  423. package/dist/core/src/runtime/props.d.ts +154 -0
  424. package/dist/core/src/runtime/props.d.ts.map +1 -0
  425. package/dist/core/src/runtime/props.js +389 -0
  426. package/dist/core/src/runtime/props.js.map +1 -0
  427. package/dist/core/src/runtime/renderer.d.ts +168 -0
  428. package/dist/core/src/runtime/renderer.d.ts.map +1 -0
  429. package/dist/core/src/runtime/renderer.js +1181 -0
  430. package/dist/core/src/runtime/renderer.js.map +1 -0
  431. package/dist/core/src/runtime/semantic-role-manager.d.ts +37 -0
  432. package/dist/core/src/runtime/semantic-role-manager.d.ts.map +1 -0
  433. package/dist/core/src/runtime/semantic-role-manager.js +102 -0
  434. package/dist/core/src/runtime/semantic-role-manager.js.map +1 -0
  435. package/dist/core/src/runtime/types.d.ts +6 -0
  436. package/dist/core/src/runtime/types.d.ts.map +1 -0
  437. package/dist/core/src/runtime/types.js +6 -0
  438. package/dist/core/src/runtime/types.js.map +1 -0
  439. package/dist/core/src/state/binding.d.ts +96 -0
  440. package/dist/core/src/state/binding.d.ts.map +1 -0
  441. package/dist/core/src/state/binding.js +264 -0
  442. package/dist/core/src/state/binding.js.map +1 -0
  443. package/dist/core/src/state/environment.d.ts +178 -0
  444. package/dist/core/src/state/environment.d.ts.map +1 -0
  445. package/dist/core/src/state/environment.js +272 -0
  446. package/dist/core/src/state/environment.js.map +1 -0
  447. package/dist/core/src/state/index.d.ts +108 -0
  448. package/dist/core/src/state/index.d.ts.map +1 -0
  449. package/dist/core/src/state/index.js +102 -0
  450. package/dist/core/src/state/index.js.map +1 -0
  451. package/dist/core/src/state/observed-object.d.ts +126 -0
  452. package/dist/core/src/state/observed-object.d.ts.map +1 -0
  453. package/dist/core/src/state/observed-object.js +330 -0
  454. package/dist/core/src/state/observed-object.js.map +1 -0
  455. package/dist/core/src/state/state-manager.d.ts +97 -0
  456. package/dist/core/src/state/state-manager.d.ts.map +1 -0
  457. package/dist/core/src/state/state-manager.js +297 -0
  458. package/dist/core/src/state/state-manager.js.map +1 -0
  459. package/dist/core/src/state/state.d.ts +78 -0
  460. package/dist/core/src/state/state.d.ts.map +1 -0
  461. package/dist/core/src/state/state.js +283 -0
  462. package/dist/core/src/state/state.js.map +1 -0
  463. package/dist/core/src/state/types.d.ts +159 -0
  464. package/dist/core/src/state/types.d.ts.map +1 -0
  465. package/dist/core/src/state/types.js +8 -0
  466. package/dist/core/src/state/types.js.map +1 -0
  467. package/dist/core/src/utils/clone-helpers.d.ts +11 -0
  468. package/dist/core/src/utils/clone-helpers.d.ts.map +1 -0
  469. package/dist/core/src/utils/clone-helpers.js +69 -0
  470. package/dist/core/src/utils/clone-helpers.js.map +1 -0
  471. package/dist/core/src/validation/build-time-stub.d.ts +33 -0
  472. package/dist/core/src/validation/build-time-stub.d.ts.map +1 -0
  473. package/dist/core/src/validation/build-time-stub.js +53 -0
  474. package/dist/core/src/validation/build-time-stub.js.map +1 -0
  475. package/dist/core/src/validation/debug-tools-stub.d.ts +67 -0
  476. package/dist/core/src/validation/debug-tools-stub.d.ts.map +1 -0
  477. package/dist/core/src/validation/debug-tools-stub.js +94 -0
  478. package/dist/core/src/validation/debug-tools-stub.js.map +1 -0
  479. package/dist/core/src/validation/index.d.ts +116 -0
  480. package/dist/core/src/validation/index.d.ts.map +1 -0
  481. package/dist/core/src/validation/index.js +306 -0
  482. package/dist/core/src/validation/index.js.map +1 -0
  483. package/dist/core/src/validation/lifecycle-validation.d.ts +165 -0
  484. package/dist/core/src/validation/lifecycle-validation.d.ts.map +1 -0
  485. package/dist/core/src/validation/lifecycle-validation.js +501 -0
  486. package/dist/core/src/validation/lifecycle-validation.js.map +1 -0
  487. package/dist/core/src/validation/performance-optimizer-stub.d.ts +50 -0
  488. package/dist/core/src/validation/performance-optimizer-stub.d.ts.map +1 -0
  489. package/dist/core/src/validation/performance-optimizer-stub.js +50 -0
  490. package/dist/core/src/validation/performance-optimizer-stub.js.map +1 -0
  491. package/dist/core/src/validation/plugin-registration.d.ts +92 -0
  492. package/dist/core/src/validation/plugin-registration.d.ts.map +1 -0
  493. package/dist/core/src/validation/plugin-registration.js +199 -0
  494. package/dist/core/src/validation/plugin-registration.js.map +1 -0
  495. package/dist/core/src/validation/production-bypass-core.d.ts +69 -0
  496. package/dist/core/src/validation/production-bypass-core.d.ts.map +1 -0
  497. package/dist/core/src/validation/production-bypass-core.js +115 -0
  498. package/dist/core/src/validation/production-bypass-core.js.map +1 -0
  499. package/dist/core/src/version.d.ts +19 -0
  500. package/dist/core/src/version.d.ts.map +1 -0
  501. package/dist/core/src/version.js +20 -0
  502. package/dist/core/src/version.js.map +1 -0
  503. package/dist/devtools/src/build-time/detection.d.ts +32 -0
  504. package/dist/devtools/src/build-time/detection.d.ts.map +1 -0
  505. package/dist/devtools/src/build-time/detection.js +327 -0
  506. package/dist/devtools/src/build-time/detection.js.map +1 -0
  507. package/dist/devtools/src/build-time/index.d.ts +84 -0
  508. package/dist/devtools/src/build-time/index.d.ts.map +1 -0
  509. package/dist/devtools/src/build-time/index.js +157 -0
  510. package/dist/devtools/src/build-time/index.js.map +1 -0
  511. package/dist/devtools/src/build-time/plugins.d.ts +75 -0
  512. package/dist/devtools/src/build-time/plugins.d.ts.map +1 -0
  513. package/dist/devtools/src/build-time/plugins.js +429 -0
  514. package/dist/devtools/src/build-time/plugins.js.map +1 -0
  515. package/dist/devtools/src/build-time/rules.d.ts +73 -0
  516. package/dist/devtools/src/build-time/rules.d.ts.map +1 -0
  517. package/dist/devtools/src/build-time/rules.js +622 -0
  518. package/dist/devtools/src/build-time/rules.js.map +1 -0
  519. package/dist/devtools/src/build-time/transformer.d.ts +23 -0
  520. package/dist/devtools/src/build-time/transformer.d.ts.map +1 -0
  521. package/dist/devtools/src/build-time/transformer.js +294 -0
  522. package/dist/devtools/src/build-time/transformer.js.map +1 -0
  523. package/dist/devtools/src/build-time/types.d.ts +212 -0
  524. package/dist/devtools/src/build-time/types.d.ts.map +1 -0
  525. package/dist/devtools/src/build-time/types.js +8 -0
  526. package/dist/devtools/src/build-time/types.js.map +1 -0
  527. package/dist/devtools/src/debug/debug.d.ts +61 -0
  528. package/dist/devtools/src/debug/debug.d.ts.map +1 -0
  529. package/dist/devtools/src/debug/debug.js +239 -0
  530. package/dist/devtools/src/debug/debug.js.map +1 -0
  531. package/dist/devtools/src/debug/development-warnings.d.ts +42 -0
  532. package/dist/devtools/src/debug/development-warnings.d.ts.map +1 -0
  533. package/dist/devtools/src/debug/development-warnings.js +84 -0
  534. package/dist/devtools/src/debug/development-warnings.js.map +1 -0
  535. package/dist/devtools/src/debug/enhanced-errors.d.ts +176 -0
  536. package/dist/devtools/src/debug/enhanced-errors.d.ts.map +1 -0
  537. package/dist/devtools/src/debug/enhanced-errors.js +481 -0
  538. package/dist/devtools/src/debug/enhanced-errors.js.map +1 -0
  539. package/dist/devtools/src/debug/enhanced-types.d.ts +284 -0
  540. package/dist/devtools/src/debug/enhanced-types.d.ts.map +1 -0
  541. package/dist/devtools/src/debug/enhanced-types.js +8 -0
  542. package/dist/devtools/src/debug/enhanced-types.js.map +1 -0
  543. package/dist/devtools/src/debug/index.d.ts +13 -0
  544. package/dist/devtools/src/debug/index.d.ts.map +1 -0
  545. package/dist/devtools/src/debug/index.js +17 -0
  546. package/dist/devtools/src/debug/index.js.map +1 -0
  547. package/dist/devtools/src/debug/validation-debug-tools.d.ts +228 -0
  548. package/dist/devtools/src/debug/validation-debug-tools.d.ts.map +1 -0
  549. package/dist/devtools/src/debug/validation-debug-tools.js +472 -0
  550. package/dist/devtools/src/debug/validation-debug-tools.js.map +1 -0
  551. package/dist/devtools/src/import-guide.d.ts +50 -0
  552. package/dist/devtools/src/import-guide.d.ts.map +1 -0
  553. package/dist/devtools/src/import-guide.js +257 -0
  554. package/dist/devtools/src/import-guide.js.map +1 -0
  555. package/dist/devtools/src/index.d.ts +24 -0
  556. package/dist/devtools/src/index.d.ts.map +1 -0
  557. package/dist/devtools/src/index.js +32 -0
  558. package/dist/devtools/src/index.js.map +1 -0
  559. package/dist/devtools/src/inspector/index.d.ts +232 -0
  560. package/dist/devtools/src/inspector/index.d.ts.map +1 -0
  561. package/dist/devtools/src/inspector/index.js +551 -0
  562. package/dist/devtools/src/inspector/index.js.map +1 -0
  563. package/dist/devtools/src/modifier-parameter-system.d.ts +69 -0
  564. package/dist/devtools/src/modifier-parameter-system.d.ts.map +1 -0
  565. package/dist/devtools/src/modifier-parameter-system.js +462 -0
  566. package/dist/devtools/src/modifier-parameter-system.js.map +1 -0
  567. package/dist/devtools/src/plugins/simplified-error-handler.d.ts +83 -0
  568. package/dist/devtools/src/plugins/simplified-error-handler.d.ts.map +1 -0
  569. package/dist/devtools/src/plugins/simplified-error-handler.js +335 -0
  570. package/dist/devtools/src/plugins/simplified-error-handler.js.map +1 -0
  571. package/dist/devtools/src/profiler/index.d.ts +21 -0
  572. package/dist/devtools/src/profiler/index.d.ts.map +1 -0
  573. package/dist/devtools/src/profiler/index.js +30 -0
  574. package/dist/devtools/src/profiler/index.js.map +1 -0
  575. package/dist/devtools/src/profiler/performance-optimizer.d.ts +115 -0
  576. package/dist/devtools/src/profiler/performance-optimizer.d.ts.map +1 -0
  577. package/dist/devtools/src/profiler/performance-optimizer.js +273 -0
  578. package/dist/devtools/src/profiler/performance-optimizer.js.map +1 -0
  579. package/dist/devtools/src/profiler/production-monitoring.d.ts +150 -0
  580. package/dist/devtools/src/profiler/production-monitoring.d.ts.map +1 -0
  581. package/dist/devtools/src/profiler/production-monitoring.js +274 -0
  582. package/dist/devtools/src/profiler/production-monitoring.js.map +1 -0
  583. package/dist/devtools/src/runtime/error-boundary.d.ts +302 -0
  584. package/dist/devtools/src/runtime/error-boundary.d.ts.map +1 -0
  585. package/dist/devtools/src/runtime/error-boundary.js +717 -0
  586. package/dist/devtools/src/runtime/error-boundary.js.map +1 -0
  587. package/dist/devtools/src/runtime/error-recovery.d.ts +267 -0
  588. package/dist/devtools/src/runtime/error-recovery.d.ts.map +1 -0
  589. package/dist/devtools/src/runtime/error-recovery.js +499 -0
  590. package/dist/devtools/src/runtime/error-recovery.js.map +1 -0
  591. package/dist/devtools/src/runtime/error-reporting.d.ts +287 -0
  592. package/dist/devtools/src/runtime/error-reporting.d.ts.map +1 -0
  593. package/dist/devtools/src/runtime/error-reporting.js +626 -0
  594. package/dist/devtools/src/runtime/error-reporting.js.map +1 -0
  595. package/dist/devtools/src/runtime/error-utils.d.ts +204 -0
  596. package/dist/devtools/src/runtime/error-utils.d.ts.map +1 -0
  597. package/dist/devtools/src/runtime/error-utils.js +519 -0
  598. package/dist/devtools/src/runtime/error-utils.js.map +1 -0
  599. package/dist/devtools/src/runtime/performance.d.ts +217 -0
  600. package/dist/devtools/src/runtime/performance.d.ts.map +1 -0
  601. package/dist/devtools/src/runtime/performance.js +538 -0
  602. package/dist/devtools/src/runtime/performance.js.map +1 -0
  603. package/dist/devtools/src/testing/index.d.ts +29 -0
  604. package/dist/devtools/src/testing/index.d.ts.map +1 -0
  605. package/dist/devtools/src/testing/index.js +48 -0
  606. package/dist/devtools/src/testing/index.js.map +1 -0
  607. package/dist/devtools/src/validation/enhanced-runtime.d.ts +310 -0
  608. package/dist/devtools/src/validation/enhanced-runtime.d.ts.map +1 -0
  609. package/dist/devtools/src/validation/enhanced-runtime.js +603 -0
  610. package/dist/devtools/src/validation/enhanced-runtime.js.map +1 -0
  611. package/dist/devtools/src/validation/error-reporting.d.ts +186 -0
  612. package/dist/devtools/src/validation/error-reporting.d.ts.map +1 -0
  613. package/dist/devtools/src/validation/error-reporting.js +439 -0
  614. package/dist/devtools/src/validation/error-reporting.js.map +1 -0
  615. package/package.json +6 -2
  616. package/dist/commands/analyze.d.ts.map +0 -1
  617. package/dist/commands/analyze.js.map +0 -1
  618. package/dist/commands/dev.d.ts.map +0 -1
  619. package/dist/commands/dev.js.map +0 -1
  620. package/dist/commands/generate.d.ts.map +0 -1
  621. package/dist/commands/generate.js.map +0 -1
  622. package/dist/commands/init.d.ts.map +0 -1
  623. package/dist/commands/init.js.map +0 -1
  624. package/dist/commands/migrate.d.ts.map +0 -1
  625. package/dist/commands/migrate.js.map +0 -1
  626. package/dist/commands/optimize.d.ts.map +0 -1
  627. package/dist/commands/optimize.js.map +0 -1
  628. package/dist/index.d.ts.map +0 -1
  629. package/dist/index.js.map +0 -1
  630. /package/dist/{commands → cli/src/commands}/analyze.d.ts +0 -0
  631. /package/dist/{commands → cli/src/commands}/dev.d.ts +0 -0
  632. /package/dist/{commands → cli/src/commands}/dev.js +0 -0
  633. /package/dist/{commands → cli/src/commands}/generate.d.ts +0 -0
  634. /package/dist/{commands → cli/src/commands}/init.d.ts +0 -0
  635. /package/dist/{commands → cli/src/commands}/migrate.d.ts +0 -0
  636. /package/dist/{commands → cli/src/commands}/optimize.d.ts +0 -0
  637. /package/dist/{commands → cli/src/commands}/optimize.js +0 -0
  638. /package/dist/{index.d.ts → cli/src/index.d.ts} +0 -0
@@ -0,0 +1,1181 @@
1
+ /**
2
+ * Direct DOM Renderer (Phase 3.1.1)
3
+ *
4
+ * Efficient DOM manipulation without virtual DOM overhead.
5
+ * Provides surgical DOM updates integrated with the reactive system.
6
+ */
7
+ import { applyModifiersToNode } from '../modifiers/registry';
8
+ import { createEffect, createRoot, isComputed, isSignal, untrack } from '../reactive';
9
+ import { semanticRoleManager } from './semantic-role-manager';
10
+ import { globalEventDelegator } from './event-delegation';
11
+ // Debug functionality moved to @tachui/devtools package
12
+ // Create a simple mock for backward compatibility
13
+ const debugManager = {
14
+ isEnabled: () => false,
15
+ logComponent: (..._args) => { },
16
+ addDebugAttributes: (..._args) => { },
17
+ };
18
+ export class DOMRenderer {
19
+ nodeMap = new WeakMap();
20
+ cleanupMap = new WeakMap();
21
+ renderedNodes = new Set();
22
+ // Map each element to its delegation container
23
+ elementToContainer = new WeakMap();
24
+ metrics = {
25
+ created: 0,
26
+ adopted: 0,
27
+ removed: 0,
28
+ inserted: 0,
29
+ moved: 0,
30
+ cacheHits: 0,
31
+ cacheMisses: 0,
32
+ attributeWrites: 0,
33
+ attributeRemovals: 0,
34
+ textUpdates: 0,
35
+ modifierApplications: 0,
36
+ };
37
+ /**
38
+ * Render a DOM node to an actual DOM element
39
+ */
40
+ render(node, container) {
41
+ if (Array.isArray(node)) {
42
+ return this.renderFragment(node, container);
43
+ }
44
+ return this.renderSingle(node, container);
45
+ }
46
+ /**
47
+ * Check if a DOM node has been rendered and tracked.
48
+ */
49
+ hasNode(node) {
50
+ return this.nodeMap.has(node);
51
+ }
52
+ /**
53
+ * Get the rendered DOM element associated with a node.
54
+ */
55
+ getRenderedNode(node) {
56
+ return this.nodeMap.get(node);
57
+ }
58
+ /**
59
+ * Render a single DOM node
60
+ */
61
+ renderSingle(node, container) {
62
+ // Track rendered nodes for cleanup
63
+ this.renderedNodes.add(node);
64
+ let element;
65
+ switch (node.type) {
66
+ case 'element':
67
+ element = this.createOrUpdateElement(node, container);
68
+ break;
69
+ case 'text':
70
+ element = this.createOrUpdateTextNode(node);
71
+ break;
72
+ case 'comment':
73
+ element = this.createComment(node);
74
+ this.metrics.created++;
75
+ break;
76
+ default:
77
+ throw new Error(`Unknown node type: ${node.type}`);
78
+ }
79
+ // Store reference
80
+ this.nodeMap.set(node, element);
81
+ node.element = element;
82
+ // Track delegation container for this element
83
+ if (element instanceof Element && container) {
84
+ this.elementToContainer.set(element, container);
85
+ }
86
+ // Apply modifiers if present (only for Element nodes, not Text/Comment)
87
+ if (element instanceof Element) {
88
+ let modifiers = [];
89
+ // Check for modifiers directly on the node
90
+ if ('modifiers' in node &&
91
+ Array.isArray(node.modifiers) &&
92
+ node.modifiers.length > 0) {
93
+ modifiers = node.modifiers;
94
+ }
95
+ // Check for modifiers in component metadata
96
+ if ('componentMetadata' in node &&
97
+ node.componentMetadata?.modifiers &&
98
+ Array.isArray(node.componentMetadata.modifiers) &&
99
+ node.componentMetadata.modifiers.length > 0) {
100
+ modifiers = node.componentMetadata.modifiers;
101
+ }
102
+ if (modifiers.length > 0) {
103
+ this.applyModifiersToElement(element, modifiers, node);
104
+ }
105
+ }
106
+ // Set up cleanup if provided
107
+ if (node.dispose) {
108
+ this.addCleanup(element, node.dispose);
109
+ }
110
+ // Append to container if provided
111
+ if (container) {
112
+ this.appendNode(container, element);
113
+ }
114
+ return element;
115
+ }
116
+ /**
117
+ * Render multiple nodes as a document fragment
118
+ */
119
+ renderFragment(nodes, container) {
120
+ const fragment = document.createDocumentFragment();
121
+ nodes.forEach(node => {
122
+ const element = this.renderSingle(node);
123
+ fragment.appendChild(element);
124
+ });
125
+ if (container) {
126
+ container.appendChild(fragment);
127
+ this.metrics.inserted += nodes.length;
128
+ }
129
+ return fragment;
130
+ }
131
+ /**
132
+ * Create a DOM element with props and children
133
+ */
134
+ createOrUpdateElement(node, container) {
135
+ if (!node.tag) {
136
+ throw new Error('Element node must have a tag');
137
+ }
138
+ if (node.element && node.element instanceof Element) {
139
+ const element = node.element;
140
+ // Update container mapping if container changed
141
+ if (container) {
142
+ this.elementToContainer.set(element, container);
143
+ }
144
+ this.updateProps(element, node, container);
145
+ this.updateChildren(element, node);
146
+ return element;
147
+ }
148
+ const element = document.createElement(node.tag);
149
+ this.metrics.created++;
150
+ // Track delegation container for this element
151
+ if (container) {
152
+ this.elementToContainer.set(element, container);
153
+ }
154
+ // Apply debug attributes if debug mode is enabled
155
+ this.applyDebugAttributes(element, node);
156
+ this.updateProps(element, node, container);
157
+ this.updateChildren(element, node);
158
+ return element;
159
+ }
160
+ updateProps(element, node, container) {
161
+ const newProps = node.props || {};
162
+ const previousProps = node.__appliedProps || {};
163
+ // Remove props that are no longer present
164
+ Object.keys(previousProps).forEach(key => {
165
+ if (!(key in newProps)) {
166
+ if (key === 'key')
167
+ return;
168
+ if (key === 'children')
169
+ return;
170
+ if (key.startsWith('on')) {
171
+ return;
172
+ }
173
+ this.setElementProp(element, key, undefined);
174
+ }
175
+ });
176
+ Object.entries(newProps).forEach(([key, value]) => {
177
+ if (key === 'key' || key === 'children')
178
+ return;
179
+ if (previousProps && previousProps[key] === value) {
180
+ return;
181
+ }
182
+ this.applyProp(element, key, value, container);
183
+ });
184
+ node.__appliedProps = { ...newProps };
185
+ if ('componentMetadata' in node && node.componentMetadata) {
186
+ const metadata = node.componentMetadata;
187
+ if (metadata.overriddenTo && metadata.originalType) {
188
+ if (node.tag) {
189
+ try {
190
+ semanticRoleManager.processElementNode(element, node.tag, metadata, newProps?.['aria'] || undefined);
191
+ }
192
+ catch (error) {
193
+ console.warn('[tachUI] Could not process semantic attributes:', error);
194
+ }
195
+ }
196
+ }
197
+ }
198
+ }
199
+ updateChildren(element, node) {
200
+ const previousChildren = node.__renderedChildren || [];
201
+ const newChildren = node.children || [];
202
+ // Get delegation container for this element's children
203
+ const delegationContainer = this.elementToContainer.get(element);
204
+ const debugChildDiff = typeof process !== 'undefined' && process.env?.TACHUI_DEBUG_PHASE1B === '1';
205
+ if (previousChildren.length === newChildren.length &&
206
+ previousChildren.length > 0 &&
207
+ previousChildren.every((child, index) => child === newChildren[index])) {
208
+ newChildren.forEach(child => {
209
+ this.updateExistingNode(child);
210
+ });
211
+ node.__renderedChildren = newChildren;
212
+ return;
213
+ }
214
+ if (previousChildren.length === 0) {
215
+ newChildren.forEach(child => {
216
+ // Skip undefined/null children
217
+ if (!child || child.type == null)
218
+ return;
219
+ const childElement = this.renderSingle(child, delegationContainer);
220
+ this.appendNode(element, childElement);
221
+ });
222
+ node.__renderedChildren = newChildren;
223
+ return;
224
+ }
225
+ const previousByKey = new Map();
226
+ const previousKeyless = [];
227
+ previousChildren.forEach(prevChild => {
228
+ if (prevChild.key != null) {
229
+ previousByKey.set(prevChild.key, prevChild);
230
+ }
231
+ else {
232
+ previousKeyless.push(prevChild);
233
+ }
234
+ });
235
+ const domNodes = Array.from({ length: newChildren.length });
236
+ newChildren.forEach((child, index) => {
237
+ let matched;
238
+ if (child.key != null) {
239
+ matched = previousByKey.get(child.key);
240
+ if (matched) {
241
+ previousByKey.delete(child.key);
242
+ }
243
+ }
244
+ else if (previousKeyless.length > 0) {
245
+ matched = previousKeyless.shift();
246
+ }
247
+ if (matched) {
248
+ this.adoptNode(matched, child);
249
+ }
250
+ // Ensure child is rendered using existing element when possible, pass delegation container
251
+ const rendered = this.renderSingle(child, delegationContainer);
252
+ domNodes[index] = rendered;
253
+ });
254
+ if (debugChildDiff && node.tag) {
255
+ const debugKeys = newChildren.map(child => child.key ?? null);
256
+ const debugPrevKeys = previousChildren.map(child => child.key ?? null);
257
+ const debugDom = domNodes.map(domNode => domNode && 'getAttribute' in domNode
258
+ ? domNode.getAttribute('data-id')
259
+ : null);
260
+ console.log('[diff] state', {
261
+ parent: node.tag,
262
+ prev: debugPrevKeys,
263
+ next: debugKeys,
264
+ dom: debugDom,
265
+ });
266
+ }
267
+ previousByKey.forEach(remaining => {
268
+ this.removeNode(remaining);
269
+ });
270
+ previousKeyless.forEach(remaining => {
271
+ this.removeNode(remaining);
272
+ });
273
+ const canReorder = typeof element.insertBefore === 'function' &&
274
+ typeof element.appendChild === 'function';
275
+ if (canReorder) {
276
+ let nextSibling = null;
277
+ for (let i = domNodes.length - 1; i >= 0; i--) {
278
+ const domNode = domNodes[i];
279
+ if (!domNode)
280
+ continue;
281
+ this.insertNode(element, domNode, nextSibling);
282
+ nextSibling = domNode;
283
+ }
284
+ }
285
+ ;
286
+ node.__renderedChildren = newChildren;
287
+ }
288
+ updateExistingNode(node) {
289
+ if (node.type === 'element' && node.element instanceof Element) {
290
+ // Get the delegation container for this element
291
+ const container = this.elementToContainer.get(node.element);
292
+ this.updateProps(node.element, node, container);
293
+ this.updateChildren(node.element, node);
294
+ }
295
+ else if (node.type === 'text' && node.element instanceof Text) {
296
+ // Update text content if it changed
297
+ if (node.element.textContent !== node.text) {
298
+ node.element.textContent = node.text || '';
299
+ this.recordTextUpdate();
300
+ }
301
+ }
302
+ }
303
+ /**
304
+ * Apply debug attributes to DOM element if debug mode is enabled
305
+ */
306
+ applyDebugAttributes(element, node) {
307
+ if (!debugManager.isEnabled()) {
308
+ return;
309
+ }
310
+ // Extract component type and debug label from various sources
311
+ let componentType = node.tag || 'element';
312
+ let debugLabel;
313
+ // Check component metadata for more specific type and debug label
314
+ if ('componentMetadata' in node && node.componentMetadata) {
315
+ const metadata = node.componentMetadata;
316
+ if (metadata.type) {
317
+ componentType = metadata.type;
318
+ }
319
+ }
320
+ // Check props for debug label
321
+ if (node.props && 'data-tachui-label' in node.props) {
322
+ debugLabel = node.props['data-tachui-label'];
323
+ }
324
+ // Check direct debug label in props
325
+ if (node.props && 'debugLabel' in node.props) {
326
+ debugLabel = node.props.debugLabel;
327
+ }
328
+ // Apply debug attributes using the debug manager
329
+ debugManager.addDebugAttributes(element, componentType, debugLabel);
330
+ }
331
+ /**
332
+ * Create or update a text node
333
+ */
334
+ createOrUpdateTextNode(node) {
335
+ // Check if we can reuse existing text node
336
+ if (node.element && node.element instanceof Text) {
337
+ const textElement = node.element;
338
+ // Update text content in place if it changed
339
+ if (textElement.textContent !== node.text) {
340
+ textElement.textContent = node.text || '';
341
+ this.recordTextUpdate();
342
+ }
343
+ // Handle reactive content update
344
+ if (node.reactiveContent && !node.dispose) {
345
+ const content = node.reactiveContent;
346
+ const effect = createEffect(() => {
347
+ try {
348
+ const newText = content();
349
+ node.text = String(newText);
350
+ // Check if parent element has AsHTML flag
351
+ const parentElement = textElement.parentElement;
352
+ if (parentElement && parentElement.__tachui_asHTML) {
353
+ return;
354
+ }
355
+ textElement.textContent = node.text;
356
+ this.recordTextUpdate();
357
+ }
358
+ catch (error) {
359
+ console.error('createOrUpdateTextNode() reactive effect error:', error);
360
+ }
361
+ });
362
+ node.dispose = () => {
363
+ effect.dispose();
364
+ };
365
+ }
366
+ return textElement;
367
+ }
368
+ // Create new text node if none exists
369
+ return this.createTextNode(node);
370
+ }
371
+ /**
372
+ * Create a text node
373
+ */
374
+ createTextNode(node) {
375
+ const textElement = document.createTextNode(node.text || '');
376
+ this.metrics.created++;
377
+ this.recordTextUpdate();
378
+ // Set up reactivity if this is a reactive text node
379
+ if (node.reactiveContent) {
380
+ const content = node.reactiveContent;
381
+ // Create reactive effect now that we have the DOM element
382
+ const effect = createEffect(() => {
383
+ try {
384
+ const newText = content();
385
+ node.text = String(newText);
386
+ // Check if parent element has AsHTML flag
387
+ const parentElement = textElement.parentElement;
388
+ if (parentElement && parentElement.__tachui_asHTML) {
389
+ // Skip updating text content when AsHTML is active
390
+ return;
391
+ }
392
+ textElement.textContent = node.text;
393
+ this.recordTextUpdate();
394
+ }
395
+ catch (error) {
396
+ console.error('createTextNode() reactive effect error:', error);
397
+ }
398
+ });
399
+ // Store cleanup function on the node
400
+ node.dispose = () => {
401
+ effect.dispose();
402
+ };
403
+ }
404
+ return textElement;
405
+ }
406
+ /**
407
+ * Create a comment node
408
+ */
409
+ createComment(node) {
410
+ this.metrics.created++;
411
+ return document.createComment(node.text || '');
412
+ }
413
+ /**
414
+ * Apply props to a DOM element with reactive updates
415
+ */
416
+ applyProps(element, props) {
417
+ Object.entries(props).forEach(([key, value]) => {
418
+ this.applyProp(element, key, value);
419
+ });
420
+ }
421
+ /**
422
+ * Apply a single prop to an element
423
+ */
424
+ applyProp(element, key, value, container) {
425
+ // Handle special props
426
+ if (key === 'className' || key === 'class') {
427
+ this.applyClassName(element, value);
428
+ return;
429
+ }
430
+ if (key === 'style') {
431
+ this.applyStyle(element, value);
432
+ return;
433
+ }
434
+ if (key.startsWith('on') && typeof value === 'function') {
435
+ this.applyEventListener(element, key, value, container);
436
+ return;
437
+ }
438
+ // Handle reactive values (signals and computed)
439
+ if (isSignal(value) || isComputed(value)) {
440
+ // Create reactive effect to update DOM when signal changes
441
+ const effect = createEffect(() => {
442
+ const currentValue = value();
443
+ this.setElementProp(element, key, currentValue);
444
+ });
445
+ // Add cleanup for the effect
446
+ this.addCleanup(element, () => {
447
+ effect.dispose();
448
+ });
449
+ return;
450
+ }
451
+ // Handle regular props
452
+ this.setElementProp(element, key, value);
453
+ }
454
+ /**
455
+ * Set a property on an element
456
+ */
457
+ setElementProp(element, key, value) {
458
+ if (value == null) {
459
+ if (element.hasAttribute(key)) {
460
+ element.removeAttribute(key);
461
+ this.recordAttributeRemoval();
462
+ }
463
+ return;
464
+ }
465
+ // Use properties instead of attributes for form elements (faster)
466
+ const htmlElement = element;
467
+ if ((key === 'value' || key === 'checked' || key === 'disabled') &&
468
+ key in htmlElement) {
469
+ if (htmlElement[key] !== value) {
470
+ htmlElement[key] = value;
471
+ this.recordAttributeWrite();
472
+ }
473
+ return;
474
+ }
475
+ // Handle boolean attributes
476
+ if (typeof value === 'boolean') {
477
+ if (value) {
478
+ if (!element.hasAttribute(key)) {
479
+ element.setAttribute(key, '');
480
+ this.recordAttributeWrite();
481
+ }
482
+ }
483
+ else {
484
+ if (element.hasAttribute(key)) {
485
+ element.removeAttribute(key);
486
+ this.recordAttributeRemoval();
487
+ }
488
+ else {
489
+ element.removeAttribute(key);
490
+ }
491
+ }
492
+ return;
493
+ }
494
+ // Handle regular attributes - only set if changed
495
+ const currentValue = element.getAttribute(key);
496
+ const stringValue = String(value);
497
+ if (currentValue !== stringValue) {
498
+ element.setAttribute(key, stringValue);
499
+ this.recordAttributeWrite();
500
+ }
501
+ }
502
+ /**
503
+ * Apply className with reactive updates
504
+ */
505
+ applyClassName(element, value) {
506
+ if (isSignal(value) || isComputed(value)) {
507
+ // Reactive className
508
+ const effect = createEffect(() => {
509
+ const currentValue = value();
510
+ const newClassName = this.normalizeClassName(currentValue);
511
+ if (element.className !== newClassName) {
512
+ element.className = newClassName;
513
+ this.recordAttributeWrite();
514
+ }
515
+ });
516
+ // Add cleanup
517
+ this.addCleanup(element, () => {
518
+ effect.dispose();
519
+ });
520
+ }
521
+ else {
522
+ const newClassName = this.normalizeClassName(value);
523
+ if (element.className !== newClassName) {
524
+ element.className = newClassName;
525
+ this.recordAttributeWrite();
526
+ }
527
+ }
528
+ }
529
+ /**
530
+ * Normalize className value
531
+ */
532
+ normalizeClassName(value) {
533
+ if (Array.isArray(value)) {
534
+ return value.filter(Boolean).join(' ');
535
+ }
536
+ if (typeof value === 'object' && value !== null) {
537
+ return Object.entries(value)
538
+ .filter(([, condition]) => Boolean(condition))
539
+ .map(([className]) => className)
540
+ .join(' ');
541
+ }
542
+ return String(value || '');
543
+ }
544
+ /**
545
+ * Apply styles with reactive updates
546
+ */
547
+ applyStyle(element, value) {
548
+ const htmlElement = element;
549
+ if (isSignal(value) || isComputed(value)) {
550
+ // Reactive styles
551
+ const effect = createEffect(() => {
552
+ const currentValue = value();
553
+ this.setElementStyles(htmlElement, currentValue);
554
+ });
555
+ // Add cleanup
556
+ this.addCleanup(element, () => {
557
+ effect.dispose();
558
+ });
559
+ }
560
+ else {
561
+ this.setElementStyles(htmlElement, value);
562
+ }
563
+ }
564
+ /**
565
+ * Set styles on an element
566
+ */
567
+ setElementStyles(element, styles) {
568
+ if (typeof styles === 'string') {
569
+ if (element.style.cssText !== styles) {
570
+ element.style.cssText = styles;
571
+ this.recordAttributeWrite();
572
+ }
573
+ return;
574
+ }
575
+ if (typeof styles === 'object' && styles !== null) {
576
+ // Get previous style object for comparison
577
+ const prevStyles = element.__appliedStyles || {};
578
+ // Remove properties that are no longer present
579
+ Object.keys(prevStyles).forEach(property => {
580
+ if (!(property in styles)) {
581
+ element.style.removeProperty(property.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`));
582
+ this.recordAttributeRemoval();
583
+ }
584
+ });
585
+ Object.entries(styles).forEach(([property, value]) => {
586
+ if (isSignal(value) || isComputed(value)) {
587
+ // Individual style property is reactive
588
+ const effect = createEffect(() => {
589
+ const currentValue = value();
590
+ const kebabProperty = property.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`);
591
+ if (currentValue == null) {
592
+ element.style.removeProperty(kebabProperty);
593
+ this.recordAttributeRemoval();
594
+ }
595
+ else {
596
+ const stringValue = String(currentValue);
597
+ const currentStyleValue = element.style.getPropertyValue(kebabProperty);
598
+ if (currentStyleValue !== stringValue) {
599
+ element.style.setProperty(kebabProperty, stringValue);
600
+ this.recordAttributeWrite();
601
+ }
602
+ }
603
+ });
604
+ // Add cleanup
605
+ this.addCleanup(element, () => {
606
+ effect.dispose();
607
+ });
608
+ }
609
+ else {
610
+ // Static style property - only set if changed
611
+ const kebabProperty = property.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`);
612
+ if (value == null) {
613
+ if (element.style.getPropertyValue(kebabProperty)) {
614
+ element.style.removeProperty(kebabProperty);
615
+ this.recordAttributeRemoval();
616
+ }
617
+ }
618
+ else {
619
+ const stringValue = String(value);
620
+ const currentStyleValue = element.style.getPropertyValue(kebabProperty);
621
+ if (currentStyleValue !== stringValue) {
622
+ element.style.setProperty(kebabProperty, stringValue);
623
+ this.recordAttributeWrite();
624
+ }
625
+ }
626
+ }
627
+ });
628
+ element.__appliedStyles = { ...styles };
629
+ }
630
+ }
631
+ /**
632
+ * Apply event listener (with delegation if possible)
633
+ */
634
+ applyEventListener(element, eventName, handler, container) {
635
+ let eventType = eventName.slice(2).toLowerCase(); // Remove 'on' prefix
636
+ // Map focus/blur to focusin/focusout for delegation (they bubble)
637
+ if (eventType === 'focus') {
638
+ eventType = 'focusin';
639
+ }
640
+ else if (eventType === 'blur') {
641
+ eventType = 'focusout';
642
+ }
643
+ // Get container from parameter or lookup
644
+ const delegationContainer = container || this.elementToContainer.get(element);
645
+ // Use delegation if we have a container and event type supports it
646
+ if (delegationContainer && globalEventDelegator.shouldDelegate(eventType)) {
647
+ const cleanup = globalEventDelegator.register(delegationContainer, element, eventType, handler);
648
+ this.addCleanup(element, cleanup);
649
+ return;
650
+ }
651
+ // Fallback to direct attachment for non-delegatable events
652
+ const listener = (e) => {
653
+ try {
654
+ handler(e);
655
+ }
656
+ catch (error) {
657
+ console.error(`Event handler error for ${eventName}:`, error);
658
+ }
659
+ };
660
+ // Use passive listeners for scroll-related events
661
+ const options = globalEventDelegator.shouldBePassive(eventType)
662
+ ? { passive: true }
663
+ : undefined;
664
+ element.addEventListener(eventType, listener, options);
665
+ // Add cleanup
666
+ this.addCleanup(element, () => {
667
+ element.removeEventListener(eventType, listener, options);
668
+ });
669
+ }
670
+ /**
671
+ * Add cleanup function for an element
672
+ */
673
+ addCleanup(element, cleanup) {
674
+ const existing = this.cleanupMap.get(element) || [];
675
+ existing.push(cleanup);
676
+ this.cleanupMap.set(element, existing);
677
+ }
678
+ /**
679
+ * Update an existing DOM node
680
+ */
681
+ updateNode(node, newProps) {
682
+ const element = this.nodeMap.get(node);
683
+ if (!element || typeof element.setAttribute !== 'function') {
684
+ return;
685
+ }
686
+ if (newProps) {
687
+ // Directly apply new props without batching to ensure immediate update
688
+ this.applyProps(element, newProps);
689
+ }
690
+ }
691
+ /**
692
+ * Remove a DOM node and run cleanup
693
+ */
694
+ removeNode(node) {
695
+ this.cleanupNode(node, true);
696
+ }
697
+ /**
698
+ * Cleanup a node (and its descendants) and optionally remove from DOM.
699
+ */
700
+ cleanupNode(node, removeFromDom) {
701
+ const element = this.nodeMap.get(node);
702
+ if (node.children && node.children.length > 0) {
703
+ node.children.forEach(child => {
704
+ this.cleanupNode(child, false);
705
+ });
706
+ }
707
+ if (!element) {
708
+ if (node.element !== undefined) {
709
+ node.element = undefined;
710
+ }
711
+ this.renderedNodes.delete(node);
712
+ this.nodeMap.delete(node);
713
+ return;
714
+ }
715
+ // Run cleanup functions
716
+ const cleanupFunctions = this.cleanupMap.get(element);
717
+ if (cleanupFunctions) {
718
+ cleanupFunctions.forEach(cleanup => {
719
+ try {
720
+ cleanup();
721
+ }
722
+ catch (error) {
723
+ console.error('Cleanup error:', error);
724
+ }
725
+ });
726
+ this.cleanupMap.delete(element);
727
+ }
728
+ // Remove from DOM
729
+ if (removeFromDom && element.parentNode) {
730
+ element.parentNode.removeChild(element);
731
+ }
732
+ // Clean up references
733
+ this.nodeMap.delete(node);
734
+ if (node.element !== undefined) {
735
+ node.element = undefined;
736
+ }
737
+ this.renderedNodes.delete(node);
738
+ this.metrics.removed++;
739
+ }
740
+ /**
741
+ * Create reactive text content
742
+ */
743
+ createReactiveText(textAccessor) {
744
+ const textNode = document.createTextNode('');
745
+ createEffect(() => {
746
+ textNode.textContent = textAccessor();
747
+ });
748
+ return textNode;
749
+ }
750
+ /**
751
+ * Create reactive element with dynamic props
752
+ */
753
+ createReactiveElement(tag, propsAccessor, children) {
754
+ const element = document.createElement(tag);
755
+ // Apply reactive props
756
+ createEffect(() => {
757
+ const props = propsAccessor();
758
+ this.applyProps(element, props);
759
+ });
760
+ // Add children
761
+ if (children) {
762
+ children.forEach(child => {
763
+ const childElement = this.renderSingle(child);
764
+ element.appendChild(childElement);
765
+ });
766
+ }
767
+ return element;
768
+ }
769
+ /**
770
+ * Apply modifiers to a DOM element
771
+ */
772
+ applyModifiersToElement(element, modifiers, node) {
773
+ try {
774
+ if (modifiers.length > 0) {
775
+ this.recordModifierApplications(modifiers.length);
776
+ }
777
+ // Extract component instance from node if available
778
+ const componentInstance = node.componentInstance ||
779
+ (node.componentMetadata && node.componentMetadata.componentInstance) ||
780
+ (node._originalComponent) || // Use original component if available
781
+ node;
782
+ // Apply modifiers with batching enabled for better performance
783
+ applyModifiersToNode(node, modifiers, {
784
+ element: element,
785
+ componentId: node.componentId || 'unknown',
786
+ phase: 'creation',
787
+ componentInstance: componentInstance, // Pass the component instance
788
+ }, {
789
+ batch: true, // Enable batched modifier application
790
+ });
791
+ }
792
+ catch (error) {
793
+ console.error('Failed to apply modifiers to element:', error);
794
+ }
795
+ }
796
+ /**
797
+ * Adopt an existing DOM mapping from one node to another.
798
+ */
799
+ adoptNode(oldNode, newNode) {
800
+ const element = this.nodeMap.get(oldNode);
801
+ if (!element)
802
+ return;
803
+ this.nodeMap.set(newNode, element);
804
+ this.nodeMap.delete(oldNode);
805
+ this.renderedNodes.delete(oldNode);
806
+ this.renderedNodes.add(newNode);
807
+ newNode.element = element;
808
+ if (oldNode.dispose) {
809
+ newNode.dispose = oldNode.dispose;
810
+ }
811
+ if (oldNode.__renderedChildren) {
812
+ newNode.__renderedChildren = oldNode.__renderedChildren;
813
+ }
814
+ if (oldNode.__appliedProps) {
815
+ newNode.__appliedProps = oldNode.__appliedProps;
816
+ }
817
+ this.metrics.adopted++;
818
+ }
819
+ /**
820
+ * Cleanup all tracked elements
821
+ */
822
+ cleanup() {
823
+ // Call dispose on all rendered nodes
824
+ for (const node of this.renderedNodes) {
825
+ if (node.dispose && typeof node.dispose === 'function') {
826
+ try {
827
+ node.dispose();
828
+ }
829
+ catch (error) {
830
+ console.error('Cleanup error:', error);
831
+ }
832
+ }
833
+ }
834
+ // Clear all tracking
835
+ this.renderedNodes.clear();
836
+ this.nodeMap = new WeakMap();
837
+ this.cleanupMap = new WeakMap();
838
+ this.resetMetrics();
839
+ }
840
+ resetMetrics() {
841
+ this.metrics = {
842
+ created: 0,
843
+ adopted: 0,
844
+ removed: 0,
845
+ inserted: 0,
846
+ moved: 0,
847
+ cacheHits: 0,
848
+ cacheMisses: 0,
849
+ attributeWrites: 0,
850
+ attributeRemovals: 0,
851
+ textUpdates: 0,
852
+ modifierApplications: 0,
853
+ };
854
+ }
855
+ getMetrics() {
856
+ return { ...this.metrics };
857
+ }
858
+ recordCacheHit() {
859
+ this.metrics.cacheHits++;
860
+ }
861
+ recordCacheMiss() {
862
+ this.metrics.cacheMisses++;
863
+ }
864
+ insertNode(container, node, nextSibling) {
865
+ const debugChildDiff = typeof process !== 'undefined' && process.env?.TACHUI_DEBUG_PHASE1B === '1';
866
+ if (node.parentNode !== container) {
867
+ if (debugChildDiff) {
868
+ console.log('[diff] insertNode append', {
869
+ tag: 'tagName' in node ? node.tagName : 'text',
870
+ before: nextSibling && 'getAttribute' in nextSibling
871
+ ? nextSibling.getAttribute('data-id')
872
+ : null,
873
+ });
874
+ }
875
+ container.insertBefore(node, nextSibling);
876
+ this.metrics.inserted++;
877
+ }
878
+ else if (node.nextSibling !== nextSibling) {
879
+ if (debugChildDiff) {
880
+ console.log('[diff] insertNode move', {
881
+ tag: 'tagName' in node ? node.tagName : 'text',
882
+ before: nextSibling && 'getAttribute' in nextSibling
883
+ ? nextSibling.getAttribute('data-id')
884
+ : null,
885
+ });
886
+ }
887
+ container.insertBefore(node, nextSibling);
888
+ this.metrics.moved++;
889
+ }
890
+ }
891
+ appendNode(container, node) {
892
+ if (node.parentNode !== container) {
893
+ container.appendChild(node);
894
+ this.metrics.inserted++;
895
+ }
896
+ }
897
+ recordAttributeWrite() {
898
+ this.metrics.attributeWrites++;
899
+ }
900
+ recordAttributeRemoval() {
901
+ this.metrics.attributeRemovals++;
902
+ }
903
+ recordTextUpdate() {
904
+ this.metrics.textUpdates++;
905
+ }
906
+ recordModifierApplications(count) {
907
+ this.metrics.modifierApplications += count;
908
+ }
909
+ }
910
+ /**
911
+ * Global renderer instance
912
+ */
913
+ const globalRenderer = new DOMRenderer();
914
+ export function resetRendererMetrics() {
915
+ globalRenderer.resetMetrics();
916
+ }
917
+ export function getRendererMetrics() {
918
+ return globalRenderer.getMetrics();
919
+ }
920
+ /**
921
+ * Render a component instance to DOM
922
+ */
923
+ export function renderComponent(instance, container) {
924
+ return createRoot(() => {
925
+ let currentNodes = [];
926
+ // Key-based element cache for structural node reuse across renders
927
+ const keyToNodeCache = new Map();
928
+ // Helper to recursively populate node.element from cache
929
+ const populateFromCache = (node) => {
930
+ if (node.key != null) {
931
+ const cached = keyToNodeCache.get(node.key);
932
+ if (cached && cached.type === node.type && cached.tag === node.tag && cached.element) {
933
+ // Transfer the DOM element reference to the new node
934
+ node.element = cached.element;
935
+ // Also transfer internal state for reconciliation
936
+ if (cached.__appliedProps) {
937
+ node.__appliedProps = cached.__appliedProps;
938
+ }
939
+ if (cached.__renderedChildren) {
940
+ node.__renderedChildren = cached.__renderedChildren;
941
+ }
942
+ globalRenderer.recordCacheHit();
943
+ }
944
+ else {
945
+ globalRenderer.recordCacheMiss();
946
+ }
947
+ }
948
+ // Recursively process children
949
+ if (node.children) {
950
+ node.children.forEach(populateFromCache);
951
+ }
952
+ };
953
+ // Create reactive effect for component re-rendering
954
+ const effect = createEffect(() => {
955
+ // Auto-build if it's a ModifierBuilder
956
+ let componentToRender = instance;
957
+ if ('build' in instance && typeof instance.build === 'function') {
958
+ // This is a ModifierBuilder that hasn't been built yet - build it automatically
959
+ componentToRender = instance.build();
960
+ }
961
+ const renderResult = componentToRender.render();
962
+ const nodes = Array.isArray(renderResult) ? renderResult : [renderResult];
963
+ // Pre-populate node.element from key cache BEFORE reconciliation
964
+ // This allows createOrUpdateElement() to see existing DOM elements and reuse them
965
+ nodes.forEach(populateFromCache);
966
+ const removalSet = new Set(currentNodes);
967
+ const adoptedByIndex = new Set();
968
+ const adoptedOldNodes = new Set();
969
+ const minLength = Math.min(currentNodes.length, nodes.length);
970
+ for (let i = 0; i < minLength; i++) {
971
+ const oldNode = currentNodes[i];
972
+ const newNode = nodes[i];
973
+ if (oldNode &&
974
+ newNode &&
975
+ oldNode.type === newNode.type &&
976
+ oldNode.tag === newNode.tag &&
977
+ (oldNode.key === newNode.key || (oldNode.key == null && newNode.key == null))) {
978
+ globalRenderer.adoptNode(oldNode, newNode);
979
+ adoptedByIndex.add(newNode);
980
+ adoptedOldNodes.add(oldNode);
981
+ removalSet.delete(oldNode);
982
+ }
983
+ }
984
+ // Update key cache with current nodes
985
+ currentNodes.forEach(node => {
986
+ if (node.key != null) {
987
+ keyToNodeCache.set(node.key, node);
988
+ }
989
+ });
990
+ const currentKeyMap = new Map();
991
+ currentNodes.forEach(node => {
992
+ if (node.key != null && !adoptedOldNodes.has(node)) {
993
+ currentKeyMap.set(node.key, node);
994
+ }
995
+ });
996
+ const domNodes = nodes.map(node => {
997
+ if (adoptedByIndex.has(node)) {
998
+ // Update the adopted node to reconcile children - pass container for delegation
999
+ globalRenderer.render(node, container);
1000
+ return globalRenderer.getRenderedNode(node);
1001
+ }
1002
+ // Check key cache first for structural node reuse
1003
+ if (node.key != null) {
1004
+ const cached = keyToNodeCache.get(node.key);
1005
+ if (cached && cached.type === node.type && cached.tag === node.tag) {
1006
+ // Cache hit - reuse existing DOM element
1007
+ globalRenderer.recordCacheHit();
1008
+ removalSet.delete(cached);
1009
+ currentKeyMap.delete(node.key);
1010
+ keyToNodeCache.set(node.key, node); // Update cache with new node
1011
+ globalRenderer.adoptNode(cached, node);
1012
+ // Update the node to reconcile children - pass container for delegation
1013
+ globalRenderer.render(node, container);
1014
+ return globalRenderer.getRenderedNode(node);
1015
+ }
1016
+ else {
1017
+ globalRenderer.recordCacheMiss();
1018
+ }
1019
+ }
1020
+ if (node.key != null) {
1021
+ const existing = currentKeyMap.get(node.key);
1022
+ if (existing) {
1023
+ currentKeyMap.delete(node.key);
1024
+ removalSet.delete(existing);
1025
+ globalRenderer.adoptNode(existing, node);
1026
+ keyToNodeCache.set(node.key, node); // Cache for next render
1027
+ // Update the node to reconcile children - pass container for delegation
1028
+ globalRenderer.render(node, container);
1029
+ return globalRenderer.getRenderedNode(node);
1030
+ }
1031
+ }
1032
+ if (node.key != null) {
1033
+ // Attempt to reuse a node that was removed earlier but matches by key.
1034
+ for (const candidate of removalSet) {
1035
+ if (candidate.key === node.key) {
1036
+ removalSet.delete(candidate);
1037
+ globalRenderer.adoptNode(candidate, node);
1038
+ // Update the node to reconcile children - pass container for delegation
1039
+ globalRenderer.render(node, container);
1040
+ break;
1041
+ }
1042
+ }
1043
+ }
1044
+ if (!globalRenderer.hasNode(node)) {
1045
+ for (const candidate of removalSet) {
1046
+ if (candidate.type === node.type &&
1047
+ candidate.tag === node.tag &&
1048
+ candidate.key == null &&
1049
+ node.key == null) {
1050
+ removalSet.delete(candidate);
1051
+ globalRenderer.adoptNode(candidate, node);
1052
+ // Update the node to reconcile children - pass container for delegation
1053
+ globalRenderer.render(node, container);
1054
+ break;
1055
+ }
1056
+ }
1057
+ }
1058
+ if (!globalRenderer.hasNode(node)) {
1059
+ // Render with container for delegation
1060
+ globalRenderer.render(node, container);
1061
+ // Cache newly rendered node by key for future renders
1062
+ if (node.key != null) {
1063
+ keyToNodeCache.set(node.key, node);
1064
+ }
1065
+ }
1066
+ return globalRenderer.getRenderedNode(node);
1067
+ });
1068
+ removalSet.forEach(node => {
1069
+ globalRenderer.removeNode(node);
1070
+ // Remove from key cache when node is removed
1071
+ if (node.key != null) {
1072
+ keyToNodeCache.delete(node.key);
1073
+ }
1074
+ });
1075
+ const canReorder = typeof container.insertBefore === 'function' &&
1076
+ typeof container.appendChild === 'function';
1077
+ if (canReorder) {
1078
+ let nextSibling = null;
1079
+ for (let i = domNodes.length - 1; i >= 0; i--) {
1080
+ const domNode = domNodes[i];
1081
+ if (!domNode)
1082
+ continue;
1083
+ globalRenderer.insertNode(container, domNode, nextSibling);
1084
+ nextSibling = domNode;
1085
+ }
1086
+ }
1087
+ else {
1088
+ domNodes.forEach(domNode => {
1089
+ if (domNode && domNode.parentNode !== container) {
1090
+ globalRenderer.appendNode(container, domNode);
1091
+ }
1092
+ });
1093
+ }
1094
+ // Update key cache with all rendered nodes for next render
1095
+ const updateCache = (node) => {
1096
+ if (node.key != null && node.element) {
1097
+ keyToNodeCache.set(node.key, node);
1098
+ }
1099
+ if (node.children) {
1100
+ node.children.forEach(updateCache);
1101
+ }
1102
+ };
1103
+ nodes.forEach(updateCache);
1104
+ currentNodes = nodes;
1105
+ });
1106
+ // Return cleanup function
1107
+ return () => {
1108
+ effect.dispose();
1109
+ currentNodes.forEach(node => {
1110
+ globalRenderer.removeNode(node);
1111
+ });
1112
+ // Clear key cache on component unmount
1113
+ keyToNodeCache.clear();
1114
+ // Cleanup event delegation for this container
1115
+ globalEventDelegator.cleanupContainer(container);
1116
+ };
1117
+ });
1118
+ }
1119
+ /**
1120
+ * Create a DOM node helper
1121
+ */
1122
+ export function h(tag, props, ...children) {
1123
+ // Normalize children
1124
+ const normalizedChildren = children
1125
+ .flat()
1126
+ .filter(child => child != null)
1127
+ .map(child => {
1128
+ if (typeof child === 'string' || typeof child === 'number') {
1129
+ return { type: 'text', text: String(child) };
1130
+ }
1131
+ return child;
1132
+ });
1133
+ const node = {
1134
+ type: 'element',
1135
+ tag,
1136
+ props: props || {},
1137
+ children: normalizedChildren,
1138
+ key: props?.key ?? undefined,
1139
+ };
1140
+ // Extract componentMetadata from props and store it on the node
1141
+ if (props && 'componentMetadata' in props) {
1142
+ ;
1143
+ node.componentMetadata = props.componentMetadata;
1144
+ }
1145
+ return node;
1146
+ }
1147
+ /**
1148
+ * Create a text node helper
1149
+ */
1150
+ export function text(content) {
1151
+ if (isSignal(content) ||
1152
+ isComputed(content) ||
1153
+ typeof content === 'function') {
1154
+ // Reactive text content
1155
+ const textNode = {
1156
+ type: 'text',
1157
+ text: '',
1158
+ reactiveContent: content, // Store the reactive content function
1159
+ };
1160
+ // Store the initial value immediately to establish tracking
1161
+ // Use untrack to prevent subscribing parent computation during initialization
1162
+ const initialText = untrack(() => content());
1163
+ textNode.text = String(initialText);
1164
+ // Create reactive effect for updating text content
1165
+ const effect = createEffect(() => {
1166
+ const newText = content();
1167
+ textNode.text = String(newText);
1168
+ // Update DOM element if it exists
1169
+ if (textNode.element && 'textContent' in textNode.element) {
1170
+ textNode.element.textContent = String(newText);
1171
+ }
1172
+ });
1173
+ textNode.dispose = effect.dispose.bind(effect);
1174
+ return textNode;
1175
+ }
1176
+ return {
1177
+ type: 'text',
1178
+ text: content,
1179
+ };
1180
+ }
1181
+ //# sourceMappingURL=renderer.js.map