@jasonshimmy/custom-elements-runtime 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/custom-elements-runtime.cjs.js +16 -16
- package/dist/custom-elements-runtime.cjs.js.map +1 -1
- package/dist/custom-elements-runtime.es.js +906 -939
- package/dist/custom-elements-runtime.es.js.map +1 -1
- package/dist/custom-elements-runtime.umd.js +16 -16
- package/dist/custom-elements-runtime.umd.js.map +1 -1
- package/dist/router.d.ts +1 -0
- package/dist/runtime/types.d.ts +14 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-elements-runtime.umd.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\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 * @param node The node to clean up.\n * @param refs The refs to clean up.\n * @returns \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 * @param obj The object to search.\n * @param path The dot-separated path to the property.\n * @returns The value of the nested property, or undefined if not found.\n */\nexport function getNestedValue(obj: any, path: string): any {\n if (typeof path === 'string') {\n return path.split(\".\").reduce((current, key) => current?.[key], obj);\n }\n // If path is an object, handle accordingly or return a default value\n return path;\n}\n\n/**\n * Set nested property value in object using dot notation\n * @param obj \n * @param path \n * @param value \n * @returns \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 * @param value \n * @param modifiers \n * @param props \n * @param attrs \n * @param listeners \n * @param context \n * @param el \n * @returns \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 * Convert a prop key like `onClick` to its DOM event name `click`.\n */\nfunction eventNameFromKey(key: string): string {\n // strip leading 'on' and lowercase remainder\n return key.slice(2).charAt(0).toLowerCase() + key.slice(3);\n}\n\n/**\n * Normalize a listener entry which may be a function or an object { handler, options }.\n * Returns tuple [handlerFunction, options]\n */\nfunction normalizeListenerEntry(\n maybe: any,\n): [EventListener | undefined, AddEventListenerOptions | undefined] {\n if (!maybe) return [undefined, undefined];\n if (typeof maybe === \"function\") return [maybe as EventListener, undefined];\n if (typeof maybe === \"object\") {\n if (typeof maybe.handler === \"function\") return [maybe.handler as EventListener, maybe.options as AddEventListenerOptions];\n // If object is already like { handler, options } renamed keys\n if (typeof maybe.fn === \"function\") return [maybe.fn as EventListener, maybe.options as AddEventListenerOptions];\n }\n return [undefined, undefined];\n}\n\n/**\n * Process :bind directive for attribute/property binding\n * @param value \n * @param props \n * @param attrs \n * @param context \n * @returns \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 // Support both object and string syntax for :bind\n if (typeof value === \"object\" && value !== null) {\n for (const [key, val] of Object.entries(value)) {\n props[key] = val;\n }\n } else if (typeof value === \"string\") {\n try {\n // Try to parse as JSON object\n const bindings = JSON.parse(value);\n if (typeof bindings === \"object\" && bindings !== null) {\n for (const [key, val] of Object.entries(bindings)) {\n props[key] = val;\n }\n return;\n }\n } catch {\n // Fallback: treat as single property binding\n const currentValue = getNestedValue(context, value);\n attrs[value] = currentValue;\n }\n }\n}\n\n/**\n * Process :show directive for conditional display\n * @param value \n * @param attrs \n * @param context \n * @returns \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 * @param value \n * @param attrs \n * @param context \n * @returns \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 .flatMap(([className]) => className.split(/\\s+/).filter(Boolean));\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\n/**\n * Process :style directive for dynamic inline styles\n * @param value \n * @param attrs \n * @param context \n * @returns \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 * @param directives \n * @param context \n * @param el \n * @param vnodeAttrs \n * @returns \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\n/**\n * Assign unique keys to VNodes for efficient rendering\n * @param nodeOrNodes \n * @param baseKey \n * @returns \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 * @param el \n * @param oldProps \n * @param newProps \n * @param context \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\")) {\n // DOM-first listener: onClick -> click\n const ev = eventNameFromKey(key);\n const [newHandler, newOptions] = normalizeListenerEntry(newVal);\n const [oldHandler, oldOptions] = normalizeListenerEntry(oldVal);\n\n if (oldHandler) el.removeEventListener(ev, oldHandler, oldOptions);\n if (newHandler) el.addEventListener(ev, newHandler, newOptions);\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 const [handler, options] = normalizeListenerEntry(listener);\n if (handler) el.addEventListener(eventType, handler, options);\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\n/**\n * Create a DOM element from a VNode.\n * @param vnode \n * @param context \n * @param refs \n * @returns \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 // Only allow valid attribute names (string, not object)\n if (typeof key !== 'string' || /\\[object Object\\]/.test(key)) {\n if (typeof window !== 'undefined' && window.console) {\n console.warn('Skipping invalid attribute key:', key, val);\n }\n continue;\n }\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, val);\n }\n }\n\n // Set props and event listeners\n for (const key in mergedProps) {\n const val = mergedProps[key];\n // Only allow valid attribute names (string, not object)\n if (typeof key !== 'string' || /\\[object Object\\]/.test(key)) {\n if (typeof window !== 'undefined' && window.console) {\n console.warn('Skipping invalid prop key:', key, val);\n }\n continue;\n }\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\")) {\n const [handler, options] = normalizeListenerEntry(val);\n if (handler) el.addEventListener(eventNameFromKey(key), handler, options);\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 * @param parent \n * @param oldChildren \n * @param newChildren \n * @param context \n * @param refs \n * @returns \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 * @param dom \n * @param oldVNode \n * @param newVNode \n * @param context \n * @param refs \n * @returns \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 * Virtual DOM renderer.\n * @param root The root element to render into.\n * @param vnodeOrArray The virtual node or array of virtual nodes to render.\n * @param context The context to use for rendering.\n * @param refs The refs to use for rendering.\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\n/**\n * Render a VNode to a string.\n * @param vnode The virtual node to render.\n * @returns The rendered HTML string.\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\n // (debug logging via console.error is used above when needed)\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 /* Z-index */\n \"z-0\": \"z-index:0;\",\n \"z-10\": \"z-index:10;\",\n \"z-20\": \"z-index:20;\",\n \"z-30\": \"z-index:30;\",\n \"z-40\": \"z-index:40;\",\n \"z-50\": \"z-index:50;\",\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\nfunction insertPseudoBeforeCombinator(sel: string, pseudo: string): string {\n let depthSquare = 0;\n let depthParen = 0;\n for (let i = 0; i < sel.length; i++) {\n const ch = sel[i];\n if (ch === \"[\") depthSquare++;\n else if (ch === \"]\" && depthSquare > 0) depthSquare--;\n else if (ch === \"(\") depthParen++;\n else if (ch === \")\" && depthParen > 0) depthParen--;\n else if (depthSquare === 0 && depthParen === 0 && (ch === \">\" || ch === \"+\" || ch === \"~\" || ch === \" \")) {\n return sel.slice(0, i) + pseudo + sel.slice(i);\n }\n }\n return sel + pseudo;\n}\n\nexport const selectorVariants: SelectorVariantMap = {\n before: (sel, body) => `${sel}::before{${body}}`,\n after: (sel, body) => `${sel}::after{${body}}`,\n hover: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":hover\")}{${body}}`,\n focus: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":focus\")}{${body}}`,\n active: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":active\")}{${body}}`,\n disabled: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":disabled\")}{${body}}`,\n visited: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":visited\")}{${body}}`,\n checked: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":checked\")}{${body}}`,\n first: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":first-child\")}{${body}}`,\n last: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":last-child\")}{${body}}`,\n odd: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":nth-child(odd)\")}{${body}}`,\n even: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":nth-child(even)\")}{${body}}`,\n \"focus-within\": (sel, body) => `${insertPseudoBeforeCombinator(sel, \":focus-within\")}{${body}}`,\n \"focus-visible\": (sel, body) => `${insertPseudoBeforeCombinator(sel, \":focus-visible\")}{${body}}`,\n\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-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\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 * Parse opacity utility class (e.g., opacity-25)\n * Returns CSS rule string or null if not valid\n */\nexport function parseOpacity(className: string): string | null {\n const match = /^opacity-(\\d{1,3})$/.exec(className);\n if (!match) return null;\n const value = parseInt(match[1], 10);\n if (value < 0 || value > 100) return null;\n return `opacity:${value / 100};`;\n}\n\n/**\n * Arbitrary value parser — supports:\n * - prop-[value]\n */\nexport function parseArbitrary(className: string): string | null {\n // 1) [prop:value] — only when \"prop\" is a valid CSS property name (not a selector)\n if (className.startsWith(\"[\") && className.endsWith(\"]\") && !className.includes(\"-[\")) {\n const inner = className.slice(1, -1).trim();\n\n // prop must be at the very start, and must be a CSS identifier (letters + hyphens)\n const m = inner.match(/^([a-zA-Z][a-zA-Z0-9-]*)\\s*:(.*)$/);\n if (m) {\n const prop = m[1].trim();\n let value = m[2].trim();\n // normalize url('...') to url(\"...\") and whole-value single-quotes to double\n value = value.replace(/url\\('\\s*([^']*?)\\s*'\\)/g, 'url(\"$1\")');\n value = value.replace(/^'([^']*)'$/g, '\"$1\"');\n return `${prop}:${value};`;\n }\n // If it didn't match a property, it's an arbitrary variant selector (e.g. [&>h2:hover]) — not a utility\n return null;\n }\n\n // 2) prop-[value] — arbitrary values for known properties\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\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 // Tailwind-like rotate behavior for arbitrary values\n if (prop === \"rotate\") {\n return `transform:rotate(${value});`;\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 [&...]\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n const inner = token.slice(1, -1);\n // If it contains &, return without brackets so & can be replaced\n return inner.includes(\"&\") ? inner : token;\n }\n\n // foo-[bar] style\n const bracketStart = token.indexOf(\"-[\");\n if (bracketStart > 0 && token.endsWith(\"]\")) {\n const inner = token.slice(bracketStart + 2, -1).replace(/_/g, \"-\");\n return inner.includes(\"&\") ? inner : token.replace(/_/g, \"-\");\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 // Match class attributes robustly by capturing the opening quote and\n // using a backreference to the same quote for the closing boundary.\n // This ensures embedded single quotes (e.g. url('/icons/mask.svg')) do\n // not prematurely terminate the match.\n const classAttrRegex = /class\\s*=\\s*(['\"])(.*?)\\1/g;\n const classList: string[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = classAttrRegex.exec(html))) {\n // Split on whitespace to preserve complex tokens containing colons,\n // brackets, parentheses and quotes (e.g. [mask-image:url('/icons/mask.svg')]).\n const tokens = match[2].split(/\\s+/).filter(Boolean);\n if (tokens.length) 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 if (cached && now - cached.timestamp < JIT_CSS_THROTTLE_MS) return cached.css;\n\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 splitVariants(input: string): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depthSquare = 0;\n let depthParen = 0;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (ch === \"[\") depthSquare++;\n else if (ch === \"]\" && depthSquare > 0) depthSquare--;\n else if (ch === \"(\") depthParen++;\n else if (ch === \")\" && depthParen > 0) depthParen--;\n if (ch === \":\" && depthSquare === 0 && depthParen === 0) {\n out.push(buf);\n buf = \"\";\n } else {\n buf += ch;\n }\n }\n if (buf) out.push(buf);\n return out;\n }\n\n // Map Tailwind pseudo-variant tokens to their CSS pseudo class strings\n function tokenToPseudo(token: string): string | null {\n switch (token) {\n case \"hover\": return \":hover\";\n case \"focus\": return \":focus\";\n case \"active\": return \":active\";\n case \"visited\": return \":visited\";\n case \"disabled\": return \":disabled\";\n case \"checked\": return \":checked\";\n case \"first\": return \":first-child\";\n case \"last\": return \":last-child\";\n case \"odd\": return \":nth-child(odd)\";\n case \"even\": return \":nth-child(even)\";\n case \"focus-within\": return \":focus-within\";\n case \"focus-visible\": return \":focus-visible\";\n default: return null;\n }\n }\n\n function generateRule(cls: string, stripDark = false): string | null {\n const parts = splitVariants(cls);\n\n // DEBUG: log parsing for specific tricky classes during test runs\n if (cls.includes(\"mask-image\") || cls.includes(\"sm: hover\") || cls.includes(\"sm:hover\") || cls.includes(\"mask.svg\")) {\n // eslint-disable-next-line no-console\n console.error(\"DEBUG generateRule:\", cls, parts);\n }\n\n // Find base utility\n let important = false;\n let basePart = parts.find(p => {\n if (p.startsWith(\"!\")) {\n important = true;\n p = p.slice(1);\n }\n return (\n utilityMap[p] ||\n parseSpacing(p) ||\n parseOpacity(p) ||\n parseColorWithOpacity(p) ||\n parseArbitrary(p)\n );\n });\n if (!basePart) return null;\n\n const cleanBase = basePart.replace(/^!/, \"\");\n const baseRule =\n utilityMap[cleanBase] ??\n parseSpacing(cleanBase) ??\n parseOpacity(cleanBase) ??\n parseColorWithOpacity(cleanBase) ??\n parseArbitrary(cleanBase);\n\n if (!baseRule) return null;\n\n const baseIndex = parts.indexOf(basePart);\n let before = baseIndex >= 0 ? parts.slice(0, baseIndex) : [];\n if (stripDark) before = before.filter(t => t !== \"dark\");\n\n const escapedClass = `.${escapeClassName(cls)}`;\n const SUBJECT = \"__SUBJECT__\";\n const body = important ? baseRule.replace(/;$/, \" !important;\") : baseRule;\n\n // Start with a SUBJECT placeholder we will replace later with the real class\n let selector = SUBJECT;\n\n // Handle structural wrappers (group/peer) first (preserve order)\n const structural: string[] = [];\n for (const token of before) {\n if (token.startsWith(\"group-\")) {\n selector = `.group:${token.slice(6)} ${selector}`;\n structural.push(token);\n } else if (token.startsWith(\"peer-\")) {\n selector = selector.replace(SUBJECT, `.peer:${token.slice(5)}~${SUBJECT}`);\n structural.push(token);\n }\n }\n before = before.filter(t => !structural.includes(t));\n\n // Collect pseudos in left-to-right order, but don't mutate SUBJECT yet to preserve order.\n const subjectPseudos: string[] = [];\n const innerPseudos: string[] = [];\n let wrapperVariant: string | null = null;\n\n for (const token of before) {\n if (token === \"dark\" || responsiveOrder.includes(token)) continue;\n\n const variantSelector = parseArbitraryVariant(token);\n if (variantSelector) {\n wrapperVariant = variantSelector;\n continue;\n }\n\n const pseudo = tokenToPseudo(token);\n if (pseudo) {\n if (!wrapperVariant) subjectPseudos.push(pseudo);\n else innerPseudos.push(pseudo);\n continue;\n }\n\n const fn = selectorVariants[token];\n if (typeof fn === \"function\") {\n // apply structural variant immediately\n selector = fn(selector, body).split(\"{\")[0];\n }\n }\n\n // helper: insert inner pseudos into the 'post' part after the first simple selector\n function insertPseudosIntoPost(post: string, pseudos: string): string {\n if (!pseudos) return post;\n let depthSquare = 0;\n let depthParen = 0;\n // If post starts with a combinator, insert pseudos after the first simple selector\n if (post.length && (post[0] === '>' || post[0] === '+' || post[0] === '~' || post[0] === ' ')) {\n // find end of first simple selector after the combinator\n let i = 1;\n // skip initial whitespace\n while (i < post.length && post[i] === ' ') i++;\n for (; i < post.length; i++) {\n const ch = post[i];\n if (ch === '[') depthSquare++;\n else if (ch === ']' && depthSquare > 0) depthSquare--;\n else if (ch === '(') depthParen++;\n else if (ch === ')' && depthParen > 0) depthParen--;\n // stop at next combinator at depth 0\n if (depthSquare === 0 && depthParen === 0 && (post[i] === '>' || post[i] === '+' || post[i] === '~' || post[i] === ' ')) {\n return post.slice(0, i) + pseudos + post.slice(i);\n }\n }\n // reached end: append pseudos at end\n return post + pseudos;\n }\n\n for (let i = 0; i < post.length; i++) {\n const ch = post[i];\n if (ch === \"[\") depthSquare++;\n else if (ch === \"]\" && depthSquare > 0) depthSquare--;\n else if (ch === \"(\") depthParen++;\n else if (ch === \")\" && depthParen > 0) depthParen--;\n // break at first combinator at depth 0 (space, >, +, ~)\n if (depthSquare === 0 && depthParen === 0 && (ch === '>' || ch === '+' || ch === '~' || ch === ' ')) {\n return post.slice(0, i) + pseudos + post.slice(i);\n }\n }\n return post + pseudos;\n }\n\n const subjectPseudoStr = subjectPseudos.join(\"\");\n const innerPseudoStr = innerPseudos.join(\"\");\n\n // Build selector by applying wrapper if present, inserting pseudos in the right spots\n if (wrapperVariant) {\n if (wrapperVariant.includes(\"&\")) {\n const idx = wrapperVariant.indexOf(\"&\");\n const pre = wrapperVariant.slice(0, idx);\n const post = wrapperVariant.slice(idx + 1);\n // place subject with its pseudos where & sits\n const subjectWithPseudos = SUBJECT + subjectPseudoStr;\n // If there are no subject pseudos (nothing attached before the wrapper),\n // inner pseudos should apply to the subject. Otherwise they target the\n // element inside the wrapper (the post), so insert them into the post.\n // Preserve any structural wrappers that were applied earlier by\n // replacing the SUBJECT placeholder in the current selector.\n const currentSelector = selector;\n if (subjectPseudos.length === 0) {\n // attach inner pseudos to the subject\n selector = currentSelector.replace(SUBJECT, pre + subjectWithPseudos + innerPseudoStr + post);\n } else {\n // insert inner pseudos into post after its first simple selector\n const postWithInner = insertPseudosIntoPost(post, innerPseudoStr);\n selector = currentSelector.replace(SUBJECT, pre + subjectWithPseudos + postWithInner);\n }\n } else {\n // prefix-style wrapper like [data-open=true]\n // Insert the wrapper around the existing selector's SUBJECT so structural\n // prefixes remain on the outside.\n const currentSelector = selector;\n selector = currentSelector.replace(SUBJECT, `${wrapperVariant}${SUBJECT + subjectPseudoStr}`);\n if (innerPseudoStr) selector = selector.replace(SUBJECT, `${SUBJECT}${innerPseudoStr}`);\n }\n } else {\n // no wrapper: just attach subject and inner pseudos directly to SUBJECT\n selector = SUBJECT + subjectPseudoStr + innerPseudoStr;\n }\n\n // re-apply any previously applied structural wrappers (they were applied to the placeholder earlier)\n // At this point 'selector' is a string containing SUBJECT (or actual class replacement next).\n // Replace any remaining SUBJECT with escaped class\n selector = selector.replace(new RegExp(SUBJECT, \"g\"), escapedClass);\n\n // Emit final rule\n let rule = `${selector}{${body}}`;\n\n // Wrap in media queries\n const responsiveTokens = before.filter(t => responsiveOrder.includes(t));\n const lastResponsive = responsiveTokens.length\n ? responsiveTokens[responsiveTokens.length - 1]\n : null;\n const hasDark = before.includes(\"dark\");\n\n if (stripDark && lastResponsive) {\n rule = `@media (prefers-color-scheme: dark) and ${mediaVariants[lastResponsive]}{${rule}}`;\n } else if (stripDark) {\n rule = `@media (prefers-color-scheme: dark){${rule}}`;\n } else if (hasDark && lastResponsive) {\n rule = `@media (prefers-color-scheme: dark) and ${mediaVariants[lastResponsive]}{${rule}}`;\n } else if (hasDark) {\n rule = `@media (prefers-color-scheme: dark){${rule}}`;\n } else if (lastResponsive) {\n rule = `@media ${mediaVariants[lastResponsive]}{${rule}}`;\n }\n\n return rule;\n }\n\n // Use safe splitting in the outer loop as well\n for (const cls of seen) {\n const parts = splitVariants(cls);\n const basePart = parts.find(\n p => utilityMap[p] || parseSpacing(p) || parseOpacity(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// Module-level stack for context injection (scoped to render cycle, no global pollution)\nexport const contextStack: any[] = [];\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 // Push context to stack before rendering\n contextStack.push(context);\n\n try {\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 } finally {\n // Always pop context from stack after rendering (ensures cleanup even on errors)\n contextStack.pop();\n }\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\") {\n // If the custom element is not defined yet, define it.\n if (!customElements.get(normalizedTag)) {\n customElements.define(normalizedTag, createElementClass<S, C, P, T>(normalizedTag, finalConfig) as CustomElementConstructor);\n } else {\n // If it is already defined (e.g., re-registration during tests or HMR),\n // update existing instances to use the new config and request a render.\n try {\n document.querySelectorAll(normalizedTag).forEach((el) => {\n try {\n // @ts-ignore - internal API used for hot-swap/update\n if (typeof (el as any)._cfg !== 'undefined') (el as any)._cfg = finalConfig;\n if (typeof (el as any)._render === 'function') (el as any)._render(finalConfig);\n } catch (e) {\n // ignore per-instance errors\n }\n });\n } catch (e) {\n // document may be unavailable in some environments, ignore\n }\n }\n }\n}\n\nexport function createElementClass<\n S extends object,\n C extends object,\n P extends object,\n T extends object = any,\n>(tag: string, 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 // Always read the latest config from the registry so re-registration\n // (HMR / tests) updates future instances.\n this._cfg = (registry.get(tag) as ComponentConfig<S, C, P, T>) || 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 (single canonical event API).\n // Emits a DOM CustomEvent and returns whether it was not defaultPrevented.\n Object.defineProperty(this.context, \"emit\", {\n value: (eventName: string, detail?: any, options?: CustomEventInit) => {\n const ev = new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n ...(options || {})\n });\n // DOM-first: dispatch the event and return whether it was prevented\n this.dispatchEvent(ev);\n return !ev.defaultPrevented;\n },\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n // --- Inject config methods into context ---\n // Expose config functions on the context as callable helpers. Event\n // handling is DOM-first: use standard DOM event listeners or\n // `context.emit` (which dispatches a DOM CustomEvent) to communicate\n // with the host. There is no property-based host-callback dispatch.\n const cfgToUse = (registry.get(tag) as ComponentConfig<S, C, P, T>) || config;\n Object.keys(cfgToUse).forEach((key) => {\n const fn = (cfgToUse as any)[key];\n if (typeof fn === \"function\") {\n // Expose as context method: context.fn(...args) => fn(...args, context)\n (this.context as any)[key] = (...args: any[]) => fn(...args, this.context);\n }\n });\n\n this._applyComputed(cfgToUse);\n\n this._initializing = false;\n\n // Initialize watchers after initialization phase is complete\n this._initWatchers(cfgToUse);\n\n // Initial render (styles are applied within render)\n this._render(cfgToUse);\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\";\nimport { contextStack } from \"./render\";\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 /**\n * Build an event listener wrapper and optional options object from a raw value and modifiers.\n * Returns either a plain function (EventListener) or an object { handler, options } when addEventListener options are needed.\n */\n function buildEventListener(rawVal: any, modifiers: string[], ctx: Record<string, any>) {\n const handler =\n typeof rawVal === \"function\"\n ? rawVal\n : typeof ctx[rawVal] === \"function\"\n ? ctx[rawVal]\n : undefined;\n if (typeof handler !== \"function\") return undefined;\n\n const shouldPrevent = modifiers.includes(\"prevent\");\n const shouldStop = modifiers.includes(\"stop\");\n const shouldStopImmediate =\n modifiers.includes(\"stopImmediate\") || modifiers.includes(\"stopImmediatePropagation\");\n const shouldSelf = modifiers.includes(\"self\");\n const onlyLeft = modifiers.includes(\"left\");\n const onlyMiddle = modifiers.includes(\"middle\");\n const onlyRight = modifiers.includes(\"right\");\n\n // Modifier keys (require these modifier keys to be true)\n const requireCtrl = modifiers.includes(\"ctrl\") || modifiers.includes(\"control\");\n const requireAlt = modifiers.includes(\"alt\") || modifiers.includes(\"option\");\n const requireShift = modifiers.includes(\"shift\");\n const requireMeta = modifiers.includes(\"meta\") || modifiers.includes(\"cmd\") || modifiers.includes(\"command\");\n\n // Key name mapping (short names -> KeyboardEvent.key values)\n const keyMap: Record<string, string> = {\n enter: \"Enter\",\n tab: \"Tab\",\n space: \" \",\n spacebar: \" \",\n esc: \"Escape\",\n escape: \"Escape\",\n del: \"Delete\",\n delete: \"Delete\",\n backspace: \"Backspace\",\n up: \"ArrowUp\",\n down: \"ArrowDown\",\n left: \"ArrowLeft\",\n right: \"ArrowRight\",\n home: \"Home\",\n end: \"End\",\n pageup: \"PageUp\",\n pagedown: \"PageDown\",\n insert: \"Insert\",\n pause: \"Pause\",\n };\n\n // Collect any key name modifiers (e.g., .enter, .esc)\n let keyNameModifiers = modifiers.filter((m) => keyMap[m]);\n // If mouse-button modifiers are present, prefer them and drop conflicting key-name modifiers\n if (onlyLeft || onlyMiddle || onlyRight) {\n keyNameModifiers = keyNameModifiers.filter((m) => m !== 'left' && m !== 'middle' && m !== 'right');\n }\n\n const wrapper: EventListener = function (event: Event) {\n // Mouse button filters\n if (onlyLeft || onlyMiddle || onlyRight) {\n if (event instanceof MouseEvent) {\n if (onlyLeft && event.button !== 0) return;\n if (onlyMiddle && event.button !== 1) return;\n if (onlyRight && event.button !== 2) return;\n }\n }\n\n // Modifier key requirements\n if (requireCtrl && !(event as KeyboardEvent).ctrlKey) return;\n if (requireAlt && !(event as KeyboardEvent).altKey) return;\n if (requireShift && !(event as KeyboardEvent).shiftKey) return;\n if (requireMeta && !(event as KeyboardEvent).metaKey) return;\n\n // Key name filters (e.g., .enter)\n if (keyNameModifiers.length > 0) {\n const evKey = (event as KeyboardEvent).key;\n // If event doesn't have key or doesn't match any required key, bail\n if (!evKey) return;\n const matches = keyNameModifiers.some((km) => keyMap[km] === evKey);\n if (!matches) return;\n }\n\n if (shouldSelf && event.target !== event.currentTarget) return;\n if (shouldPrevent) event.preventDefault();\n if (shouldStop) event.stopPropagation();\n if (shouldStopImmediate) event.stopImmediatePropagation();\n\n // Call handler: if original was interpolation (function) call as-is, otherwise call with ctx as this\n try {\n if (typeof rawVal === \"function\") return (rawVal as Function).call(undefined, event);\n return (handler as Function).call(ctx, event);\n } catch (err) {\n // Swallow errors here to avoid breaking render loop; let user handle errors inside handler\n throw err;\n }\n };\n\n const options: AddEventListenerOptions = {};\n if (modifiers.includes(\"once\")) options.once = true;\n if (modifiers.includes(\"capture\")) options.capture = true;\n if (modifiers.includes(\"passive\")) options.passive = true;\n\n const hasOptions = Object.keys(options).length > 0;\n return hasOptions ? { handler: wrapper, options } : wrapper;\n }\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]) ?? \"\";\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 for booleans, null, numbers\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 // Known directive names\n const knownDirectives = [\"model\", \"bind\", \"show\", \"class\", \"style\"];\n if (prefix === \":\") {\n const [maybeDirective, ...modifierParts] = rawName.split(\".\");\n if (knownDirectives.includes(maybeDirective)) {\n const modifiers = [...modifierParts];\n directives[maybeDirective] = {\n value,\n modifiers,\n };\n } else {\n attrs[rawName] = value;\n }\n } else if (prefix === \"@\") {\n // Map @event to an `on<Event>` prop (DOM-first event listener convention).\n // Support event modifiers: @click.prevent.stop.once.capture.passive.self.left/right/middle\n const parts = rawName.split(\".\");\n const eventName = parts[0];\n const modifiers = parts.slice(1);\n const onName = \"on\" + eventName.charAt(0).toUpperCase() + eventName.slice(1);\n const listener = buildEventListener(value, modifiers, context);\n if (listener !== undefined) props[onName] = listener;\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 // Retrieve current context from stack (transparent injection)\n const injectedContext = contextStack.length > 0 ? contextStack[contextStack.length - 1] : undefined;\n \n // Use injected context if no explicit context provided\n const effectiveContext = context ?? injectedContext;\n\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 const voidElements = new Set([\n 'area','base','br','col','embed','hr','img','input',\n 'link','meta','param','source','track','wbr'\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] === \"/\" || voidElements.has(tagName);\n\n const {\n props: rawProps,\n attrs: rawAttrs,\n directives,\n } = parseProps(match[2] || \"\", values, effectiveContext);\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 // Only attach directives to VNode; normalization/merging is handled in vdom.ts\n if (Object.keys(directives).length > 0) {\n vnodeProps.directives = { ...directives };\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 | (() => any);\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 const loc = getLocation();\n await navigateSSR(loc.path);\n };\n\n const navigateSSR = async (path: string) => {\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 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 navigateSSR(result);\n return;\n }\n if (result === false) return;\n } catch (err) {\n return;\n }\n }\n\n // onEnter guard\n if (matched?.onEnter) {\n try {\n const result = await matched.onEnter(to, from);\n if (typeof result === 'string') {\n await navigateSSR(result);\n return;\n }\n if (result === false) return;\n } catch (err) {\n return;\n }\n }\n\n store.setState(to);\n\n // afterEnter hook\n if (matched?.afterEnter) {\n try {\n matched.afterEnter(to, from);\n } catch (err) {}\n }\n } catch (err) {}\n };\n\n push = async (path: string) => navigateSSR(path);\n replaceFn = async (path: string) => navigateSSR(path);\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\n // Resolve the component (supports cached async loaders)\n try {\n const comp = await router.resolveRouteComponent(match.route);\n\n // String tag (custom element) -> render as VNode\n if (typeof comp === 'string') {\n return { tag: comp, props: {}, children: [] };\n }\n\n // Function component (sync or async) -> call and return its VNode(s)\n if (typeof comp === 'function') {\n const out = comp();\n const resolved = out instanceof Promise ? await out : out;\n // If the function returned a string tag, render that element\n if (typeof resolved === 'string') return { tag: resolved, props: {}, children: [] };\n // Otherwise assume it's a VNode or VNode[] and return it directly\n return resolved as any;\n }\n\n // Unknown component type\n return html`<div>Invalid route component</div>`;\n } catch (err) {\n // Propagate as an invalid route component to show a clear message in the view\n return html`<div>Invalid route component</div>`;\n }\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 class: { type: String, default: '' },\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 ariaCurrent = isExactActive ? `aria-current=\"${ariaCurrentValue}\"` : '';\n // Build class object so JIT CSS can see the literal class names.\n // Include user-provided classes (may be multiple space-separated) and\n // static keys for active/exact-active so a JIT scanner can pick them up.\n const userClassList = (ctx.class || '').split(/\\s+/).filter(Boolean);\n const userClasses: Record<string, boolean> = {};\n for (const c of userClassList) userClasses[c] = true;\n const classObject = {\n ...userClasses,\n // Also include the configurable names (may duplicate the above)\n [activeClass]: isActive,\n [exactActiveClass]: isExactActive,\n };\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=\"${classObject}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n @click=\"navigate\"\n ><slot></slot></button>\n `)\n .otherwise(html`\n <a\n part=\"link\"\n href=\"${to}\"\n :class=\"${classObject}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n @click=\"navigate\"\n ><slot></slot></a>\n `)\n .done()}\n `;\n },\n navigate: (e: MouseEvent, ctx: ComponentContext<{}, RouterLinkComputed, RouterLinkProps, any>) => {\n if (ctx.disabled) {\n e.preventDefault();\n return;\n }\n if (ctx.external && (ctx.tag === 'a' || !ctx.tag)) {\n return;\n }\n e.preventDefault();\n if (ctx.replace) {\n router.replace(ctx.to);\n } else {\n router.push(ctx.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","eventNameFromKey","normalizeListenerEntry","maybe","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","ev","newHandler","newOptions","oldHandler","oldOptions","oldAttrs","newAttrs","createElement","vnode","textNode","anchorVNode","start","end","frag","childNode","patchChildren","parent","oldChildren","newChildren","oldNodes","oldVNodes","oldVNodeByKey","v","oldNodeByKey","usedNodes","nextSibling","markRangeUsed","cur","patchChildrenBetween","oldNodesInRange","oldVNodesInRange","oldVNodeByKeyRange","oldNodeByKeyRange","k","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","insertPseudoBeforeCombinator","sel","pseudo","depthSquare","depthParen","ch","selectorVariants","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","parseOpacity","m","bracketStart","bracketEnd","propMap","cssProp","parseArbitraryVariant","token","inner","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","splitVariants","input","out","buf","tokenToPseudo","important","basePart","p","cleanBase","baseRule","baseIndex","escapedClass","SUBJECT","selector","structural","subjectPseudos","innerPseudos","wrapperVariant","variantSelector","insertPseudosIntoPost","post","pseudos","subjectPseudoStr","innerPseudoStr","pre","subjectWithPseudos","currentSelector","postWithInner","responsiveTokens","lastResponsive","bucketNum","contextStack","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","cfgToUse","args","err","id","createReactive","receiver","self","fullPath","newPath","h","finalKey","isAnchorBlock","isElementVNode","ensureKey","parseProps","buildEventListener","rawVal","ctx","shouldPrevent","shouldStop","shouldStopImmediate","shouldSelf","onlyLeft","onlyMiddle","onlyRight","requireCtrl","requireAlt","requireShift","requireMeta","keyMap","keyNameModifiers","wrapper","evKey","km","attrRegex","prefix","rawName","interpMatch","knownDirectives","maybeDirective","modifierParts","onName","htmlImpl","injectedContext","effectiveContext","textVNode","text","template","tagRegex","stack","currentChildren","currentTag","currentProps","currentKey","nodeIndex","fragmentChildren","mergeIntoCurrentProps","newStyle","newClasses","pushInterpolation","targetChildren","anchorChildren","voidElements","tagName","isClosing","isSelfClosing","rawProps","rawAttrs","vnodeProps","prev","part","interp","cleanedFragments","last","parseQuery","search","matchRoute","routes","route","paramNames","regexPath","regex","params","componentCache","resolveRouteComponent","mod","useRouter","initialUrl","getLocation","store","update","push","replaceFn","back","runBeforeEnter","to","from","matched","navigate","runOnEnter","runAfterEnter","replace","loc","url","query","navigateSSR","matchRouteSSR","initRouter","router","comp","resolved","exact","exactActiveClass","activeClass","ariaCurrentValue","disabled","external","isExactActive","isActive","ariaCurrent","userClassList","userClasses","classObject","isButton","disabledAttr","externalAttr","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"custom-elements-runtime.umd.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 \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\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 * @param node The node to clean up.\n * @param refs The refs to clean up.\n * @returns \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 * @param obj The object to search.\n * @param path The dot-separated path to the property.\n * @returns The value of the nested property, or undefined if not found.\n */\nexport function getNestedValue(obj: any, path: string): any {\n if (typeof path === 'string') {\n return path.split(\".\").reduce((current, key) => current?.[key], obj);\n }\n // If path is an object, handle accordingly or return a default value\n return path;\n}\n\n/**\n * Set nested property value in object using dot notation\n * @param obj \n * @param path \n * @param value \n * @returns \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 * @param value \n * @param modifiers \n * @param props \n * @param attrs \n * @param listeners \n * @param context \n * @param el \n * @returns \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 * Convert a prop key like `onClick` to its DOM event name `click`.\n */\nfunction eventNameFromKey(key: string): string {\n // strip leading 'on' and lowercase remainder\n return key.slice(2).charAt(0).toLowerCase() + key.slice(3);\n}\n\n/**\n * Process :bind directive for attribute/property binding\n * @param value \n * @param props \n * @param attrs \n * @param context \n * @returns \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 // Support both object and string syntax for :bind\n if (typeof value === \"object\" && value !== null) {\n for (const [key, val] of Object.entries(value)) {\n props[key] = val;\n }\n } else if (typeof value === \"string\") {\n try {\n // Try to parse as JSON object\n const bindings = JSON.parse(value);\n if (typeof bindings === \"object\" && bindings !== null) {\n for (const [key, val] of Object.entries(bindings)) {\n props[key] = val;\n }\n return;\n }\n } catch {\n // Fallback: treat as single property binding\n const currentValue = getNestedValue(context, value);\n attrs[value] = currentValue;\n }\n }\n}\n\n/**\n * Process :show directive for conditional display\n * @param value \n * @param attrs \n * @param context \n * @returns \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 * @param value \n * @param attrs \n * @param context \n * @returns \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 .flatMap(([className]) => className.split(/\\s+/).filter(Boolean));\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\n/**\n * Process :style directive for dynamic inline styles\n * @param value \n * @param attrs \n * @param context \n * @returns \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 * @param directives \n * @param context \n * @param el \n * @param vnodeAttrs \n * @returns \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\n/**\n * Assign unique keys to VNodes for efficient rendering\n * @param nodeOrNodes \n * @param baseKey \n * @returns \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 * @param el \n * @param oldProps \n * @param newProps \n * @param context \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 // DOM-first listener: onClick -> click\n const ev = eventNameFromKey(key);\n if (typeof oldVal === \"function\") el.removeEventListener(ev, oldVal);\n el.addEventListener(ev, 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\n/**\n * Create a DOM element from a VNode.\n * @param vnode \n * @param context \n * @param refs \n * @returns \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 // Only allow valid attribute names (string, not object)\n if (typeof key !== 'string' || /\\[object Object\\]/.test(key)) {\n if (typeof window !== 'undefined' && window.console) {\n console.warn('Skipping invalid attribute key:', key, val);\n }\n continue;\n }\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, val);\n }\n }\n\n // Set props and event listeners\n for (const key in mergedProps) {\n const val = mergedProps[key];\n // Only allow valid attribute names (string, not object)\n if (typeof key !== 'string' || /\\[object Object\\]/.test(key)) {\n if (typeof window !== 'undefined' && window.console) {\n console.warn('Skipping invalid prop key:', key, val);\n }\n continue;\n }\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(eventNameFromKey(key), 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 * @param parent \n * @param oldChildren \n * @param newChildren \n * @param context \n * @param refs \n * @returns \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 * @param dom \n * @param oldVNode \n * @param newVNode \n * @param context \n * @param refs \n * @returns \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 * Virtual DOM renderer.\n * @param root The root element to render into.\n * @param vnodeOrArray The virtual node or array of virtual nodes to render.\n * @param context The context to use for rendering.\n * @param refs The refs to use for rendering.\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\n/**\n * Render a VNode to a string.\n * @param vnode The virtual node to render.\n * @returns The rendered HTML string.\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\n // (debug logging via console.error is used above when needed)\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 /* Z-index */\n \"z-0\": \"z-index:0;\",\n \"z-10\": \"z-index:10;\",\n \"z-20\": \"z-index:20;\",\n \"z-30\": \"z-index:30;\",\n \"z-40\": \"z-index:40;\",\n \"z-50\": \"z-index:50;\",\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\nfunction insertPseudoBeforeCombinator(sel: string, pseudo: string): string {\n let depthSquare = 0;\n let depthParen = 0;\n for (let i = 0; i < sel.length; i++) {\n const ch = sel[i];\n if (ch === \"[\") depthSquare++;\n else if (ch === \"]\" && depthSquare > 0) depthSquare--;\n else if (ch === \"(\") depthParen++;\n else if (ch === \")\" && depthParen > 0) depthParen--;\n else if (depthSquare === 0 && depthParen === 0 && (ch === \">\" || ch === \"+\" || ch === \"~\" || ch === \" \")) {\n return sel.slice(0, i) + pseudo + sel.slice(i);\n }\n }\n return sel + pseudo;\n}\n\nexport const selectorVariants: SelectorVariantMap = {\n before: (sel, body) => `${sel}::before{${body}}`,\n after: (sel, body) => `${sel}::after{${body}}`,\n hover: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":hover\")}{${body}}`,\n focus: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":focus\")}{${body}}`,\n active: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":active\")}{${body}}`,\n disabled: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":disabled\")}{${body}}`,\n visited: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":visited\")}{${body}}`,\n checked: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":checked\")}{${body}}`,\n first: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":first-child\")}{${body}}`,\n last: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":last-child\")}{${body}}`,\n odd: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":nth-child(odd)\")}{${body}}`,\n even: (sel, body) => `${insertPseudoBeforeCombinator(sel, \":nth-child(even)\")}{${body}}`,\n \"focus-within\": (sel, body) => `${insertPseudoBeforeCombinator(sel, \":focus-within\")}{${body}}`,\n \"focus-visible\": (sel, body) => `${insertPseudoBeforeCombinator(sel, \":focus-visible\")}{${body}}`,\n\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-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\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 * Parse opacity utility class (e.g., opacity-25)\n * Returns CSS rule string or null if not valid\n */\nexport function parseOpacity(className: string): string | null {\n const match = /^opacity-(\\d{1,3})$/.exec(className);\n if (!match) return null;\n const value = parseInt(match[1], 10);\n if (value < 0 || value > 100) return null;\n return `opacity:${value / 100};`;\n}\n\n/**\n * Arbitrary value parser — supports:\n * - prop-[value]\n */\nexport function parseArbitrary(className: string): string | null {\n // 1) [prop:value] — only when \"prop\" is a valid CSS property name (not a selector)\n if (className.startsWith(\"[\") && className.endsWith(\"]\") && !className.includes(\"-[\")) {\n const inner = className.slice(1, -1).trim();\n\n // prop must be at the very start, and must be a CSS identifier (letters + hyphens)\n const m = inner.match(/^([a-zA-Z][a-zA-Z0-9-]*)\\s*:(.*)$/);\n if (m) {\n const prop = m[1].trim();\n let value = m[2].trim();\n // normalize url('...') to url(\"...\") and whole-value single-quotes to double\n value = value.replace(/url\\('\\s*([^']*?)\\s*'\\)/g, 'url(\"$1\")');\n value = value.replace(/^'([^']*)'$/g, '\"$1\"');\n return `${prop}:${value};`;\n }\n // If it didn't match a property, it's an arbitrary variant selector (e.g. [&>h2:hover]) — not a utility\n return null;\n }\n\n // 2) prop-[value] — arbitrary values for known properties\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\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 // Tailwind-like rotate behavior for arbitrary values\n if (prop === \"rotate\") {\n return `transform:rotate(${value});`;\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 [&...]\n if (token.startsWith(\"[\") && token.endsWith(\"]\")) {\n const inner = token.slice(1, -1);\n // If it contains &, return without brackets so & can be replaced\n return inner.includes(\"&\") ? inner : token;\n }\n\n // foo-[bar] style\n const bracketStart = token.indexOf(\"-[\");\n if (bracketStart > 0 && token.endsWith(\"]\")) {\n const inner = token.slice(bracketStart + 2, -1).replace(/_/g, \"-\");\n return inner.includes(\"&\") ? inner : token.replace(/_/g, \"-\");\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 // Match class attributes robustly by capturing the opening quote and\n // using a backreference to the same quote for the closing boundary.\n // This ensures embedded single quotes (e.g. url('/icons/mask.svg')) do\n // not prematurely terminate the match.\n const classAttrRegex = /class\\s*=\\s*(['\"])(.*?)\\1/g;\n const classList: string[] = [];\n let match: RegExpExecArray | null;\n\n while ((match = classAttrRegex.exec(html))) {\n // Split on whitespace to preserve complex tokens containing colons,\n // brackets, parentheses and quotes (e.g. [mask-image:url('/icons/mask.svg')]).\n const tokens = match[2].split(/\\s+/).filter(Boolean);\n if (tokens.length) 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 if (cached && now - cached.timestamp < JIT_CSS_THROTTLE_MS) return cached.css;\n\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 splitVariants(input: string): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depthSquare = 0;\n let depthParen = 0;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (ch === \"[\") depthSquare++;\n else if (ch === \"]\" && depthSquare > 0) depthSquare--;\n else if (ch === \"(\") depthParen++;\n else if (ch === \")\" && depthParen > 0) depthParen--;\n if (ch === \":\" && depthSquare === 0 && depthParen === 0) {\n out.push(buf);\n buf = \"\";\n } else {\n buf += ch;\n }\n }\n if (buf) out.push(buf);\n return out;\n }\n\n // Map Tailwind pseudo-variant tokens to their CSS pseudo class strings\n function tokenToPseudo(token: string): string | null {\n switch (token) {\n case \"hover\": return \":hover\";\n case \"focus\": return \":focus\";\n case \"active\": return \":active\";\n case \"visited\": return \":visited\";\n case \"disabled\": return \":disabled\";\n case \"checked\": return \":checked\";\n case \"first\": return \":first-child\";\n case \"last\": return \":last-child\";\n case \"odd\": return \":nth-child(odd)\";\n case \"even\": return \":nth-child(even)\";\n case \"focus-within\": return \":focus-within\";\n case \"focus-visible\": return \":focus-visible\";\n default: return null;\n }\n }\n\n function generateRule(cls: string, stripDark = false): string | null {\n const parts = splitVariants(cls);\n\n // DEBUG: log parsing for specific tricky classes during test runs\n if (cls.includes(\"mask-image\") || cls.includes(\"sm: hover\") || cls.includes(\"sm:hover\") || cls.includes(\"mask.svg\")) {\n // eslint-disable-next-line no-console\n console.error(\"DEBUG generateRule:\", cls, parts);\n }\n\n // Find base utility\n let important = false;\n let basePart = parts.find(p => {\n if (p.startsWith(\"!\")) {\n important = true;\n p = p.slice(1);\n }\n return (\n utilityMap[p] ||\n parseSpacing(p) ||\n parseOpacity(p) ||\n parseColorWithOpacity(p) ||\n parseArbitrary(p)\n );\n });\n if (!basePart) return null;\n\n const cleanBase = basePart.replace(/^!/, \"\");\n const baseRule =\n utilityMap[cleanBase] ??\n parseSpacing(cleanBase) ??\n parseOpacity(cleanBase) ??\n parseColorWithOpacity(cleanBase) ??\n parseArbitrary(cleanBase);\n\n if (!baseRule) return null;\n\n const baseIndex = parts.indexOf(basePart);\n let before = baseIndex >= 0 ? parts.slice(0, baseIndex) : [];\n if (stripDark) before = before.filter(t => t !== \"dark\");\n\n const escapedClass = `.${escapeClassName(cls)}`;\n const SUBJECT = \"__SUBJECT__\";\n const body = important ? baseRule.replace(/;$/, \" !important;\") : baseRule;\n\n // Start with a SUBJECT placeholder we will replace later with the real class\n let selector = SUBJECT;\n\n // Handle structural wrappers (group/peer) first (preserve order)\n const structural: string[] = [];\n for (const token of before) {\n if (token.startsWith(\"group-\")) {\n selector = `.group:${token.slice(6)} ${selector}`;\n structural.push(token);\n } else if (token.startsWith(\"peer-\")) {\n selector = selector.replace(SUBJECT, `.peer:${token.slice(5)}~${SUBJECT}`);\n structural.push(token);\n }\n }\n before = before.filter(t => !structural.includes(t));\n\n // Collect pseudos in left-to-right order, but don't mutate SUBJECT yet to preserve order.\n const subjectPseudos: string[] = [];\n const innerPseudos: string[] = [];\n let wrapperVariant: string | null = null;\n\n for (const token of before) {\n if (token === \"dark\" || responsiveOrder.includes(token)) continue;\n\n const variantSelector = parseArbitraryVariant(token);\n if (variantSelector) {\n wrapperVariant = variantSelector;\n continue;\n }\n\n const pseudo = tokenToPseudo(token);\n if (pseudo) {\n if (!wrapperVariant) subjectPseudos.push(pseudo);\n else innerPseudos.push(pseudo);\n continue;\n }\n\n const fn = selectorVariants[token];\n if (typeof fn === \"function\") {\n // apply structural variant immediately\n selector = fn(selector, body).split(\"{\")[0];\n }\n }\n\n // helper: insert inner pseudos into the 'post' part after the first simple selector\n function insertPseudosIntoPost(post: string, pseudos: string): string {\n if (!pseudos) return post;\n let depthSquare = 0;\n let depthParen = 0;\n // If post starts with a combinator, insert pseudos after the first simple selector\n if (post.length && (post[0] === '>' || post[0] === '+' || post[0] === '~' || post[0] === ' ')) {\n // find end of first simple selector after the combinator\n let i = 1;\n // skip initial whitespace\n while (i < post.length && post[i] === ' ') i++;\n for (; i < post.length; i++) {\n const ch = post[i];\n if (ch === '[') depthSquare++;\n else if (ch === ']' && depthSquare > 0) depthSquare--;\n else if (ch === '(') depthParen++;\n else if (ch === ')' && depthParen > 0) depthParen--;\n // stop at next combinator at depth 0\n if (depthSquare === 0 && depthParen === 0 && (post[i] === '>' || post[i] === '+' || post[i] === '~' || post[i] === ' ')) {\n return post.slice(0, i) + pseudos + post.slice(i);\n }\n }\n // reached end: append pseudos at end\n return post + pseudos;\n }\n\n for (let i = 0; i < post.length; i++) {\n const ch = post[i];\n if (ch === \"[\") depthSquare++;\n else if (ch === \"]\" && depthSquare > 0) depthSquare--;\n else if (ch === \"(\") depthParen++;\n else if (ch === \")\" && depthParen > 0) depthParen--;\n // break at first combinator at depth 0 (space, >, +, ~)\n if (depthSquare === 0 && depthParen === 0 && (ch === '>' || ch === '+' || ch === '~' || ch === ' ')) {\n return post.slice(0, i) + pseudos + post.slice(i);\n }\n }\n return post + pseudos;\n }\n\n const subjectPseudoStr = subjectPseudos.join(\"\");\n const innerPseudoStr = innerPseudos.join(\"\");\n\n // Build selector by applying wrapper if present, inserting pseudos in the right spots\n if (wrapperVariant) {\n if (wrapperVariant.includes(\"&\")) {\n const idx = wrapperVariant.indexOf(\"&\");\n const pre = wrapperVariant.slice(0, idx);\n const post = wrapperVariant.slice(idx + 1);\n // place subject with its pseudos where & sits\n const subjectWithPseudos = SUBJECT + subjectPseudoStr;\n // If there are no subject pseudos (nothing attached before the wrapper),\n // inner pseudos should apply to the subject. Otherwise they target the\n // element inside the wrapper (the post), so insert them into the post.\n // Preserve any structural wrappers that were applied earlier by\n // replacing the SUBJECT placeholder in the current selector.\n const currentSelector = selector;\n if (subjectPseudos.length === 0) {\n // attach inner pseudos to the subject\n selector = currentSelector.replace(SUBJECT, pre + subjectWithPseudos + innerPseudoStr + post);\n } else {\n // insert inner pseudos into post after its first simple selector\n const postWithInner = insertPseudosIntoPost(post, innerPseudoStr);\n selector = currentSelector.replace(SUBJECT, pre + subjectWithPseudos + postWithInner);\n }\n } else {\n // prefix-style wrapper like [data-open=true]\n // Insert the wrapper around the existing selector's SUBJECT so structural\n // prefixes remain on the outside.\n const currentSelector = selector;\n selector = currentSelector.replace(SUBJECT, `${wrapperVariant}${SUBJECT + subjectPseudoStr}`);\n if (innerPseudoStr) selector = selector.replace(SUBJECT, `${SUBJECT}${innerPseudoStr}`);\n }\n } else {\n // no wrapper: just attach subject and inner pseudos directly to SUBJECT\n selector = SUBJECT + subjectPseudoStr + innerPseudoStr;\n }\n\n // re-apply any previously applied structural wrappers (they were applied to the placeholder earlier)\n // At this point 'selector' is a string containing SUBJECT (or actual class replacement next).\n // Replace any remaining SUBJECT with escaped class\n selector = selector.replace(new RegExp(SUBJECT, \"g\"), escapedClass);\n\n // Emit final rule\n let rule = `${selector}{${body}}`;\n\n // Wrap in media queries\n const responsiveTokens = before.filter(t => responsiveOrder.includes(t));\n const lastResponsive = responsiveTokens.length\n ? responsiveTokens[responsiveTokens.length - 1]\n : null;\n const hasDark = before.includes(\"dark\");\n\n if (stripDark && lastResponsive) {\n rule = `@media (prefers-color-scheme: dark) and ${mediaVariants[lastResponsive]}{${rule}}`;\n } else if (stripDark) {\n rule = `@media (prefers-color-scheme: dark){${rule}}`;\n } else if (hasDark && lastResponsive) {\n rule = `@media (prefers-color-scheme: dark) and ${mediaVariants[lastResponsive]}{${rule}}`;\n } else if (hasDark) {\n rule = `@media (prefers-color-scheme: dark){${rule}}`;\n } else if (lastResponsive) {\n rule = `@media ${mediaVariants[lastResponsive]}{${rule}}`;\n }\n\n return rule;\n }\n\n // Use safe splitting in the outer loop as well\n for (const cls of seen) {\n const parts = splitVariants(cls);\n const basePart = parts.find(\n p => utilityMap[p] || parseSpacing(p) || parseOpacity(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// Module-level stack for context injection (scoped to render cycle, no global pollution)\nexport const contextStack: any[] = [];\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 // Push context to stack before rendering\n contextStack.push(context);\n\n try {\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 } finally {\n // Always pop context from stack after rendering (ensures cleanup even on errors)\n contextStack.pop();\n }\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 // Developer-time warning: detect when component authors use keys that\n // collide with runtime-injected context helpers (refs, error, etc.).\n // This is a non-fatal console warning to help avoid confusing TS errors\n // and runtime shadowing.\n try {\n const RESERVED_KEYS = new Set([\n \"refs\",\n \"requestRender\",\n \"error\",\n \"hasError\",\n \"isLoading\",\n \"emit\",\n ]);\n\n const collisions: string[] = [];\n if (finalConfig.state && typeof finalConfig.state === \"object\") {\n Object.keys(finalConfig.state).forEach((k) => {\n if (RESERVED_KEYS.has(k)) collisions.push(k);\n });\n }\n if (finalConfig.props && typeof finalConfig.props === \"object\") {\n Object.keys(finalConfig.props).forEach((k) => {\n if (RESERVED_KEYS.has(k)) collisions.push(k);\n });\n }\n if (finalConfig.computed && typeof finalConfig.computed === \"object\") {\n Object.keys(finalConfig.computed).forEach((k) => {\n if (RESERVED_KEYS.has(k)) collisions.push(k);\n });\n }\n if (collisions.length > 0) {\n const unique = Array.from(new Set(collisions));\n console.warn(\n `[${normalizedTag}] Reserved runtime context keys used in component config: ${unique.join(\", \")}. ` +\n `These names are provided by the runtime (for example: refs, error, emit). ` +\n `Rename your state/prop/computed keys (e.g. 'error' -> 'errorMessage') to avoid collisions and TypeScript type conflicts.`\n );\n }\n } catch (e) {\n // swallow any check-time errors; this is purely a dev convenience\n }\n\n registry.set(normalizedTag, finalConfig);\n if (typeof window !== \"undefined\") {\n // If the custom element is not defined yet, define it.\n if (!customElements.get(normalizedTag)) {\n customElements.define(normalizedTag, createElementClass<S, C, P, T>(normalizedTag, finalConfig) as CustomElementConstructor);\n } else {\n // If it is already defined (e.g., re-registration during tests or HMR),\n // update existing instances to use the new config and request a render.\n try {\n document.querySelectorAll(normalizedTag).forEach((el) => {\n try {\n // @ts-ignore - internal API used for hot-swap/update\n if (typeof (el as any)._cfg !== 'undefined') (el as any)._cfg = finalConfig;\n if (typeof (el as any)._render === 'function') (el as any)._render(finalConfig);\n } catch (e) {\n // ignore per-instance errors\n }\n });\n } catch (e) {\n // document may be unavailable in some environments, ignore\n }\n }\n }\n}\n\nexport function createElementClass<\n S extends object,\n C extends object,\n P extends object,\n T extends object = any,\n>(tag: string, 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 // Always read the latest config from the registry so re-registration\n // (HMR / tests) updates future instances.\n this._cfg = (registry.get(tag) as ComponentConfig<S, C, P, T>) || 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 (single canonical event API).\n // Emits a DOM CustomEvent and returns whether it was not defaultPrevented.\n Object.defineProperty(this.context, \"emit\", {\n value: (eventName: string, detail?: any, options?: CustomEventInit) => {\n const ev = new CustomEvent(eventName, {\n detail,\n bubbles: true,\n composed: true,\n ...(options || {})\n });\n // DOM-first: dispatch the event and return whether it was prevented\n this.dispatchEvent(ev);\n return !ev.defaultPrevented;\n },\n writable: false,\n enumerable: false,\n configurable: false,\n });\n\n // --- Inject config methods into context ---\n // Expose config functions on the context as callable helpers. Event\n // handling is DOM-first: use standard DOM event listeners or\n // `context.emit` (which dispatches a DOM CustomEvent) to communicate\n // with the host. There is no property-based host-callback dispatch.\n const cfgToUse = (registry.get(tag) as ComponentConfig<S, C, P, T>) || config;\n Object.keys(cfgToUse).forEach((key) => {\n const fn = (cfgToUse as any)[key];\n if (typeof fn === \"function\") {\n // Expose as context method: context.fn(...args) => fn(...args, context)\n (this.context as any)[key] = (...args: any[]) => fn(...args, this.context);\n }\n });\n\n this._applyComputed(cfgToUse);\n\n this._initializing = false;\n\n // Initialize watchers after initialization phase is complete\n this._initWatchers(cfgToUse);\n\n // Initial render (styles are applied within render)\n this._render(cfgToUse);\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, T>) {\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, T>) {\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, T>,\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, T>): 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, T>): 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, T>): 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\";\nimport { contextStack } from \"./render\";\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]) ?? \"\";\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 for booleans, null, numbers\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 // Known directive names\n const knownDirectives = [\"model\", \"bind\", \"show\", \"class\", \"style\"];\n if (prefix === \":\") {\n const [maybeDirective, ...modifierParts] = rawName.split(\".\");\n if (knownDirectives.includes(maybeDirective)) {\n const modifiers = [...modifierParts];\n directives[maybeDirective] = {\n value,\n modifiers,\n };\n } else {\n attrs[rawName] = value;\n }\n } else if (prefix === \"@\") {\n // Map @event to an `on<Event>` prop (DOM-first event listener convention)\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 (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 // Retrieve current context from stack (transparent injection)\n const injectedContext = contextStack.length > 0 ? contextStack[contextStack.length - 1] : undefined;\n \n // Use injected context if no explicit context provided\n const effectiveContext = context ?? injectedContext;\n\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 const voidElements = new Set([\n 'area','base','br','col','embed','hr','img','input',\n 'link','meta','param','source','track','wbr'\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] === \"/\" || voidElements.has(tagName);\n\n const {\n props: rawProps,\n attrs: rawAttrs,\n directives,\n } = parseProps(match[2] || \"\", values, effectiveContext);\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 // Only attach directives to VNode; normalization/merging is handled in vdom.ts\n if (Object.keys(directives).length > 0) {\n vnodeProps.directives = { ...directives };\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 * 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 | (() => any);\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 class?: string;\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 const loc = getLocation();\n await navigateSSR(loc.path);\n };\n\n const navigateSSR = async (path: string) => {\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 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 navigateSSR(result);\n return;\n }\n if (result === false) return;\n } catch (err) {\n return;\n }\n }\n\n // onEnter guard\n if (matched?.onEnter) {\n try {\n const result = await matched.onEnter(to, from);\n if (typeof result === 'string') {\n await navigateSSR(result);\n return;\n }\n if (result === false) return;\n } catch (err) {\n return;\n }\n }\n\n store.setState(to);\n\n // afterEnter hook\n if (matched?.afterEnter) {\n try {\n matched.afterEnter(to, from);\n } catch (err) {}\n }\n } catch (err) {}\n };\n\n push = async (path: string) => navigateSSR(path);\n replaceFn = async (path: string) => navigateSSR(path);\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\n // Resolve the component (supports cached async loaders)\n try {\n const comp = await router.resolveRouteComponent(match.route);\n\n // String tag (custom element) -> render as VNode\n if (typeof comp === 'string') {\n return { tag: comp, props: {}, children: [] };\n }\n\n // Function component (sync or async) -> call and return its VNode(s)\n if (typeof comp === 'function') {\n const out = comp();\n const resolved = out instanceof Promise ? await out : out;\n // If the function returned a string tag, render that element\n if (typeof resolved === 'string') return { tag: resolved, props: {}, children: [] };\n // Otherwise assume it's a VNode or VNode[] and return it directly\n return resolved as any;\n }\n\n // Unknown component type\n return html`<div>Invalid route component</div>`;\n } catch (err) {\n // Propagate as an invalid route component to show a clear message in the view\n return html`<div>Invalid route component</div>`;\n }\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 class: { type: String, default: '' },\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 ariaCurrent = isExactActive ? `aria-current=\"${ariaCurrentValue}\"` : '';\n // Build class object so JIT CSS can see the literal class names.\n // Include user-provided classes (may be multiple space-separated) and\n // static keys for active/exact-active so a JIT scanner can pick them up.\n const userClassList = (ctx.class || '').split(/\\s+/).filter(Boolean);\n const userClasses: Record<string, boolean> = {};\n for (const c of userClassList) userClasses[c] = true;\n const classObject = {\n ...userClasses,\n // Also include the configurable names (may duplicate the above)\n [activeClass]: isActive,\n [exactActiveClass]: isExactActive,\n };\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=\"${classObject}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n @click=\"navigate\"\n ><slot></slot></button>\n `)\n .otherwise(html`\n <a\n part=\"link\"\n href=\"${to}\"\n :class=\"${classObject}\"\n ${ariaCurrent}\n ${disabledAttr}\n ${externalAttr}\n @click=\"navigate\"\n ><slot></slot></a>\n `)\n .done()}\n `;\n },\n navigate: (e: MouseEvent, ctx: ComponentContext<{}, RouterLinkComputed, RouterLinkProps, any>) => {\n if (ctx.disabled) {\n e.preventDefault();\n return;\n }\n if (ctx.external && (ctx.tag === 'a' || !ctx.tag)) {\n return;\n }\n e.preventDefault();\n if (ctx.replace) {\n router.replace(ctx.to);\n } else {\n router.push(ctx.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","eventNameFromKey","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","ev","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","insertPseudoBeforeCombinator","sel","pseudo","depthSquare","depthParen","ch","selectorVariants","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","parseOpacity","m","bracketStart","bracketEnd","propMap","cssProp","parseArbitraryVariant","token","inner","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","splitVariants","input","out","buf","tokenToPseudo","important","basePart","p","cleanBase","baseRule","baseIndex","escapedClass","SUBJECT","selector","structural","subjectPseudos","innerPseudos","wrapperVariant","variantSelector","insertPseudosIntoPost","post","pseudos","subjectPseudoStr","innerPseudoStr","pre","subjectWithPseudos","currentSelector","postWithInner","responsiveTokens","lastResponsive","bucketNum","contextStack","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","RESERVED_KEYS","collisions","unique","createElementClass","reactiveContext","detail","cfgToUse","args","err","id","createReactive","receiver","self","fullPath","newPath","h","finalKey","isAnchorBlock","isElementVNode","ensureKey","parseProps","attrRegex","prefix","rawName","rawVal","interpMatch","knownDirectives","maybeDirective","modifierParts","onName","htmlImpl","injectedContext","effectiveContext","textVNode","text","template","tagRegex","stack","currentChildren","currentTag","currentProps","currentKey","nodeIndex","fragmentChildren","mergeIntoCurrentProps","maybe","newStyle","newClasses","pushInterpolation","targetChildren","anchorChildren","voidElements","tagName","isClosing","isSelfClosing","rawProps","rawAttrs","vnodeProps","prev","part","interp","cleanedFragments","last","parseQuery","search","matchRoute","routes","route","paramNames","regexPath","regex","params","componentCache","resolveRouteComponent","mod","useRouter","initialUrl","getLocation","store","update","push","replaceFn","back","runBeforeEnter","to","from","matched","navigate","runOnEnter","runAfterEnter","replace","loc","url","query","navigateSSR","matchRouteSSR","initRouter","router","comp","resolved","ctx","exact","exactActiveClass","activeClass","ariaCurrentValue","disabled","external","isExactActive","isActive","ariaCurrent","userClassList","userClasses","classObject","isButton","disabledAttr","externalAttr","e"],"mappings":"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"}
|