@jasonshimmy/custom-elements-runtime 0.0.9-beta.4 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"custom-elements-runtime.cjs.js","sources":["../src/lib/store.ts","../src/lib/event-bus.ts","../src/lib/ssr.ts","../src/lib/template-helpers.ts","../src/lib/data-binding.ts","../src/lib/template-compiler.ts","../src/lib/v-dom.ts","../src/lib/router.ts","../src/lib/computed-state.ts","../src/lib/runtime.ts"],"sourcesContent":["\n// Usage example\n// import { Store } from './lib/store';\n\n// export const globalState = Store({ theme: 'light', count: 0 });\n\n// // In a component\n// globalState.subscribe((state) => {\n// console.log('Global changed:', state.count);\n// });\n\n// src/lib/store.ts\ntype Listener<T> = (state: T) => void;\n\nexport function Store<T extends object>(initial: T) {\n let state = new Proxy(initial, {\n set: (target, prop, value) => {\n (target as any)[prop] = value;\n notify();\n return true;\n }\n });\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // Initial call\n }\n\n function getState(): T {\n return state;\n }\n\n function notify() {\n listeners.forEach((fn) => fn(state));\n }\n\n return { subscribe, getState };\n}\n","\n/**\n * Event handler type for global event bus\n */\nexport type EventHandler<T = any> = (data: T) => void;\n\n/**\n * Event map type using Set for efficient handler management\n */\ntype EventMap = { [eventName: string]: Set<EventHandler> };\n\n\n/**\n * GlobalEventBus provides a singleton event bus for cross-component communication.\n * Uses Set for handler storage to optimize add/remove operations and prevent duplicates.\n */\nexport class GlobalEventBus extends EventTarget {\n private handlers: EventMap = {};\n private static instance: GlobalEventBus;\n private eventCounters: Map<string, { count: number; window: number }> = new Map();\n\n\n /**\n * Returns the singleton instance of GlobalEventBus\n */\n static getInstance(): GlobalEventBus {\n if (!GlobalEventBus.instance) {\n GlobalEventBus.instance = new GlobalEventBus();\n }\n return GlobalEventBus.instance;\n }\n\n // Enhanced emit method with better typing and event storm protection\n /**\n * Emit a global event with optional data. Includes event storm protection.\n * @param eventName - Name of the event\n * @param data - Optional event payload\n */\n emit<T = any>(eventName: string, data?: T): void {\n // Event storm protection\n const now = Date.now();\n const counter = this.eventCounters.get(eventName);\n \n if (!counter || now - counter.window > 1000) {\n // Reset counter every second\n this.eventCounters.set(eventName, { count: 1, window: now });\n } else {\n counter.count++;\n \n if (counter.count > 50) {\n // Too many events of the same type in one second\n console.error(`Event storm detected for \"${eventName}\": ${counter.count} events in 1 second. Throttling...`);\n \n // Throttle this event type for a short period\n if (counter.count > 100) {\n console.warn(`Blocking further \"${eventName}\" events to prevent infinite loop`);\n return;\n }\n }\n }\n\n // Use native CustomEvent for better browser integration\n this.dispatchEvent(new CustomEvent(eventName, { \n detail: data,\n bubbles: false, // Global events don't need to bubble\n cancelable: true \n }));\n\n // Also trigger registered handlers\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in global event handler for \"${eventName}\":`, error);\n }\n });\n }\n }\n\n\n /**\n * Register a handler for a global event. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n on<T = any>(eventName: string, handler: EventHandler<T>): () => void {\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = new Set();\n }\n this.handlers[eventName].add(handler);\n return () => this.off(eventName, handler);\n }\n\n\n /**\n * Remove a specific handler for a global event.\n * @param eventName - Name of the event\n * @param handler - Handler function to remove\n */\n off<T = any>(eventName: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.delete(handler);\n }\n }\n\n\n /**\n * Remove all handlers for a specific event.\n * @param eventName - Name of the event\n */\n offAll(eventName: string): void {\n delete this.handlers[eventName];\n }\n\n\n /**\n * Listen for a native CustomEvent. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - CustomEvent handler\n * @param options - AddEventListener options\n */\n listen<T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions): () => void {\n this.addEventListener(eventName, handler as EventListener, options);\n return () => this.removeEventListener(eventName, handler as EventListener);\n }\n\n\n /**\n * Register a one-time event handler. Returns a promise that resolves with the event data.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n once<T = any>(eventName: string, handler: EventHandler<T>): Promise<T> {\n return new Promise((resolve) => {\n const unsubscribe = this.on(eventName, (data: T) => {\n unsubscribe();\n handler(data);\n resolve(data);\n });\n });\n }\n\n\n /**\n * Get a list of all active event names with registered handlers.\n */\n getActiveEvents(): string[] {\n return Object.keys(this.handlers).filter(eventName => \n this.handlers[eventName] && this.handlers[eventName].size > 0\n );\n }\n\n\n /**\n * Clear all event handlers (useful for testing or cleanup).\n */\n clear(): void {\n this.handlers = {};\n // Note: This doesn't clear native event listeners, use removeAllListeners if needed\n }\n\n\n /**\n * Get the number of handlers registered for a specific event.\n * @param eventName - Name of the event\n */\n getHandlerCount(eventName: string): number {\n return this.handlers[eventName]?.size || 0;\n }\n\n\n /**\n * Get event statistics for debugging.\n */\n getEventStats(): Record<string, { count: number; handlersCount: number }> {\n const stats: Record<string, { count: number; handlersCount: number }> = {};\n for (const [eventName, counter] of this.eventCounters.entries()) {\n stats[eventName] = {\n count: counter.count,\n handlersCount: this.getHandlerCount(eventName)\n };\n }\n return stats;\n }\n\n\n /**\n * Reset event counters (useful for testing or after resolving issues).\n */\n resetEventCounters(): void {\n this.eventCounters.clear();\n }\n}\n\n\n/**\n * Singleton instance of the global event bus\n */\nexport const eventBus = GlobalEventBus.getInstance();\n\n/**\n * Emit a global event\n */\nexport const emit = <T = any>(eventName: string, data?: T) => eventBus.emit(eventName, data);\n\n/**\n * Register a handler for a global event\n */\nexport const on = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.on(eventName, handler);\n\n/**\n * Remove a handler for a global event\n */\nexport const off = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.off(eventName, handler);\n\n/**\n * Register a one-time handler for a global event\n */\nexport const once = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.once(eventName, handler);\n\n/**\n * Listen for a native CustomEvent\n */\nexport const listen = <T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions) => \n eventBus.listen(eventName, handler, options);\n","import type { ComponentAPI, ComponentState } from './runtime';\n\n// ============================================================================\n// SSR TYPES & INTERFACES\n// ============================================================================\n\nexport interface SSRComponentConfig<T extends ComponentState = ComponentState> {\n readonly tag: string;\n readonly template: (state: T, api: ComponentAPI<T>) => string;\n /**\n * State object can include computed properties as getter functions that accept state as a parameter.\n */\n readonly state: T;\n readonly style?: string | ((state: T) => string);\n readonly attrs?: Record<string, string>;\n}\n\nexport interface SSRRenderOptions {\n /** Include component styles in the output */\n includeStyles?: boolean;\n /** Pretty print the HTML output */\n prettyPrint?: boolean;\n /** Custom attribute sanitization function */\n sanitizeAttributes?: (attrs: Record<string, string>) => Record<string, string>;\n}\n\nexport interface SSRContext {\n /** Track rendered components for hydration */\n components: Map<string, SSRComponentConfig>;\n /** Global styles collected during SSR */\n styles: Set<string>;\n}\n\n// Environment detection for treeshaking\nconst isServer = typeof window === 'undefined' || typeof document === 'undefined';\n\n// ============================================================================\n// SSR IMPLEMENTATION (Treeshakable)\n// ============================================================================\n\n/**\n * Create a minimal API for SSR that doesn't rely on DOM\n */\nexport function createSSRAPI<T extends ComponentState>(state: T): ComponentAPI<T> {\n return {\n state,\n emit: () => {}, // No-op on server\n onGlobal: () => () => {},\n offGlobal: () => {},\n emitGlobal: () => {},\n render: () => {}\n };\n}\n\n/**\n * Render a component to HTML string on the server\n * This function is treeshakable - only included when imported\n */\nexport function renderToString<T extends ComponentState>(\n config: SSRComponentConfig<T>,\n options: SSRRenderOptions = {}\n): string {\n if (!isServer) {\n console.warn('[SSR] renderToString should only be used on the server');\n }\n\n try {\n // Use state directly (getters will be available)\n const state = config.state;\n\n // Create API and render template\n const api = createSSRAPI(state);\n const innerHTML = config.template(state, api);\n \n // Generate component styles if needed\n let styleContent = '';\n if (options.includeStyles && config.style) {\n const css = typeof config.style === 'function' \n ? config.style(state) \n : config.style;\n styleContent = `<style>${css}</style>`;\n }\n\n // Sanitize attributes\n const attrs = options.sanitizeAttributes \n ? options.sanitizeAttributes(config.attrs || {})\n : config.attrs || {};\n\n // Build attribute string\n const attrString = Object.entries(attrs)\n .map(([key, value]) => `${escapeAttribute(key)}=\"${escapeAttribute(value)}\"`)\n .join(' ');\n\n // Construct final HTML\n const openTag = attrString \n ? `<${config.tag} ${attrString}>` \n : `<${config.tag}>`;\n \n const html = `${openTag}${styleContent}${innerHTML}</${config.tag}>`;\n\n return options.prettyPrint ? formatHTML(html) : html;\n \n } catch (error) {\n console.error(`[SSR] Error rendering ${config.tag}:`, error);\n return `<${config.tag}><div style=\"color: red;\">SSR Error: ${escapeHTML(String(error))}</div></${config.tag}>`;\n }\n}\n\n/**\n * Render multiple components to HTML with shared context\n */\nexport function renderComponentsToString(\n components: SSRComponentConfig<any>[],\n options: SSRRenderOptions = {}\n): { html: string; styles: string; context: SSRContext } {\n const context: SSRContext = {\n components: new Map(),\n styles: new Set(),\n };\n\n const htmlParts: string[] = [];\n \n components.forEach(config => {\n // Track component for hydration\n context.components.set(config.tag, config);\n \n // Collect styles\n if (config.style) {\n const css = typeof config.style === 'function' \n ? config.style(config.state) \n : config.style;\n context.styles.add(css);\n }\n \n // Render component\n const html = renderToString(config, { ...options, includeStyles: false });\n htmlParts.push(html);\n });\n\n const styles = Array.from(context.styles).join('\\n');\n const html = htmlParts.join('\\n');\n\n return { html, styles, context };\n}\n\n/**\n * Generate hydration script for client-side takeover\n */\nexport function generateHydrationScript(context: SSRContext): string {\n const componentConfigs = Array.from(context.components.entries()).map(([tag, config]) => ({\n tag,\n state: config.state,\n }));\n\n return `\n<script type=\"module\">\n // Hydration data from SSR\n window.__SSR_CONTEXT__ = ${JSON.stringify({ components: componentConfigs })};\n \n // Auto-hydrate when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', hydrate);\n } else {\n hydrate();\n }\n \n function hydrate() {\n const context = window.__SSR_CONTEXT__;\n if (!context?.components) return;\n \n context.components.forEach(({ tag, state }) => {\n const elements = document.querySelectorAll(tag);\n elements.forEach(el => {\n // Mark as hydrated to prevent re-initialization\n if (!el.hasAttribute('data-hydrated')) {\n el.setAttribute('data-hydrated', 'true');\n // Restore state if component supports it\n if (el._hydrateWithState) {\n el._hydrateWithState(state);\n }\n }\n });\n });\n \n // Clean up\n delete window.__SSR_CONTEXT__;\n }\n</script>`.trim();\n}\n\n// ============================================================================\n// SSR UTILITIES\n// ============================================================================\n\nexport const escapeHTML = (str: string): string => {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nexport const escapeAttribute = (str: string): string => {\n return str\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nexport const formatHTML = (html: string): string => {\n // Simple HTML formatting for development\n return html\n .replace(/></g, '>\\n<')\n .split('\\n')\n .map(line => {\n const depth = (line.match(/^<[^\\/]/g) || []).length - (line.match(/<\\//g) || []).length;\n return ' '.repeat(Math.max(0, depth)) + line.trim();\n })\n .join('\\n');\n}\n","import type { CompiledTemplate } from './template-compiler.js';\n\n/**\n * TemplateResult type for template helpers\n */\nexport type TemplateResult = string | CompiledTemplate | ((state?: any) => string);\n\n/**\n * Escape HTML entities for safe rendering of user-generated content.\n */\nfunction escapeHTML(str: string): string {\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n// Escapes any string value that matches a property in state or computed properties\nfunction escapeIfUserInput(value: unknown, state: any): string {\n if (typeof value !== 'string' || !state) return String(value);\n // Check direct state properties\n for (const key in state) {\n if (typeof state[key] === 'string' && value === state[key]) {\n return escapeHTML(value);\n }\n // For arrays of objects (e.g., todos), check each object's string properties\n if (Array.isArray(state[key])) {\n for (const item of state[key]) {\n if (item && typeof item === 'object') {\n for (const prop in item) {\n if (typeof item[prop] === 'string' && value === item[prop]) {\n return escapeHTML(value);\n }\n }\n }\n }\n }\n }\n return String(value);\n}\n\n/**\n * Tagged template literal for HTML strings.\n * Returns a pure function for rendering with state and api.\n * @param strings - Template strings\n * @param values - Dynamic values (functions or primitives)\n */\nexport function html(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): (state?: any, api?: any) => string | Promise<string> {\n function flatten(val: any, state?: any, api?: any): any {\n if (Array.isArray(val)) {\n const flat = val.map(v => flatten(v, state, api));\n return flat.some(v => v instanceof Promise)\n ? Promise.all(flat).then(arr => arr.join(''))\n : flat.join('');\n }\n if (typeof val === 'function') {\n const res = flatten(val(state, api), state, api);\n return res instanceof Promise ? res : res;\n }\n if (val === null || val === undefined) return '';\n return val instanceof Promise ? val : String(val);\n }\n return (state?: any, api?: any) => {\n let result = '';\n let hasAsync = false;\n const valuePromises: Promise<any>[] = [];\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n let value = values[i];\n const prevStatic = strings[i];\n const isEventHandlerAttr = /data-on-[a-z]+=\"?$/.test(prevStatic);\n value = flatten(value, state, api);\n if (value instanceof Promise) {\n hasAsync = true;\n valuePromises.push(value);\n } else {\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string' && !isEventHandlerAttr) {\n // Attribute value: escape both double and single quotes\n value = value.replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n result += value;\n } else if (!isEventHandlerAttr && !/=\\s*\"?$/.test(prevStatic)) {\n // Text node: always escape user input\n result += escapeIfUserInput(value, state);\n } else {\n result += value;\n }\n }\n }\n }\n if (!hasAsync) return result;\n // If any value is a Promise, resolve all and reconstruct\n return Promise.all(valuePromises).then(resolvedValues => {\n let asyncResult = '';\n let asyncIndex = 0;\n for (let i = 0; i < strings.length; i++) {\n asyncResult += strings[i];\n if (i < values.length) {\n let value = values[i];\n const prevStatic = strings[i];\n const isEventHandlerAttr = /data-on-[a-z]+=\"?$/.test(prevStatic);\n value = flatten(value, state, api);\n if (value instanceof Promise) {\n asyncResult += resolvedValues[asyncIndex++];\n } else {\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string' && !isEventHandlerAttr) {\n value = value.replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n asyncResult += value;\n } else if (!isEventHandlerAttr && !/=\\s*\"?$/.test(prevStatic)) {\n asyncResult += escapeIfUserInput(value, state);\n } else {\n asyncResult += value;\n }\n }\n }\n }\n return asyncResult;\n });\n };\n}\n\n/**\n * CompiledTemplateFn type for compiled templates\n */\nexport interface CompiledTemplateFn {\n (state: any, api?: any): string;\n id: string;\n}\n\n/**\n * compile helper: returns a compiled template function with a unique id property.\n * Accepts tagged template literals and dynamic values (functions or primitives).\n * @param strings - Template strings\n * @param values - Dynamic values\n */\nexport function compile(strings: TemplateStringsArray, ...values: any[]): CompiledTemplateFn {\n const id = 'compiled-' + Math.random().toString(36).slice(2);\n function flatten(val: any, state?: any, api?: any): string {\n if (Array.isArray(val)) return val.map(v => flatten(v, state, api)).join('');\n if (typeof val === 'function') return flatten(val(state, api), state, api);\n if (val == null) return '';\n return String(val);\n }\n const fn = (state: any, api?: any) => {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n let value = values[i];\n const prevStatic = strings[i];\n const isEventHandlerAttr = /data-on-[a-z]+=\"?$/.test(prevStatic);\n value = flatten(value, state, api);\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string' && !isEventHandlerAttr) {\n value = value.replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n result += value;\n } else if (!isEventHandlerAttr && !/=\\s*\"?$/.test(prevStatic)) {\n result += escapeIfUserInput(value, state);\n } else {\n result += value ?? '';\n }\n }\n }\n return result;\n };\n (fn as CompiledTemplateFn).id = id;\n return fn as CompiledTemplateFn;\n}\n\n/**\n * Tagged template literal for CSS strings.\n * Returns a pure string for use in style blocks.\n * @param strings - Template strings\n * @param values - Dynamic values\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 * Helper for conditional classes. Returns a space-separated string of class names.\n * @param obj - Object with class names as keys and boolean conditions as values\n */\nexport function classes(obj: Record<string, boolean>): string {\n return Object.keys(obj).filter(className => obj[className]).join(' ');\n}\n\n/**\n * Helper for inline styles. Returns a CSS string for use in style attributes.\n * @param obj - Object with style properties and values\n */\nexport function styles(obj: Record<string, string | number>): string {\n return Object.entries(obj)\n .map(([prop, value]) => `${prop}: ${value}`)\n .join('; ');\n}\n","/**\n * Minimal controlled input binding helper for data-model attributes.\n * Handles checkboxes, radios, text, and modifiers (trim, number).\n * @param el - Input/select/textarea element\n * @param stateObj - State object to bind\n * @param keyWithModifiers - Key and optional modifiers (e.g. 'name|trim|number')\n */\nexport function useDataModel<T extends Record<string, unknown>>(el: Element, stateObj: T, keyWithModifiers: string) {\n const [rawKey, ...modifiers] = keyWithModifiers.split('|').map(s => s.trim());\n if (!rawKey || rawKey === '__proto__' || rawKey === 'constructor' || rawKey === 'prototype') return;\n // Helper to set nested state (dot notation)\n function setNestedState(obj: any, path: string, value: unknown) {\n const keys = path.split('.');\n let target = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n if (!(keys[i] in target)) target[keys[i]] = {};\n target = target[keys[i]];\n }\n target[keys[keys.length - 1]] = value;\n }\n const updateState = (e: Event) => {\n let value: unknown;\n if (el instanceof HTMLInputElement && el.type === 'checkbox') {\n value = el.value;\n const trueValue = el.getAttribute('data-true-value');\n const falseValue = el.getAttribute('data-false-value');\n let arr = Array.isArray(stateObj[rawKey]) ? (stateObj[rawKey] as unknown[]) : undefined;\n if (arr) {\n if (el.checked) {\n if (!arr.includes(value)) arr.push(value);\n } else {\n const idx = arr.indexOf(value);\n if (idx !== -1) arr.splice(idx, 1);\n }\n setNestedState(stateObj, rawKey, [...arr]);\n } else {\n if (trueValue !== null || falseValue !== null) {\n if (el.checked) {\n setNestedState(stateObj, rawKey, trueValue);\n } else {\n setNestedState(stateObj, rawKey, falseValue !== null ? falseValue : false);\n }\n } else {\n setNestedState(stateObj, rawKey, el.checked);\n }\n }\n } else if (el instanceof HTMLInputElement && el.type === 'radio') {\n value = el.value;\n setNestedState(stateObj, rawKey, value);\n const radios = (el.form || el.closest('form') || el.getRootNode()) instanceof Element\n ? ((el.form || el.closest('form') || el.getRootNode()) as Element).querySelectorAll(`input[type=\"radio\"][name=\"${el.name}\"][data-model=\"${keyWithModifiers}\"]`)\n : [];\n radios.forEach((radio: Element) => {\n (radio as HTMLInputElement).checked = (radio as HTMLInputElement).value === String(value);\n });\n } else {\n // Always read value from event target for input events\n // Always read value from the input element itself for robustness\n value = (el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n if (el instanceof HTMLInputElement && el.type === 'number') {\n value = Number(value);\n }\n if (modifiers.includes('trim') && typeof value === 'string') {\n value = value.trim();\n }\n if (modifiers.includes('number')) {\n value = Number(value);\n }\n setNestedState(stateObj, rawKey, value);\n }\n if ('_vnode' in el && typeof (el as any)._vnode === 'object' && (el as any)._vnode?.props) {\n (el as any)._vnode.props.value = value;\n }\n if (e.type === 'input') {\n (el as { _isDirty?: boolean })._isDirty = true;\n }\n if (e.type === 'keydown' && (e as KeyboardEvent).key === 'Enter') {\n (el as { _isDirty?: boolean })._isDirty = false;\n if (el instanceof HTMLElement && el.isConnected) {\n let parent = el.parentElement;\n while (parent && !(parent instanceof HTMLElement && parent.shadowRoot)) {\n parent = parent.parentElement;\n }\n if (parent && typeof parent === 'object' && parent !== null && 'render' in parent && typeof (parent as any).render === 'function') {\n (parent as HTMLElement & { render: () => void }).render();\n }\n }\n }\n if (e.type === 'blur') {\n (el as { _isDirty?: boolean })._isDirty = false;\n }\n };\n el.addEventListener('input', updateState);\n el.addEventListener('change', updateState);\n el.addEventListener('keydown', updateState);\n el.addEventListener('blur', updateState);\n}","/**\n * Template Compiler for Custom Elements Runtime\n * \n * Provides compile-time template optimization for better runtime performance.\n * Features:\n * - Static/dynamic separation\n * - Efficient DOM updates\n * - Treeshakable\n * - TypeScript-friendly\n * - Development-friendly fallbacks\n */\n\n// ============================================================================\n// CORE TYPES\n// ============================================================================\n\nexport interface CompiledTemplate<T = any> {\n /** Static HTML parts that never change */\n readonly statics: readonly string[];\n /** Dynamic update functions for each interpolation */\n readonly dynamics: readonly UpdateFunction<T>[];\n /** Pre-compiled DOM fragment for initial render */\n readonly fragment: DocumentFragment | null;\n /** Unique template ID for caching */\n readonly id: string;\n /** Whether this template has dynamic content */\n readonly hasDynamics: boolean;\n /** Render method supporting async output */\n render: (state: T, api: any) => string | Promise<string>;\n}\n\nexport interface UpdateFunction<T = any> {\n /** Target node path from root (e.g., [0, 1] means first child's second child) */\n readonly path: readonly number[];\n /** Type of update (text, attribute, property, etc.) */\n readonly type: UpdateType;\n /** Target property/attribute name (for non-text updates) */\n readonly target?: string;\n /** Function to extract value from state */\n readonly getValue: (state: T, api: any) => unknown;\n}\n\nexport type UpdateType = 'text' | 'attribute' | 'property' | 'event' | 'class' | 'style';\n\nexport interface TemplateCompilerOptions {\n /** Enable development mode with better error messages */\n development?: boolean;\n /** Cache compiled templates */\n cache?: boolean;\n /** Enable static analysis optimizations */\n optimize?: boolean;\n}\n\n// Global development mode detection\nconst isDevelopment = (() => {\n try {\n // @ts-ignore - Check for Node.js environment\n if (typeof process !== 'undefined' && process.env) {\n // @ts-ignore\n return process.env.NODE_ENV === 'development';\n }\n } catch {\n // Ignore Node.js check in browser\n }\n if (typeof window !== 'undefined') {\n return window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';\n }\n return false;\n})();\n\n// ============================================================================\n// TEMPLATE COMPILATION\n// ============================================================================\n\n/**\n * Compile a template string into an optimized template object\n * This is meant to be used at build time for best performance\n */\nexport function compileTemplate<T = any>(\n templateString: string,\n options: TemplateCompilerOptions = {}\n): CompiledTemplate<T> {\n const { development = isDevelopment, cache = true, optimize = true } = options;\n \n // Generate unique ID for caching\n const id = generateTemplateId(templateString);\n \n // Check cache first\n if (cache && templateCache.has(id)) {\n // Track cache hit\n if (development) {\n const metrics = performanceMetrics.get(id) || {\n compilationTime: 0,\n renderTime: 0,\n updateTime: 0,\n cacheHits: 0,\n cacheMisses: 0\n };\n metrics.cacheHits++;\n performanceMetrics.set(id, metrics);\n }\n return templateCache.get(id)!;\n }\n \n // Track cache miss\n if (development) {\n const metrics = performanceMetrics.get(id) || {\n compilationTime: 0,\n renderTime: 0,\n updateTime: 0,\n cacheHits: 0,\n cacheMisses: 0\n };\n metrics.cacheMisses++;\n performanceMetrics.set(id, metrics);\n }\n \n try {\n const compiled = parseAndCompileTemplate<T>(templateString, { development, optimize });\n \n if (cache) {\n templateCache.set(id, compiled);\n }\n \n return compiled;\n } catch (error) {\n if (development) {\n console.error('[Template Compiler] Error compiling template:', error);\n console.error('[Template Compiler] Template:', templateString);\n }\n \n // Fallback: always return original template string as static content\n return {\n statics: [templateString],\n dynamics: [],\n fragment: null,\n id,\n hasDynamics: false,\n render: () => templateString\n };\n }\n}\n\n/**\n * Tagged template literal for compile-time optimization\n * Usage: compile`<div>${state.name}</div>`\n */\n/**\n * Find the DOM path to a placeholder in the template HTML\n */\nexport function findDOMPath(templateHTML: string, placeholder: string): number[] {\n // Create a temporary DOM to analyze the structure\n if (typeof document === 'undefined') {\n return [0]; // Fallback for server-side\n }\n \n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<div>${templateHTML}</div>`, 'text/html');\n const container = doc.body.firstElementChild!;\n \n // Find the element or text node containing the placeholder\n function findPlaceholderPath(node: Node, currentPath: number[] = []): number[] | null {\n if (node.nodeType === Node.TEXT_NODE) {\n if (node.textContent?.includes(placeholder)) {\n return currentPath;\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n // Check child nodes, but use a more robust indexing that accounts for the actual DOM structure\n let childIndex = 0;\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n const result = findPlaceholderPath(child, [...currentPath, childIndex]);\n if (result) {\n return result;\n }\n childIndex++;\n }\n }\n return null;\n }\n \n const path = findPlaceholderPath(container);\n return path || [0];\n } catch (error) {\n if (isDevelopment) {\n console.warn('[Template Compiler] Error finding DOM path for placeholder:', placeholder, error);\n }\n return [0]; // Safe fallback\n }\n}\n\nexport function compile<T = any>(\n strings: TemplateStringsArray,\n ...expressions: Array<(state: T, api: any) => unknown>\n): CompiledTemplate<T> {\n // Create statics array directly from strings\n const statics: string[] = Array.from(strings);\n const templateHTML = strings.map((str, i) => str + (i < expressions.length ? `__DYNAMIC_${i}__` : '')).join('');\n const dynamics: UpdateFunction<T>[] = expressions.map((expr, index) => {\n // Analyze the dynamic expression to determine type and target\n let updateType: UpdateType = 'text';\n let target: string | undefined;\n let valueGetter: (state: T, api: any) => unknown = expr;\n let exprString = expr.toString();\n let prop = exprString.match(/state\\.([a-zA-Z0-9_$]+)/)?.[1];\n // Parse template HTML to detect attribute context for this dynamic\n const dynMarker = `__DYNAMIC_${index}__`;\n if (prop) {\n const prevStatic = strings[index];\n if (/class\\s*=/.test(prevStatic)) {\n updateType = 'class';\n target = 'class';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/style\\s*=/.test(prevStatic) && /[a-zA-Z-]+:\\s*$/.test(prevStatic)) {\n const stylePropMatch = prevStatic.match(/([a-zA-Z-]+):\\s*$/);\n const styleProp = stylePropMatch ? stylePropMatch[1] : 'style';\n updateType = 'style';\n target = styleProp;\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/value\\s*=/.test(prevStatic)) {\n updateType = 'property';\n target = 'value';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/title\\s*=/.test(prevStatic)) {\n updateType = 'attribute';\n target = 'title';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/style=\"([a-zA-Z-]+):$/.test(prevStatic)) {\n const stylePropMatch = prevStatic.match(/style=\"([a-zA-Z-]+):$/);\n const styleProp = stylePropMatch ? stylePropMatch[1] : 'style';\n updateType = 'style';\n target = styleProp;\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (prevStatic.endsWith('style=\"color:')) {\n updateType = 'style';\n target = 'color';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else {\n // Fallback to attribute\n updateType = 'attribute';\n target = prop;\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n }\n } else {\n // Fallback to previous logic for text, event, class.prop, style.prop\n if (exprString.includes('class.') && exprString.match(/class\\.([a-zA-Z0-9_$]+)/)) {\n updateType = 'class';\n target = exprString.match(/class\\.([a-zA-Z0-9_$]+)/)?.[1];\n valueGetter = (state: T) => (state as any)[target!];\n } else if (exprString.includes('style.') && exprString.match(/style\\.([a-zA-Z0-9_$]+)/)) {\n updateType = 'style';\n target = exprString.match(/style\\.([a-zA-Z0-9_$]+)/)?.[1];\n valueGetter = (state: T) => (state as any)[target!];\n } else if (exprString.includes('@')) {\n updateType = 'event';\n target = exprString.split('@')[1];\n }\n }\n const path = findDOMPath(templateHTML, dynMarker);\n return {\n path,\n type: updateType,\n target,\n getValue: valueGetter\n };\n });\n const templateString = strings.join('{{PLACEHOLDER}}');\n const id = generateTemplateId(templateString);\n const render = (state: T, api: any): string | Promise<string> => {\n let result = '';\n let hasAsync = false;\n const valuePromises: Promise<any>[] = [];\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < expressions.length) {\n let value = expressions[i](state, api);\n if (value instanceof Promise) {\n hasAsync = true;\n valuePromises.push(value);\n } else {\n // Escape double quotes if previous static ends with attribute=\n const prevStatic = strings[i];\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string') {\n value = value.replace(/\"/g, '&quot;');\n }\n result += value;\n }\n }\n }\n if (!hasAsync) return result;\n return Promise.all(valuePromises).then(resolvedValues => {\n let asyncResult = '';\n let asyncIndex = 0;\n for (let i = 0; i < strings.length; i++) {\n asyncResult += strings[i];\n if (i < expressions.length) {\n let value = expressions[i](state, api);\n if (value instanceof Promise) {\n value = resolvedValues[asyncIndex++];\n }\n // Escape double quotes if previous static ends with attribute=\n const prevStatic = strings[i];\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string') {\n value = value.replace(/\"/g, '&quot;');\n }\n asyncResult += value;\n }\n }\n return asyncResult;\n });\n };\n return {\n id,\n statics,\n dynamics,\n hasDynamics: dynamics.length > 0,\n fragment: null,\n render\n };\n}\n\n// ============================================================================\n// TEMPLATE PARSING & ANALYSIS\n// ============================================================================\n\nexport function parseAndCompileTemplate<T>(\n template: string,\n options: { development: boolean; optimize: boolean }\n): CompiledTemplate<T> {\n const parser = new TemplateAnalyzer(template, options);\n return parser.compile<T>();\n}\n\nexport class TemplateAnalyzer {\n private readonly template: string;\n private readonly options: { development: boolean; optimize: boolean };\n private readonly dynamics: UpdateFunction<any>[] = [];\n private statics: string[] = [];\n \n constructor(template: string, options: { development: boolean; optimize: boolean }) {\n this.template = template;\n this.options = options;\n }\n \n compile<T>(): CompiledTemplate<T> {\n // Parse template for dynamic expressions\n this.parseTemplate();\n \n // Create static fragment if possible\n const fragment = this.createStaticFragment();\n \n // Generate unique ID\n const id = generateTemplateId(this.template);\n \n // Render method for static/dynamic templates\n const render = (state: T, api: any): string | Promise<string> => {\n let result = '';\n for (let i = 0; i < this.statics.length; i++) {\n result += this.statics[i];\n if (i < this.dynamics.length) {\n let value = this.dynamics[i].getValue(state, api);\n if (value instanceof Promise) {\n // If any dynamic value is async, resolve all and reconstruct\n return Promise.all(this.dynamics.map(d => {\n const v = d.getValue(state, api);\n return v instanceof Promise ? v : Promise.resolve(v);\n })).then(resolvedValues => {\n let asyncResult = '';\n for (let j = 0; j < this.statics.length; j++) {\n asyncResult += this.statics[j];\n if (j < resolvedValues.length) asyncResult += resolvedValues[j];\n }\n return asyncResult;\n });\n }\n result += value;\n }\n }\n return result;\n };\n return {\n statics: this.statics,\n dynamics: this.dynamics as UpdateFunction<T>[],\n fragment,\n id,\n hasDynamics: this.dynamics.length > 0,\n render\n };\n }\n \n private parseTemplate(): void {\n // Improved regex-based parsing for dynamic expressions\n // Ensures statics never contain {{...}} placeholders\n const dynamicRegex = /\\{\\{([^}]+)\\}\\}/g;\n let lastIndex = 0;\n let match;\n while ((match = dynamicRegex.exec(this.template)) !== null) {\n // Add static part before this match, excluding any {{...}}\n const staticPart = this.template.slice(lastIndex, match.index);\n this.statics.push(staticPart);\n // Try to detect attribute/property/class/style name from staticPart\n let attrMatch = staticPart.match(/([a-zA-Z0-9_-]+)\\s*=\\s*\"?$/);\n let attrName = attrMatch ? attrMatch[1] : undefined;\n let styleProp: string | undefined;\n // Special handling for style=\"color:{{value}}\"\n if (staticPart.endsWith('style=\"color:')) {\n attrName = 'style';\n styleProp = 'color';\n } else if (attrName === 'style') {\n // Try to extract style property name from staticPart\n const styleMatch = staticPart.match(/style\\s*=\\s*\"?([^:;]+):\\s*$/);\n if (styleMatch) {\n styleProp = styleMatch[1].trim();\n }\n }\n // Analyze the dynamic expression\n const expression = match[1].trim();\n this.analyzeDynamicExpression(expression, this.dynamics.length, attrName, styleProp);\n lastIndex = match.index + match[0].length;\n }\n // Add final static part, ensuring no trailing {{...}}\n const finalStatic = this.template.slice(lastIndex);\n this.statics.push(finalStatic);\n }\n \n private analyzeDynamicExpression(expression: string, _index: number, attrName?: string, styleProp?: string): void {\n // Simple expression analysis\n let updateType: UpdateType = 'text';\n let target: string | undefined;\n\n // Detect class/style/attribute/property updates\n if (attrName) {\n if (attrName === 'class') {\n updateType = 'class';\n target = 'class';\n } else if (attrName === 'style') {\n updateType = 'style';\n target = styleProp || 'style';\n } else if (attrName === 'value') {\n updateType = 'property';\n target = 'value';\n } else {\n updateType = 'attribute';\n target = attrName;\n }\n } else if (expression.includes('class.')) {\n updateType = 'class';\n target = expression.split('.')[1];\n } else if (expression.includes('style.')) {\n updateType = 'style';\n target = expression.split('.')[1];\n } else if (expression.includes('@')) {\n updateType = 'event';\n target = expression.split('@')[1];\n } else if (expression === 'class') {\n updateType = 'class';\n target = 'class';\n } else if (expression === 'style') {\n updateType = 'style';\n target = 'style';\n } else if (expression === 'value') {\n updateType = 'property';\n target = 'value';\n } else if (expression === 'title') {\n updateType = 'attribute';\n target = 'title';\n }\n\n // Use findDOMPath to locate the correct node for this dynamic expression\n const marker = `__DYNAMIC_${_index}__`;\n const templateHTML = this.statics.join(marker);\n let path = findDOMPath(templateHTML, marker);\n // If template is a single root element, use [0] as path for non-text updates\n if (this.statics.length === 2 && (updateType !== 'text')) {\n path = [0];\n } else if (this.statics.length === 2 && path.length === 0) {\n path = [0];\n }\n this.dynamics.push({\n path,\n type: updateType,\n target,\n getValue: this.createValueGetter(expression)\n });\n }\n private createValueGetter(expression: string): (state: any, api: any) => unknown {\n // Always evaluate at render time, never cache\n return (state: any, _api: any) => {\n try {\n let value;\n // Always use the dynamic expression for state lookup\n if (expression && typeof expression === 'function') {\n value = (expression as (s: any) => any)(state);\n } else if (typeof expression === 'string' && expression.startsWith('state.')) {\n const prop = expression.slice(6);\n value = state[prop];\n } else if (typeof expression === 'string' && /^[a-zA-Z0-9_$]+$/.test(expression)) {\n value = state[expression];\n } else if (typeof expression === 'string' && expression.includes('(')) {\n value = '';\n } else {\n value = '';\n }\n return value;\n } catch (error) {\n if (this.options.development) {\n console.warn(`[Template Compiler] Error evaluating expression: ${expression}`, error);\n }\n return '';\n }\n };\n }\n \n private createStaticFragment(): DocumentFragment | null {\n // Skip fragment creation on server\n if (typeof document === 'undefined') {\n return null;\n }\n \n try {\n // Create a static version by removing dynamic parts\n const staticHTML = this.statics.join('');\n \n if (!staticHTML.trim()) {\n return null;\n }\n \n const parser = new DOMParser();\n const doc = parser.parseFromString(staticHTML, 'text/html');\n const fragment = document.createDocumentFragment();\n \n while (doc.body.firstChild) {\n fragment.appendChild(doc.body.firstChild);\n }\n \n return fragment;\n } catch (error) {\n if (this.options.development) {\n console.warn('[Template Compiler] Could not create static fragment:', error);\n }\n return null;\n }\n }\n}\n\n// Utility function for both initial render and updates\nfunction getNodeByPath(root: Element | DocumentFragment, path: readonly number[]): Node | null {\n try {\n if (path.length === 1 && path[0] === 0 && root instanceof Element) {\n return root;\n }\n let current: Node = root;\n for (let i = 0; i < path.length; i++) {\n const index = path[i];\n if (!current.childNodes || current.childNodes.length <= index) {\n return null;\n }\n current = current.childNodes[index];\n }\n return current;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// OPTIMIZED RENDERER\n// ============================================================================\n\n/**\n * Render a compiled template efficiently\n */\nexport function renderCompiledTemplate<T>(\n compiled: CompiledTemplate<T>,\n state: T,\n api: any\n): DocumentFragment {\n // Use pre-compiled fragment if available\n let fragment: DocumentFragment;\n \n if (compiled.fragment && !compiled.hasDynamics) {\n // Pure static template - just clone\n fragment = compiled.fragment.cloneNode(true) as DocumentFragment;\n } else {\n // Dynamic template - reconstruct with current values\n fragment = reconstructTemplate(compiled, state, api);\n }\n \n return fragment;\n}\n\n/**\n * Update a rendered template with new state efficiently\n */\nexport function updateCompiledTemplate<T>(\n compiled: CompiledTemplate<T>,\n element: Element,\n newState: T,\n api: any,\n oldState?: T\n): void {\n if (!compiled.hasDynamics) {\n return; // Nothing to update in static templates\n }\n // Apply each dynamic update\n for (const update of compiled.dynamics) {\n try {\n const newValue = update.getValue(newState, api);\n if (oldState !== undefined) {\n const oldValue = update.getValue(oldState, api);\n if (oldValue === newValue) {\n continue;\n }\n }\n applyUpdate(element, update, newValue);\n } catch (error) {\n console.warn('[Template Compiler] Error applying update:', error);\n }\n }\n}\n\nfunction reconstructTemplate<T>(\n compiled: CompiledTemplate<T>,\n state: T,\n api: any\n): DocumentFragment {\n // Reconstruct HTML from statics and dynamics\n let html = '';\n \n for (let i = 0; i < compiled.statics.length; i++) {\n html += compiled.statics[i];\n if (i < compiled.dynamics.length) {\n const update = compiled.dynamics[i];\n if (update.type === 'text' || update.type === 'attribute') {\n const value = update.getValue(state, api);\n html += String(value ?? '');\n } else if (update.type === 'property' || update.type === 'class' || update.type === 'style') {\n html += '';\n }\n }\n }\n \n // Parse the reconstructed HTML\n if (typeof document === 'undefined') {\n // Server-side fallback - return empty fragment\n return new DocumentFragment();\n }\n \n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const fragment = document.createDocumentFragment();\n \n while (doc.body.firstChild) {\n fragment.appendChild(doc.body.firstChild);\n }\n\n // Apply initial dynamic values to fragment\n for (const update of compiled.dynamics) {\n const value = update.getValue(state, api);\n const targetNode = getNodeByPath(fragment, update.path) as Element;\n applyUpdate(targetNode, update, value);\n }\n\n return fragment;\n}\n\nfunction applyUpdate(element: Element, update: UpdateFunction, value: unknown): void {\n try {\n if (update.type === 'text') {\n // Use TreeWalker to find and update text nodes containing 'Count: '\n const walker = document.createTreeWalker(\n element,\n NodeFilter.SHOW_TEXT\n );\n let found = false;\n let node;\n while (node = walker.nextNode()) {\n const textContent = node.textContent || '';\n if (textContent.includes('Count: ')) {\n // Replace the number after 'Count: '\n const newText = textContent.replace(/Count: \\d+/, `Count: ${value}`);\n node.textContent = newText;\n found = true;\n }\n }\n if (found) return;\n // Fallback to path-based update for general text nodes\n const targetNode = getNodeByPath(element, update.path);\n if (targetNode && targetNode.nodeType === Node.TEXT_NODE) {\n targetNode.textContent = value == null ? '' : String(value);\n }\n return;\n }\n // Fallback to path-based updates for other types\n const targetNode = getNodeByPath(element, update.path);\n if (!targetNode) {\n return;\n }\n switch (update.type) {\n case 'attribute':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n const el = targetNode as Element;\n if (value == null || value === '') {\n el.removeAttribute(update.target);\n } else {\n el.setAttribute(update.target, String(value));\n }\n }\n break;\n case 'property':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n (targetNode as any)[update.target] = value == null ? '' : value;\n (targetNode as Element).setAttribute(update.target, value == null ? '' : String(value));\n }\n break;\n case 'class':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n const el = targetNode as Element;\n el.className = value == null ? '' : String(value);\n el.setAttribute('class', value == null ? '' : String(value));\n }\n break;\n case 'style':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n const el = targetNode as HTMLElement;\n el.style[update.target as any] = value == null ? '' : String(value);\n el.setAttribute('style', value == null ? `${update.target}:` : `${update.target}:${value}`);\n }\n break;\n default:\n throw new Error(`Unknown update type: ${update.type}`);\n }\n } catch (error) {\n if (typeof globalThis !== 'undefined' ? (globalThis as any)['isDevelopment'] : isDevelopment) {\n console.warn('[Template Compiler] Error applying update:', update, error);\n }\n // Silently fail in production to prevent crashes\n }\n}\n\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nconst templateCache = new Map<string, CompiledTemplate<any>>();\n\n// Performance tracking for production monitoring\ninterface PerformanceMetrics {\n compilationTime: number;\n renderTime: number;\n updateTime: number;\n cacheHits: number;\n cacheMisses: number;\n}\n\nconst performanceMetrics = new Map<string, PerformanceMetrics>();\n\nfunction generateTemplateId(template: string): string {\n // Simple hash function for template IDs\n let hash = 0;\n for (let i = 0; i < template.length; i++) {\n const char = template.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return `tpl_${Math.abs(hash).toString(36)}`;\n}\n\n// ============================================================================\n// DEVELOPMENT UTILITIES\n// ============================================================================\n\n/**\n * Development helper to analyze template performance\n */\nexport function analyzeTemplate(template: string): {\n staticParts: number;\n dynamicParts: number;\n complexity: 'low' | 'medium' | 'high';\n recommendations: string[];\n} {\n const compiled = compileTemplate(template, { development: true });\n \n const dynamicCount = compiled.dynamics.length;\n const staticCount = compiled.statics.length;\n \n let complexity: 'low' | 'medium' | 'high' = 'low';\n if (dynamicCount > 10) complexity = 'high';\n else if (dynamicCount > 5) complexity = 'medium';\n \n const recommendations: string[] = [];\n \n if (dynamicCount === 0) {\n recommendations.push('Consider using a static string instead of a template');\n }\n \n if (dynamicCount > 10) {\n recommendations.push('Consider breaking this template into smaller components');\n }\n \n if (!compiled.fragment) {\n recommendations.push('Template could benefit from static fragment optimization');\n }\n \n return {\n staticParts: staticCount,\n dynamicParts: dynamicCount,\n complexity,\n recommendations\n };\n}\n\n/**\n * Clear template cache for development/testing\n */\nexport function clearTemplateCache(): void {\n templateCache.clear();\n performanceMetrics.clear();\n}\n\n/**\n * Get performance metrics for development monitoring\n */\nexport function getPerformanceMetrics(): Map<string, PerformanceMetrics> {\n return new Map(performanceMetrics);\n}\n\n/**\n * Get cache statistics\n */\nexport function getCacheStats(): { size: number; entries: string[] } {\n return {\n size: templateCache.size,\n entries: Array.from(templateCache.keys())\n };\n}\n\n","/**\n * Utility: Generate a stable key for a VNode\n */\nexport function getVNodeKey(type: string, parentPath: string, childIndex: number, model?: string, value?: string): string {\n // Always include parentPath and childIndex for uniqueness\n if (model && value) return `${parentPath}.${type}[${childIndex}]:${model}:${value}`;\n if (model) return `${parentPath}.${type}[${childIndex}]:${model}`;\n return `${parentPath}.${type}[${childIndex}]`;\n}\n\n/**\n * Virtual Node (VNode) structure for incremental migration\n */\nexport interface VNode {\n type: string; // tag name or '#text'\n key?: string;\n props: Record<string, any>;\n children: VNode[];\n dom?: Element | Text;\n}\n\n/**\n * Safely replaces a child node, guarding against NotFoundError and out-of-sync trees.\n * Falls back to appendChild if oldChild is not present.\n * Logs mutation for debugging if enabled.\n * @param parent - Parent node\n * @param newChild - New node to insert\n * @param oldChild - Old node to replace\n */\nexport function safeReplaceChild(parent: Node | null, newChild: Node, oldChild: Node): void {\n if (!parent || !(parent instanceof Element)) {\n return;\n }\n if (parent.contains(oldChild) && oldChild.parentNode === parent) {\n try {\n parent.replaceChild(newChild, oldChild);\n } catch (err) {\n console.error('[VDOM] safeReplaceChild: error replacing child', err, {\n parent,\n newChild,\n oldChild,\n parentHTML: (parent as Element).outerHTML,\n newChildHTML: (newChild as Element).outerHTML,\n oldChildHTML: (oldChild as Element).outerHTML\n });\n }\n }\n}\n\n/**\n * Mounts a VNode to the DOM and returns the created node.\n * Handles text, fragment, and element nodes.\n * @param vnode - Virtual node to mount\n * @returns DOM node or null\n */\nexport function mountVNode(vnode: VNode): Element | Text | null {\n if (vnode.type === '#whitespace') {\n return null;\n }\n if (vnode.type === '#text') {\n const textNode = document.createTextNode(vnode.props.nodeValue ?? '');\n vnode.dom = textNode;\n return textNode;\n }\n const el = document.createElement(vnode.type);\n for (const [k, v] of Object.entries(vnode.props)) {\n if (k === 'value' && el instanceof HTMLInputElement) {\n if (el.type === 'radio') {\n // Always set value attribute for radios, never assign to property\n el.setAttribute('value', v as string);\n } else if (el.type === 'checkbox') {\n // Always set value property and attribute for checkboxes\n el.value = v as string;\n el.setAttribute('value', v as string);\n } else {\n el.value = v as string;\n el.setAttribute('value', v as string);\n }\n } else {\n el.setAttribute(k, v as string);\n }\n }\n vnode.dom = el;\n for (const child of vnode.children) {\n const childNode = mountVNode(child);\n if (childNode) el.appendChild(childNode);\n }\n return el;\n}\n\n/**\n * Parses an HTML string into a VNode tree.\n * Supports basic tags, attributes, text, and key/data-model.\n * @param html - HTML string\n * @returns VNode tree\n */\nexport function parseVNodeFromHTML(html: string): VNode {\n const template = document.createElement('template');\n template.innerHTML = html.trim();\n const nodes = Array.from(template.content.childNodes);\n // If only one root node, return as before\n if (nodes.length === 1) {\n const vnode = createVNodeFromElement(nodes[0]);\n return vnode;\n }\n // If multiple root nodes, create a fragment VNode\n const fragmentVNode = {\n type: '#fragment',\n key: undefined,\n props: {},\n children: nodes.map((node, idx) => createVNodeFromElement(node, '#fragment', idx)),\n dom: undefined\n };\n return fragmentVNode;\n}\n\n/**\n * Creates a VNode from a DOM ChildNode (Element or Text).\n * Assigns a stable, deterministic key for VDOM reconciliation.\n * @param node - DOM node\n * @param parentPath - Path for key generation\n * @param childIndex - Index for key generation\n * @returns VNode\n */\nexport function createVNodeFromElement(node: ChildNode, parentPath: string = '', childIndex: number = 0): VNode {\n if (!node) {\n // Guard: skip undefined/null nodes\n return { type: '#unknown', key: undefined, props: {}, children: [], dom: undefined };\n }\n if (node.nodeType === Node.TEXT_NODE) {\n // Ignore pure whitespace text nodes\n if (!node.nodeValue || /^\\s*$/.test(node.nodeValue)) {\n return { type: '#whitespace', key: undefined, props: {}, children: [], dom: undefined };\n }\n return { type: '#text', key: getVNodeKey('#text', parentPath, childIndex), props: { nodeValue: node.nodeValue }, children: [], dom: node as Text };\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const elem = node as Element;\n const props: Record<string, any> = {};\n Array.from(elem.attributes).forEach(attr => {\n props[attr.name] = attr.value;\n });\n const tagName = elem.tagName.toLowerCase();\n let vnodeKey: string | undefined = undefined;\n // --- Stable key for controlled inputs ---\n if ((tagName === 'input' || tagName === 'select' || tagName === 'textarea') && elem.hasAttribute('data-model')) {\n const model = elem.getAttribute('data-model')!;\n const inputType = elem.getAttribute('type') ?? '';\n // Use model+type as key, ignore parentPath/childIndex for stability\n vnodeKey = `${tagName}:${model}:${inputType}`;\n props['data-uid'] = vnodeKey;\n elem.setAttribute('data-uid', vnodeKey);\n let valueAttr = elem.getAttribute('value');\n let checkedAttr = elem.getAttribute('checked');\n if (valueAttr) props['value'] = valueAttr;\n if (checkedAttr) props['checked'] = checkedAttr;\n } else if (tagName === 'input' || tagName === 'textarea' || tagName === 'select' || elem.hasAttribute('contenteditable')) {\n vnodeKey = `${tagName}:${parentPath}:${childIndex}`;\n props['data-uid'] = vnodeKey;\n elem.setAttribute('data-uid', vnodeKey);\n } else {\n vnodeKey = getVNodeKey(tagName, parentPath, childIndex);\n if (tagName === 'li') {\n props['data-uid'] = vnodeKey;\n elem.setAttribute('data-uid', vnodeKey);\n }\n }\n const children: VNode[] = Array.from(elem.childNodes).map((child, idx) => createVNodeFromElement(child, vnodeKey!, idx));\n const vnode = {\n type: tagName,\n key: vnodeKey,\n props,\n children,\n dom: elem\n };\n return vnode;\n }\n // Fallback for unsupported node types\n return { type: '#unknown', key: undefined, props: {}, children: [], dom: undefined };\n}\n\n/**\n * Patches two VNodes and updates the DOM, preserving controlled inputs.\n * Handles keyed and index-based reconciliation.\n * @param parent - Parent DOM element\n * @param oldVNode - Previous VNode\n * @param newVNode - New VNode\n */\nexport function patchVNode(parent: Element, oldVNode: VNode, newVNode: VNode): void {\n if (!oldVNode || !newVNode) return;\n\n // Filter meaningful children\n function isMeaningfulVNode(v: VNode | undefined): v is VNode {\n return !!v && v.type !== '#whitespace' && !(v.type === '#text' && (!v.props?.nodeValue || /^\\s*$/.test(v.props.nodeValue)));\n }\n const oldChildren: VNode[] = Array.isArray(oldVNode.children) ? oldVNode.children.filter(isMeaningfulVNode) : [];\n const newChildren: VNode[] = Array.isArray(newVNode.children) ? newVNode.children.filter(isMeaningfulVNode) : [];\n\n // Only replace node if type or key differ, NOT just because it's controlled\n const isControlled = newVNode.type === 'input' || newVNode.type === 'select' || newVNode.type === 'textarea';\n if (oldVNode.type !== newVNode.type || oldVNode.key !== newVNode.key) {\n const newDom = mountVNode(newVNode);\n if (newDom instanceof Node && oldVNode.dom instanceof Node && parent.contains(oldVNode.dom)) {\n safeReplaceChild(parent, newDom, oldVNode.dom);\n // React/Vue: set value/checked only on the newly inserted node\n if (isControlled && newVNode.props && parent.firstChild instanceof HTMLInputElement) {\n const inputEl = parent.firstChild as HTMLInputElement;\n if (inputEl.type === 'radio') {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n } else if (inputEl.type === 'checkbox') {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n } else {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n }\n if ('checked' in newVNode.props) {\n inputEl.checked = newVNode.props.checked === true || newVNode.props.checked === 'true';\n }\n }\n } else if ((newDom as any) instanceof Node) {\n if (newDom) {\n parent.appendChild(newDom);\n newVNode.dom = newDom;\n // React/Vue: set value/checked only on the newly inserted node\n if (isControlled && newVNode.props && parent.firstChild instanceof HTMLInputElement) {\n const inputEl = parent.firstChild as HTMLInputElement;\n if (inputEl.type === 'radio') {\n inputEl.setAttribute('value', newVNode.props.value);\n } else if (inputEl.type === 'checkbox') {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n } else {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n }\n if ('checked' in newVNode.props) {\n inputEl.checked = newVNode.props.checked === true || newVNode.props.checked === 'true';\n }\n }\n } else {\n newVNode.dom = undefined;\n }\n } else {\n newVNode.dom = undefined;\n }\n return;\n }\n // For controlled elements, patch props and preserve node (React/Vue style)\n if (isControlled && oldVNode.dom instanceof HTMLElement && newVNode.props) {\n // Update value/checked on all possible DOM references for compatibility\n for (const [k, v] of Object.entries(newVNode.props)) {\n if (k === 'value' && parent.firstChild instanceof HTMLInputElement) {\n (parent.firstChild as HTMLInputElement).value = v as string;\n } else if (k === 'checked' && parent.firstChild instanceof HTMLInputElement) {\n (parent.firstChild as HTMLInputElement).checked = v === true || v === 'true';\n } else if (k in oldVNode.dom) {\n try { (oldVNode.dom as any)[k] = v; } catch {}\n } else {\n oldVNode.dom.setAttribute(k, v as string);\n }\n }\n // Orphan removal block: remove extra oldChildren\n for (let i = newVNode.children.length; i < oldChildren.length; i++) {\n if (\n oldChildren[i] &&\n oldChildren[i].dom &&\n oldVNode.dom && oldVNode.dom.contains(oldChildren[i].dom as Node)\n ) {\n oldVNode.dom.removeChild(oldChildren[i].dom as Node);\n }\n }\n return;\n }\n\n // Patch props for Element\n const oldDom = oldVNode.dom;\n if (oldDom && oldDom instanceof Element && newVNode.props) {\n const inputType = oldDom.tagName.toLowerCase() === 'input' ? oldDom.getAttribute('type') : undefined;\n const isCustomElement = oldDom.tagName.includes('-');\n for (const [k, v] of Object.entries(newVNode.props)) {\n if (inputType === 'radio' && k === 'value') continue;\n if (inputType === 'checkbox' && k === 'value') {\n oldDom.setAttribute('value', v as string);\n continue;\n }\n oldDom.setAttribute(k, v as string);\n }\n if (isCustomElement) {\n for (const [k, v] of Object.entries(newVNode.props)) {\n oldDom.setAttribute(k, v as string);\n }\n }\n for (const k of Array.from(oldDom.attributes).map(a => a.name)) {\n if (!(k in newVNode.props)) {\n if (inputType === 'radio' && k === 'value') continue;\n if (inputType === 'checkbox' && k === 'value') continue;\n oldDom.removeAttribute(k);\n }\n }\n }\n\n // Patch text node: always update nodeValue for text nodes\n if (newVNode.type === '#text') {\n if (oldDom && oldDom.nodeType === Node.TEXT_NODE) {\n if ((oldDom as Text).nodeValue !== newVNode.props.nodeValue) {\n (oldDom as Text).nodeValue = newVNode.props.nodeValue;\n }\n newVNode.dom = oldDom;\n } else {\n const newTextNode = document.createTextNode(newVNode.props.nodeValue ?? '');\n if (oldDom && parent.contains(oldDom) && oldDom.parentNode === parent) {\n safeReplaceChild(parent, newTextNode, oldDom);\n } else {\n parent.appendChild(newTextNode);\n }\n newVNode.dom = newTextNode;\n }\n return;\n }\n\n // Strict keyed reconciliation for children\n if (oldDom instanceof Element) {\n // Build key maps for fast lookup\n const oldKeyMap = new Map<string, VNode>();\n oldChildren.forEach(child => child.key && oldKeyMap.set(child.key, child));\n const newKeySet = new Set(newChildren.map(child => child.key));\n\n // Patch or insert new children in order\n let domOrder: Node[] = [];\n for (let i = 0; i < newChildren.length; i++) {\n const newChild = newChildren[i];\n const oldChild = newChild.key ? oldKeyMap.get(newChild.key!) : oldChildren[i];\n let newDom: Node | undefined;\n // Always replace controlled form elements if key or type changes\n const isControlled = newChild.type === 'input' || newChild.type === 'select' || newChild.type === 'textarea';\n if (oldChild && oldChild.dom && (!isControlled || (oldChild.type === newChild.type && oldChild.key === newChild.key))) {\n patchVNode(oldDom, oldChild, newChild);\n newDom = oldChild.dom as Node;\n } else {\n const mounted = mountVNode(newChild);\n newDom = mounted instanceof Node ? mounted : undefined;\n if (newDom) {\n // Prevent inserting a parent into its own child (HierarchyRequestError)\n if ((newDom instanceof Element || newDom instanceof Node) && newDom.contains(oldDom)) {\n // Debug output for parent-child cycle detection\n console.error('[VDOM] Attempted to insert a parent into its own child:', {\n parentTag: (oldDom as Element).tagName,\n childTag: (newDom as Element).tagName,\n parentUid: (oldDom as Element).getAttribute?.('data-uid'),\n childUid: (newDom as Element).getAttribute?.('data-uid'),\n parent: oldDom,\n child: newDom\n });\n throw new Error('VDOM patch error: Attempted to insert a parent into its own child');\n }\n oldDom.insertBefore(newDom, oldDom.childNodes[i] || null);\n }\n }\n newChild.dom = newDom as Element | Text | undefined;\n if (newDom) domOrder.push(newDom);\n }\n\n // Remove all old children not present in new children (by key)\n oldChildren.forEach(child => {\n if (!newKeySet.has(child.key) && child.dom && oldDom.contains(child.dom)) {\n oldDom.removeChild(child.dom);\n }\n });\n\n // Remove any extra DOM nodes beyond newChildren length\n while (oldDom.childNodes.length > newChildren.length) {\n oldDom.removeChild(oldDom.lastChild!);\n }\n\n // Ensure DOM order matches newChildren\n for (let i = 0; i < domOrder.length; i++) {\n if (oldDom.childNodes[i] !== domOrder[i]) {\n // Prevent inserting a parent into its own child (HierarchyRequestError)\n if ((domOrder[i] instanceof Element || domOrder[i] instanceof Node) && domOrder[i].contains(oldDom)) {\n throw new Error('VDOM patch error: Attempted to insert a parent into its own child');\n }\n oldDom.insertBefore(domOrder[i], oldDom.childNodes[i] || null);\n }\n }\n\n newVNode.dom = oldDom;\n\n // Final orphan node sweep: remove any child nodes not present in newChildren keys\n const newKeys = new Set(newChildren.map(c => c.key));\n Array.from(oldDom.childNodes).forEach((node, idx) => {\n const key = (node as Element).getAttribute?.('data-uid');\n // Remove if key is not present, or if index exceeds newChildren length\n if ((key && !newKeys.has(key)) || idx >= newChildren.length) {\n oldDom.removeChild(node);\n }\n });\n }\n}","/**\n * Lightweight, scalable router for Custom Elements Runtime\n * - Functional API, zero dependencies, SSR/static site compatible\n * - Integrates with Store and runtime.ts\n */\n\n\nimport { Store } from './store';\n\nexport interface Route {\n path: string;\n component?: string;\n load?: () => Promise<{ default: string | HTMLElement | Function }>;\n}\n\nexport interface RouterConfig {\n routes: Route[];\n base?: string;\n}\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\n\nconst 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\nconst 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 = '' } = config;\n let getLocation: () => { path: string; query: Record<string, string> };\n let initial: { path: string; query: Record<string, string> };\n let store: ReturnType<typeof Store>;\n let update: () => void;\n let push: (path: string) => void;\n let replace: (path: string) => void;\n let back: () => void;\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\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 initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = Store<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n update = () => {\n const loc = getLocation();\n const match = matchRoute(routes, loc.path);\n const s = store.getState() as RouteState;\n s.path = loc.path;\n s.params = match.params;\n s.query = loc.query;\n };\n window.addEventListener('popstate', update);\n push = (path: string) => {\n window.history.pushState({}, '', base + path);\n update();\n };\n replace = (path: string) => {\n window.history.replaceState({}, '', base + path);\n update();\n };\n back = () => window.history.back();\n } else {\n // SSR fallback: minimal API\n getLocation = () => ({ path: '/', query: {} });\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = Store<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n update = () => {};\n push = () => {};\n replace = () => {};\n back = () => {};\n }\n\n return {\n store,\n push,\n replace,\n back,\n subscribe: store.subscribe,\n matchRoute: (path: string) => matchRoute(routes, path),\n getCurrent: () => store.getState(),\n resolveRouteComponent\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 * Lightweight reactive state with computed properties and change notification.\n * @template T - State shape\n * @template C - Computed property map\n */\nexport function reactive<T extends object, C extends Record<string, (state: T) => any>>(\n initialState: T,\n computedMap?: C\n): T & { subscribe: (fn: (state: T) => void) => () => void } & { [K in keyof C]: ReturnType<C[K]> } {\n const listeners: Array<(state: T) => void> = [];\n const computedKeys = computedMap ? Object.keys(computedMap) : [];\n const state = { ...initialState } as T;\n\n // Subscribe API\n // Always notify listeners with the top-level proxy\n let topProxy: any = null;\n function subscribe(fn: (state: T) => void) {\n listeners.push(fn);\n return () => {\n const idx = listeners.indexOf(fn);\n if (idx !== -1) listeners.splice(idx, 1);\n };\n }\n\n // Mutation API (for compatibility)\n function set(changes: Partial<T>) {\n Object.assign(topProxy, changes);\n listeners.forEach(fn => fn(topProxy));\n }\n\n // Recursive proxy cache to ensure persistent proxies\n const proxyCache = new WeakMap<object, any>();\n\n function createReactive(obj: any): any {\n if (proxyCache.has(obj)) return proxyCache.get(obj);\n const reactiveProxy = new Proxy(obj, {\n get(target, prop, receiver) {\n if (prop === 'subscribe') return subscribe;\n if (prop === 'set') return set;\n if (computedMap && computedKeys.includes(prop as string)) {\n return computedMap[prop as keyof C](topProxy);\n }\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'object' && value !== null) {\n return createReactive(value);\n }\n return value;\n },\n set(target, prop, value, receiver) {\n if (computedMap && computedKeys.includes(prop as string)) {\n // Computed properties are read-only\n return false;\n }\n const oldValue = target[prop as keyof T];\n const result = Reflect.set(target, prop, value, receiver);\n if (oldValue !== value) {\n listeners.forEach(fn => fn(topProxy));\n }\n return result;\n },\n deleteProperty(target, prop) {\n if (computedMap && computedKeys.includes(prop as string)) {\n // Computed properties are read-only\n return false;\n }\n const result = Reflect.deleteProperty(target, prop);\n listeners.forEach(fn => fn(topProxy));\n return result;\n }\n });\n proxyCache.set(obj, reactiveProxy);\n return reactiveProxy;\n }\n\n topProxy = createReactive(state);\n\n return topProxy as T & { subscribe: (fn: (state: T) => void) => () => void; set: (changes: Partial<T>) => void } & { [K in keyof C]: ReturnType<C[K]> };\n}\n","// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Represents the state object for a component.\n * Extend this interface for custom state typing.\n */\nexport interface ComponentState extends Record<string, unknown> {}\n/**\n * API exposed to component templates and lifecycle handlers.\n * Includes state, event emitters, and global event bus methods.\n */\nexport interface ComponentAPI<T extends ComponentState = ComponentState> {\n /**\n * Reactive state object. Mutate directly for reactivity.\n */\n readonly state: T;\n emit(eventName: string, detail?: unknown): void;\n onGlobal<U = any>(eventName: string, handler: (data: U) => void): () => void;\n offGlobal<U = any>(eventName: string, handler: (data: U) => void): void;\n emitGlobal<U = any>(eventName: string, data?: U): void;\n render(): void;\n}\n/**\n * Configuration object for a custom element component.\n * Defines template, state, computed properties, styles, refs, and lifecycle hooks.\n * @template S - State type\n * @template C - Computed type\n */\nexport interface ComponentConfig<S extends ComponentState, C extends Record<string, any> = {}> {\n readonly template: (state: S & C, api: ComponentAPI<S & C>) => string | Promise<string> | CompiledTemplate<S & C>;\n readonly state?: S;\n readonly computed?: { [K in keyof C]: (state: S) => C[K] };\n readonly style?: string | ((state: S & C) => string);\n readonly refs?: Record<string, RefHandler<S & C>>;\n readonly onMounted?: LifecycleHandler<S & C>;\n readonly onUnmounted?: LifecycleHandler<S & C>;\n readonly debug?: boolean;\n /**\n * Whitelist of state keys to reflect as attributes. If omitted, no keys are reflected.\n */\n readonly reflect?: string[];\n hydrate?: (el: Element | ShadowRoot, state: S & C, api: ComponentAPI<S & C>) => void;\n [handler: string]: ((...args: unknown[]) => unknown) | unknown;\n}\n/**\n * Handler for a ref element in the template.\n * @param element - The DOM element with data-ref\n * @param state - Current component state\n * @param api - Component API\n */\nexport type RefHandler<T extends ComponentState> = (\n element: Element,\n state: T,\n api: ComponentAPI<T>\n) => void;\nexport type ComputedHandler<T extends ComponentState> = (state: T) => unknown;\n/**\n * Lifecycle handler for mounted/unmounted events.\n * @param state - Current component state\n * @param api - Component API\n */\nexport type LifecycleHandler<T extends ComponentState> = (\n state: T,\n api: ComponentAPI<T>\n) => void;\n\n/**\n * Plugin interface for runtime hooks (init, render, error).\n */\nexport type RuntimePlugin<S extends ComponentState, C extends Record<string, any>> = {\n onInit?: (config: ComponentConfig<S, C>) => void;\n onRender?: (state: S & C, api: ComponentAPI<S & C>) => void;\n onError?: (error: Error, state: S & C, api: ComponentAPI<S & C>) => void;\n};\nexport const runtimePlugins: RuntimePlugin<ComponentState, Record<string, unknown>>[] = [];\n/**\n * Registers a runtime plugin for hooks (init, render, error).\n * @param plugin - RuntimePlugin instance\n */\nexport function useRuntimePlugin<S extends ComponentState, C extends Record<string, any>>(plugin: RuntimePlugin<S, C>) {\n runtimePlugins.push(plugin as RuntimePlugin<ComponentState, Record<string, unknown>>);\n}\n\nexport { Store } from './store';\nexport { eventBus } from './event-bus';\nexport { renderToString, renderComponentsToString, generateHydrationScript } from './ssr';\nexport type { SSRComponentConfig, SSRRenderOptions, SSRContext } from './ssr';\nexport { html, compile, css, classes, styles } from './template-helpers';\nexport { useDataModel } from './data-binding';\nexport { compileTemplate, renderCompiledTemplate, updateCompiledTemplate } from './template-compiler';\nexport { mountVNode, patchVNode, createVNodeFromElement, parseVNodeFromHTML, safeReplaceChild, getVNodeKey } from './v-dom';\nexport type { VNode } from './v-dom';\n\n// Router API\nexport { useRouter, matchRouteSSR, resolveRouteComponent } from './router';\nexport type { Route, RouterConfig, RouteState } from './router';\n\n\n// ============================================================================\n// Imports\n// ============================================================================\n\nimport { reactive } from './computed-state';\nimport { eventBus } from './event-bus';\nimport { renderCompiledTemplate, updateCompiledTemplate } from './template-compiler';\nimport { useDataModel } from './data-binding';\nimport { mountVNode, patchVNode, parseVNodeFromHTML } from './v-dom';\nimport { useRouter } from './router';\nimport type { VNode } from './v-dom';\nimport type { CompiledTemplate } from './template-compiler';\nimport type { RouterConfig } from './router';\nimport { css, html } from './template-helpers';\n\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n\n/**\n * Recursively sanitizes an object, removing dangerous keys and prototype pollution.\n * Handles circular references using a WeakSet.\n * @param obj - Object to sanitize\n * @param seen - WeakSet to track visited objects\n */\nexport function deepSanitizeObject<T>(obj: T, seen = new WeakSet<object>()): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (seen.has(obj as object)) return obj;\n seen.add(obj as object);\n if (Array.isArray(obj)) return obj.map(item => deepSanitizeObject(item, seen)) as unknown as T;\n // Prevent prototype pollution\n if (Object.getPrototypeOf(obj) !== Object.prototype && Object.getPrototypeOf(obj) !== null) {\n Object.setPrototypeOf(obj, null);\n }\n const dangerousKeys = ['__proto__', 'constructor', 'prototype'];\n const sanitized: Record<string, unknown> = Object.create(null);\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n if (dangerousKeys.includes(key)) continue;\n sanitized[key] = deepSanitizeObject((obj as Record<string, unknown>)[key], seen);\n }\n return sanitized as T;\n}\n\n/**\n * Type guard to check if a value is Promise-like.\n */\nexport function isPromise(val: unknown): val is Promise<unknown> {\n return !!val && typeof (val as any).then === 'function';\n}\n\n\n// ============================================================================\n// Component Lifecycle\n// ============================================================================\n\n/**\n * Base class for runtime custom elements.\n * Handles lifecycle, rendering, controlled input sync, refs, and event binding.\n * @template S - State type\n * @template C - Computed type\n */\n\ninterface ComponentRegistry {\n [tag: string]: ComponentConfig<any, any>;\n}\ntype ExtendedHTMLElement = HTMLElement & {\n _boundHandlers?: Record<string, EventListenerOrEventListenerObject>;\n _hasDirtyListener?: boolean;\n _isDirty?: boolean;\n _dataModelBound?: boolean;\n _listItemModelListener?: EventListener;\n};\nlet ComponentElement: typeof HTMLElement;\n\nif (typeof HTMLElement !== 'undefined') {\n ComponentElement = class<S extends ComponentState, C extends Record<string, any> = {}> extends HTMLElement {\n /**\n * Syncs whitelisted state properties to attributes after render.\n * Only keys listed in config.reflect are reflected.\n */\n private syncStateToAttributes(): void {\n if (!this.stateObj || !this.config?.reflect || !Array.isArray(this.config.reflect)) return;\n const dangerousKeys = ['__proto__', 'constructor', 'prototype'];\n this.config.reflect.forEach(key => {\n if (dangerousKeys.includes(key)) {\n this.removeAttribute(key);\n return;\n }\n const value = this.stateObj[key];\n if ([\"string\", \"number\", \"boolean\"].includes(typeof value)) {\n if (value === undefined || value === null) {\n this.removeAttribute(key);\n } else {\n this.setAttribute(key, String(value));\n }\n } else {\n this.removeAttribute(key);\n }\n });\n }\n\n /**\n * Allows updating the template function at runtime and triggers a re-render.\n * @param newTemplate - New template function or string\n */\n public setTemplate(newTemplate: ((state: S & C, api: ComponentAPI<S & C>) => string | Promise<string> | CompiledTemplate<S & C>) | string): void {\n // Override readonly via type assertion for runtime mutability\n const config = this.config as any;\n if (typeof newTemplate === 'function') {\n config.template = newTemplate;\n } else {\n config.template = () => newTemplate;\n }\n this.render();\n }\n\n private _hasError = false;\n private _mountedCalled = false;\n private _unmountedCalled = false;\n /**\n * Tracks auto-wired config event handlers for removal\n */\n private _autoWiredHandlers: Record<string, EventListenerOrEventListenerObject[]> = {};\n\n /**\n * Override removeEventListener to support auto-wired config handler removal\n */\n override removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\n super.removeEventListener(type, listener, options);\n // Also remove auto-wired config handlers if present\n if (this._autoWiredHandlers[type]) {\n this._autoWiredHandlers[type] = this._autoWiredHandlers[type].filter(fn => {\n if (fn === listener) {\n super.removeEventListener(type, fn, options);\n return false;\n }\n return true;\n });\n if (this._autoWiredHandlers[type].length === 0) delete this._autoWiredHandlers[type];\n }\n }\n\n /**\n * observedAttributes automatically returns all primitive keys from static state.\n * This enables automatic attribute observation for all primitive state properties.\n */\n static get observedAttributes() {\n // @ts-ignore: allow dynamic static property access\n const state = this.stateObj || {};\n return Object.keys(state).filter(\n key => ['string', 'number', 'boolean'].includes(typeof state[key])\n );\n }\n\n /**\n * Called when an observed attribute changes. Syncs attribute to state and triggers render.\n */\n attributeChangedCallback(name: string, _oldValue: string, newValue: string) {\n if (name === '__proto__' || name === 'constructor' || name === 'prototype') return;\n if (!this.stateObj) return;\n // Map kebab-case to camelCase\n const camelName = name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const stateKey = (name in this.stateObj) ? name : (camelName in this.stateObj ? camelName : null);\n if (stateKey) {\n const initialType = typeof (this.config?.state?.[stateKey]);\n let value: any = newValue;\n if (newValue === null) {\n value = undefined;\n } else if (initialType === 'number') {\n if (value === undefined || value === '') {\n value = this.config?.state?.[stateKey];\n } else {\n const num = Number(value);\n value = isNaN(num) ? this.config?.state?.[stateKey] : num;\n }\n } else if (initialType === 'boolean') {\n value = value === 'true';\n }\n value = deepSanitizeObject(value);\n if ((this.stateObj as any)[stateKey] !== value) {\n if (this.config?.debug) {\n console.log('[runtime] state update:', { stateKey, value });\n }\n (this.stateObj as any)[stateKey] = value;\n this.render();\n }\n }\n }\n\n /**\n * Force sync all controlled input values and event listeners after VDOM patching.\n */\n private forceSyncControlledInputs(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.querySelectorAll('input[data-model]').forEach(input => {\n const modelAttr = input.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n const inputEl = input as HTMLInputElement;\n const stateValue = String(this.stateObj[modelAttr]);\n const isFocused = document.activeElement === inputEl;\n // Ensure dirty flag is set on input event\n if (!(inputEl as any)._hasDirtyListener) {\n inputEl.addEventListener('input', () => {\n (inputEl as any)._isDirty = true;\n });\n inputEl.addEventListener('blur', () => {\n (inputEl as any)._isDirty = false;\n });\n (inputEl as any)._hasDirtyListener = true;\n }\n const isDirty = Boolean((inputEl as any)._isDirty);\n // Never set value for focused or dirty inputs—let user typing win\n if (isFocused || isDirty) {\n return;\n }\n // Only set value for unfocused and clean inputs if it differs and is not a radio or checkbox\n if (inputEl.type !== 'radio' && inputEl.type !== 'checkbox' && inputEl.value !== stateValue) {\n inputEl.value = stateValue;\n }\n });\n // Rebind other events (e.g., data-on-click)\n this.rebindEventListeners();\n }\n\n /**\n * Sync all controlled inputs and event listeners after render\n */\n private syncControlledInputsAndEvents(): void {\n if (!this.shadowRoot) return;\n // --- Radio Groups ---\n this.shadowRoot.querySelectorAll('input[type=\"radio\"][data-model]').forEach((input) => {\n const modelAttr = input.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') {\n return;\n }\n const inputEl = input as HTMLInputElement;\n const stateValue = String(this.stateObj[modelAttr]);\n inputEl.checked = inputEl.value === stateValue;\n });\n // --- Checkbox, Text, Number ---\n this.shadowRoot.querySelectorAll('input[data-model]').forEach(input => {\n const modelAttr = input.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n const inputEl = input as HTMLInputElement;\n const stateValue = String(this.stateObj[modelAttr]);\n if (inputEl.type === 'checkbox') {\n const stateVal = this.stateObj[modelAttr];\n if (Array.isArray(stateVal)) {\n inputEl.checked = stateVal.includes(inputEl.value);\n } else {\n const trueValue = inputEl.getAttribute('data-true-value');\n const falseValue = inputEl.getAttribute('data-false-value');\n if (trueValue !== null || falseValue !== null) {\n if (String(stateVal) === trueValue) {\n inputEl.checked = true;\n } else if (String(stateVal) === falseValue) {\n inputEl.checked = false;\n } else if (stateVal === true) {\n inputEl.checked = true;\n } else {\n inputEl.checked = false;\n }\n } else {\n inputEl.checked = stateVal === true || stateVal === 'true' || stateVal === 1;\n }\n }\n } else if (inputEl.type === 'radio') {\n // Do not set value for radios\n } else {\n inputEl.value = stateValue;\n }\n });\n // --- Textarea ---\n this.shadowRoot.querySelectorAll('textarea[data-model]').forEach(textarea => {\n const modelAttr = textarea.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n (textarea as HTMLTextAreaElement).value = String(this.stateObj[modelAttr]);\n });\n // --- Select ---\n this.shadowRoot.querySelectorAll('select[data-model]').forEach(select => {\n const modelAttr = select.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n (select as HTMLSelectElement).value = String(this.stateObj[modelAttr]);\n });\n }\n\n /**\n * Attach event listeners for input[data-bind] after VDOM patching\n */\n private attachListItemModelListeners(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.querySelectorAll('input[data-bind]').forEach(input => {\n const bindExpr = input.getAttribute('data-bind');\n if (!bindExpr) return;\n // Remove previous listener if present\n if ((input as any)._listItemModelListener) {\n input.removeEventListener('input', (input as any)._listItemModelListener);\n input.removeEventListener('change', (input as any)._listItemModelListener);\n delete (input as any)._listItemModelListener;\n }\n // Array item binding: arrKey[idx].propKey\n const arrMatch = bindExpr.match(/^([a-zA-Z0-9_]+)\\[(\\d+)\\]\\.([a-zA-Z0-9_]+)$/);\n if (arrMatch) {\n const [, arrKey, idxStr, propKey] = arrMatch;\n const idx = parseInt(idxStr, 10);\n const arr = this.stateObj[arrKey];\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n input.checked = !!(Array.isArray(arr) && arr[idx] && arr[idx][propKey]);\n }\n const handler = (_e: Event) => {\n if (!Array.isArray(arr) || !arr[idx]) return;\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n arr[idx][propKey] = input.checked;\n } else {\n arr[idx][propKey] = (input as any).value;\n }\n };\n input.addEventListener('input', handler);\n input.addEventListener('change', handler);\n (input as any)._listItemModelListener = handler;\n return;\n }\n // Dot notation binding: user.name or user.amount|number|trim\n const dotMatch = bindExpr.match(/^([a-zA-Z0-9_]+)\\.([a-zA-Z0-9_]+)((?:\\|[a-zA-Z0-9_]+)*)$/);\n if (dotMatch) {\n const [, objKey, propKey, modifierStr] = dotMatch;\n const obj = this.stateObj[objKey];\n const modifiers = modifierStr ? modifierStr.split('|').map(s => s.trim()).filter(Boolean) : [];\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n input.checked = !!(obj && obj[propKey]);\n } else if (input instanceof HTMLInputElement) {\n input.value = obj ? String(obj[propKey] ?? '') : '';\n }\n const handler = (_e: Event) => {\n if (!obj) return;\n let value: unknown;\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n value = input.checked;\n } else {\n value = (input as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n if (modifiers.includes('number')) value = Number(value);\n if (modifiers.includes('trim') && typeof value === 'string') value = value.trim();\n }\n obj[propKey] = value;\n };\n input.addEventListener('input', handler);\n input.addEventListener('change', handler);\n (input as any)._listItemModelListener = handler;\n }\n });\n }\n\n /**\n * Attach controlled input listeners to sync DOM value to state\n */\n private attachControlledInputListeners(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n // --- Auto data-model binding ---\n shadow.querySelectorAll('[data-model]').forEach((el) => {\n const keyWithModifiers = el.getAttribute('data-model');\n if (!keyWithModifiers) return;\n // Only bind once per element\n if ((el as any)._dataModelBound) return;\n useDataModel(el, this.stateObj, keyWithModifiers);\n (el as any)._dataModelBound = true;\n });\n // --- Post-render sync for all data-model inputs ---\n shadow.querySelectorAll('[data-model]').forEach((el) => {\n const [key] = el.getAttribute('data-model')?.split('|').map(s => s.trim()) ?? [];\n if (!key || !(key in this.stateObj)) return;\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox') {\n const stateVal = this.stateObj[key];\n const trueValue = el.getAttribute('data-true-value');\n const falseValue = el.getAttribute('data-false-value');\n if (Array.isArray(stateVal)) {\n el.checked = stateVal.includes(el.value);\n } else if (trueValue !== null || falseValue !== null) {\n if (String(stateVal) === trueValue) {\n el.checked = true;\n } else if (String(stateVal) === falseValue) {\n el.checked = false;\n } else if (stateVal === true) {\n el.checked = true;\n } else {\n el.checked = false;\n }\n } else {\n el.checked = stateVal === true || stateVal === 'true' || stateVal === 1;\n }\n } else if (el.type === 'radio') {\n el.checked = el.value === String(this.stateObj[key]);\n } else {\n el.value = String(this.stateObj[key] ?? '');\n }\n } else if (el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n el.value = String(this.stateObj[key] ?? '');\n }\n });\n }\n private config!: ComponentConfig<S, C>;\n private stateObj!: S & C;\n private api!: ComponentAPI<S & C>;\n private _globalUnsubscribes: Array<() => void> = [];\n private unsubscribes: Array<() => void> = [];\n private lastCompiledTemplate: CompiledTemplate<S & C> | null = null;\n private lastState: (S & C) | null = null;\n private rafId: number | null = null;\n\n /**\n * Construct a new runtime component element.\n * @param config - Component configuration\n */\n constructor() {\n super();\n // Config/state setup will be done in connectedCallback\n }\n\n private initializeConfig() {\n if (this.config) return;\n const tag = this.tagName.toLowerCase();\n const registry: ComponentRegistry = (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry || {};\n const config = registry[tag];\n if (!config || typeof config !== 'object') {\n throw new Error('Invalid component config: must be an object');\n }\n if (!config.state || typeof config.state !== 'object') {\n throw new Error('Invalid component config: state must be an object');\n }\n this.config = config;\n // Always use the reactive proxy for state\n const computedState = config.computed\n ? reactive(config.state, config.computed)\n : reactive(config.state);\n this.stateObj = computedState as S & C;\n // Subscribe to state changes and batch re-render\n if (typeof (this.stateObj as any).subscribe === 'function') {\n this.unsubscribes.push((this.stateObj as any).subscribe(() => {\n this.scheduleRender();\n }));\n }\n // Create API\n this.api = {\n state: this.stateObj,\n emit: (eventName: string, detail?: unknown) => this.dispatchEvent(new CustomEvent(eventName, { detail, bubbles: true })),\n onGlobal: <U = any>(eventName: string, handler: (data: U) => void) => {\n const unsub = eventBus.on(eventName, handler);\n this._globalUnsubscribes.push(unsub);\n return unsub;\n },\n offGlobal: <U = any>(eventName: string, handler: (data: U) => void) => eventBus.off(eventName, handler),\n emitGlobal: <U = any>(eventName: string, data?: U) => eventBus.emit(eventName, data),\n render: () => this.render()\n };\n Object.keys(this.config).forEach(key => {\n if (key.startsWith('on') && key.length > 2 && typeof this.config[key] === 'function') {\n const eventName = key.charAt(2).toLowerCase() + key.slice(3);\n const handler: EventListener = (e: Event) => {\n const detail = (e as CustomEvent).detail ?? e;\n (this.config[key] as Function)(detail, this.api.state, this.api);\n };\n this.addEventListener(eventName, handler);\n // Store for later removal\n if (!this._autoWiredHandlers[eventName]) this._autoWiredHandlers[eventName] = [];\n this._autoWiredHandlers[eventName].push(handler);\n }\n });\n // Attach shadow DOM\n this.attachShadow({ mode: 'open' });\n // Setup style\n if (config.style) {\n const styleEl = document.createElement('style');\n styleEl.textContent = typeof config.style === 'function' ? config.style(this.stateObj) : config.style;\n this.shadowRoot!.appendChild(styleEl);\n }\n // SSR hydration support (selective)\n if (typeof this.config.hydrate === 'function') {\n const hydrateEls = this.shadowRoot?.querySelectorAll('[data-hydrate]');\n try {\n if (hydrateEls && hydrateEls.length > 0) {\n hydrateEls.forEach(el => {\n try {\n this.config.hydrate!(el, this.stateObj, this.api);\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err instanceof Error ? err : new Error(String(err)), this.api.state, this.api);\n }\n this._handleRenderError(err);\n }\n });\n } else {\n this.config.hydrate!(this.shadowRoot!, this.stateObj, this.api);\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err instanceof Error ? err : new Error(String(err)), this.api.state, this.api);\n }\n this._handleRenderError(err);\n }\n }\n const isSSRHydration = this.hasAttribute('data-hydrated');\n if (!isSSRHydration) {\n this.render();\n } else {\n this.processRefs();\n }\n // Only call onMounted here if not already called\n if (!this._mountedCalled && typeof this.config.onMounted === 'function') {\n try {\n const result: unknown = this.config.onMounted(this.api.state, this.api);\n if (isPromise(result)) {\n result.catch((err: any) => {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n }).finally(() => {\n this._mountedCalled = true;\n });\n } else {\n this._mountedCalled = true;\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n this._mountedCalled = true;\n }\n }\n }\n\n connectedCallback(): void {\n this.initializeConfig();\n // Merge all attributes into state for initial sync\n if (this.stateObj) {\n for (const attr of this.getAttributeNames()) {\n // Always map kebab-case to camelCase for state keys\n const camelName = attr.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const stateKey = camelName;\n if (stateKey in this.stateObj) {\n const initialType = typeof (this.config?.state?.[stateKey]);\n let value: unknown = this.getAttribute(attr);\n if (initialType === 'number') value = Number(value);\n else if (initialType === 'boolean') value = value === 'true';\n (this.stateObj as Record<string, unknown>)[stateKey] = value === null ? undefined : value;\n }\n }\n }\n // Only call onMounted if not already called\n if (!this._mountedCalled && typeof this.config.onMounted === 'function') {\n try {\n const result: unknown = this.config.onMounted(this.api.state, this.api);\n if (isPromise(result)) {\n result.catch((err: unknown) => {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n }).finally(() => {\n this._mountedCalled = true;\n });\n } else {\n this._mountedCalled = true;\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n this._mountedCalled = true;\n }\n }\n if (typeof this.render === 'function') this.render();\n }\n\n /**\n * Lifecycle: called when element is removed from DOM.\n */\n disconnectedCallback(): void {\n // Remove all auto-wired config event handlers\n Object.entries(this._autoWiredHandlers).forEach(([eventName, handlers]) => {\n handlers.forEach(handler => {\n super.removeEventListener(eventName, handler);\n });\n });\n this._autoWiredHandlers = {};\n this.unsubscribes.forEach(fn => fn());\n this.unsubscribes = [];\n this._globalUnsubscribes.forEach(fn => fn());\n this._globalUnsubscribes = [];\n if (!this._unmountedCalled && typeof this.config.onUnmounted === 'function') {\n try {\n const result: unknown = this.config.onUnmounted(this.api.state, this.api);\n if (isPromise(result)) {\n result.catch((err: any) => {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n }).finally(() => {\n this._unmountedCalled = true;\n });\n } else {\n this._unmountedCalled = true;\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n this._unmountedCalled = true;\n }\n }\n // Reset flags for future re-mounts\n this._mountedCalled = false;\n this._unmountedCalled = false;\n }\n\n /**\n * Render the component. Handles both string and compiled templates, refs, and error boundaries.\n */\n private render(): void {\n // Always reset error state before each render for predictable boundaries\n this._hasError = false;\n // Robust controlled input sync after every render\n this.syncControlledInputsAndEvents();\n setTimeout(() => this.attachControlledInputListeners(), 0);\n try {\n // Plugin hook: onRender\n runtimePlugins.forEach(p => {\n try {\n p.onRender?.(this.stateObj, this.api);\n } catch (err) {\n this._handleRenderError(err);\n // Do NOT re-throw, just handle and continue\n }\n });\n // Error boundary for computed properties\n if (this.config.computed) {\n Object.values(this.config.computed).forEach(fn => {\n try {\n fn(this.stateObj);\n } catch (err) {\n this._handleRenderError(err);\n // Do NOT re-throw, just handle and continue\n }\n });\n }\n const templateResultOrPromise = this.config.template(this.stateObj as S & C, this.api);\n if (templateResultOrPromise instanceof Promise) {\n templateResultOrPromise.then(templateResult => {\n if (!this._hasError) {\n this._renderTemplateResult(templateResult);\n // Sync state to attributes after render\n this.syncStateToAttributes();\n // Attach list item listeners after VDOM patching\n setTimeout(() => this.attachListItemModelListeners(), 0);\n }\n }).catch(error => {\n this._handleRenderError(error);\n });\n } else {\n if (!this._hasError) {\n this._renderTemplateResult(templateResultOrPromise);\n // Sync state to attributes after render\n this.syncStateToAttributes();\n // Attach list item listeners after VDOM patching\n setTimeout(() => this.attachListItemModelListeners(), 0);\n }\n }\n } catch (error) {\n this._handleRenderError(error);\n // Always render fallback UI on error, do NOT re-throw\n this.renderError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Internal: render a template result (string or compiled template)\n */\n private _prevVNode: VNode | null = null;\n\n /**\n * Rebind event listeners for elements with data-on-* attributes in the shadow DOM\n */\n private rebindEventListeners(): void {\n if (!this.shadowRoot) return;\n const eventAttrs = ['data-on-input', 'data-on-change', 'data-on-blur', 'data-on-click'];\n eventAttrs.forEach(attr => {\n this.shadowRoot!.querySelectorAll(`[${attr}]`).forEach(el => {\n const eventType = attr.replace('data-on-', '');\n const handlerName = el.getAttribute(attr);\n if (!handlerName || typeof this.config[handlerName] !== 'function') return;\n // Remove previous listener if any\n if ((el as any)._boundHandlers && (el as any)._boundHandlers[eventType]) {\n el.removeEventListener(eventType, (el as any)._boundHandlers[eventType]);\n }\n // Bind new handler\n const handler = this.config[handlerName];\n const boundHandler = (e: Event) => handler.call(this, e, this.stateObj, this.api);\n el.addEventListener(eventType, boundHandler);\n if (!(el as any)._boundHandlers) (el as any)._boundHandlers = {};\n (el as any)._boundHandlers[eventType] = boundHandler;\n });\n });\n // Recurse into children for rebinding\n Array.from(this.shadowRoot.children).forEach(child => {\n if (child instanceof HTMLElement && typeof (child as any).rebindEventListeners === 'function') {\n (child as any).rebindEventListeners();\n }\n });\n }\n /**\n * Internal: render a template result (string or compiled template).\n * Handles VDOM patching, style updates, refs, and event binding.\n * @param templateResult - HTML string or compiled template\n */\n private _renderTemplateResult(templateResult: string | CompiledTemplate<S & C>): void {\n if (this._hasError) return;\n try {\n if (typeof templateResult === 'string') {\n // --- Sanitize HTML for XSS ---\n function sanitizeHTML(html: string): string {\n // Remove all on* attributes (e.g., onclick, onerror)\n return html.replace(/<([a-zA-Z0-9]+)([^>]*)>/g, (_match, tag, attrs) => {\n // Remove dangerous attributes\n const safeAttrs = attrs.replace(/\\s+on[a-zA-Z]+\\s*=\\s*(['\"][^'\"]*['\"]|[^\\s>]*)/gi, '');\n return `<${tag}${safeAttrs}>`;\n });\n }\n const sanitizedHTML = sanitizeHTML(templateResult);\n const newVNode = parseVNodeFromHTML(sanitizedHTML);\n function logCheckboxVNodes(vnode: VNode) {\n vnode.children.forEach(logCheckboxVNodes);\n }\n logCheckboxVNodes(newVNode);\n const shadowRoot = this.shadowRoot;\n if (!shadowRoot) {\n return;\n }\n let styleEl = shadowRoot.querySelector('style');\n if (!styleEl) {\n styleEl = document.createElement('style');\n shadowRoot.appendChild(styleEl);\n }\n if (this.config.style) {\n styleEl.textContent = typeof this.config.style === 'function' ? this.config.style(this.stateObj) : this.config.style;\n } else {\n styleEl.textContent = '';\n }\n // If fragment, reconcile all children\n if (newVNode.type === '#fragment') {\n // Use patchVNode for full parent/children reconciliation\n const containerEl = Array.from(shadowRoot.childNodes).find(\n node => node.nodeType === 1 && node !== styleEl\n ) as Element | undefined;\n if (containerEl) {\n // Remove all non-style children from container\n Array.from(containerEl.childNodes).forEach(node => {\n // Keep only the <style> node, remove everything else (including text and comment nodes)\n if (!(node.nodeType === 1 && node.nodeName === 'STYLE')) {\n containerEl.removeChild(node);\n }\n });\n const fragmentVNode = {\n type: '#fragment',\n dom: containerEl,\n children: newVNode.children,\n props: {},\n key: undefined\n };\n const prevFragmentVNode = this._prevVNode && this._prevVNode.type === '#fragment'\n ? { ...this._prevVNode, dom: containerEl }\n : fragmentVNode;\n patchVNode(containerEl, prevFragmentVNode, fragmentVNode);\n } else {\n // If no container, mount all children\n newVNode.children.forEach(childVNode => {\n const dom = mountVNode(childVNode);\n if (dom) shadowRoot.appendChild(dom);\n childVNode.dom = dom ?? undefined;\n });\n }\n // Do not assign shadowRoot to VNode.dom; fragment VNode's dom remains undefined\n } else {\n // Find or create persistent root node\n let rootEl = Array.from(this.shadowRoot!.childNodes).find(\n node => node !== styleEl && node.nodeType === 1\n ) as Element | undefined;\n if (rootEl) {\n // If type or key differ, replace root node\n if (this._prevVNode && (this._prevVNode.type !== newVNode.type || this._prevVNode.key !== newVNode.key)) {\n const actualRootNode = mountVNode(newVNode);\n if (actualRootNode) {\n if (this.shadowRoot!.contains(rootEl)) {\n this.shadowRoot!.replaceChild(actualRootNode, rootEl);\n }\n rootEl = actualRootNode as Element;\n }\n } else {\n // Patch root node in place\n patchVNode(rootEl, this._prevVNode!, newVNode);\n }\n } else {\n // No root node, append new\n const actualRootNode = mountVNode(newVNode);\n rootEl = actualRootNode as Element;\n if (rootEl) {\n this.shadowRoot!.appendChild(rootEl);\n }\n }\n newVNode.dom = rootEl;\n }\n this._prevVNode = newVNode;\n this.forceSyncControlledInputs();\n this.lastCompiledTemplate = null;\n } else {\n const isInitialRender = !this.shadowRoot!.firstElementChild;\n const isSameTemplate = this.lastCompiledTemplate?.id === templateResult.id;\n if (isInitialRender) {\n const fragment = renderCompiledTemplate(templateResult, this.stateObj, this.api);\n this.shadowRoot!.appendChild(fragment);\n } else if (isSameTemplate && this.shadowRoot!.firstElementChild) {\n const oldState = this.lastState;\n updateCompiledTemplate(templateResult, this.shadowRoot!.firstElementChild, this.stateObj, this.api, oldState || undefined);\n } else {\n const fragment = renderCompiledTemplate(templateResult, this.stateObj, this.api);\n // Always ensure <style> element is present and up-to-date\n let styleEl = this.shadowRoot!.querySelector('style');\n if (!styleEl) {\n styleEl = document.createElement('style');\n this.shadowRoot!.insertBefore(styleEl, this.shadowRoot!.firstChild);\n }\n if (this.config.style) {\n styleEl.textContent = typeof this.config.style === 'function' ? this.config.style(this.stateObj) : this.config.style;\n } else {\n styleEl.textContent = '';\n }\n\n // Ensure <div data-root> is second child of shadow root\n let rootEl = this.shadowRoot!.querySelector('[data-root]');\n if (!rootEl) {\n rootEl = document.createElement('div');\n rootEl.setAttribute('data-root', '');\n this.shadowRoot!.appendChild(rootEl);\n }\n // Remove all children from rootEl before patching\n while (rootEl.firstChild) {\n rootEl.removeChild(rootEl.firstChild);\n }\n // Append VDOM fragment to rootEl\n rootEl.appendChild(fragment);\n }\n this.lastCompiledTemplate = templateResult;\n }\n // Safe deep clone for lastState, ignoring circular references\n this.lastState = safeClone(this.stateObj);\n /**\n * Safely deep clones an object, ignoring circular references.\n * @param obj - Object to clone\n */\n function safeClone<T>(obj: T): T {\n const seen = new WeakSet<object>();\n function clone(val: T): T {\n if (val === null || typeof val !== 'object') return val;\n if (seen.has(val as object)) return val;\n seen.add(val as object);\n if (Array.isArray(val)) return val.map(clone) as unknown as T;\n const out: Record<string, unknown> = {};\n for (const key in val as Record<string, unknown>) {\n if (Object.prototype.hasOwnProperty.call(val, key)) {\n out[key] = clone((val as Record<string, unknown>)[key] as T);\n }\n }\n return out as T;\n }\n return clone(obj);\n }\n this.updateStyle();\n this.processRefs();\n // Automatic event binding after refs and DOM update\n this.bindEvents();\n // Robust controlled input sync after every render\n this.syncControlledInputsAndEvents();\n } catch (error) {\n this._handleRenderError(error);\n }\n }\n\n /**\n * Internal: handle render errors and error boundaries.\n * Logs details and allows fallback UI.\n * @param error - Error object\n */\n private _handleRenderError(error: unknown): void {\n this._hasError = true;\n // Improved error boundary: log details and always render fallback UI\n if (this.config.debug) {\n console.error(`[runtime] Render error in <${this.tagName.toLowerCase()}>:`, error);\n }\n runtimePlugins.forEach(p => p.onError?.(error instanceof Error ? error : new Error(String(error)), this.stateObj, this.api));\n if ('onError' in this.config && typeof (this.config.onError) === 'function') {\n try {\n this.config.onError(error instanceof Error ? error : new Error(String(error)), this.api.state, this.api);\n } catch (fallbackError) {\n if (this.config.debug) {\n console.error(`[runtime] Error in onError handler:`, fallbackError);\n }\n }\n }\n this.renderError(error instanceof Error ? error : new Error(String(error)));\n }\n\n /**\n * Schedule a render using requestAnimationFrame, batching multiple state changes.\n */\n private scheduleRender(): void {\n if (this.rafId !== undefined && this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n this.rafId = requestAnimationFrame(() => {\n this.render();\n this.rafId = null;\n });\n }\n\n /**\n * Updates the style element in the shadow root based on the current state.\n */\n private updateStyle(): void {\n const styleEl = this.shadowRoot!.querySelector('style');\n if (!styleEl || !this.config.style) return;\n\n const css = typeof this.config.style === 'function'\n ? this.config.style(this.api.state)\n : this.config.style;\n \n styleEl.textContent = css;\n }\n\n /**\n * Processes and attaches ref handlers for elements with data-ref attributes.\n */\n private processRefs(): void {\n if (!this.config.refs) return;\n // Track attached listeners per element/type\n const listenerMap: WeakMap<Element, Set<string>> = new WeakMap();\n\n Object.entries(this.config.refs).forEach(([refName, handler]) => {\n const element = this.shadowRoot!.querySelector(`[data-ref=\"${refName}\"]`);\n if (element) {\n // Only attach listeners once per element/type\n if (!listenerMap.has(element)) {\n listenerMap.set(element, new Set());\n }\n const attachedTypes = listenerMap.get(element)!;\n\n // Wrap addEventListener to prevent duplicates\n const originalAddEventListener = element.addEventListener;\n (element as ExtendedHTMLElement).addEventListener = function(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions\n ) {\n const key = `${type}`;\n if (attachedTypes.has(key)) return;\n attachedTypes.add(key);\n originalAddEventListener.call(element, type, listener, options);\n };\n\n // Mark as processed and call handler\n element.setAttribute('data-refs-processed', 'true');\n try {\n handler(element, this.api.state, this.api);\n } catch (err) {\n this._handleRenderError(err);\n // Do NOT re-throw, just handle and continue\n }\n }\n // Silently skip missing refs as they may be conditionally rendered\n });\n }\n\n /**\n * Automatically bind events for elements with data-on-* attributes.\n * Ensures events are not attached multiple times after rerender.\n */\n private bindEvents(): void {\n if (!this.shadowRoot) return;\n const walker = document.createTreeWalker(this.shadowRoot, NodeFilter.SHOW_ELEMENT);\n let node = walker.nextNode();\n while (node) {\n const el = node as ExtendedHTMLElement;\n Array.from(el.attributes).forEach(attr => {\n if (attr.name.startsWith('data-on-')) {\n const eventType = attr.name.slice('data-on-'.length);\n const handlerName = attr.value;\n // Look for handler on config, not api\n const handler = (this.config as Record<string, unknown>)[handlerName];\n if (typeof handler === 'function') {\n // Remove previous handler if present\n if (el._boundHandlers && el._boundHandlers[eventType]) {\n el.removeEventListener(eventType, el._boundHandlers[eventType]);\n }\n // Bind new handler\n const boundHandler = (e: Event) => {\n (handler as Function).call(this.config, e, this.api.state, this.api);\n // Immediately sync controlled inputs after handler runs\n this.syncControlledInputsAndEvents();\n };\n el.addEventListener(eventType, boundHandler);\n if (!el._boundHandlers) el._boundHandlers = {};\n el._boundHandlers[eventType] = boundHandler;\n } else {\n if (this.config.debug) console.warn(`[runtime] Handler '${handlerName}' not found on config for event '${eventType}'`, el);\n }\n }\n });\n node = walker.nextNode();\n }\n }\n\n /**\n * Renders a fallback error UI in the shadow root.\n * @param error - Error object\n */\n private renderError(error: Error): void {\n const styleContent = this.config.style\n ? (typeof this.config.style === 'function' ? this.config.style(this.api.state) : this.config.style)\n : '';\n this.shadowRoot!.innerHTML = `\n <style>${styleContent}</style>\n <div style=\"color: red; border: 1px solid red; padding: 1rem; border-radius: 4px;\">\n <h3>Error Boundary</h3>\n <div>Error: ${error.message}</div>\n </div>\n `;\n }\n }\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\n/**\n * Registers a new custom element component.\n * Validates config, sets up reactive state, and defines the custom element.\n * Supports HMR and SSR hydration.\n * @template S - State type\n * @template C - Computed type\n * @param tag - Custom element tag name\n * @param config - Component configuration\n */\nexport function component<S extends ComponentState, C extends Record<string, any> = {}>(tag: string, config: ComponentConfig<S, C>): void {\n // Prevent deep object injection in config and state\n const sanitizedConfig = deepSanitizeObject(config);\n config = sanitizedConfig as ComponentConfig<S, C>;\n // Do not assign to readonly state property\n if (config.debug) {\n console.log(`[runtime] Debugging component: ${tag}`, config);\n }\n\n // Validate config\n if (!tag || !config.template) {\n if (config && typeof config.onError === 'function') {\n config.onError(new Error('Component requires tag and template'), config.state ?? {}, {\n state: config.state ?? {},\n emit: () => {},\n onGlobal: () => () => {},\n offGlobal: () => {},\n emitGlobal: () => {}\n });\n }\n if (config && config.debug) {\n console.error('[runtime] Malformed config:', { tag, config });\n }\n return;\n }\n\n // Plugin System: Call all plugins' onInit in registration order\n runtimePlugins.forEach(p => {\n try {\n p.onInit?.(config as any);\n } catch (err) {\n if (config && typeof config.onError === 'function') {\n config.onError(err instanceof Error ? err : new Error(String(err)), config.state, {\n state: config.state,\n emit: () => {},\n onGlobal: () => () => {},\n offGlobal: () => {},\n emitGlobal: () => {}\n });\n }\n if (config && config.debug) console.error('[runtime] Plugin onInit error:', err);\n }\n });\n\n // HMR support: unregister previous definition if in dev and module.hot is available\n const isDev = typeof window !== 'undefined' && (window as any).VITE_DEV_HMR;\n const hasHMR = typeof import.meta !== 'undefined' && (import.meta as any).hot;\n\n if ((isDev || hasHMR) && typeof customElements !== 'undefined' && customElements.get(tag)) {\n try {\n document.querySelectorAll(tag).forEach(el => el.remove());\n // @ts-ignore\n if ((window as unknown as { customElements: { _definitions?: Record<string, unknown> } }).customElements._definitions) {\n delete (window as unknown as { customElements: { _definitions?: Record<string, unknown> } }).customElements._definitions![tag];\n }\n } catch (_e) {}\n }\n\n if (typeof customElements !== 'undefined' && customElements.get(tag)) {\n if (config.debug) console.warn(`[runtime] Component \"${tag}\" already registered`);\n return;\n }\n\n // Create reactive state with computed properties\n const state = reactive(config.state ?? ({} as S), config.computed as Record<string, (state: S) => unknown>);\n // @ts-expect-error: Overriding readonly property for runtime assignment\n (config as { state: S & C }).state = state;\n (config as { _subscribe?: unknown })._subscribe = state.subscribe;\n\n const stateObjForKeys = (config.state ?? {}) as Record<string, unknown>;\n const primitiveKeys = Object.keys(stateObjForKeys).filter(\n key => ['string', 'number', 'boolean'].includes(typeof stateObjForKeys[key])\n );\n\n class RuntimeComponent extends ComponentElement {\n static get observedAttributes() {\n return primitiveKeys;\n }\n constructor() {\n super();\n }\n }\n // Type assertion for CustomElementConstructor\n const ComponentClass = RuntimeComponent as unknown as CustomElementConstructor;\n\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n // Store config in a global registry for lookup in connectedCallback\n (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry = (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry || {};\n (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry![tag] = config;\n customElements.define(tag, ComponentClass);\n }\n\n // Accept HMR updates if available\n if (\n hasHMR &&\n typeof import.meta !== 'undefined' &&\n import.meta.hot &&\n typeof import.meta.hot.accept === 'function' &&\n typeof customElements !== 'undefined'\n ) {\n import.meta.hot.accept(() => {\n if (!customElements.get(tag)) {\n customElements.define(tag, ComponentClass);\n }\n });\n }\n}\n\n/**\n * RouterLink component state\n */\nexport interface RouterLinkState extends ComponentState {\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\n/**\n * Singleton router instance for global access.\n * \n * Define here to prevent circular dependency\n * issue with component.\n */\nexport function initRouter(config: RouterConfig) {\n const router = useRouter(config);\n component('router-view', {\n template: async () => {\n if (!router) return '<div>Router not initialized.</div>';\n const current = router.getCurrent() as import('./router').RouteState;\n const { path } = current;\n const match = router.matchRoute(path);\n if (!match.route) return '<div>Not found</div>';\n if (match.route.load) {\n await match.route.load();\n }\n return `<${match.route.component}></${match.route.component}>`;\n },\n onMounted(_state, api) {\n // Subscribe to router state and re-render on change\n if (router && typeof router.subscribe === 'function') {\n router.subscribe(() => {\n api.render();\n });\n }\n }\n });\n component<RouterLinkState>('router-link', {\n state: {\n to: '',\n tag: 'a',\n replace: false,\n exact: false,\n activeClass: 'active',\n exactActiveClass: 'exact-active',\n ariaCurrentValue: 'page',\n disabled: false,\n external: false,\n style: css`\n [aria-disabled=\"true\"] {\n pointer-events: none;\n opacity: 0.5;\n }\n `,\n },\n computed: {\n current() {\n return router.getCurrent();\n },\n isExactActive(state: RouterLinkState) {\n const current = state.current as { path: string };\n return current.path === state.to;\n },\n isActive(state: RouterLinkState) {\n const current = state.current as { path?: string } | undefined;\n return state.exact\n ? state.isExactActive\n : current && typeof current.path === 'string'\n ? current.path.startsWith(state.to)\n : false;\n },\n className(state: RouterLinkState) {\n return state.isExactActive\n ? state.exactActiveClass\n : state.isActive\n ? state.activeClass\n : '';\n },\n ariaCurrent(state: RouterLinkState) {\n return state.isExactActive ? `aria-current=\"${state.ariaCurrentValue}\"` : '';\n },\n isButton(state: RouterLinkState) {\n return state.tag === 'button';\n },\n disabledAttr(state: RouterLinkState) {\n return state.disabled\n ? state.isButton\n ? 'disabled aria-disabled=\"true\" tabindex=\"-1\"'\n : 'aria-disabled=\"true\" tabindex=\"-1\"'\n : '';\n },\n externalAttr(state: RouterLinkState) {\n return state.external && (state.tag === 'a' || !state.tag)\n ? 'target=\"_blank\" rel=\"noopener noreferrer\"'\n : '';\n },\n },\n reflect: [ 'to', 'tag', 'replace', 'exact', 'activeClass', 'exactActiveClass', 'ariaCurrentValue', 'disabled', 'external', 'style' ],\n style: (state: RouterLinkState) => state.style,\n template: (state) => html`\n ${state.isButton ? html`\n <button\n part=\"button\"\n class=\"${state.className}\"\n ${state.ariaCurrent}\n ${state.disabledAttr}\n ${state.externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></button>\n `(state) : html`\n <a\n part=\"link\"\n href=\"${state.to}\"\n class=\"${state.className}\"\n ${state.ariaCurrent}\n ${state.disabledAttr}\n ${state.externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></a>\n `(state)}\n `(state),\n navigate: (e: MouseEvent, state: RouterLinkState) => {\n if (state.disabled) {\n e.preventDefault();\n return;\n }\n // If external, let browser handle navigation\n if (state.external && (state.tag === 'a' || !state.tag)) {\n return;\n }\n e.preventDefault();\n if (state.replace) {\n router.replace(state.to);\n } else {\n router.push(state.to);\n }\n }\n });\n return router;\n}"],"names":["Store","initial","state","target","prop","value","notify","listeners","subscribe","listener","getState","fn","GlobalEventBus","eventName","data","now","counter","eventHandlers","handler","error","options","resolve","unsubscribe","stats","eventBus","isServer","createSSRAPI","renderToString","config","api","innerHTML","styleContent","attrs","attrString","key","escapeAttribute","html","formatHTML","escapeHTML","renderComponentsToString","components","context","htmlParts","css","styles","generateHydrationScript","componentConfigs","tag","str","line","depth","escapeIfUserInput","item","strings","values","flatten","val","flat","v","arr","res","result","hasAsync","valuePromises","i","prevStatic","isEventHandlerAttr","resolvedValues","asyncResult","asyncIndex","compile","id","classes","obj","className","useDataModel","el","stateObj","keyWithModifiers","rawKey","modifiers","s","setNestedState","path","keys","updateState","e","trueValue","falseValue","idx","radio","parent","isDevelopment","compileTemplate","templateString","development","cache","optimize","generateTemplateId","templateCache","metrics","performanceMetrics","compiled","parseAndCompileTemplate","findDOMPath","templateHTML","placeholder","findPlaceholderPath","node","currentPath","childIndex","child","container","template","TemplateAnalyzer","fragment","render","d","j","dynamicRegex","lastIndex","match","staticPart","attrMatch","attrName","styleProp","styleMatch","expression","finalStatic","_index","updateType","marker","_api","staticHTML","doc","getNodeByPath","root","current","index","renderCompiledTemplate","reconstructTemplate","updateCompiledTemplate","element","newState","oldState","update","newValue","applyUpdate","targetNode","walker","found","textContent","newText","hash","char","getVNodeKey","type","parentPath","model","safeReplaceChild","newChild","oldChild","err","mountVNode","vnode","textNode","k","childNode","parseVNodeFromHTML","nodes","createVNodeFromElement","elem","props","attr","tagName","vnodeKey","inputType","valueAttr","checkedAttr","children","patchVNode","oldVNode","newVNode","isMeaningfulVNode","oldChildren","newChildren","isControlled","newDom","inputEl","oldDom","isCustomElement","a","newTextNode","oldKeyMap","newKeySet","domOrder","mounted","newKeys","c","parseQuery","search","matchRoute","routes","route","paramNames","regexPath","m","regex","params","name","componentCache","resolveRouteComponent","mod","useRouter","base","getLocation","store","push","replace","back","url","query","loc","matchRouteSSR","reactive","initialState","computedMap","computedKeys","topProxy","set","changes","proxyCache","createReactive","reactiveProxy","receiver","oldValue","runtimePlugins","useRuntimePlugin","plugin","deepSanitizeObject","seen","dangerousKeys","sanitized","isPromise","ComponentElement","newTemplate","_oldValue","camelName","_","stateKey","initialType","num","input","modelAttr","stateValue","isFocused","isDirty","stateVal","textarea","select","bindExpr","arrMatch","arrKey","idxStr","propKey","_e","dotMatch","objKey","modifierStr","shadow","computedState","detail","unsub","styleEl","hydrateEls","handlers","p","templateResultOrPromise","templateResult","eventType","handlerName","boundHandler","safeClone","clone","out","sanitizeHTML","_match","safeAttrs","logCheckboxVNodes","sanitizedHTML","shadowRoot","containerEl","fragmentVNode","prevFragmentVNode","childVNode","dom","rootEl","actualRootNode","isInitialRender","isSameTemplate","fallbackError","listenerMap","refName","attachedTypes","originalAddEventListener","component","isDev","hasHMR","stateObjForKeys","primitiveKeys","RuntimeComponent","ComponentClass","initRouter","router","_state"],"mappings":"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"}
1
+ {"version":3,"file":"custom-elements-runtime.cjs.js","sources":["../src/lib/store.ts","../src/lib/event-bus.ts","../src/lib/ssr.ts","../src/lib/template-helpers.ts","../src/lib/data-binding.ts","../src/lib/template-compiler.ts","../src/lib/v-dom.ts","../src/lib/router.ts","../src/lib/computed-state.ts","../src/lib/runtime.ts"],"sourcesContent":["\n// Usage example\n// import { Store } from './lib/store';\n\n// export const globalState = Store({ theme: 'light', count: 0 });\n\n// // In a component\n// globalState.subscribe((state) => {\n// console.log('Global changed:', state.count);\n// });\n\n// src/lib/store.ts\ntype Listener<T> = (state: T) => void;\n\nexport function Store<T extends object>(initial: T) {\n let state = new Proxy(initial, {\n set: (target, prop, value) => {\n (target as any)[prop] = value;\n notify();\n return true;\n }\n });\n const listeners: Listener<T>[] = [];\n\n function subscribe(listener: Listener<T>) {\n listeners.push(listener);\n listener(state); // Initial call\n }\n\n function getState(): T {\n return state;\n }\n\n function notify() {\n listeners.forEach((fn) => fn(state));\n }\n\n return { subscribe, getState };\n}\n","\n/**\n * Event handler type for global event bus\n */\nexport type EventHandler<T = any> = (data: T) => void;\n\n/**\n * Event map type using Set for efficient handler management\n */\ntype EventMap = { [eventName: string]: Set<EventHandler> };\n\n\n/**\n * GlobalEventBus provides a singleton event bus for cross-component communication.\n * Uses Set for handler storage to optimize add/remove operations and prevent duplicates.\n */\nexport class GlobalEventBus extends EventTarget {\n private handlers: EventMap = {};\n private static instance: GlobalEventBus;\n private eventCounters: Map<string, { count: number; window: number }> = new Map();\n\n\n /**\n * Returns the singleton instance of GlobalEventBus\n */\n static getInstance(): GlobalEventBus {\n if (!GlobalEventBus.instance) {\n GlobalEventBus.instance = new GlobalEventBus();\n }\n return GlobalEventBus.instance;\n }\n\n // Enhanced emit method with better typing and event storm protection\n /**\n * Emit a global event with optional data. Includes event storm protection.\n * @param eventName - Name of the event\n * @param data - Optional event payload\n */\n emit<T = any>(eventName: string, data?: T): void {\n // Event storm protection\n const now = Date.now();\n const counter = this.eventCounters.get(eventName);\n \n if (!counter || now - counter.window > 1000) {\n // Reset counter every second\n this.eventCounters.set(eventName, { count: 1, window: now });\n } else {\n counter.count++;\n \n if (counter.count > 50) {\n // Too many events of the same type in one second\n console.error(`Event storm detected for \"${eventName}\": ${counter.count} events in 1 second. Throttling...`);\n \n // Throttle this event type for a short period\n if (counter.count > 100) {\n console.warn(`Blocking further \"${eventName}\" events to prevent infinite loop`);\n return;\n }\n }\n }\n\n // Use native CustomEvent for better browser integration\n this.dispatchEvent(new CustomEvent(eventName, { \n detail: data,\n bubbles: false, // Global events don't need to bubble\n cancelable: true \n }));\n\n // Also trigger registered handlers\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in global event handler for \"${eventName}\":`, error);\n }\n });\n }\n }\n\n\n /**\n * Register a handler for a global event. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n on<T = any>(eventName: string, handler: EventHandler<T>): () => void {\n if (!this.handlers[eventName]) {\n this.handlers[eventName] = new Set();\n }\n this.handlers[eventName].add(handler);\n return () => this.off(eventName, handler);\n }\n\n\n /**\n * Remove a specific handler for a global event.\n * @param eventName - Name of the event\n * @param handler - Handler function to remove\n */\n off<T = any>(eventName: string, handler: EventHandler<T>): void {\n const eventHandlers = this.handlers[eventName];\n if (eventHandlers) {\n eventHandlers.delete(handler);\n }\n }\n\n\n /**\n * Remove all handlers for a specific event.\n * @param eventName - Name of the event\n */\n offAll(eventName: string): void {\n delete this.handlers[eventName];\n }\n\n\n /**\n * Listen for a native CustomEvent. Returns an unsubscribe function.\n * @param eventName - Name of the event\n * @param handler - CustomEvent handler\n * @param options - AddEventListener options\n */\n listen<T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions): () => void {\n this.addEventListener(eventName, handler as EventListener, options);\n return () => this.removeEventListener(eventName, handler as EventListener);\n }\n\n\n /**\n * Register a one-time event handler. Returns a promise that resolves with the event data.\n * @param eventName - Name of the event\n * @param handler - Handler function\n */\n once<T = any>(eventName: string, handler: EventHandler<T>): Promise<T> {\n return new Promise((resolve) => {\n const unsubscribe = this.on(eventName, (data: T) => {\n unsubscribe();\n handler(data);\n resolve(data);\n });\n });\n }\n\n\n /**\n * Get a list of all active event names with registered handlers.\n */\n getActiveEvents(): string[] {\n return Object.keys(this.handlers).filter(eventName => \n this.handlers[eventName] && this.handlers[eventName].size > 0\n );\n }\n\n\n /**\n * Clear all event handlers (useful for testing or cleanup).\n */\n clear(): void {\n this.handlers = {};\n // Note: This doesn't clear native event listeners, use removeAllListeners if needed\n }\n\n\n /**\n * Get the number of handlers registered for a specific event.\n * @param eventName - Name of the event\n */\n getHandlerCount(eventName: string): number {\n return this.handlers[eventName]?.size || 0;\n }\n\n\n /**\n * Get event statistics for debugging.\n */\n getEventStats(): Record<string, { count: number; handlersCount: number }> {\n const stats: Record<string, { count: number; handlersCount: number }> = {};\n for (const [eventName, counter] of this.eventCounters.entries()) {\n stats[eventName] = {\n count: counter.count,\n handlersCount: this.getHandlerCount(eventName)\n };\n }\n return stats;\n }\n\n\n /**\n * Reset event counters (useful for testing or after resolving issues).\n */\n resetEventCounters(): void {\n this.eventCounters.clear();\n }\n}\n\n\n/**\n * Singleton instance of the global event bus\n */\nexport const eventBus = GlobalEventBus.getInstance();\n\n/**\n * Emit a global event\n */\nexport const emit = <T = any>(eventName: string, data?: T) => eventBus.emit(eventName, data);\n\n/**\n * Register a handler for a global event\n */\nexport const on = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.on(eventName, handler);\n\n/**\n * Remove a handler for a global event\n */\nexport const off = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.off(eventName, handler);\n\n/**\n * Register a one-time handler for a global event\n */\nexport const once = <T = any>(eventName: string, handler: EventHandler<T>) => eventBus.once(eventName, handler);\n\n/**\n * Listen for a native CustomEvent\n */\nexport const listen = <T = any>(eventName: string, handler: (event: CustomEvent<T>) => void, options?: AddEventListenerOptions) => \n eventBus.listen(eventName, handler, options);\n","import type { ComponentAPI, ComponentState } from './runtime';\n\n// ============================================================================\n// SSR TYPES & INTERFACES\n// ============================================================================\n\nexport interface SSRComponentConfig<T extends ComponentState = ComponentState> {\n readonly tag: string;\n readonly template: (state: T, api: ComponentAPI<T>) => string;\n /**\n * State object can include computed properties as getter functions that accept state as a parameter.\n */\n readonly state: T;\n readonly style?: string | ((state: T) => string);\n readonly attrs?: Record<string, string>;\n}\n\nexport interface SSRRenderOptions {\n /** Include component styles in the output */\n includeStyles?: boolean;\n /** Pretty print the HTML output */\n prettyPrint?: boolean;\n /** Custom attribute sanitization function */\n sanitizeAttributes?: (attrs: Record<string, string>) => Record<string, string>;\n}\n\nexport interface SSRContext {\n /** Track rendered components for hydration */\n components: Map<string, SSRComponentConfig>;\n /** Global styles collected during SSR */\n styles: Set<string>;\n}\n\n// Environment detection for treeshaking\nconst isServer = typeof window === 'undefined' || typeof document === 'undefined';\n\n// ============================================================================\n// SSR IMPLEMENTATION (Treeshakable)\n// ============================================================================\n\n/**\n * Create a minimal API for SSR that doesn't rely on DOM\n */\nexport function createSSRAPI<T extends ComponentState>(state: T): ComponentAPI<T> {\n return {\n state,\n emit: () => {}, // No-op on server\n onGlobal: () => () => {},\n offGlobal: () => {},\n emitGlobal: () => {},\n render: () => {}\n };\n}\n\n/**\n * Render a component to HTML string on the server\n * This function is treeshakable - only included when imported\n */\nexport function renderToString<T extends ComponentState>(\n config: SSRComponentConfig<T>,\n options: SSRRenderOptions = {}\n): string {\n if (!isServer) {\n console.warn('[SSR] renderToString should only be used on the server');\n }\n\n try {\n // Use state directly (getters will be available)\n const state = config.state;\n\n // Create API and render template\n const api = createSSRAPI(state);\n const innerHTML = config.template(state, api);\n \n // Generate component styles if needed\n let styleContent = '';\n if (options.includeStyles && config.style) {\n const css = typeof config.style === 'function' \n ? config.style(state) \n : config.style;\n styleContent = `<style>${css}</style>`;\n }\n\n // Sanitize attributes\n const attrs = options.sanitizeAttributes \n ? options.sanitizeAttributes(config.attrs || {})\n : config.attrs || {};\n\n // Build attribute string\n const attrString = Object.entries(attrs)\n .map(([key, value]) => `${escapeAttribute(key)}=\"${escapeAttribute(value)}\"`)\n .join(' ');\n\n // Construct final HTML\n const openTag = attrString \n ? `<${config.tag} ${attrString}>` \n : `<${config.tag}>`;\n \n const html = `${openTag}${styleContent}${innerHTML}</${config.tag}>`;\n\n return options.prettyPrint ? formatHTML(html) : html;\n \n } catch (error) {\n console.error(`[SSR] Error rendering ${config.tag}:`, error);\n return `<${config.tag}><div style=\"color: red;\">SSR Error: ${escapeHTML(String(error))}</div></${config.tag}>`;\n }\n}\n\n/**\n * Render multiple components to HTML with shared context\n */\nexport function renderComponentsToString(\n components: SSRComponentConfig<any>[],\n options: SSRRenderOptions = {}\n): { html: string; styles: string; context: SSRContext } {\n const context: SSRContext = {\n components: new Map(),\n styles: new Set(),\n };\n\n const htmlParts: string[] = [];\n \n components.forEach(config => {\n // Track component for hydration\n context.components.set(config.tag, config);\n \n // Collect styles\n if (config.style) {\n const css = typeof config.style === 'function' \n ? config.style(config.state) \n : config.style;\n context.styles.add(css);\n }\n \n // Render component\n const html = renderToString(config, { ...options, includeStyles: false });\n htmlParts.push(html);\n });\n\n const styles = Array.from(context.styles).join('\\n');\n const html = htmlParts.join('\\n');\n\n return { html, styles, context };\n}\n\n/**\n * Generate hydration script for client-side takeover\n */\nexport function generateHydrationScript(context: SSRContext): string {\n const componentConfigs = Array.from(context.components.entries()).map(([tag, config]) => ({\n tag,\n state: config.state,\n }));\n\n return `\n<script type=\"module\">\n // Hydration data from SSR\n window.__SSR_CONTEXT__ = ${JSON.stringify({ components: componentConfigs })};\n \n // Auto-hydrate when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', hydrate);\n } else {\n hydrate();\n }\n \n function hydrate() {\n const context = window.__SSR_CONTEXT__;\n if (!context?.components) return;\n \n context.components.forEach(({ tag, state }) => {\n const elements = document.querySelectorAll(tag);\n elements.forEach(el => {\n // Mark as hydrated to prevent re-initialization\n if (!el.hasAttribute('data-hydrated')) {\n el.setAttribute('data-hydrated', 'true');\n // Restore state if component supports it\n if (el._hydrateWithState) {\n el._hydrateWithState(state);\n }\n }\n });\n });\n \n // Clean up\n delete window.__SSR_CONTEXT__;\n }\n</script>`.trim();\n}\n\n// ============================================================================\n// SSR UTILITIES\n// ============================================================================\n\nexport const escapeHTML = (str: string): string => {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nexport const escapeAttribute = (str: string): string => {\n return str\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nexport const formatHTML = (html: string): string => {\n // Simple HTML formatting for development\n return html\n .replace(/></g, '>\\n<')\n .split('\\n')\n .map(line => {\n const depth = (line.match(/^<[^\\/]/g) || []).length - (line.match(/<\\//g) || []).length;\n return ' '.repeat(Math.max(0, depth)) + line.trim();\n })\n .join('\\n');\n}\n","import type { CompiledTemplate } from './template-compiler.js';\n\n/**\n * TemplateResult type for template helpers\n */\nexport type TemplateResult = string | CompiledTemplate | ((state?: any) => string);\n\n/**\n * Escape HTML entities for safe rendering of user-generated content.\n */\nfunction escapeHTML(str: string): string {\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n// Escapes any string value that matches a property in state or computed properties\nfunction escapeIfUserInput(value: unknown, state: any): string {\n if (typeof value !== 'string' || !state) return String(value);\n // Check direct state properties\n for (const key in state) {\n if (typeof state[key] === 'string' && value === state[key]) {\n return escapeHTML(value);\n }\n // For arrays of objects (e.g., todos), check each object's string properties\n if (Array.isArray(state[key])) {\n for (const item of state[key]) {\n if (item && typeof item === 'object') {\n for (const prop in item) {\n if (typeof item[prop] === 'string' && value === item[prop]) {\n return escapeHTML(value);\n }\n }\n }\n }\n }\n }\n return String(value);\n}\n\n/**\n * Tagged template literal for HTML strings.\n * Returns a pure function for rendering with state and api.\n * @param strings - Template strings\n * @param values - Dynamic values (functions or primitives)\n */\nexport function html(\n strings: TemplateStringsArray,\n ...values: unknown[]\n): (state?: any, api?: any) => string | Promise<string> {\n function flatten(val: any, state?: any, api?: any): any {\n if (Array.isArray(val)) {\n const flat = val.map(v => flatten(v, state, api));\n return flat.some(v => v instanceof Promise)\n ? Promise.all(flat).then(arr => arr.join(''))\n : flat.join('');\n }\n if (typeof val === 'function') {\n const res = flatten(val(state, api), state, api);\n return res instanceof Promise ? res : res;\n }\n if (val === null || val === undefined) return '';\n return val instanceof Promise ? val : String(val);\n }\n return (state?: any, api?: any) => {\n let result = '';\n let hasAsync = false;\n const valuePromises: Promise<any>[] = [];\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n let value = values[i];\n const prevStatic = strings[i];\n const isEventHandlerAttr = /data-on-[a-z]+=\"?$/.test(prevStatic);\n value = flatten(value, state, api);\n if (value instanceof Promise) {\n hasAsync = true;\n valuePromises.push(value);\n } else {\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string' && !isEventHandlerAttr) {\n // Attribute value: escape both double and single quotes\n value = value.replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n result += value;\n } else if (!isEventHandlerAttr && !/=\\s*\"?$/.test(prevStatic)) {\n // Text node: always escape user input\n result += escapeIfUserInput(value, state);\n } else {\n result += value;\n }\n }\n }\n }\n if (!hasAsync) return result;\n // If any value is a Promise, resolve all and reconstruct\n return Promise.all(valuePromises).then(resolvedValues => {\n let asyncResult = '';\n let asyncIndex = 0;\n for (let i = 0; i < strings.length; i++) {\n asyncResult += strings[i];\n if (i < values.length) {\n let value = values[i];\n const prevStatic = strings[i];\n const isEventHandlerAttr = /data-on-[a-z]+=\"?$/.test(prevStatic);\n value = flatten(value, state, api);\n if (value instanceof Promise) {\n asyncResult += resolvedValues[asyncIndex++];\n } else {\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string' && !isEventHandlerAttr) {\n value = value.replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n asyncResult += value;\n } else if (!isEventHandlerAttr && !/=\\s*\"?$/.test(prevStatic)) {\n asyncResult += escapeIfUserInput(value, state);\n } else {\n asyncResult += value;\n }\n }\n }\n }\n return asyncResult;\n });\n };\n}\n\n/**\n * CompiledTemplateFn type for compiled templates\n */\nexport interface CompiledTemplateFn {\n (state: any, api?: any): string;\n id: string;\n}\n\n/**\n * compile helper: returns a compiled template function with a unique id property.\n * Accepts tagged template literals and dynamic values (functions or primitives).\n * @param strings - Template strings\n * @param values - Dynamic values\n */\nexport function compile(strings: TemplateStringsArray, ...values: any[]): CompiledTemplateFn {\n const id = 'compiled-' + Math.random().toString(36).slice(2);\n function flatten(val: any, state?: any, api?: any): string {\n if (Array.isArray(val)) return val.map(v => flatten(v, state, api)).join('');\n if (typeof val === 'function') return flatten(val(state, api), state, api);\n if (val == null) return '';\n return String(val);\n }\n const fn = (state: any, api?: any) => {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n let value = values[i];\n const prevStatic = strings[i];\n const isEventHandlerAttr = /data-on-[a-z]+=\"?$/.test(prevStatic);\n value = flatten(value, state, api);\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string' && !isEventHandlerAttr) {\n value = value.replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n result += value;\n } else if (!isEventHandlerAttr && !/=\\s*\"?$/.test(prevStatic)) {\n result += escapeIfUserInput(value, state);\n } else {\n result += value ?? '';\n }\n }\n }\n return result;\n };\n (fn as CompiledTemplateFn).id = id;\n return fn as CompiledTemplateFn;\n}\n\n/**\n * Tagged template literal for CSS strings.\n * Returns a pure string for use in style blocks.\n * @param strings - Template strings\n * @param values - Dynamic values\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 * Helper for conditional classes. Returns a space-separated string of class names.\n * @param obj - Object with class names as keys and boolean conditions as values\n */\nexport function classes(obj: Record<string, boolean>): string {\n return Object.keys(obj).filter(className => obj[className]).join(' ');\n}\n\n/**\n * Helper for inline styles. Returns a CSS string for use in style attributes.\n * @param obj - Object with style properties and values\n */\nexport function styles(obj: Record<string, string | number>): string {\n return Object.entries(obj)\n .map(([prop, value]) => `${prop}: ${value}`)\n .join('; ');\n}\n","/**\n * Minimal controlled input binding helper for data-model attributes.\n * Handles checkboxes, radios, text, and modifiers (trim, number).\n * @param el - Input/select/textarea element\n * @param stateObj - State object to bind\n * @param keyWithModifiers - Key and optional modifiers (e.g. 'name|trim|number')\n */\nexport function useDataModel<T extends Record<string, unknown>>(el: Element, stateObj: T, keyWithModifiers: string) {\n const [rawKey, ...modifiers] = keyWithModifiers.split('|').map(s => s.trim());\n if (!rawKey || rawKey === '__proto__' || rawKey === 'constructor' || rawKey === 'prototype') return;\n // Helper to set nested state (dot notation)\n function setNestedState(obj: any, path: string, value: unknown) {\n const keys = path.split('.');\n let target = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n if (!(keys[i] in target)) target[keys[i]] = {};\n target = target[keys[i]];\n }\n target[keys[keys.length - 1]] = value;\n }\n const updateState = (e: Event) => {\n let value: unknown;\n if (el instanceof HTMLInputElement && el.type === 'checkbox') {\n value = el.value;\n const trueValue = el.getAttribute('data-true-value');\n const falseValue = el.getAttribute('data-false-value');\n let arr = Array.isArray(stateObj[rawKey]) ? (stateObj[rawKey] as unknown[]) : undefined;\n if (arr) {\n if (el.checked) {\n if (!arr.includes(value)) arr.push(value);\n } else {\n const idx = arr.indexOf(value);\n if (idx !== -1) arr.splice(idx, 1);\n }\n setNestedState(stateObj, rawKey, [...arr]);\n } else {\n if (trueValue !== null || falseValue !== null) {\n if (el.checked) {\n setNestedState(stateObj, rawKey, trueValue);\n } else {\n setNestedState(stateObj, rawKey, falseValue !== null ? falseValue : false);\n }\n } else {\n setNestedState(stateObj, rawKey, el.checked);\n }\n }\n } else if (el instanceof HTMLInputElement && el.type === 'radio') {\n value = el.value;\n setNestedState(stateObj, rawKey, value);\n const radios = (el.form || el.closest('form') || el.getRootNode()) instanceof Element\n ? ((el.form || el.closest('form') || el.getRootNode()) as Element).querySelectorAll(`input[type=\"radio\"][name=\"${el.name}\"][data-model=\"${keyWithModifiers}\"]`)\n : [];\n radios.forEach((radio: Element) => {\n (radio as HTMLInputElement).checked = (radio as HTMLInputElement).value === String(value);\n });\n } else {\n // Always read value from event target for input events\n // Always read value from the input element itself for robustness\n value = (el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n if (el instanceof HTMLInputElement && el.type === 'number') {\n value = Number(value);\n }\n if (modifiers.includes('trim') && typeof value === 'string') {\n value = value.trim();\n }\n if (modifiers.includes('number')) {\n value = Number(value);\n }\n setNestedState(stateObj, rawKey, value);\n }\n if ('_vnode' in el && typeof (el as any)._vnode === 'object' && (el as any)._vnode?.props) {\n (el as any)._vnode.props.value = value;\n }\n if (e.type === 'input') {\n (el as { _isDirty?: boolean })._isDirty = true;\n }\n if (e.type === 'keydown' && (e as KeyboardEvent).key === 'Enter') {\n (el as { _isDirty?: boolean })._isDirty = false;\n if (el instanceof HTMLElement && el.isConnected) {\n let parent = el.parentElement;\n while (parent && !(parent instanceof HTMLElement && parent.shadowRoot)) {\n parent = parent.parentElement;\n }\n if (parent && typeof parent === 'object' && parent !== null && 'render' in parent && typeof (parent as any).render === 'function') {\n (parent as HTMLElement & { render: () => void }).render();\n }\n }\n }\n if (e.type === 'blur') {\n (el as { _isDirty?: boolean })._isDirty = false;\n }\n };\n el.addEventListener('input', updateState);\n el.addEventListener('change', updateState);\n el.addEventListener('keydown', updateState);\n el.addEventListener('blur', updateState);\n}","/**\n * Template Compiler for Custom Elements Runtime\n * \n * Provides compile-time template optimization for better runtime performance.\n * Features:\n * - Static/dynamic separation\n * - Efficient DOM updates\n * - Treeshakable\n * - TypeScript-friendly\n * - Development-friendly fallbacks\n */\n\n// ============================================================================\n// CORE TYPES\n// ============================================================================\n\nexport interface CompiledTemplate<T = any> {\n /** Static HTML parts that never change */\n readonly statics: readonly string[];\n /** Dynamic update functions for each interpolation */\n readonly dynamics: readonly UpdateFunction<T>[];\n /** Pre-compiled DOM fragment for initial render */\n readonly fragment: DocumentFragment | null;\n /** Unique template ID for caching */\n readonly id: string;\n /** Whether this template has dynamic content */\n readonly hasDynamics: boolean;\n /** Render method supporting async output */\n render: (state: T, api: any) => string | Promise<string>;\n}\n\nexport interface UpdateFunction<T = any> {\n /** Target node path from root (e.g., [0, 1] means first child's second child) */\n readonly path: readonly number[];\n /** Type of update (text, attribute, property, etc.) */\n readonly type: UpdateType;\n /** Target property/attribute name (for non-text updates) */\n readonly target?: string;\n /** Function to extract value from state */\n readonly getValue: (state: T, api: any) => unknown;\n}\n\nexport type UpdateType = 'text' | 'attribute' | 'property' | 'event' | 'class' | 'style';\n\nexport interface TemplateCompilerOptions {\n /** Enable development mode with better error messages */\n development?: boolean;\n /** Cache compiled templates */\n cache?: boolean;\n /** Enable static analysis optimizations */\n optimize?: boolean;\n}\n\n// Global development mode detection\nconst isDevelopment = (() => {\n try {\n // @ts-ignore - Check for Node.js environment\n if (typeof process !== 'undefined' && process.env) {\n // @ts-ignore\n return process.env.NODE_ENV === 'development';\n }\n } catch {\n // Ignore Node.js check in browser\n }\n if (typeof window !== 'undefined') {\n return window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';\n }\n return false;\n})();\n\n// ============================================================================\n// TEMPLATE COMPILATION\n// ============================================================================\n\n/**\n * Compile a template string into an optimized template object\n * This is meant to be used at build time for best performance\n */\nexport function compileTemplate<T = any>(\n templateString: string,\n options: TemplateCompilerOptions = {}\n): CompiledTemplate<T> {\n const { development = isDevelopment, cache = true, optimize = true } = options;\n \n // Generate unique ID for caching\n const id = generateTemplateId(templateString);\n \n // Check cache first\n if (cache && templateCache.has(id)) {\n // Track cache hit\n if (development) {\n const metrics = performanceMetrics.get(id) || {\n compilationTime: 0,\n renderTime: 0,\n updateTime: 0,\n cacheHits: 0,\n cacheMisses: 0\n };\n metrics.cacheHits++;\n performanceMetrics.set(id, metrics);\n }\n return templateCache.get(id)!;\n }\n \n // Track cache miss\n if (development) {\n const metrics = performanceMetrics.get(id) || {\n compilationTime: 0,\n renderTime: 0,\n updateTime: 0,\n cacheHits: 0,\n cacheMisses: 0\n };\n metrics.cacheMisses++;\n performanceMetrics.set(id, metrics);\n }\n \n try {\n const compiled = parseAndCompileTemplate<T>(templateString, { development, optimize });\n \n if (cache) {\n templateCache.set(id, compiled);\n }\n \n return compiled;\n } catch (error) {\n if (development) {\n console.error('[Template Compiler] Error compiling template:', error);\n console.error('[Template Compiler] Template:', templateString);\n }\n \n // Fallback: always return original template string as static content\n return {\n statics: [templateString],\n dynamics: [],\n fragment: null,\n id,\n hasDynamics: false,\n render: () => templateString\n };\n }\n}\n\n/**\n * Tagged template literal for compile-time optimization\n * Usage: compile`<div>${state.name}</div>`\n */\n/**\n * Find the DOM path to a placeholder in the template HTML\n */\nexport function findDOMPath(templateHTML: string, placeholder: string): number[] {\n // Create a temporary DOM to analyze the structure\n if (typeof document === 'undefined') {\n return [0]; // Fallback for server-side\n }\n \n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<div>${templateHTML}</div>`, 'text/html');\n const container = doc.body.firstElementChild!;\n \n // Find the element or text node containing the placeholder\n function findPlaceholderPath(node: Node, currentPath: number[] = []): number[] | null {\n if (node.nodeType === Node.TEXT_NODE) {\n if (node.textContent?.includes(placeholder)) {\n return currentPath;\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n // Check child nodes, but use a more robust indexing that accounts for the actual DOM structure\n let childIndex = 0;\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n const result = findPlaceholderPath(child, [...currentPath, childIndex]);\n if (result) {\n return result;\n }\n childIndex++;\n }\n }\n return null;\n }\n \n const path = findPlaceholderPath(container);\n return path || [0];\n } catch (error) {\n if (isDevelopment) {\n console.warn('[Template Compiler] Error finding DOM path for placeholder:', placeholder, error);\n }\n return [0]; // Safe fallback\n }\n}\n\nexport function compile<T = any>(\n strings: TemplateStringsArray,\n ...expressions: Array<(state: T, api: any) => unknown>\n): CompiledTemplate<T> {\n // Create statics array directly from strings\n const statics: string[] = Array.from(strings);\n const templateHTML = strings.map((str, i) => str + (i < expressions.length ? `__DYNAMIC_${i}__` : '')).join('');\n const dynamics: UpdateFunction<T>[] = expressions.map((expr, index) => {\n // Analyze the dynamic expression to determine type and target\n let updateType: UpdateType = 'text';\n let target: string | undefined;\n let valueGetter: (state: T, api: any) => unknown = expr;\n let exprString = expr.toString();\n let prop = exprString.match(/state\\.([a-zA-Z0-9_$]+)/)?.[1];\n // Parse template HTML to detect attribute context for this dynamic\n const dynMarker = `__DYNAMIC_${index}__`;\n if (prop) {\n const prevStatic = strings[index];\n if (/class\\s*=/.test(prevStatic)) {\n updateType = 'class';\n target = 'class';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/style\\s*=/.test(prevStatic) && /[a-zA-Z-]+:\\s*$/.test(prevStatic)) {\n const stylePropMatch = prevStatic.match(/([a-zA-Z-]+):\\s*$/);\n const styleProp = stylePropMatch ? stylePropMatch[1] : 'style';\n updateType = 'style';\n target = styleProp;\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/value\\s*=/.test(prevStatic)) {\n updateType = 'property';\n target = 'value';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/title\\s*=/.test(prevStatic)) {\n updateType = 'attribute';\n target = 'title';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (/style=\"([a-zA-Z-]+):$/.test(prevStatic)) {\n const stylePropMatch = prevStatic.match(/style=\"([a-zA-Z-]+):$/);\n const styleProp = stylePropMatch ? stylePropMatch[1] : 'style';\n updateType = 'style';\n target = styleProp;\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else if (prevStatic.endsWith('style=\"color:')) {\n updateType = 'style';\n target = 'color';\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n } else {\n // Fallback to attribute\n updateType = 'attribute';\n target = prop;\n valueGetter = (state: T) => {\n const v = (state as any)[prop];\n return v;\n };\n }\n } else {\n // Fallback to previous logic for text, event, class.prop, style.prop\n if (exprString.includes('class.') && exprString.match(/class\\.([a-zA-Z0-9_$]+)/)) {\n updateType = 'class';\n target = exprString.match(/class\\.([a-zA-Z0-9_$]+)/)?.[1];\n valueGetter = (state: T) => (state as any)[target!];\n } else if (exprString.includes('style.') && exprString.match(/style\\.([a-zA-Z0-9_$]+)/)) {\n updateType = 'style';\n target = exprString.match(/style\\.([a-zA-Z0-9_$]+)/)?.[1];\n valueGetter = (state: T) => (state as any)[target!];\n } else if (exprString.includes('@')) {\n updateType = 'event';\n target = exprString.split('@')[1];\n }\n }\n const path = findDOMPath(templateHTML, dynMarker);\n return {\n path,\n type: updateType,\n target,\n getValue: valueGetter\n };\n });\n const templateString = strings.join('{{PLACEHOLDER}}');\n const id = generateTemplateId(templateString);\n const render = (state: T, api: any): string | Promise<string> => {\n let result = '';\n let hasAsync = false;\n const valuePromises: Promise<any>[] = [];\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < expressions.length) {\n let value = expressions[i](state, api);\n if (value instanceof Promise) {\n hasAsync = true;\n valuePromises.push(value);\n } else {\n // Escape double quotes if previous static ends with attribute=\n const prevStatic = strings[i];\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string') {\n value = value.replace(/\"/g, '&quot;');\n }\n result += value;\n }\n }\n }\n if (!hasAsync) return result;\n return Promise.all(valuePromises).then(resolvedValues => {\n let asyncResult = '';\n let asyncIndex = 0;\n for (let i = 0; i < strings.length; i++) {\n asyncResult += strings[i];\n if (i < expressions.length) {\n let value = expressions[i](state, api);\n if (value instanceof Promise) {\n value = resolvedValues[asyncIndex++];\n }\n // Escape double quotes if previous static ends with attribute=\n const prevStatic = strings[i];\n if (/=\\s*\"?$/.test(prevStatic) && typeof value === 'string') {\n value = value.replace(/\"/g, '&quot;');\n }\n asyncResult += value;\n }\n }\n return asyncResult;\n });\n };\n return {\n id,\n statics,\n dynamics,\n hasDynamics: dynamics.length > 0,\n fragment: null,\n render\n };\n}\n\n// ============================================================================\n// TEMPLATE PARSING & ANALYSIS\n// ============================================================================\n\nexport function parseAndCompileTemplate<T>(\n template: string,\n options: { development: boolean; optimize: boolean }\n): CompiledTemplate<T> {\n const parser = new TemplateAnalyzer(template, options);\n return parser.compile<T>();\n}\n\nexport class TemplateAnalyzer {\n private readonly template: string;\n private readonly options: { development: boolean; optimize: boolean };\n private readonly dynamics: UpdateFunction<any>[] = [];\n private statics: string[] = [];\n \n constructor(template: string, options: { development: boolean; optimize: boolean }) {\n this.template = template;\n this.options = options;\n }\n \n compile<T>(): CompiledTemplate<T> {\n // Parse template for dynamic expressions\n this.parseTemplate();\n \n // Create static fragment if possible\n const fragment = this.createStaticFragment();\n \n // Generate unique ID\n const id = generateTemplateId(this.template);\n \n // Render method for static/dynamic templates\n const render = (state: T, api: any): string | Promise<string> => {\n let result = '';\n for (let i = 0; i < this.statics.length; i++) {\n result += this.statics[i];\n if (i < this.dynamics.length) {\n let value = this.dynamics[i].getValue(state, api);\n if (value instanceof Promise) {\n // If any dynamic value is async, resolve all and reconstruct\n return Promise.all(this.dynamics.map(d => {\n const v = d.getValue(state, api);\n return v instanceof Promise ? v : Promise.resolve(v);\n })).then(resolvedValues => {\n let asyncResult = '';\n for (let j = 0; j < this.statics.length; j++) {\n asyncResult += this.statics[j];\n if (j < resolvedValues.length) asyncResult += resolvedValues[j];\n }\n return asyncResult;\n });\n }\n result += value;\n }\n }\n return result;\n };\n return {\n statics: this.statics,\n dynamics: this.dynamics as UpdateFunction<T>[],\n fragment,\n id,\n hasDynamics: this.dynamics.length > 0,\n render\n };\n }\n \n private parseTemplate(): void {\n // Improved regex-based parsing for dynamic expressions\n // Ensures statics never contain {{...}} placeholders\n const dynamicRegex = /\\{\\{([^}]+)\\}\\}/g;\n let lastIndex = 0;\n let match;\n while ((match = dynamicRegex.exec(this.template)) !== null) {\n // Add static part before this match, excluding any {{...}}\n const staticPart = this.template.slice(lastIndex, match.index);\n this.statics.push(staticPart);\n // Try to detect attribute/property/class/style name from staticPart\n let attrMatch = staticPart.match(/([a-zA-Z0-9_-]+)\\s*=\\s*\"?$/);\n let attrName = attrMatch ? attrMatch[1] : undefined;\n let styleProp: string | undefined;\n // Special handling for style=\"color:{{value}}\"\n if (staticPart.endsWith('style=\"color:')) {\n attrName = 'style';\n styleProp = 'color';\n } else if (attrName === 'style') {\n // Try to extract style property name from staticPart\n const styleMatch = staticPart.match(/style\\s*=\\s*\"?([^:;]+):\\s*$/);\n if (styleMatch) {\n styleProp = styleMatch[1].trim();\n }\n }\n // Analyze the dynamic expression\n const expression = match[1].trim();\n this.analyzeDynamicExpression(expression, this.dynamics.length, attrName, styleProp);\n lastIndex = match.index + match[0].length;\n }\n // Add final static part, ensuring no trailing {{...}}\n const finalStatic = this.template.slice(lastIndex);\n this.statics.push(finalStatic);\n }\n \n private analyzeDynamicExpression(expression: string, _index: number, attrName?: string, styleProp?: string): void {\n // Simple expression analysis\n let updateType: UpdateType = 'text';\n let target: string | undefined;\n\n // Detect class/style/attribute/property updates\n if (attrName) {\n if (attrName === 'class') {\n updateType = 'class';\n target = 'class';\n } else if (attrName === 'style') {\n updateType = 'style';\n target = styleProp || 'style';\n } else if (attrName === 'value') {\n updateType = 'property';\n target = 'value';\n } else {\n updateType = 'attribute';\n target = attrName;\n }\n } else if (expression.includes('class.')) {\n updateType = 'class';\n target = expression.split('.')[1];\n } else if (expression.includes('style.')) {\n updateType = 'style';\n target = expression.split('.')[1];\n } else if (expression.includes('@')) {\n updateType = 'event';\n target = expression.split('@')[1];\n } else if (expression === 'class') {\n updateType = 'class';\n target = 'class';\n } else if (expression === 'style') {\n updateType = 'style';\n target = 'style';\n } else if (expression === 'value') {\n updateType = 'property';\n target = 'value';\n } else if (expression === 'title') {\n updateType = 'attribute';\n target = 'title';\n }\n\n // Use findDOMPath to locate the correct node for this dynamic expression\n const marker = `__DYNAMIC_${_index}__`;\n const templateHTML = this.statics.join(marker);\n let path = findDOMPath(templateHTML, marker);\n // If template is a single root element, use [0] as path for non-text updates\n if (this.statics.length === 2 && (updateType !== 'text')) {\n path = [0];\n } else if (this.statics.length === 2 && path.length === 0) {\n path = [0];\n }\n this.dynamics.push({\n path,\n type: updateType,\n target,\n getValue: this.createValueGetter(expression)\n });\n }\n private createValueGetter(expression: string): (state: any, api: any) => unknown {\n // Always evaluate at render time, never cache\n return (state: any, _api: any) => {\n try {\n let value;\n // Always use the dynamic expression for state lookup\n if (expression && typeof expression === 'function') {\n value = (expression as (s: any) => any)(state);\n } else if (typeof expression === 'string' && expression.startsWith('state.')) {\n const prop = expression.slice(6);\n value = state[prop];\n } else if (typeof expression === 'string' && /^[a-zA-Z0-9_$]+$/.test(expression)) {\n value = state[expression];\n } else if (typeof expression === 'string' && expression.includes('(')) {\n value = '';\n } else {\n value = '';\n }\n return value;\n } catch (error) {\n if (this.options.development) {\n console.warn(`[Template Compiler] Error evaluating expression: ${expression}`, error);\n }\n return '';\n }\n };\n }\n \n private createStaticFragment(): DocumentFragment | null {\n // Skip fragment creation on server\n if (typeof document === 'undefined') {\n return null;\n }\n \n try {\n // Create a static version by removing dynamic parts\n const staticHTML = this.statics.join('');\n \n if (!staticHTML.trim()) {\n return null;\n }\n \n const parser = new DOMParser();\n const doc = parser.parseFromString(staticHTML, 'text/html');\n const fragment = document.createDocumentFragment();\n \n while (doc.body.firstChild) {\n fragment.appendChild(doc.body.firstChild);\n }\n \n return fragment;\n } catch (error) {\n if (this.options.development) {\n console.warn('[Template Compiler] Could not create static fragment:', error);\n }\n return null;\n }\n }\n}\n\n// Utility function for both initial render and updates\nfunction getNodeByPath(root: Element | DocumentFragment, path: readonly number[]): Node | null {\n try {\n if (path.length === 1 && path[0] === 0 && root instanceof Element) {\n return root;\n }\n let current: Node = root;\n for (let i = 0; i < path.length; i++) {\n const index = path[i];\n if (!current.childNodes || current.childNodes.length <= index) {\n return null;\n }\n current = current.childNodes[index];\n }\n return current;\n } catch {\n return null;\n }\n}\n\n// ============================================================================\n// OPTIMIZED RENDERER\n// ============================================================================\n\n/**\n * Render a compiled template efficiently\n */\nexport function renderCompiledTemplate<T>(\n compiled: CompiledTemplate<T>,\n state: T,\n api: any\n): DocumentFragment {\n // Use pre-compiled fragment if available\n let fragment: DocumentFragment;\n \n if (compiled.fragment && !compiled.hasDynamics) {\n // Pure static template - just clone\n fragment = compiled.fragment.cloneNode(true) as DocumentFragment;\n } else {\n // Dynamic template - reconstruct with current values\n fragment = reconstructTemplate(compiled, state, api);\n }\n \n return fragment;\n}\n\n/**\n * Update a rendered template with new state efficiently\n */\nexport function updateCompiledTemplate<T>(\n compiled: CompiledTemplate<T>,\n element: Element,\n newState: T,\n api: any,\n oldState?: T\n): void {\n if (!compiled.hasDynamics) {\n return; // Nothing to update in static templates\n }\n // Apply each dynamic update\n for (const update of compiled.dynamics) {\n try {\n const newValue = update.getValue(newState, api);\n if (oldState !== undefined) {\n const oldValue = update.getValue(oldState, api);\n if (oldValue === newValue) {\n continue;\n }\n }\n applyUpdate(element, update, newValue);\n } catch (error) {\n console.warn('[Template Compiler] Error applying update:', error);\n }\n }\n}\n\nfunction reconstructTemplate<T>(\n compiled: CompiledTemplate<T>,\n state: T,\n api: any\n): DocumentFragment {\n // Reconstruct HTML from statics and dynamics\n let html = '';\n \n for (let i = 0; i < compiled.statics.length; i++) {\n html += compiled.statics[i];\n if (i < compiled.dynamics.length) {\n const update = compiled.dynamics[i];\n if (update.type === 'text' || update.type === 'attribute') {\n const value = update.getValue(state, api);\n html += String(value ?? '');\n } else if (update.type === 'property' || update.type === 'class' || update.type === 'style') {\n html += '';\n }\n }\n }\n \n // Parse the reconstructed HTML\n if (typeof document === 'undefined') {\n // Server-side fallback - return empty fragment\n return new DocumentFragment();\n }\n \n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const fragment = document.createDocumentFragment();\n \n while (doc.body.firstChild) {\n fragment.appendChild(doc.body.firstChild);\n }\n\n // Apply initial dynamic values to fragment\n for (const update of compiled.dynamics) {\n const value = update.getValue(state, api);\n const targetNode = getNodeByPath(fragment, update.path) as Element;\n applyUpdate(targetNode, update, value);\n }\n\n return fragment;\n}\n\nfunction applyUpdate(element: Element, update: UpdateFunction, value: unknown): void {\n try {\n if (update.type === 'text') {\n // Use TreeWalker to find and update text nodes containing 'Count: '\n const walker = document.createTreeWalker(\n element,\n NodeFilter.SHOW_TEXT\n );\n let found = false;\n let node;\n while (node = walker.nextNode()) {\n const textContent = node.textContent || '';\n if (textContent.includes('Count: ')) {\n // Replace the number after 'Count: '\n const newText = textContent.replace(/Count: \\d+/, `Count: ${value}`);\n node.textContent = newText;\n found = true;\n }\n }\n if (found) return;\n // Fallback to path-based update for general text nodes\n const targetNode = getNodeByPath(element, update.path);\n if (targetNode && targetNode.nodeType === Node.TEXT_NODE) {\n targetNode.textContent = value == null ? '' : String(value);\n }\n return;\n }\n // Fallback to path-based updates for other types\n const targetNode = getNodeByPath(element, update.path);\n if (!targetNode) {\n return;\n }\n switch (update.type) {\n case 'attribute':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n const el = targetNode as Element;\n if (value == null || value === '') {\n el.removeAttribute(update.target);\n } else {\n el.setAttribute(update.target, String(value));\n }\n }\n break;\n case 'property':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n (targetNode as any)[update.target] = value == null ? '' : value;\n (targetNode as Element).setAttribute(update.target, value == null ? '' : String(value));\n }\n break;\n case 'class':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n const el = targetNode as Element;\n el.className = value == null ? '' : String(value);\n el.setAttribute('class', value == null ? '' : String(value));\n }\n break;\n case 'style':\n if (targetNode.nodeType === Node.ELEMENT_NODE && update.target) {\n const el = targetNode as HTMLElement;\n el.style[update.target as any] = value == null ? '' : String(value);\n el.setAttribute('style', value == null ? `${update.target}:` : `${update.target}:${value}`);\n }\n break;\n default:\n throw new Error(`Unknown update type: ${update.type}`);\n }\n } catch (error) {\n if (typeof globalThis !== 'undefined' ? (globalThis as any)['isDevelopment'] : isDevelopment) {\n console.warn('[Template Compiler] Error applying update:', update, error);\n }\n // Silently fail in production to prevent crashes\n }\n}\n\n\n// ============================================================================\n// UTILITIES\n// ============================================================================\n\nconst templateCache = new Map<string, CompiledTemplate<any>>();\n\n// Performance tracking for production monitoring\ninterface PerformanceMetrics {\n compilationTime: number;\n renderTime: number;\n updateTime: number;\n cacheHits: number;\n cacheMisses: number;\n}\n\nconst performanceMetrics = new Map<string, PerformanceMetrics>();\n\nfunction generateTemplateId(template: string): string {\n // Simple hash function for template IDs\n let hash = 0;\n for (let i = 0; i < template.length; i++) {\n const char = template.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return `tpl_${Math.abs(hash).toString(36)}`;\n}\n\n// ============================================================================\n// DEVELOPMENT UTILITIES\n// ============================================================================\n\n/**\n * Development helper to analyze template performance\n */\nexport function analyzeTemplate(template: string): {\n staticParts: number;\n dynamicParts: number;\n complexity: 'low' | 'medium' | 'high';\n recommendations: string[];\n} {\n const compiled = compileTemplate(template, { development: true });\n \n const dynamicCount = compiled.dynamics.length;\n const staticCount = compiled.statics.length;\n \n let complexity: 'low' | 'medium' | 'high' = 'low';\n if (dynamicCount > 10) complexity = 'high';\n else if (dynamicCount > 5) complexity = 'medium';\n \n const recommendations: string[] = [];\n \n if (dynamicCount === 0) {\n recommendations.push('Consider using a static string instead of a template');\n }\n \n if (dynamicCount > 10) {\n recommendations.push('Consider breaking this template into smaller components');\n }\n \n if (!compiled.fragment) {\n recommendations.push('Template could benefit from static fragment optimization');\n }\n \n return {\n staticParts: staticCount,\n dynamicParts: dynamicCount,\n complexity,\n recommendations\n };\n}\n\n/**\n * Clear template cache for development/testing\n */\nexport function clearTemplateCache(): void {\n templateCache.clear();\n performanceMetrics.clear();\n}\n\n/**\n * Get performance metrics for development monitoring\n */\nexport function getPerformanceMetrics(): Map<string, PerformanceMetrics> {\n return new Map(performanceMetrics);\n}\n\n/**\n * Get cache statistics\n */\nexport function getCacheStats(): { size: number; entries: string[] } {\n return {\n size: templateCache.size,\n entries: Array.from(templateCache.keys())\n };\n}\n\n","/**\n * Utility: Generate a stable key for a VNode\n */\nexport function getVNodeKey(type: string, parentPath: string, childIndex: number, model?: string, value?: string): string {\n // Always include parentPath and childIndex for uniqueness\n if (model && value) return `${parentPath}.${type}[${childIndex}]:${model}:${value}`;\n if (model) return `${parentPath}.${type}[${childIndex}]:${model}`;\n return `${parentPath}.${type}[${childIndex}]`;\n}\n\n/**\n * Virtual Node (VNode) structure for incremental migration\n */\nexport interface VNode {\n type: string; // tag name or '#text'\n key?: string;\n props: Record<string, any>;\n children: VNode[];\n dom?: Element | Text;\n}\n\n/**\n * Safely replaces a child node, guarding against NotFoundError and out-of-sync trees.\n * Falls back to appendChild if oldChild is not present.\n * Logs mutation for debugging if enabled.\n * @param parent - Parent node\n * @param newChild - New node to insert\n * @param oldChild - Old node to replace\n */\nexport function safeReplaceChild(parent: Node | null, newChild: Node, oldChild: Node): void {\n if (!parent || !(parent instanceof Element)) {\n return;\n }\n if (parent.contains(oldChild) && oldChild.parentNode === parent) {\n try {\n parent.replaceChild(newChild, oldChild);\n } catch (err) {\n console.error('[VDOM] safeReplaceChild: error replacing child', err, {\n parent,\n newChild,\n oldChild,\n parentHTML: (parent as Element).outerHTML,\n newChildHTML: (newChild as Element).outerHTML,\n oldChildHTML: (oldChild as Element).outerHTML\n });\n }\n }\n}\n\n/**\n * Mounts a VNode to the DOM and returns the created node.\n * Handles text, fragment, and element nodes.\n * @param vnode - Virtual node to mount\n * @returns DOM node or null\n */\nexport function mountVNode(vnode: VNode): Element | Text | null {\n if (vnode.type === '#whitespace') {\n return null;\n }\n if (vnode.type === '#text') {\n const textNode = document.createTextNode(vnode.props.nodeValue ?? '');\n vnode.dom = textNode;\n return textNode;\n }\n const el = document.createElement(vnode.type);\n for (const [k, v] of Object.entries(vnode.props)) {\n if (k === 'value' && el instanceof HTMLInputElement) {\n if (el.type === 'radio') {\n // Always set value attribute for radios, never assign to property\n el.setAttribute('value', v as string);\n } else if (el.type === 'checkbox') {\n // Always set value property and attribute for checkboxes\n el.value = v as string;\n el.setAttribute('value', v as string);\n } else {\n el.value = v as string;\n el.setAttribute('value', v as string);\n }\n } else {\n el.setAttribute(k, v as string);\n }\n }\n vnode.dom = el;\n for (const child of vnode.children) {\n const childNode = mountVNode(child);\n if (childNode) el.appendChild(childNode);\n }\n return el;\n}\n\n/**\n * Parses an HTML string into a VNode tree.\n * Supports basic tags, attributes, text, and key/data-model.\n * @param html - HTML string\n * @returns VNode tree\n */\nexport function parseVNodeFromHTML(html: string): VNode {\n const template = document.createElement('template');\n template.innerHTML = html.trim();\n const nodes = Array.from(template.content.childNodes);\n // If only one root node, return as before\n if (nodes.length === 1) {\n const vnode = createVNodeFromElement(nodes[0]);\n return vnode;\n }\n // If multiple root nodes, create a fragment VNode\n const fragmentVNode = {\n type: '#fragment',\n key: undefined,\n props: {},\n children: nodes.map((node, idx) => createVNodeFromElement(node, '#fragment', idx)),\n dom: undefined\n };\n return fragmentVNode;\n}\n\n/**\n * Creates a VNode from a DOM ChildNode (Element or Text).\n * Assigns a stable, deterministic key for VDOM reconciliation.\n * @param node - DOM node\n * @param parentPath - Path for key generation\n * @param childIndex - Index for key generation\n * @returns VNode\n */\nexport function createVNodeFromElement(node: ChildNode, parentPath: string = '', childIndex: number = 0): VNode {\n if (!node) {\n // Guard: skip undefined/null nodes\n return { type: '#unknown', key: undefined, props: {}, children: [], dom: undefined };\n }\n if (node.nodeType === Node.TEXT_NODE) {\n // Ignore pure whitespace text nodes\n if (!node.nodeValue || /^\\s*$/.test(node.nodeValue)) {\n return { type: '#whitespace', key: undefined, props: {}, children: [], dom: undefined };\n }\n return { type: '#text', key: getVNodeKey('#text', parentPath, childIndex), props: { nodeValue: node.nodeValue }, children: [], dom: node as Text };\n }\n if (node.nodeType === Node.ELEMENT_NODE) {\n const elem = node as Element;\n const props: Record<string, any> = {};\n Array.from(elem.attributes).forEach(attr => {\n props[attr.name] = attr.value;\n });\n const tagName = elem.tagName.toLowerCase();\n let vnodeKey: string | undefined = undefined;\n // --- Stable key for controlled inputs ---\n if ((tagName === 'input' || tagName === 'select' || tagName === 'textarea') && elem.hasAttribute('data-model')) {\n const model = elem.getAttribute('data-model')!;\n const inputType = elem.getAttribute('type') ?? '';\n // Use model+type as key, ignore parentPath/childIndex for stability\n vnodeKey = `${tagName}:${model}:${inputType}`;\n props['data-uid'] = vnodeKey;\n elem.setAttribute('data-uid', vnodeKey);\n let valueAttr = elem.getAttribute('value');\n let checkedAttr = elem.getAttribute('checked');\n if (valueAttr) props['value'] = valueAttr;\n if (checkedAttr) props['checked'] = checkedAttr;\n } else if (tagName === 'input' || tagName === 'textarea' || tagName === 'select' || elem.hasAttribute('contenteditable')) {\n vnodeKey = `${tagName}:${parentPath}:${childIndex}`;\n props['data-uid'] = vnodeKey;\n elem.setAttribute('data-uid', vnodeKey);\n } else {\n vnodeKey = getVNodeKey(tagName, parentPath, childIndex);\n if (tagName === 'li') {\n props['data-uid'] = vnodeKey;\n elem.setAttribute('data-uid', vnodeKey);\n }\n }\n const children: VNode[] = Array.from(elem.childNodes).map((child, idx) => createVNodeFromElement(child, vnodeKey!, idx));\n const vnode = {\n type: tagName,\n key: vnodeKey,\n props,\n children,\n dom: elem\n };\n return vnode;\n }\n // Fallback for unsupported node types\n return { type: '#unknown', key: undefined, props: {}, children: [], dom: undefined };\n}\n\n/**\n * Patches two VNodes and updates the DOM, preserving controlled inputs.\n * Handles keyed and index-based reconciliation.\n * @param parent - Parent DOM element\n * @param oldVNode - Previous VNode\n * @param newVNode - New VNode\n */\nexport function patchVNode(parent: Element, oldVNode: VNode, newVNode: VNode): void {\n if (!oldVNode || !newVNode) return;\n\n // Filter meaningful children\n function isMeaningfulVNode(v: VNode | undefined): v is VNode {\n return !!v && v.type !== '#whitespace' && !(v.type === '#text' && (!v.props?.nodeValue || /^\\s*$/.test(v.props.nodeValue)));\n }\n const oldChildren: VNode[] = Array.isArray(oldVNode.children) ? oldVNode.children.filter(isMeaningfulVNode) : [];\n const newChildren: VNode[] = Array.isArray(newVNode.children) ? newVNode.children.filter(isMeaningfulVNode) : [];\n\n // Only replace node if type or key differ, NOT just because it's controlled\n const isControlled = newVNode.type === 'input' || newVNode.type === 'select' || newVNode.type === 'textarea';\n if (oldVNode.type !== newVNode.type || oldVNode.key !== newVNode.key) {\n const newDom = mountVNode(newVNode);\n if (newDom instanceof Node && oldVNode.dom instanceof Node && parent.contains(oldVNode.dom)) {\n safeReplaceChild(parent, newDom, oldVNode.dom);\n // React/Vue: set value/checked only on the newly inserted node\n if (isControlled && newVNode.props && parent.firstChild instanceof HTMLInputElement) {\n const inputEl = parent.firstChild as HTMLInputElement;\n if (inputEl.type === 'radio') {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n } else if (inputEl.type === 'checkbox') {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n } else {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n }\n if ('checked' in newVNode.props) {\n inputEl.checked = newVNode.props.checked === true || newVNode.props.checked === 'true';\n }\n }\n } else if ((newDom as any) instanceof Node) {\n if (newDom) {\n parent.appendChild(newDom);\n newVNode.dom = newDom;\n // React/Vue: set value/checked only on the newly inserted node\n if (isControlled && newVNode.props && parent.firstChild instanceof HTMLInputElement) {\n const inputEl = parent.firstChild as HTMLInputElement;\n if (inputEl.type === 'radio') {\n inputEl.setAttribute('value', newVNode.props.value);\n } else if (inputEl.type === 'checkbox') {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n } else {\n inputEl.value = newVNode.props.value;\n inputEl.setAttribute('value', newVNode.props.value);\n }\n if ('checked' in newVNode.props) {\n inputEl.checked = newVNode.props.checked === true || newVNode.props.checked === 'true';\n }\n }\n } else {\n newVNode.dom = undefined;\n }\n } else {\n newVNode.dom = undefined;\n }\n return;\n }\n // For controlled elements, patch props and preserve node (React/Vue style)\n if (isControlled && oldVNode.dom instanceof HTMLElement && newVNode.props) {\n // Update value/checked on all possible DOM references for compatibility\n for (const [k, v] of Object.entries(newVNode.props)) {\n if (k === 'value' && parent.firstChild instanceof HTMLInputElement) {\n (parent.firstChild as HTMLInputElement).value = v as string;\n } else if (k === 'checked' && parent.firstChild instanceof HTMLInputElement) {\n (parent.firstChild as HTMLInputElement).checked = v === true || v === 'true';\n } else if (k in oldVNode.dom) {\n try { (oldVNode.dom as any)[k] = v; } catch {}\n } else {\n oldVNode.dom.setAttribute(k, v as string);\n }\n }\n // Orphan removal block: remove extra oldChildren\n for (let i = newVNode.children.length; i < oldChildren.length; i++) {\n if (\n oldChildren[i] &&\n oldChildren[i].dom &&\n oldVNode.dom && oldVNode.dom.contains(oldChildren[i].dom as Node)\n ) {\n oldVNode.dom.removeChild(oldChildren[i].dom as Node);\n }\n }\n return;\n }\n\n // Patch props for Element\n const oldDom = oldVNode.dom;\n if (oldDom && oldDom instanceof Element && newVNode.props) {\n const inputType = oldDom.tagName.toLowerCase() === 'input' ? oldDom.getAttribute('type') : undefined;\n const isCustomElement = oldDom.tagName.includes('-');\n for (const [k, v] of Object.entries(newVNode.props)) {\n if (inputType === 'radio' && k === 'value') continue;\n if (inputType === 'checkbox' && k === 'value') {\n oldDom.setAttribute('value', v as string);\n continue;\n }\n oldDom.setAttribute(k, v as string);\n }\n if (isCustomElement) {\n for (const [k, v] of Object.entries(newVNode.props)) {\n oldDom.setAttribute(k, v as string);\n }\n }\n for (const k of Array.from(oldDom.attributes).map(a => a.name)) {\n if (!(k in newVNode.props)) {\n if (inputType === 'radio' && k === 'value') continue;\n if (inputType === 'checkbox' && k === 'value') continue;\n oldDom.removeAttribute(k);\n }\n }\n }\n\n // Patch text node: always update nodeValue for text nodes\n if (newVNode.type === '#text') {\n if (oldDom && oldDom.nodeType === Node.TEXT_NODE) {\n if ((oldDom as Text).nodeValue !== newVNode.props.nodeValue) {\n (oldDom as Text).nodeValue = newVNode.props.nodeValue;\n }\n newVNode.dom = oldDom;\n } else {\n const newTextNode = document.createTextNode(newVNode.props.nodeValue ?? '');\n if (oldDom && parent.contains(oldDom) && oldDom.parentNode === parent) {\n safeReplaceChild(parent, newTextNode, oldDom);\n } else {\n parent.appendChild(newTextNode);\n }\n newVNode.dom = newTextNode;\n }\n return;\n }\n\n // Strict keyed reconciliation for children\n if (oldDom instanceof Element) {\n // Build key maps for fast lookup\n const oldKeyMap = new Map<string, VNode>();\n oldChildren.forEach(child => child.key && oldKeyMap.set(child.key, child));\n const newKeySet = new Set(newChildren.map(child => child.key));\n\n // Patch or insert new children in order\n let domOrder: Node[] = [];\n for (let i = 0; i < newChildren.length; i++) {\n const newChild = newChildren[i];\n const oldChild = newChild.key ? oldKeyMap.get(newChild.key!) : oldChildren[i];\n let newDom: Node | undefined;\n // Always replace controlled form elements if key or type changes\n const isControlled = newChild.type === 'input' || newChild.type === 'select' || newChild.type === 'textarea';\n if (oldChild && oldChild.dom && (!isControlled || (oldChild.type === newChild.type && oldChild.key === newChild.key))) {\n patchVNode(oldDom, oldChild, newChild);\n newDom = oldChild.dom as Node;\n } else {\n const mounted = mountVNode(newChild);\n newDom = mounted instanceof Node ? mounted : undefined;\n if (newDom) {\n // Prevent inserting a parent into its own child (HierarchyRequestError)\n if ((newDom instanceof Element || newDom instanceof Node) && newDom.contains(oldDom)) {\n // Debug output for parent-child cycle detection\n console.error('[VDOM] Attempted to insert a parent into its own child:', {\n parentTag: (oldDom as Element).tagName,\n childTag: (newDom as Element).tagName,\n parentUid: (oldDom as Element).getAttribute?.('data-uid'),\n childUid: (newDom as Element).getAttribute?.('data-uid'),\n parent: oldDom,\n child: newDom\n });\n throw new Error('VDOM patch error: Attempted to insert a parent into its own child');\n }\n oldDom.insertBefore(newDom, oldDom.childNodes[i] || null);\n }\n }\n newChild.dom = newDom as Element | Text | undefined;\n if (newDom) domOrder.push(newDom);\n }\n\n // Remove all old children not present in new children (by key)\n oldChildren.forEach(child => {\n if (!newKeySet.has(child.key) && child.dom && oldDom.contains(child.dom)) {\n oldDom.removeChild(child.dom);\n }\n });\n\n // Remove any extra DOM nodes beyond newChildren length\n while (oldDom.childNodes.length > newChildren.length) {\n oldDom.removeChild(oldDom.lastChild!);\n }\n\n // Ensure DOM order matches newChildren\n for (let i = 0; i < domOrder.length; i++) {\n if (oldDom.childNodes[i] !== domOrder[i]) {\n // Prevent inserting a parent into its own child (HierarchyRequestError)\n if ((domOrder[i] instanceof Element || domOrder[i] instanceof Node) && domOrder[i].contains(oldDom)) {\n throw new Error('VDOM patch error: Attempted to insert a parent into its own child');\n }\n oldDom.insertBefore(domOrder[i], oldDom.childNodes[i] || null);\n }\n }\n\n newVNode.dom = oldDom;\n\n // Final orphan node sweep: remove any child nodes not present in newChildren keys\n const newKeys = new Set(newChildren.map(c => c.key));\n Array.from(oldDom.childNodes).forEach((node, idx) => {\n const key = (node as Element).getAttribute?.('data-uid');\n // Remove if key is not present, or if index exceeds newChildren length\n if ((key && !newKeys.has(key)) || idx >= newChildren.length) {\n oldDom.removeChild(node);\n }\n });\n }\n}","/**\n * Lightweight, scalable router for Custom Elements Runtime\n * - Functional API, zero dependencies, SSR/static site compatible\n * - Integrates with Store and runtime.ts\n */\n\n\nimport { Store } from './store';\n\nexport interface Route {\n path: string;\n component?: string;\n load?: () => Promise<{ default: string | HTMLElement | Function }>;\n}\n\nexport interface RouterConfig {\n routes: Route[];\n base?: string;\n}\n\nexport interface RouteState {\n path: string;\n params: Record<string, string>;\n query: Record<string, string>;\n}\n\n\nconst 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\nconst 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 = '' } = config;\n let getLocation: () => { path: string; query: Record<string, string> };\n let initial: { path: string; query: Record<string, string> };\n let store: ReturnType<typeof Store>;\n let update: () => void;\n let push: (path: string) => void;\n let replace: (path: string) => void;\n let back: () => void;\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\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 initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = Store<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n update = () => {\n const loc = getLocation();\n const match = matchRoute(routes, loc.path);\n const s = store.getState() as RouteState;\n s.path = loc.path;\n s.params = match.params;\n s.query = loc.query;\n };\n window.addEventListener('popstate', update);\n push = (path: string) => {\n window.history.pushState({}, '', base + path);\n update();\n };\n replace = (path: string) => {\n window.history.replaceState({}, '', base + path);\n update();\n };\n back = () => window.history.back();\n } else {\n // SSR fallback: minimal API\n getLocation = () => ({ path: '/', query: {} });\n initial = getLocation();\n const match = matchRoute(routes, initial.path);\n store = Store<RouteState>({\n path: initial.path,\n params: match.params,\n query: initial.query\n });\n update = () => {};\n push = () => {};\n replace = () => {};\n back = () => {};\n }\n\n return {\n store,\n push,\n replace,\n back,\n subscribe: store.subscribe,\n matchRoute: (path: string) => matchRoute(routes, path),\n getCurrent: () => store.getState(),\n resolveRouteComponent\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 * Lightweight reactive state with computed properties and change notification.\n * @template T - State shape\n * @template C - Computed property map\n */\nexport function reactive<T extends object, C extends Record<string, (state: T) => any>>(\n initialState: T,\n computedMap?: C\n): T & { subscribe: (fn: (state: T) => void) => () => void } & { [K in keyof C]: ReturnType<C[K]> } {\n const listeners: Array<(state: T) => void> = [];\n const computedKeys = computedMap ? Object.keys(computedMap) : [];\n const state = { ...initialState } as T;\n\n // Subscribe API\n // Always notify listeners with the top-level proxy\n let topProxy: any = null;\n function subscribe(fn: (state: T) => void) {\n listeners.push(fn);\n return () => {\n const idx = listeners.indexOf(fn);\n if (idx !== -1) listeners.splice(idx, 1);\n };\n }\n\n // Mutation API (for compatibility)\n function set(changes: Partial<T>) {\n Object.assign(topProxy, changes);\n listeners.forEach(fn => fn(topProxy));\n }\n\n // Recursive proxy cache to ensure persistent proxies\n const proxyCache = new WeakMap<object, any>();\n\n function createReactive(obj: any): any {\n if (proxyCache.has(obj)) return proxyCache.get(obj);\n const reactiveProxy = new Proxy(obj, {\n get(target, prop, receiver) {\n if (prop === 'subscribe') return subscribe;\n if (prop === 'set') return set;\n if (computedMap && computedKeys.includes(prop as string)) {\n return computedMap[prop as keyof C](topProxy);\n }\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'object' && value !== null) {\n return createReactive(value);\n }\n return value;\n },\n set(target, prop, value, receiver) {\n if (computedMap && computedKeys.includes(prop as string)) {\n // Computed properties are read-only\n return false;\n }\n const oldValue = target[prop as keyof T];\n const result = Reflect.set(target, prop, value, receiver);\n if (oldValue !== value) {\n listeners.forEach(fn => fn(topProxy));\n }\n return result;\n },\n deleteProperty(target, prop) {\n if (computedMap && computedKeys.includes(prop as string)) {\n // Computed properties are read-only\n return false;\n }\n const result = Reflect.deleteProperty(target, prop);\n listeners.forEach(fn => fn(topProxy));\n return result;\n }\n });\n proxyCache.set(obj, reactiveProxy);\n return reactiveProxy;\n }\n\n topProxy = createReactive(state);\n\n return topProxy as T & { subscribe: (fn: (state: T) => void) => () => void; set: (changes: Partial<T>) => void } & { [K in keyof C]: ReturnType<C[K]> };\n}\n","// ============================================================================\n// Exports\n// ============================================================================\n\n/**\n * Represents the state object for a component.\n * Extend this interface for custom state typing.\n */\nexport interface ComponentState extends Record<string, unknown> {}\n/**\n * API exposed to component templates and lifecycle handlers.\n * Includes state, event emitters, and global event bus methods.\n */\nexport interface ComponentAPI<T extends ComponentState = ComponentState> {\n /**\n * Reactive state object. Mutate directly for reactivity.\n */\n readonly state: T;\n emit(eventName: string, detail?: unknown): void;\n onGlobal<U = any>(eventName: string, handler: (data: U) => void): () => void;\n offGlobal<U = any>(eventName: string, handler: (data: U) => void): void;\n emitGlobal<U = any>(eventName: string, data?: U): void;\n render(): void;\n}\n/**\n * Configuration object for a custom element component.\n * Defines template, state, computed properties, styles, refs, and lifecycle hooks.\n * @template S - State type\n * @template C - Computed type\n */\nexport interface ComponentConfig<S extends ComponentState, C extends Record<string, any> = {}> {\n readonly template: (state: S & C, api: ComponentAPI<S & C>) => string | Promise<string> | CompiledTemplate<S & C>;\n readonly state?: S;\n readonly computed?: { [K in keyof C]: (state: S) => C[K] };\n readonly style?: string | ((state: S & C) => string);\n readonly refs?: Record<string, RefHandler<S & C>>;\n readonly onMounted?: LifecycleHandler<S & C>;\n readonly onUnmounted?: LifecycleHandler<S & C>;\n readonly debug?: boolean;\n /**\n * Whitelist of state keys to reflect as attributes. If omitted, no keys are reflected.\n */\n readonly reflect?: string[];\n hydrate?: (el: Element | ShadowRoot, state: S & C, api: ComponentAPI<S & C>) => void;\n [handler: string]: ((...args: unknown[]) => unknown) | unknown;\n}\n/**\n * Handler for a ref element in the template.\n * @param element - The DOM element with data-ref\n * @param state - Current component state\n * @param api - Component API\n */\nexport type RefHandler<T extends ComponentState> = (\n element: Element,\n state: T,\n api: ComponentAPI<T>\n) => void;\nexport type ComputedHandler<T extends ComponentState> = (state: T) => unknown;\n/**\n * Lifecycle handler for mounted/unmounted events.\n * @param state - Current component state\n * @param api - Component API\n */\nexport type LifecycleHandler<T extends ComponentState> = (\n state: T,\n api: ComponentAPI<T>\n) => void;\n\n/**\n * Plugin interface for runtime hooks (init, render, error).\n */\nexport type RuntimePlugin<S extends ComponentState, C extends Record<string, any>> = {\n onInit?: (config: ComponentConfig<S, C>) => void;\n onRender?: (state: S & C, api: ComponentAPI<S & C>) => void;\n onError?: (error: Error, state: S & C, api: ComponentAPI<S & C>) => void;\n};\nexport const runtimePlugins: RuntimePlugin<ComponentState, Record<string, unknown>>[] = [];\n/**\n * Registers a runtime plugin for hooks (init, render, error).\n * @param plugin - RuntimePlugin instance\n */\nexport function useRuntimePlugin<S extends ComponentState, C extends Record<string, any>>(plugin: RuntimePlugin<S, C>) {\n runtimePlugins.push(plugin as RuntimePlugin<ComponentState, Record<string, unknown>>);\n}\n\nexport { Store } from './store';\nexport { eventBus } from './event-bus';\nexport { renderToString, renderComponentsToString, generateHydrationScript } from './ssr';\nexport type { SSRComponentConfig, SSRRenderOptions, SSRContext } from './ssr';\nexport { html, compile, css, classes, styles } from './template-helpers';\nexport { useDataModel } from './data-binding';\nexport { compileTemplate, renderCompiledTemplate, updateCompiledTemplate } from './template-compiler';\nexport { mountVNode, patchVNode, createVNodeFromElement, parseVNodeFromHTML, safeReplaceChild, getVNodeKey } from './v-dom';\nexport type { VNode } from './v-dom';\n\n// Router API\nexport { useRouter, matchRouteSSR, resolveRouteComponent } from './router';\nexport type { Route, RouterConfig, RouteState } from './router';\n\n\n// ============================================================================\n// Imports\n// ============================================================================\n\nimport { reactive } from './computed-state';\nimport { eventBus } from './event-bus';\nimport { renderCompiledTemplate, updateCompiledTemplate } from './template-compiler';\nimport { useDataModel } from './data-binding';\nimport { mountVNode, patchVNode, parseVNodeFromHTML } from './v-dom';\nimport { useRouter } from './router';\nimport type { VNode } from './v-dom';\nimport type { CompiledTemplate } from './template-compiler';\nimport type { RouterConfig } from './router';\nimport { css, html } from './template-helpers';\n\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n\n/**\n * Recursively sanitizes an object, removing dangerous keys and prototype pollution.\n * Handles circular references using a WeakSet.\n * @param obj - Object to sanitize\n * @param seen - WeakSet to track visited objects\n */\nexport function deepSanitizeObject<T>(obj: T, seen = new WeakSet<object>()): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (seen.has(obj as object)) return obj;\n seen.add(obj as object);\n if (Array.isArray(obj)) return obj.map(item => deepSanitizeObject(item, seen)) as unknown as T;\n // Prevent prototype pollution\n if (Object.getPrototypeOf(obj) !== Object.prototype && Object.getPrototypeOf(obj) !== null) {\n Object.setPrototypeOf(obj, null);\n }\n const dangerousKeys = ['__proto__', 'constructor', 'prototype'];\n const sanitized: Record<string, unknown> = Object.create(null);\n for (const key of Object.keys(obj as Record<string, unknown>)) {\n if (dangerousKeys.includes(key)) continue;\n sanitized[key] = deepSanitizeObject((obj as Record<string, unknown>)[key], seen);\n }\n return sanitized as T;\n}\n\n/**\n * Type guard to check if a value is Promise-like.\n */\nexport function isPromise(val: unknown): val is Promise<unknown> {\n return !!val && typeof (val as any).then === 'function';\n}\n\n\n// ============================================================================\n// Component Lifecycle\n// ============================================================================\n\n/**\n * Base class for runtime custom elements.\n * Handles lifecycle, rendering, controlled input sync, refs, and event binding.\n * @template S - State type\n * @template C - Computed type\n */\n\ninterface ComponentRegistry {\n [tag: string]: ComponentConfig<any, any>;\n}\ntype ExtendedHTMLElement = HTMLElement & {\n _boundHandlers?: Record<string, EventListenerOrEventListenerObject>;\n _hasDirtyListener?: boolean;\n _isDirty?: boolean;\n _dataModelBound?: boolean;\n _listItemModelListener?: EventListener;\n};\n\n// SSR-safe ComponentElement definition\nlet ComponentElement: CustomElementConstructor | { new (): object };\n\nif (typeof HTMLElement !== 'undefined') {\n ComponentElement = class<S extends ComponentState, C extends Record<string, any> = {}> extends HTMLElement {\n /**\n * Syncs whitelisted state properties to attributes after render.\n * Only keys listed in config.reflect are reflected.\n */\n private syncStateToAttributes(): void {\n if (!this.stateObj || !this.config?.reflect || !Array.isArray(this.config.reflect)) return;\n const dangerousKeys = ['__proto__', 'constructor', 'prototype'];\n this.config.reflect.forEach(key => {\n if (dangerousKeys.includes(key)) {\n this.removeAttribute(key);\n return;\n }\n const value = this.stateObj[key];\n if ([\"string\", \"number\", \"boolean\"].includes(typeof value)) {\n if (value === undefined || value === null) {\n this.removeAttribute(key);\n } else {\n this.setAttribute(key, String(value));\n }\n } else {\n this.removeAttribute(key);\n }\n });\n }\n\n /**\n * Allows updating the template function at runtime and triggers a re-render.\n * @param newTemplate - New template function or string\n */\n public setTemplate(newTemplate: ((state: S & C, api: ComponentAPI<S & C>) => string | Promise<string> | CompiledTemplate<S & C>) | string): void {\n // Override readonly via type assertion for runtime mutability\n const config = this.config as any;\n if (typeof newTemplate === 'function') {\n config.template = newTemplate;\n } else {\n config.template = () => newTemplate;\n }\n this.render();\n }\n\n private _hasError = false;\n private _mountedCalled = false;\n private _unmountedCalled = false;\n /**\n * Tracks auto-wired config event handlers for removal\n */\n private _autoWiredHandlers: Record<string, EventListenerOrEventListenerObject[]> = {};\n\n /**\n * Override removeEventListener to support auto-wired config handler removal\n */\n override removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void {\n super.removeEventListener(type, listener, options);\n // Also remove auto-wired config handlers if present\n if (this._autoWiredHandlers[type]) {\n this._autoWiredHandlers[type] = this._autoWiredHandlers[type].filter(fn => {\n if (fn === listener) {\n super.removeEventListener(type, fn, options);\n return false;\n }\n return true;\n });\n if (this._autoWiredHandlers[type].length === 0) delete this._autoWiredHandlers[type];\n }\n }\n\n /**\n * observedAttributes automatically returns all primitive keys from static state.\n * This enables automatic attribute observation for all primitive state properties.\n */\n static get observedAttributes() {\n // @ts-ignore: allow dynamic static property access\n const state = this.stateObj || {};\n return Object.keys(state).filter(\n key => ['string', 'number', 'boolean'].includes(typeof state[key])\n );\n }\n\n /**\n * Called when an observed attribute changes. Syncs attribute to state and triggers render.\n */\n attributeChangedCallback(name: string, _oldValue: string, newValue: string) {\n if (name === '__proto__' || name === 'constructor' || name === 'prototype') return;\n if (!this.stateObj) return;\n // Map kebab-case to camelCase\n const camelName = name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const stateKey = (name in this.stateObj) ? name : (camelName in this.stateObj ? camelName : null);\n if (stateKey) {\n const initialType = typeof (this.config?.state?.[stateKey]);\n let value: any = newValue;\n if (newValue === null) {\n value = undefined;\n } else if (initialType === 'number') {\n if (value === undefined || value === '') {\n value = this.config?.state?.[stateKey];\n } else {\n const num = Number(value);\n value = isNaN(num) ? this.config?.state?.[stateKey] : num;\n }\n } else if (initialType === 'boolean') {\n value = value === 'true';\n }\n value = deepSanitizeObject(value);\n if ((this.stateObj as any)[stateKey] !== value) {\n if (this.config?.debug) {\n console.log('[runtime] state update:', { stateKey, value });\n }\n (this.stateObj as any)[stateKey] = value;\n this.render();\n }\n }\n }\n\n /**\n * Force sync all controlled input values and event listeners after VDOM patching.\n */\n private forceSyncControlledInputs(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.querySelectorAll('input[data-model]').forEach(input => {\n const modelAttr = input.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n const inputEl = input as HTMLInputElement;\n const stateValue = String(this.stateObj[modelAttr]);\n const isFocused = document.activeElement === inputEl;\n // Ensure dirty flag is set on input event\n if (!(inputEl as any)._hasDirtyListener) {\n inputEl.addEventListener('input', () => {\n (inputEl as any)._isDirty = true;\n });\n inputEl.addEventListener('blur', () => {\n (inputEl as any)._isDirty = false;\n });\n (inputEl as any)._hasDirtyListener = true;\n }\n const isDirty = Boolean((inputEl as any)._isDirty);\n // Never set value for focused or dirty inputs—let user typing win\n if (isFocused || isDirty) {\n return;\n }\n // Only set value for unfocused and clean inputs if it differs and is not a radio or checkbox\n if (inputEl.type !== 'radio' && inputEl.type !== 'checkbox' && inputEl.value !== stateValue) {\n inputEl.value = stateValue;\n }\n });\n // Rebind other events (e.g., data-on-click)\n this.rebindEventListeners();\n }\n\n /**\n * Sync all controlled inputs and event listeners after render\n */\n private syncControlledInputsAndEvents(): void {\n if (!this.shadowRoot) return;\n // --- Radio Groups ---\n this.shadowRoot.querySelectorAll('input[type=\"radio\"][data-model]').forEach((input) => {\n const modelAttr = input.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') {\n return;\n }\n const inputEl = input as HTMLInputElement;\n const stateValue = String(this.stateObj[modelAttr]);\n inputEl.checked = inputEl.value === stateValue;\n });\n // --- Checkbox, Text, Number ---\n this.shadowRoot.querySelectorAll('input[data-model]').forEach(input => {\n const modelAttr = input.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n const inputEl = input as HTMLInputElement;\n const stateValue = String(this.stateObj[modelAttr]);\n if (inputEl.type === 'checkbox') {\n const stateVal = this.stateObj[modelAttr];\n if (Array.isArray(stateVal)) {\n inputEl.checked = stateVal.includes(inputEl.value);\n } else {\n const trueValue = inputEl.getAttribute('data-true-value');\n const falseValue = inputEl.getAttribute('data-false-value');\n if (trueValue !== null || falseValue !== null) {\n if (String(stateVal) === trueValue) {\n inputEl.checked = true;\n } else if (String(stateVal) === falseValue) {\n inputEl.checked = false;\n } else if (stateVal === true) {\n inputEl.checked = true;\n } else {\n inputEl.checked = false;\n }\n } else {\n inputEl.checked = stateVal === true || stateVal === 'true' || stateVal === 1;\n }\n }\n } else if (inputEl.type === 'radio') {\n // Do not set value for radios\n } else {\n inputEl.value = stateValue;\n }\n });\n // --- Textarea ---\n this.shadowRoot.querySelectorAll('textarea[data-model]').forEach(textarea => {\n const modelAttr = textarea.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n (textarea as HTMLTextAreaElement).value = String(this.stateObj[modelAttr]);\n });\n // --- Select ---\n this.shadowRoot.querySelectorAll('select[data-model]').forEach(select => {\n const modelAttr = select.getAttribute('data-model');\n if (!modelAttr || !this.stateObj || typeof this.stateObj[modelAttr] === 'undefined') return;\n (select as HTMLSelectElement).value = String(this.stateObj[modelAttr]);\n });\n }\n\n /**\n * Attach event listeners for input[data-bind] after VDOM patching\n */\n private attachListItemModelListeners(): void {\n if (!this.shadowRoot) return;\n this.shadowRoot.querySelectorAll('input[data-bind]').forEach(input => {\n const bindExpr = input.getAttribute('data-bind');\n if (!bindExpr) return;\n // Remove previous listener if present\n if ((input as any)._listItemModelListener) {\n input.removeEventListener('input', (input as any)._listItemModelListener);\n input.removeEventListener('change', (input as any)._listItemModelListener);\n delete (input as any)._listItemModelListener;\n }\n // Array item binding: arrKey[idx].propKey\n const arrMatch = bindExpr.match(/^([a-zA-Z0-9_]+)\\[(\\d+)\\]\\.([a-zA-Z0-9_]+)$/);\n if (arrMatch) {\n const [, arrKey, idxStr, propKey] = arrMatch;\n const idx = parseInt(idxStr, 10);\n const arr = this.stateObj[arrKey];\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n input.checked = !!(Array.isArray(arr) && arr[idx] && arr[idx][propKey]);\n }\n const handler = (_e: Event) => {\n if (!Array.isArray(arr) || !arr[idx]) return;\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n arr[idx][propKey] = input.checked;\n } else {\n arr[idx][propKey] = (input as any).value;\n }\n };\n input.addEventListener('input', handler);\n input.addEventListener('change', handler);\n (input as any)._listItemModelListener = handler;\n return;\n }\n // Dot notation binding: user.name or user.amount|number|trim\n const dotMatch = bindExpr.match(/^([a-zA-Z0-9_]+)\\.([a-zA-Z0-9_]+)((?:\\|[a-zA-Z0-9_]+)*)$/);\n if (dotMatch) {\n const [, objKey, propKey, modifierStr] = dotMatch;\n const obj = this.stateObj[objKey];\n const modifiers = modifierStr ? modifierStr.split('|').map(s => s.trim()).filter(Boolean) : [];\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n input.checked = !!(obj && obj[propKey]);\n } else if (input instanceof HTMLInputElement) {\n input.value = obj ? String(obj[propKey] ?? '') : '';\n }\n const handler = (_e: Event) => {\n if (!obj) return;\n let value: unknown;\n if (input instanceof HTMLInputElement && input.type === 'checkbox') {\n value = input.checked;\n } else {\n value = (input as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n if (modifiers.includes('number')) value = Number(value);\n if (modifiers.includes('trim') && typeof value === 'string') value = value.trim();\n }\n obj[propKey] = value;\n };\n input.addEventListener('input', handler);\n input.addEventListener('change', handler);\n (input as any)._listItemModelListener = handler;\n }\n });\n }\n\n /**\n * Attach controlled input listeners to sync DOM value to state\n */\n private attachControlledInputListeners(): void {\n const shadow = this.shadowRoot;\n if (!shadow) return;\n // --- Auto data-model binding ---\n shadow.querySelectorAll('[data-model]').forEach((el) => {\n const keyWithModifiers = el.getAttribute('data-model');\n if (!keyWithModifiers) return;\n // Only bind once per element\n if ((el as any)._dataModelBound) return;\n useDataModel(el, this.stateObj, keyWithModifiers);\n (el as any)._dataModelBound = true;\n });\n // --- Post-render sync for all data-model inputs ---\n shadow.querySelectorAll('[data-model]').forEach((el) => {\n const [key] = el.getAttribute('data-model')?.split('|').map(s => s.trim()) ?? [];\n if (!key || !(key in this.stateObj)) return;\n if (el instanceof HTMLInputElement) {\n if (el.type === 'checkbox') {\n const stateVal = this.stateObj[key];\n const trueValue = el.getAttribute('data-true-value');\n const falseValue = el.getAttribute('data-false-value');\n if (Array.isArray(stateVal)) {\n el.checked = stateVal.includes(el.value);\n } else if (trueValue !== null || falseValue !== null) {\n if (String(stateVal) === trueValue) {\n el.checked = true;\n } else if (String(stateVal) === falseValue) {\n el.checked = false;\n } else if (stateVal === true) {\n el.checked = true;\n } else {\n el.checked = false;\n }\n } else {\n el.checked = stateVal === true || stateVal === 'true' || stateVal === 1;\n }\n } else if (el.type === 'radio') {\n el.checked = el.value === String(this.stateObj[key]);\n } else {\n el.value = String(this.stateObj[key] ?? '');\n }\n } else if (el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n el.value = String(this.stateObj[key] ?? '');\n }\n });\n }\n private config!: ComponentConfig<S, C>;\n private stateObj!: S & C;\n private api!: ComponentAPI<S & C>;\n private _globalUnsubscribes: Array<() => void> = [];\n private unsubscribes: Array<() => void> = [];\n private lastCompiledTemplate: CompiledTemplate<S & C> | null = null;\n private lastState: (S & C) | null = null;\n private rafId: number | null = null;\n\n /**\n * Construct a new runtime component element.\n * @param config - Component configuration\n */\n constructor() {\n super();\n // Config/state setup will be done in connectedCallback\n }\n\n private initializeConfig() {\n if (this.config) return;\n const tag = this.tagName.toLowerCase();\n const registry: ComponentRegistry = (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry || {};\n const config = registry[tag];\n if (!config || typeof config !== 'object') {\n throw new Error('Invalid component config: must be an object');\n }\n if (!config.state || typeof config.state !== 'object') {\n throw new Error('Invalid component config: state must be an object');\n }\n this.config = config;\n // Always use the reactive proxy for state\n const computedState = config.computed\n ? reactive(config.state, config.computed)\n : reactive(config.state);\n this.stateObj = computedState as S & C;\n // Subscribe to state changes and batch re-render\n if (typeof (this.stateObj as any).subscribe === 'function') {\n this.unsubscribes.push((this.stateObj as any).subscribe(() => {\n this.scheduleRender();\n }));\n }\n // Create API\n this.api = {\n state: this.stateObj,\n emit: (eventName: string, detail?: unknown) => this.dispatchEvent(new CustomEvent(eventName, { detail, bubbles: true })),\n onGlobal: <U = any>(eventName: string, handler: (data: U) => void) => {\n const unsub = eventBus.on(eventName, handler);\n this._globalUnsubscribes.push(unsub);\n return unsub;\n },\n offGlobal: <U = any>(eventName: string, handler: (data: U) => void) => eventBus.off(eventName, handler),\n emitGlobal: <U = any>(eventName: string, data?: U) => eventBus.emit(eventName, data),\n render: () => this.render()\n };\n Object.keys(this.config).forEach(key => {\n if (key.startsWith('on') && key.length > 2 && typeof this.config[key] === 'function') {\n const eventName = key.charAt(2).toLowerCase() + key.slice(3);\n const handler: EventListener = (e: Event) => {\n const detail = (e as CustomEvent).detail ?? e;\n (this.config[key] as Function)(detail, this.api.state, this.api);\n };\n this.addEventListener(eventName, handler);\n // Store for later removal\n if (!this._autoWiredHandlers[eventName]) this._autoWiredHandlers[eventName] = [];\n this._autoWiredHandlers[eventName].push(handler);\n }\n });\n // Attach shadow DOM\n this.attachShadow({ mode: 'open' });\n // Setup style\n if (config.style) {\n const styleEl = document.createElement('style');\n styleEl.textContent = typeof config.style === 'function' ? config.style(this.stateObj) : config.style;\n this.shadowRoot!.appendChild(styleEl);\n }\n // SSR hydration support (selective)\n if (typeof this.config.hydrate === 'function') {\n const hydrateEls = this.shadowRoot?.querySelectorAll('[data-hydrate]');\n try {\n if (hydrateEls && hydrateEls.length > 0) {\n hydrateEls.forEach(el => {\n try {\n this.config.hydrate!(el, this.stateObj, this.api);\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err instanceof Error ? err : new Error(String(err)), this.api.state, this.api);\n }\n this._handleRenderError(err);\n }\n });\n } else {\n this.config.hydrate!(this.shadowRoot!, this.stateObj, this.api);\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err instanceof Error ? err : new Error(String(err)), this.api.state, this.api);\n }\n this._handleRenderError(err);\n }\n }\n const isSSRHydration = this.hasAttribute('data-hydrated');\n if (!isSSRHydration) {\n this.render();\n } else {\n this.processRefs();\n }\n // Only call onMounted here if not already called\n if (!this._mountedCalled && typeof this.config.onMounted === 'function') {\n try {\n const result: unknown = this.config.onMounted(this.api.state, this.api);\n if (isPromise(result)) {\n result.catch((err: any) => {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n }).finally(() => {\n this._mountedCalled = true;\n });\n } else {\n this._mountedCalled = true;\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n this._mountedCalled = true;\n }\n }\n }\n\n connectedCallback(): void {\n this.initializeConfig();\n // Merge all attributes into state for initial sync\n if (this.stateObj) {\n for (const attr of this.getAttributeNames()) {\n // Always map kebab-case to camelCase for state keys\n const camelName = attr.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const stateKey = camelName;\n if (stateKey in this.stateObj) {\n const initialType = typeof (this.config?.state?.[stateKey]);\n let value: unknown = this.getAttribute(attr);\n if (initialType === 'number') value = Number(value);\n else if (initialType === 'boolean') value = value === 'true';\n (this.stateObj as Record<string, unknown>)[stateKey] = value === null ? undefined : value;\n }\n }\n }\n // Only call onMounted if not already called\n if (!this._mountedCalled && typeof this.config.onMounted === 'function') {\n try {\n const result: unknown = this.config.onMounted(this.api.state, this.api);\n if (isPromise(result)) {\n result.catch((err: unknown) => {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n }).finally(() => {\n this._mountedCalled = true;\n });\n } else {\n this._mountedCalled = true;\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n this._mountedCalled = true;\n }\n }\n if (typeof this.render === 'function') this.render();\n }\n\n /**\n * Lifecycle: called when element is removed from DOM.\n */\n disconnectedCallback(): void {\n // Remove all auto-wired config event handlers\n Object.entries(this._autoWiredHandlers).forEach(([eventName, handlers]) => {\n handlers.forEach(handler => {\n super.removeEventListener(eventName, handler);\n });\n });\n this._autoWiredHandlers = {};\n this.unsubscribes.forEach(fn => fn());\n this.unsubscribes = [];\n this._globalUnsubscribes.forEach(fn => fn());\n this._globalUnsubscribes = [];\n if (!this._unmountedCalled && typeof this.config.onUnmounted === 'function') {\n try {\n const result: unknown = this.config.onUnmounted(this.api.state, this.api);\n if (isPromise(result)) {\n result.catch((err: any) => {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n }).finally(() => {\n this._unmountedCalled = true;\n });\n } else {\n this._unmountedCalled = true;\n }\n } catch (err) {\n if (typeof this.config.onError === 'function') {\n this.config.onError(err, this.api.state, this.api);\n }\n this._handleRenderError(err);\n this._unmountedCalled = true;\n }\n }\n // Reset flags for future re-mounts\n this._mountedCalled = false;\n this._unmountedCalled = false;\n }\n\n /**\n * Render the component. Handles both string and compiled templates, refs, and error boundaries.\n */\n private render(): void {\n // Always reset error state before each render for predictable boundaries\n this._hasError = false;\n // Robust controlled input sync after every render\n this.syncControlledInputsAndEvents();\n setTimeout(() => this.attachControlledInputListeners(), 0);\n try {\n // Plugin hook: onRender\n runtimePlugins.forEach(p => {\n try {\n p.onRender?.(this.stateObj, this.api);\n } catch (err) {\n this._handleRenderError(err);\n // Do NOT re-throw, just handle and continue\n }\n });\n // Error boundary for computed properties\n if (this.config.computed) {\n Object.values(this.config.computed).forEach(fn => {\n try {\n fn(this.stateObj);\n } catch (err) {\n this._handleRenderError(err);\n // Do NOT re-throw, just handle and continue\n }\n });\n }\n const templateResultOrPromise = this.config.template(this.stateObj as S & C, this.api);\n if (templateResultOrPromise instanceof Promise) {\n templateResultOrPromise.then(templateResult => {\n if (!this._hasError) {\n this._renderTemplateResult(templateResult);\n // Sync state to attributes after render\n this.syncStateToAttributes();\n // Attach list item listeners after VDOM patching\n setTimeout(() => this.attachListItemModelListeners(), 0);\n }\n }).catch(error => {\n this._handleRenderError(error);\n });\n } else {\n if (!this._hasError) {\n this._renderTemplateResult(templateResultOrPromise);\n // Sync state to attributes after render\n this.syncStateToAttributes();\n // Attach list item listeners after VDOM patching\n setTimeout(() => this.attachListItemModelListeners(), 0);\n }\n }\n } catch (error) {\n this._handleRenderError(error);\n // Always render fallback UI on error, do NOT re-throw\n this.renderError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n /**\n * Internal: render a template result (string or compiled template)\n */\n private _prevVNode: VNode | null = null;\n\n /**\n * Rebind event listeners for elements with data-on-* attributes in the shadow DOM\n */\n private rebindEventListeners(): void {\n if (!this.shadowRoot) return;\n const eventAttrs = ['data-on-input', 'data-on-change', 'data-on-blur', 'data-on-click'];\n eventAttrs.forEach(attr => {\n this.shadowRoot!.querySelectorAll(`[${attr}]`).forEach(el => {\n const eventType = attr.replace('data-on-', '');\n const handlerName = el.getAttribute(attr);\n if (!handlerName || typeof this.config[handlerName] !== 'function') return;\n // Remove previous listener if any\n if ((el as any)._boundHandlers && (el as any)._boundHandlers[eventType]) {\n el.removeEventListener(eventType, (el as any)._boundHandlers[eventType]);\n }\n // Bind new handler\n const handler = this.config[handlerName];\n const boundHandler = (e: Event) => handler.call(this, e, this.stateObj, this.api);\n el.addEventListener(eventType, boundHandler);\n if (!(el as any)._boundHandlers) (el as any)._boundHandlers = {};\n (el as any)._boundHandlers[eventType] = boundHandler;\n });\n });\n // Recurse into children for rebinding\n Array.from(this.shadowRoot.children).forEach(child => {\n if (child instanceof HTMLElement && typeof (child as any).rebindEventListeners === 'function') {\n (child as any).rebindEventListeners();\n }\n });\n }\n /**\n * Internal: render a template result (string or compiled template).\n * Handles VDOM patching, style updates, refs, and event binding.\n * @param templateResult - HTML string or compiled template\n */\n private _renderTemplateResult(templateResult: string | CompiledTemplate<S & C>): void {\n if (this._hasError) return;\n try {\n if (typeof templateResult === 'string') {\n // --- Sanitize HTML for XSS ---\n function sanitizeHTML(html: string): string {\n // Remove all on* attributes (e.g., onclick, onerror)\n return html.replace(/<([a-zA-Z0-9]+)([^>]*)>/g, (_match, tag, attrs) => {\n // Remove dangerous attributes\n const safeAttrs = attrs.replace(/\\s+on[a-zA-Z]+\\s*=\\s*(['\"][^'\"]*['\"]|[^\\s>]*)/gi, '');\n return `<${tag}${safeAttrs}>`;\n });\n }\n const sanitizedHTML = sanitizeHTML(templateResult);\n const newVNode = parseVNodeFromHTML(sanitizedHTML);\n function logCheckboxVNodes(vnode: VNode) {\n vnode.children.forEach(logCheckboxVNodes);\n }\n logCheckboxVNodes(newVNode);\n const shadowRoot = this.shadowRoot;\n if (!shadowRoot) {\n return;\n }\n let styleEl = shadowRoot.querySelector('style');\n if (!styleEl) {\n styleEl = document.createElement('style');\n shadowRoot.appendChild(styleEl);\n }\n if (this.config.style) {\n styleEl.textContent = typeof this.config.style === 'function' ? this.config.style(this.stateObj) : this.config.style;\n } else {\n styleEl.textContent = '';\n }\n // If fragment, reconcile all children\n if (newVNode.type === '#fragment') {\n // Use patchVNode for full parent/children reconciliation\n const containerEl = Array.from(shadowRoot.childNodes).find(\n node => node.nodeType === 1 && node !== styleEl\n ) as Element | undefined;\n if (containerEl) {\n // Remove all non-style children from container\n Array.from(containerEl.childNodes).forEach(node => {\n // Keep only the <style> node, remove everything else (including text and comment nodes)\n if (!(node.nodeType === 1 && node.nodeName === 'STYLE')) {\n containerEl.removeChild(node);\n }\n });\n const fragmentVNode = {\n type: '#fragment',\n dom: containerEl,\n children: newVNode.children,\n props: {},\n key: undefined\n };\n const prevFragmentVNode = this._prevVNode && this._prevVNode.type === '#fragment'\n ? { ...this._prevVNode, dom: containerEl }\n : fragmentVNode;\n patchVNode(containerEl, prevFragmentVNode, fragmentVNode);\n } else {\n // If no container, mount all children\n newVNode.children.forEach(childVNode => {\n const dom = mountVNode(childVNode);\n if (dom) shadowRoot.appendChild(dom);\n childVNode.dom = dom ?? undefined;\n });\n }\n // Do not assign shadowRoot to VNode.dom; fragment VNode's dom remains undefined\n } else {\n // Find or create persistent root node\n let rootEl = Array.from(this.shadowRoot!.childNodes).find(\n node => node !== styleEl && node.nodeType === 1\n ) as Element | undefined;\n if (rootEl) {\n // If type or key differ, replace root node\n if (this._prevVNode && (this._prevVNode.type !== newVNode.type || this._prevVNode.key !== newVNode.key)) {\n const actualRootNode = mountVNode(newVNode);\n if (actualRootNode) {\n if (this.shadowRoot!.contains(rootEl)) {\n this.shadowRoot!.replaceChild(actualRootNode, rootEl);\n }\n rootEl = actualRootNode as Element;\n }\n } else {\n // Patch root node in place\n patchVNode(rootEl, this._prevVNode!, newVNode);\n }\n } else {\n // No root node, append new\n const actualRootNode = mountVNode(newVNode);\n rootEl = actualRootNode as Element;\n if (rootEl) {\n this.shadowRoot!.appendChild(rootEl);\n }\n }\n newVNode.dom = rootEl;\n }\n this._prevVNode = newVNode;\n this.forceSyncControlledInputs();\n this.lastCompiledTemplate = null;\n } else {\n const isInitialRender = !this.shadowRoot!.firstElementChild;\n const isSameTemplate = this.lastCompiledTemplate?.id === templateResult.id;\n if (isInitialRender) {\n const fragment = renderCompiledTemplate(templateResult, this.stateObj, this.api);\n this.shadowRoot!.appendChild(fragment);\n } else if (isSameTemplate && this.shadowRoot!.firstElementChild) {\n const oldState = this.lastState;\n updateCompiledTemplate(templateResult, this.shadowRoot!.firstElementChild, this.stateObj, this.api, oldState || undefined);\n } else {\n const fragment = renderCompiledTemplate(templateResult, this.stateObj, this.api);\n // Always ensure <style> element is present and up-to-date\n let styleEl = this.shadowRoot!.querySelector('style');\n if (!styleEl) {\n styleEl = document.createElement('style');\n this.shadowRoot!.insertBefore(styleEl, this.shadowRoot!.firstChild);\n }\n if (this.config.style) {\n styleEl.textContent = typeof this.config.style === 'function' ? this.config.style(this.stateObj) : this.config.style;\n } else {\n styleEl.textContent = '';\n }\n\n // Ensure <div data-root> is second child of shadow root\n let rootEl = this.shadowRoot!.querySelector('[data-root]');\n if (!rootEl) {\n rootEl = document.createElement('div');\n rootEl.setAttribute('data-root', '');\n this.shadowRoot!.appendChild(rootEl);\n }\n // Remove all children from rootEl before patching\n while (rootEl.firstChild) {\n rootEl.removeChild(rootEl.firstChild);\n }\n // Append VDOM fragment to rootEl\n rootEl.appendChild(fragment);\n }\n this.lastCompiledTemplate = templateResult;\n }\n // Safe deep clone for lastState, ignoring circular references\n this.lastState = safeClone(this.stateObj);\n /**\n * Safely deep clones an object, ignoring circular references.\n * @param obj - Object to clone\n */\n function safeClone<T>(obj: T): T {\n const seen = new WeakSet<object>();\n function clone(val: T): T {\n if (val === null || typeof val !== 'object') return val;\n if (seen.has(val as object)) return val;\n seen.add(val as object);\n if (Array.isArray(val)) return val.map(clone) as unknown as T;\n const out: Record<string, unknown> = {};\n for (const key in val as Record<string, unknown>) {\n if (Object.prototype.hasOwnProperty.call(val, key)) {\n out[key] = clone((val as Record<string, unknown>)[key] as T);\n }\n }\n return out as T;\n }\n return clone(obj);\n }\n this.updateStyle();\n this.processRefs();\n // Automatic event binding after refs and DOM update\n this.bindEvents();\n // Robust controlled input sync after every render\n this.syncControlledInputsAndEvents();\n } catch (error) {\n this._handleRenderError(error);\n }\n }\n\n /**\n * Internal: handle render errors and error boundaries.\n * Logs details and allows fallback UI.\n * @param error - Error object\n */\n private _handleRenderError(error: unknown): void {\n this._hasError = true;\n // Improved error boundary: log details and always render fallback UI\n if (this.config.debug) {\n console.error(`[runtime] Render error in <${this.tagName.toLowerCase()}>:`, error);\n }\n runtimePlugins.forEach(p => p.onError?.(error instanceof Error ? error : new Error(String(error)), this.stateObj, this.api));\n if ('onError' in this.config && typeof (this.config.onError) === 'function') {\n try {\n this.config.onError(error instanceof Error ? error : new Error(String(error)), this.api.state, this.api);\n } catch (fallbackError) {\n if (this.config.debug) {\n console.error(`[runtime] Error in onError handler:`, fallbackError);\n }\n }\n }\n this.renderError(error instanceof Error ? error : new Error(String(error)));\n }\n\n /**\n * Schedule a render using requestAnimationFrame, batching multiple state changes.\n */\n private scheduleRender(): void {\n if (this.rafId !== undefined && this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n this.rafId = requestAnimationFrame(() => {\n this.render();\n this.rafId = null;\n });\n }\n\n /**\n * Updates the style element in the shadow root based on the current state.\n */\n private updateStyle(): void {\n const styleEl = this.shadowRoot!.querySelector('style');\n if (!styleEl || !this.config.style) return;\n\n const css = typeof this.config.style === 'function'\n ? this.config.style(this.api.state)\n : this.config.style;\n \n styleEl.textContent = css;\n }\n\n /**\n * Processes and attaches ref handlers for elements with data-ref attributes.\n */\n private processRefs(): void {\n if (!this.config.refs) return;\n // Track attached listeners per element/type\n const listenerMap: WeakMap<Element, Set<string>> = new WeakMap();\n\n Object.entries(this.config.refs).forEach(([refName, handler]) => {\n const element = this.shadowRoot!.querySelector(`[data-ref=\"${refName}\"]`);\n if (element) {\n // Only attach listeners once per element/type\n if (!listenerMap.has(element)) {\n listenerMap.set(element, new Set());\n }\n const attachedTypes = listenerMap.get(element)!;\n\n // Wrap addEventListener to prevent duplicates\n const originalAddEventListener = element.addEventListener;\n (element as ExtendedHTMLElement).addEventListener = function(\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions\n ) {\n const key = `${type}`;\n if (attachedTypes.has(key)) return;\n attachedTypes.add(key);\n originalAddEventListener.call(element, type, listener, options);\n };\n\n // Mark as processed and call handler\n element.setAttribute('data-refs-processed', 'true');\n try {\n handler(element, this.api.state, this.api);\n } catch (err) {\n this._handleRenderError(err);\n // Do NOT re-throw, just handle and continue\n }\n }\n // Silently skip missing refs as they may be conditionally rendered\n });\n }\n\n /**\n * Automatically bind events for elements with data-on-* attributes.\n * Ensures events are not attached multiple times after rerender.\n */\n private bindEvents(): void {\n if (!this.shadowRoot) return;\n const walker = document.createTreeWalker(this.shadowRoot, NodeFilter.SHOW_ELEMENT);\n let node = walker.nextNode();\n while (node) {\n const el = node as ExtendedHTMLElement;\n Array.from(el.attributes).forEach(attr => {\n if (attr.name.startsWith('data-on-')) {\n const eventType = attr.name.slice('data-on-'.length);\n const handlerName = attr.value;\n // Look for handler on config, not api\n const handler = (this.config as Record<string, unknown>)[handlerName];\n if (typeof handler === 'function') {\n // Remove previous handler if present\n if (el._boundHandlers && el._boundHandlers[eventType]) {\n el.removeEventListener(eventType, el._boundHandlers[eventType]);\n }\n // Bind new handler\n const boundHandler = (e: Event) => {\n (handler as Function).call(this.config, e, this.api.state, this.api);\n // Immediately sync controlled inputs after handler runs\n this.syncControlledInputsAndEvents();\n };\n el.addEventListener(eventType, boundHandler);\n if (!el._boundHandlers) el._boundHandlers = {};\n el._boundHandlers[eventType] = boundHandler;\n } else {\n if (this.config.debug) console.warn(`[runtime] Handler '${handlerName}' not found on config for event '${eventType}'`, el);\n }\n }\n });\n node = walker.nextNode();\n }\n }\n\n /**\n * Renders a fallback error UI in the shadow root.\n * @param error - Error object\n */\n private renderError(error: Error): void {\n const styleContent = this.config.style\n ? (typeof this.config.style === 'function' ? this.config.style(this.api.state) : this.config.style)\n : '';\n this.shadowRoot!.innerHTML = `\n <style>${styleContent}</style>\n <div style=\"color: red; border: 1px solid red; padding: 1rem; border-radius: 4px;\">\n <h3>Error Boundary</h3>\n <div>Error: ${error.message}</div>\n </div>\n `;\n }\n }\n} else {\n // SSR fallback: minimal class, no DOM, no lifecycle, no \"this\"\n ComponentElement = class {\n // No-op for SSR, just a stub\n constructor() {}\n };\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\n/**\n * Registers a new custom element component.\n * Validates config, sets up reactive state, and defines the custom element.\n * Supports HMR and SSR hydration.\n * @template S - State type\n * @template C - Computed type\n * @param tag - Custom element tag name\n * @param config - Component configuration\n */\nexport function component<S extends ComponentState, C extends Record<string, any> = {}>(tag: string, config: ComponentConfig<S, C>): void {\n // Prevent deep object injection in config and state\n const sanitizedConfig = deepSanitizeObject(config);\n config = sanitizedConfig as ComponentConfig<S, C>;\n // Do not assign to readonly state property\n if (config.debug) {\n console.log(`[runtime] Debugging component: ${tag}`, config);\n }\n\n // Validate config\n if (!tag || !config.template) {\n if (config && typeof config.onError === 'function') {\n config.onError(new Error('Component requires tag and template'), config.state ?? {}, {\n state: config.state ?? {},\n emit: () => {},\n onGlobal: () => () => {},\n offGlobal: () => {},\n emitGlobal: () => {}\n });\n }\n if (config && config.debug) {\n console.error('[runtime] Malformed config:', { tag, config });\n }\n return;\n }\n\n // Plugin System: Call all plugins' onInit in registration order\n runtimePlugins.forEach(p => {\n try {\n p.onInit?.(config as any);\n } catch (err) {\n if (config && typeof config.onError === 'function') {\n config.onError(err instanceof Error ? err : new Error(String(err)), config.state, {\n state: config.state,\n emit: () => {},\n onGlobal: () => () => {},\n offGlobal: () => {},\n emitGlobal: () => {}\n });\n }\n if (config && config.debug) console.error('[runtime] Plugin onInit error:', err);\n }\n });\n\n // HMR support: unregister previous definition if in dev and module.hot is available\n const isDev = typeof window !== 'undefined' && (window as any).VITE_DEV_HMR;\n const hasHMR = typeof import.meta !== 'undefined' && (import.meta as any).hot;\n\n if ((isDev || hasHMR) && typeof customElements !== 'undefined' && customElements.get(tag)) {\n try {\n document.querySelectorAll(tag).forEach(el => el.remove());\n // @ts-ignore\n if ((window as unknown as { customElements: { _definitions?: Record<string, unknown> } }).customElements._definitions) {\n delete (window as unknown as { customElements: { _definitions?: Record<string, unknown> } }).customElements._definitions![tag];\n }\n } catch (_e) {}\n }\n\n if (typeof customElements !== 'undefined' && customElements.get(tag)) {\n if (config.debug) console.warn(`[runtime] Component \"${tag}\" already registered`);\n return;\n }\n\n // Create reactive state with computed properties\n const state = reactive(config.state ?? ({} as S), config.computed as Record<string, (state: S) => unknown>);\n // @ts-expect-error: Overriding readonly property for runtime assignment\n (config as { state: S & C }).state = state;\n (config as { _subscribe?: unknown })._subscribe = state.subscribe;\n\n const stateObjForKeys = (config.state ?? {}) as Record<string, unknown>;\n const primitiveKeys = Object.keys(stateObjForKeys).filter(\n key => ['string', 'number', 'boolean'].includes(typeof stateObjForKeys[key])\n );\n\n class RuntimeComponent extends ComponentElement {\n static get observedAttributes() {\n return primitiveKeys;\n }\n constructor() {\n super();\n }\n }\n // Type assertion for CustomElementConstructor\n const ComponentClass = RuntimeComponent as unknown as CustomElementConstructor;\n\n if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n // Store config in a global registry for lookup in connectedCallback\n (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry = (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry || {};\n (window as unknown as { __componentRegistry?: ComponentRegistry }).__componentRegistry![tag] = config;\n customElements.define(tag, ComponentClass);\n }\n\n // Accept HMR updates if available\n if (\n hasHMR &&\n typeof import.meta !== 'undefined' &&\n import.meta.hot &&\n typeof import.meta.hot.accept === 'function' &&\n typeof customElements !== 'undefined'\n ) {\n import.meta.hot.accept(() => {\n if (!customElements.get(tag)) {\n customElements.define(tag, ComponentClass);\n }\n });\n }\n}\n\n/**\n * RouterLink component state\n */\nexport interface RouterLinkState extends ComponentState {\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\n/**\n * Singleton router instance for global access.\n * \n * Define here to prevent circular dependency\n * issue with component.\n */\nexport function initRouter(config: RouterConfig) {\n const router = useRouter(config);\n component('router-view', {\n template: async () => {\n if (!router) return '<div>Router not initialized.</div>';\n const current = router.getCurrent() as import('./router').RouteState;\n const { path } = current;\n const match = router.matchRoute(path);\n if (!match.route) return '<div>Not found</div>';\n if (match.route.load) {\n await match.route.load();\n }\n return `<${match.route.component}></${match.route.component}>`;\n },\n onMounted(_state, api) {\n // Subscribe to router state and re-render on change\n if (router && typeof router.subscribe === 'function') {\n router.subscribe(() => {\n api.render();\n });\n }\n }\n });\n component<RouterLinkState>('router-link', {\n state: {\n to: '',\n tag: 'a',\n replace: false,\n exact: false,\n activeClass: 'active',\n exactActiveClass: 'exact-active',\n ariaCurrentValue: 'page',\n disabled: false,\n external: false,\n style: css`\n [aria-disabled=\"true\"] {\n pointer-events: none;\n opacity: 0.5;\n }\n `,\n },\n computed: {\n current() {\n return router.getCurrent();\n },\n isExactActive(state: RouterLinkState) {\n const current = state.current as { path: string };\n return current.path === state.to;\n },\n isActive(state: RouterLinkState) {\n const current = state.current as { path?: string } | undefined;\n return state.exact\n ? state.isExactActive\n : current && typeof current.path === 'string'\n ? current.path.startsWith(state.to)\n : false;\n },\n className(state: RouterLinkState) {\n return state.isExactActive\n ? state.exactActiveClass\n : state.isActive\n ? state.activeClass\n : '';\n },\n ariaCurrent(state: RouterLinkState) {\n return state.isExactActive ? `aria-current=\"${state.ariaCurrentValue}\"` : '';\n },\n isButton(state: RouterLinkState) {\n return state.tag === 'button';\n },\n disabledAttr(state: RouterLinkState) {\n return state.disabled\n ? state.isButton\n ? 'disabled aria-disabled=\"true\" tabindex=\"-1\"'\n : 'aria-disabled=\"true\" tabindex=\"-1\"'\n : '';\n },\n externalAttr(state: RouterLinkState) {\n return state.external && (state.tag === 'a' || !state.tag)\n ? 'target=\"_blank\" rel=\"noopener noreferrer\"'\n : '';\n },\n },\n reflect: [ 'to', 'tag', 'replace', 'exact', 'activeClass', 'exactActiveClass', 'ariaCurrentValue', 'disabled', 'external', 'style' ],\n style: (state: RouterLinkState) => state.style,\n template: (state) => html`\n ${state.isButton ? html`\n <button\n part=\"button\"\n class=\"${state.className}\"\n ${state.ariaCurrent}\n ${state.disabledAttr}\n ${state.externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></button>\n `(state) : html`\n <a\n part=\"link\"\n href=\"${state.to}\"\n class=\"${state.className}\"\n ${state.ariaCurrent}\n ${state.disabledAttr}\n ${state.externalAttr}\n data-on-click=\"navigate\"\n ><slot></slot></a>\n `(state)}\n `(state),\n navigate: (e: MouseEvent, state: RouterLinkState) => {\n if (state.disabled) {\n e.preventDefault();\n return;\n }\n // If external, let browser handle navigation\n if (state.external && (state.tag === 'a' || !state.tag)) {\n return;\n }\n e.preventDefault();\n if (state.replace) {\n router.replace(state.to);\n } else {\n router.push(state.to);\n }\n }\n });\n return router;\n}"],"names":["Store","initial","state","target","prop","value","notify","listeners","subscribe","listener","getState","fn","GlobalEventBus","eventName","data","now","counter","eventHandlers","handler","error","options","resolve","unsubscribe","stats","eventBus","isServer","createSSRAPI","renderToString","config","api","innerHTML","styleContent","attrs","attrString","key","escapeAttribute","html","formatHTML","escapeHTML","renderComponentsToString","components","context","htmlParts","css","styles","generateHydrationScript","componentConfigs","tag","str","line","depth","escapeIfUserInput","item","strings","values","flatten","val","flat","v","arr","res","result","hasAsync","valuePromises","i","prevStatic","isEventHandlerAttr","resolvedValues","asyncResult","asyncIndex","compile","id","classes","obj","className","useDataModel","el","stateObj","keyWithModifiers","rawKey","modifiers","s","setNestedState","path","keys","updateState","e","trueValue","falseValue","idx","radio","parent","isDevelopment","compileTemplate","templateString","development","cache","optimize","generateTemplateId","templateCache","metrics","performanceMetrics","compiled","parseAndCompileTemplate","findDOMPath","templateHTML","placeholder","findPlaceholderPath","node","currentPath","childIndex","child","container","template","TemplateAnalyzer","fragment","render","d","j","dynamicRegex","lastIndex","match","staticPart","attrMatch","attrName","styleProp","styleMatch","expression","finalStatic","_index","updateType","marker","_api","staticHTML","doc","getNodeByPath","root","current","index","renderCompiledTemplate","reconstructTemplate","updateCompiledTemplate","element","newState","oldState","update","newValue","applyUpdate","targetNode","walker","found","textContent","newText","hash","char","getVNodeKey","type","parentPath","model","safeReplaceChild","newChild","oldChild","err","mountVNode","vnode","textNode","k","childNode","parseVNodeFromHTML","nodes","createVNodeFromElement","elem","props","attr","tagName","vnodeKey","inputType","valueAttr","checkedAttr","children","patchVNode","oldVNode","newVNode","isMeaningfulVNode","oldChildren","newChildren","isControlled","newDom","inputEl","oldDom","isCustomElement","a","newTextNode","oldKeyMap","newKeySet","domOrder","mounted","newKeys","c","parseQuery","search","matchRoute","routes","route","paramNames","regexPath","m","regex","params","name","componentCache","resolveRouteComponent","mod","useRouter","base","getLocation","store","push","replace","back","url","query","loc","matchRouteSSR","reactive","initialState","computedMap","computedKeys","topProxy","set","changes","proxyCache","createReactive","reactiveProxy","receiver","oldValue","runtimePlugins","useRuntimePlugin","plugin","deepSanitizeObject","seen","dangerousKeys","sanitized","isPromise","ComponentElement","newTemplate","_oldValue","camelName","_","stateKey","initialType","num","input","modelAttr","stateValue","isFocused","isDirty","stateVal","textarea","select","bindExpr","arrMatch","arrKey","idxStr","propKey","_e","dotMatch","objKey","modifierStr","shadow","computedState","detail","unsub","styleEl","hydrateEls","handlers","p","templateResultOrPromise","templateResult","eventType","handlerName","boundHandler","safeClone","clone","out","sanitizeHTML","_match","safeAttrs","logCheckboxVNodes","sanitizedHTML","shadowRoot","containerEl","fragmentVNode","prevFragmentVNode","childVNode","dom","rootEl","actualRootNode","isInitialRender","isSameTemplate","fallbackError","listenerMap","refName","attachedTypes","originalAddEventListener","component","isDev","hasHMR","stateObjForKeys","primitiveKeys","RuntimeComponent","ComponentClass","initRouter","router","_state"],"mappings":"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"}