{"version":3,"file":"ore.cjs","names":[],"sources":["../src/_dev.ts","../src/errors.ts","../src/utils/dom.ts","../src/runtime.ts","../src/context.ts","../src/props.ts","../src/utils/brand.ts","../src/utils/css.ts","../src/base-element.ts","../src/_component-class.ts","../src/define.ts","../src/directives/classMap.ts","../src/template/result.ts","../src/directives/each.ts","../src/directives/live.ts","../src/directives/styleMap.ts","../src/directives/unsafe-html.ts","../src/directives/when.ts","../src/forms/field.ts","../src/utils/aria.ts","../src/host-bind.ts","../src/slots.ts","../src/template/bindings.ts","../src/template/compiler.ts","../src/template/instantiator.ts","../src/utils/emit.ts","../src/utils/id.ts"],"sourcesContent":["const isDev = !(globalThis as { __ORE_PROD__?: boolean }).__ORE_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n  if (isDev) console.warn(`[@vielzeug/ore] ${msg}`);\n}\n\n/** @internal */\nexport function error(msg: string, ...args: unknown[]): void {\n  if (isDev) console.error(`[@vielzeug/ore] ${msg}`, ...args);\n}\n","import { error as logError } from './_dev';\n\n// ─── Error policy ─────────────────────────────────────────────────────────────\n// One rule for the whole package — decide by whose code failed and whether it\n// can continue, never ad hoc per call site:\n//\n//   API misuse (wrong arguments, hook outside setup, duplicate define)\n//     → throw `OreApiError`, immediately, every build.\n//   User-authored code failing inside ore's execution (setup, onMounted,\n//     onFormReset, each() reconciliation)\n//     → wrap in `OreLifecycleError` and report via `reportRuntimeError()`\n//       (`ore:error` DOM event + dev console) so other callbacks keep running.\n//   Recoverable oddity (overwrite warnings, blocked attribute writes)\n//     → dev `warn()`/`error()` and continue. Never swallow silently.\n//   Internal impossibility (compiled template metadata out of sync)\n//     → `invariant()` throws `OreInternalError`, every build.\n\n// ─── Structured error types ───────────────────────────────────────────────────\n\n/** Base class for all Ore errors. Use `instanceof OreError` to catch any Ore-originated error. */\nexport class OreError extends Error {\n  constructor(message: string, opts?: ErrorOptions) {\n    super(message, opts);\n    this.name = new.target.name;\n    Object.setPrototypeOf(this, new.target.prototype);\n  }\n\n  static is(err: unknown): err is OreError {\n    return err instanceof OreError;\n  }\n}\n\n/** Thrown when Ore API is called incorrectly (e.g. outside setup, duplicate define, invalid prop). */\nexport class OreApiError extends OreError {}\n\n/**\n * Thrown when an internal invariant fails — e.g. compiled template metadata no\n * longer matching the DOM it was cloned from. Distinct from `OreApiError`: this\n * is never the caller's fault, it signals a bug in ore itself. See `invariant()`.\n */\nexport class OreInternalError extends OreError {}\n\n/**\n * The phase in which a component error occurred.\n * - `'setup'` — synchronous setup() threw\n * - `'mounted'` — an onMounted callback threw\n * - `'form-reset'` — an onFormReset callback threw\n * - `'each-reconcile'` — `each()` failed to reconcile a list update (e.g. duplicate keys)\n */\nexport type OreErrorPhase = 'each-reconcile' | 'form-reset' | 'mounted' | 'setup';\n\n/**\n * Structured error thrown by the Ore runtime when component setup fails.\n * Provides component name and original cause for debugging.\n */\nexport class OreLifecycleError extends OreError {\n  readonly component: string;\n  readonly phase: OreErrorPhase;\n\n  constructor(message: string, options: { cause: Error; component: string; phase: OreErrorPhase }) {\n    super(message, { cause: options.cause });\n    this.component = options.component;\n    this.phase = options.phase;\n  }\n}\n\n/**\n * Report a runtime error via the ore:error event and console.\n *\n * `target` only needs to be an `EventTarget` (not specifically an `HTMLElement`) — component\n * lifecycle errors dispatch on the host element, but non-lifecycle failures (e.g. `each()`\n * reconciliation, which has no single \"component\" to attribute the error to) dispatch on\n * whatever live DOM node is available, such as the directive's own anchor `Comment`. Either way\n * the event still bubbles and crosses shadow boundaries (`composed: true`), so a listener on\n * `document`/`window` observes every report regardless of where it originated.\n *\n * The console log (via `_dev.ts`'s `error()`) is still dev-gated like the rest of the package's\n * console diagnostics, but the `ore:error` DOM event dispatch below is **not** — it fires in\n * every build, so consumers always have a way to observe runtime failures programmatically even\n * when console output is stripped in production.\n */\nexport function reportRuntimeError(error: OreLifecycleError, target: EventTarget): void {\n  logError(`<${error.component}> lifecycle error (phase: ${error.phase}):`, error.cause);\n\n  target.dispatchEvent(\n    new CustomEvent('ore:error', {\n      bubbles: true,\n      composed: true,\n      detail: error,\n    }),\n  );\n}\n\n// ─── Error message constants ─────────────────────────────────────────────────\n\n/** Thrown by `flush()` in the testing sub-path when pending component work doesn't settle within the timeout. */\nexport class OreTimeoutError extends OreError {}\n\nexport const ORE_ERRORS = {\n  asyncSetupUnsupported: 'setup() must return an HTMLResult or null; use reactive state for asynchronous work',\n  defineDuplicate: (tag: string): string => `define('${tag}') called twice — custom element already registered`,\n  defineFieldRequiresFormAssociated: (tag: string): string =>\n    `useField() requires define('${tag}', { formAssociated: true })`,\n  defineRequiresTag: 'define() requires a tag name',\n  eachDuplicateKey: (key: string, index: number): string => `each() received duplicate key \"${key}\" at index ${index}`,\n  eventModifiersUnsupported: (eventName: string): string =>\n    `@${eventName}: event modifiers are unsupported; call native event methods in the handler instead`,\n  injectStrictFailed: (key: string, tag: string): string => `injectStrict() could not resolve key \"${key}\" in <${tag}>`,\n  invariantViolated: (message: string): string => `invariant violated: ${message}`,\n  lifecycleOutsideSetup: 'Lifecycle hooks must be called during component setup',\n  listenNullTarget: (eventName: string): string =>\n    `listen() called with a null/undefined target for event \"${eventName}\" — listener not attached`,\n  propInvalidReflect: 'Structured props cannot use reflect:true — use prop.json() with reflect:false',\n  templateInterpolationInTag:\n    'html`...`: interpolations inside a tag must be named attributes, boolean attributes, events, or refs',\n  useFieldAlreadyCalled: (tag: string): string =>\n    `useField() was already called on <${tag}>. Call it only once per component.`,\n  validationFailed: (tag: string, errors: string[]): string => `Validation failed for <${tag}>:\\n${errors.join('\\n')}`,\n} as const;\n\n/**\n * Assert an internal invariant that must always hold — e.g. compiled template\n * metadata staying in sync with the DOM it was cloned from. A failed invariant\n * means a bug in ore itself, never user input, so it throws `OreInternalError`\n * unconditionally (every build, never gated like `_dev.ts`'s `warn()`).\n *\n * Narrowing caveat: `asserts condition` only narrows the exact expression\n * passed in. Assign to a local `const` first — `invariant(el.parentNode, msg)`\n * does not narrow later reads of `el.parentNode`.\n */\nexport function invariant(condition: unknown, message: string): asserts condition {\n  if (!condition) throw new OreInternalError(ORE_ERRORS.invariantViolated(message));\n}\n","/**\n * Low-level DOM utilities used throughout the runtime and binding layers.\n */\n\nimport { isReactive, type Readable } from '@vielzeug/ripple';\n\nimport { warn } from '../_dev';\nimport { ORE_ERRORS } from '../errors';\n\n/**\n * Resolves a value that may be a plain value, a getter function, or a reactive\n * signal — the one shared three-way branch used by `classMap`/`styleMap`/`bind()`.\n */\nexport const resolveMaybeReactive = <T>(value: T | Readable<T> | (() => T)): T =>\n  typeof value === 'function' ? (value as () => T)() : isReactive(value) ? value.value : value;\n\n/**\n * Characters that can break out of a CSS declaration in an inline style value or property name.\n * Semicolons end the current declaration; braces are meaningful in stylesheet rules but not\n * inline style values, and signal an injection attempt there.\n */\nexport const UNSAFE_CSS_CHARS = /[;{}]/g;\n\nexport const sanitizeCssToken = (value: string): string => value.replace(UNSAFE_CSS_CHARS, '');\n\nexport const runAll = (fns: (() => void)[]): void => {\n  for (let i = fns.length - 1; i >= 0; i--) fns[i]?.();\n};\n\nexport const removeNodes = (nodes: Node[]): void => {\n  for (const node of nodes) {\n    (node as ChildNode).remove();\n  }\n};\n\n/**\n * Tracks \"whatever is currently rendered in one spot\" — a list of live DOM nodes plus the\n * cleanup functions that were registered while mounting them. `clear()` tears both down and\n * resets to empty, ready for the next render.\n *\n * Every directive/binding that swaps its rendered content when a reactive source changes\n * (`when()`, `unsafeHtml()`, `each()`'s empty-list fallback, `applyHtmlBinding()`) needs exactly this\n * bookkeeping — this is the one shared implementation instead of four independently-maintained\n * `currentNodes`/`currentCleanups` variable pairs.\n */\nexport type ReplaceableSlot = {\n  /** Tears down every registered cleanup and removes every tracked node, then resets to empty. */\n  clear(): void;\n  /** Currently tracked nodes — read after mounting to know what's live. */\n  readonly nodes: Node[];\n  /** Pass as the `registerCleanup` callback to whatever mounts the next render. */\n  registerCleanup(fn: () => void): void;\n  /** Replace the tracked node list (call once mounting the next render is complete). */\n  setNodes(nodes: Node[]): void;\n};\n\nexport const createReplaceableSlot = (): ReplaceableSlot => {\n  let nodes: Node[] = [];\n  let cleanups: (() => void)[] = [];\n\n  return {\n    clear() {\n      runAll(cleanups);\n      removeNodes(nodes);\n      cleanups = [];\n      nodes = [];\n    },\n    get nodes() {\n      return nodes;\n    },\n    registerCleanup(fn) {\n      cleanups.push(fn);\n    },\n    setNodes(next) {\n      nodes = next;\n    },\n  };\n};\n\n/**\n * HTML attributes that accept URLs. Values bound to these attributes are\n * checked for dangerous schemes before being set.\n *\n * `srcdoc` is deliberately excluded: it holds raw HTML (not a URL), so scheme\n * checking doesn't apply — it's blocked unconditionally below, alongside `on*`.\n */\nconst URL_ATTRS = new Set([\n  'action',\n  'cite',\n  'codebase',\n  'data',\n  'formaction',\n  'href',\n  'manifest',\n  'ping',\n  'poster',\n  'src',\n  'xlink:href',\n]);\n\n/**\n * Schemes that execute JavaScript or can embed arbitrary HTML. Blocked\n * unconditionally in URL-accepting attributes.\n * Covers: javascript:, vbscript:, blob:, and data: variants that carry HTML/XML\n * or script-capable SVG. Plain data: image URIs (e.g. data:image/png) are\n * intentionally allowed.\n */\nconst DANGEROUS_SCHEME_RE =\n  /^\\s*(?:(?:javascript|vbscript|blob):|data:(?:[^,]*\\/(?:html|svg\\+xml)|application\\/(?:xhtml|xml)))/i;\n\nexport const setAttr = (el: Element, name: string, val: unknown): void => {\n  const lowerName = name.toLowerCase();\n\n  if (/^on[a-z]/i.test(name)) {\n    warn(\n      `Blocked setAttribute(\"${name}\", ...) — inline event handler attributes are not supported. Use @${name.slice(2)} binding syntax instead.`,\n    );\n    el.removeAttribute(name);\n\n    return;\n  }\n\n  if (lowerName === 'srcdoc') {\n    warn(\n      `Blocked setAttribute(\"srcdoc\", ...) — \"srcdoc\" holds raw HTML, not a URL, and is not supported via attribute binding. Sanitize untrusted content, then use unsafeHtml() if HTML injection is required.`,\n    );\n    el.removeAttribute(name);\n\n    return;\n  }\n\n  if (val == null || val === false) {\n    el.removeAttribute(name);\n\n    return;\n  }\n\n  const strVal = val === true ? 'true' : String(val);\n\n  if (URL_ATTRS.has(lowerName) && DANGEROUS_SCHEME_RE.test(strVal)) {\n    warn(\n      `Blocked dangerous URL scheme in attribute \"${name}\". Only safe URLs are permitted in URL-accepting attributes.`,\n    );\n    el.removeAttribute(name);\n\n    return;\n  }\n\n  el.setAttribute(name, strVal);\n};\n\nexport const listen = (\n  el: EventTarget | null | undefined,\n  name: string,\n  handler: EventListener,\n  options?: AddEventListenerOptions,\n): (() => void) => {\n  if (!el) {\n    warn(ORE_ERRORS.listenNullTarget(name));\n\n    return () => {};\n  }\n\n  const listener: EventListener = handler;\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\nexport const isStructuredValue = (value: unknown): value is object =>\n  Array.isArray(value) || (typeof value === 'object' && value !== null);\n","/**\n * Component runtime — implicit \"current component\" context plus every lifecycle\n * hook a `setup()` function can call.\n *\n * Design note: hooks are plain module-level functions (not a bag/context object\n * passed into `setup`). They resolve the active component through a single\n * module-level pointer (`currentContext`), set for the duration of `setup()` and\n * of each queued `onMounted` callback. This is the same mechanism React/Vue/Solid\n * use for their composable hooks — it lets any helper function (not just the\n * top-level `setup()` body) call `onMounted`/`onCleanup`/`bind`/... directly,\n * with no context object to thread through every layer of a composable.\n */\nimport { effect as _effect, type Cleanup, type Readable } from '@vielzeug/ripple';\n\nimport { ORE_ERRORS, OreApiError } from './errors';\nimport { listen as listenInternal } from './utils/dom';\n\n// ─── Runtime context ──────────────────────────────────────────────────────────\n// A single context object carries both the host element and mount callbacks,\n// eliminating two parallel globals that were always set together.\n\nexport type OnMountedCallback = () => Cleanup | undefined;\nexport type OnFormResetCallback = () => void;\n\nexport type RuntimeContext = {\n  element: HTMLElement;\n  formResetCallbacks: OnFormResetCallback[];\n  mountCallbacks: OnMountedCallback[];\n};\n\nlet currentContext: RuntimeContext | null = null;\n\n/**\n * @internal Create a fresh runtime context for a component element. The single\n * construction site for `RuntimeContext` — used by `BaseElement` (setup and\n * per-callback mount contexts) and by `testing/render-hook.ts`, so the test\n * harness can never silently desync from a new required field.\n */\nexport const createRuntimeContext = (element: HTMLElement): RuntimeContext => ({\n  element,\n  formResetCallbacks: [],\n  mountCallbacks: [],\n});\n\n// ─── Pending work tracking ──────────────────────────────────────────────────\n// A single counter of \"in-flight scheduled work\" across every live component\n// instance on the page — incremented when a mount-callback microtask is scheduled\n// (base-element.ts's _scheduleMountCallbacks()), decremented when it completes.\n//\n// Why this exists: `@vielzeug/ripple`'s reactive graph settles fully synchronously on\n// every signal write (see ripple's scheduling.ts) — there is no async flush queue to wait\n// for there. The only genuinely async work `testing/flush()` needs to wait for is ore's own\n// bounded, internal scheduling: `queueMicrotask`-scheduled onMounted callbacks.\n// `testing/flush()` polls `hasPendingWork()` to know precisely when that work has\n// settled, instead of draining a fixed, guessed number of microtask turns.\nlet pendingWork = 0;\n\n/**\n * @internal Mark one scheduled mount-callback microtask as started. Call the\n * returned function exactly once when it completes.\n */\nexport const beginPendingWork = (): (() => void) => {\n  pendingWork++;\n\n  let ended = false;\n\n  return () => {\n    if (ended) return;\n\n    ended = true;\n    pendingWork--;\n  };\n};\n\n/** @internal True while any tracked component work is in flight. Polled by `testing/flush()`. */\nexport const hasPendingWork = (): boolean => pendingWork > 0;\n\n/** @internal Execute fn with a given runtime context active. */\nexport const runWithContext = <T>(ctx: RuntimeContext, fn: () => T): T => {\n  const prev = currentContext;\n\n  currentContext = ctx;\n\n  try {\n    return fn();\n  } finally {\n    currentContext = prev;\n  }\n};\n\n/**\n * Returns the current runtime context, throwing a consistently-worded error\n * (naming the calling API) if called outside `setup()`. Every lifecycle/context\n * hook below routes through this — it's the single place that decides both\n * \"are we inside setup?\" and what the resulting error looks like, so the error\n * message is never worse for one hook than another.\n * @internal\n */\nexport const requireSetupContext = (api: string): RuntimeContext => {\n  if (currentContext) return currentContext;\n\n  throw new OreApiError(`${api}: ${ORE_ERRORS.lifecycleOutsideSetup}`);\n};\n\n/**\n * Returns the current component's host element.\n * Only valid synchronously during component `setup()` (or inside a composable\n * called from it) — throws otherwise.\n */\nexport const getHost = (): HTMLElement => requireSetupContext('getHost').element;\n\nexport const tryRegisterCleanup = (fn: Cleanup): boolean => {\n  if (!currentContext) return false;\n\n  _effect(() => fn);\n\n  return true;\n};\n\n/** Registers cleanup work for component disconnect. */\nexport const onCleanup = (fn: Cleanup): void => {\n  if (!tryRegisterCleanup(fn)) throw new OreApiError(`onCleanup: ${ORE_ERRORS.lifecycleOutsideSetup}`);\n};\n\n/**\n * Register work to run after the component template mounts to the DOM.\n * Multiple callbacks run in registration order.\n */\nexport const onMounted = (fn: OnMountedCallback): void => {\n  requireSetupContext('onMounted').mountCallbacks.push(fn);\n};\n\n/**\n * Register work to run when the ancestor `<form>` is reset (native `formResetCallback`,\n * only fires for `formAssociated: true` components). Multiple callbacks run in\n * registration order, every time the form resets — unlike `onMounted`, this isn't a\n * one-shot hook.\n */\nexport const onFormReset = (fn: OnFormResetCallback): void => {\n  requireSetupContext('onFormReset').formResetCallbacks.push(fn);\n};\n\n/**\n * Create a reactive effect scoped to the component lifecycle.\n * Automatically cleaned up on component disconnect.\n * Returns a stop function that disposes the effect immediately.\n *\n * Named `watchEffect` (not `watch`) to avoid shadowing `@vielzeug/ripple`'s\n * `watch(source, callback)`, which has different semantics (explicit source,\n * old/new value pair) — the two are commonly imported in the same file.\n */\nexport const watchEffect = (fn: () => Cleanup | undefined): (() => void) => {\n  const sub = _effect(fn);\n  const stop = (): void => sub.dispose();\n\n  tryRegisterCleanup(stop);\n\n  return stop;\n};\n\n/**\n * Attach a scoped event listener that is automatically removed on component disconnect.\n * Silently no-ops when `target` is `null` or `undefined` (safe for reactive targets).\n */\nexport function onEvent<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 onEvent(\n  target: EventTarget | null | undefined,\n  event: string,\n  listener: EventListener,\n  options?: AddEventListenerOptions,\n): void {\n  requireSetupContext('onEvent');\n\n  if (!target) return;\n\n  const cleanup = listenInternal(target, event, listener, options);\n\n  if (!tryRegisterCleanup(cleanup)) cleanup();\n}\n\n/**\n * Watch a ref signal and run a callback when it resolves to a non-null element.\n * The callback's return value is used as a cleanup function.\n */\nexport const onElement = <T extends HTMLElement>(\n  ref: Readable<T | null>,\n  callback: (el: T) => Cleanup | undefined | undefined,\n): (() => void) => {\n  return watchEffect(() => {\n    const el = ref.value;\n\n    if (el) return callback(el);\n  });\n};\n","/**\n * Component context injection API — `inject` / `injectStrict` / `provide` / `createContext`.\n *\n * Context values are stored on the providing element via a WeakMap registry and\n * resolved by walking up the DOM tree (including through shadow boundaries).\n * Providing is done via `provide(key, value)` inside `setup()`.\n *\n * Keys are `Symbol.for`-based (see `createContext`) so provide/inject still match\n * across a duplicated module graph — the same cross-copy survival rule as the\n * object brands in `utils/brand.ts`.\n */\n\nimport { warn } from './_dev';\nimport { ORE_ERRORS, OreApiError } from './errors';\nimport { onCleanup, type RuntimeContext, requireSetupContext } from './runtime';\n\nconst contextRegistry = new WeakMap<HTMLElement, Map<InjectionKey<unknown>, unknown>>();\n\nexport type InjectionKey<T> = symbol & {\n  readonly __ore_injection_key?: T;\n};\n\n/**\n * Build a linear ancestor chain (including shadow host boundaries).\n * Walks `parentNode` (not `parentElement`) so non-HTML intermediate parents\n * (e.g. an `SVGElement` between child and provider) don't break the chain.\n */\nconst buildAncestorChain = (start: HTMLElement): HTMLElement[] => {\n  const chain: HTMLElement[] = [];\n  let node: Node | null = start;\n\n  while (node) {\n    if (node instanceof HTMLElement) chain.push(node);\n\n    // A ShadowRoot's parentNode is null — hop to its host to keep walking.\n    node = node.parentNode ?? (node instanceof ShadowRoot ? node.host : null);\n  }\n\n  return chain;\n};\n\n/**\n * Register a context value on a specific element.\n * @internal Backs the public `provide()` — do not call directly.\n */\nconst provideOnElement = <T>(el: HTMLElement, key: InjectionKey<T>, value: T): void => {\n  const map = contextRegistry.get(el) ?? new Map<InjectionKey<unknown>, unknown>();\n\n  // `inject()` memoizes its result per consumer (see resolvedCache below), so a\n  // provider swapping the raw value after a descendant already read it would be\n  // silently ignored downstream. Provide a `Readable` (signal/computed) instead\n  // of a raw value so descendants observe updates through the value itself.\n  if (map.has(key)) {\n    warn(\n      `provide(): key already provided on <${el.localName}> — overwriting. Provide a Readable to update it instead.`,\n    );\n  }\n\n  map.set(key, value);\n  contextRegistry.set(el, map);\n};\n\n/**\n * Register a context value on the current component's host element, making it\n * available to descendant components via `inject(key)`.\n *\n * Provide a `Readable` (signal/computed) rather than a raw value if descendants\n * need to observe later changes — `inject()` resolves and caches the value once\n * per consumer, so re-calling `provide()` with a new raw value later is not seen.\n */\nexport const provide = <T>(key: InjectionKey<T>, value: T): void => {\n  const el = requireSetupContext('provide').element;\n\n  provideOnElement(el, key, value);\n\n  onCleanup(() => {\n    const map = contextRegistry.get(el);\n\n    if (!map) return;\n\n    map.delete(key);\n\n    if (map.size === 0) contextRegistry.delete(el);\n  });\n};\n\nconst NOT_FOUND_SENTINEL = Symbol('inject.not_found');\n\n/** Per-setup-context cache: avoids repeated ancestor walks for the same key. */\nconst resolvedCache = new WeakMap<object, Map<InjectionKey<unknown>, unknown>>();\n\nconst walkAndFind = <T>(element: HTMLElement, key: InjectionKey<T>): T | typeof NOT_FOUND_SENTINEL => {\n  const chain = buildAncestorChain(element);\n\n  for (const node of chain) {\n    const map = contextRegistry.get(node);\n\n    if (map?.has(key)) return map.get(key) as T;\n  }\n\n  return NOT_FOUND_SENTINEL;\n};\n\n/** Cached ancestor-walk lookup shared by `inject()` and `injectStrict()`. */\nconst lookup = <T>(ctx: RuntimeContext, key: InjectionKey<T>): T | typeof NOT_FOUND_SENTINEL => {\n  let cache = resolvedCache.get(ctx);\n\n  if (!cache) {\n    cache = new Map();\n    resolvedCache.set(ctx, cache);\n  }\n\n  const cacheKey = key as InjectionKey<unknown>;\n\n  if (!cache.has(cacheKey)) cache.set(cacheKey, walkAndFind(ctx.element, key));\n\n  return cache.get(cacheKey) as T | typeof NOT_FOUND_SENTINEL;\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  const found = lookup(requireSetupContext('inject'), key);\n\n  if (found === NOT_FOUND_SENTINEL) return rest.length > 0 ? rest[0] : undefined;\n\n  return found;\n}\n\nexport const injectStrict = <T>(key: InjectionKey<T>): T => {\n  const ctx = requireSetupContext('injectStrict');\n  const found = lookup(ctx, key);\n\n  if (found !== NOT_FOUND_SENTINEL) return found;\n\n  throw new OreApiError(ORE_ERRORS.injectStrictFailed(String(key), ctx.element.localName));\n};\n\nlet anonymousKeyCounter = 0;\n\n/**\n * Create a typed context key. `Symbol.for`-keyed (`ore:context:<description>`) so\n * a provider and an injector loaded from two bundled copies of ore still match\n * (see module header). Two `createContext('theme')` calls intentionally produce\n * the same key — use distinct descriptions for distinct contexts.\n *\n * Always pass a description: anonymous keys are minted from a per-graph counter,\n * so they do NOT survive duplicated module graphs (each copy numbers its own).\n */\nexport function createContext<T>(description?: string): InjectionKey<T> {\n  if (description === undefined) {\n    warn(\n      'createContext() called without a description — anonymous context keys do not survive duplicated module graphs.',\n    );\n  }\n\n  return Symbol.for(`ore:context:${description ?? `anonymous-${++anonymousKeyCounter}`}`) as InjectionKey<T>;\n}\n","import { type Readable, type Signal, signal } from '@vielzeug/ripple';\n\nimport { warn } from './_dev';\nimport { ORE_ERRORS, OreApiError } from './errors';\nimport { watchEffect } from './runtime';\nimport { isStructuredValue, setAttr, toKebab } from './utils/dom';\n\nexport type PropsDef<T extends Record<string, unknown>> = {\n  // All props must be explicitly defined via prop.* helpers or PropDef objects\n  [K in keyof Required<T>]: PropDef<T[K & keyof T]>;\n};\n\nexport type PropDef<T> = { readonly default: T; readonly parse: (value: string | null) => T; reflect?: boolean };\nexport type PropInputDefs = Record<string, PropDef<unknown>>;\n\n/**\n * Prop definition factory — use these helpers for all prop definitions.\n * No implicit type inference; all parser behavior is explicit and intentional.\n */\ntype PropFactory = {\n  bool(defaultValue?: boolean): PropDef<boolean>;\n  /**\n   * JS-only property — never reads from or writes to an HTML attribute.\n   * Use for complex objects, arrays, callbacks, or any non-serialisable value.\n   *\n   * @example\n   * ```ts\n   * columns:   prop.data<DataGridColumn[]>([]),\n   * config:    prop.data<Options>(),\n   * getRowKey: prop.data<(row: T) => string>(),\n   * onSelect:  prop.data<(item: T) => void>(),\n   * ```\n   */\n  data<T>(): PropDef<T | undefined>;\n  data<T>(defaultValue: T): PropDef<T>;\n  json<T>(defaultValue: T): PropDef<T>;\n  number<T extends number = number>(): PropDef<T | undefined>;\n  number<T extends number = number>(defaultValue: number): PropDef<T>;\n  oneOf<T extends string | undefined, D extends T = T>(allowed: readonly NonNullable<T>[], defaultValue: D): PropDef<T>;\n  string<T extends string = string>(): PropDef<T | undefined>;\n  string<T extends string = string>(defaultValue: string): PropDef<T>;\n};\n\n/** @internal JS-only prop implementation — never reads/writes attributes. */\nfunction _jsOnlyProp<T>(defaultValue?: T): PropDef<T | undefined> | PropDef<T> {\n  return { default: defaultValue, parse: () => defaultValue, reflect: false } as PropDef<T | undefined>;\n}\n\nexport const prop: PropFactory = {\n  /**\n   * Boolean prop — reflects its value as a presence-only attribute (toggleAttribute).\n   * Reflection is always enabled. To suppress attribute reflection for a boolean,\n   * use `prop.data<boolean>(false)` instead.\n   */\n  bool(defaultValue?: boolean): PropDef<boolean> {\n    const def = defaultValue ?? false;\n\n    return {\n      default: def,\n      parse: (value) => value !== null && value !== 'false',\n      reflect: true,\n    };\n  },\n  data<T>(defaultValue?: T): PropDef<T | undefined> | PropDef<T> {\n    return _jsOnlyProp(defaultValue);\n  },\n  /**\n   * JSON-serialisable prop — the value is stored as a JS object and parsed\n   * from the attribute via `JSON.parse`. Reflection is always disabled\n   * because serialising complex objects back to attributes on every change\n   * would be expensive and produce unreadable HTML.\n   *\n   * @example\n   * ```ts\n   * columns: prop.json<Column[]>([]),\n   * // attribute: <my-grid columns='[{\"id\":\"name\"}]'>\n   * // change not reflected back → attribute stays static after upgrade\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<T extends number = number>(defaultValue?: number): PropDef<T> | PropDef<T | undefined> {\n    const def = defaultValue !== undefined ? (defaultValue as T) : undefined;\n\n    return {\n      default: def,\n      parse: (value) => {\n        if (value == null) return def;\n\n        const n = Number(value);\n\n        if (Number.isNaN(n)) {\n          warn(`prop.number(): attribute value \"${value}\" is not a valid number, using default (${String(def)})`);\n\n          return def;\n        }\n\n        return n as T;\n      },\n      reflect: true,\n    } as PropDef<T> | PropDef<T | undefined>;\n  },\n  oneOf<T extends string | undefined, D extends T = T>(\n    allowed: readonly NonNullable<T>[],\n    defaultValue: D,\n  ): PropDef<T> {\n    return {\n      default: defaultValue,\n      parse: (value) => (value != null && allowed.includes(value as NonNullable<T>) ? (value as T) : defaultValue),\n      reflect: true,\n    };\n  },\n  string<T extends string = string>(defaultValue?: string): PropDef<T> | PropDef<T | undefined> {\n    // When no default provided, undefined sentinel → attribute removed when value is absent\n    const def = defaultValue !== undefined ? (defaultValue as T) : undefined;\n\n    return {\n      default: def,\n      parse: (value: string | null) => (value == null ? def : (value as T)),\n      reflect: true,\n    } as PropDef<T> | PropDef<T | undefined>;\n  },\n};\n\nconst isPropDef = (value: unknown): value is PropDef<unknown> =>\n  typeof value === 'object' && value !== null && 'default' in value && 'parse' in value;\n\n/**\n * Validate and normalize a prop definition.\n * Throws if definition is invalid or incomplete.\n *\n * Accepts any object shaped like `PropDef` — not just `prop.*` helper output — so you can\n * define a custom prop with explicit parser and reflection behavior when the `prop.*` helpers\n * don't cover your type:\n *\n * ```ts\n * const customProp = (): PropDef<MyCustomType> => ({\n *   default: new MyCustomType(),\n *   parse: (value) => JSON.parse(value || '{}') as MyCustomType,\n *   reflect: false,\n * });\n * ```\n */\nexport function normalizePropDefinition<T>(value: unknown, propName: string): PropDef<T> {\n  if (!isPropDef(value)) {\n    throw new OreApiError(\n      `Prop \"${propName}\" must use a prop.* helper (string/number/bool/json/oneOf). Received: ${typeof value}`,\n    );\n  }\n\n  const descriptor = value as PropDef<T>;\n\n  if (!descriptor.parse) {\n    throw new OreApiError(`Prop \"${propName}\" must have a parse function. Use prop.* helpers.`);\n  }\n\n  const reflect = descriptor.reflect ?? false;\n\n  // Validate: structured defaults with reflect:true are not allowed\n  if (reflect && isStructuredValue(descriptor.default)) {\n    throw new OreApiError(`Prop \"${propName}\": ${ORE_ERRORS.propInvalidReflect}`);\n  }\n\n  return {\n    ...descriptor,\n    reflect,\n  };\n}\n\n/**\n * Validate all prop definitions at define-time.\n * Returns validation error messages or empty array if valid.\n */\nexport function validatePropDefs(defs: Record<string, unknown>): string[] {\n  const errors: string[] = [];\n\n  for (const [key, value] of Object.entries(defs)) {\n    try {\n      normalizePropDefinition(value, key);\n    } catch (error) {\n      errors.push(error instanceof Error ? error.message : String(error));\n    }\n  }\n\n  return errors;\n}\n\n/** @internal Per-attribute prop metadata. Consumed by the template binding layer (template/binding-types.ts). */\nexport type PropMeta<T = unknown> = {\n  parse: (value: string | null) => T;\n  reflect: boolean;\n  signal: Signal<T>;\n};\n\nconst propRegistry = new WeakMap<HTMLElement, Map<string, PropMeta<unknown>>>();\n\n/**\n * Look up the registered prop metadata for a given attribute name on an element.\n * Used by the template compiler to resolve prop bindings without exposing the registry.\n */\nexport const getPropMeta = (el: HTMLElement, attrName: string): PropMeta<unknown> | undefined =>\n  propRegistry.get(el)?.get(attrName);\n\n/**\n * A framework can hand a prop a raw attribute-style string well after the element\n * has upgraded — e.g. Vue reconciling server-rendered markup against a custom\n * element that auto-upgraded from its SSR attribute before hydration ran, or\n * assigning the pre-upgrade instance property it captured before `registerProp`\n * defined the real accessor. In both cases route the string through the same\n * parser an attribute value would use (so e.g. `size=\"16\"` doesn't end up stored\n * as the string `\"16\"` instead of the number `16`). Already-typed values (objects,\n * functions, booleans, numbers set deliberately as JS properties) pass through untouched.\n */\nconst coerceIncoming = <T>(value: unknown, parse: PropDef<T>['parse']): T =>\n  (typeof value === 'string' ? parse(value) : value) as T;\n\n/** @internal Runtime prop registration (called by createProps) */\nconst registerProp = <T>(el: HTMLElement, propName: string, attrName: string, propDef: PropDef<T>): Signal<T> => {\n  let registry = propRegistry.get(el);\n\n  if (!registry) {\n    registry = new Map();\n    propRegistry.set(el, registry);\n  }\n\n  const { default: defaultValue, parse, reflect = false } = propDef;\n  const s = signal<T>(defaultValue);\n\n  // On reconnection, the prop registry still holds the previous connection's\n  // PropMeta. Its signal carries the correct prop value (updated by\n  // attributeChangedCallback between connections). We must read from it rather\n  // than from `el[propName]`, because setup() may have overwritten the host\n  // property with a different getter/setter (e.g. `defineFieldValue()` in\n  // refine's form-field components redefines `el.value` to expose the internal\n  // field string). Reading that getter would yield the wrong value and lose\n  // the prop's actual state across reconnections.\n  const existingMeta = registry.get(attrName);\n  const hasPreUpgradeProperty = Object.hasOwn(el as unknown as Record<string, unknown>, propName);\n  const preUpgradeValue = hasPreUpgradeProperty ? (el as unknown as Record<string, unknown>)[propName] : undefined;\n\n  const meta: PropMeta<unknown> = {\n    parse,\n    reflect,\n    signal: s,\n  };\n\n  if (existingMeta) {\n    s.value = existingMeta.signal.peek() as T;\n  } else if (hasPreUpgradeProperty) {\n    delete (el as unknown as Record<string, unknown>)[propName];\n    s.value = coerceIncoming(preUpgradeValue, parse);\n  } else if (el.hasAttribute(attrName)) {\n    s.value = parse(el.getAttribute(attrName)) as T;\n  }\n\n  registry.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 = coerceIncoming(value, parse);\n    },\n  });\n\n  if (reflect) {\n    watchEffect(() => {\n      const v = s.value;\n\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    });\n  }\n\n  return s;\n};\n\nexport type InferPropValue<T> = T extends PropDef<infer U> ? U : T;\n\n/**\n * Infer the reactive props object type from a `PropInputDefs` map.\n * Each entry becomes a `Reactive<T>` keyed by the prop name.\n *\n * @example\n * ```ts\n * const propDefs = { count: prop.number(0), label: prop.string('hi') };\n * type Props = InferProps<typeof propDefs>;\n * // => { readonly count: Readable<number>; readonly label: Readable<string> }\n * ```\n */\nexport type InferProps<D extends PropInputDefs> = {\n  readonly [K in keyof D]-?: Readable<InferPropValue<D[K]>>;\n};\n\nexport function createProps<D extends PropInputDefs>(el: HTMLElement, defs: D): InferProps<D> {\n  const props = {} as Record<string, Signal<unknown>>;\n\n  for (const [name, def] of Object.entries(defs)) {\n    // defs passed here are already normalized by define(); skip re-normalization.\n    const attrName = toKebab(name);\n\n    props[name] = registerProp(el, name, attrName, def as PropDef<unknown>);\n  }\n\n  return props as unknown as InferProps<D>;\n}\n","/**\n * The package's single object-branding mechanism: a `Symbol.for`-keyed property stamp.\n *\n * Why `Symbol.for` and not identity checks (`WeakSet`, `instanceof`): `Symbol.for` keys are\n * process-global, so brands survive a duplicated module graph (two copies of ore bundled into\n * one page — the exact failure mode `src/iife.ts`'s header documents). Identity-based checks\n * silently fail across those copies: an object stamped by one graph is invisible to the other.\n * Every branded runtime object in ore (`HTMLResult`, `DirectiveResult`,\n * `LiveBinding`, `CSSResult`) goes through this helper — do not introduce a second mechanism.\n */\n\nexport type Brand<T extends object> = {\n  is: (value: unknown) => value is T;\n  stamp: (obj: T) => T;\n};\n\nexport const makeBrand = <T extends object>(key: string): Brand<T> => {\n  const BRAND = Symbol.for(key);\n  const stamp = (obj: T): T => Object.assign(obj, { [BRAND]: true });\n  const is = (value: unknown): value is T => typeof value === 'object' && value !== null && BRAND in (value as object);\n\n  return { is, stamp };\n};\n","/**\n * CSS tagged template utility and CSSStyleSheet caching.\n */\n\nimport { error } from '../_dev';\nimport { makeBrand } from './brand';\n\nexport type CSSResult = {\n  content: string;\n  toString(): string;\n};\n\nconst cssResultBrand = makeBrand<CSSResult>('ore:css-result');\n\nexport const isCssResult = cssResultBrand.is;\n\nconst cssResultToString = function (this: CSSResult): string {\n  return this.content;\n};\n\nexport const css = (strings: TemplateStringsArray, ...values: Array<CSSResult | string | number>): 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 : String(v);\n    }\n  }\n\n  return cssResultBrand.stamp({ content: content.trim(), toString: cssResultToString });\n};\n\nconst stylesheetStringCache = new Map<string, CSSStyleSheet>();\nconst STYLESHEET_CACHE_LIMIT = 256;\n\n/** @internal Clear the stylesheet cache. Used for test isolation and HMR. */\nexport const _clearStylesheetCache = (): void => {\n  stylesheetStringCache.clear();\n};\n\n/** @internal Visible to cache-behavior tests. */\nexport const _getStylesheetCacheSize = (): number => stylesheetStringCache.size;\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) {\n    // Refresh recency so styles repeatedly adopted by components survive eviction.\n    stylesheetStringCache.delete(cssText);\n    stylesheetStringCache.set(cssText, cached);\n\n    return cached;\n  }\n\n  const sheet = new CSSStyleSheet();\n\n  try {\n    sheet.replaceSync(cssText);\n  } catch (err) {\n    // Deliberately not cached: a broken sheet served from cache would fail silently\n    // for every subsequent caller with no further error.\n    error('Style sheet replace failed', err);\n\n    return sheet;\n  }\n\n  stylesheetStringCache.set(cssText, sheet);\n\n  if (stylesheetStringCache.size > STYLESHEET_CACHE_LIMIT) {\n    const oldestKey = stylesheetStringCache.keys().next().value;\n\n    if (oldestKey !== undefined) stylesheetStringCache.delete(oldestKey);\n  }\n\n  return sheet;\n};\n","import { createScope, type Scope, untrack } from '@vielzeug/ripple';\n\nimport type { ComponentDefinition } from './component-types';\n\nimport { ORE_ERRORS, OreApiError, type OreErrorPhase, OreLifecycleError, reportRuntimeError } from './errors';\nimport { createProps, getPropMeta, type InferProps, type PropInputDefs, type PropsDef } from './props';\nimport {\n  beginPendingWork,\n  createRuntimeContext,\n  type OnFormResetCallback,\n  type OnMountedCallback,\n  onCleanup,\n  runWithContext,\n} from './runtime';\nimport type { HTMLResult } from './template/result';\nimport { loadStylesheet } from './utils/css';\n\n// ─── Component phases & lifecycle events ──────────────────────────────────────\n// Internal to BaseElement — the only state machine and event dispatcher in the package.\n\nconst ComponentPhase = {\n  SETUP_DONE: 'setup_done',\n  SETUP_RUNNING: 'setup_running',\n  UNINITIALIZED: 'uninitialized',\n  UNMOUNTED: 'unmounted',\n} as const;\n\ntype ComponentPhase = (typeof ComponentPhase)[keyof typeof ComponentPhase];\n\nconst LIFECYCLE_EVENTS = {\n  CONNECT: 'ore:connect',\n  DISCONNECT: 'ore:disconnect',\n} as const;\n\n// ─── Internal component state ─────────────────────────────────────────────────\n\ntype ComponentState = {\n  /** Registered via `onFormReset()` — persists across mount callbacks, unlike `mountCallbacks`. */\n  formResetCallbacks: OnFormResetCallback[];\n  /** Incremented on every disconnect — invalidates queued mount callbacks. */\n  generation: number;\n  mountCallbacks: OnMountedCallback[];\n  phase: ComponentPhase;\n  scope: Scope;\n  templateResult: HTMLResult | null;\n};\n\nconst createComponentState = (): ComponentState => ({\n  formResetCallbacks: [],\n  generation: 0,\n  mountCallbacks: [],\n  phase: ComponentPhase.UNINITIALIZED,\n  scope: createScope(),\n  templateResult: null,\n});\n\nconst isPromiseLike = (value: unknown): value is PromiseLike<unknown> =>\n  (typeof value === 'object' || typeof value === 'function') &&\n  value !== null &&\n  'then' in value &&\n  typeof value.then === 'function';\n\n// ─── BaseElement ──────────────────────────────────────────────────────────────\n\n/**\n * Phase transitions:\n *\n * ```\n * UNINITIALIZED ──_runSetup()──► SETUP_DONE\n * SETUP_DONE ──disconnectedCallback()──► UNMOUNTED ──(reset)──► UNINITIALIZED\n * ```\n *\n * `generation` increments on every disconnect. Scheduled mount callbacks capture\n * it so callbacks belonging to a disconnected instance cannot run after a\n * reconnect (see `_isStale`).\n *\n * Why this lives on the class instead of a standalone pure reducer: every\n * transition here is triggered by running actual user code (`def.setup()`,\n * `onMounted` callbacks) inside a reactive `scope.run()` + `runWithContext()`\n * — there is no meaningful \"decide the next phase\" step that can be separated\n * from \"run the side-effecting thing that produces the phase change\" without\n * introducing a data-only effect-description layer that this package has no\n * other use for. That's why the methods below stay as direct, readable\n * procedural steps instead of a reducer + effect interpreter.\n */\nexport class BaseElement extends HTMLElement {\n  static _definition: ComponentDefinition;\n  static _normalizedPropDefs: PropsDef<Record<never, never>> | undefined;\n  static formAssociated = false;\n  static observedAttributes: string[] = [];\n\n  private _component: ComponentState;\n\n  constructor() {\n    super();\n\n    const def = (this.constructor as typeof BaseElement)._definition;\n\n    if (def?.shadow !== false) {\n      this.attachShadow({ mode: 'open', ...(def?.shadow as Partial<ShadowRootInit> | undefined) });\n    }\n\n    this._component = createComponentState();\n  }\n\n  connectedCallback(): void {\n    untrack(() => {\n      if (this._component.phase === ComponentPhase.UNINITIALIZED) this._runSetup();\n\n      this._init();\n    });\n    this.dispatchEvent(new CustomEvent(LIFECYCLE_EVENTS.CONNECT, { bubbles: false, composed: false }));\n  }\n\n  attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n    if (oldValue === newValue) return;\n\n    const propMeta = getPropMeta(this, 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  disconnectedCallback(): void {\n    this._component.generation++;\n    this._component.phase = ComponentPhase.UNMOUNTED;\n    this.dispatchEvent(new CustomEvent(LIFECYCLE_EVENTS.DISCONNECT, { bubbles: false, composed: false }));\n    this._resetSetupState();\n  }\n\n  /** Dispose one connection's resources before its state can be rebuilt. */\n  private _resetSetupState(): void {\n    this._component.scope.dispose();\n    // Reset mutable fields for next connection, keeping the same object for stable references.\n    this._component.formResetCallbacks = [];\n    this._component.mountCallbacks = [];\n    this._component.phase = ComponentPhase.UNINITIALIZED;\n    this._component.scope = createScope();\n    this._component.templateResult = null;\n  }\n\n  /**\n   * Native form-association lifecycle callback — the browser calls this on every\n   * `formAssociated: true` element inside a `<form>` when that form is reset.\n   * Runs every `onFormReset()` callback registered during `setup()`.\n   */\n  formResetCallback(): void {\n    for (const callback of this._component.formResetCallbacks) {\n      try {\n        callback();\n      } catch (error) {\n        this._reportLifecycleError(error, 'form-reset');\n      }\n    }\n  }\n\n  private _reportLifecycleError(error: unknown, phase: OreErrorPhase): void {\n    const err = error instanceof Error ? error : new Error(String(error));\n    const oreError = new OreLifecycleError(`<${this.localName}> failed during ${this._component.phase} (${phase})`, {\n      cause: err,\n      component: this.localName,\n      phase,\n    });\n\n    reportRuntimeError(oreError, this);\n  }\n\n  private _runSetup(): void {\n    this._component.phase = ComponentPhase.SETUP_RUNNING;\n\n    const def = (this.constructor as typeof BaseElement)._definition;\n    const normalizedPropDefs = (this.constructor as typeof BaseElement)._normalizedPropDefs;\n    const ctx = createRuntimeContext(this);\n\n    try {\n      let setupResult: HTMLResult | null | undefined;\n\n      this._component.scope.run(() => {\n        setupResult = runWithContext(ctx, () => {\n          const setupProps = normalizedPropDefs\n            ? createProps(this, normalizedPropDefs)\n            : ({} as InferProps<PropInputDefs>);\n\n          return def.setup(setupProps as InferProps<PropInputDefs>);\n        });\n      });\n      this._component.mountCallbacks.push(...ctx.mountCallbacks);\n      this._component.formResetCallbacks.push(...ctx.formResetCallbacks);\n\n      if (isPromiseLike(setupResult)) throw new OreApiError(ORE_ERRORS.asyncSetupUnsupported);\n\n      this._component.templateResult = setupResult ?? null;\n      this._component.phase = ComponentPhase.SETUP_DONE;\n    } catch (error) {\n      this._reportLifecycleError(error, 'setup');\n      // Setup is atomic: a failed run must not leave partial effects or cleanups\n      // live until a later disconnect.\n      this._resetSetupState();\n      throw error;\n    }\n  }\n\n  private _isStale(capturedGeneration: number): boolean {\n    return this._component.generation !== capturedGeneration || !this.isConnected;\n  }\n\n  private _applyResult(result: HTMLResult | null): void {\n    if (!result) return;\n\n    const host: Element | ShadowRoot = this.shadowRoot ?? this;\n\n    // Mounting can register component cleanup, so preserve a runtime context here too.\n    const context = createRuntimeContext(this);\n\n    host.replaceChildren();\n    this._component.scope.run(() => {\n      runWithContext(context, () => {\n        result.mount(host, null, onCleanup);\n      });\n    });\n  }\n\n  private _init(): void {\n    this._applyStyles();\n    this._mountTemplate();\n\n    // Setup completes before the template mounts, so callbacks always observe live DOM.\n    if (this._component.phase === ComponentPhase.SETUP_DONE) this._scheduleMountCallbacks();\n  }\n\n  private _applyStyles(): void {\n    const def = (this.constructor as typeof BaseElement)._definition;\n\n    if (this.shadowRoot && def?.styles?.length) {\n      this.shadowRoot.adoptedStyleSheets = def.styles.map(loadStylesheet);\n    }\n  }\n\n  private _mountTemplate(): void {\n    const result = this._component.templateResult;\n\n    if (!result) return;\n\n    this._applyResult(result);\n  }\n\n  private _scheduleMountCallbacks(): void {\n    if (this._component.mountCallbacks.length === 0) return;\n\n    const capturedGeneration = this._component.generation;\n    // Tracked as pending work for the duration of this microtask — ended in a `finally`\n    // so a thrown callback (already caught per-callback below, but defensive here too)\n    // never leaves the counter stuck above zero. See runtime.ts's beginPendingWork().\n    const endWork = beginPendingWork();\n\n    queueMicrotask(() => {\n      try {\n        if (this._isStale(capturedGeneration)) return;\n\n        // Snapshot callbacks so in-loop registrations don't extend this iteration.\n        // Nested onMounted registrations are appended to `batch` and run in the same\n        // microtask — no recursive scheduling. Index-based loop because the array\n        // grows as nested callbacks are discovered.\n        const batch = this._component.mountCallbacks.splice(0);\n\n        for (let i = 0; i < batch.length; i++) {\n          const callback = batch[i];\n\n          try {\n            const nestedCtx = createRuntimeContext(this);\n\n            this._component.scope.run(() => {\n              runWithContext(nestedCtx, () => {\n                const cleanup = callback();\n\n                if (typeof cleanup === 'function') onCleanup(cleanup);\n              });\n            });\n\n            if (nestedCtx.mountCallbacks.length > 0) {\n              batch.push(...nestedCtx.mountCallbacks);\n            }\n\n            if (nestedCtx.formResetCallbacks.length > 0) {\n              this._component.formResetCallbacks.push(...nestedCtx.formResetCallbacks);\n            }\n          } catch (error) {\n            this._reportLifecycleError(error, 'mounted');\n          }\n        }\n      } finally {\n        endWork();\n      }\n    });\n  }\n}\n","import { BaseElement } from './base-element';\nimport type { ComponentDefinition } from './component-types';\nimport { ORE_ERRORS, OreApiError } from './errors';\nimport { normalizePropDefinition, type PropInputDefs, type PropsDef, validatePropDefs } from './props';\nimport { toKebab } from './utils/dom';\n\n/**\n * Builds the element class without touching the browser registry. Keeping\n * declaration work separate from registration makes the latter the only\n * irreversible global side effect in the component-definition path.\n *\n * @internal\n */\nexport function createComponentClass<Props extends Record<string, unknown>>(\n  tag: string,\n  definition: ComponentDefinition<Props>,\n): CustomElementConstructor {\n  const { props: propDefs } = definition;\n\n  const normalizedPropDefs: PropsDef<Props> | undefined = (() => {\n    if (!propDefs) return undefined;\n\n    const errors = validatePropDefs(propDefs as Record<string, unknown>);\n\n    if (errors.length > 0) throw new OreApiError(ORE_ERRORS.validationFailed(tag, errors));\n\n    const normalized: PropInputDefs = {};\n\n    for (const [key, def] of Object.entries(propDefs)) {\n      normalized[key] = normalizePropDefinition(def, key);\n    }\n\n    return normalized as PropsDef<Props>;\n  })();\n\n  const observedAttrs = normalizedPropDefs ? Object.keys(normalizedPropDefs).map(toKebab) : [];\n\n  const ComponentClass = class extends BaseElement {\n    static override _definition = definition as unknown as ComponentDefinition;\n    static override _normalizedPropDefs = normalizedPropDefs as PropsDef<Record<never, never>> | undefined;\n    static override formAssociated = definition.formAssociated ?? false;\n    static override observedAttributes = observedAttrs;\n  };\n\n  return ComponentClass;\n}\n","import { createComponentClass } from './_component-class';\nimport type { ComponentDefinition } from './component-types';\nimport { ORE_ERRORS, OreApiError } from './errors';\nimport { type PropDef, prop } from './props';\n\nexport type { HostBindFn } from './host-bind';\nexport type { PropDef };\nexport { prop };\n\n/**\n * Define and register a web component.\n *\n * The `setup` function runs for each connection and returns an `HTMLResult`.\n * Disconnecting disposes its state; reconnecting rebuilds it. All reactive\n * behaviour within a connection is expressed through directives inside the\n * template — not by re-evaluating setup itself.\n *\n * Everything besides `props` — lifecycle hooks, host bindings, context, slots,\n * emit — is a free function imported from `@vielzeug/ore` and called directly\n * from inside `setup()` (or from a composable it calls):\n *\n * ```ts\n * import { define, html, prop, onMounted, useEmit, useSlots } from '@vielzeug/ore';\n *\n * define<{ count?: number }>('my-counter', {\n *   props: { count: prop.number(0) },\n *   setup(props) {\n *     const emit = useEmit<{ increment: number }>();\n *     const slots = useSlots<'header' | 'footer'>();\n *\n *     onMounted(() => console.log('mounted'));\n *\n *     return html`<button @click=${() => emit('increment', props.count.value + 1)}>${props.count}</button>`;\n *   },\n * });\n * ```\n */\nexport function define<Props extends Record<string, unknown> = Record<never, never>>(\n  tag: string,\n  definition: ComponentDefinition<Props>,\n): void {\n  if (!tag) throw new OreApiError(ORE_ERRORS.defineRequiresTag);\n\n  if (customElements.get(tag)) throw new OreApiError(ORE_ERRORS.defineDuplicate(tag));\n\n  const ComponentClass = createComponentClass(tag, definition);\n\n  // Registration is intentionally the sole global side effect of define().\n  Object.defineProperty(ComponentClass, 'name', { value: tag });\n  customElements.define(tag, ComponentClass);\n}\n","import { computed, type Readable } from '@vielzeug/ripple';\n\nimport { resolveMaybeReactive } from '../utils/dom';\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 `Reactive<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 = (map: Record<string, (() => boolean) | Readable<boolean> | boolean>): Readable<string> => {\n  return computed(() =>\n    Object.entries(map)\n      .filter(([, v]) => resolveMaybeReactive(v))\n      // Strip whitespace from each key — spaces would inject extra class tokens.\n      .map(([k]) => k.replace(/\\s+/g, ''))\n      .filter(Boolean)\n      .join(' '),\n  );\n};\n","/**\n * template/result.ts — Branded result objects produced by the template authoring APIs.\n *\n * Runtime code (factories, brand guards) lives here next to the template engine that\n * consumes it; pure binding-shape types live in `binding-types.ts`. All branding goes\n * through `utils/brand.ts` (`Symbol.for`) — see that module for why.\n */\n\nimport { type Signal, signal } from '@vielzeug/ripple';\n\nimport { makeBrand } from '../utils/brand';\n\n// ─── Refs ─────────────────────────────────────────────────────────────────────\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 RefCallback<T extends Element> = (el: T | null) => void;\n\n// ─── Directive result ─────────────────────────────────────────────────────────\n\nexport type DirectiveResult = {\n  mount: (anchor: Comment, registerCleanup: (fn: () => void) => void) => void;\n};\n\nconst directiveBrand = makeBrand<DirectiveResult>('ore:directive');\n\n/**\n * Creates a registered DirectiveResult. All directive factories must use this\n * function — only objects created here pass `isDirectiveResult()`.\n */\nexport const createDirectiveResult = (mount: DirectiveResult['mount']): DirectiveResult =>\n  directiveBrand.stamp({ mount });\n\nexport const isDirectiveResult = directiveBrand.is;\n\n// ─── HTML result ──────────────────────────────────────────────────────────────\n\n/**\n * The output of an `html` tagged template call.\n *\n * Each `html` call produces an independent fragment — there is no shared mutable\n * state between instances, so the same template can be safely rendered multiple\n * times (e.g. inside `each()`).\n *\n * `mount()` is the entire public surface: insertion and reactive wiring in one\n * step, so the two can never get out of sync (the old public `fragment` + `apply`\n * pair made it possible to insert without wiring, or wire without inserting).\n */\nexport interface HTMLResult {\n  /**\n   * Insert the template's nodes before `anchor` (or append to `parent` when\n   * `anchor` is null) and wire up all reactive effects. Returns the inserted\n   * nodes so callers can remove them later.\n   */\n  mount(parent: ParentNode, anchor: Node | null, registerCleanup: (fn: () => void) => void): Node[];\n}\n\n/**\n * @internal The full result the template engine itself works with. `fragment` and\n * `apply` are the engine's own two-phase insertion protocol (static-embed merging in\n * the instantiator, `insertHtmlValues` in the binding layer) — not part of the\n * public API. Consumers only ever see `HTMLResult`.\n */\nexport interface CompiledHTMLResult extends HTMLResult {\n  /** Wire up reactive effects to the fragment's nodes. Call after insertion. */\n  apply(registerCleanup: (fn: () => void) => void): void;\n  /** The DOM fragment ready to insert into the document. Consumed on insertion. */\n  readonly fragment: DocumentFragment;\n}\n\nconst htmlResultBrand = makeBrand<CompiledHTMLResult>('ore:html-result');\n\nexport const isHtmlResult = htmlResultBrand.is;\n\nexport function createHtmlResult(\n  fragment: DocumentFragment,\n  applyFn: (registerCleanup: (fn: () => void) => void) => void,\n): CompiledHTMLResult {\n  const mount = (parent: ParentNode, anchor: Node | null, registerCleanup: (fn: () => void) => void): Node[] => {\n    const nodes = Array.from(fragment.childNodes);\n\n    parent.insertBefore(fragment, anchor);\n    applyFn(registerCleanup);\n\n    return nodes;\n  };\n\n  return htmlResultBrand.stamp({ apply: applyFn, fragment, mount });\n}\n","import {\n  batch,\n  computed,\n  createScope,\n  type Readable,\n  effect as rawEffect,\n  type Scope,\n  type Signal,\n  signal,\n  untrack,\n} from '@vielzeug/ripple';\n\nimport { invariant, ORE_ERRORS, OreApiError, OreLifecycleError, reportRuntimeError } from '../errors';\nimport { createDirectiveResult, type DirectiveResult, type HTMLResult } from '../template/result';\nimport { removeNodes, runAll } from '../utils/dom';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ntype MaybeReactiveArray<T> = Readable<T[]> | (() => T[]) | T[];\n\ntype ItemEntry<T> = {\n  cleanups: (() => void)[];\n  data: Signal<T>;\n  index: Signal<number>;\n  /** The key used to identify this entry. */\n  key: string;\n  nodes: Node[];\n  scope: Scope;\n};\n\n// ─── Item lifecycle ───────────────────────────────────────────────────────────\n\nconst createItem = <T>(\n  item: T,\n  index: number,\n  render: (item: Readable<T>, index: Readable<number>) => HTMLResult,\n  parent: ParentNode,\n  insertBefore: Node,\n): ItemEntry<T> => {\n  const dataSignal: Signal<T> = signal(item);\n  const indexSignal: Signal<number> = signal(index);\n  const scope = createScope();\n  const cleanups: (() => void)[] = [];\n  let nodes: Node[] = [];\n\n  scope.run(() => {\n    const result = render(dataSignal, indexSignal);\n\n    nodes = result.mount(parent, insertBefore, (fn) => cleanups.push(fn));\n  });\n\n  return { cleanups, data: dataSignal, index: indexSignal, key: '', nodes, scope };\n};\n\nconst removeItem = <T>(entry: ItemEntry<T>): void => {\n  entry.scope.dispose();\n  runAll(entry.cleanups);\n  removeNodes(entry.nodes);\n};\n\n// ─── Reconciler ───────────────────────────────────────────────────────────────\n\n/**\n * Reconciles the live item map (mutated in-place) against the next array.\n * Stale entries are removed and destroyed; new entries are created and inserted.\n * Existing entries are updated in-place via signal writes.\n * Returns the ordered list of entries matching nextList.\n */\nconst reconcileItems = <T>(\n  itemsMap: Map<string, ItemEntry<T>>,\n  next: T[],\n  keyFn: (item: T, index: number) => string | number,\n  render: (item: Readable<T>, index: Readable<number>) => HTMLResult,\n  parent: ParentNode,\n  endMarker: Node,\n): ItemEntry<T>[] => {\n  const nextKeys: string[] = [];\n  const nextKeySet = new Set<string>();\n\n  for (let i = 0; i < next.length; i++) {\n    const key = String(keyFn(next[i], i));\n\n    if (nextKeySet.has(key)) throw new OreApiError(ORE_ERRORS.eachDuplicateKey(key, i));\n\n    nextKeySet.add(key);\n    nextKeys.push(key);\n  }\n\n  // Remove stale entries from the map\n  for (const [key, entry] of itemsMap) {\n    if (!nextKeySet.has(key)) {\n      removeItem(entry);\n      itemsMap.delete(key);\n    }\n  }\n\n  // Build the next ordered list: update existing items, create new ones\n  const nextOrdered: ItemEntry<T>[] = [];\n\n  for (let i = 0; i < next.length; i++) {\n    const key = nextKeys[i];\n    const existing = itemsMap.get(key);\n\n    if (existing) {\n      batch(() => {\n        existing.data.value = next[i];\n        existing.index.value = i;\n      });\n      nextOrdered.push(existing);\n    } else {\n      const entry = untrack(() => createItem(next[i], i, render, parent, endMarker));\n\n      entry.key = key;\n      itemsMap.set(key, entry);\n      nextOrdered.push(entry);\n    }\n  }\n\n  // DOM ordering: right-to-left pass — move any item not already adjacent to cursor.\n  // O(n) DOM operations in the worst case; optimal for the typical small list sizes\n  // encountered in UI components (tabs, options, menu items).\n  let cursor: Node = endMarker;\n\n  for (let j = nextOrdered.length - 1; j >= 0; j--) {\n    const entry = nextOrdered[j];\n    const firstNode = entry.nodes[0];\n\n    if (firstNode && firstNode !== cursor.previousSibling) {\n      for (const node of entry.nodes) parent.insertBefore(node, cursor);\n    }\n\n    cursor = firstNode ?? cursor;\n  }\n\n  return nextOrdered;\n};\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Renders a keyed list of items as a `DirectiveResult`.\n *\n * Each item is rendered by the provided render function.\n * Items are reused by key when the list changes; only stale items are destroyed.\n *\n * The render function receives a `Readable<T>` signal and a `Readable<number>` index\n * signal. Use `item.value` to read the current item inside reactive expressions:\n *\n * ```ts\n * html`${each(items, (item) => item.id, (item) => html`<li>${() => item.value.name}</li>`)}`\n * ```\n *\n * **Plain array:** when a plain `T[]` is passed (not a signal or getter), it is\n * treated as a one-time static render. Mutations to the original array are not\n * tracked. Pass a `Signal<T[]>` or `() => T[]` for reactive lists.\n *\n * **Optional fallback:** the fourth argument renders when the list is empty.\n *\n * **Key choice:** pass a stable item identifier (e.g. `item.id`), never the\n * array index — an index-based key reassigns to a different item whenever the\n * list is reordered or an item is inserted/removed before it, causing full\n * item teardown/recreation instead of the in-place update `each()` is built\n * for.\n *\n * **Duplicate keys:** a reconciliation failure (e.g. duplicate keys, see `eachDuplicateKey`)\n * does not throw past this function — an uncaught exception inside the reactive effect that\n * drives `each()` would risk corrupting unrelated effects scheduled in the same update batch.\n * Instead the list is cleared and the failure is reported via the `ore:error` DOM event (see\n * `OreLifecycleError`, phase `'each-reconcile'`) plus a dev-only console log — listen for\n * `ore:error` on `document`/`window` to observe this in every build, including production.\n */\nexport function each<T>(\n  list: MaybeReactiveArray<T>,\n  keyFn: (item: T, index: number) => string | number,\n  render: (item: Readable<T>, index: Readable<number>) => HTMLResult,\n  fallback?: () => HTMLResult,\n): DirectiveResult {\n  const listSignal = Array.isArray(list)\n    ? signal(list as T[])\n    : typeof list === 'function'\n      ? computed(list as () => T[])\n      : list;\n\n  return createDirectiveResult((anchor, registerCleanup) => {\n    const parent = anchor.parentNode;\n\n    invariant(parent, 'each() anchor comment has no parent node');\n\n    const endMarker = document.createComment('each/end');\n\n    parent.insertBefore(endMarker, anchor.nextSibling);\n\n    let itemsMap = new Map<string, ItemEntry<T>>();\n    let itemsOrdered: ItemEntry<T>[] = [];\n    let fallbackNodes: Node[] | null = null;\n    let fallbackCleanups: (() => void)[] = [];\n\n    const mountFallback = (): void => {\n      if (!fallback) return;\n\n      const result = fallback();\n\n      fallbackNodes = result.mount(parent, endMarker, (fn) => fallbackCleanups.push(fn));\n    };\n\n    const clearFallback = (): void => {\n      if (fallbackNodes) {\n        runAll(fallbackCleanups);\n        removeNodes(fallbackNodes);\n        fallbackNodes = null;\n        fallbackCleanups = [];\n      }\n    };\n\n    const sub = rawEffect(() => {\n      const nextList = listSignal.value ?? [];\n\n      if (nextList.length === 0) {\n        for (const entry of untrack(() => itemsOrdered)) removeItem(entry);\n        itemsMap = new Map();\n        itemsOrdered = [];\n\n        if (!fallbackNodes) untrack(mountFallback);\n\n        return;\n      }\n\n      clearFallback();\n\n      try {\n        itemsOrdered = untrack(() => reconcileItems(itemsMap, nextList, keyFn, render, parent, endMarker));\n      } catch (err) {\n        const cause = err instanceof Error ? err : new Error(String(err));\n\n        // Dispatched on the anchor comment (always a live DOM node) rather than the enclosing\n        // component's host element, which each() has no direct reference to — the event still\n        // bubbles/composes up to any ancestor listener, including a global one on document.\n        reportRuntimeError(\n          new OreLifecycleError(`each() failed to reconcile a list update: ${cause.message}`, {\n            cause,\n            component: 'each()',\n            phase: 'each-reconcile',\n          }),\n          anchor,\n        );\n\n        for (const entry of itemsMap.values()) removeItem(entry);\n        itemsMap = new Map();\n        itemsOrdered = [];\n      }\n    });\n\n    registerCleanup(() => sub.dispose());\n    registerCleanup(() => {\n      clearFallback();\n      for (const entry of itemsOrdered) removeItem(entry);\n      endMarker.remove();\n    });\n  });\n}\n","import type { Readable } from '@vielzeug/ripple';\n\nimport { makeBrand } from '../utils/brand';\n\n/**\n * A per-binding marker produced by `live()`. Wraps the source signal — the\n * \"live\" flag belongs to this one binding site, never to the signal itself,\n * so other bindings of the same signal are unaffected.\n *\n * @example\n * html`<input value=\"${live(model)}\" />`\n */\nexport type LiveBinding<T> = { readonly source: Readable<T> };\n\nconst liveBrand = makeBrand<LiveBinding<unknown>>('ore:live');\n\n/**\n * Marks one attribute binding as \"live\" so stale app-state writes never clobber\n * in-progress user input at that binding site.\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: Readable<T>): LiveBinding<T> => liveBrand.stamp({ source }) as LiveBinding<T>;\n\nexport const isLiveBinding = liveBrand.is;\n","import { computed, type Readable } from '@vielzeug/ripple';\n\nimport { resolveMaybeReactive, sanitizeCssToken, toKebab } from '../utils/dom';\n\ntype StyleInput =\n  | string\n  | number\n  | null\n  | undefined\n  | false\n  | (() => string | number | null | undefined | false)\n  | Readable<string | number | null | undefined | false>;\n\nconst toStyleValue = (value: StyleInput): string => {\n  const resolved = resolveMaybeReactive(value);\n\n  if (resolved == null || resolved === false) return '';\n\n  return sanitizeCssToken(String(resolved));\n};\n\n/**\n * Builds a reactive inline style string from a style object.\n *\n * Takes a record of CSS property names (camelCase) with values that can be:\n * - Static strings/numbers\n * - Functions that return strings/numbers\n * - Signals for reactive updates\n *\n * @example\n * ```ts\n * const color = signal('red');\n * const size = signal(16);\n *\n * html`<div style=${styleMap({\n *   backgroundColor: color,\n *   width: () => `${size.value}px`,\n *   padding: '10px'\n * })}></div>`\n * ```\n */\nexport const styleMap = (record: Record<string, StyleInput>): Readable<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      const safeName = sanitizeCssToken(toKebab(name));\n\n      if (!safeName) continue;\n\n      declarations.push(`${safeName}:${value}`);\n    }\n\n    return declarations.join(';');\n  });\n};\n","import { computed, isReactive, type Readable, effect as rawEffect, type Signal } from '@vielzeug/ripple';\n\nimport { invariant } from '../errors';\nimport { createDirectiveResult, type DirectiveResult } from '../template/result';\nimport { createReplaceableSlot } from '../utils/dom';\n\nconst parseHtml = (html: string, parent: ParentNode, insertBefore: Node): Node[] => {\n  const tpl = document.createElement('template');\n\n  tpl.innerHTML = html;\n\n  const nodes = Array.from(tpl.content.cloneNode(true).childNodes);\n\n  for (const node of nodes) parent.insertBefore(node, insertBefore);\n\n  return nodes;\n};\n\n/**\n * Renders HTML without escaping as a DirectiveResult.\n *\n * This is intentionally named `unsafeHtml`: sanitization is an application\n * boundary, not mutable process-wide framework configuration. Sanitize\n * untrusted content before passing it here.\n *\n * Supports static strings, signals, and getter functions `() => string`.\n * When reactive, the DOM is updated in-place whenever the value changes.\n */\nexport function unsafeHtml(value: (() => string) | string | Signal<string> | Readable<string>): DirectiveResult {\n  if (typeof value === 'function') {\n    const c = computed(value);\n\n    return createDirectiveResult((anchor, registerCleanup) => {\n      unsafeHtml(c).mount(anchor, registerCleanup);\n    });\n  }\n\n  return createDirectiveResult((anchor, registerCleanup) => {\n    const parent = anchor.parentNode;\n\n    invariant(parent, 'unsafeHtml() anchor comment has no parent node');\n\n    const endMarker = document.createComment('unsafe-html/end');\n\n    parent.insertBefore(endMarker, anchor.nextSibling);\n\n    if (isReactive(value)) {\n      const slot = createReplaceableSlot();\n      const src = value as Readable<string>;\n\n      const stop = rawEffect(() => {\n        slot.clear();\n        slot.setNodes(parseHtml(src.value, parent, endMarker));\n      });\n\n      registerCleanup(() => stop.dispose());\n      registerCleanup(() => {\n        slot.clear();\n        endMarker.remove();\n      });\n    } else {\n      parseHtml(value, parent, endMarker);\n\n      registerCleanup(() => endMarker.remove());\n    }\n  });\n}\n","import { computed, isReactive, type Readable, effect as rawEffect, untrack } from '@vielzeug/ripple';\n\nimport { invariant } from '../errors';\nimport { createDirectiveResult, type DirectiveResult, type HTMLResult, isHtmlResult } from '../template/result';\nimport { createReplaceableSlot, removeNodes } from '../utils/dom';\n\ntype MaybeReactive<T> = T | (() => T) | Readable<T>;\n\ntype WhenRenderable = HTMLResult | null | undefined | false;\n\nconst NO_PARENT_MSG = 'when() anchor comment has no parent node';\n\n/**\n * Conditionally renders one of two branches as a `DirectiveResult`.\n *\n * The condition may be a boolean, signal, or getter function.\n * When the condition changes, the current branch is cleaned up and\n * the new branch is mounted in its place.\n *\n * @example\n * ```ts\n * html`${when(isLoggedIn, () => html`<p>Welcome</p>`, () => html`<p>Log in</p>`)}`\n * ```\n */\nexport function when(\n  condition: MaybeReactive<boolean>,\n  truthy: () => WhenRenderable,\n  falsy?: () => WhenRenderable,\n): DirectiveResult {\n  if (typeof condition !== 'function' && !isReactive(condition)) {\n    return createDirectiveResult((anchor, registerCleanup) => {\n      const branch = condition ? truthy() : falsy ? falsy() : null;\n\n      if (!branch || !isHtmlResult(branch)) return;\n\n      const parent = anchor.parentNode;\n\n      invariant(parent, NO_PARENT_MSG);\n\n      const nodes = branch.mount(parent, anchor, registerCleanup);\n\n      registerCleanup(() => removeNodes(nodes));\n    });\n  }\n\n  return createDirectiveResult((anchor, registerCleanup) => {\n    const ownedComputed = typeof condition === 'function' ? computed(condition as () => boolean) : null;\n    const conditionSignal = ownedComputed ?? (condition as Readable<boolean>);\n\n    const parent = anchor.parentNode;\n\n    invariant(parent, NO_PARENT_MSG);\n\n    const endMarker = document.createComment('when/end');\n\n    parent.insertBefore(endMarker, anchor.nextSibling);\n\n    const slot = createReplaceableSlot();\n\n    const sub = rawEffect(() => {\n      const next = conditionSignal.value;\n\n      slot.clear();\n\n      const branch = next ? truthy() : falsy ? falsy() : null;\n\n      if (!branch || !isHtmlResult(branch)) return;\n\n      slot.setNodes(untrack(() => branch.mount(parent, endMarker, slot.registerCleanup)));\n    });\n\n    registerCleanup(() => sub.dispose());\n    registerCleanup(() => {\n      slot.clear();\n      endMarker.remove();\n    });\n  });\n}\n","import type { Readable, Signal } from '@vielzeug/ripple';\n\nimport { warn } from '../_dev';\nimport { ORE_ERRORS, OreApiError } from '../errors';\nimport { getHost, onCleanup, onFormReset, watchEffect } from '../runtime';\n\n/** @internal */\nconst internalsRegistry = new WeakMap<HTMLElement, ElementInternals>();\n/** @internal */\nconst activeFieldRegistry = new WeakSet<HTMLElement>();\n\nexport type FormFieldOptions<T = unknown> = {\n  disabled?: Readable<boolean>;\n  /**\n   * The host element to attach `ElementInternals` to.\n   * Defaults to the element currently being set up via `getHost()`.\n   * Pass this explicitly when calling `useField` from a composable that is\n   * not called directly during `setup()` (e.g. a helper factory function).\n   */\n  el?: HTMLElement;\n  /**\n   * When `true`, a `null` or `undefined` value is submitted as an empty string\n   * (`''`) instead of `null`. This keeps the field's key present in `FormData`\n   * even when the value is absent — useful when the server expects the field to\n   * always be included.\n   *\n   * @default false\n   */\n  emptyStringForNull?: boolean;\n  /**\n   * Called when the ancestor `<form>` is reset (see `onFormReset`). Use to restore\n   * whatever local state backs `value` — `useField` itself owns no field state to reset.\n   */\n  onReset?: () => void;\n  toFormValue?: (value: T) => File | FormData | string | null;\n  /**\n   * Recomputed reactively and passed straight to `internals.setValidity()` — `null`\n   * (or omitting `validity` entirely) means always valid. Pair with `validationMessage`.\n   *\n   * @example\n   * ```ts\n   * validity: computed(() => (required.value && isBlank(value.value)) ? { valueMissing: true } : null),\n   * validationMessage: computed(() => (required.value && isBlank(value.value)) ? 'Required.' : ''),\n   * ```\n   */\n  validationMessage?: Readable<string>;\n  validity?: Readable<ValidityStateFlags | null>;\n  value: Signal<T> | Readable<T>;\n};\n\nexport type FormFieldHandle = {\n  checkValidity: () => boolean;\n  readonly internals: ElementInternals;\n  reportValidity: () => boolean;\n  /**\n   * Set (non-empty message) or clear (empty string) a custom validity error.\n   * Guards the platform's throw-on-empty-message contract — prefer this over\n   * calling `internals.setValidity` directly.\n   */\n  setCustomValidity: (message: string) => void;\n};\n\nexport const useField = <T = unknown>(options: FormFieldOptions<T>): FormFieldHandle => {\n  const host = options.el ?? getHost();\n  const ctor = host.constructor as typeof HTMLElement & { formAssociated?: boolean };\n\n  if (!ctor.formAssociated) {\n    throw new OreApiError(ORE_ERRORS.defineFieldRequiresFormAssociated(host.localName));\n  }\n\n  if (activeFieldRegistry.has(host)) {\n    throw new OreApiError(ORE_ERRORS.useFieldAlreadyCalled(host.localName));\n  }\n\n  // ElementInternals may only be attached once for an element's lifetime, while setup\n  // legitimately runs again when a custom element is reconnected.\n  const internals = internalsRegistry.get(host) ?? host.attachInternals();\n\n  internalsRegistry.set(host, internals);\n  activeFieldRegistry.add(host);\n  onCleanup(() => activeFieldRegistry.delete(host));\n\n  const toFormValue =\n    options.toFormValue ??\n    ((v: T): File | FormData | string | null => {\n      if (v == null) return options.emptyStringForNull ? '' : null;\n\n      if (v instanceof File || v instanceof FormData) return v;\n\n      return String(v);\n    });\n\n  watchEffect(() => {\n    internals.setFormValue(toFormValue(options.value.value));\n  });\n\n  const disabled = options.disabled;\n\n  if (disabled) {\n    if (!('states' in internals)) {\n      warn(\n        'useField(): ElementInternals.states (CustomStateSet) is not available in this environment — disabled state tracking skipped.',\n      );\n    } else {\n      const states = internals.states as CustomStateSet;\n\n      watchEffect(() => {\n        if (disabled.value) states.add('disabled');\n        else states.delete('disabled');\n      });\n    }\n  }\n\n  if (options.validity) {\n    watchEffect(() => {\n      const flags = options.validity?.value ?? {};\n      // Per spec, ElementInternals.setValidity() throws if any flag is true and message is\n      // empty — a caller-supplied `validity` with no matching `validationMessage` would crash\n      // this effect in a real browser. Fail safe with a generic message instead of propagating\n      // that crash, and say so loudly in dev so the real fix (pass validationMessage) gets made.\n      const hasFlag = Object.values(flags).some(Boolean);\n      const message = options.validationMessage?.value ?? '';\n\n      if (hasFlag && !message) {\n        warn(\n          'useField(): `validity` has a truthy flag but `validationMessage` is empty — internals.setValidity() ' +\n            'requires a non-empty message whenever any flag is true. Falling back to a generic message; pass ' +\n            '`validationMessage` to customize it.',\n        );\n        internals.setValidity(flags, 'Invalid value.');\n\n        return;\n      }\n\n      internals.setValidity(flags, message);\n    });\n  }\n\n  if (options.onReset) onFormReset(options.onReset);\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  };\n};\n","/**\n * Shared ARIA attribute key normalisation helpers.\n *\n * Two flavours are needed across the codebase:\n *\n * - `normalizeAriaKey`  — always adds the `aria-` prefix for non-role keys.\n *   Used by `aria()` and `bind({ aria: ... })`, where every config key is an ARIA attribute.\n *\n * - `normalizeHostAttrKey` — passes non-ARIA keys through unchanged.\n *   Used by `host.bind({ attr: ... })` where keys may be arbitrary HTML attributes.\n */\n\n/** Normalise an aria config key to a full `aria-*` attribute name. */\nexport const normalizeAriaKey = (key: string): string => {\n  if (key === 'role' || key.startsWith('aria-')) return key;\n\n  // 'ariaLabel' → 'aria-label', 'expanded' → 'aria-expanded'\n  return key.startsWith('aria') ? `aria-${key.slice(4).toLowerCase()}` : `aria-${key}`;\n};\n\n/** Normalise a host-bind attr key: aria-camelCase → aria-kebab-case; other keys pass through. */\nexport const normalizeHostAttrKey = (key: string): string => {\n  if (key === 'role' || key.startsWith('aria-')) return key;\n\n  // 'ariaLabel' → 'aria-label', other keys unchanged\n  return key.startsWith('aria') ? `aria-${key.slice(4).toLowerCase()}` : key;\n};\n","/**\n * Host element binding API — reactive attr, class, style, and event bindings\n * applied directly to the component's host element or any target element.\n */\n\nimport { isReactive, type Readable } from '@vielzeug/ripple';\n\nimport { getHost, tryRegisterCleanup, watchEffect } from './runtime';\nimport { normalizeAriaKey, normalizeHostAttrKey } from './utils/aria';\nimport { listen, resolveMaybeReactive, sanitizeCssToken, setAttr, toKebab } from './utils/dom';\n\n/**\n * Describes a reactive or static host binding value.\n */\nexport type HostBindingValue =\n  | (() => string | number | boolean | null | undefined)\n  | Readable<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\ntype HostClassBindingValue = Readable<boolean> | (() => boolean) | boolean;\n// Bivariant callback allows consumers to use narrower event types.\ntype HostEventListener = { bivarianceHack(event: Event): void }['bivarianceHack'];\n\nexport type HostBindConfig = {\n  /**\n   * ARIA attributes, keyed by bare property name (`expanded`) or fully-qualified\n   * (`aria-expanded`) — both normalize to the same attribute. A separate key from `attr`\n   * only so bare names can be normalized; the underlying write path is identical.\n   */\n  aria?: ReflectConfig;\n  attr?: ReflectConfig;\n  class?: (() => Record<string, boolean>) | Record<string, HostClassBindingValue>;\n  on?: Record<string, HostEventListener | undefined>;\n  style?: Record<string, HostBindingValue>;\n};\n\nexport type BindOptions = AddEventListenerOptions & {\n  /**\n   * Target element to bind to. Defaults to the host element when called\n   * via `bind()`. Pass an explicit element to bind to any other element\n   * (e.g. a slotted trigger or an internally-referenced child element).\n   * When a target is provided, cleanup is always auto-registered with the\n   * component scope if one is active.\n   */\n  target?: Element;\n};\n\nexport type HostBindFn = (config: HostBindConfig, options?: BindOptions) => () => void;\n\n/**\n * Apply reactive or static bindings to an element's attributes, classes, styles,\n * and events. Defaults to the current component's host element; pass\n * `options.target` to bind to any other element (e.g. a slotted trigger, an\n * internally-referenced child).\n */\nexport const bind: HostBindFn = (config: HostBindConfig, options?: BindOptions): (() => void) => {\n  const el = (options?.target as HTMLElement | undefined) ?? getHost();\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.aria) {\n    for (const [key, value] of Object.entries(config.aria)) {\n      const name = normalizeAriaKey(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.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  if (config.on) {\n    const { target: _t, ...listenerOptions } = options ?? {};\n\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, listenerOptions));\n    }\n  }\n\n  const cleanup = (): void => {\n    for (const dispose of disposers) dispose();\n  };\n\n  tryRegisterCleanup(cleanup);\n\n  return cleanup;\n};\n\nconst toHostAttr = normalizeHostAttrKey;\n\nconst applyReactiveBinding = (\n  value: HostBindingValue,\n  updater: (next: string | number | boolean | null | undefined) => void,\n): (() => void) | undefined => {\n  if (typeof value === 'function') {\n    return watchEffect(() => {\n      updater(value());\n      return undefined;\n    });\n  }\n\n  if (isReactive(value)) {\n    return watchEffect(() => {\n      updater(value.value);\n      return undefined;\n    });\n  }\n\n  updater(value);\n};\n\nfunction applyAttribute(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | undefined {\n  return applyReactiveBinding(value, (next) => setAttr(host, name, next));\n}\n\nfunction applyStyle(host: HTMLElement, name: string, value: HostBindingValue): (() => void) | undefined {\n  const cssName = sanitizeCssToken(name.startsWith('--') ? name : toKebab(name));\n\n  if (!cssName) return;\n\n  let owned = false;\n  const setStyle = (v: string | number | boolean | null | undefined): void => {\n    if (v != null && v !== '') {\n      owned = true;\n      host.style.setProperty(cssName, sanitizeCssToken(String(v)));\n    } else if (owned) host.style.removeProperty(cssName);\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] = resolveMaybeReactive(entry);\n          }\n\n          return result;\n        };\n\n  let prev = new Set<string>();\n\n  const sub = watchEffect(() => {\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    for (const cls of prev) {\n      if (!next.has(cls)) host.classList.remove(cls);\n    }\n    prev = next;\n  });\n\n  return sub;\n}\n","/**\n * Slot observation and reactive slot signals.\n *\n * `slots.has(name?)`: Signal<boolean> — whether a named slot has assigned elements.\n * `slots.elements(name?)`: Signal<Element[]> — assigned elements for a slot (flattened).\n */\n\nimport { type Readable, type Signal, signal } from '@vielzeug/ripple';\n\nimport { onCleanup, onMounted, requireSetupContext } from './runtime';\n\nexport type ComponentSlots<SlotNames extends string = string> = {\n  elements: (name?: SlotNames) => Readable<Element[]>;\n  has: (name?: SlotNames) => Readable<boolean>;\n};\n\nconst SLOT_DEFAULT = 'default';\nconst normalizeSlotName = (slotName: string | null | undefined): string => slotName || SLOT_DEFAULT;\n\nconst createSlots = (host: HTMLElement): ComponentSlots<string> => {\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 unbindSlot = (slotEl: HTMLSlotElement): void => {\n    const cleanup = slotCleanupMap.get(slotEl);\n\n    if (!cleanup) return;\n\n    cleanup();\n    slotCleanupMap.delete(slotEl);\n\n    const name = normalizeSlotName(slotEl.getAttribute('name'));\n    const setForName = slotNodesByName.get(name);\n\n    if (setForName) {\n      setForName.delete(slotEl);\n\n      if (setForName.size === 0) slotNodesByName.delete(name);\n    }\n\n    recomputeSlot(name);\n  };\n\n  const bindAllSlots = (): void => {\n    host.shadowRoot?.querySelectorAll('slot').forEach((slotEl) => {\n      bindSlot(slotEl);\n    });\n  };\n\n  const recomputeAllSlots = (): void => {\n    for (const name of slotNodesByName.keys()) {\n      recomputeSlot(name);\n    }\n  };\n\n  // Watch for dynamically-inserted <slot> elements (e.g. inside when(), each()).\n  let observer: MutationObserver | null = null;\n\n  // Single init pass, run after the first render: binds slots already present\n  // (pre-upgrade markup and template-rendered ones alike) and starts observation\n  // for slots inserted later. The observer must stay connected for the component's\n  // lifetime — it is the only way to detect a *first* <slot> appearing dynamically\n  // (e.g. a when() branch that renders a slot), so it cannot be disconnected when\n  // the bound-slot count drops to zero.\n  const initSlots = (): undefined => {\n    bindAllSlots();\n    recomputeAllSlots();\n\n    if (!observer && host.shadowRoot) {\n      observer = new MutationObserver((mutations) => {\n        for (const mutation of mutations) {\n          for (const node of mutation.removedNodes) {\n            if (node instanceof HTMLSlotElement) unbindSlot(node);\n          }\n        }\n\n        bindAllSlots();\n\n        if (slotCleanupMap.size > 0) recomputeAllSlots();\n      });\n      observer.observe(host.shadowRoot, { childList: true, subtree: true });\n    }\n\n    return undefined;\n  };\n\n  onMounted(initSlots);\n\n  onCleanup(() => {\n    observer?.disconnect();\n    observer = null;\n\n    for (const cleanup of slotCleanupMap.values()) cleanup();\n\n    slotCleanupMap.clear();\n    slotNodesByName.clear();\n    slotSignals.clear();\n\n    // The element instance survives disconnect/reconnect (custom elements aren't recreated),\n    // but this registry's observer/listeners are torn down above — drop the cache entry so a\n    // subsequent reconnect's setup() rebuilds a live registry instead of reusing a dead one.\n    slotsByElement.delete(host);\n  });\n\n  return {\n    elements: (name?: string) => ensureSlotEntry(normalizeSlotName(name)).elements,\n    has: (name?: string) => ensureSlotEntry(normalizeSlotName(name)).presence,\n  };\n};\n\n// Keyed by the host element, not the ephemeral `RuntimeContext` — `onMounted()` callbacks each\n// run with their own freshly-created context object (see base-element.ts's\n// `_scheduleMountCallbacks`), so keying this on `RuntimeContext` would silently create a second,\n// independent registry (a second `MutationObserver`, a second signal set) every time `useSlots()`\n// was called from inside `onMounted()` rather than directly in `setup()` — a real bug the\n// \"one registry per instance\" doc comment below never actually held for that (common) case.\n/** One slot registry per component instance — reused across repeated `useSlots()` calls. */\nconst slotsByElement = new WeakMap<HTMLElement, ComponentSlots<string>>();\n\n/**\n * Returns reactive slot presence / element signals for the current component.\n * Safe to call multiple times during `setup()` — the underlying slot registry\n * (MutationObserver + `slotchange` listeners) is created once per instance.\n *\n * Pass a `SlotNames` type parameter for typed slot names:\n * ```ts\n * const slots = useSlots<'header' | 'footer'>();\n * slots.has('header'); // typed ✓\n * ```\n */\nexport const useSlots = <SlotNames extends string = string>(): ComponentSlots<SlotNames> => {\n  const ctx = requireSetupContext('useSlots');\n  let entry = slotsByElement.get(ctx.element);\n\n  if (!entry) {\n    entry = createSlots(ctx.element);\n    slotsByElement.set(ctx.element, entry);\n  }\n\n  return entry as ComponentSlots<SlotNames>;\n};\n","/**\n * template/bindings.ts — Runtime binding appliers.\n *\n * Responsibilities:\n * - Apply each Binding variant to the live DOM (attr, event, html, ref,\n *   directive).\n * - Manage reactive effects and cleanup registration.\n * - Expose `applyBinding()` as the single dispatch entry point.\n * - Own the signal-to-form-control write path (`syncFormControl`) for regular\n *   attribute bindings.\n */\n\nimport { computed, isReactive, type Readable, effect as rawEffect, untrack } from '@vielzeug/ripple';\n\nimport { isLiveBinding } from '../directives/live';\nimport { invariant } from '../errors';\nimport { getPropMeta, type PropMeta } from '../props';\nimport { createReplaceableSlot, isStructuredValue, listen, setAttr } from '../utils/dom';\nimport type {\n  AttrBinding,\n  Binding,\n  DirectiveBinding,\n  EventBinding,\n  HtmlBinding,\n  HtmlBindingValue,\n  RefBinding,\n} from './binding-types';\nimport { isHtmlResult } from './result';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type RegisterCleanup = (fn: () => void) => void;\n\n// ─── Signal helpers ───────────────────────────────────────────────────────────\n\nconst signalEffect = (\n  signal: Readable<unknown>,\n  update: (v: unknown) => void,\n  registerCleanup: RegisterCleanup,\n): void => {\n  const sub = rawEffect(() => {\n    update(signal.value);\n    return undefined;\n  });\n\n  registerCleanup(() => sub.dispose());\n};\n\n// ─── Form control value sync ──────────────────────────────────────────────────\n\nconst isNativeFormInput = (el: HTMLElement): el is HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement =>\n  el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement;\n\nconst isCheckableInput = (el: HTMLElement): el is HTMLInputElement =>\n  el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio');\n\ntype LiveWriteState = { last: unknown };\n\n/**\n * The single write path from a reactive value to a form control's `value`/`checked`\n * property for regular attribute bindings.\n *\n * Live-write: when the binding was created from `live(source)`, a write is skipped\n * if the DOM value has diverged from this binding's last write (in-progress user\n * input) — unless the incoming value already matches the DOM (write would be a no-op).\n */\nexport const syncFormControl = (\n  el: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n  value: unknown,\n  isLive?: boolean,\n  state: LiveWriteState = { last: undefined },\n): void => {\n  const checkable = isCheckableInput(el);\n  const next: boolean | string = checkable ? Boolean(value) : value == null ? '' : String(value);\n  const current: boolean | string = checkable ? (el as HTMLInputElement).checked : el.value;\n\n  if (isLive && state.last !== undefined && !Object.is(current, state.last) && !Object.is(current, next)) return;\n\n  if (checkable) (el as HTMLInputElement).checked = next as boolean;\n  else el.value = next as string;\n\n  if (isLive) state.last = next;\n};\n\n// ─── Attributes ───────────────────────────────────────────────────────────────\n\nconst syncRegisteredProp = (el: HTMLElement, meta: PropMeta, 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;\n  }\n\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\nexport const applyAttrBinding = (binding: AttrBinding, registerCleanup: RegisterCleanup): void => {\n  const { el, mode, name, propMeta } = binding;\n  const liveState: LiveWriteState = { last: undefined };\n\n  const update = (value: unknown): void => {\n    if (propMeta) {\n      syncRegisteredProp(el, propMeta, binding, value);\n\n      return;\n    }\n\n    if (!isReactive(value) && isStructuredValue(value)) {\n      if (name !== '__proto__' && name !== 'constructor' && name !== 'prototype') {\n        (el as unknown as Record<string, unknown>)[name] = value;\n      }\n\n      return;\n    }\n\n    if ((name === 'value' && isNativeFormInput(el)) || (name === 'checked' && el instanceof HTMLInputElement)) {\n      syncFormControl(el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement, value, binding.live, liveState);\n\n      return;\n    }\n\n    if (mode === 'bool') el.toggleAttribute(name, Boolean(value));\n    else setAttr(el, name, value);\n  };\n\n  if ('signal' in binding) {\n    signalEffect(binding.signal, update, registerCleanup);\n  } else {\n    update(binding.value);\n  }\n};\n\n// ─── Events ───────────────────────────────────────────────────────────────────\n\nconst applyEventBinding = (binding: EventBinding, registerCleanup: RegisterCleanup): void => {\n  registerCleanup(listen(binding.el, binding.name, binding.handler));\n};\n\n// ─── Refs ─────────────────────────────────────────────────────────────────────\n\nconst applyRefBinding = (binding: RefBinding, registerCleanup: RegisterCleanup): void => {\n  const { el, 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  ref.value = el as never;\n  registerCleanup(() => {\n    ref.value = null as never;\n  });\n};\n\n// ─── HTML (reactive) ─────────────────────────────────────────────────────────\n\nconst insertHtmlValues = (\n  values: HtmlBindingValue[],\n  insertBefore: ChildNode,\n  registerCleanup: RegisterCleanup,\n): Node[] => {\n  const nodes: Node[] = [];\n  const parent = insertBefore.parentNode;\n\n  invariant(parent, 'html binding anchor has no parent node');\n\n  for (const v of values) {\n    if (isHtmlResult(v)) {\n      const captured = Array.from(v.fragment.childNodes);\n\n      parent.insertBefore(v.fragment, insertBefore);\n      v.apply(registerCleanup);\n      nodes.push(...captured);\n    } else if (v != null && v !== false) {\n      const text = document.createTextNode(String(v));\n\n      parent.insertBefore(text, insertBefore);\n      nodes.push(text);\n    }\n  }\n\n  return nodes;\n};\n\nexport const applyHtmlBinding = (binding: HtmlBinding, registerCleanup: RegisterCleanup): void => {\n  const { anchor, signal } = binding;\n\n  const slot = createReplaceableSlot();\n\n  const stop = rawEffect(() => {\n    const raw = signal.value;\n\n    slot.clear();\n\n    if (raw == null || raw.length === 0) return;\n\n    untrack(() => {\n      slot.setNodes(insertHtmlValues(raw, anchor, slot.registerCleanup));\n    });\n  });\n\n  registerCleanup(() => {\n    stop.dispose();\n    slot.clear();\n  });\n};\n\n// ─── Directives ───────────────────────────────────────────────────────────────\n\nconst applyDirectiveBinding = (binding: DirectiveBinding, registerCleanup: RegisterCleanup): void => {\n  binding.directive.mount(binding.anchor, registerCleanup);\n};\n\n// ─── Binding dispatch ─────────────────────────────────────────────────────────\n\nexport const applyBinding = (binding: Binding, registerCleanup: RegisterCleanup): void => {\n  switch (binding.type) {\n    case 'attr':\n      applyAttrBinding(binding, registerCleanup);\n      break;\n    case 'directive':\n      applyDirectiveBinding(binding, registerCleanup);\n      break;\n    case 'event':\n      applyEventBinding(binding, registerCleanup);\n      break;\n    case 'html':\n      applyHtmlBinding(binding, registerCleanup);\n      break;\n    case 'ref':\n      applyRefBinding(binding, registerCleanup);\n      break;\n  }\n};\n\n// ─── Attr binding factory (used by instantiator) ──────────────────────────────\n\nexport const createAttrBindingFromValue = (\n  el: HTMLElement,\n  mode: 'attr' | 'bool',\n  name: string,\n  value: unknown,\n): AttrBinding => {\n  const propMeta = getPropMeta(el, name);\n\n  if (isLiveBinding(value)) {\n    return { el, live: true, mode, name, propMeta, signal: value.source, type: 'attr' };\n  }\n\n  if (typeof value === 'function') {\n    return { el, mode, name, propMeta, signal: computed(value as () => unknown), type: 'attr' };\n  }\n\n  if (isReactive(value)) {\n    return { el, mode, name, propMeta, signal: value as Readable<unknown>, type: 'attr' };\n  }\n\n  return { el, mode, name, propMeta, type: 'attr', value };\n};\n\nexport const resolveStaticText = (value: unknown): string => {\n  if (value == null) return '';\n\n  return String(value);\n};\n","/**\n * template/compiler.ts — HTML template string parser and static template cache.\n *\n * Responsibilities:\n * - Parse TemplateStringsArray into slot metadata (slot detection).\n * - Build a cached HTMLTemplateElement with path indices for efficient node lookup.\n * - Expose `getStaticTemplate()` for use by the instantiator.\n */\n\nimport { ORE_ERRORS, OreApiError } from '../errors';\n\n// ─── Slot kinds ───────────────────────────────────────────────────────────────\n// Const object + derived union, same pattern as `ComponentPhase`/`LIFECYCLE_EVENTS`\n// in types.ts — used here (rather than plain string literals) because the kind\n// crosses a module boundary (compiler.ts produces it, instantiator.ts consumes\n// it): importing `SlotKind` gives autocomplete and a single rename point at the\n// consuming site, where a bare string literal wouldn't.\n\nexport const SlotKind = {\n  ATTR: 'attr',\n  BOOL_ATTR: 'boolAttr',\n  EVENT: 'event',\n  NODE: 'node',\n  REF: 'ref',\n} as const;\n\nexport type DetectedSlotKind = (typeof SlotKind)[keyof typeof SlotKind];\n\ntype DetectedSlot = {\n  kind: DetectedSlotKind;\n  name?: string;\n  prefix: string;\n};\n\n// ─── Static template types ────────────────────────────────────────────────────\n\nexport type NodePath = readonly number[];\n\nexport type SlotMeta = {\n  commentId?: number;\n  elementId?: number;\n  kind: DetectedSlotKind;\n  mode?: 'attr' | 'bool';\n  name?: string;\n};\n\nexport type CompiledStaticTemplate = {\n  commentPaths: ReadonlyMap<number, NodePath>;\n  element: HTMLTemplateElement;\n  elementPaths: ReadonlyMap<number, NodePath>;\n  slots: SlotMeta[];\n};\n\n// ─── Slot detection regexes ───────────────────────────────────────────────────\n\nconst EVENT_RE = /\\s+@([a-zA-Z_][-a-zA-Z0-9_.-]*)\\s*=\\s*[\"']?$/;\nconst REF_RE = /\\s+ref\\s*=\\s*[\"']?$/;\nconst BOOL_ATTR_RE = /\\s+\\?([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/;\nconst ATTR_RE = /\\s+([a-zA-Z_][-a-zA-Z0-9_]*)\\s*=\\s*[\"']?$/;\n\nconst detectSlot = (str: string): DetectedSlot => {\n  let m: RegExpExecArray | null;\n\n  if ((m = EVENT_RE.exec(str))) {\n    const prefix = str.slice(0, -m[0].length);\n    const [name, ...modifiers] = m[1].split('.');\n\n    if (modifiers.length > 0) throw new OreApiError(ORE_ERRORS.eventModifiersUnsupported(m[1]));\n\n    return { kind: SlotKind.EVENT, name, prefix };\n  }\n\n  if ((m = REF_RE.exec(str))) {\n    return { kind: SlotKind.REF, prefix: str.slice(0, -m[0].length) };\n  }\n\n  if ((m = BOOL_ATTR_RE.exec(str))) {\n    return { kind: SlotKind.BOOL_ATTR, name: m[1], prefix: str.slice(0, -m[0].length) };\n  }\n\n  if ((m = ATTR_RE.exec(str))) {\n    return { kind: SlotKind.ATTR, name: m[1], prefix: str.slice(0, -m[0].length) };\n  }\n\n  const lastOpen = str.lastIndexOf('<');\n  const lastClose = str.lastIndexOf('>');\n\n  if (lastOpen > lastClose && str[lastOpen + 1] !== '/') {\n    throw new OreApiError(ORE_ERRORS.templateInterpolationInTag);\n  }\n\n  return { kind: SlotKind.NODE, prefix: str };\n};\n\n// ─── Static template cache ────────────────────────────────────────────────────\n\nconst templateCache = new WeakMap<TemplateStringsArray, CompiledStaticTemplate>();\n\n/**\n * Matches a string that ends in an attribute-assignment context, e.g. `...attr=`,\n * `...@click=`, `...?disabled=`. Used together with tag-context\n * tracking (see below) to decide whether a quote immediately before an\n * interpolation is an attribute-value quote (strip it) or a literal text quote\n * (keep it) — previously every adjacent quote was stripped, so both\n * `` html`\"${value}\"` `` and prose like `area = \"${area}\"` lost their quotes.\n */\nconst ATTR_VALUE_CONTEXT_RE = /[@?]?[a-zA-Z_][-a-zA-Z0-9_.]*\\s*=\\s*$/;\n\n/**\n * Pre-process template strings to strip surrounding attribute quotes. This lets\n * the main loop operate on clean strings with no per-iteration state flags.\n *\n * Quote stripping requires BOTH an attr-assignment tail AND start-tag context\n * (tracked by replaying the raw strings): `class = \"${c}\"` inside a tag is\n * stripped; `area = \"${a}\"` in prose is not.\n */\nconst normalizeTemplateStrings = (strings: TemplateStringsArray): string[] => {\n  const out = Array.from(strings);\n  let insideTag = false;\n\n  for (let i = 0; i < out.length - 1; i++) {\n    const s = out[i];\n    const lastChar = s[s.length - 1];\n\n    // Tag context at the interpolation boundary is determined by all raw string\n    // content up to it — including this string's own text before its final quote\n    // (last angle bracket wins; attribute values containing '<'/'>' are outside\n    // the supported syntax either way).\n    for (const ch of s) {\n      if (ch === '<') insideTag = true;\n      else if (ch === '>') insideTag = false;\n    }\n\n    // Strip wrapping attribute quotes: attr=\"${value}\" → attr=${value}\n    if ((lastChar === '\"' || lastChar === \"'\") && insideTag && ATTR_VALUE_CONTEXT_RE.test(s.slice(0, -1))) {\n      out[i] = s.slice(0, -1);\n\n      const next = out[i + 1];\n\n      if (next.startsWith(lastChar)) out[i + 1] = next.slice(1);\n    }\n  }\n\n  return out;\n};\n\n/**\n * Attribute names that mark a binding target element, and the comment prefix for\n * node-slot anchors. Namespaced (`data-ore-*` / `ore:N`) so user-authored markup in\n * static template regions can never collide with them — a plain `u` attribute or a\n * numeric comment was previously hijacked as a binding marker and stripped.\n */\nconst ELEMENT_MARKER_ATTR = 'data-ore-b';\nconst COMMENT_MARKER_RE = /^ore:(\\d+)$/;\n\nconst walkNode = (\n  node: Node,\n  path: number[],\n  elementPaths: Map<number, NodePath>,\n  commentPaths: Map<number, NodePath>,\n): void => {\n  if (node.nodeType === Node.ELEMENT_NODE) {\n    const el = node as Element;\n    const marker = el.getAttribute(ELEMENT_MARKER_ATTR);\n\n    if (marker !== null) {\n      elementPaths.set(Number(marker), [...path]);\n      el.removeAttribute(ELEMENT_MARKER_ATTR);\n    }\n  } else if (node.nodeType === Node.COMMENT_NODE) {\n    const content = (node as Comment).nodeValue;\n    const m = content !== null ? COMMENT_MARKER_RE.exec(content) : null;\n\n    if (m) {\n      commentPaths.set(Number(m[1]), [...path]);\n    }\n  }\n\n  const children = node.childNodes;\n\n  for (let i = 0; i < children.length; i++) walkNode(children[i], [...path, i], elementPaths, commentPaths);\n};\n\nconst buildStaticTemplate = (strings: TemplateStringsArray): CompiledStaticTemplate => {\n  const normalized = normalizeTemplateStrings(strings);\n  let html = '';\n  let activeElementId: number | undefined;\n  let elementCounter = 0;\n  let commentCounter = 0;\n  const slots: SlotMeta[] = [];\n\n  for (let i = 0; i < normalized.length - 1; i++) {\n    const raw = normalized[i];\n    const slot = detectSlot(raw);\n\n    if (slot.kind === SlotKind.NODE) {\n      html += `${slot.prefix}<!--ore:${commentCounter}-->`;\n      slots.push({ commentId: commentCounter, kind: SlotKind.NODE });\n      commentCounter++;\n      activeElementId = undefined;\n    } else {\n      const needsNewMarker =\n        activeElementId === undefined || slot.prefix.lastIndexOf('<') > slot.prefix.lastIndexOf('>');\n\n      if (needsNewMarker) {\n        activeElementId = elementCounter++;\n        html += `${slot.prefix} ${ELEMENT_MARKER_ATTR}=\"${activeElementId}\"`;\n      } else {\n        html += slot.prefix;\n      }\n\n      const mode: 'attr' | 'bool' | undefined =\n        slot.kind === SlotKind.BOOL_ATTR ? 'bool' : slot.kind === SlotKind.ATTR ? 'attr' : undefined;\n\n      slots.push({ elementId: activeElementId, kind: slot.kind, mode, name: slot.name });\n    }\n  }\n\n  html += normalized[normalized.length - 1] ?? '';\n\n  const tpl = document.createElement('template');\n\n  tpl.innerHTML = html;\n\n  const elementPaths = new Map<number, NodePath>();\n  const commentPaths = new Map<number, NodePath>();\n  const topChildren = tpl.content.childNodes;\n\n  for (let i = 0; i < topChildren.length; i++) walkNode(topChildren[i], [i], elementPaths, commentPaths);\n\n  return { commentPaths, element: tpl, elementPaths, slots };\n};\n\nexport const getStaticTemplate = (strings: TemplateStringsArray): CompiledStaticTemplate => {\n  let tpl = templateCache.get(strings);\n\n  if (!tpl) {\n    tpl = buildStaticTemplate(strings);\n    templateCache.set(strings, tpl);\n  }\n\n  return tpl;\n};\n\n// ─── Path navigation (used by instantiator) ───────────────────────────────────\n\nexport const followPath = (root: Node, path: NodePath): Node => {\n  let node: Node = root;\n\n  for (const i of path) node = node.childNodes[i];\n\n  return node;\n};\n","/**\n * template/instantiator.ts — Template instantiation and the `html` tagged literal.\n *\n * Responsibilities:\n * - Clone a compiled static template and wire up live bindings.\n * - Expose `compileTemplate()` and `html` as the public authoring API.\n */\n\nimport { computed, isReactive, type Readable } from '@vielzeug/ripple';\n\nimport { invariant } from '../errors';\nimport type { Binding, HtmlBindingValue } from './binding-types';\nimport { applyBinding, createAttrBindingFromValue, resolveStaticText } from './bindings';\nimport { followPath, getStaticTemplate, SlotKind } from './compiler';\nimport {\n  type CompiledHTMLResult,\n  createHtmlResult,\n  type HTMLResult,\n  isDirectiveResult,\n  isHtmlResult,\n  type Ref,\n  type RefCallback,\n} from './result';\n\n// ─── Template instantiation ──────────────────────────────────────────────────\n\nconst NODE_SLOT_NO_PARENT_MSG = 'html`...`: node-slot comment anchor has no parent node';\n\n/** Normalize a reactive node-slot value to the HtmlBinding signal's array shape. */\nconst toHtmlValues = (raw: unknown): HtmlBindingValue[] =>\n  Array.isArray(raw) ? (raw as HtmlBindingValue[]) : [raw as HtmlBindingValue];\n\n/**\n * Static-embed an already-created HTMLResult at a node-slot anchor: move its\n * fragment children into place and chain its apply into the outer apply phase\n * (so embedded reactive wiring starts when the host template mounts, not now).\n */\nconst embedStaticResult = (\n  result: CompiledHTMLResult,\n  anchor: Comment,\n  chainedApplies: Array<(rc: (fn: () => void) => void) => void>,\n): void => {\n  const parent = anchor.parentNode;\n\n  invariant(parent, NODE_SLOT_NO_PARENT_MSG);\n\n  while (result.fragment.firstChild) parent.insertBefore(result.fragment.firstChild, anchor);\n\n  chainedApplies.push(result.apply.bind(result));\n};\n\n/**\n * Instantiate a compiled template: clone the cached DOM template, navigate\n * to each binding target using pre-recorded paths, and build bindings with\n * direct node references. Returns an HTMLResult ready to mount.\n */\nexport const compileTemplate = (strings: TemplateStringsArray, values: unknown[]): HTMLResult => {\n  const compiled = getStaticTemplate(strings);\n  const fragment = compiled.element.content.cloneNode(true) as DocumentFragment;\n  const bindings: Binding[] = [];\n  // For static HTMLResult embeds: chain their apply calls\n  const chainedApplies: Array<(rc: (fn: () => void) => void) => void> = [];\n\n  // Phase 1: Resolve all binding targets BEFORE any DOM modifications\n  type BoundSlot = { comment?: Comment; el?: HTMLElement; slot: (typeof compiled.slots)[number]; value: unknown };\n\n  const boundSlots: BoundSlot[] = compiled.slots.map((slot, i) => {\n    const value = values[i];\n\n    if (slot.kind === SlotKind.NODE) {\n      const commentPath = slot.commentId !== undefined ? compiled.commentPaths.get(slot.commentId) : undefined;\n\n      invariant(commentPath, `compiled template is missing a comment path for node slot ${slot.commentId}`);\n\n      return { comment: followPath(fragment, commentPath) as Comment, slot, value };\n    }\n\n    const elementPath = slot.elementId !== undefined ? compiled.elementPaths.get(slot.elementId) : undefined;\n\n    invariant(elementPath, `compiled template is missing an element path for slot ${slot.elementId}`);\n\n    return { el: followPath(fragment, elementPath) as HTMLElement, slot, value };\n  });\n\n  // Phase 2: Build bindings (may modify DOM for static content).\n  for (const { comment, el, slot, value } of boundSlots) {\n    if (slot.kind === SlotKind.NODE) {\n      const anchor = comment;\n\n      invariant(anchor, 'compiled template produced a node slot without a comment anchor');\n\n      if (isDirectiveResult(value)) {\n        bindings.push({ anchor, directive: value, type: 'directive' });\n        continue;\n      }\n\n      if (isHtmlResult(value)) {\n        // Static embed: move fragment children into place, chain apply\n        embedStaticResult(value, anchor, chainedApplies);\n        anchor.remove();\n        continue;\n      }\n\n      if (typeof value === 'function' || isReactive(value)) {\n        // Always use the html binding for reactive values — it handles both text\n        // values and HTMLResult values, preventing silent \"[object Object]\"\n        // corruption when a signal's runtime type changes from null/string to HTMLResult.\n        const sig =\n          typeof value === 'function'\n            ? computed(() => toHtmlValues((value as () => unknown)()))\n            : computed(() => toHtmlValues((value as Readable<unknown>).value));\n\n        bindings.push({ anchor, signal: sig, type: 'html' });\n        continue;\n      }\n\n      if (Array.isArray(value)) {\n        for (const item of value) {\n          if (isHtmlResult(item)) {\n            embedStaticResult(item, anchor, chainedApplies);\n          } else {\n            const parent = anchor.parentNode;\n\n            invariant(parent, NODE_SLOT_NO_PARENT_MSG);\n            parent.insertBefore(document.createTextNode(resolveStaticText(item)), anchor);\n          }\n        }\n        anchor.remove();\n        continue;\n      }\n\n      // Static primitive: replace with text node, no binding\n      anchor.replaceWith(document.createTextNode(resolveStaticText(value)));\n      continue;\n    }\n\n    // Element slot\n    invariant(el, 'compiled template produced an element slot without an element');\n\n    if (slot.kind === SlotKind.EVENT) {\n      const name = slot.name;\n\n      invariant(name, 'compiled template produced an event slot without an event name');\n\n      if (typeof value === 'function') {\n        bindings.push({ el, handler: value as (e: Event) => void, name, type: 'event' });\n      } else if (isReactive(value)) {\n        const signalValue = value as Readable<unknown>;\n        const handler = (e: Event) => {\n          const h = signalValue.value;\n\n          if (typeof h === 'function') (h as (e: Event) => void)(e);\n        };\n\n        bindings.push({ el, handler, name, type: 'event' });\n      }\n\n      continue;\n    }\n\n    if (slot.kind === SlotKind.REF) {\n      if (value) {\n        bindings.push({ el, ref: value as Ref<Element> | RefCallback<Element>, type: 'ref' });\n      }\n\n      continue;\n    }\n\n    // attr / boolAttr\n    invariant(slot.name, 'compiled template produced an attr slot without an attribute name');\n    bindings.push(createAttrBindingFromValue(el, slot.mode ?? 'attr', slot.name, value));\n  }\n\n  return createHtmlResult(fragment, (registerCleanup) => {\n    for (const binding of bindings) applyBinding(binding, registerCleanup);\n    for (const chainedApply of chainedApplies) chainedApply(registerCleanup);\n  });\n};\n\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]): HTMLResult =>\n  compileTemplate(strings, values);\n","/**\n * Type-safe custom event emission for components.\n */\n\nimport { getHost } from '../runtime';\n\ntype NoDetail = undefined | undefined | never;\ntype KeysWithoutDetail<T extends Record<string, unknown>> = {\n  [P in keyof T]: [T[P]] extends [NoDetail] ? P : never;\n}[keyof T];\n\n/**\n * Typed emit function: only declared event names type-check, and `detail` is\n * required exactly when its payload type is non-void. Dynamic event names must\n * be cast at the call site — an intentional speed bump, not a silent escape.\n */\nexport type EmitFn<T extends Record<string, unknown>> = {\n  <K extends KeysWithoutDetail<T>>(event: K): boolean;\n  <K extends Exclude<keyof T, KeysWithoutDetail<T>>>(event: K, detail: T[K]): boolean;\n};\n\nconst DEFAULT_FIRE_OPTIONS = { bubbles: true, cancelable: true, composed: false };\n\n/**\n * Returns a typed `emit()` function bound to the current component's host element.\n * Call once during `setup()` — the `Emits` type parameter maps event names to\n * their `detail` payload type.\n *\n * Every event is dispatched `cancelable: true`, and `emit()` returns `dispatchEvent`'s\n * own boolean result — `false` when a listener called `preventDefault()`. Components\n * that need to know whether a listener cancelled an event (e.g. to skip a default\n * action) read this return value directly instead of hand-rolling `dispatchEvent`.\n *\n * Events do **not** cross the shadow boundary by default (`composed: false`) — a\n * listener outside the component's shadow root will not observe them. Dispatch a\n * `CustomEvent` with `composed: true` by hand if an event must escape the shadow root.\n *\n * @example\n * ```ts\n * type Events = { close: undefined; change: { value: string } };\n *\n * setup(props) {\n *   const emit = useEmit<Events>();\n *   emit('close');\n *\n *   const notCancelled = emit('change', { value: 'ok' });\n *   if (notCancelled) props.value.value = 'ok';\n * }\n * ```\n */\nexport const useEmit = <T extends Record<string, unknown> = Record<string, never>>(): EmitFn<T> => {\n  const host = getHost();\n\n  return ((event: keyof T, ...rest: unknown[]) => {\n    const customEventInit = rest.length > 0 ? { ...DEFAULT_FIRE_OPTIONS, detail: rest[0] } : DEFAULT_FIRE_OPTIONS;\n\n    return host.dispatchEvent(new CustomEvent<unknown>(String(event), customEventInit));\n  }) as EmitFn<T>;\n};\n","/**\n * Unique ID generation for runtime use (component IDs, label associations, etc.).\n * Template binding no longer uses this for marker IDs — binding targets are resolved\n * via path navigation on cloned template nodes.\n */\n\nlet _idCounter = 0;\nlet _stableCounter = 0;\nconst _tag = Math.random().toString(36).slice(2, 6);\n\n/** @internal Resets both ID counters. Called by testing cleanup(). */\nexport const _resetIdCounter = (): void => {\n  _idCounter = 0;\n  _stableCounter = 0;\n};\n\n/**\n * Generates a monotonically-increasing, unique-within-this-process ID with an optional prefix.\n * No public reset — this is for uniqueness, not cross-test determinism; use `createStableId()`\n * (and `resetStableIdCounter()`) when a test needs IDs to restart from the same value each run.\n */\nexport const createId = (prefix = 'id'): string => `${prefix}-${++_idCounter}`;\n\n/**\n * Generates a stable, unique ID with an optional semantic prefix.\n * Includes a short random tag to prevent collisions across multiple app instances.\n * Format: `${prefix}-${tag}${counter}` — e.g. `field-a3k21`.\n */\nexport const createStableId = (prefix = 'id'): string => `${prefix}-${_tag}${++_stableCounter}`;\n\n/**\n * Resets the `createStableId()` counter to 0. Use in test `beforeEach` hooks when you need\n * deterministic IDs across test runs.\n *\n * Named to match `createStableId()` precisely — `createId()` has no public reset (it's meant\n * for non-deterministic, monotonically-unique IDs; nothing in the package relies on it\n * restarting from a fixed value across tests).\n */\nexport const resetStableIdCounter = (): void => {\n  _stableCounter = 0;\n};\n"],"mappings":"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"}