@jasonshimmy/custom-elements-runtime 0.1.6 → 0.1.8

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.cjs.js","sources":["../src/lib/directives.ts","../src/lib/event-bus.ts","../src/lib/store.ts","../src/lib/runtime/helpers.ts","../src/lib/runtime/watchers.ts","../src/lib/runtime/props.ts","../src/lib/runtime/lifecycle.ts","../src/lib/runtime/vdom.ts","../src/lib/runtime/style.ts","../src/lib/runtime/render.ts","../src/lib/runtime/component.ts","../src/lib/runtime/template-compiler.ts","../src/lib/router.ts"],"sourcesContent":["import type { VNode } from \"./runtime/types\";\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/**\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 * 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 * 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","type Listener<T> = (state: T) => void;\n\nexport interface Store<T extends object> {\n subscribe(listener: Listener<T>): void;\n getState(): T;\n setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;\n}\n\nexport function createStore<T extends object>(initial: T): Store<T> {\n let state = { ...initial } as T; // no Proxy needed if we update via setState\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // initial push\n }\n\n function getState(): T {\n return state;\n }\n\n function setState(partial: Partial<T> | ((prev: T) => Partial<T>)) {\n const next = typeof partial === 'function'\n ? partial(state)\n : partial;\n\n state = { ...state, ...next };\n notify();\n }\n\n function notify() {\n listeners.forEach(fn => fn(state));\n }\n\n return { subscribe, getState, setState };\n}\n","export function toKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nexport function 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","import type { ComponentContext, WatchCallback, WatchOptions, WatcherState } from \"./types\";\n\n/**\n * Initializes watchers for a component.\n */\nexport function initWatchers(\n context: ComponentContext<any, any, any, any>,\n watchers: Map<string, WatcherState>,\n watchConfig: Record<string, WatchCallback | [WatchCallback, WatchOptions]>\n): void {\n if (!watchConfig) return;\n\n for (const [key, config] of Object.entries(watchConfig)) {\n let callback: WatchCallback;\n let options: WatchOptions = {};\n\n if (Array.isArray(config)) {\n callback = config[0];\n options = config[1] || {};\n } else {\n callback = config;\n }\n\n watchers.set(key, {\n callback,\n options,\n oldValue: getNestedValue(context, key),\n });\n\n if (options.immediate) {\n try {\n const currentValue = getNestedValue(context, key);\n callback(currentValue, undefined, context);\n } catch (error) {\n console.error(`Error in immediate watcher for \"${key}\":`, error);\n }\n }\n }\n}\n\n/**\n * Gets a nested value from context by path.\n */\nexport function getNestedValue(context: any, path: string): any {\n return path.split(\".\").reduce((obj: any, key: string) => obj?.[key], context);\n}\n\n/**\n * Triggers watchers when state changes.\n */\nexport function triggerWatchers(\n context: ComponentContext<any, any, any, any>,\n watchers: Map<string, WatcherState>,\n path: string,\n newValue: any\n): void {\n const isEqual = (a: any, b: any): boolean => {\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 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 const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every(key => isEqual(a[key], b[key]));\n };\n\n const watcher = watchers.get(path);\n if (watcher && !isEqual(newValue, watcher.oldValue)) {\n try {\n watcher.callback(newValue, watcher.oldValue, context);\n watcher.oldValue = newValue;\n } catch (error) {\n console.error(`Error in watcher for \"${path}\":`, error);\n }\n }\n\n for (const [watchPath, watcherConfig] of watchers.entries()) {\n if (watcherConfig.options.deep && path.startsWith(watchPath + \".\")) {\n try {\n const currentValue = getNestedValue(context, watchPath);\n if (!isEqual(currentValue, watcherConfig.oldValue)) {\n watcherConfig.callback(currentValue, watcherConfig.oldValue, context);\n watcherConfig.oldValue = currentValue;\n }\n } catch (error) {\n console.error(`Error in deep watcher for \"${watchPath}\":`, error);\n }\n }\n }\n}\n","import { toKebab, escapeHTML } from \"./helpers\";\nimport type { ComponentConfig, ComponentContext } from \"./types\";\n\n/**\n * Applies props to the component context.\n * @param element - The custom element instance.\n * @param cfg - The component config.\n * @param context - The component context.\n */\nexport function applyProps<S extends object, C extends object, P extends object, T extends object>(\n element: HTMLElement,\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>\n): void {\n if (!cfg.props) return;\n\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\n Object.entries(cfg.props).forEach(([key, def]) => {\n // Prefer function prop on the element instance\n if (def.type === Function && typeof (element as any)[key] === \"function\") {\n (context as any)[key] = (element as any)[key];\n } else {\n const attr = element.getAttribute(toKebab(key));\n if (attr !== null) {\n (context as any)[key] = escapeHTML(parseProp(attr, def.type));\n } else if (\"default\" in def && def.default !== undefined) {\n (context as any)[key] = escapeHTML(def.default);\n }\n // else: leave undefined if no default\n }\n });\n}\n","import type { ComponentConfig, ComponentContext } from \"./types\";\n\n/**\n * Handles the connected lifecycle hook.\n */\nexport function handleConnected<S extends object, C extends object, P extends object, T extends object>(\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n isMounted: boolean,\n setMounted: (val: boolean) => void\n): void {\n if (cfg.onConnected && !isMounted) {\n cfg.onConnected(context);\n setMounted(true);\n }\n}\n\n/**\n * Handles the disconnected lifecycle hook.\n */\nexport function handleDisconnected<S extends object, C extends object, P extends object, T extends object>(\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n listeners: Array<() => void>,\n clearListeners: () => void,\n clearWatchers: () => void,\n setTemplateLoading: (val: boolean) => void,\n setTemplateError: (err: Error | null) => void,\n setMounted: (val: boolean) => void\n): void {\n if (cfg.onDisconnected) cfg.onDisconnected(context);\n listeners.forEach(unsub => unsub());\n clearListeners();\n clearWatchers();\n setTemplateLoading(false);\n setTemplateError(null);\n setMounted(false);\n}\n\n/**\n * Handles the attribute changed lifecycle hook.\n */\nexport function handleAttributeChanged<S extends object, C extends object, P extends object, T extends object>(\n cfg: ComponentConfig<S, C, P, T>,\n name: string,\n oldValue: string | null,\n newValue: string | null,\n context: ComponentContext<S, C, P, T>\n): void {\n if (cfg.onAttributeChanged) {\n cfg.onAttributeChanged(name, oldValue, newValue, context);\n }\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\nimport type { VNode, VDomRefs, AnchorBlockVNode } from \"./types\";\nimport { escapeHTML } from \"./helpers\";\n\n/**\n * Recursively clean up refs for all descendants of a node\n */\nexport function cleanupRefs(node: Node, refs?: VDomRefs) {\n if (!refs) return;\n if (node instanceof HTMLElement) {\n for (const refKey in refs) {\n if (refs[refKey] === node) {\n delete refs[refKey];\n }\n }\n // Clean up child nodes\n for (const child of Array.from(node.childNodes)) {\n cleanupRefs(child, refs);\n }\n }\n}\n\n/**\n * Get nested property value from object using dot notation\n */\nexport function 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 */\nexport function 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\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n/**\n * Process #model directive for two-way data binding\n */\nexport function 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 */\nexport function 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 */\nexport function 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 */\nexport function 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\nexport function 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 */\nexport function 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\nexport function 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 */\nexport function 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\nexport function createElement(\n vnode: VNode | string,\n context?: any,\n refs?: VDomRefs\n): 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 // Assign ref if present (support both props.ref and props.props.ref)\n const refKey = vnode.props?.ref ?? (vnode.props?.props && vnode.props.props.ref);\n if (typeof vnode !== \"string\" && refKey && refs) {\n refs[refKey] = el as HTMLElement;\n }\n\n // Append children\n if (Array.isArray(vnode.children)) {\n for (const child of vnode.children) {\n el.appendChild(createElement(child, context, refs));\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 */\nexport function patchChildren(\n parent: HTMLElement,\n oldChildren: VNode[] | string | undefined,\n newChildren: VNode[] | string | undefined,\n context?: any,\n refs?: VDomRefs\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 refs\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, refs);\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 cleanupRefs(node, refs);\n parent.removeChild(node);\n }\n }\n}\n\n/**\n * Patch a node using keys for node matching.\n */\nexport function patch(\n dom: Node,\n oldVNode: VNode | string | null,\n newVNode: VNode | string | null,\n context?: any,\n refs?: VDomRefs\n): Node {\n if (oldVNode && typeof oldVNode !== \"string\" && oldVNode.props?.ref && refs) {\n cleanupRefs(dom, refs); // Clean up old ref and descendants\n }\n\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 cleanupRefs(dom, refs);\n const placeholder = document.createComment(\"removed\");\n dom.parentNode?.replaceChild(placeholder, dom);\n return placeholder;\n }\n\n if (!oldVNode || typeof oldVNode === \"string\") {\n cleanupRefs(dom, refs);\n const newEl = createElement(newVNode, context, refs);\n if (typeof newVNode !== \"string\" && newVNode.props?.ref && refs) {\n refs[newVNode.props.ref] = newEl as HTMLElement; // Assign new ref\n }\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, refs); // <-- Pass refs\n if (typeof newVNode !== \"string\" && newVNode.props?.ref && refs) {\n refs[newVNode.props.ref] = el; // Assign ref\n }\n return el;\n }\n\n cleanupRefs(dom, refs);\n const newEl = createElement(newVNode, context, refs);\n if (typeof newVNode !== \"string\" && newVNode.props?.ref && refs) {\n refs[newVNode.props.ref] = newEl as HTMLElement;\n }\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 refs?: VDomRefs\n) {\n let newVNode: VNode;\n if (Array.isArray(vnodeOrArray)) {\n if (vnodeOrArray.length === 1) {\n newVNode = vnodeOrArray[0];\n if (newVNode && typeof newVNode === \"object\" && newVNode.key == null) {\n newVNode = { ...newVNode, key: \"__root__\" };\n }\n } else {\n newVNode = { tag: \"div\", key: \"__root__\", children: vnodeOrArray };\n }\n } else {\n newVNode = vnodeOrArray;\n if (newVNode && typeof newVNode === \"object\" && newVNode.key == null) {\n newVNode = { ...newVNode, key: \"__root__\" };\n }\n }\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, refs);\n } else {\n newDom = createElement(newVNode, context, refs);\n root.replaceChild(newDom, prevDom);\n }\n } else {\n newDom = createElement(newVNode, context, refs);\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 cleanupRefs(node, refs);\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\nexport function renderToString(vnode: VNode): string {\n if (typeof vnode === \"string\") return escapeHTML(vnode) as string;\n\n if (vnode.tag === \"#text\") {\n return typeof vnode.children === \"string\" ? escapeHTML(vnode.children) as string : \"\";\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 // Collect attributes from props.attrs\n let attrsString = \"\";\n if (vnode.props && vnode.props.attrs) {\n attrsString = Object.entries(vnode.props.attrs)\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join(\"\");\n }\n\n // Collect other props (excluding attrs, directives, ref, key)\n let propsString = \"\";\n if (vnode.props) {\n propsString = Object.entries(vnode.props)\n .filter(([k]) => k !== \"attrs\" && k !== \"directives\" && k !== \"ref\" && k !== \"key\")\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join(\"\");\n }\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\n return `<${vnode.tag}${attrsString}${propsString}>${children}</${vnode.tag}>`;\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 * 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 = css`\n :host, *, ::before, ::after {\n all: isolate;\n box-sizing: border-box;\n border: 0 solid currentColor;\n margin: 0;\n padding: 0;\n font: inherit;\n vertical-align: baseline;\n background: transparent;\n color: inherit;\n -webkit-tap-highlight-color: transparent;\n }\n :host {\n display: contents;\n font: 16px/1.5 ui-sans-serif, system-ui, sans-serif;\n -webkit-text-size-adjust: 100%;\n text-size-adjust: 100%;\n }\n button, input, select, textarea {\n background: transparent;\n outline: none;\n }\n textarea { resize: vertical }\n progress { vertical-align: baseline }\n button, textarea { overflow: visible }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n max-width: 100%;\n height: auto;\n }\n svg { fill: currentColor; stroke: none }\n a { text-decoration: inherit; cursor: pointer }\n button, [type=button], [type=reset], [type=submit] {\n cursor: pointer;\n appearance: button;\n background: none;\n -webkit-user-select: none;\n user-select: none;\n }\n ::-webkit-input-placeholder, ::placeholder {\n color: inherit; opacity: .5;\n }\n *:focus {\n outline: 2px solid var(--color-blue-500, #3b82f6);\n outline-offset: 2px;\n }\n ol, ul { list-style: none }\n table { border-collapse: collapse }\n sub, sup {\n font-size: .75em;\n line-height: 0;\n position: relative;\n }\n sub { bottom: -.25em }\n sup { top: -.5em }\n [disabled], [aria-disabled=true] { cursor: not-allowed }\n [hidden] { display: none }\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\nexport const 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 neutral: {\n 50: \"var(--color-neutral-50, #fafafa)\",\n 100: \"var(--color-neutral-100, #f5f5f5)\",\n 200: \"var(--color-neutral-200, #e5e5e5)\",\n 300: \"var(--color-neutral-300, #d4d4d4)\",\n 400: \"var(--color-neutral-400, #a3a3a3)\",\n 500: \"var(--color-neutral-500, #737373)\",\n 600: \"var(--color-neutral-600, #525252)\",\n 700: \"var(--color-neutral-700, #404040)\",\n 800: \"var(--color-neutral-800, #262626)\",\n 900: \"var(--color-neutral-900, #171717)\",\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\nexport const 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 /* Sizing & Spacing */\n \"w-full\": \"width:100%;\",\n \"w-screen\": \"width:100dvw;\",\n \"h-full\": \"height:100%;\",\n \"h-screen\": \"height:100dvw;\",\n \"max-w-full\": \"max-width:100%;\",\n \"max-h-full\": \"max-height:100%;\",\n \"min-w-0\": \"min-width:0;\",\n \"min-h-0\": \"min-height:0;\",\n \"m-auto\": \"margin:auto;\",\n \"mx-auto\": \"margin-inline:auto;\",\n \"my-auto\": \"margin-block:auto;\",\n\n /* Overflow */\n \"overflow-auto\": \"overflow:auto;\",\n \"overflow-hidden\": \"overflow:hidden;\",\n \"overflow-visible\": \"overflow:visible;\",\n \"overflow-scroll\": \"overflow:scroll;\",\n\n /* Pointer Events */\n \"pointer-events-none\": \"pointer-events:none;\",\n \"pointer-events-auto\": \"pointer-events:auto;\",\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-between\": \"justify-content:space-between;\",\n \"justify-around\": \"justify-content:space-around;\",\n \"justify-evenly\": \"justify-content:space-evenly;\",\n \"justify-end\": \"justify-content:flex-end;\",\n \"flex-wrap\": \"flex-wrap:wrap;\",\n \"flex-nowrap\": \"flex-wrap:nowrap;\",\n \"flex-wrap-reverse\": \"flex-wrap:wrap-reverse;\",\n \"content-center\": \"align-content:center;\",\n \"content-start\": \"align-content:flex-start;\",\n \"content-end\": \"align-content:flex-end;\",\n \"content-between\": \"align-content:space-between;\",\n \"content-around\": \"align-content:space-around;\",\n \"content-stretch\": \"align-content:stretch;\",\n \"self-auto\": \"align-self:auto;\",\n \"self-start\": \"align-self:flex-start;\",\n \"self-end\": \"align-self:flex-end;\",\n \"self-center\": \"align-self:center;\",\n \"self-stretch\": \"align-self:stretch;\",\n \"flex-1\": \"flex:1 1 0%;\",\n \"flex-auto\": \"flex:1 1 auto;\",\n \"flex-initial\": \"flex:0 1 auto;\",\n \"flex-none\": \"flex:0 0 auto;\",\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\nexport const spacing = \"var(--spacing, 0.25rem)\";\n\nexport const 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 h: [\"height\"],\n w: [\"width\"],\n \"min-h\": [\"min-height\"],\n \"min-w\": [\"min-width\"],\n \"max-h\": [\"max-height\"],\n \"max-w\": [\"max-width\"],\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\nexport const 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\nexport const 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\nexport const responsiveOrder = [\"sm\", \"md\", \"lg\", \"xl\", \"2xl\"];\n\nexport function 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\nexport function 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\nexport function 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\nexport function 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\nexport function 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 */\nexport function 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\nexport function escapeClassName(name: string): string {\n // Escape only selector-relevant characters, not brackets\n return name.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\n}\n\nexport function 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 */\nexport const jitCssCache = new Map<string, { css: string; timestamp: number }>();\nexport const 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","import { vdomRenderer } from \"./vdom\";\nimport { minifyCSS, getBaseResetSheet, sanitizeCSS, jitCSS } from \"./style\";\nimport type { ComponentConfig, ComponentContext, VNode, Refs } from \"./types\";\n\n/**\n * Renders the component output.\n */\nexport function renderComponent<S extends object, C extends object, P extends object, T extends object>(\n shadowRoot: ShadowRoot | null,\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n refs: Refs[\"refs\"],\n setHtmlString: (html: string) => void,\n setLoading: (val: boolean) => void,\n setError: (err: Error | null) => void,\n applyStyle: (html: string) => void\n): void {\n if (!shadowRoot) return;\n\n if (cfg.loadingTemplate && context.isLoading) {\n renderOutput(shadowRoot, cfg.loadingTemplate(context), context, refs, setHtmlString);\n return;\n }\n\n if (cfg.errorTemplate && context.hasError) {\n if (context.error instanceof Error) {\n renderOutput(shadowRoot, cfg.errorTemplate(context.error, context), context, refs, setHtmlString);\n }\n return;\n }\n\n const outputOrPromise = cfg.render(context);\n\n if (outputOrPromise instanceof Promise) {\n setLoading(true);\n outputOrPromise\n .then((output) => {\n setLoading(false);\n setError(null);\n renderOutput(shadowRoot, output, context, refs, setHtmlString);\n applyStyle(shadowRoot.innerHTML);\n })\n .catch((error) => {\n setLoading(false);\n setError(error);\n if (cfg.errorTemplate)\n renderOutput(shadowRoot, cfg.errorTemplate(error, context), context, refs, setHtmlString);\n });\n\n if (cfg.loadingTemplate)\n renderOutput(shadowRoot, cfg.loadingTemplate(context), context, refs, setHtmlString);\n return;\n }\n\n renderOutput(shadowRoot, outputOrPromise, context, refs, setHtmlString);\n applyStyle(shadowRoot.innerHTML);\n}\n\n/**\n * Renders VNode(s) to the shadowRoot.\n */\nexport function renderOutput<S extends object, C extends object, P extends object, T extends object>(\n shadowRoot: ShadowRoot | null,\n output: VNode | VNode[],\n context: ComponentContext<S, C, P, T>,\n refs: Refs[\"refs\"],\n setHtmlString: (html: string) => void\n): void {\n if (!shadowRoot) return;\n vdomRenderer(\n shadowRoot,\n Array.isArray(output) ? output : [output],\n context,\n refs\n );\n setHtmlString(shadowRoot.innerHTML);\n}\n\n/**\n * Debounced render request.\n */\nexport function requestRender(\n renderFn: () => void,\n lastRenderTime: number,\n renderCount: number,\n setLastRenderTime: (t: number) => void,\n setRenderCount: (c: number) => void,\n renderTimeoutId: ReturnType<typeof setTimeout> | null,\n setRenderTimeoutId: (id: ReturnType<typeof setTimeout> | null) => void\n): void {\n if (renderTimeoutId !== null) clearTimeout(renderTimeoutId);\n\n const now = Date.now();\n if (now - lastRenderTime < 16) {\n setRenderCount(renderCount + 1);\n if (renderCount > 10) {\n console.warn(\"Potential infinite render loop detected. Skipping render.\");\n setRenderTimeoutId(null);\n return;\n }\n } else {\n setRenderCount(0);\n }\n\n const timeoutId = setTimeout(() => {\n setLastRenderTime(Date.now());\n renderFn();\n setRenderTimeoutId(null);\n }, 0);\n setRenderTimeoutId(timeoutId);\n}\n\n/**\n * Applies styles to the shadowRoot.\n */\nexport function applyStyle<S extends object, C extends object, P extends object, T extends object>(\n shadowRoot: ShadowRoot | null,\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n htmlString: string,\n styleSheet: CSSStyleSheet | null,\n setStyleSheet: (sheet: CSSStyleSheet | null) => void\n): void {\n if (!shadowRoot) return;\n\n const jitCss = jitCSS(htmlString);\n\n if (!cfg.style && (!jitCss || jitCss.trim() === \"\")) {\n setStyleSheet(null);\n shadowRoot.adoptedStyleSheets = [getBaseResetSheet()];\n return;\n }\n\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(context);\n }\n\n let finalStyle = sanitizeCSS(`${userStyle}\\n${jitCss}\\n`);\n finalStyle = minifyCSS(finalStyle);\n\n let sheet = styleSheet;\n if (!sheet) sheet = new CSSStyleSheet();\n if (sheet.cssRules.length === 0 || sheet.toString() !== finalStyle) {\n sheet.replaceSync(finalStyle);\n }\n shadowRoot.adoptedStyleSheets = [getBaseResetSheet(), sheet];\n setStyleSheet(sheet);\n}","import type {\n ComponentConfig,\n ComponentContext,\n Refs,\n WatchCallback,\n WatchOptions,\n WatcherState,\n} from \"./types\";\nimport { toKebab, escapeHTML } from \"./helpers\";\nimport { initWatchers, triggerWatchers } from \"./watchers\";\nimport { applyProps } from \"./props\";\nimport {\n handleConnected,\n handleDisconnected,\n handleAttributeChanged\n} from \"./lifecycle\";\nimport { renderComponent, requestRender, applyStyle } from \"./render\";\n\n// --- Internal registry ---\nconst registry = new Map<string, ComponentConfig<any, any, any>>();\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\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\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 private _refs: Refs[\"refs\"] = {};\n private _listeners: Array<() => void> = [];\n private _watchers: Map<string, WatcherState> = new Map();\n /** @internal */\n private _renderTimeoutId: ReturnType<typeof setTimeout> | 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 /**\n * Returns the last rendered HTML string for JIT CSS.\n */\n public get lastHtmlStringForJitCSS(): string {\n return this._lastHtmlStringForJitCSS;\n }\n\n /**\n * Returns true if the component is currently loading.\n */\n public get isLoading(): boolean {\n return this._templateLoading;\n }\n\n /**\n * Returns the last error thrown during rendering, or null if none.\n */\n public get lastError(): Error | null {\n return this._templateError;\n }\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 const reactiveContext = this._initContext(config);\n\n // Inject refs into context (non-enumerable to avoid proxy traps)\n Object.defineProperty(reactiveContext, \"refs\", {\n value: this._refs,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n // Inject requestRender into context (non-enumerable to avoid proxy traps)\n Object.defineProperty(reactiveContext, 'requestRender', {\n value: () => this.requestRender(),\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n // --- Apply props BEFORE wiring listeners and emit ---\n this.context = reactiveContext;\n this._applyProps(config);\n\n // Inject emit helper for custom events\n Object.defineProperty(this.context, \"emit\", {\n value: (eventName: string, detail?: any, options?: CustomEventInit) => {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n ...(options || {})\n })\n );\n // Always check for handler on element property, context, and config\n const handlerName = `on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;\n // 1. Handler set as property on the element\n const propHandler = typeof (this as any)[handlerName] === \"function\"\n ? (this as any)[handlerName]\n : undefined;\n // 2. Handler set in context (from props)\n const contextHandler = typeof (this.context as any)[handlerName] === \"function\"\n ? (this.context as any)[handlerName]\n : undefined;\n // 3. Handler set in config\n const configHandler = typeof (config as any)[handlerName] === \"function\"\n ? (config as any)[handlerName]\n : undefined;\n if (propHandler) propHandler(detail, this.context);\n if (contextHandler && contextHandler !== propHandler) contextHandler(detail, this.context);\n if (configHandler && configHandler !== propHandler && configHandler !== contextHandler)\n configHandler(detail, this.context);\n },\n writable: false,\n enumerable: false,\n configurable: false,\n });\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 (this.context as any)[key] = (...args: any[]) =>\n fn(...args, this.context);\n }\n // Listen for custom events\n else if (key.startsWith(\"on\") && key.length > 2 && key[2] === key[2].toUpperCase()) {\n const eventName = key.slice(2, 3).toLowerCase() + key.slice(3);\n this.addEventListener(eventName, (e: Event) => {\n // Always check for handler on element property first\n const fn =\n typeof (this as any)[key] === \"function\"\n ? (this as any)[key]\n : (this.context as any)[key];\n if (typeof fn === \"function\") {\n fn((e as CustomEvent).detail, this.context);\n }\n });\n }\n });\n\n this._applyComputed(config);\n\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 handleConnected(\n config,\n this.context,\n this._mounted,\n (val) => { this._mounted = val; }\n );\n });\n }\n\n disconnectedCallback() {\n this._runLogicWithinErrorBoundary(config, () => {\n handleDisconnected(\n config,\n this.context,\n this._listeners,\n () => { this._listeners = []; },\n () => { this._watchers.clear(); },\n (val) => { this._templateLoading = val; },\n (err) => { this._templateError = err; },\n (val) => { this._mounted = val; }\n );\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 handleAttributeChanged(\n config,\n name,\n oldValue,\n newValue,\n this.context\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 renderComponent(\n this.shadowRoot,\n cfg,\n this.context,\n this._refs,\n (html) => {\n this._lastHtmlStringForJitCSS = html;\n // Optionally, use the latest HTML string for debugging or external logic\n if (typeof (this as any).onHtmlStringUpdate === \"function\") {\n (this as any).onHtmlStringUpdate(html);\n }\n },\n (val) => {\n this._templateLoading = val;\n // Optionally, use loading state for external logic\n if (typeof (this as any).onLoadingStateChange === \"function\") {\n (this as any).onLoadingStateChange(val);\n }\n },\n (err) => {\n this._templateError = err;\n // Optionally, use error state for external logic\n if (typeof (this as any).onErrorStateChange === \"function\") {\n (this as any).onErrorStateChange(err);\n }\n },\n (html) => this._applyStyle(cfg, html)\n );\n });\n }\n\n public requestRender() {\n this._requestRender();\n }\n\n _requestRender() {\n this._runLogicWithinErrorBoundary(this._cfg, () => {\n requestRender(\n () => this._render(this._cfg),\n this._lastRenderTime,\n this._renderCount,\n (t) => { this._lastRenderTime = t; },\n (c) => { this._renderCount = c; },\n this._renderTimeoutId,\n (id) => { this._renderTimeoutId = id; }\n );\n })\n }\n\n // --- Style ---\n private _applyStyle(cfg: ComponentConfig<S, C, P, T>, html: string) {\n this._runLogicWithinErrorBoundary(cfg, () => {\n applyStyle(\n this.shadowRoot,\n cfg,\n this.context,\n html,\n this._styleSheet,\n (sheet) => { this._styleSheet = sheet; }\n );\n })\n }\n\n // --- Error Boundary function ---\n private _runLogicWithinErrorBoundary(\n cfg: ComponentConfig<S, C, P>,\n fn: () => void,\n ) {\n if (this._hasError) this._hasError = false;\n try {\n fn();\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) {\n cfg.onError(error as Error | null, this.context);\n }\n if (cfg.errorFallback) {\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(\n error as Error | null,\n this.context,\n );\n }\n }\n }\n }\n\n // --- State, props, computed ---\n private _initContext(cfg: ComponentConfig<S, C, P>): ComponentContext<S, C, P, T> {\n try {\n const self = this;\n function createReactive(obj: any, path = \"\"): any {\n if (Array.isArray(obj)) {\n // Create a proxy that intercepts array mutations\n return new Proxy(obj, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Intercept array mutating methods\n if (typeof value === \"function\" && typeof prop === \"string\") {\n const mutatingMethods = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n ];\n if (mutatingMethods.includes(prop)) {\n return function (...args: any[]) {\n const result = value.apply(target, args);\n\n if (!self._initializing) {\n const fullPath = path || \"root\";\n self._triggerWatchers(fullPath, target);\n self._render(cfg);\n }\n\n return result;\n };\n }\n }\n\n return value;\n },\n set(target, prop, value) {\n target[prop as any] = value;\n if (!self._initializing) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n 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 this._runLogicWithinErrorBoundary(cfg, () => {\n initWatchers(\n this.context,\n this._watchers,\n (cfg.watch || {}) as Record<string, WatchCallback | [WatchCallback, WatchOptions]>\n );\n })\n }\n\n private _triggerWatchers(path: string, newValue: any): void {\n triggerWatchers(this.context, this._watchers, path, newValue);\n }\n\n private _applyProps(cfg: ComponentConfig<S, C, P>): void {\n this._runLogicWithinErrorBoundary(cfg, () => {\n try {\n applyProps(this, cfg, this.context);\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) cfg.onError(error as Error | null, this.context);\n if (cfg.errorFallback && this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(error as Error | null, this.context);\n }\n }\n })\n }\n }\n}\n","import type { VNode } from \"./types\";\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\nexport function 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\nexport function 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\nexport function ensureKey(v: VNode, k: string): VNode {\n return v.key != null ? v : { ...v, key: k };\n}\n\nexport function 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 if (rawName === \"ref\") {\n props.ref = value;\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 */\nexport function 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","/**\n * Lightweight, scalable router for Custom Elements Runtime\n * - Functional API, zero dependencies, SSR/static site compatible\n * - Integrates with createStore and lib/index.ts\n */\n\nimport type { ComponentContext } from './runtime/types';\nimport { createStore, type Store } from './store';\nimport { component } from './runtime/component';\nimport { html } from './runtime/template-compiler';\nimport { css } from './runtime/style';\nimport { match } from './directives';\n\nexport interface RouteComponent {\n // Can be any renderable type — adjust as needed for your framework\n new (...args: any[]): any; // class components\n // OR functional components\n (...args: any[]): any;\n}\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\nexport type GuardResult = boolean | string | Promise<boolean | string>;\n\nexport interface Route {\n path: string;\n\n /**\n * Statically available component (already imported)\n */\n component?: string;\n\n /**\n * Lazy loader that resolves to something renderable\n */\n load?: () => Promise<{ default: string | HTMLElement | Function }>;\n\n\n /**\n * Runs before matching — return false to cancel,\n * or a string to redirect\n */\n beforeEnter?: (to: RouteState, from: RouteState) => GuardResult;\n\n /**\n * Runs right before navigation commits — can cancel or redirect\n */\n onEnter?: (to: RouteState, from: RouteState) => GuardResult;\n\n /**\n * Runs after navigation completes — cannot cancel\n */\n afterEnter?: (to: RouteState, from: RouteState) => void;\n}\n\nexport interface RouterLinkProps {\n to: string;\n tag: string;\n replace: boolean;\n exact: boolean;\n activeClass: string;\n exactActiveClass: string;\n ariaCurrentValue: string;\n disabled: boolean;\n external: boolean;\n style: string;\n}\n\nexport interface RouterLinkComputed {\n current: RouteState;\n isExactActive: boolean;\n isActive: boolean;\n className: string;\n ariaCurrent: string;\n isButton: boolean;\n disabledAttr: string;\n externalAttr: string;\n}\n\nexport interface RouterConfig {\n routes: Route[];\n base?: string;\n initialUrl?: string; // For SSR: explicitly pass the URL\n}\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\n\nexport const parseQuery = (search: string): Record<string, string> => {\n if (!search) return {};\n if (typeof URLSearchParams === 'undefined') return {};\n return Object.fromEntries(new URLSearchParams(search));\n};\n\nexport const matchRoute = (routes: Route[], path: string): { route: Route | null; params: Record<string, string> } => {\n for (const route of routes) {\n const paramNames: string[] = [];\n const regexPath = route.path.replace(/:[^/]+/g, (m) => {\n paramNames.push(m.slice(1));\n return '([^/]+)';\n });\n const regex = new RegExp(`^${regexPath}$`);\n const match = path.match(regex);\n if (match) {\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n params[name] = match[i + 1];\n });\n return { route, params };\n }\n }\n return { route: null, params: {} };\n};\n\n// Async component loader cache\nconst componentCache: Record<string, any> = {};\n\n/**\n * Loads a route's component, supporting both static and async.\n * @param route Route object\n * @returns Promise resolving to the component\n */\nexport async function resolveRouteComponent(route: Route): Promise<any> {\n if (route.component) return route.component;\n if (route.load) {\n if (componentCache[route.path]) return componentCache[route.path];\n try {\n const mod = await route.load();\n componentCache[route.path] = mod.default;\n return mod.default;\n } catch (err) {\n throw new Error(`Failed to load component for route: ${route.path}`);\n }\n }\n throw new Error(`No component or loader defined for route: ${route.path}`);\n}\n\nexport function useRouter(config: RouterConfig) {\n const { routes, base = '', initialUrl } = config;\n\n let getLocation: () => { path: string; query: Record<string, string> };\n let initial: { path: string; query: Record<string, string> };\n let store: Store<RouteState>;\n let update: (replace?: boolean) => Promise<void>;\n let push: (path: string) => Promise<void>;\n let replaceFn: (path: string) => Promise<void>;\n let back: () => void;\n\n // Run matching route guards/hooks\n const runBeforeEnter = async (to: RouteState, from: RouteState) => {\n const matched = routes.find(r => matchRoute([r], to.path).route !== null);\n if (matched?.beforeEnter) {\n try {\n const result = await matched.beforeEnter(to, from);\n if (typeof result === 'string') {\n // Redirect\n await navigate(result, true);\n return false;\n }\n return result !== false;\n } catch (err) {\n console.error('beforeEnter error', err);\n return false;\n }\n }\n return true;\n };\n\n const runOnEnter = async (to: RouteState, from: RouteState) => {\n const matched = routes.find(r => matchRoute([r], to.path).route !== null);\n if (matched?.onEnter) {\n try {\n const result = await matched.onEnter(to, from);\n if (typeof result === 'string') {\n await navigate(result, true);\n return false;\n }\n return result !== false;\n } catch (err) {\n console.error('onEnter error', err);\n return false;\n }\n }\n return true;\n };\n\n const runAfterEnter = (to: RouteState, from: RouteState) => {\n const matched = routes.find(r => matchRoute([r], to.path).route !== null);\n if (matched?.afterEnter) {\n try {\n matched.afterEnter(to, from);\n } catch (err) {\n console.error('afterEnter error', err);\n }\n }\n };\n\n const navigate = async (path: string, replace = false) => {\n try {\n const loc = {\n path: path.replace(base, '') || '/',\n query: {}\n };\n const match = matchRoute(routes, loc.path);\n if (!match) throw new Error(`No route found for ${loc.path}`);\n\n const from = store.getState();\n const to: RouteState = {\n path: loc.path,\n params: match.params,\n query: loc.query\n };\n\n // beforeEnter guard\n const allowedBefore = await runBeforeEnter(to, from);\n if (!allowedBefore) return;\n\n // onEnter guard (right before commit)\n const allowedOn = await runOnEnter(to, from);\n if (!allowedOn) return;\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n if (replace) {\n window.history.replaceState({}, '', base + path);\n } else {\n window.history.pushState({}, '', base + path);\n }\n }\n\n store.setState(to);\n\n // afterEnter hook (post commit)\n runAfterEnter(to, from);\n\n } catch (err) {\n console.error('Navigation error:', err);\n }\n };\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Browser mode\n getLocation = () => {\n const url = new URL(window.location.href);\n const path = url.pathname.replace(base, '') || '/';\n const query = parseQuery(url.search);\n return { path, query };\n };\n\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = createStore<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n\n update = async (replace = false) => {\n const loc = getLocation();\n await navigate(loc.path, replace);\n };\n\n window.addEventListener('popstate', () => update(true));\n\n push = (path: string) => navigate(path, false);\n replaceFn = (path: string) => navigate(path, true);\n back = () => window.history.back();\n\n } else {\n // SSR mode\n getLocation = () => {\n const url = new URL(initialUrl || '/', 'http://localhost');\n const path = url.pathname.replace(base, '') || '/';\n const query = parseQuery(url.search);\n return { path, query };\n };\n\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = createStore<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n\n update = async () => {};\n push = async () => {};\n replaceFn = async () => {};\n back = () => {};\n }\n\n return {\n store,\n push,\n replace: replaceFn,\n back,\n subscribe: store.subscribe,\n matchRoute: (path: string) => matchRoute(routes, path),\n getCurrent: (): RouteState => store.getState(),\n resolveRouteComponent\n };\n}\n\n\n// SSR/static site support: match route for a given path\nexport function matchRouteSSR(routes: Route[], path: string) {\n return matchRoute(routes, path);\n}\n\n/**\n * Singleton router instance for global access.\n * \n * Define here to prevent circular dependency\n * issue with component.\n */\n\nexport function initRouter(config: RouterConfig) {\n const router = useRouter(config);\n component('router-view', {\n async render() {\n if (!router) return html`<div>Router not initialized.</div>`;\n const current = router.getCurrent();\n const { path } = current;\n const match = router.matchRoute(path);\n if (!match.route) return html`<div>Not found</div>`;\n let componentTag = match.route.component;\n if (match.route.load) {\n const loaded = await match.route.load();\n if (typeof loaded.default === 'string') {\n componentTag = loaded.default;\n }\n }\n if (typeof componentTag === 'string') {\n // Return a VNode directly, not a template string\n return { tag: componentTag, props: {}, children: [] };\n }\n return html`<div>Invalid route component</div>`;\n },\n onConnected(ctx) {\n if (router && typeof router.subscribe === 'function') {\n router.subscribe(() => {\n if (typeof ctx.requestRender === 'function') {\n ctx.requestRender();\n }\n });\n }\n }\n });\n\n component<{}, RouterLinkComputed, RouterLinkProps>('router-link', {\n state: {},\n props: {\n to: { type: String, default: '' },\n tag: { type: String, default: 'a' },\n replace: { type: Boolean, default: false },\n exact: { type: Boolean, default: false },\n activeClass: { type: String, default: 'active' },\n exactActiveClass: { type: String, default: 'exact-active' },\n ariaCurrentValue: { type: String, default: 'page' },\n disabled: { type: Boolean, default: false },\n external: { type: Boolean, default: false },\n style: { type: String, default: css`\n [aria-disabled=\"true\"] {\n pointer-events: none;\n opacity: 0.5;\n }\n ` },\n },\n style: (ctx) => ctx.style,\n render: (ctx) => {\n // Recalculate computed values in render\n const current = router.getCurrent();\n const to = ctx.to;\n const exact = ctx.exact;\n const exactActiveClass = ctx.exactActiveClass;\n const activeClass = ctx.activeClass;\n const ariaCurrentValue = ctx.ariaCurrentValue;\n const tag = ctx.tag;\n const disabled = ctx.disabled;\n const external = ctx.external;\n // Computed\n const isExactActive = current.path === to;\n const isActive = exact\n ? isExactActive\n : current && typeof current.path === 'string'\n ? current.path.startsWith(to)\n : false;\n const className = isExactActive\n ? exactActiveClass\n : isActive\n ? activeClass\n : '';\n const ariaCurrent = isExactActive ? `aria-current=\"${ariaCurrentValue}\"` : '';\n const isButton = tag === 'button';\n const disabledAttr = disabled\n ? isButton\n ? 'disabled aria-disabled=\"true\" tabindex=\"-1\"'\n : 'aria-disabled=\"true\" tabindex=\"-1\"'\n : '';\n const externalAttr = external && (tag === 'a' || !tag)\n ? 'target=\"_blank\" rel=\"noopener noreferrer\"'\n : '';\n return html`\n ${match()\n .when(isButton, html`\n <button\n part=\"button\"\n class=\"${className}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></button>\n `)\n .otherwise(html`\n <a\n part=\"link\"\n href=\"${to}\"\n class=\"${className}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></a>\n `)\n .done()}\n `;\n },\n navigate: (e: MouseEvent, context: ComponentContext<{}, RouterLinkComputed, RouterLinkProps, any>) => {\n const { disabled, external, tag, replace, to } = context.props;\n if (disabled) {\n e.preventDefault();\n return;\n }\n if (external && (tag === 'a' || !tag)) {\n return;\n }\n e.preventDefault();\n if (replace) {\n router.replace(to);\n } else {\n router.push(to);\n }\n }\n });\n return router;\n}"],"names":["when","cond","children","anchorBlock","each","list","render","item","i","itemKey","match","branches","content","whenChain","idx","anchorKey","childArray","GlobalEventBus","eventName","data","now","counter","eventHandlers","handler","error","options","resolve","unsubscribe","stats","eventBus","emit","on","off","once","listen","createStore","initial","state","listeners","subscribe","listener","getState","setState","partial","next","notify","fn","toKebab","str","escapeHTML","c","initWatchers","context","watchers","watchConfig","key","config","callback","getNestedValue","currentValue","path","obj","triggerWatchers","newValue","isEqual","a","b","val","keysA","keysB","watcher","watchPath","watcherConfig","applyProps","element","cfg","parseProp","type","def","attr","handleConnected","isMounted","setMounted","handleDisconnected","clearListeners","clearWatchers","setTemplateLoading","setTemplateError","unsub","handleAttributeChanged","name","oldValue","cleanupRefs","node","refs","refKey","child","current","setNestedValue","value","keys","lastKey","target","processModelDirective","modifiers","props","attrs","el","hasLazy","hasTrim","hasNumber","getCurrentValue","actualState","inputType","attrInputType","checkboxValue","shouldBeChecked","trueValue","radioValue","selectEl","currentArray","option","shouldBeSelected","stringValue","eventType","eventListener","event","freshCurrentValue","index","falseValue","numValue","currentStateValue","compositionStartListener","compositionEndListener","processBindDirective","bindings","processShowDirective","isVisible","currentStyle","displayStyle","styleRules","displayIndex","rule","processClassDirective","classValue","classes","condition","className","existingClasses","allClasses","processStyleDirective","styleValue","styleString","property","kebabProperty","needsPx","cssValue","existingStyle","processDirectives","directives","vnodeAttrs","directiveName","directive","assignKeysDeep","nodeOrNodes","baseKey","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","k","usedNodes","nextSibling","markRangeUsed","cur","patchChildrenBetween","oldNodesInRange","oldVNodesInRange","oldVNodeByKeyRange","oldNodeByKeyRange","v","usedInRange","newVNode","oldVNode","patch","commonLength","aKey","startKey","endKey","dom","placeholder","newEl","vdomRenderer","root","vnodeOrArray","prevVNode","prevDom","newDom","nodesToRemove","css","strings","values","result","minifyCSS","baseResetSheet","getBaseResetSheet","baseReset","sanitizeCSS","colors","utilityMap","spacing","spacingProps","selectorVariants","sel","body","mediaVariants","responsiveOrder","parseSpacing","negative","parts","numStr","num","sign","prop","hexToRgb","hex","clean","bigint","r","g","parseColorClass","colorName","shade","colorValue","parseOpacityModifier","base","opacityStr","opacity","parseColorWithOpacity","paletteRule","rgb","arbitraryRule","parseArbitrary","bracketStart","bracketEnd","cssProp","escapeClassName","extractClassesFromHTML","html","classAttrRegex","classList","buffer","inBracket","char","jitCssCache","JIT_CSS_THROTTLE_MS","jitCSS","cached","seen","bucket1","bucket2","bucket3","bucket4","ruleCache","generateRuleCached","cls","stripDark","cacheKey","generateRule","classify","before","hasResponsive","t","hasDark","basePart","p","baseRule","selector","baseIndex","responsiveTokens","lastResponsive","token","variantFn","bucketNum","renderComponent","shadowRoot","setHtmlString","setLoading","setError","applyStyle","renderOutput","outputOrPromise","output","requestRender","renderFn","lastRenderTime","renderCount","setLastRenderTime","setRenderCount","renderTimeoutId","setRenderTimeoutId","timeoutId","htmlString","styleSheet","setStyleSheet","jitCss","userStyle","finalStyle","sheet","registry","component","tag","renderOrConfig","normalizedTag","finalConfig","createElementClass","reactiveContext","detail","handlerName","propHandler","contextHandler","configHandler","args","e","err","id","createReactive","receiver","self","fullPath","newPath","h","finalKey","isAnchorBlock","isElementVNode","ensureKey","parseProps","attrRegex","prefix","rawName","rawVal","interpMatch","onName","modifierParts","finalValue","finalModifiers","commonModifiers","valueParts","actualValue","valueModifiers","htmlImpl","textVNode","text","template","tagRegex","stack","currentChildren","currentTag","currentProps","currentKey","nodeIndex","fragmentChildren","mergeIntoCurrentProps","maybe","newStyle","newClasses","pushInterpolation","targetChildren","anchorChildren","tagName","isClosing","isSelfClosing","rawProps","rawAttrs","vnodeProps","visible","classNames","existingClass","remainingDirectives","prev","part","interp","cleanedFragments","last","parseQuery","search","matchRoute","routes","route","paramNames","regexPath","m","regex","params","componentCache","resolveRouteComponent","mod","useRouter","initialUrl","getLocation","store","update","push","replaceFn","back","runBeforeEnter","to","from","matched","navigate","runOnEnter","runAfterEnter","replace","loc","url","query","matchRouteSSR","initRouter","router","componentTag","loaded","ctx","exact","exactActiveClass","activeClass","ariaCurrentValue","disabled","external","isExactActive","isActive","ariaCurrent","isButton","disabledAttr","externalAttr"],"mappings":"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"}
1
+ {"version":3,"file":"custom-elements-runtime.cjs.js","sources":["../src/lib/directives.ts","../src/lib/event-bus.ts","../src/lib/store.ts","../src/lib/runtime/helpers.ts","../src/lib/runtime/watchers.ts","../src/lib/runtime/props.ts","../src/lib/runtime/lifecycle.ts","../src/lib/runtime/vdom.ts","../src/lib/runtime/style.ts","../src/lib/runtime/render.ts","../src/lib/runtime/component.ts","../src/lib/runtime/template-compiler.ts","../src/lib/router.ts"],"sourcesContent":["import type { VNode } from \"./runtime/types\";\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/**\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 * 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 * 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","type Listener<T> = (state: T) => void;\n\nexport interface Store<T extends object> {\n subscribe(listener: Listener<T>): void;\n getState(): T;\n setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;\n}\n\nexport function createStore<T extends object>(initial: T): Store<T> {\n let state = { ...initial } as T; // no Proxy needed if we update via setState\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // initial push\n }\n\n function getState(): T {\n return state;\n }\n\n function setState(partial: Partial<T> | ((prev: T) => Partial<T>)) {\n const next = typeof partial === 'function'\n ? partial(state)\n : partial;\n\n state = { ...state, ...next };\n notify();\n }\n\n function notify() {\n listeners.forEach(fn => fn(state));\n }\n\n return { subscribe, getState, setState };\n}\n","export function toKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nexport function 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","import type { ComponentContext, WatchCallback, WatchOptions, WatcherState } from \"./types\";\n\n/**\n * Initializes watchers for a component.\n */\nexport function initWatchers(\n context: ComponentContext<any, any, any, any>,\n watchers: Map<string, WatcherState>,\n watchConfig: Record<string, WatchCallback | [WatchCallback, WatchOptions]>\n): void {\n if (!watchConfig) return;\n\n for (const [key, config] of Object.entries(watchConfig)) {\n let callback: WatchCallback;\n let options: WatchOptions = {};\n\n if (Array.isArray(config)) {\n callback = config[0];\n options = config[1] || {};\n } else {\n callback = config;\n }\n\n watchers.set(key, {\n callback,\n options,\n oldValue: getNestedValue(context, key),\n });\n\n if (options.immediate) {\n try {\n const currentValue = getNestedValue(context, key);\n callback(currentValue, undefined, context);\n } catch (error) {\n console.error(`Error in immediate watcher for \"${key}\":`, error);\n }\n }\n }\n}\n\n/**\n * Gets a nested value from context by path.\n */\nexport function getNestedValue(context: any, path: string): any {\n return path.split(\".\").reduce((obj: any, key: string) => obj?.[key], context);\n}\n\n/**\n * Triggers watchers when state changes.\n */\nexport function triggerWatchers(\n context: ComponentContext<any, any, any, any>,\n watchers: Map<string, WatcherState>,\n path: string,\n newValue: any\n): void {\n const isEqual = (a: any, b: any): boolean => {\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 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 const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n return keysA.every(key => isEqual(a[key], b[key]));\n };\n\n const watcher = watchers.get(path);\n if (watcher && !isEqual(newValue, watcher.oldValue)) {\n try {\n watcher.callback(newValue, watcher.oldValue, context);\n watcher.oldValue = newValue;\n } catch (error) {\n console.error(`Error in watcher for \"${path}\":`, error);\n }\n }\n\n for (const [watchPath, watcherConfig] of watchers.entries()) {\n if (watcherConfig.options.deep && path.startsWith(watchPath + \".\")) {\n try {\n const currentValue = getNestedValue(context, watchPath);\n if (!isEqual(currentValue, watcherConfig.oldValue)) {\n watcherConfig.callback(currentValue, watcherConfig.oldValue, context);\n watcherConfig.oldValue = currentValue;\n }\n } catch (error) {\n console.error(`Error in deep watcher for \"${watchPath}\":`, error);\n }\n }\n }\n}\n","import { toKebab, escapeHTML } from \"./helpers\";\nimport type { ComponentConfig, ComponentContext } from \"./types\";\n\n/**\n * Applies props to the component context.\n * @param element - The custom element instance.\n * @param cfg - The component config.\n * @param context - The component context.\n */\nexport function applyProps<S extends object, C extends object, P extends object, T extends object>(\n element: HTMLElement,\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>\n): void {\n if (!cfg.props) return;\n\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\n Object.entries(cfg.props).forEach(([key, def]) => {\n // Prefer function prop on the element instance\n if (def.type === Function && typeof (element as any)[key] === \"function\") {\n (context as any)[key] = (element as any)[key];\n } else {\n const attr = element.getAttribute(toKebab(key));\n if (attr !== null) {\n (context as any)[key] = escapeHTML(parseProp(attr, def.type));\n } else if (\"default\" in def && def.default !== undefined) {\n (context as any)[key] = escapeHTML(def.default);\n }\n // else: leave undefined if no default\n }\n });\n}\n","import type { ComponentConfig, ComponentContext } from \"./types\";\n\n/**\n * Handles the connected lifecycle hook.\n */\nexport function handleConnected<S extends object, C extends object, P extends object, T extends object>(\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n isMounted: boolean,\n setMounted: (val: boolean) => void\n): void {\n if (cfg.onConnected && !isMounted) {\n cfg.onConnected(context);\n setMounted(true);\n }\n}\n\n/**\n * Handles the disconnected lifecycle hook.\n */\nexport function handleDisconnected<S extends object, C extends object, P extends object, T extends object>(\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n listeners: Array<() => void>,\n clearListeners: () => void,\n clearWatchers: () => void,\n setTemplateLoading: (val: boolean) => void,\n setTemplateError: (err: Error | null) => void,\n setMounted: (val: boolean) => void\n): void {\n if (cfg.onDisconnected) cfg.onDisconnected(context);\n listeners.forEach(unsub => unsub());\n clearListeners();\n clearWatchers();\n setTemplateLoading(false);\n setTemplateError(null);\n setMounted(false);\n}\n\n/**\n * Handles the attribute changed lifecycle hook.\n */\nexport function handleAttributeChanged<S extends object, C extends object, P extends object, T extends object>(\n cfg: ComponentConfig<S, C, P, T>,\n name: string,\n oldValue: string | null,\n newValue: string | null,\n context: ComponentContext<S, C, P, T>\n): void {\n if (cfg.onAttributeChanged) {\n cfg.onAttributeChanged(name, oldValue, newValue, context);\n }\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\nimport type { VNode, VDomRefs, AnchorBlockVNode } from \"./types\";\nimport { escapeHTML } from \"./helpers\";\n\n/**\n * Recursively clean up refs for all descendants of a node\n */\nexport function cleanupRefs(node: Node, refs?: VDomRefs) {\n if (!refs) return;\n if (node instanceof HTMLElement) {\n for (const refKey in refs) {\n if (refs[refKey] === node) {\n delete refs[refKey];\n }\n }\n // Clean up child nodes\n for (const child of Array.from(node.childNodes)) {\n cleanupRefs(child, refs);\n }\n }\n}\n\n/**\n * Get nested property value from object using dot notation\n */\nexport function 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 */\nexport function 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\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n/**\n * Process #model directive for two-way data binding\n */\nexport function 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 */\nexport function 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 */\nexport function 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 */\nexport function 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\nexport function 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 */\nexport function 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\nexport function 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 */\nexport function 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\nexport function createElement(\n vnode: VNode | string,\n context?: any,\n refs?: VDomRefs\n): 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 const childNode = createElement(child, context);\n frag.appendChild(childNode);\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 // Assign ref if present (support both props.ref and props.props.ref)\n const refKey = vnode.props?.ref ?? (vnode.props?.props && vnode.props.props.ref);\n if (typeof vnode !== \"string\" && refKey && refs) {\n refs[refKey] = el as HTMLElement;\n }\n\n // Append children\n if (Array.isArray(vnode.children)) {\n for (const child of vnode.children) {\n el.appendChild(createElement(child, context, refs));\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 */\nexport function patchChildren(\n parent: HTMLElement,\n oldChildren: VNode[] | string | undefined,\n newChildren: VNode[] | string | undefined,\n context?: any,\n refs?: VDomRefs\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 refs\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, refs);\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 cleanupRefs(node, refs);\n parent.removeChild(node);\n }\n }\n}\n\n/**\n * Patch a node using keys for node matching.\n */\nexport function patch(\n dom: Node,\n oldVNode: VNode | string | null,\n newVNode: VNode | string | null,\n context?: any,\n refs?: VDomRefs\n): Node {\n if (oldVNode && typeof oldVNode !== \"string\" && oldVNode.props?.ref && refs) {\n cleanupRefs(dom, refs); // Clean up old ref and descendants\n }\n\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 const start = anchorVNode._startNode ?? document.createTextNode(\"\");\n const end = anchorVNode._endNode ?? document.createTextNode(\"\");\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 const frag = document.createDocumentFragment();\n frag.appendChild(start);\n for (const child of children) {\n const childNode = createElement(child, context);\n frag.appendChild(childNode);\n }\n frag.appendChild(end);\n dom.parentNode?.replaceChild(frag, dom);\n return start;\n }\n\n if (!newVNode) {\n cleanupRefs(dom, refs);\n const placeholder = document.createComment(\"removed\");\n dom.parentNode?.replaceChild(placeholder, dom);\n return placeholder;\n }\n\n if (!oldVNode || typeof oldVNode === \"string\") {\n cleanupRefs(dom, refs);\n const newEl = createElement(newVNode, context, refs);\n if (typeof newVNode !== \"string\" && newVNode.props?.ref && refs) {\n refs[newVNode.props.ref] = newEl as HTMLElement; // Assign new ref\n }\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, refs); // <-- Pass refs\n if (typeof newVNode !== \"string\" && newVNode.props?.ref && refs) {\n refs[newVNode.props.ref] = el; // Assign ref\n }\n return el;\n }\n\n cleanupRefs(dom, refs);\n const newEl = createElement(newVNode, context, refs);\n if (typeof newVNode !== \"string\" && newVNode.props?.ref && refs) {\n refs[newVNode.props.ref] = newEl as HTMLElement;\n }\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 refs?: VDomRefs\n) {\n let newVNode: VNode;\n if (Array.isArray(vnodeOrArray)) {\n if (vnodeOrArray.length === 1) {\n newVNode = vnodeOrArray[0];\n if (newVNode && typeof newVNode === \"object\" && newVNode.key == null) {\n newVNode = { ...newVNode, key: \"__root__\" };\n }\n } else {\n newVNode = { tag: \"div\", key: \"__root__\", children: vnodeOrArray };\n }\n } else {\n newVNode = vnodeOrArray;\n if (newVNode && typeof newVNode === \"object\" && newVNode.key == null) {\n newVNode = { ...newVNode, key: \"__root__\" };\n }\n }\n\n // If the root is an AnchorBlock, wrap it in a real element for DOM insertion\n if (newVNode && typeof newVNode === \"object\" && newVNode.tag === \"#anchor\") {\n newVNode = {\n tag: \"div\",\n key: \"__anchor_root__\",\n props: { attrs: { 'data-anchor-block-root': '', key: \"__anchor_root__\" } },\n children: [newVNode]\n };\n }\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, refs);\n } else {\n newDom = createElement(newVNode, context, refs);\n root.replaceChild(newDom, prevDom);\n }\n } else {\n newDom = createElement(newVNode, context, refs);\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 cleanupRefs(node, refs);\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\nexport function renderToString(vnode: VNode): string {\n if (typeof vnode === \"string\") return escapeHTML(vnode) as string;\n\n if (vnode.tag === \"#text\") {\n return typeof vnode.children === \"string\" ? escapeHTML(vnode.children) as string : \"\";\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 // Collect attributes from props.attrs\n let attrsString = \"\";\n if (vnode.props && vnode.props.attrs) {\n attrsString = Object.entries(vnode.props.attrs)\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join(\"\");\n }\n\n // Collect other props (excluding attrs, directives, ref, key)\n let propsString = \"\";\n if (vnode.props) {\n propsString = Object.entries(vnode.props)\n .filter(([k]) => k !== \"attrs\" && k !== \"directives\" && k !== \"ref\" && k !== \"key\")\n .map(([k, v]) => ` ${k}=\"${escapeHTML(String(v))}\"`)\n .join(\"\");\n }\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\n return `<${vnode.tag}${attrsString}${propsString}>${children}</${vnode.tag}>`;\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 * 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 = css`\n :host, *, ::before, ::after {\n all: isolate;\n box-sizing: border-box;\n border: 0 solid currentColor;\n margin: 0;\n padding: 0;\n font: inherit;\n vertical-align: baseline;\n background: transparent;\n color: inherit;\n -webkit-tap-highlight-color: transparent;\n }\n :host {\n display: contents;\n font: 16px/1.5 ui-sans-serif, system-ui, sans-serif;\n -webkit-text-size-adjust: 100%;\n text-size-adjust: 100%;\n }\n button, input, select, textarea {\n background: transparent;\n outline: none;\n }\n textarea { resize: vertical }\n progress { vertical-align: baseline }\n button, textarea { overflow: visible }\n img, svg, video, canvas, audio, iframe, embed, object {\n display: block;\n max-width: 100%;\n height: auto;\n }\n svg { fill: currentColor; stroke: none }\n a { text-decoration: inherit; cursor: pointer }\n button, [type=button], [type=reset], [type=submit] {\n cursor: pointer;\n appearance: button;\n background: none;\n -webkit-user-select: none;\n user-select: none;\n }\n ::-webkit-input-placeholder, ::placeholder {\n color: inherit; opacity: .5;\n }\n *:focus {\n outline: 2px solid var(--color-blue-500, #3b82f6);\n outline-offset: 2px;\n }\n ol, ul { list-style: none }\n table { border-collapse: collapse }\n sub, sup {\n font-size: .75em;\n line-height: 0;\n position: relative;\n }\n sub { bottom: -.25em }\n sup { top: -.5em }\n [disabled], [aria-disabled=true] { cursor: not-allowed }\n [hidden] { display: none }\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\nexport const 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 neutral: {\n 50: \"var(--color-neutral-50, #fafafa)\",\n 100: \"var(--color-neutral-100, #f5f5f5)\",\n 200: \"var(--color-neutral-200, #e5e5e5)\",\n 300: \"var(--color-neutral-300, #d4d4d4)\",\n 400: \"var(--color-neutral-400, #a3a3a3)\",\n 500: \"var(--color-neutral-500, #737373)\",\n 600: \"var(--color-neutral-600, #525252)\",\n 700: \"var(--color-neutral-700, #404040)\",\n 800: \"var(--color-neutral-800, #262626)\",\n 900: \"var(--color-neutral-900, #171717)\",\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\nexport const 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 /* Sizing & Spacing */\n \"w-full\": \"width:100%;\",\n \"w-screen\": \"width:100dvw;\",\n \"h-full\": \"height:100%;\",\n \"h-screen\": \"height:100dvw;\",\n \"max-w-full\": \"max-width:100%;\",\n \"max-h-full\": \"max-height:100%;\",\n \"min-w-0\": \"min-width:0;\",\n \"min-h-0\": \"min-height:0;\",\n \"m-auto\": \"margin:auto;\",\n \"mx-auto\": \"margin-inline:auto;\",\n \"my-auto\": \"margin-block:auto;\",\n\n /* Overflow */\n \"overflow-auto\": \"overflow:auto;\",\n \"overflow-hidden\": \"overflow:hidden;\",\n \"overflow-visible\": \"overflow:visible;\",\n \"overflow-scroll\": \"overflow:scroll;\",\n\n /* Pointer Events */\n \"pointer-events-none\": \"pointer-events:none;\",\n \"pointer-events-auto\": \"pointer-events:auto;\",\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-between\": \"justify-content:space-between;\",\n \"justify-around\": \"justify-content:space-around;\",\n \"justify-evenly\": \"justify-content:space-evenly;\",\n \"justify-end\": \"justify-content:flex-end;\",\n \"flex-wrap\": \"flex-wrap:wrap;\",\n \"flex-nowrap\": \"flex-wrap:nowrap;\",\n \"flex-wrap-reverse\": \"flex-wrap:wrap-reverse;\",\n \"content-center\": \"align-content:center;\",\n \"content-start\": \"align-content:flex-start;\",\n \"content-end\": \"align-content:flex-end;\",\n \"content-between\": \"align-content:space-between;\",\n \"content-around\": \"align-content:space-around;\",\n \"content-stretch\": \"align-content:stretch;\",\n \"self-auto\": \"align-self:auto;\",\n \"self-start\": \"align-self:flex-start;\",\n \"self-end\": \"align-self:flex-end;\",\n \"self-center\": \"align-self:center;\",\n \"self-stretch\": \"align-self:stretch;\",\n \"flex-1\": \"flex:1 1 0%;\",\n \"flex-auto\": \"flex:1 1 auto;\",\n \"flex-initial\": \"flex:0 1 auto;\",\n \"flex-none\": \"flex:0 0 auto;\",\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\nexport const spacing = \"0.25rem\";\n\nexport const 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 h: [\"height\"],\n w: [\"width\"],\n \"min-h\": [\"min-height\"],\n \"min-w\": [\"min-width\"],\n \"max-h\": [\"max-height\"],\n \"max-w\": [\"max-width\"],\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\nexport const 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\nexport const 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\nexport const responsiveOrder = [\"sm\", \"md\", \"lg\", \"xl\", \"2xl\"];\n\nexport function 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\nexport function 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\nexport function parseColorClass(className: string): string | null {\n // Match bg-red-500, text-gray-200, border-blue-600, etc.\n const match = /^(bg|text|border|decoration|shadow|outline|caret|accent|fill|stroke)-([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 decoration: \"text-decoration-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 placeholder: \"placeholder-color\",\n fill: \"fill-color\",\n stroke: \"stroke-color\",\n };\n\n return `${propMap[type]}:${colorValue};`;\n}\n\nexport function 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\nexport function 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 */\nexport function 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\n/**\n * Parse arbitrary variant from class name.\n * Supports [attr=value]:utility or foo-[bar]:utility\n */\nexport function parseArbitraryVariant(token: string): string | null {\n // [attr=value] or foo-[bar]\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) return token;\n const bracketStart = token.indexOf(\"-[\");\n if (bracketStart > 0 && token.endsWith(\"]\")) {\n // e.g. foo-[bar]\n return token.replace(/_/g, \"-\");\n }\n return null;\n}\n\nexport function escapeClassName(name: string): string {\n // Escape only selector-relevant characters, not brackets\n return name.replace(/([!\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\n}\n\nexport function 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 // Match class tokens, including arbitrary variants and values\n const tokens = match[1].match(/(?:\\[[^\\]]+\\]:[^\\s]+|[^\\s]+)/g);\n if (tokens) classList.push(...tokens);\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 */\nexport const jitCssCache = new Map<string, { css: string; timestamp: number }>();\nexport const 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 // --- Arbitrary variant support ---\n for (const token of before) {\n const arbitrary = parseArbitraryVariant(token);\n if (arbitrary) {\n selector = `${arbitrary}${selector}`;\n continue;\n }\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","import { vdomRenderer } from \"./vdom\";\nimport { minifyCSS, getBaseResetSheet, sanitizeCSS, jitCSS } from \"./style\";\nimport type { ComponentConfig, ComponentContext, VNode, Refs } from \"./types\";\n\n/**\n * Renders the component output.\n */\nexport function renderComponent<S extends object, C extends object, P extends object, T extends object>(\n shadowRoot: ShadowRoot | null,\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n refs: Refs[\"refs\"],\n setHtmlString: (html: string) => void,\n setLoading: (val: boolean) => void,\n setError: (err: Error | null) => void,\n applyStyle: (html: string) => void\n): void {\n if (!shadowRoot) return;\n\n if (cfg.loadingTemplate && context.isLoading) {\n renderOutput(shadowRoot, cfg.loadingTemplate(context), context, refs, setHtmlString);\n return;\n }\n\n if (cfg.errorTemplate && context.hasError) {\n if (context.error instanceof Error) {\n renderOutput(shadowRoot, cfg.errorTemplate(context.error, context), context, refs, setHtmlString);\n }\n return;\n }\n\n const outputOrPromise = cfg.render(context);\n\n if (outputOrPromise instanceof Promise) {\n setLoading(true);\n outputOrPromise\n .then((output) => {\n setLoading(false);\n setError(null);\n renderOutput(shadowRoot, output, context, refs, setHtmlString);\n applyStyle(shadowRoot.innerHTML);\n })\n .catch((error) => {\n setLoading(false);\n setError(error);\n if (cfg.errorTemplate)\n renderOutput(shadowRoot, cfg.errorTemplate(error, context), context, refs, setHtmlString);\n });\n\n if (cfg.loadingTemplate)\n renderOutput(shadowRoot, cfg.loadingTemplate(context), context, refs, setHtmlString);\n return;\n }\n\n renderOutput(shadowRoot, outputOrPromise, context, refs, setHtmlString);\n applyStyle(shadowRoot.innerHTML);\n}\n\n/**\n * Renders VNode(s) to the shadowRoot.\n */\nexport function renderOutput<S extends object, C extends object, P extends object, T extends object>(\n shadowRoot: ShadowRoot | null,\n output: VNode | VNode[],\n context: ComponentContext<S, C, P, T>,\n refs: Refs[\"refs\"],\n setHtmlString: (html: string) => void\n): void {\n if (!shadowRoot) return;\n vdomRenderer(\n shadowRoot,\n Array.isArray(output) ? output : [output],\n context,\n refs\n );\n setHtmlString(shadowRoot.innerHTML);\n}\n\n/**\n * Debounced render request.\n */\nexport function requestRender(\n renderFn: () => void,\n lastRenderTime: number,\n renderCount: number,\n setLastRenderTime: (t: number) => void,\n setRenderCount: (c: number) => void,\n renderTimeoutId: ReturnType<typeof setTimeout> | null,\n setRenderTimeoutId: (id: ReturnType<typeof setTimeout> | null) => void\n): void {\n if (renderTimeoutId !== null) clearTimeout(renderTimeoutId);\n\n const now = Date.now();\n if (now - lastRenderTime < 16) {\n setRenderCount(renderCount + 1);\n if (renderCount > 10) {\n console.warn(\"Potential infinite render loop detected. Skipping render.\");\n setRenderTimeoutId(null);\n return;\n }\n } else {\n setRenderCount(0);\n }\n\n const timeoutId = setTimeout(() => {\n setLastRenderTime(Date.now());\n renderFn();\n setRenderTimeoutId(null);\n }, 0);\n setRenderTimeoutId(timeoutId);\n}\n\n/**\n * Applies styles to the shadowRoot.\n */\nexport function applyStyle<S extends object, C extends object, P extends object, T extends object>(\n shadowRoot: ShadowRoot | null,\n cfg: ComponentConfig<S, C, P, T>,\n context: ComponentContext<S, C, P, T>,\n htmlString: string,\n styleSheet: CSSStyleSheet | null,\n setStyleSheet: (sheet: CSSStyleSheet | null) => void\n): void {\n if (!shadowRoot) return;\n\n const jitCss = jitCSS(htmlString);\n\n if (!cfg.style && (!jitCss || jitCss.trim() === \"\")) {\n setStyleSheet(null);\n shadowRoot.adoptedStyleSheets = [getBaseResetSheet()];\n return;\n }\n\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(context);\n }\n\n let finalStyle = sanitizeCSS(`${userStyle}\\n${jitCss}\\n`);\n finalStyle = minifyCSS(finalStyle);\n\n let sheet = styleSheet;\n if (!sheet) sheet = new CSSStyleSheet();\n if (sheet.cssRules.length === 0 || sheet.toString() !== finalStyle) {\n sheet.replaceSync(finalStyle);\n }\n shadowRoot.adoptedStyleSheets = [getBaseResetSheet(), sheet];\n setStyleSheet(sheet);\n}","import type {\n ComponentConfig,\n ComponentContext,\n Refs,\n WatchCallback,\n WatchOptions,\n WatcherState,\n} from \"./types\";\nimport { toKebab, escapeHTML } from \"./helpers\";\nimport { initWatchers, triggerWatchers } from \"./watchers\";\nimport { applyProps } from \"./props\";\nimport {\n handleConnected,\n handleDisconnected,\n handleAttributeChanged\n} from \"./lifecycle\";\nimport { renderComponent, requestRender, applyStyle } from \"./render\";\n\n// --- Internal registry ---\nconst registry = new Map<string, ComponentConfig<any, any, any>>();\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\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\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 private _refs: Refs[\"refs\"] = {};\n private _listeners: Array<() => void> = [];\n private _watchers: Map<string, WatcherState> = new Map();\n /** @internal */\n private _renderTimeoutId: ReturnType<typeof setTimeout> | 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 /**\n * Returns the last rendered HTML string for JIT CSS.\n */\n public get lastHtmlStringForJitCSS(): string {\n return this._lastHtmlStringForJitCSS;\n }\n\n /**\n * Returns true if the component is currently loading.\n */\n public get isLoading(): boolean {\n return this._templateLoading;\n }\n\n /**\n * Returns the last error thrown during rendering, or null if none.\n */\n public get lastError(): Error | null {\n return this._templateError;\n }\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 const reactiveContext = this._initContext(config);\n\n // Inject refs into context (non-enumerable to avoid proxy traps)\n Object.defineProperty(reactiveContext, \"refs\", {\n value: this._refs,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n // Inject requestRender into context (non-enumerable to avoid proxy traps)\n Object.defineProperty(reactiveContext, 'requestRender', {\n value: () => this.requestRender(),\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n // --- Apply props BEFORE wiring listeners and emit ---\n this.context = reactiveContext;\n this._applyProps(config);\n\n // Inject emit helper for custom events\n Object.defineProperty(this.context, \"emit\", {\n value: (eventName: string, detail?: any, options?: CustomEventInit) => {\n this.dispatchEvent(\n new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n ...(options || {})\n })\n );\n // Always check for handler on element property, context, and config\n const handlerName = `on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;\n // 1. Handler set as property on the element\n const propHandler = typeof (this as any)[handlerName] === \"function\"\n ? (this as any)[handlerName]\n : undefined;\n // 2. Handler set in context (from props)\n const contextHandler = typeof (this.context as any)[handlerName] === \"function\"\n ? (this.context as any)[handlerName]\n : undefined;\n // 3. Handler set in config\n const configHandler = typeof (config as any)[handlerName] === \"function\"\n ? (config as any)[handlerName]\n : undefined;\n if (propHandler) propHandler(detail, this.context);\n if (contextHandler && contextHandler !== propHandler) contextHandler(detail, this.context);\n if (configHandler && configHandler !== propHandler && configHandler !== contextHandler)\n configHandler(detail, this.context);\n },\n writable: false,\n enumerable: false,\n configurable: false,\n });\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 (this.context as any)[key] = (...args: any[]) =>\n fn(...args, this.context);\n }\n // Listen for custom events\n else if (key.startsWith(\"on\") && key.length > 2 && key[2] === key[2].toUpperCase()) {\n const eventName = key.slice(2, 3).toLowerCase() + key.slice(3);\n this.addEventListener(eventName, (e: Event) => {\n // Always check for handler on element property first\n const fn =\n typeof (this as any)[key] === \"function\"\n ? (this as any)[key]\n : (this.context as any)[key];\n if (typeof fn === \"function\") {\n fn((e as CustomEvent).detail, this.context);\n }\n });\n }\n });\n\n this._applyComputed(config);\n\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 handleConnected(\n config,\n this.context,\n this._mounted,\n (val) => { this._mounted = val; }\n );\n });\n }\n\n disconnectedCallback() {\n this._runLogicWithinErrorBoundary(config, () => {\n handleDisconnected(\n config,\n this.context,\n this._listeners,\n () => { this._listeners = []; },\n () => { this._watchers.clear(); },\n (val) => { this._templateLoading = val; },\n (err) => { this._templateError = err; },\n (val) => { this._mounted = val; }\n );\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 handleAttributeChanged(\n config,\n name,\n oldValue,\n newValue,\n this.context\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 renderComponent(\n this.shadowRoot,\n cfg,\n this.context,\n this._refs,\n (html) => {\n this._lastHtmlStringForJitCSS = html;\n // Optionally, use the latest HTML string for debugging or external logic\n if (typeof (this as any).onHtmlStringUpdate === \"function\") {\n (this as any).onHtmlStringUpdate(html);\n }\n },\n (val) => {\n this._templateLoading = val;\n // Optionally, use loading state for external logic\n if (typeof (this as any).onLoadingStateChange === \"function\") {\n (this as any).onLoadingStateChange(val);\n }\n },\n (err) => {\n this._templateError = err;\n // Optionally, use error state for external logic\n if (typeof (this as any).onErrorStateChange === \"function\") {\n (this as any).onErrorStateChange(err);\n }\n },\n (html) => this._applyStyle(cfg, html)\n );\n });\n }\n\n public requestRender() {\n this._requestRender();\n }\n\n _requestRender() {\n this._runLogicWithinErrorBoundary(this._cfg, () => {\n requestRender(\n () => this._render(this._cfg),\n this._lastRenderTime,\n this._renderCount,\n (t) => { this._lastRenderTime = t; },\n (c) => { this._renderCount = c; },\n this._renderTimeoutId,\n (id) => { this._renderTimeoutId = id; }\n );\n })\n }\n\n // --- Style ---\n private _applyStyle(cfg: ComponentConfig<S, C, P, T>, html: string) {\n this._runLogicWithinErrorBoundary(cfg, () => {\n applyStyle(\n this.shadowRoot,\n cfg,\n this.context,\n html,\n this._styleSheet,\n (sheet) => { this._styleSheet = sheet; }\n );\n })\n }\n\n // --- Error Boundary function ---\n private _runLogicWithinErrorBoundary(\n cfg: ComponentConfig<S, C, P>,\n fn: () => void,\n ) {\n if (this._hasError) this._hasError = false;\n try {\n fn();\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) {\n cfg.onError(error as Error | null, this.context);\n }\n if (cfg.errorFallback) {\n if (this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(\n error as Error | null,\n this.context,\n );\n }\n }\n }\n }\n\n // --- State, props, computed ---\n private _initContext(cfg: ComponentConfig<S, C, P>): ComponentContext<S, C, P, T> {\n try {\n const self = this;\n function createReactive(obj: any, path = \"\"): any {\n if (Array.isArray(obj)) {\n // Create a proxy that intercepts array mutations\n return new Proxy(obj, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Intercept array mutating methods\n if (typeof value === \"function\" && typeof prop === \"string\") {\n const mutatingMethods = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n ];\n if (mutatingMethods.includes(prop)) {\n return function (...args: any[]) {\n const result = value.apply(target, args);\n\n if (!self._initializing) {\n const fullPath = path || \"root\";\n self._triggerWatchers(fullPath, target);\n self._render(cfg);\n }\n\n return result;\n };\n }\n }\n\n return value;\n },\n set(target, prop, value) {\n target[prop as any] = value;\n if (!self._initializing) {\n const fullPath = path\n ? `${path}.${String(prop)}`\n : String(prop);\n 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 this._runLogicWithinErrorBoundary(cfg, () => {\n initWatchers(\n this.context,\n this._watchers,\n (cfg.watch || {}) as Record<string, WatchCallback | [WatchCallback, WatchOptions]>\n );\n })\n }\n\n private _triggerWatchers(path: string, newValue: any): void {\n triggerWatchers(this.context, this._watchers, path, newValue);\n }\n\n private _applyProps(cfg: ComponentConfig<S, C, P>): void {\n this._runLogicWithinErrorBoundary(cfg, () => {\n try {\n applyProps(this, cfg, this.context);\n } catch (error) {\n this._hasError = true;\n if (cfg.onError) cfg.onError(error as Error | null, this.context);\n if (cfg.errorFallback && this.shadowRoot) {\n this.shadowRoot.innerHTML = cfg.errorFallback(error as Error | null, this.context);\n }\n }\n })\n }\n }\n}\n","import type { VNode } from \"./types\";\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\nexport function 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\nexport function 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\nexport function ensureKey(v: VNode, k: string): VNode {\n return v.key != null ? v : { ...v, key: k };\n}\n\nexport function 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 if (rawName === \"ref\") {\n props.ref = value;\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 */\nexport function 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 // How this works:\n // const tagRegex =\n // /<\\/?([a-zA-Z0-9-]+) # tag name\n // ( # start attributes group\n // (?:\\s+ # whitespace before attribute\n // [^\\s=>/]+ # attribute name\n // (?:\\s*=\\s* # optional equals\n // (?:\n // \"(?:\\\\.|[^\"])*\" # double-quoted value\n // |'(?:\\\\.|[^'])*' # single-quoted value\n // |[^\\s>]+ # unquoted value\n // )\n // )?\n // )* # repeat for multiple attributes\n // )\\s*\\/?> # end of tag\n // |{{(\\d+)}} # placeholder\n // |([^<]+) # text node\n // /gmx;\n // We explicitly match attributes one by one, and if a value is quoted, we allow anything inside (including >).\n // Handles both ' and \" quotes.\n // Matches unquoted attributes like disabled or checked.\n // Keeps {{(\\d+)}} and text node capture groups intact.\n const tagRegex =\n /<\\/?([a-zA-Z0-9-]+)((?:\\s+[^\\s=>/]+(?:\\s*=\\s*(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|[^\\s>]+))?)*)\\s*\\/?>|{{(\\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 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 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 vnodeProps.attrs[directiveName] = String(directive.value);\n }\n }\n // Always preserve #show, #class, #style in props.directives for root-level diagnostics\n if ([\"show\", \"class\", \"style\"].includes(directiveName)) {\n if (!vnodeProps.directives) vnodeProps.directives = {};\n vnodeProps.directives[directiveName] = directive;\n }\n if (directiveName === \"show\") {\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 const classValue = directive.value;\n let classNames: string[] = [];\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 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 const styleValue = directive.value;\n let styleString = \"\";\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 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 // If there is no previous tag, this is a root-level node\n fragmentChildren.push(node);\n currentTag = null;\n currentProps = {};\n currentKey = undefined;\n currentChildren = [];\n }\n } else if (isSelfClosing) {\n const key = undefined;\n // Always push self-closing tags to fragmentChildren if not inside another tag\n if (currentTag) {\n currentChildren.push(h(tagName, vnodeProps, undefined, key));\n } else {\n fragmentChildren.push(h(tagName, vnodeProps, undefined, key));\n }\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 // Normalize output: prefer array for true multi-root, single node for single root\n if (root) {\n // If root is an anchor block or element, return as-is\n return root;\n }\n\n // Filter out empty text nodes and whitespace-only nodes\n const cleanedFragments = fragmentChildren.filter((child): child is VNode => {\n if (isElementVNode(child)) {\n if (child.tag === \"#text\") {\n return typeof child.children === \"string\" && child.children.trim() !== \"\";\n }\n return true;\n }\n // Always keep anchor blocks and non-element nodes\n return true;\n });\n\n if (cleanedFragments.length === 1) {\n // Single non-empty root node\n return cleanedFragments[0];\n } else if (cleanedFragments.length > 1) {\n // True multi-root: return array\n return 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","/**\n * Lightweight, scalable router for Custom Elements Runtime\n * - Functional API, zero dependencies, SSR/static site compatible\n * - Integrates with createStore and lib/index.ts\n */\n\nimport type { ComponentContext } from './runtime/types';\nimport { createStore, type Store } from './store';\nimport { component } from './runtime/component';\nimport { html } from './runtime/template-compiler';\nimport { css } from './runtime/style';\nimport { match } from './directives';\n\nexport interface RouteComponent {\n // Can be any renderable type — adjust as needed for your framework\n new (...args: any[]): any; // class components\n // OR functional components\n (...args: any[]): any;\n}\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\nexport type GuardResult = boolean | string | Promise<boolean | string>;\n\nexport interface Route {\n path: string;\n\n /**\n * Statically available component (already imported)\n */\n component?: string;\n\n /**\n * Lazy loader that resolves to something renderable\n */\n load?: () => Promise<{ default: string | HTMLElement | Function }>;\n\n\n /**\n * Runs before matching — return false to cancel,\n * or a string to redirect\n */\n beforeEnter?: (to: RouteState, from: RouteState) => GuardResult;\n\n /**\n * Runs right before navigation commits — can cancel or redirect\n */\n onEnter?: (to: RouteState, from: RouteState) => GuardResult;\n\n /**\n * Runs after navigation completes — cannot cancel\n */\n afterEnter?: (to: RouteState, from: RouteState) => void;\n}\n\nexport interface RouterLinkProps {\n to: string;\n tag: string;\n replace: boolean;\n exact: boolean;\n activeClass: string;\n exactActiveClass: string;\n ariaCurrentValue: string;\n disabled: boolean;\n external: boolean;\n style: string;\n}\n\nexport interface RouterLinkComputed {\n current: RouteState;\n isExactActive: boolean;\n isActive: boolean;\n className: string;\n ariaCurrent: string;\n isButton: boolean;\n disabledAttr: string;\n externalAttr: string;\n}\n\nexport interface RouterConfig {\n routes: Route[];\n base?: string;\n initialUrl?: string; // For SSR: explicitly pass the URL\n}\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\n\nexport const parseQuery = (search: string): Record<string, string> => {\n if (!search) return {};\n if (typeof URLSearchParams === 'undefined') return {};\n return Object.fromEntries(new URLSearchParams(search));\n};\n\nexport const matchRoute = (routes: Route[], path: string): { route: Route | null; params: Record<string, string> } => {\n for (const route of routes) {\n const paramNames: string[] = [];\n const regexPath = route.path.replace(/:[^/]+/g, (m) => {\n paramNames.push(m.slice(1));\n return '([^/]+)';\n });\n const regex = new RegExp(`^${regexPath}$`);\n const match = path.match(regex);\n if (match) {\n const params: Record<string, string> = {};\n paramNames.forEach((name, i) => {\n params[name] = match[i + 1];\n });\n return { route, params };\n }\n }\n return { route: null, params: {} };\n};\n\n// Async component loader cache\nconst componentCache: Record<string, any> = {};\n\n/**\n * Loads a route's component, supporting both static and async.\n * @param route Route object\n * @returns Promise resolving to the component\n */\nexport async function resolveRouteComponent(route: Route): Promise<any> {\n if (route.component) return route.component;\n if (route.load) {\n if (componentCache[route.path]) return componentCache[route.path];\n try {\n const mod = await route.load();\n componentCache[route.path] = mod.default;\n return mod.default;\n } catch (err) {\n throw new Error(`Failed to load component for route: ${route.path}`);\n }\n }\n throw new Error(`No component or loader defined for route: ${route.path}`);\n}\n\nexport function useRouter(config: RouterConfig) {\n const { routes, base = '', initialUrl } = config;\n\n let getLocation: () => { path: string; query: Record<string, string> };\n let initial: { path: string; query: Record<string, string> };\n let store: Store<RouteState>;\n let update: (replace?: boolean) => Promise<void>;\n let push: (path: string) => Promise<void>;\n let replaceFn: (path: string) => Promise<void>;\n let back: () => void;\n\n // Run matching route guards/hooks\n const runBeforeEnter = async (to: RouteState, from: RouteState) => {\n const matched = routes.find(r => matchRoute([r], to.path).route !== null);\n if (matched?.beforeEnter) {\n try {\n const result = await matched.beforeEnter(to, from);\n if (typeof result === 'string') {\n // Redirect\n await navigate(result, true);\n return false;\n }\n return result !== false;\n } catch (err) {\n console.error('beforeEnter error', err);\n return false;\n }\n }\n return true;\n };\n\n const runOnEnter = async (to: RouteState, from: RouteState) => {\n const matched = routes.find(r => matchRoute([r], to.path).route !== null);\n if (matched?.onEnter) {\n try {\n const result = await matched.onEnter(to, from);\n if (typeof result === 'string') {\n await navigate(result, true);\n return false;\n }\n return result !== false;\n } catch (err) {\n console.error('onEnter error', err);\n return false;\n }\n }\n return true;\n };\n\n const runAfterEnter = (to: RouteState, from: RouteState) => {\n const matched = routes.find(r => matchRoute([r], to.path).route !== null);\n if (matched?.afterEnter) {\n try {\n matched.afterEnter(to, from);\n } catch (err) {\n console.error('afterEnter error', err);\n }\n }\n };\n\n const navigate = async (path: string, replace = false) => {\n try {\n const loc = {\n path: path.replace(base, '') || '/',\n query: {}\n };\n const match = matchRoute(routes, loc.path);\n if (!match) throw new Error(`No route found for ${loc.path}`);\n\n const from = store.getState();\n const to: RouteState = {\n path: loc.path,\n params: match.params,\n query: loc.query\n };\n\n // beforeEnter guard\n const allowedBefore = await runBeforeEnter(to, from);\n if (!allowedBefore) return;\n\n // onEnter guard (right before commit)\n const allowedOn = await runOnEnter(to, from);\n if (!allowedOn) return;\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n if (replace) {\n window.history.replaceState({}, '', base + path);\n } else {\n window.history.pushState({}, '', base + path);\n }\n }\n\n store.setState(to);\n\n // afterEnter hook (post commit)\n runAfterEnter(to, from);\n\n } catch (err) {\n console.error('Navigation error:', err);\n }\n };\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Browser mode\n getLocation = () => {\n const url = new URL(window.location.href);\n const path = url.pathname.replace(base, '') || '/';\n const query = parseQuery(url.search);\n return { path, query };\n };\n\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = createStore<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n\n update = async (replace = false) => {\n const loc = getLocation();\n await navigate(loc.path, replace);\n };\n\n window.addEventListener('popstate', () => update(true));\n\n push = (path: string) => navigate(path, false);\n replaceFn = (path: string) => navigate(path, true);\n back = () => window.history.back();\n\n } else {\n // SSR mode\n getLocation = () => {\n const url = new URL(initialUrl || '/', 'http://localhost');\n const path = url.pathname.replace(base, '') || '/';\n const query = parseQuery(url.search);\n return { path, query };\n };\n\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = createStore<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n\n update = async () => {};\n push = async () => {};\n replaceFn = async () => {};\n back = () => {};\n }\n\n return {\n store,\n push,\n replace: replaceFn,\n back,\n subscribe: store.subscribe,\n matchRoute: (path: string) => matchRoute(routes, path),\n getCurrent: (): RouteState => store.getState(),\n resolveRouteComponent\n };\n}\n\n\n// SSR/static site support: match route for a given path\nexport function matchRouteSSR(routes: Route[], path: string) {\n return matchRoute(routes, path);\n}\n\n/**\n * Singleton router instance for global access.\n * \n * Define here to prevent circular dependency\n * issue with component.\n */\n\nexport function initRouter(config: RouterConfig) {\n const router = useRouter(config);\n component('router-view', {\n async render() {\n if (!router) return html`<div>Router not initialized.</div>`;\n const current = router.getCurrent();\n const { path } = current;\n const match = router.matchRoute(path);\n if (!match.route) return html`<div>Not found</div>`;\n let componentTag = match.route.component;\n if (match.route.load) {\n const loaded = await match.route.load();\n if (typeof loaded.default === 'string') {\n componentTag = loaded.default;\n }\n }\n if (typeof componentTag === 'string') {\n // Return a VNode directly, not a template string\n return { tag: componentTag, props: {}, children: [] };\n }\n return html`<div>Invalid route component</div>`;\n },\n onConnected(ctx) {\n if (router && typeof router.subscribe === 'function') {\n router.subscribe(() => {\n if (typeof ctx.requestRender === 'function') {\n ctx.requestRender();\n }\n });\n }\n }\n });\n\n component<{}, RouterLinkComputed, RouterLinkProps>('router-link', {\n state: {},\n props: {\n to: { type: String, default: '' },\n tag: { type: String, default: 'a' },\n replace: { type: Boolean, default: false },\n exact: { type: Boolean, default: false },\n activeClass: { type: String, default: 'active' },\n exactActiveClass: { type: String, default: 'exact-active' },\n ariaCurrentValue: { type: String, default: 'page' },\n disabled: { type: Boolean, default: false },\n external: { type: Boolean, default: false },\n style: { type: String, default: css`\n [aria-disabled=\"true\"] {\n pointer-events: none;\n opacity: 0.5;\n }\n ` },\n },\n style: (ctx) => ctx.style,\n render: (ctx) => {\n // Recalculate computed values in render\n const current = router.getCurrent();\n const to = ctx.to;\n const exact = ctx.exact;\n const exactActiveClass = ctx.exactActiveClass;\n const activeClass = ctx.activeClass;\n const ariaCurrentValue = ctx.ariaCurrentValue;\n const tag = ctx.tag;\n const disabled = ctx.disabled;\n const external = ctx.external;\n // Computed\n const isExactActive = current.path === to;\n const isActive = exact\n ? isExactActive\n : current && typeof current.path === 'string'\n ? current.path.startsWith(to)\n : false;\n const className = isExactActive\n ? exactActiveClass\n : isActive\n ? activeClass\n : '';\n const ariaCurrent = isExactActive ? `aria-current=\"${ariaCurrentValue}\"` : '';\n const isButton = tag === 'button';\n const disabledAttr = disabled\n ? isButton\n ? 'disabled aria-disabled=\"true\" tabindex=\"-1\"'\n : 'aria-disabled=\"true\" tabindex=\"-1\"'\n : '';\n const externalAttr = external && (tag === 'a' || !tag)\n ? 'target=\"_blank\" rel=\"noopener noreferrer\"'\n : '';\n return html`\n ${match()\n .when(isButton, html`\n <button\n part=\"button\"\n class=\"${className}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></button>\n `)\n .otherwise(html`\n <a\n part=\"link\"\n href=\"${to}\"\n class=\"${className}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></a>\n `)\n .done()}\n `;\n },\n navigate: (e: MouseEvent, context: ComponentContext<{}, RouterLinkComputed, RouterLinkProps, any>) => {\n const { disabled, external, tag, replace, to } = context.props;\n if (disabled) {\n e.preventDefault();\n return;\n }\n if (external && (tag === 'a' || !tag)) {\n return;\n }\n e.preventDefault();\n if (replace) {\n router.replace(to);\n } else {\n router.push(to);\n }\n }\n });\n return router;\n}"],"names":["when","cond","children","anchorBlock","each","list","render","item","i","itemKey","match","branches","content","whenChain","idx","anchorKey","childArray","GlobalEventBus","eventName","data","now","counter","eventHandlers","handler","error","options","resolve","unsubscribe","stats","eventBus","emit","on","off","once","listen","createStore","initial","state","listeners","subscribe","listener","getState","setState","partial","next","notify","fn","toKebab","str","escapeHTML","c","initWatchers","context","watchers","watchConfig","key","config","callback","getNestedValue","currentValue","path","obj","triggerWatchers","newValue","isEqual","a","b","val","keysA","keysB","watcher","watchPath","watcherConfig","applyProps","element","cfg","parseProp","type","def","attr","handleConnected","isMounted","setMounted","handleDisconnected","clearListeners","clearWatchers","setTemplateLoading","setTemplateError","unsub","handleAttributeChanged","name","oldValue","cleanupRefs","node","refs","refKey","child","current","setNestedValue","value","keys","lastKey","target","processModelDirective","modifiers","props","attrs","el","hasLazy","hasTrim","hasNumber","getCurrentValue","actualState","inputType","attrInputType","checkboxValue","shouldBeChecked","trueValue","radioValue","selectEl","currentArray","option","shouldBeSelected","stringValue","eventType","eventListener","event","freshCurrentValue","index","falseValue","numValue","currentStateValue","compositionStartListener","compositionEndListener","processBindDirective","bindings","processShowDirective","isVisible","currentStyle","displayStyle","styleRules","displayIndex","rule","processClassDirective","classValue","classes","condition","className","existingClasses","allClasses","processStyleDirective","styleValue","styleString","property","kebabProperty","needsPx","cssValue","existingStyle","processDirectives","directives","vnodeAttrs","directiveName","directive","assignKeysDeep","nodeOrNodes","baseKey","usedKeys","tagPart","idPart","uniqueKey","patchProps","oldProps","newProps","newDirectives","processedDirectives","mergedProps","mergedAttrs","oldPropProps","newPropProps","oldVal","newVal","oldAttrs","newAttrs","createElement","vnode","textNode","anchorVNode","start","end","frag","childNode","patchChildren","parent","oldChildren","newChildren","oldNodes","oldVNodes","oldVNodeByKey","v","oldNodeByKey","k","usedNodes","nextSibling","markRangeUsed","cur","patchChildrenBetween","oldNodesInRange","oldVNodesInRange","oldVNodeByKeyRange","oldNodeByKeyRange","usedInRange","newVNode","oldVNode","patch","commonLength","aKey","startKey","endKey","dom","placeholder","newEl","vdomRenderer","root","vnodeOrArray","prevVNode","prevDom","newDom","nodesToRemove","css","strings","values","result","minifyCSS","baseResetSheet","getBaseResetSheet","baseReset","sanitizeCSS","colors","utilityMap","spacing","spacingProps","selectorVariants","sel","body","mediaVariants","responsiveOrder","parseSpacing","negative","parts","numStr","num","sign","prop","hexToRgb","hex","clean","bigint","r","g","parseColorClass","colorName","shade","colorValue","parseOpacityModifier","base","opacityStr","opacity","parseColorWithOpacity","paletteRule","rgb","arbitraryRule","parseArbitrary","bracketStart","bracketEnd","cssProp","parseArbitraryVariant","token","escapeClassName","extractClassesFromHTML","html","classAttrRegex","classList","tokens","jitCssCache","JIT_CSS_THROTTLE_MS","jitCSS","cached","seen","bucket1","bucket2","bucket3","bucket4","ruleCache","generateRuleCached","cls","stripDark","cacheKey","generateRule","classify","before","hasResponsive","t","hasDark","basePart","p","baseRule","selector","baseIndex","responsiveTokens","lastResponsive","arbitrary","variantFn","bucketNum","renderComponent","shadowRoot","setHtmlString","setLoading","setError","applyStyle","renderOutput","outputOrPromise","output","requestRender","renderFn","lastRenderTime","renderCount","setLastRenderTime","setRenderCount","renderTimeoutId","setRenderTimeoutId","timeoutId","htmlString","styleSheet","setStyleSheet","jitCss","userStyle","finalStyle","sheet","registry","component","tag","renderOrConfig","normalizedTag","finalConfig","createElementClass","reactiveContext","detail","handlerName","propHandler","contextHandler","configHandler","args","e","err","id","createReactive","receiver","self","fullPath","newPath","h","finalKey","isAnchorBlock","isElementVNode","ensureKey","parseProps","attrRegex","prefix","rawName","rawVal","interpMatch","onName","modifierParts","finalValue","finalModifiers","commonModifiers","valueParts","actualValue","valueModifiers","htmlImpl","textVNode","text","template","tagRegex","stack","currentChildren","currentTag","currentProps","currentKey","nodeIndex","fragmentChildren","mergeIntoCurrentProps","maybe","newStyle","newClasses","pushInterpolation","targetChildren","anchorChildren","tagName","isClosing","isSelfClosing","rawProps","rawAttrs","vnodeProps","visible","classNames","existingClass","remainingDirectives","prev","part","interp","cleanedFragments","last","parseQuery","search","matchRoute","routes","route","paramNames","regexPath","m","regex","params","componentCache","resolveRouteComponent","mod","useRouter","initialUrl","getLocation","store","update","push","replaceFn","back","runBeforeEnter","to","from","matched","navigate","runOnEnter","runAfterEnter","replace","loc","url","query","matchRouteSSR","initRouter","router","componentTag","loaded","ctx","exact","exactActiveClass","activeClass","ariaCurrentValue","disabled","external","isExactActive","isActive","ariaCurrent","isButton","disabledAttr","externalAttr"],"mappings":"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"}