@adaas/are-html 0.0.22 → 0.0.24
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/browser/index.d.mts +194 -10
- package/dist/browser/index.mjs +696 -245
- package/dist/browser/index.mjs.map +1 -1
- package/dist/node/{AreBinding.attribute-doUvtOjc.d.mts → AreBinding.attribute-BWzEIw6H.d.mts} +45 -0
- package/dist/node/{AreBinding.attribute-Bm5LlOyE.d.ts → AreBinding.attribute-GpT-5Qmf.d.ts} +45 -0
- package/dist/node/attributes/AreBinding.attribute.d.mts +1 -1
- package/dist/node/attributes/AreBinding.attribute.d.ts +1 -1
- package/dist/node/attributes/AreDirective.attribute.d.mts +1 -1
- package/dist/node/attributes/AreDirective.attribute.d.ts +1 -1
- package/dist/node/attributes/AreEvent.attribute.d.mts +1 -1
- package/dist/node/attributes/AreEvent.attribute.d.ts +1 -1
- package/dist/node/attributes/AreStatic.attribute.d.mts +1 -1
- package/dist/node/attributes/AreStatic.attribute.d.ts +1 -1
- package/dist/node/directives/AreDirectiveFor.directive.d.mts +18 -1
- package/dist/node/directives/AreDirectiveFor.directive.d.ts +18 -1
- package/dist/node/directives/AreDirectiveFor.directive.js +57 -9
- package/dist/node/directives/AreDirectiveFor.directive.js.map +1 -1
- package/dist/node/directives/AreDirectiveFor.directive.mjs +57 -9
- package/dist/node/directives/AreDirectiveFor.directive.mjs.map +1 -1
- package/dist/node/directives/AreDirectiveIf.directive.d.mts +18 -2
- package/dist/node/directives/AreDirectiveIf.directive.d.ts +18 -2
- package/dist/node/directives/AreDirectiveIf.directive.js +29 -6
- package/dist/node/directives/AreDirectiveIf.directive.js.map +1 -1
- package/dist/node/directives/AreDirectiveIf.directive.mjs +29 -6
- package/dist/node/directives/AreDirectiveIf.directive.mjs.map +1 -1
- package/dist/node/directives/AreDirectiveShow.directive.d.mts +1 -1
- package/dist/node/directives/AreDirectiveShow.directive.d.ts +1 -1
- package/dist/node/engine/AreHTML.compiler.d.mts +4 -2
- package/dist/node/engine/AreHTML.compiler.d.ts +4 -2
- package/dist/node/engine/AreHTML.compiler.js +11 -4
- package/dist/node/engine/AreHTML.compiler.js.map +1 -1
- package/dist/node/engine/AreHTML.compiler.mjs +11 -4
- package/dist/node/engine/AreHTML.compiler.mjs.map +1 -1
- package/dist/node/engine/AreHTML.constants.d.mts +33 -1
- package/dist/node/engine/AreHTML.constants.d.ts +33 -1
- package/dist/node/engine/AreHTML.constants.js +166 -0
- package/dist/node/engine/AreHTML.constants.js.map +1 -1
- package/dist/node/engine/AreHTML.constants.mjs +165 -1
- package/dist/node/engine/AreHTML.constants.mjs.map +1 -1
- package/dist/node/engine/AreHTML.context.d.mts +66 -0
- package/dist/node/engine/AreHTML.context.d.ts +66 -0
- package/dist/node/engine/AreHTML.context.js +98 -0
- package/dist/node/engine/AreHTML.context.js.map +1 -1
- package/dist/node/engine/AreHTML.context.mjs +98 -0
- package/dist/node/engine/AreHTML.context.mjs.map +1 -1
- package/dist/node/engine/AreHTML.interpreter.d.mts +3 -0
- package/dist/node/engine/AreHTML.interpreter.d.ts +3 -0
- package/dist/node/engine/AreHTML.interpreter.js +66 -10
- package/dist/node/engine/AreHTML.interpreter.js.map +1 -1
- package/dist/node/engine/AreHTML.interpreter.mjs +66 -10
- package/dist/node/engine/AreHTML.interpreter.mjs.map +1 -1
- package/dist/node/engine/AreHTML.lifecycle.d.mts +1 -8
- package/dist/node/engine/AreHTML.lifecycle.d.ts +1 -8
- package/dist/node/engine/AreHTML.lifecycle.js +29 -44
- package/dist/node/engine/AreHTML.lifecycle.js.map +1 -1
- package/dist/node/engine/AreHTML.lifecycle.mjs +29 -44
- package/dist/node/engine/AreHTML.lifecycle.mjs.map +1 -1
- package/dist/node/engine/AreHTML.tokenizer.d.mts +1 -1
- package/dist/node/engine/AreHTML.tokenizer.d.ts +1 -1
- package/dist/node/engine/AreHTML.tokenizer.js +7 -1
- package/dist/node/engine/AreHTML.tokenizer.js.map +1 -1
- package/dist/node/engine/AreHTML.tokenizer.mjs +7 -1
- package/dist/node/engine/AreHTML.tokenizer.mjs.map +1 -1
- package/dist/node/engine/AreHTML.transformer.d.mts +1 -1
- package/dist/node/engine/AreHTML.transformer.d.ts +1 -1
- package/dist/node/index.d.mts +4 -3
- package/dist/node/index.d.ts +4 -3
- package/dist/node/index.js +7 -0
- package/dist/node/index.mjs +1 -0
- package/dist/node/instructions/AddStaticHTML.instruction.d.mts +8 -0
- package/dist/node/instructions/AddStaticHTML.instruction.d.ts +8 -0
- package/dist/node/instructions/AddStaticHTML.instruction.js +31 -0
- package/dist/node/instructions/AddStaticHTML.instruction.js.map +1 -0
- package/dist/node/instructions/AddStaticHTML.instruction.mjs +24 -0
- package/dist/node/instructions/AddStaticHTML.instruction.mjs.map +1 -0
- package/dist/node/instructions/AreHTML.instructions.constants.d.mts +1 -0
- package/dist/node/instructions/AreHTML.instructions.constants.d.ts +1 -0
- package/dist/node/instructions/AreHTML.instructions.constants.js +1 -0
- package/dist/node/instructions/AreHTML.instructions.constants.js.map +1 -1
- package/dist/node/instructions/AreHTML.instructions.constants.mjs +1 -0
- package/dist/node/instructions/AreHTML.instructions.constants.mjs.map +1 -1
- package/dist/node/instructions/AreHTML.instructions.types.d.mts +9 -1
- package/dist/node/instructions/AreHTML.instructions.types.d.ts +9 -1
- package/dist/node/lib/AreDirective/AreDirective.component.d.mts +1 -1
- package/dist/node/lib/AreDirective/AreDirective.component.d.ts +1 -1
- package/dist/node/lib/AreDirective/AreDirective.types.d.mts +1 -1
- package/dist/node/lib/AreDirective/AreDirective.types.d.ts +1 -1
- package/dist/node/lib/AreHTML/AreHTML.tokenizer.d.mts +1 -1
- package/dist/node/lib/AreHTML/AreHTML.tokenizer.d.ts +1 -1
- package/dist/node/lib/AreHTMLAttribute/AreHTML.attribute.d.mts +1 -1
- package/dist/node/lib/AreHTMLAttribute/AreHTML.attribute.d.ts +1 -1
- package/dist/node/lib/AreHTMLNode/AreHTMLNode.d.mts +1 -1
- package/dist/node/lib/AreHTMLNode/AreHTMLNode.d.ts +1 -1
- package/dist/node/lib/AreHTMLNode/AreHTMLNode.js +51 -0
- package/dist/node/lib/AreHTMLNode/AreHTMLNode.js.map +1 -1
- package/dist/node/lib/AreHTMLNode/AreHTMLNode.mjs +51 -0
- package/dist/node/lib/AreHTMLNode/AreHTMLNode.mjs.map +1 -1
- package/dist/node/lib/AreRoot/AreRoot.component.js.map +1 -1
- package/dist/node/lib/AreRoot/AreRoot.component.mjs.map +1 -1
- package/dist/node/nodes/AreComment.d.mts +1 -1
- package/dist/node/nodes/AreComment.d.ts +1 -1
- package/dist/node/nodes/AreComponent.d.mts +1 -1
- package/dist/node/nodes/AreComponent.d.ts +1 -1
- package/dist/node/nodes/AreInterpolation.d.mts +1 -1
- package/dist/node/nodes/AreInterpolation.d.ts +1 -1
- package/dist/node/nodes/AreRoot.d.mts +1 -1
- package/dist/node/nodes/AreRoot.d.ts +1 -1
- package/dist/node/nodes/AreText.d.mts +1 -1
- package/dist/node/nodes/AreText.d.ts +1 -1
- package/examples/dashboard/concept.ts +1 -1
- package/examples/dashboard/dist/index.html +1 -1
- package/examples/dashboard/dist/{mqh9ryml-xat335.js → mqiw5sqa-ypckmj.js} +403 -57
- package/examples/for-perf/dist/index.html +1 -1
- package/examples/for-perf/dist/{mqh9ryfo-6a8d0o.js → mqp8i2py-vltsx0.js} +3030 -2474
- package/examples/lazy-loading/README.md +76 -0
- package/examples/lazy-loading/concept.ts +55 -0
- package/examples/lazy-loading/containers/UI.container.ts +215 -0
- package/examples/lazy-loading/dist/app.js +3803 -0
- package/examples/{for-perf/dist/mqh9ryfq-4pf5cv.js → lazy-loading/dist/chunks/chunk-6K72IBO4.js} +2708 -5476
- package/examples/lazy-loading/dist/index.html +36 -0
- package/examples/lazy-loading/dist/lazy/about-page.js +59 -0
- package/examples/lazy-loading/dist/lazy/reports-page.js +65 -0
- package/examples/lazy-loading/dist/lazy/settings-page.js +54 -0
- package/examples/lazy-loading/public/index.html +36 -0
- package/examples/lazy-loading/src/components/AppShell.component.ts +44 -0
- package/examples/lazy-loading/src/components/HomePage.component.ts +59 -0
- package/examples/lazy-loading/src/components/LazyOutlet.component.ts +108 -0
- package/examples/lazy-loading/src/components/NavBar.component.ts +98 -0
- package/examples/lazy-loading/src/concept.ts +116 -0
- package/examples/lazy-loading/src/lazy/AboutPage.component.ts +54 -0
- package/examples/lazy-loading/src/lazy/ReportsPage.component.ts +56 -0
- package/examples/lazy-loading/src/lazy/SettingsPage.component.ts +45 -0
- package/examples/lazy-loading/src/runtime/ComponentManifest.fragment.ts +61 -0
- package/examples/lazy-loading/src/runtime/LazyComponentResolver.fragment.ts +77 -0
- package/examples/os-desktop/README.md +91 -0
- package/examples/os-desktop/concept.ts +54 -0
- package/examples/os-desktop/containers/OS.container.ts +198 -0
- package/examples/os-desktop/containers/apps/AppBackend.ts +29 -0
- package/examples/os-desktop/containers/apps/GanttApp.backend.ts +56 -0
- package/examples/os-desktop/containers/apps/MarketingApp.backend.ts +68 -0
- package/examples/os-desktop/dist/app.js +4410 -0
- package/examples/os-desktop/dist/apps/gantt/app.js +271 -0
- package/examples/os-desktop/dist/apps/marketing/app.js +346 -0
- package/examples/{for-perf/dist/mqh9ryde-m243t8.js → os-desktop/dist/chunks/chunk-6K72IBO4.js} +2708 -5476
- package/examples/os-desktop/dist/chunks/chunk-EIIGUL6N.js +30 -0
- package/examples/os-desktop/dist/chunks/chunk-WOH7L5UR.js +30 -0
- package/examples/os-desktop/dist/index.html +33 -0
- package/examples/os-desktop/public/index.html +33 -0
- package/examples/os-desktop/src/apps/gantt/GanttApp.component.ts +41 -0
- package/examples/os-desktop/src/apps/gantt/GanttChart.component.ts +126 -0
- package/examples/os-desktop/src/apps/gantt/GanttStore.ts +47 -0
- package/examples/os-desktop/src/apps/gantt/GanttToolbar.component.ts +73 -0
- package/examples/os-desktop/src/apps/gantt/index.ts +13 -0
- package/examples/os-desktop/src/apps/marketing/MarketingApp.component.ts +53 -0
- package/examples/os-desktop/src/apps/marketing/MarketingStore.ts +34 -0
- package/examples/os-desktop/src/apps/marketing/PostEditor.component.ts +153 -0
- package/examples/os-desktop/src/apps/marketing/PostPreview.component.ts +110 -0
- package/examples/os-desktop/src/apps/marketing/index.ts +16 -0
- package/examples/os-desktop/src/concept.ts +126 -0
- package/examples/os-desktop/src/os/AppStage.component.ts +112 -0
- package/examples/os-desktop/src/os/AppWindow.component.ts +102 -0
- package/examples/os-desktop/src/os/Desktop.component.ts +106 -0
- package/examples/os-desktop/src/os/Dock.component.ts +174 -0
- package/examples/os-desktop/src/os/Hud.component.ts +83 -0
- package/examples/os-desktop/src/os/Launchpad.component.ts +191 -0
- package/examples/os-desktop/src/os/MenuBar.component.ts +156 -0
- package/examples/os-desktop/src/runtime/AppComponentResolver.fragment.ts +121 -0
- package/examples/os-desktop/src/runtime/AppRegistry.fragment.ts +104 -0
- package/examples/os-desktop/src/signals/MouseState.signal.ts +34 -0
- package/examples/os-desktop/src/signals/OSRoute.signal.ts +37 -0
- package/examples/os-desktop/src/signals/SelectionState.signal.ts +34 -0
- package/examples/signal-routing/dist/index.html +1 -1
- package/examples/signal-routing/dist/{mqh9ryc9-dkcbkx.js → mqp8hgce-4d6rh0.js} +3196 -2640
- package/package.json +13 -9
- package/src/directives/AreDirectiveFor.directive.ts +99 -16
- package/src/directives/AreDirectiveIf.directive.ts +33 -4
- package/src/engine/AreHTML.compiler.ts +25 -2
- package/src/engine/AreHTML.constants.ts +142 -0
- package/src/engine/AreHTML.context.ts +112 -0
- package/src/engine/AreHTML.interpreter.ts +114 -13
- package/src/engine/AreHTML.lifecycle.ts +81 -74
- package/src/engine/AreHTML.tokenizer.ts +30 -1
- package/src/index.ts +1 -0
- package/src/instructions/AddStaticHTML.instruction.ts +23 -0
- package/src/instructions/AreHTML.instructions.constants.ts +1 -0
- package/src/instructions/AreHTML.instructions.types.ts +9 -0
- package/src/lib/AreHTMLNode/AreHTMLNode.ts +74 -0
- package/src/lib/AreRoot/AreRoot.component.ts +3 -3
- package/tests/PropPropagation.test.ts +181 -0
- package/tests/StaticIsland.test.ts +115 -0
- package/tests/jest.setup.ts +11 -0
|
@@ -115,15 +115,181 @@ function toDOMString(value) {
|
|
|
115
115
|
return "";
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
+
const STANDARD_HTML_TAGS = /* @__PURE__ */ new Set([
|
|
119
|
+
// root / sections
|
|
120
|
+
"html",
|
|
121
|
+
"body",
|
|
122
|
+
"header",
|
|
123
|
+
"footer",
|
|
124
|
+
"main",
|
|
125
|
+
"nav",
|
|
126
|
+
"section",
|
|
127
|
+
"article",
|
|
128
|
+
"aside",
|
|
129
|
+
"address",
|
|
130
|
+
"hgroup",
|
|
131
|
+
// headings
|
|
132
|
+
"h1",
|
|
133
|
+
"h2",
|
|
134
|
+
"h3",
|
|
135
|
+
"h4",
|
|
136
|
+
"h5",
|
|
137
|
+
"h6",
|
|
138
|
+
// grouping
|
|
139
|
+
"div",
|
|
140
|
+
"p",
|
|
141
|
+
"span",
|
|
142
|
+
"pre",
|
|
143
|
+
"blockquote",
|
|
144
|
+
"figure",
|
|
145
|
+
"figcaption",
|
|
146
|
+
"hr",
|
|
147
|
+
"br",
|
|
148
|
+
"wbr",
|
|
149
|
+
// lists
|
|
150
|
+
"ul",
|
|
151
|
+
"ol",
|
|
152
|
+
"li",
|
|
153
|
+
"dl",
|
|
154
|
+
"dt",
|
|
155
|
+
"dd",
|
|
156
|
+
"menu",
|
|
157
|
+
// text-level / phrasing
|
|
158
|
+
"a",
|
|
159
|
+
"b",
|
|
160
|
+
"i",
|
|
161
|
+
"u",
|
|
162
|
+
"s",
|
|
163
|
+
"em",
|
|
164
|
+
"strong",
|
|
165
|
+
"small",
|
|
166
|
+
"mark",
|
|
167
|
+
"abbr",
|
|
168
|
+
"cite",
|
|
169
|
+
"q",
|
|
170
|
+
"code",
|
|
171
|
+
"kbd",
|
|
172
|
+
"samp",
|
|
173
|
+
"var",
|
|
174
|
+
"sub",
|
|
175
|
+
"sup",
|
|
176
|
+
"time",
|
|
177
|
+
"data",
|
|
178
|
+
"dfn",
|
|
179
|
+
"bdi",
|
|
180
|
+
"bdo",
|
|
181
|
+
"ruby",
|
|
182
|
+
"rt",
|
|
183
|
+
"rp",
|
|
184
|
+
"del",
|
|
185
|
+
"ins",
|
|
186
|
+
// media / embedded (no special namespace handling needed)
|
|
187
|
+
"img",
|
|
188
|
+
"picture",
|
|
189
|
+
"source",
|
|
190
|
+
"figure",
|
|
191
|
+
"audio",
|
|
192
|
+
"video",
|
|
193
|
+
"track",
|
|
194
|
+
// tables
|
|
195
|
+
"table",
|
|
196
|
+
"caption",
|
|
197
|
+
"colgroup",
|
|
198
|
+
"col",
|
|
199
|
+
"thead",
|
|
200
|
+
"tbody",
|
|
201
|
+
"tfoot",
|
|
202
|
+
"tr",
|
|
203
|
+
"th",
|
|
204
|
+
"td",
|
|
205
|
+
// forms (display only — these still render fine from innerHTML)
|
|
206
|
+
"label",
|
|
207
|
+
"fieldset",
|
|
208
|
+
"legend",
|
|
209
|
+
"datalist",
|
|
210
|
+
"option",
|
|
211
|
+
"optgroup",
|
|
212
|
+
"output",
|
|
213
|
+
"progress",
|
|
214
|
+
"meter",
|
|
215
|
+
// interactive
|
|
216
|
+
"details",
|
|
217
|
+
"summary",
|
|
218
|
+
"dialog"
|
|
219
|
+
]);
|
|
220
|
+
function isStaticMarkup(inner) {
|
|
221
|
+
if (!inner) return false;
|
|
222
|
+
if (inner.indexOf("{{") !== -1) return false;
|
|
223
|
+
const n = inner.length;
|
|
224
|
+
let i = 0;
|
|
225
|
+
while (i < n) {
|
|
226
|
+
const lt = inner.indexOf("<", i);
|
|
227
|
+
if (lt === -1) break;
|
|
228
|
+
if (inner.startsWith("<!--", lt)) {
|
|
229
|
+
const end = inner.indexOf("-->", lt + 4);
|
|
230
|
+
if (end === -1) return false;
|
|
231
|
+
i = end + 3;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (inner[lt + 1] === "/" || inner[lt + 1] === "!" || inner[lt + 1] === "?") {
|
|
235
|
+
const gt = inner.indexOf(">", lt);
|
|
236
|
+
if (gt === -1) return false;
|
|
237
|
+
i = gt + 1;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const nameMatch = /^<([a-zA-Z][a-zA-Z0-9-]*)/.exec(inner.slice(lt));
|
|
241
|
+
if (!nameMatch) {
|
|
242
|
+
i = lt + 1;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const tag = nameMatch[1].toLowerCase();
|
|
246
|
+
if (tag.indexOf("-") !== -1 || !STANDARD_HTML_TAGS.has(tag)) return false;
|
|
247
|
+
let j = lt + nameMatch[0].length;
|
|
248
|
+
let inSingle = false;
|
|
249
|
+
let inDouble = false;
|
|
250
|
+
let atNameBoundary = true;
|
|
251
|
+
let tagEnd = -1;
|
|
252
|
+
while (j < n) {
|
|
253
|
+
const ch = inner[j];
|
|
254
|
+
if (inDouble) {
|
|
255
|
+
if (ch === '"') inDouble = false;
|
|
256
|
+
} else if (inSingle) {
|
|
257
|
+
if (ch === "'") inSingle = false;
|
|
258
|
+
} else if (ch === '"') {
|
|
259
|
+
inDouble = true;
|
|
260
|
+
atNameBoundary = false;
|
|
261
|
+
} else if (ch === "'") {
|
|
262
|
+
inSingle = true;
|
|
263
|
+
atNameBoundary = false;
|
|
264
|
+
} else if (ch === ">") {
|
|
265
|
+
tagEnd = j;
|
|
266
|
+
break;
|
|
267
|
+
} else if (ch === " " || ch === " " || ch === "\n" || ch === "\r" || ch === "/") {
|
|
268
|
+
atNameBoundary = true;
|
|
269
|
+
} else {
|
|
270
|
+
if (atNameBoundary && (ch === "$" || ch === ":" || ch === "@")) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
atNameBoundary = false;
|
|
274
|
+
}
|
|
275
|
+
j++;
|
|
276
|
+
}
|
|
277
|
+
if (tagEnd === -1) return false;
|
|
278
|
+
i = tagEnd + 1;
|
|
279
|
+
}
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
118
282
|
|
|
119
283
|
exports.BOOLEAN_ATTRIBUTES = BOOLEAN_ATTRIBUTES;
|
|
120
284
|
exports.IDL_FORM_PROPERTIES = IDL_FORM_PROPERTIES;
|
|
121
285
|
exports.LISTENER_OPTION_MODIFIERS = LISTENER_OPTION_MODIFIERS;
|
|
286
|
+
exports.STANDARD_HTML_TAGS = STANDARD_HTML_TAGS;
|
|
122
287
|
exports.SVG_ATTRIBUTE_NS = SVG_ATTRIBUTE_NS;
|
|
123
288
|
exports.SVG_NAMESPACE = SVG_NAMESPACE;
|
|
124
289
|
exports.VOID_ELEMENTS = VOID_ELEMENTS;
|
|
125
290
|
exports.isBooleanAttribute = isBooleanAttribute;
|
|
126
291
|
exports.isIDLFormProperty = isIDLFormProperty;
|
|
292
|
+
exports.isStaticMarkup = isStaticMarkup;
|
|
127
293
|
exports.isVoidElement = isVoidElement;
|
|
128
294
|
exports.normalizeClassValue = normalizeClassValue;
|
|
129
295
|
exports.normalizeStyleValue = normalizeStyleValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":"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","file":"AreHTML.constants.js","sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// ── SVG ──────────────────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** XML namespace URI for SVG elements. */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * Maps namespace prefixes used in SVG/XML attributes to their canonical URIs.\n * Used by the interpreter when calling setAttributeNS / removeAttributeNS.\n */\nexport const SVG_ATTRIBUTE_NS: Record<string, string> = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ── HTML void elements ────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\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
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":"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","file":"AreHTML.constants.js","sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// ── SVG ──────────────────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** XML namespace URI for SVG elements. */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * Maps namespace prefixes used in SVG/XML attributes to their canonical URIs.\n * Used by the interpreter when calling setAttributeNS / removeAttributeNS.\n */\nexport const SVG_ATTRIBUTE_NS: Record<string, string> = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ── HTML void elements ────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\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// ─────────────────────────────────────────────────────────────────────────────\n// ── Static-island detection ──────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Standard HTML element names that are safe to materialise wholesale via\n * `innerHTML` / a cached `<template>` clone.\n *\n * The set is intentionally an allow-list of plain HTML flow/phrasing/table/list\n * /form-display tags. Anything NOT in this set — custom elements, registered\n * ARE components (resolved by PascalCase tag), and SVG/MathML elements — is\n * excluded so those subtrees keep flowing through the normal per-node pipeline\n * (SVG needs createElementNS; components need their own lifecycle).\n */\nexport const STANDARD_HTML_TAGS = new Set<string>([\n // root / sections\n 'html', 'body', 'header', 'footer', 'main', 'nav', 'section', 'article',\n 'aside', 'address', 'hgroup',\n // headings\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n // grouping\n 'div', 'p', 'span', 'pre', 'blockquote', 'figure', 'figcaption',\n 'hr', 'br', 'wbr',\n // lists\n 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'menu',\n // text-level / phrasing\n 'a', 'b', 'i', 'u', 's', 'em', 'strong', 'small', 'mark', 'abbr', 'cite',\n 'q', 'code', 'kbd', 'samp', 'var', 'sub', 'sup', 'time', 'data', 'dfn',\n 'bdi', 'bdo', 'ruby', 'rt', 'rp', 'del', 'ins',\n // media / embedded (no special namespace handling needed)\n 'img', 'picture', 'source', 'figure', 'audio', 'video', 'track',\n // tables\n 'table', 'caption', 'colgroup', 'col', 'thead', 'tbody', 'tfoot',\n 'tr', 'th', 'td',\n // forms (display only — these still render fine from innerHTML)\n 'label', 'fieldset', 'legend', 'datalist', 'option', 'optgroup', 'output',\n 'progress', 'meter',\n // interactive\n 'details', 'summary', 'dialog',\n]);\n\n/**\n * Detects whether an inner-markup string is a fully *static island* — i.e. it\n * contains no ARE-reactive constructs and therefore can be rendered in one shot\n * (browser-parsed `innerHTML` / cached `<template>` clone) instead of being\n * exploded into one AreNode per element/text/interpolation.\n *\n * A subtree is static iff it contains:\n * 1. no `{{ }}` interpolations, and\n * 2. no dynamic attributes (`$`-directive / `:`-binding / `@`-event), and\n * 3. only standard HTML tags (no custom elements, ARE components or SVG).\n *\n * The scanner is quote-aware so a `:` / `@` / `$` inside an attribute *value*\n * (e.g. `href=\"http://…\"`, `style=\"color:red\"`) is never mistaken for a\n * dynamic-attribute prefix. The detector is deliberately conservative: any\n * ambiguity resolves to `false` (skip the optimisation, keep the safe path).\n *\n * NOTE: pure-text content (no tags at all) is also considered static — this is\n * what lets ` `, `&`, ` ` and friends decode correctly, since the\n * browser HTML parser handles entities that hand-built text nodes do not.\n */\nexport function isStaticMarkup(inner: string): boolean {\n if (!inner) return false;\n // 1. interpolations make the subtree dynamic\n if (inner.indexOf('{{') !== -1) return false;\n\n const n = inner.length;\n let i = 0;\n\n while (i < n) {\n const lt = inner.indexOf('<', i);\n if (lt === -1) break; // remaining content is plain text — safe\n\n // HTML comment — inert, skip over it\n if (inner.startsWith('<!--', lt)) {\n const end = inner.indexOf('-->', lt + 4);\n if (end === -1) return false; // malformed\n i = end + 3;\n continue;\n }\n\n // closing tag, doctype or processing instruction — skip to its '>'\n if (inner[lt + 1] === '/' || inner[lt + 1] === '!' || inner[lt + 1] === '?') {\n const gt = inner.indexOf('>', lt);\n if (gt === -1) return false;\n i = gt + 1;\n continue;\n }\n\n // opening tag — extract the tag name\n const nameMatch = /^<([a-zA-Z][a-zA-Z0-9-]*)/.exec(inner.slice(lt));\n if (!nameMatch) { i = lt + 1; continue; }\n\n const tag = nameMatch[1].toLowerCase();\n // custom element / ARE component / non-standard (incl. SVG) → not static\n if (tag.indexOf('-') !== -1 || !STANDARD_HTML_TAGS.has(tag)) return false;\n\n // walk the opening tag (quote-aware) to find its closing '>' and inspect\n // attribute-name boundaries for dynamic prefixes\n let j = lt + nameMatch[0].length;\n let inSingle = false;\n let inDouble = false;\n let atNameBoundary = true; // true right after whitespace / '/' inside a tag\n let tagEnd = -1;\n\n while (j < n) {\n const ch = inner[j];\n\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n } else if (inSingle) {\n if (ch === \"'\") inSingle = false;\n } else if (ch === '\"') {\n inDouble = true;\n atNameBoundary = false;\n } else if (ch === \"'\") {\n inSingle = true;\n atNameBoundary = false;\n } else if (ch === '>') {\n tagEnd = j;\n break;\n } else if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' || ch === '/') {\n atNameBoundary = true;\n } else {\n // a dynamic-attribute prefix only counts when it STARTS an\n // attribute name (i.e. sits at a name boundary, outside quotes)\n if (atNameBoundary && (ch === '$' || ch === ':' || ch === '@')) {\n return false;\n }\n atNameBoundary = false;\n }\n j++;\n }\n\n if (tagEnd === -1) return false; // unterminated tag — bail to safe path\n i = tagEnd + 1;\n }\n\n return true;\n}\n\n\n"]}
|
|
@@ -115,7 +115,171 @@ function toDOMString(value) {
|
|
|
115
115
|
return "";
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
+
const STANDARD_HTML_TAGS = /* @__PURE__ */ new Set([
|
|
119
|
+
// root / sections
|
|
120
|
+
"html",
|
|
121
|
+
"body",
|
|
122
|
+
"header",
|
|
123
|
+
"footer",
|
|
124
|
+
"main",
|
|
125
|
+
"nav",
|
|
126
|
+
"section",
|
|
127
|
+
"article",
|
|
128
|
+
"aside",
|
|
129
|
+
"address",
|
|
130
|
+
"hgroup",
|
|
131
|
+
// headings
|
|
132
|
+
"h1",
|
|
133
|
+
"h2",
|
|
134
|
+
"h3",
|
|
135
|
+
"h4",
|
|
136
|
+
"h5",
|
|
137
|
+
"h6",
|
|
138
|
+
// grouping
|
|
139
|
+
"div",
|
|
140
|
+
"p",
|
|
141
|
+
"span",
|
|
142
|
+
"pre",
|
|
143
|
+
"blockquote",
|
|
144
|
+
"figure",
|
|
145
|
+
"figcaption",
|
|
146
|
+
"hr",
|
|
147
|
+
"br",
|
|
148
|
+
"wbr",
|
|
149
|
+
// lists
|
|
150
|
+
"ul",
|
|
151
|
+
"ol",
|
|
152
|
+
"li",
|
|
153
|
+
"dl",
|
|
154
|
+
"dt",
|
|
155
|
+
"dd",
|
|
156
|
+
"menu",
|
|
157
|
+
// text-level / phrasing
|
|
158
|
+
"a",
|
|
159
|
+
"b",
|
|
160
|
+
"i",
|
|
161
|
+
"u",
|
|
162
|
+
"s",
|
|
163
|
+
"em",
|
|
164
|
+
"strong",
|
|
165
|
+
"small",
|
|
166
|
+
"mark",
|
|
167
|
+
"abbr",
|
|
168
|
+
"cite",
|
|
169
|
+
"q",
|
|
170
|
+
"code",
|
|
171
|
+
"kbd",
|
|
172
|
+
"samp",
|
|
173
|
+
"var",
|
|
174
|
+
"sub",
|
|
175
|
+
"sup",
|
|
176
|
+
"time",
|
|
177
|
+
"data",
|
|
178
|
+
"dfn",
|
|
179
|
+
"bdi",
|
|
180
|
+
"bdo",
|
|
181
|
+
"ruby",
|
|
182
|
+
"rt",
|
|
183
|
+
"rp",
|
|
184
|
+
"del",
|
|
185
|
+
"ins",
|
|
186
|
+
// media / embedded (no special namespace handling needed)
|
|
187
|
+
"img",
|
|
188
|
+
"picture",
|
|
189
|
+
"source",
|
|
190
|
+
"figure",
|
|
191
|
+
"audio",
|
|
192
|
+
"video",
|
|
193
|
+
"track",
|
|
194
|
+
// tables
|
|
195
|
+
"table",
|
|
196
|
+
"caption",
|
|
197
|
+
"colgroup",
|
|
198
|
+
"col",
|
|
199
|
+
"thead",
|
|
200
|
+
"tbody",
|
|
201
|
+
"tfoot",
|
|
202
|
+
"tr",
|
|
203
|
+
"th",
|
|
204
|
+
"td",
|
|
205
|
+
// forms (display only — these still render fine from innerHTML)
|
|
206
|
+
"label",
|
|
207
|
+
"fieldset",
|
|
208
|
+
"legend",
|
|
209
|
+
"datalist",
|
|
210
|
+
"option",
|
|
211
|
+
"optgroup",
|
|
212
|
+
"output",
|
|
213
|
+
"progress",
|
|
214
|
+
"meter",
|
|
215
|
+
// interactive
|
|
216
|
+
"details",
|
|
217
|
+
"summary",
|
|
218
|
+
"dialog"
|
|
219
|
+
]);
|
|
220
|
+
function isStaticMarkup(inner) {
|
|
221
|
+
if (!inner) return false;
|
|
222
|
+
if (inner.indexOf("{{") !== -1) return false;
|
|
223
|
+
const n = inner.length;
|
|
224
|
+
let i = 0;
|
|
225
|
+
while (i < n) {
|
|
226
|
+
const lt = inner.indexOf("<", i);
|
|
227
|
+
if (lt === -1) break;
|
|
228
|
+
if (inner.startsWith("<!--", lt)) {
|
|
229
|
+
const end = inner.indexOf("-->", lt + 4);
|
|
230
|
+
if (end === -1) return false;
|
|
231
|
+
i = end + 3;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (inner[lt + 1] === "/" || inner[lt + 1] === "!" || inner[lt + 1] === "?") {
|
|
235
|
+
const gt = inner.indexOf(">", lt);
|
|
236
|
+
if (gt === -1) return false;
|
|
237
|
+
i = gt + 1;
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const nameMatch = /^<([a-zA-Z][a-zA-Z0-9-]*)/.exec(inner.slice(lt));
|
|
241
|
+
if (!nameMatch) {
|
|
242
|
+
i = lt + 1;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const tag = nameMatch[1].toLowerCase();
|
|
246
|
+
if (tag.indexOf("-") !== -1 || !STANDARD_HTML_TAGS.has(tag)) return false;
|
|
247
|
+
let j = lt + nameMatch[0].length;
|
|
248
|
+
let inSingle = false;
|
|
249
|
+
let inDouble = false;
|
|
250
|
+
let atNameBoundary = true;
|
|
251
|
+
let tagEnd = -1;
|
|
252
|
+
while (j < n) {
|
|
253
|
+
const ch = inner[j];
|
|
254
|
+
if (inDouble) {
|
|
255
|
+
if (ch === '"') inDouble = false;
|
|
256
|
+
} else if (inSingle) {
|
|
257
|
+
if (ch === "'") inSingle = false;
|
|
258
|
+
} else if (ch === '"') {
|
|
259
|
+
inDouble = true;
|
|
260
|
+
atNameBoundary = false;
|
|
261
|
+
} else if (ch === "'") {
|
|
262
|
+
inSingle = true;
|
|
263
|
+
atNameBoundary = false;
|
|
264
|
+
} else if (ch === ">") {
|
|
265
|
+
tagEnd = j;
|
|
266
|
+
break;
|
|
267
|
+
} else if (ch === " " || ch === " " || ch === "\n" || ch === "\r" || ch === "/") {
|
|
268
|
+
atNameBoundary = true;
|
|
269
|
+
} else {
|
|
270
|
+
if (atNameBoundary && (ch === "$" || ch === ":" || ch === "@")) {
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
atNameBoundary = false;
|
|
274
|
+
}
|
|
275
|
+
j++;
|
|
276
|
+
}
|
|
277
|
+
if (tagEnd === -1) return false;
|
|
278
|
+
i = tagEnd + 1;
|
|
279
|
+
}
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
118
282
|
|
|
119
|
-
export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, SVG_ATTRIBUTE_NS, SVG_NAMESPACE, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
|
|
283
|
+
export { BOOLEAN_ATTRIBUTES, IDL_FORM_PROPERTIES, LISTENER_OPTION_MODIFIERS, STANDARD_HTML_TAGS, SVG_ATTRIBUTE_NS, SVG_NAMESPACE, VOID_ELEMENTS, isBooleanAttribute, isIDLFormProperty, isStaticMarkup, isVoidElement, normalizeClassValue, normalizeStyleValue, parseEventName, toDOMString };
|
|
120
284
|
//# sourceMappingURL=AreHTML.constants.mjs.map
|
|
121
285
|
//# 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// ── SVG ──────────────────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** XML namespace URI for SVG elements. */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * Maps namespace prefixes used in SVG/XML attributes to their canonical URIs.\n * Used by the interpreter when calling setAttributeNS / removeAttributeNS.\n */\nexport const SVG_ATTRIBUTE_NS: Record<string, string> = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ── HTML void elements ────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\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
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.constants.ts"],"names":[],"mappings":"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","file":"AreHTML.constants.mjs","sourcesContent":["// ─────────────────────────────────────────────────────────────────────────────\n// ── SVG ──────────────────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** XML namespace URI for SVG elements. */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * Maps namespace prefixes used in SVG/XML attributes to their canonical URIs.\n * Used by the interpreter when calling setAttributeNS / removeAttributeNS.\n */\nexport const SVG_ATTRIBUTE_NS: Record<string, string> = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace',\n xmlns: 'http://www.w3.org/2000/xmlns/',\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ── HTML void elements ────────────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\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// ─────────────────────────────────────────────────────────────────────────────\n// ── Static-island detection ──────────────────────────────────────────────────\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Standard HTML element names that are safe to materialise wholesale via\n * `innerHTML` / a cached `<template>` clone.\n *\n * The set is intentionally an allow-list of plain HTML flow/phrasing/table/list\n * /form-display tags. Anything NOT in this set — custom elements, registered\n * ARE components (resolved by PascalCase tag), and SVG/MathML elements — is\n * excluded so those subtrees keep flowing through the normal per-node pipeline\n * (SVG needs createElementNS; components need their own lifecycle).\n */\nexport const STANDARD_HTML_TAGS = new Set<string>([\n // root / sections\n 'html', 'body', 'header', 'footer', 'main', 'nav', 'section', 'article',\n 'aside', 'address', 'hgroup',\n // headings\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n // grouping\n 'div', 'p', 'span', 'pre', 'blockquote', 'figure', 'figcaption',\n 'hr', 'br', 'wbr',\n // lists\n 'ul', 'ol', 'li', 'dl', 'dt', 'dd', 'menu',\n // text-level / phrasing\n 'a', 'b', 'i', 'u', 's', 'em', 'strong', 'small', 'mark', 'abbr', 'cite',\n 'q', 'code', 'kbd', 'samp', 'var', 'sub', 'sup', 'time', 'data', 'dfn',\n 'bdi', 'bdo', 'ruby', 'rt', 'rp', 'del', 'ins',\n // media / embedded (no special namespace handling needed)\n 'img', 'picture', 'source', 'figure', 'audio', 'video', 'track',\n // tables\n 'table', 'caption', 'colgroup', 'col', 'thead', 'tbody', 'tfoot',\n 'tr', 'th', 'td',\n // forms (display only — these still render fine from innerHTML)\n 'label', 'fieldset', 'legend', 'datalist', 'option', 'optgroup', 'output',\n 'progress', 'meter',\n // interactive\n 'details', 'summary', 'dialog',\n]);\n\n/**\n * Detects whether an inner-markup string is a fully *static island* — i.e. it\n * contains no ARE-reactive constructs and therefore can be rendered in one shot\n * (browser-parsed `innerHTML` / cached `<template>` clone) instead of being\n * exploded into one AreNode per element/text/interpolation.\n *\n * A subtree is static iff it contains:\n * 1. no `{{ }}` interpolations, and\n * 2. no dynamic attributes (`$`-directive / `:`-binding / `@`-event), and\n * 3. only standard HTML tags (no custom elements, ARE components or SVG).\n *\n * The scanner is quote-aware so a `:` / `@` / `$` inside an attribute *value*\n * (e.g. `href=\"http://…\"`, `style=\"color:red\"`) is never mistaken for a\n * dynamic-attribute prefix. The detector is deliberately conservative: any\n * ambiguity resolves to `false` (skip the optimisation, keep the safe path).\n *\n * NOTE: pure-text content (no tags at all) is also considered static — this is\n * what lets ` `, `&`, ` ` and friends decode correctly, since the\n * browser HTML parser handles entities that hand-built text nodes do not.\n */\nexport function isStaticMarkup(inner: string): boolean {\n if (!inner) return false;\n // 1. interpolations make the subtree dynamic\n if (inner.indexOf('{{') !== -1) return false;\n\n const n = inner.length;\n let i = 0;\n\n while (i < n) {\n const lt = inner.indexOf('<', i);\n if (lt === -1) break; // remaining content is plain text — safe\n\n // HTML comment — inert, skip over it\n if (inner.startsWith('<!--', lt)) {\n const end = inner.indexOf('-->', lt + 4);\n if (end === -1) return false; // malformed\n i = end + 3;\n continue;\n }\n\n // closing tag, doctype or processing instruction — skip to its '>'\n if (inner[lt + 1] === '/' || inner[lt + 1] === '!' || inner[lt + 1] === '?') {\n const gt = inner.indexOf('>', lt);\n if (gt === -1) return false;\n i = gt + 1;\n continue;\n }\n\n // opening tag — extract the tag name\n const nameMatch = /^<([a-zA-Z][a-zA-Z0-9-]*)/.exec(inner.slice(lt));\n if (!nameMatch) { i = lt + 1; continue; }\n\n const tag = nameMatch[1].toLowerCase();\n // custom element / ARE component / non-standard (incl. SVG) → not static\n if (tag.indexOf('-') !== -1 || !STANDARD_HTML_TAGS.has(tag)) return false;\n\n // walk the opening tag (quote-aware) to find its closing '>' and inspect\n // attribute-name boundaries for dynamic prefixes\n let j = lt + nameMatch[0].length;\n let inSingle = false;\n let inDouble = false;\n let atNameBoundary = true; // true right after whitespace / '/' inside a tag\n let tagEnd = -1;\n\n while (j < n) {\n const ch = inner[j];\n\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n } else if (inSingle) {\n if (ch === \"'\") inSingle = false;\n } else if (ch === '\"') {\n inDouble = true;\n atNameBoundary = false;\n } else if (ch === \"'\") {\n inSingle = true;\n atNameBoundary = false;\n } else if (ch === '>') {\n tagEnd = j;\n break;\n } else if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r' || ch === '/') {\n atNameBoundary = true;\n } else {\n // a dynamic-attribute prefix only counts when it STARTS an\n // attribute name (i.e. sits at a name boundary, outside quotes)\n if (atNameBoundary && (ch === '$' || ch === ':' || ch === '@')) {\n return false;\n }\n atNameBoundary = false;\n }\n j++;\n }\n\n if (tagEnd === -1) return false; // unterminated tag — bail to safe path\n i = tagEnd + 1;\n }\n\n return true;\n}\n\n\n"]}
|
|
@@ -44,8 +44,74 @@ declare class AreHTMLEngineContext extends AreContext {
|
|
|
44
44
|
* The root container for the HTML engine, which can be either a Document or a ShadowRoot. This is where the engine will mount the generated DOM elements. The context uses this container to manage the relationship between AreNodes, instructions, and their corresponding DOM elements, allowing for efficient updates and cleanups as the application state changes.
|
|
45
45
|
*/
|
|
46
46
|
protected _container: Document;
|
|
47
|
+
/**
|
|
48
|
+
* Parsed-fragment cache for static islands (see AddStaticHTMLInstruction).
|
|
49
|
+
*
|
|
50
|
+
* Keyed by `hostTag\u0000markup`, each entry holds a `DocumentFragment` whose
|
|
51
|
+
* children were parsed by the browser exactly once — in the *correct element
|
|
52
|
+
* context* (the host tag), so table fragments (`<tr>`, `<td>`, …) and other
|
|
53
|
+
* context-sensitive content parse correctly. Repeated static islands with
|
|
54
|
+
* identical markup (e.g. list rows, reused components) clone the pre-parsed
|
|
55
|
+
* fragment instead of re-parsing the HTML string on every mount — turning an
|
|
56
|
+
* O(parse) operation into an O(clone) one.
|
|
57
|
+
*/
|
|
58
|
+
protected _staticFragmentCache: Map<string, DocumentFragment>;
|
|
59
|
+
/**
|
|
60
|
+
* Live-DOM attachments deferred while a mount pass is batching.
|
|
61
|
+
*
|
|
62
|
+
* A freshly-mounted subtree is built inside a *detached* root element, so
|
|
63
|
+
* every descendant `appendChild`/`insertBefore` happens off-document and
|
|
64
|
+
* triggers zero layout/paint invalidation. The single mutation that actually
|
|
65
|
+
* connects the built subtree to the live document is deferred and collected
|
|
66
|
+
* here, then flushed once when the batch closes — collapsing O(nodes) reflows
|
|
67
|
+
* into O(1) per mount root.
|
|
68
|
+
*/
|
|
69
|
+
protected _pendingAttachments: Array<() => void>;
|
|
70
|
+
/**
|
|
71
|
+
* Depth of the currently open batching scopes. Re-entrant so that nested
|
|
72
|
+
* `beginBatch`/`endBatch` pairs flush exactly once, when the outermost scope
|
|
73
|
+
* closes.
|
|
74
|
+
*/
|
|
75
|
+
protected _batchDepth: number;
|
|
47
76
|
constructor(props: Partial<AreHTMLContextConstructor>);
|
|
48
77
|
get container(): Document;
|
|
78
|
+
/**
|
|
79
|
+
* `true` while a synchronous mount pass is batching live-DOM attachments.
|
|
80
|
+
* Interpreter handlers consult this to decide whether to attach an element
|
|
81
|
+
* immediately or hand the attachment to {@link deferAttach}.
|
|
82
|
+
*/
|
|
83
|
+
get isBatching(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Opens a batching scope. Re-entrant: only the outermost matching
|
|
86
|
+
* {@link endBatch} flushes the deferred attachments, so a single mount pass
|
|
87
|
+
* connects its built subtree to the live DOM exactly once.
|
|
88
|
+
*/
|
|
89
|
+
beginBatch(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Registers a live-DOM attachment to run when the current batch flushes. If
|
|
92
|
+
* no batch is active the attachment runs immediately, preserving the original
|
|
93
|
+
* synchronous behaviour for updates that mount outside a batch.
|
|
94
|
+
*
|
|
95
|
+
* @param attach the DOM mutation that connects a built subtree to the document
|
|
96
|
+
*/
|
|
97
|
+
deferAttach(attach: () => void): void;
|
|
98
|
+
/**
|
|
99
|
+
* Closes a batching scope. When the outermost scope closes, every deferred
|
|
100
|
+
* attachment runs in registration (document) order, connecting the built
|
|
101
|
+
* subtrees to the live DOM in a single pass.
|
|
102
|
+
*/
|
|
103
|
+
endBatch(): void;
|
|
104
|
+
/**
|
|
105
|
+
* Returns a `DocumentFragment` containing the parsed form of `html`, parsed
|
|
106
|
+
* once in the context of `hostTag` (so context-sensitive content such as
|
|
107
|
+
* table rows/cells parses correctly) and cached thereafter. Callers should
|
|
108
|
+
* `cloneNode(true)` the returned fragment rather than mutating it, so the
|
|
109
|
+
* cache stays reusable.
|
|
110
|
+
*
|
|
111
|
+
* @param hostTag the tag name of the element the markup will be injected into
|
|
112
|
+
* @param html verbatim static-island inner markup
|
|
113
|
+
*/
|
|
114
|
+
getStaticFragment(hostTag: string, html: string): DocumentFragment;
|
|
49
115
|
/**
|
|
50
116
|
* Retrieves the DOM element associated with a given AreNode. This method looks up the node's ASEID in the nodeToHostElements map to find the corresponding DOM element. If the node is not found, it returns undefined. This allows the engine to efficiently access and manipulate the DOM elements that correspond to specific nodes in the AreNode tree, enabling dynamic updates and interactions based on the application state.
|
|
51
117
|
*
|