@domphy/theme 0.1.20 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/global.ts","../../core/src/types/EventProperties.ts","../../core/src/constants/HtmlTags.ts","../../core/src/classes/Notifier.ts","../../core/src/classes/State.ts","../../core/src/utils.ts","../../core/src/helpers.ts","../../core/src/constants/VoidTags.ts","../../core/src/constants/SvgTags.ts","../../core/src/constants/BooleanAttributes.ts","../../core/src/constants/PrefixCSS.ts","../../core/src/constants/CamelAttributes.ts","../../core/src/classes/ElementAttribute.ts","../../core/src/classes/AttributeList.ts","../../core/src/classes/TextNode.ts","../../core/src/classes/ElementList.ts","../../core/src/classes/StyleProperty.ts","../../core/src/classes/StyleRule.ts","../../core/src/classes/StyleList.ts","../../core/src/classes/ElementNode.ts","../../core/src/classes/RecordState.ts","../src/index.ts","../src/light.ts","../src/theme.ts","../src/size.ts","../src/density.ts","../src/tone.ts"],"sourcesContent":["export * as core from \"@domphy/core\"\r\nexport * as theme from \"./index.js\"\r\n","export const EventProperties = [\r\n \"onAbort\",\r\n \"onAuxClick\",\r\n \"onBeforeMatch\",\r\n \"onBeforeToggle\",\r\n \"onBlur\",\r\n \"onCancel\",\r\n \"onCanPlay\",\r\n \"onCanPlayThrough\",\r\n \"onChange\",\r\n \"onClick\",\r\n \"onClose\",\r\n \"onContextLost\",\r\n \"onContextMenu\",\r\n \"onContextRestored\",\r\n \"onCopy\",\r\n \"onCueChange\",\r\n \"onCut\",\r\n \"onDblClick\",\r\n \"onDrag\",\r\n \"onDragEnd\",\r\n \"onDragEnter\",\r\n \"onDragLeave\",\r\n \"onDragOver\",\r\n \"onDragStart\",\r\n \"onDrop\",\r\n \"onDurationChange\",\r\n \"onEmptied\",\r\n \"onEnded\",\r\n \"onError\",\r\n \"onFocus\",\r\n \"onFormData\",\r\n \"onInput\",\r\n \"onInvalid\",\r\n \"onKeyDown\",\r\n \"onKeyPress\",\r\n \"onKeyUp\",\r\n \"onLoad\",\r\n \"onLoadedData\",\r\n \"onLoadedMetadata\",\r\n \"onLoadStart\",\r\n \"onMouseDown\",\r\n \"onMouseEnter\",\r\n \"onMouseLeave\",\r\n \"onMouseMove\",\r\n \"onMouseOut\",\r\n \"onMouseOver\",\r\n \"onMouseUp\",\r\n \"onPaste\",\r\n \"onPause\",\r\n \"onPlay\",\r\n \"onPlaying\",\r\n \"onProgress\",\r\n \"onRateChange\",\r\n \"onReset\",\r\n \"onResize\",\r\n \"onScroll\",\r\n \"onScrollEnd\",\r\n \"onSecurityPolicyViolation\",\r\n \"onSeeked\",\r\n \"onSeeking\",\r\n \"onSelect\",\r\n \"onSlotChange\",\r\n \"onStalled\",\r\n \"onSubmit\",\r\n \"onSuspend\",\r\n \"onTimeUpdate\",\r\n \"onToggle\",\r\n \"onVolumeChange\",\r\n \"onWaiting\",\r\n \"onWheel\",\r\n \"onTouchStart\",\r\n \"onTouchMove\",\r\n \"onTouchEnd\",\r\n \"onTouchCancel\",\r\n \"onPointerDown\",\r\n \"onPointerMove\",\r\n \"onPointerUp\",\r\n \"onPointerCancel\",\r\n \"onPointerEnter\",\r\n \"onPointerLeave\",\r\n \"onPointerOver\",\r\n \"onPointerOut\",\r\n \"onGotPointerCapture\",\r\n \"onLostPointerCapture\",\r\n \"onCompositionStart\",\r\n \"onCompositionUpdate\",\r\n \"onCompositionEnd\",\r\n \"onTransitionEnd\",\r\n \"onTransitionStart\",\r\n \"onAnimationStart\",\r\n \"onAnimationEnd\",\r\n \"onAnimationIteration\",\r\n \"onFullscreenChange\",\r\n \"onFullscreenError\",\r\n \"onFocusIn\",\r\n \"onFocusOut\",\r\n] as const\r\n\r\nexport const eventNameMap = EventProperties.reduce((acc, ev) => {\r\n const key = ev.slice(2).toLowerCase() as keyof HTMLElementEventMap\r\n acc[key] = ev;\r\n return acc;\r\n}, {} as Partial<Record<keyof HTMLElementEventMap, (typeof EventProperties)[number]>>);\r\n","export const HtmlTags = [\r\n \"a\",\r\n \"abbr\",\r\n \"address\",\r\n \"article\",\r\n \"aside\",\r\n \"audio\",\r\n \"b\",\r\n \"base\",\r\n \"blockquote\",\r\n \"br\",\r\n \"button\",\r\n \"canvas\",\r\n \"caption\",\r\n \"cite\",\r\n \"code\",\r\n \"col\",\r\n \"colgroup\",\r\n \"data\",\r\n \"datalist\",\r\n \"dd\",\r\n \"del\",\r\n \"details\",\r\n \"dfn\",\r\n \"dialog\",\r\n \"div\",\r\n \"dl\",\r\n \"dt\",\r\n \"em\",\r\n \"fieldset\",\r\n \"figcaption\",\r\n \"figure\",\r\n \"footer\",\r\n \"form\",\r\n \"h1\",\r\n \"h2\",\r\n \"h3\",\r\n \"h4\",\r\n \"h5\",\r\n \"h6\",\r\n \"header\",\r\n \"hgroup\",\r\n \"i\",\r\n \"iframe\",\r\n \"img\",\r\n \"input\",\r\n \"ins\",\r\n \"kbd\",\r\n \"label\",\r\n \"legend\",\r\n \"li\",\r\n \"main\",\r\n \"map\",\r\n \"mark\",\r\n \"meta\",\r\n \"meter\",\r\n \"nav\",\r\n \"noscript\",\r\n \"object\",\r\n \"ol\",\r\n \"optgroup\",\r\n \"option\",\r\n \"output\",\r\n \"p\",\r\n \"param\",\r\n \"picture\",\r\n \"pre\",\r\n \"progress\",\r\n \"q\",\r\n \"rp\",\r\n \"rt\",\r\n \"ruby\",\r\n \"s\",\r\n \"samp\",\r\n \"section\",\r\n \"select\",\r\n \"slot\",\r\n \"small\",\r\n \"source\",\r\n \"span\",\r\n \"strong\",\r\n \"sub\",\r\n \"summary\",\r\n \"sup\",\r\n \"table\",\r\n \"tbody\",\r\n \"td\",\r\n \"template\",\r\n \"textarea\",\r\n \"tfoot\",\r\n \"th\",\r\n \"thead\",\r\n \"time\",\r\n \"title\",\r\n \"tr\",\r\n \"track\",\r\n \"u\",\r\n \"ul\",\r\n \"var\",\r\n \"video\",\r\n \"wbr\",\r\n \"bdi\",\r\n \"bdo\",\r\n \"math\",\r\n \"menu\",\r\n \"search\",\r\n \"area\",\r\n \"embed\",\r\n \"hr\",\r\n \"animate\",\r\n \"animateMotion\",\r\n \"animateTransform\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"cursor\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"mpath\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"prefetch\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"set\",\r\n \"solidColor\",\r\n \"stop\",\r\n \"svg\",\r\n \"switch\",\r\n \"symbol\",\r\n \"tbreak\",\r\n \"text\",\r\n \"textPath\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n];","import { Handler } from \"../types.js\"\n\ntype ChainEntry = [notifier: Notifier, event: string]\n\n// Shared across all instances to track the flush chain for circular detection.\nlet _chain: ChainEntry[] = []\n\nexport class Notifier {\n private _listeners: Record<string, Set<Handler>> | null = {}\n private _pending: Map<string, { args: unknown[], chain: ChainEntry[] }> = new Map()\n private _scheduled = false\n\n _dispose(): void {\n if (this._listeners) {\n for (const event in this._listeners) {\n this._listeners[event].clear()\n }\n }\n this._listeners = null\n }\n\n addListener(event: string, listener: Handler): () => void {\n if (!this._listeners) return () => {}\n\n if (typeof event !== \"string\" || typeof listener !== \"function\") {\n throw new Error(\"Event name must be a string, listener must be a function\")\n }\n\n if (!this._listeners[event]) {\n this._listeners[event] = new Set()\n }\n\n const release = () => this.removeListener(event, listener)\n\n if (this._listeners[event].has(listener)) return release\n\n this._listeners[event].add(listener)\n if (typeof listener.onSubscribe === \"function\") {\n listener.onSubscribe(release)\n }\n\n return release\n }\n\n removeListener(event: string, listener: Handler): void {\n if (!this._listeners) return\n\n const listeners = this._listeners[event]\n if (listeners && listeners.has(listener)) {\n listeners.delete(listener)\n if (listeners.size === 0) {\n delete this._listeners[event]\n }\n }\n }\n\n notify(event: string, ...args: unknown[]): void {\n if (!this._listeners) return\n if (!this._listeners[event]) return\n\n if (this._isCircular(event)) return\n\n this._pending.set(event, { args, chain: [..._chain] })\n\n if (!this._scheduled) {\n this._scheduled = true\n queueMicrotask(() => this._flushAll())\n }\n }\n\n private _isCircular(event: string): boolean {\n const idx = _chain.findIndex(([n, e]) => n === this && e === event)\n if (idx === -1) return false\n\n const names = [..._chain.slice(idx).map(([, e]) => e), event]\n console.error(`[Domphy] Circular dependency detected:\\n ${names.join(\" → \")}`)\n return true\n }\n\n private _flushAll(): void {\n this._scheduled = false\n const pending = this._pending\n this._pending = new Map()\n\n for (const [event, { args, chain }] of pending) {\n _chain = chain\n this._flush(event, args)\n }\n _chain = []\n }\n\n private _flush(event: string, args: unknown[]): void {\n if (!this._listeners) return\n const listeners = this._listeners[event]\n if (!listeners) return\n\n _chain.push([this, event])\n\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue\n try {\n listener(...args)\n } catch (e) {\n console.error(e)\n }\n }\n\n _chain.pop()\n }\n}\n","import { Notifier } from \"./Notifier.js\";\r\nimport { Handler } from \"../types.js\"\r\n\r\nexport type ValueListener<T> = ((_value: T) => void) & Handler\r\nexport type ValueOrState<T> = T | State<T>\r\n\r\nexport class State<T> {\r\n readonly _isState = true;\r\n private _value: T;\r\n readonly initialValue: T;\r\n private _notifier: Notifier | null = new Notifier();\r\n\r\n constructor(initialValue: T, readonly name: string = typeof initialValue) {\r\n this.initialValue = initialValue;\r\n this._value = initialValue;\r\n }\r\n\r\n get(listener?: ValueListener<T>): T {\r\n if (listener) this.addListener(listener);\r\n return this._value;\r\n }\r\n\r\n set(newValue: T): void {\r\n if (!this._notifier) return;\r\n this._value = newValue;\r\n this._notifier.notify(this.name, newValue);\r\n }\r\n\r\n reset(): void {\r\n this.set(this.initialValue);\r\n }\r\n\r\n addListener(listener: ValueListener<T>): () => void {\r\n if (!this._notifier) return () => { };\r\n return this._notifier.addListener(this.name, listener);\r\n }\r\n\r\n removeListener(listener: ValueListener<T>): void {\r\n if (!this._notifier) return;\r\n this._notifier.removeListener(this.name, listener);\r\n }\r\n\r\n _dispose(): void {\r\n if (this._notifier) {\r\n this._notifier._dispose();\r\n this._notifier = null;\r\n }\r\n }\r\n}\r\n","import { DomphyElement, HookMap, EventName, Handler, Listener } from \"./types.js\";\r\nimport { State } from \"./classes/State.js\"\r\n\r\nimport { deepClone, addEvent, addHook } from \"./helpers.js\"\r\n\r\nexport function merge(source: Record<string, any> = {}, target: Record<string, any> = {}): Record<string, any> {\r\n const comma = [\"animation\", \"transition\", \"boxShadow\", \"textShadow\", \"background\", \"fontFamily\"]\r\n const space = [\"class\", \"rel\", \"transform\", \"acceptCharset\", \"sandbox\"]\r\n const adjacent = [\"content\"]\r\n if (Object.prototype.toString.call(target) === \"[object Object]\" && Object.getPrototypeOf(target) === Object.prototype) { // plainjs not class instance\r\n target = deepClone(target)\r\n }\r\n\r\n for (const key in target) {\r\n\r\n const value = target[key];\r\n if (value === undefined || value === null || value === \"\") continue;\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n if (typeof source[key] === \"object\") {\r\n source[key] = merge(source[key], value);\r\n } else {\r\n source[key] = value;\r\n }\r\n\r\n } else {\r\n if (comma.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\", \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\", \")\r\n }\r\n\r\n } else if (adjacent.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\"\")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\"\")\r\n }\r\n } else if (space.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\" \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\" \")\r\n }\r\n } else if (key.startsWith(\"on\")) {\r\n let name = key.replace(\"on\", \"\").toLowerCase() as EventName\r\n addEvent(source as DomphyElement, name, value)\r\n } else if (key.startsWith(\"_on\")) {\r\n let name = key.replace(\"_on\", \"\") as keyof HookMap\r\n addHook(source as DomphyElement, name, value)\r\n } else {\r\n source[key] = value;\r\n }\r\n }\r\n }\r\n return source;\r\n}\r\n\r\nexport function hashString(str: string = \"\"): string {\r\n let hash = 0x811c9dc5; // FNV-1a 32-bit offset basis\r\n for (let i = 0; i < str.length; i++) {\r\n hash ^= str.charCodeAt(i);\r\n hash = (hash * 0x01000193) >>> 0; // FNV prime, keep 32-bit unsigned\r\n }\r\n return String.fromCharCode(97 + (hash % 26)) + hash.toString(16);\r\n}\r\n\r\nexport function toState<T>(val: T | State<T>, name?: string): State<T> {\r\n return (val instanceof State || (val as any)?._isState) ? val as State<T> : new State<T>(val, name);\r\n}\r\n\r\nexport function r<T>(fn: (listener: Listener) => T): (listener: Listener) => T {\r\n return fn;\r\n}\r\n\r\n","import { DomphyElement, PartialElement, HookMap, EventName, Handler, TagName } from \"./types.js\";\r\nimport { ElementNode } from \"./classes/ElementNode.js\"\r\nimport { State } from \"./classes/State.js\"\r\nimport { eventNameMap } from \"./types/EventProperties.js\"\r\nimport { HtmlTags } from \"./constants/HtmlTags.js\"\r\nimport {merge} from \"./utils.js\"\r\n\r\nexport function addHook<K extends keyof HookMap>(partial: PartialElement, hookName: K, handler: HookMap[K]): void {\r\n const hookProperty = `_on${hookName}` as keyof PartialElement;\r\n let current = partial[hookProperty];\r\n\r\n if (typeof current === \"function\") {\r\n (partial as any)[hookProperty] = (...args: any[]) => {\r\n (current as Function)(...args);\r\n (handler as Function)(...args);\r\n };\r\n } else {\r\n (partial as any)[hookProperty] = handler;\r\n }\r\n}\r\n\r\nexport function addEvent<K extends keyof HTMLElementEventMap>(\r\n attributes: PartialElement,\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K], node: ElementNode) => void\r\n): void {\r\n const eventProperty = eventNameMap[eventName];\r\n if (!eventProperty) {\r\n throw Error(`invalid event name \"${eventName}\"`);\r\n }\r\n const current = (attributes as any)[eventProperty]\r\n\r\n if (typeof current == \"function\") {\r\n (attributes as any)[eventProperty] = (event: HTMLElementEventMap[K], node: ElementNode) => {\r\n current(event, node)\r\n handler(event, node);\r\n };\r\n } else {\r\n (attributes as any)[eventProperty] = handler\r\n }\r\n}\r\n\r\nexport function deepClone(value: any, seen = new WeakMap()): any {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (typeof value === \"function\") return value;\r\n if (seen.has(value)) return seen.get(value);\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto !== Object.prototype && !Array.isArray(value)) return value; // ignore class instance\r\n\r\n let clone: any;\r\n\r\n if (Array.isArray(value)) {\r\n clone = [];\r\n seen.set(value, clone);\r\n for (const v of value) clone.push(deepClone(v, seen));\r\n return clone;\r\n }\r\n\r\n if (value instanceof Date) return new Date(value);\r\n if (value instanceof RegExp) return new RegExp(value);\r\n if (value instanceof Map) {\r\n clone = new Map();\r\n seen.set(value, clone);\r\n for (const [k, v] of value) clone.set(deepClone(k, seen), deepClone(v, seen));\r\n return clone;\r\n }\r\n if (value instanceof Set) {\r\n clone = new Set();\r\n seen.set(value, clone);\r\n for (const v of value) clone.add(deepClone(v, seen));\r\n return clone;\r\n }\r\n if (ArrayBuffer.isView(value)) {\r\n return new (value as any).constructor(value);\r\n }\r\n if (value instanceof ArrayBuffer) {\r\n return value.slice(0);\r\n }\r\n\r\n clone = Object.create(proto);\r\n seen.set(value, clone);\r\n\r\n for (const key of Reflect.ownKeys(value)) {\r\n clone[key] = deepClone(value[key], seen);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nexport function validate(element: DomphyElement | PartialElement, asPartial = false): boolean {\r\n if (Object.prototype.toString.call(element) !== \"[object Object]\") {\r\n throw Error(`typeof ${element} is invalid DomphyElement`);\r\n }\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element]\r\n if (i == 0 && !HtmlTags.includes(key) && !key.includes(\"-\") && !asPartial) { // web-component\r\n throw Error(`key ${key} is not valid HTML tag name`);\r\n } else if (key == \"style\" && val && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"style\" must be a object`);\r\n } else if (key == \"$\") {\r\n element.$!.forEach(v => validate(v as PartialElement, true))\r\n } else if (key.startsWith(\"_on\") && typeof val != \"function\") {\r\n throw Error(`hook ${key} value \"${val}\" must be a function `)\r\n } else if (key.startsWith(\"on\") && typeof val != \"function\") {\r\n throw Error(`event ${key} value \"${val}\" must be a function `);\r\n } else if (key == \"_portal\" && typeof val !== \"function\") {\r\n throw Error(`\"_portal\" must be a function return HTMLElement`);\r\n } else if (key == \"_context\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_context\" must be a object`);\r\n } else if (key == \"_metadata\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_metadata\" must be a object`);\r\n } else if (key == \"_key\" && (typeof val !== \"string\" && typeof val !== \"number\")) {\r\n throw Error(`\"_key\" must be a string or number`);\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function isValid(element: DomphyElement): boolean {\r\n\r\n if (Array.isArray(element)) return false;\r\n if (!element || typeof element !== \"object\") return false;\r\n\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element];\r\n if (i == 0 && !HtmlTags.includes(key)) return false\r\n if (key === \"style\" && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n if (key.startsWith(\"_on\") && typeof val !== \"function\") return false;\r\n if (key.startsWith(\"on\") && typeof val !== \"function\") return false;\r\n if (key === \"_portalChildren\" && !Array.isArray(val)) return false;\r\n if ((key === \"_context\" || key === \"_metadata\") && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function isHTML(str: string): boolean {\r\n return /<([a-z][\\w-]*)(\\s[^>]*)?>.*<\\/\\1>|<([a-z][\\w-]*)(\\s[^>]*)?\\/>/i.test(str.trim());\r\n}\r\n\r\nexport function escapeHTML(str: string): string {\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\");\r\n}\r\n\r\nexport function addClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => String(reactive(listener)) + \" \" + className\r\n } else {\r\n let current = element.class || \"\"\r\n let split = String(current).split(\" \")\r\n split.push(className)\r\n element.class = split.filter(e => e).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function removeClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.filter(e => e != className).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.filter(e => e != className).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function toggleClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function getTagName(element: DomphyElement): TagName | undefined {\r\n return Object.keys(element).find(e => HtmlTags.includes(e)) as TagName | undefined\r\n}\r\n\r\n\r\nexport function camelToKebab(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\n\r\nexport function selectorSplitter(selectors: string) {\n if (selectors.indexOf('@') === 0) {\r\n return [selectors];\r\n }\r\n var splitted = [];\r\n var parens = 0;\r\n var angulars = 0;\r\n var soFar = '';\r\n for (var i = 0, len = selectors.length; i < len; i++) {\r\n var char = selectors[i];\r\n if (char === '(') {\r\n parens += 1;\r\n } else if (char === ')') {\r\n parens -= 1;\r\n } else if (char === '[') {\r\n angulars += 1;\r\n } else if (char === ']') {\r\n angulars -= 1;\r\n } else if (char === ',') {\r\n if (!parens && !angulars) {\r\n splitted.push(soFar.trim());\r\n soFar = '';\r\n continue;\r\n }\r\n }\r\n soFar += char;\r\n }\r\n splitted.push(soFar.trim());\n return splitted;\n};\n\nexport function ensureDomStyle(styleParent: HTMLHeadElement | ShadowRoot): HTMLStyleElement {\n let domStyle = styleParent.querySelector(\"#domphy-style\") as HTMLStyleElement | null;\n\n if (!domStyle) {\n domStyle = document.createElement(\"style\");\n domStyle.id = \"domphy-style\";\n styleParent.appendChild(domStyle);\n }\n\n if (domStyle.dataset.domphyBase !== \"true\") {\n domStyle.sheet?.insertRule(\"[hidden] { display: none !important; }\", 0);\n domStyle.dataset.domphyBase = \"true\";\n }\n\n return domStyle;\n}\n\nexport const mergePartial = (partial: PartialElement | DomphyElement): typeof partial => {\n\r\n if (Array.isArray(partial.$)) {\r\n let part: typeof partial = {}\r\n partial.$.forEach(p => merge(part, mergePartial(p)))\r\n delete partial.$\r\n merge(part, partial) // native win\r\n\r\n return part\r\n } else {\r\n return partial\r\n }\r\n}\n","export const VoidTags = [\r\n \"area\",\r\n \"base\",\r\n \"br\",\r\n \"col\",\r\n \"embed\",\r\n \"hr\",\r\n \"img\",\r\n \"input\",\r\n \"link\",\r\n \"meta\",\r\n \"source\",\r\n \"track\",\r\n \"wbr\",\r\n] as const;\r\n\r\nexport type VoidTagName = (typeof VoidTags)[number];\r\n\r\n","export const SvgTags = [\"svg\", \"circle\", \"path\", \"rect\", \"ellipse\",\r\n \"line\", \"polyline\", \"polygon\", \"g\", \"defs\",\r\n \"use\", \"symbol\", \"linearGradient\", \"radialGradient\",\r\n \"stop\", \"clipPath\", \"mask\", \"filter\", \"text\",\r\n \"tspan\", \"textPath\", \"image\", \"pattern\", \"marker\",\r\n \"animate\", \"animateTransform\", \"animateMotion\",\r\n \"feGaussianBlur\", \"feComposite\", \"feColorMatrix\",\r\n \"feMerge\", \"feMergeNode\", \"feOffset\", \"feFlood\",\r\n \"feBlend\", \"foreignObject\"]","export const BooleanAttributes = [\r\n \"allowFullScreen\",\r\n \"async\",\r\n \"autoFocus\",\r\n \"autoPlay\",\r\n \"checked\",\r\n \"compact\",\r\n \"contentEditable\",\r\n \"controls\",\r\n \"declare\",\r\n \"default\",\r\n \"defer\",\r\n \"disabled\",\r\n \"formNoValidate\",\r\n \"hidden\",\r\n \"isMap\",\r\n \"itemScope\",\r\n \"loop\",\r\n \"multiple\",\r\n \"muted\",\r\n \"noHref\",\r\n \"noShade\",\r\n \"noValidate\",\r\n \"open\",\r\n \"playsInline\",\r\n \"readonly\",\r\n \"required\",\r\n \"reversed\",\r\n \"scoped\",\r\n \"selected\",\r\n \"sortable\",\r\n \"trueSpeed\",\r\n \"typeMustMatch\",\r\n \"wmode\",\r\n \"autoCapitalize\",\r\n \"translate\",\r\n \"spellCheck\",\r\n \"inert\",\r\n \"download\",\r\n \"noModule\",\r\n \"paused\",\r\n \"autoPictureInPicture\",\r\n] as const;","//browserslist query \"> 0.1%, not dead\"\r\nexport const PrefixCSS: Record<string, string[]> = {\r\n transform: [\"webkit\", \"ms\"],\r\n transition: [\"webkit\", \"ms\"],\r\n animation: [\"webkit\"],\r\n userSelect: [\"webkit\", \"ms\"],\r\n flexDirection: [\"webkit\", \"ms\"],\r\n flexWrap: [\"webkit\", \"ms\"],\r\n justifyContent: [\"webkit\", \"ms\"],\r\n alignItems: [\"webkit\", \"ms\"],\r\n alignSelf: [\"webkit\", \"ms\"],\r\n order: [\"webkit\", \"ms\"],\r\n flexGrow: [\"webkit\", \"ms\"],\r\n flexShrink: [\"webkit\", \"ms\"],\r\n flexBasis: [\"webkit\", \"ms\"],\r\n columns: [\"webkit\"],\r\n columnCount: [\"webkit\"],\r\n columnGap: [\"webkit\"],\r\n columnRule: [\"webkit\"],\r\n columnWidth: [\"webkit\"],\r\n boxSizing: [\"webkit\"],\r\n appearance: [\"webkit\", \"moz\"],\r\n filter: [\"webkit\"],\r\n backdropFilter: [\"webkit\"],\r\n clipPath: [\"webkit\"],\r\n mask: [\"webkit\"],\r\n maskImage: [\"webkit\"],\r\n textSizeAdjust: [\"webkit\", \"ms\"],\r\n hyphens: [\"webkit\", \"ms\"],\r\n writingMode: [\"webkit\", \"ms\"],\r\n gridTemplateColumns: [\"ms\"],\r\n gridTemplateRows: [\"ms\"],\r\n gridAutoColumns: [\"ms\"],\r\n gridAutoRows: [\"ms\"],\r\n gridColumn: [\"ms\"],\r\n gridRow: [\"ms\"],\r\n marginInlineStart: [\"webkit\"],\r\n marginInlineEnd: [\"webkit\"],\r\n paddingInlineStart: [\"webkit\"],\r\n paddingInlineEnd: [\"webkit\"],\r\n minInlineSize: [\"webkit\"],\r\n maxInlineSize: [\"webkit\"],\r\n minBlockSize: [\"webkit\"],\r\n maxBlockSize: [\"webkit\"],\r\n inlineSize: [\"webkit\"],\r\n blockSize: [\"webkit\"],\r\n tabSize: [\"moz\"],\r\n overscrollBehavior: [\"webkit\", \"ms\"],\r\n touchAction: [\"ms\"],\r\n resize: [\"webkit\"],\r\n printColorAdjust: [\"webkit\"],\r\n backgroundClip: [\"webkit\"],\r\n boxDecorationBreak: [\"webkit\"],\r\n overflowScrolling: [\"webkit\"],\r\n};\r\n","export const CamelAttributes: string[] = [\r\n \"viewBox\",\r\n \"preserveAspectRatio\",\r\n \"gradientTransform\",\r\n \"gradientUnits\",\r\n \"spreadMethod\",\r\n \"markerStart\",\r\n \"markerMid\",\r\n \"markerEnd\",\r\n \"markerHeight\",\r\n \"markerWidth\",\r\n \"markerUnits\",\r\n \"refX\",\r\n \"refY\",\r\n \"patternContentUnits\",\r\n \"patternTransform\",\r\n \"patternUnits\",\r\n \"filterUnits\",\r\n \"primitiveUnits\",\r\n \"kernelUnitLength\",\r\n \"clipPathUnits\",\r\n \"maskContentUnits\",\r\n \"maskUnits\"\r\n] as const\r\n","import { escapeHTML, camelToKebab } from \"../helpers.js\";\nimport { BooleanAttributes, CamelAttributes } from \"../constants.js\";\nimport type { ElementNode } from \"./ElementNode.js\"\nimport { type AttributeValue } from \"../types.js\"\nimport { Notifier } from \"./Notifier.js\"\n\nexport class ElementAttribute {\n readonly name: string;\n readonly isBoolean: boolean;\n value: any;\n parent: ElementNode;\n _notifier = new Notifier();\n\n constructor(name: string, value: any, parent: any) {\n this.parent = parent;\n this.isBoolean = (BooleanAttributes as readonly string[]).includes(name);\n if (CamelAttributes.includes(name)) {\n this.name = name\n } else {\n this.name = camelToKebab(name)\n }\n this.value = undefined;\n this.set(value);\n }\n\n render(): void {\n if (!this.parent || !this.parent.domElement) return;\n const domElement = this.parent.domElement;\n\n const mutateAttrs = [\"value\"];\n if (this.isBoolean) {\n if (this.value === false || this.value == null) {\n domElement.removeAttribute(this.name)\n } else {\n domElement.setAttribute(this.name, this.value === true ? \"\" : this.value)\n }\n } else if (this.value == null) {\n domElement.removeAttribute(this.name);\n } else if (mutateAttrs.includes(this.name)) {\n (domElement as any)[this.name] = this.value;\n } else {\n domElement.setAttribute(this.name, this.value);\n }\n }\n\n set(value: AttributeValue): void {\n let prev = this.value;\n\n if (value == null) {\n this.value = null;\n } else if (typeof value === \"string\" && /<\\/?[a-z][\\s\\S]*>/i.test(value)) {\n this.value = escapeHTML(value);\n } else if (typeof value == \"function\") {\n let listener: any = () => {\n if (!this.parent || this.parent._disposed) return;\n let p = this.value;\n this.value = this.isBoolean ? Boolean((value as Function)()) : (value as Function)();\n this.render();\n if (p !== this.value) this._notifier.notify(this.name, this.value);\n };\n\n listener.elementNode = this.parent!;\n listener.debug = `class:${this.parent?.tagName}_${this.parent?.nodeId} attribute:${this.name}`;\n\n listener.onSubscribe = (release: () => void) => {\n if (this.parent) {\n this.parent.addHook(\"BeforeRemove\", () => {\n release();\n listener = null;\n });\n }\n };\n\n this.value = this.isBoolean ? Boolean(value(listener)) : value(listener);\n } else {\n this.value = this.isBoolean ? Boolean(value) : value;\n }\n\n this.render();\n if (prev !== this.value) this._notifier.notify(this.name, this.value);\n }\n\n addListener(callback: (value: any) => void): void {\n const handler = callback as any\n handler.onSubscribe = (release: () => void) => this.parent?.addHook(\"BeforeRemove\", release);\n this._notifier.addListener(this.name, handler)\n }\n\n remove(): void {\n if (this.parent && this.parent.attributes) {\n this.parent.attributes.remove(this.name);\n }\n this._dispose();\n }\n\n _dispose(): void {\n this._notifier._dispose();\n this.value = null;\n this.parent = null as any\n }\n\n generateHTML(): string {\n const { name, value } = this;\n if (this.isBoolean) {\n return value ? `${name}` : \"\";\n } else {\n const val = Array.isArray(value) ? JSON.stringify(value) : value;\n return `${name}=\"${escapeHTML(String(val))}\"`;\n }\n }\n}\n","import type { ElementNode } from \"./ElementNode.js\";\nimport { ElementAttribute } from \"./ElementAttribute.js\";\nimport { BooleanAttributes } from \"../constants.js\";\nimport { AttributeValue } from \"../types.js\"\n\nexport class AttributeList {\n items: Record<string, ElementAttribute> | null = {};\n parent: ElementNode | null;\n\n constructor(parent: ElementNode) {\n this.parent = parent;\n }\n\n generateHTML(): string {\n if (!this.items) return \"\";\n const str = Object.values(this.items)\n .map((attr) => attr.generateHTML())\n .join(\" \");\n return str ? ` ${str}` : \"\";\n }\n\n get(name: string): any {\n if (!this.items) return undefined;\n return this.items[name]?.value;\n }\n\n set(name: string, value: AttributeValue): void {\n if (!this.items || !this.parent) return;\n if (this.items[name]) {\n this.items[name].set(value);\n } else {\n this.items[name] = new ElementAttribute(name, value, this.parent);\n }\n }\n\n addListener(name: string, callback: (value: string | number) => void): void {\n if (this.has(name)) {\n this.items![name].addListener(callback);\n }\n }\n\n has(name: string): boolean {\n if (!this.items) return false;\n return Object.prototype.hasOwnProperty.call(this.items, name);\n }\n\n remove(name: string): void {\n if (!this.items) return;\n\n if (this.items[name]) {\n this.items[name]._dispose();\n delete this.items[name];\n }\n\n if (this.parent && this.parent.domElement && this.parent.domElement instanceof Element) {\n this.parent.domElement.removeAttribute(name);\n }\n }\n\n _dispose(): void {\n if (this.items) {\n for (const key in this.items) {\n this.items[key]._dispose();\n }\n }\n this.items = null;\n this.parent = null;\n }\n\n toggle(name: string, force?: boolean): void {\n if (\n !BooleanAttributes.includes(name as (typeof BooleanAttributes)[number])\n ) {\n throw Error(`${name} is not a boolean attribute`);\n }\n if (force === true) {\n this.set(name, true);\n } else if (force === false) {\n this.remove(name);\n } else {\n this.has(name) ? this.remove(name) : this.set(name, true);\n }\n }\n\n addClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n\n const add = (classes: string, newClass: string) => {\n const list = (classes || \"\").split(\" \").filter((e: string) => e);\n !list.includes(newClass) && list.push(className)\n return list.join(\" \")\n }\n\n let current = this.get(\"class\");\n\n if (typeof current === \"function\") {\n this.set(\"class\", () => add(current(), className));\n } else {\n this.set(\"class\", add(current, className))\n }\n }\n\n hasClass(className: string): boolean {\n if (!className || typeof className !== \"string\") return false;\n const current = this.get(\"class\") || \"\";\n const list = current.split(\" \").filter((e: string) => e);\n return list.includes(className);\n }\n\n toggleClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n this.hasClass(className)\n ? this.removeClass(className)\n : this.addClass(className);\n }\n\n removeClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n const current = this.get(\"class\") || \"\";\n const list: string[] = current.split(\" \").filter((e: string) => e);\n const updated = list.filter((cls) => cls !== className);\n updated.length > 0\n ? this.set(\"class\", updated.join(\" \"))\n : this.remove(\"class\");\n }\n\n replaceClass(oldClass: string, newClass: string): void {\n if (\n !oldClass ||\n !newClass ||\n typeof oldClass !== \"string\" ||\n typeof newClass !== \"string\"\n )\n return;\n if (this.hasClass(oldClass)) {\n this.removeClass(oldClass);\n this.addClass(newClass);\n }\n }\n}\n","import { ElementNode } from \"./ElementNode.js\";\r\nimport { isHTML } from \"../helpers.js\";\r\n\r\nexport class TextNode {\r\n type = \"TextNode\"\r\n parent: ElementNode;\r\n text: string;\r\n domText?: ChildNode;\r\n\r\n constructor(textContent: string | number, parent: ElementNode) {\r\n this.parent = parent;\r\n this.text = textContent === \"\" ? \"\\u200B\" : String(textContent);\r\n }\r\n _createDOMNode() {\r\n let newNode: ChildNode;\r\n if (isHTML(this.text)) {\r\n const tpl = document.createElement(\"template\");\r\n tpl.innerHTML = this.text.trim();\r\n newNode = tpl.content.firstChild || document.createTextNode(\"\");\r\n } else {\r\n newNode = document.createTextNode(this.text);\r\n }\r\n this.domText = newNode;\r\n return newNode;\r\n }\r\n\r\n _dispose(): void {\r\n this.domText = undefined;\r\n this.text = \"\";\r\n }\r\n\r\n generateHTML(): string {\r\n return this.text === \"\\u200B\" ? \"&#8203;\" : this.text;\r\n }\r\n\r\n render(domText: ChildNode | DocumentFragment | HTMLElement): void {\r\n const newNode = this._createDOMNode();\r\n domText.appendChild(newNode);\r\n }\r\n}","import { TextNode } from \"./TextNode.js\";\r\nimport { ElementNode } from \"./ElementNode.js\";\r\nimport type { DomphyElement } from \"../types.js\";\r\nimport { ensureDomStyle } from \"../helpers.js\";\r\n\r\ntype ElementInput = DomphyElement | null | undefined | number | string\r\ntype NodeItem = ElementNode | TextNode;\r\n\r\nexport class ElementList {\r\n items: NodeItem[] = [];\r\n owner: ElementNode;\r\n _nextKey: number = 0;\r\n\r\n constructor(parent: ElementNode) {\r\n this.owner = parent;\r\n }\r\n\r\n _createNode(element: ElementInput | DomphyElement): NodeItem {\r\n return (typeof element === \"object\" && element !== null)\r\n ? new ElementNode(element, this.owner, this._nextKey++)\r\n : new TextNode(element == null ? \"\" : String(element), this.owner);\r\n }\r\n\r\n _moveDomElement(node: NodeItem, index: number) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const dom = this.owner.domElement;\r\n\r\n const el = node instanceof ElementNode ? node.domElement : node.domText;\r\n if (el) {\r\n const currentRef = dom.childNodes[index] || null;\r\n if (el !== currentRef) {\r\n dom.insertBefore(el, currentRef);\r\n }\r\n }\r\n }\r\n\r\n _swapDomElement(aNode: NodeItem, bNode: NodeItem) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const parent = this.owner.domElement;\r\n\r\n const a = aNode instanceof ElementNode ? aNode.domElement : aNode.domText;\r\n const b = bNode instanceof ElementNode ? bNode.domElement : bNode.domText;\r\n if (!a || !b) return;\r\n\r\n const aNext = a.nextSibling;\r\n const bNext = b.nextSibling;\r\n\r\n parent.insertBefore(a, bNext);\r\n parent.insertBefore(b, aNext);\r\n }\r\n\r\n update(inputs: ElementInput[], updateDom = true, silent = false): void {\r\n\r\n const oldItems = this.items.slice(); // snapshot for cleanup\r\n\r\n // keyed lookup from old list\r\n const keyed = new Map<string | number, NodeItem>();\r\n for (const item of oldItems) {\r\n if (item instanceof ElementNode && item.key !== null && item.key !== undefined) {\r\n keyed.set(item.key, item);\r\n }\r\n }\r\n\r\n if (!silent && this.owner.domElement) this.owner._hooks?.BeforeUpdate?.(this.owner, inputs);\r\n // build target order using existing ops (mutating this.items)\r\n for (let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n const key =\r\n (typeof input === \"object\" && input !== null) ? (input as any)._key : undefined;\r\n\r\n if (key !== undefined) {\r\n const reused = keyed.get(key);\r\n if (reused) {\r\n keyed.delete(key);\r\n\r\n const cur = this.items.indexOf(reused);\r\n if (cur !== i && cur >= 0) {\r\n const isPortal = reused instanceof ElementNode && !!reused._portal;\r\n this.move(cur, i, isPortal ? false : updateDom, true);\r\n }\r\n reused.parent = this.owner as any;\r\n continue;\r\n }\r\n }\r\n\r\n this.insert(input, i, updateDom, true);\r\n }\r\n\r\n while (this.items.length > inputs.length) {\r\n this.remove(this.items[this.items.length - 1], updateDom, true);\r\n }\r\n keyed.forEach((node) => this.remove(node, updateDom, true));\r\n if (!silent) this.owner._hooks?.Update?.(this.owner);\r\n }\r\n\r\n insert(input: ElementInput, index?: number, updateDom = true, silent = false): NodeItem {\r\n\r\n let length = this.items.length;\r\n const finalIndex = (typeof index !== \"number\" || isNaN(index) || index < 0 || index > length)\r\n ? length\r\n : index;\r\n const item = this._createNode(input);\r\n this.items.splice(finalIndex, 0, item);\r\n\r\n if (item instanceof ElementNode) {\r\n //Parent always insert/mount before children\r\n item._hooks.Insert && item._hooks.Insert(item)\r\n\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n\r\n\r\n if (item._portal) {\r\n let domElement = item._portal!(this.owner.getRoot())\r\n domElement && item.render(domElement)\r\n } else {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n let domStyle = ensureDomStyle(styleParent)\r\n item.styles.render(domStyle as HTMLStyleElement)\r\n item._hooks.Mount && item._hooks.Mount(item)\r\n item.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(child.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(domNode)\r\n }\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n } else {\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n }\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n return item;\r\n }\r\n\r\n remove(item: NodeItem, updateDom = true, silent = false): void {\r\n\r\n const index = this.items.indexOf(item);\r\n if (index < 0) return;\r\n\r\n if (item instanceof ElementNode) {\r\n const done = () => {\r\n const el = item.domElement\r\n this.items.splice(index, 1);\r\n updateDom && el && el.remove()\r\n item._hooks?.Remove?.(item)\r\n item._dispose();\r\n }\r\n if (item._hooks.BeforeRemove && item.domElement) {\r\n let doneCalled = false;\r\n const onceDone = () => { if (!doneCalled) { doneCalled = true; done(); } };\r\n item._hooks.BeforeRemove(item, onceDone);\r\n if (!doneCalled) onceDone();\r\n } else {\r\n done()\r\n }\r\n\r\n } else {\r\n const el = item.domText\r\n this.items.splice(index, 1);\r\n updateDom && el && el.remove()\r\n item._dispose();\r\n }\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n clear(updateDom = true, silent = false): void {\r\n if (this.items.length === 0) return;\r\n const snapshot = this.items.slice();\r\n\r\n for (const item of snapshot) {\r\n this.remove(item, updateDom, true);\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n _dispose(): void {\r\n this.items.forEach(child => child._dispose())\r\n this.items = [];\r\n }\r\n\r\n swap(aIndex: number, bIndex: number, updateDom = true, silent = false) {\r\n if (aIndex < 0 || bIndex < 0 ||\r\n aIndex >= this.items.length || bIndex >= this.items.length ||\r\n aIndex === bIndex) return;\r\n\r\n const itemA = this.items[aIndex];\r\n const itemB = this.items[bIndex];\r\n\r\n this.items[aIndex] = itemB;\r\n this.items[bIndex] = itemA;\r\n\r\n if (updateDom) this._swapDomElement(itemA, itemB);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n move(fromIndex: number, toIndex: number, updateDom = true, silent = false): void {\r\n if (fromIndex < 0 || fromIndex >= this.items.length ||\r\n toIndex < 0 || toIndex >= this.items.length || fromIndex === toIndex) return;\r\n\r\n const item = this.items[fromIndex];\r\n\r\n this.items.splice(fromIndex, 1);\r\n this.items.splice(toIndex, 0, item);\r\n\r\n if (updateDom) this._moveDomElement(item, toIndex);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n generateHTML(): string {\r\n let html = \"\";\r\n for (const item of this.items) html += item.generateHTML();\r\n return html;\r\n }\r\n}\r\n","import type { StyleRule } from \"./StyleRule.js\";\r\nimport type { StyleValue } from \"../types.js\";\r\nimport { camelToKebab } from \"../helpers.js\";\r\nimport { PrefixCSS } from \"../constants.js\";\r\nimport { Listener } from \"../types.js\"\r\n\r\nexport class StyleProperty {\r\n name: string;\r\n cssName: string;\r\n value: StyleValue = \"\";\r\n parentRule: StyleRule;\r\n\r\n constructor(name: string, value: StyleValue, parentRule: StyleRule) {\r\n this.name = name;\r\n this.cssName = camelToKebab(name);\r\n this.parentRule = parentRule;\r\n this.set(value);\r\n }\r\n\r\n _domUpdate(): void {\r\n if (!this.parentRule) return;\r\n const domRule = this.parentRule.domRule;\r\n\r\n if (domRule && (domRule as CSSStyleRule).style) {\r\n let style: CSSStyleDeclaration = (domRule as CSSStyleRule).style;\r\n style.setProperty(this.cssName, String(this.value));\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n style.setProperty(`-${prefix}-${this.cssName}`, String(this.value));\r\n });\r\n }\r\n }\r\n }\r\n _dispose(): void {\r\n this.value = \"\";\r\n this.parentRule = null as any;\r\n }\r\n\r\n set(value: StyleValue): void {\r\n\r\n if (typeof value === \"function\") {\r\n let listener = (() => {\r\n if (!this.parentRule || this.parentRule.parentNode?._disposed) return;\r\n this.value = value(listener);\r\n this._domUpdate();\r\n }) as unknown as Listener;\r\n\r\n listener.onSubscribe = (release: () => void) => {\r\n this.parentRule.parentNode?.addHook(\"BeforeRemove\", () => {\r\n release();\r\n listener = null!;\r\n });\r\n };\r\n\r\n listener.elementNode = this.parentRule!.root!;\r\n listener.debug = `class:${this.parentRule?.root?.tagName}_${this.parentRule?.root?.nodeId} style:${this.name}`;\r\n this.value = value(listener);\r\n } else {\r\n this.value = value;\r\n }\r\n\r\n this._domUpdate();\r\n }\r\n\r\n remove(): void {\r\n if (!this.parentRule) return;\r\n\r\n if (this.parentRule.domRule instanceof CSSStyleRule) {\r\n const domStyle = this.parentRule.domRule.style;\r\n domStyle.removeProperty(this.cssName);\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n domStyle.removeProperty(`-${prefix}-${this.cssName}`);\r\n });\r\n }\r\n }\r\n delete this.parentRule.styleBlock![this.name];\r\n this._dispose();\r\n }\r\n\r\n cssText(): string {\r\n let str = `${this.cssName}: ${this.value}`;\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n str += `; -${prefix}-${this.cssName}: ${this.value}`;\r\n });\r\n }\r\n return str;\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { StyleProperty } from \"./StyleProperty.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\n\r\nexport class StyleRule {\r\n selectorText: string;\r\n domRule: CSSRule | CSSMediaRule | CSSKeyframesRule | null = null;\r\n styleList: StyleList | null;\r\n styleBlock: Record<string, StyleProperty> | null = {};\r\n parent: StyleRule | ElementNode | null;\r\n\r\n constructor(selectorText: string, parent: StyleRule | ElementNode) {\r\n this.selectorText = selectorText;\r\n this.styleList = new StyleList(this);\r\n this.parent = parent;\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.styleBlock) {\r\n for (const prop of Object.values(this.styleBlock)) {\r\n prop._dispose();\r\n }\r\n }\r\n\r\n if (this.styleList) {\r\n this.styleList._dispose();\r\n }\r\n\r\n this.styleBlock = null;\r\n this.styleList = null;\r\n this.domRule = null;\r\n this.parent = null;\r\n }\r\n\r\n get root() {\r\n let node = this.parent;\r\n while (node instanceof StyleRule) {\r\n node = node.parent;\r\n }\r\n return node;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n \r\n insertStyle(name: string, val: any): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].set(val);\r\n } else {\r\n this.styleBlock[name] = new StyleProperty(name, val, this);\r\n }\r\n }\r\n\r\n removeStyle(name: string): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].remove();\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.styleBlock || !this.styleList) return \"\";\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n const nested = this.styleList.cssText();\r\n return `${this.selectorText} { ${styleStr} ${nested} } `;\r\n }\r\n\r\n mount(domRule: CSSRule | CSSKeyframesRule): void {\r\n if (!domRule || !this.styleList) return;\r\n this.domRule = domRule;\r\n if (\"cssRules\" in domRule) {\r\n this.styleList.mount(domRule.cssRules as CSSRuleList);\r\n }\r\n }\r\n\r\n remove(): void {\r\n\r\n if (this.domRule && this.domRule.parentStyleSheet) {\r\n const sheet = this.domRule.parentStyleSheet;\r\n const rules = sheet.cssRules;\r\n for (let i = 0; i < rules.length; i++) {\r\n if (rules[i] === this.domRule) {\r\n sheet.deleteRule(i);\r\n break;\r\n }\r\n }\r\n }\r\n this._dispose();\r\n }\r\n\r\n render(domSheet: CSSStyleSheet | CSSGroupingRule) {\r\n if (!this.styleBlock || !this.styleList) return;\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n try {\r\n if (!this.selectorText.startsWith(\"@\")) {\r\n const css = `${this.selectorText} { ${styleStr} }`;\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (domRule && \"selectorText\" in domRule) {\r\n this.mount(domRule);\r\n }\r\n } else if (/^@(media|supports|container|layer)\\b/.test(this.selectorText)) {\r\n const index = domSheet.insertRule(`${this.selectorText} {}`, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (\"cssRules\" in domRule) {\r\n this.mount(domRule as CSSGroupingRule);\r\n this.styleList.render(domRule as CSSGroupingRule);\r\n }\r\n } else if (this.selectorText.startsWith(\"@keyframes\") || this.selectorText.startsWith(\"@font-face\")) {\r\n const css = this.cssText();\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n this.mount(domRule);\r\n }\r\n } catch (err) {\r\n console.warn(\"Failed to insert rule:\", this.selectorText, err);\r\n }\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { selectorSplitter } from \"../helpers.js\";\r\nimport { StyleRule } from \"./StyleRule.js\";\r\n\r\nexport class StyleList {\n parent: StyleRule | ElementNode | null;\n items: StyleRule[] = [];\n domStyle: HTMLStyleElement | null = null;\n\r\n constructor(parent: StyleRule | ElementNode) {\r\n this.parent = parent;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n\r\n addCSS(obj: Record<string, any>, parentSelector: string = \"\"): void {\n if (!this.items || !this.parent) return;\n const basic: Record<string, any> = {};\r\n\r\n function getSelector(selector: string, prev: string): string {\r\n return selector.startsWith(\"&\")\r\n ? `${prev}${selector.slice(1)}`\r\n : `${prev} ${selector}`;\r\n }\r\n\r\n for (const selector in obj) {\r\n const value = obj[selector];\r\n let splitKeys = selectorSplitter(selector);\r\n for (let key of splitKeys) {\r\n const currentSelector = getSelector(key, parentSelector);\r\n if (/^@(container|layer|supports|media)\\b/.test(key)) {\r\n if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, parentSelector);\r\n this.items.push(rule);\n }\r\n } else if (key.startsWith(\"@keyframes\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, \"\");\r\n this.items.push(rule);\n } else if (key.startsWith(\"@font-face\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n for (const k in value) rule.insertStyle(k, value[k]);\r\n this.items.push(rule);\n } else if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(currentSelector, this.parent);\r\n this.items.push(rule);\n for (const [k, v] of Object.entries(value)) {\r\n if (typeof v === \"object\" && v != null) {\r\n let newSelector = getSelector(k, currentSelector);\r\n if (k.startsWith(\"&\")) {\r\n this.addCSS(v, newSelector);\r\n } else {\r\n const r = rule.styleList!.insertRule(newSelector);\r\n r.styleList!.addCSS(v, newSelector);\r\n }\r\n } else {\r\n rule.insertStyle(k, v);\r\n }\r\n }\r\n } else {\r\n basic[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if (Object.keys(basic).length) {\r\n const rule = new StyleRule(parentSelector, this.parent);\r\n for (const key in basic) rule.insertStyle(key, basic[key]);\r\n this.items.push(rule);\n }\n }\n\n cssText(): string {\n if (!this.items) return \"\";\n return this.items.map((rule) => rule.cssText()).join(\"\");\n }\n\n insertRule(selector: string): StyleRule {\n if (!this.items || !this.parent) return null as any;\n let rule = this.items.find((rule) => rule.selectorText === selector);\n if (!rule) {\n rule = new StyleRule(selector, this.parent);\n this.items.push(rule);\n }\n return rule;\n }\n\n mount(domRuleList: CSSRuleList): void {\n if (!this.items) return;\n if (!domRuleList) throw Error(\"Require domRuleList argument\");\n let wrongCount = 0;\n const fixOddEven = (css: string) => css.replace(\"(odd)\", \"(2n+1)\").replace(\"(even)\", \"(2n)\");\n\n this.items.forEach((rule, i) => {\n const index = i - wrongCount;\r\n const domRule = domRuleList[index];\r\n if (!domRule) return;\r\n if (rule.selectorText.startsWith(\"@\") && domRule instanceof CSSKeyframesRule) {\r\n rule.mount(domRule);\r\n } else if (\"keyText\" in domRule) {\r\n rule.mount(domRule);\r\n } else if (\"selectorText\" in domRule) {\r\n if (domRule.selectorText !== fixOddEven(rule.selectorText)) {\r\n wrongCount += 1;\r\n } else {\r\n rule.mount(domRule);\r\n }\r\n } else if (\"cssRules\" in domRule) {\r\n rule.mount(domRule as CSSMediaRule);\r\n }\r\n });\r\n }\r\n\r\n render(dom: HTMLStyleElement | CSSGroupingRule) {\n if (dom instanceof HTMLStyleElement) {\n this.domStyle = dom\n this.items.forEach((rule) => rule.render(dom.sheet!));\n } else if (dom instanceof CSSGroupingRule) {\n this.items.forEach((rule) => rule.render(dom));\n }\n }\n\n _dispose(): void {\n\n if (this.items) {\n for (let i = 0; i < this.items.length; i++) {\n this.items[i]._dispose();\n }\n }\n\n this.items = [];\n this.parent = null;\n this.domStyle = null;\n }\n}\n","import type { DomphyElement, EventName, HookMap, TagName, PartialElement } from \"../types.js\";\r\nimport { AttributeList } from \"./AttributeList.js\";\r\nimport { ElementList } from \"./ElementList.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\nimport { validate, mergePartial, getTagName, deepClone, ensureDomStyle } from \"../helpers.js\";\r\nimport { merge, hashString } from \"../utils.js\";\r\nimport { SvgTags } from \"../constants.js\"\r\n\r\nexport class ElementNode {\r\n _disposed = false\r\n type = \"ElementNode\"\r\n parent: ElementNode | null = null;\r\n _portal?: (root: ElementNode) => HTMLElement;\r\n tagName: TagName;\r\n children = new ElementList(this);\r\n styles = new StyleList(this);\r\n attributes = new AttributeList(this);\r\n domElement?: HTMLElement | null = null;\r\n _hooks: HookMap = {};\r\n _events?: { [K in EventName]?: (event: Event, node: ElementNode) => void } | null = null;\r\n _context?: Record<string, any> = {};\r\n _metadata?: Record<string, any> = {};\r\n key?: string | number | null = null;\r\n nodeId: string\r\n\r\n constructor(domphyElement: DomphyElement, _parent: ElementNode | null = null, index = 0) {\r\n domphyElement = deepClone(domphyElement)\r\n validate(domphyElement)\r\n domphyElement.style = domphyElement.style || {}\r\n this.parent = _parent;\r\n this.tagName = getTagName(domphyElement) as TagName;\r\n domphyElement = mergePartial(domphyElement) as DomphyElement\r\n\r\n this.key = (domphyElement as any)._key ?? null;\r\n this._context = domphyElement._context || {}\r\n this._metadata = domphyElement._metadata || {}\r\n\r\n let tempPath = `${this.parent?.nodeId}.${index}`\r\n const str = JSON.stringify(domphyElement.style || {}, (k, v) => typeof v === \"function\" ? tempPath : v,);\r\n this.nodeId = hashString(tempPath + str)\r\n\r\n this.attributes!.addClass(`${this.tagName}_${this.nodeId}`);\r\n if (domphyElement._onSchedule) domphyElement._onSchedule(this, domphyElement)\r\n\r\n this.merge(domphyElement)\r\n\r\n const children = (domphyElement as any)[this.tagName];\r\n\r\n if (children != null && children != undefined) {\r\n if (typeof children === \"function\") {\r\n\r\n let listener: any = () => {\r\n if (this._disposed) return\r\n let input = children(listener)\r\n this.children!.update(Array.isArray(input) ? input : [input])\r\n }\r\n\r\n listener!.elementNode = this;\r\n listener!.debug = `class:${this.tagName}_${this.nodeId} children`;\r\n listener!.onSubscribe = (release: () => void) => this.addHook(\"BeforeRemove\", () => {\r\n release()\r\n listener = null\r\n });\r\n listener && listener();\r\n } else {\r\n this.children!.update(Array.isArray(children) ? children : [children])\r\n }\r\n }\r\n this._hooks.Init && this._hooks.Init(this)\r\n }\r\n\r\n _createDOMNode() {\r\n const svgNamespace = \"http://www.w3.org/2000/svg\"\r\n let node = SvgTags.includes(this.tagName)\r\n ? document.createElementNS(svgNamespace, this.tagName)\r\n : document.createElement(this.tagName)\r\n\r\n this.domElement = node as HTMLElement\r\n\r\n if (this._events) {\r\n for (const key in this._events) {\r\n const eventName = key as EventName;\r\n const handler = this._events[eventName] as (event: Event, node: ElementNode) => void;\r\n let fn: any = (event: Event) => handler(event, this)\r\n node.addEventListener(eventName, fn)\r\n this.addHook(\"BeforeRemove\", (n) => {\r\n n.domElement!.removeEventListener(eventName, fn)\r\n fn = null\r\n })\r\n }\r\n }\r\n\r\n if (this.attributes) {\r\n Object.values(this.attributes.items!).forEach(attr => attr.render())\r\n }\r\n return node\r\n }\r\n\r\n _dispose(): void {\r\n this._disposed = true\r\n if (this.children) {\r\n \r\n this.children._dispose();\r\n }\r\n\r\n if (this.styles) {\r\n this.styles.items!.forEach((rule) => rule.remove());\r\n this.styles._dispose();\r\n }\r\n\r\n if (this.attributes) {\r\n this.attributes._dispose();\r\n }\r\n\r\n this.domElement = null;\r\n this._hooks = {};\r\n this._events = null;\r\n this._context = {};\r\n this._metadata = {};\r\n this.parent = null;\r\n }\r\n merge(part: PartialElement) {\r\n merge(this._context, part._context)\r\n merge(this._metadata, part._metadata)\r\n\r\n const keys = Object.keys(part)\r\n for (let i = 0; i < keys.length; i++) {\r\n const originalKey = keys[i];\r\n const value = (part as any)[originalKey];\r\n if ([\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName].includes(originalKey)) {\r\n continue\r\n } else if ([\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"].includes(originalKey)) {\r\n this.addHook(originalKey.substring(3) as keyof HookMap, value);\r\n } else if (originalKey.startsWith(\"on\")) {\r\n this.addEvent(originalKey.substring(2).toLowerCase() as EventName, value);\r\n } else if (originalKey == \"_portal\") {\r\n this._portal = value\r\n } else if (originalKey == \"class\" && typeof value === \"string\") {\r\n this.attributes!.addClass(value);\r\n } else {\r\n this.attributes!.set(originalKey, value);\r\n }\r\n }\r\n if (part.style) {\r\n this.styles.addCSS(part.style || {}, `.${`${this.tagName}_${this.nodeId}`}`);\r\n }\r\n\r\n }\r\n addEvent(name: EventName, callback: (event: Event, node: ElementNode) => void): void {\r\n\r\n this._events = this._events || {}\r\n\r\n let current = this._events[name]\r\n if (typeof current == \"function\") {\r\n this._events[name] = (event: Event, node: ElementNode) => {\r\n current!(event, node)\r\n callback(event, node)\r\n }\r\n } else {\r\n this._events[name] = callback\r\n }\r\n }\r\n\r\n addHook<K extends keyof HookMap>(name: K, callback: HookMap[K]): void {\r\n const current = this._hooks[name];\r\n\r\n if (typeof current === \"function\") {\r\n this._hooks[name] = ((...args: any[]) => {\r\n (current as Function)(...args);\r\n (callback as Function)(...args);\r\n }) as HookMap[K];\r\n } else {\r\n this._hooks[name] = callback;\r\n }\r\n }\r\n getRoot(): ElementNode {\r\n let root: ElementNode = this;\r\n while (root && root instanceof ElementNode && root.parent) {\r\n root = root.parent;\r\n }\r\n return root\r\n }\r\n\r\n getContext(name: string): any {\r\n let node: ElementNode | null = this;\r\n while (node && (!node._context || !Object.prototype.hasOwnProperty.call(node._context, name))) {\r\n node = node.parent;\r\n }\r\n return node && node._context ? node._context[name] : undefined;\r\n }\r\n\r\n setContext(name: string, value: any) {\r\n this._context = this._context || {}\r\n this._context[name] = value;\r\n }\r\n\r\n getMetadata(name: string): any {\r\n return this._metadata ? this._metadata[name] : undefined;\r\n }\r\n\r\n setMetadata(key: string, value: any) {\r\n this._metadata = this._metadata || {}\r\n this._metadata[key] = value;\r\n\r\n }\r\n\r\n generateCSS(): string {\r\n if (!this.styles || !this.children) return \"\";\r\n let css = this.styles.cssText()\r\n css += this.children.items.map(child => child instanceof ElementNode ? child.generateCSS() : \"\").join(\"\")\r\n return css\r\n }\r\n\r\n generateHTML(): string {\r\n if (!this.children || !this.attributes) return \"\";\r\n let content = this.children.generateHTML();\r\n const attributes = this.attributes.generateHTML();\r\n return `<${this.tagName}${attributes}>${content}</${this.tagName}>`;\r\n }\r\n\r\n mount(domElement: HTMLElement, domStyle?: HTMLStyleElement): void {\r\n if (!domElement) throw new Error(\"Missing dom node on bind\");\r\n this.domElement = domElement;\r\n\r\n if (this._events) {\r\n for (const key in this._events) {\r\n const eventName = key as EventName;\r\n const handler = this._events[eventName] as (event: Event, node: ElementNode) => void;\r\n let fn: any = (event: Event) => handler(event, this)\r\n domElement.addEventListener(eventName, fn)\r\n this.addHook(\"BeforeRemove\", (n) => {\r\n n.domElement!.removeEventListener(eventName, fn)\r\n fn = null\r\n })\r\n }\r\n }\r\n\r\n if (this.children) {\r\n this.children.items.forEach((child, i) => {\r\n const childNode = domElement.childNodes[i];\r\n if (childNode instanceof Node && child instanceof ElementNode) {\r\n child.mount(childNode as HTMLElement, domStyle);\r\n }\r\n });\r\n }\r\n\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n }\r\n\r\n render(domElement: HTMLElement | SVGElement | DocumentFragment): HTMLElement | SVGElement {\r\n const newNode = this._createDOMNode();\r\n domElement.appendChild(newNode)\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n let domStyle = this.getRoot().styles.domStyle\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n domStyle ||= ensureDomStyle(styleParent)\r\n this.styles.render(domStyle as HTMLStyleElement)\r\n this.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(this.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(newNode)\r\n }\r\n })\r\n return newNode;\r\n }\r\n\r\n remove() {\r\n if (this.parent) {\r\n this.parent.children.remove(this)\r\n\r\n } else {\r\n this.domElement?.remove()\r\n this._dispose();\r\n }\r\n }\r\n}\r\n","import { Notifier } from \"./Notifier.js\"\r\n\r\ntype Listener = (...args: any[]) => void\r\n\r\nexport class RecordState<T extends Record<string, any> = Record<string, any>> {\r\n private _notifier = new Notifier()\r\n private _record: T\r\n readonly initialRecord: T\r\n\r\n constructor(record: T) {\r\n this.initialRecord = { ...record }\r\n this._record = { ...record }\r\n }\r\n\r\n get<K extends keyof T>(key: K, l?: Listener): T[K] {\r\n if (l) this._notifier.addListener(key as string, l)\r\n return this._record[key]\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n this._record[key] = value\r\n this._notifier.notify(key as string)\r\n }\r\n\r\n addListener<K extends keyof T>(key: K, fn: Listener): () => void {\r\n return this._notifier.addListener(key as string, fn)\r\n }\r\n\r\n removeListener<K extends keyof T>(key: K, fn: Listener): void {\r\n this._notifier.removeListener(key as string, fn)\r\n }\r\n\r\n reset<K extends keyof T>(key: K): void {\r\n this.set(key, this.initialRecord[key])\r\n }\r\n\r\n _dispose(): void {\r\n this._notifier._dispose()\r\n }\r\n}\r\n","export * from \"./size.js\"\nexport * from \"./density.js\"\nexport * from \"./tone.js\"\nexport * from \"./theme.js\"\n","import { ThemeInput } from \"./types.js\";\r\n\r\nlet light: ThemeInput = {\r\n direction: \"darken\",\r\n colors: {\r\n \"primary\": [\r\n \"#ffffff\",\r\n \"#e3ecff\",\r\n \"#c6daff\",\r\n \"#aac8ff\",\r\n \"#8fb6ff\",\r\n \"#76a3ff\",\r\n \"#5f91fc\",\r\n \"#4a7ff4\",\r\n \"#386ee7\",\r\n \"#2a5ed7\",\r\n \"#1e4ec2\",\r\n \"#1440aa\",\r\n \"#0c3290\",\r\n \"#072674\",\r\n \"#041a57\",\r\n \"#020f38\",\r\n \"#010419\",\r\n \"#000000\"\r\n ],\r\n \"secondary\": [\r\n \"#ffffff\",\r\n \"#fce6ea\",\r\n \"#faced6\",\r\n \"#f7b5c2\",\r\n \"#f29db0\",\r\n \"#ec859e\",\r\n \"#e36e8d\",\r\n \"#d8597d\",\r\n \"#ca456e\",\r\n \"#b93460\",\r\n \"#a42351\",\r\n \"#8e1643\",\r\n \"#770b36\",\r\n \"#5f0529\",\r\n \"#46031d\",\r\n \"#2d0210\",\r\n \"#130104\",\r\n \"#000000\"\r\n ],\r\n \"info\": [\r\n \"#ffffff\",\r\n \"#dcf0f9\",\r\n \"#b7e1f6\",\r\n \"#90d2f1\",\r\n \"#6ac3eb\",\r\n \"#42b4e2\",\r\n \"#16a4d5\",\r\n \"#0094c4\",\r\n \"#0084b2\",\r\n \"#00739e\",\r\n \"#00638a\",\r\n \"#005476\",\r\n \"#004461\",\r\n \"#00354d\",\r\n \"#002638\",\r\n \"#001623\",\r\n \"#00070d\",\r\n \"#000000\"\r\n ],\r\n \"success\": [\r\n \"#ffffff\",\r\n \"#e3f3dc\",\r\n \"#c6e8b8\",\r\n \"#a9dd94\",\r\n \"#8ed171\",\r\n \"#75c450\",\r\n \"#61b635\",\r\n \"#51a51f\",\r\n \"#429304\",\r\n \"#358100\",\r\n \"#2a7000\",\r\n \"#215f00\",\r\n \"#194d00\",\r\n \"#123c00\",\r\n \"#0b2b00\",\r\n \"#051a00\",\r\n \"#010900\",\r\n \"#000000\"\r\n ],\r\n \"warning\": [\r\n \"#ffffff\",\r\n \"#ffeada\",\r\n \"#ffd3b3\",\r\n \"#ffbd8d\",\r\n \"#ffa96b\",\r\n \"#ff9853\",\r\n \"#ec8640\",\r\n \"#d77531\",\r\n \"#c16523\",\r\n \"#aa5718\",\r\n \"#944a0f\",\r\n \"#7e3d09\",\r\n \"#673106\",\r\n \"#512504\",\r\n \"#3b1a03\",\r\n \"#250e02\",\r\n \"#0e0401\",\r\n \"#000000\"\r\n ],\r\n \"attention\": [\r\n \"#ffffff\",\r\n \"#ffeada\",\r\n \"#ffd3b3\",\r\n \"#ffbd8d\",\r\n \"#ffa96b\",\r\n \"#ff9853\",\r\n \"#ec8640\",\r\n \"#d77531\",\r\n \"#c16523\",\r\n \"#aa5718\",\r\n \"#944a0f\",\r\n \"#7e3d09\",\r\n \"#673106\",\r\n \"#512504\",\r\n \"#3b1a03\",\r\n \"#250e02\",\r\n \"#0e0401\",\r\n \"#000000\"\r\n ],\r\n \"error\": [\r\n \"#ffffff\",\r\n \"#fce7e4\",\r\n \"#fbcfca\",\r\n \"#f8b7b0\",\r\n \"#f59f96\",\r\n \"#ef877e\",\r\n \"#e86f67\",\r\n \"#de5852\",\r\n \"#d3403e\",\r\n \"#c5282c\",\r\n \"#b30a1b\",\r\n \"#9e000b\",\r\n \"#860001\",\r\n \"#6c0000\",\r\n \"#510000\",\r\n \"#340000\",\r\n \"#170000\",\r\n \"#000000\"\r\n ],\r\n \"danger\": [\r\n \"#ffffff\",\r\n \"#fce7e4\",\r\n \"#fbcfca\",\r\n \"#f8b7b0\",\r\n \"#f59f96\",\r\n \"#ef877e\",\r\n \"#e86f67\",\r\n \"#de5852\",\r\n \"#d3403e\",\r\n \"#c5282c\",\r\n \"#b30a1b\",\r\n \"#9e000b\",\r\n \"#860001\",\r\n \"#6c0000\",\r\n \"#510000\",\r\n \"#340000\",\r\n \"#170000\",\r\n \"#000000\"\r\n ],\r\n \"highlight\": [\r\n \"#ffffff\",\r\n \"#f9f5cd\",\r\n \"#f4eb95\",\r\n \"#efe05a\",\r\n \"#e6d427\",\r\n \"#d3c100\",\r\n \"#bfad00\",\r\n \"#ab9b00\",\r\n \"#988900\",\r\n \"#857700\",\r\n \"#736600\",\r\n \"#615600\",\r\n \"#4f4600\",\r\n \"#3e3600\",\r\n \"#2c2700\",\r\n \"#1b1700\",\r\n \"#090700\",\r\n \"#000000\"\r\n ],\r\n \"neutral\": [\r\n \"#ffffff\",\r\n \"#ededed\",\r\n \"#dbdbdb\",\r\n \"#cacaca\",\r\n \"#bababa\",\r\n \"#ababab\",\r\n \"#9b9b9b\",\r\n \"#8d8d8d\",\r\n \"#7e7e7e\",\r\n \"#707070\",\r\n \"#636363\",\r\n \"#565656\",\r\n \"#484848\",\r\n \"#383838\",\r\n \"#282828\",\r\n \"#181818\",\r\n \"#080808\",\r\n \"#000000\"\r\n ]\r\n },\r\n baseTones: {\r\n highlight: 5,\r\n warning: 6,\r\n error: 8,\r\n danger: 8,\r\n secondary: 8,\r\n primary: 9,\r\n info: 8,\r\n success: 8,\r\n neutral: 8,\r\n },\r\n fontSizes: [\"0.75rem\", \"0.875rem\", \"1rem\", \"1.25rem\", \"1.5625rem\", \"1.9375rem\", \"2.4375rem\", \"3.0625rem\"],\r\n densities: [0.75, 1, 1.5, 2, 2.5],\r\n darkBias: 1,\r\n custom: {},\r\n}\r\n\r\nexport default light\r\n","import { ElementNode, Listener } from \"@domphy/core\";\r\nimport { ThemeInput, ThemeVars } from \"./types.js\";\r\nimport light from \"./light.js\";\r\n\r\n// JSON clone (not structuredClone) so the build runs in older embedded\r\n// browsers like SketchUp 2022's CEF, which predates Chromium 98.\r\n// ThemeInput is plain JSON (no Map/Set/Date/typed arrays).\r\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v));\r\n\r\nconst themes: Record<string, ThemeInput> = {\r\n light: clone(light),\r\n dark: createDark(light),\r\n};\r\n\r\nfunction colorSteps(input: ThemeInput): number {\r\n const firstColor = Object.keys(input.colors)[0];\r\n return firstColor ? input.colors[firstColor].length : 0;\r\n}\r\n\r\n// --- Validation ---\r\n\r\nfunction validateTheme(partial: Partial<ThemeInput>): void {\r\n for (let key in partial) {\r\n if (!Object.keys(light).includes(key as keyof ThemeInput)) {\r\n throw new Error(`Invalid key: ${key}`);\r\n }\r\n }\r\n if (partial.fontSizes && !Array.isArray(partial.fontSizes)) {\r\n throw new Error(`fontSize must be array of string`);\r\n }\r\n if (partial.densities) {\r\n if (!Array.isArray(partial.densities) || partial.densities.some(v => typeof v !== \"number\")) {\r\n throw new Error(`densities must be array of number`);\r\n }\r\n }\r\n if (\"custom\" in partial) {\r\n const custom = partial.custom!;\r\n if (typeof custom !== \"object\" || custom === null) {\r\n throw new Error(`Invalid custom property: must be an object`);\r\n }\r\n }\r\n}\r\n\r\n// --- Deep Merge ---\r\n\r\nfunction deepMerge(target: any, source: any): void {\r\n for (const key in source) {\r\n if (\r\n source[key] &&\r\n typeof source[key] === \"object\" &&\r\n !Array.isArray(source[key])\r\n ) {\r\n target[key] ??= {};\r\n deepMerge(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n}\r\n\r\n// --- Builders (pure functions) ---\r\n\r\nfunction buildThemeCSS(name: string, input: ThemeInput): string {\r\n const styles: Record<string, string | number> = {};\r\n const toneSteps = colorSteps(input);\r\n\r\n for (const key in input) {\r\n const value = input[key as keyof ThemeInput];\r\n\r\n if (key === \"colors\") {\r\n for (const colorName in input.colors) {\r\n [...Array(toneSteps).keys()].forEach(i =>\r\n styles[`--${colorName}-${i}`] = input.colors[colorName][i]\r\n );\r\n }\r\n } else if (key === \"fontSizes\") {\r\n [...Array(8).keys()].forEach(i =>\r\n styles[`--fontSize-${i}`] = input.fontSizes[i]\r\n );\r\n } else if (key === \"densities\") {\r\n continue;\r\n } else {\r\n if (typeof value === \"object\" && value !== null) {\r\n for (const k in value) {\r\n styles[`--${key}-${k.replace(\"/\", \"_\")}`] = (value as Record<string, string>)[k];\r\n }\r\n }\r\n }\r\n }\r\n\r\n let text = \"\";\r\n for (const prop in styles) {\r\n text += ` ${prop}: ${styles[prop]};\\n`;\r\n }\r\n return `[data-theme=\"${name}\"] {\\n${text}}`;\r\n}\r\n\r\n// --- Public API ---\r\n\r\nexport function getTheme(name: string): ThemeInput {\r\n if (!themes[name]) throw Error(`Theme \"${name}\" not found`);\r\n return themes[name];\r\n}\r\n\r\nexport function setTheme(name: string, input: Partial<ThemeInput>): void {\r\n validateTheme(input);\r\n if (!themes[name]) themes[name] = clone(light);\r\n deepMerge(themes[name], input);\r\n}\r\n\r\nfunction createDark(source: ThemeInput): ThemeInput {\r\n let dark = clone(source)\r\n dark.direction = \"lighten\"\r\n for (let name in dark.colors) {\r\n dark.colors[name].reverse()\r\n dark.baseTones[name] = dark.colors[name].length - 1 - dark.baseTones[name]\r\n }\r\n return dark\r\n}\r\n\r\nexport function themeTokens(name: string): Record<string, any> {\r\n let input = getTheme(name)\r\n const toneSteps = colorSteps(input);\r\n let tokens: Record<string, any> = {};\r\n\r\n for (const key in input) {\r\n const value = input[key as keyof ThemeInput];\r\n\r\n if (key === \"colors\") {\r\n for (const name in input.colors) {\r\n let colorTones = {} as Partial<Record<number, string>>;\r\n [...Array(toneSteps).keys()].forEach(i => colorTones[i] = input.colors[name][i]);\r\n tokens[name] = colorTones as Record<number, string>;\r\n }\r\n } else if (key === \"fontSizes\") {\r\n tokens.fontSizes = input.fontSizes;\r\n } else if (key === \"densities\") {\r\n tokens.densities = input.densities;\r\n } else {\r\n tokens[key] = {} as any;\r\n if (typeof value === \"object\" && value !== null) {\r\n for (const k in value) {\r\n tokens[key][k] = (value as Record<string, string>)[k];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return tokens;\r\n}\r\n\r\nexport function themeVars(): ThemeVars {\r\n let input = getTheme(\"light\")\r\n const toneSteps = colorSteps(input);\r\n let theme = {} as ThemeVars;\r\n\r\n for (const key in input) {\r\n const section = key as keyof ThemeVars;\r\n const value = input[key as keyof ThemeInput];\r\n\r\n if (key === \"colors\") {\r\n for (const name in input.colors) {\r\n let colorTones = {} as Partial<Record<number, string>>;\r\n [...Array(toneSteps).keys()].forEach(i => colorTones[i] = `var(--${name}-${i})`);\r\n theme[name] = colorTones as Record<number, string>;\r\n }\r\n } else if (key === \"fontSizes\") {\r\n theme.fontSizes = [...Array(8).keys()].map(i => `var(--fontSize-${i})`);\r\n } else if (key === \"densities\") {\r\n continue;\r\n } else {\r\n theme[section] = {} as ThemeVars[typeof section];\r\n if (typeof value === \"object\" && value !== null) {\r\n for (const k in value) {\r\n (theme[section] as Record<string, string>)[k] = `var(--${section as string}-${k.replace(\"/\", \"_\")})`;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return theme;\r\n}\r\n\r\nexport function themeCSS(): string {\r\n return Object.entries(themes)\r\n .map(([name, input]) => buildThemeCSS(name, input))\r\n .join(\"\\n\")\r\n}\r\n\r\nexport function themeApply(el?: HTMLStyleElement): void {\r\n if (typeof document === \"undefined\") return\r\n if (el) {\r\n el.textContent = themeCSS()\r\n return\r\n } else {\r\n el = document.getElementById(\"domphy-themes\") as HTMLStyleElement\r\n ?? Object.assign(document.createElement(\"style\"), { id: \"domphy-themes\" })\r\n el.textContent = themeCSS()\r\n document.head.appendChild(el)\r\n }\r\n\r\n}\r\n\r\nexport function themeSpacing(n: number) {\r\n return n / 4 + \"em\"\r\n}\r\n\r\nexport function themeName(object: ElementNode | Listener) {\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTheme\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let themeName = \"light\"\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTheme\")) {\r\n themeName = node.attributes.get(\"dataTheme\")\r\n typeof object == \"function\" && node.attributes.addListener(\"dataTheme\", object)\r\n }\r\n return themeName\r\n}\r\n\r\nexport type ThemeColor = keyof ThemeInput[\"colors\"]\r\n","import type { ElementNode, Listener } from \"@domphy/core\";\nimport { themeVars } from \"./theme.js\";\n\nconst ElementSizes = [\"inherit\"];\n\n[...Array(8).keys()].forEach(i =>{\n ElementSizes.push(`decrease-${i}`)\n ElementSizes.push(`increase-${i}`)\n})\n\nexport type ElementSize = typeof ElementSizes[number];\n\nfunction offsetSize(origin: number, size: ElementSize = \"inherit\"): number {\n\n if (!ElementSizes.includes(size!)) {\n throw Error(`size name \"${size}\" invalid`)\n }\n let resultSize: number\n if (size == \"inherit\") {\n resultSize = origin as number\n } else if (size?.startsWith(\"increase-\")) {\n let offset = parseInt(size.replace(\"increase-\", \"\"), 10)\n resultSize = origin + offset;\n } else if (size?.startsWith(\"decrease-\")) {\n let offset = parseInt(size.replace(\"decrease-\", \"\"), 10)\n resultSize = origin - offset;\n } else {\n resultSize = origin\n }\n return Math.max(0, Math.min(8, resultSize))\n}\n\nfunction contextSize(object: ElementNode | Listener | null): number {\n\n if (!object) return 2\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataSize\"))) {\n node = node.parent as ElementNode\n }\n\n let size = 2\n\n if (node && node.attributes && node.attributes.has(\"dataSize\")) {\n size = offsetSize(size, node.attributes.get(\"dataSize\"))\n typeof object == \"function\" && node.attributes.addListener(\"dataSize\", object)\n }\n return size\n}\n\n\nexport function themeSize(object: ElementNode | Listener, size: ElementSize = \"inherit\"): string {\n let index = offsetSize(contextSize(object), size)\n return themeVars().fontSizes[index]\n}","import type { ElementNode, Listener } from \"@domphy/core\";\nimport { getTheme, themeName } from \"./theme.js\";\n\nconst ElementDensities = [\"inherit\"];\n\n[...Array(5).keys()].forEach(i => {\n ElementDensities.push(`decrease-${i}`);\n ElementDensities.push(`increase-${i}`);\n});\n\nexport type ElementDensity = typeof ElementDensities[number];\n\nfunction offsetDensity(origin: number, density: ElementDensity = \"inherit\"): number {\n\n if (!ElementDensities.includes(density!)) {\n throw Error(`density name \"${density}\" invalid`);\n }\n let resultDensity: number;\n if (density == \"inherit\") {\n resultDensity = origin as number;\n } else if (density?.startsWith(\"increase-\")) {\n let offset = parseInt(density.replace(\"increase-\", \"\"), 10);\n resultDensity = origin + offset;\n } else if (density?.startsWith(\"decrease-\")) {\n let offset = parseInt(density.replace(\"decrease-\", \"\"), 10);\n resultDensity = origin - offset;\n } else {\n resultDensity = origin;\n }\n return Math.max(0, Math.min(4, resultDensity));\n}\n\nfunction contextDensity(object: ElementNode | Listener | null): number {\n\n if (!object) return 2;\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode;\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataDensity\"))) {\n node = node.parent as ElementNode;\n }\n\n let density = 2;\n\n if (node && node.attributes && node.attributes.has(\"dataDensity\")) {\n density = offsetDensity(density, node.attributes.get(\"dataDensity\"));\n typeof object == \"function\" && node.attributes.addListener(\"dataDensity\", object);\n }\n return density;\n}\n\nexport function themeDensity(object: ElementNode | Listener | null): number {\n let index = contextDensity(object);\n return getTheme(object ? themeName(object) : \"light\").densities[index];\n}\n","import { themeVars, themeTokens, getTheme, themeName } from \"./theme.js\"\r\nimport light from \"./light.js\";\r\nimport type { Listener, ElementNode } from \"@domphy/core\";\r\n\r\nconst TONE_STEPS = light.colors.neutral.length\r\n\r\nconst ElementTones = [\"inherit\", \"base\"];\r\n\r\n[...Array(TONE_STEPS).keys()].forEach(i => {\r\n ElementTones.push(`decrease-${i}`)\r\n ElementTones.push(`increase-${i}`)\r\n ElementTones.push(`shift-${i}`)\r\n})\r\n\r\nexport type ElementTone = typeof ElementTones[number];\r\n\r\nfunction adjustTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone + level;\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction shiftTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let midpoint = Math.floor((TONE_STEPS - 1) / 2)\r\n let newIndex = tone <= midpoint ? tone + level : tone - level\r\n newIndex = newIndex < 0 || newIndex > TONE_STEPS - 1 ? - newIndex : newIndex\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction offsetTone(originTone: number, tone: ElementTone = \"inherit\"): number {\r\n\r\n if (typeof tone == \"number\") return tone\r\n\r\n if (tone == \"inherit\") return originTone\r\n\r\n if (!ElementTones.includes(tone!)) {\r\n throw Error(`tone name \"${tone}\" invalid`)\r\n }\r\n\r\n if (tone.startsWith(\"increase-\")) {\r\n let offset = parseInt(tone.replace(\"increase-\", \"\"), 10)\r\n return adjustTone(originTone, offset);\r\n\r\n } else if (tone.startsWith(\"decrease-\")) {\r\n let offset = parseInt(tone.replace(\"decrease-\", \"\"), 10)\r\n return adjustTone(originTone, - offset);\r\n\r\n } else if (tone.startsWith(\"shift-\")) {\r\n let offset = parseInt(tone.replace(\"shift-\", \"\"), 10)\r\n return shiftTone(originTone, offset);\r\n\r\n } else {\r\n return originTone\r\n }\r\n}\r\n\r\nfunction contextTone(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 0\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTone\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let tone = 0\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTone\")) {\r\n tone = offsetTone(tone, node.attributes.get(\"dataTone\"))\r\n typeof object == \"function\" && node.attributes.addListener(\"dataTone\", object)\r\n }\r\n return tone\r\n}\r\n\r\nfunction themeTone(object: ElementNode | Listener, tone: ElementTone = \"inherit\"): number {\r\n\r\n return offsetTone(contextTone(object), tone)\r\n}\r\n\r\nfunction biasContext(context: number, direction: string, bias: number): number {\r\n if (bias <= 0) return context\r\n if (direction === \"lighten\" && context === 0) return bias\r\n if (direction === \"darken\" && context === TONE_STEPS - 1) return TONE_STEPS - 1 - bias\r\n return context\r\n}\r\n\r\nexport function themeColor(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let themeColor = color == \"inherit\" ? \"neutral\" : color;\r\n\r\n if (!object) {\r\n return themeVars()[themeColor][offsetTone(0, tone)]\r\n }\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(themeName(object)).baseTones[themeColor]\r\n } else {\r\n let theme = getTheme(themeName(object))\r\n let context = biasContext(contextTone(object), theme.direction, theme.darkBias)\r\n resultTone = offsetTone(context, tone)\r\n }\r\n let colors = themeVars()[themeColor]\r\n if (!colors){\r\n throw Error(`color \"${JSON.stringify(themeColor)}\" not found on theme \"${themeName(object)}`)\r\n }\r\n let resultColor = colors[resultTone]\r\n\r\n return resultColor\r\n}\r\n\r\nexport function themeColorToken(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let colorName = color == \"inherit\" ? \"neutral\" : color;\r\n let name = object ? themeName(object as ElementNode | Listener) : \"light\";\r\n let tokens = themeTokens(name);\r\n\r\n if (!object) {\r\n return tokens[colorName][offsetTone(0, tone)]\r\n }\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(name).baseTones[colorName]\r\n } else {\r\n let theme = getTheme(name)\r\n let context = biasContext(contextTone(object), theme.direction, theme.darkBias)\r\n resultTone = offsetTone(context, tone)\r\n }\r\n\r\n return tokens[colorName][resultTone]\r\n}\r\n"],"mappings":"mcAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,UAAAE,EAAA,UAAAC,inBCAaC,GAAkB,CAC7B,UACA,aACA,gBACA,iBACA,SACA,WACA,YACA,mBACA,WACA,UACA,UACA,gBACA,gBACA,oBACA,SACA,cACA,QACA,aACA,SACA,YACA,cACA,cACA,aACA,cACA,SACA,mBACA,YACA,UACA,UACA,UACA,aACA,UACA,YACA,YACA,aACA,UACA,SACA,eACA,mBACA,cACA,cACA,eACA,eACA,cACA,aACA,cACA,YACA,UACA,UACA,SACA,YACA,aACA,eACA,UACA,WACA,WACA,cACA,4BACA,WACA,YACA,WACA,eACA,YACA,WACA,YACA,eACA,WACA,iBACA,YACA,UACA,eACA,cACA,aACA,gBACA,gBACA,gBACA,cACA,kBACA,iBACA,iBACA,gBACA,eACA,sBACA,uBACA,qBACA,sBACA,mBACA,kBACA,oBACA,mBACA,iBACA,uBACA,qBACA,oBACA,YACA,YACF,EAEaC,GAAeD,GAAgB,OAAO,CAACE,EAAKC,IAAO,CAC9D,IAAMC,EAAMD,EAAG,MAAM,CAAC,EAAE,YAAY,EACpC,OAAAD,EAAIE,CAAG,EAAID,EACJD,CACT,EAAG,CAAC,CAAiF,ECvGxEG,EAAW,CACtB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,OACA,aACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QA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AAyBvC,EAAc,CACnC,KAAK,IAAIA,EAAK,KAAK,cAAcA,CAAG,CAAC,CACzC,CAEA,UAAiB,CACb,KAAK,UAAU,SAAS,CAC5B,CACJ,ECvCA,IAAA4L,EAAA,GAAAC,EAAAD,EAAA,cAAAE,EAAA,aAAAC,GAAA,eAAAC,GAAA,aAAAC,EAAA,eAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,cAAAC,EAAA,cAAAC,GAAA,iBAAAC,GAAA,gBAAAC,EAAA,cAAAC,ICEA,IAAIC,GAAoB,CACtB,UAAW,SACX,OAAQ,CACN,QAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,UAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,KAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,QAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,QAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,UAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,MAAS,CACP,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,OAAU,CACR,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,UAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UAC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","names":["global_exports","__export","dist_exports","src_exports","EventProperties","eventNameMap","acc","ev","key","HtmlTags","_chain","Notifier","event","listener","release","listeners","args","idx","n","e","names","pending","chain","State","initialValue","name","newValue","merge","source","target","comma","space","adjacent","deepClone","value","old","val1","val2","addEvent","addHook","hashString","str","hash","i","toState","val","r","fn","partial","hookName","handler","hookProperty","current","attributes","eventName","eventProperty","node","seen","proto","clone","v","k","validate","element","asPartial","keys","isHTML","escapeHTML","getTagName","camelToKebab","selectorSplitter","selectors","splitted","parens","angulars","soFar","len","char","ensureDomStyle","styleParent","_a","domStyle","mergePartial","part","p","VoidTags","SvgTags","BooleanAttributes","PrefixCSS","CamelAttributes","ElementAttribute","parent","domElement","mutateAttrs","_b","prev","callback","AttributeList","attr","force","className","add","classes","newClass","list","updated","cls","oldClass","TextNode","textContent","newNode","tpl","domText","ElementList","ElementNode","index","dom","el","currentRef","aNode","bNode","a","b","aNext","bNext","inputs","updateDom","silent","_c","_d","oldItems","keyed","item","input","reused","cur","isPortal","length","finalIndex","domNode","ref","root","child","done","doneCalled","onceDone","snapshot","aIndex","bIndex","itemA","itemB","fromIndex","toIndex","html","StyleProperty","parentRule","domRule","style","prefix","StyleRule","_StyleRule","selectorText","StyleList","prop","styleStr","decl","nested","sheet","rules","domSheet","css","err","obj","parentSelector","basic","getSelector","selector","splitKeys","currentSelector","rule","newSelector","domRuleList","wrongCount","fixOddEven","_ElementNode","domphyElement","_parent","tempPath","children","originalKey","content","childNode","RecordState","record","__spreadValues","l","src_exports","__export","getTheme","setTheme","themeApply","themeCSS","themeColor","themeColorToken","themeDensity","themeName","themeSize","themeSpacing","themeTokens","themeVars","light","light_default","clone","v","themes","light_default","createDark","colorSteps","input","firstColor","validateTheme","partial","key","custom","deepMerge","target","source","_a","buildThemeCSS","name","styles","toneSteps","value","colorName","i","k","text","prop","getTheme","setTheme","dark","themeTokens","tokens","colorTones","themeVars","theme","section","themeCSS","themeApply","el","themeSpacing","n","themeName","object","node","ElementSizes","i","offsetSize","origin","size","resultSize","offset","contextSize","object","node","themeSize","index","themeVars","ElementDensities","i","offsetDensity","origin","density","resultDensity","offset","contextDensity","object","node","themeDensity","index","getTheme","themeName","TONE_STEPS","light_default","ElementTones","i","adjustTone","tone","level","newIndex","shiftTone","midpoint","offsetTone","originTone","offset","contextTone","object","node","biasContext","context","direction","bias","TONE_STEPS","themeColor","object","tone","color","themeVars","offsetTone","resultTone","getTheme","themeName","theme","contextTone","colors","themeColorToken","colorName","name","tokens","themeTokens"]}
1
+ {"version":3,"sources":["../src/global.ts","../../core/src/types/EventProperties.ts","../../core/src/constants/HtmlTags.ts","../../core/src/classes/Notifier.ts","../../core/src/classes/State.ts","../../core/src/utils.ts","../../core/src/helpers.ts","../../core/src/constants/VoidTags.ts","../../core/src/constants/SvgTags.ts","../../core/src/constants/BooleanAttributes.ts","../../core/src/constants/PrefixCSS.ts","../../core/src/constants/CamelAttributes.ts","../../core/src/classes/ElementAttribute.ts","../../core/src/classes/AttributeList.ts","../../core/src/classes/TextNode.ts","../../core/src/classes/ElementList.ts","../../core/src/classes/StyleProperty.ts","../../core/src/classes/StyleRule.ts","../../core/src/classes/StyleList.ts","../../core/src/classes/ElementNode.ts","../../core/src/classes/RecordState.ts","../src/index.ts","../src/light.ts","../src/theme.ts","../src/size.ts","../src/density.ts","../src/tone.ts"],"sourcesContent":["export * as core from \"@domphy/core\"\r\nexport * as theme from \"./index.js\"\r\n","export const EventProperties = [\r\n \"onAbort\",\r\n \"onAuxClick\",\r\n \"onBeforeMatch\",\r\n \"onBeforeToggle\",\r\n \"onBlur\",\r\n \"onCancel\",\r\n \"onCanPlay\",\r\n \"onCanPlayThrough\",\r\n \"onChange\",\r\n \"onClick\",\r\n \"onClose\",\r\n \"onContextLost\",\r\n \"onContextMenu\",\r\n \"onContextRestored\",\r\n \"onCopy\",\r\n \"onCueChange\",\r\n \"onCut\",\r\n \"onDblClick\",\r\n \"onDrag\",\r\n \"onDragEnd\",\r\n \"onDragEnter\",\r\n \"onDragLeave\",\r\n \"onDragOver\",\r\n \"onDragStart\",\r\n \"onDrop\",\r\n \"onDurationChange\",\r\n \"onEmptied\",\r\n \"onEnded\",\r\n \"onError\",\r\n \"onFocus\",\r\n \"onFormData\",\r\n \"onInput\",\r\n \"onInvalid\",\r\n \"onKeyDown\",\r\n \"onKeyPress\",\r\n \"onKeyUp\",\r\n \"onLoad\",\r\n \"onLoadedData\",\r\n \"onLoadedMetadata\",\r\n \"onLoadStart\",\r\n \"onMouseDown\",\r\n \"onMouseEnter\",\r\n \"onMouseLeave\",\r\n \"onMouseMove\",\r\n \"onMouseOut\",\r\n \"onMouseOver\",\r\n \"onMouseUp\",\r\n \"onPaste\",\r\n \"onPause\",\r\n \"onPlay\",\r\n \"onPlaying\",\r\n \"onProgress\",\r\n \"onRateChange\",\r\n \"onReset\",\r\n \"onResize\",\r\n \"onScroll\",\r\n \"onScrollEnd\",\r\n \"onSecurityPolicyViolation\",\r\n \"onSeeked\",\r\n \"onSeeking\",\r\n \"onSelect\",\r\n \"onSlotChange\",\r\n \"onStalled\",\r\n \"onSubmit\",\r\n \"onSuspend\",\r\n \"onTimeUpdate\",\r\n \"onToggle\",\r\n \"onVolumeChange\",\r\n \"onWaiting\",\r\n \"onWheel\",\r\n \"onTouchStart\",\r\n \"onTouchMove\",\r\n \"onTouchEnd\",\r\n \"onTouchCancel\",\r\n \"onPointerDown\",\r\n \"onPointerMove\",\r\n \"onPointerUp\",\r\n \"onPointerCancel\",\r\n \"onPointerEnter\",\r\n \"onPointerLeave\",\r\n \"onPointerOver\",\r\n \"onPointerOut\",\r\n \"onGotPointerCapture\",\r\n \"onLostPointerCapture\",\r\n \"onCompositionStart\",\r\n \"onCompositionUpdate\",\r\n \"onCompositionEnd\",\r\n \"onTransitionEnd\",\r\n \"onTransitionStart\",\r\n \"onAnimationStart\",\r\n \"onAnimationEnd\",\r\n \"onAnimationIteration\",\r\n \"onFullscreenChange\",\r\n \"onFullscreenError\",\r\n \"onFocusIn\",\r\n \"onFocusOut\",\r\n] as const\r\n\r\nexport const eventNameMap = EventProperties.reduce((acc, ev) => {\r\n const key = ev.slice(2).toLowerCase() as keyof HTMLElementEventMap\r\n acc[key] = ev;\r\n return acc;\r\n}, {} as Partial<Record<keyof HTMLElementEventMap, (typeof EventProperties)[number]>>);\r\n","export const HtmlTags = [\r\n \"a\",\r\n \"abbr\",\r\n \"address\",\r\n \"article\",\r\n \"aside\",\r\n \"audio\",\r\n \"b\",\r\n \"base\",\r\n \"blockquote\",\r\n \"br\",\r\n \"button\",\r\n \"canvas\",\r\n \"caption\",\r\n \"cite\",\r\n \"code\",\r\n \"col\",\r\n \"colgroup\",\r\n \"data\",\r\n \"datalist\",\r\n \"dd\",\r\n \"del\",\r\n \"details\",\r\n \"dfn\",\r\n \"dialog\",\r\n \"div\",\r\n \"dl\",\r\n \"dt\",\r\n \"em\",\r\n \"fieldset\",\r\n \"figcaption\",\r\n \"figure\",\r\n \"footer\",\r\n \"form\",\r\n \"h1\",\r\n \"h2\",\r\n \"h3\",\r\n \"h4\",\r\n \"h5\",\r\n \"h6\",\r\n \"header\",\r\n \"hgroup\",\r\n \"i\",\r\n \"iframe\",\r\n \"img\",\r\n \"input\",\r\n \"ins\",\r\n \"kbd\",\r\n \"label\",\r\n \"legend\",\r\n \"li\",\r\n \"main\",\r\n \"map\",\r\n \"mark\",\r\n \"meta\",\r\n \"meter\",\r\n \"nav\",\r\n \"noscript\",\r\n \"object\",\r\n \"ol\",\r\n \"optgroup\",\r\n \"option\",\r\n \"output\",\r\n \"p\",\r\n \"param\",\r\n \"picture\",\r\n \"pre\",\r\n \"progress\",\r\n \"q\",\r\n \"rp\",\r\n \"rt\",\r\n \"ruby\",\r\n \"s\",\r\n \"samp\",\r\n \"section\",\r\n \"select\",\r\n \"slot\",\r\n \"small\",\r\n \"source\",\r\n \"span\",\r\n \"strong\",\r\n \"sub\",\r\n \"summary\",\r\n \"sup\",\r\n \"table\",\r\n \"tbody\",\r\n \"td\",\r\n \"template\",\r\n \"textarea\",\r\n \"tfoot\",\r\n \"th\",\r\n \"thead\",\r\n \"time\",\r\n \"title\",\r\n \"tr\",\r\n \"track\",\r\n \"u\",\r\n \"ul\",\r\n \"var\",\r\n \"video\",\r\n \"wbr\",\r\n \"bdi\",\r\n \"bdo\",\r\n \"math\",\r\n \"menu\",\r\n \"search\",\r\n \"area\",\r\n \"embed\",\r\n \"hr\",\r\n \"animate\",\r\n \"animateMotion\",\r\n \"animateTransform\",\r\n \"circle\",\r\n \"clipPath\",\r\n \"cursor\",\r\n \"defs\",\r\n \"desc\",\r\n \"ellipse\",\r\n \"feBlend\",\r\n \"feColorMatrix\",\r\n \"feComponentTransfer\",\r\n \"feComposite\",\r\n \"feConvolveMatrix\",\r\n \"feDiffuseLighting\",\r\n \"feDisplacementMap\",\r\n \"feDistantLight\",\r\n \"feDropShadow\",\r\n \"feFlood\",\r\n \"feFuncA\",\r\n \"feFuncB\",\r\n \"feFuncG\",\r\n \"feFuncR\",\r\n \"feGaussianBlur\",\r\n \"feImage\",\r\n \"feMerge\",\r\n \"feMergeNode\",\r\n \"feMorphology\",\r\n \"feOffset\",\r\n \"fePointLight\",\r\n \"feSpecularLighting\",\r\n \"feSpotLight\",\r\n \"feTile\",\r\n \"feTurbulence\",\r\n \"filter\",\r\n \"foreignObject\",\r\n \"g\",\r\n \"image\",\r\n \"line\",\r\n \"linearGradient\",\r\n \"marker\",\r\n \"mask\",\r\n \"metadata\",\r\n \"mpath\",\r\n \"path\",\r\n \"pattern\",\r\n \"polygon\",\r\n \"polyline\",\r\n \"prefetch\",\r\n \"radialGradient\",\r\n \"rect\",\r\n \"set\",\r\n \"solidColor\",\r\n \"stop\",\r\n \"svg\",\r\n \"switch\",\r\n \"symbol\",\r\n \"tbreak\",\r\n \"text\",\r\n \"textPath\",\r\n \"tspan\",\r\n \"use\",\r\n \"view\",\r\n];","import { Handler } from \"../types.js\"\n\ntype ChainEntry = [notifier: Notifier, event: string]\n\n// Shared across all instances to track the flush chain for circular detection.\nlet _chain: ChainEntry[] = []\n\n// Microtask scheduler. Older embedded Chromium runtimes (SketchUp 2020 /\n// 2021.0 ship CEF 64) predate `queueMicrotask` (added in Chrome 71). A\n// resolved Promise's `.then` runs as a microtask in the same checkpoint, so\n// it is the standard fallback. The `.catch` mimics `queueMicrotask`'s\n// behaviour of surfacing thrown errors to the global error handler rather\n// than silently becoming an unhandled-rejection.\nconst _microtask: (cb: () => void) => void =\n typeof queueMicrotask === \"function\"\n ? queueMicrotask\n : (cb) => {\n Promise.resolve().then(cb).catch((e) => {\n setTimeout(() => { throw e }, 0)\n })\n }\n\n// Cap on self-re-notifications within one settle burst. A converging update\n// (clamp/normalize) reaches a fixpoint in a pass or two; anything beyond this is\n// a genuinely diverging self-feedback loop and is stopped like a cycle.\nconst SELF_NOTIFY_CAP = 100\n\nexport class Notifier {\n private _listeners: Record<string, Set<Handler>> | null = {}\n private _pending: Map<string, { args: unknown[], chain: ChainEntry[] }> = new Map()\n private _scheduled = false\n // Args currently being delivered per event (used to detect a self-update fixpoint).\n private _flushing: Map<string, unknown[]> = new Map()\n // Self-re-notification depth in the current settle burst (runaway guard).\n private _selfDepth = 0\n\n _dispose(): void {\n if (this._listeners) {\n for (const event in this._listeners) {\n this._listeners[event].clear()\n }\n }\n this._listeners = null\n }\n\n addListener(event: string, listener: Handler): () => void {\n if (!this._listeners) return () => {}\n\n if (typeof event !== \"string\" || typeof listener !== \"function\") {\n throw new Error(\"Event name must be a string, listener must be a function\")\n }\n\n if (!this._listeners[event]) {\n this._listeners[event] = new Set()\n }\n\n const release = () => this.removeListener(event, listener)\n\n if (this._listeners[event].has(listener)) return release\n\n this._listeners[event].add(listener)\n if (typeof listener.onSubscribe === \"function\") {\n listener.onSubscribe(release)\n }\n\n return release\n }\n\n removeListener(event: string, listener: Handler): void {\n if (!this._listeners) return\n\n const listeners = this._listeners[event]\n if (listeners && listeners.has(listener)) {\n listeners.delete(listener)\n if (listeners.size === 0) {\n delete this._listeners[event]\n }\n }\n }\n\n notify(event: string, ...args: unknown[]): void {\n if (!this._listeners) return\n if (!this._listeners[event]) return\n\n // A listener that re-sets its OWN state mid-flush shows up as [this,event] at\n // the TOP of the chain. That is a converging self-update (clamp/normalize),\n // not a cross-state cycle — let it re-propagate with a fresh chain. A deeper\n // match (intervening notifiers) is a real cycle and is still rejected.\n const top = _chain.length ? _chain[_chain.length - 1] : null\n const selfReentry = !!top && top[0] === this && top[1] === event\n\n if (selfReentry) {\n const inflight = this._flushing.get(event)\n // Same value as the one being delivered → fixpoint reached, stop quietly.\n if (inflight && inflight[0] === args[0]) return\n if (this._selfDepth >= SELF_NOTIFY_CAP) {\n console.error(`[Domphy] Runaway self-update on \"${event}\" — stopped after ${SELF_NOTIFY_CAP} iterations`)\n return\n }\n this._selfDepth++\n this._pending.set(event, { args, chain: [] })\n } else {\n if (this._isCircular(event)) return\n this._pending.set(event, { args, chain: [..._chain] })\n }\n\n if (!this._scheduled) {\n this._scheduled = true\n _microtask(() => this._flushAll())\n }\n }\n\n private _isCircular(event: string): boolean {\n const idx = _chain.findIndex(([n, e]) => n === this && e === event)\n if (idx === -1) return false\n\n const names = [..._chain.slice(idx).map(([, e]) => e), event]\n console.error(`[Domphy] Circular dependency detected:\\n ${names.join(\" → \")}`)\n return true\n }\n\n private _flushAll(): void {\n this._scheduled = false\n const pending = this._pending\n this._pending = new Map()\n\n for (const [event, { args, chain }] of pending) {\n _chain = chain\n this._flush(event, args)\n }\n _chain = []\n // Burst settled (no self-update re-queued anything) → reset the runaway guard.\n if (this._pending.size === 0) this._selfDepth = 0\n }\n\n private _flush(event: string, args: unknown[]): void {\n if (!this._listeners) return\n const listeners = this._listeners[event]\n if (!listeners) return\n\n _chain.push([this, event])\n this._flushing.set(event, args)\n\n for (const listener of [...listeners]) {\n if (!listeners.has(listener)) continue\n try {\n listener(...args)\n } catch (e) {\n console.error(e)\n }\n }\n\n this._flushing.delete(event)\n _chain.pop()\n }\n}\n","import { Notifier } from \"./Notifier.js\";\r\nimport { Handler } from \"../types.js\"\r\n\r\nexport type ValueListener<T> = ((_value: T) => void) & Handler\r\nexport type ValueOrState<T> = T | State<T>\r\n\r\nexport class State<T> {\r\n readonly _isState = true;\r\n private _value: T;\r\n readonly initialValue: T;\r\n private _notifier: Notifier | null = new Notifier();\r\n\r\n constructor(initialValue: T, readonly name: string = typeof initialValue) {\r\n this.initialValue = initialValue;\r\n this._value = initialValue;\r\n }\r\n\r\n get(listener?: ValueListener<T>): T {\r\n if (listener) this.addListener(listener);\r\n return this._value;\r\n }\r\n\r\n set(newValue: T): void {\r\n if (!this._notifier) return;\r\n this._value = newValue;\r\n this._notifier.notify(this.name, newValue);\r\n }\r\n\r\n reset(): void {\r\n this.set(this.initialValue);\r\n }\r\n\r\n addListener(listener: ValueListener<T>): () => void {\r\n if (!this._notifier) return () => { };\r\n return this._notifier.addListener(this.name, listener);\r\n }\r\n\r\n removeListener(listener: ValueListener<T>): void {\r\n if (!this._notifier) return;\r\n this._notifier.removeListener(this.name, listener);\r\n }\r\n\r\n _dispose(): void {\r\n if (this._notifier) {\r\n this._notifier._dispose();\r\n this._notifier = null;\r\n }\r\n }\r\n}\r\n","import { DomphyElement, HookMap, EventName, Handler, Listener } from \"./types.js\";\r\nimport { State } from \"./classes/State.js\"\r\n\r\nimport { deepClone, addEvent, addHook } from \"./helpers.js\"\r\n\r\nexport function merge(source: Record<string, any> = {}, target: Record<string, any> = {}): Record<string, any> {\r\n const comma = [\"animation\", \"transition\", \"boxShadow\", \"textShadow\", \"background\", \"fontFamily\"]\r\n const space = [\"class\", \"rel\", \"transform\", \"acceptCharset\", \"sandbox\"]\r\n const adjacent = [\"content\"]\r\n if (Object.prototype.toString.call(target) === \"[object Object]\" && Object.getPrototypeOf(target) === Object.prototype) { // plainjs not class instance\r\n target = deepClone(target)\r\n }\r\n\r\n for (const key in target) {\r\n\r\n const value = target[key];\r\n if (value === undefined || value === null || value === \"\") continue;\r\n\r\n if (typeof value === \"object\" && !Array.isArray(value)) {\r\n if (typeof source[key] === \"object\") {\r\n source[key] = merge(source[key], value);\r\n } else {\r\n source[key] = value;\r\n }\r\n\r\n } else {\r\n if (comma.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\", \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\", \")\r\n }\r\n\r\n } else if (adjacent.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\"\")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\"\")\r\n }\r\n } else if (space.includes(key)) {\r\n if (typeof source[key] === \"function\" || typeof value === \"function\") {\r\n let old = source[key]\r\n source[key] = (listener: Handler) => {\r\n let val1 = typeof old === \"function\" ? old(listener) : old\r\n let val2 = typeof value === \"function\" ? value(listener) : value\r\n return [val1, val2].filter(e => e).join(\" \")\r\n }\r\n } else {\r\n source[key] = [source[key], value].filter(e => e).join(\" \")\r\n }\r\n } else if (key.startsWith(\"on\")) {\r\n let name = key.replace(\"on\", \"\").toLowerCase() as EventName\r\n addEvent(source as DomphyElement, name, value)\r\n } else if (key.startsWith(\"_on\")) {\r\n let name = key.replace(\"_on\", \"\") as keyof HookMap\r\n addHook(source as DomphyElement, name, value)\r\n } else {\r\n source[key] = value;\r\n }\r\n }\r\n }\r\n return source;\r\n}\r\n\r\nexport function hashString(str: string = \"\"): string {\r\n let hash = 0x811c9dc5; // FNV-1a 32-bit offset basis\r\n for (let i = 0; i < str.length; i++) {\r\n hash ^= str.charCodeAt(i);\r\n hash = (hash * 0x01000193) >>> 0; // FNV prime, keep 32-bit unsigned\r\n }\r\n return String.fromCharCode(97 + (hash % 26)) + hash.toString(16);\r\n}\r\n\r\nexport function toState<T>(val: T | State<T>, name?: string): State<T> {\r\n return (val instanceof State || (val as any)?._isState) ? val as State<T> : new State<T>(val, name);\r\n}\r\n\r\nexport function r<T>(fn: (listener: Listener) => T): (listener: Listener) => T {\r\n return fn;\r\n}\r\n\r\n","import { DomphyElement, PartialElement, HookMap, EventName, Handler, TagName } from \"./types.js\";\r\nimport { ElementNode } from \"./classes/ElementNode.js\"\r\nimport { State } from \"./classes/State.js\"\r\nimport { eventNameMap } from \"./types/EventProperties.js\"\r\nimport { HtmlTags } from \"./constants/HtmlTags.js\"\r\nimport {merge} from \"./utils.js\"\r\n\r\nexport function addHook<K extends keyof HookMap>(partial: PartialElement, hookName: K, handler: HookMap[K]): void {\r\n const hookProperty = `_on${hookName}` as keyof PartialElement;\r\n let current = partial[hookProperty];\r\n\r\n if (typeof current === \"function\") {\r\n (partial as any)[hookProperty] = (...args: any[]) => {\r\n (current as Function)(...args);\r\n (handler as Function)(...args);\r\n };\r\n } else {\r\n (partial as any)[hookProperty] = handler;\r\n }\r\n}\r\n\r\nexport function addEvent<K extends keyof HTMLElementEventMap>(\r\n attributes: PartialElement,\r\n eventName: K,\r\n handler: (event: HTMLElementEventMap[K], node: ElementNode) => void\r\n): void {\r\n const eventProperty = eventNameMap[eventName];\r\n if (!eventProperty) {\r\n throw Error(`invalid event name \"${eventName}\"`);\r\n }\r\n const current = (attributes as any)[eventProperty]\r\n\r\n if (typeof current == \"function\") {\r\n (attributes as any)[eventProperty] = (event: HTMLElementEventMap[K], node: ElementNode) => {\r\n current(event, node)\r\n handler(event, node);\r\n };\r\n } else {\r\n (attributes as any)[eventProperty] = handler\r\n }\r\n}\r\n\r\nexport function deepClone(value: any, seen = new WeakMap()): any {\r\n if (value === null || typeof value !== \"object\") return value;\r\n if (typeof value === \"function\") return value;\r\n if (seen.has(value)) return seen.get(value);\r\n\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto !== Object.prototype && !Array.isArray(value)) return value; // ignore class instance\r\n\r\n let clone: any;\r\n\r\n if (Array.isArray(value)) {\r\n clone = [];\r\n seen.set(value, clone);\r\n for (const v of value) clone.push(deepClone(v, seen));\r\n return clone;\r\n }\r\n\r\n if (value instanceof Date) return new Date(value);\r\n if (value instanceof RegExp) return new RegExp(value);\r\n if (value instanceof Map) {\r\n clone = new Map();\r\n seen.set(value, clone);\r\n for (const [k, v] of value) clone.set(deepClone(k, seen), deepClone(v, seen));\r\n return clone;\r\n }\r\n if (value instanceof Set) {\r\n clone = new Set();\r\n seen.set(value, clone);\r\n for (const v of value) clone.add(deepClone(v, seen));\r\n return clone;\r\n }\r\n if (ArrayBuffer.isView(value)) {\r\n return new (value as any).constructor(value);\r\n }\r\n if (value instanceof ArrayBuffer) {\r\n return value.slice(0);\r\n }\r\n\r\n clone = Object.create(proto);\r\n seen.set(value, clone);\r\n\r\n for (const key of Reflect.ownKeys(value)) {\r\n clone[key] = deepClone(value[key], seen);\r\n }\r\n\r\n return clone;\r\n}\r\n\r\nexport function validate(element: DomphyElement | PartialElement, asPartial = false): boolean {\r\n if (Object.prototype.toString.call(element) !== \"[object Object]\") {\r\n throw Error(`typeof ${element} is invalid DomphyElement`);\r\n }\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element]\r\n if (i == 0 && !HtmlTags.includes(key) && !key.includes(\"-\") && !asPartial) { // web-component\r\n throw Error(`key ${key} is not valid HTML tag name`);\r\n } else if (key == \"style\" && val && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"style\" must be a object`);\r\n } else if (key == \"$\") {\r\n element.$!.forEach(v => validate(v as PartialElement, true))\r\n } else if (key.startsWith(\"_on\") && typeof val != \"function\") {\r\n throw Error(`hook ${key} value \"${val}\" must be a function `)\r\n } else if (key.startsWith(\"on\") && typeof val != \"function\") {\r\n throw Error(`event ${key} value \"${val}\" must be a function `);\r\n } else if (key == \"_portal\" && typeof val !== \"function\") {\r\n throw Error(`\"_portal\" must be a function return HTMLElement`);\r\n } else if (key == \"_context\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_context\" must be a object`);\r\n } else if (key == \"_metadata\" && Object.prototype.toString.call(val) !== \"[object Object]\") {\r\n throw Error(`\"_metadata\" must be a object`);\r\n } else if (key == \"_key\" && (typeof val !== \"string\" && typeof val !== \"number\")) {\r\n throw Error(`\"_key\" must be a string or number`);\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nexport function isValid(element: DomphyElement): boolean {\r\n\r\n if (Array.isArray(element)) return false;\r\n if (!element || typeof element !== \"object\") return false;\r\n\r\n let keys = Object.keys(element);\r\n for (let i = 0; i < keys.length; i++) {\r\n let key = keys[i];\r\n let val = element[key as keyof typeof element];\r\n if (i == 0 && !HtmlTags.includes(key)) return false\r\n if (key === \"style\" && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n if (key.startsWith(\"_on\") && typeof val !== \"function\") return false;\r\n if (key.startsWith(\"on\") && typeof val !== \"function\") return false;\r\n if (key === \"_portalChildren\" && !Array.isArray(val)) return false;\r\n if ((key === \"_context\" || key === \"_metadata\") && (val == null || typeof val !== \"object\" || Array.isArray(val))) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function isHTML(str: string): boolean {\r\n return /<([a-z][\\w-]*)(\\s[^>]*)?>.*<\\/\\1>|<([a-z][\\w-]*)(\\s[^>]*)?\\/>/i.test(str.trim());\r\n}\r\n\r\nexport function escapeHTML(str: string): string {\r\n return str\r\n .replace(/&/g, \"&amp;\")\r\n .replace(/</g, \"&lt;\")\r\n .replace(/>/g, \"&gt;\")\r\n .replace(/\"/g, \"&quot;\")\r\n .replace(/'/g, \"&#39;\");\r\n}\r\n\r\nexport function addClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => String(reactive(listener)) + \" \" + className\r\n } else {\r\n let current = element.class || \"\"\r\n let split = String(current).split(\" \")\r\n split.push(className)\r\n element.class = split.filter(e => e).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function removeClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.filter(e => e != className).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.filter(e => e != className).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function toggleClass(element: PartialElement, className: string): void {\r\n\r\n if (typeof element.class == \"function\") {\r\n let reactive = element.class\r\n element.class = (listener) => {\r\n let split = String(reactive(listener)).split(\" \")\r\n return split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n } else {\r\n let split = String(element.class).split(\" \")\r\n element.class ||= \"\"\r\n element.class = split.includes(className) ? split.filter(e => e != className).join(\" \") : split.concat([className]).join(\" \")\r\n }\r\n\r\n}\r\n\r\nexport function getTagName(element: DomphyElement): TagName | undefined {\r\n return Object.keys(element).find(e => HtmlTags.includes(e)) as TagName | undefined\r\n}\r\n\r\n\r\nexport function camelToKebab(str: string): string {\r\n return str.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\r\n}\r\n\r\nexport function selectorSplitter(selectors: string) {\r\n if (selectors.indexOf('@') === 0) {\r\n return [selectors];\r\n }\r\n var splitted = [];\r\n var parens = 0;\r\n var angulars = 0;\r\n var soFar = '';\r\n for (var i = 0, len = selectors.length; i < len; i++) {\r\n var char = selectors[i];\r\n if (char === '(') {\r\n parens += 1;\r\n } else if (char === ')') {\r\n parens -= 1;\r\n } else if (char === '[') {\r\n angulars += 1;\r\n } else if (char === ']') {\r\n angulars -= 1;\r\n } else if (char === ',') {\r\n if (!parens && !angulars) {\r\n splitted.push(soFar.trim());\r\n soFar = '';\r\n continue;\r\n }\r\n }\r\n soFar += char;\r\n }\r\n splitted.push(soFar.trim());\r\n return splitted;\r\n};\r\n\r\nexport function normalizeSelectorKey(selectorText: string): string {\r\n const text = selectorText.trim();\r\n // At-rule headers (@media, @keyframes, @supports...) are matched\r\n // whitespace-insensitive because CSSOM reformats them unpredictably.\r\n if (text.startsWith(\"@\")) return text.replace(/\\s+/g, \"\");\r\n return text\r\n .replace(/\\s*([>+~,])\\s*/g, \"$1\") // tighten combinators and selector lists\r\n .replace(/\\s+/g, \" \") // collapse descendant-combinator whitespace\r\n .replace(/\\(\\s*odd\\s*\\)/g, \"(2n+1)\") // CSSOM serializes :nth-child(odd) as (2n+1)\r\n .replace(/\\(\\s*even\\s*\\)/g, \"(2n)\")\r\n .trim();\r\n}\r\n\r\nexport function collectCSSRules(rules: CSSRuleList, map: Map<string, CSSRule>): Map<string, CSSRule> {\r\n for (let i = 0; i < rules.length; i++) {\r\n const rule = rules[i] as any;\r\n let key: string | null = null;\r\n if (typeof rule.selectorText === \"string\") {\r\n key = normalizeSelectorKey(rule.selectorText);\r\n } else if (typeof rule.cssText === \"string\" && rule.cssText.startsWith(\"@\")) {\r\n key = normalizeSelectorKey(rule.cssText.split(\"{\")[0]);\r\n }\r\n if (key && !map.has(key)) map.set(key, rule as CSSRule);\r\n }\r\n return map;\r\n}\r\n\r\nexport function ensureDomStyle(styleParent: HTMLHeadElement | ShadowRoot): HTMLStyleElement {\r\n let domStyle = styleParent.querySelector(\"#domphy-style\") as HTMLStyleElement | null;\r\n\r\n if (!domStyle) {\r\n domStyle = document.createElement(\"style\");\r\n domStyle.id = \"domphy-style\";\r\n styleParent.appendChild(domStyle);\r\n }\r\n\r\n if (domStyle.dataset.domphyBase !== \"true\") {\r\n domStyle.sheet?.insertRule(\"[hidden] { display: none !important; }\", 0);\r\n domStyle.dataset.domphyBase = \"true\";\r\n }\r\n\r\n return domStyle;\r\n}\r\n\r\nexport const mergePartial = (partial: PartialElement | DomphyElement): typeof partial => {\r\n\r\n if (Array.isArray(partial.$)) {\r\n let part: typeof partial = {}\r\n partial.$.forEach(p => merge(part, mergePartial(p)))\r\n delete partial.$\r\n merge(part, partial) // native win\r\n\r\n return part\r\n } else {\r\n return partial\r\n }\r\n}\r\n","export const VoidTags = [\r\n \"area\",\r\n \"base\",\r\n \"br\",\r\n \"col\",\r\n \"embed\",\r\n \"hr\",\r\n \"img\",\r\n \"input\",\r\n \"link\",\r\n \"meta\",\r\n \"source\",\r\n \"track\",\r\n \"wbr\",\r\n] as const;\r\n\r\nexport type VoidTagName = (typeof VoidTags)[number];\r\n\r\n","export const SvgTags = [\"svg\", \"circle\", \"path\", \"rect\", \"ellipse\",\r\n \"line\", \"polyline\", \"polygon\", \"g\", \"defs\",\r\n \"use\", \"symbol\", \"linearGradient\", \"radialGradient\",\r\n \"stop\", \"clipPath\", \"mask\", \"filter\", \"text\",\r\n \"tspan\", \"textPath\", \"image\", \"pattern\", \"marker\",\r\n \"animate\", \"animateTransform\", \"animateMotion\",\r\n \"feGaussianBlur\", \"feComposite\", \"feColorMatrix\",\r\n \"feMerge\", \"feMergeNode\", \"feOffset\", \"feFlood\",\r\n \"feBlend\", \"foreignObject\"]","export const BooleanAttributes = [\r\n \"allowFullScreen\",\r\n \"async\",\r\n \"autoFocus\",\r\n \"autoPlay\",\r\n \"checked\",\r\n \"compact\",\r\n \"contentEditable\",\r\n \"controls\",\r\n \"declare\",\r\n \"default\",\r\n \"defer\",\r\n \"disabled\",\r\n \"formNoValidate\",\r\n \"hidden\",\r\n \"isMap\",\r\n \"itemScope\",\r\n \"loop\",\r\n \"multiple\",\r\n \"muted\",\r\n \"noHref\",\r\n \"noShade\",\r\n \"noValidate\",\r\n \"open\",\r\n \"playsInline\",\r\n \"readonly\",\r\n \"required\",\r\n \"reversed\",\r\n \"scoped\",\r\n \"selected\",\r\n \"sortable\",\r\n \"trueSpeed\",\r\n \"typeMustMatch\",\r\n \"wmode\",\r\n \"autoCapitalize\",\r\n \"translate\",\r\n \"spellCheck\",\r\n \"inert\",\r\n \"download\",\r\n \"noModule\",\r\n \"paused\",\r\n \"autoPictureInPicture\",\r\n] as const;","//browserslist query \"> 0.1%, not dead\"\r\nexport const PrefixCSS: Record<string, string[]> = {\r\n transform: [\"webkit\", \"ms\"],\r\n transition: [\"webkit\", \"ms\"],\r\n animation: [\"webkit\"],\r\n userSelect: [\"webkit\", \"ms\"],\r\n flexDirection: [\"webkit\", \"ms\"],\r\n flexWrap: [\"webkit\", \"ms\"],\r\n justifyContent: [\"webkit\", \"ms\"],\r\n alignItems: [\"webkit\", \"ms\"],\r\n alignSelf: [\"webkit\", \"ms\"],\r\n order: [\"webkit\", \"ms\"],\r\n flexGrow: [\"webkit\", \"ms\"],\r\n flexShrink: [\"webkit\", \"ms\"],\r\n flexBasis: [\"webkit\", \"ms\"],\r\n columns: [\"webkit\"],\r\n columnCount: [\"webkit\"],\r\n columnGap: [\"webkit\"],\r\n columnRule: [\"webkit\"],\r\n columnWidth: [\"webkit\"],\r\n boxSizing: [\"webkit\"],\r\n appearance: [\"webkit\", \"moz\"],\r\n filter: [\"webkit\"],\r\n backdropFilter: [\"webkit\"],\r\n clipPath: [\"webkit\"],\r\n mask: [\"webkit\"],\r\n maskImage: [\"webkit\"],\r\n textSizeAdjust: [\"webkit\", \"ms\"],\r\n hyphens: [\"webkit\", \"ms\"],\r\n writingMode: [\"webkit\", \"ms\"],\r\n gridTemplateColumns: [\"ms\"],\r\n gridTemplateRows: [\"ms\"],\r\n gridAutoColumns: [\"ms\"],\r\n gridAutoRows: [\"ms\"],\r\n gridColumn: [\"ms\"],\r\n gridRow: [\"ms\"],\r\n marginInlineStart: [\"webkit\"],\r\n marginInlineEnd: [\"webkit\"],\r\n paddingInlineStart: [\"webkit\"],\r\n paddingInlineEnd: [\"webkit\"],\r\n minInlineSize: [\"webkit\"],\r\n maxInlineSize: [\"webkit\"],\r\n minBlockSize: [\"webkit\"],\r\n maxBlockSize: [\"webkit\"],\r\n inlineSize: [\"webkit\"],\r\n blockSize: [\"webkit\"],\r\n tabSize: [\"moz\"],\r\n overscrollBehavior: [\"webkit\", \"ms\"],\r\n touchAction: [\"ms\"],\r\n resize: [\"webkit\"],\r\n printColorAdjust: [\"webkit\"],\r\n backgroundClip: [\"webkit\"],\r\n boxDecorationBreak: [\"webkit\"],\r\n overflowScrolling: [\"webkit\"],\r\n};\r\n","export const CamelAttributes: string[] = [\r\n \"viewBox\",\r\n \"preserveAspectRatio\",\r\n \"gradientTransform\",\r\n \"gradientUnits\",\r\n \"spreadMethod\",\r\n \"markerStart\",\r\n \"markerMid\",\r\n \"markerEnd\",\r\n \"markerHeight\",\r\n \"markerWidth\",\r\n \"markerUnits\",\r\n \"refX\",\r\n \"refY\",\r\n \"patternContentUnits\",\r\n \"patternTransform\",\r\n \"patternUnits\",\r\n \"filterUnits\",\r\n \"primitiveUnits\",\r\n \"kernelUnitLength\",\r\n \"clipPathUnits\",\r\n \"maskContentUnits\",\r\n \"maskUnits\"\r\n] as const\r\n","import { escapeHTML, camelToKebab } from \"../helpers.js\";\nimport { BooleanAttributes, CamelAttributes } from \"../constants.js\";\nimport type { ElementNode } from \"./ElementNode.js\"\nimport { type AttributeValue } from \"../types.js\"\nimport { Notifier } from \"./Notifier.js\"\n\nexport class ElementAttribute {\n readonly name: string;\n readonly isBoolean: boolean;\n value: any;\n parent: ElementNode;\n _notifier = new Notifier();\n // Release handles for the reactive listener's state subscriptions, so a\n // re-set (e.g. patch() replacing a reactive value) can drop the old listener\n // instead of leaking it on the long-lived State until node removal.\n private _releases: (() => void)[] = [];\n\n constructor(name: string, value: any, parent: any) {\n this.parent = parent;\n this.isBoolean = (BooleanAttributes as readonly string[]).includes(name);\n if (CamelAttributes.includes(name)) {\n this.name = name\n } else {\n this.name = camelToKebab(name)\n }\n this.value = undefined;\n this.set(value);\n }\n\n render(): void {\n if (!this.parent || !this.parent.domElement) return;\n const domElement = this.parent.domElement;\n\n const mutateAttrs = [\"value\"];\n if (this.isBoolean) {\n if (this.value === false || this.value == null) {\n domElement.removeAttribute(this.name)\n } else {\n domElement.setAttribute(this.name, this.value === true ? \"\" : this.value)\n }\n } else if (this.value == null) {\n domElement.removeAttribute(this.name);\n } else if (mutateAttrs.includes(this.name)) {\n (domElement as any)[this.name] = this.value;\n } else {\n domElement.setAttribute(this.name, this.value);\n }\n }\n\n set(value: AttributeValue): void {\n let prev = this.value;\n\n // Drop any previous reactive subscription before (re)binding.\n if (this._releases.length) {\n for (const release of this._releases) release();\n this._releases = [];\n }\n\n if (value == null) {\n this.value = null;\n } else if (typeof value == \"function\") {\n let listener: any = () => {\n if (!this.parent || this.parent._disposed) return;\n let p = this.value;\n // Re-pass `listener` so states read only on a later run (conditional\n // dependencies) get subscribed too — matching children/style paths.\n this.value = this.isBoolean ? Boolean((value as Function)(listener)) : (value as Function)(listener);\n this.render();\n if (p !== this.value) this._notifier.notify(this.name, this.value);\n };\n\n listener.elementNode = this.parent!;\n listener.debug = `class:${this.parent?.tagName}_${this.parent?.nodeId} attribute:${this.name}`;\n\n listener.onSubscribe = (release: () => void) => {\n this._releases.push(release);\n if (this.parent) {\n this.parent.addHook(\"BeforeRemove\", () => {\n release();\n listener = null;\n });\n }\n };\n\n this.value = this.isBoolean ? Boolean(value(listener)) : value(listener);\n } else {\n this.value = this.isBoolean ? Boolean(value) : value;\n }\n\n this.render();\n if (prev !== this.value) this._notifier.notify(this.name, this.value);\n }\n\n addListener(callback: (value: any) => void): void {\n const handler = callback as any\n handler.onSubscribe = (release: () => void) => this.parent?.addHook(\"BeforeRemove\", release);\n this._notifier.addListener(this.name, handler)\n }\n\n remove(): void {\n if (this.parent && this.parent.attributes) {\n this.parent.attributes.remove(this.name);\n }\n this._dispose();\n }\n\n _dispose(): void {\n this._notifier._dispose();\n this.value = null;\n this.parent = null as any\n }\n\n generateHTML(): string {\n const { name, value } = this;\n if (this.isBoolean) {\n return value ? `${name}` : \"\";\n } else {\n const val = Array.isArray(value) ? JSON.stringify(value) : value;\n return `${name}=\"${escapeHTML(String(val))}\"`;\n }\n }\n}\n","import type { ElementNode } from \"./ElementNode.js\";\nimport { ElementAttribute } from \"./ElementAttribute.js\";\nimport { BooleanAttributes } from \"../constants.js\";\nimport { AttributeValue } from \"../types.js\"\n\nexport class AttributeList {\n items: Record<string, ElementAttribute> | null = {};\n parent: ElementNode | null;\n\n constructor(parent: ElementNode) {\n this.parent = parent;\n }\n\n generateHTML(): string {\n if (!this.items) return \"\";\n const str = Object.values(this.items)\n .map((attr) => attr.generateHTML())\n .join(\" \");\n return str ? ` ${str}` : \"\";\n }\n\n get(name: string): any {\n if (!this.items) return undefined;\n return this.items[name]?.value;\n }\n\n set(name: string, value: AttributeValue): void {\n if (!this.items || !this.parent) return;\n if (this.items[name]) {\n this.items[name].set(value);\n } else {\n this.items[name] = new ElementAttribute(name, value, this.parent);\n }\n }\n\n addListener(name: string, callback: (value: string | number) => void): void {\n if (this.has(name)) {\n this.items![name].addListener(callback);\n }\n }\n\n has(name: string): boolean {\n if (!this.items) return false;\n return Object.prototype.hasOwnProperty.call(this.items, name);\n }\n\n remove(name: string): void {\n if (!this.items) return;\n\n if (this.items[name]) {\n this.items[name]._dispose();\n delete this.items[name];\n }\n\n if (this.parent && this.parent.domElement && this.parent.domElement instanceof Element) {\n this.parent.domElement.removeAttribute(name);\n }\n }\n\n _dispose(): void {\n if (this.items) {\n for (const key in this.items) {\n this.items[key]._dispose();\n }\n }\n this.items = null;\n this.parent = null;\n }\n\n toggle(name: string, force?: boolean): void {\n if (\n !BooleanAttributes.includes(name as (typeof BooleanAttributes)[number])\n ) {\n throw Error(`${name} is not a boolean attribute`);\n }\n if (force === true) {\n this.set(name, true);\n } else if (force === false) {\n this.remove(name);\n } else {\n this.has(name) ? this.remove(name) : this.set(name, true);\n }\n }\n\n addClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n\n const add = (classes: string, newClass: string) => {\n const list = (classes || \"\").split(\" \").filter((e: string) => e);\n !list.includes(newClass) && list.push(className)\n return list.join(\" \")\n }\n\n let current = this.get(\"class\");\n\n if (typeof current === \"function\") {\n this.set(\"class\", () => add(current(), className));\n } else {\n this.set(\"class\", add(current, className))\n }\n }\n\n hasClass(className: string): boolean {\n if (!className || typeof className !== \"string\") return false;\n const current = this.get(\"class\") || \"\";\n const list = current.split(\" \").filter((e: string) => e);\n return list.includes(className);\n }\n\n toggleClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n this.hasClass(className)\n ? this.removeClass(className)\n : this.addClass(className);\n }\n\n removeClass(className: string): void {\n if (!className || typeof className !== \"string\") return;\n const current = this.get(\"class\") || \"\";\n const list: string[] = current.split(\" \").filter((e: string) => e);\n const updated = list.filter((cls) => cls !== className);\n updated.length > 0\n ? this.set(\"class\", updated.join(\" \"))\n : this.remove(\"class\");\n }\n\n replaceClass(oldClass: string, newClass: string): void {\n if (\n !oldClass ||\n !newClass ||\n typeof oldClass !== \"string\" ||\n typeof newClass !== \"string\"\n )\n return;\n if (this.hasClass(oldClass)) {\n this.removeClass(oldClass);\n this.addClass(newClass);\n }\n }\n}\n","import { ElementNode } from \"./ElementNode.js\";\r\nimport { isHTML, escapeHTML } from \"../helpers.js\";\r\n\r\nexport class TextNode {\r\n type = \"TextNode\"\r\n parent: ElementNode;\r\n text: string;\r\n domText?: ChildNode;\r\n\r\n constructor(textContent: string | number, parent: ElementNode) {\r\n this.parent = parent;\r\n this.text = textContent === \"\" ? \"\\u200B\" : String(textContent);\r\n }\r\n _createDOMNode() {\r\n let newNode: ChildNode;\r\n if (isHTML(this.text)) {\r\n const tpl = document.createElement(\"template\");\r\n tpl.innerHTML = this.text.trim();\r\n newNode = tpl.content.firstChild || document.createTextNode(\"\");\r\n } else {\r\n newNode = document.createTextNode(this.text);\r\n }\r\n this.domText = newNode;\r\n return newNode;\r\n }\r\n\r\n _dispose(): void {\r\n this.domText = undefined;\r\n this.text = \"\";\r\n }\r\n\r\n generateHTML(): string {\r\n if (this.text === \"\\u200B\") return \"&#8203;\";\r\n // Mirror _createDOMNode: a single-root HTML string is intentional inline\r\n // HTML, anything else is plain text and must be escaped so the server\r\n // output is XSS-safe and parses back to the same text node the client\r\n // builds (otherwise hydration child alignment drifts).\r\n return isHTML(this.text) ? this.text : escapeHTML(this.text);\r\n }\r\n\r\n render(domText: ChildNode | DocumentFragment | HTMLElement): void {\r\n const newNode = this._createDOMNode();\r\n domText.appendChild(newNode);\r\n }\r\n}","import { TextNode } from \"./TextNode.js\";\r\nimport { ElementNode } from \"./ElementNode.js\";\r\nimport type { DomphyElement } from \"../types.js\";\r\nimport { ensureDomStyle, getTagName } from \"../helpers.js\";\r\n\r\ntype ElementInput = DomphyElement | null | undefined | number | string\r\ntype NodeItem = ElementNode | TextNode;\r\n\r\nexport class ElementList {\r\n items: NodeItem[] = [];\r\n owner: ElementNode;\r\n _nextKey: number = 0;\r\n\r\n constructor(parent: ElementNode) {\r\n this.owner = parent;\r\n }\r\n\r\n _createNode(element: ElementInput | DomphyElement): NodeItem {\r\n return (typeof element === \"object\" && element !== null)\r\n ? new ElementNode(element, this.owner, this._nextKey++)\r\n : new TextNode(element == null ? \"\" : String(element), this.owner);\r\n }\r\n\r\n _moveDomElement(node: NodeItem, index: number) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const dom = this.owner.domElement;\r\n\r\n const el = node instanceof ElementNode ? node.domElement : node.domText;\r\n if (el) {\r\n const currentRef = dom.childNodes[index] || null;\r\n if (el !== currentRef) {\r\n dom.insertBefore(el, currentRef);\r\n }\r\n }\r\n }\r\n\r\n _swapDomElement(aNode: NodeItem, bNode: NodeItem) {\r\n if (!this.owner || !this.owner.domElement) return;\r\n const parent = this.owner.domElement;\r\n\r\n const a = aNode instanceof ElementNode ? aNode.domElement : aNode.domText;\r\n const b = bNode instanceof ElementNode ? bNode.domElement : bNode.domText;\r\n if (!a || !b) return;\r\n\r\n const aNext = a.nextSibling;\r\n const bNext = b.nextSibling;\r\n\r\n parent.insertBefore(a, bNext);\r\n parent.insertBefore(b, aNext);\r\n }\r\n\r\n update(inputs: ElementInput[], updateDom = true, silent = false): void {\r\n\r\n const oldItems = this.items.slice(); // snapshot for cleanup\r\n\r\n // keyed lookup from old list\r\n const keyed = new Map<string | number, NodeItem>();\r\n for (const item of oldItems) {\r\n if (item instanceof ElementNode && item.key !== null && item.key !== undefined) {\r\n keyed.set(item.key, item);\r\n }\r\n }\r\n\r\n if (!silent && this.owner.domElement) this.owner._hooks?.BeforeUpdate?.(this.owner, inputs);\r\n\r\n const oldSet = new Set<NodeItem>(oldItems);\r\n const claimed = new Set<NodeItem>();\r\n\r\n // build target order using existing ops (mutating this.items)\r\n for (let i = 0; i < inputs.length; i++) {\r\n const input = inputs[i];\r\n const isObj = typeof input === \"object\" && input !== null;\r\n const key = isObj ? (input as any)._key : undefined;\r\n const tag = isObj ? getTagName(input as DomphyElement) : undefined;\r\n\r\n // Keyed reuse: same key + same tag → reuse the node and patch it in place\r\n // (preserves DOM identity/state while reflecting new data).\r\n if (key !== undefined) {\r\n const reused = keyed.get(key);\r\n if (reused instanceof ElementNode && reused.tagName === tag) {\r\n keyed.delete(key);\r\n const cur = this.items.indexOf(reused);\r\n if (cur !== i && cur >= 0) {\r\n const isPortal = !!reused._portal;\r\n this.move(cur, i, isPortal ? false : updateDom, true);\r\n }\r\n reused.parent = this.owner as any;\r\n reused.patch(input as DomphyElement);\r\n claimed.add(reused);\r\n continue;\r\n }\r\n // key present but no tag-compatible match → fall through to insert; any\r\n // stale keyed node keeps its slot in `keyed` and is removed below.\r\n } else if (isObj) {\r\n // Unkeyed positional reuse: reuse the old unkeyed element already sitting\r\n // at this slot if its tag matches — this is what preserves focus, scroll,\r\n // selection, IME and uncontrolled input values across plain list updates.\r\n const at = this.items[i];\r\n if (at instanceof ElementNode && at.key == null && at.tagName === tag\r\n && oldSet.has(at) && !claimed.has(at)) {\r\n at.parent = this.owner as any;\r\n at.patch(input as DomphyElement);\r\n claimed.add(at);\r\n continue;\r\n }\r\n }\r\n\r\n claimed.add(this.insert(input, i, updateDom, true));\r\n }\r\n\r\n // Remove leftover nodes beyond the new length. Iterate a SNAPSHOT (not a\r\n // `while length > inputs.length` loop): a removal may defer (async exit\r\n // animation), leaving the node in `items`, so a length-based loop would spin.\r\n const extras = this.items.slice(inputs.length);\r\n for (const node of extras) this.remove(node, updateDom, true);\r\n keyed.forEach((node) => this.remove(node, updateDom, true));\r\n if (!silent) this.owner._hooks?.Update?.(this.owner);\r\n }\r\n\r\n insert(input: ElementInput, index?: number, updateDom = true, silent = false): NodeItem {\r\n\r\n let length = this.items.length;\r\n const finalIndex = (typeof index !== \"number\" || isNaN(index) || index < 0 || index > length)\r\n ? length\r\n : index;\r\n const item = this._createNode(input);\r\n this.items.splice(finalIndex, 0, item);\r\n\r\n if (item instanceof ElementNode) {\r\n //Parent always insert/mount before children\r\n item._hooks.Insert && item._hooks.Insert(item)\r\n\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n\r\n\r\n if (item._portal) {\r\n let domElement = item._portal!(this.owner.getRoot())\r\n domElement && item.render(domElement)\r\n } else {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n let domStyle = ensureDomStyle(styleParent)\r\n item.styles.render(domStyle as HTMLStyleElement)\r\n item._hooks.Mount && item._hooks.Mount(item)\r\n item.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(child.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(domNode)\r\n }\r\n })\r\n }\r\n }\r\n\r\n\r\n\r\n } else {\r\n let domElement = this.owner.domElement;\r\n if (updateDom && domElement) {\r\n let domNode = item._createDOMNode();\r\n const ref = domElement.childNodes[finalIndex] ?? null;\r\n domElement.insertBefore(domNode, ref);\r\n }\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n return item;\r\n }\r\n\r\n remove(item: NodeItem, updateDom = true, silent = false): void {\r\n\r\n const index = this.items.indexOf(item);\r\n if (index < 0) return;\r\n\r\n if (item instanceof ElementNode) {\r\n // Guard against re-entrant removal of a node whose (deferred) removal is\r\n // already in flight — otherwise update()'s extras + keyed passes could\r\n // fire its BeforeRemove/animation twice. Synchronous removals are already\r\n // guarded by the indexOf check above (the node is spliced before re-entry).\r\n if (item._beforeRemoveFired) return;\r\n const done = () => {\r\n const el = item.domElement\r\n // Re-resolve position at completion time — a deferred (animated) removal\r\n // may run after other inserts/removes have shifted indices.\r\n const i = this.items.indexOf(item);\r\n if (i >= 0) this.items.splice(i, 1);\r\n updateDom && el && el.remove()\r\n item._dispose(); // _dispose fires Remove + releases subscriptions for the whole subtree\r\n }\r\n if (item._hooks.BeforeRemove && item.domElement) {\r\n let doneCalled = false;\r\n const onceDone = () => { if (!doneCalled) { doneCalled = true; done(); } };\r\n item._beforeRemoveFired = true; // prevent _dispose from re-firing BeforeRemove\r\n item._hooks.BeforeRemove(item, onceDone);\r\n // Auto-complete only for sync cleanup hooks. A hook that declares `done`\r\n // (arity >= 2, e.g. an exit animation) owns completion and defers removal.\r\n if ((item._hooks.BeforeRemove as Function).length < 2 && !doneCalled) onceDone();\r\n } else {\r\n done()\r\n }\r\n\r\n } else {\r\n const el = item.domText\r\n this.items.splice(index, 1);\r\n updateDom && el && el.remove()\r\n item._dispose();\r\n }\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n clear(updateDom = true, silent = false): void {\r\n if (this.items.length === 0) return;\r\n const snapshot = this.items.slice();\r\n\r\n for (const item of snapshot) {\r\n this.remove(item, updateDom, true);\r\n }\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n _dispose(): void {\r\n this.items.forEach(child => child._dispose())\r\n this.items = [];\r\n }\r\n\r\n swap(aIndex: number, bIndex: number, updateDom = true, silent = false) {\r\n if (aIndex < 0 || bIndex < 0 ||\r\n aIndex >= this.items.length || bIndex >= this.items.length ||\r\n aIndex === bIndex) return;\r\n\r\n const itemA = this.items[aIndex];\r\n const itemB = this.items[bIndex];\r\n\r\n this.items[aIndex] = itemB;\r\n this.items[bIndex] = itemA;\r\n\r\n if (updateDom) this._swapDomElement(itemA, itemB);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n move(fromIndex: number, toIndex: number, updateDom = true, silent = false): void {\r\n if (fromIndex < 0 || fromIndex >= this.items.length ||\r\n toIndex < 0 || toIndex >= this.items.length || fromIndex === toIndex) return;\r\n\r\n const item = this.items[fromIndex];\r\n\r\n this.items.splice(fromIndex, 1);\r\n this.items.splice(toIndex, 0, item);\r\n\r\n if (updateDom) this._moveDomElement(item, toIndex);\r\n\r\n !silent && this.owner.domElement && this.owner._hooks.Update && this.owner._hooks.Update(this.owner)\r\n }\r\n\r\n generateHTML(): string {\r\n let html = \"\";\r\n for (const item of this.items) html += item.generateHTML();\r\n return html;\r\n }\r\n}\r\n","import type { StyleRule } from \"./StyleRule.js\";\r\nimport type { StyleValue } from \"../types.js\";\r\nimport { camelToKebab } from \"../helpers.js\";\r\nimport { PrefixCSS } from \"../constants.js\";\r\nimport { Listener } from \"../types.js\"\r\n\r\nexport class StyleProperty {\r\n name: string;\r\n cssName: string;\r\n value: StyleValue = \"\";\r\n parentRule: StyleRule;\r\n\r\n constructor(name: string, value: StyleValue, parentRule: StyleRule) {\r\n this.name = name;\r\n this.cssName = camelToKebab(name);\r\n this.parentRule = parentRule;\r\n this.set(value);\r\n }\r\n\r\n _domUpdate(): void {\r\n if (!this.parentRule) return;\r\n const domRule = this.parentRule.domRule;\r\n\r\n if (domRule && (domRule as CSSStyleRule).style) {\r\n let style: CSSStyleDeclaration = (domRule as CSSStyleRule).style;\r\n style.setProperty(this.cssName, String(this.value));\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n style.setProperty(`-${prefix}-${this.cssName}`, String(this.value));\r\n });\r\n }\r\n }\r\n }\r\n _dispose(): void {\r\n this.value = \"\";\r\n this.parentRule = null as any;\r\n }\r\n\r\n set(value: StyleValue): void {\r\n\r\n if (typeof value === \"function\") {\r\n let listener = (() => {\r\n if (!this.parentRule || this.parentRule.parentNode?._disposed) return;\r\n this.value = value(listener);\r\n this._domUpdate();\r\n }) as unknown as Listener;\r\n\r\n listener.onSubscribe = (release: () => void) => {\r\n this.parentRule.parentNode?.addHook(\"BeforeRemove\", () => {\r\n release();\r\n listener = null!;\r\n });\r\n };\r\n\r\n listener.elementNode = this.parentRule!.root!;\r\n listener.debug = `class:${this.parentRule?.root?.tagName}_${this.parentRule?.root?.nodeId} style:${this.name}`;\r\n this.value = value(listener);\r\n } else {\r\n this.value = value;\r\n }\r\n\r\n this._domUpdate();\r\n }\r\n\r\n remove(): void {\r\n if (!this.parentRule) return;\r\n\r\n if (this.parentRule.domRule instanceof CSSStyleRule) {\r\n const domStyle = this.parentRule.domRule.style;\r\n domStyle.removeProperty(this.cssName);\r\n\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n domStyle.removeProperty(`-${prefix}-${this.cssName}`);\r\n });\r\n }\r\n }\r\n delete this.parentRule.styleBlock![this.name];\r\n this._dispose();\r\n }\r\n\r\n cssText(): string {\r\n let str = `${this.cssName}: ${this.value}`;\r\n if (PrefixCSS[this.name]) {\r\n PrefixCSS[this.name].forEach((prefix) => {\r\n str += `; -${prefix}-${this.cssName}: ${this.value}`;\r\n });\r\n }\r\n return str;\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { StyleProperty } from \"./StyleProperty.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\n\r\nexport class StyleRule {\r\n selectorText: string;\r\n domRule: CSSRule | CSSMediaRule | CSSKeyframesRule | null = null;\r\n styleList: StyleList | null;\r\n styleBlock: Record<string, StyleProperty> | null = {};\r\n parent: StyleRule | ElementNode | null;\r\n\r\n constructor(selectorText: string, parent: StyleRule | ElementNode) {\r\n this.selectorText = selectorText;\r\n this.styleList = new StyleList(this);\r\n this.parent = parent;\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.styleBlock) {\r\n for (const prop of Object.values(this.styleBlock)) {\r\n prop._dispose();\r\n }\r\n }\r\n\r\n if (this.styleList) {\r\n this.styleList._dispose();\r\n }\r\n\r\n this.styleBlock = null;\r\n this.styleList = null;\r\n this.domRule = null;\r\n this.parent = null;\r\n }\r\n\r\n get root() {\r\n let node = this.parent;\r\n while (node instanceof StyleRule) {\r\n node = node.parent;\r\n }\r\n return node;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n \r\n insertStyle(name: string, val: any): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].set(val);\r\n } else {\r\n this.styleBlock[name] = new StyleProperty(name, val, this);\r\n }\r\n }\r\n\r\n removeStyle(name: string): void {\r\n if (!this.styleBlock) return;\r\n if (this.styleBlock[name]) {\r\n this.styleBlock[name].remove();\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.styleBlock || !this.styleList) return \"\";\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n const nested = this.styleList.cssText();\r\n return `${this.selectorText} { ${styleStr} ${nested} } `;\r\n }\r\n\r\n mount(domRule: CSSRule | CSSKeyframesRule): void {\r\n if (!domRule || !this.styleList) return;\r\n this.domRule = domRule;\r\n if (\"cssRules\" in domRule) {\r\n this.styleList.mount(domRule.cssRules as CSSRuleList);\r\n }\r\n }\r\n\r\n remove(): void {\r\n\r\n if (this.domRule && this.domRule.parentStyleSheet) {\r\n const sheet = this.domRule.parentStyleSheet;\r\n const rules = sheet.cssRules;\r\n for (let i = 0; i < rules.length; i++) {\r\n if (rules[i] === this.domRule) {\r\n sheet.deleteRule(i);\r\n break;\r\n }\r\n }\r\n }\r\n this._dispose();\r\n }\r\n\r\n render(domSheet: CSSStyleSheet | CSSGroupingRule) {\r\n if (!this.styleBlock || !this.styleList) return;\r\n const styleStr = Object.values(this.styleBlock).map(decl => decl.cssText()).join(\";\");\r\n try {\r\n if (!this.selectorText.startsWith(\"@\")) {\r\n const css = `${this.selectorText} { ${styleStr} }`;\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (domRule && \"selectorText\" in domRule) {\r\n this.mount(domRule);\r\n }\r\n } else if (/^@(media|supports|container|layer)\\b/.test(this.selectorText)) {\r\n const index = domSheet.insertRule(`${this.selectorText} {}`, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n if (\"cssRules\" in domRule) {\r\n this.mount(domRule as CSSGroupingRule);\r\n this.styleList.render(domRule as CSSGroupingRule);\r\n }\r\n } else if (this.selectorText.startsWith(\"@keyframes\") || this.selectorText.startsWith(\"@font-face\")) {\r\n const css = this.cssText();\r\n const index = domSheet.insertRule(css, domSheet.cssRules.length);\r\n const domRule = domSheet.cssRules[index];\r\n this.mount(domRule);\r\n }\r\n } catch (err) {\r\n console.warn(\"Failed to insert rule:\", this.selectorText, err);\r\n }\r\n }\r\n}","import { ElementNode } from \"./ElementNode.js\";\r\nimport { selectorSplitter, normalizeSelectorKey } from \"../helpers.js\";\r\nimport { StyleRule } from \"./StyleRule.js\";\r\n\r\nexport class StyleList {\r\n parent: StyleRule | ElementNode | null;\r\n items: StyleRule[] = [];\r\n domStyle: HTMLStyleElement | null = null;\r\n\r\n constructor(parent: StyleRule | ElementNode) {\r\n this.parent = parent;\r\n }\r\n\r\n get parentNode(): ElementNode | null {\r\n let root: any = this.parent;\r\n while (root && root instanceof StyleRule) {\r\n root = root.parent;\r\n }\r\n return root as ElementNode;\r\n }\r\n\r\n addCSS(obj: Record<string, any>, parentSelector: string = \"\"): void {\r\n if (!this.items || !this.parent) return;\r\n const basic: Record<string, any> = {};\r\n\r\n function getSelector(selector: string, prev: string): string {\r\n return selector.startsWith(\"&\")\r\n ? `${prev}${selector.slice(1)}`\r\n : `${prev} ${selector}`;\r\n }\r\n\r\n for (const selector in obj) {\r\n const value = obj[selector];\r\n let splitKeys = selectorSplitter(selector);\r\n for (let key of splitKeys) {\r\n const currentSelector = getSelector(key, parentSelector);\r\n if (/^@(container|layer|supports|media)\\b/.test(key)) {\r\n if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, parentSelector);\r\n this.items.push(rule);\r\n }\r\n } else if (key.startsWith(\"@keyframes\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n rule.styleList!.addCSS(value, \"\");\r\n this.items.push(rule);\r\n } else if (key.startsWith(\"@font-face\")) {\r\n const rule = new StyleRule(key, this.parent);\r\n for (const k in value) rule.insertStyle(k, value[k]);\r\n this.items.push(rule);\r\n } else if (typeof value === \"object\" && value != null) {\r\n const rule = new StyleRule(currentSelector, this.parent);\r\n this.items.push(rule);\r\n for (const [k, v] of Object.entries(value)) {\r\n if (typeof v === \"object\" && v != null) {\r\n let newSelector = getSelector(k, currentSelector);\r\n if (k.startsWith(\"&\")) {\r\n this.addCSS(v, newSelector);\r\n } else {\r\n const r = rule.styleList!.insertRule(newSelector);\r\n r.styleList!.addCSS(v, newSelector);\r\n }\r\n } else {\r\n rule.insertStyle(k, v);\r\n }\r\n }\r\n } else {\r\n basic[key] = value;\r\n }\r\n }\r\n }\r\n\r\n if (Object.keys(basic).length) {\r\n const rule = new StyleRule(parentSelector, this.parent);\r\n for (const key in basic) rule.insertStyle(key, basic[key]);\r\n this.items.push(rule);\r\n }\r\n }\r\n\r\n cssText(): string {\r\n if (!this.items) return \"\";\r\n return this.items.map((rule) => rule.cssText()).join(\"\");\r\n }\r\n\r\n insertRule(selector: string): StyleRule {\r\n if (!this.items || !this.parent) return null as any;\r\n let rule = this.items.find((rule) => rule.selectorText === selector);\r\n if (!rule) {\r\n rule = new StyleRule(selector, this.parent);\r\n this.items.push(rule);\r\n }\r\n return rule;\r\n }\r\n\r\n hydrate(domRuleMap: Map<string, CSSRule>): void {\r\n if (!this.items) return;\r\n for (const rule of this.items) {\r\n const domRule = domRuleMap.get(normalizeSelectorKey(rule.selectorText));\r\n if (domRule) rule.mount(domRule as CSSRule);\r\n }\r\n }\r\n\r\n mount(domRuleList: CSSRuleList): void {\r\n if (!this.items) return;\r\n if (!domRuleList) throw Error(\"Require domRuleList argument\");\r\n let wrongCount = 0;\r\n const fixOddEven = (css: string) => css.replace(\"(odd)\", \"(2n+1)\").replace(\"(even)\", \"(2n)\");\r\n\r\n this.items.forEach((rule, i) => {\r\n const index = i - wrongCount;\r\n const domRule = domRuleList[index];\r\n if (!domRule) return;\r\n if (rule.selectorText.startsWith(\"@\") && domRule instanceof CSSKeyframesRule) {\r\n rule.mount(domRule);\r\n } else if (\"keyText\" in domRule) {\r\n rule.mount(domRule);\r\n } else if (\"selectorText\" in domRule) {\r\n if (domRule.selectorText !== fixOddEven(rule.selectorText)) {\r\n wrongCount += 1;\r\n } else {\r\n rule.mount(domRule);\r\n }\r\n } else if (\"cssRules\" in domRule) {\r\n rule.mount(domRule as CSSMediaRule);\r\n }\r\n });\r\n }\r\n\r\n render(dom: HTMLStyleElement | CSSGroupingRule) {\r\n if (dom instanceof HTMLStyleElement) {\r\n this.domStyle = dom\r\n this.items.forEach((rule) => rule.render(dom.sheet!));\r\n } else if (dom instanceof CSSGroupingRule) {\r\n this.items.forEach((rule) => rule.render(dom));\r\n }\r\n }\r\n\r\n _dispose(): void {\r\n\r\n if (this.items) {\r\n for (let i = 0; i < this.items.length; i++) {\r\n this.items[i]._dispose();\r\n }\r\n }\r\n\r\n this.items = [];\r\n this.parent = null;\r\n this.domStyle = null;\r\n }\r\n}\r\n","import type { DomphyElement, EventName, HookMap, TagName, PartialElement } from \"../types.js\";\r\nimport { AttributeList } from \"./AttributeList.js\";\r\nimport { ElementList } from \"./ElementList.js\";\r\nimport { StyleList } from \"./StyleList.js\";\r\nimport { validate, mergePartial, getTagName, deepClone, ensureDomStyle, collectCSSRules } from \"../helpers.js\";\r\nimport { merge, hashString } from \"../utils.js\";\r\nimport { SvgTags, VoidTags } from \"../constants.js\"\r\n\r\nexport class ElementNode {\r\n _disposed = false\r\n _beforeRemoveFired = false\r\n type = \"ElementNode\"\r\n parent: ElementNode | null = null;\r\n _portal?: (root: ElementNode) => HTMLElement;\r\n tagName: TagName;\r\n children = new ElementList(this);\r\n styles = new StyleList(this);\r\n attributes = new AttributeList(this);\r\n domElement?: HTMLElement | null = null;\r\n _hooks: HookMap = {};\r\n _events?: { [K in EventName]?: (event: Event, node: ElementNode) => void } | null = null;\r\n _boundEvents = new Set<EventName>();\r\n _context?: Record<string, any> = {};\r\n _metadata?: Record<string, any> = {};\r\n key?: string | number | null = null;\r\n nodeId: string\r\n\r\n constructor(domphyElement: DomphyElement, _parent: ElementNode | null = null, index = 0) {\r\n domphyElement = deepClone(domphyElement)\r\n validate(domphyElement)\r\n domphyElement.style = domphyElement.style || {}\r\n this.parent = _parent;\r\n this.tagName = getTagName(domphyElement) as TagName;\r\n domphyElement = mergePartial(domphyElement) as DomphyElement\r\n\r\n this.key = (domphyElement as any)._key ?? null;\r\n this._context = domphyElement._context || {}\r\n this._metadata = domphyElement._metadata || {}\r\n\r\n let tempPath = `${this.parent?.nodeId}.${index}`\r\n const str = JSON.stringify(domphyElement.style || {}, (k, v) => typeof v === \"function\" ? tempPath : v,);\r\n this.nodeId = hashString(tempPath + str)\r\n\r\n this.attributes!.addClass(`${this.tagName}_${this.nodeId}`);\r\n if (domphyElement._onSchedule) domphyElement._onSchedule(this, domphyElement)\r\n\r\n this.merge(domphyElement)\r\n\r\n const children = (domphyElement as any)[this.tagName];\r\n\r\n if (children != null && children != undefined) {\r\n if (typeof children === \"function\") {\r\n\r\n let listener: any = () => {\r\n if (this._disposed) return\r\n let input = children(listener)\r\n this.children!.update(Array.isArray(input) ? input : [input])\r\n }\r\n\r\n listener!.elementNode = this;\r\n listener!.debug = `class:${this.tagName}_${this.nodeId} children`;\r\n listener!.onSubscribe = (release: () => void) => this.addHook(\"BeforeRemove\", () => {\r\n release()\r\n listener = null\r\n });\r\n listener && listener();\r\n } else {\r\n this.children!.update(Array.isArray(children) ? children : [children])\r\n }\r\n }\r\n this._hooks.Init && this._hooks.Init(this)\r\n }\r\n\r\n _createDOMNode() {\r\n const svgNamespace = \"http://www.w3.org/2000/svg\"\r\n let node = SvgTags.includes(this.tagName)\r\n ? document.createElementNS(svgNamespace, this.tagName)\r\n : document.createElement(this.tagName)\r\n\r\n this.domElement = node as HTMLElement\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n\r\n if (this.attributes) {\r\n Object.values(this.attributes.items!).forEach(attr => attr.render())\r\n }\r\n return node\r\n }\r\n\r\n // Bind a DOM listener that dispatches LIVE from this._events, so patch() can\r\n // swap the handler (e.g. a list item's onClick closure after its data changes)\r\n // without detaching/reattaching the DOM listener.\r\n _bindEvent(eventName: EventName): void {\r\n if (!this.domElement || this._boundEvents.has(eventName)) return\r\n this._boundEvents.add(eventName)\r\n let fn: any = (event: Event) => this._events?.[eventName]?.(event, this)\r\n this.domElement.addEventListener(eventName, fn)\r\n this.addHook(\"BeforeRemove\", (n) => {\r\n n.domElement?.removeEventListener(eventName, fn)\r\n fn = null\r\n })\r\n }\r\n\r\n _dispose(): void {\r\n if (this._disposed) return\r\n this._disposed = true\r\n\r\n // Fire BeforeRemove so reactive-listener releases (registered as BeforeRemove\r\n // hooks via onSubscribe) actually run for this node. Descendants are torn\r\n // down through this recursive _dispose — not through ElementList.remove — so\r\n // without this their subscriptions to long-lived State/RecordState leak.\r\n // Skip if the async-removal path in ElementList already fired it.\r\n if (!this._beforeRemoveFired) {\r\n this._beforeRemoveFired = true\r\n this._hooks.BeforeRemove?.(this, () => { })\r\n }\r\n\r\n if (this.children) {\r\n this.children._dispose();\r\n }\r\n\r\n if (this.styles) {\r\n this.styles.items!.forEach((rule) => rule.remove());\r\n this.styles._dispose();\r\n }\r\n\r\n if (this.attributes) {\r\n this.attributes._dispose();\r\n }\r\n\r\n // _onRemove fires for every node in the subtree, not just the directly-removed one.\r\n this._hooks.Remove?.(this)\r\n\r\n this.domElement = null;\r\n this._hooks = {};\r\n this._events = null;\r\n this._context = {};\r\n this._metadata = {};\r\n this.parent = null;\r\n }\r\n merge(part: PartialElement) {\r\n merge(this._context, part._context)\r\n merge(this._metadata, part._metadata)\r\n\r\n const keys = Object.keys(part)\r\n for (let i = 0; i < keys.length; i++) {\r\n const originalKey = keys[i];\r\n const value = (part as any)[originalKey];\r\n if ([\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName].includes(originalKey)) {\r\n continue\r\n } else if ([\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"].includes(originalKey)) {\r\n this.addHook(originalKey.substring(3) as keyof HookMap, value);\r\n } else if (originalKey.startsWith(\"on\")) {\r\n this.addEvent(originalKey.substring(2).toLowerCase() as EventName, value);\r\n } else if (originalKey == \"_portal\") {\r\n this._portal = value\r\n } else if (originalKey == \"class\" && typeof value === \"string\") {\r\n this.attributes!.addClass(value);\r\n } else {\r\n this.attributes!.set(originalKey, value);\r\n }\r\n }\r\n if (part.style) {\r\n this.styles.addCSS(part.style || {}, `.${`${this.tagName}_${this.nodeId}`}`);\r\n }\r\n\r\n }\r\n\r\n // Update this live node IN PLACE from a fresh element description, preserving\r\n // its DOM element (and thus focus/scroll/selection/uncontrolled value) and its\r\n // children's identity. Used by list reconciliation to reuse a node by key\r\n // (keyed) or position (unkeyed) while reflecting new data, instead of\r\n // destroying and recreating the DOM. Styles and lifecycle hooks are NOT\r\n // re-applied (reused items share structure; hooks already ran). Reactive\r\n // content (a function child) keeps its own listener and is left untouched.\r\n patch(rawElement: DomphyElement): void {\r\n let element: any = deepClone(rawElement)\r\n element.style = element.style || {}\r\n element = mergePartial(element)\r\n\r\n // Children / content — recurse so grandchildren are reused/patched too.\r\n const content = element[this.tagName]\r\n if (typeof content !== \"function\") {\r\n const next = content == null ? [] : Array.isArray(content) ? content : [content]\r\n this.children.update(next, !!this.domElement, true)\r\n }\r\n\r\n if (element._context) merge(this._context, element._context)\r\n if (element._metadata) merge(this._metadata, element._metadata)\r\n\r\n // Rebuild attributes and events. Events are replaced (live dispatch in\r\n // _bindEvent reads this._events, so swapping the map is enough); attributes\r\n // present before but absent now are removed; the auto scope class is kept.\r\n const autoClass = `${this.tagName}_${this.nodeId}`\r\n const reserved = [\"$\", \"_onSchedule\", \"_key\", \"_context\", \"_metadata\", \"style\", this.tagName]\r\n const hookKeys = [\"_onInit\", \"_onInsert\", \"_onMount\", \"_onBeforeUpdate\", \"_onUpdate\", \"_onBeforeRemove\", \"_onRemove\"]\r\n const keep = new Set<string>([\"class\"])\r\n let userClass: string | null = null\r\n\r\n this._events = {}\r\n for (const key of Object.keys(element)) {\r\n if (reserved.includes(key) || hookKeys.includes(key) || key === \"_portal\") continue\r\n const value = element[key]\r\n if (key.startsWith(\"on\") && typeof value === \"function\") {\r\n this.addEvent(key.substring(2).toLowerCase() as EventName, value)\r\n } else if (key === \"class\" && typeof value === \"string\") {\r\n userClass = value\r\n } else {\r\n this.attributes!.set(key, value)\r\n keep.add(key)\r\n }\r\n }\r\n\r\n this.attributes!.set(\"class\", userClass ? `${autoClass} ${userClass}` : autoClass)\r\n\r\n if (this.attributes!.items) {\r\n for (const name of Object.keys(this.attributes!.items)) {\r\n if (!keep.has(name)) this.attributes!.remove(name)\r\n }\r\n }\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n }\r\n\r\n addEvent(name: EventName, callback: (event: Event, node: ElementNode) => void): void {\r\n\r\n this._events = this._events || {}\r\n\r\n let current = this._events[name]\r\n if (typeof current == \"function\") {\r\n this._events[name] = (event: Event, node: ElementNode) => {\r\n current!(event, node)\r\n callback(event, node)\r\n }\r\n } else {\r\n this._events[name] = callback\r\n }\r\n }\r\n\r\n addHook<K extends keyof HookMap>(name: K, callback: HookMap[K]): void {\r\n const current = this._hooks[name];\r\n\r\n if (typeof current === \"function\") {\r\n const composed = ((...args: any[]) => {\r\n (current as Function)(...args);\r\n (callback as Function)(...args);\r\n }) as HookMap[K];\r\n // Preserve the maximum declared arity across composed hooks. Removal logic\r\n // inspects BeforeRemove.length (>= 2 means the hook owns `done()`, e.g. an\r\n // exit animation); a naive (...args) wrapper would report 0 and break that.\r\n try {\r\n Object.defineProperty(composed, \"length\", {\r\n value: Math.max((current as Function).length, (callback as Function).length),\r\n configurable: true,\r\n });\r\n } catch { /* length non-configurable on some engines — best effort */ }\r\n this._hooks[name] = composed;\r\n } else {\r\n this._hooks[name] = callback;\r\n }\r\n }\r\n getRoot(): ElementNode {\r\n let root: ElementNode = this;\r\n while (root && root instanceof ElementNode && root.parent) {\r\n root = root.parent;\r\n }\r\n return root\r\n }\r\n\r\n getContext(name: string): any {\r\n let node: ElementNode | null = this;\r\n while (node && (!node._context || !Object.prototype.hasOwnProperty.call(node._context, name))) {\r\n node = node.parent;\r\n }\r\n return node && node._context ? node._context[name] : undefined;\r\n }\r\n\r\n setContext(name: string, value: any) {\r\n this._context = this._context || {}\r\n this._context[name] = value;\r\n }\r\n\r\n getMetadata(name: string): any {\r\n return this._metadata ? this._metadata[name] : undefined;\r\n }\r\n\r\n setMetadata(key: string, value: any) {\r\n this._metadata = this._metadata || {}\r\n this._metadata[key] = value;\r\n\r\n }\r\n\r\n generateCSS(): string {\r\n if (!this.styles || !this.children) return \"\";\r\n let css = this.styles.cssText()\r\n css += this.children.items.map(child => child instanceof ElementNode ? child.generateCSS() : \"\").join(\"\")\r\n return css\r\n }\r\n\r\n generateHTML(): string {\r\n if (!this.children || !this.attributes) return \"\";\r\n const attributes = this.attributes.generateHTML();\r\n // Void elements must not emit a closing tag — `<br></br>` is parsed by the\r\n // HTML tokenizer as two <br>, which corrupts hydration child alignment.\r\n if ((VoidTags as readonly string[]).includes(this.tagName)) {\r\n return `<${this.tagName}${attributes}>`;\r\n }\r\n const content = this.children.generateHTML();\r\n return `<${this.tagName}${attributes}>${content}</${this.tagName}>`;\r\n }\r\n\r\n mount(domElement: HTMLElement, domStyle?: HTMLStyleElement): void {\r\n if (!domElement) throw new Error(\"Missing dom node on bind\");\r\n this.domElement = domElement;\r\n\r\n if (this._events) {\r\n for (const key in this._events) this._bindEvent(key as EventName)\r\n }\r\n\r\n if (this.children) {\r\n this.children.items.forEach((child, i) => {\r\n const childNode = domElement.childNodes[i];\r\n if (!childNode) return;\r\n if (child instanceof ElementNode) {\r\n child.mount(childNode as HTMLElement);\r\n } else {\r\n // Bind the server-rendered text/inline-HTML node so that reactive\r\n // child updates after hydration can locate and replace it.\r\n child.domText = childNode;\r\n }\r\n });\r\n }\r\n\r\n // Attach reactive style declarations to the server-rendered stylesheet so\r\n // post-hydration updates mutate the existing CSSOM rules instead of being\r\n // silently dropped (StyleProperty._domUpdate needs a bound domRule). Done\r\n // once from the call that received the style element, walking the whole\r\n // subtree because per-node selectors are globally unique.\r\n if (domStyle) {\r\n const sheet = domStyle.sheet;\r\n if (sheet) this._hydrateStyles(collectCSSRules(sheet.cssRules, new Map()));\r\n }\r\n\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n }\r\n\r\n _hydrateStyles(domRuleMap: Map<string, CSSRule>): void {\r\n this.styles?.hydrate(domRuleMap);\r\n if (this.children) {\r\n for (const child of this.children.items) {\r\n if (child instanceof ElementNode) child._hydrateStyles(domRuleMap);\r\n }\r\n }\r\n }\r\n\r\n render(domElement: HTMLElement | SVGElement | DocumentFragment): HTMLElement | SVGElement {\r\n const newNode = this._createDOMNode();\r\n domElement.appendChild(newNode)\r\n this._hooks.Mount && this._hooks.Mount(this)\r\n let domStyle = this.getRoot().styles.domStyle\r\n let root = domElement.getRootNode()\r\n const styleParent = root instanceof ShadowRoot ? root : document.head\r\n domStyle ||= ensureDomStyle(styleParent)\r\n this.styles.render(domStyle as HTMLStyleElement)\r\n this.children.items.forEach(child => {\r\n if (child instanceof ElementNode && child._portal) {\r\n let dom = child._portal!(this.getRoot())\r\n dom && child.render(dom)\r\n } else {\r\n child.render(newNode)\r\n }\r\n })\r\n return newNode;\r\n }\r\n\r\n remove() {\r\n if (this.parent) {\r\n this.parent.children.remove(this)\r\n } else {\r\n // Root removal must also run BeforeRemove/Remove (and release reactive\r\n // subscriptions across the whole tree via _dispose), honoring async done().\r\n const done = () => {\r\n this.domElement?.remove()\r\n this._dispose()\r\n }\r\n if (this._hooks.BeforeRemove && this.domElement) {\r\n let called = false\r\n const once = () => { if (!called) { called = true; done() } }\r\n this._beforeRemoveFired = true\r\n this._hooks.BeforeRemove(this, once)\r\n if ((this._hooks.BeforeRemove as Function).length < 2 && !called) once()\r\n } else {\r\n done()\r\n }\r\n }\r\n }\r\n}\r\n","import { Notifier } from \"./Notifier.js\"\r\n\r\ntype Listener = (...args: any[]) => void\r\n\r\nexport class RecordState<T extends Record<string, any> = Record<string, any>> {\r\n private _notifier = new Notifier()\r\n private _record: T\r\n readonly initialRecord: T\r\n\r\n constructor(record: T) {\r\n this.initialRecord = { ...record }\r\n this._record = { ...record }\r\n }\r\n\r\n get<K extends keyof T>(key: K, l?: Listener): T[K] {\r\n if (l) this._notifier.addListener(key as string, l)\r\n return this._record[key]\r\n }\r\n\r\n set<K extends keyof T>(key: K, value: T[K]): void {\r\n this._record[key] = value\r\n this._notifier.notify(key as string)\r\n }\r\n\r\n addListener<K extends keyof T>(key: K, fn: Listener): () => void {\r\n return this._notifier.addListener(key as string, fn)\r\n }\r\n\r\n removeListener<K extends keyof T>(key: K, fn: Listener): void {\r\n this._notifier.removeListener(key as string, fn)\r\n }\r\n\r\n reset<K extends keyof T>(key: K): void {\r\n this.set(key, this.initialRecord[key])\r\n }\r\n\r\n _dispose(): void {\r\n this._notifier._dispose()\r\n }\r\n}\r\n","export * from \"./size.js\"\nexport * from \"./density.js\"\nexport * from \"./tone.js\"\nexport * from \"./theme.js\"\n","import { ThemeInput } from \"./types.js\";\r\n\r\nlet light: ThemeInput = {\r\n direction: \"darken\",\r\n colors: {\r\n \"primary\": [\r\n \"#ffffff\",\r\n \"#e3ecff\",\r\n \"#c6daff\",\r\n \"#aac8ff\",\r\n \"#8fb6ff\",\r\n \"#76a3ff\",\r\n \"#5f91fc\",\r\n \"#4a7ff4\",\r\n \"#386ee7\",\r\n \"#2a5ed7\",\r\n \"#1e4ec2\",\r\n \"#1440aa\",\r\n \"#0c3290\",\r\n \"#072674\",\r\n \"#041a57\",\r\n \"#020f38\",\r\n \"#010419\",\r\n \"#000000\"\r\n ],\r\n \"secondary\": [\r\n \"#ffffff\",\r\n \"#fce6ea\",\r\n \"#faced6\",\r\n \"#f7b5c2\",\r\n \"#f29db0\",\r\n \"#ec859e\",\r\n \"#e36e8d\",\r\n \"#d8597d\",\r\n \"#ca456e\",\r\n \"#b93460\",\r\n \"#a42351\",\r\n \"#8e1643\",\r\n \"#770b36\",\r\n \"#5f0529\",\r\n \"#46031d\",\r\n \"#2d0210\",\r\n \"#130104\",\r\n \"#000000\"\r\n ],\r\n \"info\": [\r\n \"#ffffff\",\r\n \"#dcf0f9\",\r\n \"#b7e1f6\",\r\n \"#90d2f1\",\r\n \"#6ac3eb\",\r\n \"#42b4e2\",\r\n \"#16a4d5\",\r\n \"#0094c4\",\r\n \"#0084b2\",\r\n \"#00739e\",\r\n \"#00638a\",\r\n \"#005476\",\r\n \"#004461\",\r\n \"#00354d\",\r\n \"#002638\",\r\n \"#001623\",\r\n \"#00070d\",\r\n \"#000000\"\r\n ],\r\n \"success\": [\r\n \"#ffffff\",\r\n \"#e3f3dc\",\r\n \"#c6e8b8\",\r\n \"#a9dd94\",\r\n \"#8ed171\",\r\n \"#75c450\",\r\n \"#61b635\",\r\n \"#51a51f\",\r\n \"#429304\",\r\n \"#358100\",\r\n \"#2a7000\",\r\n \"#215f00\",\r\n \"#194d00\",\r\n \"#123c00\",\r\n \"#0b2b00\",\r\n \"#051a00\",\r\n \"#010900\",\r\n \"#000000\"\r\n ],\r\n \"warning\": [\r\n \"#ffffff\",\r\n \"#ffeada\",\r\n \"#ffd3b3\",\r\n \"#ffbd8d\",\r\n \"#ffa96b\",\r\n \"#ff9853\",\r\n \"#ec8640\",\r\n \"#d77531\",\r\n \"#c16523\",\r\n \"#aa5718\",\r\n \"#944a0f\",\r\n \"#7e3d09\",\r\n \"#673106\",\r\n \"#512504\",\r\n \"#3b1a03\",\r\n \"#250e02\",\r\n \"#0e0401\",\r\n \"#000000\"\r\n ],\r\n \"attention\": [\r\n \"#ffffff\",\r\n \"#ffeada\",\r\n \"#ffd3b3\",\r\n \"#ffbd8d\",\r\n \"#ffa96b\",\r\n \"#ff9853\",\r\n \"#ec8640\",\r\n \"#d77531\",\r\n \"#c16523\",\r\n \"#aa5718\",\r\n \"#944a0f\",\r\n \"#7e3d09\",\r\n \"#673106\",\r\n \"#512504\",\r\n \"#3b1a03\",\r\n \"#250e02\",\r\n \"#0e0401\",\r\n \"#000000\"\r\n ],\r\n \"error\": [\r\n \"#ffffff\",\r\n \"#fce7e4\",\r\n \"#fbcfca\",\r\n \"#f8b7b0\",\r\n \"#f59f96\",\r\n \"#ef877e\",\r\n \"#e86f67\",\r\n \"#de5852\",\r\n \"#d3403e\",\r\n \"#c5282c\",\r\n \"#b30a1b\",\r\n \"#9e000b\",\r\n \"#860001\",\r\n \"#6c0000\",\r\n \"#510000\",\r\n \"#340000\",\r\n \"#170000\",\r\n \"#000000\"\r\n ],\r\n \"danger\": [\r\n \"#ffffff\",\r\n \"#fce7e4\",\r\n \"#fbcfca\",\r\n \"#f8b7b0\",\r\n \"#f59f96\",\r\n \"#ef877e\",\r\n \"#e86f67\",\r\n \"#de5852\",\r\n \"#d3403e\",\r\n \"#c5282c\",\r\n \"#b30a1b\",\r\n \"#9e000b\",\r\n \"#860001\",\r\n \"#6c0000\",\r\n \"#510000\",\r\n \"#340000\",\r\n \"#170000\",\r\n \"#000000\"\r\n ],\r\n \"highlight\": [\r\n \"#ffffff\",\r\n \"#f9f5cd\",\r\n \"#f4eb95\",\r\n \"#efe05a\",\r\n \"#e6d427\",\r\n \"#d3c100\",\r\n \"#bfad00\",\r\n \"#ab9b00\",\r\n \"#988900\",\r\n \"#857700\",\r\n \"#736600\",\r\n \"#615600\",\r\n \"#4f4600\",\r\n \"#3e3600\",\r\n \"#2c2700\",\r\n \"#1b1700\",\r\n \"#090700\",\r\n \"#000000\"\r\n ],\r\n \"neutral\": [\r\n \"#ffffff\",\r\n \"#ededed\",\r\n \"#dbdbdb\",\r\n \"#cacaca\",\r\n \"#bababa\",\r\n \"#ababab\",\r\n \"#9b9b9b\",\r\n \"#8d8d8d\",\r\n \"#7e7e7e\",\r\n \"#707070\",\r\n \"#636363\",\r\n \"#565656\",\r\n \"#484848\",\r\n \"#383838\",\r\n \"#282828\",\r\n \"#181818\",\r\n \"#080808\",\r\n \"#000000\"\r\n ]\r\n },\r\n baseTones: {\r\n highlight: 5,\r\n warning: 6,\r\n error: 8,\r\n danger: 8,\r\n secondary: 8,\r\n primary: 9,\r\n info: 8,\r\n success: 8,\r\n neutral: 8,\r\n },\r\n fontSizes: [\"0.75rem\", \"0.875rem\", \"1rem\", \"1.25rem\", \"1.5625rem\", \"1.9375rem\", \"2.4375rem\", \"3.0625rem\"],\r\n densities: [0.75, 1, 1.5, 2, 2.5],\r\n darkBias: 1,\r\n custom: {},\r\n}\r\n\r\nexport default light\r\n","import { ElementNode, Listener } from \"@domphy/core\";\r\nimport { ThemeInput, ThemeVars } from \"./types.js\";\r\nimport light from \"./light.js\";\r\n\r\n// JSON clone (not structuredClone) so the build runs in older embedded\r\n// browsers like SketchUp 2022's CEF, which predates Chromium 98.\r\n// ThemeInput is plain JSON (no Map/Set/Date/typed arrays).\r\nconst clone = <T>(v: T): T => JSON.parse(JSON.stringify(v));\r\n\r\n// Custom-token keys may contain CSS-illegal characters (e.g. \"radius/sm/lg\").\r\n// Map every illegal char to \"_\" so the declared property name and the var()\r\n// reference always agree and stay valid CSS.\r\nconst escapeKey = (k: string): string => k.replace(/[^a-zA-Z0-9_-]/g, \"_\");\r\n\r\nconst themes: Record<string, ThemeInput> = {\r\n light: clone(light),\r\n dark: createDark(light),\r\n};\r\n\r\nfunction colorSteps(input: ThemeInput): number {\r\n const firstColor = Object.keys(input.colors)[0];\r\n return firstColor ? input.colors[firstColor].length : 0;\r\n}\r\n\r\n// --- Validation ---\r\n\r\nfunction validateTheme(partial: Partial<ThemeInput>): void {\r\n for (let key in partial) {\r\n if (!Object.keys(light).includes(key as keyof ThemeInput)) {\r\n throw new Error(`Invalid key: ${key}`);\r\n }\r\n }\r\n if (partial.fontSizes && !Array.isArray(partial.fontSizes)) {\r\n throw new Error(`fontSize must be array of string`);\r\n }\r\n if (partial.densities) {\r\n if (!Array.isArray(partial.densities) || partial.densities.some(v => typeof v !== \"number\")) {\r\n throw new Error(`densities must be array of number`);\r\n }\r\n }\r\n if (\"custom\" in partial) {\r\n const custom = partial.custom!;\r\n if (typeof custom !== \"object\" || custom === null) {\r\n throw new Error(`Invalid custom property: must be an object`);\r\n }\r\n }\r\n}\r\n\r\n// --- Deep Merge ---\r\n\r\nfunction deepMerge(target: any, source: any): void {\r\n for (const key in source) {\r\n if (\r\n source[key] &&\r\n typeof source[key] === \"object\" &&\r\n !Array.isArray(source[key])\r\n ) {\r\n target[key] ??= {};\r\n deepMerge(target[key], source[key]);\r\n } else {\r\n target[key] = source[key];\r\n }\r\n }\r\n}\r\n\r\n// --- Builders (pure functions) ---\r\n\r\nfunction buildThemeCSS(name: string, input: ThemeInput): string {\r\n const styles: Record<string, string | number> = {};\r\n const toneSteps = colorSteps(input);\r\n\r\n for (const key in input) {\r\n const value = input[key as keyof ThemeInput];\r\n\r\n if (key === \"colors\") {\r\n for (const colorName in input.colors) {\r\n [...Array(toneSteps).keys()].forEach(i =>\r\n styles[`--${colorName}-${i}`] = input.colors[colorName][i]\r\n );\r\n }\r\n } else if (key === \"fontSizes\") {\r\n [...Array(8).keys()].forEach(i =>\r\n styles[`--fontSize-${i}`] = input.fontSizes[i]\r\n );\r\n } else if (key === \"custom\") {\r\n if (value && typeof value === \"object\") {\r\n for (const k in value as Record<string, string>) {\r\n styles[`--custom-${escapeKey(k)}`] = (value as Record<string, string>)[k];\r\n }\r\n }\r\n }\r\n // densities / baseTones / direction / darkBias are not CSS custom properties\r\n }\r\n\r\n let text = \"\";\r\n for (const prop in styles) {\r\n text += ` ${prop}: ${styles[prop]};\\n`;\r\n }\r\n return `[data-theme=\"${name}\"] {\\n${text}}`;\r\n}\r\n\r\n// --- Public API ---\r\n\r\nexport function getTheme(name: string): ThemeInput {\r\n if (!themes[name]) throw Error(`Theme \"${name}\" not found`);\r\n return themes[name];\r\n}\r\n\r\nexport function setTheme(name: string, input: Partial<ThemeInput>): void {\r\n validateTheme(input);\r\n if (!themes[name]) themes[name] = clone(light);\r\n deepMerge(themes[name], input);\r\n}\r\n\r\nfunction createDark(source: ThemeInput): ThemeInput {\r\n let dark = clone(source)\r\n dark.direction = \"lighten\"\r\n for (let name in dark.colors) {\r\n dark.colors[name].reverse()\r\n dark.baseTones[name] = dark.colors[name].length - 1 - dark.baseTones[name]\r\n }\r\n return dark\r\n}\r\n\r\nexport function themeTokens(name: string): Record<string, any> {\r\n let input = getTheme(name)\r\n const toneSteps = colorSteps(input);\r\n let tokens: Record<string, any> = {};\r\n\r\n for (const key in input) {\r\n const value = input[key as keyof ThemeInput];\r\n\r\n if (key === \"colors\") {\r\n for (const name in input.colors) {\r\n let colorTones = {} as Partial<Record<number, string>>;\r\n [...Array(toneSteps).keys()].forEach(i => colorTones[i] = input.colors[name][i]);\r\n tokens[name] = colorTones as Record<number, string>;\r\n }\r\n } else if (key === \"fontSizes\") {\r\n tokens.fontSizes = input.fontSizes;\r\n } else if (key === \"densities\") {\r\n tokens.densities = input.densities;\r\n } else if (key === \"custom\") {\r\n tokens.custom = {};\r\n if (value && typeof value === \"object\") {\r\n for (const k in value as Record<string, string>) {\r\n tokens.custom[k] = (value as Record<string, string>)[k];\r\n }\r\n }\r\n }\r\n // baseTones / direction / darkBias are metadata — reachable via getTheme(), not tokens\r\n }\r\n\r\n return tokens;\r\n}\r\n\r\nexport function themeVars(): ThemeVars {\r\n let input = getTheme(\"light\")\r\n const toneSteps = colorSteps(input);\r\n let theme = {} as ThemeVars;\r\n\r\n for (const key in input) {\r\n const value = input[key as keyof ThemeInput];\r\n\r\n if (key === \"colors\") {\r\n for (const name in input.colors) {\r\n let colorTones = {} as Partial<Record<number, string>>;\r\n [...Array(toneSteps).keys()].forEach(i => colorTones[i] = `var(--${name}-${i})`);\r\n theme[name] = colorTones as Record<number, string>;\r\n }\r\n } else if (key === \"fontSizes\") {\r\n theme.fontSizes = [...Array(8).keys()].map(i => `var(--fontSize-${i})`);\r\n } else if (key === \"custom\") {\r\n theme.custom = {} as Record<string, string>;\r\n if (value && typeof value === \"object\") {\r\n for (const k in value as Record<string, string>) {\r\n theme.custom[k] = `var(--custom-${escapeKey(k)})`;\r\n }\r\n }\r\n }\r\n // densities / baseTones / direction / darkBias are not exposed as CSS vars\r\n }\r\n\r\n return theme;\r\n}\r\n\r\nexport function themeCSS(): string {\r\n return Object.entries(themes)\r\n .map(([name, input]) => buildThemeCSS(name, input))\r\n .join(\"\\n\")\r\n}\r\n\r\nexport function themeApply(el?: HTMLStyleElement): void {\r\n if (typeof document === \"undefined\") return\r\n if (el) {\r\n el.textContent = themeCSS()\r\n return\r\n } else {\r\n el = document.getElementById(\"domphy-themes\") as HTMLStyleElement\r\n ?? Object.assign(document.createElement(\"style\"), { id: \"domphy-themes\" })\r\n el.textContent = themeCSS()\r\n document.head.appendChild(el)\r\n }\r\n\r\n}\r\n\r\nexport function themeSpacing(n: number) {\r\n return n / 4 + \"em\"\r\n}\r\n\r\nexport function themeName(object: ElementNode | Listener) {\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTheme\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let themeName = \"light\"\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTheme\")) {\r\n themeName = node.attributes.get(\"dataTheme\")\r\n typeof object == \"function\" && node.attributes.addListener(\"dataTheme\", object)\r\n }\r\n return themeName\r\n}\r\n\r\nexport type ThemeColor = keyof ThemeInput[\"colors\"]\r\n","import type { ElementNode, Listener } from \"@domphy/core\";\nimport { themeVars } from \"./theme.js\";\n\nconst ElementSizes = [\"inherit\"];\n\n[...Array(8).keys()].forEach(i =>{\n ElementSizes.push(`decrease-${i}`)\n ElementSizes.push(`increase-${i}`)\n})\n\nexport type ElementSize = typeof ElementSizes[number];\n\nfunction offsetSize(origin: number, size: ElementSize = \"inherit\"): number {\n\n if (!ElementSizes.includes(size!)) {\n throw Error(`size name \"${size}\" invalid`)\n }\n let resultSize: number\n if (size == \"inherit\") {\n resultSize = origin as number\n } else if (size?.startsWith(\"increase-\")) {\n let offset = parseInt(size.replace(\"increase-\", \"\"), 10)\n resultSize = origin + offset;\n } else if (size?.startsWith(\"decrease-\")) {\n let offset = parseInt(size.replace(\"decrease-\", \"\"), 10)\n resultSize = origin - offset;\n } else {\n resultSize = origin\n }\n return Math.max(0, Math.min(8, resultSize))\n}\n\nfunction contextSize(object: ElementNode | Listener | null): number {\n\n if (!object) return 2\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataSize\"))) {\n node = node.parent as ElementNode\n }\n\n let size = 2\n\n if (node && node.attributes && node.attributes.has(\"dataSize\")) {\n size = offsetSize(size, node.attributes.get(\"dataSize\"))\n typeof object == \"function\" && node.attributes.addListener(\"dataSize\", object)\n }\n return size\n}\n\n\nexport function themeSize(object: ElementNode | Listener, size: ElementSize = \"inherit\"): string {\n let index = offsetSize(contextSize(object), size)\n return themeVars().fontSizes[index]\n}","import type { ElementNode, Listener } from \"@domphy/core\";\nimport { getTheme, themeName } from \"./theme.js\";\n\nconst ElementDensities = [\"inherit\"];\n\n[...Array(5).keys()].forEach(i => {\n ElementDensities.push(`decrease-${i}`);\n ElementDensities.push(`increase-${i}`);\n});\n\nexport type ElementDensity = typeof ElementDensities[number];\n\nfunction offsetDensity(origin: number, density: ElementDensity = \"inherit\"): number {\n\n if (!ElementDensities.includes(density!)) {\n throw Error(`density name \"${density}\" invalid`);\n }\n let resultDensity: number;\n if (density == \"inherit\") {\n resultDensity = origin as number;\n } else if (density?.startsWith(\"increase-\")) {\n let offset = parseInt(density.replace(\"increase-\", \"\"), 10);\n resultDensity = origin + offset;\n } else if (density?.startsWith(\"decrease-\")) {\n let offset = parseInt(density.replace(\"decrease-\", \"\"), 10);\n resultDensity = origin - offset;\n } else {\n resultDensity = origin;\n }\n return Math.max(0, Math.min(4, resultDensity));\n}\n\nfunction contextDensity(object: ElementNode | Listener | null): number {\n\n if (!object) return 2;\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode;\n let node: ElementNode = elementNode;\n while (node && (!node.attributes || !node.attributes.get(\"dataDensity\"))) {\n node = node.parent as ElementNode;\n }\n\n let density = 2;\n\n if (node && node.attributes && node.attributes.has(\"dataDensity\")) {\n density = offsetDensity(density, node.attributes.get(\"dataDensity\"));\n typeof object == \"function\" && node.attributes.addListener(\"dataDensity\", object);\n }\n return density;\n}\n\nexport function themeDensity(object: ElementNode | Listener | null): number {\n let index = contextDensity(object);\n return getTheme(object ? themeName(object) : \"light\").densities[index];\n}\n","import { themeVars, themeTokens, getTheme, themeName } from \"./theme.js\"\r\nimport light from \"./light.js\";\r\nimport type { Listener, ElementNode } from \"@domphy/core\";\r\n\r\nconst TONE_STEPS = light.colors.neutral.length\r\n\r\nconst ElementTones = [\"inherit\", \"base\"];\r\n\r\n[...Array(TONE_STEPS).keys()].forEach(i => {\r\n ElementTones.push(`decrease-${i}`)\r\n ElementTones.push(`increase-${i}`)\r\n ElementTones.push(`shift-${i}`)\r\n})\r\n\r\nexport type ElementTone = typeof ElementTones[number];\r\n\r\nfunction adjustTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let newIndex = tone + level;\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction shiftTone(tone: number, level: number): number {\r\n if (tone < 0 || tone > TONE_STEPS - 1) return tone\r\n let midpoint = Math.floor((TONE_STEPS - 1) / 2)\r\n let newIndex = tone <= midpoint ? tone + level : tone - level\r\n // Clamp overshoot to the near boundary. (Negating an out-of-range index, as\r\n // a prior version did, flips it to the opposite extreme — e.g. shift past\r\n // the dark end would land on the lightest tone.)\r\n newIndex = Math.max(0, Math.min(TONE_STEPS - 1, newIndex));\r\n return newIndex\r\n}\r\n\r\nfunction offsetTone(originTone: number, tone: ElementTone = \"inherit\"): number {\r\n\r\n if (typeof tone == \"number\") return tone\r\n\r\n if (tone == \"inherit\") return originTone\r\n\r\n if (!ElementTones.includes(tone!)) {\r\n throw Error(`tone name \"${tone}\" invalid`)\r\n }\r\n\r\n if (tone.startsWith(\"increase-\")) {\r\n let offset = parseInt(tone.replace(\"increase-\", \"\"), 10)\r\n return adjustTone(originTone, offset);\r\n\r\n } else if (tone.startsWith(\"decrease-\")) {\r\n let offset = parseInt(tone.replace(\"decrease-\", \"\"), 10)\r\n return adjustTone(originTone, - offset);\r\n\r\n } else if (tone.startsWith(\"shift-\")) {\r\n let offset = parseInt(tone.replace(\"shift-\", \"\"), 10)\r\n return shiftTone(originTone, offset);\r\n\r\n } else {\r\n return originTone\r\n }\r\n}\r\n\r\nfunction contextTone(object: ElementNode | Listener | null): number {\r\n\r\n if (!object) return 0\r\n let elementNode = (typeof object == \"function\" ? object.elementNode : object) as ElementNode\r\n let node: ElementNode = elementNode;\r\n while (node && (!node.attributes || !node.attributes.get(\"dataTone\"))) {\r\n node = node.parent as ElementNode\r\n }\r\n\r\n let tone = 0\r\n\r\n if (node && node.attributes && node.attributes.has(\"dataTone\")) {\r\n tone = offsetTone(tone, node.attributes.get(\"dataTone\"))\r\n typeof object == \"function\" && node.attributes.addListener(\"dataTone\", object)\r\n }\r\n return tone\r\n}\r\n\r\nfunction themeTone(object: ElementNode | Listener, tone: ElementTone = \"inherit\"): number {\r\n\r\n return offsetTone(contextTone(object), tone)\r\n}\r\n\r\nfunction biasContext(context: number, direction: string, bias: number): number {\r\n if (bias <= 0) return context\r\n if (direction === \"lighten\" && context === 0) return bias\r\n if (direction === \"darken\" && context === TONE_STEPS - 1) return TONE_STEPS - 1 - bias\r\n return context\r\n}\r\n\r\nexport function themeColor(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let themeColor = color == \"inherit\" ? \"neutral\" : color;\r\n\r\n if (!object) {\r\n // No node context implies the light theme (themeVars reads getTheme(\"light\")).\r\n if (tone == \"base\") return themeVars()[themeColor][getTheme(\"light\").baseTones[themeColor]]\r\n return themeVars()[themeColor][offsetTone(0, tone)]\r\n }\r\n\r\n const name = themeName(object)\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(name).baseTones[themeColor]\r\n } else {\r\n let theme = getTheme(name)\r\n let context = biasContext(contextTone(object), theme.direction, theme.darkBias)\r\n resultTone = offsetTone(context, tone)\r\n }\r\n let colors = themeVars()[themeColor]\r\n if (!colors){\r\n throw Error(`color \"${themeColor}\" not found on theme \"${name}\"`)\r\n }\r\n let resultColor = colors[resultTone]\r\n\r\n return resultColor\r\n}\r\n\r\nexport function themeColorToken(object: ElementNode | Listener | null, tone: ElementTone = \"inherit\", color: string = \"inherit\"): string {\r\n\r\n let colorName = color == \"inherit\" ? \"neutral\" : color;\r\n let name = object ? themeName(object as ElementNode | Listener) : \"light\";\r\n let tokens = themeTokens(name);\r\n\r\n if (!object) {\r\n if (tone == \"base\") return tokens[colorName][getTheme(\"light\").baseTones[colorName]]\r\n return tokens[colorName][offsetTone(0, tone)]\r\n }\r\n\r\n let resultTone: number\r\n if (tone == \"base\") {\r\n resultTone = getTheme(name).baseTones[colorName]\r\n } else {\r\n let theme = getTheme(name)\r\n let context = biasContext(contextTone(object), theme.direction, theme.darkBias)\r\n resultTone = offsetTone(context, tone)\r\n }\r\n\r\n return tokens[colorName][resultTone]\r\n}\r\n"],"mappings":"mcAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,UAAAE,EAAA,UAAAC,knBCAaC,GAAkB,CAC7B,UACA,aACA,gBACA,iBACA,SACA,WACA,YACA,mBACA,WACA,UACA,UACA,gBACA,gBACA,oBACA,SACA,cACA,QACA,aACA,SACA,YACA,cACA,cACA,aACA,cACA,SACA,mBACA,YACA,UACA,UACA,UACA,aACA,UACA,YACA,YACA,aACA,UACA,SACA,eACA,mBACA,cACA,cACA,eACA,eACA,cACA,aACA,cACA,YACA,UACA,UACA,SACA,YACA,aACA,eACA,UACA,WACA,WACA,cACA,4BACA,WACA,YACA,WACA,eACA,YACA,WACA,YACA,eACA,WACA,iBACA,YACA,UACA,eACA,cACA,aACA,gBACA,gBACA,gBACA,cACA,kBACA,iBACA,iBACA,gBACA,eACA,sBACA,uBACA,qBACA,sBACA,mBACA,kBACA,oBACA,mBACA,iBACA,uBACA,qBACA,oBACA,YACA,YACF,EAEaC,GAAeD,GAAgB,OAAO,CAACE,EAAKC,IAAO,CAC9D,IAAMC,EAAMD,EAAG,MAAM,CAAC,EAAE,YAAY,EACpC,OAAAD,EAAIE,CAAG,EAAID,EACJD,CACT,EAAG,CAAC,CAAiF,ECvGxEG,EAAW,CACtB,IACA,OACA,UACA,UACA,QACA,QACA,IACA,OACA,aACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,MACA,OACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,OACA,IACA,OACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QA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UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,KAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,QAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,QAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,UAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,MAAS,CACP,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,OAAU,CACR,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,UAAa,CACX,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EACA,QAAW,CACT,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,CACF,EACA,UAAW,CACT,UAAW,EACX,QAAS,EACT,MAAO,EACP,OAAQ,EACR,UAAW,EACX,QAAS,EACT,KAAM,EACN,QAAS,EACT,QAAS,CACX,EACA,UAAW,CAAC,UAAW,WAAY,OAAQ,UAAW,YAAa,YAAa,YAAa,WAAW,EACxG,UAAW,CAAC,IAAM,EAAG,IAAK,EAAG,GAAG,EAChC,SAAU,EACV,OAAQ,CAAC,CACX,EAEOC,EAAQD,GCxNf,IAAME,EAAYC,GAA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","names":["global_exports","__export","dist_exports","src_exports","EventProperties","eventNameMap","acc","ev","key","HtmlTags","_chain","_microtask","cb","e","SELF_NOTIFY_CAP","Notifier","event","listener","release","listeners","args","top","inflight","idx","n","names","pending","chain","State","initialValue","name","newValue","merge","source","target","comma","space","adjacent","deepClone","value","old","val1","val2","addEvent","addHook","hashString","str","hash","i","toState","val","r","fn","partial","hookName","handler","hookProperty","current","attributes","eventName","eventProperty","node","seen","proto","clone","v","k","validate","element","asPartial","keys","isHTML","escapeHTML","getTagName","camelToKebab","selectorSplitter","selectors","splitted","parens","angulars","soFar","len","char","normalizeSelectorKey","selectorText","text","collectCSSRules","rules","map","rule","ensureDomStyle","styleParent","_a","domStyle","mergePartial","part","p","VoidTags","SvgTags","BooleanAttributes","PrefixCSS","CamelAttributes","ElementAttribute","parent","domElement","mutateAttrs","_b","prev","callback","AttributeList","attr","force","className","add","classes","newClass","list","updated","cls","oldClass","TextNode","textContent","newNode","tpl","domText","ElementList","ElementNode","index","dom","el","currentRef","aNode","bNode","a","b","aNext","bNext","inputs","updateDom","silent","_c","_d","oldItems","keyed","item","oldSet","claimed","input","isObj","tag","reused","cur","isPortal","at","extras","length","finalIndex","domNode","ref","root","child","done","doneCalled","onceDone","snapshot","aIndex","bIndex","itemA","itemB","fromIndex","toIndex","html","StyleProperty","parentRule","domRule","style","prefix","StyleRule","_StyleRule","StyleList","prop","styleStr","decl","nested","sheet","domSheet","css","err","obj","parentSelector","basic","getSelector","selector","splitKeys","currentSelector","newSelector","domRuleMap","domRuleList","wrongCount","fixOddEven","_ElementNode","domphyElement","_parent","tempPath","children","originalKey","rawElement","content","next","autoClass","reserved","hookKeys","keep","userClass","composed","childNode","called","once","RecordState","record","__spreadValues","l","src_exports","__export","getTheme","setTheme","themeApply","themeCSS","themeColor","themeColorToken","themeDensity","themeName","themeSize","themeSpacing","themeTokens","themeVars","light","light_default","clone","v","escapeKey","k","themes","light_default","createDark","colorSteps","input","firstColor","validateTheme","partial","key","custom","deepMerge","target","source","_a","buildThemeCSS","name","styles","toneSteps","value","colorName","i","text","prop","getTheme","setTheme","dark","themeTokens","tokens","colorTones","themeVars","theme","themeCSS","themeApply","el","themeSpacing","n","themeName","object","node","ElementSizes","i","offsetSize","origin","size","resultSize","offset","contextSize","object","node","themeSize","index","themeVars","ElementDensities","i","offsetDensity","origin","density","resultDensity","offset","contextDensity","object","node","themeDensity","index","getTheme","themeName","TONE_STEPS","light_default","ElementTones","i","adjustTone","tone","level","newIndex","shiftTone","midpoint","offsetTone","originTone","offset","contextTone","object","node","biasContext","context","direction","bias","TONE_STEPS","themeColor","object","tone","color","themeVars","getTheme","offsetTone","name","themeName","resultTone","theme","contextTone","colors","themeColorToken","colorName","tokens","themeTokens"]}