@jasonshimmy/custom-elements-runtime 0.0.10-beta.0 → 0.0.10-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/custom-elements-runtime.cjs.js +18 -1
- package/dist/custom-elements-runtime.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.es.js +1243 -936
- package/dist/custom-elements-runtime.es.js.map +1 -1
- package/dist/custom-elements-runtime.umd.js +18 -1
- package/dist/custom-elements-runtime.umd.js.map +1 -1
- package/dist/runtime.d.ts +2 -3
- package/dist/style-utils.d.ts +3 -94
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-elements-runtime.umd.js","sources":["../src/lib/store.ts","../src/lib/event-bus.ts","../src/lib/template-compiler.ts","../src/lib/directives.ts","../src/lib/vdom.ts","../src/lib/style-utils.ts","../src/lib/runtime.ts"],"sourcesContent":["\n// Usage example\n// import { Store } from './lib/store';\n\n// export const globalState = Store({ theme: 'light', count: 0 });\n\n// // In a component\n// globalState.subscribe((state) => {\n// console.log('Global changed:', state.count);\n// });\n\n// src/lib/store.ts\ntype Listener<T> = (state: T) => void;\n\nexport interface Store<T extends object> {\n subscribe(listener: Listener<T>): void;\n getState(): T;\n}\n\nexport function createStore<T extends object>(initial: T) {\n let state = new Proxy(initial, {\n set: (target, prop, value) => {\n (target as any)[prop] = value;\n notify();\n return true;\n }\n });\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // Initial call\n }\n\n function getState(): T {\n return state;\n }\n\n function notify() {\n listeners.forEach((fn) => fn(state));\n }\n\n return { subscribe, getState };\n}\n","\n/**\n * Event handler type for global event bus\n */\nexport type EventHandler<T = any> = (data: T) => void;\n\n/**\n * Event map type using Set for efficient handler management\n */\ntype EventMap = { [eventName: string]: Set<EventHandler> };\n\n\n/**\n * GlobalEventBus provides a singleton event bus for cross-component communication.\n * Uses Set for handler storage to optimize add/remove operations and prevent duplicates.\n */\nexport class GlobalEventBus extends EventTarget {\n private handlers: EventMap = {};\n private static instance: GlobalEventBus;\n private eventCounters: Map<string, { count: number; window: number }> = new Map();\n\n\n /**\n * Returns the singleton instance of GlobalEventBus\n */\n static getInstance(): GlobalEventBus {\n if (!GlobalEventBus.instance) {\n GlobalEventBus.instance = new GlobalEventBus();\n }\n return GlobalEventBus.instance;\n }\n\n // Enhanced emit method with better typing and event storm protection\n /**\n * Emit a global event with optional data. Includes event storm protection.\n * @param eventName - Name of the event\n * @param data - Optional event payload\n */\n emit<T = any>(eventName: string, data?: T): void {\n // Event storm protection\n const now = Date.now();\n const counter = this.eventCounters.get(eventName);\n \n if (!counter || now - counter.window > 1000) {\n // Reset counter every second\n this.eventCounters.set(eventName, { count: 1, window: now });\n } else {\n counter.count++;\n \n if (counter.count > 50) {\n // Too many events of the same type in one second\n console.error(`Event storm detected for \"${eventName}\": ${counter.count} events in 1 second. Throttling...`);\n \n // Throttle this event type for a short period\n if (counter.count > 100) {\n console.warn(`Blocking further \"${eventName}\" events to prevent infinite loop`);\n return;\n }\n }\n }\n\n // Use native CustomEvent for better browser integration\n this.dispatchEvent(new CustomEvent(eventName, { \n detail: data,\n bubbles: false, // Global events don't need to bubble\n cancelable: true \n }));\n\n // Also trigger registered handlers\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in global event handler for \"${eventName}\":`, error);\n }\n });\n }\n }\n\n\n /**\n * Register a handler for a global event. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n on<T = any>(eventName: string, handler: EventHandler<T>): () => void {\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = new Set();\n }\n this.handlers[eventName].add(handler);\n return () => this.off(eventName, handler);\n }\n\n\n /**\n * Remove a specific handler for a global event.\n * @param eventName - Name of the event\n * @param handler - Handler function to remove\n */\n off<T = any>(eventName: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.delete(handler);\n }\n }\n\n\n /**\n * Remove all handlers for a specific event.\n * @param eventName - Name of the event\n */\n offAll(eventName: string): void {\n delete this.handlers[eventName];\n }\n\n\n /**\n * Listen for a native CustomEvent. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - CustomEvent handler\n * @param options - AddEventListener options\n */\n listen<T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions): () => void {\n this.addEventListener(eventName, handler as EventListener, options);\n return () => this.removeEventListener(eventName, handler as EventListener);\n }\n\n\n /**\n * Register a one-time event handler. Returns a promise that resolves with the event data.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n once<T = any>(eventName: string, handler: EventHandler<T>): Promise<T> {\n return new Promise((resolve) => {\n const unsubscribe = this.on(eventName, (data: T) => {\n unsubscribe();\n handler(data);\n resolve(data);\n });\n });\n }\n\n\n /**\n * Get a list of all active event names with registered handlers.\n */\n getActiveEvents(): string[] {\n return Object.keys(this.handlers).filter(eventName => \n this.handlers[eventName] && this.handlers[eventName].size > 0\n );\n }\n\n\n /**\n * Clear all event handlers (useful for testing or cleanup).\n */\n clear(): void {\n this.handlers = {};\n // Note: This doesn't clear native event listeners, use removeAllListeners if needed\n }\n\n\n /**\n * Get the number of handlers registered for a specific event.\n * @param eventName - Name of the event\n */\n getHandlerCount(eventName: string): number {\n return this.handlers[eventName]?.size || 0;\n }\n\n\n /**\n * Get event statistics for debugging.\n */\n getEventStats(): Record<string, { count: number; handlersCount: number }> {\n const stats: Record<string, { count: number; handlersCount: number }> = {};\n for (const [eventName, counter] of this.eventCounters.entries()) {\n stats[eventName] = {\n count: counter.count,\n handlersCount: this.getHandlerCount(eventName)\n };\n }\n return stats;\n }\n\n\n /**\n * Reset event counters (useful for testing or after resolving issues).\n */\n resetEventCounters(): void {\n this.eventCounters.clear();\n }\n}\n\n\n/**\n * Singleton instance of the global event bus\n */\nexport const eventBus = GlobalEventBus.getInstance();\n\n/**\n * Emit a global event\n */\nexport const emit = <T = any>(eventName: string, data?: T) => eventBus.emit(eventName, data);\n\n/**\n * Register a handler for a global event\n */\nexport const on = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.on(eventName, handler);\n\n/**\n * Remove a handler for a global event\n */\nexport const off = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.off(eventName, handler);\n\n/**\n * Register a one-time handler for a global event\n */\nexport const once = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.once(eventName, handler);\n\n/**\n * Listen for a native CustomEvent\n */\nexport const listen = <T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions) => \n eventBus.listen(eventName, handler, options);\n","import type { VNode } from \"./vdom\";\n\nexport function h(\n tag: string,\n props: Record<string, any> = {},\n children?: VNode[] | string,\n key?: string | number,\n): VNode {\n // Do NOT invent keys here; use only what the caller passes (or props.key).\n const finalKey = key ?? props.key;\n return { tag, key: finalKey, props, children };\n}\n\nfunction isAnchorBlock(v: any): boolean {\n return (\n !!v &&\n typeof v === \"object\" &&\n ((v as any).type === \"AnchorBlock\" || (v as any).tag === \"#anchor\")\n );\n}\n\nfunction isElementVNode(v: any): v is VNode {\n return (\n typeof v === \"object\" && v !== null && \"tag\" in v && !isAnchorBlock(v) // exclude anchor blocks from being treated as normal elements\n );\n}\n\nfunction ensureKey(v: VNode, k: string): VNode {\n return v.key != null ? v : { ...v, key: k };\n}\n\nfunction parseProps(\n str: string,\n values: unknown[] = [],\n context: Record<string, any> = {}\n): {\n props: Record<string, any>;\n attrs: Record<string, any>;\n directives: Record<string, { value: string; modifiers: string[] }>;\n} {\n const props: Record<string, any> = {};\n const attrs: Record<string, any> = {};\n const directives: Record<string, { value: any; modifiers: string[] }> = {};\n\n // Match attributes with optional prefix and support for single/double quotes\n const attrRegex =\n /([:@#]?)([a-zA-Z0-9-:\\.]+)=(\"([^\"\\\\]*(\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(\\\\.[^'\\\\]*)*)')/g;\n\n let match: RegExpExecArray | null;\n\n while ((match = attrRegex.exec(str))) {\n const prefix = match[1];\n const rawName = match[2];\n const rawVal = (match[4] || match[6]) ?? \"\"; // Extract value from either quote type\n\n // Interpolation detection\n const interpMatch = rawVal.match(/^{{(\\d+)}}$/);\n let value: any = interpMatch\n ? values[Number(interpMatch[1])] ?? null\n : rawVal;\n\n // Type inference\n if (!interpMatch) {\n if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value === \"null\") value = null;\n else if (!isNaN(Number(value))) value = Number(value);\n }\n\n if (prefix === \":\") {\n if (typeof value === \"boolean\") {\n attrs[rawName] = value;\n } else if (value !== undefined && value !== null) {\n props[rawName] = value;\n }\n } else if (prefix === \"@\") {\n const onName = \"on\" + rawName.charAt(0).toUpperCase() + rawName.slice(1);\n props[onName] =\n typeof value === \"function\"\n ? value\n : typeof context[value] === \"function\"\n ? context[value]\n : undefined;\n } else if (prefix === \"#\") {\n const [directiveName, ...modifierParts] = rawName.split(\".\");\n const modifiers = [...modifierParts];\n\n let finalValue = value;\n let finalModifiers = [...modifiers];\n\n if (\n directiveName === \"model\" &&\n typeof finalValue === \"string\" &&\n finalValue.includes(\".\")\n ) {\n const commonModifiers = [\"trim\", \"number\", \"lazy\"];\n const valueParts = finalValue.split(\".\");\n let actualValue = finalValue;\n const valueModifiers: string[] = [];\n\n for (let i = valueParts.length - 1; i > 0; i--) {\n if (commonModifiers.includes(valueParts[i])) {\n valueModifiers.unshift(valueParts[i]);\n actualValue = valueParts.slice(0, i).join(\".\");\n } else {\n break;\n }\n }\n\n finalValue = actualValue;\n finalModifiers.push(...valueModifiers);\n }\n\n directives[directiveName] = {\n value: finalValue,\n modifiers: finalModifiers,\n };\n } else {\n attrs[rawName] = value;\n }\n }\n\n return { props, attrs, directives };\n}\n\n/**\n * Internal implementation allowing an optional compile context for #model.\n * Fixes:\n * - Recognize interpolation markers embedded in text (\"World{{1}}\") and replace them.\n * - Skip empty arrays from directives so markers don't leak as text.\n * - Pass AnchorBlocks through (and deep-normalize their children's keys) so the renderer can mount/patch them surgically.\n * - Do not rewrap interpolated VNodes (preserve their keys); only fill in missing keys.\n */\nfunction htmlImpl(\n strings: TemplateStringsArray,\n values: unknown[],\n context?: Record<string, any>,\n): VNode | VNode[] {\n function textVNode(text: string, key: string): VNode {\n return h(\"#text\", {}, text, key);\n }\n\n // Stitch template with interpolation markers\n let template = \"\";\n for (let i = 0; i < strings.length; i++) {\n template += strings[i];\n if (i < values.length) template += `{{${i}}}`;\n }\n\n // Matches: tags (open/close/self), standalone interpolation markers, or any other text\n const tagRegex = /<\\/?([a-zA-Z0-9-]+)([^>]*)\\/?>|{{(\\d+)}}|([^<]+)/g;\n\n const stack: Array<{\n tag: string;\n props: Record<string, any>;\n children: VNode[];\n key: string | number | undefined;\n }> = [];\n let root: VNode | null = null;\n let match: RegExpExecArray | null;\n let currentChildren: VNode[] = [];\n let currentTag: string | null = null;\n let currentProps: Record<string, any> = {};\n let currentKey: string | number | undefined = undefined;\n let nodeIndex = 0;\n let fragmentChildren: VNode[] = []; // Track root-level nodes for fragments\n\n // Helper: merge object-like interpolation into currentProps\n function mergeIntoCurrentProps(maybe: any) {\n if (!maybe || typeof maybe !== \"object\") return;\n if (isAnchorBlock(maybe)) return; // do not merge AnchorBlocks\n if (maybe.props || maybe.attrs) {\n if (maybe.props) {\n // Ensure currentProps.props exists\n if (!currentProps.props) currentProps.props = {};\n Object.assign(currentProps.props, maybe.props);\n }\n if (maybe.attrs) {\n // Ensure currentProps.attrs exists\n if (!currentProps.attrs) currentProps.attrs = {};\n\n // Handle special merging for style and class attributes\n Object.keys(maybe.attrs).forEach((key) => {\n if (key === \"style\" && currentProps.attrs.style) {\n // Merge style attributes by concatenating with semicolon\n const existingStyle = currentProps.attrs.style.replace(\n /;?\\s*$/,\n \"\",\n );\n const newStyle = maybe.attrs.style.replace(/^;?\\s*/, \"\");\n currentProps.attrs.style = existingStyle + \"; \" + newStyle;\n } else if (key === \"class\" && currentProps.attrs.class) {\n // Merge class attributes by concatenating with space\n const existingClasses = currentProps.attrs.class\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const newClasses = maybe.attrs.class\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const allClasses = [\n ...new Set([...existingClasses, ...newClasses]),\n ];\n currentProps.attrs.class = allClasses.join(\" \");\n } else {\n // For other attributes, just assign (later values override)\n currentProps.attrs[key] = maybe.attrs[key];\n }\n });\n }\n } else {\n // If no props/attrs structure, merge directly into props\n if (!currentProps.props) currentProps.props = {};\n Object.assign(currentProps.props, maybe);\n }\n }\n\n // Helper: push an interpolated value into currentChildren/currentProps or fragments\n function pushInterpolation(val: any, baseKey: string) {\n const targetChildren = currentTag ? currentChildren : fragmentChildren;\n\n if (isAnchorBlock(val)) {\n const anchorKey = (val as VNode).key ?? baseKey;\n let anchorChildren = (val as any).children as VNode[] | undefined;\n\n targetChildren.push({\n ...(val as VNode),\n key: anchorKey,\n children: anchorChildren,\n });\n return;\n }\n\n if (isElementVNode(val)) {\n // Leave key undefined so assignKeysDeep can generate a stable one\n targetChildren.push(ensureKey(val, undefined as any));\n return;\n }\n\n if (Array.isArray(val)) {\n if (val.length === 0) return;\n for (let i = 0; i < val.length; i++) {\n const v = val[i];\n if (isAnchorBlock(v) || isElementVNode(v) || Array.isArray(v)) {\n // recurse or push without forcing a key\n pushInterpolation(v, `${baseKey}-${i}`);\n } else if (v !== null && typeof v === \"object\") {\n mergeIntoCurrentProps(v);\n } else {\n targetChildren.push(textVNode(String(v), `${baseKey}-${i}`));\n }\n }\n return;\n }\n\n if (val !== null && typeof val === \"object\") {\n mergeIntoCurrentProps(val);\n return;\n }\n\n targetChildren.push(textVNode(String(val), baseKey));\n }\n\n while ((match = tagRegex.exec(template))) {\n if (match[1]) {\n // Tag token\n const tagName = match[1];\n const isClosing = match[0][1] === \"/\";\n const isSelfClosing = match[0][match[0].length - 2] === \"/\";\n\n const {\n props: rawProps,\n attrs: rawAttrs,\n directives,\n } = parseProps(match[2] || \"\", values, context);\n\n // Shape props into { props, attrs, directives } expected by VDOM\n const vnodeProps: {\n props: Record<string, unknown>;\n attrs: Record<string, unknown>;\n directives?: Record<string, { value: any; modifiers: string[] }>;\n } = { props: {}, attrs: {} };\n\n for (const k in rawProps) vnodeProps.props[k] = rawProps[k];\n for (const k in rawAttrs) vnodeProps.attrs[k] = rawAttrs[k];\n\n // Process built-in directives that should be converted to props/attrs\n for (const [directiveName, directive] of Object.entries(directives)) {\n if (directiveName === \"bind\") {\n // #bind directive - can be object syntax or simple value\n if (typeof directive.value === \"object\" && directive.value !== null) {\n // #bind object syntax: #bind=\"{ disabled: true, class: 'foo' }\"\n for (const [key, value] of Object.entries(directive.value)) {\n if (typeof value === \"boolean\") {\n vnodeProps.attrs[key] = value;\n } else if (value != null) {\n vnodeProps.attrs[key] = String(value);\n }\n }\n } else if (directive.value != null) {\n // Simple #bind (though this is unusual - typically it's object syntax)\n vnodeProps.attrs[directiveName] = String(directive.value);\n }\n } else if (directiveName === \"show\") {\n // #show directive\n const visible = Boolean(directive.value);\n vnodeProps.attrs.style =\n (vnodeProps.attrs.style || \"\") +\n (visible ? \"\" : \"; display: none !important\");\n } else if (directiveName === \"class\") {\n // #class directive\n const classValue = directive.value;\n let classNames: string[] = [];\n\n if (typeof classValue === \"string\") {\n classNames = classValue.split(/\\s+/).filter(Boolean);\n } else if (Array.isArray(classValue)) {\n for (const cls of classValue as any[]) {\n if (typeof cls === \"string\") {\n classNames.push(...cls.split(/\\s+/).filter(Boolean));\n } else if (cls && typeof cls === \"object\") {\n for (const [className, condition] of Object.entries(cls)) {\n if (condition) {\n classNames.push(...className.split(/\\s+/).filter(Boolean));\n }\n }\n }\n }\n } else if (classValue && typeof classValue === \"object\") {\n for (const [className, condition] of Object.entries(classValue)) {\n if (condition) {\n classNames.push(...className.split(/\\s+/).filter(Boolean));\n }\n }\n }\n\n const existingClass = (vnodeProps.attrs.class as string) || \"\";\n const newClasses = [\n ...new Set([\n ...existingClass.split(/\\s+/).filter(Boolean),\n ...classNames,\n ]),\n ];\n vnodeProps.attrs.class = newClasses.join(\" \");\n } else if (directiveName === \"style\") {\n // #style directive\n const styleValue = directive.value;\n let styleString = \"\";\n\n if (typeof styleValue === \"string\") {\n styleString = styleValue;\n } else if (styleValue && typeof styleValue === \"object\") {\n const styleRules: string[] = [];\n for (const [property, value] of Object.entries(styleValue)) {\n if (value != null && value !== \"\") {\n const kebabProperty = property.replace(\n /[A-Z]/g,\n (match) => `-${match.toLowerCase()}`,\n );\n const needsPx = [\n \"width\",\n \"height\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"margin\",\n \"margin-top\",\n \"margin-right\",\n \"margin-bottom\",\n \"margin-left\",\n \"padding\",\n \"padding-top\",\n \"padding-right\",\n \"padding-bottom\",\n \"padding-left\",\n \"font-size\",\n \"line-height\",\n \"border-width\",\n \"border-radius\",\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n ];\n let cssValue = String(value);\n if (\n typeof value === \"number\" &&\n needsPx.includes(kebabProperty)\n ) {\n cssValue = `${value}px`;\n }\n styleRules.push(`${kebabProperty}: ${cssValue}`);\n }\n }\n styleString =\n styleRules.join(\"; \") + (styleRules.length > 0 ? \";\" : \"\");\n }\n\n const existingStyle = (vnodeProps.attrs.style as string) || \"\";\n vnodeProps.attrs.style =\n existingStyle +\n (existingStyle && !existingStyle.endsWith(\";\") ? \"; \" : \"\") +\n styleString;\n }\n }\n\n // Add remaining directives that need special handling by the VDOM renderer\n const remainingDirectives: Record<\n string,\n { value: any; modifiers: string[] }\n > = {};\n for (const [directiveName, directive] of Object.entries(directives)) {\n if (![\"bind\", \"show\", \"class\", \"style\"].includes(directiveName)) {\n remainingDirectives[directiveName] = directive;\n }\n }\n\n if (Object.keys(remainingDirectives).length > 0) {\n vnodeProps.directives = remainingDirectives;\n }\n\n if (isClosing) {\n const node = h(\n currentTag!,\n currentProps,\n currentChildren.length === 1 &&\n isElementVNode(currentChildren[0]) &&\n currentChildren[0].tag === \"#text\"\n ? typeof currentChildren[0].children === \"string\"\n ? currentChildren[0].children\n : \"\"\n : currentChildren.length\n ? currentChildren\n : undefined,\n currentKey,\n );\n const prev = stack.pop();\n if (prev) {\n currentTag = prev.tag;\n currentProps = prev.props;\n currentKey = prev.key;\n currentChildren = prev.children;\n currentChildren.push(node);\n } else {\n root = node;\n }\n } else if (isSelfClosing) {\n const key = undefined;\n const targetChildren = currentTag ? currentChildren : fragmentChildren;\n targetChildren.push(h(tagName, vnodeProps, undefined, key));\n } else {\n if (currentTag) {\n stack.push({\n tag: currentTag,\n props: currentProps,\n children: currentChildren,\n key: currentKey,\n });\n }\n currentTag = tagName;\n currentProps = vnodeProps;\n currentChildren = [];\n }\n } else if (typeof match[3] !== \"undefined\") {\n // Standalone interpolation marker {{N}}\n const idx = Number(match[3]);\n const val = values[idx];\n const baseKey = `interp-${idx}`;\n pushInterpolation(val, baseKey);\n } else if (match[4]) {\n // Plain text (may contain embedded interpolation markers like \"...{{N}}...\")\n const text = match[4];\n\n const targetChildren = currentTag ? currentChildren : fragmentChildren;\n\n // Split text by embedded markers and handle parts\n const parts = text.split(/({{\\d+}})/);\n for (const part of parts) {\n if (!part) continue;\n\n const interp = part.match(/^{{(\\d+)}}$/);\n if (interp) {\n const idx = Number(interp[1]);\n const val = values[idx];\n const baseKey = `interp-${idx}`;\n pushInterpolation(val, baseKey);\n } else {\n const key = `text-${nodeIndex++}`;\n targetChildren.push(textVNode(part, key));\n }\n }\n }\n }\n\n // If we have a single root element, return it\n if (root) {\n // Clean empty text nodes at root level\n if (isElementVNode(root) && Array.isArray(root.children)) {\n root.children = (root.children as VNode[]).filter(\n (child): child is VNode =>\n isElementVNode(child)\n ? child.tag !== \"#text\" ||\n (typeof child.children === \"string\" &&\n child.children.trim() !== \"\")\n : true, // keep non-element VNodes (including anchors) as-is\n );\n }\n return root;\n }\n\n // If we have fragment children (multiple root nodes), return them as array\n if (fragmentChildren.length > 0) {\n // Filter out empty text nodes\n const cleanedFragments = fragmentChildren.filter((child): child is VNode =>\n isElementVNode(child)\n ? child.tag !== \"#text\" ||\n (typeof child.children === \"string\" && child.children.trim() !== \"\")\n : true,\n );\n\n return cleanedFragments.length === 1\n ? cleanedFragments[0]\n : cleanedFragments;\n }\n\n // Fallback for empty content\n return h(\"div\", {}, \"\", \"fallback-root\");\n}\n\n/**\n * Default export: plain html.\n */\nexport function html(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): VNode | VNode[] {\n // If last value is a context object, use it\n const last = values[values.length - 1];\n const context =\n typeof last === \"object\" && last && !Array.isArray(last)\n ? (last as Record<string, any>)\n : undefined;\n\n return htmlImpl(strings, values, context);\n}\n","import type { VNode } from \"./vdom\";\n\n/* --- When --- */\nexport function when(cond: boolean, children: VNode | VNode[]): VNode {\n const anchorKey = \"when-block\"; // stable key regardless of condition\n return anchorBlock(cond ? children : [], anchorKey);\n}\n\n/* --- Each --- */\nexport function each<\n T extends string | number | boolean | { id?: string | number; key?: string },\n>(list: T[], render: (item: T, index: number) => VNode | VNode[]): VNode[] {\n return list.map((item, i) => {\n // For primitives, use value as key; for objects, prefer key/id\n const itemKey =\n typeof item === \"object\"\n ? ((item as any)?.key ?? (item as any)?.id ?? `idx-${i}`)\n : String(item);\n return anchorBlock(render(item, i), `each-${itemKey}`);\n });\n}\n\n/* --- match --- */\nexport function match() {\n const branches: Branch[] = [];\n return {\n when(cond: any, content: VNode | VNode[]) {\n branches.push([cond, content]);\n return this;\n },\n otherwise(content: VNode | VNode[]) {\n branches.push([true, content]);\n return this;\n },\n done() {\n return whenChain(...branches);\n },\n };\n}\n\n/* --- WhenChain --- */\ntype Branch = [condition: any, content: VNode | VNode[]];\n\nfunction whenChain(...branches: Branch[]): VNode[] {\n for (let idx = 0; idx < branches.length; idx++) {\n const [cond, content] = branches[idx];\n if (cond) return [anchorBlock(content, `whenChain-branch-${idx}`)];\n }\n return [anchorBlock([], \"whenChain-empty\")];\n}\n\n/**\n * Create a stable anchor block with consistent boundaries.\n * Always has start/end boundaries.\n */\nfunction anchorBlock(\n children: VNode | VNode[] | null | undefined,\n anchorKey: string,\n): VNode {\n // Normalize children to array, filtering out null/undefined\n const childArray = !children\n ? []\n : Array.isArray(children)\n ? children.filter(Boolean)\n : [children].filter(Boolean);\n\n return {\n tag: \"#anchor\",\n key: anchorKey,\n children: childArray,\n };\n}","/**\n * vdom.ts\n * Lightweight, strongly typed, functional virtual DOM renderer for custom elements.\n * Features: keyed diffing, incremental patching, focus/caret preservation, event delegation, SSR-friendly, no dependencies.\n */\n\nexport interface VNode {\n tag: string;\n key?: string;\n props?: {\n key?: string;\n props?: any;\n attrs?: Record<string, any>;\n directives?: Record<string, { value: string; modifiers: string[] }>;\n };\n children?: VNode[] | string;\n}\n\nexport interface AnchorBlockVNode extends VNode {\n tag: \"#anchor\";\n key: string;\n children: VNode[];\n _startNode?: Comment;\n _endNode?: Comment;\n}\n\n/**\n * Get nested property value from object using dot notation\n */\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * Set nested property value in object using dot notation\n */\nfunction setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split(\".\");\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n const target = keys.reduce((current, key) => {\n if (!(key in current)) {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n/**\n * Process #model directive for two-way data binding\n */\nfunction processModelDirective(\n value: string,\n modifiers: string[],\n props: Record<string, any>,\n attrs: Record<string, any>,\n listeners: Record<string, EventListener>,\n context?: any,\n el?: HTMLElement,\n): void {\n if (!context) return;\n\n const hasLazy = modifiers.includes(\"lazy\");\n const hasTrim = modifiers.includes(\"trim\");\n const hasNumber = modifiers.includes(\"number\");\n\n // Get current value from state - always get fresh value to avoid stale closures\n const getCurrentValue = () => {\n const actualState = context._state || context;\n return getNestedValue(actualState, value);\n };\n const currentValue = getCurrentValue();\n\n // Determine input type from attrs or element\n let inputType = \"text\";\n const attrInputType = attrs?.type;\n\n if (el instanceof HTMLInputElement) {\n inputType = attrInputType || el.type || \"text\";\n } else if (el instanceof HTMLSelectElement) {\n inputType = \"select\";\n } else if (el instanceof HTMLTextAreaElement) {\n inputType = \"textarea\";\n }\n\n // Set initial value only if different from current DOM value to prevent infinite loops\n if (inputType === \"checkbox\") {\n if (Array.isArray(currentValue)) {\n // Multiple checkboxes bound to array\n const checkboxValue = el?.getAttribute(\"value\") || attrs?.value || \"\";\n const shouldBeChecked = currentValue.includes(checkboxValue);\n if (el && (el as HTMLInputElement).checked !== shouldBeChecked) {\n props.checked = shouldBeChecked;\n }\n } else {\n // Single checkbox bound to boolean or custom values\n const trueValue = el?.getAttribute(\"true-value\") || true;\n const shouldBeChecked = currentValue === trueValue;\n if (el && (el as HTMLInputElement).checked !== shouldBeChecked) {\n props.checked = shouldBeChecked;\n }\n }\n } else if (inputType === \"radio\") {\n const radioValue = attrs?.value || \"\";\n const shouldBeChecked = currentValue === radioValue;\n if (el && (el as HTMLInputElement).checked !== shouldBeChecked) {\n props.checked = shouldBeChecked;\n }\n } else if (inputType === \"select\") {\n // Handle both single and multiple select\n if (el && el.hasAttribute(\"multiple\")) {\n // Multiple select - currentValue should be an array\n const selectEl = el as HTMLSelectElement;\n const currentArray = Array.isArray(currentValue) ? currentValue : [];\n\n // Only update if different to prevent loops\n setTimeout(() => {\n Array.from(selectEl.options).forEach((option) => {\n const shouldBeSelected = currentArray.includes(option.value);\n if (option.selected !== shouldBeSelected) {\n option.selected = shouldBeSelected;\n }\n });\n }, 0);\n } else {\n // Single select\n setTimeout(() => {\n if (\n el instanceof HTMLSelectElement &&\n el.value !== String(currentValue)\n ) {\n el.value = String(currentValue);\n }\n }, 0);\n }\n } else {\n // Only set value prop if different from current DOM value to prevent infinite loops\n const stringValue = String(currentValue ?? \"\");\n if (\n !el ||\n (el as HTMLInputElement | HTMLTextAreaElement).value !== stringValue\n ) {\n props.value = currentValue;\n }\n }\n\n // Create event listener with loop prevention\n const eventType =\n hasLazy ||\n inputType === \"checkbox\" ||\n inputType === \"radio\" ||\n inputType === \"select\"\n ? \"change\"\n : \"input\";\n\n const eventListener: EventListener = (event: Event) => {\n // Skip during IME composition - check multiple ways\n if ((event as any).isComposing || (listeners as any)._isComposing) return;\n\n // Skip if this is a programmatic change (not user-initiated)\n if ((event as any).isTrusted === false) return;\n\n const target = event.target as\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\n // Skip if event is fired during our own value updates\n if ((target as any)._modelUpdating) return;\n\n // Always get fresh current value to avoid stale closures\n const freshCurrentValue = getCurrentValue();\n\n let newValue: any = target.value;\n\n // Handle different input types\n if (inputType === \"checkbox\") {\n if (Array.isArray(freshCurrentValue)) {\n // Multiple checkboxes bound to array\n const checkboxValue = target.getAttribute(\"value\") || \"\";\n const currentArray = [...freshCurrentValue];\n if ((target as HTMLInputElement).checked) {\n if (!currentArray.includes(checkboxValue)) {\n currentArray.push(checkboxValue);\n }\n } else {\n const index = currentArray.indexOf(checkboxValue);\n if (index > -1) {\n currentArray.splice(index, 1);\n }\n }\n newValue = currentArray;\n } else {\n // Single checkbox\n const trueValue = target.getAttribute(\"true-value\") || true;\n const falseValue = target.getAttribute(\"false-value\") || false;\n newValue = (target as HTMLInputElement).checked\n ? trueValue\n : falseValue;\n }\n } else if (inputType === \"radio\") {\n newValue = target.getAttribute(\"value\") || target.value;\n } else if (\n inputType === \"select\" &&\n (target as HTMLSelectElement).multiple\n ) {\n // Handle multiple select\n const selectEl = target as HTMLSelectElement;\n newValue = Array.from(selectEl.selectedOptions).map(\n (option) => option.value,\n );\n } else {\n // Apply modifiers for text inputs\n if (hasTrim) {\n newValue = newValue.trim();\n }\n if (hasNumber) {\n const numValue = Number(newValue);\n if (!isNaN(numValue)) {\n newValue = numValue;\n }\n }\n }\n\n // Get current state value to check if update is needed\n const actualState = context._state || context;\n const currentStateValue = getNestedValue(actualState, value);\n\n // Only update if the value has actually changed (prevent infinite loops)\n // For arrays, do a deep comparison\n const hasChanged =\n Array.isArray(newValue) && Array.isArray(currentStateValue)\n ? JSON.stringify([...newValue].sort()) !==\n JSON.stringify([...currentStateValue].sort())\n : newValue !== currentStateValue;\n\n if (hasChanged) {\n // Mark element as updating to prevent feedback loops\n const element = event.target as HTMLElement;\n (element as any)._modelUpdating = true;\n\n // Update using the actual state object for proper nested property support\n setNestedValue(actualState, value, newValue);\n\n // Clear the updating flag after a tick\n setTimeout(() => {\n (element as any)._modelUpdating = false;\n }, 0);\n\n // Trigger re-render if context has a render method\n if (context._requestRender) {\n context._requestRender();\n }\n }\n };\n\n listeners[eventType] = eventListener;\n\n // Handle IME composition for all input types (not just when !hasLazy)\n if (inputType === \"text\" || inputType === \"textarea\") {\n const compositionStartListener: EventListener = () => {\n // Flag to skip input events during composition\n (listeners as any)._isComposing = true;\n };\n\n const compositionEndListener: EventListener = (event: Event) => {\n (listeners as any)._isComposing = false;\n\n // Capture the target reference before setTimeout to avoid losing it\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n // Manually trigger the update after composition ends\n setTimeout(() => {\n if (target) {\n let newValue: any = target.value;\n\n // Apply modifiers\n if (hasTrim) {\n newValue = newValue.trim();\n }\n if (hasNumber) {\n const numValue = Number(newValue);\n if (!isNaN(numValue)) {\n newValue = numValue;\n }\n }\n\n // Get current state value and only update if different\n const actualState = context._state || context;\n const currentStateValue = getNestedValue(actualState, value);\n\n // For arrays, do a deep comparison\n const hasChanged =\n Array.isArray(newValue) && Array.isArray(currentStateValue)\n ? JSON.stringify([...newValue].sort()) !==\n JSON.stringify([...currentStateValue].sort())\n : newValue !== currentStateValue;\n\n if (hasChanged) {\n // Mark element as updating to prevent feedback loops\n if (target) {\n (target as any)._modelUpdating = true;\n setTimeout(() => {\n (target as any)._modelUpdating = false;\n }, 0);\n }\n\n setNestedValue(actualState, value, newValue);\n\n if (context._requestRender) {\n context._requestRender();\n }\n }\n }\n }, 0);\n };\n\n listeners.compositionstart = compositionStartListener;\n listeners.compositionend = compositionEndListener;\n }\n}\n\n/**\n * Process #bind directive for attribute/property binding\n */\nfunction processBindDirective(\n value: string,\n props: Record<string, any>,\n attrs: Record<string, any>,\n context?: any,\n): void {\n if (!context) return;\n\n try {\n // Parse as object binding\n const bindings = JSON.parse(value);\n if (typeof bindings === \"object\") {\n for (const [key, val] of Object.entries(bindings)) {\n props[key] = val;\n }\n }\n } catch {\n // Parse as single property binding\n const currentValue = getNestedValue(context, value);\n // Default to binding as attribute\n attrs[value] = currentValue;\n }\n}\n\n/**\n * Process #show directive for conditional display\n */\nfunction processShowDirective(\n value: string,\n attrs: Record<string, any>,\n context?: any,\n): void {\n if (!context) return;\n\n const isVisible = getNestedValue(context, value);\n const currentStyle = attrs.style || \"\";\n const displayStyle = isVisible ? \"\" : \"none\";\n\n // Merge with existing styles\n if (currentStyle) {\n const styleRules = currentStyle.split(\";\").filter(Boolean);\n const displayIndex = styleRules.findIndex((rule: string) =>\n rule.trim().startsWith(\"display:\"),\n );\n\n if (displayIndex >= 0) {\n styleRules[displayIndex] = `display: ${displayStyle}`;\n } else {\n styleRules.push(`display: ${displayStyle}`);\n }\n\n attrs.style = styleRules.join(\"; \");\n } else {\n attrs.style = `display: ${displayStyle}`;\n }\n}\n\n/**\n * Process #class directive for conditional CSS classes\n */\nfunction processClassDirective(\n value: string,\n attrs: Record<string, any>,\n context?: any,\n): void {\n if (!context) return;\n\n const classValue = getNestedValue(context, value);\n let classes: string[] = [];\n\n if (typeof classValue === \"string\") {\n classes = [classValue];\n } else if (Array.isArray(classValue)) {\n classes = classValue.filter(Boolean);\n } else if (typeof classValue === \"object\") {\n // Object syntax: { className: condition }\n classes = Object.entries(classValue)\n .filter(([, condition]) => Boolean(condition))\n .map(([className]) => className);\n }\n\n const existingClasses = attrs.class || \"\";\n const allClasses = existingClasses\n ? `${existingClasses} ${classes.join(\" \")}`.trim()\n : classes.join(\" \");\n\n if (allClasses) {\n attrs.class = allClasses;\n }\n}\n\nfunction processStyleDirective(\n value: any,\n attrs: Record<string, any>,\n context?: any,\n): void {\n let styleValue: any;\n\n if (typeof value === \"string\") {\n if (!context) return;\n styleValue = getNestedValue(context, value);\n } else {\n styleValue = value;\n }\n\n let styleString = \"\";\n\n if (typeof styleValue === \"string\") {\n styleString = styleValue;\n } else if (styleValue && typeof styleValue === \"object\") {\n const styleRules: string[] = [];\n for (const [property, val] of Object.entries(styleValue)) {\n if (val != null && val !== \"\") {\n const kebabProperty = property.replace(\n /[A-Z]/g,\n (match) => `-${match.toLowerCase()}`,\n );\n const needsPx = [\n \"width\",\n \"height\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"margin\",\n \"margin-top\",\n \"margin-right\",\n \"margin-bottom\",\n \"margin-left\",\n \"padding\",\n \"padding-top\",\n \"padding-right\",\n \"padding-bottom\",\n \"padding-left\",\n \"font-size\",\n \"line-height\",\n \"border-width\",\n \"border-radius\",\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n ];\n let cssValue = String(val);\n if (typeof val === \"number\" && needsPx.includes(kebabProperty)) {\n cssValue = `${val}px`;\n }\n styleRules.push(`${kebabProperty}: ${cssValue}`);\n }\n }\n styleString = styleRules.join(\"; \") + (styleRules.length > 0 ? \";\" : \"\");\n }\n\n const existingStyle = attrs.style || \"\";\n attrs.style =\n existingStyle +\n (existingStyle && !existingStyle.endsWith(\";\") ? \"; \" : \"\") +\n styleString;\n}\n\n/**\n * Process directives and return merged props, attrs, and event listeners\n */\nfunction processDirectives(\n directives: Record<string, { value: any; modifiers: string[] }>,\n context?: any,\n el?: HTMLElement,\n vnodeAttrs?: Record<string, any>,\n): {\n props: Record<string, any>;\n attrs: Record<string, any>;\n listeners: Record<string, EventListener>;\n} {\n const props: Record<string, any> = {};\n const attrs: Record<string, any> = { ...(vnodeAttrs || {}) };\n const listeners: Record<string, EventListener> = {};\n\n for (const [directiveName, directive] of Object.entries(directives)) {\n const { value, modifiers } = directive;\n\n switch (directiveName) {\n case \"model\":\n processModelDirective(\n typeof value === \"string\" ? value : String(value),\n modifiers,\n props,\n attrs,\n listeners,\n context,\n el,\n );\n break;\n case \"bind\":\n processBindDirective(value, props, attrs, context);\n break;\n case \"show\":\n processShowDirective(value, attrs, context);\n break;\n case \"class\":\n processClassDirective(value, attrs, context);\n break;\n case \"style\":\n processStyleDirective(value, attrs, context);\n break;\n // Add other directive cases here as needed\n }\n }\n\n return { props, attrs, listeners };\n}\n\nfunction assignKeysDeep(\n nodeOrNodes: VNode | VNode[],\n baseKey: string,\n): VNode | VNode[] {\n if (Array.isArray(nodeOrNodes)) {\n const usedKeys = new Set<string>();\n\n return nodeOrNodes.map((child) => {\n if (!child || typeof child !== \"object\") return child;\n\n // Determine the starting key\n let key = child.props?.key ?? child.key;\n\n if (!key) {\n // Build a stable identity from tag + stable attributes\n const tagPart = child.tag || \"node\";\n const idPart =\n child.props?.attrs?.id ??\n child.props?.attrs?.name ??\n child.props?.attrs?.[\"data-key\"] ??\n \"\";\n key = idPart\n ? `${baseKey}:${tagPart}:${idPart}`\n : `${baseKey}:${tagPart}`;\n }\n\n // Ensure uniqueness among siblings\n let uniqueKey = key;\n let counter = 1;\n while (usedKeys.has(uniqueKey)) {\n uniqueKey = `${key}#${counter++}`;\n }\n usedKeys.add(uniqueKey);\n\n // Recurse into children with this node's unique key\n let children = child.children;\n if (Array.isArray(children)) {\n children = assignKeysDeep(children, uniqueKey) as VNode[];\n }\n\n return { ...child, key: uniqueKey, children };\n });\n }\n\n // Single node case\n const node = nodeOrNodes as VNode;\n let key = node.props?.key ?? node.key ?? baseKey;\n\n let children = node.children;\n if (Array.isArray(children)) {\n children = assignKeysDeep(children, key) as VNode[];\n }\n\n return { ...node, key, children };\n}\n\n/**\n * Patch props on an element.\n * Only update changed props, remove old, add new.\n */\nfunction patchProps(\n el: HTMLElement,\n oldProps: Record<string, any>,\n newProps: Record<string, any>,\n context?: any,\n) {\n // Process directives first\n const newDirectives = newProps.directives ?? {};\n const processedDirectives = processDirectives(\n newDirectives,\n context,\n el,\n newProps.attrs,\n );\n\n // Merge processed directive results with existing props/attrs\n const mergedProps = {\n ...oldProps.props,\n ...newProps.props,\n ...processedDirectives.props,\n };\n const mergedAttrs = {\n ...oldProps.attrs,\n ...newProps.attrs,\n ...processedDirectives.attrs,\n };\n\n const oldPropProps = oldProps.props ?? {};\n const newPropProps = mergedProps;\n for (const key in { ...oldPropProps, ...newPropProps }) {\n const oldVal = oldPropProps[key];\n const newVal = newPropProps[key];\n if (oldVal !== newVal) {\n if (\n key === \"value\" &&\n (el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement)\n ) {\n if (el.value !== newVal) el.value = newVal ?? \"\";\n } else if (key === \"checked\" && el instanceof HTMLInputElement) {\n el.checked = !!newVal;\n } else if (key.startsWith(\"on\") && typeof newVal === \"function\") {\n if (typeof oldVal === \"function\")\n el.removeEventListener(key.slice(2).toLowerCase(), oldVal);\n el.addEventListener(key.slice(2).toLowerCase(), newVal);\n } else if (newVal === undefined || newVal === null || newVal === false) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(newVal));\n }\n }\n }\n\n // Handle directive event listeners\n for (const [eventType, listener] of Object.entries(\n processedDirectives.listeners || {},\n )) {\n el.addEventListener(eventType, listener as EventListener);\n }\n\n const oldAttrs = oldProps.attrs ?? {};\n const newAttrs = mergedAttrs;\n for (const key in { ...oldAttrs, ...newAttrs }) {\n const oldVal = oldAttrs[key];\n const newVal = newAttrs[key];\n if (oldVal !== newVal) {\n if (\n newVal === undefined ||\n newVal === null ||\n newVal === false\n ) el.removeAttribute(key);\n else el.setAttribute(key, String(newVal));\n }\n }\n}\n\nfunction createElement(vnode: VNode | string, context?: any): Node {\n // String VNode → plain text node (no key)\n if (typeof vnode === \"string\") {\n return document.createTextNode(vnode);\n }\n\n // Text VNode\n if (vnode.tag === \"#text\") {\n const textNode = document.createTextNode(\n typeof vnode.children === \"string\" ? vnode.children : \"\",\n );\n if (vnode.key != null) (textNode as any).key = vnode.key; // attach key\n return textNode;\n }\n\n // Anchor block VNode - ALWAYS create start/end boundaries\n if (vnode.tag === \"#anchor\") {\n const anchorVNode = vnode as AnchorBlockVNode;\n const children = Array.isArray(anchorVNode.children)\n ? anchorVNode.children\n : [];\n\n // Always create start/end markers for stable boundaries\n const start = document.createTextNode(\"\");\n const end = document.createTextNode(\"\");\n\n if (anchorVNode.key != null) {\n (start as any).key = `${anchorVNode.key}:start`;\n (end as any).key = `${anchorVNode.key}:end`;\n }\n anchorVNode._startNode = start;\n anchorVNode._endNode = end;\n\n const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n frag.appendChild(createElement(child, context));\n }\n frag.appendChild(end);\n return frag;\n }\n\n // Standard element VNode\n const el = document.createElement(vnode.tag);\n if (vnode.key != null) (el as any).key = vnode.key; // attach key\n\n const { props = {}, attrs = {}, directives = {} } = vnode.props ?? {};\n\n // Process directives first to get merged props/attrs/listeners\n const processedDirectives = processDirectives(directives, context, el, attrs);\n\n // Merge processed directive results with existing props/attrs\n const mergedProps = {\n ...props,\n ...processedDirectives.props,\n };\n const mergedAttrs = {\n ...attrs,\n ...processedDirectives.attrs,\n };\n\n // Set attributes\n for (const key in mergedAttrs) {\n const val = mergedAttrs[key];\n if (typeof val === \"boolean\") {\n if (val) el.setAttribute(key, \"\");\n // If false, do not set attribute\n } else if (val !== undefined && val !== null) {\n el.setAttribute(key, String(val));\n }\n }\n\n // Set props and event listeners\n for (const key in mergedProps) {\n const val = mergedProps[key];\n if (\n key === \"value\" &&\n (el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement)\n ) {\n el.value = val ?? \"\";\n } else if (key === \"checked\" && el instanceof HTMLInputElement) {\n el.checked = !!val;\n } else if (key.startsWith(\"on\") && typeof val === \"function\") {\n el.addEventListener(key.slice(2).toLowerCase(), val);\n } else if (key.startsWith(\"on\") && val === undefined) {\n continue; // skip undefined event handlers\n } else if (val === undefined || val === null || val === false) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(val));\n }\n }\n\n // Handle directive event listeners\n for (const [eventType, listener] of Object.entries(\n processedDirectives.listeners || {},\n )) {\n el.addEventListener(eventType, listener as EventListener);\n }\n\n // Append children\n if (Array.isArray(vnode.children)) {\n for (const child of vnode.children) {\n el.appendChild(createElement(child, context));\n }\n } else if (typeof vnode.children === \"string\") {\n el.textContent = vnode.children;\n }\n\n return el;\n}\n\n/**\n * Patch children using keys for node matching.\n */\nfunction patchChildren(\n parent: HTMLElement,\n oldChildren: VNode[] | string | undefined,\n newChildren: VNode[] | string | undefined,\n context?: any,\n) {\n if (typeof newChildren === \"string\") {\n if (parent.textContent !== newChildren) parent.textContent = newChildren;\n return;\n }\n if (!Array.isArray(newChildren)) return;\n\n const oldNodes = Array.from(parent.childNodes);\n const oldVNodes: VNode[] = Array.isArray(oldChildren) ? oldChildren : [];\n\n // Map old VNodes by key\n const oldVNodeByKey = new Map<string | number, VNode>();\n for (const v of oldVNodes) {\n if (v && v.key != null) oldVNodeByKey.set(v.key, v);\n }\n\n // Map DOM nodes by key (elements, text, anchors)\n const oldNodeByKey = new Map<string | number, Node>();\n\n // Scan DOM for keyed nodes including anchor boundaries\n for (const node of oldNodes) {\n const k = (node as any).key;\n if (k != null) {\n oldNodeByKey.set(k, node);\n }\n }\n\n const usedNodes = new Set<Node>();\n let nextSibling: Node | null = parent.firstChild;\n\n function markRangeUsed(start: Comment, end?: Comment) {\n let cur: Node | null = start;\n while (cur) {\n usedNodes.add(cur);\n if (cur === end) break;\n cur = cur.nextSibling;\n }\n }\n\n // --- Integrated patchChildrenBetween ---\n function patchChildrenBetween(\n start: Comment,\n end: Comment,\n oldChildren: VNode[] | undefined,\n newChildren: VNode[],\n ) {\n const oldNodesInRange: Node[] = [];\n let cur: Node | null = start.nextSibling;\n while (cur && cur !== end) {\n oldNodesInRange.push(cur);\n cur = cur.nextSibling;\n }\n\n const oldVNodesInRange: VNode[] = Array.isArray(oldChildren)\n ? oldChildren\n : [];\n const hasKeys =\n newChildren.some((c) => c && c.key != null) ||\n oldVNodesInRange.some((c) => c && c.key != null);\n\n if (hasKeys) {\n // Keyed diff\n const oldVNodeByKeyRange = new Map<string | number, VNode>();\n const oldNodeByKeyRange = new Map<string | number, Node>();\n\n for (const v of oldVNodesInRange) {\n if (v && v.key != null) oldVNodeByKeyRange.set(v.key, v);\n }\n for (const node of oldNodesInRange) {\n const k = (node as any).key;\n if (k != null) oldNodeByKeyRange.set(k, node);\n }\n\n const usedInRange = new Set<Node>();\n let next: Node | null = start.nextSibling;\n\n for (const newVNode of newChildren) {\n let node: Node;\n if (newVNode.key != null && oldNodeByKeyRange.has(newVNode.key)) {\n const oldVNode = oldVNodeByKeyRange.get(newVNode.key)!;\n node = patch(\n oldNodeByKeyRange.get(newVNode.key)!,\n oldVNode,\n newVNode,\n context,\n );\n usedInRange.add(node);\n if (node !== next && parent.contains(node)) {\n parent.insertBefore(node, next);\n }\n } else {\n node = createElement(newVNode, context);\n parent.insertBefore(node, next);\n usedInRange.add(node);\n }\n next = node.nextSibling;\n }\n\n // Remove unused\n for (const node of oldNodesInRange) {\n if (!usedInRange.has(node) && parent.contains(node)) {\n parent.removeChild(node);\n }\n }\n } else {\n // Keyless fallback: index-based patch\n const commonLength = Math.min(\n oldVNodesInRange.length,\n newChildren.length,\n );\n\n for (let i = 0; i < commonLength; i++) {\n const oldVNode = oldVNodesInRange[i];\n const newVNode = newChildren[i];\n const node = patch(oldNodesInRange[i], oldVNode, newVNode, context);\n if (node !== oldNodesInRange[i]) {\n parent.insertBefore(node, oldNodesInRange[i]);\n parent.removeChild(oldNodesInRange[i]);\n }\n }\n\n // Add extra new\n for (let i = commonLength; i < newChildren.length; i++) {\n parent.insertBefore(createElement(newChildren[i], context), end);\n }\n\n // Remove extra old\n for (let i = commonLength; i < oldNodesInRange.length; i++) {\n parent.removeChild(oldNodesInRange[i]);\n }\n }\n }\n // --- End integrated patchChildrenBetween ---\n\n for (const newVNode of newChildren) {\n let node: Node;\n\n // Handle AnchorBlocks\n if (newVNode.tag === \"#anchor\") {\n const aKey = newVNode.key!;\n const startKey = `${aKey}:start`;\n const endKey = `${aKey}:end`;\n\n let start = oldNodeByKey.get(startKey) as Node;\n let end = oldNodeByKey.get(endKey) as Node;\n const children = Array.isArray(newVNode.children)\n ? newVNode.children\n : [];\n\n // Create boundaries if they don't exist\n if (!start) {\n start = document.createTextNode(\"\");\n (start as any).key = startKey;\n }\n if (!end) {\n end = document.createTextNode(\"\");\n (end as any).key = endKey;\n }\n\n // Preserve anchor references on the new VNode\n (newVNode as AnchorBlockVNode)._startNode = start as Comment;\n (newVNode as AnchorBlockVNode)._endNode = end as Comment;\n\n // If boundaries aren't in DOM, insert the whole fragment\n if (!parent.contains(start) || !parent.contains(end)) {\n parent.insertBefore(start, nextSibling);\n for (const child of children) {\n parent.insertBefore(createElement(child, context), nextSibling);\n }\n parent.insertBefore(end, nextSibling);\n } else {\n // Patch children between existing boundaries\n patchChildrenBetween(\n start as Comment,\n end as Comment,\n (oldVNodeByKey.get(aKey) as VNode)?.children as VNode[] | undefined,\n children,\n );\n }\n\n markRangeUsed(start as Comment, end as Comment);\n nextSibling = end.nextSibling;\n continue;\n }\n\n // Normal keyed element/text\n if (newVNode.key != null && oldNodeByKey.has(newVNode.key)) {\n const oldVNode = oldVNodeByKey.get(newVNode.key)!;\n node = patch(\n oldNodeByKey.get(newVNode.key)!,\n oldVNode,\n newVNode,\n context,\n );\n usedNodes.add(node);\n if (node !== nextSibling && parent.contains(node)) {\n if (nextSibling && !parent.contains(nextSibling)) nextSibling = null;\n parent.insertBefore(node, nextSibling);\n }\n } else {\n node = createElement(newVNode, context);\n if (nextSibling && !parent.contains(nextSibling)) nextSibling = null;\n parent.insertBefore(node, nextSibling);\n usedNodes.add(node);\n }\n\n nextSibling = node.nextSibling;\n }\n\n // Remove unused nodes\n for (const node of oldNodes) {\n if (!usedNodes.has(node) && parent.contains(node)) {\n parent.removeChild(node);\n }\n }\n}\n\n/**\n * Patch a node using keys for node matching.\n */\nfunction patch(\n dom: Node,\n oldVNode: VNode | string | null,\n newVNode: VNode | string | null,\n context?: any,\n): Node {\n if (oldVNode === newVNode) return dom;\n\n if (typeof newVNode === \"string\") {\n if (dom.nodeType === Node.TEXT_NODE) {\n if (dom.textContent !== newVNode) dom.textContent = newVNode;\n return dom;\n } else {\n const textNode = document.createTextNode(newVNode);\n dom.parentNode?.replaceChild(textNode, dom);\n return textNode;\n }\n }\n\n if (newVNode && typeof newVNode !== \"string\" && newVNode.tag === \"#anchor\") {\n const anchorVNode = newVNode as AnchorBlockVNode;\n const children = Array.isArray(anchorVNode.children)\n ? anchorVNode.children\n : [];\n\n const start = anchorVNode._startNode ?? document.createTextNode(\"\");\n const end = anchorVNode._endNode ?? document.createTextNode(\"\");\n\n if (anchorVNode.key != null) {\n (start as any).key = `${anchorVNode.key}:start`;\n (end as any).key = `${anchorVNode.key}:end`;\n }\n\n anchorVNode._startNode = start;\n anchorVNode._endNode = end;\n\n const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n frag.appendChild(createElement(child, context));\n }\n frag.appendChild(end);\n dom.parentNode?.replaceChild(frag, dom);\n return start;\n }\n\n if (!newVNode) {\n const placeholder = document.createComment(\"removed\");\n dom.parentNode?.replaceChild(placeholder, dom);\n return placeholder;\n }\n\n if (!oldVNode || typeof oldVNode === \"string\") {\n const newEl = createElement(newVNode, context);\n dom.parentNode?.replaceChild(newEl, dom);\n return newEl;\n }\n\n if (newVNode.tag === \"#anchor\") {\n const children = Array.isArray(newVNode.children) ? newVNode.children : [];\n const start = (newVNode as any)._startNode ?? document.createTextNode(\"\");\n const end = (newVNode as any)._endNode ?? document.createTextNode(\"\");\n\n if (newVNode.key != null) {\n (start as any).key = `${newVNode.key}:start`;\n (end as any).key = `${newVNode.key}:end`;\n }\n\n (newVNode as any)._startNode = start;\n (newVNode as any)._endNode = end;\n\n const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n frag.appendChild(createElement(child, context));\n }\n frag.appendChild(end);\n dom.parentNode?.replaceChild(frag, dom);\n return start;\n }\n\n if (\n typeof oldVNode !== \"string\" &&\n typeof newVNode !== \"string\" &&\n oldVNode.tag === newVNode.tag &&\n oldVNode.key === newVNode.key\n ) {\n const el = dom as HTMLElement;\n patchProps(el, oldVNode.props || {}, newVNode.props || {}, context);\n patchChildren(el, oldVNode.children, newVNode.children, context);\n return el;\n }\n\n const newEl = createElement(newVNode, context);\n dom.parentNode?.replaceChild(newEl, dom);\n return newEl;\n}\n\n/**\n * Main renderer: uses patching and keys for node reuse.\n * Never uses innerHTML. Only updates what has changed.\n */\nexport function vdomRenderer(\n root: ShadowRoot,\n vnodeOrArray: VNode | VNode[],\n context?: any,\n) {\n const wrap = (v: VNode): VNode =>\n v.key == null ? { ...v, key: \"__root__\" } : v;\n let newVNode = Array.isArray(vnodeOrArray)\n ? { tag: \"div\", key: \"__root__\", children: vnodeOrArray }\n : wrap(vnodeOrArray);\n\n newVNode = assignKeysDeep(newVNode, String(newVNode.key ?? \"root\")) as VNode;\n\n // Track previous VNode and DOM node\n const prevVNode: VNode | null = (root as any)._prevVNode ?? null;\n const prevDom: Node | null =\n (root as any)._prevDom ?? root.firstChild ?? null;\n\n let newDom: Node;\n\n if (prevVNode && prevDom) {\n // Only replace if tag or key changed\n if (\n typeof prevVNode !== \"string\" &&\n typeof newVNode !== \"string\" &&\n prevVNode.tag === newVNode.tag &&\n prevVNode.key === newVNode.key\n ) {\n newDom = patch(prevDom, prevVNode, newVNode, context);\n } else {\n newDom = createElement(newVNode, context);\n root.replaceChild(newDom, prevDom);\n }\n } else {\n newDom = createElement(newVNode, context);\n if (root.firstChild) root.replaceChild(newDom, root.firstChild);\n else root.appendChild(newDom);\n }\n\n // Remove any extra nodes, but preserve style elements\n const nodesToRemove: Node[] = [];\n for (let i = 0; i < root.childNodes.length; i++) {\n const node = root.childNodes[i];\n if (node !== newDom && node.nodeName !== \"STYLE\") {\n nodesToRemove.push(node);\n }\n }\n nodesToRemove.forEach((node) => root.removeChild(node));\n\n // Update tracked VNode and DOM node\n (root as any)._prevVNode = newVNode;\n (root as any)._prevDom = newDom;\n}\n\n/**\n * SSR-friendly: serialize VNode to HTML string.\n */\nfunction escapeHTML(str: string): string {\n return str.replace(\n /[&<>\"']/g,\n (c) =>\n ({\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n })[c]!,\n );\n}\n\nexport function renderToString(vnode: VNode): string {\n if (typeof vnode === \"string\") return escapeHTML(vnode);\n\n if (vnode.tag === \"#text\") {\n return typeof vnode.children === \"string\" ? escapeHTML(vnode.children) : \"\";\n }\n\n if (vnode.tag === \"#anchor\") {\n const children = Array.isArray(vnode.children) ? vnode.children.filter(Boolean) : [];\n return children.map(renderToString).join(\"\");\n }\n\n const props = vnode.props\n ? Object.entries(vnode.props)\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join(\"\")\n : \"\";\n const children = Array.isArray(vnode.children)\n ? vnode.children.filter(Boolean).map(renderToString).join(\"\")\n : (typeof vnode.children === \"string\" ? escapeHTML(vnode.children) : vnode.children ? renderToString(vnode.children) : \"\");\n return `<${vnode.tag}${props}>${children}</${vnode.tag}>`;\n}\n","/**\n * Style utilities for component style management, caching, and optimization\n */\n\nexport interface StyleCacheEntry {\n css: string;\n timestamp: number;\n dependencies: string[];\n}\n\nexport interface DynamicStyleConfig {\n css: string | ((state: any) => string);\n dependencies?: string[];\n cache?: boolean;\n media?: string;\n priority?: number;\n}\n\nexport interface StyleOptimizations {\n enableCaching: boolean;\n enableMinification: boolean;\n enableDeduplication: boolean;\n cacheSize: number;\n debounceMs: number;\n}\n\n/**\n * Advanced style cache with LRU eviction and dependency tracking\n */\nexport class StyleCache {\n private cache = new Map<string, StyleCacheEntry>();\n private maxSize: number;\n private accessOrder = new Map<string, number>();\n private accessCounter = 0;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n set(key: string, css: string, dependencies: string[] = []): void {\n // Evict oldest entries if cache is full\n if (this.cache.size >= this.maxSize) {\n this.evictOldest();\n }\n\n this.cache.set(key, {\n css,\n timestamp: Date.now(),\n dependencies,\n });\n this.accessOrder.set(key, ++this.accessCounter);\n }\n\n get(key: string): string | null {\n const entry = this.cache.get(key);\n if (entry) {\n this.accessOrder.set(key, ++this.accessCounter);\n return entry.css;\n }\n return null;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n invalidate(dependency: string): void {\n const keysToDelete: string[] = [];\n\n for (const [key, entry] of this.cache) {\n if (entry.dependencies.includes(dependency)) {\n keysToDelete.push(key);\n }\n }\n\n keysToDelete.forEach(key => {\n this.cache.delete(key);\n this.accessOrder.delete(key);\n });\n }\n\n clear(): void {\n this.cache.clear();\n this.accessOrder.clear();\n this.accessCounter = 0;\n }\n\n private evictOldest(): void {\n let oldestKey = '';\n let oldestAccess = Infinity;\n\n for (const [key, access] of this.accessOrder) {\n if (access < oldestAccess) {\n oldestAccess = access;\n oldestKey = key;\n }\n }\n\n if (oldestKey) {\n this.cache.delete(oldestKey);\n this.accessOrder.delete(oldestKey);\n }\n }\n\n getStats() {\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate: this.accessCounter > 0 ? (this.cache.size / this.accessCounter) : 0,\n };\n }\n}\n\n/**\n * CSS minification utility (basic)\n */\nexport function minifyCSS(css: string): string {\n return css\n // Remove comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Remove unnecessary whitespace\n .replace(/\\s+/g, ' ')\n // Remove spaces around specific characters\n .replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n // Remove trailing semicolons before closing braces\n .replace(/;}/g, '}')\n // Remove leading/trailing whitespace\n .trim();\n}\n\n/**\n * Create a stable hash from state values for caching\n */\nexport function createStateHash(values: any[]): string {\n try {\n return JSON.stringify(values, (_key, value) => {\n // Handle circular references and functions\n if (typeof value === 'function') {\n return value.toString();\n }\n if (typeof value === 'object' && value !== null) {\n // Simple circular reference detection\n if (value.__hashed) return '[Circular]';\n value.__hashed = true;\n const result = { ...value };\n delete result.__hashed;\n return result;\n }\n return value;\n });\n } catch {\n // Fallback for complex objects\n return values.map(v => String(v)).join('|');\n }\n}\n\n/**\n * CSS deduplication utility\n */\nexport function deduplicateCSS(css: string): string {\n const rules = css.split('}').filter(rule => rule.trim());\n const seen = new Set<string>();\n const deduplicated: string[] = [];\n\n for (const rule of rules) {\n const normalized = rule.trim().replace(/\\s+/g, ' ');\n if (normalized && !seen.has(normalized)) {\n seen.add(normalized);\n deduplicated.push(rule + '}');\n }\n }\n\n return deduplicated.join('').replace(/}$/, '');\n}\n\n/**\n * Debounced function utility for style updates\n */\nexport function createDebouncer<T extends (...args: any[]) => any>(\n fn: T,\n delay: number\n): T & { cancel: () => void } {\n let timeoutId: number | null = null;\n\n const debounced = ((...args: Parameters<T>) => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, delay);\n }) as T & { cancel: () => void };\n\n debounced.cancel = () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n };\n\n return debounced;\n}\n\n/**\n * Extract CSS custom properties (CSS variables) from a style string\n */\nexport function extractCSSVariables(css: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const regex = /--([\\w-]+):\\s*([^;]+)/g;\n let match;\n\n while ((match = regex.exec(css)) !== null) {\n variables[match[1]] = match[2].trim();\n }\n\n return variables;\n}\n\n/**\n * Generate scoped CSS by prefixing selectors\n */\nexport function scopeCSS(css: string, scope: string): string {\n // Simple CSS selector scoping\n return css.replace(\n /([^{}]+){/g,\n (match, selector) => {\n // Skip keyframes and other @ rules\n if (selector.trim().startsWith('@')) {\n return match;\n }\n\n // Scope each selector\n const scopedSelectors = selector\n .split(',')\n .map((sel: string) => {\n const trimmed = sel.trim();\n if (trimmed.startsWith(':host')) {\n return trimmed.replace(':host', scope);\n }\n return `${scope} ${trimmed}`;\n })\n .join(', ');\n\n return `${scopedSelectors} {`;\n }\n );\n}\n\n/**\n * CSS animation and transition utilities\n */\nexport const cssAnimations = {\n fadeIn: `\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n `,\n fadeOut: `\n @keyframes fadeOut {\n from { opacity: 1; }\n to { opacity: 0; }\n }\n `,\n slideIn: `\n @keyframes slideIn {\n from { transform: translateX(-100%); }\n to { transform: translateX(0); }\n }\n `,\n slideOut: `\n @keyframes slideOut {\n from { transform: translateX(0); }\n to { transform: translateX(100%); }\n }\n `,\n scaleIn: `\n @keyframes scaleIn {\n from { transform: scale(0.8); opacity: 0; }\n to { transform: scale(1); opacity: 1; }\n }\n `,\n scaleOut: `\n @keyframes scaleOut {\n from { transform: scale(1); opacity: 1; }\n to { transform: scale(0.8); opacity: 0; }\n }\n `,\n};\n\n/**\n * CSS Reset\n */\nexport const cssReset = `\n/* CSS Reset */\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n font: inherit;\n vertical-align: baseline;\n }\n html {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n tab-size: 4;\n font-family: ui-sans-serif, system-ui, sans-serif;\n color: #111827;\n background: #fff;\n }\n body {\n min-height: 100vh;\n text-rendering: optimizeLegibility;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n background: #fff;\n }\n ul, ol { list-style: none; }\n button, input, select, textarea {\n background: none;\n border: none;\n outline: none;\n font: inherit;\n color: inherit;\n }\n a { text-decoration: none; color: inherit; }\n`;\n\n/**\n * Common CSS utility classes (Tailwind CSS 4 inspired, with custom properties)\n * Includes a CSS reset and scalable spacing utilities.\n */\nexport const cssUtilities = `\n /* CSS Custom Properties for Spacing */\n :root {\n --space-0: 0rem;\n --space-1: 0.25rem;\n --space-2: 0.5rem;\n --space-3: 0.75rem;\n --space-4: 1rem;\n --space-5: 1.25rem;\n --space-6: 1.5rem;\n --space-7: 1.75rem;\n --space-8: 2rem;\n --space-9: 2.25rem;\n --space-10: 2.5rem;\n --space-11: 2.75rem;\n --space-12: 3rem;\n }\n\n /* Spacing utilities (up to 12) */\n .p-0 { padding: var(--space-0); }\n .p-1 { padding: var(--space-1); }\n .p-2 { padding: var(--space-2); }\n .p-3 { padding: var(--space-3); }\n .p-4 { padding: var(--space-4); }\n .p-5 { padding: var(--space-5); }\n .p-6 { padding: var(--space-6); }\n .p-7 { padding: var(--space-7); }\n .p-8 { padding: var(--space-8); }\n .p-9 { padding: var(--space-9); }\n .p-10 { padding: var(--space-10); }\n .p-11 { padding: var(--space-11); }\n .p-12 { padding: var(--space-12); }\n\n .pt-0 { padding-top: var(--space-0); }\n .pt-1 { padding-top: var(--space-1); }\n .pt-2 { padding-top: var(--space-2); }\n .pt-3 { padding-top: var(--space-3); }\n .pt-4 { padding-top: var(--space-4); }\n .pt-5 { padding-top: var(--space-5); }\n .pt-6 { padding-top: var(--space-6); }\n .pt-7 { padding-top: var(--space-7); }\n .pt-8 { padding-top: var(--space-8); }\n .pt-9 { padding-top: var(--space-9); }\n .pt-10 { padding-top: var(--space-10); }\n .pt-11 { padding-top: var(--space-11); }\n .pt-12 { padding-top: var(--space-12); }\n\n .pb-0 { padding-bottom: var(--space-0); }\n .pb-1 { padding-bottom: var(--space-1); }\n .pb-2 { padding-bottom: var(--space-2); }\n .pb-3 { padding-bottom: var(--space-3); }\n .pb-4 { padding-bottom: var(--space-4); }\n .pb-5 { padding-bottom: var(--space-5); }\n .pb-6 { padding-bottom: var(--space-6); }\n .pb-7 { padding-bottom: var(--space-7); }\n .pb-8 { padding-bottom: var(--space-8); }\n .pb-9 { padding-bottom: var(--space-9); }\n .pb-10 { padding-bottom: var(--space-10); }\n .pb-11 { padding-bottom: var(--space-11); }\n .pb-12 { padding-bottom: var(--space-12); }\n\n .pl-0 { padding-left: var(--space-0); }\n .pl-1 { padding-left: var(--space-1); }\n .pl-2 { padding-left: var(--space-2); }\n .pl-3 { padding-left: var(--space-3); }\n .pl-4 { padding-left: var(--space-4); }\n .pl-5 { padding-left: var(--space-5); }\n .pl-6 { padding-left: var(--space-6); }\n .pl-7 { padding-left: var(--space-7); }\n .pl-8 { padding-left: var(--space-8); }\n .pl-9 { padding-left: var(--space-9); }\n .pl-10 { padding-left: var(--space-10); }\n .pl-11 { padding-left: var(--space-11); }\n .pl-12 { padding-left: var(--space-12); }\n\n .pr-0 { padding-right: var(--space-0); }\n .pr-1 { padding-right: var(--space-1); }\n .pr-2 { padding-right: var(--space-2); }\n .pr-3 { padding-right: var(--space-3); }\n .pr-4 { padding-right: var(--space-4); }\n .pr-5 { padding-right: var(--space-5); }\n .pr-6 { padding-right: var(--space-6); }\n .pr-7 { padding-right: var(--space-7); }\n .pr-8 { padding-right: var(--space-8); }\n .pr-9 { padding-right: var(--space-9); }\n .pr-10 { padding-right: var(--space-10); }\n .pr-11 { padding-right: var(--space-11); }\n .pr-12 { padding-right: var(--space-12); }\n\n .m-0 { margin: var(--space-0); }\n .m-1 { margin: var(--space-1); }\n .m-2 { margin: var(--space-2); }\n .m-3 { margin: var(--space-3); }\n .m-4 { margin: var(--space-4); }\n .m-5 { margin: var(--space-5); }\n .m-6 { margin: var(--space-6); }\n .m-7 { margin: var(--space-7); }\n .m-8 { margin: var(--space-8); }\n .m-9 { margin: var(--space-9); }\n .m-10 { margin: var(--space-10); }\n .m-11 { margin: var(--space-11); }\n .m-12 { margin: var(--space-12); }\n\n .mt-0 { margin-top: var(--space-0); }\n .mt-1 { margin-top: var(--space-1); }\n .mt-2 { margin-top: var(--space-2); }\n .mt-3 { margin-top: var(--space-3); }\n .mt-4 { margin-top: var(--space-4); }\n .mt-5 { margin-top: var(--space-5); }\n .mt-6 { margin-top: var(--space-6); }\n .mt-7 { margin-top: var(--space-7); }\n .mt-8 { margin-top: var(--space-8); }\n .mt-9 { margin-top: var(--space-9); }\n .mt-10 { margin-top: var(--space-10); }\n .mt-11 { margin-top: var(--space-11); }\n .mt-12 { margin-top: var(--space-12); }\n\n .mb-0 { margin-bottom: var(--space-0); }\n .mb-1 { margin-bottom: var(--space-1); }\n .mb-2 { margin-bottom: var(--space-2); }\n .mb-3 { margin-bottom: var(--space-3); }\n .mb-4 { margin-bottom: var(--space-4); }\n .mb-5 { margin-bottom: var(--space-5); }\n .mb-6 { margin-bottom: var(--space-6); }\n .mb-7 { margin-bottom: var(--space-7); }\n .mb-8 { margin-bottom: var(--space-8); }\n .mb-9 { margin-bottom: var(--space-9); }\n .mb-10 { margin-bottom: var(--space-10); }\n .mb-11 { margin-bottom: var(--space-11); }\n .mb-12 { margin-bottom: var(--space-12); }\n\n .ml-0 { margin-left: var(--space-0); }\n .ml-1 { margin-left: var(--space-1); }\n .ml-2 { margin-left: var(--space-2); }\n .ml-3 { margin-left: var(--space-3); }\n .ml-4 { margin-left: var(--space-4); }\n .ml-5 { margin-left: var(--space-5); }\n .ml-6 { margin-left: var(--space-6); }\n .ml-7 { margin-left: var(--space-7); }\n .ml-8 { margin-left: var(--space-8); }\n .ml-9 { margin-left: var(--space-9); }\n .ml-10 { margin-left: var(--space-10); }\n .ml-11 { margin-left: var(--space-11); }\n .ml-12 { margin-left: var(--space-12); }\n\n .mr-0 { margin-right: var(--space-0); }\n .mr-1 { margin-right: var(--space-1); }\n .mr-2 { margin-right: var(--space-2); }\n .mr-3 { margin-right: var(--space-3); }\n .mr-4 { margin-right: var(--space-4); }\n .mr-5 { margin-right: var(--space-5); }\n .mr-6 { margin-right: var(--space-6); }\n .mr-7 { margin-right: var(--space-7); }\n .mr-8 { margin-right: var(--space-8); }\n .mr-9 { margin-right: var(--space-9); }\n .mr-10 { margin-right: var(--space-10); }\n .mr-11 { margin-right: var(--space-11); }\n .mr-12 { margin-right: var(--space-12); }\n\n .my-auto { margin-block: auto; }\n .mx-auto { margin-inline: auto; }\n\n /* Display utilities */\n .block { display: block; }\n .inline { display: inline; }\n .inline-block { display: inline-block; }\n .flex { display: flex; }\n .inline-flex { display: inline-flex; }\n .grid { display: grid; }\n .hidden { display: none; }\n\n /* Flexbox utilities */\n .flex-row { flex-direction: row; }\n .flex-col { flex-direction: column; }\n .items-center { align-items: center; }\n .items-start { align-items: flex-start; }\n .items-end { align-items: flex-end; }\n .justify-center { justify-content: center; }\n .justify-between { justify-content: space-between; }\n .justify-start { justify-content: flex-start; }\n .justify-end { justify-content: flex-end; }\n .gap-1 { gap: var(--space-1); }\n .gap-2 { gap: var(--space-2); }\n .gap-3 { gap: var(--space-3); }\n .gap-4 { gap: var(--space-4); }\n .gap-5 { gap: var(--space-5); }\n .gap-6 { gap: var(--space-6); }\n .gap-7 { gap: var(--space-7); }\n .gap-8 { gap: var(--space-8); }\n .gap-9 { gap: var(--space-9); }\n .gap-10 { gap: var(--space-10); }\n .gap-11 { gap: var(--space-11); }\n .gap-12 { gap: var(--space-12); }\n\n /* Sizing utilities */\n .w-full { width: 100%; }\n .h-full { height: 100%; }\n .min-h-screen { min-height: 100vh; }\n .max-w-xs { max-width: 20rem; }\n .max-w-sm { max-width: 24rem; }\n .max-w-md { max-width: 28rem; }\n .max-w-lg { max-width: 32rem; }\n .max-w-xl { max-width: 36rem; }\n\n /* Typography utilities */\n .text-xs { font-size: 0.75rem; }\n .text-sm { font-size: 0.875rem; }\n .text-base { font-size: 1rem; }\n .text-lg { font-size: 1.125rem; }\n .text-xl { font-size: 1.25rem; }\n .font-bold { font-weight: 700; }\n .font-semibold { font-weight: 600; }\n .font-normal { font-weight: 400; }\n .font-light { font-weight: 300; }\n .text-center { text-align: center; }\n .text-left { text-align: left; }\n .text-right { text-align: right; }\n\n /* Border utilities */\n .border { border: 1px solid #e5e7eb; }\n .border-0 { border: none; }\n .rounded { border-radius: 0.25rem; }\n .rounded-md { border-radius: 0.375rem; }\n .rounded-lg { border-radius: 0.5rem; }\n .rounded-full { border-radius: 9999px; }\n\n /* Color utilities */\n .bg-white { background-color: #fff; }\n .bg-gray-50 { background-color: #f9fafb; }\n .bg-gray-100 { background-color: #f3f4f6; }\n .bg-gray-200 { background-color: #e5e7eb; }\n .bg-blue-500 { background-color: #3b82f6; }\n .bg-red-500 { background-color: #ef4444; }\n .text-black { color: #000; }\n .text-gray-600 { color: #4b5563; }\n .text-blue-600 { color: #2563eb; }\n .text-red-600 { color: #dc2626; }\n\n /* Interactive utilities */\n .cursor-pointer { cursor: pointer; }\n .cursor-default { cursor: default; }\n .pointer-events-none { pointer-events: none; }\n .select-none { user-select: none; }\n\n /* Shadow utilities */\n .shadow { box-shadow: 0 1px 2px 0 rgba(0,0,0,0.05); }\n .shadow-md { box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1); }\n .shadow-lg { box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1); }\n\n /* Responsive utilities (mobile-first) */\n @media (min-width: 640px) {\n .sm\\\\:block { display: block; }\n .sm\\\\:hidden { display: none; }\n .sm\\\\:flex { display: flex; }\n .sm\\\\:grid { display: grid; }\n .sm\\\\:w-full { width: 100%; }\n }\n @media (min-width: 768px) {\n .md\\\\:block { display: block; }\n .md\\\\:hidden { display: none; }\n .md\\\\:flex { display: flex; }\n .md\\\\:grid { display: grid; }\n .md\\\\:w-full { width: 100%; }\n }\n @media (min-width: 1024px) {\n .lg\\\\:block { display: block; }\n .lg\\\\:hidden { display: none; }\n .lg\\\\:flex { display: flex; }\n .lg\\\\:grid { display: grid; }\n .lg\\\\:w-full { width: 100%; }\n }\n @media (min-width: 1280px) {\n .xl\\\\:block { display: block; }\n .xl\\\\:hidden { display: none; }\n .xl\\\\:flex { display: flex; }\n .xl\\\\:grid { display: grid; }\n .xl\\\\:w-full { width: 100%; }\n }\n @media (min-width: 1536px) {\n .2xl\\\\:block { display: block; }\n .2xl\\\\:hidden { display: none; }\n .2xl\\\\:flex { display: flex; }\n .2xl\\\\:grid { display: grid; }\n .2xl\\\\:w-full { width: 100%; }\n }\n`;\n\n/**\n * Performance monitoring for style operations\n */\nexport class StylePerformanceMonitor {\n private metrics = new Map<string, number[]>();\n\n startTimer(operation: string): () => number {\n const start = performance.now();\n\n return () => {\n const duration = performance.now() - start;\n this.recordMetric(operation, duration);\n return duration;\n };\n }\n\n private recordMetric(operation: string, duration: number): void {\n if (!this.metrics.has(operation)) {\n this.metrics.set(operation, []);\n }\n\n const times = this.metrics.get(operation)!;\n times.push(duration);\n\n // Keep only last 100 measurements\n if (times.length > 100) {\n times.shift();\n }\n }\n\n getStats(operation?: string) {\n if (operation) {\n const times = this.metrics.get(operation) || [];\n if (times.length === 0) return null;\n\n return {\n operation,\n count: times.length,\n average: times.reduce((a, b) => a + b, 0) / times.length,\n min: Math.min(...times),\n max: Math.max(...times),\n };\n }\n\n const stats: Record<string, any> = {};\n for (const [op, times] of this.metrics) {\n if (times.length > 0) {\n stats[op] = {\n count: times.length,\n average: times.reduce((a, b) => a + b, 0) / times.length,\n min: Math.min(...times),\n max: Math.max(...times),\n };\n }\n }\n return stats;\n }\n\n reset(operation?: string): void {\n if (operation) {\n this.metrics.delete(operation);\n } else {\n this.metrics.clear();\n }\n }\n}\n\n// Default performance monitor instance\nexport const stylePerformanceMonitor = new StylePerformanceMonitor();\n","/**\n * runtime.ts\n * Lightweight, strongly typed, functional custom element runtime for two-way binding, event, and prop support.\n * Supports: state, computed, props, style, render, lifecycle hooks, #model-* and data-on-* attributes.\n * No external dependencies. Mobile-first, secure, and developer friendly.\n */\n\nexport { createStore } from \"./store\";\nexport { eventBus } from \"./event-bus\";\nexport { html } from \"./template-compiler\";\nexport { when, each, match } from \"./directives\";\n\nimport { vdomRenderer, type VNode } from \"./vdom\";\nimport {\n StyleCache,\n createStateHash,\n minifyCSS,\n deduplicateCSS,\n createDebouncer,\n stylePerformanceMonitor,\n type DynamicStyleConfig,\n type StyleOptimizations,\n} from \"./style-utils\";\n\n// --- Types ---\ntype LifecycleKeys =\n | \"onConnected\"\n | \"onDisconnected\"\n | \"onAttributeChanged\"\n | \"onError\"\n | \"errorFallback\";\n\n// Watch types\ninterface WatchOptions {\n immediate?: boolean;\n deep?: boolean;\n}\n\ntype WatchCallback<T = any, S = any> = (\n newValue: T,\n oldValue: T,\n context?: S,\n) => void;\n\ninterface WatcherState {\n callback: WatchCallback;\n options: WatchOptions;\n oldValue: any;\n}\n\ntype WatchConfig<S> =\n | {\n [K in keyof S]?:\n | WatchCallback<S[K]>\n | [WatchCallback<S[K]>, WatchOptions?];\n }\n | Record<string, WatchCallback | [WatchCallback, WatchOptions?]>;\n\ntype InferMethods<T> = {\n [K in keyof T as K extends LifecycleKeys ? never : K]: T[K] extends Function\n ? T[K]\n : never;\n};\n\nexport type ComponentContext<\n S extends object,\n C extends object,\n P extends object,\n T extends object = any\n> = S & C & P & InferMethods<T>;\n\nexport interface ComponentConfig<\n S extends object,\n C extends object = {},\n P extends object = {},\n T extends object = any,\n> {\n state?: S;\n computed?: { [K in keyof C]: (context: ComponentContext<S, C, P, T>) => C[K] };\n props?: Record<\n string,\n {\n type: StringConstructor | NumberConstructor | BooleanConstructor;\n default?: string | number | boolean;\n }\n >;\n watch?: WatchConfig<ComponentContext<S, C, P, T>>;\n style?: string | ((context: ComponentContext<S, C, P, T>) => string) | DynamicStyleConfig;\n styleOptimizations?: Partial<StyleOptimizations>;\n render: (context: ComponentContext<S, C, P, T>) => VNode | VNode[] | Promise<VNode | VNode[]>;\n loadingTemplate?: (context: ComponentContext<S, C, P, T>) => VNode | VNode[];\n errorTemplate?: (\n error: Error,\n context: ComponentContext<S, C, P, T>,\n ) => VNode | VNode[];\n onConnected?: (\n context: ComponentContext<S, C, P, T>,\n ) => void;\n onDisconnected?: (\n context: ComponentContext<S, C, P, T>,\n ) => void;\n onAttributeChanged?: (\n name: string,\n oldValue: string | null,\n newValue: string | null,\n context: ComponentContext<S, C, P, T>,\n ) => void;\n onError?: (\n error: Error | null,\n context: ComponentContext<S, C, P, T>,\n ) => void;\n errorFallback?: (\n error: Error | null,\n context: ComponentContext<S, C, P, T>,\n ) => string;\n [key: string]: any;\n}\n\n// --- Internal registry ---\nconst registry = new Map<string, ComponentConfig<any, any, any>>();\n\n// --- Utility functions ---\nfunction toKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction escapeHTML(str: string | number | boolean): string | number | boolean {\n if (typeof str === \"string\") {\n return str.replace(\n /[&<>\"']/g,\n (c) =>\n ({\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n })[c]!,\n );\n }\n return str;\n}\n\nfunction sanitizeCSS(css: string): string {\n // Remove any url(javascript:...) and <script> tags\n return css\n .replace(/url\\s*\\(\\s*['\"]?javascript:[^)]*\\)/gi, \"\")\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/expression\\s*\\([^)]*\\)/gi, \"\");\n}\n\n/**\n * CSS template literal\n *\n * This doesn't sanitize CSS values.\n * Runtime does that for us.\n * \n * @param strings\n * @param values\n * @returns\n */\nexport function css(strings: TemplateStringsArray, ...values: unknown[]): string {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) result += values[i];\n }\n return result;\n}\n\n// ######################################\n// ######################################\n// ######################################\n\n// --- Hot Module Replacement (HMR) ---\nif (\n typeof import.meta !== 'undefined' &&\n (import.meta as any).hot &&\n import.meta && import.meta.hot\n) {\n import.meta.hot.accept((newModule) => {\n // Update registry with new configs from the hot module\n if (newModule && newModule.registry) {\n for (const [tag, newConfig] of newModule.registry.entries()) {\n registry.set(tag, newConfig);\n // Update all instances to use new config\n if (typeof document !== \"undefined\") {\n document.querySelectorAll(tag).forEach((el) => {\n if (typeof (el as any)._cfg !== \"undefined\") {\n (el as any)._cfg = newConfig;\n }\n if (typeof (el as any)._render === \"function\") {\n (el as any)._render(newConfig);\n }\n });\n }\n }\n }\n });\n}\n\n// --- Main component registration ---\nexport function component<\n S extends object = {},\n C extends object = {},\n P extends object = {},\n T extends object = any,\n>(\n tag: string,\n renderOrConfig: ((context: ComponentContext<S, C, P, T>) => any) | ComponentConfig<S, C, P, T>,\n config?: Partial<ComponentConfig<S, C, P, T>>\n): void {\n let normalizedTag = toKebab(tag);\n if (!normalizedTag.includes(\"-\")) {\n normalizedTag = `cer-${normalizedTag}`;\n }\n\n let finalConfig: ComponentConfig<S, C, P, T>;\n if (typeof renderOrConfig === \"function\") {\n finalConfig = { ...config, render: renderOrConfig } as ComponentConfig<S, C, P, T>;\n } else {\n finalConfig = renderOrConfig;\n }\n\n // Provide a default onError handler if not defined\n if (typeof finalConfig.onError !== \"function\") {\n finalConfig.onError = (error, state) => {\n // Lightweight, developer-friendly default\n console.error(`[${normalizedTag}] Error:`, error, state);\n };\n }\n\n registry.set(normalizedTag, finalConfig);\n if (typeof window !== \"undefined\" && !customElements.get(normalizedTag)) {\n customElements.define(normalizedTag, createElementClass<S, C, P, T>(finalConfig) as CustomElementConstructor);\n }\n}\n\n// --- Element class factory ---\nexport function createElementClass<\n S extends object,\n C extends object,\n P extends object,\n T extends object = any,\n>(config: ComponentConfig<S, C, P, T>): CustomElementConstructor | { new (): object } {\n // Validate that render is provided\n if (!config.render) {\n throw new Error(\n \"Component must have a render function\",\n );\n }\n if (typeof window === \"undefined\") {\n // SSR fallback: minimal class, no DOM, no lifecycle, no \"this\"\n return class { constructor() {} };\n }\n return class extends HTMLElement {\n public context: ComponentContext<S, C, P, T>;\n\n private _listeners: Array<() => void> = [];\n private _watchers: Map<string, WatcherState> = new Map();\n /** @internal */\n private _renderTimeoutId: number | null = null;\n private _mounted = false;\n private _hasError = false;\n private _initializing = true;\n private _styleElement: HTMLStyleElement | null = null;\n private _styleCache = new StyleCache(100);\n private _lastStyleHash = \"\";\n private _styleDependencies: Set<string> = new Set();\n private _styleUpdateDebounced: ((\n cfg: ComponentConfig<S, C, P, T>,\n ) => void) & {\n cancel: () => void;\n };\n private _cfg: ComponentConfig<S, C, P, T>;\n private _lastRenderTime = 0;\n private _renderCount = 0;\n private _templateLoading = false;\n private _templateError: Error | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n this._cfg = config;\n\n // Initialize debounced style update function\n const optimizations = {\n debounceMs: 16,\n ...config.styleOptimizations,\n };\n this._styleUpdateDebounced = createDebouncer(\n (cfg: ComponentConfig<S, C, P, T>) => this._applyStyle(cfg),\n optimizations.debounceMs,\n );\n this.context = this._initContext(config);\n\n // --- Inject config methods into state ---\n Object.keys(config).forEach((key) => {\n const fn = (config as any)[key];\n if (typeof fn === \"function\" && !key.startsWith(\"on\")) {\n // Wrap the function so it receives state as the first argument\n (this.context as any)[key] = (...args: any[]) =>\n fn(...args, this.context);\n }\n });\n\n this._applyProps(config);\n this._applyComputed(config);\n this._initializing = false;\n\n // Initialize watchers after initialization phase is complete\n this._initWatchers(config);\n\n // Initial render (styles are applied within render)\n this._render(config);\n }\n\n connectedCallback() {\n this._runLogicWithinErrorBoundary(config, () => {\n if (config.onConnected && !this._mounted) {\n config.onConnected(this.context);\n this._mounted = true;\n }\n });\n }\n\n disconnectedCallback() {\n this._runLogicWithinErrorBoundary(config, () => {\n if (config.onDisconnected)\n config.onDisconnected(this.context);\n this._listeners.forEach((unsub) => unsub());\n this._listeners = [];\n this._watchers.clear();\n\n // Clean up style caching\n this._styleCache.clear();\n this._styleDependencies.clear();\n this._styleElement = null;\n this._lastStyleHash = \"\";\n this._styleUpdateDebounced.cancel();\n\n // Clean up async template state\n this._templateLoading = false;\n this._templateError = null;\n\n this._mounted = false;\n });\n }\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ) {\n this._runLogicWithinErrorBoundary(config, () => {\n this._applyProps(config);\n if (config.onAttributeChanged) {\n config.onAttributeChanged(\n name,\n oldValue,\n newValue,\n this.context,\n );\n }\n });\n }\n\n static get observedAttributes() {\n return config.props ? Object.keys(config.props).map(toKebab) : [];\n }\n\n private _applyComputed(cfg: ComponentConfig<S, C, P>) {\n this._runLogicWithinErrorBoundary(config, () => {\n if (!cfg.computed) return;\n Object.entries(cfg.computed).forEach(([key, fn]) => {\n Object.defineProperty(this.context, key, {\n get: () => {\n const val = (fn as (context: ComponentContext<S, C, P, T>) => any)(this.context);\n return escapeHTML(val);\n },\n enumerable: true,\n });\n });\n });\n }\n\n // --- Render ---\n private _render(cfg: ComponentConfig<S, C, P>) {\n this._runLogicWithinErrorBoundary(cfg, () => {\n if (!this.shadowRoot) return;\n\n this._styleDependencies.clear();\n\n // If loading, show loading template\n if (this._templateLoading && cfg.loadingTemplate) {\n this._renderOutput(cfg.loadingTemplate(this.context));\n return;\n }\n\n // If error, show error template\n if (this._templateError && cfg.errorTemplate) {\n this._renderOutput(cfg.errorTemplate(this._templateError, this.context));\n return;\n }\n\n // Call render function\n const outputOrPromise = cfg.render(this.context);\n\n if (outputOrPromise instanceof Promise) {\n this._templateLoading = true;\n outputOrPromise\n .then((output) => {\n this._templateLoading = false;\n this._templateError = null;\n this._renderOutput(output);\n return output;\n })\n .catch((error) => {\n this._templateLoading = false;\n this._templateError = error;\n if (cfg.errorTemplate) {\n const fallback = cfg.errorTemplate(error, this.context);\n this._renderOutput(fallback);\n return fallback;\n }\n throw error;\n });\n\n if (cfg.loadingTemplate)\n this._renderOutput(cfg.loadingTemplate(this.context));\n return;\n }\n\n // this._templateCache = outputOrPromise;\n this._renderOutput(outputOrPromise);\n this._applyStyle(cfg);\n });\n }\n\n // --- Helper to render output ---\n private _renderOutput(output: VNode | VNode[]) {\n if (!this.shadowRoot) return;\n\n // Create context with state and render method for directive processing\n const context = new Proxy(this.context, {\n get: (target, prop) => {\n if (prop === \"_requestRender\") {\n return () => this._requestRender();\n }\n if (prop === \"context\") {\n return target;\n }\n // Handle nested property access for #model directives\n if (typeof prop === \"string\" && prop.includes(\".\")) {\n return prop.split(\".\").reduce((obj: any, key) => obj?.[key], target as any);\n }\n return target[prop as keyof typeof target];\n },\n set: (target, prop, value) => {\n // Handle nested property assignment for #model directives\n if (typeof prop === \"string\" && prop.includes(\".\")) {\n const keys = prop.split(\".\");\n const lastKey = keys.pop();\n if (!lastKey) return false;\n\n const nestedTarget = keys.reduce((obj, key) => {\n if (!(key in obj)) {\n (obj as any)[key] = {};\n }\n return (obj as any)[key];\n }, target as any);\n\n (nestedTarget as any)[lastKey] = value;\n return true;\n }\n (target as any)[prop] = value;\n return true;\n },\n });\n\n vdomRenderer(\n this.shadowRoot,\n Array.isArray(output) ? output : [output],\n context,\n );\n\n this._requestStyleUpdate();\n }\n\n _requestRender() {\n // Debounced render request to avoid excessive re-renders\n if (this._renderTimeoutId !== null) {\n clearTimeout(this._renderTimeoutId);\n }\n\n // Prevent infinite render loops\n const now = Date.now();\n if (now - this._lastRenderTime < 16) {\n // Less than 16ms since last render\n this._renderCount++;\n if (this._renderCount > 10) {\n console.warn(\n `[${this.tagName}] Potential infinite render loop detected. Skipping render.`,\n );\n this._renderTimeoutId = null;\n return;\n }\n } else {\n this._renderCount = 0;\n }\n\n this._renderTimeoutId = setTimeout(() => {\n this._lastRenderTime = Date.now();\n this._render(this._cfg);\n this._renderTimeoutId = null;\n }, 0);\n }\n\n // Request style-only update (more efficient than full render)\n private _requestStyleUpdate() {\n this._styleUpdateDebounced(this._cfg);\n }\n\n // --- Style ---\n private _applyStyle(cfg: ComponentConfig<S, C, P, T>) {\n this._runLogicWithinErrorBoundary(cfg, () => {\n if (!this.shadowRoot) {\n return;\n }\n\n const timer = stylePerformanceMonitor.startTimer(\"applyStyle\");\n\n try {\n // Get or create style element\n if (!this._styleElement) {\n this._styleElement = this.shadowRoot.querySelector(\n \"style\",\n ) as HTMLStyleElement;\n if (!this._styleElement) {\n if (typeof document !== \"undefined\") {\n this._styleElement = document.createElement(\"style\");\n this.shadowRoot.prepend(this._styleElement);\n }\n }\n }\n\n if (!cfg.style) {\n this._styleElement.textContent = \"\";\n return;\n }\n\n // Get style optimizations config\n const optimizations = {\n enableCaching: true,\n enableMinification: false,\n enableDeduplication: true,\n cacheSize: 100,\n debounceMs: 16,\n ...cfg.styleOptimizations,\n };\n\n // Handle different style configurations\n let styleConfig: DynamicStyleConfig;\n\n if (typeof cfg.style === \"string\") {\n styleConfig = {\n css: cfg.style,\n cache: optimizations.enableCaching,\n };\n } else if (typeof cfg.style === \"function\") {\n styleConfig = {\n css: cfg.style,\n cache: optimizations.enableCaching,\n };\n } else {\n styleConfig = {\n cache: optimizations.enableCaching,\n ...cfg.style,\n };\n }\n\n // Extract dependencies and check if style needs updating\n const dependencies = styleConfig.dependencies || [];\n const shouldCache =\n styleConfig.cache !== false && optimizations.enableCaching;\n\n // Create a hash of dependent state values for caching\n let stateHash = \"\";\n if (shouldCache && dependencies.length > 0) {\n const dependentValues = dependencies.map((dep) => (this.context as Record<string, unknown>)[dep]);\n stateHash = createStateHash(dependentValues);\n\n // Check cache first\n if (\n this._lastStyleHash === stateHash &&\n this._styleCache.has(stateHash)\n ) {\n const cachedStyle = this._styleCache.get(stateHash)!;\n if (this._styleElement.textContent !== cachedStyle) {\n this._styleElement.textContent = cachedStyle;\n }\n return;\n }\n }\n\n // For styles without dependencies, always generate\n if (!shouldCache || dependencies.length === 0) {\n stateHash = \"no-deps-\" + Date.now();\n }\n\n // Generate style\n const rawStyle =\n typeof styleConfig.css === \"function\"\n ? styleConfig.css(this.context)\n : styleConfig.css;\n\n let processedStyle = sanitizeCSS(rawStyle);\n\n // Apply optimizations\n if (optimizations.enableMinification) {\n processedStyle = minifyCSS(processedStyle);\n }\n\n if (optimizations.enableDeduplication) {\n processedStyle = deduplicateCSS(processedStyle);\n }\n\n // Cache the style if enabled and has dependencies\n if (shouldCache && dependencies.length > 0) {\n this._styleCache.set(\n stateHash,\n processedStyle,\n dependencies.map(String),\n );\n this._lastStyleHash = stateHash;\n }\n\n // Only update DOM if style actually changed\n if (this._styleElement.textContent !== processedStyle) {\n this._styleElement.textContent = processedStyle;\n }\n } finally {\n timer();\n }\n });\n }\n\n // --- Error Boundary function ---\n private _runLogicWithinErrorBoundary(\n cfg: ComponentConfig<S, C, P>,\n fn: () => void,\n ) {\n if (this._hasError) this._hasError = false;\n try {\n fn();\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) {\n cfg.onError(error as Error | null, this.context);\n }\n if (cfg.errorFallback) {\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(\n error as Error | null,\n this.context,\n );\n }\n }\n }\n }\n\n // --- State, props, computed ---\n private _initContext(cfg: ComponentConfig<S, C, P>): ComponentContext<S, C, P, T> {\n try {\n const self = this;\n function createReactive(obj: any, path = \"\"): any {\n if (Array.isArray(obj)) {\n // Create a proxy that intercepts array mutations\n return new Proxy(obj, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Intercept array mutating methods\n if (typeof value === \"function\" && typeof prop === \"string\") {\n const mutatingMethods = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n ];\n if (mutatingMethods.includes(prop)) {\n return function (...args: any[]) {\n const result = value.apply(target, args);\n\n if (!self._initializing) {\n const fullPath = path || \"root\";\n self._triggerWatchers(fullPath, target);\n self._render(cfg);\n }\n\n return result;\n };\n }\n }\n\n return value;\n },\n set(target, prop, value) {\n target[prop as any] = value;\n if (!self._initializing) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n\n // Track style dependencies and invalidate cache\n self._styleDependencies.add(String(prop));\n self._styleCache.invalidate(String(prop));\n\n self._triggerWatchers(fullPath, value);\n\n // Check if only style dependencies changed for optimization\n const styleConfig = cfg.style;\n let onlyStyleChanged = false;\n\n if (\n styleConfig &&\n typeof styleConfig === \"object\" &&\n \"dependencies\" in styleConfig\n ) {\n const styleDeps = styleConfig.dependencies || [];\n onlyStyleChanged =\n styleDeps.includes(String(prop)) &&\n styleDeps.every(\n (dep) =>\n !self._styleDependencies.has(String(dep)) ||\n dep === prop,\n );\n }\n\n if (onlyStyleChanged) {\n self._requestStyleUpdate();\n } else {\n self._render(cfg);\n }\n }\n return true;\n },\n deleteProperty(target, prop) {\n delete target[prop as any];\n if (!self._initializing) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n\n // Track style dependencies\n self._styleDependencies.add(String(prop));\n\n self._triggerWatchers(fullPath, undefined);\n self._render(cfg);\n }\n return true;\n },\n });\n }\n if (obj && typeof obj === \"object\") {\n Object.keys(obj).forEach((key) => {\n const newPath = path ? `${path}.${key}` : key;\n obj[key] = createReactive(obj[key], newPath);\n });\n return new Proxy(obj, {\n set(target, prop, value) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n target[prop as any] = createReactive(value, fullPath);\n if (!self._initializing) {\n self._triggerWatchers(\n fullPath,\n target[prop as any]\n );\n self._render(cfg);\n }\n return true;\n },\n get(target, prop, receiver) {\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n return obj;\n }\n return createReactive({ ...cfg.state }) as ComponentContext<S, C, P, T>;\n } catch (error) {\n return {} as ComponentContext<S, C, P, T>;\n }\n }\n\n private _initWatchers(cfg: ComponentConfig<S, C, P>): void {\n if (!cfg.watch) return;\n\n for (const [key, watchConfig] of Object.entries(cfg.watch)) {\n let callback: WatchCallback;\n let options: WatchOptions = {};\n\n if (Array.isArray(watchConfig)) {\n callback = watchConfig[0];\n options = watchConfig[1] || {};\n } else {\n callback = watchConfig;\n }\n\n this._watchers.set(key, {\n callback,\n options,\n oldValue: this._getNestedValue(key),\n });\n\n // Execute immediately if requested\n if (options.immediate) {\n try {\n const currentValue = this._getNestedValue(key);\n callback(currentValue, undefined, this.context);\n } catch (error) {\n console.error(`Error in immediate watcher for \"${key}\":`, error);\n }\n }\n }\n }\n\n private _getNestedValue(path: string): any {\n return path.split(\".\").reduce(\n (obj: any, key: string) => obj?.[key],\n this.context as any,\n );\n }\n\n private _triggerWatchers(path: string, newValue: any): void {\n const isEqual = (a: any, b: any): boolean => {\n // Simple deep equality check\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== \"object\" || a === null || b === null) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => isEqual(val, b[i]));\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(key => isEqual(a[key], b[key]));\n };\n\n // Exact path watcher\n const watcher = this._watchers.get(path);\n if (watcher && !isEqual(newValue, watcher.oldValue)) {\n try {\n watcher.callback(newValue, watcher.oldValue, this.context);\n watcher.oldValue = newValue;\n } catch (error) {\n console.error(`Error in watcher for \"${path}\":`, error);\n }\n }\n\n // Deep watchers for parent paths\n for (const [watchPath, watcherConfig] of this._watchers.entries()) {\n if (watcherConfig.options.deep && path.startsWith(watchPath + \".\")) {\n try {\n const currentValue = this._getNestedValue(watchPath);\n if (!isEqual(currentValue, watcherConfig.oldValue)) {\n watcherConfig.callback(currentValue, watcherConfig.oldValue, this.context);\n watcherConfig.oldValue = currentValue;\n }\n } catch (error) {\n console.error(`Error in deep watcher for \"${watchPath}\":`, error);\n }\n }\n }\n }\n\n private _applyProps(cfg: ComponentConfig<S, C, P>): void {\n try {\n if (!cfg.props) return;\n function parseProp(val: string, type: any) {\n if (type === Boolean) return val === \"true\";\n if (type === Number) return Number(val);\n return val;\n }\n Object.entries(cfg.props).forEach(([key, def]) => {\n const attr = this.getAttribute(toKebab(key));\n if (attr !== null) {\n (this.context as any)[key] = escapeHTML(\n parseProp(attr, def.type),\n );\n } else if ('default' in def && def.default !== undefined) {\n (this.context as any)[key] = escapeHTML(def.default);\n }\n // else: leave undefined if no default\n });\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) {\n cfg.onError(error as Error | null, this.context);\n }\n if (cfg.errorFallback) {\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(\n error as Error | null,\n this.context,\n );\n }\n }\n }\n }\n };\n}\n"],"names":["createStore","initial","state","target","prop","value","notify","listeners","subscribe","listener","getState","fn","GlobalEventBus","eventName","data","now","counter","eventHandlers","handler","error","options","resolve","unsubscribe","stats","eventBus","h","tag","props","children","key","finalKey","isAnchorBlock","v","isElementVNode","ensureKey","k","parseProps","str","values","context","attrs","directives","attrRegex","match","prefix","rawName","rawVal","interpMatch","onName","directiveName","modifierParts","modifiers","finalValue","finalModifiers","commonModifiers","valueParts","actualValue","valueModifiers","i","htmlImpl","strings","textVNode","text","template","tagRegex","stack","root","currentChildren","currentTag","currentProps","currentKey","nodeIndex","fragmentChildren","mergeIntoCurrentProps","maybe","existingStyle","newStyle","existingClasses","newClasses","allClasses","pushInterpolation","val","baseKey","targetChildren","anchorKey","anchorChildren","tagName","isClosing","isSelfClosing","rawProps","rawAttrs","vnodeProps","directive","visible","classValue","classNames","cls","className","condition","existingClass","styleValue","styleString","styleRules","property","kebabProperty","needsPx","cssValue","remainingDirectives","node","prev","idx","parts","part","interp","child","cleanedFragments","html","last","when","cond","anchorBlock","each","list","render","item","itemKey","branches","content","whenChain","childArray","getNestedValue","obj","path","current","setNestedValue","keys","lastKey","processModelDirective","el","hasLazy","hasTrim","hasNumber","getCurrentValue","actualState","currentValue","inputType","attrInputType","checkboxValue","shouldBeChecked","trueValue","radioValue","selectEl","currentArray","option","shouldBeSelected","stringValue","eventType","eventListener","event","freshCurrentValue","newValue","index","falseValue","numValue","currentStateValue","element","compositionStartListener","compositionEndListener","processBindDirective","bindings","processShowDirective","isVisible","currentStyle","displayStyle","displayIndex","rule","processClassDirective","classes","processStyleDirective","processDirectives","vnodeAttrs","assignKeysDeep","nodeOrNodes","usedKeys","tagPart","idPart","uniqueKey","patchProps","oldProps","newProps","newDirectives","processedDirectives","mergedProps","mergedAttrs","oldPropProps","newPropProps","oldVal","newVal","oldAttrs","newAttrs","createElement","vnode","textNode","anchorVNode","start","end","frag","patchChildren","parent","oldChildren","newChildren","oldNodes","oldVNodes","oldVNodeByKey","oldNodeByKey","usedNodes","nextSibling","markRangeUsed","cur","patchChildrenBetween","oldNodesInRange","oldVNodesInRange","c","oldVNodeByKeyRange","oldNodeByKeyRange","usedInRange","next","newVNode","oldVNode","patch","commonLength","aKey","startKey","endKey","dom","placeholder","newEl","vdomRenderer","vnodeOrArray","wrap","prevVNode","prevDom","newDom","nodesToRemove","StyleCache","maxSize","css","dependencies","entry","dependency","keysToDelete","oldestKey","oldestAccess","access","minifyCSS","createStateHash","_key","result","deduplicateCSS","rules","seen","deduplicated","normalized","createDebouncer","delay","timeoutId","debounced","args","StylePerformanceMonitor","operation","duration","times","a","b","op","stylePerformanceMonitor","registry","toKebab","escapeHTML","sanitizeCSS","component","renderOrConfig","config","normalizedTag","finalConfig","createElementClass","optimizations","cfg","unsub","name","oldValue","outputOrPromise","output","fallback","nestedTarget","timer","styleConfig","shouldCache","stateHash","dependentValues","dep","cachedStyle","rawStyle","processedStyle","createReactive","receiver","self","fullPath","onlyStyleChanged","styleDeps","newPath","watchConfig","callback","isEqual","keysA","keysB","watcher","watchPath","watcherConfig","parseProp","type","def","attr"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.umd.js","sources":["../src/lib/store.ts","../src/lib/event-bus.ts","../src/lib/template-compiler.ts","../src/lib/directives.ts","../src/lib/vdom.ts","../src/lib/style-utils.ts","../src/lib/runtime.ts"],"sourcesContent":["\n// Usage example\n// import { Store } from './lib/store';\n\n// export const globalState = Store({ theme: 'light', count: 0 });\n\n// // In a component\n// globalState.subscribe((state) => {\n// console.log('Global changed:', state.count);\n// });\n\n// src/lib/store.ts\ntype Listener<T> = (state: T) => void;\n\nexport interface Store<T extends object> {\n subscribe(listener: Listener<T>): void;\n getState(): T;\n}\n\nexport function createStore<T extends object>(initial: T) {\n let state = new Proxy(initial, {\n set: (target, prop, value) => {\n (target as any)[prop] = value;\n notify();\n return true;\n }\n });\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // Initial call\n }\n\n function getState(): T {\n return state;\n }\n\n function notify() {\n listeners.forEach((fn) => fn(state));\n }\n\n return { subscribe, getState };\n}\n","\n/**\n * Event handler type for global event bus\n */\nexport type EventHandler<T = any> = (data: T) => void;\n\n/**\n * Event map type using Set for efficient handler management\n */\ntype EventMap = { [eventName: string]: Set<EventHandler> };\n\n\n/**\n * GlobalEventBus provides a singleton event bus for cross-component communication.\n * Uses Set for handler storage to optimize add/remove operations and prevent duplicates.\n */\nexport class GlobalEventBus extends EventTarget {\n private handlers: EventMap = {};\n private static instance: GlobalEventBus;\n private eventCounters: Map<string, { count: number; window: number }> = new Map();\n\n\n /**\n * Returns the singleton instance of GlobalEventBus\n */\n static getInstance(): GlobalEventBus {\n if (!GlobalEventBus.instance) {\n GlobalEventBus.instance = new GlobalEventBus();\n }\n return GlobalEventBus.instance;\n }\n\n // Enhanced emit method with better typing and event storm protection\n /**\n * Emit a global event with optional data. Includes event storm protection.\n * @param eventName - Name of the event\n * @param data - Optional event payload\n */\n emit<T = any>(eventName: string, data?: T): void {\n // Event storm protection\n const now = Date.now();\n const counter = this.eventCounters.get(eventName);\n \n if (!counter || now - counter.window > 1000) {\n // Reset counter every second\n this.eventCounters.set(eventName, { count: 1, window: now });\n } else {\n counter.count++;\n \n if (counter.count > 50) {\n // Too many events of the same type in one second\n console.error(`Event storm detected for \"${eventName}\": ${counter.count} events in 1 second. Throttling...`);\n \n // Throttle this event type for a short period\n if (counter.count > 100) {\n console.warn(`Blocking further \"${eventName}\" events to prevent infinite loop`);\n return;\n }\n }\n }\n\n // Use native CustomEvent for better browser integration\n this.dispatchEvent(new CustomEvent(eventName, { \n detail: data,\n bubbles: false, // Global events don't need to bubble\n cancelable: true \n }));\n\n // Also trigger registered handlers\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in global event handler for \"${eventName}\":`, error);\n }\n });\n }\n }\n\n\n /**\n * Register a handler for a global event. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n on<T = any>(eventName: string, handler: EventHandler<T>): () => void {\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = new Set();\n }\n this.handlers[eventName].add(handler);\n return () => this.off(eventName, handler);\n }\n\n\n /**\n * Remove a specific handler for a global event.\n * @param eventName - Name of the event\n * @param handler - Handler function to remove\n */\n off<T = any>(eventName: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.delete(handler);\n }\n }\n\n\n /**\n * Remove all handlers for a specific event.\n * @param eventName - Name of the event\n */\n offAll(eventName: string): void {\n delete this.handlers[eventName];\n }\n\n\n /**\n * Listen for a native CustomEvent. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - CustomEvent handler\n * @param options - AddEventListener options\n */\n listen<T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions): () => void {\n this.addEventListener(eventName, handler as EventListener, options);\n return () => this.removeEventListener(eventName, handler as EventListener);\n }\n\n\n /**\n * Register a one-time event handler. Returns a promise that resolves with the event data.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n once<T = any>(eventName: string, handler: EventHandler<T>): Promise<T> {\n return new Promise((resolve) => {\n const unsubscribe = this.on(eventName, (data: T) => {\n unsubscribe();\n handler(data);\n resolve(data);\n });\n });\n }\n\n\n /**\n * Get a list of all active event names with registered handlers.\n */\n getActiveEvents(): string[] {\n return Object.keys(this.handlers).filter(eventName => \n this.handlers[eventName] && this.handlers[eventName].size > 0\n );\n }\n\n\n /**\n * Clear all event handlers (useful for testing or cleanup).\n */\n clear(): void {\n this.handlers = {};\n // Note: This doesn't clear native event listeners, use removeAllListeners if needed\n }\n\n\n /**\n * Get the number of handlers registered for a specific event.\n * @param eventName - Name of the event\n */\n getHandlerCount(eventName: string): number {\n return this.handlers[eventName]?.size || 0;\n }\n\n\n /**\n * Get event statistics for debugging.\n */\n getEventStats(): Record<string, { count: number; handlersCount: number }> {\n const stats: Record<string, { count: number; handlersCount: number }> = {};\n for (const [eventName, counter] of this.eventCounters.entries()) {\n stats[eventName] = {\n count: counter.count,\n handlersCount: this.getHandlerCount(eventName)\n };\n }\n return stats;\n }\n\n\n /**\n * Reset event counters (useful for testing or after resolving issues).\n */\n resetEventCounters(): void {\n this.eventCounters.clear();\n }\n}\n\n\n/**\n * Singleton instance of the global event bus\n */\nexport const eventBus = GlobalEventBus.getInstance();\n\n/**\n * Emit a global event\n */\nexport const emit = <T = any>(eventName: string, data?: T) => eventBus.emit(eventName, data);\n\n/**\n * Register a handler for a global event\n */\nexport const on = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.on(eventName, handler);\n\n/**\n * Remove a handler for a global event\n */\nexport const off = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.off(eventName, handler);\n\n/**\n * Register a one-time handler for a global event\n */\nexport const once = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.once(eventName, handler);\n\n/**\n * Listen for a native CustomEvent\n */\nexport const listen = <T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions) => \n eventBus.listen(eventName, handler, options);\n","import type { VNode } from \"./vdom\";\n\nexport function h(\n tag: string,\n props: Record<string, any> = {},\n children?: VNode[] | string,\n key?: string | number,\n): VNode {\n // Do NOT invent keys here; use only what the caller passes (or props.key).\n const finalKey = key ?? props.key;\n return { tag, key: finalKey, props, children };\n}\n\nfunction isAnchorBlock(v: any): boolean {\n return (\n !!v &&\n typeof v === \"object\" &&\n ((v as any).type === \"AnchorBlock\" || (v as any).tag === \"#anchor\")\n );\n}\n\nfunction isElementVNode(v: any): v is VNode {\n return (\n typeof v === \"object\" && v !== null && \"tag\" in v && !isAnchorBlock(v) // exclude anchor blocks from being treated as normal elements\n );\n}\n\nfunction ensureKey(v: VNode, k: string): VNode {\n return v.key != null ? v : { ...v, key: k };\n}\n\nfunction parseProps(\n str: string,\n values: unknown[] = [],\n context: Record<string, any> = {}\n): {\n props: Record<string, any>;\n attrs: Record<string, any>;\n directives: Record<string, { value: string; modifiers: string[] }>;\n} {\n const props: Record<string, any> = {};\n const attrs: Record<string, any> = {};\n const directives: Record<string, { value: any; modifiers: string[] }> = {};\n\n // Match attributes with optional prefix and support for single/double quotes\n const attrRegex =\n /([:@#]?)([a-zA-Z0-9-:\\.]+)=(\"([^\"\\\\]*(\\\\.[^\"\\\\]*)*)\"|'([^'\\\\]*(\\\\.[^'\\\\]*)*)')/g;\n\n let match: RegExpExecArray | null;\n\n while ((match = attrRegex.exec(str))) {\n const prefix = match[1];\n const rawName = match[2];\n const rawVal = (match[4] || match[6]) ?? \"\"; // Extract value from either quote type\n\n // Interpolation detection\n const interpMatch = rawVal.match(/^{{(\\d+)}}$/);\n let value: any = interpMatch\n ? values[Number(interpMatch[1])] ?? null\n : rawVal;\n\n // Type inference\n if (!interpMatch) {\n if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value === \"null\") value = null;\n else if (!isNaN(Number(value))) value = Number(value);\n }\n\n if (prefix === \":\") {\n if (typeof value === \"boolean\") {\n attrs[rawName] = value;\n } else if (value !== undefined && value !== null) {\n props[rawName] = value;\n }\n } else if (prefix === \"@\") {\n const onName = \"on\" + rawName.charAt(0).toUpperCase() + rawName.slice(1);\n props[onName] =\n typeof value === \"function\"\n ? value\n : typeof context[value] === \"function\"\n ? context[value]\n : undefined;\n } else if (prefix === \"#\") {\n const [directiveName, ...modifierParts] = rawName.split(\".\");\n const modifiers = [...modifierParts];\n\n let finalValue = value;\n let finalModifiers = [...modifiers];\n\n if (\n directiveName === \"model\" &&\n typeof finalValue === \"string\" &&\n finalValue.includes(\".\")\n ) {\n const commonModifiers = [\"trim\", \"number\", \"lazy\"];\n const valueParts = finalValue.split(\".\");\n let actualValue = finalValue;\n const valueModifiers: string[] = [];\n\n for (let i = valueParts.length - 1; i > 0; i--) {\n if (commonModifiers.includes(valueParts[i])) {\n valueModifiers.unshift(valueParts[i]);\n actualValue = valueParts.slice(0, i).join(\".\");\n } else {\n break;\n }\n }\n\n finalValue = actualValue;\n finalModifiers.push(...valueModifiers);\n }\n\n directives[directiveName] = {\n value: finalValue,\n modifiers: finalModifiers,\n };\n } else {\n attrs[rawName] = value;\n }\n }\n\n return { props, attrs, directives };\n}\n\n/**\n * Internal implementation allowing an optional compile context for #model.\n * Fixes:\n * - Recognize interpolation markers embedded in text (\"World{{1}}\") and replace them.\n * - Skip empty arrays from directives so markers don't leak as text.\n * - Pass AnchorBlocks through (and deep-normalize their children's keys) so the renderer can mount/patch them surgically.\n * - Do not rewrap interpolated VNodes (preserve their keys); only fill in missing keys.\n */\nfunction htmlImpl(\n strings: TemplateStringsArray,\n values: unknown[],\n context?: Record<string, any>,\n): VNode | VNode[] {\n function textVNode(text: string, key: string): VNode {\n return h(\"#text\", {}, text, key);\n }\n\n // Stitch template with interpolation markers\n let template = \"\";\n for (let i = 0; i < strings.length; i++) {\n template += strings[i];\n if (i < values.length) template += `{{${i}}}`;\n }\n\n // Matches: tags (open/close/self), standalone interpolation markers, or any other text\n const tagRegex = /<\\/?([a-zA-Z0-9-]+)([^>]*)\\/?>|{{(\\d+)}}|([^<]+)/g;\n\n const stack: Array<{\n tag: string;\n props: Record<string, any>;\n children: VNode[];\n key: string | number | undefined;\n }> = [];\n let root: VNode | null = null;\n let match: RegExpExecArray | null;\n let currentChildren: VNode[] = [];\n let currentTag: string | null = null;\n let currentProps: Record<string, any> = {};\n let currentKey: string | number | undefined = undefined;\n let nodeIndex = 0;\n let fragmentChildren: VNode[] = []; // Track root-level nodes for fragments\n\n // Helper: merge object-like interpolation into currentProps\n function mergeIntoCurrentProps(maybe: any) {\n if (!maybe || typeof maybe !== \"object\") return;\n if (isAnchorBlock(maybe)) return; // do not merge AnchorBlocks\n if (maybe.props || maybe.attrs) {\n if (maybe.props) {\n // Ensure currentProps.props exists\n if (!currentProps.props) currentProps.props = {};\n Object.assign(currentProps.props, maybe.props);\n }\n if (maybe.attrs) {\n // Ensure currentProps.attrs exists\n if (!currentProps.attrs) currentProps.attrs = {};\n\n // Handle special merging for style and class attributes\n Object.keys(maybe.attrs).forEach((key) => {\n if (key === \"style\" && currentProps.attrs.style) {\n // Merge style attributes by concatenating with semicolon\n const existingStyle = currentProps.attrs.style.replace(\n /;?\\s*$/,\n \"\",\n );\n const newStyle = maybe.attrs.style.replace(/^;?\\s*/, \"\");\n currentProps.attrs.style = existingStyle + \"; \" + newStyle;\n } else if (key === \"class\" && currentProps.attrs.class) {\n // Merge class attributes by concatenating with space\n const existingClasses = currentProps.attrs.class\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const newClasses = maybe.attrs.class\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const allClasses = [\n ...new Set([...existingClasses, ...newClasses]),\n ];\n currentProps.attrs.class = allClasses.join(\" \");\n } else {\n // For other attributes, just assign (later values override)\n currentProps.attrs[key] = maybe.attrs[key];\n }\n });\n }\n } else {\n // If no props/attrs structure, merge directly into props\n if (!currentProps.props) currentProps.props = {};\n Object.assign(currentProps.props, maybe);\n }\n }\n\n // Helper: push an interpolated value into currentChildren/currentProps or fragments\n function pushInterpolation(val: any, baseKey: string) {\n const targetChildren = currentTag ? currentChildren : fragmentChildren;\n\n if (isAnchorBlock(val)) {\n const anchorKey = (val as VNode).key ?? baseKey;\n let anchorChildren = (val as any).children as VNode[] | undefined;\n\n targetChildren.push({\n ...(val as VNode),\n key: anchorKey,\n children: anchorChildren,\n });\n return;\n }\n\n if (isElementVNode(val)) {\n // Leave key undefined so assignKeysDeep can generate a stable one\n targetChildren.push(ensureKey(val, undefined as any));\n return;\n }\n\n if (Array.isArray(val)) {\n if (val.length === 0) return;\n for (let i = 0; i < val.length; i++) {\n const v = val[i];\n if (isAnchorBlock(v) || isElementVNode(v) || Array.isArray(v)) {\n // recurse or push without forcing a key\n pushInterpolation(v, `${baseKey}-${i}`);\n } else if (v !== null && typeof v === \"object\") {\n mergeIntoCurrentProps(v);\n } else {\n targetChildren.push(textVNode(String(v), `${baseKey}-${i}`));\n }\n }\n return;\n }\n\n if (val !== null && typeof val === \"object\") {\n mergeIntoCurrentProps(val);\n return;\n }\n\n targetChildren.push(textVNode(String(val), baseKey));\n }\n\n while ((match = tagRegex.exec(template))) {\n if (match[1]) {\n // Tag token\n const tagName = match[1];\n const isClosing = match[0][1] === \"/\";\n const isSelfClosing = match[0][match[0].length - 2] === \"/\";\n\n const {\n props: rawProps,\n attrs: rawAttrs,\n directives,\n } = parseProps(match[2] || \"\", values, context);\n\n // Shape props into { props, attrs, directives } expected by VDOM\n const vnodeProps: {\n props: Record<string, unknown>;\n attrs: Record<string, unknown>;\n directives?: Record<string, { value: any; modifiers: string[] }>;\n } = { props: {}, attrs: {} };\n\n for (const k in rawProps) vnodeProps.props[k] = rawProps[k];\n for (const k in rawAttrs) vnodeProps.attrs[k] = rawAttrs[k];\n\n // Process built-in directives that should be converted to props/attrs\n for (const [directiveName, directive] of Object.entries(directives)) {\n if (directiveName === \"bind\") {\n // #bind directive - can be object syntax or simple value\n if (typeof directive.value === \"object\" && directive.value !== null) {\n // #bind object syntax: #bind=\"{ disabled: true, class: 'foo' }\"\n for (const [key, value] of Object.entries(directive.value)) {\n if (typeof value === \"boolean\") {\n vnodeProps.attrs[key] = value;\n } else if (value != null) {\n vnodeProps.attrs[key] = String(value);\n }\n }\n } else if (directive.value != null) {\n // Simple #bind (though this is unusual - typically it's object syntax)\n vnodeProps.attrs[directiveName] = String(directive.value);\n }\n } else if (directiveName === \"show\") {\n // #show directive\n const visible = Boolean(directive.value);\n vnodeProps.attrs.style =\n (vnodeProps.attrs.style || \"\") +\n (visible ? \"\" : \"; display: none !important\");\n } else if (directiveName === \"class\") {\n // #class directive\n const classValue = directive.value;\n let classNames: string[] = [];\n\n if (typeof classValue === \"string\") {\n classNames = classValue.split(/\\s+/).filter(Boolean);\n } else if (Array.isArray(classValue)) {\n for (const cls of classValue as any[]) {\n if (typeof cls === \"string\") {\n classNames.push(...cls.split(/\\s+/).filter(Boolean));\n } else if (cls && typeof cls === \"object\") {\n for (const [className, condition] of Object.entries(cls)) {\n if (condition) {\n classNames.push(...className.split(/\\s+/).filter(Boolean));\n }\n }\n }\n }\n } else if (classValue && typeof classValue === \"object\") {\n for (const [className, condition] of Object.entries(classValue)) {\n if (condition) {\n classNames.push(...className.split(/\\s+/).filter(Boolean));\n }\n }\n }\n\n const existingClass = (vnodeProps.attrs.class as string) || \"\";\n const newClasses = [\n ...new Set([\n ...existingClass.split(/\\s+/).filter(Boolean),\n ...classNames,\n ]),\n ];\n vnodeProps.attrs.class = newClasses.join(\" \");\n } else if (directiveName === \"style\") {\n // #style directive\n const styleValue = directive.value;\n let styleString = \"\";\n\n if (typeof styleValue === \"string\") {\n styleString = styleValue;\n } else if (styleValue && typeof styleValue === \"object\") {\n const styleRules: string[] = [];\n for (const [property, value] of Object.entries(styleValue)) {\n if (value != null && value !== \"\") {\n const kebabProperty = property.replace(\n /[A-Z]/g,\n (match) => `-${match.toLowerCase()}`,\n );\n const needsPx = [\n \"width\",\n \"height\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"margin\",\n \"margin-top\",\n \"margin-right\",\n \"margin-bottom\",\n \"margin-left\",\n \"padding\",\n \"padding-top\",\n \"padding-right\",\n \"padding-bottom\",\n \"padding-left\",\n \"font-size\",\n \"line-height\",\n \"border-width\",\n \"border-radius\",\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n ];\n let cssValue = String(value);\n if (\n typeof value === \"number\" &&\n needsPx.includes(kebabProperty)\n ) {\n cssValue = `${value}px`;\n }\n styleRules.push(`${kebabProperty}: ${cssValue}`);\n }\n }\n styleString =\n styleRules.join(\"; \") + (styleRules.length > 0 ? \";\" : \"\");\n }\n\n const existingStyle = (vnodeProps.attrs.style as string) || \"\";\n vnodeProps.attrs.style =\n existingStyle +\n (existingStyle && !existingStyle.endsWith(\";\") ? \"; \" : \"\") +\n styleString;\n }\n }\n\n // Add remaining directives that need special handling by the VDOM renderer\n const remainingDirectives: Record<\n string,\n { value: any; modifiers: string[] }\n > = {};\n for (const [directiveName, directive] of Object.entries(directives)) {\n if (![\"bind\", \"show\", \"class\", \"style\"].includes(directiveName)) {\n remainingDirectives[directiveName] = directive;\n }\n }\n\n if (Object.keys(remainingDirectives).length > 0) {\n vnodeProps.directives = remainingDirectives;\n }\n\n if (isClosing) {\n const node = h(\n currentTag!,\n currentProps,\n currentChildren.length === 1 &&\n isElementVNode(currentChildren[0]) &&\n currentChildren[0].tag === \"#text\"\n ? typeof currentChildren[0].children === \"string\"\n ? currentChildren[0].children\n : \"\"\n : currentChildren.length\n ? currentChildren\n : undefined,\n currentKey,\n );\n const prev = stack.pop();\n if (prev) {\n currentTag = prev.tag;\n currentProps = prev.props;\n currentKey = prev.key;\n currentChildren = prev.children;\n currentChildren.push(node);\n } else {\n root = node;\n }\n } else if (isSelfClosing) {\n const key = undefined;\n const targetChildren = currentTag ? currentChildren : fragmentChildren;\n targetChildren.push(h(tagName, vnodeProps, undefined, key));\n } else {\n if (currentTag) {\n stack.push({\n tag: currentTag,\n props: currentProps,\n children: currentChildren,\n key: currentKey,\n });\n }\n currentTag = tagName;\n currentProps = vnodeProps;\n currentChildren = [];\n }\n } else if (typeof match[3] !== \"undefined\") {\n // Standalone interpolation marker {{N}}\n const idx = Number(match[3]);\n const val = values[idx];\n const baseKey = `interp-${idx}`;\n pushInterpolation(val, baseKey);\n } else if (match[4]) {\n // Plain text (may contain embedded interpolation markers like \"...{{N}}...\")\n const text = match[4];\n\n const targetChildren = currentTag ? currentChildren : fragmentChildren;\n\n // Split text by embedded markers and handle parts\n const parts = text.split(/({{\\d+}})/);\n for (const part of parts) {\n if (!part) continue;\n\n const interp = part.match(/^{{(\\d+)}}$/);\n if (interp) {\n const idx = Number(interp[1]);\n const val = values[idx];\n const baseKey = `interp-${idx}`;\n pushInterpolation(val, baseKey);\n } else {\n const key = `text-${nodeIndex++}`;\n targetChildren.push(textVNode(part, key));\n }\n }\n }\n }\n\n // If we have a single root element, return it\n if (root) {\n // Clean empty text nodes at root level\n if (isElementVNode(root) && Array.isArray(root.children)) {\n root.children = (root.children as VNode[]).filter(\n (child): child is VNode =>\n isElementVNode(child)\n ? child.tag !== \"#text\" ||\n (typeof child.children === \"string\" &&\n child.children.trim() !== \"\")\n : true, // keep non-element VNodes (including anchors) as-is\n );\n }\n return root;\n }\n\n // If we have fragment children (multiple root nodes), return them as array\n if (fragmentChildren.length > 0) {\n // Filter out empty text nodes\n const cleanedFragments = fragmentChildren.filter((child): child is VNode =>\n isElementVNode(child)\n ? child.tag !== \"#text\" ||\n (typeof child.children === \"string\" && child.children.trim() !== \"\")\n : true,\n );\n\n return cleanedFragments.length === 1\n ? cleanedFragments[0]\n : cleanedFragments;\n }\n\n // Fallback for empty content\n return h(\"div\", {}, \"\", \"fallback-root\");\n}\n\n/**\n * Default export: plain html.\n */\nexport function html(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): VNode | VNode[] {\n // If last value is a context object, use it\n const last = values[values.length - 1];\n const context =\n typeof last === \"object\" && last && !Array.isArray(last)\n ? (last as Record<string, any>)\n : undefined;\n\n return htmlImpl(strings, values, context);\n}\n","import type { VNode } from \"./vdom\";\n\n/* --- When --- */\nexport function when(cond: boolean, children: VNode | VNode[]): VNode {\n const anchorKey = \"when-block\"; // stable key regardless of condition\n return anchorBlock(cond ? children : [], anchorKey);\n}\n\n/* --- Each --- */\nexport function each<\n T extends string | number | boolean | { id?: string | number; key?: string },\n>(list: T[], render: (item: T, index: number) => VNode | VNode[]): VNode[] {\n return list.map((item, i) => {\n // For primitives, use value as key; for objects, prefer key/id\n const itemKey =\n typeof item === \"object\"\n ? ((item as any)?.key ?? (item as any)?.id ?? `idx-${i}`)\n : String(item);\n return anchorBlock(render(item, i), `each-${itemKey}`);\n });\n}\n\n/* --- match --- */\nexport function match() {\n const branches: Branch[] = [];\n return {\n when(cond: any, content: VNode | VNode[]) {\n branches.push([cond, content]);\n return this;\n },\n otherwise(content: VNode | VNode[]) {\n branches.push([true, content]);\n return this;\n },\n done() {\n return whenChain(...branches);\n },\n };\n}\n\n/* --- WhenChain --- */\ntype Branch = [condition: any, content: VNode | VNode[]];\n\nfunction whenChain(...branches: Branch[]): VNode[] {\n for (let idx = 0; idx < branches.length; idx++) {\n const [cond, content] = branches[idx];\n if (cond) return [anchorBlock(content, `whenChain-branch-${idx}`)];\n }\n return [anchorBlock([], \"whenChain-empty\")];\n}\n\n/**\n * Create a stable anchor block with consistent boundaries.\n * Always has start/end boundaries.\n */\nfunction anchorBlock(\n children: VNode | VNode[] | null | undefined,\n anchorKey: string,\n): VNode {\n // Normalize children to array, filtering out null/undefined\n const childArray = !children\n ? []\n : Array.isArray(children)\n ? children.filter(Boolean)\n : [children].filter(Boolean);\n\n return {\n tag: \"#anchor\",\n key: anchorKey,\n children: childArray,\n };\n}","/**\n * vdom.ts\n * Lightweight, strongly typed, functional virtual DOM renderer for custom elements.\n * Features: keyed diffing, incremental patching, focus/caret preservation, event delegation, SSR-friendly, no dependencies.\n */\n\nexport interface VNode {\n tag: string;\n key?: string;\n props?: {\n key?: string;\n props?: any;\n attrs?: Record<string, any>;\n directives?: Record<string, { value: string; modifiers: string[] }>;\n };\n children?: VNode[] | string;\n}\n\nexport interface AnchorBlockVNode extends VNode {\n tag: \"#anchor\";\n key: string;\n children: VNode[];\n _startNode?: Comment;\n _endNode?: Comment;\n}\n\n/**\n * Get nested property value from object using dot notation\n */\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((current, key) => current?.[key], obj);\n}\n\n/**\n * Set nested property value in object using dot notation\n */\nfunction setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split(\".\");\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n const target = keys.reduce((current, key) => {\n if (!(key in current)) {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n/**\n * Process #model directive for two-way data binding\n */\nfunction processModelDirective(\n value: string,\n modifiers: string[],\n props: Record<string, any>,\n attrs: Record<string, any>,\n listeners: Record<string, EventListener>,\n context?: any,\n el?: HTMLElement,\n): void {\n if (!context) return;\n\n const hasLazy = modifiers.includes(\"lazy\");\n const hasTrim = modifiers.includes(\"trim\");\n const hasNumber = modifiers.includes(\"number\");\n\n // Get current value from state - always get fresh value to avoid stale closures\n const getCurrentValue = () => {\n const actualState = context._state || context;\n return getNestedValue(actualState, value);\n };\n const currentValue = getCurrentValue();\n\n // Determine input type from attrs or element\n let inputType = \"text\";\n const attrInputType = attrs?.type;\n\n if (el instanceof HTMLInputElement) {\n inputType = attrInputType || el.type || \"text\";\n } else if (el instanceof HTMLSelectElement) {\n inputType = \"select\";\n } else if (el instanceof HTMLTextAreaElement) {\n inputType = \"textarea\";\n }\n\n // Set initial value only if different from current DOM value to prevent infinite loops\n if (inputType === \"checkbox\") {\n if (Array.isArray(currentValue)) {\n // Multiple checkboxes bound to array\n const checkboxValue = el?.getAttribute(\"value\") || attrs?.value || \"\";\n const shouldBeChecked = currentValue.includes(checkboxValue);\n if (el && (el as HTMLInputElement).checked !== shouldBeChecked) {\n props.checked = shouldBeChecked;\n }\n } else {\n // Single checkbox bound to boolean or custom values\n const trueValue = el?.getAttribute(\"true-value\") || true;\n const shouldBeChecked = currentValue === trueValue;\n if (el && (el as HTMLInputElement).checked !== shouldBeChecked) {\n props.checked = shouldBeChecked;\n }\n }\n } else if (inputType === \"radio\") {\n const radioValue = attrs?.value || \"\";\n const shouldBeChecked = currentValue === radioValue;\n if (el && (el as HTMLInputElement).checked !== shouldBeChecked) {\n props.checked = shouldBeChecked;\n }\n } else if (inputType === \"select\") {\n // Handle both single and multiple select\n if (el && el.hasAttribute(\"multiple\")) {\n // Multiple select - currentValue should be an array\n const selectEl = el as HTMLSelectElement;\n const currentArray = Array.isArray(currentValue) ? currentValue : [];\n\n // Only update if different to prevent loops\n setTimeout(() => {\n Array.from(selectEl.options).forEach((option) => {\n const shouldBeSelected = currentArray.includes(option.value);\n if (option.selected !== shouldBeSelected) {\n option.selected = shouldBeSelected;\n }\n });\n }, 0);\n } else {\n // Single select\n setTimeout(() => {\n if (\n el instanceof HTMLSelectElement &&\n el.value !== String(currentValue)\n ) {\n el.value = String(currentValue);\n }\n }, 0);\n }\n } else {\n // Only set value prop if different from current DOM value to prevent infinite loops\n const stringValue = String(currentValue ?? \"\");\n if (\n !el ||\n (el as HTMLInputElement | HTMLTextAreaElement).value !== stringValue\n ) {\n props.value = currentValue;\n }\n }\n\n // Create event listener with loop prevention\n const eventType =\n hasLazy ||\n inputType === \"checkbox\" ||\n inputType === \"radio\" ||\n inputType === \"select\"\n ? \"change\"\n : \"input\";\n\n const eventListener: EventListener = (event: Event) => {\n // Skip during IME composition - check multiple ways\n if ((event as any).isComposing || (listeners as any)._isComposing) return;\n\n // Skip if this is a programmatic change (not user-initiated)\n if ((event as any).isTrusted === false) return;\n\n const target = event.target as\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n\n // Skip if event is fired during our own value updates\n if ((target as any)._modelUpdating) return;\n\n // Always get fresh current value to avoid stale closures\n const freshCurrentValue = getCurrentValue();\n\n let newValue: any = target.value;\n\n // Handle different input types\n if (inputType === \"checkbox\") {\n if (Array.isArray(freshCurrentValue)) {\n // Multiple checkboxes bound to array\n const checkboxValue = target.getAttribute(\"value\") || \"\";\n const currentArray = [...freshCurrentValue];\n if ((target as HTMLInputElement).checked) {\n if (!currentArray.includes(checkboxValue)) {\n currentArray.push(checkboxValue);\n }\n } else {\n const index = currentArray.indexOf(checkboxValue);\n if (index > -1) {\n currentArray.splice(index, 1);\n }\n }\n newValue = currentArray;\n } else {\n // Single checkbox\n const trueValue = target.getAttribute(\"true-value\") || true;\n const falseValue = target.getAttribute(\"false-value\") || false;\n newValue = (target as HTMLInputElement).checked\n ? trueValue\n : falseValue;\n }\n } else if (inputType === \"radio\") {\n newValue = target.getAttribute(\"value\") || target.value;\n } else if (\n inputType === \"select\" &&\n (target as HTMLSelectElement).multiple\n ) {\n // Handle multiple select\n const selectEl = target as HTMLSelectElement;\n newValue = Array.from(selectEl.selectedOptions).map(\n (option) => option.value,\n );\n } else {\n // Apply modifiers for text inputs\n if (hasTrim) {\n newValue = newValue.trim();\n }\n if (hasNumber) {\n const numValue = Number(newValue);\n if (!isNaN(numValue)) {\n newValue = numValue;\n }\n }\n }\n\n // Get current state value to check if update is needed\n const actualState = context._state || context;\n const currentStateValue = getNestedValue(actualState, value);\n\n // Only update if the value has actually changed (prevent infinite loops)\n // For arrays, do a deep comparison\n const hasChanged =\n Array.isArray(newValue) && Array.isArray(currentStateValue)\n ? JSON.stringify([...newValue].sort()) !==\n JSON.stringify([...currentStateValue].sort())\n : newValue !== currentStateValue;\n\n if (hasChanged) {\n // Mark element as updating to prevent feedback loops\n const element = event.target as HTMLElement;\n (element as any)._modelUpdating = true;\n\n // Update using the actual state object for proper nested property support\n setNestedValue(actualState, value, newValue);\n\n // Clear the updating flag after a tick\n setTimeout(() => {\n (element as any)._modelUpdating = false;\n }, 0);\n\n // Trigger re-render if context has a render method\n if (context._requestRender) {\n context._requestRender();\n }\n }\n };\n\n listeners[eventType] = eventListener;\n\n // Handle IME composition for all input types (not just when !hasLazy)\n if (inputType === \"text\" || inputType === \"textarea\") {\n const compositionStartListener: EventListener = () => {\n // Flag to skip input events during composition\n (listeners as any)._isComposing = true;\n };\n\n const compositionEndListener: EventListener = (event: Event) => {\n (listeners as any)._isComposing = false;\n\n // Capture the target reference before setTimeout to avoid losing it\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n // Manually trigger the update after composition ends\n setTimeout(() => {\n if (target) {\n let newValue: any = target.value;\n\n // Apply modifiers\n if (hasTrim) {\n newValue = newValue.trim();\n }\n if (hasNumber) {\n const numValue = Number(newValue);\n if (!isNaN(numValue)) {\n newValue = numValue;\n }\n }\n\n // Get current state value and only update if different\n const actualState = context._state || context;\n const currentStateValue = getNestedValue(actualState, value);\n\n // For arrays, do a deep comparison\n const hasChanged =\n Array.isArray(newValue) && Array.isArray(currentStateValue)\n ? JSON.stringify([...newValue].sort()) !==\n JSON.stringify([...currentStateValue].sort())\n : newValue !== currentStateValue;\n\n if (hasChanged) {\n // Mark element as updating to prevent feedback loops\n if (target) {\n (target as any)._modelUpdating = true;\n setTimeout(() => {\n (target as any)._modelUpdating = false;\n }, 0);\n }\n\n setNestedValue(actualState, value, newValue);\n\n if (context._requestRender) {\n context._requestRender();\n }\n }\n }\n }, 0);\n };\n\n listeners.compositionstart = compositionStartListener;\n listeners.compositionend = compositionEndListener;\n }\n}\n\n/**\n * Process #bind directive for attribute/property binding\n */\nfunction processBindDirective(\n value: string,\n props: Record<string, any>,\n attrs: Record<string, any>,\n context?: any,\n): void {\n if (!context) return;\n\n try {\n // Parse as object binding\n const bindings = JSON.parse(value);\n if (typeof bindings === \"object\") {\n for (const [key, val] of Object.entries(bindings)) {\n props[key] = val;\n }\n }\n } catch {\n // Parse as single property binding\n const currentValue = getNestedValue(context, value);\n // Default to binding as attribute\n attrs[value] = currentValue;\n }\n}\n\n/**\n * Process #show directive for conditional display\n */\nfunction processShowDirective(\n value: string,\n attrs: Record<string, any>,\n context?: any,\n): void {\n if (!context) return;\n\n const isVisible = getNestedValue(context, value);\n const currentStyle = attrs.style || \"\";\n const displayStyle = isVisible ? \"\" : \"none\";\n\n // Merge with existing styles\n if (currentStyle) {\n const styleRules = currentStyle.split(\";\").filter(Boolean);\n const displayIndex = styleRules.findIndex((rule: string) =>\n rule.trim().startsWith(\"display:\"),\n );\n\n if (displayIndex >= 0) {\n styleRules[displayIndex] = `display: ${displayStyle}`;\n } else {\n styleRules.push(`display: ${displayStyle}`);\n }\n\n attrs.style = styleRules.join(\"; \");\n } else {\n attrs.style = `display: ${displayStyle}`;\n }\n}\n\n/**\n * Process #class directive for conditional CSS classes\n */\nfunction processClassDirective(\n value: string,\n attrs: Record<string, any>,\n context?: any,\n): void {\n if (!context) return;\n\n const classValue = getNestedValue(context, value);\n let classes: string[] = [];\n\n if (typeof classValue === \"string\") {\n classes = [classValue];\n } else if (Array.isArray(classValue)) {\n classes = classValue.filter(Boolean);\n } else if (typeof classValue === \"object\") {\n // Object syntax: { className: condition }\n classes = Object.entries(classValue)\n .filter(([, condition]) => Boolean(condition))\n .map(([className]) => className);\n }\n\n const existingClasses = attrs.class || \"\";\n const allClasses = existingClasses\n ? `${existingClasses} ${classes.join(\" \")}`.trim()\n : classes.join(\" \");\n\n if (allClasses) {\n attrs.class = allClasses;\n }\n}\n\nfunction processStyleDirective(\n value: any,\n attrs: Record<string, any>,\n context?: any,\n): void {\n let styleValue: any;\n\n if (typeof value === \"string\") {\n if (!context) return;\n styleValue = getNestedValue(context, value);\n } else {\n styleValue = value;\n }\n\n let styleString = \"\";\n\n if (typeof styleValue === \"string\") {\n styleString = styleValue;\n } else if (styleValue && typeof styleValue === \"object\") {\n const styleRules: string[] = [];\n for (const [property, val] of Object.entries(styleValue)) {\n if (val != null && val !== \"\") {\n const kebabProperty = property.replace(\n /[A-Z]/g,\n (match) => `-${match.toLowerCase()}`,\n );\n const needsPx = [\n \"width\",\n \"height\",\n \"top\",\n \"right\",\n \"bottom\",\n \"left\",\n \"margin\",\n \"margin-top\",\n \"margin-right\",\n \"margin-bottom\",\n \"margin-left\",\n \"padding\",\n \"padding-top\",\n \"padding-right\",\n \"padding-bottom\",\n \"padding-left\",\n \"font-size\",\n \"line-height\",\n \"border-width\",\n \"border-radius\",\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n ];\n let cssValue = String(val);\n if (typeof val === \"number\" && needsPx.includes(kebabProperty)) {\n cssValue = `${val}px`;\n }\n styleRules.push(`${kebabProperty}: ${cssValue}`);\n }\n }\n styleString = styleRules.join(\"; \") + (styleRules.length > 0 ? \";\" : \"\");\n }\n\n const existingStyle = attrs.style || \"\";\n attrs.style =\n existingStyle +\n (existingStyle && !existingStyle.endsWith(\";\") ? \"; \" : \"\") +\n styleString;\n}\n\n/**\n * Process directives and return merged props, attrs, and event listeners\n */\nfunction processDirectives(\n directives: Record<string, { value: any; modifiers: string[] }>,\n context?: any,\n el?: HTMLElement,\n vnodeAttrs?: Record<string, any>,\n): {\n props: Record<string, any>;\n attrs: Record<string, any>;\n listeners: Record<string, EventListener>;\n} {\n const props: Record<string, any> = {};\n const attrs: Record<string, any> = { ...(vnodeAttrs || {}) };\n const listeners: Record<string, EventListener> = {};\n\n for (const [directiveName, directive] of Object.entries(directives)) {\n const { value, modifiers } = directive;\n\n switch (directiveName) {\n case \"model\":\n processModelDirective(\n typeof value === \"string\" ? value : String(value),\n modifiers,\n props,\n attrs,\n listeners,\n context,\n el,\n );\n break;\n case \"bind\":\n processBindDirective(value, props, attrs, context);\n break;\n case \"show\":\n processShowDirective(value, attrs, context);\n break;\n case \"class\":\n processClassDirective(value, attrs, context);\n break;\n case \"style\":\n processStyleDirective(value, attrs, context);\n break;\n // Add other directive cases here as needed\n }\n }\n\n return { props, attrs, listeners };\n}\n\nfunction assignKeysDeep(\n nodeOrNodes: VNode | VNode[],\n baseKey: string,\n): VNode | VNode[] {\n if (Array.isArray(nodeOrNodes)) {\n const usedKeys = new Set<string>();\n\n return nodeOrNodes.map((child) => {\n if (!child || typeof child !== \"object\") return child;\n\n // Determine the starting key\n let key = child.props?.key ?? child.key;\n\n if (!key) {\n // Build a stable identity from tag + stable attributes\n const tagPart = child.tag || \"node\";\n const idPart =\n child.props?.attrs?.id ??\n child.props?.attrs?.name ??\n child.props?.attrs?.[\"data-key\"] ??\n \"\";\n key = idPart\n ? `${baseKey}:${tagPart}:${idPart}`\n : `${baseKey}:${tagPart}`;\n }\n\n // Ensure uniqueness among siblings\n let uniqueKey = key;\n let counter = 1;\n while (usedKeys.has(uniqueKey)) {\n uniqueKey = `${key}#${counter++}`;\n }\n usedKeys.add(uniqueKey);\n\n // Recurse into children with this node's unique key\n let children = child.children;\n if (Array.isArray(children)) {\n children = assignKeysDeep(children, uniqueKey) as VNode[];\n }\n\n return { ...child, key: uniqueKey, children };\n });\n }\n\n // Single node case\n const node = nodeOrNodes as VNode;\n let key = node.props?.key ?? node.key ?? baseKey;\n\n let children = node.children;\n if (Array.isArray(children)) {\n children = assignKeysDeep(children, key) as VNode[];\n }\n\n return { ...node, key, children };\n}\n\n/**\n * Patch props on an element.\n * Only update changed props, remove old, add new.\n */\nfunction patchProps(\n el: HTMLElement,\n oldProps: Record<string, any>,\n newProps: Record<string, any>,\n context?: any,\n) {\n // Process directives first\n const newDirectives = newProps.directives ?? {};\n const processedDirectives = processDirectives(\n newDirectives,\n context,\n el,\n newProps.attrs,\n );\n\n // Merge processed directive results with existing props/attrs\n const mergedProps = {\n ...oldProps.props,\n ...newProps.props,\n ...processedDirectives.props,\n };\n const mergedAttrs = {\n ...oldProps.attrs,\n ...newProps.attrs,\n ...processedDirectives.attrs,\n };\n\n const oldPropProps = oldProps.props ?? {};\n const newPropProps = mergedProps;\n for (const key in { ...oldPropProps, ...newPropProps }) {\n const oldVal = oldPropProps[key];\n const newVal = newPropProps[key];\n if (oldVal !== newVal) {\n if (\n key === \"value\" &&\n (el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement)\n ) {\n if (el.value !== newVal) el.value = newVal ?? \"\";\n } else if (key === \"checked\" && el instanceof HTMLInputElement) {\n el.checked = !!newVal;\n } else if (key.startsWith(\"on\") && typeof newVal === \"function\") {\n if (typeof oldVal === \"function\")\n el.removeEventListener(key.slice(2).toLowerCase(), oldVal);\n el.addEventListener(key.slice(2).toLowerCase(), newVal);\n } else if (newVal === undefined || newVal === null || newVal === false) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(newVal));\n }\n }\n }\n\n // Handle directive event listeners\n for (const [eventType, listener] of Object.entries(\n processedDirectives.listeners || {},\n )) {\n el.addEventListener(eventType, listener as EventListener);\n }\n\n const oldAttrs = oldProps.attrs ?? {};\n const newAttrs = mergedAttrs;\n for (const key in { ...oldAttrs, ...newAttrs }) {\n const oldVal = oldAttrs[key];\n const newVal = newAttrs[key];\n if (oldVal !== newVal) {\n if (\n newVal === undefined ||\n newVal === null ||\n newVal === false\n ) el.removeAttribute(key);\n else el.setAttribute(key, String(newVal));\n }\n }\n}\n\nfunction createElement(vnode: VNode | string, context?: any): Node {\n // String VNode → plain text node (no key)\n if (typeof vnode === \"string\") {\n return document.createTextNode(vnode);\n }\n\n // Text VNode\n if (vnode.tag === \"#text\") {\n const textNode = document.createTextNode(\n typeof vnode.children === \"string\" ? vnode.children : \"\",\n );\n if (vnode.key != null) (textNode as any).key = vnode.key; // attach key\n return textNode;\n }\n\n // Anchor block VNode - ALWAYS create start/end boundaries\n if (vnode.tag === \"#anchor\") {\n const anchorVNode = vnode as AnchorBlockVNode;\n const children = Array.isArray(anchorVNode.children)\n ? anchorVNode.children\n : [];\n\n // Always create start/end markers for stable boundaries\n const start = document.createTextNode(\"\");\n const end = document.createTextNode(\"\");\n\n if (anchorVNode.key != null) {\n (start as any).key = `${anchorVNode.key}:start`;\n (end as any).key = `${anchorVNode.key}:end`;\n }\n anchorVNode._startNode = start;\n anchorVNode._endNode = end;\n\n const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n frag.appendChild(createElement(child, context));\n }\n frag.appendChild(end);\n return frag;\n }\n\n // Standard element VNode\n const el = document.createElement(vnode.tag);\n if (vnode.key != null) (el as any).key = vnode.key; // attach key\n\n const { props = {}, attrs = {}, directives = {} } = vnode.props ?? {};\n\n // Process directives first to get merged props/attrs/listeners\n const processedDirectives = processDirectives(directives, context, el, attrs);\n\n // Merge processed directive results with existing props/attrs\n const mergedProps = {\n ...props,\n ...processedDirectives.props,\n };\n const mergedAttrs = {\n ...attrs,\n ...processedDirectives.attrs,\n };\n\n // Set attributes\n for (const key in mergedAttrs) {\n const val = mergedAttrs[key];\n if (typeof val === \"boolean\") {\n if (val) el.setAttribute(key, \"\");\n // If false, do not set attribute\n } else if (val !== undefined && val !== null) {\n el.setAttribute(key, String(val));\n }\n }\n\n // Set props and event listeners\n for (const key in mergedProps) {\n const val = mergedProps[key];\n if (\n key === \"value\" &&\n (el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement)\n ) {\n el.value = val ?? \"\";\n } else if (key === \"checked\" && el instanceof HTMLInputElement) {\n el.checked = !!val;\n } else if (key.startsWith(\"on\") && typeof val === \"function\") {\n el.addEventListener(key.slice(2).toLowerCase(), val);\n } else if (key.startsWith(\"on\") && val === undefined) {\n continue; // skip undefined event handlers\n } else if (val === undefined || val === null || val === false) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(val));\n }\n }\n\n // Handle directive event listeners\n for (const [eventType, listener] of Object.entries(\n processedDirectives.listeners || {},\n )) {\n el.addEventListener(eventType, listener as EventListener);\n }\n\n // Append children\n if (Array.isArray(vnode.children)) {\n for (const child of vnode.children) {\n el.appendChild(createElement(child, context));\n }\n } else if (typeof vnode.children === \"string\") {\n el.textContent = vnode.children;\n }\n\n return el;\n}\n\n/**\n * Patch children using keys for node matching.\n */\nfunction patchChildren(\n parent: HTMLElement,\n oldChildren: VNode[] | string | undefined,\n newChildren: VNode[] | string | undefined,\n context?: any,\n) {\n if (typeof newChildren === \"string\") {\n if (parent.textContent !== newChildren) parent.textContent = newChildren;\n return;\n }\n if (!Array.isArray(newChildren)) return;\n\n const oldNodes = Array.from(parent.childNodes);\n const oldVNodes: VNode[] = Array.isArray(oldChildren) ? oldChildren : [];\n\n // Map old VNodes by key\n const oldVNodeByKey = new Map<string | number, VNode>();\n for (const v of oldVNodes) {\n if (v && v.key != null) oldVNodeByKey.set(v.key, v);\n }\n\n // Map DOM nodes by key (elements, text, anchors)\n const oldNodeByKey = new Map<string | number, Node>();\n\n // Scan DOM for keyed nodes including anchor boundaries\n for (const node of oldNodes) {\n const k = (node as any).key;\n if (k != null) {\n oldNodeByKey.set(k, node);\n }\n }\n\n const usedNodes = new Set<Node>();\n let nextSibling: Node | null = parent.firstChild;\n\n function markRangeUsed(start: Comment, end?: Comment) {\n let cur: Node | null = start;\n while (cur) {\n usedNodes.add(cur);\n if (cur === end) break;\n cur = cur.nextSibling;\n }\n }\n\n // --- Integrated patchChildrenBetween ---\n function patchChildrenBetween(\n start: Comment,\n end: Comment,\n oldChildren: VNode[] | undefined,\n newChildren: VNode[],\n ) {\n const oldNodesInRange: Node[] = [];\n let cur: Node | null = start.nextSibling;\n while (cur && cur !== end) {\n oldNodesInRange.push(cur);\n cur = cur.nextSibling;\n }\n\n const oldVNodesInRange: VNode[] = Array.isArray(oldChildren)\n ? oldChildren\n : [];\n const hasKeys =\n newChildren.some((c) => c && c.key != null) ||\n oldVNodesInRange.some((c) => c && c.key != null);\n\n if (hasKeys) {\n // Keyed diff\n const oldVNodeByKeyRange = new Map<string | number, VNode>();\n const oldNodeByKeyRange = new Map<string | number, Node>();\n\n for (const v of oldVNodesInRange) {\n if (v && v.key != null) oldVNodeByKeyRange.set(v.key, v);\n }\n for (const node of oldNodesInRange) {\n const k = (node as any).key;\n if (k != null) oldNodeByKeyRange.set(k, node);\n }\n\n const usedInRange = new Set<Node>();\n let next: Node | null = start.nextSibling;\n\n for (const newVNode of newChildren) {\n let node: Node;\n if (newVNode.key != null && oldNodeByKeyRange.has(newVNode.key)) {\n const oldVNode = oldVNodeByKeyRange.get(newVNode.key)!;\n node = patch(\n oldNodeByKeyRange.get(newVNode.key)!,\n oldVNode,\n newVNode,\n context,\n );\n usedInRange.add(node);\n if (node !== next && parent.contains(node)) {\n parent.insertBefore(node, next);\n }\n } else {\n node = createElement(newVNode, context);\n parent.insertBefore(node, next);\n usedInRange.add(node);\n }\n next = node.nextSibling;\n }\n\n // Remove unused\n for (const node of oldNodesInRange) {\n if (!usedInRange.has(node) && parent.contains(node)) {\n parent.removeChild(node);\n }\n }\n } else {\n // Keyless fallback: index-based patch\n const commonLength = Math.min(\n oldVNodesInRange.length,\n newChildren.length,\n );\n\n for (let i = 0; i < commonLength; i++) {\n const oldVNode = oldVNodesInRange[i];\n const newVNode = newChildren[i];\n const node = patch(oldNodesInRange[i], oldVNode, newVNode, context);\n if (node !== oldNodesInRange[i]) {\n parent.insertBefore(node, oldNodesInRange[i]);\n parent.removeChild(oldNodesInRange[i]);\n }\n }\n\n // Add extra new\n for (let i = commonLength; i < newChildren.length; i++) {\n parent.insertBefore(createElement(newChildren[i], context), end);\n }\n\n // Remove extra old\n for (let i = commonLength; i < oldNodesInRange.length; i++) {\n parent.removeChild(oldNodesInRange[i]);\n }\n }\n }\n // --- End integrated patchChildrenBetween ---\n\n for (const newVNode of newChildren) {\n let node: Node;\n\n // Handle AnchorBlocks\n if (newVNode.tag === \"#anchor\") {\n const aKey = newVNode.key!;\n const startKey = `${aKey}:start`;\n const endKey = `${aKey}:end`;\n\n let start = oldNodeByKey.get(startKey) as Node;\n let end = oldNodeByKey.get(endKey) as Node;\n const children = Array.isArray(newVNode.children)\n ? newVNode.children\n : [];\n\n // Create boundaries if they don't exist\n if (!start) {\n start = document.createTextNode(\"\");\n (start as any).key = startKey;\n }\n if (!end) {\n end = document.createTextNode(\"\");\n (end as any).key = endKey;\n }\n\n // Preserve anchor references on the new VNode\n (newVNode as AnchorBlockVNode)._startNode = start as Comment;\n (newVNode as AnchorBlockVNode)._endNode = end as Comment;\n\n // If boundaries aren't in DOM, insert the whole fragment\n if (!parent.contains(start) || !parent.contains(end)) {\n parent.insertBefore(start, nextSibling);\n for (const child of children) {\n parent.insertBefore(createElement(child, context), nextSibling);\n }\n parent.insertBefore(end, nextSibling);\n } else {\n // Patch children between existing boundaries\n patchChildrenBetween(\n start as Comment,\n end as Comment,\n (oldVNodeByKey.get(aKey) as VNode)?.children as VNode[] | undefined,\n children,\n );\n }\n\n markRangeUsed(start as Comment, end as Comment);\n nextSibling = end.nextSibling;\n continue;\n }\n\n // Normal keyed element/text\n if (newVNode.key != null && oldNodeByKey.has(newVNode.key)) {\n const oldVNode = oldVNodeByKey.get(newVNode.key)!;\n node = patch(\n oldNodeByKey.get(newVNode.key)!,\n oldVNode,\n newVNode,\n context,\n );\n usedNodes.add(node);\n if (node !== nextSibling && parent.contains(node)) {\n if (nextSibling && !parent.contains(nextSibling)) nextSibling = null;\n parent.insertBefore(node, nextSibling);\n }\n } else {\n node = createElement(newVNode, context);\n if (nextSibling && !parent.contains(nextSibling)) nextSibling = null;\n parent.insertBefore(node, nextSibling);\n usedNodes.add(node);\n }\n\n nextSibling = node.nextSibling;\n }\n\n // Remove unused nodes\n for (const node of oldNodes) {\n if (!usedNodes.has(node) && parent.contains(node)) {\n parent.removeChild(node);\n }\n }\n}\n\n/**\n * Patch a node using keys for node matching.\n */\nfunction patch(\n dom: Node,\n oldVNode: VNode | string | null,\n newVNode: VNode | string | null,\n context?: any,\n): Node {\n if (oldVNode === newVNode) return dom;\n\n if (typeof newVNode === \"string\") {\n if (dom.nodeType === Node.TEXT_NODE) {\n if (dom.textContent !== newVNode) dom.textContent = newVNode;\n return dom;\n } else {\n const textNode = document.createTextNode(newVNode);\n dom.parentNode?.replaceChild(textNode, dom);\n return textNode;\n }\n }\n\n if (newVNode && typeof newVNode !== \"string\" && newVNode.tag === \"#anchor\") {\n const anchorVNode = newVNode as AnchorBlockVNode;\n const children = Array.isArray(anchorVNode.children)\n ? anchorVNode.children\n : [];\n\n const start = anchorVNode._startNode ?? document.createTextNode(\"\");\n const end = anchorVNode._endNode ?? document.createTextNode(\"\");\n\n if (anchorVNode.key != null) {\n (start as any).key = `${anchorVNode.key}:start`;\n (end as any).key = `${anchorVNode.key}:end`;\n }\n\n anchorVNode._startNode = start;\n anchorVNode._endNode = end;\n\n const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n frag.appendChild(createElement(child, context));\n }\n frag.appendChild(end);\n dom.parentNode?.replaceChild(frag, dom);\n return start;\n }\n\n if (!newVNode) {\n const placeholder = document.createComment(\"removed\");\n dom.parentNode?.replaceChild(placeholder, dom);\n return placeholder;\n }\n\n if (!oldVNode || typeof oldVNode === \"string\") {\n const newEl = createElement(newVNode, context);\n dom.parentNode?.replaceChild(newEl, dom);\n return newEl;\n }\n\n if (newVNode.tag === \"#anchor\") {\n const children = Array.isArray(newVNode.children) ? newVNode.children : [];\n const start = (newVNode as any)._startNode ?? document.createTextNode(\"\");\n const end = (newVNode as any)._endNode ?? document.createTextNode(\"\");\n\n if (newVNode.key != null) {\n (start as any).key = `${newVNode.key}:start`;\n (end as any).key = `${newVNode.key}:end`;\n }\n\n (newVNode as any)._startNode = start;\n (newVNode as any)._endNode = end;\n\n const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n frag.appendChild(createElement(child, context));\n }\n frag.appendChild(end);\n dom.parentNode?.replaceChild(frag, dom);\n return start;\n }\n\n if (\n typeof oldVNode !== \"string\" &&\n typeof newVNode !== \"string\" &&\n oldVNode.tag === newVNode.tag &&\n oldVNode.key === newVNode.key\n ) {\n const el = dom as HTMLElement;\n patchProps(el, oldVNode.props || {}, newVNode.props || {}, context);\n patchChildren(el, oldVNode.children, newVNode.children, context);\n return el;\n }\n\n const newEl = createElement(newVNode, context);\n dom.parentNode?.replaceChild(newEl, dom);\n return newEl;\n}\n\n/**\n * Main renderer: uses patching and keys for node reuse.\n * Never uses innerHTML. Only updates what has changed.\n */\nexport function vdomRenderer(\n root: ShadowRoot,\n vnodeOrArray: VNode | VNode[],\n context?: any,\n) {\n const wrap = (v: VNode): VNode =>\n v.key == null ? { ...v, key: \"__root__\" } : v;\n let newVNode = Array.isArray(vnodeOrArray)\n ? { tag: \"div\", key: \"__root__\", children: vnodeOrArray }\n : wrap(vnodeOrArray);\n\n newVNode = assignKeysDeep(newVNode, String(newVNode.key ?? \"root\")) as VNode;\n\n // Track previous VNode and DOM node\n const prevVNode: VNode | null = (root as any)._prevVNode ?? null;\n const prevDom: Node | null =\n (root as any)._prevDom ?? root.firstChild ?? null;\n\n let newDom: Node;\n\n if (prevVNode && prevDom) {\n // Only replace if tag or key changed\n if (\n typeof prevVNode !== \"string\" &&\n typeof newVNode !== \"string\" &&\n prevVNode.tag === newVNode.tag &&\n prevVNode.key === newVNode.key\n ) {\n newDom = patch(prevDom, prevVNode, newVNode, context);\n } else {\n newDom = createElement(newVNode, context);\n root.replaceChild(newDom, prevDom);\n }\n } else {\n newDom = createElement(newVNode, context);\n if (root.firstChild) root.replaceChild(newDom, root.firstChild);\n else root.appendChild(newDom);\n }\n\n // Remove any extra nodes, but preserve style elements\n const nodesToRemove: Node[] = [];\n for (let i = 0; i < root.childNodes.length; i++) {\n const node = root.childNodes[i];\n if (node !== newDom && node.nodeName !== \"STYLE\") {\n nodesToRemove.push(node);\n }\n }\n nodesToRemove.forEach((node) => root.removeChild(node));\n\n // Update tracked VNode and DOM node\n (root as any)._prevVNode = newVNode;\n (root as any)._prevDom = newDom;\n}\n\n/**\n * SSR-friendly: serialize VNode to HTML string.\n */\nfunction escapeHTML(str: string): string {\n return str.replace(\n /[&<>\"']/g,\n (c) =>\n ({\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n })[c]!,\n );\n}\n\nexport function renderToString(vnode: VNode): string {\n if (typeof vnode === \"string\") return escapeHTML(vnode);\n\n if (vnode.tag === \"#text\") {\n return typeof vnode.children === \"string\" ? escapeHTML(vnode.children) : \"\";\n }\n\n if (vnode.tag === \"#anchor\") {\n const children = Array.isArray(vnode.children) ? vnode.children.filter(Boolean) : [];\n return children.map(renderToString).join(\"\");\n }\n\n const props = vnode.props\n ? Object.entries(vnode.props)\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join(\"\")\n : \"\";\n const children = Array.isArray(vnode.children)\n ? vnode.children.filter(Boolean).map(renderToString).join(\"\")\n : (typeof vnode.children === \"string\" ? escapeHTML(vnode.children) : vnode.children ? renderToString(vnode.children) : \"\");\n return `<${vnode.tag}${props}>${children}</${vnode.tag}>`;\n}\n","/**\n * CSS minification utility (basic)\n */\nexport function minifyCSS(css: string): string {\n return css\n // Remove comments\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n // Remove unnecessary whitespace\n .replace(/\\s+/g, ' ')\n // Remove spaces around specific characters\n .replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n // Remove trailing semicolons before closing braces\n .replace(/;}/g, '}')\n // Remove leading/trailing whitespace\n .trim();\n}\n\n/**\n * Minimal Shadow DOM reset\n */\nexport const baseReset = `\n :host {\n box-sizing:border-box;\n line-height:1.5;\n font-family:ui-sans-serif,system-ui,sans-serif;\n -webkit-text-size-adjust:100%;\n text-size-adjust:100%;\n }\n *,::before,::after {\n box-sizing:inherit;\n margin:0;\n padding:0;\n border:0 solid currentColor;\n }\n`;\n\n/**\n * JIT CSS implementation\n */\n\ntype CSSMap = Record<string, string>;\ntype SelectorVariantMap = Record<string, (selector: string, body: string) => string>;\ntype MediaVariantMap = Record<string, string>;\n\nconst colors: Record<string, Record<string, string>> = {\n gray: {\n 50: \"var(--color-gray-50, #f9fafb)\",\n 100: \"var(--color-gray-100, #f3f4f6)\",\n 200: \"var(--color-gray-200, #e5e7eb)\",\n 300: \"var(--color-gray-300, #d1d5db)\",\n 400: \"var(--color-gray-400, #9ca3af)\",\n 500: \"var(--color-gray-500, #6b7280)\",\n 600: \"var(--color-gray-600, #4b5563)\",\n 700: \"var(--color-gray-700, #374151)\",\n 800: \"var(--color-gray-800, #1f2937)\",\n 900: \"var(--color-gray-900, #111827)\",\n },\n slate: {\n 50: \"var(--color-slate-50, #f8fafc)\",\n 100: \"var(--color-slate-100, #f1f5f9)\",\n 200: \"var(--color-slate-200, #e2e8f0)\",\n 300: \"var(--color-slate-300, #cbd5e1)\",\n 400: \"var(--color-slate-400, #94a3b8)\",\n 500: \"var(--color-slate-500, #64748b)\",\n 600: \"var(--color-slate-600, #475569)\",\n 700: \"var(--color-slate-700, #334155)\",\n 800: \"var(--color-slate-800, #1e293b)\",\n 900: \"var(--color-slate-900, #0f172a)\",\n },\n zinc: {\n 50: \"var(--color-zinc-50, #fafafa)\",\n 100: \"var(--color-zinc-100, #f4f4f5)\",\n 200: \"var(--color-zinc-200, #e4e4e7)\",\n 300: \"var(--color-zinc-300, #d4d4d8)\",\n 400: \"var(--color-zinc-400, #a1a1aa)\",\n 500: \"var(--color-zinc-500, #71717a)\",\n 600: \"var(--color-zinc-600, #52525b)\",\n 700: \"var(--color-zinc-700, #3f3f46)\",\n 800: \"var(--color-zinc-800, #27272a)\",\n 900: \"var(--color-zinc-900, #18181b)\",\n },\n red: {\n 50: \"var(--color-red-50, #fef2f2)\",\n 100: \"var(--color-red-100, #fee2e2)\",\n 200: \"var(--color-red-200, #fecaca)\",\n 300: \"var(--color-red-300, #fca5a5)\",\n 400: \"var(--color-red-400, #f87171)\",\n 500: \"var(--color-red-500, #ef4444)\",\n 600: \"var(--color-red-600, #dc2626)\",\n 700: \"var(--color-red-700, #b91c1c)\",\n 800: \"var(--color-red-800, #991b1b)\",\n 900: \"var(--color-red-900, #7f1d1d)\",\n },\n blue: {\n 50: \"var(--color-blue-50, #eff6ff)\",\n 100: \"var(--color-blue-100, #dbeafe)\",\n 200: \"var(--color-blue-200, #bfdbfe)\",\n 300: \"var(--color-blue-300, #93c5fd)\",\n 400: \"var(--color-blue-400, #60a5fa)\",\n 500: \"var(--color-blue-500, #3b82f6)\",\n 600: \"var(--color-blue-600, #2563eb)\",\n 700: \"var(--color-blue-700, #1d4ed8)\",\n 800: \"var(--color-blue-800, #1e40af)\",\n 900: \"var(--color-blue-900, #1e3a8a)\",\n },\n green: {\n 50: \"var(--color-green-50, #f0fdf4)\",\n 100: \"var(--color-green-100, #dcfce7)\",\n 200: \"var(--color-green-200, #bbf7d0)\",\n 300: \"var(--color-green-300, #86efac)\",\n 400: \"var(--color-green-400, #4ade80)\",\n 500: \"var(--color-green-500, #22c55e)\",\n 600: \"var(--color-green-600, #16a34a)\",\n 700: \"var(--color-green-700, #15803d)\",\n 800: \"var(--color-green-800, #166534)\",\n 900: \"var(--color-green-900, #14532d)\",\n },\n amber: {\n 50: \"var(--color-amber-50, #fffbeb)\",\n 100: \"var(--color-amber-100, #fef3c7)\",\n 200: \"var(--color-amber-200, #fde68a)\",\n 300: \"var(--color-amber-300, #fcd34d)\",\n 400: \"var(--color-amber-400, #fbbf24)\",\n 500: \"var(--color-amber-500, #f59e0b)\",\n 600: \"var(--color-amber-600, #d97706)\",\n 700: \"var(--color-amber-700, #b45309)\",\n 800: \"var(--color-amber-800, #92400e)\",\n 900: \"var(--color-amber-900, #78350f)\",\n },\n indigo: {\n 50: \"var(--color-indigo-50, #eef2ff)\",\n 100: \"var(--color-indigo-100, #e0e7ff)\",\n 200: \"var(--color-indigo-200, #c7d2fe)\",\n 300: \"var(--color-indigo-300, #a5b4fc)\",\n 400: \"var(--color-indigo-400, #818cf8)\",\n 500: \"var(--color-indigo-500, #6366f1)\",\n 600: \"var(--color-indigo-600, #4f46e5)\",\n 700: \"var(--color-indigo-700, #4338ca)\",\n 800: \"var(--color-indigo-800, #3730a3)\",\n 900: \"var(--color-indigo-900, #312e81)\",\n },\n emerald: {\n 50: \"var(--color-emerald-50, #ecfdf5)\",\n 100: \"var(--color-emerald-100, #d1fae5)\",\n 200: \"var(--color-emerald-200, #a7f3d0)\",\n 300: \"var(--color-emerald-300, #6ee7b7)\",\n 400: \"var(--color-emerald-400, #34d399)\",\n 500: \"var(--color-emerald-500, #10b981)\",\n 600: \"var(--color-emerald-600, #059669)\",\n 700: \"var(--color-emerald-700, #047857)\",\n 800: \"var(--color-emerald-800, #065f46)\",\n 900: \"var(--color-emerald-900, #064e3b)\",\n },\n rose: {\n 50: \"var(--color-rose-50, #fff1f2)\",\n 100: \"var(--color-rose-100, #ffe4e6)\",\n 200: \"var(--color-rose-200, #fecdd3)\",\n 300: \"var(--color-rose-300, #fda4af)\",\n 400: \"var(--color-rose-400, #fb7185)\",\n 500: \"var(--color-rose-500, #f43f5e)\",\n 600: \"var(--color-rose-600, #e11d48)\",\n 700: \"var(--color-rose-700, #be123c)\",\n 800: \"var(--color-rose-800, #9f1239)\",\n 900: \"var(--color-rose-900, #881337)\",\n },\n white: { DEFAULT: \"var(--color-white, #ffffff)\" },\n black: { DEFAULT: \"var(--color-black, #000000)\" }\n};\n\nconst utilityMap: CSSMap = {\n /* Display */\n block: \"display:block;\",\n inline: \"display:inline;\",\n \"inline-block\": \"display:inline-block;\",\n flex: \"display:flex;\",\n \"inline-flex\": \"display:inline-flex;\",\n grid: \"display:grid;\",\n hidden: \"display:none;\",\n\n /* Accessibility */\n \"sr-only\": \"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0;\",\n \"not-sr-only\": \"position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal;\",\n\n /* Grid Layout */\n \"grid-cols-1\": \"grid-template-columns:repeat(1,minmax(0,1fr));\",\n \"grid-cols-2\": \"grid-template-columns:repeat(2,minmax(0,1fr));\",\n \"grid-cols-3\": \"grid-template-columns:repeat(3,minmax(0,1fr));\",\n \"grid-cols-4\": \"grid-template-columns:repeat(4,minmax(0,1fr));\",\n \"grid-cols-5\": \"grid-template-columns:repeat(5,minmax(0,1fr));\",\n \"grid-cols-6\": \"grid-template-columns:repeat(6,minmax(0,1fr));\",\n \"grid-cols-12\": \"grid-template-columns:repeat(12,minmax(0,1fr));\",\n \"grid-rows-1\": \"grid-template-rows:repeat(1,minmax(0,1fr));\",\n \"grid-rows-2\": \"grid-template-rows:repeat(2,minmax(0,1fr));\",\n \"grid-rows-3\": \"grid-template-rows:repeat(3,minmax(0,1fr));\",\n \"grid-rows-4\": \"grid-template-rows:repeat(4,minmax(0,1fr));\",\n \"grid-rows-6\": \"grid-template-rows:repeat(6,minmax(0,1fr));\",\n \"grid-rows-12\": \"grid-template-rows:repeat(12,minmax(0,1fr));\",\n\n /* Grid Placement */\n \"col-span-1\": \"grid-column:span 1 / span 1;\",\n \"col-span-2\": \"grid-column:span 2 / span 2;\",\n \"col-span-3\": \"grid-column:span 3 / span 3;\",\n \"col-span-4\": \"grid-column:span 4 / span 4;\",\n \"col-span-5\": \"grid-column:span 5 / span 5;\",\n \"col-span-6\": \"grid-column:span 6 / span 6;\",\n \"col-span-12\": \"grid-column:span 12 / span 12;\",\n \"row-span-1\": \"grid-row:span 1 / span 1;\",\n \"row-span-2\": \"grid-row:span 2 / span 2;\",\n \"row-span-3\": \"grid-row:span 3 / span 3;\",\n \"row-span-4\": \"grid-row:span 4 / span 4;\",\n \"row-span-6\": \"grid-row:span 6 / span 6;\",\n \"row-span-12\": \"grid-row:span 12 / span 12;\",\n\n /* Positioning */\n absolute: \"position:absolute;\",\n relative: \"position:relative;\",\n fixed: \"position:fixed;\",\n sticky: \"position:sticky;\",\n\n /* Typography */\n \"font-bold\": \"font-weight:700;\",\n \"font-semibold\": \"font-weight:600;\",\n \"font-medium\": \"font-weight:500;\",\n \"font-light\": \"font-weight:300;\",\n underline: \"text-decoration-line:underline;\",\n overline: \"text-decoration-line:overline;\",\n \"line-through\": \"text-decoration-line:line-through;\",\n \"no-underline\": \"text-decoration-line:none;\",\n italic: \"font-style:italic;\",\n \"not-italic\": \"font-style:normal;\",\n uppercase: \"text-transform:uppercase;\",\n lowercase: \"text-transform:lowercase;\",\n capitalize: \"text-transform:capitalize;\",\n \"normal-case\": \"text-transform:none;\",\n \"text-left\": \"text-align:left;\",\n \"text-center\": \"text-align:center;\",\n \"text-right\": \"text-align:right;\",\n \"text-xs\": \"font-size:0.75rem;line-height:calc(1 / 0.75)\",\n \"text-sm\": \"font-size:0.875rem;line-height:calc(1.25 / 0.875)\",\n \"text-base\": \"font-size:1rem;line-height:calc(1.5 / 1)\",\n \"text-lg\": \"font-size:1.125rem;line-height:calc(1.75 / 1.125)\",\n \"text-xl\": \"font-size:1.25rem;line-height:calc(1.75 / 1.25)\",\n \"text-2xl\": \"font-size:1.5rem;line-height:calc(2 / 1.5)\",\n \"text-3xl\": \"font-size:1.875rem;line-height:calc(2.25 / 1.875)\",\n \"text-4xl\": \"font-size:2.25rem;line-height:calc(2.5 / 2.25)\",\n \"text-5xl\": \"font-size:3rem;line-height:1\",\n \"text-6xl\": \"font-size:3.75rem;line-height:1\",\n \"text-7xl\": \"font-size:4.5rem;line-height:1\",\n \"text-8xl\": \"font-size:6rem;line-height:1\",\n\n /* Borders */\n border: \"border-width:1px;\",\n \"rounded-none\": \"border-radius:0;\",\n \"rounded-xs\": \"border-radius:0.125rem;\",\n \"rounded-sm\": \"border-radius:0.25rem;\",\n \"rounded-md\": \"border-radius:0.375rem;\",\n \"rounded-lg\": \"border-radius:0.5rem;\",\n \"rounded-full\": \"border-radius:9999px;\",\n /* Ring (box-shadow for focus) */\n \"ring-0\": \"box-shadow:none;\",\n \"ring-1\": \"box-shadow:0 0 0 1px rgba(59,130,246,0.5);\",\n \"ring-2\": \"box-shadow:0 0 0 2px rgba(59,130,246,0.5);\",\n \"ring-4\": \"box-shadow:0 0 0 4px rgba(59,130,246,0.5);\",\n \"ring-8\": \"box-shadow:0 0 0 8px rgba(59,130,246,0.5);\",\n\n /* Shadow and effects */\n \"shadow-none\": \"box-shadow:0 0 #0000;\",\n \"shadow-xs\": \"box-shadow:0 1px 2px 0 rgb(0 0 0 / 0.05);\",\n \"shadow-sm\": \"box-shadow:0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\",\n \"shadow-md\": \"box-shadow:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\",\n \"shadow-lg\": \"box-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\",\n \"shadow-xl\": \"box-shadow:0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\",\n \"shadow-2xl\": \"box-shadow:0 25px 50px -12px rgb(0 0 0 / 0.25);\",\n\n /* Transitions */\n transition: \"transition-property:all;transition-duration:150ms;transition-timing-function:cubic-bezier(0.4,0,0.2,1);\",\n\n /* Text Overflow & Whitespace */\n truncate: \"overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\",\n\n /* Visibility */\n \"visible\": \"visibility:visible;\",\n \"invisible\": \"visibility:hidden;\",\n\n /* Flex Grow/Shrink/Basis */\n \"grow\": \"flex-grow:1;\",\n \"shrink\": \"flex-shrink:1;\",\n \"grow-0\": \"flex-grow:0;\",\n \"shrink-0\": \"flex-shrink:0;\",\n\n /* Font Family */\n \"font-sans\": \"font-family:ui-sans-serif,system-ui,sans-serif;\",\n \"font-serif\": \"font-family:ui-serif,Georgia,serif;\",\n \"font-mono\": \"font-family:ui-monospace,SFMono-Regular,monospace;\",\n\n /* Line Clamp (for webkit) */\n \"line-clamp-1\": \"display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;\",\n \"line-clamp-2\": \"display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;\",\n \"line-clamp-3\": \"display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;\",\n \"line-clamp-4\": \"display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;\",\n\n /* Transition Delay/Property */\n \"transition-colors\": \"transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;\",\n \"transition-opacity\": \"transition-property:opacity;\",\n \"transition-transform\": \"transition-property:transform;\",\n};\n\nconst spacing = '0.25rem';\n\nconst spacingProps: Record<string, string[]> = {\n m: [\"margin\"],\n mx: [\"margin-inline\"],\n my: [\"margin-block\"],\n mt: [\"margin-top\"],\n mr: [\"margin-right\"],\n mb: [\"margin-bottom\"],\n ml: [\"margin-left\"],\n p: [\"padding\"],\n px: [\"padding-inline\"],\n py: [\"padding-block\"],\n pt: [\"padding-top\"],\n pr: [\"padding-right\"],\n pb: [\"padding-bottom\"],\n pl: [\"padding-left\"],\n inset: [\"inset\"],\n \"inset-x\": [\"inset-inline\"],\n \"inset-y\": [\"inset-block\"],\n top: [\"top\"],\n bottom: [\"bottom\"],\n left: [\"left\"],\n right: [\"right\"],\n gap: [\"gap\"],\n \"gap-x\": [\"column-gap\"],\n \"gap-y\": [\"row-gap\"]\n};\n\nconst selectorVariants: SelectorVariantMap = {\n // State variants\n before: (sel, body) => `${sel}::before{${body}}`,\n after: (sel, body) => `${sel}::after{${body}}`,\n hover: (sel, body) => `${sel}:hover{${body}}`,\n focus: (sel, body) => `${sel}:focus{${body}}`,\n active: (sel, body) => `${sel}:active{${body}}`,\n disabled: (sel, body) => `${sel}:disabled{${body}}`,\n visited: (sel, body) => `${sel}:visited{${body}}`,\n checked: (sel, body) => `${sel}:checked{${body}}`,\n first: (sel, body) => `${sel}:first-child{${body}}`,\n last: (sel, body) => `${sel}:last-child{${body}}`,\n odd: (sel, body) => `${sel}:nth-child(odd){${body}}`,\n even: (sel, body) => `${sel}:nth-child(even){${body}}`,\n \"focus-within\": (sel, body) => `${sel}:focus-within{${body}}`,\n \"focus-visible\": (sel, body) => `${sel}:focus-visible{${body}}`,\n\n // Group variants\n \"group-hover\": (sel, body) => `.group:hover ${sel}{${body}}`,\n \"group-focus\": (sel, body) => `.group:focus ${sel}{${body}}`,\n \"group-active\": (sel, body) => `.group:active ${sel}{${body}}`,\n \"group-disabled\": (sel, body) => `.group:disabled ${sel}{${body}}`,\n\n // Peer variants\n \"peer-hover\": (sel, body) => `.peer:hover ~ ${sel}{${body}}`,\n \"peer-focus\": (sel, body) => `.peer:focus ~ ${sel}{${body}}`,\n \"peer-checked\": (sel, body) => `.peer:checked ~ ${sel}{${body}}`,\n \"peer-disabled\": (sel, body) => `.peer:disabled ~ ${sel}{${body}}`,\n};\n\nconst mediaVariants: MediaVariantMap = {\n // Responsive\n \"sm\": \"(min-width:640px)\",\n \"md\": \"(min-width:768px)\",\n \"lg\": \"(min-width:1024px)\",\n \"xl\": \"(min-width:1280px)\",\n \"2xl\": \"(min-width:1536px)\",\n\n // Dark mode (now plain string)\n \"dark\": \"(prefers-color-scheme: dark)\"\n};\n\nconst responsiveOrder = [\"sm\", \"md\", \"lg\", \"xl\", \"2xl\"];\n\nfunction parseSpacing(className: string): string | null {\n const negative = className.startsWith(\"-\");\n const raw = negative ? className.slice(1) : className;\n const parts = raw.split(\"-\");\n\n if (parts.length < 2) return null;\n\n const key = parts.slice(0, -1).join(\"-\");\n const numStr = parts[parts.length - 1];\n const num = parseFloat(numStr);\n\n if (Number.isNaN(num) || !spacingProps[key]) return null;\n\n const sign = negative ? \"-\" : \"\";\n return spacingProps[key]\n .map(prop => `${prop}:calc(${sign}${spacing} * ${num});`)\n .join(\"\");\n}\n\nfunction hexToRgb(hex: string): string {\n const clean = hex.replace(\"#\", \"\");\n const bigint = parseInt(clean, 16);\n const r = (bigint >> 16) & 255;\n const g = (bigint >> 8) & 255;\n const b = bigint & 255;\n return `${r} ${g} ${b}`;\n}\n\nfunction parseColorClass(className: string): string | null {\n // Match bg-red-500, text-gray-200, border-blue-600, etc.\n const match = /^(bg|text|border|shadow|outline|caret|accent)-([a-z]+)-?(\\d{2,3}|DEFAULT)?$/.exec(className);\n if (!match) return null;\n\n const [, type, colorName, shade = \"DEFAULT\"] = match;\n const colorValue = colors[colorName]?.[shade];\n if (!colorValue) return null;\n\n const propMap: Record<string, string> = {\n bg: \"background-color\",\n text: \"color\",\n border: \"border-color\",\n shadow: \"box-shadow\",\n outline: \"outline-color\",\n caret: \"caret-color\",\n accent: \"accent-color\",\n };\n\n return `${propMap[type]}:${colorValue};`;\n}\n\nfunction parseOpacityModifier(className: string): { base: string; opacity?: number } {\n const [base, opacityStr] = className.split(\"/\");\n if (!opacityStr) return { base };\n\n const opacity = parseInt(opacityStr, 10);\n if (isNaN(opacity) || opacity < 0 || opacity > 100) return { base };\n\n return { base, opacity: opacity / 100 };\n}\n\nfunction parseColorWithOpacity(className: string): string | null {\n const { base, opacity } = parseOpacityModifier(className);\n\n // Try palette first\n const paletteRule = parseColorClass(base); // e.g., \"background-color:#ef4444;\"\n if (paletteRule) {\n if (opacity !== undefined) {\n const match = /#([0-9a-f]{6})/i.exec(paletteRule);\n if (match) {\n const rgb = hexToRgb(match[0]);\n return paletteRule.replace(/#([0-9a-f]{6})/i, `rgb(${rgb} / ${opacity})`);\n }\n }\n return paletteRule;\n }\n\n // Try arbitrary color: [bg:#ff0000]/50\n const arbitraryRule = parseArbitrary(base);\n if (arbitraryRule && opacity !== undefined) {\n const match = /#([0-9a-f]{6})/i.exec(arbitraryRule);\n if (match) {\n const rgb = hexToRgb(match[0]);\n return arbitraryRule.replace(/#([0-9a-f]{6})/i, `rgb(${rgb} / ${opacity})`);\n }\n }\n\n return arbitraryRule;\n}\n\n/**\n * Arbitrary value parser — supports:\n * - prop-[value]\n */\nfunction parseArbitrary(className: string): string | null {\n // prop-[value] syntax\n const bracketStart = className.indexOf(\"-[\");\n const bracketEnd = className.endsWith(\"]\");\n if (bracketStart > 0 && bracketEnd) {\n const prop = className.slice(0, bracketStart);\n let value = className.slice(bracketStart + 2, -1);\n\n // Convert underscores to spaces for valid CSS\n value = value.replace(/_/g, \" \");\n\n // Map common abbreviations to CSS properties\n const propMap: Record<string, string> = {\n bg: \"background-color\",\n text: \"color\",\n p: \"padding\",\n px: \"padding-inline\",\n py: \"padding-block\",\n m: \"margin\",\n mx: \"margin-inline\",\n my: \"margin-block\",\n w: \"width\",\n h: \"height\",\n \"min-w\": \"min-width\",\n \"max-w\": \"max-width\",\n \"min-h\": \"min-height\",\n \"max-h\": \"max-height\",\n \"border-t\": \"border-top\",\n \"border-b\": \"border-bottom\",\n \"border-l\": \"border-left\",\n \"border-r\": \"border-right\",\n \"border-x\": \"border-inline\",\n \"border-y\": \"border-block\",\n shadow: \"box-shadow\",\n \"duration\": \"transition-duration\",\n \"list\": \"list-style\",\n \"break\": \"word-break\",\n \"flex\": \"flex-direction\",\n \"items\": \"align-items\",\n \"justify\": \"justify-content\",\n \"whitespace\": \"white-space\",\n \"select\": \"user-select\",\n \"content\": \"align-content\",\n \"self\": \"align-self\",\n \"basis\": \"flex-basis\",\n \"tracking\": \"letter-spacing\",\n \"scroll\": \"scroll-behavior\",\n \"delay\": \"transition-delay\",\n \"weight\": \"font-weight\",\n \"leading\": \"line-height\",\n z: \"z-index\"\n };\n\n const cssProp = propMap[prop] ?? prop.replace(/_/g, \"-\");\n if (cssProp && value) return `${cssProp}:${value};`;\n }\n\n return null;\n}\n\nfunction escapeClassName(name: string): string {\n // Escape only selector-relevant characters, not brackets\n return name.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\n}\n\nfunction extractClassesFromHTML(html: string): string[] {\n const classAttrRegex = /class\\s*=\\s*[\"']([^\"']+)[\"']/g;\n const classList: string[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = classAttrRegex.exec(html))) {\n // Split on spaces not inside brackets\n let buffer = '';\n let inBracket = false;\n for (const char of match[1]) {\n if (char === '[') inBracket = true;\n if (char === ']') inBracket = false;\n if (char === ' ' && !inBracket) {\n if (buffer) classList.push(buffer);\n buffer = '';\n } else buffer += char;\n }\n if (buffer) classList.push(buffer);\n }\n return classList.filter(Boolean);\n}\n\n/**\n * JIT CSS generation with throttling and memoization.\n * Only regenerates CSS if HTML changes and enough time has passed.\n * Caches results for repeated HTML inputs.\n */\nconst jitCssCache = new Map<string, { css: string; timestamp: number }>();\nconst JIT_CSS_THROTTLE_MS = 16; // 60fps\n\nexport function jitCSS(html: string): string {\n const now = Date.now();\n const cached = jitCssCache.get(html);\n\n // Use cached CSS if within throttle window\n if (cached && now - cached.timestamp < JIT_CSS_THROTTLE_MS) return cached.css;\n\n // ...existing JIT CSS logic...\n const classes = extractClassesFromHTML(html);\n const seen = new Set(classes);\n\n const bucket1: string[] = [];\n const bucket2: string[] = [];\n const bucket3: string[] = [];\n const bucket4: string[] = [];\n const ruleCache: Record<string, string | null> = {};\n\n function generateRuleCached(cls: string, stripDark = false): string | null {\n const cacheKey = (stripDark ? \"dark|\" : \"\") + cls;\n if (cacheKey in ruleCache) return ruleCache[cacheKey];\n const result = generateRule(cls, stripDark);\n ruleCache[cacheKey] = result;\n return result;\n }\n\n function classify(before: string[]): number {\n const hasResponsive = before.some(t => responsiveOrder.includes(t));\n const hasDark = before.includes(\"dark\");\n if (before.length === 0) return 1;\n if (!hasResponsive && !hasDark) return 2;\n if (hasResponsive && !hasDark) return 3;\n return 4;\n }\n\n function generateRule(cls: string, stripDark = false): string | null {\n const parts = cls.split(\":\");\n const basePart = parts.find(\n p => utilityMap[p] || parseSpacing(p) || parseColorWithOpacity(p) || parseArbitrary(p)\n );\n if (!basePart) return null;\n\n const baseRule =\n utilityMap[basePart] ??\n parseSpacing(basePart) ??\n parseColorWithOpacity(basePart) ??\n parseArbitrary(basePart);\n\n if (!baseRule) return null;\n\n let selector = `.${escapeClassName(cls)}`;\n let body = baseRule;\n\n const baseIndex = parts.indexOf(basePart);\n let before = baseIndex >= 0 ? parts.slice(0, baseIndex) : [];\n\n if (stripDark) before = before.filter(t => t !== \"dark\");\n\n const responsiveTokens = before.filter(t => responsiveOrder.includes(t));\n const lastResponsive = responsiveTokens.length\n ? responsiveTokens[responsiveTokens.length - 1]\n : null;\n\n for (const token of before) {\n if (responsiveOrder.includes(token)) continue;\n const variantFn = selectorVariants[token];\n if (typeof variantFn === \"function\") {\n selector = variantFn(selector, body).replace(/\\{.*$/, \"\");\n }\n }\n\n let rule = `${selector}{${body}}`;\n\n if (stripDark && lastResponsive) {\n const responsiveQuery = mediaVariants[lastResponsive] as string;\n rule = `@media (prefers-color-scheme: dark) and ${responsiveQuery}{${rule}}`;\n } else if (stripDark) {\n rule = `@media (prefers-color-scheme: dark){${rule}}`;\n } else if (lastResponsive) {\n const responsiveQuery = mediaVariants[lastResponsive] as string;\n rule = `@media ${responsiveQuery}{${rule}}`;\n }\n\n return rule;\n }\n\n for (const cls of seen) {\n const parts = cls.split(\":\");\n const basePart = parts.find(\n p => utilityMap[p] || parseSpacing(p) || parseColorWithOpacity(p) || parseArbitrary(p)\n );\n if (!basePart) continue;\n const baseIndex = parts.indexOf(basePart);\n const before = baseIndex >= 0 ? parts.slice(0, baseIndex) : [];\n const bucketNum = classify(before);\n\n if (bucketNum === 4) {\n const rule = generateRuleCached(cls, true);\n if (rule) bucket4.push(rule);\n } else {\n const rule = generateRuleCached(cls);\n if (rule) {\n if (bucketNum === 1) bucket1.push(rule);\n else if (bucketNum === 2) bucket2.push(rule);\n else if (bucketNum === 3) bucket3.push(rule);\n }\n }\n }\n\n const css = [...bucket1, ...bucket2, ...bucket3, ...bucket4].join(\"\");\n jitCssCache.set(html, { css, timestamp: now });\n return css;\n}","/**\n * runtime.ts\n * Lightweight, strongly typed, functional custom element runtime for two-way binding, event, and prop support.\n * Supports: state, computed, props, style, render, lifecycle hooks, #model-* and data-on-* attributes.\n * No external dependencies. Mobile-first, secure, and developer friendly.\n */\n\nexport { createStore } from \"./store\";\nexport { eventBus } from \"./event-bus\";\nexport { html } from \"./template-compiler\";\nexport { when, each, match } from \"./directives\";\n\nimport { vdomRenderer, type VNode } from \"./vdom\";\nimport {\n minifyCSS,\n baseReset,\n jitCSS\n} from \"./style-utils\";\n\n// --- Types ---\ntype LifecycleKeys =\n | \"onConnected\"\n | \"onDisconnected\"\n | \"onAttributeChanged\"\n | \"onError\"\n | \"errorFallback\";\n\n// Watch types\ninterface WatchOptions {\n immediate?: boolean;\n deep?: boolean;\n}\n\ntype WatchCallback<T = any, S = any> = (\n newValue: T,\n oldValue: T,\n context?: S,\n) => void;\n\ninterface WatcherState {\n callback: WatchCallback;\n options: WatchOptions;\n oldValue: any;\n}\n\ntype WatchConfig<S> =\n | {\n [K in keyof S]?:\n | WatchCallback<S[K]>\n | [WatchCallback<S[K]>, WatchOptions?];\n }\n | Record<string, WatchCallback | [WatchCallback, WatchOptions?]>;\n\ntype InferMethods<T> = {\n [K in keyof T as K extends LifecycleKeys ? never : K]: T[K] extends Function\n ? T[K]\n : never;\n};\n\nexport type ComponentContext<\n S extends object,\n C extends object,\n P extends object,\n T extends object = any\n> = S & C & P & InferMethods<T>;\n\nexport interface ComponentConfig<\n S extends object,\n C extends object = {},\n P extends object = {},\n T extends object = any,\n> {\n state?: S;\n computed?: { [K in keyof C]: (context: ComponentContext<S, C, P, T>) => C[K] };\n props?: Record<\n string,\n {\n type: StringConstructor | NumberConstructor | BooleanConstructor;\n default?: string | number | boolean;\n }\n >;\n watch?: WatchConfig<ComponentContext<S, C, P, T>>;\n style?: string | ((context: ComponentContext<S, C, P, T>) => string);\n minifyCSS?: boolean;\n render: (context: ComponentContext<S, C, P, T>) => VNode | VNode[] | Promise<VNode | VNode[]>;\n loadingTemplate?: (context: ComponentContext<S, C, P, T>) => VNode | VNode[];\n errorTemplate?: (\n error: Error,\n context: ComponentContext<S, C, P, T>,\n ) => VNode | VNode[];\n onConnected?: (\n context: ComponentContext<S, C, P, T>,\n ) => void;\n onDisconnected?: (\n context: ComponentContext<S, C, P, T>,\n ) => void;\n onAttributeChanged?: (\n name: string,\n oldValue: string | null,\n newValue: string | null,\n context: ComponentContext<S, C, P, T>,\n ) => void;\n onError?: (\n error: Error | null,\n context: ComponentContext<S, C, P, T>,\n ) => void;\n errorFallback?: (\n error: Error | null,\n context: ComponentContext<S, C, P, T>,\n ) => string;\n [key: string]: any;\n}\n\n// --- Internal registry ---\nconst registry = new Map<string, ComponentConfig<any, any, any>>();\n\n// --- Utility functions ---\nfunction toKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction escapeHTML(str: string | number | boolean): string | number | boolean {\n if (typeof str === \"string\") {\n return str.replace(\n /[&<>\"']/g,\n (c) =>\n ({\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n })[c]!,\n );\n }\n return str;\n}\n\nfunction sanitizeCSS(css: string): string {\n // Remove any url(javascript:...) and <script> tags\n return css\n .replace(/url\\s*\\(\\s*['\"]?javascript:[^)]*\\)/gi, \"\")\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/expression\\s*\\([^)]*\\)/gi, \"\");\n}\n\n/**\n * CSS template literal\n *\n * This doesn't sanitize CSS values.\n * Runtime does that for us.\n * \n * @param strings\n * @param values\n * @returns\n */\nexport function css(strings: TemplateStringsArray, ...values: unknown[]): string {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) result += values[i];\n }\n return result;\n}\n\n// ######################################\n// ######################################\n// ######################################\n\n// --- Hot Module Replacement (HMR) ---\nif (\n typeof import.meta !== 'undefined' &&\n (import.meta as any).hot &&\n import.meta && import.meta.hot\n) {\n import.meta.hot.accept((newModule) => {\n // Update registry with new configs from the hot module\n if (newModule && newModule.registry) {\n for (const [tag, newConfig] of newModule.registry.entries()) {\n registry.set(tag, newConfig);\n // Update all instances to use new config\n if (typeof document !== \"undefined\") {\n document.querySelectorAll(tag).forEach((el) => {\n if (typeof (el as any)._cfg !== \"undefined\") {\n (el as any)._cfg = newConfig;\n }\n if (typeof (el as any)._render === \"function\") {\n (el as any)._render(newConfig);\n }\n });\n }\n }\n }\n });\n}\n\n// --- Main component registration ---\nexport function component<\n S extends object = {},\n C extends object = {},\n P extends object = {},\n T extends object = any,\n>(\n tag: string,\n renderOrConfig: ((context: ComponentContext<S, C, P, T>) => any) | ComponentConfig<S, C, P, T>,\n config?: Partial<ComponentConfig<S, C, P, T>>\n): void {\n let normalizedTag = toKebab(tag);\n if (!normalizedTag.includes(\"-\")) {\n normalizedTag = `cer-${normalizedTag}`;\n }\n\n let finalConfig: ComponentConfig<S, C, P, T>;\n if (typeof renderOrConfig === \"function\") {\n finalConfig = { ...config, render: renderOrConfig } as ComponentConfig<S, C, P, T>;\n } else {\n finalConfig = renderOrConfig;\n }\n\n // Provide a default onError handler if not defined\n if (typeof finalConfig.onError !== \"function\") {\n finalConfig.onError = (error, state) => {\n // Lightweight, developer-friendly default\n console.error(`[${normalizedTag}] Error:`, error, state);\n };\n }\n\n registry.set(normalizedTag, finalConfig);\n if (typeof window !== \"undefined\" && !customElements.get(normalizedTag)) {\n customElements.define(normalizedTag, createElementClass<S, C, P, T>(finalConfig) as CustomElementConstructor);\n }\n}\n\n// --- Element class factory ---\nexport function createElementClass<\n S extends object,\n C extends object,\n P extends object,\n T extends object = any,\n>(config: ComponentConfig<S, C, P, T>): CustomElementConstructor | { new (): object } {\n // Validate that render is provided\n if (!config.render) {\n throw new Error(\n \"Component must have a render function\",\n );\n }\n if (typeof window === \"undefined\") {\n // SSR fallback: minimal class, no DOM, no lifecycle, no \"this\"\n return class { constructor() {} };\n }\n return class extends HTMLElement {\n public context: ComponentContext<S, C, P, T>;\n\n private _listeners: Array<() => void> = [];\n private _watchers: Map<string, WatcherState> = new Map();\n /** @internal */\n private _renderTimeoutId: number | null = null;\n private _mounted = false;\n private _hasError = false;\n private _initializing = true;\n\n private _styleSheet: CSSStyleSheet | null = null;\n\n private _lastHtmlStringForJitCSS = \"\";\n\n private _cfg: ComponentConfig<S, C, P, T>;\n private _lastRenderTime = 0;\n private _renderCount = 0;\n private _templateLoading = false;\n private _templateError: Error | null = null;\n\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n this._cfg = config;\n\n this.context = this._initContext(config);\n\n // --- Inject config methods into state ---\n Object.keys(config).forEach((key) => {\n const fn = (config as any)[key];\n if (typeof fn === \"function\" && !key.startsWith(\"on\")) {\n // Wrap the function so it receives state as the first argument\n (this.context as any)[key] = (...args: any[]) =>\n fn(...args, this.context);\n }\n });\n\n this._applyProps(config);\n this._applyComputed(config);\n this._initializing = false;\n\n // Initialize watchers after initialization phase is complete\n this._initWatchers(config);\n\n // Initial render (styles are applied within render)\n this._render(config);\n }\n\n connectedCallback() {\n this._runLogicWithinErrorBoundary(config, () => {\n if (config.onConnected && !this._mounted) {\n config.onConnected(this.context);\n this._mounted = true;\n }\n });\n }\n\n disconnectedCallback() {\n this._runLogicWithinErrorBoundary(config, () => {\n if (config.onDisconnected)\n config.onDisconnected(this.context);\n this._listeners.forEach((unsub) => unsub());\n this._listeners = [];\n this._watchers.clear();\n\n // Clean up async template state\n this._templateLoading = false;\n this._templateError = null;\n\n this._mounted = false;\n });\n }\n\n attributeChangedCallback(\n name: string,\n oldValue: string | null,\n newValue: string | null,\n ) {\n this._runLogicWithinErrorBoundary(config, () => {\n this._applyProps(config);\n if (config.onAttributeChanged) {\n config.onAttributeChanged(\n name,\n oldValue,\n newValue,\n this.context,\n );\n }\n });\n }\n\n static get observedAttributes() {\n return config.props ? Object.keys(config.props).map(toKebab) : [];\n }\n\n private _applyComputed(cfg: ComponentConfig<S, C, P>) {\n this._runLogicWithinErrorBoundary(config, () => {\n if (!cfg.computed) return;\n Object.entries(cfg.computed).forEach(([key, fn]) => {\n Object.defineProperty(this.context, key, {\n get: () => {\n const val = (fn as (context: ComponentContext<S, C, P, T>) => any)(this.context);\n return escapeHTML(val);\n },\n enumerable: true,\n });\n });\n });\n }\n\n // --- Render ---\n private _render(cfg: ComponentConfig<S, C, P>) {\n this._runLogicWithinErrorBoundary(cfg, () => {\n if (!this.shadowRoot) return;\n\n // If loading, show loading template\n if (this._templateLoading && cfg.loadingTemplate) {\n this._renderOutput(cfg.loadingTemplate(this.context));\n return;\n }\n\n // If error, show error template\n if (this._templateError && cfg.errorTemplate) {\n this._renderOutput(cfg.errorTemplate(this._templateError, this.context));\n return;\n }\n\n // Call render function\n const outputOrPromise = cfg.render(this.context);\n\n if (outputOrPromise instanceof Promise) {\n this._templateLoading = true;\n outputOrPromise\n .then((output) => {\n this._templateLoading = false;\n this._templateError = null;\n this._renderOutput(output);\n return output;\n })\n .catch((error) => {\n this._templateLoading = false;\n this._templateError = error;\n if (cfg.errorTemplate) {\n const fallback = cfg.errorTemplate(error, this.context);\n this._renderOutput(fallback);\n return fallback;\n }\n throw error;\n });\n\n if (cfg.loadingTemplate)\n this._renderOutput(cfg.loadingTemplate(this.context));\n return;\n }\n\n // this._templateCache = outputOrPromise;\n this._renderOutput(outputOrPromise);\n this._applyStyle(cfg);\n });\n }\n\n // --- Helper to render output ---\n private _renderOutput(output: VNode | VNode[]) {\n if (!this.shadowRoot) return;\n\n // Create context with state and render method for directive processing\n const context = new Proxy(this.context, {\n get: (target, prop) => {\n if (prop === \"_requestRender\") {\n return () => this._requestRender();\n }\n if (prop === \"context\") {\n return target;\n }\n // Handle nested property access for #model directives\n if (typeof prop === \"string\" && prop.includes(\".\")) {\n return prop.split(\".\").reduce((obj: any, key) => obj?.[key], target as any);\n }\n return target[prop as keyof typeof target];\n },\n set: (target, prop, value) => {\n // Handle nested property assignment for #model directives\n if (typeof prop === \"string\" && prop.includes(\".\")) {\n const keys = prop.split(\".\");\n const lastKey = keys.pop();\n if (!lastKey) return false;\n\n const nestedTarget = keys.reduce((obj, key) => {\n if (!(key in obj)) {\n (obj as any)[key] = {};\n }\n return (obj as any)[key];\n }, target as any);\n\n (nestedTarget as any)[lastKey] = value;\n return true;\n }\n (target as any)[prop] = value;\n return true;\n },\n });\n\n vdomRenderer(\n this.shadowRoot,\n Array.isArray(output) ? output : [output],\n context,\n );\n\n // Extract rendered HTML for JIT CSS\n this._lastHtmlStringForJitCSS = this.shadowRoot.innerHTML;\n }\n\n _requestRender() {\n // Debounced render request to avoid excessive re-renders\n if (this._renderTimeoutId !== null) {\n clearTimeout(this._renderTimeoutId);\n }\n\n // Prevent infinite render loops\n const now = Date.now();\n if (now - this._lastRenderTime < 16) {\n // Less than 16ms since last render\n this._renderCount++;\n if (this._renderCount > 10) {\n console.warn(\n `[${this.tagName}] Potential infinite render loop detected. Skipping render.`,\n );\n this._renderTimeoutId = null;\n return;\n }\n } else {\n this._renderCount = 0;\n }\n\n this._renderTimeoutId = setTimeout(() => {\n this._lastRenderTime = Date.now();\n this._render(this._cfg);\n this._renderTimeoutId = null;\n }, 0);\n }\n\n // --- Style ---\n private _applyStyle(cfg: ComponentConfig<S, C, P, T>) {\n this._runLogicWithinErrorBoundary(cfg, () => {\n if (!this.shadowRoot) return;\n\n // Generate JIT CSS from latest HTML\n const jitCss = jitCSS(this._lastHtmlStringForJitCSS);\n\n if (!cfg.style && (!jitCss || jitCss.trim() === \"\")) {\n this._styleSheet = null;\n return;\n }\n\n // Compose final style: baseReset + jitCss + user style\n let userStyle = \"\";\n if (cfg.style) {\n if (typeof cfg.style === \"string\") userStyle = cfg.style;\n else if (typeof cfg.style === \"function\") userStyle = cfg.style(this.context);\n }\n\n let finalStyle = sanitizeCSS(`${baseReset}\\n${userStyle}\\n${jitCss}\\n`);\n if (cfg.minifyCSS) finalStyle = minifyCSS(finalStyle);\n\n // Use adoptedStyleSheets\n if (!this._styleSheet) {\n this._styleSheet = new CSSStyleSheet();\n }\n this._styleSheet.replaceSync(finalStyle);\n this.shadowRoot.adoptedStyleSheets = [this._styleSheet];\n });\n }\n\n // --- Error Boundary function ---\n private _runLogicWithinErrorBoundary(\n cfg: ComponentConfig<S, C, P>,\n fn: () => void,\n ) {\n if (this._hasError) this._hasError = false;\n try {\n fn();\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) {\n cfg.onError(error as Error | null, this.context);\n }\n if (cfg.errorFallback) {\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(\n error as Error | null,\n this.context,\n );\n }\n }\n }\n }\n\n // --- State, props, computed ---\n private _initContext(cfg: ComponentConfig<S, C, P>): ComponentContext<S, C, P, T> {\n try {\n const self = this;\n function createReactive(obj: any, path = \"\"): any {\n if (Array.isArray(obj)) {\n // Create a proxy that intercepts array mutations\n return new Proxy(obj, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Intercept array mutating methods\n if (typeof value === \"function\" && typeof prop === \"string\") {\n const mutatingMethods = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n ];\n if (mutatingMethods.includes(prop)) {\n return function (...args: any[]) {\n const result = value.apply(target, args);\n\n if (!self._initializing) {\n const fullPath = path || \"root\";\n self._triggerWatchers(fullPath, target);\n self._render(cfg);\n }\n\n return result;\n };\n }\n }\n\n return value;\n },\n set(target, prop, value) {\n target[prop as any] = value;\n if (!self._initializing) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n self._triggerWatchers(fullPath, value);\n self._render(cfg);\n }\n return true;\n },\n deleteProperty(target, prop) {\n delete target[prop as any];\n if (!self._initializing) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n self._triggerWatchers(fullPath, undefined);\n self._render(cfg);\n }\n return true;\n },\n });\n }\n if (obj && typeof obj === \"object\") {\n Object.keys(obj).forEach((key) => {\n const newPath = path ? `${path}.${key}` : key;\n obj[key] = createReactive(obj[key], newPath);\n });\n return new Proxy(obj, {\n set(target, prop, value) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n target[prop as any] = createReactive(value, fullPath);\n if (!self._initializing) {\n self._triggerWatchers(\n fullPath,\n target[prop as any]\n );\n self._render(cfg);\n }\n return true;\n },\n get(target, prop, receiver) {\n return Reflect.get(target, prop, receiver);\n },\n });\n }\n return obj;\n }\n return createReactive({ ...cfg.state }) as ComponentContext<S, C, P, T>;\n } catch (error) {\n return {} as ComponentContext<S, C, P, T>;\n }\n }\n\n private _initWatchers(cfg: ComponentConfig<S, C, P>): void {\n if (!cfg.watch) return;\n\n for (const [key, watchConfig] of Object.entries(cfg.watch)) {\n let callback: WatchCallback;\n let options: WatchOptions = {};\n\n if (Array.isArray(watchConfig)) {\n callback = watchConfig[0];\n options = watchConfig[1] || {};\n } else {\n callback = watchConfig;\n }\n\n this._watchers.set(key, {\n callback,\n options,\n oldValue: this._getNestedValue(key),\n });\n\n // Execute immediately if requested\n if (options.immediate) {\n try {\n const currentValue = this._getNestedValue(key);\n callback(currentValue, undefined, this.context);\n } catch (error) {\n console.error(`Error in immediate watcher for \"${key}\":`, error);\n }\n }\n }\n }\n\n private _getNestedValue(path: string): any {\n return path.split(\".\").reduce(\n (obj: any, key: string) => obj?.[key],\n this.context as any,\n );\n }\n\n private _triggerWatchers(path: string, newValue: any): void {\n const isEqual = (a: any, b: any): boolean => {\n // Simple deep equality check\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (typeof a !== \"object\" || a === null || b === null) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => isEqual(val, b[i]));\n }\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every(key => isEqual(a[key], b[key]));\n };\n\n // Exact path watcher\n const watcher = this._watchers.get(path);\n if (watcher && !isEqual(newValue, watcher.oldValue)) {\n try {\n watcher.callback(newValue, watcher.oldValue, this.context);\n watcher.oldValue = newValue;\n } catch (error) {\n console.error(`Error in watcher for \"${path}\":`, error);\n }\n }\n\n // Deep watchers for parent paths\n for (const [watchPath, watcherConfig] of this._watchers.entries()) {\n if (watcherConfig.options.deep && path.startsWith(watchPath + \".\")) {\n try {\n const currentValue = this._getNestedValue(watchPath);\n if (!isEqual(currentValue, watcherConfig.oldValue)) {\n watcherConfig.callback(currentValue, watcherConfig.oldValue, this.context);\n watcherConfig.oldValue = currentValue;\n }\n } catch (error) {\n console.error(`Error in deep watcher for \"${watchPath}\":`, error);\n }\n }\n }\n }\n\n private _applyProps(cfg: ComponentConfig<S, C, P>): void {\n try {\n if (!cfg.props) return;\n function parseProp(val: string, type: any) {\n if (type === Boolean) return val === \"true\";\n if (type === Number) return Number(val);\n return val;\n }\n Object.entries(cfg.props).forEach(([key, def]) => {\n const attr = this.getAttribute(toKebab(key));\n if (attr !== null) {\n (this.context as any)[key] = escapeHTML(\n parseProp(attr, def.type),\n );\n } else if ('default' in def && def.default !== undefined) {\n (this.context as any)[key] = escapeHTML(def.default);\n }\n // else: leave undefined if no default\n });\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) {\n cfg.onError(error as Error | null, this.context);\n }\n if (cfg.errorFallback) {\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(\n error as Error | null,\n this.context,\n );\n }\n }\n }\n }\n };\n}\n"],"names":["createStore","initial","state","target","prop","value","notify","listeners","subscribe","listener","getState","fn","GlobalEventBus","eventName","data","now","counter","eventHandlers","handler","error","options","resolve","unsubscribe","stats","eventBus","h","tag","props","children","key","finalKey","isAnchorBlock","v","isElementVNode","ensureKey","k","parseProps","str","values","context","attrs","directives","attrRegex","match","prefix","rawName","rawVal","interpMatch","onName","directiveName","modifierParts","modifiers","finalValue","finalModifiers","commonModifiers","valueParts","actualValue","valueModifiers","i","htmlImpl","strings","textVNode","text","template","tagRegex","stack","root","currentChildren","currentTag","currentProps","currentKey","nodeIndex","fragmentChildren","mergeIntoCurrentProps","maybe","existingStyle","newStyle","existingClasses","newClasses","allClasses","pushInterpolation","val","baseKey","targetChildren","anchorKey","anchorChildren","tagName","isClosing","isSelfClosing","rawProps","rawAttrs","vnodeProps","directive","visible","classValue","classNames","cls","className","condition","existingClass","styleValue","styleString","styleRules","property","kebabProperty","needsPx","cssValue","remainingDirectives","node","prev","idx","parts","part","interp","child","cleanedFragments","html","last","when","cond","anchorBlock","each","list","render","item","itemKey","branches","content","whenChain","childArray","getNestedValue","obj","path","current","setNestedValue","keys","lastKey","processModelDirective","el","hasLazy","hasTrim","hasNumber","getCurrentValue","actualState","currentValue","inputType","attrInputType","checkboxValue","shouldBeChecked","trueValue","radioValue","selectEl","currentArray","option","shouldBeSelected","stringValue","eventType","eventListener","event","freshCurrentValue","newValue","index","falseValue","numValue","currentStateValue","element","compositionStartListener","compositionEndListener","processBindDirective","bindings","processShowDirective","isVisible","currentStyle","displayStyle","displayIndex","rule","processClassDirective","classes","processStyleDirective","processDirectives","vnodeAttrs","assignKeysDeep","nodeOrNodes","usedKeys","tagPart","idPart","uniqueKey","patchProps","oldProps","newProps","newDirectives","processedDirectives","mergedProps","mergedAttrs","oldPropProps","newPropProps","oldVal","newVal","oldAttrs","newAttrs","createElement","vnode","textNode","anchorVNode","start","end","frag","patchChildren","parent","oldChildren","newChildren","oldNodes","oldVNodes","oldVNodeByKey","oldNodeByKey","usedNodes","nextSibling","markRangeUsed","cur","patchChildrenBetween","oldNodesInRange","oldVNodesInRange","c","oldVNodeByKeyRange","oldNodeByKeyRange","usedInRange","next","newVNode","oldVNode","patch","commonLength","aKey","startKey","endKey","dom","placeholder","newEl","vdomRenderer","vnodeOrArray","wrap","prevVNode","prevDom","newDom","nodesToRemove","minifyCSS","css","baseReset","colors","utilityMap","spacing","spacingProps","selectorVariants","sel","body","mediaVariants","responsiveOrder","parseSpacing","negative","numStr","num","sign","hexToRgb","hex","clean","bigint","r","g","b","parseColorClass","type","colorName","shade","colorValue","parseOpacityModifier","base","opacityStr","opacity","parseColorWithOpacity","paletteRule","rgb","arbitraryRule","parseArbitrary","bracketStart","bracketEnd","cssProp","escapeClassName","name","extractClassesFromHTML","classAttrRegex","classList","buffer","inBracket","char","jitCssCache","JIT_CSS_THROTTLE_MS","jitCSS","cached","seen","bucket1","bucket2","bucket3","bucket4","ruleCache","generateRuleCached","stripDark","cacheKey","result","generateRule","classify","before","hasResponsive","t","hasDark","basePart","p","baseRule","selector","baseIndex","responsiveTokens","lastResponsive","token","variantFn","bucketNum","registry","toKebab","escapeHTML","sanitizeCSS","component","renderOrConfig","config","normalizedTag","finalConfig","createElementClass","args","unsub","oldValue","cfg","outputOrPromise","output","fallback","nestedTarget","jitCss","userStyle","finalStyle","createReactive","receiver","self","fullPath","newPath","watchConfig","callback","isEqual","a","keysA","keysB","watcher","watchPath","watcherConfig","parseProp","def","attr"],"mappings":"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"}
|