nuclo 0.1.127 → 0.2.1

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.
Files changed (47) hide show
  1. package/dist/core/runtimeBootstrap.d.ts.map +1 -1
  2. package/dist/nuclo.cjs +1 -1
  3. package/dist/nuclo.cjs.map +1 -1
  4. package/dist/nuclo.mjs +1 -1
  5. package/dist/nuclo.mjs.map +1 -1
  6. package/dist/nuclo.umd.js +1 -1
  7. package/dist/nuclo.umd.js.map +1 -1
  8. package/dist/polyfill/Document.d.ts.map +1 -1
  9. package/dist/polyfill/Element.d.ts.map +1 -1
  10. package/dist/polyfill/Event.d.ts.map +1 -1
  11. package/dist/polyfill/nuclo.polyfill.cjs +1 -1
  12. package/dist/polyfill/nuclo.polyfill.cjs.map +1 -1
  13. package/dist/polyfill/nuclo.polyfill.mjs +1 -1
  14. package/dist/polyfill/nuclo.polyfill.mjs.map +1 -1
  15. package/dist/ssr/index.d.ts +1 -1
  16. package/dist/ssr/index.d.ts.map +1 -1
  17. package/dist/ssr/nuclo.ssr.cjs +1 -1
  18. package/dist/ssr/nuclo.ssr.cjs.map +1 -1
  19. package/dist/ssr/nuclo.ssr.mjs +1 -1
  20. package/dist/ssr/nuclo.ssr.mjs.map +1 -1
  21. package/dist/ssr/renderToString.d.ts.map +1 -1
  22. package/dist/style/css.d.ts +314 -0
  23. package/dist/style/css.d.ts.map +1 -0
  24. package/dist/style/engine.d.ts +34 -0
  25. package/dist/style/engine.d.ts.map +1 -0
  26. package/dist/style/index.d.ts +2 -4
  27. package/dist/style/index.d.ts.map +1 -1
  28. package/dist/utility/errorHandler.d.ts.map +1 -1
  29. package/package.json +11 -10
  30. package/types/features/list.d.ts +1 -0
  31. package/types/features/style.d.ts +61 -1954
  32. package/dist/environment-BNEQOK9T.mjs +0 -2
  33. package/dist/environment-BNEQOK9T.mjs.map +0 -1
  34. package/dist/environment-BQwVWSG6.cjs +0 -2
  35. package/dist/environment-BQwVWSG6.cjs.map +0 -1
  36. package/dist/style/cssGenerator.d.ts +0 -13
  37. package/dist/style/cssGenerator.d.ts.map +0 -1
  38. package/dist/style/cssPropertyTypes.d.ts +0 -98
  39. package/dist/style/cssPropertyTypes.d.ts.map +0 -1
  40. package/dist/style/styleBuilder.d.ts +0 -337
  41. package/dist/style/styleBuilder.d.ts.map +0 -1
  42. package/dist/style/styleCache.d.ts +0 -5
  43. package/dist/style/styleCache.d.ts.map +0 -1
  44. package/dist/style/styleProperties.d.ts +0 -13
  45. package/dist/style/styleProperties.d.ts.map +0 -1
  46. package/dist/style/styleQueries.d.ts +0 -25
  47. package/dist/style/styleQueries.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"nuclo.polyfill.mjs","names":[],"sources":["../../src/polyfill/Node.ts","../../src/polyfill/Element.ts","../../src/polyfill/Text.ts","../../src/polyfill/Document.ts","../../src/polyfill/Event.ts","../../src/polyfill/index.ts"],"sourcesContent":["/**\n * Base Node class for instanceof checks in Node.js polyfill\n */\nexport class NucloNode {\n nodeType: number = 1; // ELEMENT_NODE\n nodeName: string = '';\n nodeValue: string | null = null;\n parentNode: unknown = null;\n _childNodes: Node[] | null = null;\n textContent: string = '';\n\n get childNodes(): NodeListOf<ChildNode> {\n const nodes = this._childNodes ?? [];\n return {\n ...nodes,\n length: nodes.length,\n item: (index: number) => (nodes[index] as ChildNode) || null,\n [Symbol.iterator]: function* () {\n for (const node of nodes) {\n yield node as ChildNode;\n }\n },\n forEach: (callback: (value: ChildNode, key: number, parent: NodeListOf<ChildNode>) => void) => {\n for (let i = 0; i < nodes.length; i++) {\n callback(nodes[i] as ChildNode, i, this.childNodes);\n }\n },\n entries: function* () {\n for (let i = 0; i < nodes.length; i++) {\n yield [i, nodes[i] as ChildNode] as [number, ChildNode];\n }\n },\n keys: function* () {\n for (let i = 0; i < nodes.length; i++) {\n yield i;\n }\n },\n values: function* () {\n for (const node of nodes) {\n yield node as ChildNode;\n }\n }\n } as unknown as NodeListOf<ChildNode>;\n }\n}\n","import { NucloNode } from './Node';\nimport { isBrowser } from '../utility/environment';\n\n/**\n * Lightweight style object for SSR — prototype methods instead of Object.defineProperty per element.\n * Stores CSS properties as own properties and provides cssText/setProperty/getPropertyValue via prototype.\n */\nclass SSRStyle {\n [key: string]: unknown;\n\n get cssText(): string {\n const entries = Object.entries(this);\n if (entries.length === 0) return '';\n return entries.map(([k, v]) => `${k}: ${v}`).join('; ');\n }\n\n setProperty(name: string, value: string): void {\n (this as Record<string, unknown>)[name] = value;\n }\n\n getPropertyValue(name: string): string {\n return ((this as Record<string, unknown>)[name] as string) || '';\n }\n}\n\n// Lightweight classList for SSR — prototype methods instead of per-element closures\nclass SSRClassList {\n private _el: NucloElement;\n constructor(el: NucloElement) { this._el = el; }\n\n add(...tokens: string[]): void {\n const classes = this._el.className ? this._el.className.split(' ').filter(Boolean) : [];\n for (const t of tokens) if (t && !classes.includes(t)) classes.push(t);\n this._el.className = classes.join(' ');\n }\n remove(...tokens: string[]): void {\n if (!this._el.className) return;\n this._el.className = this._el.className.split(' ').filter(c => c && !tokens.includes(c)).join(' ');\n }\n contains(token: string): boolean {\n return !!this._el.className && this._el.className.split(' ').includes(token);\n }\n toggle(token: string, force?: boolean): boolean {\n const has = this.contains(token);\n if (force === undefined) { if (has) { this.remove(token); return false; } this.add(token); return true; }\n if (force) { this.add(token); return true; }\n this.remove(token); return false;\n }\n replace(oldToken: string, newToken: string): boolean {\n if (!this.contains(oldToken)) return false;\n this.remove(oldToken); this.add(newToken); return true;\n }\n item(index: number): string | null { return (this._el.className.split(' ').filter(Boolean)[index]) ?? null; }\n get length(): number { return this._el.className ? this._el.className.split(' ').filter(Boolean).length : 0; }\n get value(): string { return this._el.className; }\n set value(v: string) { this._el.className = v; }\n toString(): string { return this._el.className; }\n supports(_token: string): boolean { return false; }\n forEach(cb: (value: string, key: number, parent: DOMTokenList) => void): void {\n const classes = this._el.className.split(' ').filter(Boolean);\n for (let i = 0; i < classes.length; i++) cb(classes[i], i, this as unknown as DOMTokenList);\n }\n [Symbol.iterator](): Iterator<string> {\n const classes = this._el.className.split(' ').filter(Boolean);\n let i = 0;\n return { next(): IteratorResult<string> { return i < classes.length ? { value: classes[i++], done: false } : { value: '', done: true }; } };\n }\n entries(): Iterator<[number, string]> {\n const classes = this._el.className.split(' ').filter(Boolean);\n let i = 0;\n return { next(): IteratorResult<[number, string]> { return i < classes.length ? { value: [i, classes[i++]], done: false } : { value: [0, ''], done: true }; } };\n }\n keys(): Iterator<number> {\n const len = this.length; let i = 0;\n return { next(): IteratorResult<number> { return i < len ? { value: i++, done: false } : { value: 0, done: true }; } };\n }\n values(): Iterator<string> { return this[Symbol.iterator](); }\n}\n\ninterface TextNode {\n nodeType: 3;\n textContent: string;\n}\n\ninterface CommentNode {\n nodeType: 8;\n data: string;\n}\n\nfunction isElementNode(node: unknown): node is NucloElement {\n return typeof node === 'object' && node !== null && 'tagName' in node;\n}\n\nfunction isTextNode(node: unknown): node is TextNode {\n return typeof node === 'object' && node !== null && 'nodeType' in node && (node as { nodeType: number }).nodeType === 3;\n}\n\nfunction isCommentNode(node: unknown): node is CommentNode {\n return typeof node === 'object' && node !== null && 'nodeType' in node && (node as { nodeType: number }).nodeType === 8;\n}\n\nexport class NucloElement extends NucloNode {\n tagName: string;\n children: unknown[];\n attributes: Map<string, string>;\n className: string = '';\n classList: DOMTokenList;\n textContent: string = '';\n private _innerHTML: string = '';\n parentNode: unknown = null;\n rawMods?: unknown[];\n mods?: unknown[];\n style: CSSStyleDeclaration;\n id: string = '';\n namespaceURI?: string;\n sheet?: CSSStyleSheet | null;\n private _listeners: Map<string, Set<EventListener>> | null;\n\n get innerHTML(): string {\n return this.serializeChildren();\n }\n\n set innerHTML(value: string) {\n this._innerHTML = value;\n }\n \n private serializeChildren(): string {\n let html = '';\n for (const child of this.children) {\n if (isElementNode(child)) {\n html += this.serializeElement(child);\n } else if (isTextNode(child)) {\n html += child.textContent || '';\n } else if (isCommentNode(child)) {\n html += `<!--${child.data || ''}-->`;\n }\n }\n return html;\n }\n \n private serializeElement(element: NucloElement): string {\n const tag = element.tagName.toLowerCase();\n let html = `<${tag}`;\n \n // Add attributes\n if (element.id) {\n html += ` id=\"${element.id}\"`;\n }\n if (element.className) {\n html += ` class=\"${element.className}\"`;\n }\n if (element.attributes) {\n for (const [name, value] of element.attributes) {\n if (name !== 'id' && name !== 'class') {\n html += ` ${name}=\"${value}\"`;\n }\n }\n }\n \n html += '>';\n \n // Add children\n if (element.children && element.children.length > 0) {\n for (const child of element.children) {\n if (isElementNode(child)) {\n html += this.serializeElement(child);\n } else if (isTextNode(child)) {\n html += child.textContent || '';\n } else if (isCommentNode(child)) {\n html += `<!--${child.data || ''}-->`;\n }\n }\n }\n \n html += `</${tag}>`;\n return html;\n }\n \n constructor(tagName: string) {\n super();\n this.tagName = tagName.toLowerCase();\n this.nodeType = 1; // ELEMENT_NODE\n this.nodeName = tagName.toUpperCase();\n this.children = [];\n this.attributes = new Map<string, string>();\n\n if (!isBrowser) {\n // ── SSR path: minimal allocations, no Proxy, no event listeners ──\n this._listeners = null;\n\n // Prototype-based style — zero Object.defineProperty calls per element\n this.style = new SSRStyle() as unknown as CSSStyleDeclaration;\n\n // Prototype-based classList — zero closures per element\n this.classList = new SSRClassList(this) as unknown as DOMTokenList;\n // sheet stays undefined — not needed in SSR\n } else {\n // ── Browser path: full-featured Proxy style + DOMTokenList ──\n this._listeners = new Map();\n\n const styleProps: Record<string, string> = {};\n this.style = new Proxy({} as CSSStyleDeclaration, {\n get: (_target, prop: string) => {\n if (prop === 'setProperty') return (name: string, value: string) => { styleProps[name] = value; };\n if (prop === 'getPropertyValue') return (name: string) => styleProps[name] || '';\n if (prop === 'cssText') return Object.entries(styleProps).map(([k, v]) => `${k}: ${v}`).join('; ');\n return styleProps[prop];\n },\n set: (_target, prop: string, value: string) => { styleProps[prop] = value; return true; },\n });\n\n // CSSStyleSheet mock for style elements (browser only)\n if (this.tagName === 'style') {\n const cssRules: CSSRule[] = [];\n this.sheet = {\n cssRules: cssRules as unknown as CSSRuleList,\n insertRule: (rule: string, index?: number) => {\n const idx = index ?? cssRules.length;\n let mockRule: CSSRule;\n if (rule.trim().startsWith('@')) {\n const innerRules: CSSRule[] = [];\n const conditionText = rule.replace(/^@\\w+\\s+/, '').replace(/\\s*\\{[\\s\\S]*\\}$/, '').trim();\n mockRule = {\n cssText: rule, conditionText,\n media: { mediaText: conditionText } as MediaList,\n cssRules: innerRules as unknown as CSSRuleList,\n insertRule: (innerRule: string, innerIndex?: number) => {\n const innerIdx = innerIndex ?? innerRules.length;\n innerRules.splice(innerIdx, 0, { cssText: innerRule, selectorText: innerRule.split('{')[0].trim(), style: {} as CSSStyleDeclaration, type: 1 } as unknown as CSSRule);\n return innerIdx;\n },\n deleteRule: (i: number) => { innerRules.splice(i, 1); },\n type: 4,\n } as unknown as CSSRule;\n } else {\n mockRule = { cssText: rule, selectorText: rule.split('{')[0].trim(), style: {} as CSSStyleDeclaration, type: 1 } as unknown as CSSRule;\n }\n cssRules.splice(idx, 0, mockRule);\n return idx;\n },\n deleteRule: (index: number) => { cssRules.splice(index, 1); },\n } as unknown as CSSStyleSheet;\n }\n\n this.classList = createClassList(this);\n }\n }\n \n appendChild<T extends Node>(child: T): T {\n this.children.push(child);\n if (isBrowser && (this as any)['_childNodes']) {\n (this as any)['_childNodes'].push(child);\n }\n if (typeof child === 'object' && child !== null && 'parentNode' in child) {\n (child as { parentNode: unknown }).parentNode = this;\n }\n return child;\n }\n \n setAttribute(name: string, value: string): void {\n this.attributes.set(name, value);\n if (name === 'class') {\n this.className = value;\n } else if (name === 'id') {\n this.id = value;\n }\n }\n \n getAttribute(name: string): string | null {\n return this.attributes.get(name) || null;\n }\n \n removeAttribute(name: string): void {\n this.attributes.delete(name);\n if (name === 'class') {\n this.className = '';\n }\n }\n \n hasAttribute(name: string): boolean {\n return this.attributes.has(name);\n }\n \n insertBefore<T extends Node>(newNode: T, referenceNode: Node | null): T {\n if (referenceNode === null) {\n return this.appendChild(newNode);\n }\n const index = this.children.indexOf(referenceNode);\n if (index !== -1) {\n this.children.splice(index, 0, newNode);\n if (isBrowser && (this as any)['_childNodes']) {\n const childNodesIndex = (this as any)['_childNodes'].indexOf(referenceNode);\n if (childNodesIndex !== -1) {\n (this as any)['_childNodes'].splice(childNodesIndex, 0, newNode);\n }\n }\n if (typeof newNode === 'object' && newNode !== null && 'parentNode' in newNode) {\n (newNode as { parentNode: unknown }).parentNode = this;\n }\n }\n return newNode;\n }\n \n removeChild<T extends Node>(child: T): T {\n const index = this.children.indexOf(child);\n if (index !== -1) {\n this.children.splice(index, 1);\n if (isBrowser && (this as any)['_childNodes']) {\n const cnIndex = (this as any)['_childNodes'].indexOf(child);\n if (cnIndex !== -1) {\n (this as any)['_childNodes'].splice(cnIndex, 1);\n }\n }\n if (typeof child === 'object' && child !== null && 'parentNode' in child) {\n (child as { parentNode: unknown }).parentNode = null;\n }\n }\n return child;\n }\n\n replaceChild<T extends Node>(newChild: Node, oldChild: T): T {\n const index = this.children.indexOf(oldChild);\n if (index !== -1) {\n this.children[index] = newChild;\n if (isBrowser && (this as any)['_childNodes']) {\n const cnIndex = (this as any)['_childNodes'].indexOf(oldChild);\n if (cnIndex !== -1) {\n (this as any)['_childNodes'][cnIndex] = newChild;\n }\n }\n if (typeof newChild === 'object' && newChild !== null && 'parentNode' in newChild) {\n (newChild as { parentNode: unknown }).parentNode = this;\n }\n if (typeof oldChild === 'object' && oldChild !== null && 'parentNode' in oldChild) {\n (oldChild as { parentNode: unknown }).parentNode = null;\n }\n }\n return oldChild;\n }\n \n addEventListener(type: string, listener: EventListener): void {\n if (!this._listeners) return;\n if (!this._listeners.has(type)) {\n this._listeners.set(type, new Set());\n }\n this._listeners.get(type)!.add(listener);\n }\n\n removeEventListener(type: string, listener: EventListener): void {\n const listeners = this._listeners?.get(type);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const listeners = this._listeners?.get(event.type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Error in event listener:', error);\n }\n }\n }\n if (event.bubbles && this.parentNode && typeof this.parentNode === 'object' && 'dispatchEvent' in this.parentNode && typeof this.parentNode.dispatchEvent === 'function') {\n this.parentNode.dispatchEvent(event);\n }\n return true;\n }\n \n querySelector(selector: string): Element | null {\n // Simple implementation - supports basic selectors\n // #id, .class, tagName\n if (selector.startsWith('#')) {\n const id = selector.slice(1);\n return this.querySelectorById(id);\n } else if (selector.startsWith('.')) {\n const className = selector.slice(1);\n return this.querySelectorByClass(className);\n } else {\n // Tag name selector\n return this.querySelectorByTag(selector);\n }\n }\n \n private querySelectorById(id: string): Element | null {\n // Check self\n if (this.id === id) {\n return this as unknown as Element;\n }\n // Check children recursively\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.id === id) {\n return child as unknown as Element;\n }\n const found = child.querySelector(`#${id}`);\n if (found) return found;\n }\n }\n return null;\n }\n \n private querySelectorByClass(className: string): Element | null {\n // Check self\n if (this.classList.contains(className)) {\n return this as unknown as Element;\n }\n // Check children recursively\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.classList?.contains(className)) {\n return child as unknown as Element;\n }\n const found = child.querySelector(`.${className}`);\n if (found) return found;\n }\n }\n return null;\n }\n \n private querySelectorByTag(tagName: string): Element | null {\n const lowerTag = tagName.toLowerCase();\n // Check self\n if (this.tagName.toLowerCase() === lowerTag) {\n return this as unknown as Element;\n }\n // Check children recursively\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.tagName.toLowerCase() === lowerTag) {\n return child as unknown as Element;\n }\n const found = child.querySelector(tagName);\n if (found) return found;\n }\n }\n return null;\n }\n \n querySelectorAll(selector: string): NodeListOf<Element> {\n const results: Element[] = [];\n \n if (selector.startsWith('#')) {\n const found = this.querySelector(selector);\n if (found) results.push(found);\n } else if (selector.startsWith('.')) {\n const className = selector.slice(1);\n this.querySelectorAllByClass(className, results);\n } else {\n const tagName = selector.toLowerCase();\n this.querySelectorAllByTag(tagName, results);\n }\n \n return results as unknown as NodeListOf<Element>;\n }\n \n private querySelectorAllByClass(className: string, results: Element[]): void {\n if (this.classList.contains(className)) {\n results.push(this as unknown as Element);\n }\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.classList?.contains(className)) {\n results.push(child as unknown as Element);\n }\n child.querySelectorAllByClass(className, results);\n }\n }\n }\n \n private querySelectorAllByTag(tagName: string, results: Element[]): void {\n if (this.tagName.toLowerCase() === tagName) {\n results.push(this as unknown as Element);\n }\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.tagName.toLowerCase() === tagName) {\n results.push(child as unknown as Element);\n }\n child.querySelectorAllByTag(tagName, results);\n }\n }\n }\n}\n\nfunction createClassList(owner: NucloElement): DOMTokenList {\n const getClasses = () => owner.className.split(' ').filter((c) => c);\n const setClasses = (classes: string[]) => {\n owner.className = classes.join(' ');\n };\n\n const classList = {\n add: (...tokens: string[]) => {\n const classes = getClasses();\n for (const token of tokens) {\n if (token && !classes.includes(token)) {\n classes.push(token);\n }\n }\n setClasses(classes);\n },\n remove: (...tokens: string[]) => {\n if (tokens.length === 0) return;\n setClasses(getClasses().filter((c) => !tokens.includes(c)));\n },\n toggle: (token: string, force?: boolean) => {\n const hasClass = classList.contains(token);\n if (force === undefined) {\n if (hasClass) {\n classList.remove(token);\n return false;\n }\n classList.add(token);\n return true;\n }\n if (force) {\n classList.add(token);\n return true;\n }\n classList.remove(token);\n return false;\n },\n contains: (token: string) => getClasses().includes(token),\n replace: (oldToken: string, newToken: string) => {\n const classes = getClasses();\n const index = classes.indexOf(oldToken);\n if (index === -1) return false;\n classes[index] = newToken;\n setClasses(classes);\n return true;\n },\n item: (index: number) => getClasses()[index] || null,\n get length() {\n return getClasses().length;\n },\n toString: () => owner.className,\n [Symbol.iterator]: function* () {\n yield* getClasses();\n },\n forEach: (callback: (value: string, key: number, parent: DOMTokenList) => void) => {\n const classes = getClasses();\n for (let i = 0; i < classes.length; i++) {\n callback(classes[i], i, classList as unknown as DOMTokenList);\n }\n },\n entries: function* () {\n const classes = getClasses();\n for (let i = 0; i < classes.length; i++) {\n yield [i, classes[i]] as [number, string];\n }\n },\n keys: function* () {\n const classes = getClasses();\n for (let i = 0; i < classes.length; i++) {\n yield i;\n }\n },\n values: function* () {\n yield* getClasses();\n },\n get value() {\n return owner.className;\n },\n set value(value: string) {\n owner.className = value;\n },\n supports: (_token: string) => false\n };\n\n return classList as unknown as DOMTokenList;\n}\n","export class NucloText {\n nodeType = 3; // Node.TEXT_NODE\n nodeName = '#text';\n data: string;\n textContent: string;\n parentNode: unknown = null;\n \n constructor(data: string) {\n this.data = data;\n this.textContent = data;\n }\n \n get nodeValue(): string {\n return this.data;\n }\n \n set nodeValue(value: string) {\n this.data = value;\n this.textContent = value;\n }\n}\n","import { NucloElement } from './Element';\nimport { NucloText } from './Text';\n\n/**\n * Lightweight DocumentFragment for SSR — prototype methods instead of per-instance closures.\n */\nclass SSRDocumentFragment {\n nodeType: number = 11;\n nodeName: string = '#document-fragment';\n childNodes: Node[] = [];\n children: Element[] = [];\n textContent: string = '';\n\n appendChild<T extends Node>(child: T): T {\n this.childNodes.push(child);\n if ((child as any).nodeType === 1) {\n this.children.push(child as unknown as Element);\n }\n (child as any).parentNode = this;\n return child;\n }\n\n insertBefore<T extends Node>(newNode: T, refNode: Node | null): T {\n if (!refNode) return this.appendChild(newNode);\n const index = this.childNodes.indexOf(refNode);\n if (index !== -1) {\n this.childNodes.splice(index, 0, newNode);\n if ((newNode as any).nodeType === 1) {\n const elementIndex = this.children.indexOf(refNode as Element);\n if (elementIndex !== -1) {\n this.children.splice(elementIndex, 0, newNode as unknown as Element);\n }\n }\n }\n (newNode as any).parentNode = this;\n return newNode;\n }\n\n removeChild<T extends Node>(child: T): T {\n const index = this.childNodes.indexOf(child);\n if (index !== -1) this.childNodes.splice(index, 1);\n if ((child as any).nodeType === 1) {\n const elementIndex = this.children.indexOf(child as unknown as Element);\n if (elementIndex !== -1) this.children.splice(elementIndex, 1);\n }\n (child as any).parentNode = null;\n return child;\n }\n\n replaceChild<T extends Node>(newChild: T, oldChild: Node): T {\n const index = this.childNodes.indexOf(oldChild);\n if (index !== -1) {\n this.childNodes[index] = newChild;\n if ((oldChild as any).nodeType === 1 && (newChild as any).nodeType === 1) {\n const elementIndex = this.children.indexOf(oldChild as Element);\n if (elementIndex !== -1) {\n this.children[elementIndex] = newChild as unknown as Element;\n }\n }\n }\n (newChild as any).parentNode = this;\n (oldChild as any).parentNode = null;\n return newChild;\n }\n\n querySelector(): null { return null; }\n querySelectorAll(): NodeListOf<Element> { return [] as unknown as NodeListOf<Element>; }\n}\n\nexport class NucloDocument {\n head: ExpandedElement;\n body: ExpandedElement;\n private _listeners: Map<string, Map<EventListener, { listener: EventListener; options?: boolean | AddEventListenerOptions }>>;\n \n constructor() {\n this.head = new NucloElement('head') as unknown as ExpandedElement;\n this.body = new NucloElement('body') as unknown as ExpandedElement;\n this._listeners = new Map();\n }\n \n createElement(tagName: string, _options?: unknown): ExpandedElement {\n return new NucloElement(tagName) as unknown as ExpandedElement;\n }\n \n createElementNS(namespace: string, tagName: string, _options?: unknown): ExpandedElement {\n const element = new NucloElement(tagName) as unknown as ExpandedElement;\n (element as any).namespaceURI = namespace;\n return element;\n }\n \n createTextNode(data: string): Text {\n return new NucloText(data) as unknown as Text;\n }\n \n createComment(data: string): Comment {\n const comment = {\n nodeType: 8,\n nodeName: '#comment',\n data,\n textContent: data,\n nodeValue: data,\n parentNode: null,\n nextSibling: null,\n previousSibling: null\n };\n return comment as unknown as Comment;\n }\n \n createDocumentFragment(): DocumentFragment {\n return new SSRDocumentFragment() as unknown as DocumentFragment;\n }\n \n querySelector(selector: string): Element | null {\n // Simple implementation - only supports ID selector for #nuclo-styles\n if (selector.startsWith('#')) {\n const id = selector.slice(1);\n if (id === 'nuclo-styles' && this.head.children) {\n for (const child of this.head.children) {\n if ((child as any).id === id) {\n return child as unknown as Element;\n }\n }\n }\n }\n return null;\n }\n \n querySelectorAll(_selector: string): NodeListOf<Element> {\n return [] as unknown as NodeListOf<Element>;\n }\n \n addEventListener(type: string, listener: EventListener, options?: boolean | AddEventListenerOptions): void {\n if (!this._listeners.has(type)) {\n this._listeners.set(type, new Map());\n }\n const listenersMap = this._listeners.get(type)!;\n listenersMap.set(listener, { listener, options });\n }\n \n removeEventListener(type: string, listener: EventListener, _options?: boolean | AddEventListenerOptions): void {\n const listeners = this._listeners.get(type);\n if (listeners) {\n listeners.delete(listener);\n // Clean up empty maps to prevent memory leaks\n if (listeners.size === 0) {\n this._listeners.delete(type);\n }\n }\n }\n \n dispatchEvent(event: Event): boolean {\n const listeners = this._listeners.get(event.type);\n if (listeners) {\n // Create a copy to avoid issues if listeners are modified during dispatch\n const listenersCopy = Array.from(listeners.values());\n for (let i = 0; i < listenersCopy.length; i++) {\n const { listener } = listenersCopy[i];\n try {\n listener(event);\n } catch (error) {\n console.error('Error in event listener:', error);\n }\n }\n }\n return true;\n }\n \n contains(_node: Node): boolean {\n return false;\n }\n}\n\nexport const document = globalThis.document || new NucloDocument();","export class NucloEvent implements Event {\n type: string;\n bubbles: boolean;\n cancelable: boolean;\n composed: boolean;\n currentTarget: EventTarget | null = null;\n defaultPrevented: boolean = false;\n eventPhase: number = 0;\n isTrusted: boolean = false;\n target: EventTarget | null = null;\n timeStamp: number;\n readonly AT_TARGET = 2;\n readonly BUBBLING_PHASE = 3;\n readonly CAPTURING_PHASE = 1;\n readonly NONE = 0;\n returnValue: boolean = true;\n srcElement: EventTarget | null = null;\n cancelBubble: boolean = false;\n \n constructor(type: string, eventInitDict?: EventInit) {\n this.type = type;\n this.bubbles = eventInitDict?.bubbles || false;\n this.cancelable = eventInitDict?.cancelable || false;\n this.composed = eventInitDict?.composed || false;\n this.timeStamp = Date.now();\n }\n \n composedPath(): EventTarget[] {\n return [];\n }\n \n initEvent(_type: string, _bubbles?: boolean, _cancelable?: boolean): void {\n // Legacy method - no-op\n }\n \n preventDefault(): void {\n if (this.cancelable) {\n this.defaultPrevented = true;\n }\n }\n \n stopImmediatePropagation(): void {\n this.cancelBubble = true;\n }\n \n stopPropagation(): void {\n this.cancelBubble = true;\n }\n}\n\nexport class NucloCustomEvent<T = any> extends NucloEvent implements CustomEvent<T> {\n detail: T;\n \n constructor(type: string, eventInitDict?: CustomEventInit<T>) {\n super(type, eventInitDict);\n this.detail = eventInitDict?.detail as T;\n }\n \n initCustomEvent(_type: string, _bubbles?: boolean, _cancelable?: boolean, _detail?: T): void {\n // Legacy method - no-op\n }\n}\n\n// Export polyfills if browser globals don't exist\nexport const Event = globalThis.Event || NucloEvent;\nexport const CustomEvent = globalThis.CustomEvent || NucloCustomEvent;\n","/**\n * Polyfills for Node.js environments\n * \n * This module provides minimal browser API polyfills to allow Nuclo to run in Node.js\n * for server-side rendering (SSR) scenarios.\n * \n * To use in Node.js:\n * ```typescript\n * import 'nuclo/polyfill';\n * // or\n * import { document, Event, CustomEvent } from 'nuclo/polyfill';\n * ```\n */\n\nexport { NucloDocument, document } from './Document';\nexport { NucloElement } from './Element';\nexport { NucloText } from './Text';\nexport { NucloEvent, NucloCustomEvent, Event, CustomEvent } from './Event';\nexport { NucloNode } from './Node';\n\n// Import for local use\nimport { NucloElement } from './Element';\nimport { NucloNode } from './Node';\nimport { document } from './Document';\nimport { Event, CustomEvent } from './Event';\n\nexport const Node = NucloNode;\nexport const Element = NucloElement;\nexport const HTMLElement = NucloElement;\n\n// Auto-apply polyfills to globalThis if in Node environment (synchronous — no top-level await)\nif (typeof window === 'undefined' && typeof globalThis !== 'undefined') {\n interface GlobalWithPolyfills {\n document?: typeof document;\n Event?: typeof Event;\n CustomEvent?: typeof CustomEvent;\n Node?: typeof NucloNode;\n Element?: typeof NucloElement;\n HTMLElement?: typeof NucloElement;\n }\n\n const g = globalThis as unknown as GlobalWithPolyfills;\n\n if (!g.document) g.document = document;\n if (!g.Event) g.Event = Event;\n if (!g.CustomEvent) g.CustomEvent = CustomEvent;\n if (!g.Node) g.Node = NucloNode;\n if (!g.Element) g.Element = NucloElement;\n if (!g.HTMLElement) g.HTMLElement = NucloElement;\n}\n"],"mappings":"gDAGA,IAAa,EAAb,KAAuB,CACrB,SAAmB,EACnB,SAAmB,GACnB,UAA2B,KAC3B,WAAsB,KACtB,YAA6B,KAC7B,YAAsB,GAEtB,IAAI,YAAoC,CACtC,IAAM,EAAQ,KAAK,aAAe,CAAC,EACnC,MAAO,CACL,GAAG,EACH,OAAQ,EAAM,OACd,KAAO,GAAmB,EAAM,IAAwB,KACxD,CAAC,OAAO,UAAW,WAAa,CAC9B,IAAK,IAAM,KAAQ,EACjB,MAAM,CAEV,EACA,QAAU,GAAqF,CAC7F,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,EAAS,EAAM,GAAiB,EAAG,KAAK,UAAU,CAEtD,EACA,QAAS,WAAa,CACpB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,KAAM,CAAC,EAAG,EAAM,EAAe,CAEnC,EACA,KAAM,WAAa,CACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,MAAM,CAEV,EACA,OAAQ,WAAa,CACnB,IAAK,IAAM,KAAQ,EACjB,MAAM,CAEV,CACF,CACF,CACF,ECrCM,EAAN,KAAe,CAGb,IAAI,SAAkB,CACpB,IAAM,EAAU,OAAO,QAAQ,IAAI,EAEnC,OADI,EAAQ,SAAW,EAAU,GAC1B,EAAQ,KAAK,CAAC,EAAG,KAAO,GAAG,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,CACxD,CAEA,YAAY,EAAc,EAAqB,CAC7C,KAAkC,GAAQ,CAC5C,CAEA,iBAAiB,EAAsB,CACrC,OAAS,KAAiC,IAAoB,EAChE,CACF,EAGM,EAAN,KAAmB,CACjB,IACA,YAAY,EAAkB,CAAE,KAAK,IAAM,CAAI,CAE/C,IAAI,GAAG,EAAwB,CAC7B,IAAM,EAAU,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EAAI,CAAC,EACtF,IAAK,IAAM,KAAK,EAAY,GAAK,CAAC,EAAQ,SAAS,CAAC,GAAG,EAAQ,KAAK,CAAC,EACrE,KAAK,IAAI,UAAY,EAAQ,KAAK,GAAG,CACvC,CACA,OAAO,GAAG,EAAwB,CAC3B,KAAK,IAAI,YACd,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,GAAK,GAAK,CAAC,EAAO,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,EACnG,CACA,SAAS,EAAwB,CAC/B,MAAO,CAAC,CAAC,KAAK,IAAI,WAAa,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,SAAS,CAAK,CAC7E,CACA,OAAO,EAAe,EAA0B,CAC9C,IAAM,EAAM,KAAK,SAAS,CAAK,EAGX,OAFhB,IAAU,IAAA,GAAiB,GAAO,KAAK,OAAO,CAAK,EAAU,KAAS,KAAK,IAAI,CAAK,EAAU,IAC9F,GAAS,KAAK,IAAI,CAAK,EAAU,KACrC,KAAK,OAAO,CAAK,EAAU,GAC7B,CACA,QAAQ,EAAkB,EAA2B,CAER,OADtC,KAAK,SAAS,CAAQ,GAC3B,KAAK,OAAO,CAAQ,EAAG,KAAK,IAAI,CAAQ,EAAU,IADb,EAEvC,CACA,KAAK,EAA8B,CAAE,OAAQ,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAW,IAAM,CAC5G,IAAI,QAAiB,CAAE,OAAO,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,OAAS,CAAG,CAC7G,IAAI,OAAgB,CAAE,OAAO,KAAK,IAAI,SAAW,CACjD,IAAI,MAAM,EAAW,CAAE,KAAK,IAAI,UAAY,CAAG,CAC/C,UAAmB,CAAE,OAAO,KAAK,IAAI,SAAW,CAChD,SAAS,EAAyB,CAAE,MAAO,EAAO,CAClD,QAAQ,EAAsE,CAC5E,IAAM,EAAU,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EAC5D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,EAAG,EAAQ,GAAI,EAAG,IAA+B,CAC5F,CACA,CAAC,OAAO,WAA8B,CACpC,IAAM,EAAU,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EACxD,EAAI,EACR,MAAO,CAAE,MAA+B,CAAE,OAAO,EAAI,EAAQ,OAAS,CAAE,MAAO,EAAQ,KAAM,KAAM,EAAM,EAAI,CAAE,MAAO,GAAI,KAAM,EAAK,CAAG,CAAE,CAC5I,CACA,SAAsC,CACpC,IAAM,EAAU,KAAK,IAAI,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO,EACxD,EAAI,EACR,MAAO,CAAE,MAAyC,CAAE,OAAO,EAAI,EAAQ,OAAS,CAAE,MAAO,CAAC,EAAG,EAAQ,IAAI,EAAG,KAAM,EAAM,EAAI,CAAE,MAAO,CAAC,EAAG,EAAE,EAAG,KAAM,EAAK,CAAG,CAAE,CAChK,CACA,MAAyB,CACvB,IAAM,EAAM,KAAK,OAAY,EAAI,EACjC,MAAO,CAAE,MAA+B,CAAE,OAAO,EAAI,EAAM,CAAE,MAAO,IAAK,KAAM,EAAM,EAAI,CAAE,MAAO,EAAG,KAAM,EAAK,CAAG,CAAE,CACvH,CACA,QAA2B,CAAE,OAAO,KAAK,OAAO,UAAU,CAAG,CAC/D,EAYA,SAAS,EAAc,EAAqC,CAC1D,OAAO,OAAO,GAAS,YAAY,GAAiB,YAAa,CACnE,CAEA,SAAS,EAAW,EAAiC,CACnD,OAAO,OAAO,GAAS,YAAY,GAAiB,aAAc,GAAS,EAA8B,WAAa,CACxH,CAEA,SAAS,EAAc,EAAoC,CACzD,OAAO,OAAO,GAAS,YAAY,GAAiB,aAAc,GAAS,EAA8B,WAAa,CACxH,CAEA,IAAa,EAAb,cAAkC,CAAU,CAC1C,QACA,SACA,WACA,UAAoB,GACpB,UACA,YAAsB,GACtB,WAA6B,GAC7B,WAAsB,KACtB,QACA,KACA,MACA,GAAa,GACb,aACA,MACA,WAEA,IAAI,WAAoB,CACtB,OAAO,KAAK,kBAAkB,CAChC,CAEA,IAAI,UAAU,EAAe,CAC3B,KAAK,WAAa,CACpB,CAEA,mBAAoC,CAClC,IAAI,EAAO,GACX,IAAK,IAAM,KAAS,KAAK,SACnB,EAAc,CAAK,EACrB,GAAQ,KAAK,iBAAiB,CAAK,EAC1B,EAAW,CAAK,EACzB,GAAQ,EAAM,aAAe,GACpB,EAAc,CAAK,IAC5B,GAAQ,OAAO,EAAM,MAAQ,GAAG,MAGpC,OAAO,CACT,CAEA,iBAAyB,EAA+B,CACtD,IAAM,EAAM,EAAQ,QAAQ,YAAY,EACpC,EAAO,IAAI,IASf,GANI,EAAQ,KACV,GAAQ,QAAQ,EAAQ,GAAG,IAEzB,EAAQ,YACV,GAAQ,WAAW,EAAQ,UAAU,IAEnC,EAAQ,eACL,GAAM,CAAC,EAAM,KAAU,EAAQ,WAC9B,IAAS,MAAQ,IAAS,UAC5B,GAAQ,IAAI,EAAK,IAAI,EAAM,IAQjC,GAHA,GAAQ,IAGJ,EAAQ,UAAY,EAAQ,SAAS,OAAS,MAC3C,IAAM,KAAS,EAAQ,SACtB,EAAc,CAAK,EACrB,GAAQ,KAAK,iBAAiB,CAAK,EAC1B,EAAW,CAAK,EACzB,GAAQ,EAAM,aAAe,GACpB,EAAc,CAAK,IAC5B,GAAQ,OAAO,EAAM,MAAQ,GAAG,MAMtC,MADA,IAAQ,KAAK,EAAI,GACV,CACT,CAEA,YAAY,EAAiB,CAQ3B,GAPA,MAAM,EACN,KAAK,QAAU,EAAQ,YAAY,EACnC,KAAK,SAAW,EAChB,KAAK,SAAW,EAAQ,YAAY,EACpC,KAAK,SAAW,CAAC,EACjB,KAAK,WAAa,IAAI,IAElB,CAAC,EAEH,KAAK,WAAa,KAGlB,KAAK,MAAQ,IAAI,EAGjB,KAAK,UAAY,IAAI,EAAa,IAAI,MAEjC,CAEL,KAAK,WAAa,IAAI,IAEtB,IAAM,EAAqC,CAAC,EAY5C,GAXA,KAAK,MAAQ,IAAI,MAAM,CAAC,EAA0B,CAChD,KAAM,EAAS,IACT,IAAS,eAAuB,EAAc,IAAkB,CAAE,EAAW,GAAQ,CAAO,EAC5F,IAAS,mBAA4B,GAAiB,EAAW,IAAS,GAC1E,IAAS,UAAkB,OAAO,QAAQ,CAAU,EAAE,KAAK,CAAC,EAAG,KAAO,GAAG,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,EAC1F,EAAW,GAEpB,KAAM,EAAS,EAAc,KAAoB,EAAW,GAAQ,EAAc,GACpF,CAAC,EAGG,KAAK,UAAY,QAAS,CAC5B,IAAM,EAAsB,CAAC,EAC7B,KAAK,MAAQ,CACD,WACV,YAAa,EAAc,IAAmB,CAC5C,IAAM,EAAM,GAAS,EAAS,OAC1B,EACJ,GAAI,EAAK,KAAK,EAAE,WAAW,GAAG,EAAG,CAC/B,IAAM,EAAwB,CAAC,EACzB,EAAgB,EAAK,QAAQ,WAAY,EAAE,EAAE,QAAQ,kBAAmB,EAAE,EAAE,KAAK,EACvF,EAAW,CACT,QAAS,EAAM,gBACf,MAAO,CAAE,UAAW,CAAc,EAClC,SAAU,EACV,YAAa,EAAmB,IAAwB,CACtD,IAAM,EAAW,GAAc,EAAW,OAE1C,OADA,EAAW,OAAO,EAAU,EAAG,CAAE,QAAS,EAAW,aAAc,EAAU,MAAM,GAAG,EAAE,GAAG,KAAK,EAAG,MAAO,CAAC,EAA0B,KAAM,CAAE,CAAuB,EAC7J,CACT,EACA,WAAa,GAAc,CAAE,EAAW,OAAO,EAAG,CAAC,CAAG,EACtD,KAAM,CACR,CACF,MACE,EAAW,CAAE,QAAS,EAAM,aAAc,EAAK,MAAM,GAAG,EAAE,GAAG,KAAK,EAAG,MAAO,CAAC,EAA0B,KAAM,CAAE,EAGjH,OADA,EAAS,OAAO,EAAK,EAAG,CAAQ,EACzB,CACT,EACA,WAAa,GAAkB,CAAE,EAAS,OAAO,EAAO,CAAC,CAAG,CAC9D,CACF,CAEA,KAAK,UAAY,EAAgB,IAAI,CACvC,CACF,CAEA,YAA4B,EAAa,CAQvC,OAPA,KAAK,SAAS,KAAK,CAAK,EACpB,GAAc,KAAa,aAC7B,KAAc,YAAe,KAAK,CAAK,EAErC,OAAO,GAAU,UAAY,GAAkB,eAAgB,IACjE,EAAmC,WAAa,MAE3C,CACT,CAEA,aAAa,EAAc,EAAqB,CAC9C,KAAK,WAAW,IAAI,EAAM,CAAK,EAC3B,IAAS,QACX,KAAK,UAAY,EACR,IAAS,OAClB,KAAK,GAAK,EAEd,CAEA,aAAa,EAA6B,CACxC,OAAO,KAAK,WAAW,IAAI,CAAI,GAAK,IACtC,CAEA,gBAAgB,EAAoB,CAClC,KAAK,WAAW,OAAO,CAAI,EACvB,IAAS,UACX,KAAK,UAAY,GAErB,CAEA,aAAa,EAAuB,CAClC,OAAO,KAAK,WAAW,IAAI,CAAI,CACjC,CAEA,aAA6B,EAAY,EAA+B,CACtE,GAAI,IAAkB,KACpB,OAAO,KAAK,YAAY,CAAO,EAEjC,IAAM,EAAQ,KAAK,SAAS,QAAQ,CAAa,EACjD,GAAI,IAAU,GAAI,CAEhB,GADA,KAAK,SAAS,OAAO,EAAO,EAAG,CAAO,EAClC,GAAc,KAAa,YAAgB,CAC7C,IAAM,EAAmB,KAAa,YAAe,QAAQ,CAAa,EACtE,IAAoB,IACtB,KAAc,YAAe,OAAO,EAAiB,EAAG,CAAO,CAEnE,CACI,OAAO,GAAY,UAAY,GAAoB,eAAgB,IACrE,EAAqC,WAAa,KAEtD,CACA,OAAO,CACT,CAEA,YAA4B,EAAa,CACvC,IAAM,EAAQ,KAAK,SAAS,QAAQ,CAAK,EACzC,GAAI,IAAU,GAAI,CAEhB,GADA,KAAK,SAAS,OAAO,EAAO,CAAC,EACzB,GAAc,KAAa,YAAgB,CAC7C,IAAM,EAAW,KAAa,YAAe,QAAQ,CAAK,EACtD,IAAY,IACd,KAAc,YAAe,OAAO,EAAS,CAAC,CAElD,CACI,OAAO,GAAU,UAAY,GAAkB,eAAgB,IACjE,EAAmC,WAAa,KAEpD,CACA,OAAO,CACT,CAEA,aAA6B,EAAgB,EAAgB,CAC3D,IAAM,EAAQ,KAAK,SAAS,QAAQ,CAAQ,EAC5C,GAAI,IAAU,GAAI,CAEhB,GADA,KAAK,SAAS,GAAS,EACnB,GAAc,KAAa,YAAgB,CAC7C,IAAM,EAAW,KAAa,YAAe,QAAQ,CAAQ,EACzD,IAAY,KACd,KAAc,YAAe,GAAW,EAE5C,CACI,OAAO,GAAa,UAAY,GAAqB,eAAgB,IACvE,EAAsC,WAAa,MAEjD,OAAO,GAAa,UAAY,GAAqB,eAAgB,IACvE,EAAsC,WAAa,KAEvD,CACA,OAAO,CACT,CAEA,iBAAiB,EAAc,EAA+B,CACvD,KAAK,aACL,KAAK,WAAW,IAAI,CAAI,GAC3B,KAAK,WAAW,IAAI,EAAM,IAAI,GAAK,EAErC,KAAK,WAAW,IAAI,CAAI,EAAG,IAAI,CAAQ,EACzC,CAEA,oBAAoB,EAAc,EAA+B,CAC/D,IAAM,EAAY,KAAK,YAAY,IAAI,CAAI,EACvC,GACF,EAAU,OAAO,CAAQ,CAE7B,CAEA,cAAc,EAAuB,CACnC,IAAM,EAAY,KAAK,YAAY,IAAI,EAAM,IAAI,EACjD,GAAI,EACF,IAAK,IAAM,KAAY,EACrB,GAAI,CACF,EAAS,CAAK,CAChB,OAAS,EAAO,CACd,QAAQ,MAAM,2BAA4B,CAAK,CACjD,CAMJ,OAHI,EAAM,SAAW,KAAK,YAAc,OAAO,KAAK,YAAe,UAAY,kBAAmB,KAAK,YAAc,OAAO,KAAK,WAAW,eAAkB,YAC5J,KAAK,WAAW,cAAc,CAAK,EAE9B,EACT,CAEA,cAAc,EAAkC,CAG9C,GAAI,EAAS,WAAW,GAAG,EAAG,CAC5B,IAAM,EAAK,EAAS,MAAM,CAAC,EAC3B,OAAO,KAAK,kBAAkB,CAAE,CAClC,MAAO,GAAI,EAAS,WAAW,GAAG,EAAG,CACnC,IAAM,EAAY,EAAS,MAAM,CAAC,EAClC,OAAO,KAAK,qBAAqB,CAAS,CAC5C,MAEE,OAAO,KAAK,mBAAmB,CAAQ,CAE3C,CAEA,kBAA0B,EAA4B,CAEpD,GAAI,KAAK,KAAO,EACd,OAAO,KAGT,IAAK,IAAM,KAAS,KAAK,SACvB,GAAI,EAAc,CAAK,EAAG,CACxB,GAAI,EAAM,KAAO,EACf,OAAO,EAET,IAAM,EAAQ,EAAM,cAAc,IAAI,GAAI,EAC1C,GAAI,EAAO,OAAO,CACpB,CAEF,OAAO,IACT,CAEA,qBAA6B,EAAmC,CAE9D,GAAI,KAAK,UAAU,SAAS,CAAS,EACnC,OAAO,KAGT,IAAK,IAAM,KAAS,KAAK,SACvB,GAAI,EAAc,CAAK,EAAG,CACxB,GAAI,EAAM,WAAW,SAAS,CAAS,EACrC,OAAO,EAET,IAAM,EAAQ,EAAM,cAAc,IAAI,GAAW,EACjD,GAAI,EAAO,OAAO,CACpB,CAEF,OAAO,IACT,CAEA,mBAA2B,EAAiC,CAC1D,IAAM,EAAW,EAAQ,YAAY,EAErC,GAAI,KAAK,QAAQ,YAAY,IAAM,EACjC,OAAO,KAGT,IAAK,IAAM,KAAS,KAAK,SACvB,GAAI,EAAc,CAAK,EAAG,CACxB,GAAI,EAAM,QAAQ,YAAY,IAAM,EAClC,OAAO,EAET,IAAM,EAAQ,EAAM,cAAc,CAAO,EACzC,GAAI,EAAO,OAAO,CACpB,CAEF,OAAO,IACT,CAEA,iBAAiB,EAAuC,CACtD,IAAM,EAAqB,CAAC,EAE5B,GAAI,EAAS,WAAW,GAAG,EAAG,CAC5B,IAAM,EAAQ,KAAK,cAAc,CAAQ,EACrC,GAAO,EAAQ,KAAK,CAAK,CAC/B,MAAO,GAAI,EAAS,WAAW,GAAG,EAAG,CACnC,IAAM,EAAY,EAAS,MAAM,CAAC,EAClC,KAAK,wBAAwB,EAAW,CAAO,CACjD,KAAO,CACL,IAAM,EAAU,EAAS,YAAY,EACrC,KAAK,sBAAsB,EAAS,CAAO,CAC7C,CAEA,OAAO,CACT,CAEA,wBAAgC,EAAmB,EAA0B,CACvE,KAAK,UAAU,SAAS,CAAS,GACnC,EAAQ,KAAK,IAA0B,EAEzC,IAAK,IAAM,KAAS,KAAK,SACnB,EAAc,CAAK,IACjB,EAAM,WAAW,SAAS,CAAS,GACrC,EAAQ,KAAK,CAA2B,EAE1C,EAAM,wBAAwB,EAAW,CAAO,EAGtD,CAEA,sBAA8B,EAAiB,EAA0B,CACnE,KAAK,QAAQ,YAAY,IAAM,GACjC,EAAQ,KAAK,IAA0B,EAEzC,IAAK,IAAM,KAAS,KAAK,SACnB,EAAc,CAAK,IACjB,EAAM,QAAQ,YAAY,IAAM,GAClC,EAAQ,KAAK,CAA2B,EAE1C,EAAM,sBAAsB,EAAS,CAAO,EAGlD,CACF,EAEA,SAAS,EAAgB,EAAmC,CAC1D,IAAM,MAAmB,EAAM,UAAU,MAAM,GAAG,EAAE,OAAQ,GAAM,CAAC,EAC7D,EAAc,GAAsB,CACxC,EAAM,UAAY,EAAQ,KAAK,GAAG,CACpC,EAEM,EAAY,CAChB,KAAM,GAAG,IAAqB,CAC5B,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAM,KAAS,EACd,GAAS,CAAC,EAAQ,SAAS,CAAK,GAClC,EAAQ,KAAK,CAAK,EAGtB,EAAW,CAAO,CACpB,EACA,QAAS,GAAG,IAAqB,CAC3B,EAAO,SAAW,GACtB,EAAW,EAAW,EAAE,OAAQ,GAAM,CAAC,EAAO,SAAS,CAAC,CAAC,CAAC,CAC5D,EACA,QAAS,EAAe,IAAoB,CAC1C,IAAM,EAAW,EAAU,SAAS,CAAK,EAczC,OAbI,IAAU,IAAA,GACR,GACF,EAAU,OAAO,CAAK,EACf,KAET,EAAU,IAAI,CAAK,EACZ,IAEL,GACF,EAAU,IAAI,CAAK,EACZ,KAET,EAAU,OAAO,CAAK,EACf,GACT,EACA,SAAW,GAAkB,EAAW,EAAE,SAAS,CAAK,EACxD,SAAU,EAAkB,IAAqB,CAC/C,IAAM,EAAU,EAAW,EACrB,EAAQ,EAAQ,QAAQ,CAAQ,EAItC,OAHI,IAAU,GAAW,IACzB,EAAQ,GAAS,EACjB,EAAW,CAAO,EACX,GACT,EACA,KAAO,GAAkB,EAAW,EAAE,IAAU,KAChD,IAAI,QAAS,CACX,OAAO,EAAW,EAAE,MACtB,EACA,aAAgB,EAAM,UACtB,CAAC,OAAO,UAAW,WAAa,CAC9B,MAAO,EAAW,CACpB,EACA,QAAU,GAAyE,CACjF,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,EAAS,EAAQ,GAAI,EAAG,CAAoC,CAEhE,EACA,QAAS,WAAa,CACpB,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,KAAM,CAAC,EAAG,EAAQ,EAAE,CAExB,EACA,KAAM,WAAa,CACjB,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,MAAM,CAEV,EACA,OAAQ,WAAa,CACnB,MAAO,EAAW,CACpB,EACA,IAAI,OAAQ,CACV,OAAO,EAAM,SACf,EACA,IAAI,MAAM,EAAe,CACvB,EAAM,UAAY,CACpB,EACA,SAAW,GAAmB,EAChC,EAEA,OAAO,CACT,CC7jBA,IAAa,EAAb,KAAuB,CACrB,SAAW,EACX,SAAW,QACX,KACA,YACA,WAAsB,KAEtB,YAAY,EAAc,CACxB,KAAK,KAAO,EACZ,KAAK,YAAc,CACrB,CAEA,IAAI,WAAoB,CACtB,OAAO,KAAK,IACd,CAEA,IAAI,UAAU,EAAe,CAC3B,KAAK,KAAO,EACZ,KAAK,YAAc,CACrB,CACF,ECdM,EAAN,KAA0B,CACxB,SAAmB,GACnB,SAAmB,qBACnB,WAAqB,CAAC,EACtB,SAAsB,CAAC,EACvB,YAAsB,GAEtB,YAA4B,EAAa,CAMvC,OALA,KAAK,WAAW,KAAK,CAAK,EACrB,EAAc,WAAa,GAC9B,KAAK,SAAS,KAAK,CAA2B,EAEhD,EAAe,WAAa,KACrB,CACT,CAEA,aAA6B,EAAY,EAAyB,CAChE,GAAI,CAAC,EAAS,OAAO,KAAK,YAAY,CAAO,EAC7C,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAO,EAC7C,GAAI,IAAU,KACZ,KAAK,WAAW,OAAO,EAAO,EAAG,CAAO,EACnC,EAAgB,WAAa,GAAG,CACnC,IAAM,EAAe,KAAK,SAAS,QAAQ,CAAkB,EACzD,IAAiB,IACnB,KAAK,SAAS,OAAO,EAAc,EAAG,CAA6B,CAEvE,CAGF,MADA,GAAiB,WAAa,KACvB,CACT,CAEA,YAA4B,EAAa,CACvC,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAK,EAE3C,GADI,IAAU,IAAI,KAAK,WAAW,OAAO,EAAO,CAAC,EAC5C,EAAc,WAAa,EAAG,CACjC,IAAM,EAAe,KAAK,SAAS,QAAQ,CAA2B,EAClE,IAAiB,IAAI,KAAK,SAAS,OAAO,EAAc,CAAC,CAC/D,CAEA,MADA,GAAe,WAAa,KACrB,CACT,CAEA,aAA6B,EAAa,EAAmB,CAC3D,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAQ,EAC9C,GAAI,IAAU,KACZ,KAAK,WAAW,GAAS,EACpB,EAAiB,WAAa,GAAM,EAAiB,WAAa,GAAG,CACxE,IAAM,EAAe,KAAK,SAAS,QAAQ,CAAmB,EAC1D,IAAiB,KACnB,KAAK,SAAS,GAAgB,EAElC,CAIF,MAFA,GAAkB,WAAa,KAC/B,EAAkB,WAAa,KACxB,CACT,CAEA,eAAsB,CAAE,OAAO,IAAM,CACrC,kBAAwC,CAAE,MAAO,CAAC,CAAqC,CACzF,EAEa,EAAb,KAA2B,CACzB,KACA,KACA,WAEA,aAAc,CACZ,KAAK,KAAO,IAAI,EAAa,MAAM,EACnC,KAAK,KAAO,IAAI,EAAa,MAAM,EACnC,KAAK,WAAa,IAAI,GACxB,CAEA,cAAc,EAAiB,EAAqC,CAClE,OAAO,IAAI,EAAa,CAAO,CACjC,CAEA,gBAAgB,EAAmB,EAAiB,EAAqC,CACvF,IAAM,EAAU,IAAI,EAAa,CAAO,EAExC,MADA,GAAiB,aAAe,EACzB,CACT,CAEA,eAAe,EAAoB,CACjC,OAAO,IAAI,EAAU,CAAI,CAC3B,CAEA,cAAc,EAAuB,CAWnC,MAAO,CATL,SAAU,EACV,SAAU,WACV,OACA,YAAa,EACb,UAAW,EACX,WAAY,KACZ,YAAa,KACb,gBAAiB,IAEN,CACf,CAEA,wBAA2C,CACzC,OAAO,IAAI,CACb,CAEA,cAAc,EAAkC,CAE9C,GAAI,EAAS,WAAW,GAAG,EAAG,CAC5B,IAAM,EAAK,EAAS,MAAM,CAAC,EAC3B,GAAI,IAAO,gBAAkB,KAAK,KAAK,cAChC,IAAM,KAAS,KAAK,KAAK,SAC5B,GAAK,EAAc,KAAO,EACxB,OAAO,CAAA,CAIf,CACA,OAAO,IACT,CAEA,iBAAiB,EAAwC,CACvD,MAAO,CAAC,CACV,CAEA,iBAAiB,EAAc,EAAyB,EAAmD,CACpG,KAAK,WAAW,IAAI,CAAI,GAC3B,KAAK,WAAW,IAAI,EAAM,IAAI,GAAK,EAGrC,KAD0B,WAAW,IAAI,CAC9B,EAAE,IAAI,EAAU,CAAE,WAAU,SAAQ,CAAC,CAClD,CAEA,oBAAoB,EAAc,EAAyB,EAAoD,CAC7G,IAAM,EAAY,KAAK,WAAW,IAAI,CAAI,EACtC,IACF,EAAU,OAAO,CAAQ,EAErB,EAAU,OAAS,GACrB,KAAK,WAAW,OAAO,CAAI,EAGjC,CAEA,cAAc,EAAuB,CACnC,IAAM,EAAY,KAAK,WAAW,IAAI,EAAM,IAAI,EAChD,GAAI,EAAW,CAEb,IAAM,EAAgB,MAAM,KAAK,EAAU,OAAO,CAAC,EACnD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAc,OAAQ,IAAK,CAC7C,GAAM,CAAE,YAAa,EAAc,GACnC,GAAI,CACF,EAAS,CAAK,CAChB,OAAS,EAAO,CACd,QAAQ,MAAM,2BAA4B,CAAK,CACjD,CACF,CACF,CACA,MAAO,EACT,CAEA,SAAS,EAAsB,CAC7B,MAAO,EACT,CACF,EAEA,MAAa,EAAW,WAAW,UAAY,IAAI,EC5KnD,IAAa,EAAb,KAAyC,CACvC,KACA,QACA,WACA,SACA,cAAoC,KACpC,iBAA4B,GAC5B,WAAqB,EACrB,UAAqB,GACrB,OAA6B,KAC7B,UACA,UAAqB,EACrB,eAA0B,EAC1B,gBAA2B,EAC3B,KAAgB,EAChB,YAAuB,GACvB,WAAiC,KACjC,aAAwB,GAExB,YAAY,EAAc,EAA2B,CACnD,KAAK,KAAO,EACZ,KAAK,QAAU,GAAe,SAAW,GACzC,KAAK,WAAa,GAAe,YAAc,GAC/C,KAAK,SAAW,GAAe,UAAY,GAC3C,KAAK,UAAY,KAAK,IAAI,CAC5B,CAEA,cAA8B,CAC5B,MAAO,CAAC,CACV,CAEA,UAAU,EAAe,EAAoB,EAA6B,CAE1E,CAEA,gBAAuB,CACjB,KAAK,aACP,KAAK,iBAAmB,GAE5B,CAEA,0BAAiC,CAC/B,KAAK,aAAe,EACtB,CAEA,iBAAwB,CACtB,KAAK,aAAe,EACtB,CACF,EAEa,EAAb,cAA+C,CAAqC,CAClF,OAEA,YAAY,EAAc,EAAoC,CAC5D,MAAM,EAAM,CAAa,EACzB,KAAK,OAAS,GAAe,MAC/B,CAEA,gBAAgB,EAAe,EAAoB,EAAuB,EAAmB,CAE7F,CACF,EAGA,MAAa,EAAQ,WAAW,OAAS,EAC5B,EAAc,WAAW,aAAe,ECvCxC,EAAO,EACP,EAAU,EACV,EAAc,EAG3B,GAAI,OAAO,OAAW,KAAe,OAAO,WAAe,IAAa,CAUtE,IAAM,EAAI,WAEV,AAAiB,EAAE,WAAW,EAC9B,AAAc,EAAE,QAAQ,EACxB,AAAoB,EAAE,cAAc,EACpC,AAAa,EAAE,OAAO,EACtB,AAAgB,EAAE,UAAU,EAC5B,AAAoB,EAAE,cAAc,CACtC"}
1
+ {"version":3,"file":"nuclo.polyfill.mjs","names":["document","document"],"sources":["../../src/utility/environment.ts","../../src/polyfill/Node.ts","../../src/polyfill/Element.ts","../../src/polyfill/Text.ts","../../src/polyfill/Document.ts","../../src/polyfill/Event.ts","../../src/polyfill/index.ts"],"sourcesContent":["/**\n * Simplified environment detection - minimal overhead for smaller bundle size\n */\n\n// Basic environment detection - no complex caching or edge cases\nexport const isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n","/**\n * Base Node class for instanceof checks in Node.js polyfill\n */\nexport class NucloNode {\n nodeType: number = 1; // ELEMENT_NODE\n nodeName: string = '';\n nodeValue: string | null = null;\n parentNode: unknown = null;\n _childNodes: Node[] | null = null;\n textContent: string = '';\n\n get childNodes(): NodeListOf<ChildNode> {\n const nodes = this._childNodes ?? [];\n return {\n ...nodes,\n length: nodes.length,\n item: (index: number) => (nodes[index] as ChildNode) || null,\n [Symbol.iterator]: function* () {\n for (const node of nodes) {\n yield node as ChildNode;\n }\n },\n forEach: (callback: (value: ChildNode, key: number, parent: NodeListOf<ChildNode>) => void) => {\n for (let i = 0; i < nodes.length; i++) {\n callback(nodes[i] as ChildNode, i, this.childNodes);\n }\n },\n entries: function* () {\n for (let i = 0; i < nodes.length; i++) {\n yield [i, nodes[i] as ChildNode] as [number, ChildNode];\n }\n },\n keys: function* () {\n for (let i = 0; i < nodes.length; i++) {\n yield i;\n }\n },\n values: function* () {\n for (const node of nodes) {\n yield node as ChildNode;\n }\n }\n } as unknown as NodeListOf<ChildNode>;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NucloNode } from './Node';\nimport { isBrowser } from '../utility/environment';\n\n/**\n * Lightweight style object for SSR — prototype methods instead of Object.defineProperty per element.\n * Stores CSS properties as own properties and provides cssText/setProperty/getPropertyValue via prototype.\n */\nclass SSRStyle {\n [key: string]: unknown;\n\n get cssText(): string {\n const entries = Object.entries(this);\n if (entries.length === 0) return '';\n return entries.map(([k, v]) => `${k}: ${v}`).join('; ');\n }\n\n setProperty(name: string, value: string): void {\n (this as Record<string, unknown>)[name] = value;\n }\n\n getPropertyValue(name: string): string {\n return ((this as Record<string, unknown>)[name] as string) || '';\n }\n}\n\n// Lightweight classList for SSR — prototype methods instead of per-element closures\nclass SSRClassList {\n private _el: NucloElement;\n constructor(el: NucloElement) { this._el = el; }\n\n add(...tokens: string[]): void {\n const classes = this._el.className ? this._el.className.split(' ').filter(Boolean) : [];\n for (const t of tokens) if (t && !classes.includes(t)) classes.push(t);\n this._el.className = classes.join(' ');\n }\n remove(...tokens: string[]): void {\n if (!this._el.className) return;\n this._el.className = this._el.className.split(' ').filter(c => c && !tokens.includes(c)).join(' ');\n }\n contains(token: string): boolean {\n return !!this._el.className && this._el.className.split(' ').includes(token);\n }\n toggle(token: string, force?: boolean): boolean {\n const has = this.contains(token);\n if (force === undefined) { if (has) { this.remove(token); return false; } this.add(token); return true; }\n if (force) { this.add(token); return true; }\n this.remove(token); return false;\n }\n replace(oldToken: string, newToken: string): boolean {\n if (!this.contains(oldToken)) return false;\n this.remove(oldToken); this.add(newToken); return true;\n }\n item(index: number): string | null { return (this._el.className.split(' ').filter(Boolean)[index]) ?? null; }\n get length(): number { return this._el.className ? this._el.className.split(' ').filter(Boolean).length : 0; }\n get value(): string { return this._el.className; }\n set value(v: string) { this._el.className = v; }\n toString(): string { return this._el.className; }\n supports(_token: string): boolean { return false; }\n forEach(cb: (value: string, key: number, parent: DOMTokenList) => void): void {\n const classes = this._el.className.split(' ').filter(Boolean);\n for (let i = 0; i < classes.length; i++) cb(classes[i], i, this as unknown as DOMTokenList);\n }\n [Symbol.iterator](): Iterator<string> {\n const classes = this._el.className.split(' ').filter(Boolean);\n let i = 0;\n return { next(): IteratorResult<string> { return i < classes.length ? { value: classes[i++], done: false } : { value: '', done: true }; } };\n }\n entries(): Iterator<[number, string]> {\n const classes = this._el.className.split(' ').filter(Boolean);\n let i = 0;\n return { next(): IteratorResult<[number, string]> { return i < classes.length ? { value: [i, classes[i++]], done: false } : { value: [0, ''], done: true }; } };\n }\n keys(): Iterator<number> {\n const len = this.length; let i = 0;\n return { next(): IteratorResult<number> { return i < len ? { value: i++, done: false } : { value: 0, done: true }; } };\n }\n values(): Iterator<string> { return this[Symbol.iterator](); }\n}\n\ninterface TextNode {\n nodeType: 3;\n textContent: string;\n}\n\ninterface CommentNode {\n nodeType: 8;\n data: string;\n}\n\nfunction isElementNode(node: unknown): node is NucloElement {\n return typeof node === 'object' && node !== null && 'tagName' in node;\n}\n\nfunction isTextNode(node: unknown): node is TextNode {\n return typeof node === 'object' && node !== null && 'nodeType' in node && (node as { nodeType: number }).nodeType === 3;\n}\n\nfunction isCommentNode(node: unknown): node is CommentNode {\n return typeof node === 'object' && node !== null && 'nodeType' in node && (node as { nodeType: number }).nodeType === 8;\n}\n\nexport class NucloElement extends NucloNode {\n tagName: string;\n children: unknown[];\n attributes: Map<string, string>;\n className: string = '';\n classList: DOMTokenList;\n textContent: string = '';\n private _innerHTML: string = '';\n parentNode: unknown = null;\n rawMods?: unknown[];\n mods?: unknown[];\n style: CSSStyleDeclaration;\n id: string = '';\n namespaceURI?: string;\n sheet?: CSSStyleSheet | null;\n private _listeners: Map<string, Set<EventListener>> | null;\n\n get innerHTML(): string {\n return this.serializeChildren();\n }\n\n set innerHTML(value: string) {\n this._innerHTML = value;\n }\n \n private serializeChildren(): string {\n let html = '';\n for (const child of this.children) {\n if (isElementNode(child)) {\n html += this.serializeElement(child);\n } else if (isTextNode(child)) {\n html += child.textContent || '';\n } else if (isCommentNode(child)) {\n html += `<!--${child.data || ''}-->`;\n }\n }\n return html;\n }\n \n private serializeElement(element: NucloElement): string {\n const tag = element.tagName.toLowerCase();\n let html = `<${tag}`;\n \n // Add attributes\n if (element.id) {\n html += ` id=\"${element.id}\"`;\n }\n if (element.className) {\n html += ` class=\"${element.className}\"`;\n }\n if (element.attributes) {\n for (const [name, value] of element.attributes) {\n if (name !== 'id' && name !== 'class') {\n html += ` ${name}=\"${value}\"`;\n }\n }\n }\n \n html += '>';\n \n // Add children\n if (element.children && element.children.length > 0) {\n for (const child of element.children) {\n if (isElementNode(child)) {\n html += this.serializeElement(child);\n } else if (isTextNode(child)) {\n html += child.textContent || '';\n } else if (isCommentNode(child)) {\n html += `<!--${child.data || ''}-->`;\n }\n }\n }\n \n html += `</${tag}>`;\n return html;\n }\n \n constructor(tagName: string) {\n super();\n this.tagName = tagName.toLowerCase();\n this.nodeType = 1; // ELEMENT_NODE\n this.nodeName = tagName.toUpperCase();\n this.children = [];\n this.attributes = new Map<string, string>();\n\n if (!isBrowser) {\n // ── SSR path: minimal allocations, no Proxy, no event listeners ──\n this._listeners = null;\n\n // Prototype-based style — zero Object.defineProperty calls per element\n this.style = new SSRStyle() as unknown as CSSStyleDeclaration;\n\n // Prototype-based classList — zero closures per element\n this.classList = new SSRClassList(this) as unknown as DOMTokenList;\n // sheet stays undefined — not needed in SSR\n } else {\n // ── Browser path: full-featured Proxy style + DOMTokenList ──\n this._listeners = new Map();\n\n const styleProps: Record<string, string> = {};\n this.style = new Proxy({} as CSSStyleDeclaration, {\n get: (_target, prop: string) => {\n if (prop === 'setProperty') return (name: string, value: string) => { styleProps[name] = value; };\n if (prop === 'getPropertyValue') return (name: string) => styleProps[name] || '';\n if (prop === 'cssText') return Object.entries(styleProps).map(([k, v]) => `${k}: ${v}`).join('; ');\n return styleProps[prop];\n },\n set: (_target, prop: string, value: string) => { styleProps[prop] = value; return true; },\n });\n\n // CSSStyleSheet mock for style elements (browser only)\n if (this.tagName === 'style') {\n const cssRules: CSSRule[] = [];\n this.sheet = {\n cssRules: cssRules as unknown as CSSRuleList,\n insertRule: (rule: string, index?: number) => {\n const idx = index ?? cssRules.length;\n let mockRule: CSSRule;\n if (rule.trim().startsWith('@')) {\n const innerRules: CSSRule[] = [];\n const conditionText = rule.replace(/^@\\w+\\s+/, '').replace(/\\s*\\{[\\s\\S]*\\}$/, '').trim();\n mockRule = {\n cssText: rule, conditionText,\n media: { mediaText: conditionText } as MediaList,\n cssRules: innerRules as unknown as CSSRuleList,\n insertRule: (innerRule: string, innerIndex?: number) => {\n const innerIdx = innerIndex ?? innerRules.length;\n innerRules.splice(innerIdx, 0, { cssText: innerRule, selectorText: innerRule.split('{')[0].trim(), style: {} as CSSStyleDeclaration, type: 1 } as unknown as CSSRule);\n return innerIdx;\n },\n deleteRule: (i: number) => { innerRules.splice(i, 1); },\n type: 4,\n } as unknown as CSSRule;\n } else {\n mockRule = { cssText: rule, selectorText: rule.split('{')[0].trim(), style: {} as CSSStyleDeclaration, type: 1 } as unknown as CSSRule;\n }\n cssRules.splice(idx, 0, mockRule);\n return idx;\n },\n deleteRule: (index: number) => { cssRules.splice(index, 1); },\n } as unknown as CSSStyleSheet;\n }\n\n this.classList = createClassList(this);\n }\n }\n \n appendChild<T extends Node>(child: T): T {\n this.children.push(child);\n if (isBrowser && (this as any)['_childNodes']) {\n (this as any)['_childNodes'].push(child);\n }\n if (typeof child === 'object' && child !== null && 'parentNode' in child) {\n (child as { parentNode: unknown }).parentNode = this;\n }\n return child;\n }\n \n setAttribute(name: string, value: string): void {\n this.attributes.set(name, value);\n if (name === 'class') {\n this.className = value;\n } else if (name === 'id') {\n this.id = value;\n }\n }\n \n getAttribute(name: string): string | null {\n return this.attributes.get(name) || null;\n }\n \n removeAttribute(name: string): void {\n this.attributes.delete(name);\n if (name === 'class') {\n this.className = '';\n }\n }\n \n hasAttribute(name: string): boolean {\n return this.attributes.has(name);\n }\n \n insertBefore<T extends Node>(newNode: T, referenceNode: Node | null): T {\n if (referenceNode === null) {\n return this.appendChild(newNode);\n }\n const index = this.children.indexOf(referenceNode);\n if (index !== -1) {\n this.children.splice(index, 0, newNode);\n if (isBrowser && (this as any)['_childNodes']) {\n const childNodesIndex = (this as any)['_childNodes'].indexOf(referenceNode);\n if (childNodesIndex !== -1) {\n (this as any)['_childNodes'].splice(childNodesIndex, 0, newNode);\n }\n }\n if (typeof newNode === 'object' && newNode !== null && 'parentNode' in newNode) {\n (newNode as { parentNode: unknown }).parentNode = this;\n }\n }\n return newNode;\n }\n \n removeChild<T extends Node>(child: T): T {\n const index = this.children.indexOf(child);\n if (index !== -1) {\n this.children.splice(index, 1);\n if (isBrowser && (this as any)['_childNodes']) {\n const cnIndex = (this as any)['_childNodes'].indexOf(child);\n if (cnIndex !== -1) {\n (this as any)['_childNodes'].splice(cnIndex, 1);\n }\n }\n if (typeof child === 'object' && child !== null && 'parentNode' in child) {\n (child as { parentNode: unknown }).parentNode = null;\n }\n }\n return child;\n }\n\n replaceChild<T extends Node>(newChild: Node, oldChild: T): T {\n const index = this.children.indexOf(oldChild);\n if (index !== -1) {\n this.children[index] = newChild;\n if (isBrowser && (this as any)['_childNodes']) {\n const cnIndex = (this as any)['_childNodes'].indexOf(oldChild);\n if (cnIndex !== -1) {\n (this as any)['_childNodes'][cnIndex] = newChild;\n }\n }\n if (typeof newChild === 'object' && newChild !== null && 'parentNode' in newChild) {\n (newChild as { parentNode: unknown }).parentNode = this;\n }\n if (typeof oldChild === 'object' && oldChild !== null && 'parentNode' in oldChild) {\n (oldChild as { parentNode: unknown }).parentNode = null;\n }\n }\n return oldChild;\n }\n \n addEventListener(type: string, listener: EventListener): void {\n if (!this._listeners) return;\n if (!this._listeners.has(type)) {\n this._listeners.set(type, new Set());\n }\n this._listeners.get(type)!.add(listener);\n }\n\n removeEventListener(type: string, listener: EventListener): void {\n const listeners = this._listeners?.get(type);\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n dispatchEvent(event: Event): boolean {\n const listeners = this._listeners?.get(event.type);\n if (listeners) {\n for (const listener of listeners) {\n try {\n listener(event);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error in event listener:', error);\n }\n }\n }\n if (event.bubbles && this.parentNode && typeof this.parentNode === 'object' && 'dispatchEvent' in this.parentNode && typeof this.parentNode.dispatchEvent === 'function') {\n this.parentNode.dispatchEvent(event);\n }\n return true;\n }\n \n querySelector(selector: string): Element | null {\n // Simple implementation - supports basic selectors\n // #id, .class, tagName\n if (selector.startsWith('#')) {\n const id = selector.slice(1);\n return this.querySelectorById(id);\n } else if (selector.startsWith('.')) {\n const className = selector.slice(1);\n return this.querySelectorByClass(className);\n } else {\n // Tag name selector\n return this.querySelectorByTag(selector);\n }\n }\n \n private querySelectorById(id: string): Element | null {\n // Check self\n if (this.id === id) {\n return this as unknown as Element;\n }\n // Check children recursively\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.id === id) {\n return child as unknown as Element;\n }\n const found = child.querySelector(`#${id}`);\n if (found) return found;\n }\n }\n return null;\n }\n \n private querySelectorByClass(className: string): Element | null {\n // Check self\n if (this.classList.contains(className)) {\n return this as unknown as Element;\n }\n // Check children recursively\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.classList?.contains(className)) {\n return child as unknown as Element;\n }\n const found = child.querySelector(`.${className}`);\n if (found) return found;\n }\n }\n return null;\n }\n \n private querySelectorByTag(tagName: string): Element | null {\n const lowerTag = tagName.toLowerCase();\n // Check self\n if (this.tagName.toLowerCase() === lowerTag) {\n return this as unknown as Element;\n }\n // Check children recursively\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.tagName.toLowerCase() === lowerTag) {\n return child as unknown as Element;\n }\n const found = child.querySelector(tagName);\n if (found) return found;\n }\n }\n return null;\n }\n \n querySelectorAll(selector: string): NodeListOf<Element> {\n const results: Element[] = [];\n \n if (selector.startsWith('#')) {\n const found = this.querySelector(selector);\n if (found) results.push(found);\n } else if (selector.startsWith('.')) {\n const className = selector.slice(1);\n this.querySelectorAllByClass(className, results);\n } else {\n const tagName = selector.toLowerCase();\n this.querySelectorAllByTag(tagName, results);\n }\n \n return results as unknown as NodeListOf<Element>;\n }\n \n private querySelectorAllByClass(className: string, results: Element[]): void {\n if (this.classList.contains(className)) {\n results.push(this as unknown as Element);\n }\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.classList?.contains(className)) {\n results.push(child as unknown as Element);\n }\n child.querySelectorAllByClass(className, results);\n }\n }\n }\n \n private querySelectorAllByTag(tagName: string, results: Element[]): void {\n if (this.tagName.toLowerCase() === tagName) {\n results.push(this as unknown as Element);\n }\n for (const child of this.children) {\n if (isElementNode(child)) {\n if (child.tagName.toLowerCase() === tagName) {\n results.push(child as unknown as Element);\n }\n child.querySelectorAllByTag(tagName, results);\n }\n }\n }\n}\n\nfunction createClassList(owner: NucloElement): DOMTokenList {\n const getClasses = () => owner.className.split(' ').filter((c) => c);\n const setClasses = (classes: string[]) => {\n owner.className = classes.join(' ');\n };\n\n const classList = {\n add: (...tokens: string[]) => {\n const classes = getClasses();\n for (const token of tokens) {\n if (token && !classes.includes(token)) {\n classes.push(token);\n }\n }\n setClasses(classes);\n },\n remove: (...tokens: string[]) => {\n if (tokens.length === 0) return;\n setClasses(getClasses().filter((c) => !tokens.includes(c)));\n },\n toggle: (token: string, force?: boolean) => {\n const hasClass = classList.contains(token);\n if (force === undefined) {\n if (hasClass) {\n classList.remove(token);\n return false;\n }\n classList.add(token);\n return true;\n }\n if (force) {\n classList.add(token);\n return true;\n }\n classList.remove(token);\n return false;\n },\n contains: (token: string) => getClasses().includes(token),\n replace: (oldToken: string, newToken: string) => {\n const classes = getClasses();\n const index = classes.indexOf(oldToken);\n if (index === -1) return false;\n classes[index] = newToken;\n setClasses(classes);\n return true;\n },\n item: (index: number) => getClasses()[index] || null,\n get length() {\n return getClasses().length;\n },\n toString: () => owner.className,\n [Symbol.iterator]: function* () {\n yield* getClasses();\n },\n forEach: (callback: (value: string, key: number, parent: DOMTokenList) => void) => {\n const classes = getClasses();\n for (let i = 0; i < classes.length; i++) {\n callback(classes[i], i, classList as unknown as DOMTokenList);\n }\n },\n entries: function* () {\n const classes = getClasses();\n for (let i = 0; i < classes.length; i++) {\n yield [i, classes[i]] as [number, string];\n }\n },\n keys: function* () {\n const classes = getClasses();\n for (let i = 0; i < classes.length; i++) {\n yield i;\n }\n },\n values: function* () {\n yield* getClasses();\n },\n get value() {\n return owner.className;\n },\n set value(value: string) {\n owner.className = value;\n },\n supports: (_token: string) => false\n };\n\n return classList as unknown as DOMTokenList;\n}\n","export class NucloText {\n nodeType = 3; // Node.TEXT_NODE\n nodeName = '#text';\n data: string;\n textContent: string;\n parentNode: unknown = null;\n \n constructor(data: string) {\n this.data = data;\n this.textContent = data;\n }\n \n get nodeValue(): string {\n return this.data;\n }\n \n set nodeValue(value: string) {\n this.data = value;\n this.textContent = value;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { NucloElement } from './Element';\nimport { NucloText } from './Text';\n\n/**\n * Lightweight DocumentFragment for SSR — prototype methods instead of per-instance closures.\n */\nclass SSRDocumentFragment {\n nodeType: number = 11;\n nodeName: string = '#document-fragment';\n childNodes: Node[] = [];\n children: Element[] = [];\n textContent: string = '';\n\n appendChild<T extends Node>(child: T): T {\n this.childNodes.push(child);\n if ((child as any).nodeType === 1) {\n this.children.push(child as unknown as Element);\n }\n (child as any).parentNode = this;\n return child;\n }\n\n insertBefore<T extends Node>(newNode: T, refNode: Node | null): T {\n if (!refNode) return this.appendChild(newNode);\n const index = this.childNodes.indexOf(refNode);\n if (index !== -1) {\n this.childNodes.splice(index, 0, newNode);\n if ((newNode as any).nodeType === 1) {\n const elementIndex = this.children.indexOf(refNode as Element);\n if (elementIndex !== -1) {\n this.children.splice(elementIndex, 0, newNode as unknown as Element);\n }\n }\n }\n (newNode as any).parentNode = this;\n return newNode;\n }\n\n removeChild<T extends Node>(child: T): T {\n const index = this.childNodes.indexOf(child);\n if (index !== -1) this.childNodes.splice(index, 1);\n if ((child as any).nodeType === 1) {\n const elementIndex = this.children.indexOf(child as unknown as Element);\n if (elementIndex !== -1) this.children.splice(elementIndex, 1);\n }\n (child as any).parentNode = null;\n return child;\n }\n\n replaceChild<T extends Node>(newChild: T, oldChild: Node): T {\n const index = this.childNodes.indexOf(oldChild);\n if (index !== -1) {\n this.childNodes[index] = newChild;\n if ((oldChild as any).nodeType === 1 && (newChild as any).nodeType === 1) {\n const elementIndex = this.children.indexOf(oldChild as Element);\n if (elementIndex !== -1) {\n this.children[elementIndex] = newChild as unknown as Element;\n }\n }\n }\n (newChild as any).parentNode = this;\n (oldChild as any).parentNode = null;\n return newChild;\n }\n\n querySelector(): null { return null; }\n querySelectorAll(): NodeListOf<Element> { return [] as unknown as NodeListOf<Element>; }\n}\n\nexport class NucloDocument {\n head: ExpandedElement;\n body: ExpandedElement;\n private _listeners: Map<string, Map<EventListener, { listener: EventListener; options?: boolean | AddEventListenerOptions }>>;\n \n constructor() {\n this.head = new NucloElement('head') as unknown as ExpandedElement;\n this.body = new NucloElement('body') as unknown as ExpandedElement;\n this._listeners = new Map();\n }\n \n createElement(tagName: string, _options?: unknown): ExpandedElement {\n return new NucloElement(tagName) as unknown as ExpandedElement;\n }\n \n createElementNS(namespace: string, tagName: string, _options?: unknown): ExpandedElement {\n const element = new NucloElement(tagName) as unknown as ExpandedElement;\n (element as any).namespaceURI = namespace;\n return element;\n }\n \n createTextNode(data: string): Text {\n return new NucloText(data) as unknown as Text;\n }\n \n createComment(data: string): Comment {\n const comment = {\n nodeType: 8,\n nodeName: '#comment',\n data,\n textContent: data,\n nodeValue: data,\n parentNode: null,\n nextSibling: null,\n previousSibling: null\n };\n return comment as unknown as Comment;\n }\n \n createDocumentFragment(): DocumentFragment {\n return new SSRDocumentFragment() as unknown as DocumentFragment;\n }\n \n querySelector(selector: string): Element | null {\n // Simple implementation - only supports ID selector for #nuclo-styles\n if (selector.startsWith('#')) {\n const id = selector.slice(1);\n if (id === 'nuclo-styles' && this.head.children) {\n for (const child of this.head.children) {\n if ((child as any).id === id) {\n return child as unknown as Element;\n }\n }\n }\n }\n return null;\n }\n \n querySelectorAll(_selector: string): NodeListOf<Element> {\n return [] as unknown as NodeListOf<Element>;\n }\n \n addEventListener(type: string, listener: EventListener, options?: boolean | AddEventListenerOptions): void {\n if (!this._listeners.has(type)) {\n this._listeners.set(type, new Map());\n }\n const listenersMap = this._listeners.get(type)!;\n listenersMap.set(listener, { listener, options });\n }\n \n removeEventListener(type: string, listener: EventListener, _options?: boolean | AddEventListenerOptions): void {\n const listeners = this._listeners.get(type);\n if (listeners) {\n listeners.delete(listener);\n // Clean up empty maps to prevent memory leaks\n if (listeners.size === 0) {\n this._listeners.delete(type);\n }\n }\n }\n \n dispatchEvent(event: Event): boolean {\n const listeners = this._listeners.get(event.type);\n if (listeners) {\n // Create a copy to avoid issues if listeners are modified during dispatch\n const listenersCopy = Array.from(listeners.values());\n for (let i = 0; i < listenersCopy.length; i++) {\n const { listener } = listenersCopy[i];\n try {\n listener(event);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error in event listener:', error);\n }\n }\n }\n return true;\n }\n \n contains(_node: Node): boolean {\n return false;\n }\n}\n\nexport const document = globalThis.document || new NucloDocument();","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport class NucloEvent implements Event {\n type: string;\n bubbles: boolean;\n cancelable: boolean;\n composed: boolean;\n currentTarget: EventTarget | null = null;\n defaultPrevented: boolean = false;\n eventPhase: number = 0;\n isTrusted: boolean = false;\n target: EventTarget | null = null;\n timeStamp: number;\n readonly AT_TARGET = 2;\n readonly BUBBLING_PHASE = 3;\n readonly CAPTURING_PHASE = 1;\n readonly NONE = 0;\n returnValue: boolean = true;\n srcElement: EventTarget | null = null;\n cancelBubble: boolean = false;\n \n constructor(type: string, eventInitDict?: EventInit) {\n this.type = type;\n this.bubbles = eventInitDict?.bubbles || false;\n this.cancelable = eventInitDict?.cancelable || false;\n this.composed = eventInitDict?.composed || false;\n this.timeStamp = Date.now();\n }\n \n composedPath(): EventTarget[] {\n return [];\n }\n \n initEvent(_type: string, _bubbles?: boolean, _cancelable?: boolean): void {\n // Legacy method - no-op\n }\n \n preventDefault(): void {\n if (this.cancelable) {\n this.defaultPrevented = true;\n }\n }\n \n stopImmediatePropagation(): void {\n this.cancelBubble = true;\n }\n \n stopPropagation(): void {\n this.cancelBubble = true;\n }\n}\n\nexport class NucloCustomEvent<T = any> extends NucloEvent implements CustomEvent<T> {\n detail: T;\n \n constructor(type: string, eventInitDict?: CustomEventInit<T>) {\n super(type, eventInitDict);\n this.detail = eventInitDict?.detail as T;\n }\n \n initCustomEvent(_type: string, _bubbles?: boolean, _cancelable?: boolean, _detail?: T): void {\n // Legacy method - no-op\n }\n}\n\n// Export polyfills if browser globals don't exist\nexport const Event = globalThis.Event || NucloEvent;\nexport const CustomEvent = globalThis.CustomEvent || NucloCustomEvent;\n","/**\n * Polyfills for Node.js environments\n * \n * This module provides minimal browser API polyfills to allow Nuclo to run in Node.js\n * for server-side rendering (SSR) scenarios.\n * \n * To use in Node.js:\n * ```typescript\n * import 'nuclo/polyfill';\n * // or\n * import { document, Event, CustomEvent } from 'nuclo/polyfill';\n * ```\n */\n\nexport { NucloDocument, document } from './Document';\nexport { NucloElement } from './Element';\nexport { NucloText } from './Text';\nexport { NucloEvent, NucloCustomEvent, Event, CustomEvent } from './Event';\nexport { NucloNode } from './Node';\n\n// Import for local use\nimport { NucloElement } from './Element';\nimport { NucloNode } from './Node';\nimport { document } from './Document';\nimport { Event, CustomEvent } from './Event';\n\nexport const Node = NucloNode;\nexport const Element = NucloElement;\nexport const HTMLElement = NucloElement;\n\n// Auto-apply polyfills to globalThis if in Node environment (synchronous — no top-level await)\nif (typeof window === 'undefined' && typeof globalThis !== 'undefined') {\n interface GlobalWithPolyfills {\n document?: typeof document;\n Event?: typeof Event;\n CustomEvent?: typeof CustomEvent;\n Node?: typeof NucloNode;\n Element?: typeof NucloElement;\n HTMLElement?: typeof NucloElement;\n }\n\n const g = globalThis as unknown as GlobalWithPolyfills;\n\n if (!g.document) g.document = document;\n if (!g.Event) g.Event = Event;\n if (!g.CustomEvent) g.CustomEvent = CustomEvent;\n if (!g.Node) g.Node = NucloNode;\n if (!g.Element) g.Element = NucloElement;\n if (!g.HTMLElement) g.HTMLElement = NucloElement;\n}\n"],"mappings":"AAKA,MAAa,EAAY,OAAO,OAAW,KAAe,OAAO,SAAa,ICF9E,IAAa,EAAb,KAAuB,CACrB,SAAmB,EACnB,SAAmB,GACnB,UAA2B,KAC3B,WAAsB,KACtB,YAA6B,KAC7B,YAAsB,GAEtB,IAAI,YAAoC,CACtC,IAAM,EAAQ,KAAK,aAAe,CAAC,EACnC,MAAO,CACL,GAAG,EACH,OAAQ,EAAM,OACd,KAAO,GAAmB,EAAM,IAAwB,KACxD,CAAC,OAAO,UAAW,WAAa,CAC9B,IAAK,IAAM,KAAQ,EACjB,MAAM,CAEV,EACA,QAAU,GAAqF,CAC7F,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,EAAS,EAAM,GAAiB,EAAG,KAAK,UAAU,CAEtD,EACA,QAAS,WAAa,CACpB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,KAAM,CAAC,EAAG,EAAM,EAAe,CAEnC,EACA,KAAM,WAAa,CACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAChC,MAAM,CAEV,EACA,OAAQ,WAAa,CACnB,IAAK,IAAM,KAAQ,EACjB,MAAM,CAEV,CACF,CACF,CACF,ECpCM,EAAN,KAAe,CAGb,IAAI,SAAkB,CACpB,IAAM,EAAU,OAAO,QAAQ,IAAI,EAEnC,OADI,EAAQ,SAAW,EAAU,GAC1B,EAAQ,KAAK,CAAC,EAAG,KAAO,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CACxD,CAEA,YAAY,EAAc,EAAqB,CAC7C,KAAkC,GAAQ,CAC5C,CAEA,iBAAiB,EAAsB,CACrC,OAAS,KAAiC,IAAoB,EAChE,CACF,EAGM,EAAN,KAAmB,CACjB,IACA,YAAY,EAAkB,CAAE,KAAK,IAAM,CAAI,CAE/C,IAAI,GAAG,EAAwB,CAC7B,IAAM,EAAU,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,EAAI,CAAC,EACtF,IAAK,IAAM,KAAK,EAAY,GAAK,CAAC,EAAQ,SAAS,CAAC,GAAG,EAAQ,KAAK,CAAC,EACrE,KAAK,IAAI,UAAY,EAAQ,KAAK,GAAG,CACvC,CACA,OAAO,GAAG,EAAwB,CAC3B,KAAK,IAAI,YACd,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,GAAK,GAAK,CAAC,EAAO,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EACnG,CACA,SAAS,EAAwB,CAC/B,MAAO,CAAC,CAAC,KAAK,IAAI,WAAa,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,SAAS,CAAK,CAC7E,CACA,OAAO,EAAe,EAA0B,CAC9C,IAAM,EAAM,KAAK,SAAS,CAAK,EAGX,OAFhB,IAAU,IAAA,GAAiB,GAAO,KAAK,OAAO,CAAK,EAAU,KAAS,KAAK,IAAI,CAAK,EAAU,IAC9F,GAAS,KAAK,IAAI,CAAK,EAAU,KACrC,KAAK,OAAO,CAAK,EAAU,GAC7B,CACA,QAAQ,EAAkB,EAA2B,CAER,OADtC,KAAK,SAAS,CAAQ,GAC3B,KAAK,OAAO,CAAQ,EAAG,KAAK,IAAI,CAAQ,EAAU,IADb,EAEvC,CACA,KAAK,EAA8B,CAAE,OAAQ,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,IAAW,IAAM,CAC5G,IAAI,QAAiB,CAAE,OAAO,KAAK,IAAI,UAAY,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,OAAS,CAAG,CAC7G,IAAI,OAAgB,CAAE,OAAO,KAAK,IAAI,SAAW,CACjD,IAAI,MAAM,EAAW,CAAE,KAAK,IAAI,UAAY,CAAG,CAC/C,UAAmB,CAAE,OAAO,KAAK,IAAI,SAAW,CAChD,SAAS,EAAyB,CAAE,MAAO,EAAO,CAClD,QAAQ,EAAsE,CAC5E,IAAM,EAAU,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,EAC5D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,EAAG,EAAQ,GAAI,EAAG,IAA+B,CAC5F,CACA,CAAC,OAAO,WAA8B,CACpC,IAAM,EAAU,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,EACxD,EAAI,EACR,MAAO,CAAE,MAA+B,CAAE,OAAO,EAAI,EAAQ,OAAS,CAAE,MAAO,EAAQ,KAAM,KAAM,EAAM,EAAI,CAAE,MAAO,GAAI,KAAM,EAAK,CAAG,CAAE,CAC5I,CACA,SAAsC,CACpC,IAAM,EAAU,KAAK,IAAI,UAAU,MAAM,GAAG,CAAC,CAAC,OAAO,OAAO,EACxD,EAAI,EACR,MAAO,CAAE,MAAyC,CAAE,OAAO,EAAI,EAAQ,OAAS,CAAE,MAAO,CAAC,EAAG,EAAQ,IAAI,EAAG,KAAM,EAAM,EAAI,CAAE,MAAO,CAAC,EAAG,EAAE,EAAG,KAAM,EAAK,CAAG,CAAE,CAChK,CACA,MAAyB,CACvB,IAAM,EAAM,KAAK,OAAY,EAAI,EACjC,MAAO,CAAE,MAA+B,CAAE,OAAO,EAAI,EAAM,CAAE,MAAO,IAAK,KAAM,EAAM,EAAI,CAAE,MAAO,EAAG,KAAM,EAAK,CAAG,CAAE,CACvH,CACA,QAA2B,CAAE,OAAO,KAAK,OAAO,SAAS,CAAC,CAAG,CAC/D,EAYA,SAAS,EAAc,EAAqC,CAC1D,OAAO,OAAO,GAAS,YAAY,GAAiB,YAAa,CACnE,CAEA,SAAS,EAAW,EAAiC,CACnD,OAAO,OAAO,GAAS,YAAY,GAAiB,aAAc,GAAS,EAA8B,WAAa,CACxH,CAEA,SAAS,EAAc,EAAoC,CACzD,OAAO,OAAO,GAAS,YAAY,GAAiB,aAAc,GAAS,EAA8B,WAAa,CACxH,CAEA,IAAa,EAAb,cAAkC,CAAU,CAC1C,QACA,SACA,WACA,UAAoB,GACpB,UACA,YAAsB,GACtB,WAA6B,GAC7B,WAAsB,KACtB,QACA,KACA,MACA,GAAa,GACb,aACA,MACA,WAEA,IAAI,WAAoB,CACtB,OAAO,KAAK,kBAAkB,CAChC,CAEA,IAAI,UAAU,EAAe,CAC3B,KAAK,WAAa,CACpB,CAEA,mBAAoC,CAClC,IAAI,EAAO,GACX,IAAK,IAAM,KAAS,KAAK,SACnB,EAAc,CAAK,EACrB,GAAQ,KAAK,iBAAiB,CAAK,EAC1B,EAAW,CAAK,EACzB,GAAQ,EAAM,aAAe,GACpB,EAAc,CAAK,IAC5B,GAAQ,OAAO,EAAM,MAAQ,GAAG,MAGpC,OAAO,CACT,CAEA,iBAAyB,EAA+B,CACtD,IAAM,EAAM,EAAQ,QAAQ,YAAY,EACpC,EAAO,IAAI,IASf,GANI,EAAQ,KACV,GAAQ,QAAQ,EAAQ,GAAG,IAEzB,EAAQ,YACV,GAAQ,WAAW,EAAQ,UAAU,IAEnC,EAAQ,eACL,GAAM,CAAC,EAAM,KAAU,EAAQ,WAC9B,IAAS,MAAQ,IAAS,UAC5B,GAAQ,IAAI,EAAK,IAAI,EAAM,IAQjC,GAHA,GAAQ,IAGJ,EAAQ,UAAY,EAAQ,SAAS,OAAS,MAC3C,IAAM,KAAS,EAAQ,SACtB,EAAc,CAAK,EACrB,GAAQ,KAAK,iBAAiB,CAAK,EAC1B,EAAW,CAAK,EACzB,GAAQ,EAAM,aAAe,GACpB,EAAc,CAAK,IAC5B,GAAQ,OAAO,EAAM,MAAQ,GAAG,MAMtC,MADA,IAAQ,KAAK,EAAI,GACV,CACT,CAEA,YAAY,EAAiB,CAQ3B,GAPA,MAAM,EACN,KAAK,QAAU,EAAQ,YAAY,EACnC,KAAK,SAAW,EAChB,KAAK,SAAW,EAAQ,YAAY,EACpC,KAAK,SAAW,CAAC,EACjB,KAAK,WAAa,IAAI,IAElB,CAAC,EAEH,KAAK,WAAa,KAGlB,KAAK,MAAQ,IAAI,EAGjB,KAAK,UAAY,IAAI,EAAa,IAAI,MAEjC,CAEL,KAAK,WAAa,IAAI,IAEtB,IAAM,EAAqC,CAAC,EAY5C,GAXA,KAAK,MAAQ,IAAI,MAAM,CAAC,EAA0B,CAChD,KAAM,EAAS,IACT,IAAS,eAAuB,EAAc,IAAkB,CAAE,EAAW,GAAQ,CAAO,EAC5F,IAAS,mBAA4B,GAAiB,EAAW,IAAS,GAC1E,IAAS,UAAkB,OAAO,QAAQ,CAAU,CAAC,CAAC,KAAK,CAAC,EAAG,KAAO,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,EAC1F,EAAW,GAEpB,KAAM,EAAS,EAAc,KAAoB,EAAW,GAAQ,EAAc,GACpF,CAAC,EAGG,KAAK,UAAY,QAAS,CAC5B,IAAM,EAAsB,CAAC,EAC7B,KAAK,MAAQ,CACD,WACV,YAAa,EAAc,IAAmB,CAC5C,IAAM,EAAM,GAAS,EAAS,OAC1B,EACJ,GAAI,EAAK,KAAK,CAAC,CAAC,WAAW,GAAG,EAAG,CAC/B,IAAM,EAAwB,CAAC,EACzB,EAAgB,EAAK,QAAQ,WAAY,EAAE,CAAC,CAAC,QAAQ,kBAAmB,EAAE,CAAC,CAAC,KAAK,EACvF,EAAW,CACT,QAAS,EAAM,gBACf,MAAO,CAAE,UAAW,CAAc,EAClC,SAAU,EACV,YAAa,EAAmB,IAAwB,CACtD,IAAM,EAAW,GAAc,EAAW,OAE1C,OADA,EAAW,OAAO,EAAU,EAAG,CAAE,QAAS,EAAW,aAAc,EAAU,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,EAAG,MAAO,CAAC,EAA0B,KAAM,CAAE,CAAuB,EAC7J,CACT,EACA,WAAa,GAAc,CAAE,EAAW,OAAO,EAAG,CAAC,CAAG,EACtD,KAAM,CACR,CACF,MACE,EAAW,CAAE,QAAS,EAAM,aAAc,EAAK,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,EAAG,MAAO,CAAC,EAA0B,KAAM,CAAE,EAGjH,OADA,EAAS,OAAO,EAAK,EAAG,CAAQ,EACzB,CACT,EACA,WAAa,GAAkB,CAAE,EAAS,OAAO,EAAO,CAAC,CAAG,CAC9D,CACF,CAEA,KAAK,UAAY,EAAgB,IAAI,CACvC,CACF,CAEA,YAA4B,EAAa,CAQvC,OAPA,KAAK,SAAS,KAAK,CAAK,EACpB,GAAc,KAAa,aAC7B,KAAc,YAAe,KAAK,CAAK,EAErC,OAAO,GAAU,UAAY,GAAkB,eAAgB,IACjE,EAAmC,WAAa,MAE3C,CACT,CAEA,aAAa,EAAc,EAAqB,CAC9C,KAAK,WAAW,IAAI,EAAM,CAAK,EAC3B,IAAS,QACX,KAAK,UAAY,EACR,IAAS,OAClB,KAAK,GAAK,EAEd,CAEA,aAAa,EAA6B,CACxC,OAAO,KAAK,WAAW,IAAI,CAAI,GAAK,IACtC,CAEA,gBAAgB,EAAoB,CAClC,KAAK,WAAW,OAAO,CAAI,EACvB,IAAS,UACX,KAAK,UAAY,GAErB,CAEA,aAAa,EAAuB,CAClC,OAAO,KAAK,WAAW,IAAI,CAAI,CACjC,CAEA,aAA6B,EAAY,EAA+B,CACtE,GAAI,IAAkB,KACpB,OAAO,KAAK,YAAY,CAAO,EAEjC,IAAM,EAAQ,KAAK,SAAS,QAAQ,CAAa,EACjD,GAAI,IAAU,GAAI,CAEhB,GADA,KAAK,SAAS,OAAO,EAAO,EAAG,CAAO,EAClC,GAAc,KAAa,YAAgB,CAC7C,IAAM,EAAmB,KAAa,YAAe,QAAQ,CAAa,EACtE,IAAoB,IACtB,KAAc,YAAe,OAAO,EAAiB,EAAG,CAAO,CAEnE,CACI,OAAO,GAAY,UAAY,GAAoB,eAAgB,IACrE,EAAqC,WAAa,KAEtD,CACA,OAAO,CACT,CAEA,YAA4B,EAAa,CACvC,IAAM,EAAQ,KAAK,SAAS,QAAQ,CAAK,EACzC,GAAI,IAAU,GAAI,CAEhB,GADA,KAAK,SAAS,OAAO,EAAO,CAAC,EACzB,GAAc,KAAa,YAAgB,CAC7C,IAAM,EAAW,KAAa,YAAe,QAAQ,CAAK,EACtD,IAAY,IACd,KAAc,YAAe,OAAO,EAAS,CAAC,CAElD,CACI,OAAO,GAAU,UAAY,GAAkB,eAAgB,IACjE,EAAmC,WAAa,KAEpD,CACA,OAAO,CACT,CAEA,aAA6B,EAAgB,EAAgB,CAC3D,IAAM,EAAQ,KAAK,SAAS,QAAQ,CAAQ,EAC5C,GAAI,IAAU,GAAI,CAEhB,GADA,KAAK,SAAS,GAAS,EACnB,GAAc,KAAa,YAAgB,CAC7C,IAAM,EAAW,KAAa,YAAe,QAAQ,CAAQ,EACzD,IAAY,KACd,KAAc,YAAe,GAAW,EAE5C,CACI,OAAO,GAAa,UAAY,GAAqB,eAAgB,IACvE,EAAsC,WAAa,MAEjD,OAAO,GAAa,UAAY,GAAqB,eAAgB,IACvE,EAAsC,WAAa,KAEvD,CACA,OAAO,CACT,CAEA,iBAAiB,EAAc,EAA+B,CACvD,KAAK,aACL,KAAK,WAAW,IAAI,CAAI,GAC3B,KAAK,WAAW,IAAI,EAAM,IAAI,GAAK,EAErC,KAAK,WAAW,IAAI,CAAI,CAAC,CAAE,IAAI,CAAQ,EACzC,CAEA,oBAAoB,EAAc,EAA+B,CAC/D,IAAM,EAAY,KAAK,YAAY,IAAI,CAAI,EACvC,GACF,EAAU,OAAO,CAAQ,CAE7B,CAEA,cAAc,EAAuB,CACnC,IAAM,EAAY,KAAK,YAAY,IAAI,EAAM,IAAI,EACjD,GAAI,EACF,IAAK,IAAM,KAAY,EACrB,GAAI,CACF,EAAS,CAAK,CAChB,OAAS,EAAO,CAEd,QAAQ,MAAM,2BAA4B,CAAK,CACjD,CAMJ,OAHI,EAAM,SAAW,KAAK,YAAc,OAAO,KAAK,YAAe,UAAY,kBAAmB,KAAK,YAAc,OAAO,KAAK,WAAW,eAAkB,YAC5J,KAAK,WAAW,cAAc,CAAK,EAE9B,EACT,CAEA,cAAc,EAAkC,CAG9C,GAAI,EAAS,WAAW,GAAG,EAAG,CAC5B,IAAM,EAAK,EAAS,MAAM,CAAC,EAC3B,OAAO,KAAK,kBAAkB,CAAE,CAClC,MAAO,GAAI,EAAS,WAAW,GAAG,EAAG,CACnC,IAAM,EAAY,EAAS,MAAM,CAAC,EAClC,OAAO,KAAK,qBAAqB,CAAS,CAC5C,MAEE,OAAO,KAAK,mBAAmB,CAAQ,CAE3C,CAEA,kBAA0B,EAA4B,CAEpD,GAAI,KAAK,KAAO,EACd,OAAO,KAGT,IAAK,IAAM,KAAS,KAAK,SACvB,GAAI,EAAc,CAAK,EAAG,CACxB,GAAI,EAAM,KAAO,EACf,OAAO,EAET,IAAM,EAAQ,EAAM,cAAc,IAAI,GAAI,EAC1C,GAAI,EAAO,OAAO,CACpB,CAEF,OAAO,IACT,CAEA,qBAA6B,EAAmC,CAE9D,GAAI,KAAK,UAAU,SAAS,CAAS,EACnC,OAAO,KAGT,IAAK,IAAM,KAAS,KAAK,SACvB,GAAI,EAAc,CAAK,EAAG,CACxB,GAAI,EAAM,WAAW,SAAS,CAAS,EACrC,OAAO,EAET,IAAM,EAAQ,EAAM,cAAc,IAAI,GAAW,EACjD,GAAI,EAAO,OAAO,CACpB,CAEF,OAAO,IACT,CAEA,mBAA2B,EAAiC,CAC1D,IAAM,EAAW,EAAQ,YAAY,EAErC,GAAI,KAAK,QAAQ,YAAY,IAAM,EACjC,OAAO,KAGT,IAAK,IAAM,KAAS,KAAK,SACvB,GAAI,EAAc,CAAK,EAAG,CACxB,GAAI,EAAM,QAAQ,YAAY,IAAM,EAClC,OAAO,EAET,IAAM,EAAQ,EAAM,cAAc,CAAO,EACzC,GAAI,EAAO,OAAO,CACpB,CAEF,OAAO,IACT,CAEA,iBAAiB,EAAuC,CACtD,IAAM,EAAqB,CAAC,EAE5B,GAAI,EAAS,WAAW,GAAG,EAAG,CAC5B,IAAM,EAAQ,KAAK,cAAc,CAAQ,EACrC,GAAO,EAAQ,KAAK,CAAK,CAC/B,MAAO,GAAI,EAAS,WAAW,GAAG,EAAG,CACnC,IAAM,EAAY,EAAS,MAAM,CAAC,EAClC,KAAK,wBAAwB,EAAW,CAAO,CACjD,KAAO,CACL,IAAM,EAAU,EAAS,YAAY,EACrC,KAAK,sBAAsB,EAAS,CAAO,CAC7C,CAEA,OAAO,CACT,CAEA,wBAAgC,EAAmB,EAA0B,CACvE,KAAK,UAAU,SAAS,CAAS,GACnC,EAAQ,KAAK,IAA0B,EAEzC,IAAK,IAAM,KAAS,KAAK,SACnB,EAAc,CAAK,IACjB,EAAM,WAAW,SAAS,CAAS,GACrC,EAAQ,KAAK,CAA2B,EAE1C,EAAM,wBAAwB,EAAW,CAAO,EAGtD,CAEA,sBAA8B,EAAiB,EAA0B,CACnE,KAAK,QAAQ,YAAY,IAAM,GACjC,EAAQ,KAAK,IAA0B,EAEzC,IAAK,IAAM,KAAS,KAAK,SACnB,EAAc,CAAK,IACjB,EAAM,QAAQ,YAAY,IAAM,GAClC,EAAQ,KAAK,CAA2B,EAE1C,EAAM,sBAAsB,EAAS,CAAO,EAGlD,CACF,EAEA,SAAS,EAAgB,EAAmC,CAC1D,IAAM,MAAmB,EAAM,UAAU,MAAM,GAAG,CAAC,CAAC,OAAQ,GAAM,CAAC,EAC7D,EAAc,GAAsB,CACxC,EAAM,UAAY,EAAQ,KAAK,GAAG,CACpC,EAEM,EAAY,CAChB,KAAM,GAAG,IAAqB,CAC5B,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAM,KAAS,EACd,GAAS,CAAC,EAAQ,SAAS,CAAK,GAClC,EAAQ,KAAK,CAAK,EAGtB,EAAW,CAAO,CACpB,EACA,QAAS,GAAG,IAAqB,CAC3B,EAAO,SAAW,GACtB,EAAW,EAAW,CAAC,CAAC,OAAQ,GAAM,CAAC,EAAO,SAAS,CAAC,CAAC,CAAC,CAC5D,EACA,QAAS,EAAe,IAAoB,CAC1C,IAAM,EAAW,EAAU,SAAS,CAAK,EAczC,OAbI,IAAU,IAAA,GACR,GACF,EAAU,OAAO,CAAK,EACf,KAET,EAAU,IAAI,CAAK,EACZ,IAEL,GACF,EAAU,IAAI,CAAK,EACZ,KAET,EAAU,OAAO,CAAK,EACf,GACT,EACA,SAAW,GAAkB,EAAW,CAAC,CAAC,SAAS,CAAK,EACxD,SAAU,EAAkB,IAAqB,CAC/C,IAAM,EAAU,EAAW,EACrB,EAAQ,EAAQ,QAAQ,CAAQ,EAItC,OAHI,IAAU,GAAW,IACzB,EAAQ,GAAS,EACjB,EAAW,CAAO,EACX,GACT,EACA,KAAO,GAAkB,EAAW,CAAC,CAAC,IAAU,KAChD,IAAI,QAAS,CACX,OAAO,EAAW,CAAC,CAAC,MACtB,EACA,aAAgB,EAAM,UACtB,CAAC,OAAO,UAAW,WAAa,CAC9B,MAAO,EAAW,CACpB,EACA,QAAU,GAAyE,CACjF,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,EAAS,EAAQ,GAAI,EAAG,CAAoC,CAEhE,EACA,QAAS,WAAa,CACpB,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,KAAM,CAAC,EAAG,EAAQ,EAAE,CAExB,EACA,KAAM,WAAa,CACjB,IAAM,EAAU,EAAW,EAC3B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAClC,MAAM,CAEV,EACA,OAAQ,WAAa,CACnB,MAAO,EAAW,CACpB,EACA,IAAI,OAAQ,CACV,OAAO,EAAM,SACf,EACA,IAAI,MAAM,EAAe,CACvB,EAAM,UAAY,CACpB,EACA,SAAW,GAAmB,EAChC,EAEA,OAAO,CACT,CC/jBA,IAAa,EAAb,KAAuB,CACrB,SAAW,EACX,SAAW,QACX,KACA,YACA,WAAsB,KAEtB,YAAY,EAAc,CACxB,KAAK,KAAO,EACZ,KAAK,YAAc,CACrB,CAEA,IAAI,WAAoB,CACtB,OAAO,KAAK,IACd,CAEA,IAAI,UAAU,EAAe,CAC3B,KAAK,KAAO,EACZ,KAAK,YAAc,CACrB,CACF,ECbM,EAAN,KAA0B,CACxB,SAAmB,GACnB,SAAmB,qBACnB,WAAqB,CAAC,EACtB,SAAsB,CAAC,EACvB,YAAsB,GAEtB,YAA4B,EAAa,CAMvC,OALA,KAAK,WAAW,KAAK,CAAK,EACrB,EAAc,WAAa,GAC9B,KAAK,SAAS,KAAK,CAA2B,EAEhD,EAAe,WAAa,KACrB,CACT,CAEA,aAA6B,EAAY,EAAyB,CAChE,GAAI,CAAC,EAAS,OAAO,KAAK,YAAY,CAAO,EAC7C,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAO,EAC7C,GAAI,IAAU,KACZ,KAAK,WAAW,OAAO,EAAO,EAAG,CAAO,EACnC,EAAgB,WAAa,GAAG,CACnC,IAAM,EAAe,KAAK,SAAS,QAAQ,CAAkB,EACzD,IAAiB,IACnB,KAAK,SAAS,OAAO,EAAc,EAAG,CAA6B,CAEvE,CAGF,MADA,GAAiB,WAAa,KACvB,CACT,CAEA,YAA4B,EAAa,CACvC,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAK,EAE3C,GADI,IAAU,IAAI,KAAK,WAAW,OAAO,EAAO,CAAC,EAC5C,EAAc,WAAa,EAAG,CACjC,IAAM,EAAe,KAAK,SAAS,QAAQ,CAA2B,EAClE,IAAiB,IAAI,KAAK,SAAS,OAAO,EAAc,CAAC,CAC/D,CAEA,MADA,GAAe,WAAa,KACrB,CACT,CAEA,aAA6B,EAAa,EAAmB,CAC3D,IAAM,EAAQ,KAAK,WAAW,QAAQ,CAAQ,EAC9C,GAAI,IAAU,KACZ,KAAK,WAAW,GAAS,EACpB,EAAiB,WAAa,GAAM,EAAiB,WAAa,GAAG,CACxE,IAAM,EAAe,KAAK,SAAS,QAAQ,CAAmB,EAC1D,IAAiB,KACnB,KAAK,SAAS,GAAgB,EAElC,CAIF,MAFA,GAAkB,WAAa,KAC/B,EAAkB,WAAa,KACxB,CACT,CAEA,eAAsB,CAAE,OAAO,IAAM,CACrC,kBAAwC,CAAE,MAAO,CAAC,CAAqC,CACzF,EAEa,EAAb,KAA2B,CACzB,KACA,KACA,WAEA,aAAc,CACZ,KAAK,KAAO,IAAI,EAAa,MAAM,EACnC,KAAK,KAAO,IAAI,EAAa,MAAM,EACnC,KAAK,WAAa,IAAI,GACxB,CAEA,cAAc,EAAiB,EAAqC,CAClE,OAAO,IAAI,EAAa,CAAO,CACjC,CAEA,gBAAgB,EAAmB,EAAiB,EAAqC,CACvF,IAAM,EAAU,IAAI,EAAa,CAAO,EAExC,MADA,GAAiB,aAAe,EACzB,CACT,CAEA,eAAe,EAAoB,CACjC,OAAO,IAAI,EAAU,CAAI,CAC3B,CAEA,cAAc,EAAuB,CAWnC,MAAO,CATL,SAAU,EACV,SAAU,WACV,OACA,YAAa,EACb,UAAW,EACX,WAAY,KACZ,YAAa,KACb,gBAAiB,IAEN,CACf,CAEA,wBAA2C,CACzC,OAAO,IAAI,CACb,CAEA,cAAc,EAAkC,CAE9C,GAAI,EAAS,WAAW,GAAG,EAAG,CAC5B,IAAM,EAAK,EAAS,MAAM,CAAC,EAC3B,GAAI,IAAO,gBAAkB,KAAK,KAAK,cAChC,IAAM,KAAS,KAAK,KAAK,SAC5B,GAAK,EAAc,KAAO,EACxB,OAAO,CAAA,CAIf,CACA,OAAO,IACT,CAEA,iBAAiB,EAAwC,CACvD,MAAO,CAAC,CACV,CAEA,iBAAiB,EAAc,EAAyB,EAAmD,CACpG,KAAK,WAAW,IAAI,CAAI,GAC3B,KAAK,WAAW,IAAI,EAAM,IAAI,GAAK,EAGrC,KAD0B,WAAW,IAAI,CAC9B,CAAC,CAAC,IAAI,EAAU,CAAE,WAAU,SAAQ,CAAC,CAClD,CAEA,oBAAoB,EAAc,EAAyB,EAAoD,CAC7G,IAAM,EAAY,KAAK,WAAW,IAAI,CAAI,EACtC,IACF,EAAU,OAAO,CAAQ,EAErB,EAAU,OAAS,GACrB,KAAK,WAAW,OAAO,CAAI,EAGjC,CAEA,cAAc,EAAuB,CACnC,IAAM,EAAY,KAAK,WAAW,IAAI,EAAM,IAAI,EAChD,GAAI,EAAW,CAEb,IAAM,EAAgB,MAAM,KAAK,EAAU,OAAO,CAAC,EACnD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAc,OAAQ,IAAK,CAC7C,GAAM,CAAE,YAAa,EAAc,GACnC,GAAI,CACF,EAAS,CAAK,CAChB,OAAS,EAAO,CAEd,QAAQ,MAAM,2BAA4B,CAAK,CACjD,CACF,CACF,CACA,MAAO,EACT,CAEA,SAAS,EAAsB,CAC7B,MAAO,EACT,CACF,EAEA,MAAaA,EAAW,WAAW,UAAY,IAAI,EC7KnD,IAAa,EAAb,KAAyC,CACvC,KACA,QACA,WACA,SACA,cAAoC,KACpC,iBAA4B,GAC5B,WAAqB,EACrB,UAAqB,GACrB,OAA6B,KAC7B,UACA,UAAqB,EACrB,eAA0B,EAC1B,gBAA2B,EAC3B,KAAgB,EAChB,YAAuB,GACvB,WAAiC,KACjC,aAAwB,GAExB,YAAY,EAAc,EAA2B,CACnD,KAAK,KAAO,EACZ,KAAK,QAAU,GAAe,SAAW,GACzC,KAAK,WAAa,GAAe,YAAc,GAC/C,KAAK,SAAW,GAAe,UAAY,GAC3C,KAAK,UAAY,KAAK,IAAI,CAC5B,CAEA,cAA8B,CAC5B,MAAO,CAAC,CACV,CAEA,UAAU,EAAe,EAAoB,EAA6B,CAE1E,CAEA,gBAAuB,CACjB,KAAK,aACP,KAAK,iBAAmB,GAE5B,CAEA,0BAAiC,CAC/B,KAAK,aAAe,EACtB,CAEA,iBAAwB,CACtB,KAAK,aAAe,EACtB,CACF,EAEa,EAAb,cAA+C,CAAqC,CAClF,OAEA,YAAY,EAAc,EAAoC,CAC5D,MAAM,EAAM,CAAa,EACzB,KAAK,OAAS,GAAe,MAC/B,CAEA,gBAAgB,EAAe,EAAoB,EAAuB,EAAmB,CAE7F,CACF,EAGA,MAAa,EAAQ,WAAW,OAAS,EAC5B,EAAc,WAAW,aAAe,ECxCxC,EAAO,EACP,EAAU,EACV,EAAc,EAG3B,GAAI,OAAO,OAAW,KAAe,OAAO,WAAe,IAAa,CAUtE,IAAM,EAAI,WAEV,AAAiB,EAAE,WAAWC,EAC9B,AAAc,EAAE,QAAQ,EACxB,AAAoB,EAAE,cAAc,EACpC,AAAa,EAAE,OAAO,EACtB,AAAgB,EAAE,UAAU,EAC5B,AAAoB,EAAE,cAAc,CACtC"}
@@ -15,5 +15,5 @@
15
15
  * ```
16
16
  */
17
17
  export { renderToString, renderManyToString, renderToStringWithContainer } from './renderToString';
18
- export { setSSRCollector } from '../style/cssGenerator';
18
+ export { setSSRCollector, getCssText } from '../style/engine';
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ssr/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){let t=``;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);r>=65&&r<=90?(n>0&&(t+=`-`),t+=String.fromCharCode(r+32)):t+=e[n]}return t}function t(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#039;`};return e.replace(/[&<>"']/g,e=>t[e])}function n(e){return e.replace(/[&<>]/g,e=>e===`&`?`&amp;`:e===`<`?`&lt;`:`&gt;`)}function r(e){return globalThis.document?document.createElement(e):null}const i=new Set(`viewBox.preserveAspectRatio.markerWidth.markerHeight.gradientTransform.patternTransform.clipPathUnits.gradientUnits.patternUnits.pathLength.refX.refY.stdDeviation.baseFrequency.numOctaves.kernelMatrix.tableValues.targetX.targetY.specularExponent.specularConstant.diffuseConstant.surfaceScale.xChannelSelector.yChannelSelector.edgeMode.stitchTiles.spreadMethod.patternContentUnits.markerUnits.startOffset.textLength.lengthAdjust`.split(`.`)),a=new Set([`allowfullscreen`,`async`,`autofocus`,`autoplay`,`checked`,`controls`,`default`,`defer`,`disabled`,`formnovalidate`,`hidden`,`ismap`,`loop`,`multiple`,`muted`,`nomodule`,`novalidate`,`open`,`readonly`,`required`,`reversed`,`selected`]);function o(n,r){if(r==null||r===!1)return``;if(r===!0)return` ${n}`;if(a.has(n)){if(r===`false`)return``;if(r===`true`||r===``||r===n)return` ${n}`}if(n===`style`&&typeof r==`object`){let n=Object.entries(r).filter(([,e])=>e!=null&&e!==``).map(([t,n])=>`${e(t)}: ${n};`).join(` `);return n?` style="${t(n)}"`:``}return` ${n}="${t(String(r))}"`}function s(n){let r=``;if(`attributes`in n&&n.attributes instanceof Map){let a=n;if(a.id&&!n.attributes.has(`id`)&&(r+=o(`id`,a.id)),a.className&&!n.attributes.has(`class`)&&(r+=o(`class`,a.className)),!n.attributes.has(`style`)&&a.style){let n=a.style.cssText||``;if(n){let i=n.split(`;`).map(e=>e.trim()).filter(Boolean).map(t=>{let n=t.indexOf(`:`);if(n===-1)return t;let r=t.slice(0,n).trim(),i=t.slice(n+1).trim();return i?`${e(r)}: ${i};`:``}).filter(Boolean).join(` `);i&&(r+=` style="${t(i)}"`)}}for(let[t,a]of n.attributes){let n=i.has(t)?t:e(t);r+=o(n,a)}return r}if(n.attributes&&n.attributes.length)for(let e=0;e<n.attributes.length;e++){let t=n.attributes[e];t&&t.name&&(r+=o(t.name,t.value))}return r}const c=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`param`,`source`,`track`,`wbr`]);function l(e){if(`tagName`in e&&`children`in e){let t=e.children;if(Array.isArray(t))return t}if(`childNodes`in e){let t=e.childNodes;if(t&&(Array.isArray(t)||t.length!==void 0))return t}return[]}function u(e){if(e.nodeType===3)return n(e.textContent||``);if(e.nodeType===8)return`<!--${e.textContent||``}-->`;if(e.nodeType===1){let t=e,r=t.tagName.toLowerCase(),i=s(t);if(c.has(r))return`<${r}${i} />`;let a=``,o=l(t);if(o&&o.length>0)for(let e=0;e<o.length;e++){let t=o[e];t&&(a+=u(t))}else{let t=e.textContent;typeof t==`string`&&t&&(a=n(t))}return`<${r}${i}>${a}</${r}>`}if(e.nodeType===11){let t=``,n=l(e);if(n&&n.length>0)for(let e=0;e<n.length;e++){let r=n[e];r&&(t+=u(r))}return t}return``}function d(e){if(!e)return``;if(typeof e==`function`)try{let t=r(`div`);if(!t)throw Error(`Document is not available. Make sure polyfills are loaded.`);let n=e(t,0);return n&&typeof n==`object`&&`nodeType`in n?u(n):``}catch(e){return console.error(`Error rendering component to string:`,e),``}return`nodeType`in e?u(e):``}function f(e){return e.map(e=>d(e))}function p(e,t=`div`,n={}){let r=d(e);return`<${t}${Object.entries(n).map(([e,t])=>o(e,t)).join(``)}>${r}</${t}>`}function m(e){}exports.renderManyToString=f,exports.renderToString=d,exports.renderToStringWithContainer=p,exports.setSSRCollector=m;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e){let t=``;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);r>=65&&r<=90?(n>0&&(t+=`-`),t+=String.fromCharCode(r+32)):t+=e[n]}return t}function t(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#039;`};return e.replace(/[&<>"']/g,e=>t[e])}function n(e){return e.replace(/[&<>]/g,e=>e===`&`?`&amp;`:e===`<`?`&lt;`:`&gt;`)}function r(e){return globalThis.document?document.createElement(e):null}const i=new Set(`viewBox.preserveAspectRatio.markerWidth.markerHeight.gradientTransform.patternTransform.clipPathUnits.gradientUnits.patternUnits.pathLength.refX.refY.stdDeviation.baseFrequency.numOctaves.kernelMatrix.tableValues.targetX.targetY.specularExponent.specularConstant.diffuseConstant.surfaceScale.xChannelSelector.yChannelSelector.edgeMode.stitchTiles.spreadMethod.patternContentUnits.markerUnits.startOffset.textLength.lengthAdjust`.split(`.`)),a=new Set([`allowfullscreen`,`async`,`autofocus`,`autoplay`,`checked`,`controls`,`default`,`defer`,`disabled`,`formnovalidate`,`hidden`,`ismap`,`loop`,`multiple`,`muted`,`nomodule`,`novalidate`,`open`,`readonly`,`required`,`reversed`,`selected`]);function o(n,r){if(r==null||r===!1)return``;if(r===!0)return` ${n}`;if(a.has(n)){if(r===`false`)return``;if(r===`true`||r===``||r===n)return` ${n}`}if(n===`style`&&typeof r==`object`){let n=Object.entries(r).filter(([,e])=>e!=null&&e!==``).map(([t,n])=>`${e(t)}: ${n};`).join(` `);return n?` style="${t(n)}"`:``}return` ${n}="${t(String(r))}"`}function s(n){let r=``;if(`attributes`in n&&n.attributes instanceof Map){let a=n;if(a.id&&!n.attributes.has(`id`)&&(r+=o(`id`,a.id)),a.className&&!n.attributes.has(`class`)&&(r+=o(`class`,a.className)),!n.attributes.has(`style`)&&a.style){let n=a.style.cssText||``;if(n){let i=n.split(`;`).map(e=>e.trim()).filter(Boolean).map(t=>{let n=t.indexOf(`:`);if(n===-1)return t;let r=t.slice(0,n).trim(),i=t.slice(n+1).trim();return i?`${e(r)}: ${i};`:``}).filter(Boolean).join(` `);i&&(r+=` style="${t(i)}"`)}}for(let[t,a]of n.attributes){let n=i.has(t)?t:e(t);r+=o(n,a)}return r}if(n.attributes&&n.attributes.length)for(let e=0;e<n.attributes.length;e++){let t=n.attributes[e];t&&t.name&&(r+=o(t.name,t.value))}return r}const c=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`param`,`source`,`track`,`wbr`]);function l(e){if(`tagName`in e&&`children`in e){let t=e.children;if(Array.isArray(t))return t}if(`childNodes`in e){let t=e.childNodes;if(t&&(Array.isArray(t)||t.length!==void 0))return t}return[]}function u(e){if(e.nodeType===3)return n(e.textContent||``);if(e.nodeType===8)return`<!--${e.textContent||``}-->`;if(e.nodeType===1){let t=e,r=t.tagName.toLowerCase(),i=s(t);if(c.has(r))return`<${r}${i} />`;let a=``,o=l(t);if(o&&o.length>0)for(let e=0;e<o.length;e++){let t=o[e];t&&(a+=u(t))}else{let t=e.textContent;typeof t==`string`&&t&&(a=n(t))}return`<${r}${i}>${a}</${r}>`}if(e.nodeType===11){let t=``,n=l(e);if(n&&n.length>0)for(let e=0;e<n.length;e++){let r=n[e];r&&(t+=u(r))}return t}return``}function d(e){if(!e)return``;if(typeof e==`function`)try{let t=r(`div`);if(!t)throw Error(`Document is not available. Make sure polyfills are loaded.`);let n=e(t,0);return n&&typeof n==`object`&&`nodeType`in n?u(n):``}catch(e){return console.error(`Error rendering component to string:`,e),``}return`nodeType`in e?u(e):``}function f(e){return e.map(e=>d(e))}function p(e,t=`div`,n={}){let r=d(e);return`<${t}${Object.entries(n).map(([e,t])=>o(e,t)).join(``)}>${r}</${t}>`}function m(e){}const h=[],g=new Map;function _(){let e=h.join(``);for(let[t,n]of g)n.length>0&&(e+=t+`{`+n.join(``)+`}`);return e}exports.getCssText=_,exports.renderManyToString=f,exports.renderToString=d,exports.renderToStringWithContainer=p,exports.setSSRCollector=m;
2
2
  //# sourceMappingURL=nuclo.ssr.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"nuclo.ssr.cjs","names":[],"sources":["../../src/utility/stringUtils.ts","../../src/utility/dom.ts","../../src/ssr/renderToString.ts","../../src/style/cssGenerator.ts"],"sourcesContent":["/**\n * String utility functions\n */\n\n/**\n * Converts camelCase to kebab-case (optimized for performance)\n * Uses direct character code manipulation for maximum speed\n * @example camelToKebab('backgroundColor') => 'background-color'\n */\nexport function camelToKebab(str: string): string {\n let result = '';\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n // A-Z is 65-90, a-z is 97-122 (difference of 32)\n if (code >= 65 && code <= 90) {\n if (i > 0) result += '-';\n result += String.fromCharCode(code + 32);\n } else {\n result += str[i];\n }\n }\n return result;\n}\n\n/**\n * Escapes HTML special characters in attribute values (includes \" and ')\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;'\n };\n return text.replace(/[&<>\"']/g, (char) => map[char]);\n}\n\n/**\n * Escapes HTML special characters in text node content.\n * Only &, < and > need escaping — quotes are safe inside text nodes.\n */\nexport function escapeText(text: string): string {\n return text.replace(/[&<>]/g, (char) => (char === '&' ? '&amp;' : char === '<' ? '&lt;' : '&gt;'));\n}\n","import { logError } from \"./errorHandler\";\nimport { removeAllListeners } from \"./on\";\nimport { cleanupReactiveTextNode, cleanupReactiveElement } from \"../core/reactiveCleanup\";\nimport { unregisterConditionalNode } from \"./conditionalInfo\";\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * Creates an HTML element.\n * Wrapper for document.createElement with type safety.\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K\n): HTMLElementTagNameMap[K] | null;\nexport function createElement(tagName: string): ExpandedElement | null;\nexport function createElement(tagName: string): ExpandedElement | null {\n return globalThis.document ? document.createElement(tagName) as ExpandedElement : null;\n}\n\n/**\n * Creates an element in the given namespace (typically for SVG elements).\n * Wrapper for document.createElementNS with type safety.\n */\nexport function createElementNS(\n namespace: string,\n tagName: string\n): ExpandedElement | null {\n return globalThis.document ? document.createElementNS(namespace, tagName) as ExpandedElement : null;\n}\n\n/**\n * Creates a text node with the given content.\n * Wrapper for document.createTextNode.\n */\nexport function createTextNode(text: string): Text | null {\n return globalThis.document ? document.createTextNode(text) : null;\n}\n\n/**\n * Creates a document fragment.\n * Wrapper for document.createDocumentFragment.\n */\nexport function createDocumentFragment(): DocumentFragment | null {\n return globalThis.document ? document.createDocumentFragment() : null;\n}\n\nfunction safeAppendChild(parent: Element | Node, child: Node): boolean {\n try {\n parent.appendChild(child);\n return true;\n } catch (error) {\n logError('Failed to append child node', error);\n return false;\n }\n}\n\n/**\n * Recursively removes all event listeners and reactive subscriptions from a node and its descendants\n * to prevent memory leaks when elements are removed from the DOM.\n */\nfunction cleanupEventListeners(node: Node): void {\n // Clean up the node itself based on its type\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n // Remove all event listeners\n removeAllListeners(element);\n // Remove reactive attribute resolvers\n cleanupReactiveElement(element);\n // Remove conditional info\n unregisterConditionalNode(element);\n } else if (node.nodeType === Node.TEXT_NODE) {\n // Remove reactive text node info\n cleanupReactiveTextNode(node as Text);\n } else if (node.nodeType === Node.COMMENT_NODE) {\n // Remove conditional info from comment nodes (used by when/list)\n unregisterConditionalNode(node);\n }\n \n // Recursively clean up all child nodes\n if (node.childNodes && node.childNodes.length > 0) {\n for (let i = 0; i < node.childNodes.length; i++) {\n cleanupEventListeners(node.childNodes[i]);\n }\n }\n}\n\nexport function safeRemoveChild(child: Node): boolean {\n if (!child?.parentNode) return false;\n try {\n // Clean up all event listeners before removing the element\n cleanupEventListeners(child);\n child.parentNode.removeChild(child);\n return true;\n } catch (error) {\n logError('Failed to remove child node', error);\n return false;\n }\n}\n\nfunction safeInsertBefore(parent: Node, newNode: Node, referenceNode: Node | null): boolean {\n try {\n parent.insertBefore(newNode, referenceNode);\n return true;\n } catch (error) {\n logError('Failed to insert node before reference', error);\n return false;\n }\n}\n\nexport function createComment(text: string): Comment | null {\n return globalThis.document ? globalThis.document.createComment(text) : null;\n}\n\nexport function createConditionalComment(tagName: string, suffix = \"hidden\"): Comment | null {\n return globalThis.document ? globalThis.document.createComment(`conditional-${tagName}-${suffix}`) : null;\n}\n\nexport function createMarkerPair(prefix: string, id: number | string): { start: Comment; end: Comment } {\n const endComment = createComment(`${prefix}-end`);\n if (!endComment) throw new Error(\"Failed to create comment: document not available\");\n const startComment = createComment(`${prefix}-start-${id}`);\n if (!startComment) throw new Error(\"Failed to create comment: document not available\");\n return { start: startComment, end: endComment };\n}\n\nexport function clearBetweenMarkers(startMarker: Comment, endMarker: Comment): void {\n let current = startMarker.nextSibling;\n while (current && current !== endMarker) {\n const next = current.nextSibling;\n safeRemoveChild(current);\n current = next;\n }\n}\n\nexport function insertNodesBefore(nodes: Node[], referenceNode: Node): void {\n const parent = referenceNode.parentNode;\n if (parent) {\n for (let i = 0; i < nodes.length; i++) {\n safeInsertBefore(parent, nodes[i], referenceNode);\n }\n }\n}\n\nexport function appendChildren(\n parent: Element | Node,\n ...children: Array<Element | Node | string | null | undefined>\n): Element | Node {\n if (!parent) return parent;\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child != null) {\n let nodeToAppend: Node;\n\n if (typeof child === \"string\") {\n const textNode = createTextNode(child);\n if (textNode) {\n nodeToAppend = textNode;\n } else {\n continue;\n }\n } else {\n nodeToAppend = child as Node;\n }\n\n safeAppendChild(parent, nodeToAppend);\n }\n }\n\n return parent;\n}\n\nexport function isNodeConnected(node: Node | null | undefined): boolean {\n if (!node) return false;\n return node.isConnected === true;\n}\n\n/**\n * Safely replaces an old node with a new node in the DOM.\n * Returns true on success, false on failure (and logs the error).\n */\nexport function replaceNodeSafely(oldNode: Node, newNode: Node): boolean {\n if (!oldNode?.parentNode) return false;\n try {\n oldNode.parentNode.replaceChild(newNode, oldNode);\n return true;\n } catch (error) {\n logError(\"Error replacing conditional node\", error);\n return false;\n }\n}\n","/**\n * Server-Side Rendering (SSR) utilities for Nuclo\n * Renders Nuclo components to HTML strings in Node.js environment\n */\n\nimport { escapeHtml, escapeText, camelToKebab } from '../utility/stringUtils';\nimport { createElement } from '../utility/dom';\n\ntype RenderableInput =\n | NodeModFn<ElementTagName>\n | Element\n | Node\n | null\n | undefined;\n\n/**\n * SVG attributes that are natively camelCase and must NOT be converted to kebab-case.\n * Most SVG attributes are already kebab-case (stroke-width, fill-rule, etc.), but a\n * handful are defined as camelCase in the SVG spec and must be preserved.\n */\nconst SVG_PRESERVE_CASE_ATTRS = new Set([\n 'viewBox', 'preserveAspectRatio', 'markerWidth', 'markerHeight',\n 'gradientTransform', 'patternTransform', 'clipPathUnits', 'gradientUnits',\n 'patternUnits', 'pathLength', 'refX', 'refY', 'stdDeviation',\n 'baseFrequency', 'numOctaves', 'kernelMatrix', 'tableValues',\n 'targetX', 'targetY', 'specularExponent', 'specularConstant',\n 'diffuseConstant', 'surfaceScale', 'xChannelSelector', 'yChannelSelector',\n 'edgeMode', 'stitchTiles', 'spreadMethod', 'patternContentUnits',\n 'markerUnits', 'startOffset', 'textLength', 'lengthAdjust',\n]);\n\n/**\n * HTML boolean attributes — presence means true, absence means false.\n * When the stored value is the string \"true\" or \"false\" (from setAttribute),\n * we must re-apply boolean semantics instead of outputting the raw string.\n */\nconst HTML_BOOLEAN_ATTRIBUTES = new Set([\n 'allowfullscreen', 'async', 'autofocus', 'autoplay', 'checked', 'controls',\n 'default', 'defer', 'disabled', 'formnovalidate', 'hidden', 'ismap', 'loop',\n 'multiple', 'muted', 'nomodule', 'novalidate', 'open', 'readonly', 'required',\n 'reversed', 'selected',\n]);\n\n/**\n * Serializes a DOM attribute value\n */\nfunction serializeAttribute(name: string, value: unknown): string {\n if (value === null || value === undefined || value === false) {\n return '';\n }\n\n if (value === true) {\n return ` ${name}`;\n }\n\n // Boolean attributes stored as strings via setAttribute() need special handling\n if (HTML_BOOLEAN_ATTRIBUTES.has(name)) {\n if (value === 'false') return '';\n if (value === 'true' || value === '' || value === name) return ` ${name}`;\n }\n\n if (name === 'style' && typeof value === 'object') {\n const styleStr = Object.entries(value)\n .filter(([, val]) => val != null && val !== '')\n .map(([key, val]) => `${camelToKebab(key)}: ${val};`)\n .join(' ');\n return styleStr ? ` style=\"${escapeHtml(styleStr)}\"` : '';\n }\n\n return ` ${name}=\"${escapeHtml(String(value))}\"`;\n}\n\n/**\n * Serializes DOM element attributes to HTML string\n */\nfunction serializeAttributes(element: Element): string {\n let result = '';\n\n // Handle polyfill elements with Map-based attributes\n if ('attributes' in element && element.attributes instanceof Map) {\n const el = element as any;\n\n // id — may live on the property rather than in the Map\n if (el.id && !element.attributes.has('id')) {\n result += serializeAttribute('id', el.id);\n }\n\n // class — kept on .className, mirrored to Map only when setAttribute is used\n if (el.className && !element.attributes.has('class')) {\n result += serializeAttribute('class', el.className);\n }\n\n // style — lives on the Proxy, not in the attributes Map.\n // cssText returns camelCase keys (\"backgroundColor: red\"), so convert them.\n if (!element.attributes.has('style') && el.style) {\n const rawCssText: string = el.style.cssText || '';\n if (rawCssText) {\n const kebabStyle = rawCssText\n .split(';')\n .map((decl: string) => decl.trim())\n .filter(Boolean)\n .map((decl: string) => {\n const colonIdx = decl.indexOf(':');\n if (colonIdx === -1) return decl;\n const key = decl.slice(0, colonIdx).trim();\n const val = decl.slice(colonIdx + 1).trim();\n // Skip declarations with empty values (e.g. reactive styles that resolved to undefined)\n if (!val) return '';\n return `${camelToKebab(key)}: ${val};`;\n })\n .filter(Boolean)\n .join(' ');\n if (kebabStyle) {\n result += ` style=\"${escapeHtml(kebabStyle)}\"`;\n }\n }\n }\n\n // All remaining attributes from the Map\n // Convert camelCase ARIA/HTML attribute names (e.g. ariaLabel → aria-label) that the\n // polyfill stores as-is because NucloElement lacks the browser property mappings.\n // SVG attributes that are natively camelCase (e.g. viewBox, preserveAspectRatio) must\n // NOT be converted — they are stored via setAttribute() as-is.\n for (const [name, value] of element.attributes) {\n const htmlName = SVG_PRESERVE_CASE_ATTRS.has(name) ? name : camelToKebab(name);\n result += serializeAttribute(htmlName, value);\n }\n return result;\n }\n\n // Handle browser elements with NamedNodeMap attributes\n if (element.attributes && element.attributes.length) {\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr && attr.name) {\n result += serializeAttribute(attr.name, attr.value);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Self-closing HTML tags that don't have closing tags\n */\nconst VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]);\n\n/**\n * Get child nodes from a node (handles both browser and polyfill elements).\n *\n * NucloElement stores ALL children (elements, text, comments) in a plain Array\n * called `children` — it is the authoritative list. DocumentFragments in the\n * polyfill also have a `children` array, but it only holds Element children;\n * their full set of nodes lives in `childNodes`. We therefore only prefer\n * `children` when the node is an actual element (has `tagName`).\n */\nfunction getChildNodes(node: Node): ArrayLike<Node> {\n // NucloElement: tagName exists and children is a plain Array containing every node type\n if ('tagName' in node && 'children' in node) {\n const children = (node as any).children;\n if (Array.isArray(children)) {\n return children as ArrayLike<Node>;\n }\n }\n // DocumentFragments and browser elements: use childNodes\n if ('childNodes' in node) {\n const childNodes = (node as any).childNodes;\n if (childNodes && (Array.isArray(childNodes) || childNodes.length !== undefined)) {\n return childNodes;\n }\n }\n return [] as ArrayLike<Node>;\n}\n\n/**\n * Serializes a DOM node to HTML string\n */\nfunction serializeNode(node: Node): string {\n // Text node — only & < > need escaping; quotes are safe in text content\n if (node.nodeType === 3) { // Node.TEXT_NODE\n return escapeText(node.textContent || '');\n }\n\n // Comment node\n if (node.nodeType === 8) { // Node.COMMENT_NODE\n return `<!--${node.textContent || ''}-->`;\n }\n\n // Element node\n if (node.nodeType === 1) { // Node.ELEMENT_NODE\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n const attributes = serializeAttributes(element);\n\n // Self-closing tags\n if (VOID_ELEMENTS.has(tagName)) {\n return `<${tagName}${attributes} />`;\n }\n\n // Regular elements with children\n let childrenHtml = '';\n const childNodes = getChildNodes(element);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n childrenHtml += serializeNode(child);\n }\n }\n } else {\n // Fallback: textContent set directly on the element (e.g. el.textContent = \"...\")\n const tc = (node as any).textContent;\n if (typeof tc === 'string' && tc) {\n childrenHtml = escapeText(tc);\n }\n }\n\n return `<${tagName}${attributes}>${childrenHtml}</${tagName}>`;\n }\n\n // Document fragment\n if (node.nodeType === 11) { // Node.DOCUMENT_FRAGMENT_NODE\n let result = '';\n const childNodes = getChildNodes(node);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n result += serializeNode(child);\n }\n }\n }\n return result;\n }\n\n return '';\n}\n\n/**\n * Renders a Nuclo component to an HTML string for server-side rendering\n *\n * @param input - A Nuclo component function, DOM element, or node\n * @returns HTML string representation of the component\n *\n * @example\n * ```ts\n * import { renderToString } from 'nuclo/ssr';\n * import { div } from 'nuclo';\n *\n * const html = renderToString(\n * div(\"Hello, World!\")\n * );\n * // Returns: '<div>Hello, World!</div>'\n * ```\n */\nexport function renderToString(input: RenderableInput): string {\n if (!input) return '';\n\n if (typeof input === 'function') {\n try {\n const container = createElement('div');\n if (!container) throw new Error('Document is not available. Make sure polyfills are loaded.');\n const element = input(container as ExpandedElement<ElementTagName>, 0);\n return element && typeof element === 'object' && 'nodeType' in element ? serializeNode(element as Node) : '';\n } catch (error) {\n console.error('Error rendering component to string:', error);\n return '';\n }\n }\n\n if ('nodeType' in input) {\n return serializeNode(input as Node);\n }\n\n return '';\n}\n\n/**\n * Renders multiple Nuclo components to HTML strings\n *\n * @param inputs - Array of Nuclo components\n * @returns Array of HTML strings\n */\nexport function renderManyToString(inputs: RenderableInput[]): string[] {\n return inputs.map(input => renderToString(input));\n}\n\n/**\n * Renders a Nuclo component and wraps it in a container element\n *\n * @param input - A Nuclo component\n * @param containerTag - The tag name for the container (default: 'div')\n * @param containerAttrs - Attributes for the container element\n * @returns HTML string with container wrapper\n */\nexport function renderToStringWithContainer(\n input: RenderableInput,\n containerTag: string = 'div',\n containerAttrs: Record<string, string> = {}\n): string {\n const content = renderToString(input);\n const attrs = Object.entries(containerAttrs)\n .map(([key, value]) => serializeAttribute(key, value))\n .join('');\n\n return `<${containerTag}${attrs}>${content}</${containerTag}>`;\n}\n","import { createElement } from \"../utility/dom\";\nimport { isBrowser } from \"../utility/environment\";\n\ntype AtRuleType = 'media' | 'container' | 'supports' | 'style' | 'pseudo';\n\n// SSR collector — a single function reference installed once at server startup.\n// Keeping this as a plain function slot (no global Set, no ALS) means the nuclo\n// package stays browser-safe and free of Node-specific imports. The server is\n// responsible for wiring in whatever collection strategy it wants (e.g. an\n// AsyncLocalStorage-backed dispatcher). null = no-op (browser default).\ntype SSRCollector = (rule: string) => void;\nlet _ssrCollector: SSRCollector | null = null;\n\n/**\n * Install a CSS rule collector for SSR. Call once at server startup with a\n * function that receives every rule string emitted by cn() / createStyleQueries.\n * Pass null to remove the collector (not normally needed).\n */\nexport function setSSRCollector(fn: SSRCollector | null): void {\n\t_ssrCollector = fn;\n}\n\nfunction isAtRule(rule: CSSRule): boolean {\n\treturn rule instanceof CSSMediaRule ||\n\t\trule instanceof CSSContainerRule ||\n\t\trule instanceof CSSSupportsRule;\n}\n\nfunction matchesAtRule(rule: CSSRule, atRuleType: AtRuleType, condition: string): boolean {\n\tif (atRuleType === 'media' && rule instanceof CSSMediaRule) {\n\t\treturn rule.media.mediaText === condition;\n\t}\n\tif (atRuleType === 'container' && rule instanceof CSSContainerRule) {\n\t\treturn rule.conditionText === condition;\n\t}\n\tif (atRuleType === 'supports' && rule instanceof CSSSupportsRule) {\n\t\treturn rule.conditionText === condition;\n\t}\n\treturn false;\n}\n\nfunction findStyleRule(rules: CSSRuleList, selector: string): CSSStyleRule | null {\n\tfor (let i = 0; i < rules.length; i++) {\n\t\tconst rule = rules[i];\n\t\tif (rule instanceof CSSStyleRule && rule.selectorText === selector) {\n\t\t\treturn rule;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction updateRuleStyles(rule: CSSStyleRule, styles: Record<string, string>): void {\n\trule.style.cssText = '';\n\tfor (const [property, value] of Object.entries(styles)) {\n\t\trule.style.setProperty(property, value);\n\t}\n}\n\nfunction getStyleSheet(): HTMLStyleElement | null {\n\tif (!isBrowser) return null;\n\tlet el = document.querySelector(\"#nuclo-styles\") as HTMLStyleElement;\n\tif (!el) {\n\t\tel = createElement(\"style\") as HTMLStyleElement;\n\t\tel.id = \"nuclo-styles\";\n\t\tdocument.head.appendChild(el);\n\t}\n\treturn el;\n}\n\nfunction buildRulesString(styles: Record<string, string>): string {\n\tconst entries = Object.entries(styles);\n\tlet result = '';\n\tfor (let i = 0; i < entries.length; i++) {\n\t\tif (i > 0) result += '; ';\n\t\tresult += `${entries[i][0]}: ${entries[i][1]}`;\n\t}\n\treturn result;\n}\n\nexport function classExistsInDOM(className: string, condition?: string, atRuleType: AtRuleType = 'media', pseudoClass?: string): boolean {\n\tif (!isBrowser) return false;\n\tconst styleSheet = document.querySelector(\"#nuclo-styles\") as HTMLStyleElement;\n\tif (!styleSheet?.sheet) return false;\n\n\tconst rules = styleSheet.sheet.cssRules;\n\n\tif (pseudoClass) {\n\t\treturn findStyleRule(rules, `.${className}${pseudoClass}`) !== null;\n\t}\n\n\tif (condition) {\n\t\tfor (let i = 0; i < rules.length; i++) {\n\t\t\tif (matchesAtRule(rules[i], atRuleType, condition)) {\n\t\t\t\treturn findStyleRule((rules[i] as CSSGroupingRule).cssRules, `.${className}`) !== null;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn findStyleRule(rules, `.${className}`) !== null;\n}\n\nexport function createCSSClassWithStyles(\n\tclassName: string,\n\tstyles: Record<string, string>,\n\tcondition?: string,\n\tatRuleType: AtRuleType = 'media',\n\tpseudoClass?: string\n): void {\n\tif (!isBrowser) {\n\t\tconst rulesStr = buildRulesString(styles);\n\t\tlet rule: string;\n\t\tif (pseudoClass) {\n\t\t\trule = `.${className}${pseudoClass} { ${rulesStr} }`;\n\t\t} else if (condition) {\n\t\t\tconst prefix = atRuleType === 'container' ? '@container'\n\t\t\t\t: atRuleType === 'supports' ? '@supports'\n\t\t\t\t: '@media';\n\t\t\trule = `${prefix} ${condition} { .${className} { ${rulesStr} } }`;\n\t\t} else {\n\t\t\trule = `.${className} { ${rulesStr} }`;\n\t\t}\n\t\t_ssrCollector?.(rule);\n\t\treturn;\n\t}\n\n\tconst styleSheet = getStyleSheet();\n\tif (!styleSheet) return;\n\n\tconst sheet = styleSheet.sheet;\n\tif (!sheet) return;\n\n\tconst rulesStr = buildRulesString(styles);\n\n\tif (pseudoClass) {\n\t\tconst selector = `.${className}${pseudoClass}`;\n\t\tconst allRules = sheet.cssRules;\n\t\tconst rulesLength = allRules.length;\n\n\t\tlet existingRule: CSSStyleRule | null = null;\n\t\tlet insertIndex = rulesLength;\n\n\t\tfor (let i = 0; i < rulesLength; i++) {\n\t\t\tconst rule = allRules[i];\n\t\t\tif (rule instanceof CSSStyleRule) {\n\t\t\t\tif (rule.selectorText === selector) {\n\t\t\t\t\texistingRule = rule;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!rule.selectorText.includes(':')) {\n\t\t\t\t\tinsertIndex = i + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (existingRule) {\n\t\t\tupdateRuleStyles(existingRule, styles);\n\t\t} else {\n\t\t\tsheet.insertRule(`${selector} { ${rulesStr} }`, insertIndex);\n\t\t}\n\t\treturn;\n\t}\n\n\tif (condition) {\n\t\tconst existingRules = sheet.cssRules;\n\t\tconst rulesLength = existingRules.length;\n\t\tlet groupingRule: CSSGroupingRule | null = null;\n\n\t\tfor (let i = 0; i < rulesLength; i++) {\n\t\t\tif (matchesAtRule(existingRules[i], atRuleType, condition)) {\n\t\t\t\tgroupingRule = existingRules[i] as CSSGroupingRule;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!groupingRule) {\n\t\t\tlet insertIndex = rulesLength;\n\t\t\tfor (let i = rulesLength - 1; i >= 0; i--) {\n\t\t\t\tif (isAtRule(existingRules[i]) || existingRules[i] instanceof CSSStyleRule) {\n\t\t\t\t\tinsertIndex = i + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst atRulePrefix = atRuleType === 'media' ? '@media' :\n\t\t\t\tatRuleType === 'container' ? '@container' :\n\t\t\t\tatRuleType === 'supports' ? '@supports' :\n\t\t\t\t'@media';\n\n\t\t\tsheet.insertRule(`${atRulePrefix} ${condition} {}`, insertIndex);\n\t\t\tgroupingRule = sheet.cssRules[insertIndex] as CSSGroupingRule;\n\t\t}\n\n\t\tconst existingRule = findStyleRule(groupingRule.cssRules, `.${className}`);\n\t\tif (existingRule) {\n\t\t\tupdateRuleStyles(existingRule, styles);\n\t\t} else {\n\t\t\tgroupingRule.insertRule(`.${className} { ${rulesStr} }`, groupingRule.cssRules.length);\n\t\t}\n\t} else {\n\t\tlet existingRule: CSSStyleRule | null = null;\n\t\tlet insertIndex = 0;\n\n\t\tconst allRules = sheet.cssRules;\n\t\tconst rulesLength = allRules.length;\n\t\tfor (let i = 0; i < rulesLength; i++) {\n\t\t\tconst rule = allRules[i];\n\t\t\tif (rule instanceof CSSStyleRule && rule.selectorText === `.${className}`) {\n\t\t\t\texistingRule = rule;\n\t\t\t\tinsertIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!isAtRule(rule)) {\n\t\t\t\tinsertIndex = i + 1;\n\t\t\t}\n\t\t}\n\n\t\tif (existingRule) {\n\t\t\tupdateRuleStyles(existingRule, styles);\n\t\t} else {\n\t\t\tsheet.insertRule(`.${className} { ${rulesStr} }`, insertIndex);\n\t\t}\n\t}\n}\n\nexport function createCSSClass(className: string, styles: Record<string, string>): void {\n\tcreateCSSClassWithStyles(className, styles);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"nuclo.ssr.cjs","names":[],"sources":["../../src/utility/stringUtils.ts","../../src/utility/dom.ts","../../src/ssr/renderToString.ts","../../src/style/engine.ts"],"sourcesContent":["/**\n * String utility functions\n */\n\n/**\n * Converts camelCase to kebab-case (optimized for performance)\n * Uses direct character code manipulation for maximum speed\n * @example camelToKebab('backgroundColor') => 'background-color'\n */\nexport function camelToKebab(str: string): string {\n let result = '';\n for (let i = 0; i < str.length; i++) {\n const code = str.charCodeAt(i);\n // A-Z is 65-90, a-z is 97-122 (difference of 32)\n if (code >= 65 && code <= 90) {\n if (i > 0) result += '-';\n result += String.fromCharCode(code + 32);\n } else {\n result += str[i];\n }\n }\n return result;\n}\n\n/**\n * Escapes HTML special characters in attribute values (includes \" and ')\n */\nexport function escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;'\n };\n return text.replace(/[&<>\"']/g, (char) => map[char]);\n}\n\n/**\n * Escapes HTML special characters in text node content.\n * Only &, < and > need escaping — quotes are safe inside text nodes.\n */\nexport function escapeText(text: string): string {\n return text.replace(/[&<>]/g, (char) => (char === '&' ? '&amp;' : char === '<' ? '&lt;' : '&gt;'));\n}\n","import { logError } from \"./errorHandler\";\nimport { removeAllListeners } from \"./on\";\nimport { cleanupReactiveTextNode, cleanupReactiveElement } from \"../core/reactiveCleanup\";\nimport { unregisterConditionalNode } from \"./conditionalInfo\";\n\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\n/**\n * Creates an HTML element.\n * Wrapper for document.createElement with type safety.\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tagName: K\n): HTMLElementTagNameMap[K] | null;\nexport function createElement(tagName: string): ExpandedElement | null;\nexport function createElement(tagName: string): ExpandedElement | null {\n return globalThis.document ? document.createElement(tagName) as ExpandedElement : null;\n}\n\n/**\n * Creates an element in the given namespace (typically for SVG elements).\n * Wrapper for document.createElementNS with type safety.\n */\nexport function createElementNS(\n namespace: string,\n tagName: string\n): ExpandedElement | null {\n return globalThis.document ? document.createElementNS(namespace, tagName) as ExpandedElement : null;\n}\n\n/**\n * Creates a text node with the given content.\n * Wrapper for document.createTextNode.\n */\nexport function createTextNode(text: string): Text | null {\n return globalThis.document ? document.createTextNode(text) : null;\n}\n\n/**\n * Creates a document fragment.\n * Wrapper for document.createDocumentFragment.\n */\nexport function createDocumentFragment(): DocumentFragment | null {\n return globalThis.document ? document.createDocumentFragment() : null;\n}\n\nfunction safeAppendChild(parent: Element | Node, child: Node): boolean {\n try {\n parent.appendChild(child);\n return true;\n } catch (error) {\n logError('Failed to append child node', error);\n return false;\n }\n}\n\n/**\n * Recursively removes all event listeners and reactive subscriptions from a node and its descendants\n * to prevent memory leaks when elements are removed from the DOM.\n */\nfunction cleanupEventListeners(node: Node): void {\n // Clean up the node itself based on its type\n if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n // Remove all event listeners\n removeAllListeners(element);\n // Remove reactive attribute resolvers\n cleanupReactiveElement(element);\n // Remove conditional info\n unregisterConditionalNode(element);\n } else if (node.nodeType === Node.TEXT_NODE) {\n // Remove reactive text node info\n cleanupReactiveTextNode(node as Text);\n } else if (node.nodeType === Node.COMMENT_NODE) {\n // Remove conditional info from comment nodes (used by when/list)\n unregisterConditionalNode(node);\n }\n \n // Recursively clean up all child nodes\n if (node.childNodes && node.childNodes.length > 0) {\n for (let i = 0; i < node.childNodes.length; i++) {\n cleanupEventListeners(node.childNodes[i]);\n }\n }\n}\n\nexport function safeRemoveChild(child: Node): boolean {\n if (!child?.parentNode) return false;\n try {\n // Clean up all event listeners before removing the element\n cleanupEventListeners(child);\n child.parentNode.removeChild(child);\n return true;\n } catch (error) {\n logError('Failed to remove child node', error);\n return false;\n }\n}\n\nfunction safeInsertBefore(parent: Node, newNode: Node, referenceNode: Node | null): boolean {\n try {\n parent.insertBefore(newNode, referenceNode);\n return true;\n } catch (error) {\n logError('Failed to insert node before reference', error);\n return false;\n }\n}\n\nexport function createComment(text: string): Comment | null {\n return globalThis.document ? globalThis.document.createComment(text) : null;\n}\n\nexport function createConditionalComment(tagName: string, suffix = \"hidden\"): Comment | null {\n return globalThis.document ? globalThis.document.createComment(`conditional-${tagName}-${suffix}`) : null;\n}\n\nexport function createMarkerPair(prefix: string, id: number | string): { start: Comment; end: Comment } {\n const endComment = createComment(`${prefix}-end`);\n if (!endComment) throw new Error(\"Failed to create comment: document not available\");\n const startComment = createComment(`${prefix}-start-${id}`);\n if (!startComment) throw new Error(\"Failed to create comment: document not available\");\n return { start: startComment, end: endComment };\n}\n\nexport function clearBetweenMarkers(startMarker: Comment, endMarker: Comment): void {\n let current = startMarker.nextSibling;\n while (current && current !== endMarker) {\n const next = current.nextSibling;\n safeRemoveChild(current);\n current = next;\n }\n}\n\nexport function insertNodesBefore(nodes: Node[], referenceNode: Node): void {\n const parent = referenceNode.parentNode;\n if (parent) {\n for (let i = 0; i < nodes.length; i++) {\n safeInsertBefore(parent, nodes[i], referenceNode);\n }\n }\n}\n\nexport function appendChildren(\n parent: Element | Node,\n ...children: Array<Element | Node | string | null | undefined>\n): Element | Node {\n if (!parent) return parent;\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (child != null) {\n let nodeToAppend: Node;\n\n if (typeof child === \"string\") {\n const textNode = createTextNode(child);\n if (textNode) {\n nodeToAppend = textNode;\n } else {\n continue;\n }\n } else {\n nodeToAppend = child as Node;\n }\n\n safeAppendChild(parent, nodeToAppend);\n }\n }\n\n return parent;\n}\n\nexport function isNodeConnected(node: Node | null | undefined): boolean {\n if (!node) return false;\n return node.isConnected === true;\n}\n\n/**\n * Safely replaces an old node with a new node in the DOM.\n * Returns true on success, false on failure (and logs the error).\n */\nexport function replaceNodeSafely(oldNode: Node, newNode: Node): boolean {\n if (!oldNode?.parentNode) return false;\n try {\n oldNode.parentNode.replaceChild(newNode, oldNode);\n return true;\n } catch (error) {\n logError(\"Error replacing conditional node\", error);\n return false;\n }\n}\n","/**\n * Server-Side Rendering (SSR) utilities for Nuclo\n * Renders Nuclo components to HTML strings in Node.js environment\n */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { escapeHtml, escapeText, camelToKebab } from '../utility/stringUtils';\nimport { createElement } from '../utility/dom';\n\ntype RenderableInput =\n | NodeModFn<ElementTagName>\n | Element\n | Node\n | null\n | undefined;\n\n/**\n * SVG attributes that are natively camelCase and must NOT be converted to kebab-case.\n * Most SVG attributes are already kebab-case (stroke-width, fill-rule, etc.), but a\n * handful are defined as camelCase in the SVG spec and must be preserved.\n */\nconst SVG_PRESERVE_CASE_ATTRS = new Set([\n 'viewBox', 'preserveAspectRatio', 'markerWidth', 'markerHeight',\n 'gradientTransform', 'patternTransform', 'clipPathUnits', 'gradientUnits',\n 'patternUnits', 'pathLength', 'refX', 'refY', 'stdDeviation',\n 'baseFrequency', 'numOctaves', 'kernelMatrix', 'tableValues',\n 'targetX', 'targetY', 'specularExponent', 'specularConstant',\n 'diffuseConstant', 'surfaceScale', 'xChannelSelector', 'yChannelSelector',\n 'edgeMode', 'stitchTiles', 'spreadMethod', 'patternContentUnits',\n 'markerUnits', 'startOffset', 'textLength', 'lengthAdjust',\n]);\n\n/**\n * HTML boolean attributes — presence means true, absence means false.\n * When the stored value is the string \"true\" or \"false\" (from setAttribute),\n * we must re-apply boolean semantics instead of outputting the raw string.\n */\nconst HTML_BOOLEAN_ATTRIBUTES = new Set([\n 'allowfullscreen', 'async', 'autofocus', 'autoplay', 'checked', 'controls',\n 'default', 'defer', 'disabled', 'formnovalidate', 'hidden', 'ismap', 'loop',\n 'multiple', 'muted', 'nomodule', 'novalidate', 'open', 'readonly', 'required',\n 'reversed', 'selected',\n]);\n\n/**\n * Serializes a DOM attribute value\n */\nfunction serializeAttribute(name: string, value: unknown): string {\n if (value === null || value === undefined || value === false) {\n return '';\n }\n\n if (value === true) {\n return ` ${name}`;\n }\n\n // Boolean attributes stored as strings via setAttribute() need special handling\n if (HTML_BOOLEAN_ATTRIBUTES.has(name)) {\n if (value === 'false') return '';\n if (value === 'true' || value === '' || value === name) return ` ${name}`;\n }\n\n if (name === 'style' && typeof value === 'object') {\n const styleStr = Object.entries(value)\n .filter(([, val]) => val != null && val !== '')\n .map(([key, val]) => `${camelToKebab(key)}: ${val};`)\n .join(' ');\n return styleStr ? ` style=\"${escapeHtml(styleStr)}\"` : '';\n }\n\n return ` ${name}=\"${escapeHtml(String(value))}\"`;\n}\n\n/**\n * Serializes DOM element attributes to HTML string\n */\nfunction serializeAttributes(element: Element): string {\n let result = '';\n\n // Handle polyfill elements with Map-based attributes\n if ('attributes' in element && element.attributes instanceof Map) {\n const el = element as any;\n\n // id — may live on the property rather than in the Map\n if (el.id && !element.attributes.has('id')) {\n result += serializeAttribute('id', el.id);\n }\n\n // class — kept on .className, mirrored to Map only when setAttribute is used\n if (el.className && !element.attributes.has('class')) {\n result += serializeAttribute('class', el.className);\n }\n\n // style — lives on the Proxy, not in the attributes Map.\n // cssText returns camelCase keys (\"backgroundColor: red\"), so convert them.\n if (!element.attributes.has('style') && el.style) {\n const rawCssText: string = el.style.cssText || '';\n if (rawCssText) {\n const kebabStyle = rawCssText\n .split(';')\n .map((decl: string) => decl.trim())\n .filter(Boolean)\n .map((decl: string) => {\n const colonIdx = decl.indexOf(':');\n if (colonIdx === -1) return decl;\n const key = decl.slice(0, colonIdx).trim();\n const val = decl.slice(colonIdx + 1).trim();\n // Skip declarations with empty values (e.g. reactive styles that resolved to undefined)\n if (!val) return '';\n return `${camelToKebab(key)}: ${val};`;\n })\n .filter(Boolean)\n .join(' ');\n if (kebabStyle) {\n result += ` style=\"${escapeHtml(kebabStyle)}\"`;\n }\n }\n }\n\n // All remaining attributes from the Map\n // Convert camelCase ARIA/HTML attribute names (e.g. ariaLabel → aria-label) that the\n // polyfill stores as-is because NucloElement lacks the browser property mappings.\n // SVG attributes that are natively camelCase (e.g. viewBox, preserveAspectRatio) must\n // NOT be converted — they are stored via setAttribute() as-is.\n for (const [name, value] of element.attributes) {\n const htmlName = SVG_PRESERVE_CASE_ATTRS.has(name) ? name : camelToKebab(name);\n result += serializeAttribute(htmlName, value);\n }\n return result;\n }\n\n // Handle browser elements with NamedNodeMap attributes\n if (element.attributes && element.attributes.length) {\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr && attr.name) {\n result += serializeAttribute(attr.name, attr.value);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Self-closing HTML tags that don't have closing tags\n */\nconst VOID_ELEMENTS = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n]);\n\n/**\n * Get child nodes from a node (handles both browser and polyfill elements).\n *\n * NucloElement stores ALL children (elements, text, comments) in a plain Array\n * called `children` — it is the authoritative list. DocumentFragments in the\n * polyfill also have a `children` array, but it only holds Element children;\n * their full set of nodes lives in `childNodes`. We therefore only prefer\n * `children` when the node is an actual element (has `tagName`).\n */\nfunction getChildNodes(node: Node): ArrayLike<Node> {\n // NucloElement: tagName exists and children is a plain Array containing every node type\n if ('tagName' in node && 'children' in node) {\n const children = (node as any).children;\n if (Array.isArray(children)) {\n return children as ArrayLike<Node>;\n }\n }\n // DocumentFragments and browser elements: use childNodes\n if ('childNodes' in node) {\n const childNodes = (node as any).childNodes;\n if (childNodes && (Array.isArray(childNodes) || childNodes.length !== undefined)) {\n return childNodes;\n }\n }\n return [] as ArrayLike<Node>;\n}\n\n/**\n * Serializes a DOM node to HTML string\n */\nfunction serializeNode(node: Node): string {\n // Text node — only & < > need escaping; quotes are safe in text content\n if (node.nodeType === 3) { // Node.TEXT_NODE\n return escapeText(node.textContent || '');\n }\n\n // Comment node\n if (node.nodeType === 8) { // Node.COMMENT_NODE\n return `<!--${node.textContent || ''}-->`;\n }\n\n // Element node\n if (node.nodeType === 1) { // Node.ELEMENT_NODE\n const element = node as Element;\n const tagName = element.tagName.toLowerCase();\n const attributes = serializeAttributes(element);\n\n // Self-closing tags\n if (VOID_ELEMENTS.has(tagName)) {\n return `<${tagName}${attributes} />`;\n }\n\n // Regular elements with children\n let childrenHtml = '';\n const childNodes = getChildNodes(element);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n childrenHtml += serializeNode(child);\n }\n }\n } else {\n // Fallback: textContent set directly on the element (e.g. el.textContent = \"...\")\n const tc = (node as any).textContent;\n if (typeof tc === 'string' && tc) {\n childrenHtml = escapeText(tc);\n }\n }\n\n return `<${tagName}${attributes}>${childrenHtml}</${tagName}>`;\n }\n\n // Document fragment\n if (node.nodeType === 11) { // Node.DOCUMENT_FRAGMENT_NODE\n let result = '';\n const childNodes = getChildNodes(node);\n if (childNodes && childNodes.length > 0) {\n for (let i = 0; i < childNodes.length; i++) {\n const child = childNodes[i];\n if (child) {\n result += serializeNode(child);\n }\n }\n }\n return result;\n }\n\n return '';\n}\n\n/**\n * Renders a Nuclo component to an HTML string for server-side rendering\n *\n * @param input - A Nuclo component function, DOM element, or node\n * @returns HTML string representation of the component\n *\n * @example\n * ```ts\n * import { renderToString } from 'nuclo/ssr';\n * import { div } from 'nuclo';\n *\n * const html = renderToString(\n * div(\"Hello, World!\")\n * );\n * // Returns: '<div>Hello, World!</div>'\n * ```\n */\nexport function renderToString(input: RenderableInput): string {\n if (!input) return '';\n\n if (typeof input === 'function') {\n try {\n const container = createElement('div');\n if (!container) throw new Error('Document is not available. Make sure polyfills are loaded.');\n const element = input(container as ExpandedElement<ElementTagName>, 0);\n return element && typeof element === 'object' && 'nodeType' in element ? serializeNode(element as Node) : '';\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Error rendering component to string:', error);\n return '';\n }\n }\n\n if ('nodeType' in input) {\n return serializeNode(input as Node);\n }\n\n return '';\n}\n\n/**\n * Renders multiple Nuclo components to HTML strings\n *\n * @param inputs - Array of Nuclo components\n * @returns Array of HTML strings\n */\nexport function renderManyToString(inputs: RenderableInput[]): string[] {\n return inputs.map(input => renderToString(input));\n}\n\n/**\n * Renders a Nuclo component and wraps it in a container element\n *\n * @param input - A Nuclo component\n * @param containerTag - The tag name for the container (default: 'div')\n * @param containerAttrs - Attributes for the container element\n * @returns HTML string with container wrapper\n */\nexport function renderToStringWithContainer(\n input: RenderableInput,\n containerTag: string = 'div',\n containerAttrs: Record<string, string> = {}\n): string {\n const content = renderToString(input);\n const attrs = Object.entries(containerAttrs)\n .map(([key, value]) => serializeAttribute(key, value))\n .join('');\n\n return `<${containerTag}${attrs}>${content}</${containerTag}>`;\n}\n","/**\n * Shared atomic-CSS engine state.\n *\n * One stylesheet, one rule registry, shared by every `createCss` instance so\n * identical declarations dedupe globally and cascade order stays deterministic:\n * base rules first (insertion order), then one grouping rule per at-rule query\n * in registration order (theme `screens` order).\n *\n * Browser: rules are injected through CSSOM with O(1) appends — no rescans.\n * SSR: rules accumulate in the registry; `getCssText()` serializes them.\n */\n\n// SSR collector — optional hook that receives every newly minted rule string\n// (wrapped in its at-rule, if any). Installed once at server startup.\ntype SSRCollector = (rule: string) => void;\nlet ssrCollector: SSRCollector | null = null;\n\nexport function setSSRCollector(fn: SSRCollector | null): void {\n\tssrCollector = fn;\n}\n\n// Registry — the source of truth for all generated CSS.\n// atomCache: declaration key -> class name (dedup)\n// atomOwner: class name -> conflict key (query|suffix|property), used by cx()\nconst atomCache = new Map<string, string>();\nconst atomOwner = new Map<string, string>();\nconst rawKeys = new Set<string>();\nconst baseRules: string[] = [];\nconst queryRules = new Map<string, string[]>();\n\n// Browser CSSOM state. Base rules occupy [0, baseRuleCount); grouping rules\n// (one per query, created in registration order) live after them. CSSRule\n// references stay live when indices shift, so insertion never rescans.\nlet sheet: CSSStyleSheet | null = null;\nlet sheetDocument: Document | null = null;\nlet baseRuleCount = 0;\nconst groupRules = new Map<string, CSSGroupingRule>();\n\n/** Pre-register at-rule queries so their cascade order follows theme order. */\nexport function registerQueries(queries: Iterable<string>): void {\n\tfor (const query of queries) {\n\t\tif (!queryRules.has(query)) queryRules.set(query, []);\n\t}\n}\n\nfunction createGroup(s: CSSStyleSheet, query: string): CSSGroupingRule | null {\n\ttry {\n\t\tconst idx = s.cssRules.length;\n\t\ts.insertRule(query + \"{}\", idx);\n\t\tconst group = s.cssRules[idx] as CSSGroupingRule;\n\t\tgroupRules.set(query, group);\n\t\treturn group;\n\t} catch {\n\t\treturn null; // unsupported at-rule in this environment\n\t}\n}\n\nfunction insertBase(s: CSSStyleSheet, rule: string): void {\n\ttry {\n\t\ts.insertRule(rule, baseRuleCount);\n\t\tbaseRuleCount++;\n\t} catch {\n\t\t// Invalid value/selector: drop the declaration, like browsers do for bad CSS.\n\t}\n}\n\n/**\n * Returns the live stylesheet, (re)binding when the document changes — e.g.\n * fresh jsdom documents between tests. Rebinding replays the whole registry,\n * which replaces v1's per-call classExistsInDOM() DOM scans with a single\n * replay per document.\n */\nfunction ensureSheet(): CSSStyleSheet | null {\n\tif (typeof document === \"undefined\") return null;\n\t// The nuclo SSR polyfill provides a document without getElementById — in\n\t// that context rules accumulate in the registry for getCssText() only.\n\tif (typeof document.getElementById !== \"function\") return null;\n\tif (sheet && sheetDocument === document && sheet.ownerNode && (sheet.ownerNode as Element).isConnected) {\n\t\treturn sheet;\n\t}\n\tlet el = document.getElementById(\"nuclo-styles\") as HTMLStyleElement | null;\n\tif (!el) {\n\t\tel = document.createElement(\"style\");\n\t\tel.id = \"nuclo-styles\";\n\t\tdocument.head.appendChild(el);\n\t}\n\tsheet = el.sheet;\n\tsheetDocument = document;\n\tgroupRules.clear();\n\tbaseRuleCount = 0;\n\tif (!sheet) return null;\n\tfor (const rule of baseRules) insertBase(sheet, rule);\n\tfor (const [query, rules] of queryRules) {\n\t\tconst group = createGroup(sheet, query);\n\t\tif (group) {\n\t\t\tfor (const rule of rules) {\n\t\t\t\ttry {\n\t\t\t\t\tgroup.insertRule(rule, group.cssRules.length);\n\t\t\t\t} catch { /* drop invalid rule */ }\n\t\t\t}\n\t\t}\n\t}\n\treturn sheet;\n}\n\nfunction record(rule: string, query: string | undefined): void {\n\tif (query === undefined) {\n\t\tbaseRules.push(rule);\n\t} else {\n\t\tlet bucket = queryRules.get(query);\n\t\tif (!bucket) {\n\t\t\tbucket = [];\n\t\t\tqueryRules.set(query, bucket);\n\t\t}\n\t\tbucket.push(rule);\n\t}\n\tssrCollector?.(query === undefined ? rule : query + \"{\" + rule + \"}\");\n\n\tconst s = ensureSheet();\n\tif (!s) return;\n\tif (query === undefined) {\n\t\tinsertBase(s, rule);\n\t} else {\n\t\tconst group = groupRules.get(query) ?? createGroup(s, query);\n\t\tif (group) {\n\t\t\ttry {\n\t\t\t\tgroup.insertRule(rule, group.cssRules.length);\n\t\t\t} catch { /* drop invalid rule */ }\n\t\t}\n\t}\n}\n\n/**\n * Order-independent 53-bit content hash (two interleaved FNV-1a style passes).\n * Class names must match between server and client for SSR hydration, so a\n * counter is not an option; 53 bits keeps collision odds negligible (~1e-5 at\n * 10k unique declarations).\n */\nexport function hash(input: string): string {\n\tlet a = 0x811c9dc5;\n\tlet b = 0x7ee3623b;\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst c = input.charCodeAt(i);\n\t\ta = Math.imul(a ^ c, 0x01000193);\n\t\tb = Math.imul(b ^ c, 0x85ebca6b);\n\t}\n\treturn (a >>> 0).toString(36) + ((b >>> 9) % 1296).toString(36);\n}\n\n/** One class per (query, selector-suffix, declaration) — the atomic core. */\nexport function atom(query: string | undefined, suffix: string, property: string, value: string): string {\n\tconst declKey = (query ?? \"\") + \"|\" + suffix + \"|\" + property + \":\" + value;\n\tlet className = atomCache.get(declKey);\n\tif (className !== undefined) {\n\t\t// Touch the sheet so a swapped document (tests) gets the replayed rules.\n\t\tensureSheet();\n\t\treturn className;\n\t}\n\tclassName = \"n\" + hash(declKey);\n\tatomCache.set(declKey, className);\n\tatomOwner.set(className, (query ?? \"\") + \"|\" + suffix + \"|\" + property);\n\trecord(\".\" + className + suffix + \"{\" + property + \":\" + value + \"}\", query);\n\treturn className;\n}\n\n/** Conflict key for a generated class — lets cx() resolve overrides exactly. */\nexport function conflictKeyOf(className: string): string | undefined {\n\treturn atomOwner.get(className);\n}\n\n/** Register a non-atomic rule (keyframes, global styles) once per dedupe key. */\nexport function addRawRule(dedupeKey: string, rule: string): void {\n\tif (rawKeys.has(dedupeKey)) {\n\t\tensureSheet();\n\t\treturn;\n\t}\n\trawKeys.add(dedupeKey);\n\trecord(rule, undefined);\n}\n\n/** All generated CSS — base rules first, then at-rule groups in registration order. */\nexport function getCssText(): string {\n\tlet out = baseRules.join(\"\");\n\tfor (const [query, rules] of queryRules) {\n\t\tif (rules.length > 0) out += query + \"{\" + rules.join(\"\") + \"}\";\n\t}\n\treturn out;\n}\n\n/** Clear all engine state (test helper). Removes the injected style element. */\nexport function resetStyles(): void {\n\tatomCache.clear();\n\tatomOwner.clear();\n\trawKeys.clear();\n\tbaseRules.length = 0;\n\tqueryRules.clear();\n\tgroupRules.clear();\n\tbaseRuleCount = 0;\n\tsheet = null;\n\tsheetDocument = null;\n\tif (typeof document !== \"undefined\") {\n\t\tdocument.getElementById(\"nuclo-styles\")?.remove();\n\t}\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- function e(e){let t=``;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);r>=65&&r<=90?(n>0&&(t+=`-`),t+=String.fromCharCode(r+32)):t+=e[n]}return t}function t(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#039;`};return e.replace(/[&<>"']/g,e=>t[e])}function n(e){return e.replace(/[&<>]/g,e=>e===`&`?`&amp;`:e===`<`?`&lt;`:`&gt;`)}function r(e){return globalThis.document?document.createElement(e):null}const i=new Set(`viewBox.preserveAspectRatio.markerWidth.markerHeight.gradientTransform.patternTransform.clipPathUnits.gradientUnits.patternUnits.pathLength.refX.refY.stdDeviation.baseFrequency.numOctaves.kernelMatrix.tableValues.targetX.targetY.specularExponent.specularConstant.diffuseConstant.surfaceScale.xChannelSelector.yChannelSelector.edgeMode.stitchTiles.spreadMethod.patternContentUnits.markerUnits.startOffset.textLength.lengthAdjust`.split(`.`)),a=new Set([`allowfullscreen`,`async`,`autofocus`,`autoplay`,`checked`,`controls`,`default`,`defer`,`disabled`,`formnovalidate`,`hidden`,`ismap`,`loop`,`multiple`,`muted`,`nomodule`,`novalidate`,`open`,`readonly`,`required`,`reversed`,`selected`]);function o(n,r){if(r==null||r===!1)return``;if(r===!0)return` ${n}`;if(a.has(n)){if(r===`false`)return``;if(r===`true`||r===``||r===n)return` ${n}`}if(n===`style`&&typeof r==`object`){let n=Object.entries(r).filter(([,e])=>e!=null&&e!==``).map(([t,n])=>`${e(t)}: ${n};`).join(` `);return n?` style="${t(n)}"`:``}return` ${n}="${t(String(r))}"`}function s(n){let r=``;if(`attributes`in n&&n.attributes instanceof Map){let a=n;if(a.id&&!n.attributes.has(`id`)&&(r+=o(`id`,a.id)),a.className&&!n.attributes.has(`class`)&&(r+=o(`class`,a.className)),!n.attributes.has(`style`)&&a.style){let n=a.style.cssText||``;if(n){let i=n.split(`;`).map(e=>e.trim()).filter(Boolean).map(t=>{let n=t.indexOf(`:`);if(n===-1)return t;let r=t.slice(0,n).trim(),i=t.slice(n+1).trim();return i?`${e(r)}: ${i};`:``}).filter(Boolean).join(` `);i&&(r+=` style="${t(i)}"`)}}for(let[t,a]of n.attributes){let n=i.has(t)?t:e(t);r+=o(n,a)}return r}if(n.attributes&&n.attributes.length)for(let e=0;e<n.attributes.length;e++){let t=n.attributes[e];t&&t.name&&(r+=o(t.name,t.value))}return r}const c=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`param`,`source`,`track`,`wbr`]);function l(e){if(`tagName`in e&&`children`in e){let t=e.children;if(Array.isArray(t))return t}if(`childNodes`in e){let t=e.childNodes;if(t&&(Array.isArray(t)||t.length!==void 0))return t}return[]}function u(e){if(e.nodeType===3)return n(e.textContent||``);if(e.nodeType===8)return`<!--${e.textContent||``}-->`;if(e.nodeType===1){let t=e,r=t.tagName.toLowerCase(),i=s(t);if(c.has(r))return`<${r}${i} />`;let a=``,o=l(t);if(o&&o.length>0)for(let e=0;e<o.length;e++){let t=o[e];t&&(a+=u(t))}else{let t=e.textContent;typeof t==`string`&&t&&(a=n(t))}return`<${r}${i}>${a}</${r}>`}if(e.nodeType===11){let t=``,n=l(e);if(n&&n.length>0)for(let e=0;e<n.length;e++){let r=n[e];r&&(t+=u(r))}return t}return``}function d(e){if(!e)return``;if(typeof e==`function`)try{let t=r(`div`);if(!t)throw Error(`Document is not available. Make sure polyfills are loaded.`);let n=e(t,0);return n&&typeof n==`object`&&`nodeType`in n?u(n):``}catch(e){return console.error(`Error rendering component to string:`,e),``}return`nodeType`in e?u(e):``}function f(e){return e.map(e=>d(e))}function p(e,t=`div`,n={}){let r=d(e);return`<${t}${Object.entries(n).map(([e,t])=>o(e,t)).join(``)}>${r}</${t}>`}function m(e){}export{f as renderManyToString,d as renderToString,p as renderToStringWithContainer,m as setSSRCollector};
1
+ function e(e){let t=``;for(let n=0;n<e.length;n++){let r=e.charCodeAt(n);r>=65&&r<=90?(n>0&&(t+=`-`),t+=String.fromCharCode(r+32)):t+=e[n]}return t}function t(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#039;`};return e.replace(/[&<>"']/g,e=>t[e])}function n(e){return e.replace(/[&<>]/g,e=>e===`&`?`&amp;`:e===`<`?`&lt;`:`&gt;`)}function r(e){return globalThis.document?document.createElement(e):null}const i=new Set(`viewBox.preserveAspectRatio.markerWidth.markerHeight.gradientTransform.patternTransform.clipPathUnits.gradientUnits.patternUnits.pathLength.refX.refY.stdDeviation.baseFrequency.numOctaves.kernelMatrix.tableValues.targetX.targetY.specularExponent.specularConstant.diffuseConstant.surfaceScale.xChannelSelector.yChannelSelector.edgeMode.stitchTiles.spreadMethod.patternContentUnits.markerUnits.startOffset.textLength.lengthAdjust`.split(`.`)),a=new Set([`allowfullscreen`,`async`,`autofocus`,`autoplay`,`checked`,`controls`,`default`,`defer`,`disabled`,`formnovalidate`,`hidden`,`ismap`,`loop`,`multiple`,`muted`,`nomodule`,`novalidate`,`open`,`readonly`,`required`,`reversed`,`selected`]);function o(n,r){if(r==null||r===!1)return``;if(r===!0)return` ${n}`;if(a.has(n)){if(r===`false`)return``;if(r===`true`||r===``||r===n)return` ${n}`}if(n===`style`&&typeof r==`object`){let n=Object.entries(r).filter(([,e])=>e!=null&&e!==``).map(([t,n])=>`${e(t)}: ${n};`).join(` `);return n?` style="${t(n)}"`:``}return` ${n}="${t(String(r))}"`}function s(n){let r=``;if(`attributes`in n&&n.attributes instanceof Map){let a=n;if(a.id&&!n.attributes.has(`id`)&&(r+=o(`id`,a.id)),a.className&&!n.attributes.has(`class`)&&(r+=o(`class`,a.className)),!n.attributes.has(`style`)&&a.style){let n=a.style.cssText||``;if(n){let i=n.split(`;`).map(e=>e.trim()).filter(Boolean).map(t=>{let n=t.indexOf(`:`);if(n===-1)return t;let r=t.slice(0,n).trim(),i=t.slice(n+1).trim();return i?`${e(r)}: ${i};`:``}).filter(Boolean).join(` `);i&&(r+=` style="${t(i)}"`)}}for(let[t,a]of n.attributes){let n=i.has(t)?t:e(t);r+=o(n,a)}return r}if(n.attributes&&n.attributes.length)for(let e=0;e<n.attributes.length;e++){let t=n.attributes[e];t&&t.name&&(r+=o(t.name,t.value))}return r}const c=new Set([`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`link`,`meta`,`param`,`source`,`track`,`wbr`]);function l(e){if(`tagName`in e&&`children`in e){let t=e.children;if(Array.isArray(t))return t}if(`childNodes`in e){let t=e.childNodes;if(t&&(Array.isArray(t)||t.length!==void 0))return t}return[]}function u(e){if(e.nodeType===3)return n(e.textContent||``);if(e.nodeType===8)return`<!--${e.textContent||``}-->`;if(e.nodeType===1){let t=e,r=t.tagName.toLowerCase(),i=s(t);if(c.has(r))return`<${r}${i} />`;let a=``,o=l(t);if(o&&o.length>0)for(let e=0;e<o.length;e++){let t=o[e];t&&(a+=u(t))}else{let t=e.textContent;typeof t==`string`&&t&&(a=n(t))}return`<${r}${i}>${a}</${r}>`}if(e.nodeType===11){let t=``,n=l(e);if(n&&n.length>0)for(let e=0;e<n.length;e++){let r=n[e];r&&(t+=u(r))}return t}return``}function d(e){if(!e)return``;if(typeof e==`function`)try{let t=r(`div`);if(!t)throw Error(`Document is not available. Make sure polyfills are loaded.`);let n=e(t,0);return n&&typeof n==`object`&&`nodeType`in n?u(n):``}catch(e){return console.error(`Error rendering component to string:`,e),``}return`nodeType`in e?u(e):``}function f(e){return e.map(e=>d(e))}function p(e,t=`div`,n={}){let r=d(e);return`<${t}${Object.entries(n).map(([e,t])=>o(e,t)).join(``)}>${r}</${t}>`}function m(e){}const h=[],g=new Map;function _(){let e=h.join(``);for(let[t,n]of g)n.length>0&&(e+=t+`{`+n.join(``)+`}`);return e}export{_ as getCssText,f as renderManyToString,d as renderToString,p as renderToStringWithContainer,m as setSSRCollector};
2
2
  //# sourceMappingURL=nuclo.ssr.mjs.map