@vielzeug/craftit 2.1.0 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -124
- package/dist/controls/a11y-control.cjs +1 -1
- package/dist/controls/a11y-control.cjs.map +1 -1
- package/dist/controls/a11y-control.d.ts +1 -1
- package/dist/controls/a11y-control.d.ts.map +1 -1
- package/dist/controls/a11y-control.js +1 -1
- package/dist/controls/a11y-control.js.map +1 -1
- package/dist/controls/checkable-control.cjs +1 -1
- package/dist/controls/checkable-control.cjs.map +1 -1
- package/dist/controls/checkable-control.d.ts +7 -7
- package/dist/controls/checkable-control.d.ts.map +1 -1
- package/dist/controls/checkable-control.js +1 -1
- package/dist/controls/checkable-control.js.map +1 -1
- package/dist/controls/choice-field-control.cjs +2 -0
- package/dist/controls/choice-field-control.cjs.map +1 -0
- package/dist/controls/choice-field-control.d.ts +3 -0
- package/dist/controls/choice-field-control.d.ts.map +1 -0
- package/dist/controls/choice-field-control.js +2 -0
- package/dist/controls/choice-field-control.js.map +1 -0
- package/dist/controls/field-control.cjs +1 -1
- package/dist/controls/field-control.cjs.map +1 -1
- package/dist/controls/field-control.d.ts +28 -73
- package/dist/controls/field-control.d.ts.map +1 -1
- package/dist/controls/field-control.js +1 -1
- package/dist/controls/field-control.js.map +1 -1
- package/dist/controls/index.d.ts +11 -9
- package/dist/controls/index.d.ts.map +1 -1
- package/dist/controls/internal/control-state.cjs +1 -1
- package/dist/controls/internal/control-state.cjs.map +1 -1
- package/dist/controls/internal/control-state.d.ts +6 -4
- package/dist/controls/internal/control-state.d.ts.map +1 -1
- package/dist/controls/internal/control-state.js +1 -1
- package/dist/controls/internal/control-state.js.map +1 -1
- package/dist/controls/internal/keyboard-utils.cjs.map +1 -1
- package/dist/controls/internal/keyboard-utils.js.map +1 -1
- package/dist/controls/internal/number-utils.cjs.map +1 -1
- package/dist/controls/internal/number-utils.js.map +1 -1
- package/dist/controls/internal/validation-utils.cjs.map +1 -1
- package/dist/controls/internal/validation-utils.js.map +1 -1
- package/dist/controls/list-control.cjs +1 -1
- package/dist/controls/list-control.cjs.map +1 -1
- package/dist/controls/list-control.d.ts +10 -8
- package/dist/controls/list-control.d.ts.map +1 -1
- package/dist/controls/list-control.js +1 -1
- package/dist/controls/list-control.js.map +1 -1
- package/dist/controls/overlay-control.cjs +1 -1
- package/dist/controls/overlay-control.cjs.map +1 -1
- package/dist/controls/overlay-control.d.ts +17 -14
- package/dist/controls/overlay-control.d.ts.map +1 -1
- package/dist/controls/overlay-control.js +1 -1
- package/dist/controls/overlay-control.js.map +1 -1
- package/dist/controls/popup-list-control.cjs +2 -0
- package/dist/controls/popup-list-control.cjs.map +1 -0
- package/dist/controls/popup-list-control.d.ts +160 -0
- package/dist/controls/popup-list-control.d.ts.map +1 -0
- package/dist/controls/popup-list-control.js +2 -0
- package/dist/controls/popup-list-control.js.map +1 -0
- package/dist/controls/press-control.cjs.map +1 -1
- package/dist/controls/press-control.js.map +1 -1
- package/dist/controls/slider-control.cjs.map +1 -1
- package/dist/controls/slider-control.js.map +1 -1
- package/dist/controls/spinner-control.cjs.map +1 -1
- package/dist/controls/spinner-control.js.map +1 -1
- package/dist/controls/swipe-control.cjs +2 -0
- package/dist/controls/swipe-control.cjs.map +1 -0
- package/dist/controls/swipe-control.d.ts +32 -0
- package/dist/controls/swipe-control.d.ts.map +1 -0
- package/dist/controls/swipe-control.js +2 -0
- package/dist/controls/swipe-control.js.map +1 -0
- package/dist/controls/text-field-control.cjs +2 -0
- package/dist/controls/text-field-control.cjs.map +1 -0
- package/dist/controls/text-field-control.d.ts +3 -0
- package/dist/controls/text-field-control.d.ts.map +1 -0
- package/dist/controls/text-field-control.js +2 -0
- package/dist/controls/text-field-control.js.map +1 -0
- package/dist/controls.cjs +1 -1
- package/dist/controls.js +1 -1
- package/dist/craftit.cjs +1 -1
- package/dist/craftit.cjs.map +1 -1
- package/dist/craftit.js +1 -1
- package/dist/craftit.js.map +1 -1
- package/dist/directives/classMap.cjs +2 -0
- package/dist/directives/classMap.cjs.map +1 -0
- package/dist/directives/classMap.d.ts +19 -0
- package/dist/directives/classMap.d.ts.map +1 -0
- package/dist/directives/classMap.js +2 -0
- package/dist/directives/classMap.js.map +1 -0
- package/dist/directives/each.cjs +1 -1
- package/dist/directives/each.cjs.map +1 -1
- package/dist/directives/each.d.ts +5 -30
- package/dist/directives/each.d.ts.map +1 -1
- package/dist/directives/each.js +1 -1
- package/dist/directives/each.js.map +1 -1
- package/dist/directives/guard.cjs +2 -0
- package/dist/directives/guard.cjs.map +1 -0
- package/dist/directives/guard.d.ts +10 -0
- package/dist/directives/guard.d.ts.map +1 -0
- package/dist/directives/guard.js +2 -0
- package/dist/directives/guard.js.map +1 -0
- package/dist/directives/live.cjs +2 -0
- package/dist/directives/live.cjs.map +1 -0
- package/dist/directives/live.d.ts +23 -0
- package/dist/directives/live.d.ts.map +1 -0
- package/dist/directives/live.js +2 -0
- package/dist/directives/live.js.map +1 -0
- package/dist/directives/raw.cjs +1 -1
- package/dist/directives/raw.cjs.map +1 -1
- package/dist/directives/raw.d.ts +3 -5
- package/dist/directives/raw.d.ts.map +1 -1
- package/dist/directives/raw.js +1 -1
- package/dist/directives/raw.js.map +1 -1
- package/dist/directives/resource.cjs +2 -0
- package/dist/directives/resource.cjs.map +1 -0
- package/dist/directives/resource.d.ts +32 -0
- package/dist/directives/resource.d.ts.map +1 -0
- package/dist/directives/resource.js +2 -0
- package/dist/directives/resource.js.map +1 -0
- package/dist/directives/styleMap.cjs +2 -0
- package/dist/directives/styleMap.cjs.map +1 -0
- package/dist/directives/styleMap.d.ts +11 -0
- package/dist/directives/styleMap.d.ts.map +1 -0
- package/dist/directives/styleMap.js +2 -0
- package/dist/directives/styleMap.js.map +1 -0
- package/dist/directives/when.cjs +1 -1
- package/dist/directives/when.cjs.map +1 -1
- package/dist/directives/when.d.ts +6 -19
- package/dist/directives/when.d.ts.map +1 -1
- package/dist/directives/when.js +1 -1
- package/dist/directives/when.js.map +1 -1
- package/dist/errors.cjs +2 -0
- package/dist/errors.cjs.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/form.cjs +1 -1
- package/dist/form.cjs.map +1 -1
- package/dist/form.d.ts +3 -17
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +1 -1
- package/dist/form.js.map +1 -1
- package/dist/host.cjs +1 -1
- package/dist/host.cjs.map +1 -1
- package/dist/host.d.ts +40 -37
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +1 -1
- package/dist/host.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +16 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.cjs +1 -1
- package/dist/internal.cjs.map +1 -1
- package/dist/internal.d.ts +60 -120
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/internal.js.map +1 -1
- package/dist/observers/index.d.ts +1 -0
- package/dist/observers/index.d.ts.map +1 -1
- package/dist/observers/intersection-observe.cjs +1 -1
- package/dist/observers/intersection-observe.cjs.map +1 -1
- package/dist/observers/intersection-observe.d.ts +1 -1
- package/dist/observers/intersection-observe.js +1 -1
- package/dist/observers/intersection-observe.js.map +1 -1
- package/dist/observers/media-observe.cjs +1 -1
- package/dist/observers/media-observe.cjs.map +1 -1
- package/dist/observers/media-observe.d.ts +1 -1
- package/dist/observers/media-observe.js +1 -1
- package/dist/observers/media-observe.js.map +1 -1
- package/dist/observers/mutation-observe.cjs +2 -0
- package/dist/observers/mutation-observe.cjs.map +1 -0
- package/dist/observers/mutation-observe.d.ts +10 -0
- package/dist/observers/mutation-observe.d.ts.map +1 -0
- package/dist/observers/mutation-observe.js +2 -0
- package/dist/observers/mutation-observe.js.map +1 -0
- package/dist/observers/resize-observe.cjs +1 -1
- package/dist/observers/resize-observe.cjs.map +1 -1
- package/dist/observers/resize-observe.d.ts +1 -1
- package/dist/observers/resize-observe.js +1 -1
- package/dist/observers/resize-observe.js.map +1 -1
- package/dist/observers.cjs +1 -1
- package/dist/observers.js +1 -1
- package/dist/props.cjs +1 -1
- package/dist/props.cjs.map +1 -1
- package/dist/props.d.ts +18 -31
- package/dist/props.d.ts.map +1 -1
- package/dist/props.js +1 -1
- package/dist/props.js.map +1 -1
- package/dist/registration.cjs +1 -1
- package/dist/registration.cjs.map +1 -1
- package/dist/registration.d.ts +27 -7
- package/dist/registration.d.ts.map +1 -1
- package/dist/registration.js +1 -1
- package/dist/registration.js.map +1 -1
- package/dist/runtime.cjs +1 -1
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.d.ts +29 -17
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/template-bindings.cjs +1 -1
- package/dist/template-bindings.cjs.map +1 -1
- package/dist/template-bindings.d.ts +10 -47
- package/dist/template-bindings.d.ts.map +1 -1
- package/dist/template-bindings.js +1 -1
- package/dist/template-bindings.js.map +1 -1
- package/dist/template-compiler.cjs +1 -1
- package/dist/template-compiler.cjs.map +1 -1
- package/dist/template-compiler.d.ts +1 -21
- package/dist/template-compiler.d.ts.map +1 -1
- package/dist/template-compiler.js +1 -1
- package/dist/template-compiler.js.map +1 -1
- package/dist/testing/testing.cjs +1 -1
- package/dist/testing/testing.cjs.map +1 -1
- package/dist/testing/testing.d.ts +12 -5
- package/dist/testing/testing.d.ts.map +1 -1
- package/dist/testing/testing.js +1 -1
- package/dist/testing/testing.js.map +1 -1
- package/package.json +6 -12
- package/dist/component.cjs +0 -2
- package/dist/component.cjs.map +0 -1
- package/dist/component.d.ts +0 -39
- package/dist/component.d.ts.map +0 -1
- package/dist/component.js +0 -2
- package/dist/component.js.map +0 -1
- package/dist/controls/list-key-control.cjs +0 -2
- package/dist/controls/list-key-control.cjs.map +0 -1
- package/dist/controls/list-key-control.d.ts +0 -14
- package/dist/controls/list-key-control.d.ts.map +0 -1
- package/dist/controls/list-key-control.js +0 -2
- package/dist/controls/list-key-control.js.map +0 -1
- package/dist/directives/attr.cjs +0 -2
- package/dist/directives/attr.cjs.map +0 -1
- package/dist/directives/attr.d.ts +0 -12
- package/dist/directives/attr.d.ts.map +0 -1
- package/dist/directives/attr.js +0 -2
- package/dist/directives/attr.js.map +0 -1
- package/dist/directives/bind.cjs +0 -2
- package/dist/directives/bind.cjs.map +0 -1
- package/dist/directives/bind.d.ts +0 -38
- package/dist/directives/bind.d.ts.map +0 -1
- package/dist/directives/bind.js +0 -2
- package/dist/directives/bind.js.map +0 -1
- package/dist/directives/choose.cjs +0 -2
- package/dist/directives/choose.cjs.map +0 -1
- package/dist/directives/choose.d.ts +0 -39
- package/dist/directives/choose.d.ts.map +0 -1
- package/dist/directives/choose.js +0 -2
- package/dist/directives/choose.js.map +0 -1
- package/dist/directives/classes.cjs +0 -2
- package/dist/directives/classes.cjs.map +0 -1
- package/dist/directives/classes.d.ts +0 -20
- package/dist/directives/classes.d.ts.map +0 -1
- package/dist/directives/classes.js +0 -2
- package/dist/directives/classes.js.map +0 -1
- package/dist/directives/index.d.ts +0 -13
- package/dist/directives/index.d.ts.map +0 -1
- package/dist/directives/memo.cjs +0 -2
- package/dist/directives/memo.cjs.map +0 -1
- package/dist/directives/memo.d.ts +0 -27
- package/dist/directives/memo.d.ts.map +0 -1
- package/dist/directives/memo.js +0 -2
- package/dist/directives/memo.js.map +0 -1
- package/dist/directives/on.cjs +0 -2
- package/dist/directives/on.cjs.map +0 -1
- package/dist/directives/on.d.ts +0 -25
- package/dist/directives/on.d.ts.map +0 -1
- package/dist/directives/on.js +0 -2
- package/dist/directives/on.js.map +0 -1
- package/dist/directives/spread.cjs +0 -2
- package/dist/directives/spread.cjs.map +0 -1
- package/dist/directives/spread.d.ts +0 -14
- package/dist/directives/spread.d.ts.map +0 -1
- package/dist/directives/spread.js +0 -2
- package/dist/directives/spread.js.map +0 -1
- package/dist/directives/style.cjs +0 -2
- package/dist/directives/style.cjs.map +0 -1
- package/dist/directives/style.d.ts +0 -22
- package/dist/directives/style.d.ts.map +0 -1
- package/dist/directives/style.js +0 -2
- package/dist/directives/style.js.map +0 -1
- package/dist/directives/until.cjs +0 -2
- package/dist/directives/until.cjs.map +0 -1
- package/dist/directives/until.d.ts +0 -26
- package/dist/directives/until.d.ts.map +0 -1
- package/dist/directives/until.js +0 -2
- package/dist/directives/until.js.map +0 -1
- package/dist/directives.cjs +0 -1
- package/dist/directives.js +0 -1
- package/dist/runtime-bindings.cjs +0 -2
- package/dist/runtime-bindings.cjs.map +0 -1
- package/dist/runtime-bindings.d.ts +0 -6
- package/dist/runtime-bindings.d.ts.map +0 -1
- package/dist/runtime-bindings.js +0 -2
- package/dist/runtime-bindings.js.map +0 -1
- package/dist/runtime-core.cjs +0 -2
- package/dist/runtime-core.cjs.map +0 -1
- package/dist/runtime-core.d.ts +0 -21
- package/dist/runtime-core.d.ts.map +0 -1
- package/dist/runtime-core.js +0 -2
- package/dist/runtime-core.js.map +0 -1
- package/dist/runtime-lifecycle.cjs +0 -2
- package/dist/runtime-lifecycle.cjs.map +0 -1
- package/dist/runtime-lifecycle.d.ts +0 -24
- package/dist/runtime-lifecycle.d.ts.map +0 -1
- package/dist/runtime-lifecycle.js +0 -2
- package/dist/runtime-lifecycle.js.map +0 -1
- package/dist/template-dom.cjs +0 -2
- package/dist/template-dom.cjs.map +0 -1
- package/dist/template-dom.d.ts +0 -13
- package/dist/template-dom.d.ts.map +0 -1
- package/dist/template-dom.js +0 -2
- package/dist/template-dom.js.map +0 -1
- package/dist/template-html.cjs +0 -2
- package/dist/template-html.cjs.map +0 -1
- package/dist/template-html.d.ts +0 -23
- package/dist/template-html.d.ts.map +0 -1
- package/dist/template-html.js +0 -2
- package/dist/template-html.js.map +0 -1
- package/dist/template.cjs +0 -2
- package/dist/template.cjs.map +0 -1
- package/dist/template.d.ts +0 -10
- package/dist/template.d.ts.map +0 -1
- package/dist/template.js +0 -2
- package/dist/template.js.map +0 -1
package/dist/craftit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"craftit.js","names":[],"sources":["../src/internal.ts","../src/runtime-core.ts","../src/runtime-lifecycle.ts","../src/runtime.ts","../src/host.ts","../src/props.ts","../src/form.ts","../src/runtime-bindings.ts","../src/template-dom.ts","../src/template-bindings.ts","../src/template-compiler.ts","../src/template-html.ts","../src/template.ts","../src/registration.ts","../src/component.ts"],"sourcesContent":["/**\n * @internal — Binding type system, compiler/runtime helpers, and engine internals.\n *\n * These types and helpers define the contract between the template compiler, binding engine,\n * and component runtime.\n * They are NOT part of the public API and importing directly is an unstable contract.\n *\n * Selected author-facing exports (such as css(), CSSResult, EmitFn, HTMLResult, Directive,\n * ref(), and refs()) are re-exported from the main entry point.\n */\n\nimport { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { fire } from './runtime';\nimport { currentRuntime } from './runtime-core';\n\nconst HTML_RESULT_BRAND: unique symbol = Symbol('craftit.htmlResultBrand');\n\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/**\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// REF TYPES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * A reactive reference to a DOM element.\n *\n * Backed by a Signal — reactivity is built-in. Use with onElement()\n * for first-class element lifecycle management.\n *\n * @example\n * const inputRef = ref<HTMLInputElement>();\n *\n * onElement(inputRef, (input) => {\n * input.focus();\n * return () => { }; // cleanup\n * });\n *\n * // In template\n * <input ref=${inputRef} />\n */\nexport type Ref<T extends Element> = Signal<T | null>;\n\n/**\n * Create a reactive element reference.\n *\n * Returns a Signal that tracks the mounted/unmounted state of a DOM element.\n * Automatically reactive — use directly in effects or with onElement().\n *\n * @see onElement for element lifecycle integration\n *\n * @example\n * const ref = ref<HTMLInputElement>();\n * // Type: Signal<HTMLInputElement | null>\n * // Automatically updates when element mounts/unmounts\n */\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(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\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL DOM & EVENT UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** @internal — Iterate an iterable and call every function in it. */\nexport const runAll = (fns: Iterable<() => void>): void => {\n const callbacks = [...fns];\n\n for (let index = callbacks.length - 1; index >= 0; index--) {\n callbacks[index]?.();\n }\n};\n\n/** @internal — Set an attribute on an element, handling boolean and null values. */\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, name.startsWith('aria-') ? 'true' : '');\n } else {\n el.setAttribute(name, String(val));\n }\n};\n\n/** @internal — Attach an event listener with automatic cleanup. */\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// INTERNAL STRING UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": ''', '\"': '"', '&': '&', '<': '<', '>': '>' };\n\n/** @internal — Escape untrusted text for HTML text/attribute contexts. */\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// INTERNAL EMIT TYPES & HELPERS\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\n/** @internal — Create a type-safe custom event emitter for the current runtime host. */\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// INTERNAL 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\n/** @internal — Compile CSS template strings into a CSSResult. */\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\n/** @internal — Load a stylesheet string or CSSResult into an adoptedStyleSheet. */\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 { type CleanupFn } from '@vielzeug/stateit';\n\nimport { type CSSResult } from './internal';\n\nexport type ComponentRuntime = {\n /** Cleanup functions to run when the component is disconnected. */\n cleanups: CleanupFn[];\n /** The host element instance. */\n el: HTMLElement;\n /** Custom error handlers registered via `onError`. */\n errorHandlers: ((err: unknown) => void)[];\n /** Callbacks to run when the component is connected for the first time or re-connected. */\n onMount: (() => CleanupFn | undefined | void)[];\n /** Stylesheets to apply to the shadow root. */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nexport const runtimeStack: ComponentRuntime[] = [];\n\n/**\n * Returns the current component runtime.\n * Throws if called outside of a component's setup or lifecycle.\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","import {\n effect as _effect,\n onCleanup as _onCleanup,\n signal,\n watch as _watch,\n type CleanupFn,\n type EffectCallback,\n type EffectOptions,\n type ReadonlySignal,\n type Subscription,\n type WatchOptions,\n} from '@vielzeug/stateit';\n\nimport { currentRuntime, runtimeStack } from './runtime-core';\n\ntype NoDetail = void | undefined | never;\ntype HostCustomEventMap<CustomEvents extends Record<string, unknown>> = {\n [K in keyof CustomEvents & string]: [CustomEvents[K]] extends [Event]\n ? CustomEvents[K]\n : [CustomEvents[K]] extends [NoDetail]\n ? CustomEvent<undefined>\n : CustomEvent<CustomEvents[K]>;\n};\n\nexport type HostEventMap<CustomEvents extends Record<string, unknown> = Record<string, never>> = HTMLElementEventMap &\n HostCustomEventMap<CustomEvents>;\n\nexport type HostEventListeners<CustomEvents extends Record<string, unknown> = Record<string, never>> = {\n [K in keyof HostEventMap<CustomEvents>]?: (e: HostEventMap<CustomEvents>[K]) => void;\n};\n\nexport const onMount = (fn: () => CleanupFn | undefined | void): void => {\n currentRuntime().onMount.push(fn);\n};\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\nconst autoCleanup = (dispose: Subscription | CleanupFn): void => {\n if (runtimeStack.length > 0) onCleanup(dispose);\n};\n\nexport const onError = (fn: (err: unknown) => void): void => {\n currentRuntime().errorHandlers.push(fn);\n};\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\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 source: ReadonlySignal<unknown>,\n cb: (value: unknown, prev: unknown) => void,\n options?: WatchOptions<unknown>,\n): Subscription {\n const stop = _watch(source, cb, options);\n\n autoCleanup(stop);\n\n return stop;\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\nexport const createCleanupSignal = () => {\n const cleanup = signal<CleanupFn | null>(null);\n\n const clear = () => {\n cleanup.value?.();\n cleanup.value = null;\n };\n\n const set = (next: CleanupFn | null | undefined) => {\n if (cleanup.value === next) return;\n\n clear();\n cleanup.value = next ?? null;\n };\n\n onCleanup(clear);\n\n return { clear, set, value: cleanup as ReadonlySignal<CleanupFn | null> };\n};\n\nexport const onElement = <T extends HTMLElement>(\n ref: ReadonlySignal<T | null>,\n callback: (el: T) => CleanupFn | undefined | void,\n options?: EffectOptions,\n): Subscription => {\n return effect(() => {\n const el = ref.value;\n\n if (el) return callback(el);\n }, options);\n};\n","export {\n createCleanupSignal,\n effect,\n handle,\n onCleanup,\n onElement,\n onError,\n onMount,\n watch,\n} from './runtime-lifecycle';\nexport type { HostEventListeners, HostEventMap } from './runtime-lifecycle';\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\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 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 * Host utilities — component context injection, slot observation, and attribute/class reflection.\n *\n * - Context API (provide, inject, createContext, syncContextProps)\n * - Slot observation and detection (setup slots)\n * - Host element binding (reflect) for attributes, classes, and host listeners\n */\n\nimport { type ReadonlySignal, type Signal, signal } from '@vielzeug/stateit';\n\nimport { listen, setAttr } from './internal';\nimport { currentRuntime } from './runtime-core';\nimport { effect, onCleanup, onMount, type HostEventListeners } from './runtime-lifecycle';\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 const target = props as Record<K, Signal<unknown>>;\n\n for (const k of keys) {\n const v = ctx[k]?.value;\n\n if (v !== undefined) target[k].value = v;\n }\n });\n });\n};\n\nexport type HostContextAttributeBridge = {\n contextDisabled?: ReadonlySignal<boolean | undefined>;\n contextSize?: ReadonlySignal<string | undefined>;\n contextVariant?: ReadonlySignal<string | undefined>;\n ownDisabled?: ReadonlySignal<boolean | undefined>;\n ownSize?: ReadonlySignal<string | undefined>;\n ownVariant?: ReadonlySignal<string | undefined>;\n};\n\nexport const bridgeContextAttributes = (host: HTMLElement, options: HostContextAttributeBridge): void => {\n let contextDisabledActive = false;\n\n effect(() => {\n const contextDisabled = Boolean(options.contextDisabled?.value);\n\n if (contextDisabled && !contextDisabledActive) {\n host.setAttribute('disabled', '');\n contextDisabledActive = true;\n } else if (!contextDisabled && contextDisabledActive && !options.ownDisabled?.value) {\n host.removeAttribute('disabled');\n contextDisabledActive = false;\n }\n\n const contextSize = options.contextSize?.value;\n const hasOwnSize = Boolean(options.ownSize?.value);\n\n if (contextSize && !hasOwnSize) host.setAttribute('size', contextSize);\n else if (!hasOwnSize) host.removeAttribute('size');\n\n const contextVariant = options.contextVariant?.value;\n const hasOwnVariant = Boolean(options.ownVariant?.value);\n\n if (contextVariant && !hasOwnVariant) host.setAttribute('variant', contextVariant);\n else if (!hasOwnVariant) host.removeAttribute('variant');\n });\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SLOTS API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SLOT_DEFAULT = 'default';\nconst normalizeSlotName = (slotName: string | null | undefined): string => {\n if (!slotName || slotName === SLOT_DEFAULT) return SLOT_DEFAULT;\n\n return slotName;\n};\n\nconst slotsRegistry = new WeakMap<HTMLElement, ComponentSlots>();\n\nexport type ComponentSlots = {\n elements: (name?: string) => ReadonlySignal<Element[]>;\n has: (name?: string) => ReadonlySignal<boolean>;\n};\n\n/**\n * Creates first-class slot signals for setup context.\n *\n * - `slots.has(name?)`: whether a slot has assigned elements\n * - `slots.elements(name?)`: assigned elements for a slot (flattened)\n */\nexport const createSlots = (): ComponentSlots => {\n const host = currentRuntime().el;\n const cached = slotsRegistry.get(host);\n\n if (cached) return cached;\n\n const presenceSignals = new Map<string, Signal<boolean>>();\n const elementSignals = new Map<string, Signal<Element[]>>();\n const slotNodesByName = new Map<string, Set<HTMLSlotElement>>();\n const slotCleanupMap = new Map<HTMLSlotElement, () => void>();\n let isDisposing = false;\n\n const ensurePresenceSignal = (name: string): Signal<boolean> => {\n const normalized = normalizeSlotName(name);\n let s = presenceSignals.get(normalized);\n\n if (!s) {\n s = signal(false);\n presenceSignals.set(normalized, s);\n }\n\n return s;\n };\n\n const ensureElementSignal = (name: string): Signal<Element[]> => {\n const normalized = normalizeSlotName(name);\n let s = elementSignals.get(normalized);\n\n if (!s) {\n s = signal<Element[]>([]);\n elementSignals.set(normalized, s);\n }\n\n return s;\n };\n\n const recomputeSlot = (name: string): void => {\n const normalized = normalizeSlotName(name);\n const slotsForName = slotNodesByName.get(normalized);\n const assigned: Element[] = [];\n\n if (slotsForName) {\n for (const slotEl of slotsForName) {\n assigned.push(...slotEl.assignedElements({ flatten: true }));\n }\n }\n\n ensureElementSignal(normalized).value = assigned;\n ensurePresenceSignal(normalized).value = assigned.length > 0;\n };\n\n const bindSlot = (slotEl: HTMLSlotElement): void => {\n if (slotCleanupMap.has(slotEl)) return;\n\n const name = normalizeSlotName(slotEl.getAttribute('name'));\n const setForName = slotNodesByName.get(name) ?? new Set<HTMLSlotElement>();\n\n setForName.add(slotEl);\n slotNodesByName.set(name, setForName);\n\n const onChange = () => recomputeSlot(name);\n\n slotEl.addEventListener('slotchange', onChange);\n\n const cleanup = () => {\n slotEl.removeEventListener('slotchange', onChange);\n slotCleanupMap.delete(slotEl);\n\n if (isDisposing) return;\n\n const currentSet = slotNodesByName.get(name);\n\n if (!currentSet) return;\n\n currentSet.delete(slotEl);\n\n if (currentSet.size === 0) {\n slotNodesByName.delete(name);\n }\n\n recomputeSlot(name);\n };\n\n slotCleanupMap.set(slotEl, cleanup);\n\n recomputeSlot(name);\n };\n\n const unbindSlot = (slotEl: HTMLSlotElement): void => {\n slotCleanupMap.get(slotEl)?.();\n };\n\n const bindAllSlots = (): void => {\n host.shadowRoot?.querySelectorAll('slot').forEach((slotEl) => bindSlot(slotEl));\n };\n\n ensurePresenceSignal(SLOT_DEFAULT);\n ensureElementSignal(SLOT_DEFAULT);\n\n bindAllSlots();\n\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n mutation.addedNodes.forEach((node) => {\n if (node instanceof HTMLSlotElement) {\n bindSlot(node);\n\n return;\n }\n\n if (node instanceof Element) {\n node.querySelectorAll('slot').forEach((slotEl) => bindSlot(slotEl));\n }\n });\n\n mutation.removedNodes.forEach((node) => {\n if (node instanceof HTMLSlotElement) {\n unbindSlot(node);\n\n return;\n }\n\n if (node instanceof Element) {\n node.querySelectorAll('slot').forEach((slotEl) => unbindSlot(slotEl));\n }\n });\n }\n });\n\n if (host.shadowRoot) {\n observer.observe(host.shadowRoot, { childList: true, subtree: true });\n }\n\n onCleanup(() => {\n isDisposing = true;\n observer.disconnect();\n\n for (const cleanup of [...slotCleanupMap.values()]) cleanup();\n\n slotCleanupMap.clear();\n slotNodesByName.clear();\n });\n\n const slots: ComponentSlots = {\n elements: (name?: string) => ensureElementSignal(normalizeSlotName(name)),\n has: (name?: string) => ensurePresenceSignal(normalizeSlotName(name)),\n };\n\n slotsRegistry.set(host, slots);\n\n return slots;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REFLECT API (HOST ATTRIBUTE/EVENT/CLASS BINDING)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Describes a reactive or static host binding value.\n */\nexport type HostBindingValue =\n | (() => Record<string, boolean>)\n | (() => string | number | boolean | null | undefined)\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for host attribute bindings.\n */\nexport type ReflectConfig = Record<string, HostBindingValue>;\n\nexport type HostBindConfig<CustomEvents extends Record<string, unknown> = Record<string, never>> =\n | { attr: ReflectConfig }\n | { class: () => Record<string, boolean> }\n | { on: HostEventListeners<CustomEvents> };\n\nexport type HostBindTarget = 'attr' | 'class' | 'on';\n\nexport type ComponentHost = {\n bind: {\n <CustomEvents extends Record<string, unknown> = Record<string, never>>(\n config: HostBindConfig<CustomEvents>,\n options?: AddEventListenerOptions,\n ): () => void;\n <CustomEvents extends Record<string, unknown> = Record<string, never>>(\n target: 'attr',\n config: ReflectConfig,\n ): () => void;\n (target: 'class', getter: () => Record<string, boolean>): () => void;\n <CustomEvents extends Record<string, unknown> = Record<string, never>>(\n target: 'on',\n hostEvents: HostEventListeners<CustomEvents>,\n options?: AddEventListenerOptions,\n ): () => void;\n };\n el: HTMLElement;\n shadowRoot: ShadowRoot;\n};\n\nexport const createHost = (): ComponentHost => {\n const el = currentRuntime().el;\n\n return {\n bind: (\n targetOrConfig: HostBindTarget | HostBindConfig,\n configOrOptions?: ReflectConfig | (() => Record<string, boolean>) | HostEventListeners | AddEventListenerOptions,\n maybeOptions?: AddEventListenerOptions,\n ) => {\n const disposers: Array<() => void> = [];\n\n const config =\n typeof targetOrConfig === 'string'\n ? ({ [targetOrConfig]: configOrOptions } as HostBindConfig)\n : (targetOrConfig as HostBindConfig);\n const options =\n typeof targetOrConfig === 'string' && targetOrConfig === 'on'\n ? (maybeOptions as AddEventListenerOptions | undefined)\n : (configOrOptions as AddEventListenerOptions | undefined);\n\n if ('attr' in config) {\n for (const [key, value] of Object.entries(config.attr)) {\n const name =\n key.startsWith('aria-') || key === 'role'\n ? key\n : key.startsWith('aria')\n ? `aria-${key.slice(4).toLowerCase()}`\n : key;\n const dispose = applyAttribute(el, name, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n if ('class' in config) {\n disposers.push(applyClassMap(el, config.class));\n }\n\n if ('on' in config) {\n for (const event of Object.keys(config.on) as Array<keyof typeof config.on>) {\n const listener = config.on[event];\n\n if (!listener) continue;\n\n disposers.push(listen(el, event as string, listener as EventListener, options));\n }\n }\n\n const cleanup = () => {\n while (disposers.length > 0) disposers.pop()?.();\n };\n\n onCleanup(cleanup);\n\n return cleanup;\n },\n el,\n shadowRoot: el.shadowRoot as ShadowRoot,\n };\n};\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n if (typeof value === 'function') {\n return 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 return 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","import { type Signal, signal } from '@vielzeug/stateit';\n\nimport { setAttr, toKebab } from './internal';\nimport { currentRuntime } from './runtime-core';\nimport { effect } from './runtime-lifecycle';\n\nexport type PropOptions<T> = {\n /** When `true`, removes the host attribute instead of setting it to `\"\"` when 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 OptionalKeys<T extends Record<string, unknown>> = {\n [K in keyof T]-?: Pick<T, K> extends Required<Pick<T, K>> ? never : K;\n}[keyof T];\n\nexport type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;\n\nexport type PropsInput<T extends Record<string, unknown>> = {\n [K in RequiredKeys<T>]-?: T[K] | PropDef<T[K]>;\n} & {\n [K in OptionalKeys<T>]-?: T[K] | PropDef<T[K] | undefined> | undefined;\n};\n\nexport type PropDef<T> = PropOptions<T> & { default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\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\nconst PROP_DEF_KEYS = new Set(['default', 'omit', 'parse', 'reflect', 'type']);\nconst warnedStructuredReflectProps = new Set<string>();\n\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\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\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 if (options?.type === Boolean) return (v === '' || v === 'true') as T;\n\n if (typeof defaultValue === 'boolean') return (v !== null && v !== 'false') as T;\n\n if (v == null) return defaultValue;\n\n if (options?.type === Number || typeof defaultValue === 'number') return Number(v) as T;\n\n return v as unknown as T;\n });\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 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 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 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 InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\ntype RefineOptionalPropFromDefault<Value, Def> = undefined extends Value\n ? undefined extends InferDefaultFromDef<Def>\n ? Value\n : Exclude<Value, undefined>\n : Value;\n\ntype InferPropSignalValue<Props extends Record<string, unknown>, Key extends PropertyKey, Def> = Key extends keyof Props\n ? RefineOptionalPropFromDefault<Props[Key], Def>\n : InferDefaultFromDef<Def>;\n\ntype ResolvePropValue<\n Props extends Record<string, unknown>,\n PropDefs extends Record<string, unknown>,\n Key extends PropertyKey,\n> = Key extends keyof PropDefs\n ? InferPropSignalValue<Props, Key, PropDefs[Key]>\n : Key extends keyof Props\n ? Props[Key]\n : never;\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n [K in keyof T]: Signal<T[K]>;\n};\n\nexport type ComponentProps<T extends Record<string, unknown>> = InferPropsSignals<T>;\n\nexport function createProps<D extends PropInputDefs>(defs: D): ComponentProps<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n const tag = currentRuntime().el.localName;\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\n if (descriptor.reflect === true && hasStructuredDefault) {\n const warningKey = `${tag}:${String(name)}`;\n\n if (!warnedStructuredReflectProps.has(warningKey)) {\n warnedStructuredReflectProps.add(warningKey);\n console.warn(\n `[craftit] props.${warningKey} requested reflect: true for a structured default; reflection is disabled.`,\n );\n }\n }\n\n const propDef: PropOptions<unknown> = { reflect: !hasStructuredDefault, ...descriptor };\n\n const signalRef = prop(toKebab(name), descriptor.default, propDef);\n\n props[name] = signalRef;\n }\n\n return props as ComponentProps<InferPropsFromDefs<D>>;\n}\n\ntype InferDefaultFromDef<Def> = Def extends PropDef<infer U> ? U : InferPropValue<Def>;\n\nexport type InferSignalsFromPropInputs<Props extends Record<string, unknown>, Defs extends Record<string, unknown>> = {\n [K in keyof Defs]-?: Signal<InferPropSignalValue<Props, K, Defs[K]>>;\n};\n\nexport type ResolveComponentProps<Props extends Record<string, unknown>, PropDefs extends PropInputDefs> = [\n keyof Props,\n] extends [never]\n ? InferPropsFromDefs<PropDefs>\n : {\n [K in keyof Props | keyof PropDefs]: ResolvePropValue<Props, PropDefs, K>;\n };\n","import { type ComputedSignal, type ReadonlySignal, type Signal, effect } from '@vielzeug/stateit';\n\nimport { currentRuntime } from './runtime-core';\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 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 define(..., { 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 const disabled = options.disabled;\n\n if (disabled) {\n effect(() => {\n if (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","import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { listen } from './internal';\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>();\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 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 { effect as rawEffect, type CleanupFn, type ReadonlySignal, untrack } from '@vielzeug/stateit';\n\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 { listen, setAttr } from './internal';\nimport { propRegistry } from './props';\nimport { bindPropertyModel } from './runtime-bindings';\nimport { indexBindings, type BindingTargets } from './template-dom';\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(rawEffect(() => 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 (\n !Object.is(\n untrack(() => meta.signal.value),\n parsedValue,\n )\n ) {\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\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\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// ─── 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, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport {\n CF_ID_ATTR,\n EACH_SIGNAL,\n escapeHtml,\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';\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 = (getter: () => unknown): { bindings: Binding[]; signal: ReadonlySignal<any> } => {\n let cached = { bindings: [] as Binding[], html: '' };\n const fnSignal = computed(() => {\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 }\n\n return cached;\n });\n\n return { bindings: [], signal: fnSignal };\n};\n\nconst createHtmlWrapperSignal = (\n value: unknown,\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);\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\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 = (strings: TemplateStringsArray, values: unknown[]): 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 = computed(() => {\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 }\n\n return cached;\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);\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 { runAll } from './internal';\nimport { applyBindingsInContainer, 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';\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 */\nexport const applyHtmlBinding = (\n root: Node,\n b: HtmlBinding,\n registerCleanup: RegisterCleanup,\n keyedStates: Map<string, Map<string | number, KeyedNode>>,\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 && 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) => applyHtmlBinding(container, binding, registerInnerCleanup, keyedStates),\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 HtmlBinding, type HTMLResult } from './internal';\nimport { applyBindingsInContainer as applyBindingsInContainerImpl, type RegisterCleanup } from './template-bindings';\nimport { compileTemplate } from './template-compiler';\nimport { applyHtmlBinding as applyHtmlBindingImpl, type KeyedNode } from './template-html';\n\n// ─── Re-exports for consumers ─────────────────────────────────────────────────\nexport type { KeyedNode };\nexport const applyBindingsInContainer = applyBindingsInContainerImpl;\n\n// ─── Template compilation ─────────────────────────────────────────────────────\n\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]): HTMLResult =>\n compileTemplate(strings, values);\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);\n};\n","import { type CleanupFn, untrack } from '@vielzeug/stateit';\n\nimport { formCallbackRegistry } from './form';\nimport { type CSSResult, type HTMLResult, htmlResult, loadStylesheet, runAll } from './internal';\nimport { propRegistry } from './props';\nimport { runtimeStack, type ComponentRuntime } from './runtime-core';\nimport { applyBindingsInContainer, applyHtmlBinding } from './template';\nimport { type RegisterCleanup } from './template-bindings';\nimport { parseHTML } from './template-dom';\nimport { type KeyedNode } from './template-html';\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\n /** Custom options for a 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\ntype ComponentSetupResult = string | HTMLResult;\n\nclass BaseElement extends HTMLElement {\n static _options?: ComponentRegistrationOptions;\n static _setup: () => ComponentSetupResult;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _appliedHtmlBindings = new Set<string>();\n private _keyedStates = new Map<string, Map<string | number, KeyedNode>>();\n private _mountFns: (() => CleanupFn | undefined | void)[] = [];\n private _runtime: ComponentRuntime;\n private _rendered = false;\n private _setupDone = false;\n private _template: ComponentSetupResult | null = null;\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 untrack(() => {\n if (!this._setupDone) this._runSetup();\n\n this._init();\n });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n const propMeta = propRegistry.get(this)?.get(name);\n\n if (!propMeta) return;\n\n const parsed = propMeta.parse(newValue);\n\n if (\n !Object.is(\n untrack(() => propMeta.signal.value),\n parsed,\n )\n ) {\n propMeta.signal.value = parsed as never;\n }\n }\n\n disconnectedCallback(): void {\n runAll(this._runtime.cleanups);\n this._runtime.cleanups = [];\n this._runtime.onMount = this._mountFns.slice();\n this._appliedHtmlBindings.clear();\n this._keyedStates.clear();\n this._rendered = false;\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 throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n private _runSetup(): void {\n this._setupDone = true;\n runtimeStack.push(this._runtime as any);\n\n try {\n const options = (this.constructor as typeof BaseElement)._options;\n const { host: hostOptions } = 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 result = (this.constructor as typeof BaseElement)._setup();\n\n if (typeof result === 'string' || (typeof result === 'object' && result !== null && '__html' in result)) {\n this._template = result as ComponentSetupResult;\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 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 if (!this._rendered) {\n this.shadow.replaceChildren(parseHTML(result.__html));\n this._rendered = true;\n }\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: (binding) => {\n if (!this._appliedHtmlBindings.has(binding.uid)) {\n this._appliedHtmlBindings.add(binding.uid);\n applyHtmlBinding(this.shadow, binding, registerCleanup, this._keyedStates);\n }\n },\n });\n }\n }\n\n queueMicrotask(() => {\n runtimeStack.push(this._runtime as any);\n\n try {\n const mountFns = this._runtime.onMount;\n\n this._mountFns = mountFns.slice();\n\n for (const mountFn of mountFns) {\n const cleanup = mountFn();\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/** @internal — use define() instead. */\nexport function registerComponent(\n tag: string,\n setup: () => ComponentSetupResult,\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 return tag;\n }\n\n class Element extends BaseElement {\n static override _options = options;\n static override _setup = setup;\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 * Component authoring API — define custom elements, props, and registration.\n */\n\nimport { type ComponentHost, type ComponentSlots, createHost, createSlots } from './host';\nimport { type EmitFn, type HTMLResult, createEmitFn, toKebab } from './internal';\nimport {\n createProps,\n type ComponentProps,\n type InferPropsFromDefs,\n type InferPropsSignals,\n type PropDef,\n type PropInputDefs,\n type PropOptions,\n type PropsInput,\n type ResolveComponentProps,\n} from './props';\nimport { type ComponentRegistrationOptions, registerComponent } from './registration';\n\nexport { createProps, type PropsInput };\nexport type {\n InferPropsFromDefs,\n InferPropsSignals,\n ComponentProps,\n PropDef,\n PropInputDefs,\n PropOptions,\n ResolveComponentProps,\n};\nexport { registerComponent, type ComponentRegistrationOptions };\n\n/**\n * Unified setup context passed to component setup functions.\n */\nexport type ComponentSetupContext<\n P extends Record<string, unknown> = Record<never, never>,\n E extends Record<string, unknown> = Record<string, never>,\n D extends PropInputDefs = PropsInput<P>,\n> = {\n emit: EmitFn<E>;\n host: ComponentHost;\n props: ComponentProps<ResolveComponentProps<P, D>>;\n shadowRoot: ShadowRoot;\n slots: ComponentSlots;\n};\n\n/**\n * Configuration object for define().\n */\nexport type ComponentOptions<\n Props extends Record<string, unknown> = Record<never, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n PropDefs extends PropInputDefs = PropsInput<Props>,\n> = {\n formAssociated?: boolean;\n host?: Record<string, string | boolean | number>;\n props?: PropDefs;\n setup: (ctx: ComponentSetupContext<ResolveComponentProps<Props, PropDefs>, Emits, PropDefs>) => string | HTMLResult;\n shadow?: Omit<ShadowRootInit, 'mode'>;\n styles?: (string | CSSStyleSheet | import('./internal').CSSResult)[];\n};\n\nexport type ComponentDefinition<\n Props extends Record<string, unknown> = Record<never, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n PropDefs extends PropInputDefs = PropsInput<Props>,\n> = ComponentOptions<Props, Emits, PropDefs>;\n\nconst defineInternal = <\n Props extends Record<string, unknown> = Record<never, never>,\n EventsType extends Record<string, unknown> = Record<string, never>,\n PropDefs extends PropInputDefs = PropsInput<Props>,\n>(\n tag: string,\n definition: ComponentDefinition<Props, EventsType, PropDefs> & { props?: PropDefs },\n): string => {\n const { formAssociated, host: hostOptions, props: propDefs, setup, shadow: shadowOptions, styles } = definition;\n\n const observedAttrs = propDefs ? Object.keys(propDefs).map(toKebab) : [];\n\n return registerComponent(\n tag,\n () => {\n const props = propDefs ? createProps(propDefs) : ({} as ComponentProps<ResolveComponentProps<Props, PropDefs>>);\n const emit = createEmitFn<EventsType>();\n const host = createHost();\n let slotsApi: ComponentSlots | undefined;\n const slots: ComponentSlots = {\n elements: (name?: string) => {\n if (!slotsApi) slotsApi = createSlots();\n\n return slotsApi.elements(name);\n },\n has: (name?: string) => {\n if (!slotsApi) slotsApi = createSlots();\n\n return slotsApi.has(name);\n },\n };\n\n return setup({\n emit: emit as EmitFn<EventsType>,\n host,\n props: props as ComponentProps<ResolveComponentProps<Props, PropDefs>>,\n shadowRoot: host.shadowRoot,\n slots,\n } as ComponentSetupContext<ResolveComponentProps<Props, PropDefs>, EventsType, PropDefs>);\n },\n {\n formAssociated,\n host: hostOptions,\n observedAttrs,\n shadow: shadowOptions,\n styles,\n } satisfies ComponentRegistrationOptions,\n );\n};\n\nexport function define<\n Props extends Record<string, unknown> = Record<never, never>,\n EventsType extends Record<string, unknown> = Record<string, never>,\n const PropDefs extends PropInputDefs = PropsInput<Props>,\n>(tag: string, definition: ComponentDefinition<Props, EventsType, PropDefs> & { props: PropDefs }): string;\nexport function define<\n Props extends Record<string, unknown> = Record<never, never>,\n EventsType extends Record<string, unknown> = Record<string, never>,\n PropDefs extends PropInputDefs = PropsInput<Props>,\n>(tag: string, definition: ComponentDefinition<Props, EventsType, PropDefs> & { props?: PropDefs }): string;\nexport function define<\n Props extends Record<string, unknown> = Record<never, never>,\n EventsType extends Record<string, unknown> = Record<string, never>,\n PropDefs extends PropInputDefs = PropsInput<Props>,\n>(tag: string, definition: ComponentDefinition<Props, EventsType, PropDefs> & { props?: PropDefs }): string {\n return defineInternal(tag, definition);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"craftit.js","names":[],"sources":["../src/errors.ts","../src/internal.ts","../src/runtime.ts","../src/host.ts","../src/props.ts","../src/directives/live.ts","../src/template-bindings.ts","../src/registration.ts","../src/form.ts","../src/template-compiler.ts","../src/directives/each.ts","../src/directives/classMap.ts","../src/directives/styleMap.ts","../src/directives/when.ts","../src/directives/guard.ts","../src/directives/resource.ts","../src/directives/raw.ts"],"sourcesContent":["export const CRAFTIT_ERRORS = {\n cleanupFailed: 'One or more cleanup callbacks failed during dispose',\n defineDuplicate: (tag: string): string => `define('${tag}') was called more than once`,\n defineFieldRequiresFormAssociated: (tag: string): string =>\n `defineField() requires define('${tag}', { formAssociated: true })`,\n defineRequiresTag: 'define() requires a non-empty tag name',\n eachDuplicateKey: (key: string, index: number): string => `each() received duplicate key \"${key}\" at index ${index}`,\n injectStrictFailed: (key: string, tag: string): string => `injectStrict() could not resolve key \"${key}\" in <${tag}>`,\n lifecycleOutsideSetup: 'Lifecycle hooks must be called synchronously during component setup',\n styleReplaceFailed: 'Style sheet replace failed',\n unhandledComponentError: (tag: string): string => `<${tag}> threw an unhandled error during setup`,\n} as const;\n","import { signal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { currentElementOrThrow } from './runtime';\n\nexport type Ref<T extends Element> = Signal<T | null>;\n\nexport function ref<T extends Element>(): Ref<T> {\n return signal<T | null>(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\nexport type TextBinding = {\n signal: ReadonlySignal<unknown>;\n type: 'text';\n uid: string;\n};\n\nexport type AttrBinding = {\n /** When true the binding uses live-write semantics: stale app-state writes are\n * skipped if the DOM value has diverged from the last programmatic write. */\n live?: true;\n mode: 'bool' | 'attr';\n name: string;\n signal?: ReadonlySignal<unknown>;\n type: 'attr';\n uid: string;\n value?: unknown;\n};\n\nexport type EventBinding = {\n handler: (e: Event) => void;\n name: string;\n options?: AddEventListenerOptions;\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 HtmlBindingPayload = {\n bindings: Binding[];\n html: string;\n};\n\nexport type RuntimeDirective = {\n __craftitDirective: true;\n mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;\n};\n\nexport type DirectiveResult = RuntimeDirective;\n\nexport const isDirectiveResult = (value: unknown): value is DirectiveResult =>\n typeof value === 'object' &&\n value !== null &&\n (value as RuntimeDirective).__craftitDirective === true &&\n typeof (value as RuntimeDirective).mount === 'function';\n\nexport type HtmlBinding = {\n signal: ReadonlySignal<HtmlBindingPayload>;\n type: 'html';\n uid: string;\n};\n\nexport type DirectiveBinding = {\n directive: RuntimeDirective;\n type: 'directive';\n uid: string;\n};\n\nexport type Binding = TextBinding | AttrBinding | EventBinding | RefBinding | HtmlBinding | DirectiveBinding;\n\nexport interface HTMLResult {\n __bindings: Binding[];\n __craftitHtmlResult: true;\n __html: string;\n toString(): string;\n}\n\nexport function htmlResult(html: string, bindings: Binding[] = []): HTMLResult {\n return {\n __bindings: bindings,\n __craftitHtmlResult: true,\n __html: html,\n toString() {\n return html;\n },\n };\n}\n\nexport const isHtmlResult = (value: unknown): value is HTMLResult =>\n typeof value === 'object' && value !== null && (value as HTMLResult).__craftitHtmlResult === true;\n\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\nexport type CSSResult = {\n __craftitCssResult: true;\n content: string;\n toString(): string;\n};\n\nexport const isCssResult = (value: unknown): value is CSSResult =>\n typeof value === 'object' && !!value && (value as CSSResult).__craftitCssResult === true;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// DOM UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport const runAll = (fns: (() => void)[]): void => {\n const errors: unknown[] = [];\n\n for (let i = fns.length - 1; i >= 0; i--) {\n try {\n fns[i]();\n } catch (err) {\n errors.push(err);\n }\n }\n\n if (errors.length > 0) {\n throw new AggregateError(errors, CRAFTIT_ERRORS.cleanupFailed);\n }\n};\n\nexport const removeNodes = (nodes: Node[]): void => {\n for (const node of nodes) {\n (node as ChildNode).remove();\n }\n};\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\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 {\n el.setAttribute(name, val === true ? 'true' : String(val));\n }\n};\n\nexport const listen = (\n el: EventTarget | null | undefined,\n name: string,\n handler: (e: any) => void,\n options?: AddEventListenerOptions,\n): (() => void) => {\n if (!el) return () => {};\n\n const listener: EventListener = handler as EventListener;\n\n el.addEventListener(name, listener, options);\n\n return () => el.removeEventListener(name, listener, options);\n};\n\nexport const toKebab = (str: string): string => str.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`);\n\nconst ESC: Record<string, string> = { \"'\": ''', '\"': '"', '&': '&', '<': '<', '>': '>' };\n\nexport const escapeHtml = (value: unknown): string => String(value).replace(/[&<>\"']/g, (c) => ESC[c]);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// EMIT UTILITIES\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\ntype StrictEmitFn<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\ntype LooseEmitFn = (event: string, detail?: unknown) => void;\n\nexport type EmitFn<T extends Record<string, unknown>> = StrictEmitFn<T> & LooseEmitFn;\n\nexport const createEmitFn = <T extends Record<string, unknown>>(): EmitFn<T> => {\n const el = currentElementOrThrow();\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// FIRE UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype FireDefaults = Pick<EventInit, 'bubbles' | 'cancelable' | 'composed'>;\n\nexport type FireApi = {\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\nexport const fire: FireApi = {\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// ─────────────────────────────────────────────────────────────────────────────\n// ID UTILITIES\n// ─────────────────────────────────────────────────────────────────────────────\n\nlet _idCounter = 0;\n\nexport const _resetIdCounter = (): void => {\n _idCounter = 0;\n};\n\nexport const createId = (prefix?: string): string => `${prefix ? `${prefix}-` : 'cft-'}${++_idCounter}`;\n\nexport const CF_ID_ATTR = 'u';\n\nconst ATTR_ID_RE = new RegExp(`${CF_ID_ATTR}=\"([^\"]+)\"`, 'g');\n\nexport const createMarkerIdFactory = (): (() => string) => {\n let n = 0;\n\n return () => String(n++);\n};\n\nexport const rekeyHtmlResult = (result: HTMLResult, getNextId: () => string): { bindings: Binding[]; html: string } => {\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\n// ─────────────────────────────────────────────────────────────────────────────\n// CSS UTILITIES\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 += isCssResult(v) ? v.content : (v ?? '');\n }\n }\n\n return { __craftitCssResult: true as const, 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 } catch (err) {\n console.error(CRAFTIT_ERRORS.styleReplaceFailed, err);\n }\n\n stylesheetStringCache.set(cssText, sheet);\n\n return sheet;\n};\n","import {\n effect as _effect,\n onCleanup as _onCleanup,\n type CleanupFn,\n type EffectCallback,\n type ReadonlySignal,\n type Subscription,\n} from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { fire, listen as listenInternal } from './internal';\n\nexport { fire };\n\nlet currentElement: HTMLElement | null = null;\nlet currentScope: RuntimeScope | null = null;\n\nexport type OnMountedCallback = () => CleanupFn | void;\n\nexport type RuntimeScope = {\n element: HTMLElement;\n mountCallbacks: OnMountedCallback[];\n};\n\nexport const withCurrentElement = <T>(el: HTMLElement, fn: () => T): T => {\n const previous = currentElement;\n\n currentElement = el;\n\n try {\n return fn();\n } finally {\n currentElement = previous;\n }\n};\n\nexport const currentElementOrThrow = (): HTMLElement => {\n if (currentElement) return currentElement;\n\n throw new Error(CRAFTIT_ERRORS.lifecycleOutsideSetup);\n};\n\n/** @internal */\nexport const withRuntimeScope = <T>(runtimeScope: RuntimeScope, fn: () => T): T => {\n const prev = currentScope;\n\n currentScope = runtimeScope;\n\n try {\n return fn();\n } finally {\n currentScope = prev;\n }\n};\n\nexport const tryRegisterCleanup = (fn: CleanupFn): boolean => {\n if (!currentScope) return false;\n\n _onCleanup(fn);\n\n return true;\n};\n\n/**\n * Register a cleanup function to be called on component disconnect.\n * Must be called synchronously during component setup or inside scope.run().\n */\nexport const onCleanup = _onCleanup;\n\n/**\n * Register work to run after the component template mounts.\n * Multiple callbacks are supported and run in registration order.\n */\nexport const onMounted = (fn: OnMountedCallback): void => {\n if (!currentScope) throw new Error(CRAFTIT_ERRORS.lifecycleOutsideSetup);\n\n currentScope.mountCallbacks.push(fn);\n};\n\nexport const effect = (fn: EffectCallback): Subscription => {\n const dispose = _effect(() => {\n return fn();\n });\n\n tryRegisterCleanup(dispose);\n\n return dispose;\n};\n\nexport function on<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 on(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): void {\n if (!currentScope) throw new Error(CRAFTIT_ERRORS.lifecycleOutsideSetup);\n\n if (!target) return;\n\n const cleanup = listenInternal(target, event, listener, options);\n\n tryRegisterCleanup(cleanup);\n}\n\n/**\n * Attaches an event listener and returns a disposal function.\n * Unlike `on()`, this does not require a runtime scope and cleanup must be\n * managed manually by calling the returned function.\n */\nexport function listen<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 listen(\n target: EventTarget | null | undefined,\n event: string,\n listener: EventListener,\n options?: AddEventListenerOptions,\n): () => void {\n return listenInternal(target, event, listener, options);\n}\n\nexport const onElement = <T extends HTMLElement>(\n ref: ReadonlySignal<T | null>,\n callback: (el: T) => CleanupFn | undefined | void,\n): Subscription => {\n return effect(() => {\n const el = ref.value;\n\n if (el) return callback(el);\n });\n};\n","/**\n * Host utilities — component context injection, slot observation, and attribute/class reflection.\n *\n * - Context API (provide, inject, createContext)\n * - Slot observation and detection (setup slots)\n * - Host element binding (reflect) for attributes, classes, and host listeners\n */\n\nimport { effect as rawEffect, type ReadonlySignal, type Signal, isSignal, signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { listen, setAttr, toKebab } from './internal';\nimport { currentElementOrThrow, effect, onCleanup, onMounted, tryRegisterCleanup } from './runtime';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// CONTEXT API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst contextRegistry = new WeakMap<HTMLElement, Map<InjectionKey<unknown>, unknown>>();\n\nexport type InjectionKey<T> = symbol & {\n readonly __craftit_injection_key?: T;\n};\n\nexport const provide = <T>(key: InjectionKey<T>, value: T): void => {\n const el = currentElementOrThrow();\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>): T | undefined;\nexport function inject<T>(key: InjectionKey<T>, fallback: T): T;\nexport function inject<T>(key: InjectionKey<T>, ...rest: [T?]): T | undefined {\n let node: Node | null = currentElementOrThrow();\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 const injectStrict = <T>(key: InjectionKey<T>): T => {\n const resolved = inject<T>(key);\n\n if (resolved !== undefined) return resolved;\n\n const host = currentElementOrThrow();\n\n throw new Error(CRAFTIT_ERRORS.injectStrictFailed(String(key), host.localName));\n};\n\nexport function createContext<T>(description?: string): InjectionKey<T> {\n return Symbol(description) as InjectionKey<T>;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// ARIA SYNC\n// ─────────────────────────────────────────────────────────────────────────────\n\ntype AriaValue = string | number | boolean | null | undefined | (() => string | number | boolean | null | undefined);\n\ntype AriaConfig = Record<string, AriaValue>;\n\ntype SyncAriaOptions = {\n autoCleanup?: boolean;\n};\n\nconst toAriaAttr = (key: string): string => {\n if (key === 'role' || key.startsWith('aria-')) return key;\n\n return key.startsWith('aria') ? `aria-${key.slice(4).toLowerCase()}` : `aria-${key}`;\n};\n\nconst toHostAttr = (key: string): string => {\n if (key === 'role' || key.startsWith('aria-')) return key;\n\n return key.startsWith('aria') ? `aria-${key.slice(4).toLowerCase()}` : key;\n};\n\nconst setA11yAttr = (target: Element, key: string, value: string | number | boolean | null | undefined): void => {\n if (value == null || value === false) {\n target.removeAttribute(key);\n\n return;\n }\n\n target.setAttribute(key, value === true ? 'true' : String(value));\n};\n\n/**\n * Reactively syncs ARIA attributes to a target element.\n * Static values are set immediately; getter functions are tracked as effects.\n * Returns a cleanup function that removes all reactive bindings.\n *\n * @example\n * syncAria(element, {\n * role: 'button',\n * expanded: () => isOpen.value,\n * disabled: () => isDisabled.value,\n * });\n */\nexport const syncAria = (target: Element, config: AriaConfig, options: SyncAriaOptions = {}): (() => void) => {\n const { autoCleanup = true } = options;\n const disposers: Array<() => void> = [];\n\n for (const [rawKey, rawValue] of Object.entries(config)) {\n const key = toAriaAttr(rawKey);\n\n if (typeof rawValue === 'function') {\n const getter = rawValue as () => string | number | boolean | null | undefined;\n\n disposers.push(\n rawEffect(() => {\n setA11yAttr(target, key, getter());\n }),\n );\n\n continue;\n }\n\n setA11yAttr(target, key, rawValue as string | number | boolean | null | undefined);\n }\n\n const cleanup = () => {\n while (disposers.length > 0) disposers.pop()?.();\n };\n\n if (autoCleanup) tryRegisterCleanup(cleanup);\n\n return cleanup;\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// SLOTS API\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst SLOT_DEFAULT = 'default';\nconst normalizeSlotName = (slotName: string | null | undefined): string => slotName || SLOT_DEFAULT;\n\nexport type ComponentSlots = {\n elements: (name?: string) => ReadonlySignal<Element[]>;\n has: (name?: string) => ReadonlySignal<boolean>;\n};\n\n/**\n * Creates first-class slot signals for setup context.\n *\n * - `slots.has(name?)`: whether a slot has assigned elements\n * - `slots.elements(name?)`: assigned elements for a slot (flattened)\n */\nexport const createSlots = (): ComponentSlots => {\n const host = currentElementOrThrow();\n\n type SlotEntry = {\n elements: Signal<Element[]>;\n presence: Signal<boolean>;\n };\n\n const slotSignals = new Map<string, SlotEntry>();\n const slotNodesByName = new Map<string, Set<HTMLSlotElement>>();\n const slotCleanupMap = new Map<HTMLSlotElement, () => void>();\n\n const ensureSlotEntry = (normalizedName: string): SlotEntry => {\n let entry = slotSignals.get(normalizedName);\n\n if (!entry) {\n entry = {\n elements: signal<Element[]>([]),\n presence: signal(false),\n };\n slotSignals.set(normalizedName, entry);\n }\n\n return entry;\n };\n\n const areElementsEqual = (prev: Element[], next: Element[]): boolean => {\n if (prev.length !== next.length) return false;\n\n for (let i = 0; i < prev.length; i++) {\n if (prev[i] !== next[i]) return false;\n }\n\n return true;\n };\n\n const recomputeSlot = (name: string): void => {\n const normalized = normalizeSlotName(name);\n const slotsForName = slotNodesByName.get(normalized);\n const assigned: Element[] = [];\n\n if (slotsForName) {\n for (const slotEl of slotsForName) {\n assigned.push(...slotEl.assignedElements({ flatten: true }));\n }\n }\n\n const entry = ensureSlotEntry(normalized);\n\n if (!areElementsEqual(entry.elements.value, assigned)) entry.elements.value = assigned;\n\n const hasElements = assigned.length > 0;\n\n if (entry.presence.value !== hasElements) entry.presence.value = hasElements;\n };\n\n const bindSlot = (slotEl: HTMLSlotElement): void => {\n if (slotCleanupMap.has(slotEl)) return;\n\n const name = normalizeSlotName(slotEl.getAttribute('name'));\n const setForName = slotNodesByName.get(name) ?? new Set<HTMLSlotElement>();\n\n setForName.add(slotEl);\n slotNodesByName.set(name, setForName);\n\n const onChange = () => recomputeSlot(name);\n\n slotEl.addEventListener('slotchange', onChange);\n\n slotCleanupMap.set(slotEl, () => {\n slotEl.removeEventListener('slotchange', onChange);\n });\n\n recomputeSlot(name);\n };\n\n const bindAllSlots = (): void => {\n host.shadowRoot?.querySelectorAll('slot').forEach((slotEl) => bindSlot(slotEl));\n };\n\n const recomputeAllSlots = (): void => {\n for (const name of slotNodesByName.keys()) {\n recomputeSlot(name);\n }\n };\n\n // setup() runs before the template is rendered, so bind once now (if any slots\n // already exist) and schedule another pass after first render.\n bindAllSlots();\n onMounted(() => {\n bindAllSlots();\n recomputeAllSlots();\n });\n\n onCleanup(() => {\n for (const cleanup of slotCleanupMap.values()) cleanup();\n\n slotCleanupMap.clear();\n slotNodesByName.clear();\n });\n\n return {\n elements: (name?: string) => ensureSlotEntry(normalizeSlotName(name)).elements,\n has: (name?: string) => ensureSlotEntry(normalizeSlotName(name)).presence,\n };\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// REFLECT API (HOST ATTRIBUTE/EVENT/CLASS BINDING)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Describes a reactive or static host binding value.\n */\nexport type HostBindingValue =\n | (() => string | number | boolean | null | undefined)\n | ReadonlySignal<string | number | boolean | null | undefined>\n | string\n | number\n | boolean\n | null\n | undefined;\n\n/**\n * Configuration for host attribute bindings.\n */\nexport type ReflectConfig = Record<string, HostBindingValue>;\n\n/**\n * Describes a reactive property accessor binding on the host element.\n * The getter is called lazily; the optional setter is used when external code\n * assigns `element.propName = value`.\n */\nexport type HostPropDescriptor<T = unknown> = {\n get: () => T;\n set?: (value: T) => void;\n};\n\ntype HostClassBindingValue = ReadonlySignal<boolean> | (() => boolean) | boolean;\ntype HostEventListener = (event: any) => void;\n\nexport type HostBindConfig = {\n attr?: ReflectConfig;\n class?: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>;\n on?: Record<string, HostEventListener | undefined>;\n prop?: Record<string, HostPropDescriptor>;\n style?: Record<string, HostBindingValue>;\n};\n\nexport type ComponentHost = {\n bind: (config: HostBindConfig, options?: AddEventListenerOptions) => () => void;\n el: HTMLElement;\n};\n\nexport const createHost = (): ComponentHost => {\n const el = currentElementOrThrow();\n\n const bind = (config: HostBindConfig, options?: AddEventListenerOptions): (() => void) => {\n const disposers: Array<() => void> = [];\n\n if (config.attr) {\n for (const [key, value] of Object.entries(config.attr)) {\n const name = toHostAttr(key);\n const dispose = applyAttribute(el, name, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n if (config.class) {\n disposers.push(applyClassMap(el, config.class));\n }\n\n if (config.prop) {\n for (const [key, descriptor] of Object.entries(config.prop)) {\n const { get, set } = descriptor;\n\n Object.defineProperty(el, key, {\n configurable: true,\n enumerable: true,\n get,\n ...(set ? { set } : {}),\n });\n\n disposers.push(() => {\n const descriptor = Object.getOwnPropertyDescriptor(el, key);\n\n if (!descriptor || descriptor.get !== get || descriptor.set !== set) return;\n\n delete (el as unknown as Record<string, unknown>)[key];\n });\n }\n }\n\n if (config.on) {\n for (const event of Object.keys(config.on) as Array<keyof typeof config.on>) {\n const listener = config.on[event];\n\n if (!listener) continue;\n\n disposers.push(listen(el, event as string, listener as EventListener, options));\n }\n }\n\n if (config.style) {\n for (const [key, value] of Object.entries(config.style)) {\n const dispose = applyStyle(el, key, value);\n\n if (dispose) disposers.push(dispose);\n }\n }\n\n const cleanup = () => {\n while (disposers.length > 0) disposers.pop()?.();\n };\n\n onCleanup(cleanup);\n\n return cleanup;\n };\n\n return {\n bind,\n el,\n };\n};\n\nconst applyReactiveBinding = (\n value: HostBindingValue,\n updater: (next: string | number | boolean | null | undefined) => void,\n): (() => void) | void => {\n if (typeof value === 'function') {\n return effect(() => updater(value()));\n }\n\n if (isSignal(value)) {\n return effect(() => updater(value.value));\n }\n\n updater(value);\n};\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n return applyReactiveBinding(value, (next) => setAttr(host, name, next));\n}\n\nfunction applyStyle(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | void {\n // Normalize camelCase property names to kebab-case for CSS setProperty.\n // CSS custom properties (--foo) are already kebab-case, so leave them as-is.\n const cssName = name.startsWith('--') ? name : toKebab(name);\n\n // Track whether this binding has ever written a value to the inline style.\n // This prevents removeProperty() from wiping an external inline style that\n // the component never set (e.g. user-authored style=\"grid-area: main;\").\n let owned = false;\n\n const setStyle = (v: any) => {\n if (v != null && v !== '') {\n owned = true;\n host.style.setProperty(cssName, String(v));\n } else if (owned) {\n host.style.removeProperty(cssName);\n }\n };\n\n return applyReactiveBinding(value, setStyle);\n}\n\nfunction applyClassMap(\n host: HTMLElement,\n value: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>,\n): () => void {\n const getMap =\n typeof value === 'function'\n ? value\n : (): Record<string, boolean> => {\n const result: Record<string, boolean> = {};\n\n for (const [cls, entry] of Object.entries(value)) {\n result[cls] = typeof entry === 'function' ? entry() : isSignal(entry) ? entry.value : Boolean(entry);\n }\n\n return result;\n };\n\n let prev = new Set<string>();\n\n return effect(() => {\n const next = new Set<string>();\n\n for (const [cls, active] of Object.entries(getMap())) {\n if (!active) continue;\n\n next.add(cls);\n\n if (!prev.has(cls)) host.classList.add(cls);\n }\n\n for (const cls of prev) {\n if (!next.has(cls)) host.classList.remove(cls);\n }\n\n prev = next;\n });\n}\n","import { type Signal, signal } from '@vielzeug/stateit';\n\nimport { setAttr, toKebab } from './internal';\nimport { currentElementOrThrow, effect } from './runtime';\n\nexport type PropOptions<T> = {\n parse?: (value: string | null) => T;\n /** Whether to reflect prop changes to HTML attributes. Default: true.\n * Set to false only when host.bind() manages the same attribute with derived/computed state. */\n reflect?: boolean;\n};\n\nexport type PropsDef<T extends Record<string, unknown>> = {\n // Keep default authoring ergonomic: plain `undefined` is a valid default for any prop.\n [K in keyof Required<T>]: T[K] | undefined | PropDef<T[K] | undefined>;\n};\n\nexport type PropDef<T> = PropOptions<T> & { readonly default: T };\nexport type PropInputDefs = Record<string, unknown | PropDef<unknown>>;\n\nexport const prop = {\n bool(defaultValue = false): PropDef<boolean> {\n return {\n default: defaultValue,\n parse: (value) => value === '' || value === 'true',\n reflect: true,\n };\n },\n json<T>(defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => {\n if (value == null || value === '') return defaultValue;\n\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n },\n reflect: false,\n };\n },\n number(defaultValue = 0): PropDef<number> {\n return {\n default: defaultValue,\n parse: (value) => (value == null ? defaultValue : Number(value)),\n reflect: true,\n };\n },\n oneOf<T extends string>(allowed: readonly T[], defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => (value != null && allowed.includes(value as T) ? (value as T) : defaultValue),\n reflect: true,\n };\n },\n string<T extends string>(defaultValue: T): PropDef<T> {\n return {\n default: defaultValue,\n parse: (value) => (value == null ? defaultValue : (value as T)),\n reflect: true,\n };\n },\n};\n\n/**\n * Explicit prop definition factory. Plain objects with `{ default: ... }` are duck-typed as PropDef.\n * @example\n * props: {\n * label: 'Default Label',\n * disabled: { default: false, reflect: true },\n * }\n */\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> =>\n typeof value === 'object' && value !== null && 'default' in value;\n\nconst isStructuredValue = (value: unknown): boolean =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\nexport function normalizePropDefinition<T>(value: T | PropDef<T>): PropDef<T> {\n if (isPropDef(value)) {\n const descriptor = value as PropDef<T>;\n const reflect = descriptor.reflect ?? true;\n\n if (reflect && isStructuredValue(descriptor.default)) {\n throw new Error('Structured prop defaults cannot use reflect:true. Set reflect:false and sync explicitly.');\n }\n\n return {\n ...descriptor,\n reflect,\n };\n }\n\n if (isStructuredValue(value)) {\n return {\n default: value as T,\n reflect: false,\n };\n }\n\n return {\n default: value as T,\n reflect: true,\n };\n}\n\nexport const propRegistry = new WeakMap<HTMLElement, Map<string, PropMeta<unknown>>>();\n\nconst reflectingAttrs = new WeakMap<HTMLElement, Set<string>>();\n\nconst markReflecting = (el: HTMLElement, name: string): void => {\n let names = reflectingAttrs.get(el);\n\n if (!names) {\n names = new Set<string>();\n reflectingAttrs.set(el, names);\n }\n\n names.add(name);\n};\n\nconst unmarkReflecting = (el: HTMLElement, name: string): void => {\n const names = reflectingAttrs.get(el);\n\n if (!names) return;\n\n names.delete(name);\n\n if (names.size === 0) reflectingAttrs.delete(el);\n};\n\nexport const isReflecting = (el: HTMLElement, name: string): boolean => reflectingAttrs.get(el)?.has(name) ?? false;\n\ntype PropMeta<T = unknown> = {\n parse: (value: string | null) => T;\n reflect: boolean;\n signal: Signal<T>;\n};\n\nconst parseBoolean = <T>(value: string | null): T => (value === '' || value === 'true') as T;\nconst parseNumber = <T>(value: string | null): T => Number(value) as T;\nconst parseString = <T>(value: string | null): T => value as unknown as T;\n\nconst PARSER_BY_TYPE: Record<string, <T>(value: string | null) => T> = {\n boolean: parseBoolean,\n number: parseNumber,\n string: parseString,\n};\n\n/** Infer attribute parser from default value type. */\nconst inferParserFromValue = <T>(defaultValue: T): ((value: string | null) => T) => {\n return (value: string | null): T => {\n if (value == null) return defaultValue;\n\n const parser = PARSER_BY_TYPE[typeof defaultValue];\n\n return parser ? (parser(value) as T) : (value as unknown as T);\n };\n};\n\n/** @internal Runtime prop registration (called by createProps) */\nconst registerProp = <T>(propName: string, attrName: string, defaultValue: T, options?: PropOptions<T>): Signal<T> => {\n const el = currentElementOrThrow();\n\n if (!propRegistry.has(el)) propRegistry.set(el, new Map());\n\n // Infer parser from default value type if not explicitly provided\n const parse = options?.parse ?? inferParserFromValue<T>(defaultValue);\n\n const s = signal<T>(defaultValue);\n const hasPreUpgradeProperty = Object.prototype.hasOwnProperty.call(el, propName);\n const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[propName] : undefined;\n\n const meta = {\n parse,\n reflect: options?.reflect ?? true,\n signal: s as Signal<unknown>,\n };\n\n if (hasPreUpgradeProperty) {\n delete (el as unknown as Record<string, unknown>)[propName];\n s.value = preUpgradeValue as T;\n } else if (el.hasAttribute(attrName)) {\n s.value = parse(el.getAttribute(attrName)) as T;\n }\n\n propRegistry.get(el)!.set(attrName, meta);\n\n Object.defineProperty(el, propName, {\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 effect(() => {\n const v = s.value;\n\n markReflecting(el, attrName);\n\n try {\n if (v == null) {\n el.removeAttribute(attrName);\n } else if (typeof v === 'boolean') {\n el.toggleAttribute(attrName, v);\n } else {\n setAttr(el, attrName, v);\n }\n } finally {\n unmarkReflecting(el, attrName);\n }\n });\n }\n\n return s;\n};\n\nexport type InferPropValue<T> = T extends PropDef<infer U> ? U : T;\n\nexport type InferPropsFromDefs<T extends PropInputDefs> = {\n [K in keyof T]: InferPropValue<T[K]>;\n};\n\nexport type InferPropsSignals<T extends Record<string, unknown>> = {\n readonly [K in keyof T]-?: Signal<T[K]>;\n};\n\nexport function createProps<D extends PropInputDefs>(defs: D): InferPropsSignals<InferPropsFromDefs<D>> {\n const props = {} as Record<string, Signal<unknown>>;\n\n for (const [name, def] of Object.entries(defs)) {\n // Ensure definition is normalized (should have been done at define-time, but this is a safety measure)\n const descriptor =\n typeof def === 'object' && def !== null && 'default' in def\n ? (def as PropDef<unknown>)\n : normalizePropDefinition(def);\n const attrName = toKebab(name);\n\n props[name] = registerProp(name, attrName, descriptor.default, descriptor);\n }\n\n return props as InferPropsSignals<InferPropsFromDefs<D>>;\n}\n","import type { ReadonlySignal } from '@vielzeug/stateit';\n\n/**\n * A branded signal that tells the attribute binding engine to skip writing when\n * the DOM value has diverged from the last programmatically-written value.\n * Created via live(signal) — pass a signal directly rather than wrapping a value.\n *\n * @example\n * html`<input :value=\"${live(model)}\" />`\n */\nexport type LiveSignal<T> = ReadonlySignal<T> & { readonly __live: true };\n\n/**\n * Marks a signal binding as \"live\" so stale app-state writes never clobber\n * in-progress user input.\n *\n * For form controls: if the current DOM value diverges from the last write made\n * by this binding, subsequent app-state writes are silently dropped until the\n * DOM value matches the incoming value or no prior write has been recorded.\n */\nexport const live = <T>(source: ReadonlySignal<T>): LiveSignal<T> =>\n ({\n __live: true as const,\n get value(): T {\n return source.value;\n },\n }) as LiveSignal<T>;\n\nexport const isLiveSignal = (value: unknown): value is LiveSignal<unknown> =>\n typeof value === 'object' && value !== null && (value as Record<string, unknown>).__live === true;\n","import {\n batch,\n computed,\n effect as rawEffect,\n isSignal,\n type CleanupFn,\n type ReadonlySignal,\n untrack,\n} from '@vielzeug/stateit';\n\nimport { isLiveSignal } from './directives/live';\nimport {\n CF_ID_ATTR,\n type AttrBinding,\n type Binding,\n type EventBinding,\n type HtmlBinding,\n type RefBinding,\n listen,\n removeNodes,\n runAll,\n setAttr,\n} from './internal';\nimport { propRegistry } from './props';\n\nexport type RegisterCleanup = (fn: CleanupFn) => void;\n\nexport type BindingTargets = {\n comments: Map<string, Comment>;\n elements: Map<string, HTMLElement>;\n};\n\nexport const parseHTML = (html: string): DocumentFragment => {\n const tpl = document.createElement('template');\n\n tpl.innerHTML = html;\n\n return tpl.content.cloneNode(true) as DocumentFragment;\n};\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\nconst walkBindingTargets = (root: Node, visit: (node: Node) => void): void => {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT);\n\n visit(root);\n\n while (walker.nextNode()) visit(walker.currentNode);\n};\n\nexport const indexBindingTargets = (nodes: Iterable<Node>): BindingTargets => {\n const targets: BindingTargets = { comments: new Map(), elements: new Map() };\n\n for (const node of nodes) walkBindingTargets(node, (current) => collectBindingTarget(current, targets));\n\n return targets;\n};\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\nconst isStructuredValue = (value: unknown): value is object =>\n Array.isArray(value) || (typeof value === 'object' && value !== null);\n\nconst isNativeFormInput = (el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement =>\n el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement;\n\ntype LiveWriteState = { last: unknown };\n\nconst applyFormValue = (\n el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n value: unknown,\n isLive: boolean | undefined,\n state: LiveWriteState,\n): void => {\n const next = value == null ? '' : String(value);\n\n if (isLive && state.last !== undefined && !Object.is(el.value, state.last) && !Object.is(el.value, next)) return;\n\n el.value = next;\n\n if (isLive) state.last = next;\n};\n\nconst applyCheckedValue = (\n el: HTMLInputElement,\n value: unknown,\n isLive: boolean | undefined,\n state: LiveWriteState,\n): void => {\n const next = Boolean(value);\n\n if (isLive && state.last !== undefined && el.checked !== Boolean(state.last) && el.checked !== next) return;\n\n el.checked = next;\n\n if (isLive) state.last = next;\n};\n\ntype PropMetaLike = { parse: (v: string | null) => unknown; reflect: boolean; signal: { value: unknown } };\n\nconst syncRegisteredProp = (el: HTMLElement, meta: PropMetaLike, binding: AttrBinding, value: unknown): void => {\n const parsed = isStructuredValue(value)\n ? value\n : meta.parse(\n binding.mode === 'bool' ? (value ? '' : null) : value == null || value === false ? null : String(value),\n );\n\n if (\n !Object.is(\n untrack(() => meta.signal.value),\n parsed,\n )\n ) {\n meta.signal.value = parsed as never;\n }\n\n // When reflect:false the prop signal has no reflect-effect; write the attribute\n // directly so the DOM stays in sync with template bindings.\n if (!meta.reflect) {\n if (isStructuredValue(value)) return;\n\n if (binding.mode === 'bool') el.toggleAttribute(binding.name, Boolean(value));\n else setAttr(el, binding.name, value);\n }\n};\n\nconst signalEffect = (\n signal: ReadonlySignal<unknown>,\n update: (v: unknown) => void,\n registerCleanup: RegisterCleanup,\n): void => {\n registerCleanup(rawEffect(() => update(signal.value)));\n};\n\nexport const applyAttrBinding = (el: HTMLElement, binding: AttrBinding, registerCleanup: RegisterCleanup): void => {\n const meta = propRegistry.get(el)?.get(binding.name) as PropMetaLike | undefined;\n const liveState: LiveWriteState = { last: undefined };\n\n const update = (value: unknown): void => {\n if (!meta && isStructuredValue(value)) {\n (el as unknown as Record<string, unknown>)[binding.name] = value;\n\n return;\n }\n\n if (!meta && binding.name === 'value' && isNativeFormInput(el)) {\n applyFormValue(el, value, binding.live, liveState);\n\n return;\n }\n\n if (!meta && binding.name === 'checked' && el instanceof HTMLInputElement) {\n applyCheckedValue(el, value, binding.live, liveState);\n\n return;\n }\n\n if (!meta) {\n if (binding.mode === 'bool') el.toggleAttribute(binding.name, Boolean(value));\n else setAttr(el, binding.name, value);\n\n return;\n }\n\n syncRegisteredProp(el, meta, binding, value);\n };\n\n if (binding.signal) {\n signalEffect(binding.signal, update, registerCleanup);\n } else {\n update(binding.value!);\n }\n};\n\nexport const applyEventBinding = (el: HTMLElement, binding: EventBinding, registerCleanup: RegisterCleanup) => {\n registerCleanup(listen(el, binding.name, binding.handler, binding.options));\n};\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 as never));\n\n return;\n }\n\n if (Array.isArray(ref)) {\n ref.push(el);\n registerCleanup(() => {\n const i = ref.indexOf(el);\n\n if (i !== -1) ref.splice(i, 1);\n });\n\n return;\n }\n\n ref.value = el as never;\n registerCleanup(() => {\n ref.value = null as never;\n });\n};\n\ntype ElementBinding = AttrBinding | EventBinding | RefBinding;\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, ElementBinding[]>();\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 === 'directive') {\n const found = targets.comments.get(id);\n\n if (found) {\n b.directive.mount(found, registerCleanup);\n targets.comments.delete(id);\n }\n } else if (b.type === 'html') {\n opts?.onHtml?.(b);\n } else {\n const grouped = bindingMap.get(id);\n\n if (grouped) grouped.push(b);\n else bindingMap.set(id, [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 // Inline element binding dispatch\n for (const b of elBindings) {\n if (b.type === 'attr') {\n applyAttrBinding(el, b, registerCleanup);\n } else if (b.type === 'event') {\n applyEventBinding(el, b, registerCleanup);\n } else if (b.type === 'ref') {\n applyRefBinding(el, b, registerCleanup);\n }\n }\n }\n};\n\nexport const applyBindingsInContainer = (\n container: ParentNode,\n bindings: Binding[],\n registerCleanup: RegisterCleanup,\n opts?: { onHtml?: (b: HtmlBinding) => void },\n) => {\n applyBindingsWithTargets(bindings, registerCleanup, indexBindingTargets([container]), opts);\n};\n\nexport const createAttrBinding = (mode: 'bool' | 'attr', name: string, uid: string, value: unknown): AttrBinding => {\n if (isLiveSignal(value)) {\n return { live: true, mode, name, signal: value as ReadonlySignal<unknown>, type: 'attr', uid };\n }\n\n if (typeof value === 'function') {\n return { mode, name, signal: computed(value as () => unknown), type: 'attr', uid };\n }\n\n if (isSignal(value)) {\n return { mode, name, signal: value as ReadonlySignal<unknown>, type: 'attr', uid };\n }\n\n return { mode, name, type: 'attr', uid, value };\n};\n\n/**\n * Sets up the reactive effect for an html-binding marker using full fragment replacement.\n */\nexport const applyHtmlBinding = (root: Node, b: HtmlBinding, registerCleanup: RegisterCleanup): 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 const stop = rawEffect(() => {\n batch(() => {\n let data: HtmlBinding['signal']['value'];\n\n try {\n data = b.signal.value;\n } catch (error) {\n if (error instanceof Error && error.message.includes('[stateit] Cannot read disposed computed signal')) return;\n\n throw error;\n }\n\n if (data.html === lastHtml) {\n return;\n }\n\n lastHtml = data.html;\n runCurrentCleanups();\n\n const { bindings, html } = data;\n const container = (marker.parentElement || root) as ParentNode;\n\n untrack(() => {\n batch(() => {\n removeNodes(lastInsertedNodes);\n\n const parsed = parseHTML(html);\n\n lastInsertedNodes = Array.from(parsed.childNodes);\n marker.after(parsed);\n });\n\n applyBindingsInContainer(container, bindings, registerInnerCleanup, {\n onHtml: (binding) => applyHtmlBinding(container as unknown as Node, binding, registerInnerCleanup),\n });\n });\n });\n });\n\n registerCleanup(stop);\n registerCleanup(runCurrentCleanups);\n};\n","import { onCleanup as _onCleanup, scope as _scope, type Scope, untrack } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { createHost, createSlots, type ComponentHost, type ComponentSlots } from './host';\nimport {\n createEmitFn,\n type CSSResult,\n type EmitFn,\n extractResult,\n type HTMLResult,\n loadStylesheet,\n toKebab,\n} from './internal';\nimport {\n createProps,\n isReflecting,\n normalizePropDefinition,\n prop,\n propRegistry,\n type InferPropsFromDefs,\n type InferPropsSignals,\n type PropDef,\n type PropInputDefs,\n type PropOptions,\n type PropsDef,\n} from './props';\nimport { type OnMountedCallback, type RuntimeScope, withCurrentElement, withRuntimeScope } from './runtime';\nimport { applyBindingsInContainer, applyHtmlBinding, parseHTML } from './template-bindings';\n\nexport type ComponentRegistrationOptions = {\n /** Indicates if this should be a form-associated element */\n formAssociated?: boolean;\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\nexport type ComponentTemplate = () => HTMLResult;\n\ntype ComponentState = {\n mountCallbacks: OnMountedCallback[];\n mountedCallbacksRan: boolean;\n mountToken: number;\n scope: Scope;\n setupDone: boolean;\n styles?: (string | CSSStyleSheet | CSSResult)[];\n templateMounted: boolean;\n templateResult: HTMLResult | null;\n};\n\nclass BaseElement extends HTMLElement {\n // Lifecycle: setup() runs on first connect (initializes scope + calls user setup).\n // _init() runs on every connect (applies initial attributes to reset prop state).\n // disconnectedCallback() disposes scope to run effect cleanups, then recreates it.\n // This means setup() re-runs on reconnect. Future optimization: track \"mounted\" state\n // separately to avoid re-running setup() on reconnect while still running cleanups.\n // On disconnect: cleanups run; on reconnect, styles and bindings are re-applied.\n static _options?: ComponentRegistrationOptions;\n static _setup: () => ComponentTemplate;\n static formAssociated = false;\n static observedAttributes: string[] = [];\n\n shadow: ShadowRoot;\n private _component: ComponentState;\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._component = {\n mountCallbacks: [],\n mountedCallbacksRan: false,\n mountToken: 0,\n scope: _scope(),\n setupDone: false,\n styles: options?.styles,\n templateMounted: false,\n templateResult: null,\n };\n }\n\n connectedCallback(): void {\n untrack(() => {\n if (!this._component.setupDone) this._runSetup();\n\n this._init();\n });\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (oldValue === newValue) return;\n\n if (isReflecting(this, name)) return;\n\n const propMeta = propRegistry.get(this)?.get(name);\n\n if (!propMeta) return;\n\n const parsed = propMeta.parse(newValue);\n\n if (\n !Object.is(\n untrack(() => propMeta.signal.value),\n parsed,\n )\n ) {\n propMeta.signal.value = parsed as never;\n }\n }\n\n disconnectedCallback(): void {\n this._component.mountToken++;\n // Dispose and recreate scope to run all effect cleanups\n this._component.scope.dispose();\n this._component.scope = _scope();\n // Reset mount state for fresh mount callbacks on reconnect\n this._component.mountCallbacks = [];\n this._component.mountedCallbacksRan = false;\n this._component.templateMounted = false;\n this._component.templateResult = null;\n // Reset setupDone to re-run setup() on reconnect, ensuring effects are re-registered\n this._component.setupDone = false;\n }\n\n private _handleError(err: unknown): void {\n console.error(CRAFTIT_ERRORS.unhandledComponentError(this.localName), err);\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n private _runSetup(): void {\n const setupScope: RuntimeScope = {\n element: this,\n mountCallbacks: [],\n };\n\n try {\n this._component.scope.run(() => {\n const template = withRuntimeScope(setupScope, () =>\n withCurrentElement(this, () => (this.constructor as typeof BaseElement)._setup()),\n );\n\n this._component.templateResult = withRuntimeScope(setupScope, () => withCurrentElement(this, () => template()));\n });\n\n this._component.mountCallbacks.push(...setupScope.mountCallbacks);\n this._component.setupDone = true;\n } catch (err) {\n this._handleError(err);\n }\n }\n\n private _init(): void {\n const { styles } = this._component;\n\n if (styles?.length) this.shadow.adoptedStyleSheets = styles.map(loadStylesheet);\n\n if (!this._component.templateMounted && this._component.templateResult != null) {\n const { bindings, html: htmlString } = extractResult(this._component.templateResult);\n\n this.shadow.replaceChildren(parseHTML(htmlString));\n this._component.templateMounted = true;\n\n if (bindings.length) {\n this._component.scope.run(() => {\n applyBindingsInContainer(this.shadow, bindings, _onCleanup, {\n onHtml: (binding) => applyHtmlBinding(this.shadow, binding, _onCleanup),\n });\n });\n }\n }\n\n if (!this._component.mountedCallbacksRan && this._component.mountCallbacks.length > 0) {\n this._component.mountedCallbacksRan = true;\n\n const token = ++this._component.mountToken;\n\n queueMicrotask(() => {\n if (!this.isConnected || token !== this._component.mountToken) return;\n\n try {\n for (const callback of this._component.mountCallbacks) {\n this._component.scope.run(() => {\n withRuntimeScope(\n {\n element: this,\n mountCallbacks: [],\n },\n () =>\n withCurrentElement(this, () => {\n const cleanup = callback();\n\n if (typeof cleanup === 'function') _onCleanup(cleanup);\n }),\n );\n });\n }\n } catch (err) {\n this._handleError(err);\n }\n });\n }\n }\n}\n\nconst defineComponent = (\n tag: string,\n setup: () => ComponentTemplate,\n options: ComponentRegistrationOptions = {},\n): string => {\n if (!tag) throw new Error(CRAFTIT_ERRORS.defineRequiresTag);\n\n if (customElements.get(tag)) {\n throw new Error(CRAFTIT_ERRORS.defineDuplicate(tag));\n }\n\n class Element extends BaseElement {\n static override _options = options;\n static override _setup = setup;\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// PUBLIC COMPONENT AUTHORING API (absorbed from component.ts)\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport { prop };\nexport type { InferPropsFromDefs, InferPropsSignals, PropDef, PropInputDefs, PropOptions, PropsDef };\n\n/**\n * Setup context passed as the second argument to the component setup function.\n */\nexport type SetupContextBag<Emits extends Record<string, unknown> = Record<string, unknown>> = {\n emit: EmitFn<Emits>;\n host: ComponentHost;\n slots: ComponentSlots;\n};\n\nexport type ComponentDefinition<\n Props extends Record<string, unknown> = Record<never, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n> = {\n /** Enable form association for the custom element */\n formAssociated?: boolean;\n /** Component properties and their metadata */\n props?: PropsDef<Props>;\n /** Main setup function. Props are the first positional parameter, context bag is second. Returns a template function. */\n setup: (props: InferPropsSignals<Props>, ctx: SetupContextBag<Emits>) => ComponentTemplate;\n /** Shadow DOM configuration (mode is always 'open') */\n shadow?: Omit<ShadowRootInit, 'mode'>;\n /** Component-specific styles */\n styles?: (string | CSSStyleSheet | CSSResult)[];\n};\n\nconst createSetupProps = <Props extends Record<string, unknown>>(\n defs: PropsDef<Props> | undefined,\n): InferPropsSignals<Props> => {\n if (!defs) return {} as InferPropsSignals<Props>;\n\n return createProps(defs) as InferPropsSignals<Props>;\n};\n\nexport function define<\n Props extends Record<string, unknown> = Record<never, never>,\n Emits extends Record<string, unknown> = Record<string, never>,\n>(tag: string, definition: ComponentDefinition<Props, Emits>): string {\n const { formAssociated, props: propDefs, setup, shadow: shadowOptions, styles } = definition;\n\n // Normalize props at define-time for early error feedback\n const normalizedPropDefs: PropsDef<Props> | undefined = (() => {\n if (!propDefs) return undefined;\n\n const normalized: PropInputDefs = {};\n\n for (const [key, def] of Object.entries(propDefs)) {\n normalized[key] = normalizePropDefinition(def);\n }\n\n return normalized as PropsDef<Props>;\n })();\n\n const observedAttrs = normalizedPropDefs ? Object.keys(normalizedPropDefs).map(toKebab) : [];\n\n return defineComponent(\n tag,\n () => {\n const props = createSetupProps(normalizedPropDefs);\n const host = createHost();\n const emit = createEmitFn<Emits>();\n const slots = createSlots();\n\n return setup(props, { emit, host, slots });\n },\n { formAssociated, observedAttrs, shadow: shadowOptions, styles },\n );\n}\n","import { type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from './errors';\nimport { currentElementOrThrow, effect } from './runtime';\n\n/** @internal */\nconst internalsRegistry = new WeakMap<HTMLElement, ElementInternals>();\n\nexport type FormFieldOptions<T = unknown> = {\n disabled?: ReadonlySignal<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>(options: FormFieldOptions<T>): FormFieldHandle => {\n const host = currentElementOrThrow();\n const ctor = host.constructor as typeof HTMLElement & { formAssociated?: boolean };\n\n if (!ctor.formAssociated) {\n throw new Error(CRAFTIT_ERRORS.defineFieldRequiresFormAssociated(host.localName));\n }\n\n const internals = internalsRegistry.get(host) ?? host.attachInternals();\n\n internalsRegistry.set(host, internals);\n\n const toFormValue =\n options.toFormValue ??\n ((v: T): File | FormData | string | null => {\n if (v == null) return null;\n\n if (v instanceof File || v instanceof FormData) return v;\n\n return String(v);\n });\n\n effect(() => {\n internals.setFormValue(toFormValue(options.value.value));\n });\n\n const disabled = options.disabled;\n\n if (disabled) {\n const states = internals.states as CustomStateSet;\n\n effect(() => {\n if (disabled.value) states.add('disabled');\n else states.delete('disabled');\n });\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","import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport {\n CF_ID_ATTR,\n createMarkerIdFactory,\n escapeHtml,\n htmlResult,\n isDirectiveResult,\n isHtmlResult,\n rekeyHtmlResult,\n type Binding,\n type HTMLResult,\n type Ref,\n type RefCallback,\n} from './internal';\nimport { createAttrBinding } from './template-bindings';\n\n// Templates use the HTML as-is; no aggressive whitespace normalization\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: 'boolAttr' as const, regex: /\\s+\\?([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/ },\n { kind: 'attr' 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 mode?: 'attr' | 'bool';\n modifiers?: string[];\n // For 'event' and attribute slots\n name?: string;\n prefix: string;\n raw: string;\n};\n\ntype CompiledTemplatePlan = {\n slots: CompiledTemplateSlot[];\n tail: string;\n};\n\ntype HtmlWrapperSignal = ReadonlySignal<{\n bindings: Binding[];\n html: string;\n}>;\n\nconst templatePlanCache = new WeakMap<TemplateStringsArray, CompiledTemplatePlan>();\nconst htmlGetterSignalCache = new WeakMap<() => unknown, HtmlWrapperSignal>();\nconst htmlSignalWrapperCache = new WeakMap<ReadonlySignal<unknown>, HtmlWrapperSignal>();\n\nconst MODIFIER_WRAPPERS: Record<string, (fn: (e: Event) => void) => (e: Event) => void> = {\n prevent: (fn) => (e) => {\n e.preventDefault();\n fn(e);\n },\n self: (fn) => (e) => {\n if (e.target === e.currentTarget) fn(e);\n },\n stop: (fn) => (e) => {\n e.stopPropagation();\n fn(e);\n },\n};\n\nconst applyModifiers = (\n handler: (e: Event) => void,\n modifiers: string[],\n): { handler: (e: Event) => void; options?: AddEventListenerOptions } => {\n const wrapped = modifiers.reduce((fn, m) => MODIFIER_WRAPPERS[m]?.(fn) ?? fn, handler);\n\n const options: AddEventListenerOptions = {};\n\n if (modifiers.includes('capture')) options.capture = true;\n\n if (modifiers.includes('once')) options.once = true;\n\n if (modifiers.includes('passive')) options.passive = true;\n\n return { handler: wrapped, ...(Object.keys(options).length ? { options } : {}) };\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 = (getter: () => unknown): { bindings: Binding[]; signal: ReadonlySignal<any> } => {\n let cached = { bindings: [] as Binding[], html: '' };\n const fnSignal = computed(() => {\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 }\n\n return cached;\n });\n\n return { bindings: [], signal: fnSignal };\n};\n\nconst createHtmlWrapperSignal = (\n value: unknown,\n): {\n signal: HtmlWrapperSignal;\n} | null => {\n if (typeof value === 'function') {\n const getter = value as () => unknown;\n const cached = htmlGetterSignalCache.get(getter);\n\n if (cached) {\n return { signal: cached };\n }\n\n const { signal: sig } = renderHtmlItems(getter);\n\n htmlGetterSignalCache.set(getter, sig);\n\n return { signal: sig };\n }\n\n if (isSignal(value) && isHtmlResult((value as ReadonlySignal<unknown>).value)) {\n const htmlSignal = value as ReadonlySignal<unknown>;\n const cached = htmlSignalWrapperCache.get(htmlSignal);\n\n if (cached) {\n return { signal: cached };\n }\n\n const wrapped = computed(() => {\n const next = htmlSignal.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 htmlSignalWrapperCache.set(htmlSignal, wrapped);\n\n return { signal: wrapped };\n }\n\n return null;\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 parts = m[1].split('.');\n const eventName = parts[0];\n const modifiers = parts.slice(1);\n\n slots.push({ kind: 'event', modifiers, name: eventName, prefix, raw: str });\n } else if (pattern.kind === 'ref') {\n slots.push({ kind: 'ref', prefix, raw: str });\n } else if (pattern.kind === 'boolAttr') {\n slots.push({ kind: 'boolAttr', mode: 'bool', name: m[1], prefix, raw: str });\n } else if (pattern.kind === 'attr') {\n slots.push({ kind: 'attr', mode: 'attr', name: m[1], prefix, raw: str });\n }\n\n break;\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\nexport const compileTemplate = (strings: TemplateStringsArray, values: unknown[]): 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 const { handler, options } = applyModifiers(value as (e: Event) => void, slot.modifiers ?? []);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push({ handler, name: slot.name!, options, type: 'event', uid: id });\n } else if (isSignal(value)) {\n // If a signal is passed to an event binding, we assume its current value\n // is the intended handler.\n const id = getElementBindingId(slot.prefix);\n const signalHandler = (e: Event) => {\n const currentHandler = (value as ReadonlySignal<unknown>).value;\n\n if (typeof currentHandler === 'function') {\n (currentHandler as (e: Event) => void)(e);\n }\n };\n const { handler, options } = applyModifiers(signalHandler, slot.modifiers ?? []);\n\n result += `${slot.prefix} ${CF_ID_ATTR}=\"${id}\"`;\n bindings.push({ handler, name: slot.name!, options, type: 'event', uid: id });\n } else result += slot.raw;\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 result += slot.raw;\n\n continue;\n }\n\n if (slot.kind === 'boolAttr' || slot.kind === 'attr') {\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 === 'node') {\n resetElementBindingId();\n\n if (isDirectiveResult(value)) {\n const id = getNextId();\n\n result += `${slot.raw}<!--${id}-->`;\n bindings.push({ directive: value, type: 'directive', uid: id });\n continue;\n }\n\n const htmlWrapper = createHtmlWrapperSignal(value);\n\n if (htmlWrapper) {\n const id = getNextId();\n\n result += `${slot.raw}<!--${id}-->`;\n bindings.push({ 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 continue;\n }\n }\n\n result += plan.tail;\n\n return htmlResult(result, bindings);\n};\n\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]): HTMLResult =>\n compileTemplate(strings, values);\n","import { batch, effect as _effect, untrack, type CleanupFn, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from '../errors';\nimport {\n createMarkerIdFactory,\n escapeHtml,\n extractResult,\n htmlResult,\n isHtmlResult,\n removeNodes,\n rekeyHtmlResult,\n runAll,\n type Binding,\n type DirectiveResult,\n type HTMLResult,\n} from '../internal';\nimport { applyBindingsWithTargets, indexBindingTargets, parseHTML, type RegisterCleanup } from '../template-bindings';\nimport { applyHtmlBinding } from '../template-bindings';\n\nconst toResultEntry = (value: string | HTMLResult, getNextId: () => string): { bindings: Binding[]; html: string } =>\n isHtmlResult(value) ? rekeyHtmlResult(value, getNextId) : { bindings: [], html: escapeHtml(value) };\n\nconst toHtmlResult = (value: string | HTMLResult): HTMLResult =>\n isHtmlResult(value) ? value : htmlResult(escapeHtml(value));\n\n/** Render loop used by the reactive path (keys + rendered metadata required for reconciliation). */\nfunction renderKeyed<T>(\n items: T[],\n template: (item: T, index: number) => string | HTMLResult,\n keyFn: (item: T, index: number) => string | number,\n): {\n bindings: Binding[];\n html: string;\n keys: (string | number)[];\n rendered: Array<{ bindings: Binding[]; html: string }>;\n} {\n let html = '';\n const allBindings: Binding[] = [];\n const keys: (string | number)[] = [];\n const seenKeys = new Set<string | number>();\n const rendered: Array<{ bindings: Binding[]; html: string }> = [];\n const getNextId = createMarkerIdFactory();\n\n for (let i = 0; i < items.length; i++) {\n const nextKey = keyFn(items[i], i);\n\n if (seenKeys.has(nextKey)) {\n throw new Error(CRAFTIT_ERRORS.eachDuplicateKey(String(nextKey), i));\n }\n\n seenKeys.add(nextKey);\n keys.push(nextKey);\n\n const entry = toResultEntry(template(items[i], i), getNextId);\n\n html += entry.html;\n allBindings.push(...entry.bindings);\n rendered.push(entry);\n }\n\n return { bindings: allBindings, html, keys, rendered };\n}\n\nexport interface EachOptions<T> {\n fallback?: () => string | HTMLResult;\n key: (item: T, index: number) => string | number;\n render: (item: T, index: number) => string | HTMLResult;\n}\n\n/**\n * Renders a list with keyed DOM reconciliation for reactive sources.\n * Use inside `html` tagged templates.\n *\n * `each()` expects a reactive signal source and a stable `key` function.\n *\n * For dynamic lists with click handlers, prefer event delegation on a parent node\n * (`@click` + `closest(...)`) over per-item handlers inside `each()`.\n *\n * @example\n * import { each } from '@vielzeug/craftit';\n *\n * // Reactive source (key required):\n * html`${each(items, { key: item => item.id, render: (item) => html`<li>${item.name}</li>` })}`\n *\n * // Full example:\n * html`${each(items, {\n * fallback: () => html`<p>No items</p>`,\n * key: item => item.id,\n * render: (item) => html`<li>${item.name}</li>`,\n * })}`\n */\nexport function each<T>(source: ReadonlySignal<T[]>, options: EachOptions<T>): DirectiveResult;\nexport function each<T>(source: ReadonlySignal<T[]>, options: EachOptions<T>): DirectiveResult {\n const { fallback, key, render: renderItem } = options;\n\n const mount = (anchor: Comment, registerCleanup: RegisterCleanup): void => {\n type KeyedNode = {\n cleanups: CleanupFn[];\n html: string;\n nodes: Node[];\n };\n\n let keyedNodes = new Map<string | number, KeyedNode>();\n let fallbackNodes: Node[] = [];\n let fallbackCleanups: CleanupFn[] = [];\n\n const clearFallback = (): void => {\n removeNodes(fallbackNodes);\n fallbackNodes = [];\n runAll(fallbackCleanups);\n fallbackCleanups = [];\n };\n\n const clearKeyed = (): void => {\n for (const [, node] of keyedNodes) {\n removeNodes(node.nodes);\n runAll(node.cleanups);\n }\n\n keyedNodes.clear();\n };\n\n const stop = _effect(() => {\n const parent = anchor.parentNode;\n\n if (!parent) return;\n\n batch(() => {\n const raw = source.value;\n\n if (!raw.length) {\n clearKeyed();\n clearFallback();\n\n if (!fallback) return;\n\n const fallbackResult = extractResult(toHtmlResult(fallback()));\n const parsed = parseHTML(fallbackResult.html);\n\n fallbackNodes = Array.from(parsed.childNodes);\n anchor.after(parsed);\n\n const addFallbackCleanup: RegisterCleanup = (fn) => fallbackCleanups.push(fn);\n\n applyBindingsWithTargets(fallbackResult.bindings, addFallbackCleanup, indexBindingTargets(fallbackNodes), {\n onHtml: (binding) => applyHtmlBinding(parent as unknown as Node, binding, addFallbackCleanup),\n });\n\n return;\n }\n\n clearFallback();\n\n const { keys, rendered } = renderKeyed(raw, renderItem, key);\n const nextKeyed = new Map<string | number, KeyedNode>();\n const ordered: Array<{ item: { bindings: Binding[]; html: string }; key: string | number; nodes: Node[] }> = [];\n\n for (let i = 0; i < keys.length; i++) {\n const nextKey = keys[i];\n const item = rendered[i];\n const existing = keyedNodes.get(nextKey);\n let nodes: Node[];\n const cleanups: CleanupFn[] = [];\n\n if (existing && existing.html === item.html) {\n nodes = existing.nodes;\n runAll(existing.cleanups);\n } else {\n if (existing) {\n removeNodes(existing.nodes);\n runAll(existing.cleanups);\n }\n\n const parsed = parseHTML(item.html);\n\n nodes = Array.from(parsed.childNodes);\n }\n\n ordered.push({ item, key: nextKey, nodes });\n nextKeyed.set(nextKey, { cleanups, html: item.html, nodes });\n }\n\n for (const [oldKey, oldNode] of keyedNodes) {\n if (!nextKeyed.has(oldKey)) {\n removeNodes(oldNode.nodes);\n runAll(oldNode.cleanups);\n }\n }\n\n let cursor: Node = anchor;\n\n for (const entry of ordered) {\n for (const node of entry.nodes) {\n parent.insertBefore(node, cursor.nextSibling);\n cursor = node;\n }\n\n const targetNode = nextKeyed.get(entry.key);\n\n if (!targetNode) continue;\n\n const addItemCleanup: RegisterCleanup = (fn) => targetNode.cleanups.push(fn);\n\n untrack(() => {\n applyBindingsWithTargets(entry.item.bindings, addItemCleanup, indexBindingTargets(entry.nodes), {\n onHtml: (binding) => applyHtmlBinding(parent as unknown as Node, binding, addItemCleanup),\n });\n });\n }\n\n keyedNodes = nextKeyed;\n });\n });\n\n registerCleanup(stop);\n registerCleanup(() => {\n clearFallback();\n clearKeyed();\n });\n };\n\n return { __craftitDirective: true, mount };\n}\n","import { computed, isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\n/**\n * Produces a reactive string of class names from an object map.\n *\n * Each key is a class name. Its value may be:\n * - a static `boolean`\n * - a `Signal<boolean>`\n * - a getter `() => boolean`\n *\n * Returns a `ReadonlySignal<string>` that can be used directly in a template\n * class attribute:\n *\n * @example\n * ```ts\n * html`<div class=\"${classMap({ active: isActive, hidden: () => !isVisible.value })}\"></div>`\n * ```\n */\nexport const classMap = (\n map: Record<string, (() => boolean) | ReadonlySignal<boolean> | boolean>,\n): ReadonlySignal<string> => {\n return computed(() =>\n Object.entries(map)\n .filter(([, v]) => (typeof v === 'function' ? v() : isSignal(v) ? v.value : v))\n .map(([k]) => k)\n .join(' '),\n );\n};\n","import { computed, isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\ntype StyleInput =\n | string\n | number\n | null\n | undefined\n | false\n | (() => string | number | null | undefined | false)\n | ReadonlySignal<string | number | null | undefined | false>;\n\nconst toStyleValue = (value: StyleInput): string => {\n const resolved = typeof value === 'function' ? value() : isSignal(value) ? value.value : value;\n\n if (resolved == null || resolved === false) return '';\n\n return String(resolved);\n};\n\nconst toKebabCase = (name: string): string => name.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);\n\n/**\n * Builds a reactive inline style string from a style object.\n *\n * @example\n * html`<div :style=${styleMap({ backgroundColor: color, width: () => `${size.value}px` })}></div>`\n */\nexport const styleMap = (record: Record<string, StyleInput>): ReadonlySignal<string> => {\n return computed(() => {\n const declarations: string[] = [];\n\n for (const [name, input] of Object.entries(record)) {\n const value = toStyleValue(input);\n\n if (!value) continue;\n\n declarations.push(`${toKebabCase(name)}:${value}`);\n }\n\n return declarations.join(';');\n });\n};\n","import { computed, isSignal, type ReadonlySignal } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../internal';\n\ntype MaybeReactive<T> = T | (() => T) | ReadonlySignal<T>;\n\ntype WhenRenderable = string | HTMLResult;\n\nconst resolve = <T>(value: MaybeReactive<T>): T => {\n if (typeof value === 'function') return (value as () => T)();\n\n if (isSignal(value)) return value.value;\n\n return value;\n};\n\n/**\n * Conditionally renders one of two branches.\n */\nexport function when(\n condition: MaybeReactive<boolean>,\n truthy: () => WhenRenderable,\n falsy?: () => WhenRenderable,\n): ReadonlySignal<WhenRenderable> {\n return computed(() => {\n if (resolve(condition)) return truthy();\n\n return falsy ? falsy() : '';\n });\n} // Note: when returns HtmlResult (not DirectiveResult)\n","import { computed, isSignal, type ReadonlySignal, untrack } from '@vielzeug/stateit';\n\nimport type { HTMLResult } from '../internal';\n\ntype GuardDep = unknown | (() => unknown) | ReadonlySignal<unknown>;\n\ntype GuardRenderable = string | HTMLResult;\n\nconst resolve = (value: GuardDep): unknown => {\n if (typeof value === 'function') return (value as () => unknown)();\n\n if (isSignal(value)) return value.value;\n\n return value;\n};\n\nconst depsEqual = (prev: unknown[], next: unknown[]): boolean => {\n if (prev.length !== next.length) return false;\n\n for (let index = 0; index < prev.length; index++) {\n if (!Object.is(prev[index], next[index])) return false;\n }\n\n return true;\n};\n\n/**\n * Memoizes rendering until the provided dependency tuple changes.\n */\nexport function guard(deps: GuardDep | GuardDep[], render: () => GuardRenderable): ReadonlySignal<GuardRenderable> {\n let initialized = false;\n let previousDeps: unknown[] = [];\n let cached: GuardRenderable = '';\n\n return computed(() => {\n const resolvedDeps = (Array.isArray(deps) ? deps : [deps]).map((dep) => resolve(dep));\n\n if (!initialized || !depsEqual(previousDeps, resolvedDeps)) {\n // untrack() prevents signals read inside render() from invalidating this\n // computed — only changes to the explicit dep array trigger re-renders.\n cached = untrack(render);\n previousDeps = resolvedDeps;\n initialized = true;\n }\n\n return cached;\n });\n}\n","import { effect as signalEffect, type Signal, signal } from '@vielzeug/stateit';\n\nimport { CRAFTIT_ERRORS } from '../errors';\nimport { tryRegisterCleanup } from '../runtime';\n\nexport type ResourceState<T> = {\n /** Previous successful data, available while a reload is pending. */\n data: T | undefined;\n /** Rejection reason from the most recent failed fetch, or `undefined`. */\n error: unknown;\n /** `true` while the fetcher promise is in flight. */\n pending: boolean;\n};\n\n/**\n * Reactive async resource. Re-fetches whenever the `deps` getter returns a new value.\n * Previous data is preserved during reloads so the UI can show stale-while-revalidate UX.\n * In-flight requests are cancelled via `AbortController` when deps change.\n *\n * Must be called inside component `setup()` or another Craftit runtime scope.\n *\n * @example\n * ```ts\n * const user = resource(\n * () => props.userId.value,\n * (id, signal) => fetch(`/api/users/${id}`, { signal }).then(r => r.json()),\n * );\n *\n * return () => html`\n * ${when(() => user.value.pending, () => html`<p>Loading…</p>`)}\n * ${when(() => !!user.value.error, () => html`<p>Error</p>`)}\n * ${when(() => !!user.value.data, () => html`<p>${user.value.data?.name}</p>`)}\n * `;\n * ```\n */\nexport function resource<Deps, T>(deps: () => Deps, fetcher: (deps: Deps, signal: AbortSignal) => Promise<T>) {\n const state: Signal<ResourceState<T>> = signal({ data: undefined, error: undefined, pending: true });\n let previousData: T | undefined;\n\n // Use raw stateit effect and register cleanup explicitly.\n const dispose = signalEffect(() => {\n const currentDeps = deps();\n const controller = new AbortController();\n\n state.value = { data: previousData, error: undefined, pending: true };\n\n fetcher(currentDeps, controller.signal)\n .then((data) => {\n if (!controller.signal.aborted) {\n previousData = data;\n state.value = { data, error: undefined, pending: false };\n }\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted) {\n state.value = { data: previousData, error, pending: false };\n }\n });\n\n return () => controller.abort();\n });\n\n if (!tryRegisterCleanup(dispose)) throw new Error(CRAFTIT_ERRORS.lifecycleOutsideSetup);\n\n return state;\n}\n","import { computed, isSignal, type ReadonlySignal, type Signal } from '@vielzeug/stateit';\n\nimport { htmlResult, type HTMLResult } from '../internal';\n\n/**\n * Renders a trusted HTML string without escaping.\n * **Only use with content you control** — passing user-supplied strings\n * directly is an XSS risk.\n *\n * Supports static strings and signals.\n * When reactive, the DOM is updated in-place whenever the value changes.\n *\n * @example\n * import { raw } from '@vielzeug/craftit';\n *\n * // Static\n * html`<div>${raw('<strong>bold</strong>')}</div>`\n *\n * // Reactive signal\n * const content = signal('<em>hello</em>');\n * html`<div>${raw(content)}</div>`\n *\n */\nexport function raw(value: string | Signal<string> | ReadonlySignal<string>): HTMLResult | ReadonlySignal<HTMLResult> {\n if (isSignal(value)) {\n return computed(() => htmlResult((value as ReadonlySignal<string>).value));\n }\n\n return htmlResult(value);\n}\n"],"mappings":"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"}
|