diff --git a/public/index.js b/public/index.js index 6f67e26..bbf3033 100755 --- a/public/index.js +++ b/public/index.js @@ -279,10 +279,10 @@ var _for = (el, exp, ctx, component, componentProps, allProps) => { return; } const nextNode = el.nextSibling; - const parent = el.parentElement; + const parent2 = el.parentElement; const anchor = new Text(""); - parent.insertBefore(anchor, el); - parent.removeChild(el); + parent2.insertBefore(anchor, el); + parent2.removeChild(el); const sourceExp = inMatch[2].trim(); let valueExp = inMatch[1].trim().replace(stripParensRE, "").trim(); let destructureBindings; @@ -352,7 +352,7 @@ var _for = (el, exp, ctx, component, componentProps, allProps) => { const mountBlock = (ctx2, ref2) => { const block = new Block({ element: el, parentContext: ctx2, replacementType: "replace", component, componentProps, allProps }); block.key = ctx2.key; - block.insert(parent, ref2); + block.insert(parent2, ref2); return block; }; ctx.effect(() => { @@ -385,7 +385,7 @@ var _for = (el, exp, ctx, component, componentProps, allProps) => { if (blocks[oldIndex + 1] !== nextBlock || // If the next has moved, it must move too prevMovedBlock === nextBlock) { prevMovedBlock = block; - block.insert(parent, nextBlock ? nextBlock.element : anchor); + block.insert(parent2, nextBlock ? nextBlock.element : anchor); } } } @@ -399,28 +399,28 @@ var _for = (el, exp, ctx, component, componentProps, allProps) => { // src/directives/if.ts function _if(el, exp, ctx, component, componentProps, allProps) { - const parent = el.parentElement; + const parent2 = el.parentElement; const anchor = new Comment(":if"); - parent.insertBefore(anchor, el); + parent2.insertBefore(anchor, el); const branches = [{ exp, el }]; let elseEl; let elseExp; while (elseEl = el.nextElementSibling) { elseExp = null; if (checkAndRemoveAttribute(elseEl, ":else") === "" || (elseExp = checkAndRemoveAttribute(elseEl, ":else-if"))) { - parent.removeChild(elseEl); + parent2.removeChild(elseEl); branches.push({ exp: elseExp, el: elseEl }); } else { break; } } const nextNode = el.nextSibling; - parent.removeChild(el); + parent2.removeChild(el); let block; let activeBranchIndex = -1; const removeActiveBlock = () => { if (block) { - parent.insertBefore(anchor, block.element); + parent2.insertBefore(anchor, block.element); block.remove(); block = void 0; } @@ -432,8 +432,8 @@ function _if(el, exp, ctx, component, componentProps, allProps) { if (i !== activeBranchIndex) { removeActiveBlock(); block = new Block({ element: el2, parentContext: ctx, replacementType: "replace", component, componentProps, allProps }); - block.insert(parent, anchor); - parent.removeChild(anchor); + block.insert(parent2, anchor); + parent2.removeChild(anchor); activeBranchIndex = i; } return; @@ -1015,14 +1015,14 @@ var Block = class { this.componentProps[name] = value; } } - insert(parent, anchor = null) { + insert(parent2, anchor = null) { if (this.isFragment) { if (this.start) { let node = this.start; let next; while (node) { next = node.nextSibling; - parent.insertBefore(node, anchor); + parent2.insertBefore(node, anchor); if (node === this.end) { break; } @@ -1031,12 +1031,12 @@ var Block = class { } else { this.start = new Text(""); this.end = new Text(""); - parent.insertBefore(this.end, anchor); - parent.insertBefore(this.start, this.end); - parent.insertBefore(this.element, this.end); + parent2.insertBefore(this.end, anchor); + parent2.insertBefore(this.start, this.end); + parent2.insertBefore(this.element, this.end); } } else { - parent.insertBefore(this.element, anchor); + parent2.insertBefore(this.element, anchor); } } remove() { @@ -1047,12 +1047,12 @@ var Block = class { } } if (this.start) { - const parent = this.start.parentNode; + const parent2 = this.start.parentNode; let node = this.start; let next; while (node) { next = node.nextSibling; - parent.removeChild(node); + parent2.removeChild(node); if (node === this.end) { break; } @@ -1080,9 +1080,39 @@ function walk(node, context) { } if (isElement(node)) { let exp; - if (isComponent(node, context)) { - const component = context.app.getComponent(node.tagName.toLowerCase()); - const allProps = Array.from(node.attributes).filter((attr) => isSpreadProp(attr.name) || isMirrorProp(attr.name) || isRegularProp(attr.name) && componentHasPropByName(extractPropName(attr.name), component)).map((attr) => ({ + const handleDirectives = (node2, context2, component, componentProps, allProps) => { + if (exp = checkAndRemoveAttribute(node2, ":teleport")) { + return _teleport(node2, exp, context2); + } + if (exp = checkAndRemoveAttribute(node2, ":if")) { + return _if(node2, exp, context2, component, componentProps, allProps); + } + if (exp = checkAndRemoveAttribute(node2, ":for")) { + return _for(node2, exp, context2, component, componentProps, allProps); + } + if (exp = checkAndRemoveAttribute(node2, ":show")) { + new ShowDirective({ element: node2, context: context2, expression: exp }); + } + if (exp = checkAndRemoveAttribute(node2, ":ref")) { + context2.scope[exp].value = node2; + } + if (exp = checkAndRemoveAttribute(node2, ":value")) { + new ValueDirective({ element: node2, context: context2, expression: exp }); + } + if (exp = checkAndRemoveAttribute(node2, ":html")) { + context2.effect(() => { + const result = evalGet(context2.scope, exp); + if (result instanceof Element) { + node2.replaceChildren(); + node2.append(result); + } else { + node2.innerHTML = result; + } + }); + } + }; + const processAttributes = (node2, component) => { + return Array.from(node2.attributes).filter((attr) => isSpreadProp(attr.name) || isMirrorProp(attr.name) || isRegularProp(attr.name) && componentHasPropByName(extractPropName(attr.name), component)).map((attr) => ({ isMirror: isMirrorProp(attr.name), isSpread: isSpreadProp(attr.name), isBind: attr.name.includes("bind"), @@ -1091,6 +1121,10 @@ function walk(node, context) { exp: attr.value, value: isMirrorProp(attr.name) ? evalGet(context.scope, extractPropName(attr.name)) : attr.value ? evalGet(context.scope, attr.value) : void 0 })); + }; + if (isComponent(node, context)) { + const component = context.app.getComponent(node.tagName.toLowerCase()); + const allProps = processAttributes(node, component); const componentProps = allProps.reduce((acc, { isSpread, isMirror, extractedName, value }) => { if (isSpread) { const spread = evalGet(context.scope, extractedName); @@ -1102,20 +1136,10 @@ function walk(node, context) { } return acc; }, {}); - if (exp = checkAndRemoveAttribute(node, ":teleport")) { - return _teleport(node, exp, context); - } - if (exp = checkAndRemoveAttribute(node, ":if")) { - return _if(node, exp, context, component, componentProps, allProps); - } - if (exp = checkAndRemoveAttribute(node, ":for")) { - return _for(node, exp, context, component, componentProps, allProps); - } - if (exp = checkAndRemoveAttribute(node, ":show")) { - new ShowDirective({ element: node, context, expression: exp }); - } + const next2 = handleDirectives(node, context, component, componentProps, allProps); + if (next2) return next2; const templates = findTemplateNodes(node); - const block = new Block({ + return new Block({ element: node, parentContext: context, component, @@ -1124,27 +1148,10 @@ function walk(node, context) { templates, componentProps, allProps - }); - return block.element; - } - if (exp = checkAndRemoveAttribute(node, ":teleport")) { - return _teleport(node, exp, context); - } - if (exp = checkAndRemoveAttribute(node, ":if")) { - return _if(node, exp, context); - } - if (exp = checkAndRemoveAttribute(node, ":for")) { - return _for(node, exp, context); - } - if (exp = checkAndRemoveAttribute(node, ":ref")) { - context.scope[exp].value = node; - } - if (exp = checkAndRemoveAttribute(node, ":value")) { - new ValueDirective({ element: node, context, expression: exp }); - } - if (exp = checkAndRemoveAttribute(node, ":show")) { - new ShowDirective({ element: node, context, expression: exp }); + }).element; } + const next = handleDirectives(node, context); + if (next) return next; Array.from(node.attributes).forEach((attr) => { if (isPropAttribute(attr.name)) { new AttributeDirective({ element: node, context, attr }); @@ -1157,9 +1164,9 @@ function walk(node, context) { } } function walkChildren(node, context) { - let child = node.firstChild; - while (child) { - child = walk(child, context) || child.nextSibling; + let child2 = node.firstChild; + while (child2) { + child2 = walk(child2, context) || child2.nextSibling; } } var evalFuncCache = {}; @@ -1203,28 +1210,84 @@ function flattenRefs(scope) { } return mapped; } -var counter = { +var child = { + template: html`
Animal: {{animal}} {{index}}
`, + props: { animal: { default: "cat" }, index: { default: 0 } }, + main({ animal, index }) { + return { animal, index }; + } +}; +var parent = { template: html`
-
true
-

Count: {{count}}{{count >= 2 ? '!!!' : ''}}

- - + mirror, no bind: + +
+ mirror, bind: + +
+ spread, no bind: + +
+ spread, bind: + +
+ regular prop: + +
+ regular prop, bind: + +
+
div has "id" set to animal.value
+
+
div has "id" set and bound to animal.value
+
+
div has "animal" set to animal.value
+
+
div has "animal" set and bound to animal.value
+
+
div has "animal" spread
+
+
div has "animal" spread and bound
+
+
+
+
+ if bool, mirror, no bind: + + if bool, mirror, bind: + +
+ for list, mirror, no bind: + +
+ for list, mirror, bind: + + if bool, for list, mirror, no bind: these have the value "DOG!" because by the time for :for directive is evaluated, animal.value is "DOG!", and no longer "dog". +
+ +
`, main() { - const count = ref(0); - const style = reactive({ color: "gray" }); - const increment = () => count.value++; - const decrement = () => count.value--; - setInterval(() => { - style.color = style.color === "gray" ? "white" : "gray"; + const bool = ref(false); + const animal = ref("dog"); + const spread = reactive({ animal: "panther" }); + const list = reactive([1, 2, 3]); + setTimeout(() => { + spread.animal = "PANTHER!"; + animal.value = "DOG!"; + bool.value = true; }, 500); - return { count, increment, decrement, style }; + setTimeout(() => { + animal.value = "DOG!!!!!"; + }, 1e3); + return { animal, spread, bool, list }; } }; var app = new App(); -app.mount(counter, "#app"); +app.register("child", child); +app.mount(parent, "#app"); export { App, Block, diff --git a/public/index.js.map b/public/index.js.map index 279347c..48754b4 100755 --- a/public/index.js.map +++ b/public/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/util.ts", "../src/directives/attribute.ts", "../src/directives/event.ts", "../src/directives/for.ts", "../src/directives/if.ts", "../src/directives/interpolation.ts", "../src/directives/show.ts", "../src/directives/teleport.ts", "../src/directives/value.ts", "../src/reactivity/effect.ts", "../src/reactivity/computed.ts", "../src/reactivity/ref.ts", "../src/reactivity/reactive.ts", "../src/index.ts"], - "sourcesContent": ["import { Component } from \".\";\n\nexport function stringToElement(template: string): Element {\n const parser = new DOMParser();\n const doc = parser.parseFromString(template, \"text/html\");\n return doc.body.firstChild as Element;\n}\n\nexport const isText = (node: Node): node is Text => {\n return node.nodeType === Node.TEXT_NODE;\n};\n\nexport const isTemplate = (node: Node): node is HTMLTemplateElement => {\n return node.nodeName === \"TEMPLATE\";\n};\n\nexport const isElement = (node: Node): node is Element => {\n return node.nodeType === Node.ELEMENT_NODE;\n};\n\nexport function isObject(value: any): value is object {\n return value !== null && typeof value === \"object\";\n}\n\nexport function isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\nexport function checkAndRemoveAttribute(el: Element, attrName: string): string | null {\n // Attempt to get the attribute value\n const attributeValue = el.getAttribute(attrName);\n\n // If attribute exists, remove it from the element\n if (attributeValue !== null) {\n el.removeAttribute(attrName);\n }\n\n // Return the value of the attribute or null if not present\n return attributeValue;\n}\n\nexport interface Slot {\n node: Element;\n name: string;\n}\n\nexport interface Template {\n targetSlotName: string;\n node: HTMLTemplateElement;\n}\n\nexport function findSlotNodes(element: Element): Slot[] {\n const slots: Slot[] = [];\n\n const findSlots = (node: Element) => {\n Array.from(node.childNodes).forEach((node) => {\n if (isElement(node)) {\n if (node.nodeName === \"SLOT\") {\n slots.push({ node, name: node.getAttribute(\"name\") || \"default\" });\n }\n\n if (node.hasChildNodes()) {\n findSlots(node);\n }\n }\n });\n };\n\n findSlots(element);\n\n return slots;\n}\n\nexport function findTemplateNodes(element: Element) {\n const templates: Template[] = [];\n\n const findTemplates = (element: Element) => {\n let defaultContentNodes: Node[] = [];\n\n Array.from(element.childNodes).forEach((node) => {\n if (isElement(node) || isText(node)) {\n if (isElement(node) && node.nodeName === \"TEMPLATE\" && isTemplate(node)) {\n templates.push({ targetSlotName: node.getAttribute(\"slot\") || \"\", node });\n } else {\n // Capture non-template top-level nodes and text nodes for default slot\n defaultContentNodes.push(node);\n }\n }\n });\n\n if (defaultContentNodes.length > 0) {\n // Create a template element with a default slot\n const defaultTemplate = document.createElement(\"template\");\n defaultTemplate.setAttribute(\"slot\", \"default\");\n\n defaultContentNodes.forEach((node) => {\n defaultTemplate.content.appendChild(node);\n });\n\n templates.push({ targetSlotName: \"default\", node: defaultTemplate });\n }\n };\n\n findTemplates(element);\n\n return templates;\n}\n\nexport const nextTick = async (f?: Function) => {\n await new Promise((r) =>\n setTimeout((_) =>\n requestAnimationFrame((_) => {\n f && f();\n r();\n }),\n ),\n );\n};\n\nexport function html(strings: TemplateStringsArray, ...values: any[]): string {\n // List of valid self-closing tags in HTML\n const selfClosingTags = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\"];\n\n // Join the strings and values into a single template\n let result = strings.reduce((acc, str, i) => acc + str + (values[i] || \"\"), \"\");\n\n // Match non-HTML valid self-closing tags\n result = result.replace(/<([a-zA-Z][^\\s/>]*)\\s*([^>]*?)\\/>/g, (match, tagName, attributes) => {\n // If the tag is a valid self-closing tag, return it as is\n if (selfClosingTags.includes(tagName.toLowerCase())) {\n return match;\n }\n\n // Return the tag as an open/close tag preserving attributes\n return `<${tagName} ${attributes}>`;\n });\n\n return result;\n}\n\nexport function toDisplayString(value: unknown) {\n return value == null ? \"\" : isObject(value) ? JSON.stringify(value, null, 2) : String(value);\n}\n\nexport function insertAfter(newNode: Node, existingNode: Node) {\n if (existingNode.nextSibling) {\n existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);\n } else {\n existingNode?.parentNode?.appendChild(newNode);\n }\n}\n\nexport function isPropAttribute(attrName: string) {\n if (attrName.startsWith(\".\")) {\n return true;\n }\n\n if (attrName.startsWith(\"{\") && attrName.endsWith(\"}\")) {\n return true;\n }\n\n return false;\n}\n\nexport function isSpreadProp(attr: string) {\n return attr.startsWith(\"...\");\n}\n\nexport function isMirrorProp(attr: string) {\n return attr.startsWith(\"{\") && attr.endsWith(\"}\");\n}\n\nexport function isRegularProp(attr: string) {\n return attr.startsWith(\".\");\n}\n\nexport function isEventAttribute(attrName: string) {\n return attrName.startsWith(\"@\");\n}\n\nexport function componentHasPropByName(name: string, component: Component) {\n return Object.keys(component?.props ?? {}).some((prop) => prop === name);\n}\n\nexport function extractAttributeName(attrName: string) {\n return attrName\n .replace(/^\\.\\.\\./, \"\")\n .replace(/^\\./, \"\")\n .replace(/^{/, \"\")\n .replace(/}$/, \"\")\n .replace(/:bind$/, \"\");\n}\n\nfunction dashToCamel(str: string) {\n return str.toLowerCase().replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n}\n\nexport function extractPropName(attrName: string) {\n return dashToCamel(extractAttributeName(attrName));\n}\n\nexport function classNames(_: any) {\n const classes = [];\n for (let i = 0; i < arguments.length; i++) {\n const arg = arguments[i];\n if (!arg) continue;\n const argType = typeof arg;\n if (argType === \"string\" || argType === \"number\") {\n classes.push(arg);\n } else if (Array.isArray(arg)) {\n if (arg.length) {\n const inner = classNames.apply(null, arg);\n if (inner) {\n classes.push(inner);\n }\n }\n } else if (argType === \"object\") {\n if (arg.toString === Object.prototype.toString) {\n for (let key in arg) {\n if (Object.hasOwnProperty.call(arg, key) && arg[key]) {\n classes.push(key);\n }\n }\n } else {\n classes.push(arg.toString());\n }\n }\n }\n return classes.join(\" \");\n}\n", "import { Context, evalGet } from \"..\";\nimport { classNames, extractAttributeName } from \"../util\";\n\ninterface AttributeDirectiveOptions {\n element: Element;\n context: Context;\n attr: Attr;\n}\n\ninterface Is {\n sameNameProperty: boolean;\n bound: boolean;\n spread: boolean;\n componentProp: boolean;\n}\n\nexport class AttributeDirective {\n element: Element;\n context: Context;\n expression: string;\n attr: Attr;\n extractedAttributeName: string;\n\n previousClasses: string[] = [];\n previousStyles: { [key: string]: string } = {};\n\n is: Is = {\n sameNameProperty: false,\n bound: false,\n spread: false,\n componentProp: false,\n };\n\n constructor({ element, context, attr }: AttributeDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = attr.value;\n this.attr = attr;\n this.extractedAttributeName = extractAttributeName(attr.name);\n\n this.is = {\n sameNameProperty: attr.name.startsWith(\"{\") && attr.name.endsWith(\"}\"),\n bound: attr.name.includes(\":bind\"),\n spread: attr.name.startsWith(\"...\"),\n componentProp: false,\n };\n\n if (this.is.sameNameProperty) {\n this.expression = this.extractedAttributeName;\n }\n\n if (this.is.spread) {\n this.expression = this.extractedAttributeName;\n }\n\n element.removeAttribute(attr.name);\n\n if (this.is.bound) {\n context.effect(this.update.bind(this));\n } else {\n this.update();\n }\n }\n\n update() {\n let value = evalGet(this.context.scope, this.expression);\n\n if (this.is.spread && typeof value === \"object\") {\n for (const [key, val] of Object.entries(value)) {\n this.element.setAttribute(key, String(val));\n }\n } else if ((typeof value === \"object\" || Array.isArray(value)) && this.extractedAttributeName === \"class\") {\n value = classNames(value);\n const next = value.split(\" \");\n\n // If we now have classes that are not already on the element, add them now.\n // Remove classes that are no longer on the element.\n const diff = next.filter((c: string) => !this.previousClasses.includes(c)).filter(Boolean);\n const rm = this.previousClasses.filter((c) => !next.includes(c));\n\n diff.forEach((c: string) => {\n this.previousClasses.push(c);\n this.element.classList.add(c);\n });\n\n rm.forEach((c) => {\n this.previousClasses = this.previousClasses.filter((addedClass) => addedClass !== c);\n this.element.classList.remove(c);\n });\n } else if (typeof value === \"object\" && this.extractedAttributeName === \"style\") {\n const next = Object.keys(value);\n const rm = Object.keys(this.previousStyles).filter((style) => !next.includes(style));\n\n next.forEach((style) => {\n this.previousStyles[style] = value[style];\n // @ts-ignore\n this.element.style[style] = value[style];\n });\n\n rm.forEach((style) => {\n this.previousStyles[style] = \"\";\n // @ts-ignore\n this.element.style[style] = \"\";\n });\n\n this.previousStyles = value;\n } else {\n this.element.setAttribute(this.extractedAttributeName, value);\n }\n }\n}\n", "import { Context, evalGet } from \"..\";\n\ninterface EventDirectiveOptions {\n element: Element;\n context: Context;\n attr: Attr;\n}\n\nexport class EventDirective {\n element: Element;\n context: Context;\n expression: string;\n attr: Attr;\n eventCount = 0;\n\n constructor({ element, context, attr }: EventDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = attr.value;\n this.attr = attr;\n\n const eventName = attr.name.replace(/^@/, \"\");\n const parts = eventName.split(\".\");\n\n this.element.addEventListener(parts[0], (event) => {\n if (parts.includes(\"prevent\")) event.preventDefault();\n if (parts.includes(\"stop\")) event.stopPropagation();\n if (parts.includes(\"once\") && this.eventCount > 0) return;\n\n this.eventCount++;\n\n const handler = evalGet(context.scope, attr.value);\n if (typeof handler === \"function\") {\n handler(event);\n }\n });\n\n element.removeAttribute(attr.name);\n }\n}\n", "import { Block, Component, Context, createScopedContext, evalGet } from \"..\";\nimport { isArray, isObject } from \"../util\";\n\nconst forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\nconst forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nconst stripParensRE = /^\\(|\\)$/g;\nconst destructureRE = /^[{[]\\s*((?:[\\w_$]+\\s*,?\\s*)+)[\\]}]$/;\n\ntype KeyToIndexMap = Map;\n\nexport const _for = (el: Element, exp: string, ctx: Context, component?: Component, componentProps?: Record, allProps?: Record) => {\n const inMatch = exp.match(forAliasRE);\n if (!inMatch) {\n console.warn(`invalid :for expression: ${exp}`);\n return;\n }\n\n const nextNode = el.nextSibling;\n\n const parent = el.parentElement!;\n const anchor = new Text(\"\");\n parent.insertBefore(anchor, el);\n parent.removeChild(el);\n\n const sourceExp = inMatch[2].trim();\n let valueExp = inMatch[1].trim().replace(stripParensRE, \"\").trim();\n let destructureBindings: string[] | undefined;\n let isArrayDestructure = false;\n let indexExp: string | undefined;\n let objIndexExp: string | undefined;\n\n let keyAttr = \"key\";\n let keyExp = el.getAttribute(keyAttr) || el.getAttribute((keyAttr = \":key\")) || el.getAttribute((keyAttr = \":key:bind\"));\n if (keyExp) {\n el.removeAttribute(keyAttr);\n if (keyAttr === \"key\") keyExp = JSON.stringify(keyExp);\n }\n\n let match: any;\n if ((match = valueExp.match(forIteratorRE))) {\n valueExp = valueExp.replace(forIteratorRE, \"\").trim();\n indexExp = match[1].trim();\n if (match[2]) {\n objIndexExp = match[2].trim();\n }\n }\n\n if ((match = valueExp.match(destructureRE))) {\n destructureBindings = match[1].split(\",\").map((s: string) => s.trim());\n isArrayDestructure = valueExp[0] === \"[\";\n }\n\n let mounted = false;\n let blocks: Block[];\n let childCtxs: Context[];\n let keyToIndexMap: Map;\n\n const createChildContexts = (source: unknown): [Context[], KeyToIndexMap] => {\n const map: KeyToIndexMap = new Map();\n const ctxs: Context[] = [];\n\n if (isArray(source)) {\n for (let i = 0; i < source.length; i++) {\n ctxs.push(createChildContext(map, source[i], i));\n }\n } else if (typeof source === \"number\") {\n for (let i = 0; i < source; i++) {\n ctxs.push(createChildContext(map, i + 1, i));\n }\n } else if (isObject(source)) {\n let i = 0;\n for (const key in source) {\n ctxs.push(createChildContext(map, source[key], i++, key));\n }\n }\n\n return [ctxs, map];\n };\n\n const createChildContext = (map: KeyToIndexMap, value: any, index: number, objKey?: string): Context => {\n const data: any = {};\n if (destructureBindings) {\n destructureBindings.forEach((b, i) => (data[b] = value[isArrayDestructure ? i : b]));\n } else {\n data[valueExp] = value;\n }\n if (objKey) {\n indexExp && (data[indexExp] = objKey);\n objIndexExp && (data[objIndexExp] = index);\n } else {\n indexExp && (data[indexExp] = index);\n }\n\n const childCtx = createScopedContext(ctx, data);\n const key = keyExp ? evalGet(childCtx.scope, keyExp) : index;\n map.set(key, index);\n childCtx.key = key;\n return childCtx;\n };\n\n const mountBlock = (ctx: Context, ref: Node) => {\n const block = new Block({ element: el, parentContext: ctx, replacementType: \"replace\", component, componentProps, allProps });\n block.key = ctx.key;\n block.insert(parent, ref);\n return block;\n };\n\n ctx.effect(() => {\n const source = evalGet(ctx.scope, sourceExp);\n const prevKeyToIndexMap = keyToIndexMap;\n [childCtxs, keyToIndexMap] = createChildContexts(source);\n if (!mounted) {\n blocks = childCtxs.map((s) => mountBlock(s, anchor));\n mounted = true;\n } else {\n for (let i = 0; i < blocks.length; i++) {\n if (!keyToIndexMap.has(blocks[i].key)) {\n blocks[i].remove();\n }\n }\n\n const nextBlocks: Block[] = [];\n let i = childCtxs.length;\n let nextBlock: Block | undefined;\n let prevMovedBlock: Block | undefined;\n while (i--) {\n const childCtx = childCtxs[i];\n const oldIndex = prevKeyToIndexMap.get(childCtx.key);\n let block: Block;\n if (oldIndex == null) {\n // new\n block = mountBlock(childCtx, nextBlock ? nextBlock.element : anchor);\n } else {\n // update\n block = blocks[oldIndex];\n Object.assign(block.context.scope, childCtx.scope);\n if (oldIndex !== i) {\n // moved\n if (\n blocks[oldIndex + 1] !== nextBlock ||\n // If the next has moved, it must move too\n prevMovedBlock === nextBlock\n ) {\n prevMovedBlock = block;\n block.insert(parent, nextBlock ? nextBlock.element : anchor);\n }\n }\n }\n nextBlocks.unshift((nextBlock = block));\n }\n blocks = nextBlocks;\n }\n });\n\n return nextNode;\n};\n", "import { Block, Component, Context, evalGet } from \"..\";\nimport { checkAndRemoveAttribute } from \"../util\";\n\ninterface Branch {\n exp?: string | null;\n el: Element;\n}\n\nexport function _if(el: Element, exp: string, ctx: Context, component?: Component, componentProps?: Record, allProps?: Record) {\n const parent = el.parentElement!;\n const anchor = new Comment(\":if\");\n\n parent.insertBefore(anchor, el);\n\n const branches: Branch[] = [{ exp, el }];\n\n let elseEl: Element | null;\n let elseExp: string | null;\n\n while ((elseEl = el.nextElementSibling)) {\n elseExp = null;\n\n if (checkAndRemoveAttribute(elseEl, \":else\") === \"\" || (elseExp = checkAndRemoveAttribute(elseEl, \":else-if\"))) {\n parent.removeChild(elseEl);\n branches.push({ exp: elseExp, el: elseEl });\n } else {\n break;\n }\n }\n\n const nextNode = el.nextSibling;\n parent.removeChild(el);\n\n let block: Block | undefined;\n let activeBranchIndex = -1;\n\n const removeActiveBlock = () => {\n if (block) {\n parent.insertBefore(anchor, block.element);\n block.remove();\n block = undefined;\n }\n };\n\n ctx.effect(() => {\n for (let i = 0; i < branches.length; i++) {\n const { exp, el } = branches[i];\n\n if (!exp || evalGet(ctx.scope, exp)) {\n if (i !== activeBranchIndex) {\n removeActiveBlock();\n block = new Block({ element: el, parentContext: ctx, replacementType: \"replace\", component, componentProps, allProps });\n block.insert(parent, anchor);\n parent.removeChild(anchor);\n activeBranchIndex = i;\n }\n\n return;\n }\n }\n\n activeBranchIndex = -1;\n removeActiveBlock();\n });\n\n return nextNode;\n}\n", "import { Context, evalGet } from \"../\";\nimport { insertAfter, toDisplayString } from \"../util\";\n\ninterface InterpolationDirectiveOptions {\n element: Text;\n context: Context;\n}\n\nconst delims = /{{\\s?(.*?)\\s?}}/g;\n\nexport class InterpolationDirective {\n element: Text;\n context: Context;\n textNodes: Map = new Map();\n\n constructor({ element, context }: InterpolationDirectiveOptions) {\n this.element = element;\n this.context = context;\n\n this.findNodes();\n\n this.textNodes.forEach((nodes, expression) => {\n const trimmedExpression = expression.slice(2, -2).trim();\n\n nodes.forEach((node) => {\n const getter = (exp = trimmedExpression) => evalGet(this.context.scope, exp, node);\n\n context.effect(() => {\n node.textContent = toDisplayString(getter());\n });\n });\n });\n }\n\n findNodes() {\n const textContent = this.element.textContent.trim();\n if (textContent?.match(delims)) {\n const textNodes = textContent.split(/(\\{\\{\\s?[^}]+\\s?\\}\\})/g).filter(Boolean);\n if (textNodes) {\n let previousNode = this.element;\n\n for (let i = 0; i < textNodes.length; i++) {\n const textNode = textNodes[i];\n\n if (textNode.match(/\\{\\{\\s?.+\\s?\\}\\}/)) {\n const newNode = document.createTextNode(textNode);\n\n if (i === 0) {\n this.element.replaceWith(newNode);\n } else {\n insertAfter(newNode, previousNode);\n }\n\n previousNode = newNode;\n\n if (this.textNodes.has(textNode)) {\n this.textNodes.get(textNode).push(newNode);\n } else {\n this.textNodes.set(textNode, [newNode]);\n }\n } else {\n const newNode = document.createTextNode(textNodes[i]);\n\n if (i === 0) {\n this.element.replaceWith(newNode);\n } else {\n insertAfter(newNode, previousNode);\n }\n\n previousNode = newNode;\n }\n }\n }\n }\n }\n\n update() {}\n}\n", "import { Context, evalGet } from \"..\";\n\ninterface ShowDirectiveOptions {\n element: Element;\n context: Context;\n expression: string;\n}\n\nexport class ShowDirective {\n element: Element;\n context: Context;\n expression: string;\n originalDisplay: string;\n\n constructor({ element, context, expression }: ShowDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = expression;\n this.originalDisplay = getComputedStyle(this.element).display;\n\n context.effect(this.update.bind(this));\n }\n\n update() {\n const shouldShow = Boolean(evalGet(this.context.scope, this.expression));\n // @ts-ignore\n this.element.style.display = shouldShow ? this.originalDisplay : \"none\";\n }\n}\n", "import { Block, Context } from \"..\";\nimport { nextTick } from \"../util\";\n\nexport function _teleport(el: Element, exp: string, ctx: Context) {\n const anchor = new Comment(\":teleport\");\n el.replaceWith(anchor);\n\n const target = document.querySelector(exp);\n if (!target) {\n console.warn(`teleport target not found: ${exp}`);\n return;\n }\n\n nextTick(() => {\n target.appendChild(el);\n\n const observer = new MutationObserver((mutationsList) => {\n mutationsList.forEach((mutation) => {\n mutation.removedNodes.forEach((removedNode) => {\n if (removedNode.contains(anchor)) {\n el.remove();\n observer.disconnect();\n }\n });\n });\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n // Walks the tree of this teleported element.\n new Block({\n element: el,\n parentContext: ctx,\n });\n });\n\n // Return the anchor so walk continues down the tree in the right order.\n return anchor;\n}\n", "import { Context, evalGet, evalSet } from \"..\";\n\ninterface ValueDirectiveOptions {\n element: Element;\n context: Context;\n expression: string;\n}\n\ntype SupportedModelType = \"text\" | \"checkbox\" | \"radio\" | \"number\" | \"password\" | \"color\";\n\nfunction isInput(element: Element): element is HTMLInputElement {\n return element instanceof HTMLInputElement;\n}\n\nfunction isTextarea(element: Element): element is HTMLTextAreaElement {\n return element instanceof HTMLTextAreaElement;\n}\n\nfunction isSelect(element: Element): element is HTMLSelectElement {\n return element instanceof HTMLSelectElement;\n}\n\nexport class ValueDirective {\n element: Element;\n context: Context;\n expression: string;\n inputType: SupportedModelType;\n\n constructor({ element, context, expression }: ValueDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = expression;\n this.inputType = element.getAttribute(\"type\") as SupportedModelType;\n\n // Element -> Context\n if (isInput(element)) {\n switch (this.inputType) {\n case \"text\":\n case \"password\":\n case \"number\":\n case \"color\":\n element.addEventListener(\"input\", () => {\n const value = this.inputType === \"number\" ? (element.value ? parseFloat(element.value) : 0) : element.value;\n evalSet(this.context.scope, expression, value);\n });\n break;\n\n case \"checkbox\":\n element.addEventListener(\"change\", (e: any) => {\n evalSet(this.context.scope, expression, !!e.currentTarget.checked);\n });\n break;\n case \"radio\":\n element.addEventListener(\"change\", (e: any) => {\n if (e.currentTarget.checked) {\n evalSet(this.context.scope, expression, element.getAttribute(\"value\"));\n }\n });\n break;\n default:\n break;\n }\n }\n\n if (isTextarea(element)) {\n element.addEventListener(\"input\", () => {\n evalSet(this.context.scope, expression, element.value);\n });\n }\n\n if (isSelect(element)) {\n element.addEventListener(\"change\", () => {\n evalSet(this.context.scope, expression, element.value);\n });\n }\n\n // Context -> Element\n context.effect(this.updateElementValue.bind(this));\n }\n\n updateElementValue() {\n const value = evalGet(this.context.scope, this.expression, this.element);\n\n if (isInput(this.element)) {\n switch (this.inputType) {\n case \"text\":\n case \"password\":\n case \"number\":\n case \"color\":\n this.element.value = value;\n break;\n case \"checkbox\":\n this.element.checked = !!value;\n break;\n case \"radio\":\n this.element.checked = this.element.value === value;\n break;\n default:\n break;\n }\n }\n\n if (isTextarea(this.element)) {\n this.element.value = value;\n }\n\n if (isSelect(this.element)) {\n this.element.value = value;\n }\n }\n}\n", "interface EffectOptions {\n lazy?: boolean;\n}\n\ninterface EffectFunction {\n active: boolean;\n handler: () => void;\n refs: Set[];\n}\n\ntype Effects = Set;\ntype EffectsMap = Map;\ntype TargetMap = WeakMap;\n\nconst targetMap: TargetMap = new WeakMap();\nconst effectStack: (EffectFunction | undefined)[] = [];\n\nexport function track(target: T, key: PropertyKey) {\n const activeEffect = effectStack[effectStack.length - 1];\n\n if (!activeEffect) return;\n\n let effectsMap = targetMap.get(target);\n if (!effectsMap)\n targetMap.set(target, (effectsMap = new Map() as EffectsMap));\n\n let effects = effectsMap.get(key);\n if (!effects) effectsMap.set(key, (effects = new Set()));\n\n if (!effects.has(activeEffect)) {\n effects.add(activeEffect);\n activeEffect.refs.push(effects);\n }\n}\n\nexport function trigger(target: any, key: PropertyKey) {\n const effectsMap = targetMap.get(target);\n if (!effectsMap) return;\n\n const scheduled = new Set();\n\n effectsMap.get(key)?.forEach((effect) => {\n scheduled.add(effect);\n });\n\n scheduled.forEach(run);\n}\n\nfunction stop(effect: EffectFunction) {\n if (effect.active) cleanup(effect);\n effect.active = false;\n}\n\nfunction start(effect: EffectFunction) {\n if (!effect.active) {\n effect.active = true;\n run(effect);\n }\n}\n\nfunction run(effect: EffectFunction): unknown {\n if (!effect.active) return;\n\n if (effectStack.includes(effect)) return;\n\n cleanup(effect);\n\n let val: unknown;\n\n try {\n effectStack.push(effect);\n val = effect.handler();\n } finally {\n effectStack.pop();\n }\n\n return val;\n}\n\nfunction cleanup(effect: EffectFunction) {\n const { refs } = effect;\n\n if (refs.length) {\n for (const ref of refs) {\n ref.delete(effect);\n }\n }\n\n refs.length = 0;\n}\n\nexport function effect(handler: () => void, opts: EffectOptions = {}) {\n const { lazy } = opts;\n const newEffect: EffectFunction = {\n active: !lazy,\n handler,\n refs: [],\n };\n\n run(newEffect);\n\n return {\n start: () => {\n start(newEffect);\n },\n stop: () => {\n stop(newEffect);\n },\n toggle: () => {\n if (newEffect.active) {\n stop(newEffect);\n } else {\n start(newEffect);\n }\n return newEffect.active;\n },\n };\n}\n", "import { isObject } from \"../util\";\nimport { effect } from \"./effect\";\n\nconst $computed = Symbol(\"computed\");\n\nexport type Computed = {\n readonly value: T;\n readonly [$computed]: true;\n};\n\nexport function isComputed(value: unknown): value is Computed {\n return isObject(value) && value[$computed];\n}\n\nexport function computed(getter: () => T): Computed {\n const ref = {\n get value(): T {\n return getter();\n },\n [$computed]: true,\n } as const;\n\n effect(() => {\n getter();\n });\n\n return ref;\n}\n", "import { isObject } from \"../util\";\nimport { track, trigger } from \"./effect\";\nimport { Reactive, reactive } from \"./reactive\";\n\nexport const $ref = Symbol(\"ref\");\n\nexport type Ref = {\n value: T;\n [$ref]: true;\n};\n\nexport function isRef(value: unknown): value is Ref {\n return isObject(value) && !!value[$ref];\n}\n\nexport function ref(value: T = null as unknown as T): Ref {\n if (isObject(value)) {\n // @ts-ignore\n return isRef(value) ? (value as Ref) : (reactive(value) as Reactive);\n }\n\n const result = { value, [$ref]: true };\n\n return new Proxy(result, {\n get(target: object, key: string | symbol, receiver: any) {\n const val = Reflect.get(target, key, receiver);\n track(result, \"value\");\n return val;\n },\n set(target: object, key: string | symbol, value: unknown) {\n const oldValue = target[key];\n if (oldValue !== value) {\n const success = Reflect.set(target, key, value);\n if (success) {\n trigger(result, \"value\");\n }\n }\n return true;\n },\n }) as Ref;\n}\n", "import { isObject } from \"../util\";\nimport { track, trigger } from \"./effect\";\nimport { ref } from \"./ref\";\n\nconst $reactive = Symbol(\"reactive\");\n\nexport type Reactive = T & { [$reactive]: true };\n\nexport function isReactive(\n value: unknown,\n): value is Reactive {\n return isObject(value) && !!value[$reactive];\n}\n\nexport function reactive(value: T): Reactive {\n // @ts-ignore\n if (!isObject(value)) return ref(value) as Reactive;\n if (value[$reactive]) return value as Reactive;\n\n value[$reactive] = true;\n\n Object.keys(value).forEach((key) => {\n if (isObject(value[key])) {\n value[key] = reactive(value[key]);\n }\n });\n\n return new Proxy(value, reactiveProxyHandler()) as Reactive;\n}\n\nfunction reactiveProxyHandler() {\n return {\n deleteProperty(target: object, key: string | symbol) {\n const had = Reflect.has(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (had) trigger(target, key);\n return result;\n },\n get(target: object, key: string | symbol) {\n track(target, key);\n return Reflect.get(target, key);\n },\n set(target: object, key: string | symbol, value: unknown) {\n if (target[key] === value) return true;\n let newObj = false;\n\n if (isObject(value) && !isObject(target[key])) {\n newObj = true;\n }\n\n if (Reflect.set(target, key, value)) {\n trigger(target, key);\n }\n\n if (newObj) {\n target[key] = reactive(target[key]);\n }\n\n return true;\n },\n };\n}\n", "import { AttributeDirective } from \"./directives/attribute\";\nimport { EventDirective } from \"./directives/event\";\nimport { _for } from \"./directives/for\";\nimport { _if } from \"./directives/if\";\nimport { InterpolationDirective } from \"./directives/interpolation\";\nimport { ShowDirective } from \"./directives/show\";\nimport { _teleport } from \"./directives/teleport\";\nimport { ValueDirective } from \"./directives/value\";\nimport { Plugin } from \"./plugins\";\nimport { isComputed } from \"./reactivity/computed\";\nimport { effect as _effect } from \"./reactivity/effect\";\nimport { reactive } from \"./reactivity/reactive\";\nimport { isRef, ref } from \"./reactivity/ref\";\nimport {\n checkAndRemoveAttribute,\n componentHasPropByName,\n extractPropName,\n findSlotNodes,\n findTemplateNodes,\n html,\n isElement,\n isEventAttribute,\n isMirrorProp,\n isObject,\n isPropAttribute,\n isRegularProp,\n isSpreadProp,\n isText,\n Slot,\n stringToElement,\n Template,\n} from \"./util\";\n\nexport function provide(key: string, value: unknown) {\n if (!current.componentBlock) {\n console.warn(\"Can't provide: no current component block\");\n }\n\n current.componentBlock.provides.set(key, value);\n}\n\nexport function inject(key: string) {\n if (!current.componentBlock) {\n console.warn(\"Can't inject: no current component block\");\n }\n\n let c = current.componentBlock;\n\n while (c) {\n if (c.provides.has(key)) {\n return c.provides.get(key);\n }\n\n c = c.parentComponentBlock;\n }\n\n return undefined;\n}\n\nexport class App {\n rootBlock: Block;\n registry = new Map();\n plugins = new Set();\n\n register(name: string, component: Component) {\n this.registry.set(name, component);\n }\n\n use(plugin: Plugin, ...config: any[]) {\n this.plugins.add(plugin);\n plugin.use(this, ...config);\n }\n\n getComponent(tag: string) {\n return this.registry.get(tag);\n }\n\n mount(component: Component, target: string | HTMLElement = \"body\", props: Record = {}) {\n const root = typeof target === \"string\" ? (document.querySelector(target) as HTMLElement) : target;\n const display = root.style.display;\n root.style.display = \"none\";\n this.rootBlock = this._mount(component, root, props, true);\n root.style.display = display;\n return this.rootBlock;\n }\n\n private _mount(component: Component, target: HTMLElement, props: Record, isRoot = false) {\n const parentContext = createContext({ app: this });\n\n if (props) {\n parentContext.scope = reactive(props);\n bindContextMethods(parentContext.scope);\n }\n\n parentContext.scope.$isRef = isRef;\n parentContext.scope.$isComputed = isComputed;\n\n const block = new Block({\n element: target,\n parentContext,\n component,\n isRoot,\n componentProps: props,\n replacementType: \"replaceChildren\",\n });\n\n return block;\n }\n\n unmount() {\n this.rootBlock.teardown();\n }\n}\n\nexport interface Context {\n key?: any;\n app: App;\n scope: Record;\n blocks: Block[];\n effects: Array>;\n effect: typeof _effect;\n slots: Slot[];\n templates: Template[];\n}\n\ninterface CreateContextOptions {\n parentContext?: Context;\n app?: App;\n}\n\nexport function createContext({ parentContext, app }: CreateContextOptions): Context {\n const context: Context = {\n app: app ? app : parentContext && parentContext.app ? parentContext.app : null,\n scope: parentContext ? parentContext.scope : reactive({}),\n blocks: [],\n effects: [],\n slots: [],\n templates: parentContext ? parentContext.templates : [],\n effect: (handler: () => void) => {\n const e = _effect(handler);\n context.effects.push(e);\n return e;\n },\n };\n\n return context;\n}\n\nexport const createScopedContext = (ctx: Context, data = {}): Context => {\n const parentScope = ctx.scope;\n const mergedScope = Object.create(parentScope);\n Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data));\n let proxy: any;\n proxy = reactive(\n new Proxy(mergedScope, {\n set(target, key, val, receiver) {\n // when setting a property that doesn't exist on current scope,\n // do not create it on the current scope and fallback to parent scope.\n if (receiver === proxy && !target.hasOwnProperty(key)) {\n return Reflect.set(parentScope, key, val);\n }\n return Reflect.set(target, key, val, receiver);\n },\n }),\n );\n\n bindContextMethods(proxy);\n\n const out: Context = {\n ...ctx,\n scope: {\n ...ctx.scope,\n ...proxy,\n },\n };\n\n return out;\n};\n\nfunction bindContextMethods(scope: Record) {\n for (const key of Object.keys(scope)) {\n if (typeof scope[key] === \"function\") {\n scope[key] = scope[key].bind(scope);\n }\n }\n}\n\nfunction mergeProps(props: Record, defaultProps: Record) {\n const merged = {};\n\n Object.keys(defaultProps).forEach((defaultProp) => {\n const propValue = props.hasOwnProperty(defaultProp) ? props[defaultProp] : defaultProps[defaultProp]?.default;\n\n merged[defaultProp] = reactive(typeof propValue === \"function\" ? propValue() : propValue);\n });\n\n return merged;\n}\n\nexport interface Component {\n template: string;\n props?: Record;\n main?: (props?: Record) => Record | void;\n}\n\ninterface Current {\n componentBlock?: Block;\n}\n\nexport const current: Current = { componentBlock: undefined };\n\ninterface BlockOptions {\n element: Element;\n isRoot?: boolean;\n replacementType?: \"replace\" | \"replaceChildren\";\n componentProps?: Record;\n allProps?: Record;\n parentContext?: Context;\n component?: Component;\n parentComponentBlock?: Block;\n templates?: Template[];\n}\n\nexport class Block {\n element: Element;\n context: Context;\n parentContext: Context;\n component: Component;\n provides = new Map();\n parentComponentBlock: Block | undefined;\n componentProps: Record;\n allProps: Record;\n\n isFragment: boolean;\n start?: Text;\n end?: Text;\n key?: any;\n\n constructor(opts: BlockOptions) {\n this.isFragment = opts.element instanceof HTMLTemplateElement;\n this.parentComponentBlock = opts.parentComponentBlock;\n\n if (opts.component) {\n current.componentBlock = this;\n this.element = stringToElement(opts.component.template);\n } else {\n if (this.isFragment) {\n this.element = (opts.element as HTMLTemplateElement).content.cloneNode(true) as Element;\n } else if (typeof opts.element === \"string\") {\n this.element = stringToElement(opts.element);\n } else {\n this.element = opts.element.cloneNode(true) as Element;\n opts.element.replaceWith(this.element);\n }\n }\n\n if (opts.isRoot) {\n this.context = opts.parentContext;\n } else {\n this.parentContext = opts.parentContext ? opts.parentContext : createContext({});\n this.parentContext.blocks.push(this);\n this.context = createContext({ parentContext: opts.parentContext });\n }\n\n if (opts.component) {\n this.componentProps = mergeProps(opts.componentProps ?? {}, opts.component.props ?? {});\n\n if (opts.component.main) {\n this.context.scope = {\n ...(opts.component.main(this.componentProps) || {}),\n };\n }\n }\n\n opts.allProps?.forEach((prop) => {\n if (prop.isBind) {\n this.context.effect(() => {\n let newValue: unknown;\n\n if (prop.isSpread) {\n const spreadProps = evalGet(this.parentContext.scope, prop.extractedName);\n if (isObject(spreadProps)) {\n Object.keys(spreadProps).forEach((key) => {\n newValue = spreadProps[key];\n this.setProp(key, newValue);\n });\n }\n } else {\n newValue = prop.isMirror ? evalGet(this.parentContext.scope, prop.extractedName) : evalGet(this.parentContext.scope, prop.exp);\n this.setProp(prop.extractedName, newValue);\n }\n });\n }\n });\n\n // Capture slots\n this.context.slots = findSlotNodes(this.element);\n this.context.templates = opts.templates ?? [];\n\n // Put templates into slots\n this.context.slots.forEach((slot) => {\n const template = this.context.templates.find((t) => t.targetSlotName === slot.name);\n\n if (template) {\n const templateContents = template.node.content.cloneNode(true);\n slot.node.replaceWith(templateContents);\n }\n });\n\n this.context.scope.$isRef = isRef;\n this.context.scope.$isComputed = isComputed;\n\n walk(this.element, this.context);\n\n if (opts.component) {\n if (opts.replacementType === \"replace\") {\n if (opts.element instanceof HTMLElement) {\n opts.element.replaceWith(this.element);\n }\n } else {\n if (opts.element instanceof HTMLElement) {\n opts.element.replaceChildren(this.element);\n }\n }\n }\n }\n\n setProp(name: string, value: unknown) {\n if (isRef(this.componentProps[name])) {\n this.componentProps[name].value = value;\n } else {\n this.componentProps[name] = value;\n }\n }\n\n insert(parent: Element, anchor: Node | null = null) {\n if (this.isFragment) {\n if (this.start) {\n // Already inserted, moving\n let node: Node | null = this.start;\n let next: Node | null;\n\n while (node) {\n next = node.nextSibling;\n parent.insertBefore(node, anchor);\n\n if (node === this.end) {\n break;\n }\n\n node = next;\n }\n } else {\n this.start = new Text(\"\");\n this.end = new Text(\"\");\n\n parent.insertBefore(this.end, anchor);\n parent.insertBefore(this.start, this.end);\n parent.insertBefore(this.element, this.end);\n }\n } else {\n parent.insertBefore(this.element, anchor);\n }\n }\n\n remove() {\n if (this.parentContext) {\n const i = this.parentContext.blocks.indexOf(this);\n\n if (i > -1) {\n this.parentContext.blocks.splice(i, 1);\n }\n }\n\n if (this.start) {\n const parent = this.start.parentNode!;\n let node: Node | null = this.start;\n let next: Node | null;\n\n while (node) {\n next = node.nextSibling;\n parent.removeChild(node);\n\n if (node === this.end) {\n break;\n }\n\n node = next;\n }\n } else {\n // this.element.parentNode!.removeChild(this.element);\n this.element.remove();\n }\n\n this.teardown();\n }\n\n teardown() {\n this.context.blocks.forEach((block) => {\n block.teardown();\n });\n\n this.context.effects.forEach(stop);\n }\n}\n\nfunction isComponent(element: Element, context: Context) {\n return !!context.app.getComponent(element.tagName.toLowerCase());\n}\n\nfunction walk(node: Node, context: Context) {\n if (isText(node)) {\n new InterpolationDirective({ element: node, context });\n return;\n }\n\n if (isElement(node)) {\n let exp: string | null;\n\n if (isComponent(node, context)) {\n const component = context.app.getComponent(node.tagName.toLowerCase());\n\n const allProps = Array.from(node.attributes)\n .filter((attr) => isSpreadProp(attr.name) || isMirrorProp(attr.name) || (isRegularProp(attr.name) && componentHasPropByName(extractPropName(attr.name), component)))\n .map((attr) => ({\n isMirror: isMirrorProp(attr.name),\n isSpread: isSpreadProp(attr.name),\n isBind: attr.name.includes(\"bind\"),\n originalName: attr.name,\n extractedName: extractPropName(attr.name),\n exp: attr.value,\n value: isMirrorProp(attr.name) ? evalGet(context.scope, extractPropName(attr.name)) : attr.value ? evalGet(context.scope, attr.value) : undefined,\n }));\n\n const componentProps = allProps.reduce((acc, { isSpread, isMirror, extractedName, value }) => {\n if (isSpread) {\n const spread = evalGet(context.scope, extractedName);\n if (isObject(spread)) Object.assign(acc, spread);\n } else if (isMirror) {\n acc[extractedName] = evalGet(context.scope, extractedName);\n } else {\n acc[extractedName] = value;\n }\n return acc;\n }, {});\n\n if ((exp = checkAndRemoveAttribute(node, \":teleport\"))) {\n return _teleport(node, exp, context);\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":if\"))) {\n return _if(node, exp, context, component, componentProps, allProps);\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":for\"))) {\n return _for(node, exp, context, component, componentProps, allProps);\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":show\"))) {\n new ShowDirective({ element: node, context, expression: exp });\n }\n\n const templates = findTemplateNodes(node);\n\n const block = new Block({\n element: node,\n parentContext: context,\n component,\n replacementType: \"replace\",\n parentComponentBlock: current.componentBlock,\n templates,\n componentProps,\n allProps,\n });\n\n return block.element;\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":teleport\"))) {\n return _teleport(node, exp, context);\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":if\"))) {\n return _if(node, exp, context);\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":for\"))) {\n return _for(node, exp, context);\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":ref\"))) {\n context.scope[exp].value = node;\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":value\"))) {\n new ValueDirective({ element: node, context, expression: exp });\n }\n\n if ((exp = checkAndRemoveAttribute(node, \":show\"))) {\n new ShowDirective({ element: node, context, expression: exp });\n }\n\n Array.from(node.attributes).forEach((attr) => {\n if (isPropAttribute(attr.name)) {\n new AttributeDirective({ element: node, context, attr });\n }\n\n if (isEventAttribute(attr.name)) {\n new EventDirective({ element: node, context, attr });\n }\n });\n\n walkChildren(node, context);\n }\n}\n\nfunction walkChildren(node: Node, context: Context) {\n let child = node.firstChild;\n\n while (child) {\n child = walk(child, context) || child.nextSibling;\n }\n}\n\nconst evalFuncCache: Record = {};\n\nexport function evalGet(scope: any, exp: string, el?: Node) {\n if (!exp.trim()) return undefined;\n return execute(scope, `const ___value = (${exp.trim()}); return ___value;`, el);\n}\n\nexport function evalSet(scope: any, exp: string, value: unknown) {\n value = typeof value === \"string\" ? `\"${value}\"` : value;\n return execute(scope, `const ___target = (${exp.trim()}); return $isRef(___target) ? ___target.value = ${value} : ___target = ${value};`, null, false);\n}\n\nfunction execute(scope: any, exp: string, el?: Node, flatRefs = true) {\n const newScope = flatRefs ? flattenRefs(scope) : scope;\n const fn = evalFuncCache[exp] || (evalFuncCache[exp] = toFunction(exp));\n\n try {\n return fn(newScope, el);\n } catch (e) {\n console.warn(`Error evaluating expression: \"${exp}\":`);\n console.error(e);\n }\n}\n\n// Function to convert expression strings to functions\nfunction toFunction(exp: string) {\n try {\n return new Function(\"$data\", \"$el\", `with($data){${exp}}`);\n } catch (e) {\n console.error(`${(e as Error).message} in expression: ${exp}`);\n return () => {};\n }\n}\n\n// Map all ref properties in scope to their `.value`\nfunction flattenRefs(scope: any): any {\n const mapped = {};\n\n for (const key in scope) {\n if (scope.hasOwnProperty(key)) {\n // Check if the value is a Ref\n if (isRef(scope[key])) {\n mapped[key] = scope[key].value;\n } else {\n mapped[key] = scope[key];\n }\n }\n }\n return mapped;\n}\n\n// ------------------------------------------------\n// Slots, multiple default and named, :if and :for\n// const card = {\n// template: html`
\n//

\n// \n//
`,\n// };\n\n// const main = {\n// template: html`\n//
\n//

card below

\n// \n// card title\n// \n// \n//
\n// `,\n// };\n\n// const app = new App();\n// app.register(\"card\", card);\n// app.mount(main, \"#app\");\n\n// ------------------------------------------------\n// Slots, multiple default and named, :if and :for\n// const app = new App();\n\n// const parent = {\n// template: html`\n//
\n//

parent

\n// \n// \n//
\n//
\n//
1
\n//
2
\n//
3
\n//
\n//
\n// content 1 always shown\n//
\n// content 2, animals:\n//
animal: {{animal}}
\n//
\n\n// \n// \n//
\n//
\n// `,\n// main() {\n// const bool = ref(true);\n// const animals = reactive([\"dog\", \"cat\", \"bear\"]);\n\n// setInterval(() => {\n// bool.value = !bool.value;\n// }, 2000);\n\n// return { bool, animals };\n// },\n// };\n// const card = {\n// template: html`
\n//

card

\n//

\n// \n//
`,\n// };\n// app.register(\"card\", card);\n// const parentBlock = app.mount(parent, \"body\");\n// const cardBlock = parentBlock.context.blocks[0];\n\n// ------------------------------------------------\n// Component pros, mirror and spread, bind and no bind\n// const child = {\n// template: html`
Animal: {{animal}}
`,\n// props: { animal: { default: \"cat\" } },\n// main({ animal }) {\n// return { animal };\n// },\n// };\n\n// const parent = {\n// template: html`\n//
\n//
asdf
\n// mirror, no bind:\n// \n//
\n// mirror, bind:\n// \n//
\n// spread, no bind:\n// \n//
\n// spread, bind:\n// \n//
\n// regular prop:\n// \n//
\n// regular prop, bind:\n// \n//
\n//
div has \"id\" set to animal.value
\n//
\n//
div has \"id\" set and bound to animal.value
\n//
\n//
div has \"animal\" set to animal.value
\n//
\n//
div has \"animal\" set and bound to animal.value
\n//
\n//
div has \"animal\" spread
\n//
\n//
div has \"animal\" spread and bound
\n//
\n//
\n//
\n//
\n// if bool, mirror, no bind:\n// \n// if bool, mirror, bind:\n// \n//
\n// for list, mirror, no bind:\n// \n//
\n// for list, mirror, bind:\n// \n// if bool, for list, mirror, no bind: these have the value \"DOG!\" because by the time for :for directive is evaluated, animal.value is \"DOG!\", and no longer \"dog\".\n//
\n// \n//
\n//
\n// `,\n// main() {\n// const bool = ref(false);\n// const animal = ref(\"dog\");\n// const spread = reactive({ animal: \"panther\" });\n// const list = reactive([1, 2, 3]);\n\n// setTimeout(() => {\n// spread.animal = \"PANTHER!\";\n// animal.value = \"DOG!\";\n// bool.value = true;\n// }, 500);\n\n// setTimeout(() => {\n// animal.value = \"DOG!!!!!\";\n// }, 1000);\n\n// return { animal, spread, bool, list };\n// },\n// };\n\n// const app = new App();\n// app.register(\"child\", child);\n// app.mount(parent, \"#app\");\n\n// ------------------------------------------------\n// Event directive\nconst counter = {\n template: html`\n
\n
true
\n

Count: {{count}}{{count >= 2 ? '!!!' : ''}}

\n \n \n
\n `,\n main() {\n const count = ref(0);\n const style = reactive({ color: \"gray\" });\n const increment = () => count.value++;\n const decrement = () => count.value--;\n\n setInterval(() => {\n style.color = style.color === \"gray\" ? \"white\" : \"gray\";\n }, 500);\n\n return { count, increment, decrement, style };\n },\n};\n\nconst app = new App();\napp.mount(counter, \"#app\");\n"], - "mappings": ";AAEO,SAAS,gBAAgB,UAA2B;AACzD,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,MAAM,OAAO,gBAAgB,UAAU,WAAW;AACxD,SAAO,IAAI,KAAK;AAClB;AAEO,IAAM,SAAS,CAAC,SAA6B;AAClD,SAAO,KAAK,aAAa,KAAK;AAChC;AAEO,IAAM,aAAa,CAAC,SAA4C;AACrE,SAAO,KAAK,aAAa;AAC3B;AAEO,IAAM,YAAY,CAAC,SAAgC;AACxD,SAAO,KAAK,aAAa,KAAK;AAChC;AAEO,SAAS,SAAS,OAA6B;AACpD,SAAO,UAAU,QAAQ,OAAO,UAAU;AAC5C;AAEO,SAAS,QAAQ,OAA4B;AAClD,SAAO,MAAM,QAAQ,KAAK;AAC5B;AAEO,SAAS,wBAAwB,IAAa,UAAiC;AAEpF,QAAM,iBAAiB,GAAG,aAAa,QAAQ;AAG/C,MAAI,mBAAmB,MAAM;AAC3B,OAAG,gBAAgB,QAAQ;AAAA,EAC7B;AAGA,SAAO;AACT;AAYO,SAAS,cAAc,SAA0B;AACtD,QAAM,QAAgB,CAAC;AAEvB,QAAM,YAAY,CAAC,SAAkB;AACnC,UAAM,KAAK,KAAK,UAAU,EAAE,QAAQ,CAACA,UAAS;AAC5C,UAAI,UAAUA,KAAI,GAAG;AACnB,YAAIA,MAAK,aAAa,QAAQ;AAC5B,gBAAM,KAAK,EAAE,MAAAA,OAAM,MAAMA,MAAK,aAAa,MAAM,KAAK,UAAU,CAAC;AAAA,QACnE;AAEA,YAAIA,MAAK,cAAc,GAAG;AACxB,oBAAUA,KAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,YAAU,OAAO;AAEjB,SAAO;AACT;AAEO,SAAS,kBAAkB,SAAkB;AAClD,QAAM,YAAwB,CAAC;AAE/B,QAAM,gBAAgB,CAACC,aAAqB;AAC1C,QAAI,sBAA8B,CAAC;AAEnC,UAAM,KAAKA,SAAQ,UAAU,EAAE,QAAQ,CAAC,SAAS;AAC/C,UAAI,UAAU,IAAI,KAAK,OAAO,IAAI,GAAG;AACnC,YAAI,UAAU,IAAI,KAAK,KAAK,aAAa,cAAc,WAAW,IAAI,GAAG;AACvE,oBAAU,KAAK,EAAE,gBAAgB,KAAK,aAAa,MAAM,KAAK,IAAI,KAAK,CAAC;AAAA,QAC1E,OAAO;AAEL,8BAAoB,KAAK,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,oBAAoB,SAAS,GAAG;AAElC,YAAM,kBAAkB,SAAS,cAAc,UAAU;AACzD,sBAAgB,aAAa,QAAQ,SAAS;AAE9C,0BAAoB,QAAQ,CAAC,SAAS;AACpC,wBAAgB,QAAQ,YAAY,IAAI;AAAA,MAC1C,CAAC;AAED,gBAAU,KAAK,EAAE,gBAAgB,WAAW,MAAM,gBAAgB,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,gBAAc,OAAO;AAErB,SAAO;AACT;AAEO,IAAM,WAAW,OAAO,MAAiB;AAC9C,QAAM,IAAI;AAAA,IAAc,CAAC,MACvB;AAAA,MAAW,CAAC,MACV,sBAAsB,CAACC,OAAM;AAC3B,aAAK,EAAE;AACP,UAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,KAAK,YAAkC,QAAuB;AAE5E,QAAM,kBAAkB,CAAC,QAAQ,QAAQ,MAAM,OAAO,SAAS,MAAM,OAAO,SAAS,QAAQ,QAAQ,SAAS,UAAU,SAAS,KAAK;AAGtI,MAAI,SAAS,QAAQ,OAAO,CAAC,KAAK,KAAK,MAAM,MAAM,OAAO,OAAO,CAAC,KAAK,KAAK,EAAE;AAG9E,WAAS,OAAO,QAAQ,sCAAsC,CAAC,OAAO,SAAS,eAAe;AAE5F,QAAI,gBAAgB,SAAS,QAAQ,YAAY,CAAC,GAAG;AACnD,aAAO;AAAA,IACT;AAGA,WAAO,IAAI,OAAO,IAAI,UAAU,MAAM,OAAO;AAAA,EAC/C,CAAC;AAED,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAgB;AAC9C,SAAO,SAAS,OAAO,KAAK,SAAS,KAAK,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,OAAO,KAAK;AAC7F;AAEO,SAAS,YAAY,SAAe,cAAoB;AAC7D,MAAI,aAAa,aAAa;AAC5B,iBAAa,WAAW,aAAa,SAAS,aAAa,WAAW;AAAA,EACxE,OAAO;AACL,kBAAc,YAAY,YAAY,OAAO;AAAA,EAC/C;AACF;AAEO,SAAS,gBAAgB,UAAkB;AAChD,MAAI,SAAS,WAAW,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,MAAc;AACzC,SAAO,KAAK,WAAW,KAAK;AAC9B;AAEO,SAAS,aAAa,MAAc;AACzC,SAAO,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG;AAClD;AAEO,SAAS,cAAc,MAAc;AAC1C,SAAO,KAAK,WAAW,GAAG;AAC5B;AAEO,SAAS,iBAAiB,UAAkB;AACjD,SAAO,SAAS,WAAW,GAAG;AAChC;AAEO,SAAS,uBAAuB,MAAc,WAAsB;AACzE,SAAO,OAAO,KAAK,WAAW,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,SAAS,IAAI;AACzE;AAEO,SAAS,qBAAqB,UAAkB;AACrD,SAAO,SACJ,QAAQ,WAAW,EAAE,EACrB,QAAQ,OAAO,EAAE,EACjB,QAAQ,MAAM,EAAE,EAChB,QAAQ,MAAM,EAAE,EAChB,QAAQ,UAAU,EAAE;AACzB;AAEA,SAAS,YAAY,KAAa;AAChC,SAAO,IAAI,YAAY,EAAE,QAAQ,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC;AACzE;AAEO,SAAS,gBAAgB,UAAkB;AAChD,SAAO,YAAY,qBAAqB,QAAQ,CAAC;AACnD;AAEO,SAAS,WAAW,GAAQ;AACjC,QAAM,UAAU,CAAC;AACjB,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,MAAM,UAAU,CAAC;AACvB,QAAI,CAAC,IAAK;AACV,UAAM,UAAU,OAAO;AACvB,QAAI,YAAY,YAAY,YAAY,UAAU;AAChD,cAAQ,KAAK,GAAG;AAAA,IAClB,WAAW,MAAM,QAAQ,GAAG,GAAG;AAC7B,UAAI,IAAI,QAAQ;AACd,cAAM,QAAQ,WAAW,MAAM,MAAM,GAAG;AACxC,YAAI,OAAO;AACT,kBAAQ,KAAK,KAAK;AAAA,QACpB;AAAA,MACF;AAAA,IACF,WAAW,YAAY,UAAU;AAC/B,UAAI,IAAI,aAAa,OAAO,UAAU,UAAU;AAC9C,iBAAS,OAAO,KAAK;AACnB,cAAI,OAAO,eAAe,KAAK,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG;AACpD,oBAAQ,KAAK,GAAG;AAAA,UAClB;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,KAAK,IAAI,SAAS,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,SAAO,QAAQ,KAAK,GAAG;AACzB;;;ACrNO,IAAM,qBAAN,MAAyB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,kBAA4B,CAAC;AAAA,EAC7B,iBAA4C,CAAC;AAAA,EAE7C,KAAS;AAAA,IACP,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,eAAe;AAAA,EACjB;AAAA,EAEA,YAAY,EAAE,SAAS,SAAS,KAAK,GAA8B;AACjE,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,aAAa,KAAK;AACvB,SAAK,OAAO;AACZ,SAAK,yBAAyB,qBAAqB,KAAK,IAAI;AAE5D,SAAK,KAAK;AAAA,MACR,kBAAkB,KAAK,KAAK,WAAW,GAAG,KAAK,KAAK,KAAK,SAAS,GAAG;AAAA,MACrE,OAAO,KAAK,KAAK,SAAS,OAAO;AAAA,MACjC,QAAQ,KAAK,KAAK,WAAW,KAAK;AAAA,MAClC,eAAe;AAAA,IACjB;AAEA,QAAI,KAAK,GAAG,kBAAkB;AAC5B,WAAK,aAAa,KAAK;AAAA,IACzB;AAEA,QAAI,KAAK,GAAG,QAAQ;AAClB,WAAK,aAAa,KAAK;AAAA,IACzB;AAEA,YAAQ,gBAAgB,KAAK,IAAI;AAEjC,QAAI,KAAK,GAAG,OAAO;AACjB,cAAQ,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,IACvC,OAAO;AACL,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,SAAS;AACP,QAAI,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK,UAAU;AAEvD,QAAI,KAAK,GAAG,UAAU,OAAO,UAAU,UAAU;AAC/C,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,aAAK,QAAQ,aAAa,KAAK,OAAO,GAAG,CAAC;AAAA,MAC5C;AAAA,IACF,YAAY,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,MAAM,KAAK,2BAA2B,SAAS;AACzG,cAAQ,WAAW,KAAK;AACxB,YAAM,OAAO,MAAM,MAAM,GAAG;AAI5B,YAAM,OAAO,KAAK,OAAO,CAAC,MAAc,CAAC,KAAK,gBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,OAAO;AACzF,YAAM,KAAK,KAAK,gBAAgB,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC;AAE/D,WAAK,QAAQ,CAAC,MAAc;AAC1B,aAAK,gBAAgB,KAAK,CAAC;AAC3B,aAAK,QAAQ,UAAU,IAAI,CAAC;AAAA,MAC9B,CAAC;AAED,SAAG,QAAQ,CAAC,MAAM;AAChB,aAAK,kBAAkB,KAAK,gBAAgB,OAAO,CAAC,eAAe,eAAe,CAAC;AACnF,aAAK,QAAQ,UAAU,OAAO,CAAC;AAAA,MACjC,CAAC;AAAA,IACH,WAAW,OAAO,UAAU,YAAY,KAAK,2BAA2B,SAAS;AAC/E,YAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,YAAM,KAAK,OAAO,KAAK,KAAK,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,SAAS,KAAK,CAAC;AAEnF,WAAK,QAAQ,CAAC,UAAU;AACtB,aAAK,eAAe,KAAK,IAAI,MAAM,KAAK;AAExC,aAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,KAAK;AAAA,MACzC,CAAC;AAED,SAAG,QAAQ,CAAC,UAAU;AACpB,aAAK,eAAe,KAAK,IAAI;AAE7B,aAAK,QAAQ,MAAM,KAAK,IAAI;AAAA,MAC9B,CAAC;AAED,WAAK,iBAAiB;AAAA,IACxB,OAAO;AACL,WAAK,QAAQ,aAAa,KAAK,wBAAwB,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;;;ACtGO,IAAM,iBAAN,MAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EAEb,YAAY,EAAE,SAAS,SAAS,KAAK,GAA0B;AAC7D,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,aAAa,KAAK;AACvB,SAAK,OAAO;AAEZ,UAAM,YAAY,KAAK,KAAK,QAAQ,MAAM,EAAE;AAC5C,UAAM,QAAQ,UAAU,MAAM,GAAG;AAEjC,SAAK,QAAQ,iBAAiB,MAAM,CAAC,GAAG,CAAC,UAAU;AACjD,UAAI,MAAM,SAAS,SAAS,EAAG,OAAM,eAAe;AACpD,UAAI,MAAM,SAAS,MAAM,EAAG,OAAM,gBAAgB;AAClD,UAAI,MAAM,SAAS,MAAM,KAAK,KAAK,aAAa,EAAG;AAEnD,WAAK;AAEL,YAAM,UAAU,QAAQ,QAAQ,OAAO,KAAK,KAAK;AACjD,UAAI,OAAO,YAAY,YAAY;AACjC,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AAED,YAAQ,gBAAgB,KAAK,IAAI;AAAA,EACnC;AACF;;;ACpCA,IAAM,aAAa;AACnB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAIf,IAAM,OAAO,CAAC,IAAa,KAAa,KAAc,WAAuB,gBAAsC,aAAmC;AAC3J,QAAM,UAAU,IAAI,MAAM,UAAU;AACpC,MAAI,CAAC,SAAS;AACZ,YAAQ,KAAK,4BAA4B,GAAG,EAAE;AAC9C;AAAA,EACF;AAEA,QAAM,WAAW,GAAG;AAEpB,QAAM,SAAS,GAAG;AAClB,QAAM,SAAS,IAAI,KAAK,EAAE;AAC1B,SAAO,aAAa,QAAQ,EAAE;AAC9B,SAAO,YAAY,EAAE;AAErB,QAAM,YAAY,QAAQ,CAAC,EAAE,KAAK;AAClC,MAAI,WAAW,QAAQ,CAAC,EAAE,KAAK,EAAE,QAAQ,eAAe,EAAE,EAAE,KAAK;AACjE,MAAI;AACJ,MAAI,qBAAqB;AACzB,MAAI;AACJ,MAAI;AAEJ,MAAI,UAAU;AACd,MAAI,SAAS,GAAG,aAAa,OAAO,KAAK,GAAG,aAAc,UAAU,MAAO,KAAK,GAAG,aAAc,UAAU,WAAY;AACvH,MAAI,QAAQ;AACV,OAAG,gBAAgB,OAAO;AAC1B,QAAI,YAAY,MAAO,UAAS,KAAK,UAAU,MAAM;AAAA,EACvD;AAEA,MAAI;AACJ,MAAK,QAAQ,SAAS,MAAM,aAAa,GAAI;AAC3C,eAAW,SAAS,QAAQ,eAAe,EAAE,EAAE,KAAK;AACpD,eAAW,MAAM,CAAC,EAAE,KAAK;AACzB,QAAI,MAAM,CAAC,GAAG;AACZ,oBAAc,MAAM,CAAC,EAAE,KAAK;AAAA,IAC9B;AAAA,EACF;AAEA,MAAK,QAAQ,SAAS,MAAM,aAAa,GAAI;AAC3C,0BAAsB,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AACrE,yBAAqB,SAAS,CAAC,MAAM;AAAA,EACvC;AAEA,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,QAAM,sBAAsB,CAAC,WAAgD;AAC3E,UAAM,MAAqB,oBAAI,IAAI;AACnC,UAAM,OAAkB,CAAC;AAEzB,QAAI,QAAQ,MAAM,GAAG;AACnB,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,aAAK,KAAK,mBAAmB,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAAA,MACjD;AAAA,IACF,WAAW,OAAO,WAAW,UAAU;AACrC,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,aAAK,KAAK,mBAAmB,KAAK,IAAI,GAAG,CAAC,CAAC;AAAA,MAC7C;AAAA,IACF,WAAW,SAAS,MAAM,GAAG;AAC3B,UAAI,IAAI;AACR,iBAAW,OAAO,QAAQ;AACxB,aAAK,KAAK,mBAAmB,KAAK,OAAO,GAAG,GAAG,KAAK,GAAG,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,CAAC,MAAM,GAAG;AAAA,EACnB;AAEA,QAAM,qBAAqB,CAAC,KAAoB,OAAY,OAAe,WAA6B;AACtG,UAAM,OAAY,CAAC;AACnB,QAAI,qBAAqB;AACvB,0BAAoB,QAAQ,CAAC,GAAG,MAAO,KAAK,CAAC,IAAI,MAAM,qBAAqB,IAAI,CAAC,CAAE;AAAA,IACrF,OAAO;AACL,WAAK,QAAQ,IAAI;AAAA,IACnB;AACA,QAAI,QAAQ;AACV,mBAAa,KAAK,QAAQ,IAAI;AAC9B,sBAAgB,KAAK,WAAW,IAAI;AAAA,IACtC,OAAO;AACL,mBAAa,KAAK,QAAQ,IAAI;AAAA,IAChC;AAEA,UAAM,WAAW,oBAAoB,KAAK,IAAI;AAC9C,UAAM,MAAM,SAAS,QAAQ,SAAS,OAAO,MAAM,IAAI;AACvD,QAAI,IAAI,KAAK,KAAK;AAClB,aAAS,MAAM;AACf,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAACC,MAAcC,SAAc;AAC9C,UAAM,QAAQ,IAAI,MAAM,EAAE,SAAS,IAAI,eAAeD,MAAK,iBAAiB,WAAW,WAAW,gBAAgB,SAAS,CAAC;AAC5H,UAAM,MAAMA,KAAI;AAChB,UAAM,OAAO,QAAQC,IAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM;AACf,UAAM,SAAS,QAAQ,IAAI,OAAO,SAAS;AAC3C,UAAM,oBAAoB;AAC1B,KAAC,WAAW,aAAa,IAAI,oBAAoB,MAAM;AACvD,QAAI,CAAC,SAAS;AACZ,eAAS,UAAU,IAAI,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AACnD,gBAAU;AAAA,IACZ,OAAO;AACL,eAASC,KAAI,GAAGA,KAAI,OAAO,QAAQA,MAAK;AACtC,YAAI,CAAC,cAAc,IAAI,OAAOA,EAAC,EAAE,GAAG,GAAG;AACrC,iBAAOA,EAAC,EAAE,OAAO;AAAA,QACnB;AAAA,MACF;AAEA,YAAM,aAAsB,CAAC;AAC7B,UAAI,IAAI,UAAU;AAClB,UAAI;AACJ,UAAI;AACJ,aAAO,KAAK;AACV,cAAM,WAAW,UAAU,CAAC;AAC5B,cAAM,WAAW,kBAAkB,IAAI,SAAS,GAAG;AACnD,YAAI;AACJ,YAAI,YAAY,MAAM;AAEpB,kBAAQ,WAAW,UAAU,YAAY,UAAU,UAAU,MAAM;AAAA,QACrE,OAAO;AAEL,kBAAQ,OAAO,QAAQ;AACvB,iBAAO,OAAO,MAAM,QAAQ,OAAO,SAAS,KAAK;AACjD,cAAI,aAAa,GAAG;AAElB,gBACE,OAAO,WAAW,CAAC,MAAM;AAAA,YAEzB,mBAAmB,WACnB;AACA,+BAAiB;AACjB,oBAAM,OAAO,QAAQ,YAAY,UAAU,UAAU,MAAM;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AACA,mBAAW,QAAS,YAAY,KAAM;AAAA,MACxC;AACA,eAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACnJO,SAAS,IAAI,IAAa,KAAa,KAAc,WAAuB,gBAAsC,UAAgC;AACvJ,QAAM,SAAS,GAAG;AAClB,QAAM,SAAS,IAAI,QAAQ,KAAK;AAEhC,SAAO,aAAa,QAAQ,EAAE;AAE9B,QAAM,WAAqB,CAAC,EAAE,KAAK,GAAG,CAAC;AAEvC,MAAI;AACJ,MAAI;AAEJ,SAAQ,SAAS,GAAG,oBAAqB;AACvC,cAAU;AAEV,QAAI,wBAAwB,QAAQ,OAAO,MAAM,OAAO,UAAU,wBAAwB,QAAQ,UAAU,IAAI;AAC9G,aAAO,YAAY,MAAM;AACzB,eAAS,KAAK,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC;AAAA,IAC5C,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,GAAG;AACpB,SAAO,YAAY,EAAE;AAErB,MAAI;AACJ,MAAI,oBAAoB;AAExB,QAAM,oBAAoB,MAAM;AAC9B,QAAI,OAAO;AACT,aAAO,aAAa,QAAQ,MAAM,OAAO;AACzC,YAAM,OAAO;AACb,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,OAAO,MAAM;AACf,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,EAAE,KAAAC,MAAK,IAAAC,IAAG,IAAI,SAAS,CAAC;AAE9B,UAAI,CAACD,QAAO,QAAQ,IAAI,OAAOA,IAAG,GAAG;AACnC,YAAI,MAAM,mBAAmB;AAC3B,4BAAkB;AAClB,kBAAQ,IAAI,MAAM,EAAE,SAASC,KAAI,eAAe,KAAK,iBAAiB,WAAW,WAAW,gBAAgB,SAAS,CAAC;AACtH,gBAAM,OAAO,QAAQ,MAAM;AAC3B,iBAAO,YAAY,MAAM;AACzB,8BAAoB;AAAA,QACtB;AAEA;AAAA,MACF;AAAA,IACF;AAEA,wBAAoB;AACpB,sBAAkB;AAAA,EACpB,CAAC;AAED,SAAO;AACT;;;AC1DA,IAAM,SAAS;AAER,IAAM,yBAAN,MAA6B;AAAA,EAClC;AAAA,EACA;AAAA,EACA,YAAiC,oBAAI,IAAI;AAAA,EAEzC,YAAY,EAAE,SAAS,QAAQ,GAAkC;AAC/D,SAAK,UAAU;AACf,SAAK,UAAU;AAEf,SAAK,UAAU;AAEf,SAAK,UAAU,QAAQ,CAAC,OAAO,eAAe;AAC5C,YAAM,oBAAoB,WAAW,MAAM,GAAG,EAAE,EAAE,KAAK;AAEvD,YAAM,QAAQ,CAAC,SAAS;AACtB,cAAM,SAAS,CAAC,MAAM,sBAAsB,QAAQ,KAAK,QAAQ,OAAO,KAAK,IAAI;AAEjF,gBAAQ,OAAO,MAAM;AACnB,eAAK,cAAc,gBAAgB,OAAO,CAAC;AAAA,QAC7C,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,YAAY;AACV,UAAM,cAAc,KAAK,QAAQ,YAAY,KAAK;AAClD,QAAI,aAAa,MAAM,MAAM,GAAG;AAC9B,YAAM,YAAY,YAAY,MAAM,wBAAwB,EAAE,OAAO,OAAO;AAC5E,UAAI,WAAW;AACb,YAAI,eAAe,KAAK;AAExB,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAM,WAAW,UAAU,CAAC;AAE5B,cAAI,SAAS,MAAM,kBAAkB,GAAG;AACtC,kBAAM,UAAU,SAAS,eAAe,QAAQ;AAEhD,gBAAI,MAAM,GAAG;AACX,mBAAK,QAAQ,YAAY,OAAO;AAAA,YAClC,OAAO;AACL,0BAAY,SAAS,YAAY;AAAA,YACnC;AAEA,2BAAe;AAEf,gBAAI,KAAK,UAAU,IAAI,QAAQ,GAAG;AAChC,mBAAK,UAAU,IAAI,QAAQ,EAAE,KAAK,OAAO;AAAA,YAC3C,OAAO;AACL,mBAAK,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC;AAAA,YACxC;AAAA,UACF,OAAO;AACL,kBAAM,UAAU,SAAS,eAAe,UAAU,CAAC,CAAC;AAEpD,gBAAI,MAAM,GAAG;AACX,mBAAK,QAAQ,YAAY,OAAO;AAAA,YAClC,OAAO;AACL,0BAAY,SAAS,YAAY;AAAA,YACnC;AAEA,2BAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS;AAAA,EAAC;AACZ;;;ACrEO,IAAM,gBAAN,MAAoB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,EAAE,SAAS,SAAS,WAAW,GAAyB;AAClE,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,kBAAkB,iBAAiB,KAAK,OAAO,EAAE;AAEtD,YAAQ,OAAO,KAAK,OAAO,KAAK,IAAI,CAAC;AAAA,EACvC;AAAA,EAEA,SAAS;AACP,UAAM,aAAa,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK,UAAU,CAAC;AAEvE,SAAK,QAAQ,MAAM,UAAU,aAAa,KAAK,kBAAkB;AAAA,EACnE;AACF;;;ACzBO,SAAS,UAAU,IAAa,KAAa,KAAc;AAChE,QAAM,SAAS,IAAI,QAAQ,WAAW;AACtC,KAAG,YAAY,MAAM;AAErB,QAAM,SAAS,SAAS,cAAc,GAAG;AACzC,MAAI,CAAC,QAAQ;AACX,YAAQ,KAAK,8BAA8B,GAAG,EAAE;AAChD;AAAA,EACF;AAEA,WAAS,MAAM;AACb,WAAO,YAAY,EAAE;AAErB,UAAM,WAAW,IAAI,iBAAiB,CAAC,kBAAkB;AACvD,oBAAc,QAAQ,CAAC,aAAa;AAClC,iBAAS,aAAa,QAAQ,CAAC,gBAAgB;AAC7C,cAAI,YAAY,SAAS,MAAM,GAAG;AAChC,eAAG,OAAO;AACV,qBAAS,WAAW;AAAA,UACtB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAED,aAAS,QAAQ,SAAS,MAAM,EAAE,WAAW,MAAM,SAAS,KAAK,CAAC;AAGlE,QAAI,MAAM;AAAA,MACR,SAAS;AAAA,MACT,eAAe;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AAGD,SAAO;AACT;;;AC5BA,SAAS,QAAQ,SAA+C;AAC9D,SAAO,mBAAmB;AAC5B;AAEA,SAAS,WAAW,SAAkD;AACpE,SAAO,mBAAmB;AAC5B;AAEA,SAAS,SAAS,SAAgD;AAChE,SAAO,mBAAmB;AAC5B;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,EAAE,SAAS,SAAS,WAAW,GAA0B;AACnE,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,aAAa;AAClB,SAAK,YAAY,QAAQ,aAAa,MAAM;AAG5C,QAAI,QAAQ,OAAO,GAAG;AACpB,cAAQ,KAAK,WAAW;AAAA,QACtB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,kBAAQ,iBAAiB,SAAS,MAAM;AACtC,kBAAM,QAAQ,KAAK,cAAc,WAAY,QAAQ,QAAQ,WAAW,QAAQ,KAAK,IAAI,IAAK,QAAQ;AACtG,oBAAQ,KAAK,QAAQ,OAAO,YAAY,KAAK;AAAA,UAC/C,CAAC;AACD;AAAA,QAEF,KAAK;AACH,kBAAQ,iBAAiB,UAAU,CAAC,MAAW;AAC7C,oBAAQ,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC,EAAE,cAAc,OAAO;AAAA,UACnE,CAAC;AACD;AAAA,QACF,KAAK;AACH,kBAAQ,iBAAiB,UAAU,CAAC,MAAW;AAC7C,gBAAI,EAAE,cAAc,SAAS;AAC3B,sBAAQ,KAAK,QAAQ,OAAO,YAAY,QAAQ,aAAa,OAAO,CAAC;AAAA,YACvE;AAAA,UACF,CAAC;AACD;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,GAAG;AACvB,cAAQ,iBAAiB,SAAS,MAAM;AACtC,gBAAQ,KAAK,QAAQ,OAAO,YAAY,QAAQ,KAAK;AAAA,MACvD,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,OAAO,GAAG;AACrB,cAAQ,iBAAiB,UAAU,MAAM;AACvC,gBAAQ,KAAK,QAAQ,OAAO,YAAY,QAAQ,KAAK;AAAA,MACvD,CAAC;AAAA,IACH;AAGA,YAAQ,OAAO,KAAK,mBAAmB,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA,EAEA,qBAAqB;AACnB,UAAM,QAAQ,QAAQ,KAAK,QAAQ,OAAO,KAAK,YAAY,KAAK,OAAO;AAEvE,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,cAAQ,KAAK,WAAW;AAAA,QACtB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,eAAK,QAAQ,QAAQ;AACrB;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,UAAU,CAAC,CAAC;AACzB;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,UAAU,KAAK,QAAQ,UAAU;AAC9C;AAAA,QACF;AACE;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,WAAW,KAAK,OAAO,GAAG;AAC5B,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAEA,QAAI,SAAS,KAAK,OAAO,GAAG;AAC1B,WAAK,QAAQ,QAAQ;AAAA,IACvB;AAAA,EACF;AACF;;;AChGA,IAAM,YAAuB,oBAAI,QAAQ;AACzC,IAAM,cAA8C,CAAC;AAE9C,SAAS,MAAS,QAAW,KAAkB;AACpD,QAAM,eAAe,YAAY,YAAY,SAAS,CAAC;AAEvD,MAAI,CAAC,aAAc;AAEnB,MAAI,aAAa,UAAU,IAAI,MAAM;AACrC,MAAI,CAAC;AACH,cAAU,IAAI,QAAS,aAAa,oBAAI,IAAI,CAAgB;AAE9D,MAAI,UAAU,WAAW,IAAI,GAAG;AAChC,MAAI,CAAC,QAAS,YAAW,IAAI,KAAM,UAAU,oBAAI,IAAoB,CAAE;AAEvE,MAAI,CAAC,QAAQ,IAAI,YAAY,GAAG;AAC9B,YAAQ,IAAI,YAAY;AACxB,iBAAa,KAAK,KAAK,OAAO;AAAA,EAChC;AACF;AAEO,SAAS,QAAQ,QAAa,KAAkB;AACrD,QAAM,aAAa,UAAU,IAAI,MAAM;AACvC,MAAI,CAAC,WAAY;AAEjB,QAAM,YAAY,oBAAI,IAAoB;AAE1C,aAAW,IAAI,GAAG,GAAG,QAAQ,CAACC,YAAW;AACvC,cAAU,IAAIA,OAAM;AAAA,EACtB,CAAC;AAED,YAAU,QAAQ,GAAG;AACvB;AAEA,SAASC,MAAKD,SAAwB;AACpC,MAAIA,QAAO,OAAQ,SAAQA,OAAM;AACjC,EAAAA,QAAO,SAAS;AAClB;AAEA,SAAS,MAAMA,SAAwB;AACrC,MAAI,CAACA,QAAO,QAAQ;AAClB,IAAAA,QAAO,SAAS;AAChB,QAAIA,OAAM;AAAA,EACZ;AACF;AAEA,SAAS,IAAIA,SAAiC;AAC5C,MAAI,CAACA,QAAO,OAAQ;AAEpB,MAAI,YAAY,SAASA,OAAM,EAAG;AAElC,UAAQA,OAAM;AAEd,MAAI;AAEJ,MAAI;AACF,gBAAY,KAAKA,OAAM;AACvB,UAAMA,QAAO,QAAQ;AAAA,EACvB,UAAE;AACA,gBAAY,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,QAAQA,SAAwB;AACvC,QAAM,EAAE,KAAK,IAAIA;AAEjB,MAAI,KAAK,QAAQ;AACf,eAAWE,QAAO,MAAM;AACtB,MAAAA,KAAI,OAAOF,OAAM;AAAA,IACnB;AAAA,EACF;AAEA,OAAK,SAAS;AAChB;AAEO,SAAS,OAAO,SAAqB,OAAsB,CAAC,GAAG;AACpE,QAAM,EAAE,KAAK,IAAI;AACjB,QAAM,YAA4B;AAAA,IAChC,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,MAAM,CAAC;AAAA,EACT;AAEA,MAAI,SAAS;AAEb,SAAO;AAAA,IACL,OAAO,MAAM;AACX,YAAM,SAAS;AAAA,IACjB;AAAA,IACA,MAAM,MAAM;AACV,MAAAC,MAAK,SAAS;AAAA,IAChB;AAAA,IACA,QAAQ,MAAM;AACZ,UAAI,UAAU,QAAQ;AACpB,QAAAA,MAAK,SAAS;AAAA,MAChB,OAAO;AACL,cAAM,SAAS;AAAA,MACjB;AACA,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACF;;;AClHA,IAAM,YAAY,OAAO,UAAU;AAO5B,SAAS,WAAc,OAAsC;AAClE,SAAO,SAAS,KAAK,KAAK,MAAM,SAAS;AAC3C;;;ACRO,IAAM,OAAO,OAAO,KAAK;AAOzB,SAAS,MAAS,OAAiC;AACxD,SAAO,SAAS,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI;AACxC;AAEO,SAAS,IAAO,QAAW,MAA8B;AAC9D,MAAI,SAAS,KAAK,GAAG;AAEnB,WAAO,MAAM,KAAK,IAAK,QAAoB,SAAS,KAAK;AAAA,EAC3D;AAEA,QAAM,SAAS,EAAE,OAAO,CAAC,IAAI,GAAG,KAAK;AAErC,SAAO,IAAI,MAAM,QAAQ;AAAA,IACvB,IAAI,QAAgB,KAAsB,UAAe;AACvD,YAAM,MAAM,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAC7C,YAAM,QAAQ,OAAO;AACrB,aAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAgB,KAAsBE,QAAgB;AACxD,YAAM,WAAW,OAAO,GAAG;AAC3B,UAAI,aAAaA,QAAO;AACtB,cAAM,UAAU,QAAQ,IAAI,QAAQ,KAAKA,MAAK;AAC9C,YAAI,SAAS;AACX,kBAAQ,QAAQ,OAAO;AAAA,QACzB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;;;ACpCA,IAAM,YAAY,OAAO,UAAU;AAU5B,SAAS,SAAY,OAAuB;AAEjD,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO,IAAI,KAAK;AACtC,MAAI,MAAM,SAAS,EAAG,QAAO;AAE7B,QAAM,SAAS,IAAI;AAEnB,SAAO,KAAK,KAAK,EAAE,QAAQ,CAAC,QAAQ;AAClC,QAAI,SAAS,MAAM,GAAG,CAAC,GAAG;AACxB,YAAM,GAAG,IAAI,SAAS,MAAM,GAAG,CAAC;AAAA,IAClC;AAAA,EACF,CAAC;AAED,SAAO,IAAI,MAAM,OAAO,qBAAqB,CAAC;AAChD;AAEA,SAAS,uBAAuB;AAC9B,SAAO;AAAA,IACL,eAAe,QAAgB,KAAsB;AACnD,YAAM,MAAM,QAAQ,IAAI,QAAQ,GAAG;AACnC,YAAM,SAAS,QAAQ,eAAe,QAAQ,GAAG;AACjD,UAAI,IAAK,SAAQ,QAAQ,GAAG;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAgB,KAAsB;AACxC,YAAM,QAAQ,GAAG;AACjB,aAAO,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAChC;AAAA,IACA,IAAI,QAAgB,KAAsB,OAAgB;AACxD,UAAI,OAAO,GAAG,MAAM,MAAO,QAAO;AAClC,UAAI,SAAS;AAEb,UAAI,SAAS,KAAK,KAAK,CAAC,SAAS,OAAO,GAAG,CAAC,GAAG;AAC7C,iBAAS;AAAA,MACX;AAEA,UAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,GAAG;AACnC,gBAAQ,QAAQ,GAAG;AAAA,MACrB;AAEA,UAAI,QAAQ;AACV,eAAO,GAAG,IAAI,SAAS,OAAO,GAAG,CAAC;AAAA,MACpC;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5BO,SAAS,QAAQ,KAAa,OAAgB;AACnD,MAAI,CAAC,QAAQ,gBAAgB;AAC3B,YAAQ,KAAK,2CAA2C;AAAA,EAC1D;AAEA,UAAQ,eAAe,SAAS,IAAI,KAAK,KAAK;AAChD;AAEO,SAAS,OAAO,KAAa;AAClC,MAAI,CAAC,QAAQ,gBAAgB;AAC3B,YAAQ,KAAK,0CAA0C;AAAA,EACzD;AAEA,MAAI,IAAI,QAAQ;AAEhB,SAAO,GAAG;AACR,QAAI,EAAE,SAAS,IAAI,GAAG,GAAG;AACvB,aAAO,EAAE,SAAS,IAAI,GAAG;AAAA,IAC3B;AAEA,QAAI,EAAE;AAAA,EACR;AAEA,SAAO;AACT;AAEO,IAAM,MAAN,MAAU;AAAA,EACf;AAAA,EACA,WAAW,oBAAI,IAAuB;AAAA,EACtC,UAAU,oBAAI,IAAY;AAAA,EAE1B,SAAS,MAAc,WAAsB;AAC3C,SAAK,SAAS,IAAI,MAAM,SAAS;AAAA,EACnC;AAAA,EAEA,IAAI,WAAmB,QAAe;AACpC,SAAK,QAAQ,IAAI,MAAM;AACvB,WAAO,IAAI,MAAM,GAAG,MAAM;AAAA,EAC5B;AAAA,EAEA,aAAa,KAAa;AACxB,WAAO,KAAK,SAAS,IAAI,GAAG;AAAA,EAC9B;AAAA,EAEA,MAAM,WAAsB,SAA+B,QAAQ,QAA6B,CAAC,GAAG;AAClG,UAAM,OAAO,OAAO,WAAW,WAAY,SAAS,cAAc,MAAM,IAAoB;AAC5F,UAAM,UAAU,KAAK,MAAM;AAC3B,SAAK,MAAM,UAAU;AACrB,SAAK,YAAY,KAAK,OAAO,WAAW,MAAM,OAAO,IAAI;AACzD,SAAK,MAAM,UAAU;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,OAAO,WAAsB,QAAqB,OAA4B,SAAS,OAAO;AACpG,UAAM,gBAAgB,cAAc,EAAE,KAAK,KAAK,CAAC;AAEjD,QAAI,OAAO;AACT,oBAAc,QAAQ,SAAS,KAAK;AACpC,yBAAmB,cAAc,KAAK;AAAA,IACxC;AAEA,kBAAc,MAAM,SAAS;AAC7B,kBAAc,MAAM,cAAc;AAElC,UAAM,QAAQ,IAAI,MAAM;AAAA,MACtB,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,UAAU;AACR,SAAK,UAAU,SAAS;AAAA,EAC1B;AACF;AAkBO,SAAS,cAAc,EAAE,eAAe,KAAAC,KAAI,GAAkC;AACnF,QAAM,UAAmB;AAAA,IACvB,KAAKA,OAAMA,OAAM,iBAAiB,cAAc,MAAM,cAAc,MAAM;AAAA,IAC1E,OAAO,gBAAgB,cAAc,QAAQ,SAAS,CAAC,CAAC;AAAA,IACxD,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,WAAW,gBAAgB,cAAc,YAAY,CAAC;AAAA,IACtD,QAAQ,CAAC,YAAwB;AAC/B,YAAM,IAAI,OAAQ,OAAO;AACzB,cAAQ,QAAQ,KAAK,CAAC;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,sBAAsB,CAAC,KAAc,OAAO,CAAC,MAAe;AACvE,QAAM,cAAc,IAAI;AACxB,QAAM,cAAc,OAAO,OAAO,WAAW;AAC7C,SAAO,iBAAiB,aAAa,OAAO,0BAA0B,IAAI,CAAC;AAC3E,MAAI;AACJ,UAAQ;AAAA,IACN,IAAI,MAAM,aAAa;AAAA,MACrB,IAAI,QAAQ,KAAK,KAAK,UAAU;AAG9B,YAAI,aAAa,SAAS,CAAC,OAAO,eAAe,GAAG,GAAG;AACrD,iBAAO,QAAQ,IAAI,aAAa,KAAK,GAAG;AAAA,QAC1C;AACA,eAAO,QAAQ,IAAI,QAAQ,KAAK,KAAK,QAAQ;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,qBAAmB,KAAK;AAExB,QAAM,MAAe;AAAA,IACnB,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,IAAI;AAAA,MACP,GAAG;AAAA,IACL;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAA4B;AACtD,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,QAAI,OAAO,MAAM,GAAG,MAAM,YAAY;AACpC,YAAM,GAAG,IAAI,MAAM,GAAG,EAAE,KAAK,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,OAA4B,cAAmC;AACjF,QAAM,SAAS,CAAC;AAEhB,SAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,gBAAgB;AACjD,UAAM,YAAY,MAAM,eAAe,WAAW,IAAI,MAAM,WAAW,IAAI,aAAa,WAAW,GAAG;AAEtG,WAAO,WAAW,IAAI,SAAS,OAAO,cAAc,aAAa,UAAU,IAAI,SAAS;AAAA,EAC1F,CAAC;AAED,SAAO;AACT;AAYO,IAAM,UAAmB,EAAE,gBAAgB,OAAU;AAcrD,IAAM,QAAN,MAAY;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,oBAAI,IAAiB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,MAAoB;AAC9B,SAAK,aAAa,KAAK,mBAAmB;AAC1C,SAAK,uBAAuB,KAAK;AAEjC,QAAI,KAAK,WAAW;AAClB,cAAQ,iBAAiB;AACzB,WAAK,UAAU,gBAAgB,KAAK,UAAU,QAAQ;AAAA,IACxD,OAAO;AACL,UAAI,KAAK,YAAY;AACnB,aAAK,UAAW,KAAK,QAAgC,QAAQ,UAAU,IAAI;AAAA,MAC7E,WAAW,OAAO,KAAK,YAAY,UAAU;AAC3C,aAAK,UAAU,gBAAgB,KAAK,OAAO;AAAA,MAC7C,OAAO;AACL,aAAK,UAAU,KAAK,QAAQ,UAAU,IAAI;AAC1C,aAAK,QAAQ,YAAY,KAAK,OAAO;AAAA,MACvC;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACf,WAAK,UAAU,KAAK;AAAA,IACtB,OAAO;AACL,WAAK,gBAAgB,KAAK,gBAAgB,KAAK,gBAAgB,cAAc,CAAC,CAAC;AAC/E,WAAK,cAAc,OAAO,KAAK,IAAI;AACnC,WAAK,UAAU,cAAc,EAAE,eAAe,KAAK,cAAc,CAAC;AAAA,IACpE;AAEA,QAAI,KAAK,WAAW;AAClB,WAAK,iBAAiB,WAAW,KAAK,kBAAkB,CAAC,GAAG,KAAK,UAAU,SAAS,CAAC,CAAC;AAEtF,UAAI,KAAK,UAAU,MAAM;AACvB,aAAK,QAAQ,QAAQ;AAAA,UACnB,GAAI,KAAK,UAAU,KAAK,KAAK,cAAc,KAAK,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAEA,SAAK,UAAU,QAAQ,CAAC,SAAS;AAC/B,UAAI,KAAK,QAAQ;AACf,aAAK,QAAQ,OAAO,MAAM;AACxB,cAAI;AAEJ,cAAI,KAAK,UAAU;AACjB,kBAAM,cAAc,QAAQ,KAAK,cAAc,OAAO,KAAK,aAAa;AACxE,gBAAI,SAAS,WAAW,GAAG;AACzB,qBAAO,KAAK,WAAW,EAAE,QAAQ,CAAC,QAAQ;AACxC,2BAAW,YAAY,GAAG;AAC1B,qBAAK,QAAQ,KAAK,QAAQ;AAAA,cAC5B,CAAC;AAAA,YACH;AAAA,UACF,OAAO;AACL,uBAAW,KAAK,WAAW,QAAQ,KAAK,cAAc,OAAO,KAAK,aAAa,IAAI,QAAQ,KAAK,cAAc,OAAO,KAAK,GAAG;AAC7H,iBAAK,QAAQ,KAAK,eAAe,QAAQ;AAAA,UAC3C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,SAAK,QAAQ,QAAQ,cAAc,KAAK,OAAO;AAC/C,SAAK,QAAQ,YAAY,KAAK,aAAa,CAAC;AAG5C,SAAK,QAAQ,MAAM,QAAQ,CAAC,SAAS;AACnC,YAAM,WAAW,KAAK,QAAQ,UAAU,KAAK,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI;AAElF,UAAI,UAAU;AACZ,cAAM,mBAAmB,SAAS,KAAK,QAAQ,UAAU,IAAI;AAC7D,aAAK,KAAK,YAAY,gBAAgB;AAAA,MACxC;AAAA,IACF,CAAC;AAED,SAAK,QAAQ,MAAM,SAAS;AAC5B,SAAK,QAAQ,MAAM,cAAc;AAEjC,SAAK,KAAK,SAAS,KAAK,OAAO;AAE/B,QAAI,KAAK,WAAW;AAClB,UAAI,KAAK,oBAAoB,WAAW;AACtC,YAAI,KAAK,mBAAmB,aAAa;AACvC,eAAK,QAAQ,YAAY,KAAK,OAAO;AAAA,QACvC;AAAA,MACF,OAAO;AACL,YAAI,KAAK,mBAAmB,aAAa;AACvC,eAAK,QAAQ,gBAAgB,KAAK,OAAO;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,MAAc,OAAgB;AACpC,QAAI,MAAM,KAAK,eAAe,IAAI,CAAC,GAAG;AACpC,WAAK,eAAe,IAAI,EAAE,QAAQ;AAAA,IACpC,OAAO;AACL,WAAK,eAAe,IAAI,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,OAAO,QAAiB,SAAsB,MAAM;AAClD,QAAI,KAAK,YAAY;AACnB,UAAI,KAAK,OAAO;AAEd,YAAI,OAAoB,KAAK;AAC7B,YAAI;AAEJ,eAAO,MAAM;AACX,iBAAO,KAAK;AACZ,iBAAO,aAAa,MAAM,MAAM;AAEhC,cAAI,SAAS,KAAK,KAAK;AACrB;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA,MACF,OAAO;AACL,aAAK,QAAQ,IAAI,KAAK,EAAE;AACxB,aAAK,MAAM,IAAI,KAAK,EAAE;AAEtB,eAAO,aAAa,KAAK,KAAK,MAAM;AACpC,eAAO,aAAa,KAAK,OAAO,KAAK,GAAG;AACxC,eAAO,aAAa,KAAK,SAAS,KAAK,GAAG;AAAA,MAC5C;AAAA,IACF,OAAO;AACL,aAAO,aAAa,KAAK,SAAS,MAAM;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,SAAS;AACP,QAAI,KAAK,eAAe;AACtB,YAAM,IAAI,KAAK,cAAc,OAAO,QAAQ,IAAI;AAEhD,UAAI,IAAI,IAAI;AACV,aAAK,cAAc,OAAO,OAAO,GAAG,CAAC;AAAA,MACvC;AAAA,IACF;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,SAAS,KAAK,MAAM;AAC1B,UAAI,OAAoB,KAAK;AAC7B,UAAI;AAEJ,aAAO,MAAM;AACX,eAAO,KAAK;AACZ,eAAO,YAAY,IAAI;AAEvB,YAAI,SAAS,KAAK,KAAK;AACrB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AAEL,WAAK,QAAQ,OAAO;AAAA,IACtB;AAEA,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,WAAW;AACT,SAAK,QAAQ,OAAO,QAAQ,CAAC,UAAU;AACrC,YAAM,SAAS;AAAA,IACjB,CAAC;AAED,SAAK,QAAQ,QAAQ,QAAQ,IAAI;AAAA,EACnC;AACF;AAEA,SAAS,YAAY,SAAkB,SAAkB;AACvD,SAAO,CAAC,CAAC,QAAQ,IAAI,aAAa,QAAQ,QAAQ,YAAY,CAAC;AACjE;AAEA,SAAS,KAAK,MAAY,SAAkB;AAC1C,MAAI,OAAO,IAAI,GAAG;AAChB,QAAI,uBAAuB,EAAE,SAAS,MAAM,QAAQ,CAAC;AACrD;AAAA,EACF;AAEA,MAAI,UAAU,IAAI,GAAG;AACnB,QAAI;AAEJ,QAAI,YAAY,MAAM,OAAO,GAAG;AAC9B,YAAM,YAAY,QAAQ,IAAI,aAAa,KAAK,QAAQ,YAAY,CAAC;AAErE,YAAM,WAAW,MAAM,KAAK,KAAK,UAAU,EACxC,OAAO,CAAC,SAAS,aAAa,KAAK,IAAI,KAAK,aAAa,KAAK,IAAI,KAAM,cAAc,KAAK,IAAI,KAAK,uBAAuB,gBAAgB,KAAK,IAAI,GAAG,SAAS,CAAE,EAClK,IAAI,CAAC,UAAU;AAAA,QACd,UAAU,aAAa,KAAK,IAAI;AAAA,QAChC,UAAU,aAAa,KAAK,IAAI;AAAA,QAChC,QAAQ,KAAK,KAAK,SAAS,MAAM;AAAA,QACjC,cAAc,KAAK;AAAA,QACnB,eAAe,gBAAgB,KAAK,IAAI;AAAA,QACxC,KAAK,KAAK;AAAA,QACV,OAAO,aAAa,KAAK,IAAI,IAAI,QAAQ,QAAQ,OAAO,gBAAgB,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ,QAAQ,QAAQ,OAAO,KAAK,KAAK,IAAI;AAAA,MAC1I,EAAE;AAEJ,YAAM,iBAAiB,SAAS,OAAO,CAAC,KAAK,EAAE,UAAU,UAAU,eAAe,MAAM,MAAM;AAC5F,YAAI,UAAU;AACZ,gBAAM,SAAS,QAAQ,QAAQ,OAAO,aAAa;AACnD,cAAI,SAAS,MAAM,EAAG,QAAO,OAAO,KAAK,MAAM;AAAA,QACjD,WAAW,UAAU;AACnB,cAAI,aAAa,IAAI,QAAQ,QAAQ,OAAO,aAAa;AAAA,QAC3D,OAAO;AACL,cAAI,aAAa,IAAI;AAAA,QACvB;AACA,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AAEL,UAAK,MAAM,wBAAwB,MAAM,WAAW,GAAI;AACtD,eAAO,UAAU,MAAM,KAAK,OAAO;AAAA,MACrC;AAEA,UAAK,MAAM,wBAAwB,MAAM,KAAK,GAAI;AAChD,eAAO,IAAI,MAAM,KAAK,SAAS,WAAW,gBAAgB,QAAQ;AAAA,MACpE;AAEA,UAAK,MAAM,wBAAwB,MAAM,MAAM,GAAI;AACjD,eAAO,KAAK,MAAM,KAAK,SAAS,WAAW,gBAAgB,QAAQ;AAAA,MACrE;AAEA,UAAK,MAAM,wBAAwB,MAAM,OAAO,GAAI;AAClD,YAAI,cAAc,EAAE,SAAS,MAAM,SAAS,YAAY,IAAI,CAAC;AAAA,MAC/D;AAEA,YAAM,YAAY,kBAAkB,IAAI;AAExC,YAAM,QAAQ,IAAI,MAAM;AAAA,QACtB,SAAS;AAAA,QACT,eAAe;AAAA,QACf;AAAA,QACA,iBAAiB;AAAA,QACjB,sBAAsB,QAAQ;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO,MAAM;AAAA,IACf;AAEA,QAAK,MAAM,wBAAwB,MAAM,WAAW,GAAI;AACtD,aAAO,UAAU,MAAM,KAAK,OAAO;AAAA,IACrC;AAEA,QAAK,MAAM,wBAAwB,MAAM,KAAK,GAAI;AAChD,aAAO,IAAI,MAAM,KAAK,OAAO;AAAA,IAC/B;AAEA,QAAK,MAAM,wBAAwB,MAAM,MAAM,GAAI;AACjD,aAAO,KAAK,MAAM,KAAK,OAAO;AAAA,IAChC;AAEA,QAAK,MAAM,wBAAwB,MAAM,MAAM,GAAI;AACjD,cAAQ,MAAM,GAAG,EAAE,QAAQ;AAAA,IAC7B;AAEA,QAAK,MAAM,wBAAwB,MAAM,QAAQ,GAAI;AACnD,UAAI,eAAe,EAAE,SAAS,MAAM,SAAS,YAAY,IAAI,CAAC;AAAA,IAChE;AAEA,QAAK,MAAM,wBAAwB,MAAM,OAAO,GAAI;AAClD,UAAI,cAAc,EAAE,SAAS,MAAM,SAAS,YAAY,IAAI,CAAC;AAAA,IAC/D;AAEA,UAAM,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,SAAS;AAC5C,UAAI,gBAAgB,KAAK,IAAI,GAAG;AAC9B,YAAI,mBAAmB,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAAA,MACzD;AAEA,UAAI,iBAAiB,KAAK,IAAI,GAAG;AAC/B,YAAI,eAAe,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAAA,MACrD;AAAA,IACF,CAAC;AAED,iBAAa,MAAM,OAAO;AAAA,EAC5B;AACF;AAEA,SAAS,aAAa,MAAY,SAAkB;AAClD,MAAI,QAAQ,KAAK;AAEjB,SAAO,OAAO;AACZ,YAAQ,KAAK,OAAO,OAAO,KAAK,MAAM;AAAA,EACxC;AACF;AAEA,IAAM,gBAA0C,CAAC;AAE1C,SAAS,QAAQ,OAAY,KAAa,IAAW;AAC1D,MAAI,CAAC,IAAI,KAAK,EAAG,QAAO;AACxB,SAAO,QAAQ,OAAO,qBAAqB,IAAI,KAAK,CAAC,uBAAuB,EAAE;AAChF;AAEO,SAAS,QAAQ,OAAY,KAAa,OAAgB;AAC/D,UAAQ,OAAO,UAAU,WAAW,IAAI,KAAK,MAAM;AACnD,SAAO,QAAQ,OAAO,sBAAsB,IAAI,KAAK,CAAC,mDAAmD,KAAK,kBAAkB,KAAK,KAAK,MAAM,KAAK;AACvJ;AAEA,SAAS,QAAQ,OAAY,KAAa,IAAW,WAAW,MAAM;AACpE,QAAM,WAAW,WAAW,YAAY,KAAK,IAAI;AACjD,QAAM,KAAK,cAAc,GAAG,MAAM,cAAc,GAAG,IAAI,WAAW,GAAG;AAErE,MAAI;AACF,WAAO,GAAG,UAAU,EAAE;AAAA,EACxB,SAAS,GAAG;AACV,YAAQ,KAAK,iCAAiC,GAAG,IAAI;AACrD,YAAQ,MAAM,CAAC;AAAA,EACjB;AACF;AAGA,SAAS,WAAW,KAAa;AAC/B,MAAI;AACF,WAAO,IAAI,SAAS,SAAS,OAAO,eAAe,GAAG,GAAG;AAAA,EAC3D,SAAS,GAAG;AACV,YAAQ,MAAM,GAAI,EAAY,OAAO,mBAAmB,GAAG,EAAE;AAC7D,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACF;AAGA,SAAS,YAAY,OAAiB;AACpC,QAAM,SAAS,CAAC;AAEhB,aAAW,OAAO,OAAO;AACvB,QAAI,MAAM,eAAe,GAAG,GAAG;AAE7B,UAAI,MAAM,MAAM,GAAG,CAAC,GAAG;AACrB,eAAO,GAAG,IAAI,MAAM,GAAG,EAAE;AAAA,MAC3B,OAAO;AACL,eAAO,GAAG,IAAI,MAAM,GAAG;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAsKA,IAAM,UAAU;AAAA,EACd,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,OAAO;AACL,UAAM,QAAQ,IAAI,CAAC;AACnB,UAAM,QAAQ,SAAS,EAAE,OAAO,OAAO,CAAC;AACxC,UAAM,YAAY,MAAM,MAAM;AAC9B,UAAM,YAAY,MAAM,MAAM;AAE9B,gBAAY,MAAM;AAChB,YAAM,QAAQ,MAAM,UAAU,SAAS,UAAU;AAAA,IACnD,GAAG,GAAG;AAEN,WAAO,EAAE,OAAO,WAAW,WAAW,MAAM;AAAA,EAC9C;AACF;AAEA,IAAM,MAAM,IAAI,IAAI;AACpB,IAAI,MAAM,SAAS,MAAM;", - "names": ["node", "element", "_", "ctx", "ref", "i", "exp", "el", "effect", "stop", "ref", "value", "app"] + "sourcesContent": ["import { Component } from \".\";\n\nexport function stringToElement(template: string): Element {\n const parser = new DOMParser();\n const doc = parser.parseFromString(template, \"text/html\");\n return doc.body.firstChild as Element;\n}\n\nexport const isText = (node: Node): node is Text => {\n return node.nodeType === Node.TEXT_NODE;\n};\n\nexport const isTemplate = (node: Node): node is HTMLTemplateElement => {\n return node.nodeName === \"TEMPLATE\";\n};\n\nexport const isElement = (node: Node): node is Element => {\n return node.nodeType === Node.ELEMENT_NODE;\n};\n\nexport function isObject(value: any): value is object {\n return value !== null && typeof value === \"object\";\n}\n\nexport function isArray(value: any): value is any[] {\n return Array.isArray(value);\n}\n\nexport function checkAndRemoveAttribute(el: Element, attrName: string): string | null {\n // Attempt to get the attribute value\n const attributeValue = el.getAttribute(attrName);\n\n // If attribute exists, remove it from the element\n if (attributeValue !== null) {\n el.removeAttribute(attrName);\n }\n\n // Return the value of the attribute or null if not present\n return attributeValue;\n}\n\nexport interface Slot {\n node: Element;\n name: string;\n}\n\nexport interface Template {\n targetSlotName: string;\n node: HTMLTemplateElement;\n}\n\nexport function findSlotNodes(element: Element): Slot[] {\n const slots: Slot[] = [];\n\n const findSlots = (node: Element) => {\n Array.from(node.childNodes).forEach((node) => {\n if (isElement(node)) {\n if (node.nodeName === \"SLOT\") {\n slots.push({ node, name: node.getAttribute(\"name\") || \"default\" });\n }\n\n if (node.hasChildNodes()) {\n findSlots(node);\n }\n }\n });\n };\n\n findSlots(element);\n\n return slots;\n}\n\nexport function findTemplateNodes(element: Element) {\n const templates: Template[] = [];\n\n const findTemplates = (element: Element) => {\n let defaultContentNodes: Node[] = [];\n\n Array.from(element.childNodes).forEach((node) => {\n if (isElement(node) || isText(node)) {\n if (isElement(node) && node.nodeName === \"TEMPLATE\" && isTemplate(node)) {\n templates.push({ targetSlotName: node.getAttribute(\"slot\") || \"\", node });\n } else {\n // Capture non-template top-level nodes and text nodes for default slot\n defaultContentNodes.push(node);\n }\n }\n });\n\n if (defaultContentNodes.length > 0) {\n // Create a template element with a default slot\n const defaultTemplate = document.createElement(\"template\");\n defaultTemplate.setAttribute(\"slot\", \"default\");\n\n defaultContentNodes.forEach((node) => {\n defaultTemplate.content.appendChild(node);\n });\n\n templates.push({ targetSlotName: \"default\", node: defaultTemplate });\n }\n };\n\n findTemplates(element);\n\n return templates;\n}\n\nexport const nextTick = async (f?: Function) => {\n await new Promise((r) =>\n setTimeout((_) =>\n requestAnimationFrame((_) => {\n f && f();\n r();\n }),\n ),\n );\n};\n\nexport function html(strings: TemplateStringsArray, ...values: any[]): string {\n // List of valid self-closing tags in HTML\n const selfClosingTags = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"link\", \"meta\", \"param\", \"source\", \"track\", \"wbr\"];\n\n // Join the strings and values into a single template\n let result = strings.reduce((acc, str, i) => acc + str + (values[i] || \"\"), \"\");\n\n // Match non-HTML valid self-closing tags\n result = result.replace(/<([a-zA-Z][^\\s/>]*)\\s*([^>]*?)\\/>/g, (match, tagName, attributes) => {\n // If the tag is a valid self-closing tag, return it as is\n if (selfClosingTags.includes(tagName.toLowerCase())) {\n return match;\n }\n\n // Return the tag as an open/close tag preserving attributes\n return `<${tagName} ${attributes}>`;\n });\n\n return result;\n}\n\nexport function toDisplayString(value: unknown) {\n return value == null ? \"\" : isObject(value) ? JSON.stringify(value, null, 2) : String(value);\n}\n\nexport function insertAfter(newNode: Node, existingNode: Node) {\n if (existingNode.nextSibling) {\n existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);\n } else {\n existingNode?.parentNode?.appendChild(newNode);\n }\n}\n\nexport function isPropAttribute(attrName: string) {\n if (attrName.startsWith(\".\")) {\n return true;\n }\n\n if (attrName.startsWith(\"{\") && attrName.endsWith(\"}\")) {\n return true;\n }\n\n return false;\n}\n\nexport function isSpreadProp(attr: string) {\n return attr.startsWith(\"...\");\n}\n\nexport function isMirrorProp(attr: string) {\n return attr.startsWith(\"{\") && attr.endsWith(\"}\");\n}\n\nexport function isRegularProp(attr: string) {\n return attr.startsWith(\".\");\n}\n\nexport function isEventAttribute(attrName: string) {\n return attrName.startsWith(\"@\");\n}\n\nexport function componentHasPropByName(name: string, component: Component) {\n return Object.keys(component?.props ?? {}).some((prop) => prop === name);\n}\n\nexport function extractAttributeName(attrName: string) {\n return attrName\n .replace(/^\\.\\.\\./, \"\")\n .replace(/^\\./, \"\")\n .replace(/^{/, \"\")\n .replace(/}$/, \"\")\n .replace(/:bind$/, \"\");\n}\n\nfunction dashToCamel(str: string) {\n return str.toLowerCase().replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n}\n\nexport function extractPropName(attrName: string) {\n return dashToCamel(extractAttributeName(attrName));\n}\n\nexport function classNames(_: any) {\n const classes = [];\n for (let i = 0; i < arguments.length; i++) {\n const arg = arguments[i];\n if (!arg) continue;\n const argType = typeof arg;\n if (argType === \"string\" || argType === \"number\") {\n classes.push(arg);\n } else if (Array.isArray(arg)) {\n if (arg.length) {\n const inner = classNames.apply(null, arg);\n if (inner) {\n classes.push(inner);\n }\n }\n } else if (argType === \"object\") {\n if (arg.toString === Object.prototype.toString) {\n for (let key in arg) {\n if (Object.hasOwnProperty.call(arg, key) && arg[key]) {\n classes.push(key);\n }\n }\n } else {\n classes.push(arg.toString());\n }\n }\n }\n return classes.join(\" \");\n}\n", "import { Context, evalGet } from \"..\";\nimport { classNames, extractAttributeName } from \"../util\";\n\ninterface AttributeDirectiveOptions {\n element: Element;\n context: Context;\n attr: Attr;\n}\n\ninterface Is {\n sameNameProperty: boolean;\n bound: boolean;\n spread: boolean;\n componentProp: boolean;\n}\n\nexport class AttributeDirective {\n element: Element;\n context: Context;\n expression: string;\n attr: Attr;\n extractedAttributeName: string;\n\n previousClasses: string[] = [];\n previousStyles: { [key: string]: string } = {};\n\n is: Is = {\n sameNameProperty: false,\n bound: false,\n spread: false,\n componentProp: false,\n };\n\n constructor({ element, context, attr }: AttributeDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = attr.value;\n this.attr = attr;\n this.extractedAttributeName = extractAttributeName(attr.name);\n\n this.is = {\n sameNameProperty: attr.name.startsWith(\"{\") && attr.name.endsWith(\"}\"),\n bound: attr.name.includes(\":bind\"),\n spread: attr.name.startsWith(\"...\"),\n componentProp: false,\n };\n\n if (this.is.sameNameProperty) {\n this.expression = this.extractedAttributeName;\n }\n\n if (this.is.spread) {\n this.expression = this.extractedAttributeName;\n }\n\n element.removeAttribute(attr.name);\n\n if (this.is.bound) {\n context.effect(this.update.bind(this));\n } else {\n this.update();\n }\n }\n\n update() {\n let value = evalGet(this.context.scope, this.expression);\n\n if (this.is.spread && typeof value === \"object\") {\n for (const [key, val] of Object.entries(value)) {\n this.element.setAttribute(key, String(val));\n }\n } else if ((typeof value === \"object\" || Array.isArray(value)) && this.extractedAttributeName === \"class\") {\n value = classNames(value);\n const next = value.split(\" \");\n\n // If we now have classes that are not already on the element, add them now.\n // Remove classes that are no longer on the element.\n const diff = next.filter((c: string) => !this.previousClasses.includes(c)).filter(Boolean);\n const rm = this.previousClasses.filter((c) => !next.includes(c));\n\n diff.forEach((c: string) => {\n this.previousClasses.push(c);\n this.element.classList.add(c);\n });\n\n rm.forEach((c) => {\n this.previousClasses = this.previousClasses.filter((addedClass) => addedClass !== c);\n this.element.classList.remove(c);\n });\n } else if (typeof value === \"object\" && this.extractedAttributeName === \"style\") {\n const next = Object.keys(value);\n const rm = Object.keys(this.previousStyles).filter((style) => !next.includes(style));\n\n next.forEach((style) => {\n this.previousStyles[style] = value[style];\n // @ts-ignore\n this.element.style[style] = value[style];\n });\n\n rm.forEach((style) => {\n this.previousStyles[style] = \"\";\n // @ts-ignore\n this.element.style[style] = \"\";\n });\n\n this.previousStyles = value;\n } else {\n this.element.setAttribute(this.extractedAttributeName, value);\n }\n }\n}\n", "import { Context, evalGet } from \"..\";\n\ninterface EventDirectiveOptions {\n element: Element;\n context: Context;\n attr: Attr;\n}\n\nexport class EventDirective {\n element: Element;\n context: Context;\n expression: string;\n attr: Attr;\n eventCount = 0;\n\n constructor({ element, context, attr }: EventDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = attr.value;\n this.attr = attr;\n\n const eventName = attr.name.replace(/^@/, \"\");\n const parts = eventName.split(\".\");\n\n this.element.addEventListener(parts[0], (event) => {\n if (parts.includes(\"prevent\")) event.preventDefault();\n if (parts.includes(\"stop\")) event.stopPropagation();\n if (parts.includes(\"once\") && this.eventCount > 0) return;\n\n this.eventCount++;\n\n const handler = evalGet(context.scope, attr.value);\n if (typeof handler === \"function\") {\n handler(event);\n }\n });\n\n element.removeAttribute(attr.name);\n }\n}\n", "import { Block, Component, Context, createScopedContext, evalGet } from \"..\";\nimport { isArray, isObject } from \"../util\";\n\nconst forAliasRE = /([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/;\nconst forIteratorRE = /,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/;\nconst stripParensRE = /^\\(|\\)$/g;\nconst destructureRE = /^[{[]\\s*((?:[\\w_$]+\\s*,?\\s*)+)[\\]}]$/;\n\ntype KeyToIndexMap = Map;\n\nexport const _for = (el: Element, exp: string, ctx: Context, component?: Component, componentProps?: Record, allProps?: Record) => {\n const inMatch = exp.match(forAliasRE);\n if (!inMatch) {\n console.warn(`invalid :for expression: ${exp}`);\n return;\n }\n\n const nextNode = el.nextSibling;\n\n const parent = el.parentElement!;\n const anchor = new Text(\"\");\n parent.insertBefore(anchor, el);\n parent.removeChild(el);\n\n const sourceExp = inMatch[2].trim();\n let valueExp = inMatch[1].trim().replace(stripParensRE, \"\").trim();\n let destructureBindings: string[] | undefined;\n let isArrayDestructure = false;\n let indexExp: string | undefined;\n let objIndexExp: string | undefined;\n\n let keyAttr = \"key\";\n let keyExp = el.getAttribute(keyAttr) || el.getAttribute((keyAttr = \":key\")) || el.getAttribute((keyAttr = \":key:bind\"));\n if (keyExp) {\n el.removeAttribute(keyAttr);\n if (keyAttr === \"key\") keyExp = JSON.stringify(keyExp);\n }\n\n let match: any;\n if ((match = valueExp.match(forIteratorRE))) {\n valueExp = valueExp.replace(forIteratorRE, \"\").trim();\n indexExp = match[1].trim();\n if (match[2]) {\n objIndexExp = match[2].trim();\n }\n }\n\n if ((match = valueExp.match(destructureRE))) {\n destructureBindings = match[1].split(\",\").map((s: string) => s.trim());\n isArrayDestructure = valueExp[0] === \"[\";\n }\n\n let mounted = false;\n let blocks: Block[];\n let childCtxs: Context[];\n let keyToIndexMap: Map;\n\n const createChildContexts = (source: unknown): [Context[], KeyToIndexMap] => {\n const map: KeyToIndexMap = new Map();\n const ctxs: Context[] = [];\n\n if (isArray(source)) {\n for (let i = 0; i < source.length; i++) {\n ctxs.push(createChildContext(map, source[i], i));\n }\n } else if (typeof source === \"number\") {\n for (let i = 0; i < source; i++) {\n ctxs.push(createChildContext(map, i + 1, i));\n }\n } else if (isObject(source)) {\n let i = 0;\n for (const key in source) {\n ctxs.push(createChildContext(map, source[key], i++, key));\n }\n }\n\n return [ctxs, map];\n };\n\n const createChildContext = (map: KeyToIndexMap, value: any, index: number, objKey?: string): Context => {\n const data: any = {};\n if (destructureBindings) {\n destructureBindings.forEach((b, i) => (data[b] = value[isArrayDestructure ? i : b]));\n } else {\n data[valueExp] = value;\n }\n if (objKey) {\n indexExp && (data[indexExp] = objKey);\n objIndexExp && (data[objIndexExp] = index);\n } else {\n indexExp && (data[indexExp] = index);\n }\n\n const childCtx = createScopedContext(ctx, data);\n const key = keyExp ? evalGet(childCtx.scope, keyExp) : index;\n map.set(key, index);\n childCtx.key = key;\n return childCtx;\n };\n\n const mountBlock = (ctx: Context, ref: Node) => {\n const block = new Block({ element: el, parentContext: ctx, replacementType: \"replace\", component, componentProps, allProps });\n block.key = ctx.key;\n block.insert(parent, ref);\n return block;\n };\n\n ctx.effect(() => {\n const source = evalGet(ctx.scope, sourceExp);\n const prevKeyToIndexMap = keyToIndexMap;\n [childCtxs, keyToIndexMap] = createChildContexts(source);\n if (!mounted) {\n blocks = childCtxs.map((s) => mountBlock(s, anchor));\n mounted = true;\n } else {\n for (let i = 0; i < blocks.length; i++) {\n if (!keyToIndexMap.has(blocks[i].key)) {\n blocks[i].remove();\n }\n }\n\n const nextBlocks: Block[] = [];\n let i = childCtxs.length;\n let nextBlock: Block | undefined;\n let prevMovedBlock: Block | undefined;\n while (i--) {\n const childCtx = childCtxs[i];\n const oldIndex = prevKeyToIndexMap.get(childCtx.key);\n let block: Block;\n if (oldIndex == null) {\n // new\n block = mountBlock(childCtx, nextBlock ? nextBlock.element : anchor);\n } else {\n // update\n block = blocks[oldIndex];\n Object.assign(block.context.scope, childCtx.scope);\n if (oldIndex !== i) {\n // moved\n if (\n blocks[oldIndex + 1] !== nextBlock ||\n // If the next has moved, it must move too\n prevMovedBlock === nextBlock\n ) {\n prevMovedBlock = block;\n block.insert(parent, nextBlock ? nextBlock.element : anchor);\n }\n }\n }\n nextBlocks.unshift((nextBlock = block));\n }\n blocks = nextBlocks;\n }\n });\n\n return nextNode;\n};\n", "import { Block, Component, Context, evalGet } from \"..\";\nimport { checkAndRemoveAttribute } from \"../util\";\n\ninterface Branch {\n exp?: string | null;\n el: Element;\n}\n\nexport function _if(el: Element, exp: string, ctx: Context, component?: Component, componentProps?: Record, allProps?: Record) {\n const parent = el.parentElement!;\n const anchor = new Comment(\":if\");\n\n parent.insertBefore(anchor, el);\n\n const branches: Branch[] = [{ exp, el }];\n\n let elseEl: Element | null;\n let elseExp: string | null;\n\n while ((elseEl = el.nextElementSibling)) {\n elseExp = null;\n\n if (checkAndRemoveAttribute(elseEl, \":else\") === \"\" || (elseExp = checkAndRemoveAttribute(elseEl, \":else-if\"))) {\n parent.removeChild(elseEl);\n branches.push({ exp: elseExp, el: elseEl });\n } else {\n break;\n }\n }\n\n const nextNode = el.nextSibling;\n parent.removeChild(el);\n\n let block: Block | undefined;\n let activeBranchIndex = -1;\n\n const removeActiveBlock = () => {\n if (block) {\n parent.insertBefore(anchor, block.element);\n block.remove();\n block = undefined;\n }\n };\n\n ctx.effect(() => {\n for (let i = 0; i < branches.length; i++) {\n const { exp, el } = branches[i];\n\n if (!exp || evalGet(ctx.scope, exp)) {\n if (i !== activeBranchIndex) {\n removeActiveBlock();\n block = new Block({ element: el, parentContext: ctx, replacementType: \"replace\", component, componentProps, allProps });\n block.insert(parent, anchor);\n parent.removeChild(anchor);\n activeBranchIndex = i;\n }\n\n return;\n }\n }\n\n activeBranchIndex = -1;\n removeActiveBlock();\n });\n\n return nextNode;\n}\n", "import { Context, evalGet } from \"../\";\nimport { insertAfter, toDisplayString } from \"../util\";\n\ninterface InterpolationDirectiveOptions {\n element: Text;\n context: Context;\n}\n\nconst delims = /{{\\s?(.*?)\\s?}}/g;\n\nexport class InterpolationDirective {\n element: Text;\n context: Context;\n textNodes: Map = new Map();\n\n constructor({ element, context }: InterpolationDirectiveOptions) {\n this.element = element;\n this.context = context;\n\n this.findNodes();\n\n this.textNodes.forEach((nodes, expression) => {\n const trimmedExpression = expression.slice(2, -2).trim();\n\n nodes.forEach((node) => {\n const getter = (exp = trimmedExpression) => evalGet(this.context.scope, exp, node);\n\n context.effect(() => {\n node.textContent = toDisplayString(getter());\n });\n });\n });\n }\n\n findNodes() {\n const textContent = this.element.textContent.trim();\n if (textContent?.match(delims)) {\n const textNodes = textContent.split(/(\\{\\{\\s?[^}]+\\s?\\}\\})/g).filter(Boolean);\n if (textNodes) {\n let previousNode = this.element;\n\n for (let i = 0; i < textNodes.length; i++) {\n const textNode = textNodes[i];\n\n if (textNode.match(/\\{\\{\\s?.+\\s?\\}\\}/)) {\n const newNode = document.createTextNode(textNode);\n\n if (i === 0) {\n this.element.replaceWith(newNode);\n } else {\n insertAfter(newNode, previousNode);\n }\n\n previousNode = newNode;\n\n if (this.textNodes.has(textNode)) {\n this.textNodes.get(textNode).push(newNode);\n } else {\n this.textNodes.set(textNode, [newNode]);\n }\n } else {\n const newNode = document.createTextNode(textNodes[i]);\n\n if (i === 0) {\n this.element.replaceWith(newNode);\n } else {\n insertAfter(newNode, previousNode);\n }\n\n previousNode = newNode;\n }\n }\n }\n }\n }\n\n update() {}\n}\n", "import { Context, evalGet } from \"..\";\n\ninterface ShowDirectiveOptions {\n element: Element;\n context: Context;\n expression: string;\n}\n\nexport class ShowDirective {\n element: Element;\n context: Context;\n expression: string;\n originalDisplay: string;\n\n constructor({ element, context, expression }: ShowDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = expression;\n this.originalDisplay = getComputedStyle(this.element).display;\n\n context.effect(this.update.bind(this));\n }\n\n update() {\n const shouldShow = Boolean(evalGet(this.context.scope, this.expression));\n // @ts-ignore\n this.element.style.display = shouldShow ? this.originalDisplay : \"none\";\n }\n}\n", "import { Block, Context } from \"..\";\nimport { nextTick } from \"../util\";\n\nexport function _teleport(el: Element, exp: string, ctx: Context) {\n const anchor = new Comment(\":teleport\");\n el.replaceWith(anchor);\n\n const target = document.querySelector(exp);\n if (!target) {\n console.warn(`teleport target not found: ${exp}`);\n return;\n }\n\n nextTick(() => {\n target.appendChild(el);\n\n const observer = new MutationObserver((mutationsList) => {\n mutationsList.forEach((mutation) => {\n mutation.removedNodes.forEach((removedNode) => {\n if (removedNode.contains(anchor)) {\n el.remove();\n observer.disconnect();\n }\n });\n });\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n\n // Walks the tree of this teleported element.\n new Block({\n element: el,\n parentContext: ctx,\n });\n });\n\n // Return the anchor so walk continues down the tree in the right order.\n return anchor;\n}\n", "import { Context, evalGet, evalSet } from \"..\";\n\ninterface ValueDirectiveOptions {\n element: Element;\n context: Context;\n expression: string;\n}\n\ntype SupportedModelType = \"text\" | \"checkbox\" | \"radio\" | \"number\" | \"password\" | \"color\";\n\nfunction isInput(element: Element): element is HTMLInputElement {\n return element instanceof HTMLInputElement;\n}\n\nfunction isTextarea(element: Element): element is HTMLTextAreaElement {\n return element instanceof HTMLTextAreaElement;\n}\n\nfunction isSelect(element: Element): element is HTMLSelectElement {\n return element instanceof HTMLSelectElement;\n}\n\nexport class ValueDirective {\n element: Element;\n context: Context;\n expression: string;\n inputType: SupportedModelType;\n\n constructor({ element, context, expression }: ValueDirectiveOptions) {\n this.element = element;\n this.context = context;\n this.expression = expression;\n this.inputType = element.getAttribute(\"type\") as SupportedModelType;\n\n // Element -> Context\n if (isInput(element)) {\n switch (this.inputType) {\n case \"text\":\n case \"password\":\n case \"number\":\n case \"color\":\n element.addEventListener(\"input\", () => {\n const value = this.inputType === \"number\" ? (element.value ? parseFloat(element.value) : 0) : element.value;\n evalSet(this.context.scope, expression, value);\n });\n break;\n\n case \"checkbox\":\n element.addEventListener(\"change\", (e: any) => {\n evalSet(this.context.scope, expression, !!e.currentTarget.checked);\n });\n break;\n case \"radio\":\n element.addEventListener(\"change\", (e: any) => {\n if (e.currentTarget.checked) {\n evalSet(this.context.scope, expression, element.getAttribute(\"value\"));\n }\n });\n break;\n default:\n break;\n }\n }\n\n if (isTextarea(element)) {\n element.addEventListener(\"input\", () => {\n evalSet(this.context.scope, expression, element.value);\n });\n }\n\n if (isSelect(element)) {\n element.addEventListener(\"change\", () => {\n evalSet(this.context.scope, expression, element.value);\n });\n }\n\n // Context -> Element\n context.effect(this.updateElementValue.bind(this));\n }\n\n updateElementValue() {\n const value = evalGet(this.context.scope, this.expression, this.element);\n\n if (isInput(this.element)) {\n switch (this.inputType) {\n case \"text\":\n case \"password\":\n case \"number\":\n case \"color\":\n this.element.value = value;\n break;\n case \"checkbox\":\n this.element.checked = !!value;\n break;\n case \"radio\":\n this.element.checked = this.element.value === value;\n break;\n default:\n break;\n }\n }\n\n if (isTextarea(this.element)) {\n this.element.value = value;\n }\n\n if (isSelect(this.element)) {\n this.element.value = value;\n }\n }\n}\n", "interface EffectOptions {\n lazy?: boolean;\n}\n\ninterface EffectFunction {\n active: boolean;\n handler: () => void;\n refs: Set[];\n}\n\ntype Effects = Set;\ntype EffectsMap = Map;\ntype TargetMap = WeakMap;\n\nconst targetMap: TargetMap = new WeakMap();\nconst effectStack: (EffectFunction | undefined)[] = [];\n\nexport function track(target: T, key: PropertyKey) {\n const activeEffect = effectStack[effectStack.length - 1];\n\n if (!activeEffect) return;\n\n let effectsMap = targetMap.get(target);\n if (!effectsMap)\n targetMap.set(target, (effectsMap = new Map() as EffectsMap));\n\n let effects = effectsMap.get(key);\n if (!effects) effectsMap.set(key, (effects = new Set()));\n\n if (!effects.has(activeEffect)) {\n effects.add(activeEffect);\n activeEffect.refs.push(effects);\n }\n}\n\nexport function trigger(target: any, key: PropertyKey) {\n const effectsMap = targetMap.get(target);\n if (!effectsMap) return;\n\n const scheduled = new Set();\n\n effectsMap.get(key)?.forEach((effect) => {\n scheduled.add(effect);\n });\n\n scheduled.forEach(run);\n}\n\nfunction stop(effect: EffectFunction) {\n if (effect.active) cleanup(effect);\n effect.active = false;\n}\n\nfunction start(effect: EffectFunction) {\n if (!effect.active) {\n effect.active = true;\n run(effect);\n }\n}\n\nfunction run(effect: EffectFunction): unknown {\n if (!effect.active) return;\n\n if (effectStack.includes(effect)) return;\n\n cleanup(effect);\n\n let val: unknown;\n\n try {\n effectStack.push(effect);\n val = effect.handler();\n } finally {\n effectStack.pop();\n }\n\n return val;\n}\n\nfunction cleanup(effect: EffectFunction) {\n const { refs } = effect;\n\n if (refs.length) {\n for (const ref of refs) {\n ref.delete(effect);\n }\n }\n\n refs.length = 0;\n}\n\nexport function effect(handler: () => void, opts: EffectOptions = {}) {\n const { lazy } = opts;\n const newEffect: EffectFunction = {\n active: !lazy,\n handler,\n refs: [],\n };\n\n run(newEffect);\n\n return {\n start: () => {\n start(newEffect);\n },\n stop: () => {\n stop(newEffect);\n },\n toggle: () => {\n if (newEffect.active) {\n stop(newEffect);\n } else {\n start(newEffect);\n }\n return newEffect.active;\n },\n };\n}\n", "import { isObject } from \"../util\";\nimport { effect } from \"./effect\";\n\nconst $computed = Symbol(\"computed\");\n\nexport type Computed = {\n readonly value: T;\n readonly [$computed]: true;\n};\n\nexport function isComputed(value: unknown): value is Computed {\n return isObject(value) && value[$computed];\n}\n\nexport function computed(getter: () => T): Computed {\n const ref = {\n get value(): T {\n return getter();\n },\n [$computed]: true,\n } as const;\n\n effect(() => {\n getter();\n });\n\n return ref;\n}\n", "import { isObject } from \"../util\";\nimport { track, trigger } from \"./effect\";\nimport { Reactive, reactive } from \"./reactive\";\n\nexport const $ref = Symbol(\"ref\");\n\nexport type Ref = {\n value: T;\n [$ref]: true;\n};\n\nexport function isRef(value: unknown): value is Ref {\n return isObject(value) && !!value[$ref];\n}\n\nexport function ref(value: T = null as unknown as T): Ref {\n if (isObject(value)) {\n // @ts-ignore\n return isRef(value) ? (value as Ref) : (reactive(value) as Reactive);\n }\n\n const result = { value, [$ref]: true };\n\n return new Proxy(result, {\n get(target: object, key: string | symbol, receiver: any) {\n const val = Reflect.get(target, key, receiver);\n track(result, \"value\");\n return val;\n },\n set(target: object, key: string | symbol, value: unknown) {\n const oldValue = target[key];\n if (oldValue !== value) {\n const success = Reflect.set(target, key, value);\n if (success) {\n trigger(result, \"value\");\n }\n }\n return true;\n },\n }) as Ref;\n}\n", "import { isObject } from \"../util\";\nimport { track, trigger } from \"./effect\";\nimport { ref } from \"./ref\";\n\nconst $reactive = Symbol(\"reactive\");\n\nexport type Reactive = T & { [$reactive]: true };\n\nexport function isReactive(\n value: unknown,\n): value is Reactive {\n return isObject(value) && !!value[$reactive];\n}\n\nexport function reactive(value: T): Reactive {\n // @ts-ignore\n if (!isObject(value)) return ref(value) as Reactive;\n if (value[$reactive]) return value as Reactive;\n\n value[$reactive] = true;\n\n Object.keys(value).forEach((key) => {\n if (isObject(value[key])) {\n value[key] = reactive(value[key]);\n }\n });\n\n return new Proxy(value, reactiveProxyHandler()) as Reactive;\n}\n\nfunction reactiveProxyHandler() {\n return {\n deleteProperty(target: object, key: string | symbol) {\n const had = Reflect.has(target, key);\n const result = Reflect.deleteProperty(target, key);\n if (had) trigger(target, key);\n return result;\n },\n get(target: object, key: string | symbol) {\n track(target, key);\n return Reflect.get(target, key);\n },\n set(target: object, key: string | symbol, value: unknown) {\n if (target[key] === value) return true;\n let newObj = false;\n\n if (isObject(value) && !isObject(target[key])) {\n newObj = true;\n }\n\n if (Reflect.set(target, key, value)) {\n trigger(target, key);\n }\n\n if (newObj) {\n target[key] = reactive(target[key]);\n }\n\n return true;\n },\n };\n}\n", "import { AttributeDirective } from \"./directives/attribute\";\nimport { EventDirective } from \"./directives/event\";\nimport { _for } from \"./directives/for\";\nimport { _if } from \"./directives/if\";\nimport { InterpolationDirective } from \"./directives/interpolation\";\nimport { ShowDirective } from \"./directives/show\";\nimport { _teleport } from \"./directives/teleport\";\nimport { ValueDirective } from \"./directives/value\";\nimport { Plugin } from \"./plugins\";\nimport { isComputed } from \"./reactivity/computed\";\nimport { effect as _effect } from \"./reactivity/effect\";\nimport { reactive } from \"./reactivity/reactive\";\nimport { isRef, ref } from \"./reactivity/ref\";\nimport {\n checkAndRemoveAttribute,\n componentHasPropByName,\n extractPropName,\n findSlotNodes,\n findTemplateNodes,\n html,\n isElement,\n isEventAttribute,\n isMirrorProp,\n isObject,\n isPropAttribute,\n isRegularProp,\n isSpreadProp,\n isText,\n Slot,\n stringToElement,\n Template,\n} from \"./util\";\n\nexport function provide(key: string, value: unknown) {\n if (!current.componentBlock) {\n console.warn(\"Can't provide: no current component block\");\n }\n\n current.componentBlock.provides.set(key, value);\n}\n\nexport function inject(key: string) {\n if (!current.componentBlock) {\n console.warn(\"Can't inject: no current component block\");\n }\n\n let c = current.componentBlock;\n\n while (c) {\n if (c.provides.has(key)) {\n return c.provides.get(key);\n }\n\n c = c.parentComponentBlock;\n }\n\n return undefined;\n}\n\nexport class App {\n rootBlock: Block;\n registry = new Map();\n plugins = new Set();\n\n register(name: string, component: Component) {\n this.registry.set(name, component);\n }\n\n use(plugin: Plugin, ...config: any[]) {\n this.plugins.add(plugin);\n plugin.use(this, ...config);\n }\n\n getComponent(tag: string) {\n return this.registry.get(tag);\n }\n\n mount(component: Component, target: string | HTMLElement = \"body\", props: Record = {}) {\n const root = typeof target === \"string\" ? (document.querySelector(target) as HTMLElement) : target;\n const display = root.style.display;\n root.style.display = \"none\";\n this.rootBlock = this._mount(component, root, props, true);\n root.style.display = display;\n return this.rootBlock;\n }\n\n private _mount(component: Component, target: HTMLElement, props: Record, isRoot = false) {\n const parentContext = createContext({ app: this });\n\n if (props) {\n parentContext.scope = reactive(props);\n bindContextMethods(parentContext.scope);\n }\n\n parentContext.scope.$isRef = isRef;\n parentContext.scope.$isComputed = isComputed;\n\n const block = new Block({\n element: target,\n parentContext,\n component,\n isRoot,\n componentProps: props,\n replacementType: \"replaceChildren\",\n });\n\n return block;\n }\n\n unmount() {\n this.rootBlock.teardown();\n }\n}\n\nexport interface Context {\n key?: any;\n app: App;\n scope: Record;\n blocks: Block[];\n effects: Array>;\n effect: typeof _effect;\n slots: Slot[];\n templates: Template[];\n}\n\ninterface CreateContextOptions {\n parentContext?: Context;\n app?: App;\n}\n\nexport function createContext({ parentContext, app }: CreateContextOptions): Context {\n const context: Context = {\n app: app ? app : parentContext && parentContext.app ? parentContext.app : null,\n scope: parentContext ? parentContext.scope : reactive({}),\n blocks: [],\n effects: [],\n slots: [],\n templates: parentContext ? parentContext.templates : [],\n effect: (handler: () => void) => {\n const e = _effect(handler);\n context.effects.push(e);\n return e;\n },\n };\n\n return context;\n}\n\nexport const createScopedContext = (ctx: Context, data = {}): Context => {\n const parentScope = ctx.scope;\n const mergedScope = Object.create(parentScope);\n Object.defineProperties(mergedScope, Object.getOwnPropertyDescriptors(data));\n let proxy: any;\n proxy = reactive(\n new Proxy(mergedScope, {\n set(target, key, val, receiver) {\n // when setting a property that doesn't exist on current scope,\n // do not create it on the current scope and fallback to parent scope.\n if (receiver === proxy && !target.hasOwnProperty(key)) {\n return Reflect.set(parentScope, key, val);\n }\n return Reflect.set(target, key, val, receiver);\n },\n }),\n );\n\n bindContextMethods(proxy);\n\n const out: Context = {\n ...ctx,\n scope: {\n ...ctx.scope,\n ...proxy,\n },\n };\n\n return out;\n};\n\nfunction bindContextMethods(scope: Record) {\n for (const key of Object.keys(scope)) {\n if (typeof scope[key] === \"function\") {\n scope[key] = scope[key].bind(scope);\n }\n }\n}\n\nfunction mergeProps(props: Record, defaultProps: Record) {\n const merged = {};\n\n Object.keys(defaultProps).forEach((defaultProp) => {\n const propValue = props.hasOwnProperty(defaultProp) ? props[defaultProp] : defaultProps[defaultProp]?.default;\n\n merged[defaultProp] = reactive(typeof propValue === \"function\" ? propValue() : propValue);\n });\n\n return merged;\n}\n\nexport interface Component {\n template: string;\n props?: Record;\n main?: (props?: Record) => Record | void;\n}\n\ninterface Current {\n componentBlock?: Block;\n}\n\nexport const current: Current = { componentBlock: undefined };\n\ninterface BlockOptions {\n element: Element;\n isRoot?: boolean;\n replacementType?: \"replace\" | \"replaceChildren\";\n componentProps?: Record;\n allProps?: Record;\n parentContext?: Context;\n component?: Component;\n parentComponentBlock?: Block;\n templates?: Template[];\n}\n\nexport class Block {\n element: Element;\n context: Context;\n parentContext: Context;\n component: Component;\n provides = new Map();\n parentComponentBlock: Block | undefined;\n componentProps: Record;\n allProps: Record;\n\n isFragment: boolean;\n start?: Text;\n end?: Text;\n key?: any;\n\n constructor(opts: BlockOptions) {\n this.isFragment = opts.element instanceof HTMLTemplateElement;\n this.parentComponentBlock = opts.parentComponentBlock;\n\n if (opts.component) {\n current.componentBlock = this;\n this.element = stringToElement(opts.component.template);\n } else {\n if (this.isFragment) {\n this.element = (opts.element as HTMLTemplateElement).content.cloneNode(true) as Element;\n } else if (typeof opts.element === \"string\") {\n this.element = stringToElement(opts.element);\n } else {\n this.element = opts.element.cloneNode(true) as Element;\n opts.element.replaceWith(this.element);\n }\n }\n\n if (opts.isRoot) {\n this.context = opts.parentContext;\n } else {\n this.parentContext = opts.parentContext ? opts.parentContext : createContext({});\n this.parentContext.blocks.push(this);\n this.context = createContext({ parentContext: opts.parentContext });\n }\n\n if (opts.component) {\n this.componentProps = mergeProps(opts.componentProps ?? {}, opts.component.props ?? {});\n\n if (opts.component.main) {\n this.context.scope = {\n ...(opts.component.main(this.componentProps) || {}),\n };\n }\n }\n\n opts.allProps?.forEach((prop) => {\n if (prop.isBind) {\n this.context.effect(() => {\n let newValue: unknown;\n\n if (prop.isSpread) {\n const spreadProps = evalGet(this.parentContext.scope, prop.extractedName);\n if (isObject(spreadProps)) {\n Object.keys(spreadProps).forEach((key) => {\n newValue = spreadProps[key];\n this.setProp(key, newValue);\n });\n }\n } else {\n newValue = prop.isMirror ? evalGet(this.parentContext.scope, prop.extractedName) : evalGet(this.parentContext.scope, prop.exp);\n this.setProp(prop.extractedName, newValue);\n }\n });\n }\n });\n\n // Capture slots\n this.context.slots = findSlotNodes(this.element);\n this.context.templates = opts.templates ?? [];\n\n // Put templates into slots\n this.context.slots.forEach((slot) => {\n const template = this.context.templates.find((t) => t.targetSlotName === slot.name);\n\n if (template) {\n const templateContents = template.node.content.cloneNode(true);\n slot.node.replaceWith(templateContents);\n }\n });\n\n this.context.scope.$isRef = isRef;\n this.context.scope.$isComputed = isComputed;\n\n walk(this.element, this.context);\n\n if (opts.component) {\n if (opts.replacementType === \"replace\") {\n if (opts.element instanceof HTMLElement) {\n opts.element.replaceWith(this.element);\n }\n } else {\n if (opts.element instanceof HTMLElement) {\n opts.element.replaceChildren(this.element);\n }\n }\n }\n }\n\n setProp(name: string, value: unknown) {\n if (isRef(this.componentProps[name])) {\n this.componentProps[name].value = value;\n } else {\n this.componentProps[name] = value;\n }\n }\n\n insert(parent: Element, anchor: Node | null = null) {\n if (this.isFragment) {\n if (this.start) {\n // Already inserted, moving\n let node: Node | null = this.start;\n let next: Node | null;\n\n while (node) {\n next = node.nextSibling;\n parent.insertBefore(node, anchor);\n\n if (node === this.end) {\n break;\n }\n\n node = next;\n }\n } else {\n this.start = new Text(\"\");\n this.end = new Text(\"\");\n\n parent.insertBefore(this.end, anchor);\n parent.insertBefore(this.start, this.end);\n parent.insertBefore(this.element, this.end);\n }\n } else {\n parent.insertBefore(this.element, anchor);\n }\n }\n\n remove() {\n if (this.parentContext) {\n const i = this.parentContext.blocks.indexOf(this);\n\n if (i > -1) {\n this.parentContext.blocks.splice(i, 1);\n }\n }\n\n if (this.start) {\n const parent = this.start.parentNode!;\n let node: Node | null = this.start;\n let next: Node | null;\n\n while (node) {\n next = node.nextSibling;\n parent.removeChild(node);\n\n if (node === this.end) {\n break;\n }\n\n node = next;\n }\n } else {\n // this.element.parentNode!.removeChild(this.element);\n this.element.remove();\n }\n\n this.teardown();\n }\n\n teardown() {\n this.context.blocks.forEach((block) => {\n block.teardown();\n });\n\n this.context.effects.forEach(stop);\n }\n}\n\nfunction isComponent(element: Element, context: Context) {\n return !!context.app.getComponent(element.tagName.toLowerCase());\n}\n\nfunction walk(node: Node, context: Context) {\n if (isText(node)) {\n new InterpolationDirective({ element: node, context });\n return;\n }\n\n if (isElement(node)) {\n let exp: string | null;\n\n const handleDirectives = (node: Element, context: Context, component?: Component, componentProps?: Record, allProps?: any[]) => {\n if ((exp = checkAndRemoveAttribute(node, \":teleport\"))) {\n return _teleport(node, exp, context);\n }\n if ((exp = checkAndRemoveAttribute(node, \":if\"))) {\n return _if(node, exp, context, component, componentProps, allProps);\n }\n if ((exp = checkAndRemoveAttribute(node, \":for\"))) {\n return _for(node, exp, context, component, componentProps, allProps);\n }\n if ((exp = checkAndRemoveAttribute(node, \":show\"))) {\n new ShowDirective({ element: node, context, expression: exp });\n }\n if ((exp = checkAndRemoveAttribute(node, \":ref\"))) {\n context.scope[exp].value = node;\n }\n if ((exp = checkAndRemoveAttribute(node, \":value\"))) {\n new ValueDirective({ element: node, context, expression: exp });\n }\n if ((exp = checkAndRemoveAttribute(node, \":html\"))) {\n context.effect(() => {\n const result = evalGet(context.scope, exp);\n if (result instanceof Element) {\n node.replaceChildren();\n node.append(result);\n } else {\n node.innerHTML = result;\n }\n });\n }\n };\n\n const processAttributes = (node: Element, component?: Component) => {\n return Array.from(node.attributes)\n .filter((attr) => isSpreadProp(attr.name) || isMirrorProp(attr.name) || (isRegularProp(attr.name) && componentHasPropByName(extractPropName(attr.name), component)))\n .map((attr) => ({\n isMirror: isMirrorProp(attr.name),\n isSpread: isSpreadProp(attr.name),\n isBind: attr.name.includes(\"bind\"),\n originalName: attr.name,\n extractedName: extractPropName(attr.name),\n exp: attr.value,\n value: isMirrorProp(attr.name) ? evalGet(context.scope, extractPropName(attr.name)) : attr.value ? evalGet(context.scope, attr.value) : undefined,\n }));\n };\n\n if (isComponent(node, context)) {\n const component = context.app.getComponent(node.tagName.toLowerCase());\n const allProps = processAttributes(node, component);\n\n const componentProps = allProps.reduce((acc, { isSpread, isMirror, extractedName, value }) => {\n if (isSpread) {\n const spread = evalGet(context.scope, extractedName);\n if (isObject(spread)) Object.assign(acc, spread);\n } else if (isMirror) {\n acc[extractedName] = evalGet(context.scope, extractedName);\n } else {\n acc[extractedName] = value;\n }\n return acc;\n }, {});\n\n const next = handleDirectives(node, context, component, componentProps, allProps);\n if (next) return next;\n\n const templates = findTemplateNodes(node);\n\n return new Block({\n element: node,\n parentContext: context,\n component,\n replacementType: \"replace\",\n parentComponentBlock: current.componentBlock,\n templates,\n componentProps,\n allProps,\n }).element;\n }\n\n const next = handleDirectives(node, context);\n if (next) return next;\n\n Array.from(node.attributes).forEach((attr) => {\n if (isPropAttribute(attr.name)) {\n new AttributeDirective({ element: node, context, attr });\n }\n\n if (isEventAttribute(attr.name)) {\n new EventDirective({ element: node, context, attr });\n }\n });\n\n walkChildren(node, context);\n }\n}\n\nfunction walkChildren(node: Node, context: Context) {\n let child = node.firstChild;\n\n while (child) {\n child = walk(child, context) || child.nextSibling;\n }\n}\n\nconst evalFuncCache: Record = {};\n\nexport function evalGet(scope: any, exp: string, el?: Node) {\n if (!exp.trim()) return undefined;\n return execute(scope, `const ___value = (${exp.trim()}); return ___value;`, el);\n}\n\nexport function evalSet(scope: any, exp: string, value: unknown) {\n value = typeof value === \"string\" ? `\"${value}\"` : value;\n return execute(scope, `const ___target = (${exp.trim()}); return $isRef(___target) ? ___target.value = ${value} : ___target = ${value};`, null, false);\n}\n\nfunction execute(scope: any, exp: string, el?: Node, flatRefs = true) {\n const newScope = flatRefs ? flattenRefs(scope) : scope;\n const fn = evalFuncCache[exp] || (evalFuncCache[exp] = toFunction(exp));\n\n try {\n return fn(newScope, el);\n } catch (e) {\n console.warn(`Error evaluating expression: \"${exp}\":`);\n console.error(e);\n }\n}\n\n// Function to convert expression strings to functions\nfunction toFunction(exp: string) {\n try {\n return new Function(\"$data\", \"$el\", `with($data){${exp}}`);\n } catch (e) {\n console.error(`${(e as Error).message} in expression: ${exp}`);\n return () => {};\n }\n}\n\n// Map all ref properties in scope to their `.value`\nfunction flattenRefs(scope: any): any {\n const mapped = {};\n\n for (const key in scope) {\n if (scope.hasOwnProperty(key)) {\n // Check if the value is a Ref\n if (isRef(scope[key])) {\n mapped[key] = scope[key].value;\n } else {\n mapped[key] = scope[key];\n }\n }\n }\n return mapped;\n}\n\n// ------------------------------------------------\n// Slots, multiple default and named, :if and :for\n// const card = {\n// template: html`
\n//

\n// \n//
`,\n// };\n\n// const main = {\n// template: html`\n//
\n//

card below

\n// \n// card title\n// \n// \n//
\n// `,\n// };\n\n// const app = new App();\n// app.register(\"card\", card);\n// app.mount(main, \"#app\");\n\n// ------------------------------------------------\n// Slots, multiple default and named, :if and :for\n// const app = new App();\n\n// const parent = {\n// template: html`\n//
\n//

parent

\n// \n// \n//
\n//
\n//
1
\n//
2
\n//
3
\n//
\n//
\n// content 1 always shown\n//
\n// content 2, animals:\n//
animal: {{animal}}
\n//
\n\n// \n// \n//
\n//
\n// `,\n// main() {\n// const bool = ref(true);\n// const animals = reactive([\"dog\", \"cat\", \"bear\"]);\n\n// setInterval(() => {\n// bool.value = !bool.value;\n// }, 2000);\n\n// return { bool, animals };\n// },\n// };\n// const card = {\n// template: html`
\n//

card

\n//

\n// \n//
`,\n// };\n// app.register(\"card\", card);\n// const parentBlock = app.mount(parent, \"body\");\n// const cardBlock = parentBlock.context.blocks[0];\n\n// ------------------------------------------------\n// Component pros, mirror and spread, bind and no bind\nconst child = {\n template: html`
Animal: {{animal}} {{index}}
`,\n props: { animal: { default: \"cat\" }, index: { default: 0 } },\n main({ animal, index }) {\n return { animal, index };\n },\n};\n\nconst parent = {\n template: html`\n
\n mirror, no bind:\n \n
\n mirror, bind:\n \n
\n spread, no bind:\n \n
\n spread, bind:\n \n
\n regular prop:\n \n
\n regular prop, bind:\n \n
\n
div has \"id\" set to animal.value
\n
\n
div has \"id\" set and bound to animal.value
\n
\n
div has \"animal\" set to animal.value
\n
\n
div has \"animal\" set and bound to animal.value
\n
\n
div has \"animal\" spread
\n
\n
div has \"animal\" spread and bound
\n
\n
\n
\n
\n if bool, mirror, no bind:\n \n if bool, mirror, bind:\n \n
\n for list, mirror, no bind:\n \n
\n for list, mirror, bind:\n \n if bool, for list, mirror, no bind: these have the value \"DOG!\" because by the time for :for directive is evaluated, animal.value is \"DOG!\", and no longer \"dog\".\n
\n \n
\n
\n `,\n main() {\n const bool = ref(false);\n const animal = ref(\"dog\");\n const spread = reactive({ animal: \"panther\" });\n const list = reactive([1, 2, 3]);\n\n setTimeout(() => {\n spread.animal = \"PANTHER!\";\n animal.value = \"DOG!\";\n bool.value = true;\n }, 500);\n\n setTimeout(() => {\n animal.value = \"DOG!!!!!\";\n }, 1000);\n\n return { animal, spread, bool, list };\n },\n};\n\nconst app = new App();\napp.register(\"child\", child);\napp.mount(parent, \"#app\");\n\n// ------------------------------------------------\n// Event directive\n// const counter = {\n// template: html`\n//
\n//
true
\n//

Count: {{count}}{{count >= 2 ? '!!!' : ''}}

\n// \n// \n//
\n// `,\n// main() {\n// const count = ref(0);\n// const style = reactive({ color: \"gray\" });\n// const increment = () => count.value++;\n// const decrement = () => count.value--;\n\n// setInterval(() => {\n// style.color = style.color === \"gray\" ? \"white\" : \"gray\";\n// }, 500);\n\n// return { count, increment, decrement, style };\n// },\n// };\n\n// const app = new App();\n// app.mount(counter, \"#app\");\n\n// ------------------------------------------------\n// Template\n// const main = {\n// template: html`\n//
\n//
\n//
{{item}}
\n//
\n//
\n// `,\n// main() {\n// const items = reactive([1, 2, 3, 4, 5]);\n// const bool = ref(true);\n// setInterval(() => (bool.value = !bool.value), 250);\n// return { items, bool };\n// },\n// };\n\n// const app = new App();\n// app.mount(main, \"#app\");\n\n// ------------------------------------------------\n// :html\n// const main = {\n// template: html`
`,\n// main() {\n// const html = ref(\"

hello

\");\n\n// setTimeout(() => {\n// if (html.value === \"

hello

\") {\n// html.value = \"

world

\";\n// }\n// }, 1000);\n\n// return { html };\n// },\n// };\n\n// const app = new App();\n// app.mount(main, \"#app\");\n"], + "mappings": "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", + "names": ["node", "element", "_", "parent", "ctx", "ref", "i", "parent", "exp", "el", "effect", "stop", "ref", "value", "app", "parent", "node", "context", "next", "child"] } diff --git a/src/index.ts b/src/index.ts index db644db..b477ea4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -417,10 +417,40 @@ function walk(node: Node, context: Context) { if (isElement(node)) { let exp: string | null; - if (isComponent(node, context)) { - const component = context.app.getComponent(node.tagName.toLowerCase()); + const handleDirectives = (node: Element, context: Context, component?: Component, componentProps?: Record, allProps?: any[]) => { + if ((exp = checkAndRemoveAttribute(node, ":teleport"))) { + return _teleport(node, exp, context); + } + if ((exp = checkAndRemoveAttribute(node, ":if"))) { + return _if(node, exp, context, component, componentProps, allProps); + } + if ((exp = checkAndRemoveAttribute(node, ":for"))) { + return _for(node, exp, context, component, componentProps, allProps); + } + if ((exp = checkAndRemoveAttribute(node, ":show"))) { + new ShowDirective({ element: node, context, expression: exp }); + } + if ((exp = checkAndRemoveAttribute(node, ":ref"))) { + context.scope[exp].value = node; + } + if ((exp = checkAndRemoveAttribute(node, ":value"))) { + new ValueDirective({ element: node, context, expression: exp }); + } + if ((exp = checkAndRemoveAttribute(node, ":html"))) { + context.effect(() => { + const result = evalGet(context.scope, exp); + if (result instanceof Element) { + node.replaceChildren(); + node.append(result); + } else { + node.innerHTML = result; + } + }); + } + }; - const allProps = Array.from(node.attributes) + const processAttributes = (node: Element, component?: Component) => { + return Array.from(node.attributes) .filter((attr) => isSpreadProp(attr.name) || isMirrorProp(attr.name) || (isRegularProp(attr.name) && componentHasPropByName(extractPropName(attr.name), component))) .map((attr) => ({ isMirror: isMirrorProp(attr.name), @@ -431,6 +461,11 @@ function walk(node: Node, context: Context) { exp: attr.value, value: isMirrorProp(attr.name) ? evalGet(context.scope, extractPropName(attr.name)) : attr.value ? evalGet(context.scope, attr.value) : undefined, })); + }; + + if (isComponent(node, context)) { + const component = context.app.getComponent(node.tagName.toLowerCase()); + const allProps = processAttributes(node, component); const componentProps = allProps.reduce((acc, { isSpread, isMirror, extractedName, value }) => { if (isSpread) { @@ -444,25 +479,12 @@ function walk(node: Node, context: Context) { return acc; }, {}); - if ((exp = checkAndRemoveAttribute(node, ":teleport"))) { - return _teleport(node, exp, context); - } - - if ((exp = checkAndRemoveAttribute(node, ":if"))) { - return _if(node, exp, context, component, componentProps, allProps); - } - - if ((exp = checkAndRemoveAttribute(node, ":for"))) { - return _for(node, exp, context, component, componentProps, allProps); - } - - if ((exp = checkAndRemoveAttribute(node, ":show"))) { - new ShowDirective({ element: node, context, expression: exp }); - } + const next = handleDirectives(node, context, component, componentProps, allProps); + if (next) return next; const templates = findTemplateNodes(node); - const block = new Block({ + return new Block({ element: node, parentContext: context, component, @@ -471,34 +493,11 @@ function walk(node: Node, context: Context) { templates, componentProps, allProps, - }); - - return block.element; + }).element; } - if ((exp = checkAndRemoveAttribute(node, ":teleport"))) { - return _teleport(node, exp, context); - } - - if ((exp = checkAndRemoveAttribute(node, ":if"))) { - return _if(node, exp, context); - } - - if ((exp = checkAndRemoveAttribute(node, ":for"))) { - return _for(node, exp, context); - } - - if ((exp = checkAndRemoveAttribute(node, ":ref"))) { - context.scope[exp].value = node; - } - - if ((exp = checkAndRemoveAttribute(node, ":value"))) { - new ValueDirective({ element: node, context, expression: exp }); - } - - if ((exp = checkAndRemoveAttribute(node, ":show"))) { - new ShowDirective({ element: node, context, expression: exp }); - } + const next = handleDirectives(node, context); + if (next) return next; Array.from(node.attributes).forEach((attr) => { if (isPropAttribute(attr.name)) { @@ -650,115 +649,155 @@ function flattenRefs(scope: any): any { // ------------------------------------------------ // Component pros, mirror and spread, bind and no bind -// const child = { -// template: html`
Animal: {{animal}}
`, -// props: { animal: { default: "cat" } }, -// main({ animal }) { -// return { animal }; -// }, -// }; +const child = { + template: html`
Animal: {{animal}} {{index}}
`, + props: { animal: { default: "cat" }, index: { default: 0 } }, + main({ animal, index }) { + return { animal, index }; + }, +}; -// const parent = { -// template: html` -//
-//
asdf
-// mirror, no bind: -// -//
-// mirror, bind: -// -//
-// spread, no bind: -// -//
-// spread, bind: -// -//
-// regular prop: -// -//
-// regular prop, bind: -// -//
-//
div has "id" set to animal.value
-//
-//
div has "id" set and bound to animal.value
-//
-//
div has "animal" set to animal.value
-//
-//
div has "animal" set and bound to animal.value
-//
-//
div has "animal" spread
-//
-//
div has "animal" spread and bound
-//
-//
-//
-//
-// if bool, mirror, no bind: -// -// if bool, mirror, bind: -// -//
-// for list, mirror, no bind: -// -//
-// for list, mirror, bind: -// -// if bool, for list, mirror, no bind: these have the value "DOG!" because by the time for :for directive is evaluated, animal.value is "DOG!", and no longer "dog". -//
-// -//
-//
-// `, -// main() { -// const bool = ref(false); -// const animal = ref("dog"); -// const spread = reactive({ animal: "panther" }); -// const list = reactive([1, 2, 3]); - -// setTimeout(() => { -// spread.animal = "PANTHER!"; -// animal.value = "DOG!"; -// bool.value = true; -// }, 500); - -// setTimeout(() => { -// animal.value = "DOG!!!!!"; -// }, 1000); - -// return { animal, spread, bool, list }; -// }, -// }; - -// const app = new App(); -// app.register("child", child); -// app.mount(parent, "#app"); - -// ------------------------------------------------ -// Event directive -const counter = { +const parent = { template: html`
-
true
-

Count: {{count}}{{count >= 2 ? '!!!' : ''}}

- - + mirror, no bind: + +
+ mirror, bind: + +
+ spread, no bind: + +
+ spread, bind: + +
+ regular prop: + +
+ regular prop, bind: + +
+
div has "id" set to animal.value
+
+
div has "id" set and bound to animal.value
+
+
div has "animal" set to animal.value
+
+
div has "animal" set and bound to animal.value
+
+
div has "animal" spread
+
+
div has "animal" spread and bound
+
+
+
+
+ if bool, mirror, no bind: + + if bool, mirror, bind: + +
+ for list, mirror, no bind: + +
+ for list, mirror, bind: + + if bool, for list, mirror, no bind: these have the value "DOG!" because by the time for :for directive is evaluated, animal.value is "DOG!", and no longer "dog". +
+ +
`, main() { - const count = ref(0); - const style = reactive({ color: "gray" }); - const increment = () => count.value++; - const decrement = () => count.value--; + const bool = ref(false); + const animal = ref("dog"); + const spread = reactive({ animal: "panther" }); + const list = reactive([1, 2, 3]); - setInterval(() => { - style.color = style.color === "gray" ? "white" : "gray"; + setTimeout(() => { + spread.animal = "PANTHER!"; + animal.value = "DOG!"; + bool.value = true; }, 500); - return { count, increment, decrement, style }; + setTimeout(() => { + animal.value = "DOG!!!!!"; + }, 1000); + + return { animal, spread, bool, list }; }, }; const app = new App(); -app.mount(counter, "#app"); +app.register("child", child); +app.mount(parent, "#app"); + +// ------------------------------------------------ +// Event directive +// const counter = { +// template: html` +//
+//
true
+//

Count: {{count}}{{count >= 2 ? '!!!' : ''}}

+// +// +//
+// `, +// main() { +// const count = ref(0); +// const style = reactive({ color: "gray" }); +// const increment = () => count.value++; +// const decrement = () => count.value--; + +// setInterval(() => { +// style.color = style.color === "gray" ? "white" : "gray"; +// }, 500); + +// return { count, increment, decrement, style }; +// }, +// }; + +// const app = new App(); +// app.mount(counter, "#app"); + +// ------------------------------------------------ +// Template +// const main = { +// template: html` +//
+//
+//
{{item}}
+//
+//
+// `, +// main() { +// const items = reactive([1, 2, 3, 4, 5]); +// const bool = ref(true); +// setInterval(() => (bool.value = !bool.value), 250); +// return { items, bool }; +// }, +// }; + +// const app = new App(); +// app.mount(main, "#app"); + +// ------------------------------------------------ +// :html +// const main = { +// template: html`
`, +// main() { +// const html = ref("

hello

"); + +// setTimeout(() => { +// if (html.value === "

hello

") { +// html.value = "

world

"; +// } +// }, 1000); + +// return { html }; +// }, +// }; + +// const app = new App(); +// app.mount(main, "#app");