@vielzeug/craftit 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"craftit.js","names":[],"sources":["../src/core/utilities.ts","../src/core/runtime-lifecycle.ts","../src/core/host.ts","../src/core/internal.ts","../src/core/runtime-bindings.ts","../src/core/template-dom.ts","../src/core/template-bindings.ts","../src/core/template-compiler.ts","../src/core/template-html.ts","../src/core/template.ts","../src/core/component.ts","../src/labs/observers.ts"],"sourcesContent":["/**\n * Utilities — DOM helpers, ID generation, event handling, CSS compilation, and emit functions.\n *\n * This module consolidates:\n * - DOM and string utilities (setAttr, listen, createId, createFormIds, guard, escapeHtml, toKebab)\n * - ID generation and form field ID helpers\n * - Emitter for type-safe custom events\n * - CSS template tag and stylesheet caching\n * - Style loader for adoptedStyleSheets\n */\n\nimport { currentRuntime, fire } from './runtime-lifecycle';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// COMMON DOM & STRING UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Counter singletons ───────────────────────────────────────────────────────\nlet _idCounter = 0;\n\n/** @internal — resets the ID counter. Used by _resetCounters in test/test.ts. */\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\n// ─── Shared DOM/string utilities ──────────────────────────────────────────────\n/** Iterate an iterable and call every function in it. */\nexport const runAll = (fns: Iterable<() => void>): void => {\n for (const fn of fns) fn();\n};\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else if (val === true) {\n el.setAttribute(name, '');\n } else {\n el.setAttribute(name, String(val));\n }\n};\n\nexport const listen = (\n el: EventTarget,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\n/**\n * Creates a unique, stable ID string — suitable for `aria-labelledby`, `aria-describedby`,\n * and similar accessibility linkages. Call once per component instance (at setup time or inside `onMount`).\n */\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\n/**\n * Generates a stable set of ARIA-related IDs for a form control.\n * Snapshot `name` at call time — IDs are stable strings, not reactive.\n * `name` must be a non-empty string — callers that need a generated ID should\n * pass `createId(prefix)` as the name argument.\n *\n * @example\n * const { fieldId, labelId, helperId, errorId } = createFormIds('input', props.name.value);\n */\nexport const createFormIds = (prefix: string, name?: string | null) => {\n const normalizedName = name && name.trim() ? name : createId(prefix);\n const fieldId = `${prefix}-${normalizedName}`;\n\n return {\n errorId: `error-${fieldId}`,\n fieldId,\n helperId: `helper-${fieldId}`,\n labelId: `label-${fieldId}`,\n };\n};\n\n/**\n * Wraps an event handler with a guard condition. The handler is only invoked when `condition()` returns `true`.\n * Use for disabled checks, readonly guards, or any runtime condition.\n *\n * @example\n * const handleClick = guard(() => !props.disabled.value, (e) => toggle(e));\n */\nexport const guard =\n <E extends Event = Event>(condition: () => unknown, handler: (e: E) => void): ((e: E) => void) =>\n (e) => {\n if (condition()) handler(e);\n };\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst _ESC: Record<string, string> = { \"'\": '&#39;', '\"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' };\n\n/**\n * Escapes HTML entity characters (`&`, `<`, `>`, `\"`, `'`) in a value.\n * **Safe only in HTML text/attribute contexts.** Do NOT use for CSS values,\n * `javascript:` URLs, event handler attributes, or inline `<script>` content.\n */\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => _ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EMIT FUNCTION (TYPE-SAFE CUSTOM EVENTS)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\nexport type EmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentRuntime().el;\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS & STYLESHEET UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CSSResult = {\n content: string;\n toString(): string;\n};\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += v && typeof v === 'object' && 'content' in v ? (v as CSSResult).content : (v ?? '');\n }\n }\n\n return { content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n stylesheetStringCache.set(cssText, sheet);\n } catch (err) {\n console.error(`[craftit:E2] style replace failed`, err);\n }\n\n return sheet;\n};\n","import {\n effect as _effect,\n onCleanup as _onCleanup,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n untrack,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { type CSSResult } from './utilities';\n\n// ─── Component runtime ────────────────────────────────────────────────────────\nexport type ComponentRuntime = {\n cleanups: CleanupFn[];\n el: HTMLElement;\n errorHandlers: ((err: unknown) => void)[];\n onMount: (() => CleanupFn | undefined | void)[];\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\n\nexport const currentRuntime = (): ComponentRuntime => {\n const rt = runtimeStack[runtimeStack.length - 1];\n\n if (!rt) throw new Error('[craftit:E1] lifecycle outside setup');\n\n return rt;\n};\n\n// ─── Lifecycle hooks ──────────────────────────────────────────────────────────\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\n\n/**\n * Registers a cleanup function.\n * - Inside a component setup or `onMount` callback: runs when the component\n * unmounts. Prefer {@link onCleanup} for explicit lifecycle cleanup.\n * - Outside a component context (e.g. inside a plain `effect()`): delegates to\n * stateit's `onCleanup`, which runs before each effect re-run.\n */\nexport const onCleanup = (fn: CleanupFn): void => {\n if (runtimeStack.length > 0) {\n currentRuntime().cleanups.push(fn);\n } else {\n _onCleanup(fn);\n }\n};\n\n/**\n * Registers a scoped error handler for this component.\n * Called when an unhandled error is thrown during setup, `onMount` callbacks,\n * or rendering. If no handler is registered, errors are logged to the console.\n *\n * @example\n * defineComponent({\n * setup() {\n * onError((err) => console.error('Component error:', err));\n * // ... rest of setup\n * return html``;\n * },\n * tag: 'my-component',\n * });\n */\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\n\n/** @internal — Cleanup only when inside a component context. */\nexport const autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\n/**\n * Creates a reactive effect that re-runs whenever its signal dependencies change.\n * When called inside a component setup function or `onMount` callback, the effect is\n * automatically cleaned up when the component unmounts — no manual `onCleanup` needed.\n * Outside a component context, behaves identically to stateit's `effect`.\n *\n * @example\n * // Inside setup — auto-cleaned on unmount:\n * effect(() => { document.title = props.title.value; });\n *\n * // Inside onMount — also auto-cleaned:\n * onMount(() => { effect(() => syncExternal(data.value)); });\n */\nexport const effect = (fn: EffectCallback, options?: EffectOptions): Subscription => {\n const dispose = _effect(fn, options);\n\n autoCleanup(dispose);\n\n return dispose;\n};\n\n// ─── Watch ────────────────────────────────────────────────────────────────────\n/**\n * Watch a signal or array of signals for changes and call a callback.\n * Auto-cleaned on unmount when called during setup.\n *\n * Single signal: callback receives (next, prev) values.\n * Multiple signals: callback receives no args, fires when any signal changes.\n */\nexport function watch<T>(\n source: ReadonlySignal<T>,\n cb: (value: T, prev: T) => void,\n options?: WatchOptions<T>,\n): Subscription;\nexport function watch(\n sources: ReadonlyArray<ReadonlySignal<unknown>>,\n cb: () => void,\n options?: WatchOptions<unknown>,\n): Subscription;\nexport function watch(\n source: ReadonlySignal<unknown> | ReadonlyArray<ReadonlySignal<unknown>>,\n cb: ((value: unknown, prev: unknown) => void) | (() => void),\n options?: WatchOptions<unknown>,\n): Subscription {\n if (Array.isArray(source)) {\n const opts = options;\n let initialized = false;\n let pendingDispose = false;\n const dispose = _effect(() => {\n for (const s of source) void s.value; // register all listed deps\n\n if (!initialized) {\n initialized = true;\n\n if (opts?.immediate) {\n untrack(cb as () => void);\n\n if (opts.once) {\n pendingDispose = true;\n\n return;\n }\n }\n } else {\n untrack(cb as () => void);\n\n if (opts?.once) dispose();\n }\n });\n\n autoCleanup(dispose);\n\n if (pendingDispose) dispose();\n\n return dispose;\n }\n\n const stop = _watch(source as ReadonlySignal<unknown>, cb as (value: unknown, prev: unknown) => void, options);\n\n autoCleanup(stop);\n\n return stop;\n}\n\n// ─── Event helpers ────────────────────────────────────────────────────────────\n/**\n * Register an event listener with automatic cleanup on unmount.\n * Use inside onMount() for auto-cleanup, or handle() return value manually.\n *\n * @example\n * onMount(() => {\n * handle(host, 'click', onClick);\n * handle(window, 'resize', onResize);\n * // auto-cleanup\n * });\n */\nexport function handle<K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void {\n if (!target) return;\n\n target.addEventListener(event, listener, options);\n onCleanup(() => target.removeEventListener(event, listener, options));\n}\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n basic(target: EventTarget, type: string, options?: EventInit): boolean;\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\n/**\n * Dispatch DOM events explicitly without guessing constructors from the event name.\n *\n * @example\n * fire.mouse(el, 'click');\n * fire.keyboard(el, 'keydown', { key: 'Enter' });\n * fire.custom(el, 'change', { detail: { value: 42 } });\n * fire.event(el, new PointerEvent('pointerdown'));\n */\nexport const fire: FireApi = {\n basic(target, type, options = {}) {\n return target.dispatchEvent(new Event(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n\n// ─── ARIA helpers ────────────────────────────────────────────────────────────\ntype AriaAttrValue =\n | (() => string | boolean | number | null | undefined)\n | string\n | boolean\n | number\n | null\n | undefined;\n\n/**\n * Reactively set ARIA attributes on an element.\n *\n * - `aria(attrs)` — targets the component host (call during setup)\n * - `aria(target, attrs)` — targets any element; returns a cleanup function\n *\n * Pass getter functions for reactive values. Plain values are set once.\n * `null`, `undefined`, or `false` remove the attribute.\n *\n * @example\n * // Host (during setup):\n * aria({ role: 'checkbox', checked: () => checked.value });\n *\n * // Inner element (inside onMount):\n * onMount(() => {\n * return aria(inputEl, { invalid: () => !!error.value });\n * });\n */\nexport function aria(attrs: Record<string, AriaAttrValue>): void;\nexport function aria(target: Element, attrs: Record<string, AriaAttrValue>): CleanupFn;\nexport function aria(\n targetOrAttrs: Element | Record<string, AriaAttrValue>,\n maybeAttrs?: Record<string, AriaAttrValue>,\n): CleanupFn | undefined {\n const target = maybeAttrs !== undefined ? (targetOrAttrs as Element) : currentRuntime().el;\n const attrs = maybeAttrs !== undefined ? maybeAttrs : (targetOrAttrs as Record<string, AriaAttrValue>);\n\n const applyAttr = (name: string, val: AriaAttrValue) => {\n const attrName = `aria-${name}`;\n const value = typeof val === 'function' ? (val as () => AriaAttrValue)() : val;\n\n if (value === null || value === undefined || value === false) {\n target.removeAttribute(attrName);\n } else {\n target.setAttribute(attrName, String(value));\n }\n };\n\n // Each key gets its own effect so changes to one attr don't re-apply all others.\n const stops = Object.entries(attrs).map(([name, val]) => effect(() => applyAttr(name, val)));\n\n if (maybeAttrs !== undefined) {\n return () => {\n for (const stop of stops) stop();\n };\n }\n}\n","/**\n * Host utilities — component context injection, slot observation, and attribute/class reflection.\n *\n * - Context API (provide, inject, createContext, syncContextProps)\n * - Slot observation and detection (Slots type, createSlots, onSlotChange)\n * - Host element binding (reflect) for attributes, events, and classes\n */\n\nimport { type ReadonlySignal, type Signal, signal } from '@vielzeug/stateit';\n\n// Use the wrapped effect from runtime-lifecycle so reactive bindings are\n// automatically cleaned up on unmount — raw stateit effect has no lifecycle awareness.\nimport { currentRuntime, effect, handle, onCleanup, onMount } from './runtime-lifecycle';\nimport { setAttr } from './utilities';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONTEXT API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst contextRegistry = new WeakMap<HTMLElement, Map<InjectionKey<unknown> | string | symbol, unknown>>();\n\nexport type InjectionKey<T> = symbol & {\n readonly __craftit_injection_key?: T;\n};\n\nexport const provide = <T>(key: InjectionKey<T> | string | symbol, value: T): void => {\n const el = currentRuntime().el;\n\n if (!contextRegistry.has(el)) contextRegistry.set(el, new Map());\n\n contextRegistry.get(el)!.set(key, value);\n};\n\nexport function inject<T>(key: InjectionKey<T> | string | symbol): T | undefined;\nexport function inject<T>(key: InjectionKey<T> | string | symbol, fallback: T): T;\nexport function inject<T>(key: InjectionKey<T> | string | symbol, ...rest: [T?]): T | undefined {\n let node: Node | null = currentRuntime().el;\n\n while (node) {\n if (node instanceof HTMLElement) {\n const v = contextRegistry.get(node)?.get(key);\n\n if (v !== undefined) return v as T;\n }\n\n const root = node.getRootNode() as Node;\n\n node = (node as HTMLElement).parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n return rest.length > 0 ? rest[0] : undefined;\n}\n\nexport function createContext<T>(description?: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>;\n}\n\n/**\n * Reactively inherits prop values from a context object provided by an ancestor component.\n * For each key, when the context value is not `undefined`, it is written into the matching prop signal.\n * The effect is automatically cleaned up when the component unmounts.\n *\n * Deferred to `onMount` so context values win over HTML attribute values set on the child.\n *\n * @example\n * syncContextProps(inject(BUTTON_GROUP_CTX), props, ['color', 'size', 'variant']);\n */\nexport const syncContextProps = <\n K extends string,\n Ctx extends Partial<Record<K, ReadonlySignal<unknown>>>,\n Props extends Record<K, Signal<unknown>>,\n>(\n ctx: Ctx | undefined,\n props: Props,\n keys: K[],\n): void => {\n if (!ctx) return;\n\n onMount(() => {\n effect(() => {\n for (const k of keys) {\n const v = ctx[k]?.value;\n\n if (v !== undefined) props[k].value = v;\n }\n });\n });\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SLOTS API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst missingSlotWarnings = new Set<string>();\n\nconst warnMissingSlot = (el: HTMLElement, slotName: string, source: 'onSlotChange()' | 'slots.has()'): void => {\n const key = `${source}:${el.localName}:${slotName || 'default'}`;\n\n if (missingSlotWarnings.has(key)) return;\n\n missingSlotWarnings.add(key);\n console.warn(\n `[craftit:E10] ${source} could not find a matching <slot${slotName ? ` name=\"${slotName}\"` : ''}> in <${el.localName}>. Render the slot before using ${source}.`,\n );\n};\n\nexport type Slots<T extends Record<string, unknown> = Record<string, unknown>> = {\n /**\n * Returns a `ReadonlySignal<boolean>` that is `true` when the slot has assigned content.\n * Reactive — use the signal directly in templates, computed(), or effects.\n * @example const hasIcon = slots.has('icon'); // ReadonlySignal<boolean>\n */\n has(name: keyof T): ReadonlySignal<boolean>;\n};\n\n/**\n * Observes a slot and calls `callback` with assigned elements whenever they change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * onSlotChange('icon', (nodes) => setHasIcon(nodes.length > 0));\n * });\n */\nexport const onSlotChange = (slotName: string, callback: (elements: Element[]) => void): void => {\n const el = currentRuntime().el;\n const name = slotName === 'default' ? '' : slotName;\n const selector = name ? `slot[name=\"${name}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n\n if (!slot) {\n warnMissingSlot(el, name, 'onSlotChange()');\n\n return;\n }\n\n const handler = () => callback(slot.assignedElements({ flatten: true }));\n\n handler();\n slot.addEventListener('slotchange', handler);\n onCleanup(() => slot.removeEventListener('slotchange', handler));\n};\n\nexport const createSlots = <T extends Record<string, unknown> = Record<string, unknown>>(): Slots<T> => {\n const el = currentRuntime().el;\n const sigs = new Map<string, Signal<boolean>>();\n\n const get = (slotName: string): Signal<boolean> => {\n if (sigs.has(slotName)) return sigs.get(slotName)!;\n\n const s = signal(false);\n\n sigs.set(slotName, s);\n\n onMount(() => {\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n\n if (!slot) {\n warnMissingSlot(el, slotName, 'slots.has()');\n\n return;\n }\n\n const update = () => {\n s.value = slot.assignedNodes().length > 0;\n };\n\n update();\n slot.addEventListener('slotchange', update);\n\n return () => slot.removeEventListener('slotchange', update);\n });\n\n return s;\n };\n\n return {\n has(name: keyof T): ReadonlySignal<boolean> {\n return get(name === 'default' ? '' : String(name));\n },\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REFLECT API (HOST ATTRIBUTE/EVENT/CLASS BINDING)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Describes a reactive or static host binding (attribute, event, class).\n */\nexport type HostBindingValue =\n | (() => string | number | boolean | null | undefined)\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for `reflect()`.\n */\nexport type ReflectConfig = {\n [key: string]: HostBindingValue | ((e: Event) => void);\n classMap?: () => Record<string, boolean>;\n};\n\n/**\n * Reflect reactive attributes, events, and classes to a host element.\n * Must be called within a component setup context.\n *\n * - `on*` keys map to event listeners: `onClick` → `'click'`, `onValueChanged` → `'valueChanged'`\n * - `classMap` maps to a reactive class object\n * - all other keys map to attributes (static or reactive getter)\n *\n * @example\n * setup({ reflect }) {\n * reflect({\n * role: 'checkbox',\n * tabindex: () => props.disabled.value ? undefined : 0,\n * checked: () => props.checked.value,\n * classMap: () => ({ checked: props.checked.value }),\n * onClick: handleToggle,\n * });\n * }\n */\nexport function reflect(host: HTMLElement, config: ReflectConfig): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === 'classMap') {\n applyClassMap(host, value as () => Record<string, boolean>);\n } else if (key.startsWith('on') && key.length > 2 && typeof value === 'function') {\n // onClick → 'click', onValueChanged → 'valueChanged', onKeydown → 'keydown'\n const raw = key.slice(2);\n\n handle(host, raw[0].toLowerCase() + raw.slice(1), value as (e: Event) => void);\n } else {\n applyAttribute(host, key, value as HostBindingValue);\n }\n }\n}\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): void {\n if (typeof value === 'function') {\n effect(() => setAttr(host, name, (value as () => HostBindingValue)()));\n } else {\n setAttr(host, name, value);\n }\n}\n\nfunction applyClassMap(host: HTMLElement, getter: () => Record<string, boolean>): void {\n let prev = new Set<string>();\n\n effect(() => {\n const next = new Set(\n Object.entries(getter())\n .filter(([, active]) => active)\n .map(([cls]) => cls),\n );\n\n for (const cls of prev) if (!next.has(cls)) host.classList.remove(cls);\n for (const cls of next) if (!prev.has(cls)) host.classList.add(cls);\n\n prev = next;\n });\n}\n","/**\n * @internal — Binding type system and engine internals.\n *\n * These types define the contract between the template compiler and binding engine.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Public-facing types (HTMLResult, Directive, Ref, RefCallback, Refs) are\n * re-exported from the main entry point.\n */\n\nimport { type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Ref<T extends Element> {\n value: T | null;\n}\n\nexport function ref<T extends Element>(): Ref<T> {\n return { value: null };\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTML RESULT\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type HTMLResult = {\n __bindings: Binding[];\n __html: string;\n toString(): string;\n};\n\n/** @internal — construct an HTMLResult from a pre-built html string and bindings. */\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n return {\n __bindings: bindings,\n __html: html,\n toString() {\n return html;\n },\n };\n}\n\n/** @internal — extract html and bindings from a string or HTMLResult. */\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DIRECTIVES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DirectiveContext {\n /** The cleanup registration function for the component. */\n registerCleanup: (fn: () => void) => void;\n}\n\nexport interface Directive {\n /** Invoked when the element is mounted in the DOM. */\n mount?(el: HTMLElement, context: DirectiveContext): void;\n /** Invoked by the template engine to render content (interpolation directives). */\n render?(): HTMLResult | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BINDING TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type PropBinding = {\n /** Optional writable source used for native two-way bridge (.value/.checked). */\n model?: Signal<unknown>;\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'prop';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n modifiers?: {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n prevent?: boolean;\n self?: boolean;\n stop?: boolean;\n };\n name: string;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type CallbackBinding = {\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;\n type: 'callback';\n uid: string;\n};\n\nexport type HtmlBinding = {\n keyed?: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n type: 'html';\n uid: string;\n};\n\nexport type Binding =\n | TextBinding\n | AttrBinding\n | PropBinding\n | EventBinding\n | RefBinding\n | CallbackBinding\n | HtmlBinding;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL MARKERS & CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — opaque marker for each() reactive results. */\nexport const EACH_SIGNAL: unique symbol = Symbol('craftit.eachSignal');\n\n/** @internal — binding element identifier attribute. */\nexport const CF_ID_ATTR = 'u';\n","import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './utilities';\n\nexport type RegisterPropertyCleanup = (fn: () => void) => void;\n\nexport const toReactiveBindingSource = (value: unknown): ReadonlySignal<unknown> | undefined => {\n if (isSignal(value)) return value as ReadonlySignal<unknown>;\n\n if (typeof value === 'function') return computed(value as () => unknown);\n\n return undefined;\n};\n\nexport const hasWritableValueSetter = (value: unknown): value is Signal<unknown> => {\n if (!isSignal(value)) return false;\n\n let proto: object | null = Object.getPrototypeOf(value);\n\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'value');\n\n if (descriptor) return typeof descriptor.set === 'function';\n\n proto = Object.getPrototypeOf(proto);\n }\n\n return false;\n};\n\nconst updateModelValue = (model: Signal<unknown>, next: unknown): void => {\n if (Object.is(model.value, next)) return;\n\n try {\n model.value = next;\n } catch {\n // Readonly signal/computed source: keep one-way behavior.\n }\n};\n\nexport const bindPropertyModel = (\n el: HTMLElement,\n name: string,\n model: Signal<unknown> | undefined,\n registerCleanup: RegisterPropertyCleanup,\n): void => {\n if (!model) return;\n\n if (name === 'value') {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n const eventName = el instanceof HTMLSelectElement ? 'change' : 'input';\n\n registerCleanup(\n listen(el, eventName, () => {\n updateModelValue(model, el.value);\n }),\n );\n }\n\n return;\n }\n\n if (name === 'checked' && el instanceof HTMLInputElement) {\n registerCleanup(\n listen(el, 'change', () => {\n updateModelValue(model, el.checked);\n }),\n );\n }\n};\n","import { CF_ID_ATTR } from './internal';\n\nexport type BindingTargets = {\n comments: Map<string, Comment>;\n elements: Map<string, HTMLElement>;\n};\n\nconst templateCache = new Map<string, HTMLTemplateElement>();\nconst TEMPLATE_CACHE_MAX = 1000;\n\nconst getCachedTemplate = (html: string): HTMLTemplateElement => {\n let tpl = templateCache.get(html);\n\n if (!tpl) {\n tpl = document.createElement('template');\n tpl.innerHTML = html;\n\n if (templateCache.size >= TEMPLATE_CACHE_MAX) {\n const oldestKey = templateCache.keys().next().value as string | undefined;\n\n if (oldestKey !== undefined) templateCache.delete(oldestKey);\n }\n\n templateCache.set(html, tpl);\n }\n\n return tpl;\n};\n\nexport const parseHTML = (html: string): DocumentFragment =>\n getCachedTemplate(html).content.cloneNode(true) as DocumentFragment;\n\nconst collectBindingTarget = (node: Node, targets: BindingTargets): void => {\n if (node.nodeType === Node.COMMENT_NODE) {\n const marker = (node as Comment).nodeValue;\n\n if (marker) targets.comments.set(marker, node as Comment);\n\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n\n const id = (node as Element).getAttribute(CF_ID_ATTR);\n\n if (id) targets.elements.set(id, node as HTMLElement);\n};\n\nexport const indexBindings = (root: Node): BindingTargets => {\n const targets: BindingTargets = { comments: new Map(), elements: new Map() };\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT);\n\n collectBindingTarget(root, targets);\n\n while (walker.nextNode()) collectBindingTarget(walker.currentNode, targets);\n\n return targets;\n};\n\nexport const indexBindingsInNodes = (nodes: Iterable<Node>): BindingTargets => {\n const targets: BindingTargets = { comments: new Map(), elements: new Map() };\n\n for (const node of nodes) {\n const walker = document.createTreeWalker(node, NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT);\n\n collectBindingTarget(node, targets);\n\n while (walker.nextNode()) collectBindingTarget(walker.currentNode, targets);\n }\n\n return targets;\n};\nexport const findCommentMarker = (root: Node, marker: string): Comment | null => {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n\n if (comment.nodeValue === marker) return comment;\n }\n\n return null;\n};\n\nexport const isHtmlBindingMarker = (node: Node): boolean =>\n node.nodeType === Node.COMMENT_NODE &&\n ((node as Comment).data === 'html-binding' || (node as Comment).data.startsWith('__h_'));\n\nexport const clearAfterMarker = (marker: Comment): void => {\n let next = marker.nextSibling;\n\n while (next) {\n if (isHtmlBindingMarker(next)) break;\n\n const toRemove = next;\n\n next = next.nextSibling;\n toRemove.remove();\n }\n};\n\nexport const createNodes = (htmlString: string): Node[] => Array.from(parseHTML(htmlString).childNodes);\n\nexport const insertNodes = (marker: Comment, nodes: Node[], before: Node | null): void => {\n if (marker.parentNode) {\n for (const node of nodes) marker.parentNode.insertBefore(node, before);\n }\n};\n","import { type CleanupFn, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { propRegistry } from './component';\nimport {\n type AttrBinding,\n type EventBinding,\n type PropBinding,\n type RefBinding,\n type Binding,\n type HtmlBinding,\n CF_ID_ATTR,\n} from './internal';\nimport { bindPropertyModel } from './runtime-bindings';\nimport { effect } from './runtime-lifecycle';\nimport { listen, setAttr } from './utilities';\n\nexport type RegisterCleanup = (fn: CleanupFn) => void;\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/** Check if a value is a structured type (object or array), not a primitive. */\nconst isStructuredValue = (value: unknown): value is object =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\n/**\n * Register a reactive effect that updates when a signal changes.\n * Common pattern: `if (signal) registerCleanup(effect(() => update(signal.value)))`\n */\nconst signalEffect = (\n signal: ReadonlySignal<unknown>,\n update: (v: unknown) => void,\n registerCleanup: RegisterCleanup,\n): void => {\n registerCleanup(effect(() => update(signal.value)));\n};\n\n// ─── Individual binding application functions ─────────────────────────────────\n\n/**\n * Apply an attribute binding to an element.\n * Handles bool/attr modes, prop pre-upgrade, and reactive updates.\n */\nexport const applyAttrBinding = (el: HTMLElement, binding: AttrBinding, registerCleanup: RegisterCleanup) => {\n const update = (value: unknown) => {\n const meta = propRegistry.get(el)?.get(binding.name);\n\n // Preserve structured values as pre-upgrade properties\n if (!meta && isStructuredValue(value)) {\n (el as any)[binding.name] = value;\n\n return;\n }\n\n if (!meta || meta.reflect) {\n if (binding.mode === 'bool') {\n el.toggleAttribute(binding.name, Boolean(value));\n } else {\n setAttr(el, binding.name, value);\n }\n }\n\n if (!meta) return;\n\n const parsedValue = isStructuredValue(value)\n ? value\n : meta.parse(\n binding.mode === 'bool' ? (value ? '' : null) : value == null || value === false ? null : String(value),\n );\n\n if (!Object.is(meta.signal.peek(), parsedValue)) {\n meta.signal.value = parsedValue as never;\n }\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n};\n\n/**\n * Apply a property binding to an element.\n * Handles reactive updates and two-way binding via property models.\n */\nexport const applyPropBinding = (el: HTMLElement, binding: PropBinding, registerCleanup: RegisterCleanup) => {\n const update = (value: unknown) => {\n (el as any)[binding.name] = value;\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n\n bindPropertyModel(el, binding.name, binding.model, registerCleanup);\n};\n\n/**\n * Apply an event listener binding to an element.\n * Handles event modifiers (stop, prevent, self, capture, once, passive).\n */\nexport const applyEventBinding = (el: HTMLElement, binding: EventBinding, registerCleanup: RegisterCleanup) => {\n const { modifiers } = binding;\n const listenerOptions = modifiers\n ? { capture: !!modifiers.capture, once: !!modifiers.once, passive: !!modifiers.passive }\n : undefined;\n\n const wrappedHandler = (event: Event) => {\n if (modifiers?.self && event.target !== event.currentTarget) return;\n\n if (modifiers?.stop) event.stopPropagation();\n\n if (modifiers?.prevent && !modifiers?.passive) event.preventDefault();\n\n binding.handler(event);\n };\n\n registerCleanup(listen(el, binding.name, wrappedHandler, listenerOptions));\n};\n\n/**\n * Apply a ref binding to an element.\n * Supports function refs, ref arrays, and signal refs with cleanup.\n */\nexport const applyRefBinding = (el: HTMLElement, binding: RefBinding, registerCleanup: RegisterCleanup) => {\n const { ref } = binding;\n\n if (typeof ref === 'function') {\n ref(el as never);\n registerCleanup(() => ref(null));\n\n return;\n }\n\n if (Array.isArray(ref)) {\n ref.push(el);\n registerCleanup(() => {\n const idx = ref.indexOf(el);\n\n if (idx !== -1) ref.splice(idx, 1);\n });\n\n return;\n }\n\n ref.value = el as never;\n registerCleanup(() => {\n ref.value = null;\n });\n};\n\n// ─── Binding orchestration ────────────────────────────────────────────────────\n\nimport { type BindingTargets } from './template-dom';\n\n/**\n * Apply all bindings to target elements.\n *\n * - Text bindings: Create text nodes, register reactive effects\n * - HTML bindings: Notify caller for keyed reconciliation\n * - Element bindings: Group by ID, apply attr/prop/event/ref in one pass per element\n *\n * @param bindings Array of compiled bindings to apply\n * @param registerCleanup Function to register cleanup callbacks\n * @param targets Indexed comment/element targets from DOM\n * @param opts Optional callbacks (e.g., onHtml for keyed reconciliation)\n */\nexport const applyBindingsWithTargets = (\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n targets: BindingTargets,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n const bindingMap = new Map<string, Binding[]>();\n\n for (const b of bindings) {\n const id = b.uid;\n\n if (b.type === 'text') {\n const found = targets.comments.get(id);\n\n if (found) {\n const textNode = document.createTextNode('');\n\n found.replaceWith(textNode);\n targets.comments.delete(id);\n signalEffect(\n b.signal,\n (v) => {\n textNode.textContent = String(v);\n },\n registerCleanup,\n );\n }\n } else if (b.type === 'html') {\n opts?.onHtml?.(b);\n } else {\n if (!bindingMap.has(id)) bindingMap.set(id, []);\n\n bindingMap.get(id)!.push(b);\n }\n }\n\n for (const [id, elBindings] of bindingMap) {\n const el = targets.elements.get(id);\n\n if (!el) continue;\n\n el.removeAttribute(CF_ID_ATTR);\n targets.elements.delete(id);\n\n for (const b of elBindings) {\n switch (b.type) {\n case 'attr':\n applyAttrBinding(el, b, registerCleanup);\n break;\n case 'callback':\n b.apply(el, registerCleanup);\n break;\n case 'event':\n applyEventBinding(el, b, registerCleanup);\n break;\n case 'prop':\n applyPropBinding(el, b, registerCleanup);\n break;\n case 'ref':\n applyRefBinding(el, b, registerCleanup);\n break;\n }\n }\n }\n};\n\n// ─── Binding factories ────────────────────────────────────────────────────────\n\nimport { type Signal } from '@vielzeug/stateit';\n\nimport { hasWritableValueSetter, toReactiveBindingSource } from './runtime-bindings';\n\n/**\n * Create an attribute binding descriptor.\n * Called during template compilation for each attribute interpolation.\n *\n * @param mode 'bool' for boolean attributes (presence = true), 'attr' for string values\n * @param name Attribute name (e.g., 'disabled', 'aria-label')\n * @param uid Unique binding ID\n * @param value Attribute value (signal or static)\n */\nexport const createAttrBinding = (mode: 'bool' | 'attr', name: string, uid: string, value: unknown): AttrBinding => {\n const source = toReactiveBindingSource(value);\n\n return source ? { mode, name, signal: source, type: 'attr', uid } : { mode, name, type: 'attr', uid, value };\n};\n\n/**\n * Create a property binding descriptor.\n * Called during template compilation for each `.property` interpolation.\n *\n * @param name Property name (e.g., 'value', 'checked')\n * @param uid Unique binding ID\n * @param value Property value (signal, function, or static)\n */\nexport const createPropBinding = (name: string, uid: string, value: unknown): PropBinding => {\n const source = toReactiveBindingSource(value);\n\n if (source) {\n return {\n model: hasWritableValueSetter(value) ? (value as Signal<unknown>) : undefined,\n name,\n signal: source,\n type: 'prop',\n uid,\n };\n }\n\n return { name, type: 'prop', uid, value };\n};\n","import { computed, isSignal, signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport {\n CF_ID_ATTR,\n EACH_SIGNAL,\n htmlResult,\n type Binding,\n type Directive,\n type EventBinding,\n type HTMLResult,\n type Ref,\n type RefCallback,\n} from './internal';\nimport { createAttrBinding, createPropBinding } from './template-bindings';\nimport { escapeHtml } from './utilities';\n\nconst ATTR_ID_RE = new RegExp(`${CF_ID_ATTR}=\"([^\"]+)\"`, 'g');\n\nconst isHtmlResult = (value: unknown): value is HTMLResult => typeof value === 'object' && !!value && '__html' in value;\nconst normalizeCompiledHtml = (html: string): string => html.replace(/>\\s+</g, '><').trim();\n\n// Slot patterns applied in priority order; first match wins\nconst SLOT_PATTERNS = [\n { kind: 'event' as const, regex: /\\s+@([a-zA-Z_][-a-zA-Z0-9_.]*)\\s*=\\s*[\"']?$/ },\n { kind: 'ref' as const, regex: /\\s+ref\\s*=\\s*[\"']?$/ },\n { kind: 'specialAttr' as const, regex: /\\s+([:?])([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n { kind: 'prop' as const, regex: /\\.([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n { kind: 'plainAttr' as const, regex: /\\s+([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n] as const;\n\ntype CompiledTemplateSlot = {\n kind: (typeof SLOT_PATTERNS)[number]['kind'] | 'node';\n // For 'specialAttr' slots\n mode?: 'attr' | 'bool';\n modifiers?: EventBinding['modifiers'];\n // For 'event' slots\n name?: string;\n prefix: string;\n raw: string;\n};\n\ntype CompiledTemplatePlan = {\n slots: CompiledTemplateSlot[];\n tail: string;\n};\n\nconst templatePlanCache = new WeakMap<TemplateStringsArray, CompiledTemplatePlan>();\n\n/**\n * Parses event descriptor string into name and modifiers.\n * @example\n * parseEventDescriptor('click.stop.prevent') → { name: 'click', modifiers: { stop, prevent } }\n */\nconst parseEventDescriptor = (descriptor: string): { modifiers: EventBinding['modifiers']; name: string } => {\n const [name, ...rawModifiers] = descriptor.split('.');\n const modifiers: NonNullable<EventBinding['modifiers']> = {};\n\n for (const modifier of rawModifiers) {\n if (modifier === 'capture') modifiers.capture = true;\n else if (modifier === 'once') modifiers.once = true;\n else if (modifier === 'passive') modifiers.passive = true;\n else if (modifier === 'prevent') modifiers.prevent = true;\n else if (modifier === 'self') modifiers.self = true;\n else if (modifier === 'stop') modifiers.stop = true;\n }\n\n return { modifiers: Object.keys(modifiers).length ? modifiers : undefined, name };\n};\n\nconst buildTemplatePlan = (strings: TemplateStringsArray): CompiledTemplatePlan => {\n const slots: CompiledTemplateSlot[] = [];\n\n for (let i = 0; i < strings.length - 1; i++) {\n const str = strings[i];\n let matched = false;\n\n for (const pattern of SLOT_PATTERNS) {\n const m = pattern.regex.exec(str);\n\n if (!m) continue;\n\n const prefix = str.slice(0, -m[0].length);\n\n matched = true;\n\n if (pattern.kind === 'event') {\n const parsed = parseEventDescriptor(m[1]);\n\n slots.push({ kind: 'event', modifiers: parsed.modifiers, name: parsed.name, prefix, raw: str });\n } else if (pattern.kind === 'ref') {\n slots.push({ kind: 'ref', prefix, raw: str });\n } else if (pattern.kind === 'specialAttr') {\n slots.push({ kind: 'specialAttr', mode: m[1] === '?' ? 'bool' : 'attr', name: m[2], prefix, raw: str });\n } else if (pattern.kind === 'prop') {\n slots.push({ kind: 'prop', name: m[1], prefix, raw: str });\n } else if (pattern.kind === 'plainAttr') {\n slots.push({ kind: 'plainAttr', name: m[1], prefix, raw: str });\n }\n\n break; // first match wins\n }\n\n if (!matched) {\n slots.push({ kind: 'node', prefix: str, raw: str });\n }\n }\n\n return { slots, tail: strings[strings.length - 1] ?? '' };\n};\n\nconst getCompiledTemplatePlan = (strings: TemplateStringsArray): CompiledTemplatePlan => {\n let plan = templatePlanCache.get(strings);\n\n if (!plan) {\n plan = buildTemplatePlan(strings);\n templatePlanCache.set(strings, plan);\n }\n\n return plan;\n};\n\nconst createMarkerIdFactory = (): (() => string) => {\n let markerIndex = 0;\n\n return () => String(markerIndex++);\n};\n\nconst rekeyHtmlResult = (\n result: HTMLResult,\n getNextId: () => string,\n): {\n bindings: Binding[];\n html: string;\n} => {\n const idMap = new Map<string, string>();\n const getMappedId = (id: string): string => {\n const mapped = idMap.get(id);\n\n if (mapped) return mapped;\n\n const next = getNextId();\n\n idMap.set(id, next);\n\n return next;\n };\n\n return {\n bindings: result.__bindings.map((binding) => ({ ...binding, uid: getMappedId(binding.uid) }) as Binding),\n html: result.__html\n .replace(ATTR_ID_RE, (_, id: string) => `${CF_ID_ATTR}=\"${getMappedId(id)}\"`)\n .replace(/<!--(\\d+)-->/g, (_, id: string) => `<!--${getMappedId(id)}-->`),\n };\n};\n\nconst getEachSignalSource = (\n value: unknown,\n): ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n}> | null => {\n if (typeof value !== 'object' || value === null || !(EACH_SIGNAL in value)) return null;\n\n return (value as { [EACH_SIGNAL]: ReadonlySignal<{ bindings: Binding[]; html: string }> })[EACH_SIGNAL];\n};\n\nconst resolveDirectiveValue = (value: unknown): string => {\n if (typeof value === 'string') return escapeHtml(value);\n\n if (value == null) return '';\n\n if (isHtmlResult(value)) return value.__html;\n\n return escapeHtml(String(value));\n};\n\nconst renderHtmlItems = (\n getter: () => unknown,\n effect: (fn: () => void) => void,\n): { bindings: Binding[]; signal: Signal<any> } => {\n let cached = { bindings: [] as Binding[], html: '' };\n const fnSignal = signal(cached);\n\n effect(() => {\n const res = getter();\n const items = Array.isArray(res) ? res : [res];\n const getNestedId = createMarkerIdFactory();\n let html = '';\n const nextBindings: Binding[] = [];\n\n for (const item of items) {\n if (isHtmlResult(item)) {\n const entry = rekeyHtmlResult(item, getNestedId);\n\n html += entry.html;\n nextBindings.push(...entry.bindings);\n } else {\n html += resolveDirectiveValue(item);\n }\n }\n\n const bindingsChanged =\n nextBindings.length !== cached.bindings.length || nextBindings.some((b, i) => b !== cached.bindings[i]);\n\n if (html !== cached.html || bindingsChanged) {\n cached = { bindings: nextBindings, html };\n fnSignal.value = cached;\n }\n });\n\n return { bindings: [], signal: fnSignal };\n};\n\nconst createHtmlWrapperSignal = (\n value: unknown,\n effect: (fn: () => void) => void,\n): {\n keyed: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n} | null => {\n const eachSignal = getEachSignalSource(value);\n\n if (eachSignal) {\n return { keyed: true, signal: eachSignal };\n }\n\n if (typeof value === 'function' && !isSignal(value)) {\n const { signal: sig } = renderHtmlItems(value as () => unknown, effect);\n\n return { keyed: false, signal: sig };\n }\n\n if (isSignal(value) && isHtmlResult(value.value)) {\n return {\n keyed: false,\n signal: computed(() => {\n const next = (value as ReadonlySignal<unknown>).value;\n\n if (!isHtmlResult(next)) {\n return { bindings: [], html: String(next) };\n }\n\n const entry = rekeyHtmlResult(next, createMarkerIdFactory());\n\n return { bindings: entry.bindings, html: entry.html };\n }),\n };\n }\n\n return null;\n};\n\nexport const resetTemplateCompilerState = (): void => {\n // Marker IDs are deterministic per compiled template; no global state to reset.\n};\n\n/**\n * Compiles a tagged template into an HTMLResult with reactive bindings.\n *\n * Detects interpolation slots using regex patterns:\n * - `@event-name` → event listener binding\n * - `ref` → ref binding\n * - `:prop` or `?bool` → special attributes\n * - `.prop` → property binding\n * - plain attributes → attribute binding\n *\n * Rekeys nested HTMLResult bindings to avoid ID collisions.\n *\n * @param strings - Template string parts\n * @param values - Interpolated values (signals, functions, directives, primitives)\n * @param effect - Effect hook for reactive bindings\n * @returns HTMLResult with compiled HTML and bindings array\n *\n * @example\n * const name = signal('Alice');\n * const html = compileTemplate`<h1>${() => name.value}</h1>`;\n */\nexport const compileTemplate = (\n strings: TemplateStringsArray,\n values: unknown[],\n effect: (fn: () => void) => void,\n): HTMLResult => {\n const plan = getCompiledTemplatePlan(strings);\n let result = '';\n const bindings: Binding[] = [];\n let activeElementId: string | null = null;\n\n const getNextId = createMarkerIdFactory();\n const isInsideStartTag = (prefix: string) => prefix.lastIndexOf('<') > prefix.lastIndexOf('>');\n const getElementBindingId = (prefix: string): string => {\n if (!activeElementId || isInsideStartTag(prefix)) {\n activeElementId = getNextId();\n }\n\n return activeElementId;\n };\n const resetElementBindingId = (): void => {\n activeElementId = null;\n };\n\n for (let i = 0; i < plan.slots.length; i++) {\n const slot = plan.slots[i];\n const value = values[i];\n\n if (slot.kind === 'event') {\n if (typeof value === 'function') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push({\n handler: value as (e: Event) => void,\n modifiers: slot.modifiers,\n name: slot.name!,\n type: 'event',\n uid: id,\n });\n } else {\n result += slot.raw;\n }\n\n continue;\n }\n\n if (slot.kind === 'ref') {\n if (value) {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push({\n ref: value as Ref<Element> | RefCallback<Element>,\n type: 'ref',\n uid: id,\n });\n } else {\n result += slot.raw;\n }\n\n continue;\n }\n\n if (slot.kind === 'specialAttr') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push(createAttrBinding(slot.mode!, slot.name!, id, value));\n continue;\n }\n\n if (slot.kind === 'prop') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push(createPropBinding(slot.name!, id, value));\n continue;\n }\n\n if (slot.kind === 'plainAttr') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push(createAttrBinding('attr', slot.name!, id, value));\n continue;\n }\n\n if (typeof value === 'object' && value !== null && ('mount' in value || 'render' in value)) {\n const isInterpolation = 'render' in value;\n const id = isInterpolation ? getNextId() : getElementBindingId(slot.raw);\n\n if (isInterpolation) result += `${slot.raw}<!--${id}-->`;\n else result += `${slot.raw} ${CF_ID_ATTR}=\"${id}\"`;\n\n const apply = (value as Directive).mount?.bind(value);\n\n if (apply) {\n bindings.push({\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => {\n apply(el, { registerCleanup });\n },\n type: 'callback',\n uid: id,\n });\n }\n\n if (isInterpolation) {\n const render = (value as Directive).render!.bind(value);\n let cached = { bindings: [] as Binding[], html: '' };\n const fnSignal = signal(cached);\n\n effect(() => {\n const res = render();\n const items = Array.isArray(res) ? res : [res];\n const getNestedId = createMarkerIdFactory();\n let html = '';\n const nextBindings: Binding[] = [];\n\n for (const item of items) {\n if (isHtmlResult(item)) {\n const entry = rekeyHtmlResult(item, getNestedId);\n\n html += entry.html;\n nextBindings.push(...entry.bindings);\n } else {\n html += resolveDirectiveValue(item);\n }\n }\n\n const bindingsChanged =\n nextBindings.length !== cached.bindings.length || nextBindings.some((b, i) => b !== cached.bindings[i]);\n\n if (html !== cached.html || bindingsChanged) {\n cached = { bindings: nextBindings, html };\n fnSignal.value = cached;\n }\n });\n\n bindings.push({ keyed: false, signal: fnSignal, type: 'html', uid: id });\n }\n\n continue;\n }\n\n resetElementBindingId();\n\n const htmlWrapper = createHtmlWrapperSignal(value, effect);\n\n if (htmlWrapper) {\n const id = getNextId();\n\n result += `${slot.raw}<!--${id}-->`;\n bindings.push({ keyed: htmlWrapper.keyed, signal: htmlWrapper.signal, type: 'html', uid: id });\n continue;\n }\n\n if (Array.isArray(value)) {\n let combinedHtml = '';\n\n for (const item of value) {\n if (isHtmlResult(item)) {\n const entry = rekeyHtmlResult(item, getNextId);\n\n combinedHtml += entry.html;\n bindings.push(...entry.bindings);\n } else {\n combinedHtml += resolveDirectiveValue(item);\n }\n }\n result += slot.raw + combinedHtml;\n continue;\n }\n\n if (isSignal(value)) {\n const id = getNextId();\n\n result += `${slot.raw}<!--${id}-->`;\n bindings.push({ signal: value as Signal<unknown>, type: 'text', uid: id });\n } else if (isHtmlResult(value)) {\n const entry = rekeyHtmlResult(value, getNextId);\n\n result += slot.raw + entry.html;\n bindings.push(...entry.bindings);\n } else {\n result += slot.raw + resolveDirectiveValue(value);\n }\n }\n\n result += plan.tail;\n\n return htmlResult(normalizeCompiledHtml(result), bindings);\n};\n","import { batch, untrack, effect as _effect, type CleanupFn } from '@vielzeug/stateit';\n\nimport { type Binding, type HtmlBinding } from './internal';\nimport { applyBindingsWithTargets } from './template-bindings';\nimport { type RegisterCleanup } from './template-bindings';\nimport {\n createNodes,\n findCommentMarker,\n indexBindingsInNodes,\n insertNodes,\n parseHTML,\n type BindingTargets,\n} from './template-dom';\nimport { runAll } from './utilities';\n\n/** Keyed reconciliation node — holds DOM nodes + lifecycle for one `each()` item. */\nexport type KeyedNode = {\n bindings: Binding[];\n cleanups: CleanupFn[];\n html: string;\n nodes: Node[];\n targets: BindingTargets;\n};\n\nconst removeKeyed = (keyedNode: KeyedNode) => {\n runAll(keyedNode.cleanups);\n for (const n of keyedNode.nodes) (n as ChildNode).remove();\n};\n\n/** Apply bindings to keyed item nodes using pre-indexed targets. */\nconst applyKeyedItemBindings = (\n nodes: Node[],\n itemBindings: Binding[],\n targets = indexBindingsInNodes(nodes),\n): CleanupFn[] => {\n const itemCleanups: CleanupFn[] = [];\n const itemRegisterCleanup: RegisterCleanup = (fn) => itemCleanups.push(fn);\n\n applyBindingsWithTargets(itemBindings, itemRegisterCleanup, targets);\n\n return itemCleanups;\n};\n\n/**\n * Sets up the reactive effect for an html-binding marker. Handles both non-keyed\n * (full replace) and keyed (`each()`) reconciliation.\n *\n * @param root The root node containing the marker comment.\n * @param b The HtmlBinding descriptor.\n * @param registerCleanup Function that registers a cleanup tied to the outer container's lifetime.\n * @param keyedStates Per-element map of `marker → (key → KeyedNode)` — caller owns this state.\n * @param applyBindingsInContainer Function to apply bindings to container.\n */\nexport const applyHtmlBinding = (\n root: Node,\n b: HtmlBinding,\n registerCleanup: RegisterCleanup,\n keyedStates: Map<string, Map<string | number, KeyedNode>>,\n applyBindingsInContainer: (\n container: ParentNode,\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n ) => void,\n): void => {\n const found = findCommentMarker(root, b.uid);\n\n if (!found) return;\n\n const marker = document.createComment('html-binding');\n\n found.replaceWith(marker);\n\n let currentCleanups: CleanupFn[] = [];\n const registerInnerCleanup: RegisterCleanup = (fn) => currentCleanups.push(fn);\n const runCurrentCleanups = () => {\n runAll(currentCleanups);\n currentCleanups = [];\n };\n let lastHtml: string | null = null;\n let lastInsertedNodes: Node[] = [];\n\n // Use stateit.effect directly so cleanup is managed manually via registerCleanup, not autoCleanup.\n const stop = _effect(() => {\n batch(() => {\n const data = b.signal.value;\n\n if (!b.keyed && data.html === lastHtml) {\n return;\n }\n\n lastHtml = data.html;\n\n runCurrentCleanups();\n\n const { bindings, html, keys } = data;\n\n if (b.keyed && !keyedStates.has(b.uid)) keyedStates.set(b.uid, new Map());\n\n const keyedState = b.keyed ? keyedStates.get(b.uid)! : null;\n const container = (marker.parentElement || root) as ParentNode;\n\n let bindingsAlreadyApplied = false;\n\n untrack(() => {\n batch(() => {\n if (keyedState && keys?.length && data.items?.length === keys.length) {\n bindingsAlreadyApplied = true;\n\n // Transition from empty/fallback insertion back to keyed list items.\n if (keyedState.size === 0 && lastInsertedNodes.length > 0) {\n for (const n of lastInsertedNodes) (n as ChildNode).remove();\n lastInsertedNodes = [];\n }\n\n const newKeyedState = new Map<string | number, KeyedNode>();\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const itemData = data.items[i];\n const existing = keyedState.get(key);\n\n const prevNodes = i > 0 ? newKeyedState.get(keys[i - 1])?.nodes : null;\n const insertPoint = prevNodes?.length ? prevNodes[prevNodes.length - 1].nextSibling : marker.nextSibling;\n\n if (existing?.html === itemData.html) {\n // UPDATE: Same HTML — reuse nodes, reapply bindings\n if (existing.nodes[0]) insertNodes(marker, existing.nodes, insertPoint);\n\n runAll(existing.cleanups);\n\n const itemTargets = indexBindingsInNodes(existing.nodes);\n const itemCleanups = applyKeyedItemBindings(existing.nodes, itemData.bindings, itemTargets);\n\n newKeyedState.set(key, {\n ...existing,\n bindings: itemData.bindings,\n cleanups: itemCleanups,\n targets: itemTargets,\n });\n } else if (existing) {\n // REPLACE: Different HTML — create new nodes, remove old\n runAll(existing.cleanups);\n\n const newNodes = createNodes(itemData.html);\n const itemTargets = indexBindingsInNodes(newNodes);\n\n insertNodes(marker, newNodes, insertPoint);\n\n const itemCleanups = applyKeyedItemBindings(newNodes, itemData.bindings, itemTargets);\n\n newKeyedState.set(key, {\n bindings: itemData.bindings,\n cleanups: itemCleanups,\n html: itemData.html,\n nodes: newNodes,\n targets: itemTargets,\n });\n for (const n of existing.nodes) (n as ChildNode).remove();\n } else {\n // CREATE: New item\n const newNodes = createNodes(itemData.html);\n const itemTargets = indexBindingsInNodes(newNodes);\n\n insertNodes(marker, newNodes, insertPoint);\n\n const itemCleanups = applyKeyedItemBindings(newNodes, itemData.bindings, itemTargets);\n\n newKeyedState.set(key, {\n bindings: itemData.bindings,\n cleanups: itemCleanups,\n html: itemData.html,\n nodes: newNodes,\n targets: itemTargets,\n });\n }\n }\n\n // DELETE: Remove old items not in new state\n for (const [oldKey, oldNode] of keyedState) {\n if (!newKeyedState.has(oldKey)) removeKeyed(oldNode);\n }\n\n keyedStates.set(b.uid, newKeyedState);\n } else {\n // Non-keyed or empty list: replace previously inserted nodes.\n if (b.keyed && keyedState && keyedState.size > 0) {\n for (const [, kn] of keyedState) removeKeyed(kn);\n } else {\n for (const n of lastInsertedNodes) (n as ChildNode).remove();\n }\n\n const parsed = parseHTML(html);\n\n lastInsertedNodes = Array.from(parsed.childNodes);\n marker.after(parsed);\n\n if (b.keyed) keyedStates.set(b.uid, new Map());\n }\n });\n\n if (!bindingsAlreadyApplied) {\n applyBindingsInContainer(container, bindings, registerInnerCleanup, {\n onHtml: (binding) =>\n applyHtmlBinding(container, binding, registerInnerCleanup, keyedStates, applyBindingsInContainer),\n });\n }\n });\n });\n });\n\n registerCleanup(stop);\n registerCleanup(runCurrentCleanups);\n\n if (b.keyed) registerCleanup(() => keyedStates.delete(b.uid));\n};\n","import { type Binding, type HtmlBinding, type HTMLResult } from './internal';\nimport { effect } from './runtime-lifecycle';\nimport { applyBindingsWithTargets } from './template-bindings';\nimport { type RegisterCleanup } from './template-bindings';\nimport { compileTemplate, resetTemplateCompilerState } from './template-compiler';\nimport { indexBindings } from './template-dom';\nimport { applyHtmlBinding as applyHtmlBindingImpl, type KeyedNode } from './template-html';\n\n// ─── Re-exports for consumers ─────────────────────────────────────────────────\nexport type { KeyedNode };\n\n// ─── Binding application orchestration ────────────────────────────────────────\n\nexport const applyBindingsInContainer = (\n container: ParentNode,\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n applyBindingsWithTargets(bindings, registerCleanup, indexBindings(container), opts);\n};\n\n// ─── Reset and compilation ────────────────────────────────────────────────────\n\nexport const _resetMarkerIndex = (): void => {\n resetTemplateCompilerState();\n};\n\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]): HTMLResult =>\n compileTemplate(strings, values, effect);\n\n// ─── HTML binding with keyed reconciliation ────────────────────────────────────\n\nexport const applyHtmlBinding = (\n root: Node,\n b: HtmlBinding,\n registerCleanup: RegisterCleanup,\n keyedStates: Map<string, Map<string | number, KeyedNode>>,\n): void => {\n applyHtmlBindingImpl(root, b, registerCleanup, keyedStates, applyBindingsInContainer);\n};\n","/**\n * Component authoring API — define, props, lifecycle, and form field functionality.\n *\n * - defineComponent: Main API for building typed custom elements\n * - prop/typed/createProps: Reactive property definitions\n * - defineField: Form field integration\n */\n\nimport {\n type CleanupFn,\n type ComputedSignal,\n type ReadonlySignal,\n type Signal,\n signal,\n effect,\n} from '@vielzeug/stateit';\n\nimport { createSlots, type Slots, type ReflectConfig } from './host';\nimport { reflect } from './host';\nimport { type HTMLResult, htmlResult } from './internal';\nimport { currentRuntime, runtimeStack } from './runtime-lifecycle';\nimport { applyBindingsInContainer, applyHtmlBinding } from './template';\nimport { type RegisterCleanup } from './template-bindings';\nimport { parseHTML } from './template-dom';\nimport { type KeyedNode } from './template-html';\nimport { createEmitFn, type EmitFn, setAttr, toKebab, runAll, loadStylesheet, type CSSResult } from './utilities';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FORM FIELD API\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal */\nexport const formCallbackRegistry = new WeakMap<HTMLElement, FormFieldCallbacks>();\n/** @internal */\nexport const internalsRegistry = new WeakMap<HTMLElement, ElementInternals>();\n\n/**\n * Callbacks that hook into form lifecycle events. Can be passed directly to {@link defineField}\n * as a second argument to keep all form logic co-located.\n */\nexport type FormFieldCallbacks = {\n onAssociated?: (form: HTMLFormElement | null) => void;\n onDisabled?: (disabled: boolean) => void;\n onReset?: () => void;\n onStateRestore?: (state: unknown, mode: 'autocomplete' | 'restore') => void;\n};\n\nexport type FormFieldOptions<T = unknown> = {\n disabled?: Signal<boolean> | ReadonlySignal<boolean> | ComputedSignal<boolean>;\n toFormValue?: (value: T) => File | FormData | string | null;\n value: Signal<T> | ReadonlySignal<T>;\n};\n\nexport type FormFieldHandle = {\n checkValidity: () => boolean;\n readonly internals: ElementInternals;\n reportValidity: () => boolean;\n setCustomValidity: (message: string) => void;\n setValidity: ElementInternals['setValidity'];\n};\n\nexport const defineField = <T = unknown>(\n options: FormFieldOptions<T>,\n callbacks?: FormFieldCallbacks,\n): FormFieldHandle => {\n const rt = currentRuntime();\n const host = rt.el;\n const ctor = host.constructor as typeof HTMLElement & { formAssociated?: boolean };\n\n if (!ctor.formAssociated) {\n throw new Error('[craftit:E8] defineField() requires defineComponent({ formAssociated: true })');\n }\n\n const internals = internalsRegistry.get(host) ?? host.attachInternals();\n\n internalsRegistry.set(host, internals);\n\n const toFormValue = options.toFormValue ?? ((v: T) => (v == null ? '' : String(v)));\n\n effect(() => {\n internals.setFormValue(toFormValue(options.value.value));\n });\n\n if (options.disabled) {\n effect(() => {\n if (options.disabled!.value) {\n internals.states.add('disabled');\n } else {\n internals.states.delete('disabled');\n }\n });\n }\n\n if (callbacks) {\n formCallbackRegistry.set(host, { ...formCallbackRegistry.get(host), ...callbacks });\n }\n\n const checkValidity = () => internals.checkValidity();\n const reportValidity = () => internals.reportValidity();\n const setCustomValidity = (message: string) =>\n message ? internals.setValidity({ customError: true }, message) : internals.setValidity({});\n\n return {\n checkValidity,\n internals,\n reportValidity,\n setCustomValidity,\n setValidity: internals.setValidity.bind(internals),\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// PROP SYSTEM\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype PropType<T> = T extends string\n ? StringConstructor\n : T extends number\n ? NumberConstructor\n : T extends boolean\n ? BooleanConstructor\n : T extends unknown[]\n ? ArrayConstructor\n : ObjectConstructor;\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when the value is an empty string. */\n omit?: boolean;\n parse?: (value: string | null) => T;\n reflect?: boolean;\n type?: PropType<T>;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst isPropDef = (value: unknown): value is PropDef<unknown> => {\n if (typeof value !== 'object' || value === null || !('default' in value)) return false;\n\n return Object.keys(value).every((key) => PROP_DEF_KEYS.has(key));\n};\n\nexport const propRegistry = new WeakMap<object, Map<string, PropMeta<unknown>>>();\n\nexport const prop = <T>(name: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const rt = currentRuntime();\n const el = rt.el;\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n const parse =\n options?.parse ??\n ((v: string | null): T => {\n // Explicit Boolean type: string values 'true' / '' → boolean\n if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n // Boolean default: treat absent or explicit \"false\" as false, anything else as true.\n // This handles frameworks (e.g. Vue) that set the attribute to the string \"false\"\n // when a reactive binding evaluates to false, rather than removing the attribute.\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n // Numeric — inferred from an explicit type option or default value type\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, name);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[name] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n // Prefer pre-upgrade property values set before defineProperty() (common for\n // framework/host property bindings), then fall back to attributes.\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[name];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(name)) {\n s.value = parse(el.getAttribute(name)) as T;\n }\n\n propRegistry.get(el)!.set(name, meta);\n\n Object.defineProperty(el, name, {\n configurable: true,\n enumerable: true,\n get: () => s.value,\n set: (value: T) => {\n s.value = value;\n },\n });\n\n if (options?.reflect ?? true) {\n const omit = options?.omit ?? false;\n\n rt.onMount.push(() => {\n rt.cleanups.push(\n effect(() => {\n const v = s.value;\n\n if (v == null || v === false || (omit && v === '')) {\n el.removeAttribute(name);\n } else {\n setAttr(el, name, v);\n }\n }),\n );\n });\n }\n\n return s;\n};\n\ntype InferPropValue<T> = T extends object\n ? Exclude<keyof T, keyof PropDef<unknown>> extends never\n ? T extends PropDef<infer U>\n ? U\n : T\n : T\n : T;\n\nexport type InferPropsSignals<T extends PropInputDefs> = {\n [K in keyof T]: Signal<InferPropValue<T[K]>>;\n};\n\nexport function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<D> {\n const result = {} as Record<string, Signal<unknown>>;\n\n for (const [name, def] of Object.entries(defs)) {\n const descriptor = isPropDef(def) ? (def as PropDef<unknown>) : { default: def };\n const hasStructuredDefault =\n (typeof descriptor.default === 'object' && descriptor.default !== null) || Array.isArray(descriptor.default);\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n result[name] = prop(toKebab(name), descriptor.default, propDef);\n }\n\n return result as InferPropsSignals<D>;\n}\n\n/**\n * Forces TypeScript to infer the prop signal type from `T` rather than the default\n * value's literal type. Use in `defineComponent({ props: ... })` when the default\n * is `undefined` or when you want an explicit union type.\n *\n * @example\n * defineComponent<ButtonProps>({\n * props: {\n * color: typed<ThemeColor | undefined>(undefined),\n * disabled: { default: false },\n * },\n * setup({ props }) {\n * return html`<button>${props.color}</button>`;\n * },\n * tag: 'x-button',\n * });\n */\nexport const typed = <T>(defaultValue: T, options?: PropOptions<T>): PropDef<T> => ({\n ...options,\n default: defaultValue,\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// COMPONENT SETUP & REGISTRATION\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ComponentSetupContext = {\n /** The host `HTMLElement` instance for this component. */\n host: HTMLElement;\n /** Shorthand for `host.shadowRoot` — the component's open shadow root. */\n shadow: ShadowRoot;\n};\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** Custom options for host element (e.g. for aria-*) */\n host?: Record<string, string | boolean | number>;\n /** @internal — list of attribute names to observe via attributeChangedCallback */\n observedAttrs?: string[];\n /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\n/**\n * Helper type to build a prop schema from a props interface type.\n * Each property maps to a PropOptions shape with a `default` value.\n */\nexport type BuildPropSchema<T> = {\n [K in keyof T]-?: PropDef<T[K]>;\n};\n\n/**\n * Unified setup context passed to `defineComponent` setup function.\n * Both Props and Events generics flow through to give full type safety.\n */\nexport type DefineComponentSetupContext<\n P extends Record<string, PropOptions<any>> = Record<string, never>,\n E extends Record<string, unknown> = Record<string, never>,\n> = {\n /** Typed emit function — fully inferred from the Events generic */\n emit: EmitFn<E>;\n /** Host element */\n host: HTMLElement;\n /** Reactive props as signals — fully inferred from the Props generic */\n props: InferPropsSignals<P>;\n /** Reflect reactive attributes, events and classes to the host */\n reflect: (config: ReflectConfig) => void;\n /** Shadow root */\n shadow: ShadowRoot;\n /** Slots helper */\n slots: Slots<any>;\n};\n\n/**\n * Configuration object for `defineComponent()`.\n * Note: no `emits` field — declare events via the Events generic instead.\n */\nexport type DefineComponentOptions<\n PropsSchema extends Record<string, PropDef<any>> = Record<string, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n> = {\n /** Whether this element is form-associated */\n formAssociated?: boolean;\n /** Host element attributes */\n host?: Record<string, string | boolean | number>;\n /** Property definitions */\n props?: PropsSchema;\n /** Setup function — returns a template */\n setup: (ctx: DefineComponentSetupContext<PropsSchema, Emits>) => string | HTMLResult;\n /** Shadow root init options */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n /** Custom element tag name (must include a hyphen) */\n tag: string;\n};\n\n// ─── Base custom element ──────────────────────────────────────────────────────\n\ntype ComponentRuntime = {\n cleanups: CleanupFn[];\n el: HTMLElement;\n errorHandlers: Array<(err: unknown) => void>;\n onMount: Array<() => CleanupFn | undefined | void>;\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\n// Lifecycle methods (connectedCallback, attributeChangedCallback, …) are invoked\n// by the browser runtime, not TypeScript code — suppress false-positive lint warnings.\n\nclass BaseElement extends HTMLElement {\n static _setup: (ctx: ComponentSetupContext) => string | HTMLResult;\n static _options?: ComponentRegistrationOptions;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _keyedStates = new Map<string, Map<string | number, KeyedNode>>();\n private _mountFns: (() => CleanupFn | undefined | void)[] = [];\n private _template: string | HTMLResult | null = null;\n private _appliedHtmlBindings = new Set<string>();\n private _setupDone = false;\n private _runtime: ComponentRuntime;\n\n constructor() {\n super();\n\n const options = (this.constructor as typeof BaseElement)._options;\n\n this.shadow = this.attachShadow({ mode: 'open', ...options?.shadow });\n this._runtime = {\n cleanups: [],\n el: this,\n errorHandlers: [],\n onMount: [],\n styles: options?.styles,\n };\n }\n\n connectedCallback(): void {\n if (!this._setupDone) this._runSetup();\n\n this._init();\n }\n\n // Fires synchronously on observed attribute change — no MutationObserver needed.\n // observedAttributes is set at class-definition time from the prop schema.\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n const meta = propRegistry.get(this)?.get(name);\n\n if (!meta) return;\n\n const parsed = meta.parse(newValue);\n\n if (!Object.is(meta.signal.peek(), parsed)) meta.signal.value = parsed as never;\n }\n\n disconnectedCallback(): void {\n runAll(this._runtime.cleanups);\n this._runtime.cleanups = [];\n this._runtime.onMount = this._mountFns.slice(); // restore for reconnect\n this._appliedHtmlBindings.clear();\n this._keyedStates.clear();\n }\n\n formAssociatedCallback(form: HTMLFormElement | null): void {\n formCallbackRegistry.get(this)?.onAssociated?.(form);\n }\n\n formDisabledCallback(disabled: boolean): void {\n formCallbackRegistry.get(this)?.onDisabled?.(disabled);\n }\n\n formResetCallback(): void {\n formCallbackRegistry.get(this)?.onReset?.();\n }\n\n formStateRestoreCallback(state: unknown, mode: 'autocomplete' | 'restore'): void {\n formCallbackRegistry.get(this)?.onStateRestore?.(state, mode);\n }\n\n private _handleError(err: unknown): void {\n if (this._runtime.errorHandlers.length > 0) {\n for (const fn of this._runtime.errorHandlers) fn(err);\n } else {\n console.error(`[craftit:E3] <${this.localName}>`, err);\n }\n }\n\n private _runSetup(): void {\n this._setupDone = true;\n runtimeStack.push(this._runtime as any);\n\n try {\n const { host: hostOptions } = (this.constructor as typeof BaseElement)._options ?? {};\n\n if (hostOptions) {\n for (const [name, value] of Object.entries(hostOptions)) {\n if (typeof value === 'boolean') {\n if (value) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n } else {\n this.setAttribute(name, String(value));\n }\n }\n }\n\n const res = (this.constructor as typeof BaseElement)._setup({ host: this, shadow: this.shadow });\n\n if (typeof res === 'string' || (typeof res === 'object' && res !== null && '__html' in res)) {\n this._template = res as string | HTMLResult;\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n }\n }\n\n private _init(): void {\n const { styles } = this._runtime;\n\n // Apply styles synchronously before rendering to prevent FOUC.\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (this._template) {\n const result: HTMLResult = typeof this._template === 'string' ? htmlResult(this._template) : this._template;\n\n this.shadow.replaceChildren(parseHTML(result.__html));\n\n if (result.__bindings.length) {\n const registerCleanup: RegisterCleanup = (fn) => this._runtime.cleanups.push(fn);\n\n applyBindingsInContainer(this.shadow, result.__bindings, registerCleanup, {\n onHtml: (b) => {\n if (!this._appliedHtmlBindings.has(b.uid)) {\n this._appliedHtmlBindings.add(b.uid);\n applyHtmlBinding(this.shadow, b, registerCleanup, this._keyedStates);\n }\n },\n });\n }\n }\n\n // Defer onMount callbacks to a microtask for deterministic timing.\n // Components that depend on layout/paint should schedule rAF inside onMount.\n queueMicrotask(() => {\n runtimeStack.push(this._runtime as any);\n\n try {\n const fns = this._runtime.onMount;\n\n this._mountFns = fns.slice(); // snapshot for reconnect\n\n for (const fn of fns) {\n const cleanup = fn();\n\n if (typeof cleanup === 'function') this._runtime.cleanups.push(cleanup);\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n this._runtime.onMount = [];\n }\n });\n }\n}\n\n// ─── Component registration ───────────────────────────────────────────────────\n\n/** @internal — use `defineComponent` instead. */\nexport function registerComponent(\n tag: string,\n setup: (ctx: ComponentSetupContext) => string | HTMLResult,\n options: ComponentRegistrationOptions = {},\n): string {\n if (!tag) throw new Error('[craftit:E4] registerComponent(tag, ...) requires a tag name');\n\n if (customElements.get(tag)) {\n throw new Error(`[craftit:E9] custom element already defined: ${tag}`);\n }\n\n class Element extends BaseElement {\n static override _setup = setup;\n static override _options = options;\n static override formAssociated = options.formAssociated ?? false;\n static override observedAttributes = options.observedAttrs ?? [];\n }\n\n customElements.define(tag, Element);\n\n return tag;\n}\n\n/**\n * Defines a custom element with a cohesive, type-safe API.\n *\n * Pass your Props and Events interfaces as generics — everything in `setup`\n * is fully typed with zero boilerplate.\n *\n * @example\n * ```ts\n * type MyProps = { checked?: boolean; disabled?: boolean };\n * type MyEvents = { change: { checked: boolean } };\n *\n * defineComponent<MyProps, MyEvents>({\n * tag: 'my-checkbox',\n * props: {\n * checked: { default: false },\n * disabled: { default: false },\n * },\n * setup({ props, emit }) {\n * // props.checked → Signal<boolean> ✅\n * // emit('change', { checked: true }) ✅\n * },\n * });\n * ```\n */\nexport function defineComponent<\n PropsType = Record<string, never>,\n EventsType extends Record<string, unknown> = Record<string, never>,\n>(options: DefineComponentOptions<BuildPropSchema<PropsType>, EventsType>): string {\n const { formAssociated, host: hostOptions, props: propDefs, setup, shadow: shadowOptions, styles, tag } = options;\n\n // Derive observed attribute names from prop schema at definition time so\n // attributeChangedCallback fires correctly — no MutationObserver needed.\n const observedAttrs = propDefs ? Object.keys(propDefs).map(toKebab) : [];\n\n return registerComponent(\n tag,\n (ctx) => {\n const props = propDefs\n ? createProps(propDefs as BuildPropSchema<PropsType>)\n : ({} as InferPropsSignals<BuildPropSchema<PropsType>>);\n const emit = createEmitFn<EventsType>();\n const slots = createSlots<any>();\n\n return setup({\n emit: emit as EmitFn<EventsType>,\n host: ctx.host,\n props,\n reflect: (config: ReflectConfig) => reflect(ctx.host, config),\n shadow: ctx.shadow,\n slots,\n } as DefineComponentSetupContext<BuildPropSchema<PropsType>, EventsType>);\n },\n { formAssociated, host: hostOptions, observedAttrs, shadow: shadowOptions, styles },\n );\n}\n","import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../core/runtime';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const size = observeResize(containerRef.value!);\n * effect(() => console.log(size.value.width, size.value.height));\n * });\n */\nexport const observeResize = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const entry = observeIntersection(cardRef.value!);\n * effect(() => console.log(entry.value.isIntersecting));\n * });\n */\nexport const observeIntersection = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([e]) => {\n if (e) entry.value = e;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const prefersReducedMotion = observeMedia('(prefers-reduced-motion: reduce)');\n * effect(() => console.log(prefersReducedMotion.value));\n * });\n */\nexport const observeMedia = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"craftit.js","names":[],"sources":["../src/core/utilities.ts","../src/core/runtime-lifecycle.ts","../src/core/host.ts","../src/core/internal.ts","../src/core/runtime-bindings.ts","../src/core/template-dom.ts","../src/core/template-bindings.ts","../src/core/template-compiler.ts","../src/core/template-html.ts","../src/core/template.ts","../src/core/component.ts","../src/labs/observers.ts"],"sourcesContent":["/**\n * Utilities — DOM helpers, ID generation, event handling, CSS compilation, and emit functions.\n *\n * This module consolidates:\n * - DOM and string utilities (setAttr, listen, createId, createFormIds, guard, escapeHtml, toKebab)\n * - ID generation and form field ID helpers\n * - Emitter for type-safe custom events\n * - CSS template tag and stylesheet caching\n * - Style loader for adoptedStyleSheets\n */\n\nimport { currentRuntime, fire } from './runtime-lifecycle';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// COMMON DOM & STRING UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n// ─── Counter singletons ───────────────────────────────────────────────────────\nlet _idCounter = 0;\n\n/** @internal — resets the ID counter. Used by _resetCounters in test/test.ts. */\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\n// ─── Shared DOM/string utilities ──────────────────────────────────────────────\n/** Iterate an iterable and call every function in it. */\nexport const runAll = (fns: Iterable<() => void>): void => {\n for (const fn of fns) fn();\n};\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n // Avoid inline event-handler attributes (onclick, onerror, ...) to reduce injection risk.\n if (/^on/i.test(name)) {\n el.removeAttribute(name);\n\n return;\n }\n\n if (val == null || val === false) {\n el.removeAttribute(name);\n } else if (val === true) {\n el.setAttribute(name, '');\n } else {\n el.setAttribute(name, String(val));\n }\n};\n\nexport const listen = (\n el: EventTarget,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\n/**\n * Creates a unique, stable ID string — suitable for `aria-labelledby`, `aria-describedby`,\n * and similar accessibility linkages. Call once per component instance (at setup time or inside `onMount`).\n */\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\n/**\n * Generates a stable set of ARIA-related IDs for a form control.\n * Snapshot `name` at call time — IDs are stable strings, not reactive.\n * `name` must be a non-empty string — callers that need a generated ID should\n * pass `createId(prefix)` as the name argument.\n *\n * @example\n * const { fieldId, labelId, helperId, errorId } = createFormIds('input', props.name.value);\n */\nexport const createFormIds = (prefix: string, name?: string | null) => {\n const normalizedName = name && name.trim() ? name : createId(prefix);\n const fieldId = `${prefix}-${normalizedName}`;\n\n return {\n errorId: `error-${fieldId}`,\n fieldId,\n helperId: `helper-${fieldId}`,\n labelId: `label-${fieldId}`,\n };\n};\n\n/**\n * Wraps an event handler with a guard condition. The handler is only invoked when `condition()` returns `true`.\n * Use for disabled checks, readonly guards, or any runtime condition.\n *\n * @example\n * const handleClick = guard(() => !props.disabled.value, (e) => toggle(e));\n */\nexport const guard =\n <E extends Event = Event>(condition: () => unknown, handler: (e: E) => void): ((e: E) => void) =>\n (e) => {\n if (condition()) handler(e);\n };\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst _ESC: Record<string, string> = { \"'\": '&#39;', '\"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;' };\n\n/**\n * Escapes HTML entity characters (`&`, `<`, `>`, `\"`, `'`) in a value.\n * **Safe only in HTML text/attribute contexts.** Do NOT use for CSS values,\n * `javascript:` URLs, event handler attributes, or inline `<script>` content.\n */\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => _ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EMIT FUNCTION (TYPE-SAFE CUSTOM EVENTS)\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype NoDetail = void | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\nexport type EmitFn<T extends Record<string, unknown>> = {\n <K extends KeysWithoutDetail<T>>(event: K): void;\n <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): void;\n};\n\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentRuntime().el;\n\n return ((event: keyof T, ...rest: unknown[]) => {\n fire.custom(el, String(event), rest.length > 0 ? { detail: rest[0] } : undefined);\n }) as EmitFn<T>;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS & STYLESHEET UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type CSSResult = {\n content: string;\n toString(): string;\n};\n\nconst cssResultToString = function (this: CSSResult): string {\n return this.content;\n};\n\nexport const css = (strings: TemplateStringsArray, ...values: unknown[]): CSSResult => {\n let content = '';\n\n for (let i = 0; i < strings.length; i++) {\n content += strings[i];\n\n if (i < values.length) {\n const v = values[i];\n\n content += v && typeof v === 'object' && 'content' in v ? (v as CSSResult).content : (v ?? '');\n }\n }\n\n return { content: content.trim(), toString: cssResultToString };\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\n\nexport const loadStylesheet = (style: string | CSSStyleSheet | CSSResult): CSSStyleSheet => {\n if (style instanceof CSSStyleSheet) return style;\n\n const cssText = typeof style === 'string' ? style : style.content;\n const cached = stylesheetStringCache.get(cssText);\n\n if (cached) return cached;\n\n const sheet = new CSSStyleSheet();\n\n try {\n sheet.replaceSync(cssText);\n stylesheetStringCache.set(cssText, sheet);\n } catch (err) {\n console.error(`[craftit:E2] style replace failed`, err);\n }\n\n return sheet;\n};\n","import {\n effect as _effect,\n onCleanup as _onCleanup,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n untrack,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { type CSSResult } from './utilities';\n\n// ─── Component runtime ────────────────────────────────────────────────────────\nexport type ComponentRuntime = {\n cleanups: CleanupFn[];\n el: HTMLElement;\n errorHandlers: ((err: unknown) => void)[];\n onMount: (() => CleanupFn | undefined | void)[];\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\n\nexport const currentRuntime = (): ComponentRuntime => {\n const rt = runtimeStack[runtimeStack.length - 1];\n\n if (!rt) throw new Error('[craftit:E1] lifecycle outside setup');\n\n return rt;\n};\n\n// ─── Lifecycle hooks ──────────────────────────────────────────────────────────\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\n\n/**\n * Registers a cleanup function.\n * - Inside a component setup or `onMount` callback: runs when the component\n * unmounts. Prefer {@link onCleanup} for explicit lifecycle cleanup.\n * - Outside a component context (e.g. inside a plain `effect()`): delegates to\n * stateit's `onCleanup`, which runs before each effect re-run.\n */\nexport const onCleanup = (fn: CleanupFn): void => {\n if (runtimeStack.length > 0) {\n currentRuntime().cleanups.push(fn);\n } else {\n _onCleanup(fn);\n }\n};\n\n/**\n * Registers a scoped error handler for this component.\n * Called when an unhandled error is thrown during setup, `onMount` callbacks,\n * or rendering. If no handler is registered, errors are logged to the console.\n *\n * @example\n * defineComponent({\n * setup() {\n * onError((err) => console.error('Component error:', err));\n * // ... rest of setup\n * return html``;\n * },\n * tag: 'my-component',\n * });\n */\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\n\n/** @internal — Cleanup only when inside a component context. */\nexport const autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\n/**\n * Creates a reactive effect that re-runs whenever its signal dependencies change.\n * When called inside a component setup function or `onMount` callback, the effect is\n * automatically cleaned up when the component unmounts — no manual `onCleanup` needed.\n * Outside a component context, behaves identically to stateit's `effect`.\n *\n * @example\n * // Inside setup — auto-cleaned on unmount:\n * effect(() => { document.title = props.title.value; });\n *\n * // Inside onMount — also auto-cleaned:\n * onMount(() => { effect(() => syncExternal(data.value)); });\n */\nexport const effect = (fn: EffectCallback, options?: EffectOptions): Subscription => {\n const dispose = _effect(fn, options);\n\n autoCleanup(dispose);\n\n return dispose;\n};\n\n// ─── Watch ────────────────────────────────────────────────────────────────────\n/**\n * Watch a signal or array of signals for changes and call a callback.\n * Auto-cleaned on unmount when called during setup.\n *\n * Single signal: callback receives (next, prev) values.\n * Multiple signals: callback receives no args, fires when any signal changes.\n */\nexport function watch<T>(\n source: ReadonlySignal<T>,\n cb: (value: T, prev: T) => void,\n options?: WatchOptions<T>,\n): Subscription;\nexport function watch(\n sources: ReadonlyArray<ReadonlySignal<unknown>>,\n cb: () => void,\n options?: WatchOptions<unknown>,\n): Subscription;\nexport function watch(\n source: ReadonlySignal<unknown> | ReadonlyArray<ReadonlySignal<unknown>>,\n cb: ((value: unknown, prev: unknown) => void) | (() => void),\n options?: WatchOptions<unknown>,\n): Subscription {\n if (Array.isArray(source)) {\n const opts = options;\n let initialized = false;\n let pendingDispose = false;\n const dispose = _effect(() => {\n for (const s of source) void s.value; // register all listed deps\n\n if (!initialized) {\n initialized = true;\n\n if (opts?.immediate) {\n untrack(cb as () => void);\n\n if (opts.once) {\n pendingDispose = true;\n\n return;\n }\n }\n } else {\n untrack(cb as () => void);\n\n if (opts?.once) dispose();\n }\n });\n\n autoCleanup(dispose);\n\n if (pendingDispose) dispose();\n\n return dispose;\n }\n\n const stop = _watch(source as ReadonlySignal<unknown>, cb as (value: unknown, prev: unknown) => void, options);\n\n autoCleanup(stop);\n\n return stop;\n}\n\n// ─── Event helpers ────────────────────────────────────────────────────────────\n/**\n * Register an event listener with automatic cleanup on unmount.\n * Use inside onMount() for auto-cleanup, or handle() return value manually.\n *\n * @example\n * onMount(() => {\n * handle(host, 'click', onClick);\n * handle(window, 'resize', onResize);\n * // auto-cleanup\n * });\n */\nexport function handle<K extends keyof HTMLElementEventMap>(\n target: EventTarget | null | undefined,\n event: K,\n listener: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void;\nexport function handle(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void {\n if (!target) return;\n\n target.addEventListener(event, listener, options);\n onCleanup(() => target.removeEventListener(event, listener, options));\n}\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\n basic(target: EventTarget, type: string, options?: EventInit): boolean;\n custom<Detail = unknown>(target: EventTarget, type: string, options?: CustomEventInit<Detail>): boolean;\n event(target: EventTarget, event: Event): boolean;\n focus(target: EventTarget, type: string, options?: FocusEventInit): boolean;\n keyboard(target: EventTarget, type: string, options?: KeyboardEventInit): boolean;\n mouse(target: EventTarget, type: string, options?: MouseEventInit): boolean;\n touch(target: EventTarget, type: string, options?: TouchEventInit): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS: FireDefaults = { bubbles: true, cancelable: true, composed: true };\n\n/**\n * Dispatch DOM events explicitly without guessing constructors from the event name.\n *\n * @example\n * fire.mouse(el, 'click');\n * fire.keyboard(el, 'keydown', { key: 'Enter' });\n * fire.custom(el, 'change', { detail: { value: 42 } });\n * fire.event(el, new PointerEvent('pointerdown'));\n */\nexport const fire: FireApi = {\n basic(target, type, options = {}) {\n return target.dispatchEvent(new Event(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n custom<Detail = unknown>(target: EventTarget, type: string, options: CustomEventInit<Detail> = {}) {\n return target.dispatchEvent(new CustomEvent<Detail>(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n event(target, event) {\n return target.dispatchEvent(event);\n },\n focus(target, type, options = {}) {\n return target.dispatchEvent(new FocusEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n keyboard(target, type, options = {}) {\n return target.dispatchEvent(new KeyboardEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n mouse(target, type, options = {}) {\n return target.dispatchEvent(new MouseEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n touch(target, type, options = {}) {\n if (typeof TouchEvent !== 'undefined') {\n return target.dispatchEvent(new TouchEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n }\n\n return target.dispatchEvent(new CustomEvent(type, { ...DEFAULT_FIRE_OPTIONS, ...options }));\n },\n};\n\n// ─── ARIA helpers ────────────────────────────────────────────────────────────\ntype AriaAttrValue =\n | (() => string | boolean | number | null | undefined)\n | string\n | boolean\n | number\n | null\n | undefined;\n\n/**\n * Reactively set ARIA attributes on an element.\n *\n * - `aria(attrs)` — targets the component host (call during setup)\n * - `aria(target, attrs)` — targets any element; returns a cleanup function\n *\n * Pass getter functions for reactive values. Plain values are set once.\n * `null`, `undefined`, or `false` remove the attribute.\n *\n * @example\n * // Host (during setup):\n * aria({ role: 'checkbox', checked: () => checked.value });\n *\n * // Inner element (inside onMount):\n * onMount(() => {\n * return aria(inputEl, { invalid: () => !!error.value });\n * });\n */\nexport function aria(attrs: Record<string, AriaAttrValue>): void;\nexport function aria(target: Element, attrs: Record<string, AriaAttrValue>): CleanupFn;\nexport function aria(\n targetOrAttrs: Element | Record<string, AriaAttrValue>,\n maybeAttrs?: Record<string, AriaAttrValue>,\n): CleanupFn | undefined {\n const target = maybeAttrs !== undefined ? (targetOrAttrs as Element) : currentRuntime().el;\n const attrs = maybeAttrs !== undefined ? maybeAttrs : (targetOrAttrs as Record<string, AriaAttrValue>);\n\n const applyAttr = (name: string, val: AriaAttrValue) => {\n const attrName = `aria-${name}`;\n const value = typeof val === 'function' ? (val as () => AriaAttrValue)() : val;\n\n if (value === null || value === undefined || value === false) {\n target.removeAttribute(attrName);\n } else {\n target.setAttribute(attrName, String(value));\n }\n };\n\n // Each key gets its own effect so changes to one attr don't re-apply all others.\n const stops = Object.entries(attrs).map(([name, val]) => effect(() => applyAttr(name, val)));\n\n if (maybeAttrs !== undefined) {\n return () => {\n for (const stop of stops) stop();\n };\n }\n}\n","/**\n * Host utilities — component context injection, slot observation, and attribute/class reflection.\n *\n * - Context API (provide, inject, createContext, syncContextProps)\n * - Slot observation and detection (Slots type, createSlots, onSlotChange)\n * - Host element binding (reflect) for attributes, events, and classes\n */\n\nimport { type ReadonlySignal, type Signal, signal } from '@vielzeug/stateit';\n\n// Use the wrapped effect from runtime-lifecycle so reactive bindings are\n// automatically cleaned up on unmount — raw stateit effect has no lifecycle awareness.\nimport { currentRuntime, effect, handle, onCleanup, onMount } from './runtime-lifecycle';\nimport { setAttr } from './utilities';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONTEXT API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst contextRegistry = new WeakMap<HTMLElement, Map<InjectionKey<unknown> | string | symbol, unknown>>();\n\nexport type InjectionKey<T> = symbol & {\n readonly __craftit_injection_key?: T;\n};\n\nexport const provide = <T>(key: InjectionKey<T> | string | symbol, value: T): void => {\n const el = currentRuntime().el;\n\n if (!contextRegistry.has(el)) contextRegistry.set(el, new Map());\n\n contextRegistry.get(el)!.set(key, value);\n};\n\nexport function inject<T>(key: InjectionKey<T> | string | symbol): T | undefined;\nexport function inject<T>(key: InjectionKey<T> | string | symbol, fallback: T): T;\nexport function inject<T>(key: InjectionKey<T> | string | symbol, ...rest: [T?]): T | undefined {\n let node: Node | null = currentRuntime().el;\n\n while (node) {\n if (node instanceof HTMLElement) {\n const v = contextRegistry.get(node)?.get(key);\n\n if (v !== undefined) return v as T;\n }\n\n const root = node.getRootNode() as Node;\n\n node = (node as HTMLElement).parentElement ?? (root instanceof ShadowRoot ? root.host : null);\n }\n\n return rest.length > 0 ? rest[0] : undefined;\n}\n\nexport function createContext<T>(description?: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>;\n}\n\n/**\n * Reactively inherits prop values from a context object provided by an ancestor component.\n * For each key, when the context value is not `undefined`, it is written into the matching prop signal.\n * The effect is automatically cleaned up when the component unmounts.\n *\n * Deferred to `onMount` so context values win over HTML attribute values set on the child.\n *\n * @example\n * syncContextProps(inject(BUTTON_GROUP_CTX), props, ['color', 'size', 'variant']);\n */\nexport const syncContextProps = <\n K extends string,\n Ctx extends Partial<Record<K, ReadonlySignal<unknown>>>,\n Props extends Record<K, Signal<unknown>>,\n>(\n ctx: Ctx | undefined,\n props: Props,\n keys: K[],\n): void => {\n if (!ctx) return;\n\n onMount(() => {\n effect(() => {\n for (const k of keys) {\n const v = ctx[k]?.value;\n\n if (v !== undefined) props[k].value = v;\n }\n });\n });\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SLOTS API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst missingSlotWarnings = new Set<string>();\n\nconst warnMissingSlot = (el: HTMLElement, slotName: string, source: 'onSlotChange()' | 'slots.has()'): void => {\n const key = `${source}:${el.localName}:${slotName || 'default'}`;\n\n if (missingSlotWarnings.has(key)) return;\n\n missingSlotWarnings.add(key);\n console.warn(\n `[craftit:E10] ${source} could not find a matching <slot${slotName ? ` name=\"${slotName}\"` : ''}> in <${el.localName}>. Render the slot before using ${source}.`,\n );\n};\n\nexport type Slots<T extends Record<string, unknown> = Record<string, unknown>> = {\n /**\n * Returns a `ReadonlySignal<boolean>` that is `true` when the slot has assigned content.\n * Reactive — use the signal directly in templates, computed(), or effects.\n * @example const hasIcon = slots.has('icon'); // ReadonlySignal<boolean>\n */\n has(name: keyof T): ReadonlySignal<boolean>;\n};\n\n/**\n * Observes a slot and calls `callback` with assigned elements whenever they change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * onSlotChange('icon', (nodes) => setHasIcon(nodes.length > 0));\n * });\n */\nexport const onSlotChange = (slotName: string, callback: (elements: Element[]) => void): void => {\n const el = currentRuntime().el;\n const name = slotName === 'default' ? '' : slotName;\n const selector = name ? `slot[name=\"${name}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n\n if (!slot) {\n warnMissingSlot(el, name, 'onSlotChange()');\n\n return;\n }\n\n const handler = () => callback(slot.assignedElements({ flatten: true }));\n\n handler();\n slot.addEventListener('slotchange', handler);\n onCleanup(() => slot.removeEventListener('slotchange', handler));\n};\n\nexport const createSlots = <T extends Record<string, unknown> = Record<string, unknown>>(): Slots<T> => {\n const el = currentRuntime().el;\n const sigs = new Map<string, Signal<boolean>>();\n\n const get = (slotName: string): Signal<boolean> => {\n if (sigs.has(slotName)) return sigs.get(slotName)!;\n\n const s = signal(false);\n\n sigs.set(slotName, s);\n\n onMount(() => {\n const selector = slotName ? `slot[name=\"${slotName}\"]` : 'slot:not([name])';\n const slot = el.shadowRoot?.querySelector<HTMLSlotElement>(selector);\n\n if (!slot) {\n warnMissingSlot(el, slotName, 'slots.has()');\n\n return;\n }\n\n const update = () => {\n s.value = slot.assignedNodes().length > 0;\n };\n\n update();\n slot.addEventListener('slotchange', update);\n\n return () => slot.removeEventListener('slotchange', update);\n });\n\n return s;\n };\n\n return {\n has(name: keyof T): ReadonlySignal<boolean> {\n return get(name === 'default' ? '' : String(name));\n },\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REFLECT API (HOST ATTRIBUTE/EVENT/CLASS BINDING)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Describes a reactive or static host binding (attribute, event, class).\n */\nexport type HostBindingValue =\n | (() => string | number | boolean | null | undefined)\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for `reflect()`.\n */\nexport type ReflectConfig = {\n [key: string]: HostBindingValue | ((e: Event) => void);\n classMap?: () => Record<string, boolean>;\n};\n\n/**\n * Reflect reactive attributes, events, and classes to a host element.\n * Must be called within a component setup context.\n *\n * - `on*` keys map to event listeners: `onClick` → `'click'`, `onValueChanged` → `'valueChanged'`\n * - `classMap` maps to a reactive class object\n * - all other keys map to attributes (static or reactive getter)\n *\n * @example\n * setup({ reflect }) {\n * reflect({\n * role: 'checkbox',\n * tabindex: () => props.disabled.value ? undefined : 0,\n * checked: () => props.checked.value,\n * classMap: () => ({ checked: props.checked.value }),\n * onClick: handleToggle,\n * });\n * }\n */\nexport function reflect(host: HTMLElement, config: ReflectConfig): void {\n for (const [key, value] of Object.entries(config)) {\n if (key === 'classMap') {\n applyClassMap(host, value as () => Record<string, boolean>);\n } else if (key.startsWith('on') && key.length > 2 && typeof value === 'function') {\n // onClick → 'click', onValueChanged → 'valueChanged', onKeydown → 'keydown'\n const raw = key.slice(2);\n\n handle(host, raw[0].toLowerCase() + raw.slice(1), value as (e: Event) => void);\n } else {\n applyAttribute(host, key, value as HostBindingValue);\n }\n }\n}\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): void {\n if (typeof value === 'function') {\n effect(() => setAttr(host, name, (value as () => HostBindingValue)()));\n } else {\n setAttr(host, name, value);\n }\n}\n\nfunction applyClassMap(host: HTMLElement, getter: () => Record<string, boolean>): void {\n let prev = new Set<string>();\n\n effect(() => {\n const next = new Set(\n Object.entries(getter())\n .filter(([, active]) => active)\n .map(([cls]) => cls),\n );\n\n for (const cls of prev) if (!next.has(cls)) host.classList.remove(cls);\n for (const cls of next) if (!prev.has(cls)) host.classList.add(cls);\n\n prev = next;\n });\n}\n","/**\n * @internal — Binding type system and engine internals.\n *\n * These types define the contract between the template compiler and binding engine.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Public-facing types (HTMLResult, Directive, Ref, RefCallback, Refs) are\n * re-exported from the main entry point.\n */\n\nimport { type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nconst HTML_RESULT_BRAND: unique symbol = Symbol('craftit.htmlResultBrand');\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Ref<T extends Element> {\n value: T | null;\n}\n\nexport function ref<T extends Element>(): Ref<T> {\n return { value: null };\n}\n\nexport type Refs<T extends Element> = T[];\n\nexport function refs<T extends Element>(): Refs<T> {\n return [];\n}\n\nexport type RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// HTML RESULT\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __html: string;\n toString(): string;\n}\n\n/** @internal — construct an HTMLResult from a pre-built html string and bindings. */\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n const result = {\n __bindings: bindings,\n __html: html,\n toString() {\n return html;\n },\n };\n\n Object.defineProperty(result, HTML_RESULT_BRAND, {\n configurable: false,\n enumerable: false,\n value: true,\n writable: false,\n });\n\n return result as HTMLResult;\n}\n\n/** @internal — strict HTMLResult runtime type guard. */\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && !!value && (value as Record<symbol, unknown>)[HTML_RESULT_BRAND] === true;\n\n/** @internal — extract html and bindings from a string or HTMLResult. */\nexport function extractResult(v: string | HTMLResult): { bindings: Binding[]; html: string } {\n return typeof v === 'string' ? { bindings: [], html: v } : { bindings: v.__bindings, html: v.__html };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DIRECTIVES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface DirectiveContext {\n /** The cleanup registration function for the component. */\n registerCleanup: (fn: () => void) => void;\n}\n\nexport interface Directive {\n /** Invoked when the element is mounted in the DOM. */\n mount?(el: HTMLElement, context: DirectiveContext): void;\n /** Invoked by the template engine to render content (interpolation directives). */\n render?(): HTMLResult | string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// BINDING TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type PropBinding = {\n /** Optional writable source used for native two-way bridge (.value/.checked). */\n model?: Signal<unknown>;\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'prop';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n modifiers?: {\n capture?: boolean;\n once?: boolean;\n passive?: boolean;\n prevent?: boolean;\n self?: boolean;\n stop?: boolean;\n };\n name: string;\n type: 'event';\n uid: string;\n};\n\nexport type RefBinding = {\n ref: Ref<Element> | Refs<Element> | RefCallback<Element>;\n type: 'ref';\n uid: string;\n};\n\nexport type CallbackBinding = {\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => void;\n type: 'callback';\n uid: string;\n};\n\nexport type HtmlBinding = {\n keyed?: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n type: 'html';\n uid: string;\n};\n\nexport type Binding =\n | TextBinding\n | AttrBinding\n | PropBinding\n | EventBinding\n | RefBinding\n | CallbackBinding\n | HtmlBinding;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL MARKERS & CONSTANTS\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — opaque marker for each() reactive results. */\nexport const EACH_SIGNAL: unique symbol = Symbol('craftit.eachSignal');\n\n/** @internal — binding element identifier attribute. */\nexport const CF_ID_ATTR = 'u';\n","import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './utilities';\n\nexport type RegisterPropertyCleanup = (fn: () => void) => void;\n\nexport const toReactiveBindingSource = (value: unknown): ReadonlySignal<unknown> | undefined => {\n if (isSignal(value)) return value as ReadonlySignal<unknown>;\n\n if (typeof value === 'function') return computed(value as () => unknown);\n\n return undefined;\n};\n\nexport const hasWritableValueSetter = (value: unknown): value is Signal<unknown> => {\n if (!isSignal(value)) return false;\n\n let proto: object | null = Object.getPrototypeOf(value);\n\n while (proto) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, 'value');\n\n if (descriptor) return typeof descriptor.set === 'function';\n\n proto = Object.getPrototypeOf(proto);\n }\n\n return false;\n};\n\nconst updateModelValue = (model: Signal<unknown>, next: unknown): void => {\n if (Object.is(model.value, next)) return;\n\n try {\n model.value = next;\n } catch {\n // Readonly signal/computed source: keep one-way behavior.\n }\n};\n\nexport const bindPropertyModel = (\n el: HTMLElement,\n name: string,\n model: Signal<unknown> | undefined,\n registerCleanup: RegisterPropertyCleanup,\n): void => {\n if (!model) return;\n\n if (name === 'value') {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n const eventName = el instanceof HTMLSelectElement ? 'change' : 'input';\n\n registerCleanup(\n listen(el, eventName, () => {\n updateModelValue(model, el.value);\n }),\n );\n }\n\n return;\n }\n\n if (name === 'checked' && el instanceof HTMLInputElement) {\n registerCleanup(\n listen(el, 'change', () => {\n updateModelValue(model, el.checked);\n }),\n );\n }\n};\n","import { CF_ID_ATTR } from './internal';\n\nexport type BindingTargets = {\n comments: Map<string, Comment>;\n elements: Map<string, HTMLElement>;\n};\n\nconst templateCache = new Map<string, HTMLTemplateElement>();\nconst TEMPLATE_CACHE_MAX = 1000;\n\nconst getCachedTemplate = (html: string): HTMLTemplateElement => {\n let tpl = templateCache.get(html);\n\n if (!tpl) {\n tpl = document.createElement('template');\n tpl.innerHTML = html;\n\n if (templateCache.size >= TEMPLATE_CACHE_MAX) {\n const oldestKey = templateCache.keys().next().value as string | undefined;\n\n if (oldestKey !== undefined) templateCache.delete(oldestKey);\n }\n\n templateCache.set(html, tpl);\n }\n\n return tpl;\n};\n\nexport const parseHTML = (html: string): DocumentFragment =>\n getCachedTemplate(html).content.cloneNode(true) as DocumentFragment;\n\nconst collectBindingTarget = (node: Node, targets: BindingTargets): void => {\n if (node.nodeType === Node.COMMENT_NODE) {\n const marker = (node as Comment).nodeValue;\n\n if (marker) targets.comments.set(marker, node as Comment);\n\n return;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) return;\n\n const id = (node as Element).getAttribute(CF_ID_ATTR);\n\n if (id) targets.elements.set(id, node as HTMLElement);\n};\n\nexport const indexBindings = (root: Node): BindingTargets => {\n const targets: BindingTargets = { comments: new Map(), elements: new Map() };\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT);\n\n collectBindingTarget(root, targets);\n\n while (walker.nextNode()) collectBindingTarget(walker.currentNode, targets);\n\n return targets;\n};\n\nexport const indexBindingsInNodes = (nodes: Iterable<Node>): BindingTargets => {\n const targets: BindingTargets = { comments: new Map(), elements: new Map() };\n\n for (const node of nodes) {\n const walker = document.createTreeWalker(node, NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT);\n\n collectBindingTarget(node, targets);\n\n while (walker.nextNode()) collectBindingTarget(walker.currentNode, targets);\n }\n\n return targets;\n};\nexport const findCommentMarker = (root: Node, marker: string): Comment | null => {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT);\n\n while (walker.nextNode()) {\n const comment = walker.currentNode as Comment;\n\n if (comment.nodeValue === marker) return comment;\n }\n\n return null;\n};\n\nexport const isHtmlBindingMarker = (node: Node): boolean =>\n node.nodeType === Node.COMMENT_NODE &&\n ((node as Comment).data === 'html-binding' || (node as Comment).data.startsWith('__h_'));\n\nexport const clearAfterMarker = (marker: Comment): void => {\n let next = marker.nextSibling;\n\n while (next) {\n if (isHtmlBindingMarker(next)) break;\n\n const toRemove = next;\n\n next = next.nextSibling;\n toRemove.remove();\n }\n};\n\nexport const createNodes = (htmlString: string): Node[] => Array.from(parseHTML(htmlString).childNodes);\n\nexport const insertNodes = (marker: Comment, nodes: Node[], before: Node | null): void => {\n if (marker.parentNode) {\n for (const node of nodes) marker.parentNode.insertBefore(node, before);\n }\n};\n","import { type CleanupFn, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { propRegistry } from './component';\nimport {\n type AttrBinding,\n type EventBinding,\n type PropBinding,\n type RefBinding,\n type Binding,\n type HtmlBinding,\n CF_ID_ATTR,\n} from './internal';\nimport { bindPropertyModel } from './runtime-bindings';\nimport { effect } from './runtime-lifecycle';\nimport { listen, setAttr } from './utilities';\n\nexport type RegisterCleanup = (fn: CleanupFn) => void;\n\n// ─── Helper utilities ────────────────────────────────────────────────────────\n\n/** Check if a value is a structured type (object or array), not a primitive. */\nconst isStructuredValue = (value: unknown): value is object =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\n/**\n * Register a reactive effect that updates when a signal changes.\n * Common pattern: `if (signal) registerCleanup(effect(() => update(signal.value)))`\n */\nconst signalEffect = (\n signal: ReadonlySignal<unknown>,\n update: (v: unknown) => void,\n registerCleanup: RegisterCleanup,\n): void => {\n registerCleanup(effect(() => update(signal.value)));\n};\n\n// ─── Individual binding application functions ─────────────────────────────────\n\n/**\n * Apply an attribute binding to an element.\n * Handles bool/attr modes, prop pre-upgrade, and reactive updates.\n */\nexport const applyAttrBinding = (el: HTMLElement, binding: AttrBinding, registerCleanup: RegisterCleanup) => {\n const update = (value: unknown) => {\n const meta = propRegistry.get(el)?.get(binding.name);\n\n // Preserve structured values as pre-upgrade properties\n if (!meta && isStructuredValue(value)) {\n (el as any)[binding.name] = value;\n\n return;\n }\n\n if (!meta || meta.reflect) {\n if (binding.mode === 'bool') {\n el.toggleAttribute(binding.name, Boolean(value));\n } else {\n setAttr(el, binding.name, value);\n }\n }\n\n if (!meta) return;\n\n const parsedValue = isStructuredValue(value)\n ? value\n : meta.parse(\n binding.mode === 'bool' ? (value ? '' : null) : value == null || value === false ? null : String(value),\n );\n\n if (!Object.is(meta.signal.peek(), parsedValue)) {\n meta.signal.value = parsedValue as never;\n }\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n};\n\n/**\n * Apply a property binding to an element.\n * Handles reactive updates and two-way binding via property models.\n */\nexport const applyPropBinding = (el: HTMLElement, binding: PropBinding, registerCleanup: RegisterCleanup) => {\n const update = (value: unknown) => {\n (el as any)[binding.name] = value;\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n\n bindPropertyModel(el, binding.name, binding.model, registerCleanup);\n};\n\n/**\n * Apply an event listener binding to an element.\n * Handles event modifiers (stop, prevent, self, capture, once, passive).\n */\nexport const applyEventBinding = (el: HTMLElement, binding: EventBinding, registerCleanup: RegisterCleanup) => {\n const { modifiers } = binding;\n const listenerOptions = modifiers\n ? { capture: !!modifiers.capture, once: !!modifiers.once, passive: !!modifiers.passive }\n : undefined;\n\n const wrappedHandler = (event: Event) => {\n if (modifiers?.self && event.target !== event.currentTarget) return;\n\n if (modifiers?.stop) event.stopPropagation();\n\n if (modifiers?.prevent && !modifiers?.passive) event.preventDefault();\n\n binding.handler(event);\n };\n\n registerCleanup(listen(el, binding.name, wrappedHandler, listenerOptions));\n};\n\n/**\n * Apply a ref binding to an element.\n * Supports function refs, ref arrays, and signal refs with cleanup.\n */\nexport const applyRefBinding = (el: HTMLElement, binding: RefBinding, registerCleanup: RegisterCleanup) => {\n const { ref } = binding;\n\n if (typeof ref === 'function') {\n ref(el as never);\n registerCleanup(() => ref(null));\n\n return;\n }\n\n if (Array.isArray(ref)) {\n ref.push(el);\n registerCleanup(() => {\n const idx = ref.indexOf(el);\n\n if (idx !== -1) ref.splice(idx, 1);\n });\n\n return;\n }\n\n ref.value = el as never;\n registerCleanup(() => {\n ref.value = null;\n });\n};\n\n// ─── Binding orchestration ────────────────────────────────────────────────────\n\nimport { type BindingTargets } from './template-dom';\n\n/**\n * Apply all bindings to target elements.\n *\n * - Text bindings: Create text nodes, register reactive effects\n * - HTML bindings: Notify caller for keyed reconciliation\n * - Element bindings: Group by ID, apply attr/prop/event/ref in one pass per element\n *\n * @param bindings Array of compiled bindings to apply\n * @param registerCleanup Function to register cleanup callbacks\n * @param targets Indexed comment/element targets from DOM\n * @param opts Optional callbacks (e.g., onHtml for keyed reconciliation)\n */\nexport const applyBindingsWithTargets = (\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n targets: BindingTargets,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n const bindingMap = new Map<string, Binding[]>();\n\n for (const b of bindings) {\n const id = b.uid;\n\n if (b.type === 'text') {\n const found = targets.comments.get(id);\n\n if (found) {\n const textNode = document.createTextNode('');\n\n found.replaceWith(textNode);\n targets.comments.delete(id);\n signalEffect(\n b.signal,\n (v) => {\n textNode.textContent = String(v);\n },\n registerCleanup,\n );\n }\n } else if (b.type === 'html') {\n opts?.onHtml?.(b);\n } else {\n if (!bindingMap.has(id)) bindingMap.set(id, []);\n\n bindingMap.get(id)!.push(b);\n }\n }\n\n for (const [id, elBindings] of bindingMap) {\n const el = targets.elements.get(id);\n\n if (!el) continue;\n\n el.removeAttribute(CF_ID_ATTR);\n targets.elements.delete(id);\n\n for (const b of elBindings) {\n switch (b.type) {\n case 'attr':\n applyAttrBinding(el, b, registerCleanup);\n break;\n case 'callback':\n b.apply(el, registerCleanup);\n break;\n case 'event':\n applyEventBinding(el, b, registerCleanup);\n break;\n case 'prop':\n applyPropBinding(el, b, registerCleanup);\n break;\n case 'ref':\n applyRefBinding(el, b, registerCleanup);\n break;\n }\n }\n }\n};\n\n// ─── Binding factories ────────────────────────────────────────────────────────\n\nimport { type Signal } from '@vielzeug/stateit';\n\nimport { hasWritableValueSetter, toReactiveBindingSource } from './runtime-bindings';\n\n/**\n * Create an attribute binding descriptor.\n * Called during template compilation for each attribute interpolation.\n *\n * @param mode 'bool' for boolean attributes (presence = true), 'attr' for string values\n * @param name Attribute name (e.g., 'disabled', 'aria-label')\n * @param uid Unique binding ID\n * @param value Attribute value (signal or static)\n */\nexport const createAttrBinding = (mode: 'bool' | 'attr', name: string, uid: string, value: unknown): AttrBinding => {\n const source = toReactiveBindingSource(value);\n\n return source ? { mode, name, signal: source, type: 'attr', uid } : { mode, name, type: 'attr', uid, value };\n};\n\n/**\n * Create a property binding descriptor.\n * Called during template compilation for each `.property` interpolation.\n *\n * @param name Property name (e.g., 'value', 'checked')\n * @param uid Unique binding ID\n * @param value Property value (signal, function, or static)\n */\nexport const createPropBinding = (name: string, uid: string, value: unknown): PropBinding => {\n const source = toReactiveBindingSource(value);\n\n if (source) {\n return {\n model: hasWritableValueSetter(value) ? (value as Signal<unknown>) : undefined,\n name,\n signal: source,\n type: 'prop',\n uid,\n };\n }\n\n return { name, type: 'prop', uid, value };\n};\n","import { computed, isSignal, signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport {\n CF_ID_ATTR,\n EACH_SIGNAL,\n htmlResult,\n isHtmlResult,\n type Binding,\n type Directive,\n type EventBinding,\n type HTMLResult,\n type Ref,\n type RefCallback,\n} from './internal';\nimport { createAttrBinding, createPropBinding } from './template-bindings';\nimport { escapeHtml } from './utilities';\n\nconst ATTR_ID_RE = new RegExp(`${CF_ID_ATTR}=\"([^\"]+)\"`, 'g');\n\nconst normalizeCompiledHtml = (html: string): string => html.replace(/>\\s+</g, '><').trim();\n\n// Slot patterns applied in priority order; first match wins\nconst SLOT_PATTERNS = [\n { kind: 'event' as const, regex: /\\s+@([a-zA-Z_][-a-zA-Z0-9_.]*)\\s*=\\s*[\"']?$/ },\n { kind: 'ref' as const, regex: /\\s+ref\\s*=\\s*[\"']?$/ },\n { kind: 'specialAttr' as const, regex: /\\s+([:?])([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n { kind: 'prop' as const, regex: /\\.([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n { kind: 'plainAttr' as const, regex: /\\s+([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n] as const;\n\ntype CompiledTemplateSlot = {\n kind: (typeof SLOT_PATTERNS)[number]['kind'] | 'node';\n // For 'specialAttr' slots\n mode?: 'attr' | 'bool';\n modifiers?: EventBinding['modifiers'];\n // For 'event' slots\n name?: string;\n prefix: string;\n raw: string;\n};\n\ntype CompiledTemplatePlan = {\n slots: CompiledTemplateSlot[];\n tail: string;\n};\n\nconst templatePlanCache = new WeakMap<TemplateStringsArray, CompiledTemplatePlan>();\n\n/**\n * Parses event descriptor string into name and modifiers.\n * @example\n * parseEventDescriptor('click.stop.prevent') → { name: 'click', modifiers: { stop, prevent } }\n */\nconst parseEventDescriptor = (descriptor: string): { modifiers: EventBinding['modifiers']; name: string } => {\n const [name, ...rawModifiers] = descriptor.split('.');\n const modifiers: NonNullable<EventBinding['modifiers']> = {};\n\n for (const modifier of rawModifiers) {\n if (modifier === 'capture') modifiers.capture = true;\n else if (modifier === 'once') modifiers.once = true;\n else if (modifier === 'passive') modifiers.passive = true;\n else if (modifier === 'prevent') modifiers.prevent = true;\n else if (modifier === 'self') modifiers.self = true;\n else if (modifier === 'stop') modifiers.stop = true;\n }\n\n return { modifiers: Object.keys(modifiers).length ? modifiers : undefined, name };\n};\n\nconst buildTemplatePlan = (strings: TemplateStringsArray): CompiledTemplatePlan => {\n const slots: CompiledTemplateSlot[] = [];\n\n for (let i = 0; i < strings.length - 1; i++) {\n const str = strings[i];\n let matched = false;\n\n for (const pattern of SLOT_PATTERNS) {\n const m = pattern.regex.exec(str);\n\n if (!m) continue;\n\n const prefix = str.slice(0, -m[0].length);\n\n matched = true;\n\n if (pattern.kind === 'event') {\n const parsed = parseEventDescriptor(m[1]);\n\n slots.push({ kind: 'event', modifiers: parsed.modifiers, name: parsed.name, prefix, raw: str });\n } else if (pattern.kind === 'ref') {\n slots.push({ kind: 'ref', prefix, raw: str });\n } else if (pattern.kind === 'specialAttr') {\n slots.push({ kind: 'specialAttr', mode: m[1] === '?' ? 'bool' : 'attr', name: m[2], prefix, raw: str });\n } else if (pattern.kind === 'prop') {\n slots.push({ kind: 'prop', name: m[1], prefix, raw: str });\n } else if (pattern.kind === 'plainAttr') {\n slots.push({ kind: 'plainAttr', name: m[1], prefix, raw: str });\n }\n\n break; // first match wins\n }\n\n if (!matched) {\n slots.push({ kind: 'node', prefix: str, raw: str });\n }\n }\n\n return { slots, tail: strings[strings.length - 1] ?? '' };\n};\n\nconst getCompiledTemplatePlan = (strings: TemplateStringsArray): CompiledTemplatePlan => {\n let plan = templatePlanCache.get(strings);\n\n if (!plan) {\n plan = buildTemplatePlan(strings);\n templatePlanCache.set(strings, plan);\n }\n\n return plan;\n};\n\nconst createMarkerIdFactory = (): (() => string) => {\n let markerIndex = 0;\n\n return () => String(markerIndex++);\n};\n\nconst rekeyHtmlResult = (\n result: HTMLResult,\n getNextId: () => string,\n): {\n bindings: Binding[];\n html: string;\n} => {\n const idMap = new Map<string, string>();\n const getMappedId = (id: string): string => {\n const mapped = idMap.get(id);\n\n if (mapped) return mapped;\n\n const next = getNextId();\n\n idMap.set(id, next);\n\n return next;\n };\n\n return {\n bindings: result.__bindings.map((binding) => ({ ...binding, uid: getMappedId(binding.uid) }) as Binding),\n html: result.__html\n .replace(ATTR_ID_RE, (_, id: string) => `${CF_ID_ATTR}=\"${getMappedId(id)}\"`)\n .replace(/<!--(\\d+)-->/g, (_, id: string) => `<!--${getMappedId(id)}-->`),\n };\n};\n\nconst getEachSignalSource = (\n value: unknown,\n): ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n}> | null => {\n if (typeof value !== 'object' || value === null || !(EACH_SIGNAL in value)) return null;\n\n return (value as { [EACH_SIGNAL]: ReadonlySignal<{ bindings: Binding[]; html: string }> })[EACH_SIGNAL];\n};\n\nconst resolveDirectiveValue = (value: unknown): string => {\n if (typeof value === 'string') return escapeHtml(value);\n\n if (value == null) return '';\n\n if (isHtmlResult(value)) return value.__html;\n\n return escapeHtml(String(value));\n};\n\nconst renderHtmlItems = (\n getter: () => unknown,\n effect: (fn: () => void) => void,\n): { bindings: Binding[]; signal: Signal<any> } => {\n let cached = { bindings: [] as Binding[], html: '' };\n const fnSignal = signal(cached);\n\n effect(() => {\n const res = getter();\n const items = Array.isArray(res) ? res : [res];\n const getNestedId = createMarkerIdFactory();\n let html = '';\n const nextBindings: Binding[] = [];\n\n for (const item of items) {\n if (isHtmlResult(item)) {\n const entry = rekeyHtmlResult(item, getNestedId);\n\n html += entry.html;\n nextBindings.push(...entry.bindings);\n } else {\n html += resolveDirectiveValue(item);\n }\n }\n\n const bindingsChanged =\n nextBindings.length !== cached.bindings.length || nextBindings.some((b, i) => b !== cached.bindings[i]);\n\n if (html !== cached.html || bindingsChanged) {\n cached = { bindings: nextBindings, html };\n fnSignal.value = cached;\n }\n });\n\n return { bindings: [], signal: fnSignal };\n};\n\nconst createHtmlWrapperSignal = (\n value: unknown,\n effect: (fn: () => void) => void,\n): {\n keyed: boolean;\n signal: ReadonlySignal<{\n bindings: Binding[];\n html: string;\n items?: Array<{ bindings: Binding[]; html: string }>;\n keys?: (string | number)[];\n }>;\n} | null => {\n const eachSignal = getEachSignalSource(value);\n\n if (eachSignal) {\n return { keyed: true, signal: eachSignal };\n }\n\n if (typeof value === 'function' && !isSignal(value)) {\n const { signal: sig } = renderHtmlItems(value as () => unknown, effect);\n\n return { keyed: false, signal: sig };\n }\n\n if (isSignal(value) && isHtmlResult(value.value)) {\n return {\n keyed: false,\n signal: computed(() => {\n const next = (value as ReadonlySignal<unknown>).value;\n\n if (!isHtmlResult(next)) {\n return { bindings: [], html: resolveDirectiveValue(next) };\n }\n\n const entry = rekeyHtmlResult(next, createMarkerIdFactory());\n\n return { bindings: entry.bindings, html: entry.html };\n }),\n };\n }\n\n return null;\n};\n\nexport const resetTemplateCompilerState = (): void => {\n // Marker IDs are deterministic per compiled template; no global state to reset.\n};\n\n/**\n * Compiles a tagged template into an HTMLResult with reactive bindings.\n *\n * Detects interpolation slots using regex patterns:\n * - `@event-name` → event listener binding\n * - `ref` → ref binding\n * - `:prop` or `?bool` → special attributes\n * - `.prop` → property binding\n * - plain attributes → attribute binding\n *\n * Rekeys nested HTMLResult bindings to avoid ID collisions.\n *\n * @param strings - Template string parts\n * @param values - Interpolated values (signals, functions, directives, primitives)\n * @param effect - Effect hook for reactive bindings\n * @returns HTMLResult with compiled HTML and bindings array\n *\n * @example\n * const name = signal('Alice');\n * const html = compileTemplate`<h1>${() => name.value}</h1>`;\n */\nexport const compileTemplate = (\n strings: TemplateStringsArray,\n values: unknown[],\n effect: (fn: () => void) => void,\n): HTMLResult => {\n const plan = getCompiledTemplatePlan(strings);\n let result = '';\n const bindings: Binding[] = [];\n let activeElementId: string | null = null;\n\n const getNextId = createMarkerIdFactory();\n const isInsideStartTag = (prefix: string) => prefix.lastIndexOf('<') > prefix.lastIndexOf('>');\n const getElementBindingId = (prefix: string): string => {\n if (!activeElementId || isInsideStartTag(prefix)) {\n activeElementId = getNextId();\n }\n\n return activeElementId;\n };\n const resetElementBindingId = (): void => {\n activeElementId = null;\n };\n\n for (let i = 0; i < plan.slots.length; i++) {\n const slot = plan.slots[i];\n const value = values[i];\n\n if (slot.kind === 'event') {\n if (typeof value === 'function') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push({\n handler: value as (e: Event) => void,\n modifiers: slot.modifiers,\n name: slot.name!,\n type: 'event',\n uid: id,\n });\n } else {\n result += slot.raw;\n }\n\n continue;\n }\n\n if (slot.kind === 'ref') {\n if (value) {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push({\n ref: value as Ref<Element> | RefCallback<Element>,\n type: 'ref',\n uid: id,\n });\n } else {\n result += slot.raw;\n }\n\n continue;\n }\n\n if (slot.kind === 'specialAttr') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push(createAttrBinding(slot.mode!, slot.name!, id, value));\n continue;\n }\n\n if (slot.kind === 'prop') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push(createPropBinding(slot.name!, id, value));\n continue;\n }\n\n if (slot.kind === 'plainAttr') {\n const id = getElementBindingId(slot.prefix);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push(createAttrBinding('attr', slot.name!, id, value));\n continue;\n }\n\n if (typeof value === 'object' && value !== null && ('mount' in value || 'render' in value)) {\n const isInterpolation = 'render' in value;\n const id = isInterpolation ? getNextId() : getElementBindingId(slot.raw);\n\n if (isInterpolation) result += `${slot.raw}<!--${id}-->`;\n else result += `${slot.raw} ${CF_ID_ATTR}=\"${id}\"`;\n\n const apply = (value as Directive).mount?.bind(value);\n\n if (apply) {\n bindings.push({\n apply: (el: HTMLElement, registerCleanup: (fn: () => void) => void) => {\n apply(el, { registerCleanup });\n },\n type: 'callback',\n uid: id,\n });\n }\n\n if (isInterpolation) {\n const render = (value as Directive).render!.bind(value);\n let cached = { bindings: [] as Binding[], html: '' };\n const fnSignal = signal(cached);\n\n effect(() => {\n const res = render();\n const items = Array.isArray(res) ? res : [res];\n const getNestedId = createMarkerIdFactory();\n let html = '';\n const nextBindings: Binding[] = [];\n\n for (const item of items) {\n if (isHtmlResult(item)) {\n const entry = rekeyHtmlResult(item, getNestedId);\n\n html += entry.html;\n nextBindings.push(...entry.bindings);\n } else {\n html += resolveDirectiveValue(item);\n }\n }\n\n const bindingsChanged =\n nextBindings.length !== cached.bindings.length || nextBindings.some((b, i) => b !== cached.bindings[i]);\n\n if (html !== cached.html || bindingsChanged) {\n cached = { bindings: nextBindings, html };\n fnSignal.value = cached;\n }\n });\n\n bindings.push({ keyed: false, signal: fnSignal, type: 'html', uid: id });\n }\n\n continue;\n }\n\n resetElementBindingId();\n\n const htmlWrapper = createHtmlWrapperSignal(value, effect);\n\n if (htmlWrapper) {\n const id = getNextId();\n\n result += `${slot.raw}<!--${id}-->`;\n bindings.push({ keyed: htmlWrapper.keyed, signal: htmlWrapper.signal, type: 'html', uid: id });\n continue;\n }\n\n if (Array.isArray(value)) {\n let combinedHtml = '';\n\n for (const item of value) {\n if (isHtmlResult(item)) {\n const entry = rekeyHtmlResult(item, getNextId);\n\n combinedHtml += entry.html;\n bindings.push(...entry.bindings);\n } else {\n combinedHtml += resolveDirectiveValue(item);\n }\n }\n result += slot.raw + combinedHtml;\n continue;\n }\n\n if (isSignal(value)) {\n const id = getNextId();\n\n result += `${slot.raw}<!--${id}-->`;\n bindings.push({ signal: value as Signal<unknown>, type: 'text', uid: id });\n } else if (isHtmlResult(value)) {\n const entry = rekeyHtmlResult(value, getNextId);\n\n result += slot.raw + entry.html;\n bindings.push(...entry.bindings);\n } else {\n result += slot.raw + resolveDirectiveValue(value);\n }\n }\n\n result += plan.tail;\n\n return htmlResult(normalizeCompiledHtml(result), bindings);\n};\n","import { batch, untrack, effect as _effect, type CleanupFn } from '@vielzeug/stateit';\n\nimport { type Binding, type HtmlBinding } from './internal';\nimport { applyBindingsWithTargets } from './template-bindings';\nimport { type RegisterCleanup } from './template-bindings';\nimport {\n createNodes,\n findCommentMarker,\n indexBindingsInNodes,\n insertNodes,\n parseHTML,\n type BindingTargets,\n} from './template-dom';\nimport { runAll } from './utilities';\n\n/** Keyed reconciliation node — holds DOM nodes + lifecycle for one `each()` item. */\nexport type KeyedNode = {\n bindings: Binding[];\n cleanups: CleanupFn[];\n html: string;\n nodes: Node[];\n targets: BindingTargets;\n};\n\nconst removeKeyed = (keyedNode: KeyedNode) => {\n runAll(keyedNode.cleanups);\n for (const n of keyedNode.nodes) (n as ChildNode).remove();\n};\n\n/** Apply bindings to keyed item nodes using pre-indexed targets. */\nconst applyKeyedItemBindings = (\n nodes: Node[],\n itemBindings: Binding[],\n targets = indexBindingsInNodes(nodes),\n): CleanupFn[] => {\n const itemCleanups: CleanupFn[] = [];\n const itemRegisterCleanup: RegisterCleanup = (fn) => itemCleanups.push(fn);\n\n applyBindingsWithTargets(itemBindings, itemRegisterCleanup, targets);\n\n return itemCleanups;\n};\n\n/**\n * Sets up the reactive effect for an html-binding marker. Handles both non-keyed\n * (full replace) and keyed (`each()`) reconciliation.\n *\n * @param root The root node containing the marker comment.\n * @param b The HtmlBinding descriptor.\n * @param registerCleanup Function that registers a cleanup tied to the outer container's lifetime.\n * @param keyedStates Per-element map of `marker → (key → KeyedNode)` — caller owns this state.\n * @param applyBindingsInContainer Function to apply bindings to container.\n */\nexport const applyHtmlBinding = (\n root: Node,\n b: HtmlBinding,\n registerCleanup: RegisterCleanup,\n keyedStates: Map<string, Map<string | number, KeyedNode>>,\n applyBindingsInContainer: (\n container: ParentNode,\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n ) => void,\n): void => {\n const found = findCommentMarker(root, b.uid);\n\n if (!found) return;\n\n const marker = document.createComment('html-binding');\n\n found.replaceWith(marker);\n\n let currentCleanups: CleanupFn[] = [];\n const registerInnerCleanup: RegisterCleanup = (fn) => currentCleanups.push(fn);\n const runCurrentCleanups = () => {\n runAll(currentCleanups);\n currentCleanups = [];\n };\n let lastHtml: string | null = null;\n let lastInsertedNodes: Node[] = [];\n\n // Use stateit.effect directly so cleanup is managed manually via registerCleanup, not autoCleanup.\n const stop = _effect(() => {\n batch(() => {\n const data = b.signal.value;\n\n if (!b.keyed && data.html === lastHtml) {\n return;\n }\n\n lastHtml = data.html;\n\n runCurrentCleanups();\n\n const { bindings, html, keys } = data;\n\n if (b.keyed && !keyedStates.has(b.uid)) keyedStates.set(b.uid, new Map());\n\n const keyedState = b.keyed ? keyedStates.get(b.uid)! : null;\n const container = (marker.parentElement || root) as ParentNode;\n\n let bindingsAlreadyApplied = false;\n\n untrack(() => {\n batch(() => {\n if (keyedState && keys?.length && data.items?.length === keys.length) {\n bindingsAlreadyApplied = true;\n\n // Transition from empty/fallback insertion back to keyed list items.\n if (keyedState.size === 0 && lastInsertedNodes.length > 0) {\n for (const n of lastInsertedNodes) (n as ChildNode).remove();\n lastInsertedNodes = [];\n }\n\n const newKeyedState = new Map<string | number, KeyedNode>();\n\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const itemData = data.items[i];\n const existing = keyedState.get(key);\n\n const prevNodes = i > 0 ? newKeyedState.get(keys[i - 1])?.nodes : null;\n const insertPoint = prevNodes?.length ? prevNodes[prevNodes.length - 1].nextSibling : marker.nextSibling;\n\n if (existing?.html === itemData.html) {\n // UPDATE: Same HTML — reuse nodes, reapply bindings\n if (existing.nodes[0]) insertNodes(marker, existing.nodes, insertPoint);\n\n runAll(existing.cleanups);\n\n const itemTargets = indexBindingsInNodes(existing.nodes);\n const itemCleanups = applyKeyedItemBindings(existing.nodes, itemData.bindings, itemTargets);\n\n newKeyedState.set(key, {\n ...existing,\n bindings: itemData.bindings,\n cleanups: itemCleanups,\n targets: itemTargets,\n });\n } else if (existing) {\n // REPLACE: Different HTML — create new nodes, remove old\n runAll(existing.cleanups);\n\n const newNodes = createNodes(itemData.html);\n const itemTargets = indexBindingsInNodes(newNodes);\n\n insertNodes(marker, newNodes, insertPoint);\n\n const itemCleanups = applyKeyedItemBindings(newNodes, itemData.bindings, itemTargets);\n\n newKeyedState.set(key, {\n bindings: itemData.bindings,\n cleanups: itemCleanups,\n html: itemData.html,\n nodes: newNodes,\n targets: itemTargets,\n });\n for (const n of existing.nodes) (n as ChildNode).remove();\n } else {\n // CREATE: New item\n const newNodes = createNodes(itemData.html);\n const itemTargets = indexBindingsInNodes(newNodes);\n\n insertNodes(marker, newNodes, insertPoint);\n\n const itemCleanups = applyKeyedItemBindings(newNodes, itemData.bindings, itemTargets);\n\n newKeyedState.set(key, {\n bindings: itemData.bindings,\n cleanups: itemCleanups,\n html: itemData.html,\n nodes: newNodes,\n targets: itemTargets,\n });\n }\n }\n\n // DELETE: Remove old items not in new state\n for (const [oldKey, oldNode] of keyedState) {\n if (!newKeyedState.has(oldKey)) removeKeyed(oldNode);\n }\n\n keyedStates.set(b.uid, newKeyedState);\n } else {\n // Non-keyed or empty list: replace previously inserted nodes.\n if (b.keyed && keyedState && keyedState.size > 0) {\n for (const [, kn] of keyedState) removeKeyed(kn);\n } else {\n for (const n of lastInsertedNodes) (n as ChildNode).remove();\n }\n\n const parsed = parseHTML(html);\n\n lastInsertedNodes = Array.from(parsed.childNodes);\n marker.after(parsed);\n\n if (b.keyed) keyedStates.set(b.uid, new Map());\n }\n });\n\n if (!bindingsAlreadyApplied) {\n applyBindingsInContainer(container, bindings, registerInnerCleanup, {\n onHtml: (binding) =>\n applyHtmlBinding(container, binding, registerInnerCleanup, keyedStates, applyBindingsInContainer),\n });\n }\n });\n });\n });\n\n registerCleanup(stop);\n registerCleanup(runCurrentCleanups);\n\n if (b.keyed) registerCleanup(() => keyedStates.delete(b.uid));\n};\n","import { type Binding, type HtmlBinding, type HTMLResult } from './internal';\nimport { effect } from './runtime-lifecycle';\nimport { applyBindingsWithTargets } from './template-bindings';\nimport { type RegisterCleanup } from './template-bindings';\nimport { compileTemplate, resetTemplateCompilerState } from './template-compiler';\nimport { indexBindings } from './template-dom';\nimport { applyHtmlBinding as applyHtmlBindingImpl, type KeyedNode } from './template-html';\n\n// ─── Re-exports for consumers ─────────────────────────────────────────────────\nexport type { KeyedNode };\n\n// ─── Binding application orchestration ────────────────────────────────────────\n\nexport const applyBindingsInContainer = (\n container: ParentNode,\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n applyBindingsWithTargets(bindings, registerCleanup, indexBindings(container), opts);\n};\n\n// ─── Reset and compilation ────────────────────────────────────────────────────\n\nexport const _resetMarkerIndex = (): void => {\n resetTemplateCompilerState();\n};\n\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]): HTMLResult =>\n compileTemplate(strings, values, effect);\n\n// ─── HTML binding with keyed reconciliation ────────────────────────────────────\n\nexport const applyHtmlBinding = (\n root: Node,\n b: HtmlBinding,\n registerCleanup: RegisterCleanup,\n keyedStates: Map<string, Map<string | number, KeyedNode>>,\n): void => {\n applyHtmlBindingImpl(root, b, registerCleanup, keyedStates, applyBindingsInContainer);\n};\n","/**\n * Component authoring API — define, props, lifecycle, and form field functionality.\n *\n * - defineComponent: Main API for building typed custom elements\n * - prop/typed/createProps: Reactive property definitions\n * - defineField: Form field integration\n */\n\nimport {\n type CleanupFn,\n type ComputedSignal,\n type ReadonlySignal,\n type Signal,\n signal,\n effect,\n} from '@vielzeug/stateit';\n\nimport { createSlots, type Slots, type ReflectConfig } from './host';\nimport { reflect } from './host';\nimport { type HTMLResult, htmlResult } from './internal';\nimport { currentRuntime, runtimeStack } from './runtime-lifecycle';\nimport { applyBindingsInContainer, applyHtmlBinding } from './template';\nimport { type RegisterCleanup } from './template-bindings';\nimport { parseHTML } from './template-dom';\nimport { type KeyedNode } from './template-html';\nimport { createEmitFn, type EmitFn, setAttr, toKebab, runAll, loadStylesheet, type CSSResult } from './utilities';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// FORM FIELD API\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal */\nexport const formCallbackRegistry = new WeakMap<HTMLElement, FormFieldCallbacks>();\n/** @internal */\nexport const internalsRegistry = new WeakMap<HTMLElement, ElementInternals>();\n\n/**\n * Callbacks that hook into form lifecycle events. Can be passed directly to {@link defineField}\n * as a second argument to keep all form logic co-located.\n */\nexport type FormFieldCallbacks = {\n onAssociated?: (form: HTMLFormElement | null) => void;\n onDisabled?: (disabled: boolean) => void;\n onReset?: () => void;\n onStateRestore?: (state: unknown, mode: 'autocomplete' | 'restore') => void;\n};\n\nexport type FormFieldOptions<T = unknown> = {\n disabled?: Signal<boolean> | ReadonlySignal<boolean> | ComputedSignal<boolean>;\n toFormValue?: (value: T) => File | FormData | string | null;\n value: Signal<T> | ReadonlySignal<T>;\n};\n\nexport type FormFieldHandle = {\n checkValidity: () => boolean;\n readonly internals: ElementInternals;\n reportValidity: () => boolean;\n setCustomValidity: (message: string) => void;\n setValidity: ElementInternals['setValidity'];\n};\n\nexport const defineField = <T = unknown>(\n options: FormFieldOptions<T>,\n callbacks?: FormFieldCallbacks,\n): FormFieldHandle => {\n const rt = currentRuntime();\n const host = rt.el;\n const ctor = host.constructor as typeof HTMLElement & { formAssociated?: boolean };\n\n if (!ctor.formAssociated) {\n throw new Error('[craftit:E8] defineField() requires defineComponent({ formAssociated: true })');\n }\n\n const internals = internalsRegistry.get(host) ?? host.attachInternals();\n\n internalsRegistry.set(host, internals);\n\n const toFormValue = options.toFormValue ?? ((v: T) => (v == null ? '' : String(v)));\n\n effect(() => {\n internals.setFormValue(toFormValue(options.value.value));\n });\n\n if (options.disabled) {\n effect(() => {\n if (options.disabled!.value) {\n internals.states.add('disabled');\n } else {\n internals.states.delete('disabled');\n }\n });\n }\n\n if (callbacks) {\n formCallbackRegistry.set(host, { ...formCallbackRegistry.get(host), ...callbacks });\n }\n\n const checkValidity = () => internals.checkValidity();\n const reportValidity = () => internals.reportValidity();\n const setCustomValidity = (message: string) =>\n message ? internals.setValidity({ customError: true }, message) : internals.setValidity({});\n\n return {\n checkValidity,\n internals,\n reportValidity,\n setCustomValidity,\n setValidity: internals.setValidity.bind(internals),\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// PROP SYSTEM\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype PropType<T> = T extends string\n ? StringConstructor\n : T extends number\n ? NumberConstructor\n : T extends boolean\n ? BooleanConstructor\n : T extends unknown[]\n ? ArrayConstructor\n : ObjectConstructor;\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when the value is an empty string. */\n omit?: boolean;\n parse?: (value: string | null) => T;\n reflect?: boolean;\n type?: PropType<T>;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst isPropDef = (value: unknown): value is PropDef<unknown> => {\n if (typeof value !== 'object' || value === null || !('default' in value)) return false;\n\n return Object.keys(value).every((key) => PROP_DEF_KEYS.has(key));\n};\n\nexport const propRegistry = new WeakMap<object, Map<string, PropMeta<unknown>>>();\n\nexport const prop = <T>(name: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const rt = currentRuntime();\n const el = rt.el;\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n const parse =\n options?.parse ??\n ((v: string | null): T => {\n // Explicit Boolean type: string values 'true' / '' → boolean\n if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n // Boolean default: treat absent or explicit \"false\" as false, anything else as true.\n // This handles frameworks (e.g. Vue) that set the attribute to the string \"false\"\n // when a reactive binding evaluates to false, rather than removing the attribute.\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n // Numeric — inferred from an explicit type option or default value type\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, name);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[name] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n // Prefer pre-upgrade property values set before defineProperty() (common for\n // framework/host property bindings), then fall back to attributes.\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[name];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(name)) {\n s.value = parse(el.getAttribute(name)) as T;\n }\n\n propRegistry.get(el)!.set(name, meta);\n\n Object.defineProperty(el, name, {\n configurable: true,\n enumerable: true,\n get: () => s.value,\n set: (value: T) => {\n s.value = value;\n },\n });\n\n if (options?.reflect ?? true) {\n const omit = options?.omit ?? false;\n\n rt.onMount.push(() => {\n rt.cleanups.push(\n effect(() => {\n const v = s.value;\n\n if (v == null || v === false || (omit && v === '')) {\n el.removeAttribute(name);\n } else {\n setAttr(el, name, v);\n }\n }),\n );\n });\n }\n\n return s;\n};\n\ntype InferPropValue<T> = T extends object\n ? Exclude<keyof T, keyof PropDef<unknown>> extends never\n ? T extends PropDef<infer U>\n ? U\n : T\n : T\n : T;\n\nexport type InferPropsSignals<T extends PropInputDefs> = {\n [K in keyof T]: Signal<InferPropValue<T[K]>>;\n};\n\nexport function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<D> {\n const result = {} as Record<string, Signal<unknown>>;\n\n for (const [name, def] of Object.entries(defs)) {\n const descriptor = isPropDef(def) ? (def as PropDef<unknown>) : { default: def };\n const hasStructuredDefault =\n (typeof descriptor.default === 'object' && descriptor.default !== null) || Array.isArray(descriptor.default);\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n result[name] = prop(toKebab(name), descriptor.default, propDef);\n }\n\n return result as InferPropsSignals<D>;\n}\n\n/**\n * Forces TypeScript to infer the prop signal type from `T` rather than the default\n * value's literal type. Use in `defineComponent({ props: ... })` when the default\n * is `undefined` or when you want an explicit union type.\n *\n * @example\n * defineComponent<ButtonProps>({\n * props: {\n * color: typed<ThemeColor | undefined>(undefined),\n * disabled: { default: false },\n * },\n * setup({ props }) {\n * return html`<button>${props.color}</button>`;\n * },\n * tag: 'x-button',\n * });\n */\nexport const typed = <T>(defaultValue: T, options?: PropOptions<T>): PropDef<T> => ({\n ...options,\n default: defaultValue,\n});\n\n// ─────────────────────────────────────────────────────────────────────────────\n// COMPONENT SETUP & REGISTRATION\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport type ComponentSetupContext = {\n /** The host `HTMLElement` instance for this component. */\n host: HTMLElement;\n /** Shorthand for `host.shadowRoot` — the component's open shadow root. */\n shadow: ShadowRoot;\n};\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** Custom options for host element (e.g. for aria-*) */\n host?: Record<string, string | boolean | number>;\n /** @internal — list of attribute names to observe via attributeChangedCallback */\n observedAttrs?: string[];\n /** Shadow root init options (mode is always 'open') — use e.g. `{ delegatesFocus: true }` for form controls */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles applied to the shadow root. Static — set at definition time, not per-render. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\n/**\n * Helper type to build a prop schema from a props interface type.\n * Each property maps to a PropOptions shape with a `default` value.\n */\nexport type BuildPropSchema<T> = {\n [K in keyof T]-?: PropDef<T[K]>;\n};\n\n/**\n * Unified setup context passed to `defineComponent` setup function.\n * Both Props and Events generics flow through to give full type safety.\n */\nexport type DefineComponentSetupContext<\n P extends Record<string, PropOptions<any>> = Record<string, never>,\n E extends Record<string, unknown> = Record<string, never>,\n> = {\n /** Typed emit function — fully inferred from the Events generic */\n emit: EmitFn<E>;\n /** Host element */\n host: HTMLElement;\n /** Reactive props as signals — fully inferred from the Props generic */\n props: InferPropsSignals<P>;\n /** Reflect reactive attributes, events and classes to the host */\n reflect: (config: ReflectConfig) => void;\n /** Shadow root */\n shadow: ShadowRoot;\n /** Slots helper */\n slots: Slots<any>;\n};\n\n/**\n * Configuration object for `defineComponent()`.\n * Note: no `emits` field — declare events via the Events generic instead.\n */\nexport type DefineComponentOptions<\n PropsSchema extends Record<string, PropDef<any>> = Record<string, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n> = {\n /** Whether this element is form-associated */\n formAssociated?: boolean;\n /** Host element attributes */\n host?: Record<string, string | boolean | number>;\n /** Property definitions */\n props?: PropsSchema;\n /** Setup function — returns a template */\n setup: (ctx: DefineComponentSetupContext<PropsSchema, Emits>) => string | HTMLResult;\n /** Shadow root init options */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component styles */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n /** Custom element tag name (must include a hyphen) */\n tag: string;\n};\n\n// ─── Base custom element ──────────────────────────────────────────────────────\n\ntype ComponentRuntime = {\n cleanups: CleanupFn[];\n el: HTMLElement;\n errorHandlers: Array<(err: unknown) => void>;\n onMount: Array<() => CleanupFn | undefined | void>;\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\n// Lifecycle methods (connectedCallback, attributeChangedCallback, …) are invoked\n// by the browser runtime, not TypeScript code — suppress false-positive lint warnings.\n\nclass BaseElement extends HTMLElement {\n static _setup: (ctx: ComponentSetupContext) => string | HTMLResult;\n static _options?: ComponentRegistrationOptions;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _keyedStates = new Map<string, Map<string | number, KeyedNode>>();\n private _mountFns: (() => CleanupFn | undefined | void)[] = [];\n private _template: string | HTMLResult | null = null;\n private _appliedHtmlBindings = new Set<string>();\n private _setupDone = false;\n private _runtime: ComponentRuntime;\n\n constructor() {\n super();\n\n const options = (this.constructor as typeof BaseElement)._options;\n\n this.shadow = this.attachShadow({ mode: 'open', ...options?.shadow });\n this._runtime = {\n cleanups: [],\n el: this,\n errorHandlers: [],\n onMount: [],\n styles: options?.styles,\n };\n }\n\n connectedCallback(): void {\n if (!this._setupDone) this._runSetup();\n\n this._init();\n }\n\n // Fires synchronously on observed attribute change — no MutationObserver needed.\n // observedAttributes is set at class-definition time from the prop schema.\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n const meta = propRegistry.get(this)?.get(name);\n\n if (!meta) return;\n\n const parsed = meta.parse(newValue);\n\n if (!Object.is(meta.signal.peek(), parsed)) meta.signal.value = parsed as never;\n }\n\n disconnectedCallback(): void {\n runAll(this._runtime.cleanups);\n this._runtime.cleanups = [];\n this._runtime.onMount = this._mountFns.slice(); // restore for reconnect\n this._appliedHtmlBindings.clear();\n this._keyedStates.clear();\n }\n\n formAssociatedCallback(form: HTMLFormElement | null): void {\n formCallbackRegistry.get(this)?.onAssociated?.(form);\n }\n\n formDisabledCallback(disabled: boolean): void {\n formCallbackRegistry.get(this)?.onDisabled?.(disabled);\n }\n\n formResetCallback(): void {\n formCallbackRegistry.get(this)?.onReset?.();\n }\n\n formStateRestoreCallback(state: unknown, mode: 'autocomplete' | 'restore'): void {\n formCallbackRegistry.get(this)?.onStateRestore?.(state, mode);\n }\n\n private _handleError(err: unknown): void {\n if (this._runtime.errorHandlers.length > 0) {\n for (const fn of this._runtime.errorHandlers) fn(err);\n } else {\n console.error(`[craftit:E3] <${this.localName}>`, err);\n }\n }\n\n private _runSetup(): void {\n this._setupDone = true;\n runtimeStack.push(this._runtime as any);\n\n try {\n const { host: hostOptions } = (this.constructor as typeof BaseElement)._options ?? {};\n\n if (hostOptions) {\n for (const [name, value] of Object.entries(hostOptions)) {\n if (typeof value === 'boolean') {\n if (value) {\n this.setAttribute(name, '');\n } else {\n this.removeAttribute(name);\n }\n } else {\n this.setAttribute(name, String(value));\n }\n }\n }\n\n const res = (this.constructor as typeof BaseElement)._setup({ host: this, shadow: this.shadow });\n\n if (typeof res === 'string' || (typeof res === 'object' && res !== null && '__html' in res)) {\n this._template = res as string | HTMLResult;\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n }\n }\n\n private _init(): void {\n const { styles } = this._runtime;\n\n // Apply styles synchronously before rendering to prevent FOUC.\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (this._template) {\n const result: HTMLResult = typeof this._template === 'string' ? htmlResult(this._template) : this._template;\n\n this.shadow.replaceChildren(parseHTML(result.__html));\n\n if (result.__bindings.length) {\n const registerCleanup: RegisterCleanup = (fn) => this._runtime.cleanups.push(fn);\n\n applyBindingsInContainer(this.shadow, result.__bindings, registerCleanup, {\n onHtml: (b) => {\n if (!this._appliedHtmlBindings.has(b.uid)) {\n this._appliedHtmlBindings.add(b.uid);\n applyHtmlBinding(this.shadow, b, registerCleanup, this._keyedStates);\n }\n },\n });\n }\n }\n\n // Defer onMount callbacks to a microtask for deterministic timing.\n // Components that depend on layout/paint should schedule rAF inside onMount.\n queueMicrotask(() => {\n runtimeStack.push(this._runtime as any);\n\n try {\n const fns = this._runtime.onMount;\n\n this._mountFns = fns.slice(); // snapshot for reconnect\n\n for (const fn of fns) {\n const cleanup = fn();\n\n if (typeof cleanup === 'function') this._runtime.cleanups.push(cleanup);\n }\n } catch (err) {\n this._handleError(err);\n } finally {\n runtimeStack.pop();\n this._runtime.onMount = [];\n }\n });\n }\n}\n\n// ─── Component registration ───────────────────────────────────────────────────\n\n/** @internal — use `defineComponent` instead. */\nexport function registerComponent(\n tag: string,\n setup: (ctx: ComponentSetupContext) => string | HTMLResult,\n options: ComponentRegistrationOptions = {},\n): string {\n if (!tag) throw new Error('[craftit:E4] registerComponent(tag, ...) requires a tag name');\n\n if (customElements.get(tag)) {\n throw new Error(`[craftit:E9] custom element already defined: ${tag}`);\n }\n\n class Element extends BaseElement {\n static override _setup = setup;\n static override _options = options;\n static override formAssociated = options.formAssociated ?? false;\n static override observedAttributes = options.observedAttrs ?? [];\n }\n\n customElements.define(tag, Element);\n\n return tag;\n}\n\n/**\n * Defines a custom element with a cohesive, type-safe API.\n *\n * Pass your Props and Events interfaces as generics — everything in `setup`\n * is fully typed with zero boilerplate.\n *\n * @example\n * ```ts\n * type MyProps = { checked?: boolean; disabled?: boolean };\n * type MyEvents = { change: { checked: boolean } };\n *\n * defineComponent<MyProps, MyEvents>({\n * tag: 'my-checkbox',\n * props: {\n * checked: { default: false },\n * disabled: { default: false },\n * },\n * setup({ props, emit }) {\n * // props.checked → Signal<boolean> ✅\n * // emit('change', { checked: true }) ✅\n * },\n * });\n * ```\n */\nexport function defineComponent<\n PropsType = Record<string, never>,\n EventsType extends Record<string, unknown> = Record<string, never>,\n>(options: DefineComponentOptions<BuildPropSchema<PropsType>, EventsType>): string {\n const { formAssociated, host: hostOptions, props: propDefs, setup, shadow: shadowOptions, styles, tag } = options;\n\n // Derive observed attribute names from prop schema at definition time so\n // attributeChangedCallback fires correctly — no MutationObserver needed.\n const observedAttrs = propDefs ? Object.keys(propDefs).map(toKebab) : [];\n\n return registerComponent(\n tag,\n (ctx) => {\n const props = propDefs\n ? createProps(propDefs as BuildPropSchema<PropsType>)\n : ({} as InferPropsSignals<BuildPropSchema<PropsType>>);\n const emit = createEmitFn<EventsType>();\n const slots = createSlots<any>();\n\n return setup({\n emit: emit as EmitFn<EventsType>,\n host: ctx.host,\n props,\n reflect: (config: ReflectConfig) => reflect(ctx.host, config),\n shadow: ctx.shadow,\n slots,\n } as DefineComponentSetupContext<BuildPropSchema<PropsType>, EventsType>);\n },\n { formAssociated, host: hostOptions, observedAttrs, shadow: shadowOptions, styles },\n );\n}\n","import { signal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { onCleanup } from '../core/runtime';\n\n/**\n * Observes an element's content-box size via `ResizeObserver`.\n * Returns a `ReadonlySignal` that updates whenever the dimensions change.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const size = observeResize(containerRef.value!);\n * effect(() => console.log(size.value.width, size.value.height));\n * });\n */\nexport const observeResize = (el: Element): ReadonlySignal<{ height: number; width: number }> => {\n const size = signal({ height: 0, width: 0 });\n const ro = new ResizeObserver(([entry]) => {\n if (!entry) return;\n\n const box = entry.contentBoxSize[0];\n\n if (box) size.value = { height: box.blockSize, width: box.inlineSize };\n });\n\n ro.observe(el);\n onCleanup(() => ro.disconnect());\n\n return size;\n};\n\n/**\n * Observes an element's intersection with the viewport (or a given root) via\n * `IntersectionObserver`. Returns a `ReadonlySignal` that updates whenever the\n * intersection ratio changes.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const entry = observeIntersection(cardRef.value!);\n * effect(() => console.log(entry.value.isIntersecting));\n * });\n */\nexport const observeIntersection = (\n el: Element,\n options?: IntersectionObserverInit,\n): ReadonlySignal<IntersectionObserverEntry | null> => {\n const entry = signal<IntersectionObserverEntry | null>(null);\n const io = new IntersectionObserver(([e]) => {\n if (e) entry.value = e;\n }, options);\n\n io.observe(el);\n onCleanup(() => io.disconnect());\n\n return entry;\n};\n\n/**\n * Observes a CSS media query via `window.matchMedia`. Returns a `ReadonlySignal`\n * that is `true` when the query matches and `false` when it does not.\n * Must be called inside an {@link onMount} callback.\n *\n * @example\n * onMount(() => {\n * const prefersReducedMotion = observeMedia('(prefers-reduced-motion: reduce)');\n * effect(() => console.log(prefersReducedMotion.value));\n * });\n */\nexport const observeMedia = (query: string): ReadonlySignal<boolean> => {\n const mql = window.matchMedia(query);\n const matches = signal(mql.matches);\n const handler = (e: MediaQueryListEvent) => {\n matches.value = e.matches;\n };\n\n mql.addEventListener('change', handler);\n onCleanup(() => mql.removeEventListener('change', handler));\n\n return matches;\n};\n"],"mappings":"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"}