@jasonshimmy/custom-elements-runtime 0.0.14 → 0.0.16

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.
@@ -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 \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\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 \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\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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"}
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 \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\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// --- Shared baseReset stylesheet ---\nlet baseResetSheet: CSSStyleSheet | null = null;\nexport function getBaseResetSheet(): CSSStyleSheet {\n if (!baseResetSheet) {\n baseResetSheet = new CSSStyleSheet();\n baseResetSheet.replaceSync(minifyCSS(baseReset));\n }\n return baseResetSheet;\n}\n\nexport function 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/**\n * Minimal Shadow DOM reset\n */\nexport const baseReset = `\n :host, *, ::before, ::after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: currentColor;\n }\n :host {\n font-size: 16px;\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 color: inherit;\n background-color: transparent;\n }\n *, ::before, ::after {\n -webkit-tap-highlight-color: transparent;\n margin: 0;\n padding: 0;\n font: inherit;\n vertical-align: baseline;\n background: transparent;\n color: inherit;\n }\n button, input, optgroup, select, textarea {\n font: inherit;\n color: inherit;\n background: transparent;\n border: none;\n outline: none;\n margin: 0;\n padding: 0;\n }\n textarea {\n resize: vertical;\n }\n progress {\n vertical-align: baseline;\n }\n button, textarea {\n overflow: visible;\n }\n input[type=\"search\"]::-webkit-search-decoration,\n input[type=\"search\"]::-webkit-search-cancel-button,\n input[type=\"search\"]::-webkit-search-results-button,\n input[type=\"search\"]::-webkit-search-results-decoration {\n -webkit-appearance: none;\n }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n max-width: 100%;\n height: auto;\n vertical-align: middle;\n }\n select {\n text-transform: none;\n }\n optgroup {\n font-weight: bold;\n }\n fieldset {\n border: none;\n }\n svg {\n fill: currentColor;\n stroke: none;\n }\n a {\n color: inherit;\n text-decoration: inherit;\n }\n a, button {\n cursor: pointer;\n }\n input[type=\"file\"] {\n border: 0;\n }\n button, [type=\"button\"], [type=\"reset\"], [type=\"submit\"] {\n appearance: button;\n background-color: transparent;\n background-image: none;\n }\n [type='button'], [type='reset'], [type='submit'] {\n -webkit-user-select: none;\n user-select: none;\n }\n ::-webkit-input-placeholder { color: inherit; opacity: 0.5; }\n ::placeholder { color: inherit; opacity: 0.5; }\n *:focus {\n outline: 2px solid #3b82f6;\n outline-offset: 2px;\n }\n ol, ul {\n list-style: none;\n }\n table {\n border-collapse: collapse;\n border-spacing: 0;\n }\n strong {\n font-weight: bolder;\n }\n sub, sup {\n font-size: 0.75em;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n sub {\n bottom: -0.25em;\n }\n sup {\n top: -0.5em;\n }\n [disabled] {\n cursor: not-allowed;\n }\n [hidden] {\n display: none;\n }\n [aria-disabled=\"true\"] {\n cursor: not-allowed;\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\": \"border-radius:0.25rem;\",\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\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 \"items-center\": \"align-items:center;\",\n \"items-start\": \"align-items:flex-start;\",\n \"items-end\": \"align-items:flex-end;\",\n \"items-baseline\": \"align-items:baseline;\",\n \"items-stretch\": \"align-items:stretch;\",\n \"justify-center\": \"justify-content:center;\",\n \"justify-start\": \"justify-content:flex-start;\",\n \"justify-end\": \"justify-content:flex-end;\",\n \"flex-col\": \"flex-direction:column;\",\n \"flex-row\": \"flex-direction:row;\",\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 getBaseResetSheet,\n sanitizeCSS,\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 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 \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n })[c]!,\n );\n }\n return str;\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 this.shadowRoot.adoptedStyleSheets = [getBaseResetSheet()];\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(`${userStyle}\\n${jitCss}\\n`);\n finalStyle = minifyCSS(finalStyle);\n\n // Use adoptedStyleSheets\n if (!this._styleSheet) {\n this._styleSheet = new CSSStyleSheet();\n }\n if (this._styleSheet.cssRules.length === 0 || this._styleSheet.toString() !== finalStyle) {\n this._styleSheet.replaceSync(finalStyle);\n }\n // Adopt both baseReset and component stylesheet\n this.shadowRoot.adoptedStyleSheets = [getBaseResetSheet(), 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","baseResetSheet","getBaseResetSheet","baseReset","sanitizeCSS","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","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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"}