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