@tachui/cli 0.8.11 → 0.8.12
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.
- package/dist/cli/src/commands/analyze-imports.d.ts +18 -0
- package/dist/cli/src/commands/analyze-imports.d.ts.map +1 -0
- package/dist/cli/src/commands/analyze-imports.js +152 -0
- package/dist/cli/src/commands/analyze-imports.js.map +1 -0
- package/dist/cli/src/commands/analyze.d.ts +8 -0
- package/dist/cli/src/commands/analyze.d.ts.map +1 -0
- package/dist/cli/src/commands/analyze.js +550 -0
- package/dist/cli/src/commands/analyze.js.map +1 -0
- package/dist/cli/src/commands/dev.d.ts +8 -0
- package/dist/cli/src/commands/dev.d.ts.map +1 -0
- package/dist/cli/src/commands/dev.js +171 -0
- package/dist/cli/src/commands/dev.js.map +1 -0
- package/dist/cli/src/commands/generate.d.ts +8 -0
- package/dist/cli/src/commands/generate.d.ts.map +1 -0
- package/dist/cli/src/commands/generate.js +695 -0
- package/dist/cli/src/commands/generate.js.map +1 -0
- package/dist/cli/src/commands/init.d.ts +8 -0
- package/dist/cli/src/commands/init.d.ts.map +1 -0
- package/dist/cli/src/commands/init.js +169 -0
- package/dist/cli/src/commands/init.js.map +1 -0
- package/dist/cli/src/commands/migrate/remove-modifier-trigger.d.ts +3 -0
- package/dist/cli/src/commands/migrate/remove-modifier-trigger.d.ts.map +1 -0
- package/dist/cli/src/commands/migrate/remove-modifier-trigger.js +103 -0
- package/dist/cli/src/commands/migrate/remove-modifier-trigger.js.map +1 -0
- package/dist/cli/src/commands/migrate.d.ts +8 -0
- package/dist/cli/src/commands/migrate.d.ts.map +1 -0
- package/dist/cli/src/commands/migrate.js +337 -0
- package/dist/cli/src/commands/migrate.js.map +1 -0
- package/dist/cli/src/commands/modifier-docs.d.ts +24 -0
- package/dist/cli/src/commands/modifier-docs.d.ts.map +1 -0
- package/dist/cli/src/commands/modifier-docs.js +375 -0
- package/dist/cli/src/commands/modifier-docs.js.map +1 -0
- package/dist/cli/src/commands/optimize.d.ts +8 -0
- package/dist/cli/src/commands/optimize.d.ts.map +1 -0
- package/dist/cli/src/commands/optimize.js +357 -0
- package/dist/cli/src/commands/optimize.js.map +1 -0
- package/dist/cli/src/import-optimizer.d.ts +50 -0
- package/dist/cli/src/import-optimizer.d.ts.map +1 -0
- package/dist/cli/src/import-optimizer.js +227 -0
- package/dist/cli/src/import-optimizer.js.map +1 -0
- package/dist/cli/src/index.d.ts +5 -0
- package/dist/cli/src/index.d.ts.map +1 -0
- package/dist/cli/src/index.js +62 -0
- package/dist/cli/src/index.js.map +1 -0
- package/dist/cli/src/migrations/remove-modifier-trigger.d.ts +7 -0
- package/dist/cli/src/migrations/remove-modifier-trigger.d.ts.map +1 -0
- package/dist/cli/src/migrations/remove-modifier-trigger.js +99 -0
- package/dist/cli/src/migrations/remove-modifier-trigger.js.map +1 -0
- package/dist/cli/src/scaffold/create-project.d.ts +15 -0
- package/dist/cli/src/scaffold/create-project.d.ts.map +1 -0
- package/dist/cli/src/scaffold/create-project.js +84 -0
- package/dist/cli/src/scaffold/create-project.js.map +1 -0
- package/dist/cli/src/scaffold/package-root.d.ts +2 -0
- package/dist/cli/src/scaffold/package-root.d.ts.map +1 -0
- package/dist/cli/src/scaffold/package-root.js +24 -0
- package/dist/cli/src/scaffold/package-root.js.map +1 -0
- package/dist/cli/src/scaffold/templates.d.ts +11 -0
- package/dist/cli/src/scaffold/templates.d.ts.map +1 -0
- package/dist/cli/src/scaffold/templates.js +26 -0
- package/dist/cli/src/scaffold/templates.js.map +1 -0
- package/dist/cli/src/scaffold/validators.d.ts +2 -0
- package/dist/cli/src/scaffold/validators.d.ts.map +1 -0
- package/dist/cli/src/scaffold/validators.js +32 -0
- package/dist/cli/src/scaffold/validators.js.map +1 -0
- package/dist/core/package.json +224 -0
- package/dist/core/src/assets/Asset.d.ts +11 -0
- package/dist/core/src/assets/Asset.d.ts.map +1 -0
- package/dist/core/src/assets/Asset.js +12 -0
- package/dist/core/src/assets/Asset.js.map +1 -0
- package/dist/core/src/assets/AssetCollection.d.ts +14 -0
- package/dist/core/src/assets/AssetCollection.d.ts.map +1 -0
- package/dist/core/src/assets/AssetCollection.js +133 -0
- package/dist/core/src/assets/AssetCollection.js.map +1 -0
- package/dist/core/src/assets/ColorAsset.d.ts +31 -0
- package/dist/core/src/assets/ColorAsset.d.ts.map +1 -0
- package/dist/core/src/assets/ColorAsset.js +182 -0
- package/dist/core/src/assets/ColorAsset.js.map +1 -0
- package/dist/core/src/assets/FontAsset.d.ts +114 -0
- package/dist/core/src/assets/FontAsset.d.ts.map +1 -0
- package/dist/core/src/assets/FontAsset.js +289 -0
- package/dist/core/src/assets/FontAsset.js.map +1 -0
- package/dist/core/src/assets/ImageAsset.d.ts +35 -0
- package/dist/core/src/assets/ImageAsset.d.ts.map +1 -0
- package/dist/core/src/assets/ImageAsset.js +69 -0
- package/dist/core/src/assets/ImageAsset.js.map +1 -0
- package/dist/core/src/assets/index.d.ts +27 -0
- package/dist/core/src/assets/index.d.ts.map +1 -0
- package/dist/core/src/assets/index.js +137 -0
- package/dist/core/src/assets/index.js.map +1 -0
- package/dist/core/src/assets/types.d.ts +10 -0
- package/dist/core/src/assets/types.d.ts.map +1 -0
- package/dist/core/src/assets/types.js +6 -0
- package/dist/core/src/assets/types.js.map +1 -0
- package/dist/core/src/compiler/advanced-parser.d.ts +113 -0
- package/dist/core/src/compiler/advanced-parser.d.ts.map +1 -0
- package/dist/core/src/compiler/advanced-parser.js +702 -0
- package/dist/core/src/compiler/advanced-parser.js.map +1 -0
- package/dist/core/src/compiler/codegen.d.ts +20 -0
- package/dist/core/src/compiler/codegen.d.ts.map +1 -0
- package/dist/core/src/compiler/codegen.js +509 -0
- package/dist/core/src/compiler/codegen.js.map +1 -0
- package/dist/core/src/compiler/enhanced-codegen.d.ts +121 -0
- package/dist/core/src/compiler/enhanced-codegen.d.ts.map +1 -0
- package/dist/core/src/compiler/enhanced-codegen.js +607 -0
- package/dist/core/src/compiler/enhanced-codegen.js.map +1 -0
- package/dist/core/src/compiler/index.d.ts +14 -0
- package/dist/core/src/compiler/index.d.ts.map +1 -0
- package/dist/core/src/compiler/index.js +12 -0
- package/dist/core/src/compiler/index.js.map +1 -0
- package/dist/core/src/compiler/parser.d.ts +12 -0
- package/dist/core/src/compiler/parser.d.ts.map +1 -0
- package/dist/core/src/compiler/parser.js +407 -0
- package/dist/core/src/compiler/parser.js.map +1 -0
- package/dist/core/src/compiler/plugin.d.ts +13 -0
- package/dist/core/src/compiler/plugin.d.ts.map +1 -0
- package/dist/core/src/compiler/plugin.js +456 -0
- package/dist/core/src/compiler/plugin.js.map +1 -0
- package/dist/core/src/compiler/types.d.ts +177 -0
- package/dist/core/src/compiler/types.d.ts.map +1 -0
- package/dist/core/src/compiler/types.js +5 -0
- package/dist/core/src/compiler/types.js.map +1 -0
- package/dist/core/src/components/factory.d.ts +24 -0
- package/dist/core/src/components/factory.d.ts.map +1 -0
- package/dist/core/src/components/factory.js +19 -0
- package/dist/core/src/components/factory.js.map +1 -0
- package/dist/core/src/components/index.d.ts +12 -0
- package/dist/core/src/components/index.d.ts.map +1 -0
- package/dist/core/src/components/index.js +9 -0
- package/dist/core/src/components/index.js.map +1 -0
- package/dist/core/src/components/wrapper.d.ts +142 -0
- package/dist/core/src/components/wrapper.d.ts.map +1 -0
- package/dist/core/src/components/wrapper.js +628 -0
- package/dist/core/src/components/wrapper.js.map +1 -0
- package/dist/core/src/concatenation/concatenatable.d.ts +63 -0
- package/dist/core/src/concatenation/concatenatable.d.ts.map +1 -0
- package/dist/core/src/concatenation/concatenatable.js +158 -0
- package/dist/core/src/concatenation/concatenatable.js.map +1 -0
- package/dist/core/src/concatenation/concatenated-component.d.ts +124 -0
- package/dist/core/src/concatenation/concatenated-component.d.ts.map +1 -0
- package/dist/core/src/concatenation/concatenated-component.js +447 -0
- package/dist/core/src/concatenation/concatenated-component.js.map +1 -0
- package/dist/core/src/concatenation/index.d.ts +13 -0
- package/dist/core/src/concatenation/index.d.ts.map +1 -0
- package/dist/core/src/concatenation/index.js +16 -0
- package/dist/core/src/concatenation/index.js.map +1 -0
- package/dist/core/src/concatenation/text-optimizer.d.ts +104 -0
- package/dist/core/src/concatenation/text-optimizer.d.ts.map +1 -0
- package/dist/core/src/concatenation/text-optimizer.js +349 -0
- package/dist/core/src/concatenation/text-optimizer.js.map +1 -0
- package/dist/core/src/concatenation/types.d.ts +88 -0
- package/dist/core/src/concatenation/types.d.ts.map +1 -0
- package/dist/core/src/concatenation/types.js +23 -0
- package/dist/core/src/concatenation/types.js.map +1 -0
- package/dist/core/src/config.d.ts +7 -0
- package/dist/core/src/config.d.ts.map +1 -0
- package/dist/core/src/config.js +17 -0
- package/dist/core/src/config.js.map +1 -0
- package/dist/core/src/constants/frame-utils.d.ts +68 -0
- package/dist/core/src/constants/frame-utils.d.ts.map +1 -0
- package/dist/core/src/constants/frame-utils.js +156 -0
- package/dist/core/src/constants/frame-utils.js.map +1 -0
- package/dist/core/src/constants/index.d.ts +8 -0
- package/dist/core/src/constants/index.d.ts.map +1 -0
- package/dist/core/src/constants/index.js +8 -0
- package/dist/core/src/constants/index.js.map +1 -0
- package/dist/core/src/constants/layout.d.ts +96 -0
- package/dist/core/src/constants/layout.d.ts.map +1 -0
- package/dist/core/src/constants/layout.js +124 -0
- package/dist/core/src/constants/layout.js.map +1 -0
- package/dist/core/src/css-classes/component-base.d.ts +40 -0
- package/dist/core/src/css-classes/component-base.d.ts.map +1 -0
- package/dist/core/src/css-classes/component-base.js +90 -0
- package/dist/core/src/css-classes/component-base.js.map +1 -0
- package/dist/core/src/css-classes/css-class-manager.d.ts +89 -0
- package/dist/core/src/css-classes/css-class-manager.d.ts.map +1 -0
- package/dist/core/src/css-classes/css-class-manager.js +328 -0
- package/dist/core/src/css-classes/css-class-manager.js.map +1 -0
- package/dist/core/src/css-classes/dom-integration.d.ts +76 -0
- package/dist/core/src/css-classes/dom-integration.d.ts.map +1 -0
- package/dist/core/src/css-classes/dom-integration.js +104 -0
- package/dist/core/src/css-classes/dom-integration.js.map +1 -0
- package/dist/core/src/css-classes/enhanced-renderer.d.ts +42 -0
- package/dist/core/src/css-classes/enhanced-renderer.d.ts.map +1 -0
- package/dist/core/src/css-classes/enhanced-renderer.js +121 -0
- package/dist/core/src/css-classes/enhanced-renderer.js.map +1 -0
- package/dist/core/src/css-classes/index.d.ts +14 -0
- package/dist/core/src/css-classes/index.d.ts.map +1 -0
- package/dist/core/src/css-classes/index.js +14 -0
- package/dist/core/src/css-classes/index.js.map +1 -0
- package/dist/core/src/css-classes/types.d.ts +59 -0
- package/dist/core/src/css-classes/types.d.ts.map +1 -0
- package/dist/core/src/css-classes/types.js +8 -0
- package/dist/core/src/css-classes/types.js.map +1 -0
- package/dist/core/src/css-classes/utilities.d.ts +104 -0
- package/dist/core/src/css-classes/utilities.d.ts.map +1 -0
- package/dist/core/src/css-classes/utilities.js +126 -0
- package/dist/core/src/css-classes/utilities.js.map +1 -0
- package/dist/core/src/gradients/css-generator.d.ts +10 -0
- package/dist/core/src/gradients/css-generator.d.ts.map +1 -0
- package/dist/core/src/gradients/css-generator.js +123 -0
- package/dist/core/src/gradients/css-generator.js.map +1 -0
- package/dist/core/src/gradients/examples.d.ts +432 -0
- package/dist/core/src/gradients/examples.d.ts.map +1 -0
- package/dist/core/src/gradients/examples.js +588 -0
- package/dist/core/src/gradients/examples.js.map +1 -0
- package/dist/core/src/gradients/gradient-asset.d.ts +10 -0
- package/dist/core/src/gradients/gradient-asset.d.ts.map +1 -0
- package/dist/core/src/gradients/gradient-asset.js +25 -0
- package/dist/core/src/gradients/gradient-asset.js.map +1 -0
- package/dist/core/src/gradients/index.d.ts +19 -0
- package/dist/core/src/gradients/index.d.ts.map +1 -0
- package/dist/core/src/gradients/index.js +56 -0
- package/dist/core/src/gradients/index.js.map +1 -0
- package/dist/core/src/gradients/performance.d.ts +146 -0
- package/dist/core/src/gradients/performance.d.ts.map +1 -0
- package/dist/core/src/gradients/performance.js +413 -0
- package/dist/core/src/gradients/performance.js.map +1 -0
- package/dist/core/src/gradients/presets.d.ts +165 -0
- package/dist/core/src/gradients/presets.d.ts.map +1 -0
- package/dist/core/src/gradients/presets.js +371 -0
- package/dist/core/src/gradients/presets.js.map +1 -0
- package/dist/core/src/gradients/reactive.d.ts +167 -0
- package/dist/core/src/gradients/reactive.d.ts.map +1 -0
- package/dist/core/src/gradients/reactive.js +329 -0
- package/dist/core/src/gradients/reactive.js.map +1 -0
- package/dist/core/src/gradients/state-gradient-asset.d.ts +67 -0
- package/dist/core/src/gradients/state-gradient-asset.d.ts.map +1 -0
- package/dist/core/src/gradients/state-gradient-asset.js +145 -0
- package/dist/core/src/gradients/state-gradient-asset.js.map +1 -0
- package/dist/core/src/gradients/types.d.ts +6 -0
- package/dist/core/src/gradients/types.d.ts.map +1 -0
- package/dist/core/src/gradients/types.js +6 -0
- package/dist/core/src/gradients/types.js.map +1 -0
- package/dist/core/src/gradients/utils.d.ts +313 -0
- package/dist/core/src/gradients/utils.d.ts.map +1 -0
- package/dist/core/src/gradients/utils.js +513 -0
- package/dist/core/src/gradients/utils.js.map +1 -0
- package/dist/core/src/gradients/validation.d.ts +156 -0
- package/dist/core/src/gradients/validation.d.ts.map +1 -0
- package/dist/core/src/gradients/validation.js +392 -0
- package/dist/core/src/gradients/validation.js.map +1 -0
- package/dist/core/src/index.d.ts +33 -0
- package/dist/core/src/index.d.ts.map +1 -0
- package/dist/core/src/index.js +57 -0
- package/dist/core/src/index.js.map +1 -0
- package/dist/core/src/lifecycle/hooks.d.ts +101 -0
- package/dist/core/src/lifecycle/hooks.d.ts.map +1 -0
- package/dist/core/src/lifecycle/hooks.js +241 -0
- package/dist/core/src/lifecycle/hooks.js.map +1 -0
- package/dist/core/src/modifiers/alignment.d.ts +5 -0
- package/dist/core/src/modifiers/alignment.d.ts.map +1 -0
- package/dist/core/src/modifiers/alignment.js +19 -0
- package/dist/core/src/modifiers/alignment.js.map +1 -0
- package/dist/core/src/modifiers/base.d.ts +129 -0
- package/dist/core/src/modifiers/base.d.ts.map +1 -0
- package/dist/core/src/modifiers/base.js +1078 -0
- package/dist/core/src/modifiers/base.js.map +1 -0
- package/dist/core/src/modifiers/builder.d.ts +148 -0
- package/dist/core/src/modifiers/builder.d.ts.map +1 -0
- package/dist/core/src/modifiers/builder.js +903 -0
- package/dist/core/src/modifiers/builder.js.map +1 -0
- package/dist/core/src/modifiers/core.d.ts +14 -0
- package/dist/core/src/modifiers/core.d.ts.map +1 -0
- package/dist/core/src/modifiers/core.js +16 -0
- package/dist/core/src/modifiers/core.js.map +1 -0
- package/dist/core/src/modifiers/corner-radius.d.ts +8 -0
- package/dist/core/src/modifiers/corner-radius.d.ts.map +1 -0
- package/dist/core/src/modifiers/corner-radius.js +19 -0
- package/dist/core/src/modifiers/corner-radius.js.map +1 -0
- package/dist/core/src/modifiers/factories.d.ts +88 -0
- package/dist/core/src/modifiers/factories.d.ts.map +1 -0
- package/dist/core/src/modifiers/factories.js +376 -0
- package/dist/core/src/modifiers/factories.js.map +1 -0
- package/dist/core/src/modifiers/index.d.ts +17 -0
- package/dist/core/src/modifiers/index.d.ts.map +1 -0
- package/dist/core/src/modifiers/index.js +16 -0
- package/dist/core/src/modifiers/index.js.map +1 -0
- package/dist/core/src/modifiers/layout-priority.d.ts +8 -0
- package/dist/core/src/modifiers/layout-priority.d.ts.map +1 -0
- package/dist/core/src/modifiers/layout-priority.js +19 -0
- package/dist/core/src/modifiers/layout-priority.js.map +1 -0
- package/dist/core/src/modifiers/opacity.d.ts +8 -0
- package/dist/core/src/modifiers/opacity.d.ts.map +1 -0
- package/dist/core/src/modifiers/opacity.js +19 -0
- package/dist/core/src/modifiers/opacity.js.map +1 -0
- package/dist/core/src/modifiers/presets.d.ts +368 -0
- package/dist/core/src/modifiers/presets.d.ts.map +1 -0
- package/dist/core/src/modifiers/presets.js +394 -0
- package/dist/core/src/modifiers/presets.js.map +1 -0
- package/dist/core/src/modifiers/proxy.d.ts +4 -0
- package/dist/core/src/modifiers/proxy.d.ts.map +1 -0
- package/dist/core/src/modifiers/proxy.js +229 -0
- package/dist/core/src/modifiers/proxy.js.map +1 -0
- package/dist/core/src/modifiers/reactive-style-bindings.d.ts +22 -0
- package/dist/core/src/modifiers/reactive-style-bindings.d.ts.map +1 -0
- package/dist/core/src/modifiers/reactive-style-bindings.js +172 -0
- package/dist/core/src/modifiers/reactive-style-bindings.js.map +1 -0
- package/dist/core/src/modifiers/registration-utils.d.ts +7 -0
- package/dist/core/src/modifiers/registration-utils.d.ts.map +1 -0
- package/dist/core/src/modifiers/registration-utils.js +46 -0
- package/dist/core/src/modifiers/registration-utils.js.map +1 -0
- package/dist/core/src/modifiers/registry.d.ts +78 -0
- package/dist/core/src/modifiers/registry.d.ts.map +1 -0
- package/dist/core/src/modifiers/registry.js +397 -0
- package/dist/core/src/modifiers/registry.js.map +1 -0
- package/dist/core/src/modifiers/types.d.ts +6 -0
- package/dist/core/src/modifiers/types.d.ts.map +1 -0
- package/dist/core/src/modifiers/types.js +6 -0
- package/dist/core/src/modifiers/types.js.map +1 -0
- package/dist/core/src/plugins/index.d.ts +16 -0
- package/dist/core/src/plugins/index.d.ts.map +1 -0
- package/dist/core/src/plugins/index.js +21 -0
- package/dist/core/src/plugins/index.js.map +1 -0
- package/dist/core/src/plugins/legacy-adapter.d.ts +35 -0
- package/dist/core/src/plugins/legacy-adapter.d.ts.map +1 -0
- package/dist/core/src/plugins/legacy-adapter.js +57 -0
- package/dist/core/src/plugins/legacy-adapter.js.map +1 -0
- package/dist/core/src/plugins/simplified-component-registry.d.ts +40 -0
- package/dist/core/src/plugins/simplified-component-registry.d.ts.map +1 -0
- package/dist/core/src/plugins/simplified-component-registry.js +97 -0
- package/dist/core/src/plugins/simplified-component-registry.js.map +1 -0
- package/dist/core/src/plugins/simplified-lazy-loader.d.ts +65 -0
- package/dist/core/src/plugins/simplified-lazy-loader.d.ts.map +1 -0
- package/dist/core/src/plugins/simplified-lazy-loader.js +205 -0
- package/dist/core/src/plugins/simplified-lazy-loader.js.map +1 -0
- package/dist/core/src/plugins/simplified-plugin-manager.d.ts +24 -0
- package/dist/core/src/plugins/simplified-plugin-manager.d.ts.map +1 -0
- package/dist/core/src/plugins/simplified-plugin-manager.js +77 -0
- package/dist/core/src/plugins/simplified-plugin-manager.js.map +1 -0
- package/dist/core/src/plugins/simplified-tachui-instance.d.ts +54 -0
- package/dist/core/src/plugins/simplified-tachui-instance.d.ts.map +1 -0
- package/dist/core/src/plugins/simplified-tachui-instance.js +114 -0
- package/dist/core/src/plugins/simplified-tachui-instance.js.map +1 -0
- package/dist/core/src/plugins/simplified-types.d.ts +63 -0
- package/dist/core/src/plugins/simplified-types.d.ts.map +1 -0
- package/dist/core/src/plugins/simplified-types.js +18 -0
- package/dist/core/src/plugins/simplified-types.js.map +1 -0
- package/dist/core/src/plugins/simplified-utils.d.ts +39 -0
- package/dist/core/src/plugins/simplified-utils.d.ts.map +1 -0
- package/dist/core/src/plugins/simplified-utils.js +104 -0
- package/dist/core/src/plugins/simplified-utils.js.map +1 -0
- package/dist/core/src/reactive/cleanup.d.ts +115 -0
- package/dist/core/src/reactive/cleanup.d.ts.map +1 -0
- package/dist/core/src/reactive/cleanup.js +187 -0
- package/dist/core/src/reactive/cleanup.js.map +1 -0
- package/dist/core/src/reactive/computed.d.ts +118 -0
- package/dist/core/src/reactive/computed.d.ts.map +1 -0
- package/dist/core/src/reactive/computed.js +261 -0
- package/dist/core/src/reactive/computed.js.map +1 -0
- package/dist/core/src/reactive/context.d.ts +83 -0
- package/dist/core/src/reactive/context.d.ts.map +1 -0
- package/dist/core/src/reactive/context.js +286 -0
- package/dist/core/src/reactive/context.js.map +1 -0
- package/dist/core/src/reactive/effect.d.ts +79 -0
- package/dist/core/src/reactive/effect.d.ts.map +1 -0
- package/dist/core/src/reactive/effect.js +159 -0
- package/dist/core/src/reactive/effect.js.map +1 -0
- package/dist/core/src/reactive/enhanced-effect.d.ts +108 -0
- package/dist/core/src/reactive/enhanced-effect.d.ts.map +1 -0
- package/dist/core/src/reactive/enhanced-effect.js +265 -0
- package/dist/core/src/reactive/enhanced-effect.js.map +1 -0
- package/dist/core/src/reactive/enhanced-signal.d.ts +91 -0
- package/dist/core/src/reactive/enhanced-signal.d.ts.map +1 -0
- package/dist/core/src/reactive/enhanced-signal.js +175 -0
- package/dist/core/src/reactive/enhanced-signal.js.map +1 -0
- package/dist/core/src/reactive/equality.d.ts +51 -0
- package/dist/core/src/reactive/equality.d.ts.map +1 -0
- package/dist/core/src/reactive/equality.js +169 -0
- package/dist/core/src/reactive/equality.js.map +1 -0
- package/dist/core/src/reactive/index.d.ts +22 -0
- package/dist/core/src/reactive/index.d.ts.map +1 -0
- package/dist/core/src/reactive/index.js +33 -0
- package/dist/core/src/reactive/index.js.map +1 -0
- package/dist/core/src/reactive/migration.d.ts +104 -0
- package/dist/core/src/reactive/migration.d.ts.map +1 -0
- package/dist/core/src/reactive/migration.js +257 -0
- package/dist/core/src/reactive/migration.js.map +1 -0
- package/dist/core/src/reactive/ownership.d.ts +75 -0
- package/dist/core/src/reactive/ownership.d.ts.map +1 -0
- package/dist/core/src/reactive/ownership.js +155 -0
- package/dist/core/src/reactive/ownership.js.map +1 -0
- package/dist/core/src/reactive/scheduler.d.ts +56 -0
- package/dist/core/src/reactive/scheduler.d.ts.map +1 -0
- package/dist/core/src/reactive/scheduler.js +263 -0
- package/dist/core/src/reactive/scheduler.js.map +1 -0
- package/dist/core/src/reactive/signal-list.d.ts +100 -0
- package/dist/core/src/reactive/signal-list.d.ts.map +1 -0
- package/dist/core/src/reactive/signal-list.js +240 -0
- package/dist/core/src/reactive/signal-list.js.map +1 -0
- package/dist/core/src/reactive/signal.d.ts +82 -0
- package/dist/core/src/reactive/signal.d.ts.map +1 -0
- package/dist/core/src/reactive/signal.js +172 -0
- package/dist/core/src/reactive/signal.js.map +1 -0
- package/dist/core/src/reactive/theme.d.ts +12 -0
- package/dist/core/src/reactive/theme.d.ts.map +1 -0
- package/dist/core/src/reactive/theme.js +41 -0
- package/dist/core/src/reactive/theme.js.map +1 -0
- package/dist/core/src/reactive/types.d.ts +6 -0
- package/dist/core/src/reactive/types.d.ts.map +1 -0
- package/dist/core/src/reactive/types.js +6 -0
- package/dist/core/src/reactive/types.js.map +1 -0
- package/dist/core/src/reactive/unified-scheduler.d.ts +112 -0
- package/dist/core/src/reactive/unified-scheduler.d.ts.map +1 -0
- package/dist/core/src/reactive/unified-scheduler.js +315 -0
- package/dist/core/src/reactive/unified-scheduler.js.map +1 -0
- package/dist/core/src/runtime/component-context.d.ts +73 -0
- package/dist/core/src/runtime/component-context.d.ts.map +1 -0
- package/dist/core/src/runtime/component-context.js +278 -0
- package/dist/core/src/runtime/component-context.js.map +1 -0
- package/dist/core/src/runtime/component.d.ts +112 -0
- package/dist/core/src/runtime/component.d.ts.map +1 -0
- package/dist/core/src/runtime/component.js +394 -0
- package/dist/core/src/runtime/component.js.map +1 -0
- package/dist/core/src/runtime/context.d.ts +138 -0
- package/dist/core/src/runtime/context.d.ts.map +1 -0
- package/dist/core/src/runtime/context.js +411 -0
- package/dist/core/src/runtime/context.js.map +1 -0
- package/dist/core/src/runtime/dom-bridge.d.ts +70 -0
- package/dist/core/src/runtime/dom-bridge.d.ts.map +1 -0
- package/dist/core/src/runtime/dom-bridge.js +481 -0
- package/dist/core/src/runtime/dom-bridge.js.map +1 -0
- package/dist/core/src/runtime/element-override.d.ts +82 -0
- package/dist/core/src/runtime/element-override.d.ts.map +1 -0
- package/dist/core/src/runtime/element-override.js +360 -0
- package/dist/core/src/runtime/element-override.js.map +1 -0
- package/dist/core/src/runtime/event-delegation.d.ts +59 -0
- package/dist/core/src/runtime/event-delegation.d.ts.map +1 -0
- package/dist/core/src/runtime/event-delegation.js +220 -0
- package/dist/core/src/runtime/event-delegation.js.map +1 -0
- package/dist/core/src/runtime/index.d.ts +24 -0
- package/dist/core/src/runtime/index.d.ts.map +1 -0
- package/dist/core/src/runtime/index.js +36 -0
- package/dist/core/src/runtime/index.js.map +1 -0
- package/dist/core/src/runtime/lazy-component.d.ts +58 -0
- package/dist/core/src/runtime/lazy-component.d.ts.map +1 -0
- package/dist/core/src/runtime/lazy-component.js +206 -0
- package/dist/core/src/runtime/lazy-component.js.map +1 -0
- package/dist/core/src/runtime/lifecycle.d.ts +8 -0
- package/dist/core/src/runtime/lifecycle.d.ts.map +1 -0
- package/dist/core/src/runtime/lifecycle.js +9 -0
- package/dist/core/src/runtime/lifecycle.js.map +1 -0
- package/dist/core/src/runtime/mounting.d.ts +9 -0
- package/dist/core/src/runtime/mounting.d.ts.map +1 -0
- package/dist/core/src/runtime/mounting.js +15 -0
- package/dist/core/src/runtime/mounting.js.map +1 -0
- package/dist/core/src/runtime/optimization.d.ts +8 -0
- package/dist/core/src/runtime/optimization.d.ts.map +1 -0
- package/dist/core/src/runtime/optimization.js +12 -0
- package/dist/core/src/runtime/optimization.js.map +1 -0
- package/dist/core/src/runtime/props.d.ts +154 -0
- package/dist/core/src/runtime/props.d.ts.map +1 -0
- package/dist/core/src/runtime/props.js +389 -0
- package/dist/core/src/runtime/props.js.map +1 -0
- package/dist/core/src/runtime/renderer.d.ts +168 -0
- package/dist/core/src/runtime/renderer.d.ts.map +1 -0
- package/dist/core/src/runtime/renderer.js +1181 -0
- package/dist/core/src/runtime/renderer.js.map +1 -0
- package/dist/core/src/runtime/semantic-role-manager.d.ts +37 -0
- package/dist/core/src/runtime/semantic-role-manager.d.ts.map +1 -0
- package/dist/core/src/runtime/semantic-role-manager.js +102 -0
- package/dist/core/src/runtime/semantic-role-manager.js.map +1 -0
- package/dist/core/src/runtime/types.d.ts +6 -0
- package/dist/core/src/runtime/types.d.ts.map +1 -0
- package/dist/core/src/runtime/types.js +6 -0
- package/dist/core/src/runtime/types.js.map +1 -0
- package/dist/core/src/state/binding.d.ts +96 -0
- package/dist/core/src/state/binding.d.ts.map +1 -0
- package/dist/core/src/state/binding.js +264 -0
- package/dist/core/src/state/binding.js.map +1 -0
- package/dist/core/src/state/environment.d.ts +178 -0
- package/dist/core/src/state/environment.d.ts.map +1 -0
- package/dist/core/src/state/environment.js +272 -0
- package/dist/core/src/state/environment.js.map +1 -0
- package/dist/core/src/state/index.d.ts +108 -0
- package/dist/core/src/state/index.d.ts.map +1 -0
- package/dist/core/src/state/index.js +102 -0
- package/dist/core/src/state/index.js.map +1 -0
- package/dist/core/src/state/observed-object.d.ts +126 -0
- package/dist/core/src/state/observed-object.d.ts.map +1 -0
- package/dist/core/src/state/observed-object.js +330 -0
- package/dist/core/src/state/observed-object.js.map +1 -0
- package/dist/core/src/state/state-manager.d.ts +97 -0
- package/dist/core/src/state/state-manager.d.ts.map +1 -0
- package/dist/core/src/state/state-manager.js +297 -0
- package/dist/core/src/state/state-manager.js.map +1 -0
- package/dist/core/src/state/state.d.ts +78 -0
- package/dist/core/src/state/state.d.ts.map +1 -0
- package/dist/core/src/state/state.js +283 -0
- package/dist/core/src/state/state.js.map +1 -0
- package/dist/core/src/state/types.d.ts +159 -0
- package/dist/core/src/state/types.d.ts.map +1 -0
- package/dist/core/src/state/types.js +8 -0
- package/dist/core/src/state/types.js.map +1 -0
- package/dist/core/src/utils/clone-helpers.d.ts +11 -0
- package/dist/core/src/utils/clone-helpers.d.ts.map +1 -0
- package/dist/core/src/utils/clone-helpers.js +69 -0
- package/dist/core/src/utils/clone-helpers.js.map +1 -0
- package/dist/core/src/validation/build-time-stub.d.ts +33 -0
- package/dist/core/src/validation/build-time-stub.d.ts.map +1 -0
- package/dist/core/src/validation/build-time-stub.js +53 -0
- package/dist/core/src/validation/build-time-stub.js.map +1 -0
- package/dist/core/src/validation/debug-tools-stub.d.ts +67 -0
- package/dist/core/src/validation/debug-tools-stub.d.ts.map +1 -0
- package/dist/core/src/validation/debug-tools-stub.js +94 -0
- package/dist/core/src/validation/debug-tools-stub.js.map +1 -0
- package/dist/core/src/validation/index.d.ts +116 -0
- package/dist/core/src/validation/index.d.ts.map +1 -0
- package/dist/core/src/validation/index.js +306 -0
- package/dist/core/src/validation/index.js.map +1 -0
- package/dist/core/src/validation/lifecycle-validation.d.ts +165 -0
- package/dist/core/src/validation/lifecycle-validation.d.ts.map +1 -0
- package/dist/core/src/validation/lifecycle-validation.js +501 -0
- package/dist/core/src/validation/lifecycle-validation.js.map +1 -0
- package/dist/core/src/validation/performance-optimizer-stub.d.ts +50 -0
- package/dist/core/src/validation/performance-optimizer-stub.d.ts.map +1 -0
- package/dist/core/src/validation/performance-optimizer-stub.js +50 -0
- package/dist/core/src/validation/performance-optimizer-stub.js.map +1 -0
- package/dist/core/src/validation/plugin-registration.d.ts +92 -0
- package/dist/core/src/validation/plugin-registration.d.ts.map +1 -0
- package/dist/core/src/validation/plugin-registration.js +199 -0
- package/dist/core/src/validation/plugin-registration.js.map +1 -0
- package/dist/core/src/validation/production-bypass-core.d.ts +69 -0
- package/dist/core/src/validation/production-bypass-core.d.ts.map +1 -0
- package/dist/core/src/validation/production-bypass-core.js +115 -0
- package/dist/core/src/validation/production-bypass-core.js.map +1 -0
- package/dist/core/src/version.d.ts +19 -0
- package/dist/core/src/version.d.ts.map +1 -0
- package/dist/core/src/version.js +20 -0
- package/dist/core/src/version.js.map +1 -0
- package/dist/devtools/src/build-time/detection.d.ts +32 -0
- package/dist/devtools/src/build-time/detection.d.ts.map +1 -0
- package/dist/devtools/src/build-time/detection.js +327 -0
- package/dist/devtools/src/build-time/detection.js.map +1 -0
- package/dist/devtools/src/build-time/index.d.ts +84 -0
- package/dist/devtools/src/build-time/index.d.ts.map +1 -0
- package/dist/devtools/src/build-time/index.js +157 -0
- package/dist/devtools/src/build-time/index.js.map +1 -0
- package/dist/devtools/src/build-time/plugins.d.ts +75 -0
- package/dist/devtools/src/build-time/plugins.d.ts.map +1 -0
- package/dist/devtools/src/build-time/plugins.js +429 -0
- package/dist/devtools/src/build-time/plugins.js.map +1 -0
- package/dist/devtools/src/build-time/rules.d.ts +73 -0
- package/dist/devtools/src/build-time/rules.d.ts.map +1 -0
- package/dist/devtools/src/build-time/rules.js +622 -0
- package/dist/devtools/src/build-time/rules.js.map +1 -0
- package/dist/devtools/src/build-time/transformer.d.ts +23 -0
- package/dist/devtools/src/build-time/transformer.d.ts.map +1 -0
- package/dist/devtools/src/build-time/transformer.js +294 -0
- package/dist/devtools/src/build-time/transformer.js.map +1 -0
- package/dist/devtools/src/build-time/types.d.ts +212 -0
- package/dist/devtools/src/build-time/types.d.ts.map +1 -0
- package/dist/devtools/src/build-time/types.js +8 -0
- package/dist/devtools/src/build-time/types.js.map +1 -0
- package/dist/devtools/src/debug/debug.d.ts +61 -0
- package/dist/devtools/src/debug/debug.d.ts.map +1 -0
- package/dist/devtools/src/debug/debug.js +239 -0
- package/dist/devtools/src/debug/debug.js.map +1 -0
- package/dist/devtools/src/debug/development-warnings.d.ts +42 -0
- package/dist/devtools/src/debug/development-warnings.d.ts.map +1 -0
- package/dist/devtools/src/debug/development-warnings.js +84 -0
- package/dist/devtools/src/debug/development-warnings.js.map +1 -0
- package/dist/devtools/src/debug/enhanced-errors.d.ts +176 -0
- package/dist/devtools/src/debug/enhanced-errors.d.ts.map +1 -0
- package/dist/devtools/src/debug/enhanced-errors.js +481 -0
- package/dist/devtools/src/debug/enhanced-errors.js.map +1 -0
- package/dist/devtools/src/debug/enhanced-types.d.ts +284 -0
- package/dist/devtools/src/debug/enhanced-types.d.ts.map +1 -0
- package/dist/devtools/src/debug/enhanced-types.js +8 -0
- package/dist/devtools/src/debug/enhanced-types.js.map +1 -0
- package/dist/devtools/src/debug/index.d.ts +13 -0
- package/dist/devtools/src/debug/index.d.ts.map +1 -0
- package/dist/devtools/src/debug/index.js +17 -0
- package/dist/devtools/src/debug/index.js.map +1 -0
- package/dist/devtools/src/debug/validation-debug-tools.d.ts +228 -0
- package/dist/devtools/src/debug/validation-debug-tools.d.ts.map +1 -0
- package/dist/devtools/src/debug/validation-debug-tools.js +472 -0
- package/dist/devtools/src/debug/validation-debug-tools.js.map +1 -0
- package/dist/devtools/src/import-guide.d.ts +50 -0
- package/dist/devtools/src/import-guide.d.ts.map +1 -0
- package/dist/devtools/src/import-guide.js +257 -0
- package/dist/devtools/src/import-guide.js.map +1 -0
- package/dist/devtools/src/index.d.ts +24 -0
- package/dist/devtools/src/index.d.ts.map +1 -0
- package/dist/devtools/src/index.js +32 -0
- package/dist/devtools/src/index.js.map +1 -0
- package/dist/devtools/src/inspector/index.d.ts +232 -0
- package/dist/devtools/src/inspector/index.d.ts.map +1 -0
- package/dist/devtools/src/inspector/index.js +551 -0
- package/dist/devtools/src/inspector/index.js.map +1 -0
- package/dist/devtools/src/modifier-parameter-system.d.ts +69 -0
- package/dist/devtools/src/modifier-parameter-system.d.ts.map +1 -0
- package/dist/devtools/src/modifier-parameter-system.js +462 -0
- package/dist/devtools/src/modifier-parameter-system.js.map +1 -0
- package/dist/devtools/src/plugins/simplified-error-handler.d.ts +83 -0
- package/dist/devtools/src/plugins/simplified-error-handler.d.ts.map +1 -0
- package/dist/devtools/src/plugins/simplified-error-handler.js +335 -0
- package/dist/devtools/src/plugins/simplified-error-handler.js.map +1 -0
- package/dist/devtools/src/profiler/index.d.ts +21 -0
- package/dist/devtools/src/profiler/index.d.ts.map +1 -0
- package/dist/devtools/src/profiler/index.js +30 -0
- package/dist/devtools/src/profiler/index.js.map +1 -0
- package/dist/devtools/src/profiler/performance-optimizer.d.ts +115 -0
- package/dist/devtools/src/profiler/performance-optimizer.d.ts.map +1 -0
- package/dist/devtools/src/profiler/performance-optimizer.js +273 -0
- package/dist/devtools/src/profiler/performance-optimizer.js.map +1 -0
- package/dist/devtools/src/profiler/production-monitoring.d.ts +150 -0
- package/dist/devtools/src/profiler/production-monitoring.d.ts.map +1 -0
- package/dist/devtools/src/profiler/production-monitoring.js +274 -0
- package/dist/devtools/src/profiler/production-monitoring.js.map +1 -0
- package/dist/devtools/src/runtime/error-boundary.d.ts +302 -0
- package/dist/devtools/src/runtime/error-boundary.d.ts.map +1 -0
- package/dist/devtools/src/runtime/error-boundary.js +717 -0
- package/dist/devtools/src/runtime/error-boundary.js.map +1 -0
- package/dist/devtools/src/runtime/error-recovery.d.ts +267 -0
- package/dist/devtools/src/runtime/error-recovery.d.ts.map +1 -0
- package/dist/devtools/src/runtime/error-recovery.js +499 -0
- package/dist/devtools/src/runtime/error-recovery.js.map +1 -0
- package/dist/devtools/src/runtime/error-reporting.d.ts +287 -0
- package/dist/devtools/src/runtime/error-reporting.d.ts.map +1 -0
- package/dist/devtools/src/runtime/error-reporting.js +626 -0
- package/dist/devtools/src/runtime/error-reporting.js.map +1 -0
- package/dist/devtools/src/runtime/error-utils.d.ts +204 -0
- package/dist/devtools/src/runtime/error-utils.d.ts.map +1 -0
- package/dist/devtools/src/runtime/error-utils.js +519 -0
- package/dist/devtools/src/runtime/error-utils.js.map +1 -0
- package/dist/devtools/src/runtime/performance.d.ts +217 -0
- package/dist/devtools/src/runtime/performance.d.ts.map +1 -0
- package/dist/devtools/src/runtime/performance.js +538 -0
- package/dist/devtools/src/runtime/performance.js.map +1 -0
- package/dist/devtools/src/testing/index.d.ts +29 -0
- package/dist/devtools/src/testing/index.d.ts.map +1 -0
- package/dist/devtools/src/testing/index.js +48 -0
- package/dist/devtools/src/testing/index.js.map +1 -0
- package/dist/devtools/src/validation/enhanced-runtime.d.ts +310 -0
- package/dist/devtools/src/validation/enhanced-runtime.d.ts.map +1 -0
- package/dist/devtools/src/validation/enhanced-runtime.js +603 -0
- package/dist/devtools/src/validation/enhanced-runtime.js.map +1 -0
- package/dist/devtools/src/validation/error-reporting.d.ts +186 -0
- package/dist/devtools/src/validation/error-reporting.d.ts.map +1 -0
- package/dist/devtools/src/validation/error-reporting.js +439 -0
- package/dist/devtools/src/validation/error-reporting.js.map +1 -0
- package/dist/scaffold/core-version-map.d.ts.map +1 -1
- package/dist/scaffold/core-version-map.js +9 -4
- package/dist/scaffold/core-version-map.js.map +1 -1
- package/package.json +3 -3
- package/templates/advanced/package.json.template +3 -1
- package/templates/advanced/src/App.ts.template +11 -22
- package/templates/advanced/src/main.ts.template +3 -2
- package/templates/basic/package.json.template +3 -1
- package/templates/basic/src/App.ts.template +6 -12
- package/templates/basic/src/main.ts.template +3 -2
|
@@ -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
|