balises 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"balises.esm.js","names":["context: Computed<unknown> | null","batchQueue: Set<Subscriber> | null","disposalStack: Array<Array<() => void>> | null","disposers: Array<() => void>","onTrack: {\n current: ((source: Signal<unknown> | Computed<unknown>) => void) | null;\n}","#value","#targets","#subs","#signal","signal","#fn","#recompute","#dirty","#value","#subs","#sources","#sourceIndex","queue: Computed<unknown>[]","toNotify: Array<{ c: Computed<unknown>; old: unknown }>","#targets","#computing","cleanup: (() => void) | undefined","disposeScope: (() => void) | undefined","dispose: (() => void) | undefined","strings: TemplateStringsArray","values: unknown[]","plugins: InterpolationPlugin[]","disposers: (() => void)[]","stack: (Element | DocumentFragment)[]","reactives: Reactive<unknown>[]","pluginDisposers: (() => void)[]","nodes: Node[]","childDisposers: (() => void)[]","html: HtmlTag"],"sources":["../src/signals/context.ts","../src/signals/signal.ts","../src/signals/computed.ts","../src/signals/effect.ts","../src/signals/store.ts","../src/signals/index.ts","../src/parser.ts","../src/template.ts"],"sourcesContent":["/**\n * Global state and batching for the reactive system.\n */\n\nimport type { Computed } from \"./computed.js\";\nimport type { Signal } from \"./signal.js\";\n\n/** Callback function for subscribers */\nexport type Subscriber = () => void;\n\n/** The currently executing computed (for dependency tracking) */\nexport let context: Computed<unknown> | null = null;\n\n/** Set the current execution context */\nexport function setContext(c: Computed<unknown> | null): void {\n context = c;\n}\n\n/** Batching: defer subscriber notifications until batch completes */\nlet batchDepth = 0;\nlet batchQueue: Set<Subscriber> | null = null;\n\n/**\n * Batch multiple signal updates into a single notification pass.\n * Subscribers are only notified after the batch function completes.\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n if (batchDepth === 1) batchQueue = new Set();\n try {\n return fn();\n } finally {\n if (--batchDepth === 0) {\n const q = batchQueue!;\n batchQueue = null;\n for (const sub of q) sub();\n }\n }\n}\n\n/** Check if currently batching */\nexport function isBatching(): boolean {\n return batchDepth > 0;\n}\n\n/** Add a subscriber to the batch queue */\nexport function enqueueBatchOne(sub: Subscriber): void {\n batchQueue!.add(sub);\n}\n\n/** Add multiple subscribers to the batch queue */\nexport function enqueueBatchAll(subs: Subscriber[]): void {\n for (let i = 0; i < subs.length; i++) batchQueue!.add(subs[i]!);\n}\n\n/** Scope disposal: collect all disposers in a scope */\nlet disposalStack: Array<Array<() => void>> | null = null;\n\n/**\n * Create a disposal scope that collects all subscriptions and computeds created within.\n * Returns the result of the function and a dispose function that cleans up all resources.\n *\n * @example\n * ```ts\n * const [result, dispose] = scope(() => {\n * const count = signal(0);\n * const doubled = computed(() => count.value * 2);\n * effect(() => console.log(doubled.value));\n * return { count, doubled };\n * });\n *\n * // Later: clean up all subscriptions and computeds\n * dispose();\n * ```\n */\nexport function scope<T>(fn: () => T): [result: T, dispose: () => void] {\n const disposers: Array<() => void> = [];\n\n // Push new disposal context\n if (!disposalStack) disposalStack = [];\n disposalStack.push(disposers);\n\n try {\n const result = fn();\n return [\n result,\n () => {\n for (let i = disposers.length - 1; i >= 0; i--) {\n disposers[i]!();\n }\n disposers.length = 0;\n },\n ];\n } finally {\n // Pop disposal context\n disposalStack.pop();\n if (!disposalStack.length) disposalStack = null;\n }\n}\n\n/**\n * Register a disposer in the current scope (if any).\n * This is called internally by computed/effect when they create cleanup functions.\n */\nexport function registerDisposer(dispose: () => void): void {\n disposalStack?.at(-1)?.push(dispose);\n}\n\n/**\n * Hook for tracking signal/computed accesses.\n * Set by async.ts when track() is active to capture dependencies.\n * Using an object wrapper so async.ts can mutate the current value.\n */\nexport const onTrack: {\n current: ((source: Signal<unknown> | Computed<unknown>) => void) | null;\n} = { current: null };\n","/**\n * Signal - A reactive value container.\n */\n\nimport type { Computed } from \"./computed.js\";\nimport {\n context,\n isBatching,\n enqueueBatchAll,\n onTrack,\n type Subscriber,\n} from \"./context.js\";\n\n/**\n * Remove an item from an array using swap-and-pop (O(1) removal).\n */\nexport function removeFromArray<T>(array: T[], item: T): void {\n const i = array.indexOf(item);\n if (i >= 0) {\n array[i] = array[array.length - 1]!;\n array.pop();\n }\n}\n\n/**\n * A reactive value container. When the value changes, all dependent\n * computeds are marked dirty and subscribers are notified.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Signal<T> {\n #value: T;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n\n constructor(value: T) {\n this.#value = value;\n }\n\n get value(): T {\n if (context) context.trackSource(this);\n if (onTrack.current) onTrack.current(this);\n return this.#value;\n }\n\n set value(v: T) {\n if (Object.is(this.#value, v)) return;\n this.#value = v;\n\n // Mark all dependent computeds as dirty\n const targets = this.#targets;\n for (let i = 0; i < targets.length; i++) {\n targets[i]!.markDirty();\n }\n\n // Notify subscribers\n if (this.#subs.length) {\n if (isBatching()) {\n enqueueBatchAll(this.#subs);\n } else {\n // Copy array to avoid issues if subscribers modify the array during iteration\n const subs = [...this.#subs];\n for (let i = 0; i < subs.length; i++) subs[i]!();\n }\n }\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n /**\n * Update the signal value using an updater function.\n *\n * @param fn - Function that receives current value and returns new value\n *\n * @example\n * const count = signal(0);\n * count.update(n => n + 1); // increment\n */\n update(fn: (current: T) => T): void {\n this.value = fn(this.#value);\n }\n\n /**\n * Read the signal value without tracking dependencies.\n * Useful in event handlers where you want the current value\n * but don't want to create a reactive dependency.\n *\n * @example\n * const count = signal(0);\n * // In an event handler - no dependency tracking\n * button.onclick = () => console.log(count.peek());\n */\n peek(): T {\n return this.#value;\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n}\n\n/** Create a new signal with the given initial value. */\nexport const signal = <T>(value: T) => new Signal(value);\n\n/**\n * A read-only view of a Signal.\n * Provides reactive access without allowing external mutation.\n * Used by `each()` to pass item signals to render functions.\n */\nexport class ReadonlySignal<T> {\n #signal: Signal<T>;\n\n /** @internal */\n constructor(signal: Signal<T>) {\n this.#signal = signal;\n }\n\n get value(): T {\n return this.#signal.value;\n }\n\n /**\n * Read the signal value without tracking dependencies.\n * Useful in event handlers where you want the current value\n * but don't want to create a reactive dependency.\n */\n peek(): T {\n return this.#signal.peek();\n }\n\n subscribe(fn: Subscriber): () => void {\n return this.#signal.subscribe(fn);\n }\n}\n","/**\n * Computed - A derived reactive value.\n */\n\nimport { Signal, removeFromArray } from \"./signal.js\";\nimport {\n context,\n setContext,\n isBatching,\n enqueueBatchOne,\n registerDisposer,\n onTrack,\n type Subscriber,\n} from \"./context.js\";\n\n/**\n * A derived reactive value. Automatically tracks dependencies and\n * recomputes when any dependency changes.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Computed<T> {\n #fn: (() => T) | undefined;\n #value: T | undefined;\n #dirty = true;\n #computing = false;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n #sources: (Signal<unknown> | Computed<unknown>)[] = [];\n #sourceIndex = 0;\n\n constructor(fn: () => T) {\n this.#fn = fn;\n this.#recompute();\n\n // Auto-register disposal in current root scope\n registerDisposer(() => this.dispose());\n }\n\n get value(): T {\n if (this.#dirty) this.#recompute();\n if (context && context !== this) context.trackSource(this);\n if (onTrack.current) onTrack.current(this);\n return this.#value as T;\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n dispose(): void {\n this.#fn = undefined;\n const sources = this.#sources;\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n this.#sources = [];\n this.#subs.length = 0;\n }\n\n /**\n * Called by sources when accessed during recompute.\n * @internal\n */\n trackSource(source: Signal<unknown> | Computed<unknown>): void {\n // Skip tracking if disposed (can happen if dispose() is called during #fn execution)\n if (!this.#fn) return;\n\n const sources = this.#sources;\n const idx = this.#sourceIndex++;\n\n if (idx < sources.length) {\n if (sources[idx] === source) {\n // Same source at same position - nothing to do\n return;\n }\n // Different source - unlink old ones from this position\n for (let i = idx; i < sources.length; i++) {\n const s = sources[i];\n if (s) s.deleteTarget(this);\n }\n sources.length = idx;\n }\n // Add new source\n sources.push(source);\n source.targets.push(this);\n }\n\n /**\n * Mark this computed and all its dependents as dirty.\n * Uses a two-phase approach to avoid cascading issues:\n * 1. Mark all dependents as dirty (no subscriber calls)\n * 2. Notify subscribers after all dirty flags are set\n * @internal\n */\n markDirty(): void {\n if (this.#dirty) return;\n\n // Phase 1: Mark all dependents as dirty, collect subscribers\n const queue: Computed<unknown>[] = [this];\n const toNotify: Array<{ c: Computed<unknown>; old: unknown }> = [];\n\n for (let i = 0; i < queue.length; i++) {\n const c = queue[i]!;\n if (c.#dirty) continue;\n c.#dirty = true;\n\n // Propagate to all targets\n const targets = c.#targets;\n for (let j = 0; j < targets.length; j++) {\n const t = targets[j]!;\n if (!t.#dirty) queue.push(t);\n }\n\n // Collect computeds with subscribers for later notification\n if (c.#subs.length && c.#fn) {\n toNotify.push({ c, old: c.#value });\n }\n }\n\n // Phase 2: Notify subscribers (after all dirty flags are set)\n for (let i = 0; i < toNotify.length; i++) {\n const { c, old } = toNotify[i]!;\n const notify = () => {\n if (c.#fn) {\n c.#recompute();\n if (!Object.is(c.#value, old)) {\n const subs = c.#subs;\n for (let j = 0; j < subs.length; j++) subs[j]!();\n }\n }\n };\n void (isBatching() ? enqueueBatchOne(notify) : notify());\n }\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n\n #recompute(): void {\n if (this.#computing || !this.#fn) return;\n this.#computing = true;\n\n this.#sourceIndex = 0;\n const prevLen = this.#sources.length;\n\n const prev = context;\n setContext(this);\n try {\n this.#value = this.#fn();\n } finally {\n setContext(prev);\n\n // Unlink removed sources\n const newLen = this.#sourceIndex;\n if (newLen < prevLen) {\n const sources = this.#sources;\n for (let i = newLen; i < prevLen; i++) {\n const source = sources[i];\n if (source) {\n source.deleteTarget(this);\n }\n }\n sources.length = newLen;\n }\n\n this.#dirty = false;\n this.#computing = false;\n }\n }\n}\n\n/** Create a new computed from the given function. */\nexport const computed = <T>(fn: () => T) => new Computed(fn);\n","/**\n * Effect - Run side effects reactively.\n */\n\nimport { computed } from \"./computed.js\";\nimport { context, setContext, registerDisposer } from \"./context.js\";\n\n/**\n * Create a reactive effect that automatically tracks dependencies\n * and re-runs when they change.\n *\n * The effect function can optionally return a cleanup function that will be\n * called before the effect re-runs and when the effect is disposed.\n *\n * @param fn - The effect function to run. May return a cleanup function.\n * @returns A dispose function to stop the effect\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log(\"Count is:\", count.value);\n * });\n *\n * count.value = 1; // logs: \"Count is: 1\"\n * dispose(); // stop the effect\n *\n * @example\n * // With cleanup function\n * const userId = signal(1);\n * const dispose = effect(() => {\n * const subscription = api.subscribe(userId.value);\n * return () => subscription.unsubscribe(); // cleanup\n * });\n *\n * userId.value = 2; // cleanup runs, then effect re-runs with new subscription\n * dispose(); // final cleanup runs\n */\nexport function effect(fn: () => void | (() => void)): () => void {\n let cleanup: (() => void) | undefined;\n let disposed = false;\n\n const c = computed(() => {\n // Run cleanup outside of tracking context to avoid\n // reactive reads in cleanup creating new dependencies\n if (cleanup) {\n const prev = context;\n setContext(null);\n try {\n cleanup();\n } finally {\n setContext(prev);\n }\n }\n cleanup = fn() ?? undefined;\n return undefined;\n });\n // Subscribe to make it reactive (rerun on dependency changes)\n const unsub = c.subscribe(() => {});\n\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n unsub();\n c.dispose();\n cleanup?.();\n };\n\n // Register full effect dispose (with cleanup) in current scope\n // This overrides the computed's auto-registration with a more complete cleanup\n registerDisposer(dispose);\n\n return dispose;\n}\n","/**\n * Store - Reactive wrapper for plain objects.\n */\n\nimport { Signal } from \"./signal.js\";\n\nconst STORE = Symbol();\n\n/**\n * Create a reactive store from a plain object.\n * Each property becomes a signal, and nested objects are recursively wrapped.\n */\nexport function store<T extends object>(obj: T): T {\n const signals = new Map<string | symbol, Signal<unknown>>();\n\n /** Recursively wrap nested objects and arrays */\n const wrap = (value: unknown): unknown => {\n if (typeof value !== \"object\" || value === null) return value;\n if (STORE in value) return value; // Already a store\n if ((value as object).constructor === Object) {\n return store(value as Record<string, unknown>);\n }\n if (Array.isArray(value)) {\n return value.map(wrap);\n }\n return value;\n };\n\n /** Get or create a signal for a property */\n const getSignal = (key: string | symbol, initialValue: unknown) => {\n let sig = signals.get(key);\n if (!sig) {\n sig = new Signal(wrap(initialValue));\n signals.set(key, sig);\n }\n return sig;\n };\n\n return new Proxy(obj, {\n get(target, key) {\n // Allow symbol access (for STORE check and other internal symbols)\n if (typeof key === \"symbol\") {\n return target[key as keyof T];\n }\n return getSignal(key, target[key as keyof T]).value;\n },\n\n set(target, key, value) {\n if (typeof key === \"symbol\") {\n target[key as keyof T] = value;\n return true;\n }\n const wrapped = wrap(value);\n getSignal(key, target[key as keyof T]).value = wrapped;\n target[key as keyof T] = wrapped as T[keyof T];\n return true;\n },\n\n has(target, key) {\n return key === STORE || key in target;\n },\n });\n}\n","/**\n * Reactive signals with automatic dependency tracking.\n *\n * Uses index-based tracking: computed functions are assumed to access\n * their dependencies in the same order on each run. This enables O(1)\n * dependency checks without complex linked-list structures.\n */\n\nexport { Signal, signal, ReadonlySignal } from \"./signal.js\";\nexport { Computed, computed } from \"./computed.js\";\nexport { effect } from \"./effect.js\";\nexport { store } from \"./store.js\";\nexport { batch, scope, type Subscriber } from \"./context.js\";\n\nimport { Signal, ReadonlySignal } from \"./signal.js\";\nimport { Computed } from \"./computed.js\";\n\n/** Common interface for reactive values (Signal or Computed). */\nexport interface Reactive<T> {\n readonly value: T;\n subscribe(fn: () => void): () => void;\n}\n\n/** Check if a value is a reactive signal or computed. @internal */\nexport const isSignal = (value: unknown): value is Reactive<unknown> =>\n value instanceof Signal ||\n value instanceof Computed ||\n value instanceof ReadonlySignal;\n","/**\n * Streaming HTML parser for template literals.\n * State machine: Text=0, TagOpen=1, TagName=2, InTag=3, AttrName=4, AttrEq=5, AttrVal=6, CloseTag=7, Comment=8\n */\n\n/** Pre-compiled attribute: static strings interleaved with slot indexes */\nexport type Attr = [name: string, statics: string[], indexes: number[]];\n\nexport interface ParseCallbacks {\n onText: (text: string) => void;\n onOpenTag: (tag: string, attrs: Attr[], selfClosing: boolean) => void;\n onClose: () => void;\n onSlot: (index: number) => void;\n}\n\nexport class HTMLParser {\n private s = 0; // state\n private tag = \"\";\n private attr = \"\";\n private statics: string[] = [];\n private indexes: number[] = [];\n private attrs: Attr[] = [];\n private text = \"\";\n private q = \"\";\n\n parseTemplate(strings: TemplateStringsArray, cb: ParseCallbacks) {\n for (let i = 0; i < strings.length; i++) {\n this.parse(strings[i]!, cb);\n if (i < strings.length - 1) this.slot(i, cb);\n }\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n }\n\n private parse(str: string, cb: ParseCallbacks) {\n for (let i = 0; i < str.length; i++) {\n const ch = str[i]!,\n nx = str[i + 1],\n n2 = str[i + 2];\n\n if (this.s === 0) {\n // Text\n if (ch === \"<\") {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n this.s = 1;\n } else this.text += ch;\n } else if (this.s === 1) {\n // TagOpen\n if (ch === \"/\") this.s = 7;\n else if (ch === \"!\" && nx === \"-\" && n2 === \"-\") {\n i += 2;\n this.s = 8;\n } else if (ch === \"!\" || ch === \"?\") {\n while (i < str.length && str[i] !== \">\") i++;\n this.s = 0;\n } else if (this.isA(ch)) {\n this.tag = ch;\n this.s = 2;\n } else {\n this.text += \"<\" + ch;\n this.s = 0;\n }\n } else if (this.s === 2) {\n // TagName\n if (this.isT(ch)) this.tag += ch;\n else if (this.isW(ch)) {\n this.s = 3;\n } else if (ch === \">\") {\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 3) {\n // InTag\n if (this.isW(ch)) continue;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n } else {\n this.attr = ch;\n this.statics = [\"\"];\n this.indexes = [];\n this.s = 4;\n }\n } else if (this.s === 4) {\n // AttrName\n if (this.isT(ch) || ch === \"_\") this.attr += ch;\n else if (ch === \"=\") this.s = 5;\n else if (this.isW(ch)) {\n this.emitAttr();\n this.s = 3;\n } else if (ch === \">\") {\n this.emitAttr();\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n this.emitAttr();\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 5) {\n // AttrEq\n if (ch === '\"' || ch === \"'\") {\n this.q = ch;\n this.s = 6;\n } else if (!this.isW(ch)) {\n this.q = \"\";\n this.statics[0] += ch;\n this.s = 6;\n }\n } else if (this.s === 6) {\n // AttrVal\n const end = this.q\n ? ch === this.q\n : this.isW(ch) || ch === \">\" || ch === \"/\";\n if (end) {\n this.emitAttr();\n this.q = \"\";\n this.s = 3;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else {\n this.statics[this.statics.length - 1] += ch;\n }\n } else if (this.s === 7) {\n // CloseTag\n if (ch === \">\") {\n cb.onClose();\n this.s = 0;\n }\n } else if (this.s === 8) {\n // Comment\n if (ch === \"-\" && nx === \"-\" && n2 === \">\") {\n i += 2;\n this.s = 0;\n }\n }\n }\n }\n\n private slot(index: number, cb: ParseCallbacks) {\n if (this.s === 5 || this.s === 6) {\n this.indexes.push(index);\n this.statics.push(\"\");\n if (this.s === 5) this.s = 6;\n } else {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n cb.onSlot(index);\n }\n }\n\n private emit(cb: ParseCallbacks, self: boolean) {\n cb.onOpenTag(this.tag, this.attrs, self);\n this.tag = \"\";\n this.attrs = [];\n this.s = 0;\n }\n\n private emitAttr() {\n if (this.attr) this.attrs.push([this.attr, this.statics, this.indexes]);\n this.attr = \"\";\n this.statics = [];\n this.indexes = [];\n }\n\n private isA(c: string) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n private isT(c: string) {\n return (\n (c >= \"a\" && c <= \"z\") ||\n (c >= \"A\" && c <= \"Z\") ||\n (c >= \"0\" && c <= \"9\") ||\n c === \"-\" ||\n c === \":\"\n );\n }\n private isW(c: string) {\n return c <= \" \" && c !== \"\";\n }\n}\n","/**\n * HTML template rendering with reactive bindings.\n *\n * Uses tagged template literals to create reactive DOM:\n * - Text interpolation: ${value} or ${signal}\n * - Attribute binding: class=\"${signal}\" (reactive)\n * - Event binding: @click=${handler}\n * - Property binding: .value=${signal} (sets DOM property, not attribute)\n * - Nested templates: ${html`<span>...</span>`}\n * - Arrays: ${items.map(i => html`<li>${i}</li>`)}\n *\n * Extend with plugins via html.with(...plugins) for additional interpolation types.\n */\n\nimport { computed, isSignal, scope, type Reactive } from \"./signals/index.js\";\nimport { HTMLParser, type Attr } from \"./parser.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/**\n * Plugin that handles custom interpolation types.\n * Return a bind function if this plugin handles the value, null otherwise.\n * First plugin to return non-null wins.\n */\nexport interface InterpolationPlugin {\n (\n value: unknown,\n ): ((marker: Comment, disposers: (() => void)[]) => void) | null;\n}\n\n/**\n * Html template tag function with plugin composition.\n */\nexport interface HtmlTag {\n (strings: TemplateStringsArray, ...values: unknown[]): Template;\n /** Create a new html tag with additional plugins */\n with(...plugins: InterpolationPlugin[]): HtmlTag;\n}\n\n/**\n * Create a computed that wraps function execution in a scope.\n * Nested computeds/effects are automatically disposed on re-run.\n * Returns [computed, dispose] - dispose cleans up both the computed\n * and any nested reactives from the last run.\n */\nfunction scopedComputed<T>(fn: () => T) {\n let disposeScope: (() => void) | undefined;\n\n const c = computed(() => {\n disposeScope?.();\n const [result, dispose] = scope(fn);\n disposeScope = dispose;\n return result;\n });\n\n return [c, () => (c.dispose(), disposeScope?.())] as const;\n}\n\n/**\n * Bind a value to an update function.\n * If reactive, subscribes and returns unsubscribe. Otherwise returns null.\n * Functions are wrapped in computed() for automatic reactivity.\n * Nested computeds/effects created inside functions are automatically\n * disposed when the function re-runs or the binding is disposed.\n */\nfunction bind(\n value: unknown,\n update: (v: unknown) => void,\n): (() => void) | null | undefined {\n let dispose: (() => void) | undefined;\n if (typeof value === \"function\") {\n [value, dispose] = scopedComputed(value as () => unknown);\n }\n if (isSignal(value)) {\n update(value.value);\n const unsub = value.subscribe(() =>\n update((value as Reactive<unknown>).value),\n );\n return dispose ? () => (unsub(), dispose()) : unsub;\n }\n update(value);\n}\n\n/** Result of rendering a template */\nexport interface RenderResult {\n fragment: DocumentFragment;\n dispose: () => void;\n}\n\n/** A parsed HTML template. Call render() to create live DOM. */\nexport class Template {\n constructor(\n private strings: TemplateStringsArray,\n private values: unknown[],\n private plugins: InterpolationPlugin[] = [],\n ) {}\n\n /**\n * Parse template and create live DOM.\n * Returns the fragment and a dispose function to clean up subscriptions.\n */\n render(): RenderResult {\n const fragment = document.createDocumentFragment();\n const disposers: (() => void)[] = [];\n const stack: (Element | DocumentFragment)[] = [fragment];\n const parser = new HTMLParser();\n const values = this.values;\n const plugins = this.plugins;\n\n const handleAttribute = (el: Element, [name, statics, indexes]: Attr) => {\n const idx0 = indexes[0];\n\n // Event binding: @click=${handler}\n if (name[0] === \"@\") {\n if (idx0 != null) {\n const handler = values[idx0] as EventListener;\n el.addEventListener(name.slice(1), handler);\n disposers.push(() => el.removeEventListener(name.slice(1), handler));\n }\n return;\n }\n\n // Property binding: .value=${data} - sets DOM property directly\n if (name[0] === \".\") {\n if (idx0 != null) {\n const unsub = bind(values[idx0], (v) => {\n (el as unknown as Record<string, unknown>)[name.slice(1)] = v;\n });\n if (unsub) disposers.push(unsub);\n }\n return;\n }\n\n // Static attribute (no dynamic parts)\n if (!indexes.length) {\n const value = statics[0] ?? \"\";\n el.setAttribute(name, value);\n return;\n }\n\n // Wrap functions in scoped computed, collect all reactive sources\n const reactives: Reactive<unknown>[] = [];\n for (const idx of indexes) {\n const v = values[idx];\n if (typeof v === \"function\") {\n const [c, dispose] = scopedComputed(v as () => unknown);\n values[idx] = c;\n reactives.push(c);\n disposers.push(dispose);\n } else if (isSignal(v)) {\n reactives.push(v);\n }\n }\n\n const update = () => {\n let result = statics[0]!;\n for (let i = 0; i < indexes.length; i++) {\n const v = values[indexes[i]!];\n const val = isSignal(v) ? (v as Reactive<unknown>).value : v;\n // Single dynamic attr: handle boolean/null specially\n if (indexes.length === 1 && (val == null || val === false)) {\n el.removeAttribute(name);\n return;\n }\n result += (val === true ? \"\" : (val ?? \"\")) + statics[i + 1]!;\n }\n el.setAttribute(name, result);\n };\n\n update();\n for (const s of reactives) disposers.push(s.subscribe(update));\n };\n\n /**\n * Bind dynamic content at a marker position.\n * Tries plugins first (first match wins), then falls back to default handling.\n */\n const bindContent = (marker: Comment, value: unknown): (() => void) => {\n // Try plugins first (first match wins)\n for (const plugin of plugins) {\n const binder = plugin(value);\n if (binder) {\n const pluginDisposers: (() => void)[] = [];\n binder(marker, pluginDisposers);\n return () => pluginDisposers.forEach((d) => d());\n }\n }\n\n // Default handling\n let nodes: Node[] = [];\n let childDisposers: (() => void)[] = [];\n\n const clear = () => {\n childDisposers.forEach((d) => d());\n childDisposers = [];\n nodes.forEach((n) => (n as ChildNode).remove());\n nodes = [];\n };\n\n const update = (v: unknown) => {\n clear();\n renderContent(marker, v, nodes, childDisposers);\n };\n\n const unsub = bind(value, update);\n return () => {\n unsub?.();\n clear();\n };\n };\n\n parser.parseTemplate(this.strings, {\n onText: (text) => {\n stack.at(-1)!.append(text);\n },\n\n onOpenTag: (tag, attrs, selfClosing) => {\n const parent = stack.at(-1)!;\n const isSvg =\n tag === \"svg\" ||\n tag === \"SVG\" ||\n (parent instanceof Element && parent.namespaceURI === SVG_NS);\n const el = isSvg\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n for (const attr of attrs) handleAttribute(el, attr);\n parent.appendChild(el);\n if (!selfClosing) stack.push(el);\n },\n\n onClose: () => {\n if (stack.length > 1) stack.pop();\n },\n\n onSlot: (index) => {\n // Marker comment anchors dynamic content\n const marker = document.createComment(\"\");\n stack.at(-1)!.appendChild(marker);\n disposers.push(bindContent(marker, values[index]));\n },\n });\n\n return { fragment, dispose: () => disposers.forEach((d) => d()) };\n }\n}\n\n/**\n * Render content and insert nodes before marker.\n * Handles Templates, primitives, arrays.\n */\nfunction renderContent(\n marker: Comment,\n v: unknown,\n nodes: Node[],\n childDisposers: (() => void)[],\n): void {\n const parent = marker.parentNode!;\n\n for (const item of Array.isArray(v) ? v : [v]) {\n // Handle templates\n if (item instanceof Template) {\n const { fragment, dispose } = item.render();\n childDisposers.push(dispose);\n nodes.push(...fragment.childNodes);\n parent.insertBefore(fragment, marker);\n }\n // Handle primitives (ignore null/undefined/boolean)\n else if (item != null && typeof item !== \"boolean\") {\n const node = document.createTextNode(String(item));\n nodes.push(node);\n parent.insertBefore(node, marker);\n }\n }\n}\n\n/**\n * Create an html tag function with the given plugins.\n */\nfunction createHtmlWithPlugins(plugins: InterpolationPlugin[]): HtmlTag {\n const tag = ((strings: TemplateStringsArray, ...values: unknown[]) =>\n new Template(strings, values, plugins)) as HtmlTag;\n\n tag.with = (...morePlugins: InterpolationPlugin[]) =>\n createHtmlWithPlugins([...plugins, ...morePlugins]);\n\n return tag;\n}\n\n/**\n * Tagged template literal for creating reactive HTML templates.\n * Use .with(...plugins) to add interpolation handlers like each() or async generators.\n *\n * @example\n * ```ts\n * import { html } from \"balises\";\n * import eachPlugin, { each } from \"balises/each\";\n * import asyncPlugin from \"balises/async\";\n *\n * const html = baseHtml.with(eachPlugin, asyncPlugin);\n *\n * html`<div>${async function* () { ... }}</div>`.render();\n * ```\n */\nexport const html: HtmlTag = createHtmlWithPlugins([]);\n"],"mappings":"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"}
1
+ {"version":3,"file":"balises.esm.js","names":["context: Computed<unknown> | null","batchQueue: Set<Subscriber> | null","disposalStack: Array<Array<() => void>> | null","disposers: Array<() => void>","onTrack: {\n current: ((source: TrackableSource) => void) | null;\n}","#map","#key","#value","#targets","#isSlots","#subs","#signal","signal","#fn","#recompute","#dirty","#value","#subs","#sources","#isSlots","#sourceIndex","queue: Computed<unknown>[]","toNotify: [Computed<unknown>, unknown][]","#targets","#computing","cleanup: (() => void) | undefined","cleanup: (() => void) | undefined","result: Node[]","node: Node | null","#strings","#values","#plugins","#buildPrototype","#instantiate","bindings: Binding[]","stack: (Element | DocumentFragment)[]","disposers: (() => void)[]","#bindContent","prev: string | null | undefined","currentNodes: Node[]","childDisposers: (() => void)[]","html: HtmlTag"],"sources":["../src/signals/context.ts","../src/signals/signal.ts","../src/signals/computed.ts","../src/signals/effect.ts","../src/signals/store.ts","../src/signals/index.ts","../src/parser.ts","../src/template.ts"],"sourcesContent":["/**\n * Global state and batching for the reactive system.\n */\n\nimport type { Computed } from \"./computed.js\";\n\n/** Callback function for subscribers */\nexport type Subscriber = () => void;\n\n/**\n * Minimal interface for dependency tracking sources.\n * Implemented by Signal, Computed, and selector slots.\n */\nexport interface TrackableSource {\n targets: Computed<unknown>[];\n deleteTarget(target: Computed<unknown>): void;\n}\n\n/** The currently executing computed (for dependency tracking) */\nexport let context: Computed<unknown> | null = null;\n\n/** Set the current execution context */\nexport function setContext(c: Computed<unknown> | null): void {\n context = c;\n}\n\n/** Batching: defer subscriber notifications until batch completes */\nlet batchDepth = 0;\nlet batchQueue: Set<Subscriber> | null = null;\n\n/**\n * Batch multiple signal updates into a single notification pass.\n * Subscribers are only notified after the batch function completes.\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n if (batchDepth === 1) batchQueue = new Set();\n try {\n return fn();\n } finally {\n if (--batchDepth === 0) {\n const q = batchQueue!;\n batchQueue = null;\n for (const sub of q) sub();\n }\n }\n}\n\n/** Check if currently batching */\nexport function isBatching(): boolean {\n return batchDepth > 0;\n}\n\n/** Add a subscriber to the batch queue */\nexport function enqueueBatchOne(sub: Subscriber): void {\n batchQueue!.add(sub);\n}\n\n/** Add multiple subscribers to the batch queue */\nexport function enqueueBatchAll(subs: Subscriber[]): void {\n for (let i = 0; i < subs.length; i++) batchQueue!.add(subs[i]!);\n}\n\n/** Scope disposal: collect all disposers in a scope */\nlet disposalStack: Array<Array<() => void>> | null = null;\n\n/**\n * Create a disposal scope that collects all subscriptions and computeds created within.\n * Returns the result of the function and a dispose function that cleans up all resources.\n *\n * @example\n * ```ts\n * const [result, dispose] = scope(() => {\n * const count = signal(0);\n * const doubled = computed(() => count.value * 2);\n * effect(() => console.log(doubled.value));\n * return { count, doubled };\n * });\n *\n * // Later: clean up all subscriptions and computeds\n * dispose();\n * ```\n */\nexport function scope<T>(fn: () => T): [result: T, dispose: () => void] {\n const disposers: Array<() => void> = [];\n\n // Push new disposal context\n if (!disposalStack) disposalStack = [];\n disposalStack.push(disposers);\n\n try {\n const result = fn();\n return [\n result,\n () => {\n for (let i = disposers.length - 1; i >= 0; i--) {\n disposers[i]!();\n }\n disposers.length = 0;\n },\n ];\n } finally {\n // Pop disposal context\n disposalStack.pop();\n if (!disposalStack.length) disposalStack = null;\n }\n}\n\n/**\n * Register a disposer in the current scope (if any).\n * This is called internally by computed/effect when they create cleanup functions.\n */\nexport function registerDisposer(dispose: () => void): void {\n disposalStack?.at(-1)?.push(dispose);\n}\n\n/**\n * Hook for tracking signal/computed accesses.\n * Set by async.ts when track() is active to capture dependencies.\n * Using an object wrapper so async.ts can mutate the current value.\n */\nexport const onTrack: {\n current: ((source: TrackableSource) => void) | null;\n} = { current: null };\n","/**\n * Signal - A reactive value container.\n */\n\nimport type { Computed } from \"./computed.js\";\nimport {\n batch,\n context,\n isBatching,\n enqueueBatchAll,\n onTrack,\n type Subscriber,\n type TrackableSource,\n} from \"./context.js\";\n\n/**\n * Remove an item from an array using swap-and-pop (O(1) removal).\n */\nexport function removeFromArray<T>(array: T[], item: T): void {\n const i = array.indexOf(item);\n if (i >= 0) {\n array[i] = array[array.length - 1]!;\n array.pop();\n }\n}\n\n/**\n * A tracking slot for .is() comparisons.\n * Self-removes from parent map when all targets are gone.\n * @internal\n */\nexport class IsSlot<T> implements TrackableSource {\n targets: Computed<unknown>[] = [];\n #map: Map<T, IsSlot<T>>;\n #key: T;\n\n constructor(map: Map<T, IsSlot<T>>, key: T) {\n this.#map = map;\n this.#key = key;\n }\n\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.targets, target);\n // Self-cleanup when empty\n if (!this.targets.length) {\n this.#map.delete(this.#key);\n }\n }\n\n /** Notify all targets that they may need to recompute */\n notify(): void {\n // Copy: markDirty can cause disposal which mutates the array\n const copy = this.targets.slice();\n for (let i = 0; i < copy.length; i++) copy[i]!.markDirty();\n }\n}\n\n/**\n * A reactive value container. When the value changes, all dependent\n * computeds are marked dirty and subscribers are notified.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Signal<T> {\n #value: T;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n #isSlots: Map<T, IsSlot<T>> | undefined;\n\n constructor(value: T) {\n this.#value = value;\n }\n\n get value(): T {\n if (context) context.trackSource(this);\n if (onTrack.current) onTrack.current(this);\n return this.#value;\n }\n\n set value(v: T) {\n if (Object.is(this.#value, v)) return;\n const prev = this.#value;\n this.#value = v;\n\n const targets = this.#targets;\n const isSlots = this.#isSlots;\n\n // Fast path: no .is() slots, just notify regular targets\n if (!isSlots) {\n for (let i = 0; i < targets.length; i++) {\n targets[i]!.markDirty();\n }\n } else {\n // When .is() slots exist, batch all notifications so markDirty()\n // defers recomputation. This allows the #dirty flag to remain true\n // across multiple markDirty() calls, preventing double recomputation\n // when a computed tracks both .value and .is() on the same signal.\n batch(() => {\n isSlots.get(prev)?.notify();\n isSlots.get(v)?.notify();\n for (let i = 0; i < targets.length; i++) {\n targets[i]!.markDirty();\n }\n });\n }\n\n // Notify subscribers\n if (this.#subs.length) {\n if (isBatching()) {\n enqueueBatchAll(this.#subs);\n } else {\n // Copy array to avoid issues if subscribers modify the array during iteration\n const subs = this.#subs.slice();\n for (let i = 0; i < subs.length; i++) subs[i]!();\n }\n }\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n /**\n * Update the signal value using an updater function.\n *\n * @param fn - Function that receives current value and returns new value\n *\n * @example\n * const count = signal(0);\n * count.update(n => n + 1); // increment\n */\n update(fn: (current: T) => T): void {\n this.value = fn(this.#value);\n }\n\n /**\n * Read the signal value without tracking dependencies.\n * Useful in event handlers where you want the current value\n * but don't want to create a reactive dependency.\n *\n * @example\n * const count = signal(0);\n * // In an event handler - no dependency tracking\n * button.onclick = () => console.log(count.peek());\n */\n peek(): T {\n return this.#value;\n }\n\n /**\n * Check if the signal's value equals the given value.\n * Enables O(1) selection updates - only the old and new matching values\n * trigger recomputes, not all dependents.\n *\n * @example\n * ```ts\n * const selected = signal<number | null>(null);\n *\n * // In each row - only 2 rows recompute when selection changes\n * html`<tr class=${() => selected.is(row.id) ? 'danger' : ''}>...`\n * ```\n */\n is(value: T): boolean {\n if (context) {\n const slots = this.#isSlots ?? (this.#isSlots = new Map());\n let slot = slots.get(value);\n if (!slot) slots.set(value, (slot = new IsSlot(slots, value)));\n context.trackSource(slot);\n }\n return Object.is(this.#value, value);\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n}\n\n/** Create a new signal with the given initial value. */\nexport const signal = <T>(value: T) => new Signal(value);\n\n/**\n * A read-only view of a Signal.\n * Provides reactive access without allowing external mutation.\n * Used by `each()` to pass item signals to render functions.\n */\nexport class ReadonlySignal<T> {\n #signal: Signal<T>;\n\n /** @internal */\n constructor(signal: Signal<T>) {\n this.#signal = signal;\n }\n\n get value(): T {\n return this.#signal.value;\n }\n\n /**\n * Read the signal value without tracking dependencies.\n * Useful in event handlers where you want the current value\n * but don't want to create a reactive dependency.\n */\n peek(): T {\n return this.#signal.peek();\n }\n\n subscribe(fn: Subscriber): () => void {\n return this.#signal.subscribe(fn);\n }\n\n /**\n * Check if the signal's value equals the given value.\n * Enables O(1) selection updates.\n */\n is(value: T): boolean {\n return this.#signal.is(value);\n }\n}\n","/**\n * Computed - A derived reactive value.\n */\n\nimport { removeFromArray, IsSlot } from \"./signal.js\";\nimport {\n context,\n setContext,\n isBatching,\n enqueueBatchOne,\n registerDisposer,\n onTrack,\n type Subscriber,\n type TrackableSource,\n} from \"./context.js\";\n\n/**\n * A derived reactive value. Automatically tracks dependencies and\n * recomputes when any dependency changes.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Computed<T> {\n #fn: (() => T) | undefined;\n #value: T | undefined;\n #dirty = true;\n #computing = false;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n #sources: TrackableSource[] = [];\n #sourceIndex = 0;\n #isSlots: Map<T, IsSlot<T>> | undefined;\n\n constructor(fn: () => T) {\n this.#fn = fn;\n this.#recompute();\n\n // Auto-register disposal in current root scope\n registerDisposer(() => this.dispose());\n }\n\n get value(): T {\n if (this.#dirty) this.#recompute();\n if (context && context !== this) context.trackSource(this);\n if (onTrack.current) onTrack.current(this);\n return this.#value as T;\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n dispose(): void {\n this.#fn = undefined;\n const sources = this.#sources;\n for (let i = 0; i < sources.length; i++) sources[i]?.deleteTarget(this);\n this.#sources = [];\n this.#subs.length = 0;\n this.#isSlots?.clear();\n }\n\n /**\n * Check if the computed's value equals the given value.\n * Enables O(1) selection updates - only the old and new matching values\n * trigger recomputes, not all dependents.\n *\n * @example\n * ```ts\n * const selected = computed(() => items.find(i => i.active)?.id ?? null);\n *\n * // In each row - only 2 rows recompute when selection changes\n * html`<tr class=${() => selected.is(row.id) ? 'danger' : ''}>...`\n * ```\n */\n is(value: T): boolean {\n if (this.#dirty) this.#recompute();\n if (context) {\n const slots = this.#isSlots ?? (this.#isSlots = new Map());\n let slot = slots.get(value);\n if (!slot) slots.set(value, (slot = new IsSlot(slots, value)));\n context.trackSource(slot);\n }\n return Object.is(this.#value, value);\n }\n\n /**\n * Called by sources when accessed during recompute.\n * @internal\n */\n trackSource(source: TrackableSource): void {\n // Skip tracking if disposed (can happen if dispose() is called during #fn execution)\n if (!this.#fn) return;\n\n const sources = this.#sources;\n const idx = this.#sourceIndex++;\n\n if (idx < sources.length) {\n if (sources[idx] === source) {\n // Same source at same position - nothing to do\n return;\n }\n // Different source - unlink old ones from this position\n for (let i = idx; i < sources.length; i++) {\n const s = sources[i];\n if (s) s.deleteTarget(this);\n }\n sources.length = idx;\n }\n // Add new source\n sources.push(source);\n source.targets.push(this);\n }\n\n /**\n * Mark this computed and all its dependents as dirty.\n * Uses a two-phase approach to avoid cascading issues:\n * 1. Mark all dependents as dirty (no subscriber calls)\n * 2. Notify subscribers after all dirty flags are set\n * @internal\n */\n markDirty(): void {\n if (this.#dirty) return;\n\n // Phase 1: Mark all dependents as dirty, collect subscribers\n const queue: Computed<unknown>[] = [this];\n const toNotify: [Computed<unknown>, unknown][] = [];\n\n for (let i = 0; i < queue.length; i++) {\n const c = queue[i]!;\n if (c.#dirty) continue;\n c.#dirty = true;\n\n // Propagate to all targets\n const targets = c.#targets;\n for (let j = 0; j < targets.length; j++) {\n const t = targets[j]!;\n if (!t.#dirty) queue.push(t);\n }\n\n // Collect computeds with subscribers or .is() slots for later notification\n if ((c.#subs.length || c.#isSlots?.size) && c.#fn) {\n toNotify.push([c, c.#value]);\n }\n }\n\n // Phase 2: Notify subscribers (after all dirty flags are set)\n for (let i = 0; i < toNotify.length; i++) {\n const [c, old] = toNotify[i]!;\n const notify = () => {\n if (!c.#fn) return;\n c.#recompute();\n if (!Object.is(c.#value, old)) {\n // Notify .is() slots for old and new values\n if (c.#isSlots) {\n c.#isSlots.get(old)?.notify();\n c.#isSlots.get(c.#value)?.notify();\n }\n const subs = c.#subs.slice();\n for (let j = 0; j < subs.length; j++) subs[j]!();\n }\n };\n void (isBatching() ? enqueueBatchOne(notify) : notify());\n }\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n\n #recompute(): void {\n if (this.#computing || !this.#fn) return;\n this.#computing = true;\n\n this.#sourceIndex = 0;\n const prevLen = this.#sources.length;\n\n const prev = context;\n setContext(this);\n try {\n this.#value = this.#fn();\n } finally {\n setContext(prev);\n\n // Unlink removed sources\n const newLen = this.#sourceIndex;\n if (newLen < prevLen) {\n const sources = this.#sources;\n for (let i = newLen; i < prevLen; i++) sources[i]?.deleteTarget(this);\n sources.length = newLen;\n }\n\n this.#dirty = false;\n this.#computing = false;\n }\n }\n}\n\n/** Create a new computed from the given function. */\nexport const computed = <T>(fn: () => T) => new Computed(fn);\n","/**\n * Effect - Run side effects reactively.\n */\n\nimport { computed } from \"./computed.js\";\nimport { context, setContext, registerDisposer } from \"./context.js\";\n\n/**\n * Create a reactive effect that automatically tracks dependencies\n * and re-runs when they change.\n *\n * The effect function can optionally return a cleanup function that will be\n * called before the effect re-runs and when the effect is disposed.\n *\n * @param fn - The effect function to run. May return a cleanup function.\n * @returns A dispose function to stop the effect\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log(\"Count is:\", count.value);\n * });\n *\n * count.value = 1; // logs: \"Count is: 1\"\n * dispose(); // stop the effect\n *\n * @example\n * // With cleanup function\n * const userId = signal(1);\n * const dispose = effect(() => {\n * const subscription = api.subscribe(userId.value);\n * return () => subscription.unsubscribe(); // cleanup\n * });\n *\n * userId.value = 2; // cleanup runs, then effect re-runs with new subscription\n * dispose(); // final cleanup runs\n */\nexport function effect(fn: () => void | (() => void)): () => void {\n let cleanup: (() => void) | undefined;\n let disposed = false;\n\n const c = computed(() => {\n // Run cleanup outside of tracking context to avoid\n // reactive reads in cleanup creating new dependencies\n if (cleanup) {\n const prev = context;\n setContext(null);\n try {\n cleanup();\n } finally {\n setContext(prev);\n }\n }\n cleanup = fn() ?? undefined;\n return undefined;\n });\n // Subscribe to make it reactive (rerun on dependency changes)\n const unsub = c.subscribe(() => {});\n\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n unsub();\n c.dispose();\n cleanup?.();\n };\n\n // Register full effect dispose (with cleanup) in current scope\n // This overrides the computed's auto-registration with a more complete cleanup\n registerDisposer(dispose);\n\n return dispose;\n}\n","/**\n * Store - Reactive wrapper for plain objects.\n */\n\nimport { Signal } from \"./signal.js\";\n\nconst STORE = Symbol();\n\n/**\n * Create a reactive store from a plain object.\n * Each property becomes a signal, and nested objects are recursively wrapped.\n */\nexport function store<T extends object>(obj: T): T {\n const signals = new Map<string | symbol, Signal<unknown>>();\n\n /** Recursively wrap nested objects and arrays */\n const wrap = (value: unknown): unknown => {\n if (typeof value !== \"object\" || value === null) return value;\n if (STORE in value) return value; // Already a store\n if ((value as object).constructor === Object) {\n return store(value as Record<string, unknown>);\n }\n if (Array.isArray(value)) {\n return value.map(wrap);\n }\n return value;\n };\n\n /** Get or create a signal for a property */\n const getSignal = (key: string | symbol, initialValue: unknown) => {\n let sig = signals.get(key);\n if (!sig) {\n sig = new Signal(wrap(initialValue));\n signals.set(key, sig);\n }\n return sig;\n };\n\n return new Proxy(obj, {\n get(target, key) {\n // Allow symbol access (for STORE check and other internal symbols)\n if (typeof key === \"symbol\") {\n return target[key as keyof T];\n }\n return getSignal(key, target[key as keyof T]).value;\n },\n\n set(target, key, value) {\n if (typeof key === \"symbol\") {\n target[key as keyof T] = value;\n return true;\n }\n const wrapped = wrap(value);\n getSignal(key, target[key as keyof T]).value = wrapped;\n target[key as keyof T] = wrapped as T[keyof T];\n return true;\n },\n\n has(target, key) {\n return key === STORE || key in target;\n },\n });\n}\n","/**\n * Reactive signals with automatic dependency tracking.\n *\n * Uses index-based tracking: computed functions are assumed to access\n * their dependencies in the same order on each run. This enables O(1)\n * dependency checks without complex linked-list structures.\n */\n\nexport { Signal, signal, ReadonlySignal } from \"./signal.js\";\nexport { Computed, computed } from \"./computed.js\";\nexport { effect } from \"./effect.js\";\nexport { store } from \"./store.js\";\nexport { batch, scope, type Subscriber } from \"./context.js\";\n\nimport { Signal, ReadonlySignal } from \"./signal.js\";\nimport { Computed } from \"./computed.js\";\n\n/** Common interface for reactive values (Signal or Computed). */\nexport interface Reactive<T> {\n readonly value: T;\n subscribe(fn: () => void): () => void;\n}\n\n/** Check if a value is a reactive signal or computed. @internal */\nexport const isSignal = (value: unknown): value is Reactive<unknown> =>\n value instanceof Signal ||\n value instanceof Computed ||\n value instanceof ReadonlySignal;\n","/**\n * Streaming HTML parser for template literals.\n * State machine: Text=0, TagOpen=1, TagName=2, InTag=3, AttrName=4, AttrEq=5, AttrVal=6, CloseTag=7, Comment=8\n */\n\n/** Pre-compiled attribute: static strings interleaved with slot indexes */\nexport type Attr = [name: string, statics: string[], indexes: number[]];\n\nexport interface ParseCallbacks {\n onText: (text: string) => void;\n onOpenTag: (tag: string, attrs: Attr[], selfClosing: boolean) => void;\n onClose: () => void;\n onSlot: (index: number) => void;\n}\n\nexport class HTMLParser {\n private s = 0; // state\n private tag = \"\";\n private attr = \"\";\n private statics: string[] = [];\n private indexes: number[] = [];\n private attrs: Attr[] = [];\n private text = \"\";\n private q = \"\";\n\n parseTemplate(strings: TemplateStringsArray, cb: ParseCallbacks) {\n for (let i = 0; i < strings.length; i++) {\n this.parse(strings[i]!, cb);\n if (i < strings.length - 1) this.slot(i, cb);\n }\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n }\n\n private parse(str: string, cb: ParseCallbacks) {\n for (let i = 0; i < str.length; i++) {\n const ch = str[i]!,\n nx = str[i + 1],\n n2 = str[i + 2];\n\n if (this.s === 0) {\n // Text\n if (ch === \"<\") {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n this.s = 1;\n } else this.text += ch;\n } else if (this.s === 1) {\n // TagOpen\n if (ch === \"/\") this.s = 7;\n else if (ch === \"!\" && nx === \"-\" && n2 === \"-\") {\n i += 2;\n this.s = 8;\n } else if (ch === \"!\" || ch === \"?\") {\n while (i < str.length && str[i] !== \">\") i++;\n this.s = 0;\n } else if (this.isA(ch)) {\n this.tag = ch;\n this.s = 2;\n } else {\n this.text += \"<\" + ch;\n this.s = 0;\n }\n } else if (this.s === 2) {\n // TagName\n if (this.isT(ch)) this.tag += ch;\n else if (this.isW(ch)) {\n this.s = 3;\n } else if (ch === \">\") {\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 3) {\n // InTag\n if (this.isW(ch)) continue;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n } else {\n this.attr = ch;\n this.statics = [\"\"];\n this.indexes = [];\n this.s = 4;\n }\n } else if (this.s === 4) {\n // AttrName\n if (this.isT(ch) || ch === \"_\") this.attr += ch;\n else if (ch === \"=\") this.s = 5;\n else if (this.isW(ch)) {\n this.emitAttr();\n this.s = 3;\n } else if (ch === \">\") {\n this.emitAttr();\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n this.emitAttr();\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 5) {\n // AttrEq\n if (ch === '\"' || ch === \"'\") {\n this.q = ch;\n this.s = 6;\n } else if (!this.isW(ch)) {\n this.q = \"\";\n this.statics[0] += ch;\n this.s = 6;\n }\n } else if (this.s === 6) {\n // AttrVal\n const end = this.q\n ? ch === this.q\n : this.isW(ch) || ch === \">\" || ch === \"/\";\n if (end) {\n this.emitAttr();\n this.q = \"\";\n this.s = 3;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else {\n this.statics[this.statics.length - 1] += ch;\n }\n } else if (this.s === 7) {\n // CloseTag\n if (ch === \">\") {\n cb.onClose();\n this.s = 0;\n }\n } else if (this.s === 8) {\n // Comment\n if (ch === \"-\" && nx === \"-\" && n2 === \">\") {\n i += 2;\n this.s = 0;\n }\n }\n }\n }\n\n private slot(index: number, cb: ParseCallbacks) {\n if (this.s === 5 || this.s === 6) {\n this.indexes.push(index);\n this.statics.push(\"\");\n if (this.s === 5) this.s = 6;\n } else {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n cb.onSlot(index);\n }\n }\n\n private emit(cb: ParseCallbacks, self: boolean) {\n cb.onOpenTag(this.tag, this.attrs, self);\n this.tag = \"\";\n this.attrs = [];\n this.s = 0;\n }\n\n private emitAttr() {\n if (this.attr) this.attrs.push([this.attr, this.statics, this.indexes]);\n this.attr = \"\";\n this.statics = [];\n this.indexes = [];\n }\n private isA = (c: string) => (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n private isT = (c: string) =>\n (c >= \"a\" && c <= \"z\") ||\n (c >= \"A\" && c <= \"Z\") ||\n (c >= \"0\" && c <= \"9\") ||\n c === \"-\" ||\n c === \":\";\n private isW = (c: string) => c <= \" \" && c !== \"\";\n}\n","/**\n * HTML template rendering with reactive bindings.\n *\n * Uses tagged template literals to create reactive DOM:\n * - Text interpolation: ${value} or ${signal}\n * - Attribute binding: class=\"${signal}\" (reactive)\n * - Event binding: @click=${handler}\n * - Property binding: .value=${signal} (sets DOM property, not attribute)\n * - Nested templates: ${html`<span>...</span>`}\n * - Arrays: ${items.map(i => html`<li>${i}</li>`)}\n *\n * Extend with plugins via html.with(...plugins) for additional interpolation types.\n *\n * Templates are cached by their static string parts - the DOM structure is built\n * once and cloned for subsequent renders, significantly improving performance.\n */\n\nimport { computed, isSignal, scope, type Reactive } from \"./signals/index.js\";\nimport { HTMLParser } from \"./parser.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/**\n * Plugin that handles custom interpolation types.\n * Return a bind function if this plugin handles the value, null otherwise.\n * First plugin to return non-null wins.\n */\nexport interface InterpolationPlugin {\n (\n value: unknown,\n ): ((marker: Comment, disposers: (() => void)[]) => void) | null;\n}\n\n/**\n * Html template tag function with plugin composition.\n */\nexport interface HtmlTag {\n (strings: TemplateStringsArray, ...values: unknown[]): Template;\n /** Create a new html tag with additional plugins */\n with(...plugins: InterpolationPlugin[]): HtmlTag;\n}\n\n/** Result of rendering a template */\nexport interface RenderResult {\n fragment: DocumentFragment;\n dispose: () => void;\n}\n\n/**\n * Binding descriptor stored in cache.\n * Uses tuple format for compact storage:\n * - [0, nodeIndex, slotIndex] - text content binding\n * - [1, nodeIndex, attrName, staticParts, slotIndices] - attribute binding\n * - [2, nodeIndex, propName, slotIndex] - property binding\n * - [3, nodeIndex, eventName, slotIndex] - event binding\n *\n * nodeIndex is the index in a TreeWalker traversal (elements + comments only).\n */\ntype Binding =\n | [0, number, number]\n | [1, number, string, string[], number[]]\n | [2, number, string, number]\n | [3, number, string, number];\n\n/** Cached template: prototype fragment and binding descriptors */\ntype Cached = [DocumentFragment, Binding[]];\n\n/** Template cache - keyed by static string parts identity */\nconst cache = new WeakMap<TemplateStringsArray, Cached>();\n\n/**\n * Wrap a function in a scoped computed.\n * Nested computeds/effects are automatically disposed on re-run.\n * Registers disposal of both the computed and nested reactives.\n */\nfunction wrapFn(fn: () => unknown, d: (() => void)[]) {\n let cleanup: (() => void) | undefined;\n const c = computed(() => {\n cleanup?.();\n const [r, dispose] = scope(fn);\n cleanup = dispose;\n return r;\n });\n d.push(() => (c.dispose(), cleanup?.()));\n return c;\n}\n\n/**\n * Bind a value to an update function.\n * Functions are wrapped in computed() for automatic reactivity.\n * Nested computeds/effects created inside functions are automatically\n * disposed when the function re-runs or the binding is disposed.\n */\nfunction bind(v: unknown, update: (v: unknown) => void, d: (() => void)[]) {\n if (typeof v === \"function\") v = wrapFn(v as () => unknown, d);\n if (isSignal(v)) {\n update(v.value);\n d.push(v.subscribe(() => update((v as Reactive<unknown>).value)));\n } else update(v);\n}\n\n/**\n * Collect nodes for all bindings using a single TreeWalker pass.\n * TreeWalker with filter 129 (SHOW_ELEMENT | SHOW_COMMENT) visits nodes\n * in the same order they were created, matching our nodeIndex counter.\n * Bindings are in document order but may share nodes (multiple attrs).\n */\nfunction collectBindingNodes(\n frag: DocumentFragment,\n bindings: Binding[],\n): Node[] {\n if (!bindings.length) return [];\n\n const result: Node[] = new Array(bindings.length);\n const walker = document.createTreeWalker(frag, 129); // SHOW_ELEMENT | SHOW_COMMENT\n let nodeIndex = -1;\n let node: Node | null = null;\n\n for (let i = 0; i < bindings.length; i++) {\n const targetIndex = bindings[i]![1];\n // Advance walker to the target node\n while (nodeIndex < targetIndex) {\n node = walker.nextNode();\n nodeIndex++;\n }\n result[i] = node!;\n }\n\n return result;\n}\n\n/** A parsed HTML template. Call render() to create live DOM. */\nexport class Template {\n #strings: TemplateStringsArray;\n #values: unknown[];\n #plugins: InterpolationPlugin[];\n\n constructor(\n strings: TemplateStringsArray,\n values: unknown[],\n plugins: InterpolationPlugin[] = [],\n ) {\n this.#strings = strings;\n this.#values = values;\n this.#plugins = plugins;\n }\n\n /**\n * Parse template and create live DOM.\n * Returns the fragment and a dispose function to clean up subscriptions.\n *\n * Templates are cached by their static string parts - subsequent renders\n * clone the cached DOM structure instead of rebuilding it.\n */\n render(): RenderResult {\n let cached = cache.get(this.#strings);\n if (!cached) cache.set(this.#strings, (cached = this.#buildPrototype()));\n return this.#instantiate(cached);\n }\n\n /** Build the prototype fragment and collect binding descriptors */\n #buildPrototype(): Cached {\n const frag = document.createDocumentFragment();\n const bindings: Binding[] = [];\n const stack: (Element | DocumentFragment)[] = [frag];\n // nodeIndex counts elements and comments (what TreeWalker visits)\n let nodeIndex = 0;\n\n new HTMLParser().parseTemplate(this.#strings, {\n onText: (t) => stack[stack.length - 1]!.append(t),\n\n onOpenTag: (tag, attrs, selfClose) => {\n const parent = stack[stack.length - 1]!;\n const svg =\n tag === \"svg\" ||\n tag === \"SVG\" ||\n (parent instanceof Element && parent.namespaceURI === SVG_NS);\n const el = svg\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n\n const elIndex = nodeIndex++;\n for (const [name, statics, slots] of attrs) {\n if (!slots.length) el.setAttribute(name, statics[0] ?? \"\");\n else {\n const c = name[0];\n if (c === \"@\")\n bindings.push([3, elIndex, name.slice(1), slots[0]!]);\n else if (c === \".\")\n bindings.push([2, elIndex, name.slice(1), slots[0]!]);\n else bindings.push([1, elIndex, name, statics, slots]);\n }\n }\n\n parent.appendChild(el);\n if (!selfClose) stack.push(el);\n },\n\n onClose: () => {\n if (stack.length > 1) stack.pop();\n },\n\n onSlot: (i) => {\n const parent = stack[stack.length - 1]!;\n parent.appendChild(document.createComment(\"\"));\n bindings.push([0, nodeIndex++, i]);\n },\n });\n\n return [frag, bindings];\n }\n\n /** Clone the prototype and apply bindings with current values */\n #instantiate([proto, bindings]: Cached): RenderResult {\n const frag = proto.cloneNode(true) as DocumentFragment;\n const disposers: (() => void)[] = [];\n const values = this.#values;\n\n // Single TreeWalker pass to collect all binding nodes\n const nodes = collectBindingNodes(frag, bindings);\n\n for (let i = 0; i < bindings.length; i++) {\n const b = bindings[i]!;\n const node = nodes[i]!;\n\n if (b[0] === 0) {\n // Content binding - fast path for static values inline\n const value = values[b[2]];\n const t = typeof value;\n if (t === \"string\" || t === \"number\" || t === \"bigint\") {\n // Static primitive - insert text node directly, no disposer needed\n // (text nodes have no subscriptions and are removed with parent)\n const n = document.createTextNode(String(value));\n node.parentNode!.insertBefore(n, node);\n } else if (value == null || t === \"boolean\") {\n // null, undefined, boolean - render nothing, no disposer needed\n } else {\n // Functions, signals, objects, arrays, templates - full binding\n this.#bindContent(node as Comment, value, disposers);\n }\n } else if (b[0] === 1) {\n // Attribute binding\n const [, , name, statics, slots] = b;\n const resolved = slots.map((s) => {\n const v = values[s];\n return typeof v === \"function\"\n ? wrapFn(v as () => unknown, disposers)\n : v;\n });\n let prev: string | null | undefined;\n\n const update = () => {\n let result = statics[0]!,\n allNull = true;\n for (let j = 0; j < resolved.length; j++) {\n const val = isSignal(resolved[j])\n ? (resolved[j] as Reactive<unknown>).value\n : resolved[j];\n if (val != null && val !== false) allNull = false;\n result += (val === true ? \"\" : (val ?? \"\")) + statics[j + 1]!;\n }\n const next = slots.length === 1 && allNull ? null : result;\n if (next !== prev) {\n prev = next;\n if (next === null) (node as Element).removeAttribute(name);\n else (node as Element).setAttribute(name, next);\n }\n };\n update();\n for (const r of resolved)\n if (isSignal(r)) disposers.push(r.subscribe(update));\n } else if (b[0] === 2) {\n // Property binding\n const [, , name, slot] = b;\n bind(\n values[slot],\n (v) => ((node as unknown as Record<string, unknown>)[name] = v),\n disposers,\n );\n } else {\n // Event binding\n const [, , name, slot] = b;\n const handler = values[slot] as EventListener;\n node.addEventListener(name, handler);\n disposers.push(() => node.removeEventListener(name, handler));\n }\n }\n\n return { fragment: frag, dispose: () => disposers.forEach((f) => f()) };\n }\n\n /** Bind content slot - handles plugins, templates, arrays, and reactive values */\n #bindContent(marker: Comment, value: unknown, disposers: (() => void)[]) {\n // Try plugins first\n for (const plugin of this.#plugins) {\n const binder = plugin(value);\n if (binder) {\n binder(marker, disposers);\n return;\n }\n }\n\n // Full reactive path for functions, signals, objects, arrays, templates\n let currentNodes: Node[] = [],\n childDisposers: (() => void)[] = [];\n\n const clear = () => {\n childDisposers.forEach((f) => f());\n childDisposers = [];\n currentNodes.forEach((n) => (n as ChildNode).remove());\n currentNodes = [];\n };\n\n const update = (v: unknown) => {\n // Fast path: update existing text node for primitives\n if (\n v != null &&\n typeof v !== \"boolean\" &&\n typeof v !== \"object\" &&\n currentNodes.length === 1 &&\n !childDisposers.length &&\n currentNodes[0] instanceof Text\n ) {\n currentNodes[0].textContent = String(v);\n return;\n }\n clear();\n const parent = marker.parentNode!;\n // Optimize: avoid [v].flat() for non-arrays\n const items = Array.isArray(v) ? v.flat() : [v];\n for (const item of items) {\n if (item instanceof Template) {\n const { fragment, dispose } = item.render();\n childDisposers.push(dispose);\n currentNodes.push(...fragment.childNodes);\n parent.insertBefore(fragment, marker);\n } else if (item != null && typeof item !== \"boolean\") {\n const n = document.createTextNode(String(item));\n currentNodes.push(n);\n parent.insertBefore(n, marker);\n }\n }\n };\n\n bind(value, update, disposers);\n disposers.push(clear);\n }\n}\n\nfunction createHtml(plugins: InterpolationPlugin[]): HtmlTag {\n const tag = ((strings: TemplateStringsArray, ...values: unknown[]) =>\n new Template(strings, values, plugins)) as HtmlTag;\n tag.with = (...more: InterpolationPlugin[]) =>\n createHtml([...plugins, ...more]);\n return tag;\n}\n\nexport const html: HtmlTag = createHtml([]);\n"],"mappings":"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"}