@adaas/are-html 0.0.4 → 0.0.6

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 (45) hide show
  1. package/dist/browser/index.d.mts +22 -5
  2. package/dist/browser/index.mjs +66 -17
  3. package/dist/browser/index.mjs.map +1 -1
  4. package/dist/node/engine/AreHTML.compiler.js +10 -0
  5. package/dist/node/engine/AreHTML.compiler.js.map +1 -1
  6. package/dist/node/engine/AreHTML.compiler.mjs +10 -0
  7. package/dist/node/engine/AreHTML.compiler.mjs.map +1 -1
  8. package/dist/node/engine/AreHTML.constants.d.mts +10 -1
  9. package/dist/node/engine/AreHTML.constants.d.ts +10 -1
  10. package/dist/node/engine/AreHTML.constants.js +21 -0
  11. package/dist/node/engine/AreHTML.constants.js.map +1 -1
  12. package/dist/node/engine/AreHTML.constants.mjs +20 -1
  13. package/dist/node/engine/AreHTML.constants.mjs.map +1 -1
  14. package/dist/node/engine/AreHTML.engine.d.mts +2 -2
  15. package/dist/node/engine/AreHTML.engine.d.ts +2 -2
  16. package/dist/node/engine/AreHTML.engine.js +15 -2
  17. package/dist/node/engine/AreHTML.engine.js.map +1 -1
  18. package/dist/node/engine/AreHTML.engine.mjs +16 -3
  19. package/dist/node/engine/AreHTML.engine.mjs.map +1 -1
  20. package/dist/node/engine/AreHTML.interpreter.js +1 -0
  21. package/dist/node/engine/AreHTML.interpreter.js.map +1 -1
  22. package/dist/node/engine/AreHTML.interpreter.mjs +1 -0
  23. package/dist/node/engine/AreHTML.interpreter.mjs.map +1 -1
  24. package/dist/node/engine/AreHTML.lifecycle.d.mts +11 -3
  25. package/dist/node/engine/AreHTML.lifecycle.d.ts +11 -3
  26. package/dist/node/engine/AreHTML.lifecycle.js +20 -11
  27. package/dist/node/engine/AreHTML.lifecycle.js.map +1 -1
  28. package/dist/node/engine/AreHTML.lifecycle.mjs +21 -12
  29. package/dist/node/engine/AreHTML.lifecycle.mjs.map +1 -1
  30. package/dist/node/index.d.mts +1 -1
  31. package/dist/node/index.d.ts +1 -1
  32. package/dist/node/lib/AreRoot/AreRoot.component.js +2 -3
  33. package/dist/node/lib/AreRoot/AreRoot.component.js.map +1 -1
  34. package/dist/node/lib/AreRoot/AreRoot.component.mjs +2 -3
  35. package/dist/node/lib/AreRoot/AreRoot.component.mjs.map +1 -1
  36. package/examples/dashboard/dist/index.html +1 -1
  37. package/examples/dashboard/dist/{mpioi5ab-8c3oa9.js → mpmt0gys-1r9rcu.js} +80 -22
  38. package/examples/dashboard/src/components/DashboardLogo.component.ts +9 -0
  39. package/package.json +1 -1
  40. package/src/engine/AreHTML.compiler.ts +19 -1
  41. package/src/engine/AreHTML.constants.ts +16 -0
  42. package/src/engine/AreHTML.engine.ts +17 -1
  43. package/src/engine/AreHTML.interpreter.ts +3 -0
  44. package/src/engine/AreHTML.lifecycle.ts +44 -13
  45. package/src/lib/AreRoot/AreRoot.component.ts +5 -6
@@ -42,6 +42,16 @@ exports.AreHTMLCompiler = class AreHTMLCompiler extends are.AreCompiler {
42
42
  title: "Scene Host Not Found",
43
43
  description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`
44
44
  });
45
+ const content = attribute.content;
46
+ if (content.includes("{{")) {
47
+ const transformed = '"' + content.replace(/\{\{([^}]+)\}\}/g, '"+($1)+"') + '"';
48
+ scene.plan(new AddAttribute_instruction.AddAttributeInstruction(scene.host, {
49
+ name: attribute.name,
50
+ content: transformed,
51
+ evaluate: true
52
+ }));
53
+ return;
54
+ }
45
55
  scene.plan(new AddAttribute_instruction.AddAttributeInstruction(scene.host, {
46
56
  name: attribute.name,
47
57
  content: attribute.content
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/engine/AreHTML.compiler.ts"],"names":["AreHTMLCompiler","AreCompiler","AddTextInstruction","AreCompilerError","AddAttributeInstruction","AreDirectiveFeatures","A_FormatterHelper","AddListenerInstruction","AreInterpolation","A_Caller","AreScene","AreStore","A_Logger","AreText","AreStaticAttribute","AreDirectiveAttribute","A_Feature","AreEventAttribute","AreBindingAttribute","AreSyntax","A_Frame"],"mappings":"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","file":"AreHTML.compiler.js","sourcesContent":["import { A_Caller, A_Dependency, A_Feature, A_FormatterHelper, A_Inject } from \"@adaas/a-concept\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\nimport { AreCompiler, AreScene, AreCompilerError, AreStore, AreSyntax } from \"@adaas/are\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreStaticAttribute } from \"@adaas/are-html/attributes/AreStatic.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreEventAttribute } from \"@adaas/are-html/attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"@adaas/are-html/attributes/AreBinding.attribute\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AddAttributeInstruction} from \"@adaas/are-html/instructions/AddAttribute.instruction\";\nimport { AddTextInstruction} from \"@adaas/are-html/instructions/AddText.instruction\";\nimport { AddListenerInstruction} from \"@adaas/are-html/instructions/AddListener.instruction\";\n\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific compiler for A-Concept Rendering Engine (ARE) components, extending the base AreCompiler to handle HTML templates, styles, and rendering logic tailored for web environments.'\n})\nexport class AreHTMLCompiler extends AreCompiler {\n\n // compile(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(AreScene) scene: AreScene,\n // ...args: any[]\n // ): void {\n // super.compile(node, scene, ...args);\n // }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Interpolation Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n /**\n * Default compile method for interpolations, which can be overridden by specific implementations if needed.\n * \n * @param interpolation \n * @param scope \n * @param scene \n * @param store \n * @param feature \n */\n @AreCompiler.Compile(AreInterpolation)\n compileInterpolation(\n @A_Inject(A_Caller) interpolation: AreInterpolation,\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n // if (scene.host)\n // console.log('Scene Host: ', scene.host);\n\n // let content = '';\n\n // logger?.debug('green', `AreHTMLCompiler: compile interpolation <${interpolation.aseid.toString()}> with key: \"${interpolation.content}\"`, store.get(interpolation.content));\n\n // try {\n // content = AreCommonHelper.evaluate(interpolation.content, store);\n\n // } catch (error) {\n // content = ''\n // }\n\n scene.plan(new AddTextInstruction({ content: interpolation.content, evaluate: true }));\n }\n\n // -----------------------------------------------------------------------------------------\n // ------------------------------Are-Text Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n @AreCompiler.Compile(AreText)\n compileText(\n @A_Inject(A_Caller) text: AreText,\n @A_Inject(AreScene) scene: AreScene,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n logger?.debug('cyan', `AreHTMLCompiler: compile text node <${text.aseid.toString()}> with content: \"${text.content}\"`);\n if (scene.host)\n scene.unPlan(scene.host);\n\n scene.plan(new AddTextInstruction({ content: text.content }));\n\n }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Attribute Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n\n @AreCompiler.Compile(AreStaticAttribute)\n compileStaticAttribute(\n @A_Inject(A_Caller) attribute: AreStaticAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n /**\n * Default case when attribute was not able to be identified as a binding, directive, or event, we just want to add it as a regular attribute to the node. This is the most basic case for attributes that don't have any special behavior or processing logic, and it ensures that they are still rendered on the node even if they don't have any dynamic functionality.\n */\n scene.plan(new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content\n }));\n }\n\n @AreCompiler.Compile(AreDirectiveAttribute)\n compileDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n store.watch(directive);\n\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Compile, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n\n store.unwatch(directive);\n }\n\n\n @AreCompiler.Compile(AreEventAttribute)\n compileEventAttribute(\n @A_Inject(A_Caller) attribute: AreEventAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n /**\n * 2. In case the attribute is an event listener, then \n * we should simply add a callback handler that will be used to proxy an event \n * into the ComponentNode component. \n *[!] In this case AreAttribute is AreEventAttribute that has prepared callback function to be used \n * in the event listener. It is important to store callback function once \n * to prevent duplicated functions in case of multiple compilations during development.\n */\n scene.plan(new AddListenerInstruction(scene.host, {\n name: attribute.name,\n handler: attribute.content\n }));\n }\n\n\n @AreCompiler.Compile(AreBindingAttribute)\n compileBindingAttribute(\n @A_Inject(A_Caller) attribute: AreBindingAttribute,\n @A_Inject(AreScene) scene: AreScene,\n @A_Dependency.Parent()\n @A_Inject(AreStore) parentStore: AreStore,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(AreSyntax) syntax: AreSyntax,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n\n\n const node = attribute.owner;\n const props = node.component?.props;\n\n // Component prop names are typically declared in camelCase, while template\n // markup uses kebab-case. Try both forms when matching.\n let propName: string | undefined;\n if (props) {\n if (props[attribute.name]) {\n propName = attribute.name;\n } else {\n const camel = A_FormatterHelper.toCamelCase(attribute.name);\n if (props[camel]) propName = camel;\n }\n }\n\n /**\n * 1. Component prop binding — evaluate against the parent store and\n * keep the child store reactive to upstream changes.\n */\n if (propName && props) {\n const propDefinition = props[propName];\n\n const coerce = (raw: any): any => {\n let value = raw;\n if (propDefinition.type) {\n switch (propDefinition.type) {\n case 'string': value = value === undefined || value === null ? '' : String(value); break;\n case 'number': value = Number(value); break;\n case 'boolean': value = Boolean(value); break;\n }\n }\n return value;\n };\n\n // The watcher entity below is registered against parentStore so that\n // updates to the bound expression in the parent flow into the child store.\n const watcher = {\n update: () => {\n try {\n parentStore.watch(watcher);\n const next = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n store.set(propName!, next);\n } catch (e) {\n parentStore.unwatch(watcher);\n }\n }\n };\n\n // Initial read with watch active so dependencies are recorded.\n parentStore.watch(watcher);\n const initial = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n\n store.set(propName, initial);\n return;\n }\n\n /**\n * 2. Default attribute binding — evaluated reactively against the local store.\n */\n const instruction = new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content,\n evaluate: true\n })\n\n scene.plan(instruction);\n }\n\n\n}"]}
1
+ {"version":3,"sources":["../../../src/engine/AreHTML.compiler.ts"],"names":["AreHTMLCompiler","AreCompiler","AddTextInstruction","AreCompilerError","AddAttributeInstruction","AreDirectiveFeatures","A_FormatterHelper","AddListenerInstruction","AreInterpolation","A_Caller","AreScene","AreStore","A_Logger","AreText","AreStaticAttribute","AreDirectiveAttribute","A_Feature","AreEventAttribute","AreBindingAttribute","AreSyntax","A_Frame"],"mappings":"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","file":"AreHTML.compiler.js","sourcesContent":["import { A_Caller, A_Dependency, A_Feature, A_FormatterHelper, A_Inject } from \"@adaas/a-concept\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\nimport { AreCompiler, AreScene, AreCompilerError, AreStore, AreSyntax } from \"@adaas/are\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreStaticAttribute } from \"@adaas/are-html/attributes/AreStatic.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreEventAttribute } from \"@adaas/are-html/attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"@adaas/are-html/attributes/AreBinding.attribute\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AddAttributeInstruction} from \"@adaas/are-html/instructions/AddAttribute.instruction\";\nimport { AddTextInstruction} from \"@adaas/are-html/instructions/AddText.instruction\";\nimport { AddListenerInstruction} from \"@adaas/are-html/instructions/AddListener.instruction\";\n\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific compiler for A-Concept Rendering Engine (ARE) components, extending the base AreCompiler to handle HTML templates, styles, and rendering logic tailored for web environments.'\n})\nexport class AreHTMLCompiler extends AreCompiler {\n\n // compile(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(AreScene) scene: AreScene,\n // ...args: any[]\n // ): void {\n // super.compile(node, scene, ...args);\n // }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Interpolation Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n /**\n * Default compile method for interpolations, which can be overridden by specific implementations if needed.\n * \n * @param interpolation \n * @param scope \n * @param scene \n * @param store \n * @param feature \n */\n @AreCompiler.Compile(AreInterpolation)\n compileInterpolation(\n @A_Inject(A_Caller) interpolation: AreInterpolation,\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n // if (scene.host)\n // console.log('Scene Host: ', scene.host);\n\n // let content = '';\n\n // logger?.debug('green', `AreHTMLCompiler: compile interpolation <${interpolation.aseid.toString()}> with key: \"${interpolation.content}\"`, store.get(interpolation.content));\n\n // try {\n // content = AreCommonHelper.evaluate(interpolation.content, store);\n\n // } catch (error) {\n // content = ''\n // }\n\n scene.plan(new AddTextInstruction({ content: interpolation.content, evaluate: true }));\n }\n\n // -----------------------------------------------------------------------------------------\n // ------------------------------Are-Text Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n @AreCompiler.Compile(AreText)\n compileText(\n @A_Inject(A_Caller) text: AreText,\n @A_Inject(AreScene) scene: AreScene,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n logger?.debug('cyan', `AreHTMLCompiler: compile text node <${text.aseid.toString()}> with content: \"${text.content}\"`);\n if (scene.host)\n scene.unPlan(scene.host);\n\n scene.plan(new AddTextInstruction({ content: text.content }));\n\n }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Attribute Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n\n @AreCompiler.Compile(AreStaticAttribute)\n compileStaticAttribute(\n @A_Inject(A_Caller) attribute: AreStaticAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n\n const content = attribute.content;\n\n /**\n * If the attribute value contains {{ }} interpolations, transform them into\n * a JS string-concatenation expression so the interpreter can evaluate them.\n * e.g. \"color:{{expr}}\" → '\"color:\"+(expr)+\"\"'\n */\n if (content.includes('{{')) {\n const transformed = '\"' + content.replace(/\\{\\{([^}]+)\\}\\}/g, '\"+($1)+\"') + '\"';\n scene.plan(new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: transformed,\n evaluate: true,\n }));\n return;\n }\n\n /**\n * Default case: regular static attribute rendered as-is.\n */\n scene.plan(new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content\n }));\n }\n\n @AreCompiler.Compile(AreDirectiveAttribute)\n compileDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n store.watch(directive);\n\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Compile, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n\n store.unwatch(directive);\n }\n\n\n @AreCompiler.Compile(AreEventAttribute)\n compileEventAttribute(\n @A_Inject(A_Caller) attribute: AreEventAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n /**\n * 2. In case the attribute is an event listener, then \n * we should simply add a callback handler that will be used to proxy an event \n * into the ComponentNode component. \n *[!] In this case AreAttribute is AreEventAttribute that has prepared callback function to be used \n * in the event listener. It is important to store callback function once \n * to prevent duplicated functions in case of multiple compilations during development.\n */\n scene.plan(new AddListenerInstruction(scene.host, {\n name: attribute.name,\n handler: attribute.content\n }));\n }\n\n\n @AreCompiler.Compile(AreBindingAttribute)\n compileBindingAttribute(\n @A_Inject(A_Caller) attribute: AreBindingAttribute,\n @A_Inject(AreScene) scene: AreScene,\n @A_Dependency.Parent()\n @A_Inject(AreStore) parentStore: AreStore,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(AreSyntax) syntax: AreSyntax,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n\n\n const node = attribute.owner;\n const props = node.component?.props;\n\n // Component prop names are typically declared in camelCase, while template\n // markup uses kebab-case. Try both forms when matching.\n let propName: string | undefined;\n if (props) {\n if (props[attribute.name]) {\n propName = attribute.name;\n } else {\n const camel = A_FormatterHelper.toCamelCase(attribute.name);\n if (props[camel]) propName = camel;\n }\n }\n\n /**\n * 1. Component prop binding — evaluate against the parent store and\n * keep the child store reactive to upstream changes.\n */\n if (propName && props) {\n const propDefinition = props[propName];\n\n const coerce = (raw: any): any => {\n let value = raw;\n if (propDefinition.type) {\n switch (propDefinition.type) {\n case 'string': value = value === undefined || value === null ? '' : String(value); break;\n case 'number': value = Number(value); break;\n case 'boolean': value = Boolean(value); break;\n }\n }\n return value;\n };\n\n // The watcher entity below is registered against parentStore so that\n // updates to the bound expression in the parent flow into the child store.\n const watcher = {\n update: () => {\n try {\n parentStore.watch(watcher);\n const next = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n store.set(propName!, next);\n } catch (e) {\n parentStore.unwatch(watcher);\n }\n }\n };\n\n // Initial read with watch active so dependencies are recorded.\n parentStore.watch(watcher);\n const initial = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n\n store.set(propName, initial);\n return;\n }\n\n /**\n * 2. Default attribute binding — evaluated reactively against the local store.\n */\n const instruction = new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content,\n evaluate: true\n })\n\n scene.plan(instruction);\n }\n\n\n}"]}
@@ -30,6 +30,16 @@ let AreHTMLCompiler = class extends AreCompiler {
30
30
  title: "Scene Host Not Found",
31
31
  description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`
32
32
  });
33
+ const content = attribute.content;
34
+ if (content.includes("{{")) {
35
+ const transformed = '"' + content.replace(/\{\{([^}]+)\}\}/g, '"+($1)+"') + '"';
36
+ scene.plan(new AddAttributeInstruction(scene.host, {
37
+ name: attribute.name,
38
+ content: transformed,
39
+ evaluate: true
40
+ }));
41
+ return;
42
+ }
33
43
  scene.plan(new AddAttributeInstruction(scene.host, {
34
44
  name: attribute.name,
35
45
  content: attribute.content
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/engine/AreHTML.compiler.ts"],"names":[],"mappings":"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","file":"AreHTML.compiler.mjs","sourcesContent":["import { A_Caller, A_Dependency, A_Feature, A_FormatterHelper, A_Inject } from \"@adaas/a-concept\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\nimport { AreCompiler, AreScene, AreCompilerError, AreStore, AreSyntax } from \"@adaas/are\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreStaticAttribute } from \"@adaas/are-html/attributes/AreStatic.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreEventAttribute } from \"@adaas/are-html/attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"@adaas/are-html/attributes/AreBinding.attribute\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AddAttributeInstruction} from \"@adaas/are-html/instructions/AddAttribute.instruction\";\nimport { AddTextInstruction} from \"@adaas/are-html/instructions/AddText.instruction\";\nimport { AddListenerInstruction} from \"@adaas/are-html/instructions/AddListener.instruction\";\n\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific compiler for A-Concept Rendering Engine (ARE) components, extending the base AreCompiler to handle HTML templates, styles, and rendering logic tailored for web environments.'\n})\nexport class AreHTMLCompiler extends AreCompiler {\n\n // compile(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(AreScene) scene: AreScene,\n // ...args: any[]\n // ): void {\n // super.compile(node, scene, ...args);\n // }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Interpolation Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n /**\n * Default compile method for interpolations, which can be overridden by specific implementations if needed.\n * \n * @param interpolation \n * @param scope \n * @param scene \n * @param store \n * @param feature \n */\n @AreCompiler.Compile(AreInterpolation)\n compileInterpolation(\n @A_Inject(A_Caller) interpolation: AreInterpolation,\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n // if (scene.host)\n // console.log('Scene Host: ', scene.host);\n\n // let content = '';\n\n // logger?.debug('green', `AreHTMLCompiler: compile interpolation <${interpolation.aseid.toString()}> with key: \"${interpolation.content}\"`, store.get(interpolation.content));\n\n // try {\n // content = AreCommonHelper.evaluate(interpolation.content, store);\n\n // } catch (error) {\n // content = ''\n // }\n\n scene.plan(new AddTextInstruction({ content: interpolation.content, evaluate: true }));\n }\n\n // -----------------------------------------------------------------------------------------\n // ------------------------------Are-Text Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n @AreCompiler.Compile(AreText)\n compileText(\n @A_Inject(A_Caller) text: AreText,\n @A_Inject(AreScene) scene: AreScene,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n logger?.debug('cyan', `AreHTMLCompiler: compile text node <${text.aseid.toString()}> with content: \"${text.content}\"`);\n if (scene.host)\n scene.unPlan(scene.host);\n\n scene.plan(new AddTextInstruction({ content: text.content }));\n\n }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Attribute Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n\n @AreCompiler.Compile(AreStaticAttribute)\n compileStaticAttribute(\n @A_Inject(A_Caller) attribute: AreStaticAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n /**\n * Default case when attribute was not able to be identified as a binding, directive, or event, we just want to add it as a regular attribute to the node. This is the most basic case for attributes that don't have any special behavior or processing logic, and it ensures that they are still rendered on the node even if they don't have any dynamic functionality.\n */\n scene.plan(new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content\n }));\n }\n\n @AreCompiler.Compile(AreDirectiveAttribute)\n compileDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n store.watch(directive);\n\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Compile, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n\n store.unwatch(directive);\n }\n\n\n @AreCompiler.Compile(AreEventAttribute)\n compileEventAttribute(\n @A_Inject(A_Caller) attribute: AreEventAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n /**\n * 2. In case the attribute is an event listener, then \n * we should simply add a callback handler that will be used to proxy an event \n * into the ComponentNode component. \n *[!] In this case AreAttribute is AreEventAttribute that has prepared callback function to be used \n * in the event listener. It is important to store callback function once \n * to prevent duplicated functions in case of multiple compilations during development.\n */\n scene.plan(new AddListenerInstruction(scene.host, {\n name: attribute.name,\n handler: attribute.content\n }));\n }\n\n\n @AreCompiler.Compile(AreBindingAttribute)\n compileBindingAttribute(\n @A_Inject(A_Caller) attribute: AreBindingAttribute,\n @A_Inject(AreScene) scene: AreScene,\n @A_Dependency.Parent()\n @A_Inject(AreStore) parentStore: AreStore,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(AreSyntax) syntax: AreSyntax,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n\n\n const node = attribute.owner;\n const props = node.component?.props;\n\n // Component prop names are typically declared in camelCase, while template\n // markup uses kebab-case. Try both forms when matching.\n let propName: string | undefined;\n if (props) {\n if (props[attribute.name]) {\n propName = attribute.name;\n } else {\n const camel = A_FormatterHelper.toCamelCase(attribute.name);\n if (props[camel]) propName = camel;\n }\n }\n\n /**\n * 1. Component prop binding — evaluate against the parent store and\n * keep the child store reactive to upstream changes.\n */\n if (propName && props) {\n const propDefinition = props[propName];\n\n const coerce = (raw: any): any => {\n let value = raw;\n if (propDefinition.type) {\n switch (propDefinition.type) {\n case 'string': value = value === undefined || value === null ? '' : String(value); break;\n case 'number': value = Number(value); break;\n case 'boolean': value = Boolean(value); break;\n }\n }\n return value;\n };\n\n // The watcher entity below is registered against parentStore so that\n // updates to the bound expression in the parent flow into the child store.\n const watcher = {\n update: () => {\n try {\n parentStore.watch(watcher);\n const next = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n store.set(propName!, next);\n } catch (e) {\n parentStore.unwatch(watcher);\n }\n }\n };\n\n // Initial read with watch active so dependencies are recorded.\n parentStore.watch(watcher);\n const initial = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n\n store.set(propName, initial);\n return;\n }\n\n /**\n * 2. Default attribute binding — evaluated reactively against the local store.\n */\n const instruction = new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content,\n evaluate: true\n })\n\n scene.plan(instruction);\n }\n\n\n}"]}
1
+ {"version":3,"sources":["../../../src/engine/AreHTML.compiler.ts"],"names":[],"mappings":"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","file":"AreHTML.compiler.mjs","sourcesContent":["import { A_Caller, A_Dependency, A_Feature, A_FormatterHelper, A_Inject } from \"@adaas/a-concept\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\nimport { AreCompiler, AreScene, AreCompilerError, AreStore, AreSyntax } from \"@adaas/are\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreStaticAttribute } from \"@adaas/are-html/attributes/AreStatic.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreEventAttribute } from \"@adaas/are-html/attributes/AreEvent.attribute\";\nimport { AreBindingAttribute } from \"@adaas/are-html/attributes/AreBinding.attribute\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AddAttributeInstruction} from \"@adaas/are-html/instructions/AddAttribute.instruction\";\nimport { AddTextInstruction} from \"@adaas/are-html/instructions/AddText.instruction\";\nimport { AddListenerInstruction} from \"@adaas/are-html/instructions/AddListener.instruction\";\n\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific compiler for A-Concept Rendering Engine (ARE) components, extending the base AreCompiler to handle HTML templates, styles, and rendering logic tailored for web environments.'\n})\nexport class AreHTMLCompiler extends AreCompiler {\n\n // compile(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(AreScene) scene: AreScene,\n // ...args: any[]\n // ): void {\n // super.compile(node, scene, ...args);\n // }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Interpolation Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n /**\n * Default compile method for interpolations, which can be overridden by specific implementations if needed.\n * \n * @param interpolation \n * @param scope \n * @param scene \n * @param store \n * @param feature \n */\n @AreCompiler.Compile(AreInterpolation)\n compileInterpolation(\n @A_Inject(A_Caller) interpolation: AreInterpolation,\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n // if (scene.host)\n // console.log('Scene Host: ', scene.host);\n\n // let content = '';\n\n // logger?.debug('green', `AreHTMLCompiler: compile interpolation <${interpolation.aseid.toString()}> with key: \"${interpolation.content}\"`, store.get(interpolation.content));\n\n // try {\n // content = AreCommonHelper.evaluate(interpolation.content, store);\n\n // } catch (error) {\n // content = ''\n // }\n\n scene.plan(new AddTextInstruction({ content: interpolation.content, evaluate: true }));\n }\n\n // -----------------------------------------------------------------------------------------\n // ------------------------------Are-Text Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n @AreCompiler.Compile(AreText)\n compileText(\n @A_Inject(A_Caller) text: AreText,\n @A_Inject(AreScene) scene: AreScene,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n logger?.debug('cyan', `AreHTMLCompiler: compile text node <${text.aseid.toString()}> with content: \"${text.content}\"`);\n if (scene.host)\n scene.unPlan(scene.host);\n\n scene.plan(new AddTextInstruction({ content: text.content }));\n\n }\n\n // -----------------------------------------------------------------------------------------\n // -------------------------Are-Attribute Compile Section-----------------------------------\n // -----------------------------------------------------------------------------------------\n\n @AreCompiler.Compile(AreStaticAttribute)\n compileStaticAttribute(\n @A_Inject(A_Caller) attribute: AreStaticAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n\n const content = attribute.content;\n\n /**\n * If the attribute value contains {{ }} interpolations, transform them into\n * a JS string-concatenation expression so the interpreter can evaluate them.\n * e.g. \"color:{{expr}}\" → '\"color:\"+(expr)+\"\"'\n */\n if (content.includes('{{')) {\n const transformed = '\"' + content.replace(/\\{\\{([^}]+)\\}\\}/g, '\"+($1)+\"') + '\"';\n scene.plan(new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: transformed,\n evaluate: true,\n }));\n return;\n }\n\n /**\n * Default case: regular static attribute rendered as-is.\n */\n scene.plan(new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content\n }));\n }\n\n @AreCompiler.Compile(AreDirectiveAttribute)\n compileDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n store.watch(directive);\n\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Compile, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n\n store.unwatch(directive);\n }\n\n\n @AreCompiler.Compile(AreEventAttribute)\n compileEventAttribute(\n @A_Inject(A_Caller) attribute: AreEventAttribute,\n @A_Inject(AreScene) scene: AreScene,\n ...args: any[]\n ) {\n\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n /**\n * 2. In case the attribute is an event listener, then \n * we should simply add a callback handler that will be used to proxy an event \n * into the ComponentNode component. \n *[!] In this case AreAttribute is AreEventAttribute that has prepared callback function to be used \n * in the event listener. It is important to store callback function once \n * to prevent duplicated functions in case of multiple compilations during development.\n */\n scene.plan(new AddListenerInstruction(scene.host, {\n name: attribute.name,\n handler: attribute.content\n }));\n }\n\n\n @AreCompiler.Compile(AreBindingAttribute)\n compileBindingAttribute(\n @A_Inject(A_Caller) attribute: AreBindingAttribute,\n @A_Inject(AreScene) scene: AreScene,\n @A_Dependency.Parent()\n @A_Inject(AreStore) parentStore: AreStore,\n @A_Inject(AreStore) store: AreStore,\n @A_Inject(AreSyntax) syntax: AreSyntax,\n ...args: any[]\n ) {\n if (!scene.host)\n throw new AreCompilerError({\n title: 'Scene Host Not Found',\n description: `No host found for the scene with id: ${scene.id}. Please ensure that the scene is properly initialized and has a host before compiling binding attributes.`\n });\n\n\n const node = attribute.owner;\n const props = node.component?.props;\n\n // Component prop names are typically declared in camelCase, while template\n // markup uses kebab-case. Try both forms when matching.\n let propName: string | undefined;\n if (props) {\n if (props[attribute.name]) {\n propName = attribute.name;\n } else {\n const camel = A_FormatterHelper.toCamelCase(attribute.name);\n if (props[camel]) propName = camel;\n }\n }\n\n /**\n * 1. Component prop binding — evaluate against the parent store and\n * keep the child store reactive to upstream changes.\n */\n if (propName && props) {\n const propDefinition = props[propName];\n\n const coerce = (raw: any): any => {\n let value = raw;\n if (propDefinition.type) {\n switch (propDefinition.type) {\n case 'string': value = value === undefined || value === null ? '' : String(value); break;\n case 'number': value = Number(value); break;\n case 'boolean': value = Boolean(value); break;\n }\n }\n return value;\n };\n\n // The watcher entity below is registered against parentStore so that\n // updates to the bound expression in the parent flow into the child store.\n const watcher = {\n update: () => {\n try {\n parentStore.watch(watcher);\n const next = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n store.set(propName!, next);\n } catch (e) {\n parentStore.unwatch(watcher);\n }\n }\n };\n\n // Initial read with watch active so dependencies are recorded.\n parentStore.watch(watcher);\n const initial = coerce(syntax.evaluate(attribute.content, parentStore));\n parentStore.unwatch(watcher);\n\n store.set(propName, initial);\n return;\n }\n\n /**\n * 2. Default attribute binding — evaluated reactively against the local store.\n */\n const instruction = new AddAttributeInstruction(scene.host, {\n name: attribute.name,\n content: attribute.content,\n evaluate: true\n })\n\n scene.plan(instruction);\n }\n\n\n}"]}
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Void HTML elements that cannot have children and must not have a closing tag.
3
+ * Per the HTML5 spec these are treated as self-closing even when written as
4
+ * `<input>` (without the trailing slash `/>`).
5
+ *
6
+ * Reference: https://html.spec.whatwg.org/multipage/syntax.html#void-elements
7
+ */
8
+ declare const VOID_ELEMENTS: Set<string>;
9
+ declare function isVoidElement(tagName: string): boolean;
1
10
  /**
2
11
  * Boolean HTML attributes whose presence (regardless of value) implies "true",
3
12
  * and whose absence implies "false". Setting these via `setAttribute(name, value)`
@@ -51,4 +60,4 @@ declare const LISTENER_OPTION_MODIFIERS: Set<string>;
51
60
  */
52
61
  declare function toDOMString(value: any): string;
53
62
 
54
- export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, type ParsedEventName, isBooleanAttribute, isIDLFormProperty, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
63
+ export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, type ParsedEventName, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
@@ -1,3 +1,12 @@
1
+ /**
2
+ * Void HTML elements that cannot have children and must not have a closing tag.
3
+ * Per the HTML5 spec these are treated as self-closing even when written as
4
+ * `<input>` (without the trailing slash `/>`).
5
+ *
6
+ * Reference: https://html.spec.whatwg.org/multipage/syntax.html#void-elements
7
+ */
8
+ declare const VOID_ELEMENTS: Set<string>;
9
+ declare function isVoidElement(tagName: string): boolean;
1
10
  /**
2
11
  * Boolean HTML attributes whose presence (regardless of value) implies "true",
3
12
  * and whose absence implies "false". Setting these via `setAttribute(name, value)`
@@ -51,4 +60,4 @@ declare const LISTENER_OPTION_MODIFIERS: Set<string>;
51
60
  */
52
61
  declare function toDOMString(value: any): string;
53
62
 
54
- export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, type ParsedEventName, isBooleanAttribute, isIDLFormProperty, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
63
+ export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, type ParsedEventName, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
@@ -1,5 +1,24 @@
1
1
  'use strict';
2
2
 
3
+ const VOID_ELEMENTS = /* @__PURE__ */ new Set([
4
+ "area",
5
+ "base",
6
+ "br",
7
+ "col",
8
+ "embed",
9
+ "hr",
10
+ "img",
11
+ "input",
12
+ "link",
13
+ "meta",
14
+ "param",
15
+ "source",
16
+ "track",
17
+ "wbr"
18
+ ]);
19
+ function isVoidElement(tagName) {
20
+ return VOID_ELEMENTS.has(tagName.toLowerCase());
21
+ }
3
22
  const BOOLEAN_ATTRIBUTES = /* @__PURE__ */ new Set([
4
23
  "allowfullscreen",
5
24
  "async",
@@ -94,8 +113,10 @@ function toDOMString(value) {
94
113
  exports.BOOLEAN_ATTRIBUTES = BOOLEAN_ATTRIBUTES;
95
114
  exports.IDL_FORM_PROPERTIES = IDL_FORM_PROPERTIES;
96
115
  exports.LISTENER_OPTION_MODIFIERS = LISTENER_OPTION_MODIFIERS;
116
+ exports.VOID_ELEMENTS = VOID_ELEMENTS;
97
117
  exports.isBooleanAttribute = isBooleanAttribute;
98
118
  exports.isIDLFormProperty = isIDLFormProperty;
119
+ exports.isVoidElement = isVoidElement;
99
120
  exports.normalizeClassValue = normalizeClassValue;
100
121
  exports.normalizeStyleValue = normalizeStyleValue;
101
122
  exports.parseEventName = parseEventName;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":"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","file":"AreHTML.constants.js","sourcesContent":["/**\n * Boolean HTML attributes whose presence (regardless of value) implies \"true\",\n * and whose absence implies \"false\". Setting these via `setAttribute(name, value)`\n * always renders the attribute, which is wrong for reactive bindings.\n *\n * Reference: https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n */\nexport const BOOLEAN_ATTRIBUTES = new Set<string>([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n]);\n\nexport function isBooleanAttribute(name: string): boolean {\n return BOOLEAN_ATTRIBUTES.has(name.toLowerCase());\n}\n\n/**\n * Form-control IDL properties that must be set as a JS property\n * (not just an attribute) so live user input is reflected.\n *\n * `<input value=\"foo\">` only sets the *default* value;\n * `input.value = \"foo\"` updates the live state.\n */\nexport const IDL_FORM_PROPERTIES: Record<string, Set<string>> = {\n INPUT: new Set(['value', 'checked', 'indeterminate']),\n TEXTAREA: new Set(['value']),\n SELECT: new Set(['value']),\n OPTION: new Set(['selected']),\n};\n\nexport function isIDLFormProperty(tagName: string, attrName: string): boolean {\n const set = IDL_FORM_PROPERTIES[tagName.toUpperCase()];\n return !!set && set.has(attrName);\n}\n\n/**\n * Normalize a `:class` binding value into a single space-separated string.\n * Supports the common shapes:\n * - string → \"a b\"\n * - array<string | object | falsy> → [\"a\", { b: true, c: cond }, null]\n * - object<string, boolean> → { a: true, b: false }\n */\nexport function normalizeClassValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeClassValue).filter(Boolean).join(' ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n if (value[key]) parts.push(key);\n }\n return parts.join(' ');\n }\n return '';\n}\n\n/**\n * Normalize a `:style` binding value into an inline-style string.\n * Supports:\n * - string → \"color: red; font-size: 12px\"\n * - object<string, string|number> → { color: 'red', fontSize: '12px' }\n * - array<string | object> → ['color: red', { fontSize: '12px' }]\n */\nexport function normalizeStyleValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeStyleValue).filter(Boolean).join('; ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n const v = value[key];\n if (v === null || v === undefined || v === false) continue;\n const kebab = key.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\n parts.push(`${kebab}: ${v}`);\n }\n return parts.join('; ');\n }\n return '';\n}\n\n/**\n * Parse a DOM event name with modifiers, e.g. \"click.stop.prevent\" or \"keydown.enter\".\n * Returns the bare event name plus the modifier set.\n */\nexport interface ParsedEventName {\n event: string;\n modifiers: Set<string>;\n}\n\nexport function parseEventName(raw: string): ParsedEventName {\n const [event, ...modifiers] = raw.split('.');\n return { event, modifiers: new Set(modifiers) };\n}\n\n/**\n * Known event-listener modifiers that map directly to addEventListener options.\n */\nexport const LISTENER_OPTION_MODIFIERS = new Set(['capture', 'once', 'passive']);\n\n/**\n * Coerce a value into a string for DOM consumption.\n * Avoids \"undefined\"/\"null\"/\"[object Object]\" leaks into the DOM.\n */\nexport function toDOMString(value: any): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\n\n"]}
1
+ {"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":";;AAOO,MAAM,aAAA,uBAAoB,GAAA,CAAY;AAAA,EACzC,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,OAAA;AAAA,EACnD,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS;AAChD,CAAC;AAEM,SAAS,cAAc,OAAA,EAA0B;AACpD,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAA;AAClD;AASO,MAAM,kBAAA,uBAAyB,GAAA,CAAY;AAAA,EAC9C,iBAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACJ,CAAC;AAEM,SAAS,mBAAmB,IAAA,EAAuB;AACtD,EAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AACpD;AASO,MAAM,mBAAA,GAAmD;AAAA,EAC5D,uBAAO,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,SAAA,EAAW,eAAe,CAAC,CAAA;AAAA,EACpD,QAAA,kBAAU,IAAI,GAAA,CAAI,CAAC,OAAO,CAAC,CAAA;AAAA,EAC3B,MAAA,kBAAQ,IAAI,GAAA,CAAI,CAAC,OAAO,CAAC,CAAA;AAAA,EACzB,MAAA,kBAAQ,IAAI,GAAA,CAAI,CAAC,UAAU,CAAC;AAChC;AAEO,SAAS,iBAAA,CAAkB,SAAiB,QAAA,EAA2B;AAC1E,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,OAAA,CAAQ,WAAA,EAAa,CAAA;AACrD,EAAA,OAAO,CAAC,CAAC,GAAA,IAAO,GAAA,CAAI,IAAI,QAAQ,CAAA;AACpC;AASO,SAAS,oBAAoB,KAAA,EAAoB;AACpD,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,OAAO,OAAO,EAAA;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AAElD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,IAAI,mBAAmB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,MAAA,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAClC;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,EAAA;AACX;AASO,SAAS,oBAAoB,KAAA,EAAoB;AACpD,EAAA,IAAI,UAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,OAAO,OAAO,EAAA;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AAElD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,IAAI,mBAAmB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACnE;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,MAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,MAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,IAAa,MAAM,KAAA,EAAO;AAClD,MAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAAQ,QAAA,EAAU,OAAK,GAAA,GAAM,CAAA,CAAE,aAAa,CAAA;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,EAAA;AACX;AAWO,SAAS,eAAe,GAAA,EAA8B;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,GAAG,SAAS,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC3C,EAAA,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,IAAI,GAAA,CAAI,SAAS,CAAA,EAAE;AAClD;AAKO,MAAM,4CAA4B,IAAI,GAAA,CAAI,CAAC,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAC;AAMxE,SAAS,YAAY,KAAA,EAAoB;AAC5C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,EAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW,OAAO,OAAO,KAAK,CAAA;AAChF,EAAA,IAAI;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC/B,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,EAAA;AAAA,EACX;AACJ","file":"AreHTML.constants.js","sourcesContent":["/**\n * Void HTML elements that cannot have children and must not have a closing tag.\n * Per the HTML5 spec these are treated as self-closing even when written as\n * `<input>` (without the trailing slash `/>`).\n *\n * Reference: https://html.spec.whatwg.org/multipage/syntax.html#void-elements\n */\nexport const VOID_ELEMENTS = new Set<string>([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n]);\n\nexport function isVoidElement(tagName: string): boolean {\n return VOID_ELEMENTS.has(tagName.toLowerCase());\n}\n\n/**\n * Boolean HTML attributes whose presence (regardless of value) implies \"true\",\n * and whose absence implies \"false\". Setting these via `setAttribute(name, value)`\n * always renders the attribute, which is wrong for reactive bindings.\n *\n * Reference: https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n */\nexport const BOOLEAN_ATTRIBUTES = new Set<string>([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n]);\n\nexport function isBooleanAttribute(name: string): boolean {\n return BOOLEAN_ATTRIBUTES.has(name.toLowerCase());\n}\n\n/**\n * Form-control IDL properties that must be set as a JS property\n * (not just an attribute) so live user input is reflected.\n *\n * `<input value=\"foo\">` only sets the *default* value;\n * `input.value = \"foo\"` updates the live state.\n */\nexport const IDL_FORM_PROPERTIES: Record<string, Set<string>> = {\n INPUT: new Set(['value', 'checked', 'indeterminate']),\n TEXTAREA: new Set(['value']),\n SELECT: new Set(['value']),\n OPTION: new Set(['selected']),\n};\n\nexport function isIDLFormProperty(tagName: string, attrName: string): boolean {\n const set = IDL_FORM_PROPERTIES[tagName.toUpperCase()];\n return !!set && set.has(attrName);\n}\n\n/**\n * Normalize a `:class` binding value into a single space-separated string.\n * Supports the common shapes:\n * - string → \"a b\"\n * - array<string | object | falsy> → [\"a\", { b: true, c: cond }, null]\n * - object<string, boolean> → { a: true, b: false }\n */\nexport function normalizeClassValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeClassValue).filter(Boolean).join(' ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n if (value[key]) parts.push(key);\n }\n return parts.join(' ');\n }\n return '';\n}\n\n/**\n * Normalize a `:style` binding value into an inline-style string.\n * Supports:\n * - string → \"color: red; font-size: 12px\"\n * - object<string, string|number> → { color: 'red', fontSize: '12px' }\n * - array<string | object> → ['color: red', { fontSize: '12px' }]\n */\nexport function normalizeStyleValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeStyleValue).filter(Boolean).join('; ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n const v = value[key];\n if (v === null || v === undefined || v === false) continue;\n const kebab = key.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\n parts.push(`${kebab}: ${v}`);\n }\n return parts.join('; ');\n }\n return '';\n}\n\n/**\n * Parse a DOM event name with modifiers, e.g. \"click.stop.prevent\" or \"keydown.enter\".\n * Returns the bare event name plus the modifier set.\n */\nexport interface ParsedEventName {\n event: string;\n modifiers: Set<string>;\n}\n\nexport function parseEventName(raw: string): ParsedEventName {\n const [event, ...modifiers] = raw.split('.');\n return { event, modifiers: new Set(modifiers) };\n}\n\n/**\n * Known event-listener modifiers that map directly to addEventListener options.\n */\nexport const LISTENER_OPTION_MODIFIERS = new Set(['capture', 'once', 'passive']);\n\n/**\n * Coerce a value into a string for DOM consumption.\n * Avoids \"undefined\"/\"null\"/\"[object Object]\" leaks into the DOM.\n */\nexport function toDOMString(value: any): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\n\n"]}
@@ -1,5 +1,24 @@
1
1
  import '../chunk-EQQGB2QZ.mjs';
2
2
 
3
+ const VOID_ELEMENTS = /* @__PURE__ */ new Set([
4
+ "area",
5
+ "base",
6
+ "br",
7
+ "col",
8
+ "embed",
9
+ "hr",
10
+ "img",
11
+ "input",
12
+ "link",
13
+ "meta",
14
+ "param",
15
+ "source",
16
+ "track",
17
+ "wbr"
18
+ ]);
19
+ function isVoidElement(tagName) {
20
+ return VOID_ELEMENTS.has(tagName.toLowerCase());
21
+ }
3
22
  const BOOLEAN_ATTRIBUTES = /* @__PURE__ */ new Set([
4
23
  "allowfullscreen",
5
24
  "async",
@@ -91,6 +110,6 @@ function toDOMString(value) {
91
110
  }
92
111
  }
93
112
 
94
- export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, isBooleanAttribute, isIDLFormProperty, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
113
+ export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
95
114
  //# sourceMappingURL=AreHTML.constants.mjs.map
96
115
  //# sourceMappingURL=AreHTML.constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":"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","file":"AreHTML.constants.mjs","sourcesContent":["/**\n * Boolean HTML attributes whose presence (regardless of value) implies \"true\",\n * and whose absence implies \"false\". Setting these via `setAttribute(name, value)`\n * always renders the attribute, which is wrong for reactive bindings.\n *\n * Reference: https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n */\nexport const BOOLEAN_ATTRIBUTES = new Set<string>([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n]);\n\nexport function isBooleanAttribute(name: string): boolean {\n return BOOLEAN_ATTRIBUTES.has(name.toLowerCase());\n}\n\n/**\n * Form-control IDL properties that must be set as a JS property\n * (not just an attribute) so live user input is reflected.\n *\n * `<input value=\"foo\">` only sets the *default* value;\n * `input.value = \"foo\"` updates the live state.\n */\nexport const IDL_FORM_PROPERTIES: Record<string, Set<string>> = {\n INPUT: new Set(['value', 'checked', 'indeterminate']),\n TEXTAREA: new Set(['value']),\n SELECT: new Set(['value']),\n OPTION: new Set(['selected']),\n};\n\nexport function isIDLFormProperty(tagName: string, attrName: string): boolean {\n const set = IDL_FORM_PROPERTIES[tagName.toUpperCase()];\n return !!set && set.has(attrName);\n}\n\n/**\n * Normalize a `:class` binding value into a single space-separated string.\n * Supports the common shapes:\n * - string → \"a b\"\n * - array<string | object | falsy> → [\"a\", { b: true, c: cond }, null]\n * - object<string, boolean> → { a: true, b: false }\n */\nexport function normalizeClassValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeClassValue).filter(Boolean).join(' ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n if (value[key]) parts.push(key);\n }\n return parts.join(' ');\n }\n return '';\n}\n\n/**\n * Normalize a `:style` binding value into an inline-style string.\n * Supports:\n * - string → \"color: red; font-size: 12px\"\n * - object<string, string|number> → { color: 'red', fontSize: '12px' }\n * - array<string | object> → ['color: red', { fontSize: '12px' }]\n */\nexport function normalizeStyleValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeStyleValue).filter(Boolean).join('; ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n const v = value[key];\n if (v === null || v === undefined || v === false) continue;\n const kebab = key.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\n parts.push(`${kebab}: ${v}`);\n }\n return parts.join('; ');\n }\n return '';\n}\n\n/**\n * Parse a DOM event name with modifiers, e.g. \"click.stop.prevent\" or \"keydown.enter\".\n * Returns the bare event name plus the modifier set.\n */\nexport interface ParsedEventName {\n event: string;\n modifiers: Set<string>;\n}\n\nexport function parseEventName(raw: string): ParsedEventName {\n const [event, ...modifiers] = raw.split('.');\n return { event, modifiers: new Set(modifiers) };\n}\n\n/**\n * Known event-listener modifiers that map directly to addEventListener options.\n */\nexport const LISTENER_OPTION_MODIFIERS = new Set(['capture', 'once', 'passive']);\n\n/**\n * Coerce a value into a string for DOM consumption.\n * Avoids \"undefined\"/\"null\"/\"[object Object]\" leaks into the DOM.\n */\nexport function toDOMString(value: any): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\n\n"]}
1
+ {"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":"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","file":"AreHTML.constants.mjs","sourcesContent":["/**\n * Void HTML elements that cannot have children and must not have a closing tag.\n * Per the HTML5 spec these are treated as self-closing even when written as\n * `<input>` (without the trailing slash `/>`).\n *\n * Reference: https://html.spec.whatwg.org/multipage/syntax.html#void-elements\n */\nexport const VOID_ELEMENTS = new Set<string>([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr',\n]);\n\nexport function isVoidElement(tagName: string): boolean {\n return VOID_ELEMENTS.has(tagName.toLowerCase());\n}\n\n/**\n * Boolean HTML attributes whose presence (regardless of value) implies \"true\",\n * and whose absence implies \"false\". Setting these via `setAttribute(name, value)`\n * always renders the attribute, which is wrong for reactive bindings.\n *\n * Reference: https://html.spec.whatwg.org/multipage/indices.html#attributes-3\n */\nexport const BOOLEAN_ATTRIBUTES = new Set<string>([\n 'allowfullscreen',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'inert',\n 'ismap',\n 'itemscope',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected',\n]);\n\nexport function isBooleanAttribute(name: string): boolean {\n return BOOLEAN_ATTRIBUTES.has(name.toLowerCase());\n}\n\n/**\n * Form-control IDL properties that must be set as a JS property\n * (not just an attribute) so live user input is reflected.\n *\n * `<input value=\"foo\">` only sets the *default* value;\n * `input.value = \"foo\"` updates the live state.\n */\nexport const IDL_FORM_PROPERTIES: Record<string, Set<string>> = {\n INPUT: new Set(['value', 'checked', 'indeterminate']),\n TEXTAREA: new Set(['value']),\n SELECT: new Set(['value']),\n OPTION: new Set(['selected']),\n};\n\nexport function isIDLFormProperty(tagName: string, attrName: string): boolean {\n const set = IDL_FORM_PROPERTIES[tagName.toUpperCase()];\n return !!set && set.has(attrName);\n}\n\n/**\n * Normalize a `:class` binding value into a single space-separated string.\n * Supports the common shapes:\n * - string → \"a b\"\n * - array<string | object | falsy> → [\"a\", { b: true, c: cond }, null]\n * - object<string, boolean> → { a: true, b: false }\n */\nexport function normalizeClassValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeClassValue).filter(Boolean).join(' ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n if (value[key]) parts.push(key);\n }\n return parts.join(' ');\n }\n return '';\n}\n\n/**\n * Normalize a `:style` binding value into an inline-style string.\n * Supports:\n * - string → \"color: red; font-size: 12px\"\n * - object<string, string|number> → { color: 'red', fontSize: '12px' }\n * - array<string | object> → ['color: red', { fontSize: '12px' }]\n */\nexport function normalizeStyleValue(value: any): string {\n if (value === null || value === undefined || value === false) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number') return String(value);\n\n if (Array.isArray(value)) {\n return value.map(normalizeStyleValue).filter(Boolean).join('; ');\n }\n if (typeof value === 'object') {\n const parts: string[] = [];\n for (const key of Object.keys(value)) {\n const v = value[key];\n if (v === null || v === undefined || v === false) continue;\n const kebab = key.replace(/[A-Z]/g, m => '-' + m.toLowerCase());\n parts.push(`${kebab}: ${v}`);\n }\n return parts.join('; ');\n }\n return '';\n}\n\n/**\n * Parse a DOM event name with modifiers, e.g. \"click.stop.prevent\" or \"keydown.enter\".\n * Returns the bare event name plus the modifier set.\n */\nexport interface ParsedEventName {\n event: string;\n modifiers: Set<string>;\n}\n\nexport function parseEventName(raw: string): ParsedEventName {\n const [event, ...modifiers] = raw.split('.');\n return { event, modifiers: new Set(modifiers) };\n}\n\n/**\n * Known event-listener modifiers that map directly to addEventListener options.\n */\nexport const LISTENER_OPTION_MODIFIERS = new Set(['capture', 'once', 'passive']);\n\n/**\n * Coerce a value into a string for DOM consumption.\n * Avoids \"undefined\"/\"null\"/\"[object Object]\" leaks into the DOM.\n */\nexport function toDOMString(value: any): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\n\n"]}
@@ -1,5 +1,5 @@
1
1
  import { A_Scope } from '@adaas/a-concept';
2
- import { AreEngine, AreSyntax, AreSyntaxTokenMatch } from '@adaas/are';
2
+ import { AreEngine, AreSyntax, AreSignalsContext, AreSyntaxTokenMatch } from '@adaas/are';
3
3
 
4
4
  declare class AreHTMLEngine extends AreEngine {
5
5
  get DefaultSyntax(): AreSyntax;
@@ -8,7 +8,7 @@ declare class AreHTMLEngine extends AreEngine {
8
8
  *
9
9
  * @param container
10
10
  */
11
- init(scope: A_Scope): Promise<void>;
11
+ init(scope: A_Scope, signalContext?: AreSignalsContext): Promise<void>;
12
12
  protected rootElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
13
13
  protected htmlElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
14
14
  /**
@@ -1,5 +1,5 @@
1
1
  import { A_Scope } from '@adaas/a-concept';
2
- import { AreEngine, AreSyntax, AreSyntaxTokenMatch } from '@adaas/are';
2
+ import { AreEngine, AreSyntax, AreSignalsContext, AreSyntaxTokenMatch } from '@adaas/are';
3
3
 
4
4
  declare class AreHTMLEngine extends AreEngine {
5
5
  get DefaultSyntax(): AreSyntax;
@@ -8,7 +8,7 @@ declare class AreHTMLEngine extends AreEngine {
8
8
  *
9
9
  * @param container
10
10
  */
11
- init(scope: A_Scope): Promise<void>;
11
+ init(scope: A_Scope, signalContext?: AreSignalsContext): Promise<void>;
12
12
  protected rootElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
13
13
  protected htmlElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
14
14
  /**
@@ -15,6 +15,7 @@ var AreRoot = require('@adaas/are-html/nodes/AreRoot');
15
15
  var lifecycle = require('@adaas/are-html/lifecycle');
16
16
  var transformer = require('@adaas/are-html/transformer');
17
17
  var AreHTML_compiler = require('./AreHTML.compiler');
18
+ var AreHTML_constants = require('./AreHTML.constants');
18
19
 
19
20
  var __defProp = Object.defineProperty;
20
21
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -71,7 +72,7 @@ exports.AreHTMLEngine = class AreHTMLEngine extends are.AreEngine {
71
72
  ]
72
73
  });
73
74
  }
74
- async init(scope) {
75
+ async init(scope, signalContext) {
75
76
  this.package(scope, {
76
77
  context: new AreHTML_context.AreHTMLEngineContext({}),
77
78
  syntax: this.DefaultSyntax,
@@ -81,6 +82,10 @@ exports.AreHTMLEngine = class AreHTMLEngine extends are.AreEngine {
81
82
  lifecycle: lifecycle.AreHTMLLifecycle,
82
83
  transformer: transformer.AreHTMLTransformer
83
84
  });
85
+ if (!signalContext) {
86
+ signalContext = new are.AreSignalsContext();
87
+ scope.register(signalContext);
88
+ }
84
89
  }
85
90
  rootElementMatcher(source, from, to, build) {
86
91
  const rootTag = "are-root";
@@ -125,6 +130,13 @@ exports.AreHTMLEngine = class AreHTMLEngine extends are.AreEngine {
125
130
  match2.payload = { entity: tagName, selfClose: true, id };
126
131
  return match2;
127
132
  }
133
+ if (AreHTML_constants.isVoidElement(tagName)) {
134
+ const raw = source.slice(tagStart, openingTagEnd + 1);
135
+ const content2 = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd);
136
+ const match2 = build(raw, content2, tagStart, ">");
137
+ match2.payload = { entity: tagName, selfClose: true, id };
138
+ return match2;
139
+ }
128
140
  const closingTag = `</${tagName}>`;
129
141
  let level = 0;
130
142
  let searchIndex = openingTagEnd + 1;
@@ -182,7 +194,8 @@ __decorateClass([
182
194
  name: aService.A_ServiceFeatures.onBeforeLoad,
183
195
  before: /.*/
184
196
  }),
185
- __decorateParam(0, aConcept.A_Inject(aConcept.A_Scope))
197
+ __decorateParam(0, aConcept.A_Inject(aConcept.A_Scope)),
198
+ __decorateParam(1, aConcept.A_Inject(are.AreSignalsContext))
186
199
  ], exports.AreHTMLEngine.prototype, "init", 1);
187
200
  exports.AreHTMLEngine = __decorateClass([
188
201
  core.A_Frame.Define({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/engine/AreHTML.engine.ts"],"names":["AreHTMLEngine","AreEngine","AreSyntax","AreComment","AreInterpolation","AreRootNode","AreComponentNode","AreText","AreHTMLEngineContext","AreHTMLCompiler","AreHTMLInterpreter","AreHTMLTokenizer","AreHTMLLifecycle","AreHTMLTransformer","content","match","A_Feature","A_ServiceFeatures","A_Scope","A_Frame"],"mappings":"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","file":"AreHTML.engine.js","sourcesContent":["import { A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\"\nimport { A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { AreEngine, AreSyntaxTokenMatch, AreSyntax } from \"@adaas/are\";\nimport { AreHTMLInterpreter } from \"@adaas/are-html/interpreter\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreComment } from \"@adaas/are-html/nodes/AreComment\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreHTMLTokenizer } from \"@adaas/are-html/tokenizer\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreHTMLLifecycle } from \"@adaas/are-html/lifecycle\";\nimport { AreHTMLTransformer } from \"@adaas/are-html/transformer\";\nimport { AreHTMLCompiler } from \"./AreHTML.compiler\";\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'Concrete HTML rendering engine that assembles the full ARE pipeline for web environments. Bootstraps and wires AreHTMLTokenizer, AreHTMLTransformer, AreHTMLCompiler, AreHTMLInterpreter, and AreHTMLLifecycle; mounts root nodes from inline or fetched templates; and drives reactive re-renders via the AreSignals bus.'\n})\nexport class AreHTMLEngine extends AreEngine {\n\n\n\n get DefaultSyntax() {\n return new AreSyntax({\n trimWhitespace: true,\n strictMode: true,\n rules: [\n // HTML comments\n {\n opening: '<!--',\n closing: '-->',\n component: AreComment,\n priority: 10,\n nested: false,\n extract: (raw) => ({ content: raw.slice(4, -3).trim() }),\n },\n // interpolations\n {\n opening: '{{',\n closing: '}}',\n component: AreInterpolation,\n priority: 9,\n nested: false,\n extract: (_, match) => ({ key: match.content }),\n },\n // are-root — matched before generic elements, produces AreRootNode\n {\n matcher: this.rootElementMatcher.bind(this),\n component: AreRootNode,\n priority: 5,\n },\n // generic HTML elements\n {\n matcher: this.htmlElementMatcher.bind(this),\n component: AreComponentNode,\n priority: 4,\n },\n // plain text fallback\n {\n component: AreText,\n priority: 0,\n },\n ],\n })\n }\n\n\n /**\n * Inject AreHTMLSyntax into the container scope before loading\n * \n * @param container \n */\n @A_Feature.Extend({\n name: A_ServiceFeatures.onBeforeLoad,\n before: /.*/\n })\n async init(\n @A_Inject(A_Scope) scope: A_Scope,\n ) {\n this.package(scope, {\n context: new AreHTMLEngineContext({}),\n syntax: this.DefaultSyntax,\n compiler: AreHTMLCompiler,\n interpreter: AreHTMLInterpreter,\n tokenizer: AreHTMLTokenizer,\n lifecycle: AreHTMLLifecycle,\n transformer: AreHTMLTransformer,\n });\n }\n\n\n protected rootElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n\n // const rootTag = this.config.rootTag\n const rootTag = 'are-root';\n\n const tagStart = source.indexOf('<', from)\n if (tagStart === -1 || tagStart >= to) return null\n\n // only match if the tag name is exactly the configured root tag\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch || tagNameMatch[1].toLowerCase() !== rootTag) return null\n\n // delegate the actual matching to the shared HTML element logic\n return this.htmlElementMatcher(source, from, to, build)\n }\n\n protected htmlElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n let index = from\n\n while (index < to) {\n const tagStart = source.indexOf('<', index)\n if (tagStart === -1 || tagStart >= to) return null\n\n // skip comments, closing tags, doctype, processing instructions\n if (source.startsWith('<!--', tagStart)) { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '/') { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '!' || source[tagStart + 1] === '?') { index = tagStart + 1; continue }\n\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch) { index = tagStart + 1; continue }\n\n const tagName = tagNameMatch[1]\n const openingTagEnd = AreHTMLEngine.findTagClose(source, tagStart)\n if (openingTagEnd === -1) return null\n\n // extract id attribute if present in the opening tag\n const openingTagStr = source.slice(tagStart, openingTagEnd + 1)\n const idMatch = openingTagStr.match(/\\bid=[\"']([^\"']*)[\"']/)\n const id = idMatch ? idMatch[1] : undefined\n\n // self-closing: <br/> or <input/>\n if (source[openingTagEnd - 1] === '/') {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd - 1)\n const match = build(raw, content, tagStart, '/>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // find matching closing tag respecting nesting\n const closingTag = `</${tagName}>`\n let level = 0\n let searchIndex = openingTagEnd + 1\n let closingStart = -1\n\n while (searchIndex < to) {\n const nextOpen = source.indexOf(`<${tagName}`, searchIndex)\n const nextClose = source.indexOf(closingTag, searchIndex)\n if (nextClose === -1) break\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = source[nextOpen + tagName.length + 1]\n if (charAfter === ' ' || charAfter === '>' || charAfter === '/') {\n // Skip self-closing nested occurrences, e.g. <div/> inside <div>...</div>.\n const innerEnd = AreHTMLEngine.findTagClose(source, nextOpen)\n const isSelfClose = innerEnd !== -1 && source[innerEnd - 1] === '/'\n\n if (!isSelfClose) {\n level++\n }\n searchIndex = (innerEnd === -1 ? nextOpen + tagName.length + 1 : innerEnd + 1)\n continue\n }\n }\n\n if (level === 0) { closingStart = nextClose; break }\n level--\n searchIndex = nextClose + closingTag.length\n }\n\n if (closingStart === -1) return null\n\n const fullTag = source.slice(tagStart, closingStart + closingTag.length)\n const content = source.slice(openingTagEnd + 1, closingStart)\n const match = build(fullTag, content, tagStart, closingTag)\n match.payload = { entity: tagName, selfClose: false, id }\n return match\n }\n return null\n }\n\n /**\n * Find the index of the closing `>` of an opening tag, skipping over\n * `>` characters that appear inside quoted attribute values.\n */\n private static findTagClose(source: string, from: number): number {\n let inSingle = false\n let inDouble = false\n\n for (let i = from; i < source.length; i++) {\n const ch = source[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) return i\n }\n\n return -1\n }\n\n}"]}
1
+ {"version":3,"sources":["../../../src/engine/AreHTML.engine.ts"],"names":["AreHTMLEngine","AreEngine","AreSyntax","AreComment","AreInterpolation","AreRootNode","AreComponentNode","AreText","AreHTMLEngineContext","AreHTMLCompiler","AreHTMLInterpreter","AreHTMLTokenizer","AreHTMLLifecycle","AreHTMLTransformer","AreSignalsContext","content","match","isVoidElement","A_Feature","A_ServiceFeatures","A_Scope","A_Frame"],"mappings":"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","file":"AreHTML.engine.js","sourcesContent":["import { A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\"\nimport { A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { AreEngine, AreSyntaxTokenMatch, AreSyntax, AreSignalsContext } from \"@adaas/are\";\nimport { AreHTMLInterpreter } from \"@adaas/are-html/interpreter\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreComment } from \"@adaas/are-html/nodes/AreComment\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreHTMLTokenizer } from \"@adaas/are-html/tokenizer\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreHTMLLifecycle } from \"@adaas/are-html/lifecycle\";\nimport { AreHTMLTransformer } from \"@adaas/are-html/transformer\";\nimport { AreHTMLCompiler } from \"./AreHTML.compiler\";\nimport { isVoidElement } from \"./AreHTML.constants\";\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'Concrete HTML rendering engine that assembles the full ARE pipeline for web environments. Bootstraps and wires AreHTMLTokenizer, AreHTMLTransformer, AreHTMLCompiler, AreHTMLInterpreter, and AreHTMLLifecycle; mounts root nodes from inline or fetched templates; and drives reactive re-renders via the AreSignals bus.'\n})\nexport class AreHTMLEngine extends AreEngine {\n\n\n\n get DefaultSyntax() {\n return new AreSyntax({\n trimWhitespace: true,\n strictMode: true,\n rules: [\n // HTML comments\n {\n opening: '<!--',\n closing: '-->',\n component: AreComment,\n priority: 10,\n nested: false,\n extract: (raw) => ({ content: raw.slice(4, -3).trim() }),\n },\n // interpolations\n {\n opening: '{{',\n closing: '}}',\n component: AreInterpolation,\n priority: 9,\n nested: false,\n extract: (_, match) => ({ key: match.content }),\n },\n // are-root — matched before generic elements, produces AreRootNode\n {\n matcher: this.rootElementMatcher.bind(this),\n component: AreRootNode,\n priority: 5,\n },\n // generic HTML elements\n {\n matcher: this.htmlElementMatcher.bind(this),\n component: AreComponentNode,\n priority: 4,\n },\n // plain text fallback\n {\n component: AreText,\n priority: 0,\n },\n ],\n })\n }\n\n\n /**\n * Inject AreHTMLSyntax into the container scope before loading\n * \n * @param container \n */\n @A_Feature.Extend({\n name: A_ServiceFeatures.onBeforeLoad,\n before: /.*/\n })\n async init(\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreSignalsContext) signalContext?: AreSignalsContext\n ) {\n this.package(scope, {\n context: new AreHTMLEngineContext({}),\n syntax: this.DefaultSyntax,\n compiler: AreHTMLCompiler,\n interpreter: AreHTMLInterpreter,\n tokenizer: AreHTMLTokenizer,\n lifecycle: AreHTMLLifecycle,\n transformer: AreHTMLTransformer,\n });\n\n if(!signalContext) {\n signalContext = new AreSignalsContext();\n scope.register(signalContext);\n }\n }\n\n\n protected rootElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n\n // const rootTag = this.config.rootTag\n const rootTag = 'are-root';\n\n const tagStart = source.indexOf('<', from)\n if (tagStart === -1 || tagStart >= to) return null\n\n // only match if the tag name is exactly the configured root tag\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch || tagNameMatch[1].toLowerCase() !== rootTag) return null\n\n // delegate the actual matching to the shared HTML element logic\n return this.htmlElementMatcher(source, from, to, build)\n }\n\n protected htmlElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n let index = from\n\n while (index < to) {\n const tagStart = source.indexOf('<', index)\n if (tagStart === -1 || tagStart >= to) return null\n\n // skip comments, closing tags, doctype, processing instructions\n if (source.startsWith('<!--', tagStart)) { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '/') { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '!' || source[tagStart + 1] === '?') { index = tagStart + 1; continue }\n\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch) { index = tagStart + 1; continue }\n\n const tagName = tagNameMatch[1]\n const openingTagEnd = AreHTMLEngine.findTagClose(source, tagStart)\n if (openingTagEnd === -1) return null\n\n // extract id attribute if present in the opening tag\n const openingTagStr = source.slice(tagStart, openingTagEnd + 1)\n const idMatch = openingTagStr.match(/\\bid=[\"']([^\"']*)[\"']/)\n const id = idMatch ? idMatch[1] : undefined\n\n // self-closing: <br/> or <input/>\n if (source[openingTagEnd - 1] === '/') {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd - 1)\n const match = build(raw, content, tagStart, '/>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // HTML5 void elements: <input>, <br>, <img>, etc. — treat as self-closing\n if (isVoidElement(tagName)) {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd)\n const match = build(raw, content, tagStart, '>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // find matching closing tag respecting nesting\n const closingTag = `</${tagName}>`\n let level = 0\n let searchIndex = openingTagEnd + 1\n let closingStart = -1\n\n while (searchIndex < to) {\n const nextOpen = source.indexOf(`<${tagName}`, searchIndex)\n const nextClose = source.indexOf(closingTag, searchIndex)\n if (nextClose === -1) break\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = source[nextOpen + tagName.length + 1]\n if (charAfter === ' ' || charAfter === '>' || charAfter === '/') {\n // Skip self-closing nested occurrences, e.g. <div/> inside <div>...</div>.\n const innerEnd = AreHTMLEngine.findTagClose(source, nextOpen)\n const isSelfClose = innerEnd !== -1 && source[innerEnd - 1] === '/'\n\n if (!isSelfClose) {\n level++\n }\n searchIndex = (innerEnd === -1 ? nextOpen + tagName.length + 1 : innerEnd + 1)\n continue\n }\n }\n\n if (level === 0) { closingStart = nextClose; break }\n level--\n searchIndex = nextClose + closingTag.length\n }\n\n if (closingStart === -1) return null\n\n const fullTag = source.slice(tagStart, closingStart + closingTag.length)\n const content = source.slice(openingTagEnd + 1, closingStart)\n const match = build(fullTag, content, tagStart, closingTag)\n match.payload = { entity: tagName, selfClose: false, id }\n return match\n }\n return null\n }\n\n /**\n * Find the index of the closing `>` of an opening tag, skipping over\n * `>` characters that appear inside quoted attribute values.\n */\n private static findTagClose(source: string, from: number): number {\n let inSingle = false\n let inDouble = false\n\n for (let i = from; i < source.length; i++) {\n const ch = source[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) return i\n }\n\n return -1\n }\n\n}"]}